OrderServiceImpl.java 97 KB

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