ApiOrderNewServiceImpl.java 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. package com.ydd.app.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.github.binarywang.wxpay.exception.WxPayException;
  6. import com.ijpay.core.enums.TradeType;
  7. import com.ydd.app.dto.AddressReq;
  8. import com.ydd.app.dto.OrderReq;
  9. import com.ydd.app.dto.ValuationRes;
  10. import com.ydd.app.listener.DeliveryOrderEvent;
  11. import com.ydd.app.service.ApiCouponService;
  12. import com.ydd.app.service.ApiOrderNewService;
  13. import com.ydd.app.service.ApiOrderService;
  14. import com.ydd.app.service.ApiProductService;
  15. import com.ydd.common.constant.RedisKeyConstant;
  16. import com.ydd.common.core.redis.RedisCache;
  17. import com.ydd.common.enums.WaimaiTypeEnums;
  18. import com.ydd.common.utils.DateUtils;
  19. import com.ydd.common.utils.StringUtils;
  20. import com.ydd.ecloud.core.utils.BigDecimalUtils;
  21. import com.ydd.ecloud.core.utils.JsonMapper;
  22. import com.ydd.module.domain.*;
  23. import com.ydd.module.dto.CouponDto;
  24. import com.ydd.module.dto.OrderFreightDto;
  25. import com.ydd.module.enums.*;
  26. import com.ydd.module.expection.CustomAppException;
  27. import com.ydd.module.pay.alipay.AliPayService;
  28. import com.ydd.module.pay.dto.OrderPaySignResponse;
  29. import com.ydd.module.pay.wechat.service.WechatPayService;
  30. import com.ydd.module.push.MessagePushService;
  31. import com.ydd.module.service.*;
  32. import com.ydd.system.service.ISysConfigService;
  33. import lombok.RequiredArgsConstructor;
  34. import lombok.extern.slf4j.Slf4j;
  35. import org.apache.commons.collections4.CollectionUtils;
  36. import org.springframework.beans.factory.annotation.Autowired;
  37. import org.springframework.context.ApplicationContext;
  38. import org.springframework.stereotype.Service;
  39. import org.springframework.transaction.annotation.Transactional;
  40. import org.springframework.transaction.support.TransactionSynchronizationAdapter;
  41. import org.springframework.transaction.support.TransactionSynchronizationManager;
  42. import java.math.BigDecimal;
  43. import java.util.*;
  44. import java.util.concurrent.TimeUnit;
  45. /**
  46. * Project:lb-server
  47. * Class:ApiOrderServiceImpl
  48. * Description:TODO
  49. * Time:2021/2/23 14:41
  50. *
  51. * @author zoe
  52. */
  53. @Slf4j
  54. @Service
  55. @RequiredArgsConstructor(onConstructor_ = @Autowired)
  56. public class ApiOrderNewServiceImpl implements ApiOrderNewService {
  57. private final ApiProductService apiProductService;
  58. private final ApiCouponService apiCouponService;
  59. private final IOrderService iOrderService;
  60. private final IOrderLogService iOrderLogService;
  61. private final IMemberService iMemberService;
  62. private final IMemberBalanceLogService iMemberBalanceLogService;
  63. private final IWaimaiOrderService iWaimaiOrderService;
  64. private final ApplicationContext applicationContext;
  65. private final ISysConfigService iSysConfigService;
  66. private final IDspConfigService iDspConfigService;
  67. private final ApiCacheUserAddress apiCacheUserAddress;
  68. private final IAgentService iAgentService;
  69. private final AliPayService aliPayService;
  70. private final WechatPayService wechatPayService;
  71. private final IPaymentService paymentService;
  72. private final IWaimaiOrderDetailService iWaimaiOrderDetailService;
  73. private final IMerchantService iMerchantService;
  74. private final MessagePushService messagePushService;
  75. private final ApiOrderService apiOrderService;
  76. private final IMerchantDeliveryFeeService iMerchantDeliveryFeeService;
  77. private final RedisCache redisCache;
  78. private final IOrderFreightService iOrderFreightService;
  79. @Override
  80. @Transactional(rollbackFor = Exception.class)
  81. public Object createOrder(Long loginId, OrderReq req, Integer type) {
  82. log.info("<===========>提交下单参数" + JsonMapper.nonEmptyMapper().toJson(req));
  83. // try {
  84. if (CollectionUtils.isEmpty(req.getValuationRes())) {
  85. throw new CustomAppException("暂无运力, 下单失败!");
  86. }
  87. String orderNo = req.getValuationRes().get(0).getOrderNo();
  88. List<Order> orderLists = iOrderService.list(new QueryWrapper<Order>().eq("order_sn", orderNo));
  89. if (CollectionUtils.isNotEmpty(orderLists)) {
  90. req.setOrderId(orderLists.get(0).getId());
  91. // 校验订单状态
  92. Integer status = orderLists.get(0).getStatus();
  93. if (!PayStatusEnum.NO_PAYED.status.equals(status)) {
  94. log.warn("orderSn:{}, status: {}, 该状态不支持下单操作!", orderNo, status);
  95. throw new CustomAppException("该状态不支持下单操作!");
  96. }
  97. }
  98. Member member = iMemberService.getById(loginId);
  99. if (member.getMemberType().equals(MemberTypeEnum.SHOP.type)) {
  100. member = iMemberService.getOne(new QueryWrapper<Member>().eq("member_type", MemberTypeEnum.MERCHANT.type).eq("merchant_id", member.getMerchantId()));
  101. }
  102. Product product = apiProductService.findById(req.getProductId());
  103. if (product == null) {
  104. throw new CustomAppException(ExceptionEnum.PRODUCT_NOT_EXISTS);
  105. }
  106. CouponDto couponDto = null;
  107. if (req.getCouponId() != null) {
  108. couponDto = apiCouponService.findDetail(req.getCouponId());
  109. if (couponDto == null && type.intValue() != 3) {
  110. throw new CustomAppException("优惠券不存在!");
  111. }
  112. }
  113. //地址处理重复楼层
  114. address(req);
  115. // 保存发件信息, 如果发件Id不存在, 则为手工录入信息, 保存到缓存
  116. // apiCacheUserAddress.cacheAddress(loginId, req);
  117. try {
  118. apiCacheUserAddress.cacheSendReceiveAddress(loginId, req.getSendAddress(), req.getReceiptAddress());
  119. } catch (Exception e) {
  120. log.error("缓存收发件地址异常, {}", e.getMessage());
  121. }
  122. Order order = createOrder(product, couponDto, req, loginId);
  123. if (order.getId() != null && order.getDeliveryStatus() != null && order.getDeliveryStatus() >= DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status && order.getDeliveryStatus() != DeliveryStatusEnum.FINISH.status) {
  124. return null;
  125. }
  126. if (order.getId() != null && order.getDeliveryStatus() != null && (DeliveryStatusEnum.CANCEL.status.equals(order.getDeliveryStatus())
  127. || DeliveryStatusEnum.FINISH.status.equals(order.getDeliveryStatus())
  128. || DeliveryStatusEnum.ABNORMAL.status.equals(order.getDeliveryStatus()))) {
  129. resetOrder(order, product);
  130. }
  131. // 获取达达收付配送商计价信息
  132. OrderFreightDto orderFreightDto = redisCache.getCacheObject(orderNo);
  133. // 达达配送订单订单标识
  134. boolean isDadaOrder = false;
  135. // 达达收付订单订单标识
  136. boolean isDadaRapDelivery = false;
  137. if (orderFreightDto != null && orderFreightDto.getValuationType() != null) {
  138. isDadaOrder = true;
  139. if (orderFreightDto.getValuationType() == 2) {
  140. order.setDadaDspType(OrderDadaDspTypeEnum.DELIVERY.type);
  141. } else {
  142. isDadaRapDelivery = true;
  143. order.setDadaDspType(OrderDadaDspTypeEnum.DELIVERY_RAP.type);
  144. }
  145. order.setDadaDspId(orderFreightDto.getDadaDspId());
  146. }
  147. order.setMemberId(loginId);
  148. order.setCreateTime(new Date());
  149. order.setTakeType(req.getTakeType());
  150. if (TakeTypeEnum.APPOINTMENT.type.equals(req.getTakeType())) {
  151. if (DateUtils.addMinutes(new Date(), 130).compareTo(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, req.getTakeTime())) > 0) {
  152. //order.setTakeTime(null);
  153. order.setTakeType(TakeTypeEnum.APPOINTMENT_2.type);
  154. } else {
  155. order.setTakeTime(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, req.getTakeTime()));
  156. }
  157. }
  158. BigDecimal tip = BigDecimal.ZERO;
  159. if (req.getTipAmount() != null && req.getTipAmount().compareTo(BigDecimal.ZERO) > 0) {
  160. order.setUseTip(StatusEnum.SHOW.status);
  161. tip = req.getTipAmount();
  162. order.setTipAmount(tip);
  163. }
  164. //发单算钱
  165. List<ValuationRes> resList = req.getValuationRes();
  166. List<ValuationRes> maxReslIst = new ArrayList<>();
  167. if (couponDto != null) {
  168. for (ValuationRes res : resList) {
  169. if (couponDto.getType().equals(CouponTypeEnum.MAN_JIAN.type)) {
  170. if (res.getDeliveryAmount().compareTo(couponDto.getLimitFee()) >= 0 && res.getIsMine() == 0) {
  171. res.setDeliveryAmount(res.getDeliveryAmount().subtract(couponDto.getMoney()));
  172. res.setCouponAmount(couponDto.getMoney());
  173. }
  174. } else if (couponDto.getType().equals(CouponTypeEnum.LI_JIAN.type) && res.getIsMine() == 0) {
  175. res.setDeliveryAmount(res.getDeliveryAmount().subtract(couponDto.getMoney()));
  176. res.setCouponAmount(couponDto.getMoney());
  177. } else if (couponDto.getType().equals(CouponTypeEnum.ZHE_KOU.type) && res.getIsMine() == 0) {
  178. BigDecimal discount = res.getDeliveryAmount().multiply(couponDto.getDiscount()).divide(BigDecimal.TEN).setScale(2, BigDecimal.ROUND_HALF_UP);
  179. if ((res.getDeliveryAmount().subtract(discount)).compareTo(couponDto.getMaxDiscount()) > 0) {
  180. discount = res.getDeliveryAmount().subtract(couponDto.getMaxDiscount());
  181. } else {
  182. discount = res.getDeliveryAmount().subtract(res.getDeliveryAmount().subtract(discount));
  183. }
  184. res.setCouponAmount(res.getDeliveryAmount().subtract(discount));
  185. res.setDeliveryAmount(discount);
  186. }
  187. }
  188. }
  189. // 默认没有选择绑定三方运力下单
  190. List<Long> deliveryIds = new ArrayList<>();
  191. for (ValuationRes r : resList) {
  192. if (r.getIsMine() == 0) {
  193. maxReslIst.add(r);
  194. }
  195. if (r.getIsMine() == 1) {
  196. // 自运力
  197. deliveryIds.add(r.getDeliveryId());
  198. }
  199. }
  200. Optional<ValuationRes> max = null;
  201. // false用我们平台支付,true用用户自己绑定三方平台支付
  202. boolean isMine = false;
  203. if (maxReslIst != null && maxReslIst.size() > 0) {
  204. max = maxReslIst.stream().max(Comparator.comparing(ValuationRes::getDeliveryAmount));
  205. } else {
  206. max = resList.stream().max(Comparator.comparing(ValuationRes::getDeliveryAmount));
  207. isMine = true;
  208. }
  209. if (order.getWaimaiOrderId() != null) {
  210. getWaiMaiInfo(order, req);
  211. } else {
  212. this.setOrderSource(order, req);
  213. }
  214. //金额折扣
  215. BigDecimal deliveryAmount = max.get().getDeliveryAmount();//取最高价
  216. // req.setOrderSn(max.get().getOrderSn());
  217. order.setOrderSn(max.get().getOrderNo());
  218. //计算优惠券
  219. order.setTotalAmount(deliveryAmount.add(tip));
  220. order.setMaxAmount(deliveryAmount.add(tip));
  221. order.setCouponAmount(BigDecimal.ZERO);
  222. if (couponDto != null && !isDadaOrder) {
  223. if (couponDto.getType().equals(CouponTypeEnum.MAN_JIAN.type)) {
  224. if (order.getTotalAmount().compareTo(couponDto.getLimitFee()) >= 0 && !isMine) {
  225. order.setCouponAmount(couponDto.getMoney());
  226. order.setCouponId(Long.valueOf(couponDto.getId()));
  227. couponDto.setStatus(MemberCouponStatusEnum.USED.getStatus());
  228. }
  229. } else if (couponDto.getType().equals(CouponTypeEnum.LI_JIAN.type) && !isMine) {
  230. order.setCouponAmount(couponDto.getMoney());
  231. order.setCouponId(Long.valueOf(couponDto.getId()));
  232. couponDto.setStatus(MemberCouponStatusEnum.USED.getStatus());
  233. } else if (couponDto.getType().equals(CouponTypeEnum.ZHE_KOU.type) && !isMine) {
  234. BigDecimal discount = order.getTotalAmount().multiply(couponDto.getDiscount()).divide(BigDecimal.TEN).setScale(2, BigDecimal.ROUND_HALF_UP);
  235. if ((order.getTotalAmount().subtract(discount)).compareTo(couponDto.getMaxDiscount()) > 0) {
  236. discount = order.getTotalAmount().subtract(couponDto.getMaxDiscount());
  237. }
  238. order.setCouponAmount(order.getTotalAmount().subtract(discount));
  239. order.setCouponId(Long.valueOf(couponDto.getId()));
  240. couponDto.setStatus(MemberCouponStatusEnum.USED.getStatus());
  241. }
  242. }
  243. // // 此处是判断货拉拉下单不享受新人优惠, 前端请求接口外卖单未传transport字段
  244. // Integer deliveryType = null;
  245. // if (CollectionUtils.isNotEmpty(resList)) {
  246. // deliveryType = resList.get(0).getDeliveryType();
  247. // }
  248. BigDecimal firstCoupon = BigDecimal.ZERO;//取消新人首单立减
  249. // if (!isMine && !DeliveryTypeEnums.HUO_LA_LA.getType().equals(deliveryType) && !isDadaOrder) {
  250. // //新用户只要没有产生过订单数据的算首单,并且是用平台支付
  251. // List<Order> orderList;
  252. // if (member.getShopId() != null) {
  253. // orderList = iOrderService.list(new QueryWrapper<Order>().eq("shop_id", member.getShopId()).eq("status", PayStatusEnum.PAYED.status));
  254. // } else {
  255. // orderList = iOrderService.list(new QueryWrapper<Order>().eq("member_id", loginId).eq("status", PayStatusEnum.PAYED.status));
  256. // }
  257. // if (CollectionUtils.isEmpty(orderList)) {
  258. // String configValue = iSysConfigService.selectConfigByKey("NEW_COMERS");
  259. // firstCoupon = new BigDecimal(configValue);
  260. // }
  261. // }
  262. order.setFirstCoupon(firstCoupon);
  263. order.setPayAmount(order.getTotalAmount().subtract(firstCoupon));
  264. if (order.getCouponAmount().compareTo(order.getTotalAmount().add(order.getCouponAmount())) > 0) {
  265. order.setPayAmount(BigDecimal.ZERO);
  266. order.setCommission(BigDecimal.ZERO);
  267. } else if (order.getPayAmount().compareTo(BigDecimal.ZERO) < 0) {
  268. order.setPayAmount(BigDecimal.ZERO);
  269. } else {
  270. //代理商佣金
  271. order.setCommission(max.get().getCommission());
  272. }
  273. if (order.getDadaDspType() != null) {
  274. order.setCommission(BigDecimal.ZERO);
  275. }
  276. // 非自运力下单、或自运力达达收付配送商下单, 校验猎豹账户余额
  277. if ((!isMine || isDadaRapDelivery) && order.getPayAmount().compareTo(member.getAmount()) > 0 && PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType())) {
  278. log.error("余额不足, memberId: {}, orderSn: {}", member.getId(), order.getOrderSn());
  279. // throw new CustomAppException(ExceptionEnum.AMOUNT_ERROR);
  280. return "amount_not_enough";
  281. }
  282. // 下单运力中含有自运力校验账户余额, 达达配送商模式无需校验
  283. if (deliveryIds.size() > 0 && isMine && !isDadaOrder) {
  284. checkMemberAmount(member, deliveryIds);
  285. }
  286. //下单
  287. req.setProduct(product);
  288. order.setMerchantId(member.getMerchantId());
  289. if (!isDadaOrder) {
  290. if (member.getAgentId() != null) {
  291. order.setAgentId(member.getAgentId());
  292. order.setAgentIdSource(member.getAgentSource());
  293. if (member.getPersonnelId() != null) {
  294. order.setPersonnelId(member.getPersonnelId());
  295. }
  296. } else {
  297. // 判断区域,只给一级代理商
  298. Agent agent = iAgentService.findByArea(order.getSendCityName(), order.getSendDistrictName());
  299. if (agent != null) {
  300. order.setAgentId(agent.getId());
  301. order.setAgentIdSource(AgentSourceEnum.QU_YU.status);
  302. }
  303. }
  304. }
  305. if (isMine && PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType()) && !isDadaRapDelivery) {
  306. order.setPaymentType(PaymentTypeEnum.LOCAL.type);
  307. } else if ((!isMine || isDadaRapDelivery) && PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType())) {
  308. order.setPaymentType(PaymentTypeEnum.BALANCE.type);
  309. } else {
  310. order.setPaymentType(req.getPaymentType());
  311. }
  312. Object resp = "ok";
  313. BigDecimal payAmount = order.getPayAmount().setScale(2, BigDecimal.ROUND_HALF_UP);
  314. if (PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType()) && isMine) {
  315. order.setStatus(PayStatusEnum.PAYED.status);
  316. order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status);
  317. }
  318. if (PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType()) && (!isMine || isDadaRapDelivery)) {
  319. order.setStatus(PayStatusEnum.PAYED.status);
  320. order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status);
  321. // 判断余额是否低于50/100
  322. checkAmount(member.getId());
  323. } else if (PaymentTypeEnum.ZHI_FU_BAO.type.equals(req.getPaymentType()) && order.getPayAmount().compareTo(BigDecimal.ZERO) > 0) {
  324. // PC下单
  325. if (req.getCreateType() != null && req.getCreateType() == 1) {
  326. resp = apiOrderService.getPaymentQRCode(payAmount, order.getOrderSn(), PaymentTypeEnum.ZHI_FU_BAO.type);
  327. } else {
  328. // APP下单
  329. order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
  330. order.setStatus(PayStatusEnum.NO_PAYED.status);
  331. resp = aliPayService.pay(order.getOrderSn(), payAmount.toString(), order.getOrderSn());
  332. }
  333. } else if (PaymentTypeEnum.WEI_XIN.type.equals(req.getPaymentType()) && order.getPayAmount().compareTo(BigDecimal.ZERO) > 0) {
  334. // PC下单
  335. if (req.getCreateType() != null && req.getCreateType() == 1) {
  336. resp = apiOrderService.getPaymentQRCode(payAmount, order.getOrderSn(), PaymentTypeEnum.WEI_XIN.type);
  337. } else {
  338. // APP下单
  339. order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
  340. order.setStatus(PayStatusEnum.NO_PAYED.status);
  341. OrderPaySignResponse.WechatPayParam respon = null;
  342. try {
  343. respon = wechatPayService.pay(payAmount, order.getOrderSn(), order.getOrderSn(), TradeType.APP);
  344. } catch (WxPayException e) {
  345. // e.printStackTrace();
  346. }
  347. resp = JSONObject.toJSONString(respon);
  348. }
  349. }
  350. if (payAmount.compareTo(BigDecimal.ZERO) == 0) {
  351. order.setStatus(PayStatusEnum.PAYED.status);
  352. order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status);
  353. }
  354. if (order.getPayAmount().compareTo(BigDecimal.ZERO) > 0) {
  355. paymentService.savePayment(order.getMemberId(), order.getOrderSn(), order.getPayAmount(), req.getPaymentType(), TradeTypeEnum.ORDER.type, JSONObject.toJSONString(resList), order.getOrderSn());
  356. }
  357. order.setRefundMoney(BigDecimal.ZERO);
  358. // 设置外卖平台, 订单流水号
  359. if ((order.getShopId() != null || order.getMemberId() != null) && req.getPlatformType() != null) {
  360. if (req.getPlatformType() != 0 && req.getDaySeq() == null) {
  361. throw new CustomAppException("流水号不能为空!");
  362. }
  363. if (req.getPlatformType() == 0) {
  364. // 猎豹平台生成流水号
  365. String daySeq = this.getLieBaoDaySeq(order.getShopId(), order.getMemberId());
  366. req.setDaySeq(daySeq);
  367. }
  368. order.setPlatformType(req.getPlatformType());
  369. order.setLbDaySeq(req.getDaySeq());
  370. }
  371. if (order.getId() != null) {
  372. iOrderService.updateById(order);
  373. } else {
  374. iOrderService.save(order);
  375. }
  376. // 达达收付配送商计价明细入库
  377. if (isDadaRapDelivery) {
  378. OrderFreight orderFreight = new OrderFreight();
  379. BeanUtil.copyProperties(orderFreightDto, orderFreight);
  380. orderFreight.setOrderId(order.getId());
  381. iOrderFreightService.save(orderFreight);
  382. }
  383. // iOrderLogService.addOrderLog(order.getId(), OrderStatusEnum.ORDER_CREATE.status);
  384. iOrderLogService.addOrderLog(order.getId(), OrderStatusEnum.NO_PAYED.status);
  385. if (PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType())) {
  386. iOrderLogService.addOrderLog(order.getId(), OrderStatusEnum.PAYED.status);
  387. iOrderLogService.addOrderLog(order.getId(), OrderStatusEnum.ORDERS_TO_BE_RECEIVED.status);
  388. if (!isMine || isDadaRapDelivery) {
  389. //扣款
  390. iMemberService.updateAmount(member.getId(), payAmount.negate());
  391. //扣款记录
  392. iMemberBalanceLogService.saveLog(loginId, LogTypeEnum.REDUCE.type, "下单支付", LogSourceEnum.CONSUMPTION.status, order.getPayAmount(), member.getMerchantId(), order.getId(), order.getPaymentType());
  393. }
  394. }
  395. if (PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType()) || payAmount.compareTo(BigDecimal.ZERO) == 0) {
  396. //更改优惠券状态
  397. apiCouponService.updateCoupon(couponDto);
  398. // 发单
  399. if (CollectionUtils.isNotEmpty(resList)) {
  400. // order.setProduct(product);
  401. CouponDto finalCouponDto = couponDto;
  402. TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
  403. @Override
  404. public void afterCommit() {
  405. applicationContext.publishEvent(new DeliveryOrderEvent(order, resList, finalCouponDto));
  406. }
  407. });
  408. }
  409. }
  410. return resp;
  411. // }catch (Exception e){
  412. // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  413. // log.error("下单异常",e);
  414. // return null;
  415. // }
  416. }
  417. private void setOrderSource(Order order, OrderReq req) {
  418. Integer platformType = req.getPlatformType();
  419. if (platformType != null && platformType > 0) {
  420. order.setPoiSeq(req.getDaySeq());
  421. // 美团、美团闪购
  422. if (platformType == 1 || platformType == 5) {
  423. order.setOrderSource("101");
  424. } else if (platformType == 2) {
  425. // 饿了么
  426. order.setOrderSource("102");
  427. } else if (platformType == 3) {
  428. // 饿百零售
  429. order.setOrderSource("103");
  430. }
  431. }
  432. }
  433. private String getLieBaoDaySeq(Long shopId, Long memberId) {
  434. int daySeq = 1;
  435. String memberKey = RedisKeyConstant.MEMBER_DAY_SEQ + DateUtils.getDate() + ":member_id:" + memberId;
  436. Boolean hasMemberKey = redisCache.hasKey(memberKey);
  437. if (shopId == null) {
  438. if (hasMemberKey) {
  439. daySeq = redisCache.increment(memberKey).intValue();
  440. } else {
  441. // 36小时后过期自动清除
  442. redisCache.setCacheObject(memberKey, daySeq, 36, TimeUnit.HOURS);
  443. }
  444. } else {
  445. String shopKey = RedisKeyConstant.SHOP_DAY_SEQ + DateUtils.getDate() + ":shop_id:" + shopId;
  446. if (redisCache.hasKey(shopKey)) {
  447. daySeq = redisCache.increment(shopKey).intValue();
  448. } else {
  449. // 个人申请成为门店账号, 订单流水号不间断
  450. if (hasMemberKey) {
  451. daySeq = redisCache.increment(memberKey).intValue();
  452. }
  453. // 36小时后过期自动清除
  454. redisCache.setCacheObject(shopKey, daySeq, 36, TimeUnit.HOURS);
  455. }
  456. }
  457. return Integer.toString(daySeq);
  458. }
  459. private Order createOrder(Product product, CouponDto couponDto, OrderReq req, Long memberId) {
  460. Order order = new Order();
  461. if (req.getOrderId() != null) {
  462. order = iOrderService.getById(req.getOrderId());
  463. order.setPersonnelId(null);
  464. if (order.getWaimaiOrderId() == null) {
  465. order.setProductAmount(req.getProductAmount());
  466. order.setTakeType(req.getTakeType());
  467. order.setTakeRemark(req.getTakeRemark());
  468. } else {
  469. if (StringUtils.isNotBlank(req.getTakeRemark())) {
  470. order.setTakeRemark(req.getTakeRemark());
  471. }
  472. }
  473. return order;
  474. }
  475. order.setMemberId(memberId);
  476. order.setWeight(req.getWeight());
  477. order.setTakeType(req.getTakeType());
  478. order.setTakeDate(DateUtils.parseDate(req.getTakeTime()));
  479. order.setTakeTime(DateUtils.parseDate(req.getTakeTime()));
  480. order.setTakeRemark(req.getTakeRemark());
  481. order.setDeliveryType(req.getDeliveryType());
  482. order.setPreDeliveryIds(req.getPreDeliveryIds());
  483. order.setOrderSn(req.getOrderNo());
  484. order.setProductId(product.getId());
  485. order.setProductName(product.getName());
  486. order.setCouponAmount(BigDecimal.ZERO);
  487. order.setTaxpayerId(req.getTaxpayerId());
  488. order.setInvoiceTitle(req.getInvoiceTitle());
  489. // order.setProduct(product);
  490. Long shopId = req.getShopId();
  491. if (shopId == null) {
  492. Member member = iMemberService.getById(memberId);
  493. if (member.getShopId() != null) {
  494. shopId = member.getShopId();
  495. order.setDefaultShop(DefaultShopEnum.SHOW.status);
  496. }
  497. }
  498. order.setShopId(shopId);
  499. if (couponDto != null) {
  500. order.setCouponAmount(couponDto.getMoney());
  501. order.setCouponId(Long.valueOf(couponDto.getId()));
  502. }
  503. AddressReq sendAddress = req.getSendAddress();
  504. AddressReq receiveAddress = req.getReceiptAddress();
  505. if (StringUtils.isNotBlank(sendAddress.getStreet())) {
  506. order.setSendStreet(sendAddress.getStreet());
  507. }
  508. order.setSendAddress(sendAddress.getAddress());
  509. order.setSendAddressId(sendAddress.getId());
  510. order.setSendCityName(sendAddress.getCityName());
  511. order.setSendContactName(sendAddress.getContact());
  512. order.setSendPhone(sendAddress.getPhone());
  513. order.setSendExtension(sendAddress.getExtension());
  514. order.setSendDistrictName((String) sendAddress.getDistrictName());
  515. order.setSendProvinceName(sendAddress.getProvinceName());
  516. order.setSendLat(sendAddress.getLat());
  517. order.setSendLng(sendAddress.getLng());
  518. order.setSendCityCode(sendAddress.getCityCode());
  519. if (StringUtils.isNotBlank(receiveAddress.getStreet())) {
  520. order.setReceiptStreet(receiveAddress.getStreet());
  521. }
  522. order.setReceiptAddress(receiveAddress.getAddress());
  523. order.setReceiptAddressId(receiveAddress.getId());
  524. order.setReceiptCityName(receiveAddress.getCityName());
  525. order.setReceiptContactName(receiveAddress.getContact());
  526. order.setReceiptPhone(receiveAddress.getPhone());
  527. order.setReceiptExtension(receiveAddress.getExtension());
  528. order.setReceiptDistrictName((String) receiveAddress.getDistrictName());
  529. order.setReceiptProvinceName(receiveAddress.getProvinceName());
  530. order.setReceiptLat(receiveAddress.getLat());
  531. order.setReceiptLng(receiveAddress.getLng());
  532. order.setReceiptCityCode(receiveAddress.getCityCode());
  533. if (order.getWaimaiOrderId() != null) {
  534. order.setWaimaiOrderId(order.getWaimaiOrderId());
  535. } else {
  536. order.setWaimaiOrderId(req.getWaimaiOrderId());
  537. }
  538. order.setProductAmount(req.getProductAmount());
  539. return order;
  540. }
  541. @Override
  542. public void refund(String orderNo, BigDecimal refundMoney, String remark, Long memberId, Long merchantId) {
  543. Order order = iOrderService.getOne(new QueryWrapper<Order>().eq("order_sn", orderNo).eq("deleted", IsDeleteEnum.NORMAL.status));
  544. Member member = iMemberService.getById(memberId);
  545. if (member.getMemberType().equals(MemberTypeEnum.SHOP.type)) {
  546. member = iMemberService.getOne(new QueryWrapper<Member>().eq("member_type", MemberTypeEnum.MERCHANT.type).eq("merchant_id", member.getMerchantId()));
  547. }
  548. if (PaymentTypeEnum.BALANCE.type.equals(order.getPaymentType())) {
  549. iMemberService.updateAmount(member.getId(), refundMoney);
  550. } else if (PaymentTypeEnum.ZHI_FU_BAO.type.equals(order.getPaymentType())) {
  551. aliPayService.alipayRefundRequest(orderNo, refundMoney.doubleValue());
  552. } else if (PaymentTypeEnum.WEI_XIN.type.equals(order.getPaymentType())) {
  553. Payment payment = paymentService.getOne(new QueryWrapper<Payment>().eq("child_order_sn", orderNo).eq("payment_type", PaymentTypeEnum.WEI_XIN.type));
  554. wechatPayService.refund(orderNo, payment.getTotalAmount(), refundMoney, "");
  555. }
  556. iMemberBalanceLogService.saveLog(memberId, LogTypeEnum.INCREASE.type, remark, LogSourceEnum.REFUND.status, refundMoney, merchantId, order.getId(), order.getPaymentType());
  557. // 是否需要退服务费-绑定三方运力下单
  558. if (order.getBindFee().compareTo(BigDecimal.ZERO) == 1) {
  559. iMemberService.updateAmount(member.getId(), order.getBindFee());
  560. iMemberBalanceLogService.saveLog(memberId, LogTypeEnum.INCREASE.type, "订单取消,服务费退款", LogSourceEnum.REFUND.status, order.getBindFee(), merchantId, order.getId(), order.getPaymentType());
  561. }
  562. }
  563. public void refundTip(List<OrderTip> orderTips, String remark, Long memberId, Long merchantId) {
  564. BigDecimal tips = orderTips.stream().map(OrderTip::getAmount).reduce(BigDecimal.ZERO, BigDecimalUtils::sum);
  565. Member member = iMemberService.getById(memberId);
  566. if (member.getMemberType().equals(MemberTypeEnum.SHOP.type)) {
  567. member = iMemberService.getOne(new QueryWrapper<Member>().eq("member_type", MemberTypeEnum.MERCHANT.type).eq("merchant_id", member.getMerchantId()));
  568. }
  569. for (OrderTip orderTip : orderTips) {
  570. if (PaymentTypeEnum.BALANCE.type.equals(orderTip.getPayType())) {
  571. iMemberService.updateAmount(member.getId(), orderTip.getAmount());
  572. } else if (PaymentTypeEnum.ZHI_FU_BAO.type.equals(orderTip.getPayType())) {
  573. aliPayService.alipayRefundRequest(orderTip.getChildOrderNo(), orderTip.getAmount().doubleValue());
  574. } else if (PaymentTypeEnum.WEI_XIN.type.equals(orderTip.getPayType())) {
  575. wechatPayService.refund(orderTip.getChildOrderNo(), orderTip.getTotalAmout(), orderTip.getAmount(), "");
  576. }
  577. }
  578. if (tips.compareTo(BigDecimal.ZERO) > 0) {
  579. iMemberBalanceLogService.saveLog(memberId, LogTypeEnum.INCREASE.type, remark, LogSourceEnum.REFUND.status, tips, merchantId, Long.valueOf(orderTips.get(0).getOrderId()), orderTips.get(0).getPayType());
  580. }
  581. }
  582. @Override
  583. public void getWaiMaiInfo(Order order, OrderReq req) {
  584. WaimaiOrder waimaiOrder = iWaimaiOrderService.findById(order.getWaimaiOrderId());
  585. req.setAmount(waimaiOrder.getTotalPrice());
  586. order.setWmAmount(waimaiOrder.getTotalPrice());
  587. order.setShopId(waimaiOrder.getShopId());
  588. String remark = waimaiOrder.getCaution();
  589. req.setWaiMaiRemark(remark);
  590. order.setWaiMaiRemark(remark);
  591. // if (StringUtils.isNotBlank(remark) && remark.contains("收餐人隐私号")) {
  592. // remark = remark.substring(0, waimaiOrder.getCaution().indexOf("收餐人隐私号"));
  593. // }
  594. // if(StringUtils.isNotBlank(order.getTakeRemark())&&!order.getTakeRemark().equals(remark)){
  595. // remark = "【"+order.getTakeRemark()+"】" + remark;
  596. // }
  597. // if(StringUtils.isNotBlank(remark)&&remark.length()>200){
  598. // remark = remark.substring(0,200);
  599. // }
  600. // order.setTakeRemark(remark);
  601. // if (waimaiOrder.getCaution().contains("收餐人隐私号")){
  602. // order.setTakeRemark(waimaiOrder.getCaution().substring(0,waimaiOrder.getCaution().indexOf("收餐人隐私号")));
  603. // }else {
  604. // order.setTakeRemark(waimaiOrder.getCaution());
  605. // }
  606. if (DefaultShopEnum.SHOW.status.equals(order.getDefaultShop())) {
  607. order.setDefaultShop(DefaultShopEnum.STOP.status);
  608. }
  609. //order.setShopName(waimaiOrder.getPoiName());
  610. order.setPoiSeq(waimaiOrder.getDaySeq());
  611. order.setOrderingSourceNo(waimaiOrder.getOutOrderId());
  612. if (waimaiOrder.getOrderType().equals(WaimaiTypeEnums.MEI_TUAN.getType())) {
  613. order.setOrderSource("101");
  614. } else if (waimaiOrder.getOrderType().equals(WaimaiTypeEnums.E_LE_ME.getType())) {
  615. // 饿了么
  616. order.setOrderSource("102");
  617. } else if (waimaiOrder.getOrderType().equals(WaimaiTypeEnums.E_LE_ME_RETAIL.getType())) {
  618. // 饿百
  619. order.setOrderSource("103");
  620. }else if (waimaiOrder.getOrderType().equals(WaimaiOrderTypeEnum.MEI_TUAN_SG.getType())) {
  621. order.setOrderSource("101");
  622. }
  623. order.setPoiSeq(waimaiOrder.getDaySeq());
  624. // 外卖商品信息
  625. List<WaimaiOrderDetail> waiMaiOrderDetails = iWaimaiOrderDetailService.findList(order.getWaimaiOrderId());
  626. order.setWaimaiOrderDetails(waiMaiOrderDetails);
  627. }
  628. /**
  629. * 校验用户绑定三方运力,下单机制(这里校验的都是商家)
  630. */
  631. @Transactional(rollbackFor = Exception.class)
  632. public void checkMemberAmount(Member member, List<Long> deliveryIds) {
  633. if (member.getMerchantId() == null) {
  634. return;
  635. }
  636. MerchantDeliveryFee fee = iMerchantDeliveryFeeService.getByMerchantAndDeliveryIds(member.getMerchantId(), deliveryIds);
  637. if (fee == null) {
  638. return;
  639. }
  640. if (member.getAmount().compareTo(fee.getAmount()) == -1) {
  641. log.warn("选择运力为绑定运力,当前余额少于服务费,请充值后再下单!deliveryId: {}", fee.getDeliveryId());
  642. throw new CustomAppException("选择运力为绑定运力,当前余额少于服务费,请充值后再下单!", 250);
  643. }
  644. }
  645. @Override
  646. public boolean addRemark(Long orderId, String remark) {
  647. Order order = new Order();
  648. order.setTakeRemark(remark);
  649. order.setId(orderId);
  650. return iOrderService.updateById(order);
  651. }
  652. private void address(OrderReq req) {
  653. String sendAddress = req.getSendAddress().getAddress();
  654. String sendStreet = req.getSendAddress().getStreet();
  655. String receiptAddress = req.getReceiptAddress().getAddress();
  656. String receiptStreet = req.getReceiptAddress().getStreet();
  657. if (StringUtils.isNotBlank(sendStreet) && sendAddress.endsWith(sendStreet)) {
  658. req.getSendAddress().setAddress(sendAddress.substring(0, sendAddress.lastIndexOf(sendStreet)));
  659. }
  660. if (StringUtils.isNotBlank(receiptStreet) && receiptAddress.endsWith(receiptStreet)) {
  661. req.getReceiptAddress().setAddress(receiptAddress.substring(0, receiptAddress.lastIndexOf(receiptStreet)));
  662. }
  663. }
  664. private void resetOrder(Order order, Product product) {
  665. order.setId(null);
  666. order.setRefundMoney(BigDecimal.ZERO);
  667. order.setOutTradeNo("");
  668. order.setTakeDate(null);
  669. order.setDeliveryId(null);
  670. order.setDeliveryLogo("");
  671. order.setDeliveryName("");
  672. order.setDeliveryTime(null);
  673. order.setShipperName("");
  674. order.setShipperPhone("");
  675. order.setShipperLat(null);
  676. order.setShipperLng(null);
  677. order.setStatus(PayStatusEnum.NO_PAYED.status);
  678. order.setDeliveryStatus(null);
  679. order.setPaymentType(null);
  680. order.setCouponId(null);
  681. order.setCouponAmount(null);
  682. //order.setProduct(product);
  683. order.setCancelReason("");
  684. order.setTipAmount(null);
  685. order.setFirstCoupon(null);
  686. order.setUseTip(0);
  687. order.setTakeTime(new Date());
  688. // order.setTakeType(null);
  689. order.setProductId(product.getId());
  690. order.setProductName(product.getName());
  691. order.setBindFee(BigDecimal.ZERO);
  692. order.setCancelType(null);
  693. }
  694. /**
  695. * 判断用户余额
  696. *
  697. * @param memberId
  698. */
  699. public void checkAmount(Long memberId) {
  700. Member member = iMemberService.getById(memberId);
  701. if (member.getMerchantId() != null) {
  702. List<Member> members = iMemberService.selectListByMerchantId(member.getMerchantId().intValue());
  703. List<Long> mIds = new ArrayList<>();
  704. log.info("推送用户===" + JSONObject.toJSONString(members));
  705. if (member.getAmount().compareTo(new BigDecimal(50)) < 0) {
  706. // 自动配送关闭,关闭该商家的所有门店
  707. for (Member m : members) {
  708. // 判断用户是否开启自配送
  709. // MemberConfigDto memberConfigDto = iMemberConfigService.findDetail(m.getId());
  710. // if (memberConfigDto == null || memberConfigDto.getOpenAutodelivery().equals(0)){
  711. // continue;
  712. // }
  713. // MemberConfig memberConfig = iMemberConfigService.getById(memberConfigDto.getId());
  714. // memberConfig.setOpenAutodelivery(0);
  715. // iMemberConfigService.updateById(memberConfig);
  716. mIds.add(m.getId());
  717. }
  718. // 发推送
  719. if (CollectionUtils.isNotEmpty(mIds)) {
  720. messagePushService.memberAmountMessage(mIds, "您的平台余额低于50元", "您的平台余额已不足50元,可能导致自动发单失败,请及时充值!", 1);
  721. }
  722. return;
  723. }
  724. if (member.getAmount().compareTo(new BigDecimal(100)) < 0) {
  725. for (Member m : members) {
  726. mIds.add(m.getId());
  727. }
  728. // 发推送
  729. if (CollectionUtils.isNotEmpty(mIds)) {
  730. messagePushService.memberAmountMessage(mIds, "您的平台余额低于100元", "您的平台余额已不足100元,可能导致自动发单失败,请及时充值!", 2);
  731. }
  732. }
  733. }
  734. }
  735. }