OrderServiceImpl.java 61 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422
  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.service.*;
  11. import com.fuint.common.util.CommonUtil;
  12. import com.fuint.common.util.DateUtil;
  13. import com.fuint.common.util.SeqUtil;
  14. import com.fuint.framework.annoation.OperationServiceLog;
  15. import com.fuint.framework.exception.BusinessCheckException;
  16. import com.fuint.framework.pagination.PaginationResponse;
  17. import com.fuint.framework.web.ResponseObject;
  18. import com.fuint.repository.mapper.*;
  19. import com.fuint.repository.model.*;
  20. import com.fuint.utils.StringUtil;
  21. import com.github.pagehelper.Page;
  22. import com.github.pagehelper.PageHelper;
  23. import org.apache.commons.lang.StringUtils;
  24. import org.slf4j.Logger;
  25. import org.slf4j.LoggerFactory;
  26. import org.springframework.beans.BeanUtils;
  27. import org.springframework.beans.factory.annotation.Autowired;
  28. import org.springframework.data.domain.PageImpl;
  29. import org.springframework.data.domain.PageRequest;
  30. import org.springframework.stereotype.Service;
  31. import org.springframework.transaction.annotation.Transactional;
  32. import javax.annotation.Resource;
  33. import java.math.BigDecimal;
  34. import java.util.*;
  35. /**
  36. * 订单接口实现类
  37. *
  38. * Created by FSQ
  39. * CopyRight https://www.fuint.cn
  40. */
  41. @Service
  42. public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implements OrderService {
  43. private static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class);
  44. @Resource
  45. private MtOrderMapper mtOrderMapper;
  46. @Resource
  47. private MtGoodsMapper mtGoodsMapper;
  48. @Resource
  49. private MtOrderGoodsMapper mtOrderGoodsMapper;
  50. @Resource
  51. private MtCartMapper mtCartMapper;
  52. @Resource
  53. private MtOrderAddressMapper mtOrderAddressMapper;
  54. @Resource
  55. private MtConfirmLogMapper mtConfirmLogMapper;
  56. @Resource
  57. private MtUserCouponMapper mtUserCouponMapper;
  58. @Resource
  59. private MtGoodsSkuMapper mtGoodsSkuMapper;
  60. @Resource
  61. private MtRegionMapper mtRegionMapper;
  62. @Autowired
  63. private SettingService settingService;
  64. @Autowired
  65. private CouponService couponService;
  66. @Autowired
  67. private UserCouponService userCouponService;
  68. @Autowired
  69. private AddressService addressService;
  70. @Autowired
  71. private MemberService memberService;
  72. @Autowired
  73. private PointService pointService;
  74. @Autowired
  75. private CartService cartService;
  76. @Autowired
  77. private GoodsService goodsService;
  78. @Autowired
  79. private StoreService storeService;
  80. @Autowired
  81. UserGradeService userGradeService;
  82. @Autowired
  83. private RefundService refundService;
  84. @Autowired
  85. private WeixinService weixinService;
  86. @Autowired
  87. private AlipayService alipayService;
  88. @Autowired
  89. private SendSmsService sendSmsService;
  90. /**
  91. * 获取用户订单列表
  92. * @param orderListParam
  93. * @throws BusinessCheckException
  94. * */
  95. @Override
  96. @Transactional(rollbackFor = Exception.class)
  97. public ResponseObject getUserOrderList(OrderListParam orderListParam) throws BusinessCheckException {
  98. Integer pageNumber = orderListParam.getPage() == null ? Constants.PAGE_NUMBER : orderListParam.getPage();
  99. Integer pageSize = orderListParam.getPageSize() == null ? Constants.PAGE_SIZE : orderListParam.getPageSize();
  100. String userId = orderListParam.getUserId() == null ? "" : orderListParam.getUserId();
  101. Integer merchantId = orderListParam.getMerchantId() == null ? 0 : orderListParam.getMerchantId();
  102. String storeId = orderListParam.getStoreId() == null ? "" : orderListParam.getStoreId();
  103. String status = orderListParam.getStatus() == null ? "": orderListParam.getStatus();
  104. String payStatus = orderListParam.getPayStatus() == null ? "": orderListParam.getPayStatus();
  105. String dataType = orderListParam.getDataType() == null ? "": orderListParam.getDataType();
  106. String type = orderListParam.getType() == null ? "": orderListParam.getType();
  107. String orderSn = orderListParam.getOrderSn() == null ? "": orderListParam.getOrderSn();
  108. String mobile = orderListParam.getMobile() == null ? "": orderListParam.getMobile();
  109. String orderMode = orderListParam.getOrderMode() == null ? "": orderListParam.getOrderMode();
  110. String staffId = orderListParam.getStaffId() == null ? "" : orderListParam.getStaffId();
  111. String couponId = orderListParam.getCouponId() == null ? "" : orderListParam.getCouponId();
  112. String storeIds = orderListParam.getStoreIds() == null ? "" : orderListParam.getStoreIds();
  113. String startTime = orderListParam.getStartTime() == null ? "" : orderListParam.getStartTime();
  114. String endTime = orderListParam.getEndTime() == null ? "" : orderListParam.getEndTime();
  115. if (dataType.equals("toPay")) {
  116. status = OrderStatusEnum.CREATED.getKey(); // 待支付
  117. } else if(dataType.equals("paid")) {
  118. status = "";
  119. payStatus = PayStatusEnum.SUCCESS.getKey(); // 已支付
  120. } else if(dataType.equals("cancel")) {
  121. status = OrderStatusEnum.CANCEL.getKey(); // 已取消
  122. }
  123. Page<MtOpenGift> pageHelper = PageHelper.startPage(pageNumber, pageSize);
  124. LambdaQueryWrapper<MtOrder> lambdaQueryWrapper = Wrappers.lambdaQuery();
  125. if (StringUtil.isNotEmpty(orderSn)) {
  126. lambdaQueryWrapper.eq(MtOrder::getOrderSn, orderSn);
  127. }
  128. if (StringUtil.isNotEmpty(status)) {
  129. lambdaQueryWrapper.eq(MtOrder::getStatus, status);
  130. }
  131. if (StringUtil.isNotEmpty(payStatus)) {
  132. lambdaQueryWrapper.eq(MtOrder::getPayStatus, payStatus);
  133. }
  134. if (StringUtil.isNotEmpty(mobile)) {
  135. MtUser userInfo = memberService.queryMemberByMobile(mobile);
  136. if (userInfo != null) {
  137. userId = userInfo.getId() + "";
  138. } else {
  139. userId = "0";
  140. }
  141. }
  142. if (StringUtil.isNotEmpty(userId)) {
  143. lambdaQueryWrapper.eq(MtOrder::getUserId, userId);
  144. }
  145. if (merchantId > 0) {
  146. lambdaQueryWrapper.eq(MtOrder::getMerchantId, merchantId);
  147. }
  148. if (StringUtil.isNotEmpty(storeId)) {
  149. lambdaQueryWrapper.eq(MtOrder::getStoreId, storeId);
  150. }
  151. if (StringUtil.isNotEmpty(staffId)) {
  152. lambdaQueryWrapper.eq(MtOrder::getStaffId, staffId);
  153. }
  154. if (StringUtil.isNotEmpty(type)) {
  155. lambdaQueryWrapper.eq(MtOrder::getType, type);
  156. }
  157. if (StringUtil.isNotEmpty(orderMode)) {
  158. lambdaQueryWrapper.eq(MtOrder::getOrderMode, orderMode);
  159. }
  160. if (StringUtils.isNotBlank(couponId)) {
  161. lambdaQueryWrapper.eq(MtOrder::getCouponId, couponId);
  162. }
  163. if (StringUtils.isNotBlank(storeIds)) {
  164. List<String> idList = Arrays.asList(storeIds.split(","));
  165. if (idList.size() > 0) {
  166. lambdaQueryWrapper.in(MtOrder::getStoreId, idList);
  167. }
  168. }
  169. if (StringUtil.isNotEmpty(startTime)) {
  170. lambdaQueryWrapper.ge(MtOrder::getCreateTime, startTime);
  171. }
  172. if (StringUtil.isNotEmpty(endTime)) {
  173. lambdaQueryWrapper.le(MtOrder::getCreateTime, endTime);
  174. }
  175. lambdaQueryWrapper.orderByDesc(MtOrder::getId);
  176. List<MtOrder> orderList = mtOrderMapper.selectList(lambdaQueryWrapper);
  177. List<UserOrderDto> dataList = new ArrayList<>();
  178. if (orderList.size() > 0) {
  179. for (MtOrder order : orderList) {
  180. UserOrderDto dto = getOrderDetail(order,false, false);
  181. dataList.add(dto);
  182. }
  183. }
  184. PageRequest pageRequest = PageRequest.of(pageNumber, pageSize);
  185. PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal());
  186. PaginationResponse<UserOrderDto> paginationResponse = new PaginationResponse(pageImpl, UserOrderDto.class);
  187. paginationResponse.setTotalPages(pageHelper.getPages());
  188. paginationResponse.setTotalElements(pageHelper.getTotal());
  189. paginationResponse.setContent(dataList);
  190. return new ResponseObject(200, "查询成功", paginationResponse);
  191. }
  192. /**
  193. * 保存订单信息
  194. *
  195. * @param orderDto
  196. * @throws BusinessCheckException
  197. */
  198. @Override
  199. @Transactional(rollbackFor = Exception.class)
  200. @OperationServiceLog(description = "提交订单信息")
  201. public MtOrder saveOrder(OrderDto orderDto) throws BusinessCheckException {
  202. MtOrder mtOrder;
  203. if (null != orderDto.getId() && orderDto.getId() > 0) {
  204. mtOrder = mtOrderMapper.selectById(orderDto.getId());
  205. } else {
  206. mtOrder = new MtOrder();
  207. }
  208. // 检查店铺是否已被禁用
  209. if (orderDto.getStoreId() != null && orderDto.getStoreId() > 0) {
  210. MtStore storeInfo = storeService.queryStoreById(orderDto.getStoreId());
  211. if (storeInfo != null) {
  212. if (!storeInfo.getStatus().equals(StatusEnum.ENABLED.getKey())) {
  213. orderDto.setStoreId(0);
  214. }
  215. }
  216. }
  217. String orderSn;
  218. if (orderDto.getId() == null || orderDto.getId() < 1) {
  219. orderSn = CommonUtil.createOrderSN(orderDto.getUserId() + "");
  220. mtOrder.setOrderSn(orderSn);
  221. } else {
  222. orderSn = mtOrder.getOrderSn();
  223. }
  224. mtOrder.setUserId(orderDto.getUserId());
  225. mtOrder.setMerchantId(orderDto.getMerchantId());
  226. mtOrder.setStoreId(orderDto.getStoreId());
  227. mtOrder.setCouponId(orderDto.getCouponId());
  228. mtOrder.setParam(orderDto.getParam());
  229. mtOrder.setRemark(orderDto.getRemark());
  230. mtOrder.setStatus(OrderStatusEnum.CREATED.getKey());
  231. mtOrder.setType(orderDto.getType());
  232. mtOrder.setAmount(orderDto.getAmount());
  233. mtOrder.setPayAmount(orderDto.getPayAmount());
  234. mtOrder.setDiscount(orderDto.getDiscount());
  235. mtOrder.setPayStatus(PayStatusEnum.WAIT.getKey());
  236. mtOrder.setPointAmount(orderDto.getPointAmount());
  237. mtOrder.setUsePoint(orderDto.getUsePoint());
  238. mtOrder.setOrderMode(orderDto.getOrderMode());
  239. mtOrder.setPayType(orderDto.getPayType());
  240. mtOrder.setOperator(orderDto.getOperator());
  241. mtOrder.setStaffId(orderDto.getStaffId());
  242. mtOrder.setIsVisitor(orderDto.getIsVisitor());
  243. mtOrder.setUpdateTime(new Date());
  244. mtOrder.setDeliveryFee(orderDto.getDeliveryFee() == null ? new BigDecimal(0) : orderDto.getDeliveryFee());
  245. if (mtOrder.getId() == null || mtOrder.getId() <= 0) {
  246. mtOrder.setCreateTime(new Date());
  247. }
  248. // 核销码
  249. if (orderDto.getPlatform() == null) {
  250. orderDto.setPlatform("");
  251. }
  252. if (mtOrder.getVerifyCode() == null && !orderDto.getPlatform().equals(PlatformTypeEnum.PC.getCode())) {
  253. mtOrder.setVerifyCode(SeqUtil.getRandomNumber(6));
  254. }
  255. // 首先生成订单
  256. mtOrderMapper.insert(mtOrder);
  257. MtOrder orderInfo = mtOrderMapper.selectById(mtOrder.getId());
  258. mtOrder.setId(orderInfo.getId());
  259. // 会员相关信息
  260. MtUser userInfo = memberService.queryMemberById(orderDto.getUserId());
  261. MtUserGrade userGrade = userGradeService.queryUserGradeById(userInfo.getGradeId() != null ? Integer.parseInt(userInfo.getGradeId()) : 1, orderDto.getUserId());
  262. BigDecimal percent = new BigDecimal("0");
  263. if (userGrade != null && userGrade.getDiscount() != null && userGrade.getDiscount() > 0) {
  264. // 会员折扣
  265. percent = new BigDecimal(userGrade.getDiscount()).divide(new BigDecimal("10"), BigDecimal.ROUND_CEILING, 3);
  266. }
  267. // 如果没有指定店铺,则读取默认的店铺
  268. if (orderDto.getStoreId() == null || orderDto.getStoreId() <= 0) {
  269. Map<String, Object> params = new HashMap<>();
  270. params.put("status", StatusEnum.ENABLED.getKey());
  271. params.put("is_default", YesOrNoEnum.YES.getKey());
  272. List<MtStore> storeList = storeService.queryStoresByParams(params);
  273. if (storeList.size() > 0) {
  274. mtOrder.setStoreId(storeList.get(0).getId());
  275. } else {
  276. mtOrder.setStoreId(0);
  277. }
  278. }
  279. mtOrder.setUpdateTime(new Date());
  280. if (mtOrder.getCreateTime() == null) {
  281. mtOrder.setCreateTime(new Date());
  282. }
  283. // 计算商品订单总金额
  284. List<MtCart> cartList = new ArrayList<>();
  285. Map<String, Object> cartData = new HashMap<>();
  286. if (orderDto.getType().equals(OrderTypeEnum.GOOGS.getKey())) {
  287. Map<String, Object> param = new HashMap<>();
  288. param.put("status", StatusEnum.ENABLED.getKey());
  289. if (StringUtil.isNotEmpty(orderDto.getCartIds())) {
  290. param.put("ids", orderDto.getCartIds());
  291. }
  292. if (orderDto.getGoodsId() < 1) {
  293. cartList = cartService.queryCartListByParams(param);
  294. if (cartList.size() < 1) {
  295. throw new BusinessCheckException("生成订单失败,请稍后重试");
  296. }
  297. } else {
  298. // 直接购买
  299. MtCart mtCart = new MtCart();
  300. mtCart.setGoodsId(orderDto.getGoodsId());
  301. mtCart.setSkuId(orderDto.getSkuId());
  302. mtCart.setNum(orderDto.getBuyNum());
  303. mtCart.setId(0);
  304. mtCart.setUserId(orderDto.getUserId());
  305. mtCart.setStatus(StatusEnum.ENABLED.getKey());
  306. cartList.add(mtCart);
  307. }
  308. boolean isUsePoint = orderDto.getUsePoint() > 0 ? true : false;
  309. cartData = calculateCartGoods(orderInfo.getMerchantId(), orderDto.getUserId(), cartList, orderDto.getCouponId(), isUsePoint, orderDto.getPlatform(), orderInfo.getOrderMode());
  310. mtOrder.setAmount(new BigDecimal(cartData.get("totalPrice").toString()));
  311. mtOrder.setUsePoint(Integer.parseInt(cartData.get("usePoint").toString()));
  312. mtOrder.setDiscount(new BigDecimal(cartData.get("couponAmount").toString()));
  313. // 实付金额
  314. BigDecimal payAmount = mtOrder.getAmount().subtract(mtOrder.getPointAmount()).subtract(mtOrder.getDiscount());
  315. if (payAmount.compareTo(new BigDecimal("0")) > 0) {
  316. mtOrder.setPayAmount(payAmount);
  317. } else {
  318. mtOrder.setPayAmount(new BigDecimal("0"));
  319. }
  320. // 购物使用了卡券
  321. if (mtOrder.getCouponId() > 0) {
  322. String useCode = couponService.useCoupon(mtOrder.getCouponId(), mtOrder.getUserId(), mtOrder.getStoreId(), mtOrder.getId(), mtOrder.getDiscount(), "购物使用卡券");
  323. // 卡券使用失败
  324. if (StringUtil.isEmpty(useCode)) {
  325. mtOrder.setDiscount(new BigDecimal("0"));
  326. mtOrder.setCouponId(0);
  327. }
  328. }
  329. }
  330. // 会员付款类订单
  331. if (orderDto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) {
  332. if (userInfo != null && userInfo.getGradeId() != null && orderDto.getIsVisitor().equals(YesOrNoEnum.NO.getKey())) {
  333. if (percent.compareTo(new BigDecimal("0")) > 0) {
  334. // 会员折扣
  335. BigDecimal payAmountDiscount = mtOrder.getPayAmount().multiply(percent);
  336. if (payAmountDiscount.compareTo(new BigDecimal("0")) > 0) {
  337. mtOrder.setDiscount(mtOrder.getDiscount().add(mtOrder.getPayAmount().subtract(payAmountDiscount)));
  338. mtOrder.setPayAmount(payAmountDiscount);
  339. } else {
  340. mtOrder.setPayAmount(new BigDecimal("0"));
  341. }
  342. }
  343. }
  344. }
  345. // 再次更新订单
  346. try {
  347. orderInfo = updateOrder(mtOrder);
  348. } catch (Exception e) {
  349. logger.error("OrderService 生成订单失败...");
  350. throw new BusinessCheckException("生成订单失败,请稍后重试");
  351. }
  352. // 扣减积分
  353. if (orderDto.getUsePoint() > 0) {
  354. try {
  355. MtPoint reqPointDto = new MtPoint();
  356. reqPointDto.setUserId(orderDto.getUserId());
  357. reqPointDto.setAmount(-orderDto.getUsePoint());
  358. reqPointDto.setOrderSn(orderSn);
  359. reqPointDto.setDescription("支付扣除" + orderDto.getUsePoint() + "积分");
  360. reqPointDto.setOperator("");
  361. pointService.addPoint(reqPointDto);
  362. } catch (BusinessCheckException e) {
  363. logger.error("OrderService 扣减积分失败...{}", e.getMessage());
  364. throw new BusinessCheckException("扣减积分失败,请稍后重试");
  365. }
  366. }
  367. // 如果是商品订单,生成订单商品
  368. if (orderDto.getType().equals(OrderTypeEnum.GOOGS.getKey()) && cartList.size() > 0) {
  369. Object listObject = cartData.get("list");
  370. List<ResCartDto> lists =(ArrayList<ResCartDto>)listObject;
  371. BigDecimal memberDiscount = new BigDecimal("0");
  372. for (ResCartDto cart : lists) {
  373. MtOrderGoods orderGoods = new MtOrderGoods();
  374. orderGoods.setOrderId(orderInfo.getId());
  375. orderGoods.setGoodsId(cart.getGoodsId());
  376. orderGoods.setSkuId(cart.getSkuId());
  377. orderGoods.setNum(cart.getNum());
  378. // 计算会员折扣
  379. BigDecimal price = cart.getGoodsInfo().getPrice();
  380. boolean isDiscount = cart.getGoodsInfo().getIsMemberDiscount().equals(YesOrNoEnum.YES.getKey()) ? true : false;
  381. if (percent.compareTo(new BigDecimal("0")) > 0 && isDiscount) {
  382. orderGoods.setPrice(price.multiply(percent));
  383. BigDecimal discount = price.subtract(price.multiply(percent)).multiply(new BigDecimal(cart.getNum()));
  384. orderGoods.setDiscount(discount);
  385. memberDiscount = memberDiscount.add(discount);
  386. } else {
  387. orderGoods.setPrice(price);
  388. orderGoods.setDiscount(new BigDecimal("0"));
  389. }
  390. orderGoods.setStatus(StatusEnum.ENABLED.getKey());
  391. orderGoods.setCreateTime(new Date());
  392. orderGoods.setUpdateTime(new Date());
  393. mtOrderGoodsMapper.insert(orderGoods);
  394. // 扣减库存
  395. MtGoods goodsInfo = mtGoodsMapper.selectById(cart.getGoodsId());
  396. if (goodsInfo.getIsSingleSpec().equals(YesOrNoEnum.YES.getKey())) {
  397. // 单规格减去库存
  398. Integer stock = goodsInfo.getStock() - cart.getNum();
  399. if (stock < 0) {
  400. throw new BusinessCheckException("商品“" + goodsInfo.getName() + "”库存不足,订单提交失败");
  401. }
  402. goodsInfo.setStock(stock);
  403. mtGoodsMapper.updateById(goodsInfo);
  404. } else {
  405. // 多规格减去库存
  406. MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(cart.getSkuId());
  407. if (mtGoodsSku != null) {
  408. Integer stock = mtGoodsSku.getStock() - cart.getNum();
  409. if (stock < 0) {
  410. throw new BusinessCheckException("商品sku编码“" + mtGoodsSku.getSkuNo() +"”库存不足,订单提交失败");
  411. }
  412. mtGoodsSku.setStock(stock);
  413. mtGoodsSkuMapper.updateById(mtGoodsSku);
  414. }
  415. }
  416. if (cart.getId() > 0) {
  417. mtCartMapper.deleteById(cart.getId());
  418. }
  419. }
  420. // 会员折扣
  421. if (memberDiscount.compareTo(new BigDecimal("0")) > 0) {
  422. orderInfo.setDiscount(orderInfo.getDiscount().add(memberDiscount));
  423. if (orderInfo.getPayAmount().subtract(memberDiscount).compareTo(new BigDecimal("0")) > 0) {
  424. orderInfo.setPayAmount(orderInfo.getPayAmount().subtract(memberDiscount));
  425. } else {
  426. orderInfo.setPayAmount(new BigDecimal("0"));
  427. }
  428. orderInfo.setUpdateTime(new Date());
  429. orderInfo = updateOrder(orderInfo);
  430. }
  431. // 需要配送的订单,生成配送地址
  432. if (orderDto.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey())) {
  433. Map<String, Object> params = new HashMap<>();
  434. params.put("userId", orderDto.getUserId().toString());
  435. params.put("isDefault", YesOrNoEnum.YES.getKey());
  436. List<MtAddress> addressList = addressService.queryListByParams(params);
  437. MtAddress mtAddress;
  438. if (addressList.size() > 0) {
  439. mtAddress = addressList.get(0);
  440. } else {
  441. throw new BusinessCheckException("配送地址出错了,请重新选择配送地址");
  442. }
  443. MtOrderAddress orderAddress = new MtOrderAddress();
  444. orderAddress.setOrderId(orderInfo.getId());
  445. orderAddress.setUserId(orderDto.getUserId());
  446. orderAddress.setName(mtAddress.getName());
  447. orderAddress.setMobile(mtAddress.getMobile());
  448. orderAddress.setCityId(mtAddress.getCityId());
  449. orderAddress.setProvinceId(mtAddress.getProvinceId());
  450. orderAddress.setRegionId(mtAddress.getRegionId());
  451. orderAddress.setDetail(mtAddress.getDetail());
  452. orderAddress.setCreateTime(new Date());
  453. mtOrderAddressMapper.insert(orderAddress);
  454. }
  455. }
  456. return orderInfo;
  457. }
  458. /**
  459. * 获取订单详情
  460. *
  461. * @param id
  462. * @throws BusinessCheckException
  463. */
  464. @Override
  465. public MtOrder getOrderInfo(Integer id) {
  466. return mtOrderMapper.selectById(id);
  467. }
  468. /**
  469. * 根据ID获取订单详情
  470. *
  471. * @param id 订单ID
  472. * @throws BusinessCheckException
  473. */
  474. @Override
  475. public UserOrderDto getOrderById(Integer id) throws BusinessCheckException {
  476. MtOrder mtOrder = mtOrderMapper.selectById(id);
  477. return getOrderDetail(mtOrder, true, true);
  478. }
  479. /**
  480. * 根据ID获取我的订单详情
  481. *
  482. * @param id 订单ID
  483. * @throws BusinessCheckException
  484. */
  485. @Override
  486. public UserOrderDto getMyOrderById(Integer id) throws BusinessCheckException {
  487. MtOrder mtOrder = mtOrderMapper.selectById(id);
  488. UserOrderDto orderInfo = getOrderDetail(mtOrder, true, true);
  489. // 售后订单
  490. MtRefund refund = refundService.getRefundByOrderId(id);
  491. orderInfo.setRefundInfo(refund);
  492. orderInfo.setVerifyCode(mtOrder.getVerifyCode());
  493. return orderInfo;
  494. }
  495. /**
  496. * 取消订单
  497. * @param id 订单ID
  498. * @return
  499. * */
  500. @Override
  501. @Transactional(rollbackFor = Exception.class)
  502. @OperationServiceLog(description = "取消订单")
  503. public MtOrder cancelOrder(Integer id, String remark) throws BusinessCheckException {
  504. MtOrder mtOrder = mtOrderMapper.selectById(id);
  505. if (mtOrder != null && mtOrder.getStatus().equals(OrderStatusEnum.CREATED.getKey()) && mtOrder.getPayStatus().equals(PayStatusEnum.WAIT.getKey())) {
  506. if (StringUtil.isNotEmpty(remark)) {
  507. mtOrder.setRemark(remark);
  508. }
  509. mtOrder.setStatus(OrderStatusEnum.CANCEL.getKey());
  510. mtOrderMapper.updateById(mtOrder);
  511. // 返还积分
  512. if (mtOrder.getPointAmount() != null && mtOrder.getUsePoint() > 0) {
  513. MtPoint reqPointDto = new MtPoint();
  514. reqPointDto.setUserId(mtOrder.getUserId());
  515. reqPointDto.setAmount(mtOrder.getUsePoint());
  516. reqPointDto.setDescription("订单取消" + mtOrder.getOrderSn() + "退回"+ mtOrder.getUsePoint() +"积分");
  517. reqPointDto.setOrderSn(mtOrder.getOrderSn());
  518. reqPointDto.setOperator("");
  519. pointService.addPoint(reqPointDto);
  520. }
  521. // 返还卡券
  522. List<MtConfirmLog> confirmLogList = mtConfirmLogMapper.getOrderConfirmLogList(mtOrder.getId());
  523. if (confirmLogList.size() > 0) {
  524. for (MtConfirmLog log : confirmLogList) {
  525. MtCoupon couponInfo = couponService.queryCouponById(log.getCouponId());
  526. MtUserCoupon userCouponInfo = mtUserCouponMapper.selectById(log.getUserCouponId());
  527. if (userCouponInfo != null) {
  528. // 优惠券直接置为未使用
  529. if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) {
  530. userCouponInfo.setStatus(UserCouponStatusEnum.UNUSED.getKey());
  531. mtUserCouponMapper.updateById(userCouponInfo);
  532. }
  533. // 储值卡把余额加回去
  534. if (couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  535. BigDecimal balance = userCouponInfo.getBalance();
  536. BigDecimal newBalance = balance.add(log.getAmount());
  537. if (newBalance.compareTo(userCouponInfo.getAmount()) <= 0) {
  538. userCouponInfo.setBalance(newBalance);
  539. userCouponInfo.setStatus(UserCouponStatusEnum.UNUSED.getKey());
  540. }
  541. mtUserCouponMapper.updateById(userCouponInfo);
  542. }
  543. // 撤销核销记录
  544. log.setStatus(StatusEnum.DISABLE.getKey());
  545. mtConfirmLogMapper.updateById(log);
  546. }
  547. }
  548. }
  549. // 返还库存
  550. Map<String, Object> params = new HashMap<>();
  551. params.put("ORDER_ID", mtOrder.getId());
  552. List<MtOrderGoods> orderGoodsList = mtOrderGoodsMapper.selectByMap(params);
  553. if (orderGoodsList != null && orderGoodsList.size() > 0) {
  554. for (MtOrderGoods mtOrderGoods : orderGoodsList) {
  555. MtGoods mtGoods = mtGoodsMapper.selectById(mtOrderGoods.getGoodsId());
  556. mtGoods.setStock(mtOrderGoods.getNum() + mtGoods.getStock());
  557. mtGoodsMapper.updateById(mtGoods);
  558. if (mtOrderGoods.getSkuId() != null && mtOrderGoods.getSkuId() > 0) {
  559. MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(mtOrderGoods.getSkuId());
  560. if (mtGoodsSku != null && mtGoodsSku.getStock() != null && mtOrderGoods.getNum() != null) {
  561. mtGoodsSku.setStock(mtGoodsSku.getStock() + mtOrderGoods.getNum());
  562. mtGoodsSkuMapper.updateById(mtGoodsSku);
  563. }
  564. }
  565. }
  566. }
  567. }
  568. return mtOrder;
  569. }
  570. /**
  571. * 根据订单ID删除
  572. *
  573. * @param id ID
  574. * @param operator 操作人
  575. * @throws BusinessCheckException
  576. */
  577. @Override
  578. @OperationServiceLog(description = "删除订单信息")
  579. public void deleteOrder(Integer id, String operator) {
  580. MtOrder mtOrder = mtOrderMapper.selectById(id);
  581. if (mtOrder == null) {
  582. return;
  583. }
  584. mtOrder.setStatus(OrderStatusEnum.DELETED.getKey());
  585. mtOrder.setUpdateTime(new Date());
  586. mtOrder.setOperator(operator);
  587. mtOrderMapper.updateById(mtOrder);
  588. }
  589. /**
  590. * 根据订单号获取订单详情
  591. *
  592. * @param orderSn 订单号
  593. * @throws BusinessCheckException
  594. */
  595. @Override
  596. public UserOrderDto getOrderByOrderSn(String orderSn) throws BusinessCheckException {
  597. MtOrder orderInfo = mtOrderMapper.findByOrderSn(orderSn);
  598. if (orderInfo == null) {
  599. return null;
  600. }
  601. return getOrderDetail(orderInfo, true, true);
  602. }
  603. /**
  604. * 更新订单
  605. *
  606. * @param orderDto
  607. * @throws BusinessCheckException
  608. */
  609. @Override
  610. @Transactional(rollbackFor = Exception.class)
  611. @OperationServiceLog(description = "更新订单信息")
  612. public MtOrder updateOrder(OrderDto orderDto) throws BusinessCheckException {
  613. MtOrder mtOrder = mtOrderMapper.selectById(orderDto.getId());
  614. if (null == mtOrder || OrderStatusEnum.DELETED.getKey().equals(mtOrder.getStatus())) {
  615. throw new BusinessCheckException("该订单状态异常");
  616. }
  617. mtOrder.setId(orderDto.getId());
  618. mtOrder.setUpdateTime(new Date());
  619. if (null != orderDto.getOperator()) {
  620. mtOrder.setOperator(orderDto.getOperator());
  621. }
  622. if (null != orderDto.getStatus()) {
  623. if (orderDto.getStatus().equals(OrderStatusEnum.CANCEL.getKey()) || orderDto.getStatus().equals(OrderStatusEnum.CREATED.getKey())) {
  624. orderDto.setPayStatus(PayStatusEnum.WAIT.getKey());
  625. }
  626. if (orderDto.getStatus().equals(OrderStatusEnum.CANCEL.getKey())) {
  627. cancelOrder(orderDto.getId(), "取消订单");
  628. } else {
  629. mtOrder.setStatus(orderDto.getStatus());
  630. }
  631. if (orderDto.getStatus().equals(OrderStatusEnum.PAID.getKey())) {
  632. mtOrder.setPayStatus(PayStatusEnum.SUCCESS.getKey());
  633. mtOrder.setPayTime(new Date());
  634. }
  635. }
  636. if (null != orderDto.getPayAmount()) {
  637. mtOrder.setPayAmount(orderDto.getPayAmount());
  638. }
  639. if (null != orderDto.getAmount()) {
  640. mtOrder.setAmount(orderDto.getAmount());
  641. }
  642. if (null != orderDto.getVerifyCode() && StringUtil.isNotEmpty(orderDto.getVerifyCode())) {
  643. if (orderDto.getVerifyCode().equals(mtOrder.getVerifyCode())) {
  644. mtOrder.setStatus(OrderStatusEnum.DELIVERED.getKey());
  645. mtOrder.setVerifyCode("");
  646. } else {
  647. throw new BusinessCheckException("核销码错误,请确认!");
  648. }
  649. }
  650. if (null != orderDto.getDiscount()) {
  651. mtOrder.setDiscount(orderDto.getDiscount());
  652. }
  653. if (null != orderDto.getPayTime()) {
  654. mtOrder.setPayTime(orderDto.getPayTime());
  655. }
  656. if (null != orderDto.getPayStatus()) {
  657. mtOrder.setPayStatus(orderDto.getPayStatus());
  658. }
  659. if (null != orderDto.getExpressInfo()) {
  660. mtOrder.setExpressInfo(JSONObject.toJSONString(orderDto.getExpressInfo()));
  661. }
  662. if (null != orderDto.getOrderMode()) {
  663. mtOrder.setOrderMode(orderDto.getOrderMode());
  664. }
  665. if (null != orderDto.getRemark()) {
  666. mtOrder.setRemark(orderDto.getRemark());
  667. }
  668. mtOrderMapper.updateById(mtOrder);
  669. return mtOrder;
  670. }
  671. /**
  672. * 更新订单
  673. * @param mtOrder
  674. * @return
  675. * */
  676. @Override
  677. @Transactional(rollbackFor = Exception.class)
  678. public MtOrder updateOrder(MtOrder mtOrder) {
  679. Integer id = mtOrderMapper.updateById(mtOrder);
  680. if (id > 0) {
  681. mtOrder = mtOrderMapper.selectById(mtOrder.getId());
  682. }
  683. return mtOrder;
  684. }
  685. @Override
  686. @Transactional(rollbackFor = Exception.class)
  687. @OperationServiceLog(description = "修改订单为已支付")
  688. public Boolean setOrderPayed(Integer orderId, BigDecimal payAmount) throws BusinessCheckException {
  689. MtOrder mtOrder = mtOrderMapper.selectById(orderId);
  690. if (mtOrder == null) {
  691. return false;
  692. }
  693. if (mtOrder.getPayStatus().equals(PayStatusEnum.SUCCESS.getKey())) {
  694. return true;
  695. }
  696. OrderDto reqDto = new OrderDto();
  697. reqDto.setId(orderId);
  698. reqDto.setStatus(OrderStatusEnum.PAID.getKey());
  699. reqDto.setPayStatus(PayStatusEnum.SUCCESS.getKey());
  700. if (payAmount != null) {
  701. reqDto.setPayAmount(payAmount);
  702. }
  703. reqDto.setPayTime(new Date());
  704. reqDto.setUpdateTime(new Date());
  705. updateOrder(reqDto);
  706. // 给商家发送通知短信
  707. try {
  708. MtStore mtStore = storeService.queryStoreById(mtOrder.getStoreId());
  709. if (mtStore != null) {
  710. Map<String, String> params = new HashMap<>();
  711. params.put("orderSn", mtOrder.getOrderSn());
  712. List<String> mobileList = new ArrayList<>();
  713. mobileList.add(mtStore.getPhone());
  714. sendSmsService.sendSms("new-order", mobileList, params);
  715. }
  716. } catch (Exception e) {
  717. // empty
  718. }
  719. // 处理购物订单
  720. UserOrderDto orderInfo = getOrderByOrderSn(mtOrder.getOrderSn());
  721. if (orderInfo.getType().equals(OrderTypeEnum.GOOGS.getKey())) {
  722. try {
  723. List<OrderGoodsDto> goodsList = orderInfo.getGoods();
  724. if (goodsList != null && goodsList.size() > 0) {
  725. for (OrderGoodsDto goodsDto : goodsList) {
  726. MtGoods mtGoods = goodsService.queryGoodsById(goodsDto.getGoodsId());
  727. if (mtGoods != null) {
  728. // 购买虚拟卡券商品发放处理
  729. if (mtGoods.getType().equals(GoodsTypeEnum.COUPON.getKey()) && mtGoods.getCouponIds() != null && StringUtil.isNotEmpty(mtGoods.getCouponIds())) {
  730. String couponIds[] = mtGoods.getCouponIds().split(",");
  731. if (couponIds.length > 0) {
  732. for (int i = 0; i < couponIds.length; i++) {
  733. userCouponService.buyCouponItem(orderInfo.getId(), Integer.parseInt(couponIds[i]), orderInfo.getUserId(), orderInfo.getUserInfo().getMobile());
  734. }
  735. }
  736. }
  737. // 将已销售数量+1
  738. goodsService.updateInitSale(mtGoods.getId());
  739. }
  740. }
  741. }
  742. } catch (BusinessCheckException e) {
  743. logger.error("会员购买的卡券发送给会员失败......" + e.getMessage());
  744. }
  745. }
  746. return true;
  747. }
  748. @Override
  749. public List<MtOrder> getOrderListByParams(Map<String, Object> params) {
  750. List<MtOrder> result = mtOrderMapper.selectByMap(params);
  751. return result;
  752. }
  753. /**
  754. * 处理订单详情
  755. * @param orderInfo
  756. * @param needAddress 是否获取订单地址
  757. * @param getPayStatus 是否获取支付状态
  758. * @return UserOrderDto
  759. * */
  760. private UserOrderDto getOrderDetail(MtOrder orderInfo, boolean needAddress, boolean getPayStatus) throws BusinessCheckException {
  761. UserOrderDto dto = new UserOrderDto();
  762. dto.setId(orderInfo.getId());
  763. dto.setMerchantId(orderInfo.getMerchantId());
  764. dto.setUserId(orderInfo.getUserId());
  765. dto.setCouponId(orderInfo.getCouponId());
  766. dto.setOrderSn(orderInfo.getOrderSn());
  767. dto.setRemark(orderInfo.getRemark());
  768. dto.setType(orderInfo.getType());
  769. dto.setPayType(orderInfo.getPayType());
  770. dto.setOrderMode(orderInfo.getOrderMode());
  771. dto.setCreateTime(DateUtil.formatDate(orderInfo.getCreateTime(), "yyyy.MM.dd HH:mm"));
  772. dto.setUpdateTime(DateUtil.formatDate(orderInfo.getUpdateTime(), "yyyy.MM.dd HH:mm"));
  773. dto.setAmount(orderInfo.getAmount());
  774. dto.setIsVisitor(orderInfo.getIsVisitor());
  775. dto.setStaffId(orderInfo.getStaffId());
  776. dto.setVerifyCode("");
  777. dto.setDeliveryFee(orderInfo.getDeliveryFee());
  778. // 核销码为空,说明已经核销
  779. if (orderInfo.getVerifyCode() == null || StringUtil.isEmpty(orderInfo.getVerifyCode())) {
  780. dto.setIsVerify(true);
  781. } else {
  782. dto.setIsVerify(false);
  783. }
  784. if (orderInfo.getPayAmount() != null) {
  785. dto.setPayAmount(orderInfo.getPayAmount());
  786. } else {
  787. dto.setPayAmount(new BigDecimal("0"));
  788. }
  789. if (orderInfo.getDiscount() != null) {
  790. dto.setDiscount(orderInfo.getDiscount());
  791. } else {
  792. dto.setDiscount(new BigDecimal("0"));
  793. }
  794. if (orderInfo.getPointAmount() != null) {
  795. dto.setPointAmount(orderInfo.getPointAmount());
  796. } else {
  797. dto.setPointAmount(new BigDecimal("0"));
  798. }
  799. dto.setStatus(orderInfo.getStatus());
  800. dto.setParam(orderInfo.getParam());
  801. dto.setPayStatus(orderInfo.getPayStatus());
  802. if (orderInfo.getUsePoint() != null) {
  803. dto.setUsePoint(orderInfo.getUsePoint());
  804. } else {
  805. dto.setUsePoint(0);
  806. }
  807. if (orderInfo.getPayTime() != null) {
  808. dto.setPayTime(DateUtil.formatDate(orderInfo.getPayTime(), "yyyy.MM.dd HH:mm"));
  809. }
  810. if (dto.getType().equals(OrderTypeEnum.PRESTORE.getKey())) {
  811. dto.setTypeName(OrderTypeEnum.PRESTORE.getValue());
  812. } else if(dto.getType().equals(OrderTypeEnum.PAYMENT.getKey())) {
  813. dto.setTypeName(OrderTypeEnum.PAYMENT.getValue());
  814. } else if(dto.getType().equals(OrderTypeEnum.GOOGS.getKey())) {
  815. dto.setTypeName(OrderTypeEnum.GOOGS.getValue());
  816. } else if(dto.getType().equals(OrderTypeEnum.MEMBER.getKey())) {
  817. dto.setTypeName(OrderTypeEnum.MEMBER.getValue());
  818. } else if(dto.getType().equals(OrderTypeEnum.RECHARGE.getKey())) {
  819. dto.setTypeName(OrderTypeEnum.RECHARGE.getValue());
  820. }
  821. if (dto.getStatus().equals(OrderStatusEnum.CREATED.getKey())) {
  822. dto.setStatusText(OrderStatusEnum.CREATED.getValue());
  823. } else if(dto.getStatus().equals(OrderStatusEnum.CANCEL.getKey())) {
  824. dto.setStatusText(OrderStatusEnum.CANCEL.getValue());
  825. } else if(dto.getStatus().equals(OrderStatusEnum.PAID.getKey())) {
  826. dto.setStatusText(OrderStatusEnum.PAID.getValue());
  827. } else if(dto.getStatus().equals(OrderStatusEnum.DELIVERY.getKey())) {
  828. dto.setStatusText(OrderStatusEnum.DELIVERY.getValue());
  829. } else if(dto.getStatus().equals(OrderStatusEnum.DELIVERED.getKey())) {
  830. dto.setStatusText(OrderStatusEnum.DELIVERED.getValue());
  831. } else if(dto.getStatus().equals(OrderStatusEnum.RECEIVED.getKey())) {
  832. dto.setStatusText(OrderStatusEnum.RECEIVED.getValue());
  833. } else if(dto.getStatus().equals(OrderStatusEnum.DELETED.getKey())) {
  834. dto.setStatusText(OrderStatusEnum.DELETED.getValue());
  835. } else if(dto.getStatus().equals(OrderStatusEnum.REFUND.getKey())) {
  836. dto.setStatusText(OrderStatusEnum.REFUND.getValue());
  837. }
  838. // 订单所属店铺
  839. MtStore storeInfo = storeService.queryStoreById(orderInfo.getStoreId());
  840. dto.setStoreInfo(storeInfo);
  841. // 下单用户信息直接取会员个人信息
  842. OrderUserDto userInfo = new OrderUserDto();
  843. MtUser user = memberService.queryMemberById(orderInfo.getUserId());
  844. if (user != null) {
  845. userInfo.setId(user.getId());
  846. userInfo.setName(user.getName());
  847. userInfo.setMobile(user.getMobile());
  848. userInfo.setCardNo(user.getCarNo());
  849. userInfo.setAddress(user.getAddress());
  850. dto.setUserInfo(userInfo);
  851. }
  852. List<OrderGoodsDto> goodsList = new ArrayList<>();
  853. String baseImage = settingService.getUploadBasePath();
  854. // 储值卡的订单
  855. if (orderInfo.getType().equals(OrderTypeEnum.PRESTORE.getKey())) {
  856. MtCoupon coupon = couponService.queryCouponById(orderInfo.getCouponId());
  857. String[] paramArr = orderInfo.getParam().split(",");
  858. for(int i = 0; i < paramArr.length; i++) {
  859. String[] item = paramArr[i].split("_");
  860. if (Integer.parseInt(item[2]) > 0) {
  861. OrderGoodsDto goodsDto = new OrderGoodsDto();
  862. goodsDto.setId(coupon.getId());
  863. goodsDto.setType(OrderTypeEnum.PRESTORE.getKey());
  864. goodsDto.setName("预存¥" + item[0] + "到账¥" + item[1]);
  865. goodsDto.setNum(Integer.parseInt(item[2]));
  866. goodsDto.setPrice(item[0]);
  867. goodsDto.setDiscount("0");
  868. if (coupon.getImage().indexOf(baseImage) == -1) {
  869. goodsDto.setImage(baseImage + coupon.getImage());
  870. }
  871. goodsList.add(goodsDto);
  872. }
  873. }
  874. }
  875. // 商品订单
  876. if (orderInfo.getType().equals(OrderTypeEnum.GOOGS.getKey())) {
  877. Map<String, Object> params = new HashMap<>();
  878. params.put("ORDER_ID", orderInfo.getId());
  879. List<MtOrderGoods> orderGoodsList = mtOrderGoodsMapper.selectByMap(params);
  880. for (MtOrderGoods orderGoods : orderGoodsList) {
  881. MtGoods goodsInfo = mtGoodsMapper.selectById(orderGoods.getGoodsId());
  882. if (goodsInfo != null) {
  883. OrderGoodsDto orderGoodsDto = new OrderGoodsDto();
  884. orderGoodsDto.setId(orderGoods.getId());
  885. orderGoodsDto.setName(goodsInfo.getName());
  886. if (goodsInfo.getLogo().indexOf(baseImage) == -1) {
  887. orderGoodsDto.setImage(baseImage + goodsInfo.getLogo());
  888. }
  889. orderGoodsDto.setType(OrderTypeEnum.GOOGS.getKey());
  890. orderGoodsDto.setNum(orderGoods.getNum());
  891. orderGoodsDto.setSkuId(orderGoods.getSkuId());
  892. orderGoodsDto.setPrice(orderGoods.getPrice().toString());
  893. orderGoodsDto.setDiscount(orderGoods.getDiscount().toString());
  894. orderGoodsDto.setGoodsId(orderGoods.getGoodsId());
  895. if (orderGoods.getSkuId() > 0) {
  896. List<GoodsSpecValueDto> specList = goodsService.getSpecListBySkuId(orderGoods.getSkuId());
  897. orderGoodsDto.setSpecList(specList);
  898. }
  899. goodsList.add(orderGoodsDto);
  900. }
  901. }
  902. }
  903. // 配送地址
  904. if (orderInfo.getOrderMode().equals(OrderModeEnum.EXPRESS.getKey()) && needAddress) {
  905. List<MtOrderAddress> orderAddressList = mtOrderAddressMapper.getOrderAddress(orderInfo.getId());
  906. MtOrderAddress orderAddress = null;
  907. if (orderAddressList.size() > 0) {
  908. orderAddress = orderAddressList.get(0);
  909. }
  910. if (orderAddress != null) {
  911. AddressDto address = new AddressDto();
  912. address.setId(orderAddress.getId());
  913. address.setName(orderAddress.getName());
  914. address.setMobile(orderAddress.getMobile());
  915. address.setDetail(orderAddress.getDetail());
  916. address.setProvinceId(orderAddress.getProvinceId());
  917. address.setCityId(orderAddress.getCityId());
  918. address.setRegionId(orderAddress.getRegionId());
  919. if (orderAddress.getProvinceId() > 0) {
  920. MtRegion mtProvince = mtRegionMapper.selectById(orderAddress.getProvinceId());
  921. if (mtProvince != null) {
  922. address.setProvinceName(mtProvince.getName());
  923. }
  924. }
  925. if (orderAddress.getCityId() > 0) {
  926. MtRegion mtCity = mtRegionMapper.selectById(orderAddress.getCityId());
  927. if (mtCity != null) {
  928. address.setCityName(mtCity.getName());
  929. }
  930. }
  931. if (orderAddress.getRegionId() > 0) {
  932. MtRegion mtRegion = mtRegionMapper.selectById(orderAddress.getRegionId());
  933. if (mtRegion != null) {
  934. address.setRegionName(mtRegion.getName());
  935. }
  936. }
  937. dto.setAddress(address);
  938. }
  939. }
  940. // 物流信息
  941. if (StringUtil.isNotEmpty(orderInfo.getExpressInfo())) {
  942. JSONObject express = JSONObject.parseObject(orderInfo.getExpressInfo());
  943. ExpressDto expressInfo = new ExpressDto();
  944. expressInfo.setExpressNo(express.get("expressNo").toString());
  945. expressInfo.setExpressCompany(express.get("expressCompany").toString());
  946. expressInfo.setExpressTime(express.get("expressTime").toString());
  947. dto.setExpressInfo(expressInfo);
  948. }
  949. // 使用的卡券
  950. if (dto.getCouponId() != null && dto.getCouponId() > 0) {
  951. MtUserCoupon mtUserCoupon = userCouponService.getUserCouponDetail(dto.getCouponId());
  952. if (mtUserCoupon != null) {
  953. MtCoupon mtCoupon = couponService.queryCouponById(mtUserCoupon.getCouponId());
  954. if (mtCoupon != null) {
  955. UserCouponDto couponInfo = new UserCouponDto();
  956. couponInfo.setId(mtUserCoupon.getId());
  957. couponInfo.setCouponId(mtCoupon.getId());
  958. couponInfo.setName(mtCoupon.getName());
  959. couponInfo.setAmount(mtUserCoupon.getAmount());
  960. couponInfo.setBalance(mtUserCoupon.getBalance());
  961. couponInfo.setStatus(mtUserCoupon.getStatus());
  962. couponInfo.setType(mtCoupon.getType());
  963. dto.setCouponInfo(couponInfo);
  964. }
  965. }
  966. }
  967. // 查询支付状态
  968. if (getPayStatus && !orderInfo.getPayStatus().equals(PayStatusEnum.SUCCESS.getKey())) {
  969. // 微信支付
  970. if (orderInfo.getPayType().equals(PayTypeEnum.MICROPAY.getKey()) || orderInfo.getPayType().equals(PayTypeEnum.JSAPI.getKey())) {
  971. try {
  972. Map<String, String> payResult = weixinService.queryPaidOrder(orderInfo.getStoreId(), "", orderInfo.getOrderSn());
  973. if (payResult != null && payResult.get("trade_state").equals("SUCCESS")) {
  974. BigDecimal payAmount = new BigDecimal(payResult.get("total_fee")).divide(new BigDecimal("100"));
  975. setOrderPayed(orderInfo.getId(), payAmount);
  976. dto.setPayStatus(PayStatusEnum.SUCCESS.getKey());
  977. }
  978. } catch (Exception e) {
  979. // empty
  980. }
  981. }
  982. // 支付宝支付
  983. if (orderInfo.getPayType().equals(PayTypeEnum.ALISCAN.getKey())) {
  984. try {
  985. Map<String, String> payResult = alipayService.queryPaidOrder(orderInfo.getStoreId(), "", orderInfo.getOrderSn());
  986. if (payResult != null) {
  987. BigDecimal payAmount = new BigDecimal(payResult.get("payAmount"));
  988. setOrderPayed(orderInfo.getId(), payAmount);
  989. dto.setPayStatus(PayStatusEnum.SUCCESS.getKey());
  990. }
  991. } catch (Exception e) {
  992. // empty
  993. }
  994. }
  995. }
  996. dto.setGoods(goodsList);
  997. return dto;
  998. }
  999. /**
  1000. * 获取订单数量
  1001. * */
  1002. @Override
  1003. public BigDecimal getOrderCount(Integer storeId) {
  1004. if (storeId > 0) {
  1005. return mtOrderMapper.getStoreOrderCount(storeId);
  1006. } else {
  1007. return mtOrderMapper.getOrderCount();
  1008. }
  1009. }
  1010. /**
  1011. * 获取订单数量
  1012. * */
  1013. @Override
  1014. public BigDecimal getOrderCount(Integer storeId, Date beginTime, Date endTime) {
  1015. if (storeId > 0) {
  1016. return mtOrderMapper.getStoreOrderCountByTime(storeId, beginTime, endTime);
  1017. } else {
  1018. return mtOrderMapper.getOrderCountByTime(beginTime, endTime);
  1019. }
  1020. }
  1021. /**
  1022. * 获取支付金额
  1023. * */
  1024. @Override
  1025. public BigDecimal getPayMoney(Integer storeId, Date beginTime, Date endTime) {
  1026. if (storeId > 0) {
  1027. return mtOrderMapper.getStorePayMoneyByTime(storeId, beginTime, endTime);
  1028. } else {
  1029. return mtOrderMapper.getPayMoneyByTime(beginTime, endTime);
  1030. }
  1031. }
  1032. /**
  1033. * 获取支付人数
  1034. * */
  1035. @Override
  1036. public Integer getPayUserCount(Integer storeId) {
  1037. if (storeId > 0) {
  1038. return mtOrderMapper.getStorePayUserCount(storeId);
  1039. } else {
  1040. return mtOrderMapper.getPayUserCount();
  1041. }
  1042. }
  1043. /**
  1044. * 获取支付总金额
  1045. * */
  1046. @Override
  1047. public BigDecimal getPayMoney(Integer storeId) {
  1048. if (storeId > 0) {
  1049. return mtOrderMapper.getStorePayMoney(storeId);
  1050. } else {
  1051. return mtOrderMapper.getPayMoney();
  1052. }
  1053. }
  1054. /**
  1055. * 计算商品总价
  1056. *
  1057. * @param merchantId
  1058. * @param userId
  1059. * @param cartList
  1060. * @param couponId
  1061. * @param isUsePoint
  1062. * @param orderMode
  1063. * @return
  1064. * */
  1065. @Override
  1066. public Map<String, Object> calculateCartGoods(Integer merchantId, Integer userId, List<MtCart> cartList, Integer couponId, boolean isUsePoint, String platform, String orderMode) throws BusinessCheckException {
  1067. MtUser userInfo = memberService.queryMemberById(userId);
  1068. // 设置是否不能用积分抵扣
  1069. MtSetting pointSetting = settingService.querySettingByName(merchantId, PointSettingEnum.CAN_USE_AS_MONEY.getKey());
  1070. if (pointSetting != null && !pointSetting.getValue().equals("true")) {
  1071. isUsePoint = false;
  1072. }
  1073. List<ResCartDto> cartDtoList = new ArrayList<>();
  1074. String basePath = settingService.getUploadBasePath();
  1075. Integer totalNum = 0;
  1076. BigDecimal totalPrice = new BigDecimal("0");
  1077. BigDecimal totalCanUsePointAmount = new BigDecimal("0");
  1078. if (cartList.size() > 0) {
  1079. for (MtCart cart : cartList) {
  1080. // 购物车商品信息
  1081. MtGoods mtGoodsInfo = goodsService.queryGoodsById(cart.getGoodsId());
  1082. if (mtGoodsInfo == null || !mtGoodsInfo.getStatus().equals(StatusEnum.ENABLED.getKey())) {
  1083. continue;
  1084. }
  1085. totalNum = totalNum + cart.getNum();
  1086. ResCartDto cartDto = new ResCartDto();
  1087. cartDto.setId(cart.getId());
  1088. cartDto.setGoodsId(cart.getGoodsId());
  1089. cartDto.setNum(cart.getNum());
  1090. cartDto.setSkuId(cart.getSkuId());
  1091. cartDto.setUserId(cart.getUserId());
  1092. // 购物车是否有效
  1093. Boolean isEffect = true;
  1094. if (cart.getSkuId() > 0) {
  1095. List<GoodsSpecValueDto> specList = goodsService.getSpecListBySkuId(cart.getSkuId());
  1096. cartDto.setSpecList(specList);
  1097. }
  1098. if (StringUtil.isNotEmpty(mtGoodsInfo.getLogo()) && (mtGoodsInfo.getLogo().indexOf(basePath) == -1)) {
  1099. mtGoodsInfo.setLogo(basePath + mtGoodsInfo.getLogo());
  1100. }
  1101. // 读取sku的数据
  1102. if (cart.getSkuId() > 0) {
  1103. MtGoods mtGoods = new MtGoods();
  1104. BeanUtils.copyProperties(mtGoodsInfo, mtGoods);
  1105. MtGoodsSku mtGoodsSku = mtGoodsSkuMapper.selectById(cart.getSkuId());
  1106. if (mtGoodsSku != null) {
  1107. if (StringUtil.isNotEmpty(mtGoodsSku.getLogo()) && (mtGoodsSku.getLogo().indexOf(basePath) == -1)) {
  1108. mtGoods.setLogo(basePath + mtGoodsSku.getLogo());
  1109. }
  1110. if (mtGoodsSku.getWeight().compareTo(new BigDecimal("0")) > 0) {
  1111. mtGoods.setWeight(mtGoodsSku.getWeight());
  1112. }
  1113. mtGoods.setPrice(mtGoodsSku.getPrice());
  1114. mtGoods.setLinePrice(mtGoodsSku.getLinePrice());
  1115. mtGoods.setStock(mtGoodsSku.getStock());
  1116. }
  1117. cartDto.setGoodsInfo(mtGoods);
  1118. } else {
  1119. cartDto.setGoodsInfo(mtGoodsInfo);
  1120. }
  1121. if (mtGoodsInfo.getStock() != null && mtGoodsInfo.getStock() < cartDto.getNum()) {
  1122. isEffect = false;
  1123. }
  1124. cartDto.setIsEffect(isEffect);
  1125. // 计算总价
  1126. totalPrice = totalPrice.add(cartDto.getGoodsInfo().getPrice().multiply(new BigDecimal(cart.getNum())));
  1127. // 累加可用积分去抵扣的金额
  1128. if (mtGoodsInfo.getCanUsePoint() != null && mtGoodsInfo.getCanUsePoint().equals(YesOrNoEnum.YES.getKey())) {
  1129. totalCanUsePointAmount = totalCanUsePointAmount.add(cartDto.getGoodsInfo().getPrice().multiply(new BigDecimal(cart.getNum())));
  1130. }
  1131. cartDtoList.add(cartDto);
  1132. }
  1133. }
  1134. Map<String, Object> result = new HashMap<>();
  1135. // 可用卡券列表
  1136. List<CouponDto> couponList = new ArrayList<>();
  1137. List<String> statusList = Arrays.asList(UserCouponStatusEnum.UNUSED.getKey());
  1138. List<MtUserCoupon> userCouponList = userCouponService.getUserCouponList(userId, statusList);
  1139. if (userCouponList.size() > 0) {
  1140. for (MtUserCoupon userCoupon : userCouponList) {
  1141. MtCoupon couponInfo = couponService.queryCouponById(userCoupon.getCouponId());
  1142. // 优惠券和储值卡才能使用
  1143. if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey()) || couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  1144. CouponDto couponDto = new CouponDto();
  1145. couponDto.setId(couponInfo.getId());
  1146. couponDto.setUserCouponId(userCoupon.getId());
  1147. couponDto.setName(couponInfo.getName());
  1148. couponDto.setAmount(userCoupon.getAmount());
  1149. couponDto.setStatus(UserCouponStatusEnum.DISABLE.getKey());
  1150. // 购物不能用专用的卡券
  1151. if (couponInfo.getUseFor() != null && StringUtil.isNotEmpty(couponInfo.getUseFor())) {
  1152. if (couponInfo.getUseFor().equals(CouponUseForEnum.MEMBER_GRADE.getKey())) {
  1153. continue;
  1154. }
  1155. if (couponInfo.getUseFor().equals(CouponUseForEnum.OFF_LINE_PAYMENT.getKey())) {
  1156. // 只有PC收银端能用
  1157. if (!platform.equals(PlatformTypeEnum.PC.getCode())) {
  1158. continue;
  1159. }
  1160. }
  1161. }
  1162. boolean isEffective = couponService.isCouponEffective(couponInfo);
  1163. // 优惠券
  1164. if (couponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) {
  1165. couponDto.setType(CouponTypeEnum.COUPON.getValue());
  1166. if (StringUtil.isEmpty(couponInfo.getOutRule()) || couponInfo.getOutRule().equals("0")) {
  1167. couponDto.setDescription("无使用门槛");
  1168. if (isEffective) {
  1169. couponDto.setStatus(UserCouponStatusEnum.UNUSED.getKey());
  1170. }
  1171. } else {
  1172. couponDto.setDescription("满" + couponInfo.getOutRule() + "元可用");
  1173. BigDecimal conditionAmount = new BigDecimal(couponInfo.getOutRule());
  1174. if (totalPrice.compareTo(conditionAmount) > 0 && isEffective) {
  1175. couponDto.setStatus(UserCouponStatusEnum.UNUSED.getKey());
  1176. }
  1177. }
  1178. } else if (couponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  1179. // 储值卡
  1180. couponDto.setType(CouponTypeEnum.PRESTORE.getValue());
  1181. couponDto.setDescription("无使用门槛");
  1182. couponDto.setAmount(userCoupon.getBalance());
  1183. // 余额须大于0
  1184. if (isEffective && (userCoupon.getBalance().compareTo(new BigDecimal("0")) > 0)) {
  1185. couponDto.setStatus(UserCouponStatusEnum.UNUSED.getKey());
  1186. }
  1187. }
  1188. couponDto.setEffectiveDate(DateUtil.formatDate(couponInfo.getBeginTime(), "yyyy.MM.dd HH:mm") + "~" + DateUtil.formatDate(couponInfo.getEndTime(), "yyyy.MM.dd HH:mm"));
  1189. couponList.add(couponDto);
  1190. }
  1191. }
  1192. }
  1193. // 使用的卡券
  1194. MtCoupon useCouponInfo = null;
  1195. BigDecimal couponAmount = new BigDecimal("0");
  1196. if (couponId > 0) {
  1197. MtUserCoupon userCouponInfo = userCouponService.getUserCouponDetail(couponId);
  1198. if (userCouponInfo != null) {
  1199. useCouponInfo = couponService.queryCouponById(userCouponInfo.getCouponId());
  1200. boolean isEffective = couponService.isCouponEffective(useCouponInfo);
  1201. if (isEffective) {
  1202. if (useCouponInfo.getType().equals(CouponTypeEnum.COUPON.getKey())) {
  1203. couponAmount = useCouponInfo.getAmount();
  1204. } else if(useCouponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  1205. BigDecimal couponTotalAmount = userCouponInfo.getBalance();
  1206. if (couponTotalAmount.compareTo(totalPrice) > 0) {
  1207. couponAmount = totalPrice;
  1208. useCouponInfo.setAmount(totalPrice);
  1209. } else {
  1210. couponAmount = couponTotalAmount;
  1211. useCouponInfo.setAmount(couponTotalAmount);
  1212. }
  1213. }
  1214. }
  1215. }
  1216. }
  1217. // 支付金额 = 商品总额 - 卡券抵扣金额
  1218. BigDecimal payPrice = totalPrice.subtract(couponAmount);
  1219. // 可用积分、可用积分金额
  1220. Integer myPoint = userInfo.getPoint() == null ? 0 : userInfo.getPoint();
  1221. Integer usePoint = 0;
  1222. BigDecimal usePointAmount = new BigDecimal("0");
  1223. MtSetting setting = settingService.querySettingByName(merchantId, PointSettingEnum.EXCHANGE_NEED_POINT.getKey());
  1224. if (myPoint > 0 && setting != null && isUsePoint) {
  1225. if (StringUtil.isNotEmpty(setting.getValue()) && !setting.getValue().equals("0")) {
  1226. BigDecimal usePoints = new BigDecimal(myPoint);
  1227. usePointAmount = usePoints.divide(new BigDecimal(setting.getValue()), BigDecimal.ROUND_CEILING, 3);
  1228. usePoint = myPoint;
  1229. if (usePointAmount.compareTo(totalCanUsePointAmount) >= 0) {
  1230. usePointAmount = totalCanUsePointAmount;
  1231. usePoint = totalCanUsePointAmount.multiply(new BigDecimal(setting.getValue())).intValue();
  1232. }
  1233. }
  1234. }
  1235. // 积分金额不能大于支付金额
  1236. if (usePointAmount.compareTo(payPrice) > 0 && isUsePoint) {
  1237. usePointAmount = payPrice;
  1238. BigDecimal usePoints = payPrice.multiply(new BigDecimal(setting.getValue()));
  1239. usePoint = usePoints.intValue();
  1240. }
  1241. // 支付金额 = 商品总额 - 积分抵扣金额
  1242. payPrice = payPrice.subtract(usePointAmount);
  1243. if (payPrice.compareTo(new BigDecimal("0")) < 0) {
  1244. payPrice = new BigDecimal("0");
  1245. }
  1246. // 配送费用
  1247. BigDecimal deliveryFee = new BigDecimal("0");
  1248. MtSetting mtSetting = settingService.querySettingByName(merchantId, OrderSettingEnum.DELIVERY_FEE.getKey());
  1249. if (mtSetting != null && StringUtil.isNotEmpty(mtSetting.getValue()) && orderMode.equals(OrderModeEnum.EXPRESS.getKey())) {
  1250. deliveryFee = new BigDecimal(mtSetting.getValue());
  1251. }
  1252. result.put("list", cartDtoList);
  1253. result.put("totalNum", totalNum);
  1254. result.put("totalPrice", totalPrice);
  1255. result.put("payPrice", payPrice);
  1256. result.put("couponList", couponList);
  1257. result.put("useCouponInfo", useCouponInfo);
  1258. result.put("usePoint", usePoint);
  1259. result.put("myPoint", myPoint);
  1260. result.put("couponAmount", couponAmount);
  1261. result.put("usePointAmount", usePointAmount);
  1262. result.put("deliveryFee", deliveryFee);
  1263. return result;
  1264. }
  1265. /**
  1266. * 获取会员支付金额
  1267. *
  1268. * @param userId
  1269. * @return
  1270. * */
  1271. @Override
  1272. public BigDecimal getUserPayMoney(Integer userId) {
  1273. return mtOrderMapper.getUserPayMoney(userId);
  1274. }
  1275. /**
  1276. * 获取会员订单数
  1277. *
  1278. * @param userId
  1279. * @return
  1280. * */
  1281. @Override
  1282. public Integer getUserPayOrderCount(Integer userId) {
  1283. return mtOrderMapper.getUserPayOrderCount(userId);
  1284. }
  1285. }