OrderServiceImpl.java 109 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341
  1. package com.fuint.common.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import com.fuint.common.Constants;
  7. import com.fuint.common.dto.*;
  8. import com.fuint.common.enums.*;
  9. import com.fuint.common.param.OrderListParam;
  10. import com.fuint.common.param.RechargeParam;
  11. import com.fuint.common.param.SettlementParam;
  12. import com.fuint.common.service.*;
  13. import com.fuint.common.util.*;
  14. import com.fuint.framework.annoation.OperationServiceLog;
  15. import com.fuint.framework.exception.BusinessCheckException;
  16. import com.fuint.framework.pagination.PaginationResponse;
  17. import com.fuint.framework.web.ResponseObject;
  18. import com.fuint.repository.mapper.*;
  19. import com.fuint.repository.model.*;
  20. import com.fuint.utils.PropertiesUtil;
  21. import com.fuint.utils.StringUtil;
  22. import com.github.pagehelper.Page;
  23. import com.github.pagehelper.PageHelper;
  24. import lombok.AllArgsConstructor;
  25. import org.apache.commons.lang.StringUtils;
  26. import org.slf4j.Logger;
  27. import org.slf4j.LoggerFactory;
  28. import org.springframework.beans.BeanUtils;
  29. import org.springframework.context.annotation.Lazy;
  30. import org.springframework.data.domain.PageImpl;
  31. import org.springframework.data.domain.PageRequest;
  32. import org.springframework.stereotype.Service;
  33. import org.springframework.transaction.annotation.Transactional;
  34. import weixin.popular.util.JsonUtil;
  35. import javax.servlet.http.HttpServletRequest;
  36. import java.math.BigDecimal;
  37. import java.util.*;
  38. import java.util.stream.Collectors;
  39. /**
  40. * 订单接口实现类
  41. *
  42. * Created by FSQ
  43. * CopyRight https://www.fuint.cn
  44. */
  45. @Service
  46. @AllArgsConstructor(onConstructor_= {@Lazy})
  47. public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implements OrderService {
  48. private static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class);
  49. private MtOrderMapper mtOrderMapper;
  50. private MtGoodsMapper mtGoodsMapper;
  51. private MtOrderGoodsMapper mtOrderGoodsMapper;
  52. private MtCartMapper mtCartMapper;
  53. private MtOrderAddressMapper mtOrderAddressMapper;
  54. private MtConfirmLogMapper mtConfirmLogMapper;
  55. private MtUserCouponMapper mtUserCouponMapper;
  56. private MtGoodsSkuMapper mtGoodsSkuMapper;
  57. private MtRegionMapper mtRegionMapper;
  58. private MtUserGradeMapper mtUserGradeMapper;
  59. private MtCouponGoodsMapper mtCouponGoodsMapper;
  60. /**
  61. * 系统设置服务接口
  62. * */
  63. private SettingService settingService;
  64. /**
  65. * 卡券服务接口
  66. * */
  67. private CouponService couponService;
  68. /**
  69. * 会员卡券服务接口
  70. * */
  71. private UserCouponService userCouponService;
  72. /**
  73. * 收货地址服务接口
  74. * */
  75. private AddressService addressService;
  76. /**
  77. * 会员服务接口
  78. * */
  79. private MemberService memberService;
  80. /**
  81. * 积分服务接口
  82. * */
  83. private PointService pointService;
  84. /**
  85. * 购物车服务接口
  86. * */
  87. private CartService cartService;
  88. /**
  89. * 商品服务接口
  90. * */
  91. private GoodsService goodsService;
  92. /**
  93. * 店铺服务接口
  94. * */
  95. private StoreService storeService;
  96. /**
  97. * 会员等级服务接口
  98. * */
  99. private UserGradeService userGradeService;
  100. /**
  101. * 售后服务接口
  102. * */
  103. private RefundService refundService;
  104. /**
  105. * 余额服务接口
  106. * */
  107. private BalanceService balanceService;
  108. /**
  109. * 微信相关服务接口
  110. * */
  111. private WeixinService weixinService;
  112. /**
  113. * 支付宝服务接口
  114. * */
  115. private AlipayService alipayService;
  116. /**
  117. * 短信发送服务接口
  118. * */
  119. private SendSmsService sendSmsService;
  120. /**
  121. * 开卡赠礼服务接口
  122. * */
  123. private OpenGiftService openGiftService;
  124. /**
  125. * 商户服务接口
  126. * */
  127. private MerchantService merchantService;
  128. /**
  129. * 店铺员工服务接口
  130. * */
  131. private StaffService staffService;
  132. /**
  133. * 支付服务接口
  134. * */
  135. private PaymentService paymentService;
  136. /**
  137. * 云打印服务接口
  138. * */
  139. private PrinterService printerService;
  140. /**
  141. * 获取用户订单列表
  142. * @param orderListParam
  143. * @throws BusinessCheckException
  144. * */
  145. @Override
  146. @Transactional(rollbackFor = Exception.class)
  147. public PaginationResponse getUserOrderList(OrderListParam orderListParam) throws BusinessCheckException {
  148. Integer pageNumber = orderListParam.getPage() == null ? Constants.PAGE_NUMBER : orderListParam.getPage();
  149. Integer pageSize = orderListParam.getPageSize() == null ? Constants.PAGE_SIZE : orderListParam.getPageSize();
  150. String userId = orderListParam.getUserId() == null ? "" : orderListParam.getUserId();
  151. Integer merchantId = orderListParam.getMerchantId() == null ? 0 : orderListParam.getMerchantId();
  152. Integer storeId = orderListParam.getStoreId() == null ? 0 : orderListParam.getStoreId();
  153. String status = orderListParam.getStatus() == null ? "": orderListParam.getStatus();
  154. String payStatus = orderListParam.getPayStatus() == null ? "": orderListParam.getPayStatus();
  155. String settleStatus = orderListParam.getSettleStatus() == null ? "": orderListParam.getSettleStatus();
  156. String dataType = orderListParam.getDataType() == null ? "": orderListParam.getDataType();
  157. String type = orderListParam.getType() == null ? "": orderListParam.getType();
  158. String orderSn = orderListParam.getOrderSn() == null ? "": orderListParam.getOrderSn();
  159. String mobile = orderListParam.getMobile() == null ? "": orderListParam.getMobile();
  160. String orderMode = orderListParam.getOrderMode() == null ? "" : orderListParam.getOrderMode();
  161. String staffId = orderListParam.getStaffId() == null ? "" : orderListParam.getStaffId();
  162. String couponId = orderListParam.getCouponId() == null ? "" : orderListParam.getCouponId();
  163. String storeIds = orderListParam.getStoreIds() == null ? "" : orderListParam.getStoreIds();
  164. String startTime = orderListParam.getStartTime() == null ? "" : orderListParam.getStartTime();
  165. String endTime = orderListParam.getEndTime() == null ? "" : orderListParam.getEndTime();
  166. String keyword = orderListParam.getKeyword() == null ? "" : orderListParam.getKeyword();
  167. String confirmStatus = orderListParam.getConfirmStatus() == null ? "" : orderListParam.getConfirmStatus();
  168. List<String> payType = orderListParam.getPayType();
  169. LambdaQueryWrapper<MtOrder> lambdaQueryWrapper = Wrappers.lambdaQuery();
  170. lambdaQueryWrapper.ne(MtOrder::getStatus, OrderStatusEnum.DELETED.getKey());
  171. if (dataType.equals("toPay")) {
  172. status = OrderStatusEnum.CREATED.getKey(); // 待支付
  173. } else if(dataType.equals("paid")) {
  174. status = "";
  175. payStatus = PayStatusEnum.SUCCESS.getKey(); // 已支付
  176. } else if(dataType.equals("cancel")) {
  177. status = OrderStatusEnum.CANCEL.getKey(); // 已取消
  178. } else if(dataType.equals("todo")) {
  179. // 待核销
  180. payStatus = PayStatusEnum.SUCCESS.getKey();
  181. lambdaQueryWrapper.eq(MtOrder::getConfirmStatus, YesOrNoEnum.NO.getKey());
  182. lambdaQueryWrapper.eq(MtOrder::getType, OrderTypeEnum.GOODS.getKey());
  183. lambdaQueryWrapper.eq(MtOrder::getOrderMode, OrderModeEnum.ONESELF.getKey());
  184. } else if(dataType.equals("confirm")) {
  185. // 已核销
  186. payStatus = PayStatusEnum.SUCCESS.getKey();
  187. lambdaQueryWrapper.eq(MtOrder::getType, OrderTypeEnum.GOODS.getKey());
  188. lambdaQueryWrapper.eq(MtOrder::getConfirmStatus, YesOrNoEnum.YES.getKey());
  189. lambdaQueryWrapper.eq(MtOrder::getOrderMode, OrderModeEnum.ONESELF.getKey());
  190. }
  191. if (StringUtil.isNotEmpty(orderSn)) {
  192. lambdaQueryWrapper.eq(MtOrder::getOrderSn, orderSn);
  193. }
  194. if (StringUtil.isNotEmpty(status)) {
  195. lambdaQueryWrapper.eq(MtOrder::getStatus, status);
  196. }
  197. if (StringUtil.isNotEmpty(payStatus)) {
  198. lambdaQueryWrapper.eq(MtOrder::getPayStatus, payStatus);
  199. }
  200. if (StringUtil.isNotEmpty(settleStatus)) {
  201. lambdaQueryWrapper.eq(MtOrder::getSettleStatus, settleStatus);
  202. }
  203. if (StringUtil.isNotEmpty(keyword)) {
  204. MtUser userInfo = memberService.queryMemberByMobile(merchantId, keyword);
  205. if (userInfo != null) {
  206. lambdaQueryWrapper.and(wq -> wq
  207. .like(MtOrder::getOrderSn, keyword)
  208. .or()
  209. .eq(MtOrder::getUserId, userInfo.getId().toString()));
  210. } else {
  211. lambdaQueryWrapper.like(MtOrder::getOrderSn, keyword);
  212. }
  213. }
  214. if (StringUtil.isNotEmpty(mobile)) {
  215. MtUser userInfo = memberService.queryMemberByMobile(merchantId, mobile);
  216. if (userInfo != null) {
  217. userId = userInfo.getId().toString();
  218. } else {
  219. userId = "0";
  220. }
  221. }
  222. if (StringUtil.isNotEmpty(userId)) {
  223. lambdaQueryWrapper.eq(MtOrder::getUserId, userId);
  224. }
  225. if (merchantId != null && merchantId > 0) {
  226. lambdaQueryWrapper.eq(MtOrder::getMerchantId, merchantId);
  227. }
  228. if (storeId != null && storeId > 0) {
  229. lambdaQueryWrapper.eq(MtOrder::getStoreId, storeId);
  230. }
  231. if (StringUtil.isNotEmpty(staffId)) {
  232. lambdaQueryWrapper.eq(MtOrder::getStaffId, staffId);
  233. }
  234. if (StringUtil.isNotEmpty(type)) {
  235. lambdaQueryWrapper.eq(MtOrder::getType, type);
  236. }
  237. if (StringUtil.isNotEmpty(orderMode)) {
  238. lambdaQueryWrapper.eq(MtOrder::getOrderMode, orderMode);
  239. }
  240. if (StringUtils.isNotBlank(couponId)) {
  241. lambdaQueryWrapper.eq(MtOrder::getCouponId, couponId);
  242. }
  243. if (StringUtils.isNotBlank(storeIds)) {
  244. List<String> idList = Arrays.asList(storeIds.split(","));
  245. if (idList.size() > 0) {
  246. lambdaQueryWrapper.in(MtOrder::getStoreId, idList);
  247. }
  248. }
  249. if (StringUtil.isNotEmpty(startTime)) {
  250. lambdaQueryWrapper.ge(MtOrder::getCreateTime, startTime);
  251. }
  252. if (StringUtil.isNotEmpty(endTime)) {
  253. lambdaQueryWrapper.le(MtOrder::getCreateTime, endTime);
  254. }
  255. if (payType != null && payType.size() > 0) {
  256. lambdaQueryWrapper.in(MtOrder::getPayType, payType);
  257. }
  258. if (StringUtil.isNotEmpty(confirmStatus)) {
  259. lambdaQueryWrapper.eq(MtOrder::getConfirmStatus, confirmStatus);
  260. lambdaQueryWrapper.eq(MtOrder::getPayStatus, PayStatusEnum.SUCCESS.getKey());
  261. lambdaQueryWrapper.eq(MtOrder::getType, OrderTypeEnum.GOODS.getKey());
  262. }
  263. lambdaQueryWrapper.orderByDesc(MtOrder::getId);
  264. Page<MtOrder> pageHelper = PageHelper.startPage(pageNumber, pageSize);
  265. List<MtOrder> orderList = mtOrderMapper.selectList(lambdaQueryWrapper);
  266. List<UserOrderDto> dataList = new ArrayList<>();
  267. if (orderList.size() > 0) {
  268. for (MtOrder order : orderList) {
  269. UserOrderDto dto = getOrderDetail(order,false, false);
  270. dataList.add(dto);
  271. }
  272. }
  273. PageRequest pageRequest = PageRequest.of(pageNumber, pageSize);
  274. PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal());
  275. PaginationResponse<UserOrderDto> paginationResponse = new PaginationResponse(pageImpl, UserOrderDto.class);
  276. paginationResponse.setTotalPages(pageHelper.getPages());
  277. paginationResponse.setTotalElements(pageHelper.getTotal());
  278. paginationResponse.setContent(dataList);
  279. return paginationResponse;
  280. }
  281. /**
  282. * 保存订单信息
  283. *
  284. * @param orderDto 订单参数
  285. * @throws BusinessCheckException
  286. * @return
  287. */
  288. @Override
  289. @Transactional(rollbackFor = Exception.class)
  290. @OperationServiceLog(description = "提交订单信息")
  291. public MtOrder saveOrder(OrderDto orderDto) throws BusinessCheckException {
  292. logger.info("orderService.saveOrder orderDto = {}", JsonUtil.toJSONString(orderDto));
  293. MtOrder mtOrder;
  294. if (null != orderDto.getId() && orderDto.getId() > 0) {
  295. mtOrder = mtOrderMapper.selectById(orderDto.getId());
  296. } else {
  297. mtOrder = new MtOrder();
  298. }
  299. // 检查店铺是否已被禁用
  300. if (orderDto.getStoreId() != null && orderDto.getStoreId() > 0) {
  301. MtStore storeInfo = storeService.queryStoreById(orderDto.getStoreId());
  302. if (storeInfo != null) {
  303. if (!storeInfo.getStatus().equals(StatusEnum.ENABLED.getKey())) {
  304. orderDto.setStoreId(0);
  305. }
  306. }
  307. }
  308. String orderSn;
  309. if (orderDto.getId() == null || orderDto.getId() < 1) {
  310. orderSn = CommonUtil.createOrderSN(orderDto.getUserId() + "");
  311. mtOrder.setOrderSn(orderSn);
  312. } else {
  313. orderSn = mtOrder.getOrderSn();
  314. }
  315. mtOrder.setUserId(orderDto.getUserId());
  316. mtOrder.setMerchantId(orderDto.getMerchantId());
  317. mtOrder.setStoreId(orderDto.getStoreId());
  318. mtOrder.setCouponId(orderDto.getCouponId());
  319. mtOrder.setParam(orderDto.getParam());
  320. mtOrder.setRemark(orderDto.getRemark());
  321. mtOrder.setStatus(OrderStatusEnum.CREATED.getKey());
  322. mtOrder.setType(orderDto.getType());
  323. mtOrder.setAmount(orderDto.getAmount());
  324. mtOrder.setPayAmount(orderDto.getPayAmount());
  325. mtOrder.setDiscount(orderDto.getDiscount());
  326. mtOrder.setPayStatus(PayStatusEnum.WAIT.getKey());
  327. mtOrder.setPlatform(orderDto.getPlatform());
  328. mtOrder.setPointAmount(orderDto.getPointAmount());
  329. mtOrder.setUsePoint(orderDto.getUsePoint());
  330. mtOrder.setOrderMode(orderDto.getOrderMode());
  331. mtOrder.setPayType(orderDto.getPayType());
  332. mtOrder.setOperator(orderDto.getOperator());
  333. mtOrder.setStaffId(orderDto.getStaffId());
  334. mtOrder.setIsVisitor(orderDto.getIsVisitor());
  335. mtOrder.setUpdateTime(new Date());
  336. mtOrder.setDeliveryFee(orderDto.getDeliveryFee() == null ? new BigDecimal(0) : orderDto.getDeliveryFee());
  337. mtOrder.setSettleStatus(SettleStatusEnum.WAIT.getKey());
  338. mtOrder.setConfirmStatus(YesOrNoEnum.NO.getKey());
  339. if (mtOrder.getId() == null || mtOrder.getId() <= 0) {
  340. mtOrder.setCreateTime(new Date());
  341. }
  342. // 核销码
  343. if (orderDto.getPlatform() == null) {
  344. orderDto.setPlatform("");
  345. }
  346. if (mtOrder.getVerifyCode() == null && !orderDto.getPlatform().equals(PlatformTypeEnum.PC.getCode())) {
  347. mtOrder.setVerifyCode(SeqUtil.getRandomNumber(6));
  348. }
  349. // 首先生成订单
  350. mtOrderMapper.insert(mtOrder);
  351. MtOrder orderInfo = mtOrderMapper.selectById(mtOrder.getId());
  352. mtOrder.setId(orderInfo.getId());
  353. // 会员相关信息
  354. MtUser userInfo = memberService.queryMemberById(orderDto.getUserId());
  355. MtUserGrade userGrade = userGradeService.queryUserGradeById(orderDto.getMerchantId(), userInfo.getGradeId() != null ? Integer.parseInt(userInfo.getGradeId()) : 1, orderDto.getUserId());
  356. BigDecimal percent = new BigDecimal("0");
  357. if (userGrade != null && userGrade.getDiscount() != null && userGrade.getDiscount() > 0 && !userInfo.getIsStaff().equals(YesOrNoEnum.YES.getKey())) {
  358. // 会员折扣
  359. percent = new BigDecimal(userGrade.getDiscount()).divide(new BigDecimal("10"), BigDecimal.ROUND_CEILING, 4);
  360. if (percent.compareTo(new BigDecimal("0")) <= 0) {
  361. percent = new BigDecimal("1");
  362. }
  363. }
  364. // 如果没有指定店铺,则读取默认的店铺
  365. if (orderDto.getStoreId() == null || orderDto.getStoreId() <= 0) {
  366. Map<String, Object> params = new HashMap<>();
  367. params.put("status", StatusEnum.ENABLED.getKey());
  368. params.put("is_default", YesOrNoEnum.YES.getKey());
  369. List<MtStore> storeList = storeService.queryStoresByParams(params);
  370. if (storeList.size() > 0) {
  371. mtOrder.setStoreId(storeList.get(0).getId());
  372. } else {
  373. mtOrder.setStoreId(0);
  374. }
  375. }
  376. mtOrder.setUpdateTime(new Date());
  377. if (mtOrder.getCreateTime() == null) {
  378. mtOrder.setCreateTime(new Date());
  379. }
  380. // 计算商品订单总金额
  381. List<MtCart> cartList = new ArrayList<>();
  382. Map<String, Object> cartData = new HashMap<>();
  383. if (orderDto.getType().equals(OrderTypeEnum.GOODS.getKey())) {
  384. if (StringUtil.isNotEmpty(orderDto.getCartIds())) {
  385. Map<String, Object> param = new HashMap<>();
  386. param.put("status", StatusEnum.ENABLED.getKey());
  387. param.put("ids", orderDto.getCartIds());
  388. cartList = cartService.queryCartListByParams(param);
  389. if (cartList.size() < 1) {
  390. throw new BusinessCheckException("生成订单失败,请稍后重试");
  391. }
  392. } else {
  393. if (orderDto.getGoodsId() == null || orderDto.getGoodsId() <= 0) {
  394. throw new BusinessCheckException("生成订单失败,请稍后重试");
  395. }
  396. // 直接购买
  397. MtCart mtCart = new MtCart();
  398. mtCart.setGoodsId(orderDto.getGoodsId());
  399. mtCart.setSkuId(orderDto.getSkuId());
  400. mtCart.setNum(orderDto.getBuyNum());
  401. mtCart.setId(0);
  402. mtCart.setUserId(orderDto.getUserId());
  403. mtCart.setStatus(StatusEnum.ENABLED.getKey());
  404. cartList.add(mtCart);
  405. }
  406. boolean isUsePoint = orderDto.getUsePoint() > 0 ? true : false;
  407. cartData = calculateCartGoods(orderInfo.getMerchantId(), orderDto.getUserId(), cartList, orderDto.getCouponId(), isUsePoint, orderDto.getPlatform(), orderInfo.getOrderMode());
  408. mtOrder.setAmount(new BigDecimal(cartData.get("totalPrice").toString()));
  409. mtOrder.setUsePoint(Integer.parseInt(cartData.get("usePoint").toString()));
  410. mtOrder.setDiscount(new BigDecimal(cartData.get("couponAmount").toString()));
  411. // 实付金额
  412. BigDecimal payAmount = mtOrder.getAmount().subtract(mtOrder.getPointAmount()).subtract(mtOrder.getDiscount());
  413. if (payAmount.compareTo(new BigDecimal("0")) > 0) {
  414. mtOrder.setPayAmount(payAmount);
  415. } else {
  416. mtOrder.setPayAmount(new BigDecimal("0"));
  417. }
  418. // 购物使用了卡券
  419. if (mtOrder.getCouponId() > 0) {
  420. // 查询是否适用商品
  421. MtUserCoupon userCoupon = mtUserCouponMapper.selectById(mtOrder.getCouponId());
  422. if (userCoupon != null) {
  423. MtCoupon couponInfo = couponService.queryCouponById(userCoupon.getCouponId());
  424. if (couponInfo.getApplyGoods() != null && couponInfo.getApplyGoods().equals(ApplyGoodsEnum.PARK_GOODS.getKey())) {
  425. List<MtCouponGoods> couponGoodsList = mtCouponGoodsMapper.getCouponGoods(couponInfo.getId());
  426. if (couponGoodsList != null && couponGoodsList.size() > 0 && cartList.size() > 0) {
  427. List<Integer> applyGoodsIds = new ArrayList<>();
  428. List<Integer> goodsIds = new ArrayList<>();
  429. for (MtCouponGoods mtCouponGoods : couponGoodsList) {
  430. applyGoodsIds.add(mtCouponGoods.getGoodsId());
  431. }
  432. for (MtCart mtCart : cartList) {
  433. goodsIds.add(mtCart.getGoodsId());
  434. }
  435. List<Integer> intersection = applyGoodsIds.stream()
  436. .filter(goodsIds::contains)
  437. .collect(Collectors.toList());
  438. if (intersection.size() == 0) {
  439. throw new BusinessCheckException("该卡券不适用于购买的商品列表");
  440. }
  441. }
  442. }
  443. }
  444. updateOrder(mtOrder);
  445. String useCode = couponService.useCoupon(mtOrder.getCouponId(), mtOrder.getUserId(), mtOrder.getStoreId(), mtOrder.getId(), mtOrder.getDiscount(), "购物使用卡券");
  446. // 卡券使用失败
  447. if (StringUtil.isEmpty(useCode)) {
  448. mtOrder.setDiscount(new BigDecimal("0"));
  449. mtOrder.setCouponId(0);
  450. }
  451. }
  452. }
  453. // 会员付款类订单
  454. if (orderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) {
  455. if (userInfo != null && userInfo.getGradeId() != null && orderDto.getIsVisitor().equals(YesOrNoEnum.NO.getKey())) {
  456. if (percent.compareTo(new BigDecimal("0")) > 0 && !userInfo.getIsStaff().equals(YesOrNoEnum.YES.getKey())) {
  457. // 会员折扣
  458. BigDecimal payAmountDiscount = mtOrder.getAmount().multiply(percent);
  459. if (payAmountDiscount.compareTo(new BigDecimal("0")) > 0) {
  460. mtOrder.setDiscount(mtOrder.getDiscount().add(mtOrder.getAmount().subtract(payAmountDiscount)));
  461. mtOrder.setPayAmount(payAmountDiscount);
  462. } else {
  463. mtOrder.setPayAmount(new BigDecimal("0"));
  464. }
  465. }
  466. }
  467. }
  468. // 再次更新订单
  469. try {
  470. orderInfo = updateOrder(mtOrder);
  471. } catch (Exception e) {
  472. logger.error("OrderService 生成订单失败...");
  473. throw new BusinessCheckException("生成订单失败,请稍后重试");
  474. }
  475. // 扣减积分
  476. if (orderDto.getUsePoint() > 0) {
  477. try {
  478. MtPoint reqPointDto = new MtPoint();
  479. reqPointDto.setUserId(orderDto.getUserId());
  480. reqPointDto.setAmount(-orderDto.getUsePoint());
  481. reqPointDto.setOrderSn(orderSn);
  482. reqPointDto.setDescription("支付扣除" + orderDto.getUsePoint() + "积分");
  483. reqPointDto.setOperator("");
  484. pointService.addPoint(reqPointDto);
  485. } catch (BusinessCheckException e) {
  486. logger.error("OrderService 扣减积分失败...{}", e.getMessage());
  487. throw new BusinessCheckException("扣减积分失败,请稍后重试");
  488. }
  489. }
  490. // 如果是商品订单,生成订单商品
  491. if (orderDto.getType().equals(OrderTypeEnum.GOODS.getKey()) && cartList.size() > 0) {
  492. Object listObject = cartData.get("list");
  493. List<ResCartDto> lists =(ArrayList<ResCartDto>)listObject;
  494. BigDecimal memberDiscount = new BigDecimal("0");
  495. for (ResCartDto cart : lists) {
  496. MtOrderGoods orderGoods = new MtOrderGoods();
  497. orderGoods.setOrderId(orderInfo.getId());
  498. orderGoods.setGoodsId(cart.getGoodsId());
  499. orderGoods.setSkuId(cart.getSkuId());
  500. orderGoods.setNum(cart.getNum());
  501. // 计算会员折扣
  502. BigDecimal price = cart.getGoodsInfo().getPrice();
  503. boolean isDiscount = cart.getGoodsInfo().getIsMemberDiscount().equals(YesOrNoEnum.YES.getKey()) ? true : false;
  504. if (percent.compareTo(new BigDecimal("0")) > 0 && isDiscount) {
  505. orderGoods.setPrice(price.multiply(percent));
  506. BigDecimal discount = price.subtract(price.multiply(percent)).multiply(new BigDecimal(cart.getNum()));
  507. orderGoods.setDiscount(discount);
  508. memberDiscount = memberDiscount.add(discount);
  509. } else {
  510. orderGoods.setPrice(price);
  511. orderGoods.setDiscount(new BigDecimal("0"));
  512. }
  513. orderGoods.setStatus(StatusEnum.ENABLED.getKey());
  514. orderGoods.setCreateTime(new Date());
  515. orderGoods.setUpdateTime(new Date());
  516. mtOrderGoodsMapper.insert(orderGoods);
  517. // 扣减库存
  518. MtGoods goodsInfo = mtGoodsMapper.selectById(cart.getGoodsId());
  519. if (goodsInfo.getIsSingleSpec().equals(YesOrNoEnum.YES.getKey())) {
  520. // 单规格减去库存
  521. Double stock = goodsInfo.getStock() - cart.getNum();
  522. if (stock < 0) {
  523. throw new BusinessCheckException("商品“" + goodsInfo.getName() + "”库存不足,订单提交失败");
  524. }
  525. goodsInfo.setStock(stock);
  526. mtGoodsMapper.updateById(goodsInfo);
  527. } else {
  528. // 多规格减去库存
  529. MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(cart.getSkuId());
  530. if (mtGoodsSku != null) {
  531. Double stock = mtGoodsSku.getStock() - cart.getNum();
  532. if (stock < 0) {
  533. throw new BusinessCheckException("商品sku编码“" + mtGoodsSku.getSkuNo() +"”库存不足,订单提交失败");
  534. }
  535. mtGoodsSku.setStock(stock);
  536. mtGoodsSkuMapper.updateById(mtGoodsSku);
  537. if (goodsInfo.getStock() != null && goodsInfo.getStock() > 0) {
  538. Double goodsStock = goodsInfo.getStock() - cart.getNum();
  539. if (goodsStock >= 0) {
  540. goodsInfo.setStock(goodsStock);
  541. mtGoodsMapper.updateById(goodsInfo);
  542. }
  543. }
  544. }
  545. }
  546. if (cart.getId() > 0) {
  547. mtCartMapper.deleteById(cart.getId());
  548. }
  549. }
  550. // 会员折扣
  551. if (memberDiscount.compareTo(new BigDecimal("0")) > 0 && !userInfo.getIsStaff().equals(YesOrNoEnum.YES.getKey())) {
  552. orderInfo.setDiscount(orderInfo.getDiscount().add(memberDiscount));
  553. if (orderInfo.getPayAmount().subtract(memberDiscount).compareTo(new BigDecimal("0")) > 0) {
  554. orderInfo.setPayAmount(orderInfo.getPayAmount().subtract(memberDiscount));
  555. } else {
  556. orderInfo.setPayAmount(new BigDecimal("0"));
  557. }
  558. orderInfo.setUpdateTime(new Date());
  559. orderInfo = updateOrder(orderInfo);
  560. }
  561. // 需要配送的订单,生成配送地址
  562. if (orderDto.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey())) {
  563. Map<String, Object> params = new HashMap<>();
  564. params.put("userId", orderDto.getUserId().toString());
  565. params.put("isDefault", YesOrNoEnum.YES.getKey());
  566. List<MtAddress> addressList = addressService.queryListByParams(params);
  567. MtAddress mtAddress;
  568. if (addressList.size() > 0) {
  569. mtAddress = addressList.get(0);
  570. } else {
  571. throw new BusinessCheckException("配送地址出错了,请重新选择配送地址");
  572. }
  573. MtOrderAddress orderAddress = new MtOrderAddress();
  574. orderAddress.setOrderId(orderInfo.getId());
  575. orderAddress.setUserId(orderDto.getUserId());
  576. orderAddress.setName(mtAddress.getName());
  577. orderAddress.setMobile(mtAddress.getMobile());
  578. orderAddress.setCityId(mtAddress.getCityId());
  579. orderAddress.setProvinceId(mtAddress.getProvinceId());
  580. orderAddress.setRegionId(mtAddress.getRegionId());
  581. orderAddress.setDetail(mtAddress.getDetail());
  582. orderAddress.setCreateTime(new Date());
  583. mtOrderAddressMapper.insert(orderAddress);
  584. }
  585. }
  586. return orderInfo;
  587. }
  588. /**
  589. * 订单结算
  590. * @param request
  591. * @param param 结算参数
  592. * @throws BusinessCheckException
  593. * @return
  594. * */
  595. @Override
  596. @Transactional(rollbackFor = Exception.class)
  597. public Map<String, Object> doSettle(HttpServletRequest request, SettlementParam param) throws BusinessCheckException {
  598. String token = request.getHeader("Access-Token");
  599. String isWechat = request.getHeader("isWechat") == null ? YesOrNoEnum.NO.getKey() : request.getHeader("isWechat");
  600. Integer storeId = StringUtil.isEmpty(request.getHeader("storeId")) ? 0 : Integer.parseInt(request.getHeader("storeId"));
  601. String platform = request.getHeader("platform") == null ? "" : request.getHeader("platform");
  602. String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo");
  603. String ip = CommonUtil.getIPFromHttpRequest(request);
  604. String cartIds = param.getCartIds() == null ? "" : param.getCartIds();
  605. Integer targetId = param.getTargetId() == null ? 0 : Integer.parseInt(param.getTargetId()); // 储值卡、升级等级必填
  606. String selectNum = param.getSelectNum() == null ? "" : param.getSelectNum(); // 储值卡必填
  607. String remark = param.getRemark() == null ? "" : param.getRemark();
  608. String type = param.getType() == null ? "" : param.getType(); // 订单类型
  609. String payAmount = param.getPayAmount() == null ? "0" : StringUtil.isEmpty(param.getPayAmount()) ? "0" : param.getPayAmount(); // 支付金额
  610. Integer usePoint = param.getUsePoint() == null ? 0 : param.getUsePoint(); // 使用积分数量
  611. Integer couponId = param.getCouponId() == null ? 0 : param.getCouponId(); // 会员卡券ID
  612. String payType = param.getPayType() == null ? PayTypeEnum.JSAPI.getKey() : param.getPayType();
  613. String authCode = param.getAuthCode() == null ? "" : param.getAuthCode();
  614. Integer userId = param.getUserId() == null ? 0 : param.getUserId(); // 指定下单会员 eg:收银功能
  615. String cashierPayAmount = param.getCashierPayAmount() == null ? "" : param.getCashierPayAmount(); // 收银台实付金额
  616. String cashierDiscountAmount = param.getCashierDiscountAmount() == null ? "" : param.getCashierDiscountAmount(); // 收银台优惠金额
  617. Integer goodsId = param.getGoodsId() == null ? 0 : param.getGoodsId(); // 立即购买商品ID
  618. Integer skuId = param.getSkuId() == null ? 0 : param.getSkuId(); // 立即购买商品skuId
  619. Double buyNum = param.getBuyNum() == null ? 1.0 : param.getBuyNum(); // 立即购买商品数量
  620. String orderMode = StringUtil.isEmpty(param.getOrderMode()) ? OrderModeEnum.ONESELF.getKey() : param.getOrderMode(); // 订单模式(配送or自取)
  621. Integer orderId = param.getOrderId() == null ? null : param.getOrderId(); // 订单ID
  622. Integer merchantId = merchantService.getMerchantId(merchantNo);
  623. UserInfo loginInfo = TokenUtil.getUserInfoByToken(token);
  624. MtUser userInfo = null;
  625. if (loginInfo != null) {
  626. userInfo = memberService.queryMemberById(loginInfo.getId());
  627. }
  628. // 后台管理员或店员操作
  629. String operator = null;
  630. Integer staffId = 0;
  631. String isVisitor = YesOrNoEnum.NO.getKey();
  632. AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token);
  633. if (accountInfo != null) {
  634. operator = accountInfo.getAccountName();
  635. staffId = accountInfo.getStaffId() == null ? 0 : accountInfo.getStaffId();
  636. if (param.getStaffId() != null && param.getStaffId() > 0) {
  637. staffId = param.getStaffId();
  638. }
  639. storeId = accountInfo.getStoreId();
  640. merchantId = accountInfo.getMerchantId();
  641. if (storeId <= 0) {
  642. MtMerchant mtMerchant = merchantService.queryMerchantById(merchantId);
  643. if (mtMerchant != null) {
  644. MtStore mtStore = storeService.getDefaultStore(mtMerchant.getNo());
  645. if (mtStore != null) {
  646. storeId = mtStore.getId();
  647. }
  648. }
  649. }
  650. if (userId < 1) {
  651. isVisitor = YesOrNoEnum.YES.getKey();
  652. }
  653. }
  654. if (userInfo == null) {
  655. MtUser user = memberService.getCurrentUserInfo(request, userId, token);
  656. if (user != null) {
  657. userInfo = memberService.queryMemberById(user.getId());
  658. }
  659. } else {
  660. MtStaff mtStaff = staffService.queryStaffByUserId(userInfo.getId());
  661. if (mtStaff == null) {
  662. mtStaff = staffService.queryStaffByMobile(userInfo.getMobile());
  663. }
  664. if (mtStaff != null) {
  665. operator = mtStaff.getRealName();
  666. }
  667. }
  668. MtSetting config = settingService.querySettingByName(merchantId, storeId, SettingTypeEnum.ORDER.getKey(), OrderSettingEnum.IS_CLOSE.getKey());
  669. if (config != null && config.getValue().equals(YesOrNoEnum.TRUE.getKey())) {
  670. throw new BusinessCheckException("系统已关闭交易功能,请稍后再试!");
  671. }
  672. // 收银台通过手机号自动注册会员信息
  673. if ((userInfo == null || StringUtil.isEmpty(token))) {
  674. String mobile = param.getMobile() == null ? "" : param.getMobile();
  675. if (StringUtil.isNotEmpty(operator) && StringUtil.isNotEmpty(mobile)) {
  676. userInfo = memberService.queryMemberByMobile(merchantId, mobile);
  677. // 自动注册会员
  678. if (userInfo == null) {
  679. userInfo = memberService.addMemberByMobile(merchantId, mobile, "0", ip);
  680. }
  681. }
  682. }
  683. if (userInfo == null) {
  684. if (StringUtil.isNotEmpty(operator)) {
  685. throw new BusinessCheckException("该管理员还未关联店铺员工");
  686. } else {
  687. throw new BusinessCheckException("请先登录");
  688. }
  689. }
  690. if (userId <= 0) {
  691. userId = userInfo.getId();
  692. } else {
  693. if (StringUtil.isNotEmpty(operator)) {
  694. userInfo = memberService.queryMemberById(userId);
  695. }
  696. }
  697. param.setUserId(userId);
  698. // 订单所属店铺
  699. if (storeId < 1) {
  700. if (userInfo.getStoreId() > 0) {
  701. storeId = userInfo.getStoreId();
  702. }
  703. }
  704. // 生成订单数据
  705. OrderDto orderDto = new OrderDto();
  706. orderDto.setId(orderId);
  707. orderDto.setRemark(remark);
  708. orderDto.setUserId(userId);
  709. orderDto.setMerchantId(merchantId);
  710. orderDto.setStoreId(storeId);
  711. orderDto.setType(type);
  712. orderDto.setGoodsId(goodsId);
  713. orderDto.setSkuId(skuId);
  714. orderDto.setBuyNum(buyNum);
  715. orderDto.setOrderMode(orderMode);
  716. orderDto.setOperator(operator);
  717. orderDto.setPayType(payType);
  718. orderDto.setCouponId(0);
  719. orderDto.setStaffId(staffId);
  720. orderDto.setIsVisitor(isVisitor);
  721. orderDto.setPlatform(platform);
  722. MtSetting pointSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.POINT.getKey(), PointSettingEnum.CAN_USE_AS_MONEY.getKey());
  723. // 使用积分数量
  724. if (pointSetting != null && pointSetting.getValue().equals(YesOrNoEnum.TRUE.getKey())) {
  725. orderDto.setUsePoint(usePoint);
  726. } else {
  727. orderDto.setUsePoint(0);
  728. usePoint = 0;
  729. }
  730. orderDto.setPointAmount(new BigDecimal("0"));
  731. orderDto.setDiscount(new BigDecimal("0"));
  732. orderDto.setPayAmount(new BigDecimal("0"));
  733. orderDto.setAmount(new BigDecimal("0"));
  734. orderDto.setCartIds(cartIds);
  735. // 储值卡的订单
  736. if (orderDto.getType().equals(OrderTypeEnum.PRESTORE.getKey())) {
  737. orderDto.setCouponId(targetId);
  738. String orderParam = "";
  739. BigDecimal totalAmount = new BigDecimal(0);
  740. MtCoupon couponInfo = couponService.queryCouponById(targetId);
  741. String inRule = couponInfo.getInRule();
  742. String[] selectNumArr = selectNum.split(",");
  743. String[] ruleArr = inRule.split(",");
  744. for (int i = 0; i < ruleArr.length; i++) {
  745. String item = ruleArr[i] + "_" + (StringUtil.isNotEmpty(selectNumArr[i]) ? selectNumArr[i] : 0);
  746. String[] itemArr = item.split("_");
  747. // 预存金额
  748. BigDecimal price = new BigDecimal(itemArr[0]);
  749. // 预存数量
  750. BigDecimal num = new BigDecimal(selectNumArr[i]);
  751. BigDecimal amount = price.multiply(num);
  752. totalAmount = totalAmount.add(amount);
  753. orderParam = StringUtil.isEmpty(orderParam) ? item : orderParam + ","+item;
  754. }
  755. orderDto.setParam(orderParam);
  756. orderDto.setAmount(totalAmount);
  757. payAmount = totalAmount.toString();
  758. }
  759. // 付款订单
  760. if (orderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) {
  761. orderDto.setAmount(new BigDecimal(payAmount));
  762. orderDto.setPayAmount(new BigDecimal(payAmount));
  763. orderDto.setDiscount(new BigDecimal("0"));
  764. orderDto.setDeliveryFee(new BigDecimal("0"));
  765. }
  766. // 会员升级订单
  767. if (orderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
  768. orderDto.setParam(targetId.toString());
  769. orderDto.setCouponId(couponId);
  770. MtUserGrade userGrade = userGradeService.queryUserGradeById(merchantId, targetId, orderDto.getUserId());
  771. if (userGrade != null) {
  772. orderDto.setRemark("付费升级" + userGrade.getName());
  773. orderDto.setAmount(new BigDecimal(userGrade.getCatchValue().toString()));
  774. }
  775. }
  776. // 商品订单
  777. if (orderDto.getType().equals(OrderTypeEnum.GOODS.getKey())) {
  778. orderDto.setCouponId(couponId);
  779. }
  780. // 商品订单且配送要加上配送费用
  781. if (orderDto.getType().equals(OrderTypeEnum.GOODS.getKey()) && orderDto.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey())) {
  782. MtSetting mtSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.ORDER.getKey(), OrderSettingEnum.DELIVERY_FEE.getKey());
  783. if (mtSetting != null && StringUtil.isNotEmpty(mtSetting.getValue())) {
  784. BigDecimal deliveryFee = new BigDecimal(mtSetting.getValue());
  785. if (deliveryFee.compareTo(new BigDecimal("0")) > 0) {
  786. orderDto.setDeliveryFee(deliveryFee);
  787. }
  788. }
  789. }
  790. // 使用积分抵扣
  791. if (usePoint > 0) {
  792. List<MtSetting> settingList = settingService.getSettingList(merchantId, SettingTypeEnum.POINT.getKey());
  793. String canUsedAsMoney = YesOrNoEnum.FALSE.getKey();
  794. String exchangeNeedPoint = "0";
  795. for (MtSetting setting : settingList) {
  796. if (setting.getName().equals("canUsedAsMoney")) {
  797. canUsedAsMoney = setting.getValue();
  798. } else if (setting.getName().equals("exchangeNeedPoint")) {
  799. exchangeNeedPoint = setting.getValue();
  800. }
  801. }
  802. // 是否可以使用积分,并且积分数量足够
  803. if (canUsedAsMoney.equals(YesOrNoEnum.TRUE.getKey()) && Float.parseFloat(exchangeNeedPoint) > 0 && (userInfo.getPoint() >= usePoint)) {
  804. orderDto.setUsePoint(usePoint);
  805. orderDto.setPointAmount(new BigDecimal(usePoint).divide(new BigDecimal(exchangeNeedPoint), BigDecimal.ROUND_CEILING, 4));
  806. if (orderDto.getPayAmount().compareTo(orderDto.getPointAmount()) > 0) {
  807. orderDto.setPayAmount(orderDto.getPayAmount().subtract(orderDto.getPointAmount()));
  808. } else {
  809. orderDto.setPayAmount(new BigDecimal("0"));
  810. }
  811. }
  812. }
  813. // 首先生成订单,拿到订单ID
  814. MtOrder orderInfo;
  815. try {
  816. orderInfo = saveOrder(orderDto);
  817. } catch (BusinessCheckException e) {
  818. throw new BusinessCheckException(e.getMessage() == null ? "生成订单失败" : e.getMessage());
  819. }
  820. orderDto.setId(orderInfo.getId());
  821. param.setOrderId(orderInfo.getId());
  822. // 收银台实付金额、优惠金额
  823. if ((StringUtil.isNotEmpty(cashierPayAmount) || StringUtil.isNotEmpty(cashierDiscountAmount)) && StringUtil.isNotEmpty(operator)) {
  824. OrderDto reqOrder = new OrderDto();
  825. reqOrder.setId(orderInfo.getId());
  826. if (orderInfo.getAmount().compareTo(new BigDecimal("0")) <= 0) {
  827. reqOrder.setAmount(new BigDecimal(cashierPayAmount).add(new BigDecimal(cashierDiscountAmount)));
  828. } else {
  829. reqOrder.setAmount(orderInfo.getAmount());
  830. }
  831. if (new BigDecimal(cashierDiscountAmount).compareTo(new BigDecimal("0")) > 0) {
  832. reqOrder.setDiscount(new BigDecimal(cashierDiscountAmount).add(orderInfo.getDiscount()));
  833. } else {
  834. reqOrder.setDiscount(orderInfo.getDiscount());
  835. }
  836. BigDecimal realPayAmount = reqOrder.getAmount().subtract(reqOrder.getDiscount());
  837. if (realPayAmount.compareTo(new BigDecimal("0")) < 0) {
  838. realPayAmount = new BigDecimal("0");
  839. }
  840. reqOrder.setPayAmount(realPayAmount);
  841. updateOrder(reqOrder);
  842. orderInfo = getOrderInfo(orderInfo.getId());
  843. }
  844. // 订单中使用卡券抵扣(付款订单、会员升级订单)
  845. if (couponId > 0 && (orderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) || orderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
  846. if (orderDto.getAmount().compareTo(new BigDecimal("0")) > 0) {
  847. MtUserCoupon userCouponInfo = userCouponService.getUserCouponDetail(couponId);
  848. if (userCouponInfo != null) {
  849. MtCoupon couponInfo = couponService.queryCouponById(userCouponInfo.getCouponId());
  850. if (couponInfo != null) {
  851. boolean isEffective = couponService.isCouponEffective(couponInfo, userCouponInfo);
  852. if (isEffective && userCouponInfo.getUserId().equals(orderDto.getUserId())) {
  853. // 优惠券,直接减去优惠券金额
  854. if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) {
  855. // 检查是否会员升级专用卡券
  856. boolean canUse = true;
  857. if (couponInfo.getUseFor() != null && StringUtil.isNotEmpty(couponInfo.getUseFor())) {
  858. if (orderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
  859. if (!couponInfo.getUseFor().equals(CouponUseForEnum.MEMBER_GRADE.getKey())) {
  860. canUse = false;
  861. }
  862. }
  863. }
  864. if (canUse) {
  865. String useCode = couponService.useCoupon(couponId, orderDto.getUserId(), orderDto.getStoreId(), orderInfo.getId(), userCouponInfo.getAmount(), "核销");
  866. if (StringUtil.isNotEmpty(useCode)) {
  867. orderDto.setCouponId(couponId);
  868. orderDto.setDiscount(orderInfo.getDiscount().add(userCouponInfo.getAmount()));
  869. updateOrder(orderDto);
  870. }
  871. }
  872. } else if(couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  873. // 储值卡,减去余额
  874. BigDecimal useCouponAmount = userCouponInfo.getBalance();
  875. if (orderInfo.getPayAmount().compareTo(userCouponInfo.getBalance()) <= 0) {
  876. useCouponAmount = orderInfo.getPayAmount();
  877. }
  878. try {
  879. String useCode = couponService.useCoupon(couponId, orderDto.getUserId(), orderDto.getStoreId(), orderInfo.getId(), useCouponAmount, "核销");
  880. if (StringUtil.isNotEmpty(useCode)) {
  881. orderDto.setCouponId(couponId);
  882. orderDto.setDiscount(orderInfo.getDiscount().add(useCouponAmount));
  883. orderDto.setPayAmount(orderInfo.getPayAmount().subtract(useCouponAmount));
  884. updateOrder(orderDto);
  885. }
  886. } catch (BusinessCheckException e) {
  887. throw new BusinessCheckException(e.getMessage() == null ? "生成订单失败" : e.getMessage());
  888. }
  889. }
  890. }
  891. }
  892. }
  893. }
  894. }
  895. // 生成支付订单
  896. orderInfo = getOrderInfo(orderInfo.getId());
  897. BigDecimal realPayAmount = orderInfo.getAmount().subtract(new BigDecimal(orderInfo.getDiscount().toString())).subtract(new BigDecimal(orderInfo.getPointAmount().toString())).add(orderInfo.getDeliveryFee());
  898. // 支付类的订单,检查余额是否充足
  899. if (type.equals(OrderTypeEnum.PAYMENT.getKey()) && payType.equals(PayTypeEnum.BALANCE.getKey())) {
  900. if (userInfo.getBalance() == null || realPayAmount.compareTo(userInfo.getBalance()) > 0) {
  901. throw new BusinessCheckException("会员余额不足");
  902. }
  903. if (StringUtil.isNotEmpty(cashierPayAmount)) {
  904. if (userInfo.getBalance() == null || new BigDecimal(cashierPayAmount).compareTo(userInfo.getBalance()) > 0) {
  905. throw new BusinessCheckException("会员余额不足");
  906. }
  907. }
  908. }
  909. MtSetting delivery = settingService.querySettingByName(merchantId, SettingTypeEnum.ORDER.getKey(),OrderSettingEnum.DELIVERY_MIN_AMOUNT.getKey());
  910. if (delivery != null && orderInfo.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey())) {
  911. BigDecimal deliveryMinAmount = new BigDecimal(delivery.getValue());
  912. if (deliveryMinAmount.compareTo(new BigDecimal("0")) > 0 && deliveryMinAmount.compareTo(orderInfo.getAmount()) > 0) {
  913. throw new BusinessCheckException("订单起送金额:" + deliveryMinAmount + "元");
  914. }
  915. }
  916. ResponseObject paymentInfo = null;
  917. String errorMessage = "";
  918. // 应付金额大于0才提交微信支付
  919. if (realPayAmount.compareTo(new BigDecimal("0")) > 0) {
  920. if (payType.equals(PayTypeEnum.CASH.getKey()) && StringUtil.isNotEmpty(operator)) {
  921. // 收银台现金支付,更新为已支付
  922. setOrderPayed(orderInfo.getId(), null);
  923. } else if (payType.equals(PayTypeEnum.STORE.getKey())) {
  924. // 门店支付,不做任何操作
  925. } else if(payType.equals(PayTypeEnum.BALANCE.getKey())) {
  926. // 余额支付
  927. MtBalance balance = new MtBalance();
  928. balance.setMobile(userInfo.getMobile());
  929. balance.setOrderSn(orderInfo.getOrderSn());
  930. balance.setUserId(userInfo.getId());
  931. balance.setMerchantId(userInfo.getMerchantId());
  932. BigDecimal balanceAmount = realPayAmount.subtract(realPayAmount).subtract(realPayAmount);
  933. balance.setAmount(balanceAmount);
  934. boolean isPay = balanceService.addBalance(balance, true);
  935. if (isPay) {
  936. setOrderPayed(orderInfo.getId(), realPayAmount);
  937. } else {
  938. errorMessage = PropertiesUtil.getResponseErrorMessageByCode(5001);
  939. }
  940. } else {
  941. BigDecimal wxPayAmount = realPayAmount.multiply(new BigDecimal("100"));
  942. // 扫码支付,先返回不处理,后面拿到支付二维码再处理
  943. if ((payType.equals(PayTypeEnum.MICROPAY.getKey()) || payType.equals(PayTypeEnum.ALISCAN.getKey())) && StringUtil.isEmpty(authCode)) {
  944. paymentInfo = new ResponseObject(200, "请求成功", new HashMap<>());
  945. } else {
  946. paymentInfo = paymentService.createPrepayOrder(userInfo, orderInfo, (wxPayAmount.intValue()), authCode, 0, ip, platform, isWechat);
  947. }
  948. if (paymentInfo.getData() == null) {
  949. errorMessage = StringUtil.isNotEmpty(paymentInfo.getMessage()) ? paymentInfo.getMessage() : PropertiesUtil.getResponseErrorMessageByCode(3000);
  950. }
  951. }
  952. } else {
  953. // 应付金额是0,直接更新为已支付
  954. setOrderPayed(orderInfo.getId(), null);
  955. }
  956. orderInfo = getOrderInfo(orderInfo.getId());
  957. Map<String, Object> outParams = new HashMap();
  958. outParams.put("isCreated", true);
  959. outParams.put("orderInfo", orderInfo);
  960. outParams.put("payType", payType);
  961. if (paymentInfo != null) {
  962. outParams.put("payment", paymentInfo.getData());
  963. } else {
  964. outParams.put("payment", null);
  965. }
  966. // 1分钟后发送小程序订阅消息
  967. Date nowTime = new Date();
  968. Date sendTime = new Date(nowTime.getTime() + 60000);
  969. Map<String, Object> params = new HashMap<>();
  970. String dateTime = DateUtil.formatDate(Calendar.getInstance().getTime(), "yyyy-MM-dd HH:mm");
  971. params.put("time", dateTime);
  972. params.put("orderSn", orderInfo.getOrderSn());
  973. params.put("remark", "您的订单已生成,请留意~");
  974. weixinService.sendSubscribeMessage(merchantId, userInfo.getId(), userInfo.getOpenId(), WxMessageEnum.ORDER_CREATED.getKey(), "pages/order/index", params, sendTime);
  975. if (StringUtil.isNotEmpty(errorMessage)) {
  976. throw new BusinessCheckException(errorMessage);
  977. } else {
  978. return outParams;
  979. }
  980. }
  981. /**
  982. * 获取订单详情
  983. *
  984. * @param orderId 订单ID
  985. * @throws BusinessCheckException
  986. * @return
  987. */
  988. @Override
  989. public MtOrder getOrderInfo(Integer orderId) {
  990. if (orderId == null || orderId <= 0) {
  991. return null;
  992. }
  993. return mtOrderMapper.selectById(orderId);
  994. }
  995. /**
  996. * 根据ID获取订单详情
  997. *
  998. * @param orderId 订单ID
  999. * @throws BusinessCheckException
  1000. * @return
  1001. */
  1002. @Override
  1003. public UserOrderDto getOrderById(Integer orderId) throws BusinessCheckException {
  1004. if (orderId == null || orderId <= 0) {
  1005. return null;
  1006. }
  1007. MtOrder mtOrder = mtOrderMapper.selectById(orderId);
  1008. return getOrderDetail(mtOrder, true, true);
  1009. }
  1010. /**
  1011. * 根据ID获取我的订单详情
  1012. *
  1013. * @param orderId 订单ID
  1014. * @throws BusinessCheckException
  1015. * @return
  1016. */
  1017. @Override
  1018. public UserOrderDto getMyOrderById(Integer orderId) throws BusinessCheckException {
  1019. if (orderId == null || orderId <= 0) {
  1020. return null;
  1021. }
  1022. MtOrder mtOrder = mtOrderMapper.selectById(orderId);
  1023. UserOrderDto orderInfo = getOrderDetail(mtOrder, true, true);
  1024. // 售后订单
  1025. MtRefund refund = refundService.getRefundByOrderId(orderId);
  1026. orderInfo.setRefundInfo(refund);
  1027. orderInfo.setVerifyCode(mtOrder.getVerifyCode());
  1028. return orderInfo;
  1029. }
  1030. /**
  1031. * 取消订单
  1032. *
  1033. * @param orderId 订单ID
  1034. * @param remark 取消备注
  1035. * @throws BusinessCheckException
  1036. * @return
  1037. * */
  1038. @Override
  1039. @Transactional(rollbackFor = Exception.class)
  1040. @OperationServiceLog(description = "取消订单")
  1041. public MtOrder cancelOrder(Integer orderId, String remark) throws BusinessCheckException {
  1042. MtOrder mtOrder = mtOrderMapper.selectById(orderId);
  1043. logger.info("orderService.cancelOrder orderId = {}, remark = {}", orderId, remark);
  1044. if (mtOrder != null && mtOrder.getStatus().equals(OrderStatusEnum.CREATED.getKey()) && mtOrder.getPayStatus().equals(PayStatusEnum.WAIT.getKey())) {
  1045. if (StringUtil.isNotEmpty(remark)) {
  1046. mtOrder.setRemark(remark);
  1047. }
  1048. mtOrder.setStatus(OrderStatusEnum.CANCEL.getKey());
  1049. mtOrderMapper.updateById(mtOrder);
  1050. // 返还积分
  1051. if (mtOrder.getPointAmount() != null && mtOrder.getUsePoint() > 0) {
  1052. MtPoint reqPointDto = new MtPoint();
  1053. reqPointDto.setUserId(mtOrder.getUserId());
  1054. reqPointDto.setAmount(mtOrder.getUsePoint());
  1055. reqPointDto.setDescription("订单取消" + mtOrder.getOrderSn() + "退回"+ mtOrder.getUsePoint() +"积分");
  1056. reqPointDto.setOrderSn(mtOrder.getOrderSn());
  1057. reqPointDto.setOperator("");
  1058. pointService.addPoint(reqPointDto);
  1059. }
  1060. // 返还卡券
  1061. List<MtConfirmLog> confirmLogList = mtConfirmLogMapper.getOrderConfirmLogList(mtOrder.getId());
  1062. if (confirmLogList.size() > 0) {
  1063. for (MtConfirmLog log : confirmLogList) {
  1064. MtCoupon couponInfo = couponService.queryCouponById(log.getCouponId());
  1065. MtUserCoupon userCouponInfo = mtUserCouponMapper.selectById(log.getUserCouponId());
  1066. if (userCouponInfo != null) {
  1067. // 优惠券直接置为未使用
  1068. if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) {
  1069. userCouponInfo.setStatus(UserCouponStatusEnum.UNUSED.getKey());
  1070. mtUserCouponMapper.updateById(userCouponInfo);
  1071. }
  1072. // 储值卡把余额加回去
  1073. if (couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  1074. BigDecimal balance = userCouponInfo.getBalance();
  1075. BigDecimal newBalance = balance.add(log.getAmount());
  1076. if (newBalance.compareTo(userCouponInfo.getAmount()) <= 0) {
  1077. userCouponInfo.setBalance(newBalance);
  1078. userCouponInfo.setStatus(UserCouponStatusEnum.UNUSED.getKey());
  1079. }
  1080. mtUserCouponMapper.updateById(userCouponInfo);
  1081. }
  1082. // 撤销核销记录
  1083. log.setStatus(StatusEnum.DISABLE.getKey());
  1084. mtConfirmLogMapper.updateById(log);
  1085. }
  1086. }
  1087. }
  1088. // 返还库存
  1089. Map<String, Object> params = new HashMap<>();
  1090. params.put("ORDER_ID", mtOrder.getId());
  1091. List<MtOrderGoods> orderGoodsList = mtOrderGoodsMapper.selectByMap(params);
  1092. if (orderGoodsList != null && orderGoodsList.size() > 0) {
  1093. for (MtOrderGoods mtOrderGoods : orderGoodsList) {
  1094. MtGoods mtGoods = mtGoodsMapper.selectById(mtOrderGoods.getGoodsId());
  1095. // 商品已不存在
  1096. if (mtGoods == null) {
  1097. continue;
  1098. }
  1099. mtGoods.setStock(mtOrderGoods.getNum() + mtGoods.getStock());
  1100. mtGoodsMapper.updateById(mtGoods);
  1101. if (mtOrderGoods.getSkuId() != null && mtOrderGoods.getSkuId() > 0) {
  1102. MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(mtOrderGoods.getSkuId());
  1103. if (mtGoodsSku != null && mtGoodsSku.getStock() != null && mtOrderGoods.getNum() != null) {
  1104. mtGoodsSku.setStock(mtGoodsSku.getStock() + mtOrderGoods.getNum());
  1105. mtGoodsSkuMapper.updateById(mtGoodsSku);
  1106. }
  1107. }
  1108. }
  1109. }
  1110. }
  1111. return mtOrder;
  1112. }
  1113. /**
  1114. * 根据订单ID删除
  1115. *
  1116. * @param orderId 订单ID
  1117. * @param operator 操作人
  1118. * @return
  1119. */
  1120. @Override
  1121. @OperationServiceLog(description = "删除订单信息")
  1122. public void deleteOrder(Integer orderId, String operator) {
  1123. logger.info("orderService.deleteOrder orderId = {}, operator = {}", orderId, operator);
  1124. MtOrder mtOrder = mtOrderMapper.selectById(orderId);
  1125. if (mtOrder == null) {
  1126. return;
  1127. }
  1128. mtOrder.setStatus(OrderStatusEnum.DELETED.getKey());
  1129. mtOrder.setUpdateTime(new Date());
  1130. mtOrder.setOperator(operator);
  1131. mtOrderMapper.updateById(mtOrder);
  1132. }
  1133. /**
  1134. * 根据订单号获取订单详情
  1135. *
  1136. * @param orderSn 订单号
  1137. * @throws BusinessCheckException
  1138. * @return
  1139. */
  1140. @Override
  1141. public UserOrderDto getOrderByOrderSn(String orderSn) throws BusinessCheckException {
  1142. MtOrder orderInfo = mtOrderMapper.findByOrderSn(orderSn);
  1143. if (orderInfo == null) {
  1144. return null;
  1145. }
  1146. return getOrderDetail(orderInfo, true, true);
  1147. }
  1148. /**
  1149. * 根据订单号获取订单信息
  1150. *
  1151. * @param orderSn 订单号
  1152. * @return
  1153. */
  1154. @Override
  1155. public MtOrder getOrderInfoByOrderSn(String orderSn) {
  1156. return mtOrderMapper.findByOrderSn(orderSn);
  1157. }
  1158. /**
  1159. * 更新订单
  1160. *
  1161. * @param orderDto 订单参数
  1162. * @throws BusinessCheckException
  1163. * @return
  1164. */
  1165. @Override
  1166. @Transactional(rollbackFor = Exception.class)
  1167. @OperationServiceLog(description = "更新订单信息")
  1168. public MtOrder updateOrder(OrderDto orderDto) throws BusinessCheckException {
  1169. logger.info("orderService.updateOrder orderDto = {}", JsonUtil.toJSONString(orderDto));
  1170. MtOrder mtOrder = mtOrderMapper.selectById(orderDto.getId());
  1171. if (null == mtOrder || OrderStatusEnum.DELETED.getKey().equals(mtOrder.getStatus())) {
  1172. throw new BusinessCheckException("该订单状态异常");
  1173. }
  1174. mtOrder.setId(orderDto.getId());
  1175. mtOrder.setUpdateTime(new Date());
  1176. if (null != orderDto.getOperator()) {
  1177. mtOrder.setOperator(orderDto.getOperator());
  1178. }
  1179. if (null != orderDto.getStatus()) {
  1180. if (orderDto.getStatus().equals(OrderStatusEnum.CANCEL.getKey()) || orderDto.getStatus().equals(OrderStatusEnum.CREATED.getKey())) {
  1181. orderDto.setPayStatus(PayStatusEnum.WAIT.getKey());
  1182. }
  1183. if (orderDto.getStatus().equals(OrderStatusEnum.CANCEL.getKey())) {
  1184. cancelOrder(orderDto.getId(), "取消订单");
  1185. } else {
  1186. mtOrder.setStatus(orderDto.getStatus());
  1187. }
  1188. if (orderDto.getStatus().equals(OrderStatusEnum.PAID.getKey())) {
  1189. mtOrder.setPayStatus(PayStatusEnum.SUCCESS.getKey());
  1190. mtOrder.setPayTime(new Date());
  1191. }
  1192. }
  1193. if (null != orderDto.getPayAmount()) {
  1194. mtOrder.setPayAmount(orderDto.getPayAmount());
  1195. }
  1196. if (null != orderDto.getAmount()) {
  1197. mtOrder.setAmount(orderDto.getAmount());
  1198. }
  1199. if (null != orderDto.getVerifyCode() && StringUtil.isNotEmpty(orderDto.getVerifyCode())) {
  1200. if (orderDto.getVerifyCode().equals(mtOrder.getVerifyCode()) || StringUtil.isEmpty(mtOrder.getVerifyCode())) {
  1201. mtOrder.setStatus(OrderStatusEnum.DELIVERED.getKey());
  1202. mtOrder.setVerifyCode("");
  1203. mtOrder.setConfirmStatus(YesOrNoEnum.YES.getKey());
  1204. mtOrder.setConfirmTime(new Date());
  1205. mtOrder.setConfirmRemark(orderDto.getConfirmRemark());
  1206. } else {
  1207. throw new BusinessCheckException("核销码错误,请确认!");
  1208. }
  1209. }
  1210. if (null != orderDto.getDiscount()) {
  1211. mtOrder.setDiscount(orderDto.getDiscount());
  1212. }
  1213. if (null != orderDto.getPayTime()) {
  1214. mtOrder.setPayTime(orderDto.getPayTime());
  1215. }
  1216. if (null != orderDto.getPayType()) {
  1217. mtOrder.setPayType(orderDto.getPayType());
  1218. }
  1219. if (null != orderDto.getPayStatus()) {
  1220. mtOrder.setPayStatus(orderDto.getPayStatus());
  1221. }
  1222. if (null != orderDto.getExpressInfo()) {
  1223. mtOrder.setExpressInfo(JSONObject.toJSONString(orderDto.getExpressInfo()));
  1224. }
  1225. if (null != orderDto.getOrderMode()) {
  1226. mtOrder.setOrderMode(orderDto.getOrderMode());
  1227. }
  1228. if (null != orderDto.getRemark()) {
  1229. mtOrder.setRemark(orderDto.getRemark());
  1230. }
  1231. mtOrderMapper.updateById(mtOrder);
  1232. return mtOrder;
  1233. }
  1234. /**
  1235. * 更新订单
  1236. *
  1237. * @param mtOrder 订单信息
  1238. * @return
  1239. * */
  1240. @Override
  1241. @Transactional(rollbackFor = Exception.class)
  1242. public MtOrder updateOrder(MtOrder mtOrder) {
  1243. mtOrder.setUpdateTime(new Date());
  1244. Integer id = mtOrderMapper.updateById(mtOrder);
  1245. if (id > 0) {
  1246. mtOrder = mtOrderMapper.selectById(mtOrder.getId());
  1247. }
  1248. return mtOrder;
  1249. }
  1250. /**
  1251. * 把订单置为已支付
  1252. *
  1253. * @param orderId 订单ID
  1254. * @param payAmount 支付金额
  1255. * @throws BusinessCheckException
  1256. * @return
  1257. * */
  1258. @Override
  1259. @Transactional(rollbackFor = Exception.class)
  1260. @OperationServiceLog(description = "修改订单为已支付")
  1261. public Boolean setOrderPayed(Integer orderId, BigDecimal payAmount) throws BusinessCheckException {
  1262. MtOrder mtOrder = mtOrderMapper.selectById(orderId);
  1263. if (mtOrder == null) {
  1264. return false;
  1265. }
  1266. if (mtOrder.getPayStatus().equals(PayStatusEnum.SUCCESS.getKey())) {
  1267. return true;
  1268. }
  1269. OrderDto reqDto = new OrderDto();
  1270. reqDto.setId(orderId);
  1271. reqDto.setStatus(OrderStatusEnum.PAID.getKey());
  1272. reqDto.setPayStatus(PayStatusEnum.SUCCESS.getKey());
  1273. if (payAmount != null) {
  1274. reqDto.setPayAmount(payAmount);
  1275. }
  1276. reqDto.setPayTime(new Date());
  1277. reqDto.setUpdateTime(new Date());
  1278. updateOrder(reqDto);
  1279. // 处理会员升级订单
  1280. if (mtOrder.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
  1281. openGiftService.openGift(mtOrder.getUserId(), Integer.parseInt(mtOrder.getParam()), false);
  1282. }
  1283. // 处理购物订单
  1284. UserOrderDto orderInfo = getOrderByOrderSn(mtOrder.getOrderSn());
  1285. if (orderInfo.getType().equals(OrderTypeEnum.GOODS.getKey())) {
  1286. try {
  1287. List<OrderGoodsDto> goodsList = orderInfo.getGoods();
  1288. if (goodsList != null && goodsList.size() > 0) {
  1289. for (OrderGoodsDto goodsDto : goodsList) {
  1290. MtGoods mtGoods = goodsService.queryGoodsById(goodsDto.getGoodsId());
  1291. if (mtGoods != null) {
  1292. // 购买虚拟卡券商品发放处理
  1293. if (mtGoods.getType().equals(GoodsTypeEnum.COUPON.getKey()) && mtGoods.getCouponIds() != null && StringUtil.isNotEmpty(mtGoods.getCouponIds())) {
  1294. String couponIds[] = mtGoods.getCouponIds().split(",");
  1295. if (couponIds.length > 0) {
  1296. for (int i = 0; i < couponIds.length; i++) {
  1297. userCouponService.buyCouponItem(orderInfo.getId(), Integer.parseInt(couponIds[i]), orderInfo.getUserId(), orderInfo.getUserInfo().getMobile(), goodsDto.getNum());
  1298. }
  1299. }
  1300. }
  1301. // 将已销售数量+1
  1302. goodsService.updateInitSale(mtGoods.getId(), goodsDto.getNum());
  1303. }
  1304. }
  1305. }
  1306. } catch (BusinessCheckException e) {
  1307. logger.error("会员购买的卡券发送给会员失败......" + e.getMessage());
  1308. }
  1309. }
  1310. // 处理消费返积分,查询返1积分所需消费金额
  1311. MtSetting setting = settingService.querySettingByName(mtOrder.getMerchantId(), SettingTypeEnum.POINT.getKey(), PointSettingEnum.POINT_NEED_CONSUME.getKey());
  1312. if (setting != null && !orderInfo.getPayType().equals(PayTypeEnum.BALANCE.getKey()) && orderInfo.getIsVisitor().equals(YesOrNoEnum.NO.getKey())) {
  1313. String needPayAmount = setting.getValue();
  1314. Integer needPayAmountInt = Math.round(Integer.parseInt(needPayAmount));
  1315. Double pointNum = 0d;
  1316. if (needPayAmountInt > 0 && orderInfo.getPayAmount().compareTo(new BigDecimal(needPayAmountInt)) >= 0) {
  1317. BigDecimal point = orderInfo.getPayAmount().divide(new BigDecimal(needPayAmountInt), BigDecimal.ROUND_CEILING, 4);
  1318. pointNum = Math.ceil(point.doubleValue());
  1319. }
  1320. logger.info("PaymentService paymentCallback Point orderSn = {} , pointNum ={}", orderInfo.getOrderSn(), pointNum);
  1321. if (pointNum > 0) {
  1322. // 充值是否加倍返积分
  1323. if (orderInfo.getType().equals(OrderTypeEnum.RECHARGE.getKey())) {
  1324. MtSetting pointSpeedSetting = settingService.querySettingByName(mtOrder.getMerchantId(), SettingTypeEnum.POINT.getKey(), PointSettingEnum.RECHARGE_POINT_SPEED.getKey());
  1325. if (pointSpeedSetting != null && StringUtil.isNotEmpty(pointSpeedSetting.getValue())) {
  1326. BigDecimal pointSpeed = new BigDecimal(pointSpeedSetting.getValue());
  1327. if (pointSpeed.compareTo(new BigDecimal("0")) > 0) {
  1328. pointNum = pointNum * new Double(pointSpeedSetting.getValue());
  1329. }
  1330. }
  1331. }
  1332. MtUser userInfo = memberService.queryMemberById(orderInfo.getUserId());
  1333. MtUserGrade userGrade = userGradeService.queryUserGradeById(orderInfo.getMerchantId(), Integer.parseInt(userInfo.getGradeId()), orderInfo.getUserId());
  1334. // 是否会员积分加倍
  1335. if (userGrade != null && userGrade.getSpeedPoint() > 1) {
  1336. pointNum = pointNum * userGrade.getSpeedPoint();
  1337. }
  1338. MtPoint reqPointDto = new MtPoint();
  1339. reqPointDto.setAmount(pointNum.intValue());
  1340. reqPointDto.setUserId(orderInfo.getUserId());
  1341. reqPointDto.setOrderSn(orderInfo.getOrderSn());
  1342. reqPointDto.setDescription("支付¥"+orderInfo.getPayAmount()+"返"+pointNum+"积分");
  1343. reqPointDto.setOperator("系统");
  1344. pointService.addPoint(reqPointDto);
  1345. }
  1346. }
  1347. // 计算是否要升级(购物订单、付款订单、充值订单)
  1348. if (orderInfo.getIsVisitor().equals(YesOrNoEnum.NO.getKey()) && orderInfo.getType().equals(OrderTypeEnum.GOODS.getKey()) || orderInfo.getType().equals(OrderTypeEnum.PAYMENT.getKey()) || orderInfo.getType().equals(OrderTypeEnum.RECHARGE.getKey())) {
  1349. try {
  1350. if (orderInfo.getIsVisitor().equals(YesOrNoEnum.NO.getKey())) {
  1351. Map<String, Object> param = new HashMap<>();
  1352. param.put("STATUS", StatusEnum.ENABLED.getKey());
  1353. param.put("MERCHANT_ID", mtOrder.getMerchantId());
  1354. MtUser mtUser = memberService.queryMemberById(orderInfo.getUserId());
  1355. MtUserGrade mtUserGrade = mtUserGradeMapper.selectById(mtUser.getGradeId());
  1356. if (mtUserGrade == null) {
  1357. mtUserGrade = userGradeService.getInitUserGrade(orderInfo.getMerchantId());
  1358. }
  1359. List<MtUserGrade> userGradeList = mtUserGradeMapper.selectByMap(param);
  1360. if (mtUserGrade != null && userGradeList != null && userGradeList.size() > 0) {
  1361. // 会员已支付金额
  1362. BigDecimal payMoney = getUserPayMoney(orderInfo.getUserId());
  1363. // 会员支付订单笔数
  1364. Integer payOrderCount = getUserPayOrderCount(orderInfo.getUserId());
  1365. BigDecimal payOrderCountValue = new BigDecimal(payOrderCount);
  1366. for (MtUserGrade grade : userGradeList) {
  1367. if (grade.getCatchValue() != null && grade.getCatchType() != null) {
  1368. // 累计消费金额已达到
  1369. if (grade.getCatchType().equals(UserGradeCatchTypeEnum.AMOUNT.getKey())) {
  1370. if (grade.getGrade().compareTo(mtUserGrade.getGrade()) > 0 && payMoney.compareTo(grade.getCatchValue()) >= 0) {
  1371. openGiftService.openGift(mtOrder.getUserId(), grade.getId(), false);
  1372. }
  1373. }
  1374. // 累计消费次数已达到
  1375. if (grade.getCatchType().equals(UserGradeCatchTypeEnum.FREQUENCY.getKey()) && payOrderCountValue.compareTo(grade.getCatchValue()) >= 0) {
  1376. if (grade.getGrade().compareTo(mtUserGrade.getGrade()) > 0) {
  1377. openGiftService.openGift(mtOrder.getUserId(), grade.getId(), false);
  1378. }
  1379. }
  1380. }
  1381. }
  1382. }
  1383. }
  1384. } catch (Exception ex) {
  1385. logger.error("会员升级出错啦,userId = {},message = {}", orderInfo.getUserId(), ex.getMessage());
  1386. }
  1387. }
  1388. try {
  1389. // 打印订单
  1390. printerService.printOrder(orderInfo, true);
  1391. // 给商家发送通知短信
  1392. MtStore mtStore = storeService.queryStoreById(mtOrder.getStoreId());
  1393. if (mtStore != null && orderInfo.getIsVisitor().equals(YesOrNoEnum.NO.getKey())) {
  1394. Map<String, String> params = new HashMap<>();
  1395. params.put("orderSn", mtOrder.getOrderSn());
  1396. List<String> mobileList = new ArrayList<>();
  1397. mobileList.add(mtStore.getPhone());
  1398. sendSmsService.sendSms(mtOrder.getMerchantId(), "new-order", mobileList, params);
  1399. }
  1400. } catch (Exception e) {
  1401. logger.info("打印订单或给商家发送短信出错啦,message = {}", e.getMessage());
  1402. }
  1403. return true;
  1404. }
  1405. /**
  1406. * 根据条件搜索订单
  1407. *
  1408. * @param params 查询参数
  1409. * @return
  1410. * */
  1411. @Override
  1412. public List<MtOrder> getOrderListByParams(Map<String, Object> params) {
  1413. return mtOrderMapper.selectByMap(params);
  1414. }
  1415. /**
  1416. * 处理订单详情
  1417. *
  1418. * @param orderInfo 订单信息
  1419. * @param needAddress 是否获取订单地址
  1420. * @param getPayStatus 是否获取支付状态
  1421. * @return UserOrderDto
  1422. * */
  1423. private UserOrderDto getOrderDetail(MtOrder orderInfo, boolean needAddress, boolean getPayStatus) throws BusinessCheckException {
  1424. UserOrderDto userOrderDto = new UserOrderDto();
  1425. userOrderDto.setId(orderInfo.getId());
  1426. userOrderDto.setMerchantId(orderInfo.getMerchantId());
  1427. userOrderDto.setStoreId(orderInfo.getStoreId());
  1428. userOrderDto.setUserId(orderInfo.getUserId());
  1429. userOrderDto.setCouponId(orderInfo.getCouponId());
  1430. userOrderDto.setOrderSn(orderInfo.getOrderSn());
  1431. userOrderDto.setRemark(orderInfo.getRemark());
  1432. userOrderDto.setType(orderInfo.getType());
  1433. userOrderDto.setPayType(orderInfo.getPayType());
  1434. userOrderDto.setOrderMode(orderInfo.getOrderMode());
  1435. userOrderDto.setCreateTime(DateUtil.formatDate(orderInfo.getCreateTime(), "yyyy.MM.dd HH:mm"));
  1436. userOrderDto.setUpdateTime(DateUtil.formatDate(orderInfo.getUpdateTime(), "yyyy.MM.dd HH:mm"));
  1437. userOrderDto.setAmount(orderInfo.getAmount());
  1438. userOrderDto.setIsVisitor(orderInfo.getIsVisitor());
  1439. userOrderDto.setStaffId(orderInfo.getStaffId());
  1440. userOrderDto.setVerifyCode("");
  1441. userOrderDto.setDeliveryFee(orderInfo.getDeliveryFee());
  1442. userOrderDto.setPlatform(orderInfo.getPlatform());
  1443. userOrderDto.setConfirmRemark(orderInfo.getConfirmRemark());
  1444. userOrderDto.setConfirmStatus(orderInfo.getConfirmStatus());
  1445. if (orderInfo.getConfirmTime() != null) {
  1446. userOrderDto.setConfirmTime(DateUtil.formatDate(orderInfo.getConfirmTime(), "yyyy.MM.dd HH:mm"));
  1447. }
  1448. if (orderInfo.getType().equals(OrderTypeEnum.GOODS.getKey()) && orderInfo.getPayStatus().equals(PayStatusEnum.SUCCESS.getKey()) && orderInfo.getConfirmStatus().equals(YesOrNoEnum.NO.getKey())) {
  1449. userOrderDto.setIsVerify(false);
  1450. } else {
  1451. userOrderDto.setIsVerify(true);
  1452. }
  1453. if (orderInfo.getPayAmount() != null) {
  1454. userOrderDto.setPayAmount(orderInfo.getPayAmount());
  1455. } else {
  1456. userOrderDto.setPayAmount(new BigDecimal("0"));
  1457. }
  1458. if (orderInfo.getDiscount() != null) {
  1459. userOrderDto.setDiscount(orderInfo.getDiscount());
  1460. } else {
  1461. userOrderDto.setDiscount(new BigDecimal("0"));
  1462. }
  1463. if (orderInfo.getPointAmount() != null) {
  1464. userOrderDto.setPointAmount(orderInfo.getPointAmount());
  1465. } else {
  1466. userOrderDto.setPointAmount(new BigDecimal("0"));
  1467. }
  1468. userOrderDto.setStatus(orderInfo.getStatus());
  1469. userOrderDto.setParam(orderInfo.getParam());
  1470. userOrderDto.setPayStatus(orderInfo.getPayStatus());
  1471. if (orderInfo.getUsePoint() != null) {
  1472. userOrderDto.setUsePoint(orderInfo.getUsePoint());
  1473. } else {
  1474. userOrderDto.setUsePoint(0);
  1475. }
  1476. if (orderInfo.getPayTime() != null) {
  1477. userOrderDto.setPayTime(DateUtil.formatDate(orderInfo.getPayTime(), "yyyy.MM.dd HH:mm"));
  1478. }
  1479. if (userOrderDto.getType().equals(OrderTypeEnum.PRESTORE.getKey())) {
  1480. userOrderDto.setTypeName(OrderTypeEnum.PRESTORE.getValue());
  1481. } else if(userOrderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) {
  1482. userOrderDto.setTypeName(OrderTypeEnum.PAYMENT.getValue());
  1483. } else if(userOrderDto.getType().equals(OrderTypeEnum.GOODS.getKey())) {
  1484. userOrderDto.setTypeName(OrderTypeEnum.GOODS.getValue());
  1485. } else if(userOrderDto.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
  1486. userOrderDto.setTypeName(OrderTypeEnum.MEMBER.getValue());
  1487. } else if(userOrderDto.getType().equals(OrderTypeEnum.RECHARGE.getKey())) {
  1488. userOrderDto.setTypeName(OrderTypeEnum.RECHARGE.getValue());
  1489. }
  1490. if (userOrderDto.getStatus().equals(OrderStatusEnum.CREATED.getKey())) {
  1491. userOrderDto.setStatusText(OrderStatusEnum.CREATED.getValue());
  1492. } else if(userOrderDto.getStatus().equals(OrderStatusEnum.CANCEL.getKey())) {
  1493. userOrderDto.setStatusText(OrderStatusEnum.CANCEL.getValue());
  1494. } else if(userOrderDto.getStatus().equals(OrderStatusEnum.PAID.getKey())) {
  1495. userOrderDto.setStatusText(OrderStatusEnum.PAID.getValue());
  1496. } else if(userOrderDto.getStatus().equals(OrderStatusEnum.DELIVERY.getKey())) {
  1497. userOrderDto.setStatusText(OrderStatusEnum.DELIVERY.getValue());
  1498. } else if(userOrderDto.getStatus().equals(OrderStatusEnum.DELIVERED.getKey())) {
  1499. userOrderDto.setStatusText(OrderStatusEnum.DELIVERED.getValue());
  1500. } else if(userOrderDto.getStatus().equals(OrderStatusEnum.RECEIVED.getKey())) {
  1501. userOrderDto.setStatusText(OrderStatusEnum.RECEIVED.getValue());
  1502. } else if(userOrderDto.getStatus().equals(OrderStatusEnum.DELETED.getKey())) {
  1503. userOrderDto.setStatusText(OrderStatusEnum.DELETED.getValue());
  1504. } else if(userOrderDto.getStatus().equals(OrderStatusEnum.REFUND.getKey())) {
  1505. userOrderDto.setStatusText(OrderStatusEnum.REFUND.getValue());
  1506. }
  1507. // 订单所属店铺
  1508. MtStore storeInfo = storeService.queryStoreById(orderInfo.getStoreId());
  1509. userOrderDto.setStoreInfo(storeInfo);
  1510. // 所属员工
  1511. if (orderInfo.getStaffId() != null && orderInfo.getStaffId() > 0) {
  1512. MtStaff staffInfo = staffService.queryStaffById(orderInfo.getStaffId());
  1513. userOrderDto.setStaffInfo(staffInfo);
  1514. }
  1515. // 下单用户信息直接取会员个人信息
  1516. OrderUserDto userInfo = new OrderUserDto();
  1517. MtUser user = memberService.queryMemberById(orderInfo.getUserId());
  1518. if (user != null) {
  1519. userInfo.setId(user.getId());
  1520. userInfo.setNo(user.getUserNo());
  1521. userInfo.setName(user.getName());
  1522. if (StringUtil.isNotEmpty(user.getMobile())) {
  1523. userInfo.setMobile(user.getMobile().replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"));
  1524. }
  1525. userInfo.setCardNo(user.getIdcard());
  1526. userInfo.setAddress(user.getAddress());
  1527. userInfo.setOpenId(user.getOpenId());
  1528. userOrderDto.setUserInfo(userInfo);
  1529. }
  1530. List<OrderGoodsDto> goodsList = new ArrayList<>();
  1531. String baseImage = settingService.getUploadBasePath();
  1532. // 储值卡的订单
  1533. if (orderInfo.getType().equals(OrderTypeEnum.PRESTORE.getKey())) {
  1534. MtCoupon coupon = couponService.queryCouponById(orderInfo.getCouponId());
  1535. if (coupon != null) {
  1536. String[] paramArr = orderInfo.getParam().split(",");
  1537. for (int i = 0; i < paramArr.length; i++) {
  1538. String[] item = paramArr[i].split("_");
  1539. if (Integer.parseInt(item[2]) > 0) {
  1540. OrderGoodsDto goodsDto = new OrderGoodsDto();
  1541. goodsDto.setId(coupon.getId());
  1542. goodsDto.setType(OrderTypeEnum.PRESTORE.getKey());
  1543. goodsDto.setName("预存¥" + item[0] + "到账¥" + item[1]);
  1544. goodsDto.setNum(Double.parseDouble(item[2]));
  1545. goodsDto.setPrice(item[0]);
  1546. goodsDto.setDiscount("0");
  1547. if (coupon.getImage().indexOf(baseImage) == -1) {
  1548. goodsDto.setImage(baseImage + coupon.getImage());
  1549. }
  1550. goodsList.add(goodsDto);
  1551. }
  1552. }
  1553. }
  1554. }
  1555. // 商品订单
  1556. if (orderInfo.getType().equals(OrderTypeEnum.GOODS.getKey())) {
  1557. Map<String, Object> params = new HashMap<>();
  1558. params.put("ORDER_ID", orderInfo.getId());
  1559. List<MtOrderGoods> orderGoodsList = mtOrderGoodsMapper.selectByMap(params);
  1560. for (MtOrderGoods orderGoods : orderGoodsList) {
  1561. MtGoods goodsInfo = mtGoodsMapper.selectById(orderGoods.getGoodsId());
  1562. if (goodsInfo != null) {
  1563. OrderGoodsDto orderGoodsDto = new OrderGoodsDto();
  1564. orderGoodsDto.setId(orderGoods.getId());
  1565. orderGoodsDto.setName(goodsInfo.getName());
  1566. if (goodsInfo.getLogo().indexOf(baseImage) == -1) {
  1567. orderGoodsDto.setImage(baseImage + goodsInfo.getLogo());
  1568. }
  1569. orderGoodsDto.setType(OrderTypeEnum.GOODS.getKey());
  1570. orderGoodsDto.setNum(orderGoods.getNum());
  1571. orderGoodsDto.setSkuId(orderGoods.getSkuId());
  1572. orderGoodsDto.setPrice(orderGoods.getPrice().toString());
  1573. orderGoodsDto.setDiscount(orderGoods.getDiscount().toString());
  1574. orderGoodsDto.setGoodsId(orderGoods.getGoodsId());
  1575. if (orderGoods.getSkuId() > 0) {
  1576. List<GoodsSpecValueDto> specList = goodsService.getSpecListBySkuId(orderGoods.getSkuId());
  1577. orderGoodsDto.setSpecList(specList);
  1578. }
  1579. goodsList.add(orderGoodsDto);
  1580. }
  1581. }
  1582. }
  1583. // 配送地址
  1584. if (orderInfo.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey()) && needAddress) {
  1585. List<MtOrderAddress> orderAddressList = mtOrderAddressMapper.getOrderAddress(orderInfo.getId());
  1586. MtOrderAddress orderAddress = null;
  1587. if (orderAddressList.size() > 0) {
  1588. orderAddress = orderAddressList.get(0);
  1589. }
  1590. if (orderAddress != null) {
  1591. AddressDto address = new AddressDto();
  1592. address.setId(orderAddress.getId());
  1593. address.setName(orderAddress.getName());
  1594. address.setMobile(orderAddress.getMobile());
  1595. address.setDetail(orderAddress.getDetail());
  1596. address.setProvinceId(orderAddress.getProvinceId());
  1597. address.setCityId(orderAddress.getCityId());
  1598. address.setRegionId(orderAddress.getRegionId());
  1599. if (orderAddress.getProvinceId() > 0) {
  1600. MtRegion mtProvince = mtRegionMapper.selectById(orderAddress.getProvinceId());
  1601. if (mtProvince != null) {
  1602. address.setProvinceName(mtProvince.getName());
  1603. }
  1604. }
  1605. if (orderAddress.getCityId() > 0) {
  1606. MtRegion mtCity = mtRegionMapper.selectById(orderAddress.getCityId());
  1607. if (mtCity != null) {
  1608. address.setCityName(mtCity.getName());
  1609. }
  1610. }
  1611. if (orderAddress.getRegionId() > 0) {
  1612. MtRegion mtRegion = mtRegionMapper.selectById(orderAddress.getRegionId());
  1613. if (mtRegion != null) {
  1614. address.setRegionName(mtRegion.getName());
  1615. }
  1616. }
  1617. userOrderDto.setAddress(address);
  1618. }
  1619. }
  1620. // 物流信息
  1621. if (StringUtil.isNotEmpty(orderInfo.getExpressInfo())) {
  1622. JSONObject express = JSONObject.parseObject(orderInfo.getExpressInfo());
  1623. ExpressDto expressInfo = new ExpressDto();
  1624. expressInfo.setExpressNo(express.get("expressNo").toString());
  1625. expressInfo.setExpressCompany(express.get("expressCompany").toString());
  1626. expressInfo.setExpressTime(express.get("expressTime").toString());
  1627. expressInfo.setExpressCode(express.get("expressCode") == null ? "" : express.get("expressCode").toString());
  1628. userOrderDto.setExpressInfo(expressInfo);
  1629. }
  1630. // 使用的卡券
  1631. if (userOrderDto.getCouponId() != null && userOrderDto.getCouponId() > 0) {
  1632. MtUserCoupon mtUserCoupon = userCouponService.getUserCouponDetail(userOrderDto.getCouponId());
  1633. if (mtUserCoupon != null) {
  1634. MtCoupon mtCoupon = couponService.queryCouponById(mtUserCoupon.getCouponId());
  1635. if (mtCoupon != null) {
  1636. UserCouponDto couponInfo = new UserCouponDto();
  1637. couponInfo.setId(mtUserCoupon.getId());
  1638. couponInfo.setCouponId(mtCoupon.getId());
  1639. couponInfo.setName(mtCoupon.getName());
  1640. couponInfo.setAmount(mtUserCoupon.getAmount());
  1641. couponInfo.setBalance(mtUserCoupon.getBalance());
  1642. couponInfo.setStatus(mtUserCoupon.getStatus());
  1643. couponInfo.setType(mtCoupon.getType());
  1644. userOrderDto.setCouponInfo(couponInfo);
  1645. }
  1646. }
  1647. }
  1648. // 查询支付状态
  1649. if (getPayStatus && !orderInfo.getPayStatus().equals(PayStatusEnum.SUCCESS.getKey())) {
  1650. // 微信支付
  1651. if (orderInfo.getPayType().equals(PayTypeEnum.MICROPAY.getKey()) || orderInfo.getPayType().equals(PayTypeEnum.JSAPI.getKey())) {
  1652. try {
  1653. Map<String, String> payResult = weixinService.queryPaidOrder(orderInfo.getStoreId(), "", orderInfo.getOrderSn());
  1654. if (payResult != null && payResult.get("trade_state").equals("SUCCESS")) {
  1655. BigDecimal payAmount = new BigDecimal(payResult.get("total_fee")).divide(new BigDecimal("100"));
  1656. setOrderPayed(orderInfo.getId(), payAmount);
  1657. userOrderDto.setPayStatus(PayStatusEnum.SUCCESS.getKey());
  1658. }
  1659. } catch (Exception e) {
  1660. // empty
  1661. }
  1662. }
  1663. // 支付宝支付
  1664. if (orderInfo.getPayType().equals(PayTypeEnum.ALISCAN.getKey())) {
  1665. try {
  1666. Map<String, String> payResult = alipayService.queryPaidOrder(orderInfo.getStoreId(), "", orderInfo.getOrderSn());
  1667. if (payResult != null) {
  1668. BigDecimal payAmount = new BigDecimal(payResult.get("payAmount"));
  1669. setOrderPayed(orderInfo.getId(), payAmount);
  1670. userOrderDto.setPayStatus(PayStatusEnum.SUCCESS.getKey());
  1671. }
  1672. } catch (Exception e) {
  1673. // empty
  1674. }
  1675. }
  1676. }
  1677. userOrderDto.setGoods(goodsList);
  1678. return userOrderDto;
  1679. }
  1680. /**
  1681. * 获取订单总数
  1682. *
  1683. * @param merchantId 商户ID
  1684. * @param storeId 店铺ID
  1685. * @return
  1686. * */
  1687. @Override
  1688. public BigDecimal getOrderCount(Integer merchantId, Integer storeId) {
  1689. if (storeId != null && storeId > 0) {
  1690. return mtOrderMapper.getStoreOrderCount(storeId);
  1691. } else {
  1692. return mtOrderMapper.getOrderCount(merchantId);
  1693. }
  1694. }
  1695. /**
  1696. * 获取订单数量
  1697. *
  1698. * @param merchantId 商户ID
  1699. * @param storeId 店铺ID
  1700. * @param beginTime 开始时间
  1701. * @param endTime 结束时间
  1702. * @return
  1703. * */
  1704. @Override
  1705. public BigDecimal getOrderCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) {
  1706. if (storeId != null && storeId > 0) {
  1707. return mtOrderMapper.getStoreOrderCountByTime(storeId, beginTime, endTime);
  1708. } else {
  1709. return mtOrderMapper.getOrderCountByTime(merchantId, beginTime, endTime);
  1710. }
  1711. }
  1712. /**
  1713. * 获取支付金额
  1714. *
  1715. * @param merchantId 商户ID
  1716. * @param storeId 店铺ID
  1717. * @param beginTime 开始时间
  1718. * @param endTime 结束时间
  1719. * @return
  1720. * */
  1721. @Override
  1722. public BigDecimal getPayMoney(Integer merchantId, Integer storeId, Date beginTime, Date endTime) {
  1723. BigDecimal payMoney;
  1724. if (storeId != null && storeId > 0) {
  1725. payMoney = mtOrderMapper.getStorePayMoneyByTime(storeId, beginTime, endTime);
  1726. } else {
  1727. payMoney = mtOrderMapper.getPayMoneyByTime(merchantId, beginTime, endTime);
  1728. }
  1729. if (payMoney == null) {
  1730. return new BigDecimal("0");
  1731. }
  1732. return payMoney;
  1733. }
  1734. /**
  1735. * 获取支付人数
  1736. *
  1737. * @param merchantId 商户ID
  1738. * @param storeId 店铺ID
  1739. * @return
  1740. * */
  1741. @Override
  1742. public Integer getPayUserCount(Integer merchantId, Integer storeId) {
  1743. if (storeId != null && storeId > 0) {
  1744. return mtOrderMapper.getStorePayUserCount(storeId);
  1745. } else {
  1746. return mtOrderMapper.getPayUserCount(merchantId);
  1747. }
  1748. }
  1749. /**
  1750. * 获取支付总金额
  1751. *
  1752. * @param merchantId 商户ID
  1753. * @param storeId 店铺ID
  1754. * @return
  1755. * */
  1756. @Override
  1757. public BigDecimal getPayMoney(Integer merchantId, Integer storeId) {
  1758. if (storeId != null && storeId > 0) {
  1759. return mtOrderMapper.getStorePayMoney(storeId);
  1760. } else {
  1761. return mtOrderMapper.getPayMoney(merchantId);
  1762. }
  1763. }
  1764. /**
  1765. * 计算商品总价
  1766. *
  1767. * @param merchantId 商户ID
  1768. * @param userId 会员ID
  1769. * @param cartList 购物车列表
  1770. * @param couponId 卡券ID
  1771. * @param isUsePoint 使用积分数量
  1772. * @param orderMode 订单模式
  1773. * @throws BusinessCheckException
  1774. * @return
  1775. * */
  1776. @Override
  1777. public Map<String, Object> calculateCartGoods(Integer merchantId, Integer userId, List<MtCart> cartList, Integer couponId, boolean isUsePoint, String platform, String orderMode) throws BusinessCheckException {
  1778. MtUser userInfo = memberService.queryMemberById(userId);
  1779. // 设置是否不能用积分抵扣
  1780. MtSetting pointSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.POINT.getKey(), PointSettingEnum.CAN_USE_AS_MONEY.getKey());
  1781. if (pointSetting != null && !pointSetting.getValue().equals(YesOrNoEnum.TRUE.getKey())) {
  1782. isUsePoint = false;
  1783. }
  1784. List<ResCartDto> cartDtoList = new ArrayList<>();
  1785. String basePath = settingService.getUploadBasePath();
  1786. Double totalNum = 0.0;
  1787. BigDecimal totalPrice = new BigDecimal("0");
  1788. BigDecimal totalCanUsePointAmount = new BigDecimal("0");
  1789. BigDecimal memberDiscount = new BigDecimal("0");
  1790. BigDecimal percent = new BigDecimal("0");
  1791. Integer storeId = 0;
  1792. if (cartList.size() > 0) {
  1793. // 会员折扣
  1794. MtUserGrade userGrade = userGradeService.queryUserGradeById(userInfo.getMerchantId(), userInfo.getGradeId() != null ? Integer.parseInt(userInfo.getGradeId()) : 1, userId);
  1795. if (userGrade != null && userGrade.getDiscount() != null && userGrade.getDiscount() > 0 && !userInfo.getIsStaff().equals(YesOrNoEnum.YES.getKey())) {
  1796. percent = new BigDecimal(userGrade.getDiscount()).divide(new BigDecimal("10"), BigDecimal.ROUND_CEILING, 4);
  1797. if (percent.compareTo(new BigDecimal("0")) <= 0) {
  1798. percent = new BigDecimal("1");
  1799. }
  1800. }
  1801. for (MtCart cart : cartList) {
  1802. if (storeId <= 0 && cart.getStoreId() != null) {
  1803. storeId = cart.getStoreId();
  1804. }
  1805. // 购物车商品信息
  1806. MtGoods mtGoodsInfo = goodsService.queryGoodsById(cart.getGoodsId());
  1807. if (mtGoodsInfo == null || !mtGoodsInfo.getStatus().equals(StatusEnum.ENABLED.getKey())) {
  1808. continue;
  1809. }
  1810. // 取对应sku的价格
  1811. if (cart.getSkuId() != null && cart.getSkuId() > 0) {
  1812. MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(cart.getSkuId());
  1813. if (mtGoodsSku != null && mtGoodsSku.getPrice().compareTo(new BigDecimal("0")) > 0) {
  1814. mtGoodsInfo.setPrice(mtGoodsSku.getPrice());
  1815. }
  1816. }
  1817. // 会员支付折扣
  1818. boolean isDiscount = mtGoodsInfo.getIsMemberDiscount().equals(YesOrNoEnum.YES.getKey()) ? true : false;
  1819. if (percent.compareTo(new BigDecimal("0")) > 0 && isDiscount) {
  1820. BigDecimal discount = mtGoodsInfo.getPrice().subtract(mtGoodsInfo.getPrice().multiply(percent)).multiply(new BigDecimal(cart.getNum()));
  1821. memberDiscount = memberDiscount.add(discount);
  1822. }
  1823. totalNum = totalNum + cart.getNum();
  1824. ResCartDto cartDto = new ResCartDto();
  1825. cartDto.setId(cart.getId());
  1826. cartDto.setGoodsId(cart.getGoodsId());
  1827. cartDto.setNum(cart.getNum());
  1828. cartDto.setSkuId(cart.getSkuId());
  1829. cartDto.setUserId(cart.getUserId());
  1830. // 购物车是否有效
  1831. Boolean isEffect = true;
  1832. if (cart.getSkuId() > 0) {
  1833. List<GoodsSpecValueDto> specList = goodsService.getSpecListBySkuId(cart.getSkuId());
  1834. cartDto.setSpecList(specList);
  1835. }
  1836. if (StringUtil.isNotEmpty(mtGoodsInfo.getLogo()) && (mtGoodsInfo.getLogo().indexOf(basePath) == -1)) {
  1837. mtGoodsInfo.setLogo(basePath + mtGoodsInfo.getLogo());
  1838. }
  1839. // 读取sku的数据
  1840. if (cart.getSkuId() > 0) {
  1841. MtGoods mtGoods = new MtGoods();
  1842. BeanUtils.copyProperties(mtGoodsInfo, mtGoods);
  1843. MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(cart.getSkuId());
  1844. if (mtGoodsSku != null) {
  1845. if (StringUtil.isNotEmpty(mtGoodsSku.getLogo()) && (mtGoodsSku.getLogo().indexOf(basePath) == -1)) {
  1846. mtGoods.setLogo(basePath + mtGoodsSku.getLogo());
  1847. }
  1848. if (mtGoodsSku.getWeight().compareTo(new BigDecimal("0")) > 0) {
  1849. mtGoods.setWeight(mtGoodsSku.getWeight());
  1850. }
  1851. mtGoods.setPrice(mtGoodsSku.getPrice());
  1852. mtGoods.setLinePrice(mtGoodsSku.getLinePrice());
  1853. mtGoods.setStock(mtGoodsSku.getStock());
  1854. }
  1855. cartDto.setGoodsInfo(mtGoods);
  1856. } else {
  1857. cartDto.setGoodsInfo(mtGoodsInfo);
  1858. }
  1859. if (mtGoodsInfo.getStock() != null && mtGoodsInfo.getStock() < cartDto.getNum()) {
  1860. isEffect = false;
  1861. }
  1862. cartDto.setIsEffect(isEffect);
  1863. // 计算总价
  1864. totalPrice = totalPrice.add(cartDto.getGoodsInfo().getPrice().multiply(new BigDecimal(cart.getNum())));
  1865. // 累加可用积分去抵扣的金额
  1866. if (mtGoodsInfo.getCanUsePoint() != null && mtGoodsInfo.getCanUsePoint().equals(YesOrNoEnum.YES.getKey())) {
  1867. totalCanUsePointAmount = totalCanUsePointAmount.add(cartDto.getGoodsInfo().getPrice().multiply(new BigDecimal(cart.getNum())));
  1868. }
  1869. cartDtoList.add(cartDto);
  1870. }
  1871. }
  1872. Map<String, Object> result = new HashMap<>();
  1873. // 可用卡券列表
  1874. List<CouponDto> couponList = new ArrayList<>();
  1875. List<String> statusList = Arrays.asList(UserCouponStatusEnum.UNUSED.getKey());
  1876. List<MtUserCoupon> userCouponList = userCouponService.getUserCouponList(userId, statusList);
  1877. if (userCouponList.size() > 0) {
  1878. for (MtUserCoupon userCoupon : userCouponList) {
  1879. MtCoupon couponInfo = couponService.queryCouponById(userCoupon.getCouponId());
  1880. // 优惠券和储值卡才能使用
  1881. if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey()) || couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  1882. CouponDto couponDto = new CouponDto();
  1883. couponDto.setId(couponInfo.getId());
  1884. couponDto.setUserCouponId(userCoupon.getId());
  1885. couponDto.setName(couponInfo.getName());
  1886. couponDto.setAmount(userCoupon.getAmount());
  1887. couponDto.setStatus(UserCouponStatusEnum.DISABLE.getKey());
  1888. // 购物不能用专用的卡券
  1889. if (couponInfo.getUseFor() != null && StringUtil.isNotEmpty(couponInfo.getUseFor())) {
  1890. if (couponInfo.getUseFor().equals(CouponUseForEnum.MEMBER_GRADE.getKey())) {
  1891. continue;
  1892. }
  1893. if (couponInfo.getUseFor().equals(CouponUseForEnum.OFF_LINE_PAYMENT.getKey())) {
  1894. // 只有PC收银端能用
  1895. if (!platform.equals(PlatformTypeEnum.PC.getCode())) {
  1896. continue;
  1897. }
  1898. }
  1899. }
  1900. // 判断在当前门店是否适用
  1901. if (StringUtil.isNotEmpty(couponInfo.getStoreIds())) {
  1902. String[] storeIds = couponInfo.getStoreIds().split(",");
  1903. if (storeIds.length > 0 && storeId != null && !Arrays.asList(storeIds).contains(storeId.toString())) {
  1904. continue;
  1905. }
  1906. }
  1907. boolean isEffective = couponService.isCouponEffective(couponInfo, userCoupon);
  1908. // 优惠券
  1909. if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) {
  1910. couponDto.setType(CouponTypeEnum.COUPON.getValue());
  1911. if (StringUtil.isEmpty(couponInfo.getOutRule()) || couponInfo.getOutRule().equals("0")) {
  1912. couponDto.setDescription("无使用门槛");
  1913. if (isEffective) {
  1914. couponDto.setStatus(UserCouponStatusEnum.UNUSED.getKey());
  1915. }
  1916. } else {
  1917. couponDto.setDescription("满" + couponInfo.getOutRule() + "元可用");
  1918. BigDecimal conditionAmount = new BigDecimal(couponInfo.getOutRule());
  1919. if (totalPrice.compareTo(conditionAmount) >= 0 && isEffective) {
  1920. couponDto.setStatus(UserCouponStatusEnum.UNUSED.getKey());
  1921. }
  1922. }
  1923. } else if (couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  1924. // 储值卡
  1925. couponDto.setType(CouponTypeEnum.PRESTORE.getValue());
  1926. couponDto.setDescription("无使用门槛");
  1927. couponDto.setAmount(userCoupon.getBalance());
  1928. // 余额须大于0
  1929. if (isEffective && (userCoupon.getBalance().compareTo(new BigDecimal("0")) > 0)) {
  1930. couponDto.setStatus(UserCouponStatusEnum.UNUSED.getKey());
  1931. }
  1932. }
  1933. // 适用商品
  1934. if (userCoupon != null) {
  1935. if (couponInfo.getApplyGoods() != null && couponInfo.getApplyGoods().equals(ApplyGoodsEnum.PARK_GOODS.getKey())) {
  1936. List<MtCouponGoods> couponGoodsList = mtCouponGoodsMapper.getCouponGoods(couponInfo.getId());
  1937. if (couponGoodsList != null && couponGoodsList.size() > 0 && cartList.size() > 0) {
  1938. List<Integer> applyGoodsIds = new ArrayList<>();
  1939. List<Integer> goodsIds = new ArrayList<>();
  1940. for (MtCouponGoods mtCouponGoods : couponGoodsList) {
  1941. applyGoodsIds.add(mtCouponGoods.getGoodsId());
  1942. }
  1943. for (MtCart mtCart : cartList) {
  1944. goodsIds.add(mtCart.getGoodsId());
  1945. }
  1946. List<Integer> intersection = applyGoodsIds.stream()
  1947. .filter(goodsIds::contains)
  1948. .collect(Collectors.toList());
  1949. if (intersection.size() == 0) {
  1950. couponDto.setStatus(UserCouponStatusEnum.DISABLE.getKey());
  1951. }
  1952. }
  1953. }
  1954. }
  1955. if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FIX.getKey())) {
  1956. couponDto.setEffectiveDate(DateUtil.formatDate(couponInfo.getBeginTime(), "yyyy.MM.dd HH:mm") + "~" + DateUtil.formatDate(couponInfo.getEndTime(), "yyyy.MM.dd HH:mm"));
  1957. }
  1958. if (couponInfo.getExpireType().equals(CouponExpireTypeEnum.FLEX.getKey())) {
  1959. couponDto.setEffectiveDate(DateUtil.formatDate(userCoupon.getCreateTime(), "yyyy.MM.dd HH:mm") + "~" + DateUtil.formatDate(userCoupon.getExpireTime(), "yyyy.MM.dd HH:mm"));
  1960. }
  1961. couponList.add(couponDto);
  1962. }
  1963. }
  1964. }
  1965. // 使用的卡券
  1966. MtCoupon useCouponInfo = null;
  1967. BigDecimal couponAmount = new BigDecimal("0");
  1968. if (couponId > 0) {
  1969. MtUserCoupon userCouponInfo = userCouponService.getUserCouponDetail(couponId);
  1970. if (userCouponInfo != null) {
  1971. useCouponInfo = couponService.queryCouponById(userCouponInfo.getCouponId());
  1972. boolean isEffective = couponService.isCouponEffective(useCouponInfo, userCouponInfo);
  1973. if (isEffective) {
  1974. if (useCouponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) {
  1975. couponAmount = useCouponInfo.getAmount();
  1976. } else if(useCouponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  1977. BigDecimal couponTotalAmount = userCouponInfo.getBalance();
  1978. if (couponTotalAmount.compareTo(totalPrice) > 0) {
  1979. couponAmount = totalPrice;
  1980. useCouponInfo.setAmount(totalPrice);
  1981. } else {
  1982. couponAmount = couponTotalAmount;
  1983. useCouponInfo.setAmount(couponTotalAmount);
  1984. }
  1985. }
  1986. }
  1987. }
  1988. }
  1989. // 支付金额 = 商品总额 - 卡券抵扣金额
  1990. BigDecimal payPrice = totalPrice.subtract(couponAmount);
  1991. // 可用积分、可用积分金额
  1992. Integer myPoint = userInfo.getPoint() == null ? 0 : userInfo.getPoint();
  1993. Integer usePoint = 0;
  1994. BigDecimal usePointAmount = new BigDecimal("0");
  1995. MtSetting setting = settingService.querySettingByName(merchantId, SettingTypeEnum.POINT.getKey(), PointSettingEnum.EXCHANGE_NEED_POINT.getKey());
  1996. if (myPoint > 0 && setting != null && isUsePoint) {
  1997. if (StringUtil.isNotEmpty(setting.getValue()) && !setting.getValue().equals("0")) {
  1998. BigDecimal usePoints = new BigDecimal(myPoint);
  1999. usePointAmount = usePoints.divide(new BigDecimal(setting.getValue()), BigDecimal.ROUND_CEILING, 4);
  2000. usePoint = myPoint;
  2001. if (usePointAmount.compareTo(totalCanUsePointAmount) >= 0) {
  2002. usePointAmount = totalCanUsePointAmount;
  2003. usePoint = totalCanUsePointAmount.multiply(new BigDecimal(setting.getValue())).intValue();
  2004. }
  2005. }
  2006. }
  2007. // 积分金额不能大于支付金额
  2008. if (usePointAmount.compareTo(payPrice) > 0 && isUsePoint) {
  2009. usePointAmount = payPrice;
  2010. BigDecimal usePoints = payPrice.multiply(new BigDecimal(setting.getValue()));
  2011. usePoint = usePoints.intValue();
  2012. }
  2013. // 支付金额 = 商品总额 - 积分抵扣金额
  2014. payPrice = payPrice.subtract(usePointAmount);
  2015. // 配送费用
  2016. BigDecimal deliveryFee = new BigDecimal("0");
  2017. MtSetting mtSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.ORDER.getKey(), OrderSettingEnum.DELIVERY_FEE.getKey());
  2018. if (mtSetting != null && StringUtil.isNotEmpty(mtSetting.getValue()) && orderMode.equals(OrderModeEnum.EXPRESS.getKey())) {
  2019. deliveryFee = new BigDecimal(mtSetting.getValue());
  2020. }
  2021. payPrice = payPrice.add(deliveryFee).subtract(memberDiscount);
  2022. BigDecimal discount = totalPrice.subtract(payPrice).divide(new BigDecimal("10"), BigDecimal.ROUND_CEILING, 2);
  2023. if (payPrice.compareTo(new BigDecimal("0")) < 0) {
  2024. payPrice = new BigDecimal("0");
  2025. }
  2026. result.put("list", cartDtoList);
  2027. result.put("totalNum", totalNum);
  2028. result.put("totalPrice", totalPrice);
  2029. result.put("payPrice", payPrice);
  2030. result.put("couponList", couponList);
  2031. result.put("useCouponInfo", useCouponInfo);
  2032. result.put("usePoint", usePoint);
  2033. result.put("myPoint", myPoint);
  2034. result.put("couponAmount", couponAmount);
  2035. result.put("usePointAmount", usePointAmount);
  2036. result.put("deliveryFee", deliveryFee);
  2037. result.put("discount", discount);
  2038. if (memberDiscount.compareTo(new BigDecimal("0")) > 0) {
  2039. result.put("memberDiscount", (new BigDecimal("10").multiply(percent)));
  2040. } else {
  2041. result.put("memberDiscount", 0);
  2042. }
  2043. return result;
  2044. }
  2045. /**
  2046. * 获取会员支付金额
  2047. *
  2048. * @param userId 会员ID
  2049. * @return
  2050. * */
  2051. @Override
  2052. public BigDecimal getUserPayMoney(Integer userId) {
  2053. return mtOrderMapper.getUserPayMoney(userId);
  2054. }
  2055. /**
  2056. * 获取会员订单数
  2057. *
  2058. * @param userId 会员ID
  2059. * @return
  2060. * */
  2061. @Override
  2062. public Integer getUserPayOrderCount(Integer userId) {
  2063. return mtOrderMapper.getUserPayOrderCount(userId);
  2064. }
  2065. /**
  2066. * 获取等待分佣的订单列表
  2067. *
  2068. * @param dateTime 时间
  2069. * @return
  2070. * */
  2071. @Override
  2072. public List<MtOrder> getTobeCommissionOrderList(String dateTime) {
  2073. return mtOrderMapper.getTobeCommissionOrderList(dateTime);
  2074. }
  2075. /**
  2076. * 提交充值订单
  2077. *
  2078. * @param request HttpServletRequest对象
  2079. * @param rechargeParam 充值参数
  2080. * @return
  2081. * */
  2082. @Override
  2083. public MtOrder doRecharge(HttpServletRequest request, RechargeParam rechargeParam) throws BusinessCheckException {
  2084. Integer storeId = StringUtil.isEmpty(request.getHeader("storeId")) ? 0 : Integer.parseInt(request.getHeader("storeId"));
  2085. String platform = request.getHeader("platform") == null ? "" : request.getHeader("platform");
  2086. String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo");
  2087. String rechargeAmount = rechargeParam.getRechargeAmount() == null ? "" : rechargeParam.getRechargeAmount();
  2088. String customAmount = rechargeParam.getCustomAmount() == null ? "" : rechargeParam.getCustomAmount();
  2089. if (StringUtil.isEmpty(rechargeAmount) && StringUtil.isEmpty(customAmount)) {
  2090. throw new BusinessCheckException("请确认充值金额");
  2091. }
  2092. if (rechargeParam.getMemberId() == null || rechargeParam.getMemberId() < 1) {
  2093. throw new BusinessCheckException("请确认充值会员信息");
  2094. }
  2095. Integer merchantId = merchantService.getMerchantId(merchantNo);
  2096. // 充值赠送金额
  2097. String ruleParam = "";
  2098. MtSetting mtSetting = settingService.querySettingByName(merchantId, SettingTypeEnum.BALANCE.getKey(), BalanceSettingEnum.RECHARGE_RULE.getKey());
  2099. if (StringUtil.isNotEmpty(rechargeAmount) && mtSetting != null) {
  2100. if (!mtSetting.getStatus().equals(StatusEnum.ENABLED.getKey())) {
  2101. throw new BusinessCheckException("当前未开启充值功能");
  2102. }
  2103. if (mtSetting.getValue() != null && StringUtil.isNotEmpty(mtSetting.getValue())) {
  2104. String rules[] = mtSetting.getValue().split(",");
  2105. for (String rule : rules) {
  2106. String amountArr[] = rule.split("_");
  2107. if (amountArr.length == 2) {
  2108. if (amountArr[0].equals(rechargeAmount)) {
  2109. ruleParam = rule;
  2110. break;
  2111. }
  2112. }
  2113. }
  2114. }
  2115. }
  2116. // 自定义充值没有赠送金额
  2117. if (StringUtil.isNotEmpty(customAmount) && Integer.parseInt(customAmount) > 0 && (StringUtil.isEmpty(rechargeAmount) || Integer.parseInt(rechargeAmount) <= 0)) {
  2118. rechargeAmount = customAmount;
  2119. ruleParam = customAmount + "_0";
  2120. }
  2121. if (StringUtil.isEmpty(ruleParam)) {
  2122. ruleParam = rechargeAmount + "_0";
  2123. }
  2124. BigDecimal amount = new BigDecimal(rechargeAmount);
  2125. if (amount.compareTo(new BigDecimal("0")) <= 0) {
  2126. throw new BusinessCheckException("请确认充值金额");
  2127. }
  2128. OrderDto orderDto = new OrderDto();
  2129. orderDto.setType(OrderTypeEnum.RECHARGE.getKey());
  2130. orderDto.setUserId(rechargeParam.getMemberId());
  2131. orderDto.setStoreId(storeId);
  2132. orderDto.setAmount(amount);
  2133. orderDto.setUsePoint(0);
  2134. orderDto.setRemark("会员充值");
  2135. orderDto.setParam(ruleParam);
  2136. orderDto.setStatus(OrderStatusEnum.CREATED.getKey());
  2137. orderDto.setPayStatus(PayStatusEnum.WAIT.getKey());
  2138. orderDto.setPointAmount(new BigDecimal("0"));
  2139. orderDto.setOrderMode("");
  2140. orderDto.setCouponId(0);
  2141. orderDto.setPlatform(platform);
  2142. orderDto.setMerchantId(merchantId);
  2143. return saveOrder(orderDto);
  2144. }
  2145. }