ApiOrderServiceImpl.java 145 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520
  1. package com.ydd.app.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import com.alibaba.fastjson.JSONArray;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  6. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  7. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  8. import com.github.binarywang.wxpay.exception.WxPayException;
  9. import com.ijpay.core.enums.TradeType;
  10. import com.ydd.api.DeliveryService;
  11. import com.ydd.app.OrderEntityUtils;
  12. import com.ydd.app.QueryAmountEntityUtils;
  13. import com.ydd.app.dto.AddressReq;
  14. import com.ydd.app.dto.OrderMarkerDto;
  15. import com.ydd.app.dto.OrderReq;
  16. import com.ydd.app.dto.ValuationRes;
  17. import com.ydd.app.service.ApiOrderService;
  18. import com.ydd.app.service.ApiProductService;
  19. import com.ydd.app.service.ApiRiderLocationService;
  20. import com.ydd.app.task.TipsTask;
  21. import com.ydd.common.constant.RedisKeyConstant;
  22. import com.ydd.common.core.page.PageResult;
  23. import com.ydd.common.core.redis.RedisCache;
  24. import com.ydd.common.enums.DeliveryTypeEnums;
  25. import com.ydd.common.enums.WaimaiTypeEnums;
  26. import com.ydd.common.exception.CustomException;
  27. import com.ydd.common.utils.DateUtils;
  28. import com.ydd.common.utils.SnCodeUtils;
  29. import com.ydd.common.utils.StringUtils;
  30. import com.ydd.ecloud.core.utils.JsonMapper;
  31. import com.ydd.module.constants.AppConstant;
  32. import com.ydd.module.domain.*;
  33. import com.ydd.module.dto.*;
  34. import com.ydd.module.enums.*;
  35. import com.ydd.module.expection.CustomAppException;
  36. import com.ydd.module.expection.CustomWebException;
  37. import com.ydd.module.pay.alipay.AliPayService;
  38. import com.ydd.module.pay.dto.OrderPaySignResponse;
  39. import com.ydd.module.pay.wechat.service.WechatPayService;
  40. import com.ydd.module.producer.RabbitSender;
  41. import com.ydd.module.request.OrderListRequest;
  42. import com.ydd.module.request.OrderMarkerRequest;
  43. import com.ydd.module.service.*;
  44. import com.ydd.module.utils.CommonUtils;
  45. import com.ydd.system.domain.SysConfig;
  46. import com.ydd.system.service.ISysConfigService;
  47. import com.ydd.third.common.config.DeliveryConfig;
  48. import com.ydd.third.common.utils.AddressLngLatExchanger;
  49. import com.ydd.third.common.vo.GDMapTripResult;
  50. import com.ydd.third.common.vo.ResObject;
  51. import com.ydd.third.common.vo.shop.AmountResultVo;
  52. import com.ydd.third.common.vo.shop.QueryAmount;
  53. import com.ydd.third.common.vo.vo.order.OrderResultVo;
  54. import com.ydd.third.common.vo.vo.order.OrderVo;
  55. import com.ydd.third.common.vo.waimai.eleme.api.entity.order.OActivity;
  56. import com.ydd.third.common.vo.waimai.meituan.MeituanOrderExtraVo;
  57. import com.ydd.third.print.request.PrintOrderActDto;
  58. import com.ydd.third.print.request.PrintOrderDto;
  59. import com.ydd.third.print.request.PrintOrderGoodsDto;
  60. import lombok.RequiredArgsConstructor;
  61. import lombok.extern.slf4j.Slf4j;
  62. import org.apache.commons.collections4.CollectionUtils;
  63. import org.apache.commons.compress.utils.Lists;
  64. import org.springframework.beans.BeanUtils;
  65. import org.springframework.beans.factory.annotation.Autowired;
  66. import org.springframework.context.ApplicationContext;
  67. import org.springframework.data.redis.core.RedisTemplate;
  68. import org.springframework.data.redis.core.ZSetOperations;
  69. import org.springframework.stereotype.Service;
  70. import org.springframework.transaction.annotation.Transactional;
  71. import org.springframework.util.StopWatch;
  72. import java.math.BigDecimal;
  73. import java.util.*;
  74. import java.util.concurrent.Executors;
  75. import java.util.concurrent.ScheduledExecutorService;
  76. import java.util.concurrent.TimeUnit;
  77. import java.util.stream.Collectors;
  78. /**
  79. * Project:lb-server
  80. * Class:ApiOrderServiceImpl
  81. * Description:TODO
  82. * Time:2021/2/23 14:41
  83. *
  84. * @author zoe
  85. */
  86. @Slf4j
  87. @Service
  88. @RequiredArgsConstructor(onConstructor_ = @Autowired)
  89. public class ApiOrderServiceImpl implements ApiOrderService {
  90. public static ScheduledExecutorService tipScheduledExecutorService = Executors.newScheduledThreadPool(10);
  91. private final ApiProductService apiProductService;
  92. private final IOrderService iOrderService;
  93. private final IOrderLogService iOrderLogService;
  94. private final IOrderCommentService iOrderCommentService;
  95. private final IMemberService iMemberService;
  96. private final DeliveryService client;
  97. private final IDspDeliveryService iDspDeliveryService;
  98. private final IMemberBalanceLogService iMemberBalanceLogService;
  99. private final IWaimaiOrderDetailService iWaimaiOrderDetailService;
  100. private final IWaimaiOrderService iWaimaiOrderService;
  101. private final IDspWaimaiService iDspWaimaiService;
  102. private final DeliveryConfig deliveryConfig;
  103. private final IMemberConfigService iMemberConfigService;
  104. private final ApplicationContext applicationContext;
  105. private final ISysConfigService iSysConfigService;
  106. private final IDspConfigService iDspConfigService;
  107. private final RedisTemplate redisTemplate;
  108. private final IOrderDeliveryService iOrderDeliveryService;
  109. private final IShopDeliveryService iShopDeliveryService;
  110. private final IOrderTipService iOrderTipService;
  111. private final AliPayService aliPayService;
  112. private final WechatPayService wechatPayService;
  113. private final IPaymentService paymentService;
  114. private final IDeliveryConfigService iDeliveryConfigService;
  115. private final IShopService iShopService;
  116. private final IShopUserService iShopUserService;
  117. private final IOrderDelayService iOrderDelayService;
  118. private final RabbitSender rabbitSender;
  119. private final RedisCache redisCache;
  120. private final ApiRiderLocationService apiRiderLocationService;
  121. private final IMemberAddressService iMemberAddressService;
  122. private final IWaimaiFoodImgService iWaimaiFoodImgService;
  123. private final IAgentService iAgentService;
  124. private final ApiCacheUserAddress apiCacheUserAddress;
  125. private final IShopWaimaiService iShopWaimaiService;
  126. private final IShopDeliveryBindService iShopDeliveryBindService;
  127. private final IMerchantService iMerchantService;
  128. private final IDadaDspService iDadaDspService;
  129. @Override
  130. public ValuationRes valuation(Long loginId, OrderReq orderReq, Integer type) {
  131. log.info("<===========>计价参数" + JsonMapper.nonEmptyMapper().toJson(orderReq));
  132. try {
  133. Member member = iMemberService.getById(loginId);
  134. if (member.getMemberType().equals(MemberTypeEnum.SHOP.type)) {
  135. member = iMemberService.getOne(new QueryWrapper<Member>().eq("member_type", MemberTypeEnum.MERCHANT.type).eq("merchant_id", member.getMerchantId()));
  136. }
  137. AddressReq sendAddress = orderReq.getSendAddress();
  138. AddressReq receiveAddress = orderReq.getReceiptAddress();
  139. if (sendAddress == null || receiveAddress == null) {
  140. throw new CustomAppException(ExceptionEnum.ADDRESS_NOT_EXISTS);
  141. }
  142. Product product = apiProductService.findById(orderReq.getProductId());
  143. if (product == null) {
  144. throw new CustomAppException(ExceptionEnum.PRODUCT_NOT_EXISTS);
  145. }
  146. Long shopId = orderReq.getShopId();
  147. Integer defaultShop = 0;
  148. Long waimaiOrderId = null;
  149. String takeRemark = "";
  150. if (orderReq.getOrderId() != null) {
  151. Order order = iOrderService.getById(orderReq.getOrderId());
  152. orderReq.setWaimaiOrderId(order.getWaimaiOrderId());
  153. // orderReq.setOrderSn(order.getOrderSn());
  154. orderReq.setWaimaiOrderId(order.getWaimaiOrderId());
  155. waimaiOrderId = order.getWaimaiOrderId();
  156. if (order.getDeliveryStatus().intValue() >= DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status.intValue() && order.getDeliveryStatus().intValue() != DeliveryStatusEnum.FINISH.status.intValue()) {
  157. return null;
  158. }
  159. if (DeliveryStatusEnum.CANCEL.status.equals(order.getDeliveryStatus()) || DeliveryStatusEnum.FINISH.status.equals(order.getDeliveryStatus()) || DeliveryStatusEnum.ABNORMAL.status.equals(order.getDeliveryStatus())) {
  160. orderReq.setOrderNo(SnCodeUtils.createSn());
  161. } else {
  162. orderReq.setOrderNo(order.getOrderSn());
  163. }
  164. shopId = order.getShopId();
  165. if (DefaultShopEnum.SHOW.status.equals(order.getDefaultShop())) {
  166. //非门店模式,不出现蜂鸟和美团
  167. defaultShop = 1;
  168. }
  169. takeRemark = order.getTakeRemark();
  170. } else {
  171. // orderReq.setOrderSn(SnCodeUtils.createSn());
  172. orderReq.setOrderNo(SnCodeUtils.createSn());
  173. }
  174. if (orderReq.getSendAddress().getId() == null && orderReq.getShopId() != null && waimaiOrderId == null) {//兼容老版本非门店模式下单且不是外卖单子
  175. //非门店模式,不出现蜂鸟和美团
  176. defaultShop = 1;
  177. }
  178. if (orderReq.getSendAddress().getId() != null && orderReq.getShopId() != null && !orderReq.getSendAddress().getId().equals(orderReq.getShopId())) {//兼容老版本非门店模式下单且不是外卖单子
  179. //非门店模式,不出现蜂鸟和美团
  180. defaultShop = 1;
  181. }
  182. if (StringUtils.isNotBlank(orderReq.getTakeTime()) && DateUtils.addHours(new Date(), 2).compareTo(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, orderReq.getTakeTime())) > 0) {
  183. orderReq.setTakeTime("");
  184. orderReq.setTakeType(0);
  185. }
  186. List<WaimaiOrderDetail> waiMaiOrderDetails = new ArrayList<>();
  187. if (orderReq.getWaimaiOrderId() != null) {
  188. WaimaiOrder waimaiOrder = iWaimaiOrderService.findById(orderReq.getWaimaiOrderId());
  189. if (waimaiOrder.getOrderType().equals(WaimaiOrderTypeEnum.MEI_TUAN.getType())) {
  190. orderReq.setOrderSource("101");
  191. orderReq.setOrderingSourceNo(waimaiOrder.getOutOrderId());
  192. orderReq.setZbOrderingSourceNo(waimaiOrder.getOutOrderId());
  193. // 查询美团跑腿的token
  194. DspWaimai waiMai = iDspWaimaiService.findOne(WaimaiTypeEnums.MEI_TUAN.getType());
  195. if (waiMai != null){
  196. ShopWaimai shopWaimai = iShopWaimaiService.findById(shopId,waiMai.getId());
  197. if (shopWaimai != null){
  198. orderReq.setZbToken(shopWaimai.getAuthToken());
  199. }
  200. }
  201. } else if (waimaiOrder.getOrderType().equals(WaimaiOrderTypeEnum.E_LE_ME.getType())) {
  202. orderReq.setOrderSource("102");
  203. }else if (waimaiOrder.getOrderType().equals(WaimaiOrderTypeEnum.E_LE_ME_RETAIL.getType())) {
  204. orderReq.setOrderSource("103");
  205. }
  206. orderReq.setTakeRemark(takeRemark);
  207. orderReq.setWaiMaiRemark(waimaiOrder.getCaution());
  208. orderReq.setMtMoney(waimaiOrder.getTotalPrice());
  209. orderReq.setPoiSeq(waimaiOrder.getDaySeq());
  210. waiMaiOrderDetails = iWaimaiOrderDetailService.findList(orderReq.getWaimaiOrderId());
  211. shopId = waimaiOrder.getShopId();
  212. if (waimaiOrder.getOrderType().equals(1)) {
  213. orderReq.setOrderSource("101");
  214. } else if (waimaiOrder.getOrderType().equals(2)) {
  215. orderReq.setOrderSource("102");
  216. }
  217. }
  218. orderReq.setWaimaiOrderDetails(waiMaiOrderDetails);
  219. orderReq.setProduct(product);
  220. ValuationRes res = new ValuationRes();
  221. List<ValuationRes> list = new ArrayList<>();
  222. List<ValuationRes> supports = new ArrayList<>();
  223. DspConfig dspConfig = null;
  224. dspConfig = iDspConfigService.getOne(new QueryWrapper<DspConfig>().eq("deleted", 0));
  225. List<DeliveryInfo> deliveryInfos = iDspDeliveryService.findList(member, shopId, orderReq.getTransport(), null, null);
  226. if (type == 2) {
  227. List<String> deliveryIds = Arrays.asList(orderReq.getPreDeliveryIds().split(","));
  228. deliveryInfos = deliveryInfos.stream().filter(a -> deliveryIds.contains(a.getId().toString())).collect(Collectors.toList());
  229. log.info("<===========>计价运力" + JsonMapper.nonEmptyMapper().toJson(deliveryInfos));
  230. }
  231. if(shopId!=null){
  232. Shop shop = iShopService.getById(shopId);
  233. orderReq.setShopName(shop.getName());
  234. }
  235. for (DeliveryInfo info : deliveryInfos) {
  236. /*if (orderReq.getTransport().equals(0)) {
  237. if (info.getType().equals(DeliveryTypeEnums.HUO_LA_LA.getType())) {
  238. continue;
  239. }
  240. } else if (orderReq.getTransport().equals(1)) {
  241. if (!info.getType().equals(DeliveryTypeEnums.HUO_LA_LA.getType())) {
  242. continue;
  243. }
  244. }*/
  245. ValuationRes valuationRes = queryOrderDeliverFee(orderReq, info, member.getAmount(), loginId, shopId, defaultShop);
  246. if (valuationRes != null) {
  247. valuationRes.setPreferredDelivery(info.getPreferredDelivery());
  248. valuationRes.setOriginalMoney(valuationRes.getDeliveryAmount());
  249. //金额折扣
  250. // SysConfig sysConfig = iSysConfigService.selectSysConfigByKey("MONEY_DISCOUNT");
  251. // if (sysConfig != null && StringUtils.isNotBlank(sysConfig.getConfigValue()) && valuationRes.getIsMine() == 0) {
  252. // valuationRes.setDeliveryAmount(new BigDecimal(sysConfig.getConfigValue()).multiply(valuationRes.getDeliveryAmount()).divide(BigDecimal.TEN));
  253. // }
  254. //城市运力优惠配置
  255. DeliveryCityConfig deliveryCityConfig = new DeliveryCityConfig();
  256. deliveryCityConfig.setCityCode(orderReq.getSendAddress().getCityCode());
  257. deliveryCityConfig.setDeliveryType(info.getType());
  258. List<DeliveryCityConfig> configList = iDeliveryConfigService.queryList(deliveryCityConfig);
  259. if (CollectionUtils.isEmpty(configList)) {//对应城市没配置运力优惠,查全国
  260. deliveryCityConfig = iDeliveryConfigService.getOne(new QueryWrapper<DeliveryCityConfig>().eq("city_code", 0).eq("delivery_type", info.getType()));
  261. } else {
  262. deliveryCityConfig = configList.get(0);
  263. }
  264. if (deliveryCityConfig != null && StringUtils.isNotBlank(deliveryCityConfig.getConfigValue()) && valuationRes.getIsMine() == 0) {
  265. if (CouponTypeEnum.ZHE_KOU.type.equals(deliveryCityConfig.getType())) {//折扣
  266. valuationRes.setDeliveryAmount(new BigDecimal(deliveryCityConfig.getConfigValue()).multiply(valuationRes.getDeliveryAmount()).divide(BigDecimal.TEN));
  267. valuationRes.setZk(new BigDecimal(deliveryCityConfig.getConfigValue()));
  268. } else if (CouponTypeEnum.LI_JIAN.type.equals(deliveryCityConfig.getType())) {//直减
  269. valuationRes.setDeliveryAmount(valuationRes.getDeliveryAmount().subtract(new BigDecimal(deliveryCityConfig.getConfigValue())));
  270. valuationRes.setMj(new BigDecimal(deliveryCityConfig.getConfigValue()));
  271. }
  272. }
  273. BigDecimal commission = BigDecimal.ZERO;
  274. if (dspConfig != null && dspConfig.getCommissionRate() != null && !info.getType().equals(DeliveryTypeEnums.HUO_LA_LA.getType())) {
  275. commission = dspConfig.getCommissionRate().multiply(valuationRes.getDeliveryAmount()).divide(new BigDecimal("100"));
  276. }
  277. valuationRes.setIsMerchant(info.getIsMerchant());
  278. // 判断是否是自己的平台,是的话没有佣金
  279. if (valuationRes.getIsMine() == 1) {
  280. commission = BigDecimal.ZERO;
  281. }
  282. valuationRes.setCommission(commission);
  283. valuationRes.setDeliveryAmount(commission.add(valuationRes.getDeliveryAmount()));
  284. if (valuationRes.getIsMine() == 0) {
  285. //校验余额是否充足
  286. if (member.getAmount().compareTo(valuationRes.getDeliveryAmount()) >= 0) {
  287. valuationRes.setIsEnough(StatusEnum.SHOW.status);
  288. }
  289. }
  290. }
  291. list.add(valuationRes);
  292. }
  293. //排序
  294. list.removeAll(Collections.singleton(null));
  295. list.sort((o1, o2) -> {
  296. BigDecimal i = o1.getDeliveryAmount().subtract(o2.getDeliveryAmount());
  297. return i.intValue();
  298. });
  299. //获取聚合配送的预估价,选最低价格展示
  300. if (CollectionUtils.isNotEmpty(list)) {
  301. res.setDeliveryId(list.get(0).getDeliveryId());
  302. res.setDesc("全网运力推单");
  303. res.setDeliveryAmount(list.get(0).getDeliveryAmount());
  304. res.setName("聚合配送");
  305. res.setIsEnough(list.get(0).getIsEnough());
  306. res.setLogo("https://ecloud-cdn.51sssd.com/20210317/e24a425797f54f64b808b95beae37285.png");
  307. }
  308. //查询下单设置推荐屏蔽运力
  309. List<ValuationRes> billList = new ArrayList<>();
  310. if (type == 1) {
  311. MemberConfig config = iMemberConfigService.getOne(new QueryWrapper<MemberConfig>().eq("member_id",loginId));
  312. if (config != null) {
  313. if (StringUtils.isNotEmpty(config.getBillDeliveryIds())) {
  314. List<String> billDeliveryIds = Arrays.asList(config.getBillDeliveryIds().split(","));
  315. //过滤
  316. billList = list.stream().filter(a -> billDeliveryIds.contains(a.getDeliveryId().toString())).collect(Collectors.toList());
  317. }
  318. if (StringUtils.isNotEmpty(config.getShieldDeliveryIds())) {
  319. List<String> shieldDeliveryIds = Arrays.asList(config.getShieldDeliveryIds().split(","));
  320. //过滤
  321. list = list.stream().filter(a -> !shieldDeliveryIds.contains(a.getDeliveryId().toString())).collect(Collectors.toList());
  322. }
  323. }
  324. }
  325. list.removeAll(billList);
  326. billList.addAll(list);
  327. // Map<Integer, List<ValuationRes>> lowMap = list.stream().collect(Collectors.groupingBy(ValuationRes::getIsEnough));
  328. //新用户只要没有产生过订单数据的算首单
  329. List<Order> orderList = iOrderService.list(new QueryWrapper<Order>().eq("member_id", loginId).eq("status", PayStatusEnum.PAYED.status));
  330. if (CollectionUtils.isEmpty(orderList)) {
  331. String configValue = iSysConfigService.selectConfigByKey("NEW_COMERS");
  332. res.setFirstCoupon(configValue);
  333. }
  334. //闪送距离替换
  335. Optional<ValuationRes> optionalb = billList.stream().filter(item -> !item.getDeliveryType().equals(DeliveryTypeEnums.SHAN_SONG.getType())).findFirst();
  336. if (optionalb.isPresent()) {
  337. String desc = optionalb.get().getDesc();
  338. for (ValuationRes res1 : billList) {
  339. if (DeliveryTypeEnums.SHAN_SONG.getType().equals(res1.getDeliveryType())) {
  340. res1.setDesc(desc);
  341. break;
  342. }
  343. }
  344. }
  345. // res.setOptionals(lowMap.get(StatusEnum.SHOW.status));
  346. // res.setLowOptionals(lowMap.get(StatusEnum.STOP.status));
  347. res.setOptionals(billList);
  348. res.setSupports(supports);
  349. return res;
  350. } catch (Exception e) {
  351. log.error("发起计价异常", e);
  352. return null;
  353. }
  354. }
  355. private ValuationRes queryOrderDeliverFee(OrderReq orderReq, DeliveryInfo delivery, BigDecimal amount, Long memberId, Long shopId, Integer defaultShop) {
  356. if (DeliveryTypeEnums.SHUN_FENG.getType().equals(delivery.getType()) && "0".equals(orderReq.getProduct().getSfProductType())) {
  357. return null;
  358. }
  359. Member member = iMemberService.getById(memberId);
  360. orderReq.setOrderSn(SnCodeUtils.createSn());
  361. orderReq.setAmount(orderReq.getProductAmount());
  362. OrderVo orderVo = OrderEntityUtils.createOrderVo(orderReq, delivery, deliveryConfig.isTest());
  363. orderVo.setIsMine(delivery.getIsMine());
  364. if (DeliveryTypeEnums.FENG_NIAO.getType().equals(delivery.getType()) || DeliveryTypeEnums.MEI_TUAN.getType().equals(delivery.getType())) {
  365. ShopDelivery shopDelivery = iShopDeliveryService.findOne(shopId, delivery.getId());
  366. if (shopDelivery == null || !shopDelivery.getBindStatus().equals(BindStatusEnum.BIND.status)) {
  367. return null;
  368. }
  369. }
  370. if ((DeliveryTypeEnums.FENG_NIAO.getType().equals(delivery.getType()) || DeliveryTypeEnums.MEI_TUAN.getType().equals(delivery.getType())) && DefaultShopEnum.SHOW.status.equals(defaultShop.intValue())) {
  371. return null;
  372. }
  373. if (DeliveryTypeEnums.FENG_NIAO.getType().equals(delivery.getType()) && shopId == null) {
  374. return null;
  375. }
  376. // 美团跑腿未绑定不参与计价
  377. if (DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType()) && delivery.getIsMine() == 0){
  378. return null;
  379. }
  380. if (DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType())){
  381. SysConfig sysConfig = iSysConfigService.selectSysConfigByKey("MT_PT");
  382. if (sysConfig.getConfigValue().equals("yes") && shopId != 1626){
  383. return null;
  384. }
  385. }
  386. ResObject<OrderResultVo> resObject = client.queryOrderDeliverFee(orderVo);
  387. if (resObject.getCode() == 2155 && (DeliveryTypeEnums.DADA.getType().equals(delivery.getType()) || DeliveryTypeEnums.DADA_YZ.getType().equals(delivery.getType()))){
  388. // 达达/优质余额不足,重新计价
  389. log.info("余额不足----" + DeliveryTypeEnums.getNameByType(delivery.getType()) + "余额不足,重新计价");
  390. orderVo.setMerchantId(null);
  391. orderVo.setShopNo(delivery.getDadaThirdShopId());
  392. delivery.setShopId(delivery.getDadaThirdShopId());
  393. resObject = client.queryOrderDeliverFee(orderVo);
  394. }
  395. if (resObject.getCode() == 0) {
  396. ValuationRes res = new ValuationRes();
  397. transResObejct(res, delivery, resObject, orderReq, orderVo);
  398. // 判断是否是自己平台,查询金额是否充足
  399. if (delivery.getIsMine() == 1 && !delivery.getType().equals(DeliveryTypeEnums.KUAI_FU.getType()) && !delivery.getType().equals(DeliveryTypeEnums.MEI_TUAN_ZB.getType())) {
  400. QueryAmount queryAmount = QueryAmountEntityUtils.queryAmount(delivery, member.getMerchantId(), delivery.getIsMine());
  401. ResObject<AmountResultVo> amountRes = client.queryAmount(queryAmount);
  402. if (amountRes.getCode() == 0) {
  403. // 更新余额
  404. AmountResultVo vo = amountRes.getData();
  405. ShopDelivery shopDelivery = iShopDeliveryService.getOne(new QueryWrapper<ShopDelivery>().eq("merchant_id", member.getMerchantId()).eq("delivery_id", delivery.getId())
  406. .eq("deleted", IsDeleteEnum.NORMAL.status).isNull("shop_id").eq("bind_status", 1));
  407. if (shopDelivery != null) {
  408. shopDelivery.setBalance(vo.getBalanceAmount());
  409. iShopDeliveryService.updateById(shopDelivery);
  410. }
  411. if (vo.getBalanceAmount().compareTo(res.getDeliveryAmount()) >= 0) {
  412. res.setIsEnough(StatusEnum.SHOW.status);
  413. res.setIsMine(1);
  414. } else {
  415. //uupt需重新计价
  416. res.setIsMine(0);
  417. orderVo.setIsMine(0);
  418. if ("uupt".equals(orderVo.getLbClient())) {
  419. orderVo.setOpenId("");
  420. resObject = client.queryOrderDeliverFee(orderVo);
  421. transResObejct(res, delivery, resObject, orderReq, orderVo);
  422. }
  423. }
  424. }
  425. } else if (delivery.getIsMine() == 1 && delivery.getType().equals(DeliveryTypeEnums.KUAI_FU.getType())) {
  426. if (!resObject.getData().getFeStatus().equals("1")) {
  427. res.setIsMine(0);
  428. orderVo.setIsMine(0);
  429. }
  430. }
  431. return res;
  432. }
  433. return null;
  434. }
  435. @Override
  436. @Transactional(rollbackFor = Exception.class)
  437. public void createOrder(Long loginId, OrderReq req, Integer type) {
  438. //转移到apiordernew
  439. }
  440. @Override
  441. public OrderMarkerDto marker(Long loginId) {
  442. OrderMarkerDto dto = new OrderMarkerDto();
  443. List<Long> shopIds = new ArrayList<>();
  444. Member member = iMemberService.getById(loginId);
  445. if (member.getMemberType().equals(MemberTypeEnum.SHOP.type)) {
  446. // shopIds.add(member.getShopId());
  447. shopIds = null;
  448. }
  449. if (member.getMemberType().equals(MemberTypeEnum.MERCHANT.type)) {
  450. shopIds = iShopService.getShopByMerchantId(member.getMerchantId(), null);
  451. }
  452. if (member.getMemberType().equals(MemberTypeEnum.PERSON.type)) {
  453. shopIds = null;
  454. }
  455. List<Order> list = new ArrayList<>();
  456. if (shopIds != null&&shopIds.size()>0) {
  457. list = iOrderService.list(new QueryWrapper<Order>().in("shop_id", shopIds).isNull("waimai_order_id"));
  458. } else {
  459. list = iOrderService.list(new QueryWrapper<Order>().eq("member_id", loginId).isNull("waimai_order_id"));
  460. }
  461. List<Order> toBeBillNum = list.stream().filter((Order detailDto) -> DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status.equals(detailDto.getDeliveryStatus())).collect(Collectors.toList());
  462. List<Order> completedNum = list.stream().filter((Order detailDto) -> DeliveryStatusEnum.FINISH.status.equals(detailDto.getDeliveryStatus())).collect(Collectors.toList());
  463. List<Order> cancelNum = list.stream().filter((Order detailDto) -> DeliveryStatusEnum.CANCEL.status.equals(detailDto.getDeliveryStatus())).collect(Collectors.toList());
  464. List<Order> inDeliveryNum = list.stream().filter((Order detailDto) -> DeliveryStatusEnum.IN_DELIVERY.status.equals(detailDto.getDeliveryStatus())).collect(Collectors.toList());
  465. List<Order> toBePickedNum = list.stream().filter((Order detailDto) -> DeliveryStatusEnum.TO_BE_DELIVERED.status.equals(detailDto.getDeliveryStatus())).collect(Collectors.toList());
  466. List<Order> toBeReceivedNum = list.stream().filter((Order detailDto) -> DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status.equals(detailDto.getDeliveryStatus())).collect(Collectors.toList());
  467. List<Order> toBePaidNum = list.stream().filter((Order detailDto) -> PayStatusEnum.NO_PAYED.status.equals(detailDto.getStatus())).collect(Collectors.toList());
  468. dto.setToBeBillNum(toBeBillNum.size());
  469. dto.setCompletedNum(completedNum.size());
  470. dto.setCancelNum(cancelNum.size());
  471. dto.setInDeliveryNum(inDeliveryNum.size());
  472. dto.setToBePickedNum(toBePickedNum.size());
  473. dto.setToBeReceivedNum(toBeReceivedNum.size());
  474. dto.setToBePaidNum(toBePaidNum.size());
  475. return dto;
  476. }
  477. @Override
  478. public void comment(Long loginId, Long orderId, Integer rate) {
  479. OrderComment comment = iOrderCommentService.getOne(new QueryWrapper<OrderComment>().eq("member_id", loginId).eq("order_id", orderId));
  480. if (comment != null) {
  481. throw new CustomAppException("该订单已评价");
  482. }
  483. comment = new OrderComment();
  484. comment.setOrderId(orderId);
  485. comment.setMemberId(loginId);
  486. comment.setRate(rate);
  487. iOrderCommentService.save(comment);
  488. }
  489. @Override
  490. public List<OrderLog> findOrderStatus(Long loginId, Integer orderId) {
  491. List<OrderLog> list = iOrderLogService.list(new QueryWrapper<OrderLog>().eq("order_id", orderId));
  492. list = list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(
  493. () -> new TreeSet<>(Comparator.comparing(OrderLog::getOrderStatus))), ArrayList::new));
  494. list.sort((a, b) -> a.getCreateTime().compareTo(b.getCreateTime()));
  495. return list;
  496. }
  497. /**
  498. * 添加小费
  499. * @param loginId 当前登录用户
  500. * @param orderId 订单id
  501. * @param tipAmount 消费金额
  502. * @param paymentType 支付类型
  503. * @param createType 下单方式(0/null:APP 1:PC)
  504. * @return
  505. */
  506. @Override
  507. @Transactional(rollbackFor = Exception.class)
  508. public Object tips(Long loginId, Integer orderId, BigDecimal tipAmount, Integer paymentType, Integer createType) {
  509. Object resp = "fail";
  510. Order order = iOrderService.getById(orderId);
  511. if (order == null) {
  512. throw new CustomAppException("订单不存在!", 500);
  513. }
  514. if (order.getDadaDspType() != null) {
  515. throw new CustomAppException("达达配送商模式订单不支持加小费!", 500);
  516. }
  517. List<OrderDelivery> orderDeliverys = iOrderDeliveryService.list(new QueryWrapper<OrderDelivery>().eq("order_sn", order.getOrderSn()));
  518. if(orderDeliverys!=null&&orderDeliverys.size() ==1 &&"-1".equals(orderDeliverys.get(0).getOutTradeNo())){
  519. throw new CustomAppException("加小费失败,下单失败!", 260);
  520. }
  521. List<OrderDelivery> orderDeliverys_new = orderDeliverys.stream().filter(orderDelivery -> StringUtils.isBlank(orderDelivery.getOutTradeNo())).collect(Collectors.toList());
  522. // .isNull("out_trade_no"));
  523. if (orderDeliverys_new.size()>0) {
  524. throw new CustomAppException("请2分钟后加小费!", 260);
  525. }
  526. Member member = iMemberService.getById(loginId);
  527. if (member.getMemberType().equals(MemberTypeEnum.SHOP.type)) {
  528. member = iMemberService.getOne(new QueryWrapper<Member>().eq("member_type", MemberTypeEnum.MERCHANT.type).eq("merchant_id", member.getMerchantId()));
  529. }
  530. if (PaymentTypeEnum.BALANCE.type.equals(paymentType) && tipAmount.compareTo(member.getAmount()) > 0) {
  531. throw new CustomAppException("余额不足!", 250);
  532. }
  533. //加小费
  534. if (order.getDeliveryStatus().equals(DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status) && tipAmount.compareTo(BigDecimal.ZERO) > 0) {
  535. // MemberConfig config = iMemberConfigService.getById(order.getMemberId());
  536. OrderTip orderTip = new OrderTip();
  537. orderTip.setChildOrderNo("T" + SnCodeUtils.createSn());
  538. orderTip.setAmount(tipAmount);
  539. orderTip.setOrderId(orderId);
  540. orderTip.setOrderNo(order.getOrderSn());
  541. orderTip.setPayType(paymentType);
  542. orderTip.setTotalAmout(tipAmount);
  543. if (PaymentTypeEnum.BALANCE.type.equals(paymentType)) {
  544. orderTip.setStatus(PayStatusEnum.PAYED.status);
  545. }
  546. iOrderTipService.save(orderTip);
  547. if (tipAmount.compareTo(BigDecimal.ZERO) > 0) {
  548. paymentService.savePayment(order.getMemberId(), order.getOrderSn(), tipAmount, paymentType, TradeTypeEnum.ADDTIP.type, null, orderTip.getChildOrderNo());
  549. }
  550. if (PaymentTypeEnum.BALANCE.type.equals(paymentType)) {
  551. Order updateOrder = new Order();
  552. updateOrder.setId(order.getId());
  553. iOrderDeliveryService.updateDelivery(tipAmount, order.getOrderSn());
  554. if (order.getTipAmount() != null) {
  555. updateOrder.setTipAmount(order.getTipAmount().add(tipAmount));
  556. } else {
  557. updateOrder.setTipAmount(tipAmount);
  558. }
  559. // order.setUseTip(StatusEnum.SHOW.status);
  560. updateOrder.setTotalAmount(order.getTotalAmount().add(tipAmount));
  561. updateOrder.setPayAmount(order.getPayAmount().add(tipAmount));
  562. iOrderService.updateById(updateOrder);
  563. //扣钱
  564. iMemberService.updateAmount(member.getId(), tipAmount.negate());
  565. iMemberBalanceLogService.saveLog(loginId, LogTypeEnum.REDUCE.type, "加小费", LogSourceEnum.CONSUMPTION.status, tipAmount, order.getMerchantId(),order.getId(), orderTip.getPayType(), member.getAmount());
  566. resp = "ok";
  567. tipScheduledExecutorService.schedule(new TipsTask(order, null, iOrderService, iDspDeliveryService, client, tipAmount, iOrderDeliveryService, iShopDeliveryService,iShopDeliveryBindService), 1, TimeUnit.SECONDS);
  568. } else if (PaymentTypeEnum.ZHI_FU_BAO.type.equals(paymentType) && order.getPayAmount().compareTo(BigDecimal.ZERO) > 0) {
  569. // PC加小费
  570. if (createType != null && createType == 1) {
  571. resp = getPaymentQRCode(tipAmount, orderTip.getChildOrderNo(), PaymentTypeEnum.ZHI_FU_BAO.type);
  572. } else {
  573. // APP加小费
  574. order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
  575. resp = aliPayService.pay(orderTip.getChildOrderNo(), tipAmount.toString(), order.getOrderSn());
  576. }
  577. } else if (PaymentTypeEnum.WEI_XIN.type.equals(paymentType) && order.getPayAmount().compareTo(BigDecimal.ZERO) > 0) {
  578. // PC加小费
  579. if (createType != null && createType == 1) {
  580. resp = getPaymentQRCode(tipAmount, orderTip.getChildOrderNo(), PaymentTypeEnum.WEI_XIN.type);
  581. } else {
  582. // APP加小费
  583. order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
  584. OrderPaySignResponse.WechatPayParam respon = null;
  585. try {
  586. respon = wechatPayService.pay(tipAmount, orderTip.getChildOrderNo(), orderTip.getChildOrderNo(), TradeType.APP);
  587. } catch (WxPayException e) {
  588. // e.printStackTrace();
  589. }
  590. resp = JSONObject.toJSONString(respon);
  591. }
  592. }
  593. }
  594. return resp;
  595. }
  596. @Override
  597. public OrderMarkerDto oneKeyMarker(Long loginId) {
  598. List<Long> shopIds = new ArrayList<>();
  599. Member member = iMemberService.getById(loginId);
  600. if (member.getMemberType().equals(MemberTypeEnum.SHOP.type)) {
  601. shopIds.add(member.getShopId());
  602. }
  603. if (member.getMemberType().equals(MemberTypeEnum.MERCHANT.type)) {
  604. shopIds = iShopService.getShopByMerchantId(member.getMerchantId(), null);
  605. }
  606. OrderMarkerDto dto = new OrderMarkerDto();
  607. List<OrderDetailDto> list = iOrderService.findOneKeyList(member.getId(), null, null, null, null, shopIds, null, null, null);
  608. List<OrderDetailDto> toBeBillNum = list.stream().filter((OrderDetailDto detailDto) -> DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status.equals(detailDto.getDeliveryStatus())
  609. && detailDto.getWmstatus() != null && !DeliveryStatusEnum.FINISH.status.equals(detailDto.getWmstatus())
  610. && !TakeTypeEnum.APPOINTMENT.type.equals(detailDto.getTakeType())).collect(Collectors.toList());
  611. List<OrderDetailDto> appointNum = list.stream().filter((OrderDetailDto detailDto) -> DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status.equals(detailDto.getDeliveryStatus())
  612. && detailDto.getWmstatus() != null && !DeliveryStatusEnum.FINISH.status.equals(detailDto.getWmstatus())
  613. && TakeTypeEnum.APPOINTMENT.type.equals(detailDto.getTakeType())).collect(Collectors.toList());
  614. List<OrderDetailDto> completedNum = list.stream().filter((OrderDetailDto detailDto) -> DeliveryStatusEnum.FINISH.status.equals(detailDto.getDeliveryStatus()) || DeliveryStatusEnum.FINISH.status.equals(detailDto.getWmstatus())).collect(Collectors.toList());
  615. List<OrderDetailDto> cancelNum = list.stream().filter((OrderDetailDto detailDto) -> DeliveryStatusEnum.CANCEL.status.equals(detailDto.getDeliveryStatus()) && detailDto.getWmstatus() != null && !DeliveryStatusEnum.FINISH.status.equals(detailDto.getWmstatus())).collect(Collectors.toList());
  616. List<OrderDetailDto> inDeliveryNum = list.stream().filter((OrderDetailDto detailDto) -> DeliveryStatusEnum.IN_DELIVERY.status.equals(detailDto.getDeliveryStatus()) && detailDto.getWmstatus() != null && !DeliveryStatusEnum.FINISH.status.equals(detailDto.getWmstatus())).collect(Collectors.toList());
  617. List<OrderDetailDto> toBePickedNum = list.stream().filter((OrderDetailDto detailDto) -> DeliveryStatusEnum.TO_BE_DELIVERED.status.equals(detailDto.getDeliveryStatus()) && detailDto.getWmstatus() != null && !DeliveryStatusEnum.FINISH.status.equals(detailDto.getWmstatus())).collect(Collectors.toList());
  618. List<OrderDetailDto> toBeReceivedNum = list.stream().filter((OrderDetailDto detailDto) -> DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status.equals(detailDto.getDeliveryStatus()) && detailDto.getWmstatus() != null && !DeliveryStatusEnum.FINISH.status.equals(detailDto.getWmstatus())).collect(Collectors.toList());
  619. List<OrderDetailDto> exceptionNum = list.stream().filter((OrderDetailDto detailDto) -> DeliveryStatusEnum.ABNORMAL.status.equals(detailDto.getDeliveryStatus()) && detailDto.getWmstatus() != null && !DeliveryStatusEnum.FINISH.status.equals(detailDto.getWmstatus())).collect(Collectors.toList());
  620. dto.setToBeBillNum(toBeBillNum.size());
  621. dto.setCompletedNum(completedNum.size());
  622. dto.setCancelNum(cancelNum.size());
  623. dto.setInDeliveryNum(inDeliveryNum.size());
  624. dto.setToBePickedNum(toBePickedNum.size());
  625. dto.setToBeReceivedNum(toBeReceivedNum.size());
  626. dto.setAppointNum(appointNum.size());
  627. dto.setExceptionNum(exceptionNum.size());
  628. return dto;
  629. }
  630. @Override
  631. public List<OrderDetailDto> findOneKeyList(List<Long> shopIds, Integer status, String searchKey, Integer waimaiId, Integer shopId, Member member, String startDate, String endDate, String version) {
  632. List<OrderDetailDto> list = iOrderService.findOneKeyList(member.getId(), status, searchKey, waimaiId, shopId, shopIds, startDate, endDate, version);
  633. if (CollectionUtils.isNotEmpty(list)) {
  634. for (OrderDetailDto dto : list) {
  635. // version没有就是老版本
  636. if (StringUtils.isEmpty(version)) {
  637. if (dto.getDeliveryStatus().equals(DeliveryStatusEnum.ABNORMAL.status)) {
  638. dto.setDeliveryStatus(DeliveryStatusEnum.CANCEL.status);
  639. }
  640. }
  641. // 设置门牌号,兼容app改版、老版本
  642. if (StringUtils.isNotBlank(dto.getSendStreet()) && StringUtils.isNotBlank(dto.getSendAddress()) && !dto.getSendAddress().endsWith(dto.getSendStreet())) {
  643. dto.setSendAddress(dto.getSendAddress() + dto.getSendStreet());
  644. }
  645. if (StringUtils.isNotBlank(dto.getReceiptStreet()) && StringUtils.isNotBlank(dto.getReceiptAddress()) && !dto.getReceiptAddress().endsWith(dto.getReceiptStreet())) {
  646. dto.setReceiptAddress(dto.getReceiptAddress() + dto.getReceiptStreet());
  647. }
  648. /* List<OrderLog> logs = iOrderLogService.list(new QueryWrapper<OrderLog>().eq("order_status", DeliveryStatusEnum.IN_DELIVERY.status).eq("order_id", dto.getId()));
  649. if (!org.springframework.util.CollectionUtils.isEmpty(logs)) {
  650. dto.setTakeTime(logs.get(0).getCreateTime());
  651. }*/
  652. DspWaimai waimai = iDspWaimaiService.getById(dto.getWaimaiId());
  653. dto.setWaimaiLogo(waimai.getLogo());
  654. //查询商品详情
  655. // List<WaimaiOrderDetail> details = iWaimaiOrderDetailService.findList(dto.getWaimaiOrderId());
  656. // dto.setList(details);
  657. // dto.setIsMoRen(1);
  658. // // 判断是否是商家默认门店
  659. // if (dto.getShopId() == null || !dto.getShopId().equals(member.getShopId())) {
  660. // dto.setIsMoRen(0);
  661. // }
  662. // 门店名称
  663. if (dto.getShopId() != null && StringUtils.isNull(dto.getShopName())) {
  664. Shop shop = iShopService.getById(dto.getShopId());
  665. if (shop != null) {
  666. dto.setShopName(shop.getName());
  667. }
  668. }
  669. }
  670. } else {
  671. list = new ArrayList<>();
  672. }
  673. Long merchant = null;
  674. if (member.getMemberType().equals(MemberTypeEnum.MERCHANT.type)) {
  675. merchant = member.getMerchantId();
  676. }
  677. if (member != null && member.getShopId() != null && merchant == null && redisTemplate.hasKey("shop" + member.getShopId() + "")) {
  678. // if (member != null && member.getShopId() != null && redisTemplate.hasKey(member.getShopId() + "")) {
  679. Long size = redisTemplate.opsForList().size("shop" + member.getShopId() + "");
  680. log.info("外卖新订单数量:" + size);
  681. for (int i = 0; i < size.intValue(); i++) {
  682. redisTemplate.opsForList().rightPop("shop" + member.getShopId() + "");
  683. }
  684. }
  685. if (member != null && merchant != null && redisTemplate.hasKey("merchant" + member.getMerchantId() + "")) {
  686. // if (member != null && member.getShopId() != null && redisTemplate.hasKey(member.getShopId() + "")) {
  687. Long size = redisTemplate.opsForList().size("merchant" + member.getMerchantId() + "");
  688. log.info("商家外卖新订单数量:" + size);
  689. for (int i = 0; i < size.intValue(); i++) {
  690. redisTemplate.opsForList().rightPop("merchant" + member.getMerchantId() + "");
  691. }
  692. }
  693. // if (member != null && member.getShopId() != null && redisTemplate.hasKey(member.getShopId() + "")) {
  694. // Long size = redisTemplate.opsForList().size(member.getShopId() + "");
  695. // for (int i = 0; i < size.intValue(); i++) {
  696. // redisTemplate.opsForList().rightPop(member.getShopId() + "");
  697. // }
  698. // }
  699. return list;
  700. }
  701. @Override
  702. @Transactional(rollbackFor = Exception.class)
  703. public void ignore(Long loginId, Integer orderId) {
  704. Order order = iOrderService.getById(orderId);
  705. WaimaiOrder waimaiOrder = new WaimaiOrder();
  706. waimaiOrder.setId(order.getWaimaiOrderId());
  707. waimaiOrder.setStatus(DeliveryStatusEnum.FINISH.status);
  708. iWaimaiOrderService.updateById(waimaiOrder);
  709. }
  710. /**
  711. * 轮询拉取外面新订单
  712. *
  713. * @param loginId
  714. * @return
  715. */
  716. @Override
  717. public Map<String, Object> findNewList(Long loginId, List<Integer> orderIds, Integer status, String searchShopIdStr) {
  718. List<OrderDetailDto> list = new ArrayList<>();
  719. Member member = iMemberService.getById(loginId);
  720. if (Objects.isNull(member)) {
  721. throw new CustomAppException("用户不存在!");
  722. }
  723. Long shopId = member.getShopId();
  724. Long merchant = null;
  725. if (member.getMemberType().equals(MemberTypeEnum.MERCHANT.type)) {
  726. merchant = member.getMerchantId();
  727. }
  728. if(status == null || DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status.equals(status)
  729. || DeliveryStatusEnum.APPOINTMENT.status.equals(status)){
  730. String shopNewOrderListKey = "shop" + shopId + "";
  731. if (member.getShopId() != null && merchant == null && redisCache.hasKey(shopNewOrderListKey)) {
  732. Long size = redisCache.getListSize(shopNewOrderListKey);
  733. log.info("外卖新订单数量:" + size);
  734. for (int i = 0; i < size.intValue(); i++) {
  735. list.add((OrderDetailDto) redisCache.rPop(shopNewOrderListKey));
  736. }
  737. }
  738. String merchantNewOrderListKey = "merchant" + merchant + "";
  739. if (merchant != null && redisCache.hasKey(merchantNewOrderListKey)) {
  740. Long size = redisCache.getListSize(merchantNewOrderListKey);
  741. log.info("商家外卖新订单数量:" + size);
  742. for (int i = 0; i < size.intValue(); i++) {
  743. list.add((OrderDetailDto) redisCache.rPop(merchantNewOrderListKey));
  744. }
  745. }
  746. } else if (DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status.equals(status)){
  747. String shopReceivedOrderListKey = "shop_received" + shopId + "";
  748. if (shopId != null && merchant == null && redisCache.hasKey(shopReceivedOrderListKey)) {
  749. Long size = redisCache.getListSize(shopReceivedOrderListKey);
  750. log.info("外卖待接单数量:" + size);
  751. for (int i = 0; i < size.intValue(); i++) {
  752. list.add((OrderDetailDto) redisCache.rPop(shopReceivedOrderListKey));
  753. }
  754. }
  755. String merchantReceivedOrderListKey = "merchant_received" + merchant + "";
  756. if (merchant != null && redisCache.hasKey(merchantReceivedOrderListKey)) {
  757. Long size = redisCache.getListSize(merchantReceivedOrderListKey);
  758. log.info("商家待接单数量:" + size);
  759. for (int i = 0; i < size.intValue(); i++) {
  760. list.add((OrderDetailDto) redisCache.rPop(merchantReceivedOrderListKey));
  761. }
  762. }
  763. }
  764. // 过滤已选门店的订单
  765. if (StringUtils.isNotEmpty(searchShopIdStr)) {
  766. List<Long> searchShopIds = Lists.newArrayList();
  767. String[] split = searchShopIdStr.split(",");
  768. for (String item : split) {
  769. searchShopIds.add(Long.valueOf(item));
  770. }
  771. if (CollectionUtils.isNotEmpty(searchShopIds) && CollectionUtils.isNotEmpty(list)) {
  772. list = list.stream().filter(item -> searchShopIds.contains(item.getShopId())).collect(Collectors.toList());
  773. }
  774. }
  775. Map<String, Object> map = new HashMap<>();
  776. List<Long> ids = new ArrayList<>();
  777. if (CollectionUtils.isNotEmpty(orderIds)) {
  778. if(DeliveryStatusEnum.APPOINTMENT.status.equals(status)){
  779. status = DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status;
  780. }
  781. List<Order> orderList = iOrderService.list(new QueryWrapper<Order>().in("id", orderIds).ne("delivery_status", status));
  782. ids = orderList.stream().map(Order::getId).collect(Collectors.toList());
  783. // 待接单状态下缓存过滤
  784. list = list.stream().filter(item -> !orderIds.contains(item.getId().intValue())).collect(Collectors.toList());
  785. }
  786. map.put("newList", list);
  787. map.put("deliveryList", ids);
  788. return map;
  789. }
  790. private void transResObejct(ValuationRes res, DeliveryInfo delivery, ResObject<OrderResultVo> resObject, OrderReq orderReq, OrderVo orderVo) {
  791. res.setDeliveryId(delivery.getId());
  792. res.setName(delivery.getName());
  793. res.setLogo(delivery.getLogo());
  794. res.setDesc(CommonUtils.change2Km((int) resObject.getData().getDistance()));
  795. res.setDeliveryAmount(resObject.getData().getDeliverFee());
  796. res.setIsEnough(StatusEnum.STOP.status);
  797. res.setTotalMoney(resObject.getData().getTotalMoney());
  798. res.setNeedPaymoney(resObject.getData().getNeedPaymoney());
  799. res.setPriceToken(resObject.getData().getPriceToken());
  800. //res.setDeliveryInfo(delivery);
  801. res.setOrderSn(orderReq.getOrderSn());
  802. res.setIsMine(orderVo.getIsMine());
  803. res.setOrderNo(orderReq.getOrderNo());
  804. res.setCityId(resObject.getData().getCityId());
  805. res.setCityInfoRevision(resObject.getData().getCityInfoRevision());
  806. res.setOrderVehicleId(resObject.getData().getOrderVehicleId());
  807. res.setTotalPriceFen(resObject.getData().getHllAmount());
  808. res.setOrderNumber(resObject.getData().getDeliveryOrderNo());//闪送订单号
  809. res.setShopId(delivery.getShopId());
  810. res.setThirdShopId(delivery.getThirdShopId());
  811. res.setAuthToken(delivery.getAuthToken());
  812. res.setPhone(delivery.getPhone());
  813. res.setDeliveryType(delivery.getType());
  814. }
  815. @Override
  816. public boolean setDeliveryTime(Long loginId, Long orderId, String delayTime, Integer delayTimeType) {
  817. Order order = iOrderService.getById(orderId);
  818. boolean result = false;
  819. String orderkey=orderId+"_0";
  820. if (order != null) {
  821. OrderDelay orderDelay = iOrderDelayService.getOne(new QueryWrapper<OrderDelay>().eq("order_id", orderId));
  822. if (orderDelay != null) {
  823. orderDelay.setModifyNum(orderDelay.getModifyNum() + 1);
  824. if (delayTimeType == null || delayTimeType == 0) {
  825. orderDelay.setDelayTime(new BigDecimal(delayTime));
  826. } else {
  827. orderDelay.setDelayTimeMinute(Integer.valueOf(delayTime));
  828. }
  829. result = iOrderDelayService.updateById(orderDelay);
  830. orderkey = orderId+"_"+orderDelay.getModifyNum();
  831. } else {
  832. orderDelay = new OrderDelay();
  833. if (delayTimeType == null || delayTimeType == 0) {
  834. orderDelay.setDelayTime(new BigDecimal(delayTime));
  835. } else {
  836. orderDelay.setDelayTimeMinute(Integer.valueOf(delayTime));
  837. }
  838. orderDelay.setCreateTime(new Date());
  839. orderDelay.setOrderId(orderId);
  840. result = iOrderDelayService.save(orderDelay);
  841. }
  842. if (result&&order.getWaimaiOrderId()!=null) {
  843. WaimaiOrder waimaiOrder = iWaimaiOrderService.getById(order.getWaimaiOrderId());
  844. long deliveryTime =waimaiOrder.getDeliveryTime()* 1000L;
  845. Date exceptTime;
  846. if (delayTimeType == null || delayTimeType == 0) {
  847. exceptTime = com.ydd.third.common.utils.DateUtils.addDateMinutes(new Date(deliveryTime),- new BigDecimal(delayTime).multiply(new BigDecimal("60")).intValue());
  848. } else {
  849. exceptTime = com.ydd.third.common.utils.DateUtils.addDateMinutes(new Date(deliveryTime), - Integer.parseInt(delayTime));
  850. }
  851. long diff = exceptTime.getTime()-new Date().getTime();
  852. //int delay = new BigDecimal(delayTime).multiply(new BigDecimal("3600")).multiply(new BigDecimal("1000")).intValue();
  853. if(diff>=0){
  854. log.info("延时发送时间"+diff);
  855. rabbitSender.sendDelay(orderkey, "delay.waimai", (int) diff);
  856. }
  857. }
  858. }
  859. return result;
  860. }
  861. @Override
  862. @Transactional(rollbackFor = Exception.class)
  863. public void cancelTimingPublish(Long orderId) {
  864. Order order = iOrderService.getOne(new QueryWrapper<Order>().eq("id", orderId));
  865. if (Objects.isNull(order)) {
  866. throw new CustomException("订单不存在!");
  867. }
  868. if (!DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(order.getDeliveryStatus())) {
  869. throw new CustomException("只有待发单状态才可以取消定时发单!");
  870. }
  871. if (order.getAutoDeliveryMinutes() != null && order.getAutoDeliveryMinutes() != 0) {
  872. iOrderService.update(new UpdateWrapper<Order>()
  873. .set("auto_delivery_minutes", 0)
  874. .eq("id", orderId));
  875. }
  876. iOrderDelayService.update(new UpdateWrapper<OrderDelay>()
  877. .set("deleted", 1)
  878. .eq("order_id", orderId));
  879. }
  880. @Override
  881. public PageResult getOrderList(OrderListRequest request) {
  882. Member member = iMemberService.getById(request.getMemberId());
  883. if (Objects.isNull(member)) {
  884. throw new CustomException("用户不存在!");
  885. }
  886. // 缓存搜索记录
  887. this.cacheSearchWord(request);
  888. // 处理查询条件
  889. this.handleSearchCondition(request, member);
  890. Page<OrderListDto> page = iOrderService.getOrderList(request, new Page<>(request.getPageNum(), request.getPageSize()));
  891. List<OrderListDto> list = page.getRecords();
  892. // 获取订单日志信息
  893. Map<Long, List<OrderLog>> orderLogMap = new HashMap<>();
  894. // 获取订单延迟发单信息
  895. Map<Long, List<OrderDelay>> orderDelayMap = new HashMap<>();
  896. if (CollectionUtils.isNotEmpty(list)){
  897. List<Long> orderIds = list.stream().map(OrderListDto::getId).collect(Collectors.toList());
  898. List<OrderLog> orderLogs = iOrderLogService.getOrderLogByOrderIds(orderIds);
  899. orderLogMap = orderLogs.stream().collect(Collectors.groupingBy(OrderLog::getOrderId));
  900. orderDelayMap = iOrderDelayService.list(new QueryWrapper<OrderDelay>()
  901. .in("order_id", orderIds)
  902. .eq("deleted", 0)).stream().collect(Collectors.groupingBy(OrderDelay::getOrderId));
  903. }
  904. // 获取外卖商品的种类以及总件数
  905. List<Long> waimaiOrderIds = list.stream().map(OrderListDto::getWaimaiOrderId).collect(Collectors.toList());
  906. Map<Long, List<WaimaiOrderDetail>> orderDetailMap = new HashMap<>();
  907. if (CollectionUtils.isNotEmpty(waimaiOrderIds)) {
  908. orderDetailMap = iWaimaiOrderDetailService.list(new QueryWrapper<WaimaiOrderDetail>()
  909. .in("waimai_order_id", waimaiOrderIds)
  910. .eq("deleted", 0))
  911. .stream()
  912. .collect(Collectors.groupingBy(WaimaiOrderDetail::getWaimaiOrderId));
  913. }
  914. // 获取外卖门店
  915. List<Long> shopIds = list.stream().filter(item -> item.getShopId() != null).map(OrderListDto::getShopId).collect(Collectors.toList());
  916. Map<String, List<ShopWaimai>> shopWaiMaiMap = new HashMap<>();
  917. if (CollectionUtils.isNotEmpty(shopIds)) {
  918. shopWaiMaiMap = iShopWaimaiService.list(new QueryWrapper<ShopWaimai>()
  919. .in("shop_id", shopIds)
  920. .eq("bind_status", 1)
  921. .eq("deleted", 0))
  922. .stream()
  923. .collect(Collectors.groupingBy(item -> item.getShopId() + "-" + item.getWaimaiId()));
  924. }
  925. // 待接单状态下获取运力
  926. Map<String, List<OrderDelivery>> deliveryMap = new HashMap<>();
  927. if ((request.getSearchType() != null && request.getSearchType() == 0 && request.getStatus() == OrderListRequest.OrderListSearchStatusEnum.ORDERS_TO_BE_RECEIVED)
  928. || (request.getSearchType() != null && request.getSearchType() == 1)
  929. || (request.getSearchType() != null && request.getSearchType() == 2 && request.getSearchStatusItem().isToBeReceivedOrder())) {
  930. List<String> orderSns = list.stream().filter(item -> item.getOrderSn() != null && item.getDeliveryStatus() == 1).map(OrderListDto::getOrderSn).collect(Collectors.toList());
  931. if (CollectionUtils.isNotEmpty(orderSns)) {
  932. deliveryMap = iOrderDeliveryService.list(new QueryWrapper<OrderDelivery>()
  933. .in("order_sn", orderSns)
  934. .eq("deleted", 0))
  935. .stream()
  936. .collect(Collectors.groupingBy(OrderDelivery::getOrderSn));
  937. }
  938. }
  939. for (OrderListDto dto : list) {
  940. if (dto.getWaimaiOrderId() != null) {
  941. DspWaimai waiMai = iDspWaimaiService.getById(dto.getWaimaiId());
  942. dto.setLogo(Objects.isNull(waiMai) ? "" : waiMai.getLogo());
  943. } else if (dto.getPlatformType() != 0) {
  944. // 手动发外卖单
  945. String logo = iDspWaimaiService.selectLogoByType(dto.getPlatformType());
  946. dto.setLogo(logo);
  947. } else {
  948. dto.setLogo(AppConstant.LIE_BAO_LOGO);
  949. }
  950. if (dto.getShopId() != null && StringUtils.isNull(dto.getShopName())) {
  951. Shop shop = iShopService.getById(dto.getShopId());
  952. dto.setShopName(Objects.isNull(shop) ? "" : shop.getName());
  953. }
  954. // 设置运力logo
  955. if (deliveryMap != null && CollectionUtils.isNotEmpty(deliveryMap.get(dto.getOrderSn()))) {
  956. List<OrderDelivery> orderDeliveries = deliveryMap.get(dto.getOrderSn());
  957. List<String> logos = orderDeliveries.stream().map(OrderDelivery::getDeliveryLogo).collect(Collectors.toList());
  958. dto.setDeliveryLogos(logos);
  959. }
  960. // 设置外卖门店名称
  961. if (shopWaiMaiMap != null && shopWaiMaiMap.size() > 0 && dto.getShopId() != null && dto.getWaimaiId() != null) {
  962. List<ShopWaimai> shopWaimais = shopWaiMaiMap.get(dto.getShopId() + "-" + dto.getWaimaiId());
  963. if (CollectionUtils.isNotEmpty(shopWaimais) && shopWaimais.get(0) != null) {
  964. dto.setWaimaiShopName(shopWaimais.get(0).getThirdShopName());
  965. }
  966. }
  967. // 设置外卖订单件数
  968. if (orderDetailMap != null && CollectionUtils.isNotEmpty(orderDetailMap.get(dto.getWaimaiOrderId()))){
  969. List<WaimaiOrderDetail> orderDetailList = orderDetailMap.get(dto.getWaimaiOrderId());
  970. long totalNum = orderDetailList.stream().mapToLong(WaimaiOrderDetail::getQuantity).sum();
  971. dto.setSkuNum(orderDetailList.size());
  972. dto.setTotalNum(totalNum);
  973. }
  974. // 计算外卖单用户期望送达时间
  975. if (dto.getWmDeliveryTime() != null && dto.getWmDeliveryTime() != 0) {
  976. dto.setExceptTime(new Date(dto.getWmDeliveryTime() * 1000L));
  977. }
  978. // 设置相关操作时间
  979. if (orderLogMap.size() > 0) {
  980. this.setOrderTime(dto, orderLogMap);
  981. }
  982. // 设置发件详细地址(发单计价用)
  983. if (dto.getSendStreet() == null && dto.getSendAddressId() != null && DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(dto.getDeliveryStatus())) {
  984. MemberAddress memberAddress = iMemberAddressService.findById(request.getMemberId(), dto.getSendAddressId());
  985. dto.setSendStreet(memberAddress != null ? memberAddress.getStreet() : "");
  986. }
  987. // 设置收件详细地址(发单计价用)
  988. if (dto.getReceiptStreet() == null && dto.getReceiptAddressId() != null && DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(dto.getDeliveryStatus())) {
  989. MemberAddress memberAddress = iMemberAddressService.findById(request.getMemberId(), dto.getReceiptAddressId());
  990. dto.setReceiptStreet(memberAddress != null ? memberAddress.getStreet() : "");
  991. }
  992. OrderDelay orderDelay = null;
  993. if (orderDelayMap != null && CollectionUtils.isNotEmpty(orderDelayMap.get(dto.getId()))) {
  994. List<OrderDelay> orderDelays = orderDelayMap.get(dto.getId());
  995. if (CollectionUtils.isNotEmpty(orderDelays) && orderDelays.get(0) != null) {
  996. orderDelay = orderDelays.get(0);
  997. }
  998. }
  999. // 外卖预约单
  1000. if (dto.getTakeType() > 0 && dto.getWaimaiOrderId() != null) {
  1001. this.setDelayTime(orderDelay, dto, null);
  1002. }
  1003. // 设置按钮状态
  1004. dto.setButtonStatus(this.getButtonStatus(dto));
  1005. }
  1006. this.removeOrderCache(request.getStatus(), member.getShopId(), member.getMerchantId());
  1007. return new PageResult(page);
  1008. }
  1009. private void setDelayTime(OrderDelay orderDelay, OrderListDto listDto, OrderInfoDto infoDto) {
  1010. if (listDto != null) {
  1011. // 设置过下单快照
  1012. if (listDto.getAutoDeliveryMinutes() != null && listDto.getAutoDeliveryMinutes() != 0) {
  1013. listDto.setDelayMinutes(listDto.getAutoDeliveryMinutes());
  1014. listDto.setAutoDeliveryTime(new Date((listDto.getWmDeliveryTime() - (listDto.getDelayMinutes() * 60)) * 1000L));
  1015. }
  1016. // 设置过延迟发单
  1017. if (orderDelay != null) {
  1018. if (orderDelay.getDelayTime() != null) {
  1019. // 兼容pc老版本
  1020. listDto.setDelayTime(orderDelay.getDelayTime());
  1021. // 老版本设置的小时,转化为分钟
  1022. listDto.setDelayMinutes(orderDelay.getDelayTime().multiply(new BigDecimal(60)).intValue());
  1023. } else if (orderDelay.getDelayTimeMinute() != null && orderDelay.getDelayTimeMinute() != 0) {
  1024. // 新版本设置的延迟分钟
  1025. listDto.setDelayMinutes(orderDelay.getDelayTimeMinute());
  1026. }
  1027. listDto.setAutoDeliveryTime(new Date((listDto.getWmDeliveryTime() - (listDto.getDelayMinutes() * 60)) * 1000L));
  1028. return;
  1029. }
  1030. // 有总配置
  1031. MemberConfig memberConfig = iMemberConfigService.getShopMemberConfig(listDto.getShopId(), listDto.getMemberId());
  1032. if (memberConfig != null && memberConfig.getOpenBookingAutodelivery() != null && memberConfig.getOpenBookingAutodelivery() == 1
  1033. && memberConfig.getBookingAutodeliveryOrderTime() != null && memberConfig.getBookingAutodeliveryOrderTime() != 0) {
  1034. listDto.setDelayMinutes(memberConfig.getBookingAutodeliveryOrderTime() / 60);
  1035. return;
  1036. }
  1037. // 以上都不满足, 设置默认值
  1038. listDto.setDelayMinutes(AppConstant.AUTO_DELIVERY_ADVANCE_MINUTES);
  1039. }
  1040. if (infoDto != null) {
  1041. // 设置过下单快照
  1042. if (infoDto.getAutoDeliveryMinutes() != null && infoDto.getAutoDeliveryMinutes() != 0) {
  1043. infoDto.setDelayMinutes(infoDto.getAutoDeliveryMinutes());
  1044. infoDto.setAutoDeliveryTime(new Date((infoDto.getWmDeliveryTime() - (infoDto.getDelayMinutes() * 60)) * 1000L));
  1045. }
  1046. // 设置过延迟发单
  1047. if (orderDelay != null) {
  1048. if (orderDelay.getDelayTime() != null) {
  1049. // 老版本设置的小时,转化为分钟
  1050. infoDto.setDelayMinutes(orderDelay.getDelayTime().multiply(new BigDecimal(60)).intValue());
  1051. } else if (orderDelay.getDelayTimeMinute() != null && orderDelay.getDelayTimeMinute() != 0) {
  1052. // 新版本设置的延迟分钟
  1053. infoDto.setDelayMinutes(orderDelay.getDelayTimeMinute());
  1054. }
  1055. infoDto.setAutoDeliveryTime(new Date((infoDto.getWmDeliveryTime() - (infoDto.getDelayMinutes() * 60)) * 1000L));
  1056. return;
  1057. }
  1058. // 走总配置
  1059. MemberConfig memberConfig = iMemberConfigService.getShopMemberConfig(infoDto.getShopId(), infoDto.getMemberId());
  1060. if (memberConfig != null && memberConfig.getOpenBookingAutodelivery() != null && memberConfig.getOpenBookingAutodelivery() == 1
  1061. && memberConfig.getBookingAutodeliveryOrderTime() != null && memberConfig.getBookingAutodeliveryOrderTime() != 0) {
  1062. infoDto.setDelayMinutes(memberConfig.getBookingAutodeliveryOrderTime() / 60);
  1063. return;
  1064. }
  1065. // 以上都不满足, 设置默认值
  1066. infoDto.setDelayMinutes(AppConstant.AUTO_DELIVERY_ADVANCE_MINUTES);
  1067. }
  1068. }
  1069. private void cacheSearchWord(OrderListRequest request) {
  1070. try {
  1071. if (request.getSearchType() != null && StringUtils.isNotBlank(request.getSearchKey())) {
  1072. String key = RedisKeyConstant.ORDER_LIST_SEARCH + request.getMemberId();
  1073. List<OrderListSearchCacheDto> searchWordsCacheList = this.getSearchHistory(request.getMemberId());
  1074. OrderListSearchCacheDto searchCacheDto = OrderListSearchCacheDto.builder().searchKey(request.getSearchKey()).searchKeyType(request.getSearchKeyType()).build();
  1075. // 默认每个用户缓存10条不重复的搜索记录
  1076. if (redisCache.hasKey(key) && redisCache.zSetSize(key) >= 10 && !searchWordsCacheList.contains(searchCacheDto)) {
  1077. redisCache.zSetRemove(key, 0, 0);
  1078. }
  1079. redisCache.zSetAdd(key, searchCacheDto);
  1080. }
  1081. } catch (Exception e) {
  1082. log.error("添加订单搜索记录缓存失败!");
  1083. }
  1084. }
  1085. private void setOrderTime(OrderListDto dto, Map<Long, List<OrderLog>> orderLogMap) {
  1086. List<OrderLog> orderLogs = orderLogMap.get(dto.getId());
  1087. if (CollectionUtils.isNotEmpty(orderLogs)) {
  1088. // List<OrderLog> distinctList = orderLogs.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(OrderLog::getOrderId))), ArrayList::new));
  1089. List<OrderLog> toBeReceiveList = orderLogs.stream().filter(item -> DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status.equals(item.getOrderStatus())).sorted(Comparator.comparing(OrderLog::getCreateTime)).collect(Collectors.toList());
  1090. List<OrderLog> toBeDeliveredList = orderLogs.stream().filter(item -> DeliveryStatusEnum.TO_BE_DELIVERED.status.equals(item.getOrderStatus())).sorted(Comparator.comparing(OrderLog::getCreateTime)).collect(Collectors.toList());
  1091. List<OrderLog> cancelList = orderLogs.stream().filter(item -> DeliveryStatusEnum.CANCEL.status.equals(item.getOrderStatus()) || DeliveryStatusEnum.ABNORMAL.status.equals(item.getOrderStatus())).collect(Collectors.toList());
  1092. List<OrderLog> finishList = orderLogs.stream().filter(item -> DeliveryStatusEnum.FINISH.status.equals(item.getOrderStatus())).collect(Collectors.toList());
  1093. List<OrderLog> inDeliveredList = orderLogs.stream().filter(item -> DeliveryStatusEnum.IN_DELIVERY.status.equals(item.getOrderStatus())).sorted(Comparator.comparing(OrderLog::getCreateTime)).collect(Collectors.toList());
  1094. // 发单时间
  1095. dto.setSendTime(CollectionUtils.isNotEmpty(toBeReceiveList) ? toBeReceiveList.get(0).getCreateTime() : null);
  1096. // 取消时间
  1097. dto.setCancelTime(CollectionUtils.isNotEmpty(cancelList) ? cancelList.get(0).getCreateTime() : null);
  1098. // 完成时间
  1099. dto.setFinishTime(CollectionUtils.isNotEmpty(finishList) ? finishList.get(0).getCreateTime() : null);
  1100. // 骑手接单时间
  1101. dto.setShipperReceiveTime(CollectionUtils.isEmpty(toBeDeliveredList) ? null : toBeDeliveredList.get(0).getCreateTime());
  1102. // 骑手取货时间
  1103. dto.setShipperTakeTime(CollectionUtils.isEmpty(inDeliveredList) ? null : inDeliveredList.get(0).getCreateTime());
  1104. }
  1105. }
  1106. /**
  1107. * 清除订单缓存
  1108. */
  1109. private void removeOrderCache(Integer status, Long shopId, Long merchantId) {
  1110. // 新订单、预约单
  1111. if (DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(status)
  1112. || DeliveryStatusEnum.APPOINTMENT.getStatus().equals(status)) {
  1113. String shopNewOrderListKey = "shop" + shopId + "";
  1114. if (shopId != null && merchantId == null && redisCache.hasKey(shopNewOrderListKey)) {
  1115. Long size = redisCache.getListSize(shopNewOrderListKey);
  1116. log.info("外卖新订单数量:" + size);
  1117. for (int i = 0; i < size.intValue(); i++) {
  1118. redisCache.rPop(shopNewOrderListKey);
  1119. }
  1120. }
  1121. String merchantNewOrderListKey = "merchant" + merchantId + "";
  1122. if (merchantId != null && redisCache.hasKey(merchantNewOrderListKey)) {
  1123. Long size = redisCache.getListSize(merchantNewOrderListKey);
  1124. log.info("商家外卖新订单数量:" + size);
  1125. for (int i = 0; i < size.intValue(); i++) {
  1126. redisCache.rPop(merchantNewOrderListKey);
  1127. }
  1128. }
  1129. }
  1130. // 待接单
  1131. if (DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.getStatus().equals(status)) {
  1132. String shopReceivedOrderListKey = "shop_received" + shopId + "";
  1133. if (shopId != null && merchantId == null && redisCache.hasKey(shopReceivedOrderListKey)) {
  1134. Long size = redisCache.getListSize(shopReceivedOrderListKey);
  1135. log.info("外卖待接单数量:" + size);
  1136. for (int i = 0; i < size.intValue(); i++) {
  1137. redisCache.rPop(shopReceivedOrderListKey);
  1138. }
  1139. }
  1140. String merchantReceivedOrderListKey = "merchant_received" + merchantId + "";
  1141. if (merchantId != null && redisCache.hasKey(merchantReceivedOrderListKey)) {
  1142. Long size = redisCache.getListSize(merchantReceivedOrderListKey);
  1143. log.info("商家待接单数量:" + size);
  1144. for (int i = 0; i < size.intValue(); i++) {
  1145. redisCache.rPop(merchantReceivedOrderListKey);
  1146. }
  1147. }
  1148. }
  1149. }
  1150. private Integer getButtonStatus(OrderListDto item) {
  1151. if (DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(item.getDeliveryStatus())
  1152. && item.getWmstatus() != null && item.getWmstatus() != 4
  1153. && item.getTakeType()!= null && TakeTypeEnum.NOW.getType().equals(item.getTakeType())) {
  1154. // 新订单
  1155. return 0;
  1156. } else if (DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(item.getDeliveryStatus())
  1157. && item.getTakeType() != null && !TakeTypeEnum.NOW.getType().equals(item.getTakeType())
  1158. && (item.getWaimaiOrderId() == null || (item.getWaimaiOrderId() != null && item.getWmstatus() != null && item.getWmstatus() != 4))) {
  1159. // 预约单
  1160. return 10;
  1161. } else if ((item.getWaimaiOrderId() == null && DeliveryStatusEnum.ABNORMAL.getStatus().equals(item.getDeliveryStatus()))
  1162. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.ABNORMAL.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != null && item.getWmstatus() != 4)) {
  1163. // 异常单
  1164. return -2;
  1165. } else if ((item.getWaimaiOrderId() == null && DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.getStatus().equals(item.getDeliveryStatus()))
  1166. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != null && item.getWmstatus() != 4)) {
  1167. // 待接单
  1168. return 1;
  1169. } else if ((item.getWaimaiOrderId() == null && DeliveryStatusEnum.TO_BE_DELIVERED.getStatus().equals(item.getDeliveryStatus()))
  1170. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.TO_BE_DELIVERED.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != null && item.getWmstatus() != 4)) {
  1171. // 取货中
  1172. return 2;
  1173. } else if ((item.getWaimaiOrderId() == null && DeliveryStatusEnum.IN_DELIVERY.getStatus().equals(item.getDeliveryStatus()))
  1174. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.IN_DELIVERY.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != null && item.getWmstatus() != 4)) {
  1175. // 配送中
  1176. return 3;
  1177. } else if (item.getWaimaiOrderId() == null && DeliveryStatusEnum.CANCEL.getStatus().equals(item.getDeliveryStatus())
  1178. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.CANCEL.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != 4)) {
  1179. // 已取消
  1180. return -1;
  1181. } else if (DeliveryStatusEnum.FINISH.getStatus().equals(item.getDeliveryStatus())) {
  1182. // 本平台完成
  1183. return 97;
  1184. } else if (item.getWaimaiOrderId() != null && item.getWmstatus() == 4 && !DeliveryStatusEnum.FINISH.getStatus().equals(item.getDeliveryStatus())) {
  1185. // 其他平台完成
  1186. return 98;
  1187. }
  1188. return null;
  1189. }
  1190. private void handleSearchCondition(OrderListRequest request, Member member) {
  1191. List<Long> shopIds = Lists.newArrayList();
  1192. request.setMemberType(member.getMemberType());
  1193. if (MemberTypeEnum.SHOP.type.equals(member.getMemberType())) {
  1194. shopIds.add(member.getShopId());
  1195. } else if (MemberTypeEnum.MERCHANT.type.equals(member.getMemberType())) {
  1196. shopIds = iShopService.getShopByMerchantId(member.getMerchantId(), null);
  1197. }
  1198. // 门店查询
  1199. List<Long> searchShopIds = Lists.newArrayList();
  1200. String searchShopIdStr = request.getSearchShopIdStr();
  1201. if (StringUtils.isNotEmpty(searchShopIdStr)) {
  1202. String[] split = searchShopIdStr.split(",");
  1203. for (String shopId : split) {
  1204. searchShopIds.add(Long.valueOf(shopId));
  1205. }
  1206. }
  1207. if (CollectionUtils.isNotEmpty(shopIds) && CollectionUtils.isNotEmpty(searchShopIds)) {
  1208. shopIds.retainAll(searchShopIds);
  1209. }
  1210. request.setShopIds(shopIds);
  1211. // 处理日期
  1212. if (StringUtils.isNotEmpty(request.getStartDate())) {
  1213. String startDateBeginTime = DateUtils.parseToBeginTime(request.getStartDate());
  1214. request.setStartDate(startDateBeginTime);
  1215. }
  1216. if (StringUtils.isNotEmpty(request.getEndDate())) {
  1217. String tomorrowBeginTime = DateUtils.parseToTomorrowBeginTime(request.getEndDate());
  1218. request.setEndDate(tomorrowBeginTime);
  1219. }
  1220. String lastDayTime = DateUtils.addDaysToTimeStr(new Date(), -3, DateUtils.yyyyMMdd000000);
  1221. // 非个人用户,近三日是否有进行中的个人订单(即申请成为商家前的订单)
  1222. if (!MemberTypeEnum.PERSON.type.equals(member.getMemberType())) {
  1223. Integer count = iOrderService.countPersonalOrder(lastDayTime, member.getId());
  1224. request.setHasPersonalOrder(count != null && count > 0);
  1225. }
  1226. log.info("用户类型: {}, memberId: {}, 个人订单数量: {}", member.getMemberType(), member.getId(), request.isHasPersonalOrder());
  1227. // 订单列表已取消状态,只查询近三天,
  1228. if (request.getSearchType() == 0 && request.getStatus() == -1) {
  1229. request.setCancelTime(lastDayTime);
  1230. }
  1231. // 近三日订单
  1232. if (request.getSearchType() == 0 && request.getStatus() == OrderListRequest.OrderListSearchStatusEnum.LAST_THREE_DAYS) {
  1233. request.setLastDayTime(lastDayTime);
  1234. }
  1235. // 近七日订单(完成/取消)
  1236. if (request.getSearchType() == 0 && request.getStatus() == OrderListRequest.OrderListSearchStatusEnum.LAST_SEVEN_FINISH_OR_CANCEL) {
  1237. lastDayTime = DateUtils.addDaysToTimeStr(new Date(), -7, DateUtils.yyyyMMdd000000);
  1238. request.setLastDayTime(lastDayTime);
  1239. }
  1240. // APP历史订单查询, 状态检索
  1241. List<Integer> searchStatusList = Lists.newArrayList();
  1242. String searchStatusStr = request.getSearchStatusStr();
  1243. if (request.getSearchType() != null && request.getSearchType() == 2) {
  1244. // 查询日期默认90天
  1245. if (StringUtils.isEmpty(request.getStartDate()) || StringUtils.isEmpty(request.getEndDate())) {
  1246. String startDateBeginTime = DateUtils.parseToBeginTime(DateUtils.addDaysToTimeStr(new Date(), -90, DateUtils.YYYY_MM_DD));
  1247. request.setStartDate(startDateBeginTime);
  1248. String endDateBeginTime = DateUtils.parseToTomorrowBeginTime(DateUtils.dateTime(new Date()));
  1249. request.setEndDate(endDateBeginTime);
  1250. }
  1251. OrderListRequest.SearchStatusItem searchStatusItem = new OrderListRequest.SearchStatusItem();
  1252. if (StringUtils.isNotEmpty(searchStatusStr)) {
  1253. String[] split = searchStatusStr.split(",");
  1254. for (String status : split) {
  1255. searchStatusList.add(Integer.valueOf(status));
  1256. }
  1257. if (CollectionUtils.isNotEmpty(searchStatusList)) {
  1258. searchStatusItem.setNewOrder(searchStatusList.contains(OrderListRequest.OrderListSearchStatusEnum.NEW_ORDER));
  1259. searchStatusItem.setBookingOrder(searchStatusList.contains(OrderListRequest.OrderListSearchStatusEnum.BOOKING_ORDER));
  1260. searchStatusItem.setToBeReceivedOrder(searchStatusList.contains(OrderListRequest.OrderListSearchStatusEnum.ORDERS_TO_BE_RECEIVED));
  1261. searchStatusItem.setToBeDeliveredOrder(searchStatusList.contains(OrderListRequest.OrderListSearchStatusEnum.TO_BE_DELIVERED));
  1262. searchStatusItem.setInDeliveryOrder(searchStatusList.contains(OrderListRequest.OrderListSearchStatusEnum.IN_DELIVERY));
  1263. searchStatusItem.setAbnormalOrder(searchStatusList.contains(OrderListRequest.OrderListSearchStatusEnum.ABNORMAL));
  1264. searchStatusItem.setFinishOrder(searchStatusList.contains(OrderListRequest.OrderListSearchStatusEnum.FINISH));
  1265. searchStatusItem.setCancelOrder(searchStatusList.contains(OrderListRequest.OrderListSearchStatusEnum.CANCEL));
  1266. }
  1267. } else {
  1268. searchStatusItem.setNewOrder(true);
  1269. searchStatusItem.setBookingOrder(true);
  1270. searchStatusItem.setToBeReceivedOrder(true);
  1271. searchStatusItem.setToBeDeliveredOrder(true);
  1272. searchStatusItem.setInDeliveryOrder(true);
  1273. searchStatusItem.setAbnormalOrder(true);
  1274. searchStatusItem.setFinishOrder(true);
  1275. searchStatusItem.setCancelOrder(true);
  1276. }
  1277. request.setSearchStatusItem(searchStatusItem);
  1278. }
  1279. }
  1280. @Override
  1281. public OrderTrackDto getOrderTrack(Long orderId) {
  1282. Order order = iOrderService.getById(orderId);
  1283. if (Objects.isNull(order)) {
  1284. log.error("订单不存在, orderId: {}", orderId);
  1285. throw new CustomException("订单不存在!");
  1286. }
  1287. OrderTrackDto orderTrackDto = new OrderTrackDto();
  1288. BeanUtils.copyProperties(order, orderTrackDto);
  1289. orderTrackDto.setOrderId(orderId);
  1290. orderTrackDto.setDeliveryOrderSn(order.getOutTradeNo());
  1291. List<OrderLog> orderLogs = iOrderLogService.getOrderLogListByOrderId(orderId);
  1292. List<OrderTrackDto.OrderTrackItem> orderTrackItems = orderLogs.stream().map(orderLog -> {
  1293. OrderTrackDto.OrderTrackItem orderTrackItem = new OrderTrackDto.OrderTrackItem();
  1294. orderTrackItem.setId(orderLog.getId());
  1295. orderTrackItem.setOrderStatus(orderLog.getOrderStatus());
  1296. orderTrackItem.setNodeTime(orderLog.getCreateTime());
  1297. return orderTrackItem;
  1298. }).collect(Collectors.toList());
  1299. if (order.getWaimaiOrderId() != null) {
  1300. WaimaiOrder waimaiOrder = iWaimaiOrderService.getById(order.getWaimaiOrderId());
  1301. if (waimaiOrder != null) {
  1302. // 外卖单用户下单时间
  1303. OrderTrackDto.OrderTrackItem orderTrackItem1 = new OrderTrackDto.OrderTrackItem();
  1304. orderTrackItem1.setId(0L);
  1305. orderTrackItem1.setOrderStatus(99);
  1306. orderTrackItem1.setNodeTime(waimaiOrder.getOrderTime());
  1307. orderTrackItems.add(orderTrackItem1);
  1308. // 其他平台完成
  1309. if (order.getDeliveryStatus() != 4 && waimaiOrder.getStatus() != null && waimaiOrder.getStatus() == 4) {
  1310. OrderTrackDto.OrderTrackItem orderTrackItem2 = new OrderTrackDto.OrderTrackItem();
  1311. orderTrackItem1.setId(Long.MAX_VALUE);
  1312. orderTrackItem2.setOrderStatus(98);
  1313. orderTrackItem2.setNodeTime(waimaiOrder.getUpdateTime());
  1314. orderTrackItems.add(orderTrackItem2);
  1315. }
  1316. }
  1317. }
  1318. orderTrackItems = orderTrackItems.stream().sorted((Comparator.comparing(OrderTrackDto.OrderTrackItem::getNodeTime).reversed().thenComparing(OrderTrackDto.OrderTrackItem::getId, Comparator.reverseOrder()))).collect(Collectors.toList());
  1319. orderTrackDto.setItemList(orderTrackItems);
  1320. List<OrderLog> toBeDeliveredList = orderLogs.stream().filter(item -> DeliveryStatusEnum.TO_BE_DELIVERED.status.equals(item.getOrderStatus())).collect(Collectors.toList());
  1321. // 骑手接单时间
  1322. orderTrackDto.setReceiveTime(CollectionUtils.isEmpty(toBeDeliveredList) ? null : toBeDeliveredList.get(0).getCreateTime());
  1323. // 商家发单时间
  1324. List<OrderLog> toBeReceivedList = orderLogs.stream().filter(item -> DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status.equals(item.getOrderStatus())).collect(Collectors.toList());
  1325. orderTrackDto.setSendTime(CollectionUtils.isEmpty(toBeReceivedList) ? null : toBeReceivedList.get(0).getCreateTime());
  1326. if (!DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status.equals(order.getDeliveryStatus()) &&
  1327. !DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status.equals(order.getDeliveryStatus())) {
  1328. DspDelivery delivery = iDspDeliveryService.getById(order.getDeliveryId());
  1329. // 平台信息
  1330. if (!Objects.isNull(delivery)) {
  1331. orderTrackDto.setDeliveryLogo(delivery.getLogo());
  1332. orderTrackDto.setDeliveryName(delivery.getName());
  1333. orderTrackDto.setCustomerPhone(delivery.getCustomerPhone());
  1334. }
  1335. }
  1336. return orderTrackDto;
  1337. }
  1338. @Override
  1339. public OrderDetailNewDto getOrderDetail(Long orderId, Long loginId) {
  1340. Order order = iOrderService.getById(orderId);
  1341. if (Objects.isNull(order)) {
  1342. log.error("订单不存在, orderId: {}", orderId);
  1343. throw new CustomException("订单不存在!");
  1344. }
  1345. OrderDetailNewDto orderDetailNewDto = new OrderDetailNewDto();
  1346. BeanUtils.copyProperties(order, orderDetailNewDto);
  1347. orderDetailNewDto.setOrderId(order.getId());
  1348. if (order.getWaimaiOrderId() != null && order.getWaimaiOrderId() != 0) {
  1349. WaimaiOrder waimaiOrder = iWaimaiOrderService.getById(order.getWaimaiOrderId());
  1350. orderDetailNewDto.setCaution(waimaiOrder.getCaution());
  1351. orderDetailNewDto.setDaySeq(waimaiOrder.getDaySeq());
  1352. orderDetailNewDto.setInvoiceTitle(waimaiOrder.getInvoiceTitle());
  1353. orderDetailNewDto.setTaxpayerId(waimaiOrder.getTaxpayerId());
  1354. orderDetailNewDto.setOrderType(waimaiOrder.getOrderType());
  1355. orderDetailNewDto.setOrderTime(waimaiOrder.getOrderTime());
  1356. orderDetailNewDto.setOutOrderId(waimaiOrder.getOutOrderId());
  1357. orderDetailNewDto.setProductAmount(waimaiOrder.getTotalPrice());
  1358. if (waimaiOrder.getDeliveryTime() != null && waimaiOrder.getDeliveryTime() != 0) {
  1359. orderDetailNewDto.setExceptTime(new Date(waimaiOrder.getDeliveryTime() * 1000L));
  1360. }
  1361. List<WaimaiOrderDetail> waimaiOrderDetails = iWaimaiOrderDetailService.findList(order.getWaimaiOrderId());
  1362. MemberConfigDto memberConfig = iMemberConfigService.findDetail(loginId);
  1363. boolean showFoodImg = memberConfig == null || memberConfig.getShowFoodImg() == 1;
  1364. List<OrderDetailNewDto.OrderDetailItem> orderDetailItems = waimaiOrderDetails.stream().map(waimaiOrderDetail -> {
  1365. OrderDetailNewDto.OrderDetailItem orderDetailItem = new OrderDetailNewDto.OrderDetailItem();
  1366. orderDetailItem.setFoodName(waimaiOrderDetail.getFoodName());
  1367. orderDetailItem.setQuantity(waimaiOrderDetail.getQuantity());
  1368. if (showFoodImg) {
  1369. WaimaiFoodImg waimaiFoodImg = iWaimaiFoodImgService.getOne(new QueryWrapper<WaimaiFoodImg>()
  1370. .eq("sku_id", waimaiOrderDetail.getSkuId())
  1371. .eq("waimai_id", waimaiOrder.getWaimaiId())
  1372. .eq("shop_id", order.getShopId())
  1373. .eq("deleted", 0));
  1374. orderDetailItem.setFoodPic(Objects.isNull(waimaiFoodImg) ? "" : waimaiFoodImg.getImg());
  1375. }
  1376. return orderDetailItem;
  1377. }).collect(Collectors.toList());
  1378. orderDetailNewDto.setDetailItems(orderDetailItems);
  1379. }
  1380. return orderDetailNewDto;
  1381. }
  1382. @Override
  1383. public OrderMarkerDto getOrderMarker(Long memberId, OrderMarkerRequest request) {
  1384. Member member = iMemberService.getById(memberId);
  1385. if (Objects.isNull(member)) {
  1386. throw new CustomException("用户不存在!");
  1387. }
  1388. // 用户类型处理
  1389. List<Long> shopIds = Lists.newArrayList();
  1390. if (MemberTypeEnum.SHOP.type.equals(member.getMemberType())) {
  1391. shopIds.add(member.getShopId());
  1392. } else if (MemberTypeEnum.MERCHANT.type.equals(member.getMemberType())) {
  1393. shopIds = iShopService.getShopByMerchantId(member.getMerchantId(), null);
  1394. }
  1395. // 固定门店
  1396. List<Long> searchShopIds = Lists.newArrayList();
  1397. String searchShopIdStr = request.getSearchShopIdStr();
  1398. if (StringUtils.isNotEmpty(searchShopIdStr)) {
  1399. String[] split = searchShopIdStr.split(",");
  1400. for (String shopId : split) {
  1401. searchShopIds.add(Long.valueOf(shopId));
  1402. }
  1403. }
  1404. if (CollectionUtils.isNotEmpty(shopIds) && CollectionUtils.isNotEmpty(searchShopIds)) {
  1405. shopIds.retainAll(searchShopIds);
  1406. }
  1407. if (!MemberTypeEnum.PERSON.type.equals(member.getMemberType()) && CollectionUtils.isEmpty(shopIds)) {
  1408. return OrderMarkerDto.builder().appointNum(0).cancelNum(0).exceptionNum(0).InDeliveryNum(0)
  1409. .toBeBillNum(0).toBePickedNum(0).toBeReceivedNum(0).completedNum(0).build();
  1410. }
  1411. // 非个人用户,近三日是否有进行中的个人订单(即申请成为商家前的订单)
  1412. // Integer personalOrderCount = null;
  1413. // if (!MemberTypeEnum.PERSON.type.equals(member.getMemberType())) {
  1414. // String lastDayTime = DateUtils.addDaysToTimeStr(new Date(), -3, DateUtils.yyyyMMdd000000);
  1415. // personalOrderCount = iOrderService.countPersonalOrder(lastDayTime, member.getId());
  1416. // }
  1417. // log.info("用户类型: {}, memberId: {}, 个人订单数量: {}", member.getMemberType(), member.getId(), personalOrderCount);
  1418. List<OrderListDto> list = iOrderService.getOrderListByShopIdsAndMemberIds(shopIds, memberId, member.getMemberType(), false);
  1419. // 新订单、异常单 门店/商家才有
  1420. List<OrderListDto> newOrderList = Lists.newArrayList();
  1421. List<OrderListDto> exceptionList = Lists.newArrayList();
  1422. if (!MemberTypeEnum.PERSON.type.equals(member.getMemberType())) {
  1423. // 新订单
  1424. newOrderList = list.stream().filter(item -> DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(item.getDeliveryStatus())
  1425. && item.getWmstatus() != null && item.getWmstatus() != 4
  1426. && item.getTakeType()!= null && TakeTypeEnum.NOW.getType().equals(item.getTakeType())).collect(Collectors.toList());
  1427. // 异常单
  1428. exceptionList = list.stream().filter(item -> (item.getWaimaiOrderId() == null && DeliveryStatusEnum.ABNORMAL.getStatus().equals(item.getDeliveryStatus()))
  1429. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.ABNORMAL.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != null && item.getWmstatus() != 4)).collect(Collectors.toList());
  1430. }
  1431. // 预约单
  1432. List<OrderListDto> appointList = list.stream().filter(item -> DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(item.getDeliveryStatus()) && item.getTakeType() != null && !TakeTypeEnum.NOW.getType().equals(item.getTakeType())
  1433. && (item.getWaimaiOrderId() == null && item.getSaveFlag() == 1 || (item.getWaimaiOrderId() != null && item.getWmstatus() != null && item.getWmstatus() != 4))).collect(Collectors.toList());
  1434. // 待接单
  1435. List<OrderListDto> toBeReceivedList = list.stream().filter(item -> (item.getWaimaiOrderId() == null && DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.getStatus().equals(item.getDeliveryStatus()))
  1436. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != null && item.getWmstatus() != 4)).collect(Collectors.toList());
  1437. // 取货中
  1438. List<OrderListDto> inPickUpList = list.stream().filter(item -> (item.getWaimaiOrderId() == null && DeliveryStatusEnum.TO_BE_DELIVERED.getStatus().equals(item.getDeliveryStatus()))
  1439. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.TO_BE_DELIVERED.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != null && item.getWmstatus() != 4)).collect(Collectors.toList());
  1440. // 配送中
  1441. List<OrderListDto> inDeliveryList = list.stream().filter(item -> (item.getWaimaiOrderId() == null && DeliveryStatusEnum.IN_DELIVERY.getStatus().equals(item.getDeliveryStatus()))
  1442. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.IN_DELIVERY.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != null && item.getWmstatus() != 4)).collect(Collectors.toList());
  1443. // 已取消(取消时间在3天之内的)
  1444. Date cancelTime = DateUtils.addDaysToTimeDate(new Date(), -3, DateUtils.yyyyMMdd000000);
  1445. List<OrderListDto> cancelList = list.stream().filter(item -> (item.getWaimaiOrderId() == null && DeliveryStatusEnum.CANCEL.getStatus().equals(item.getDeliveryStatus()) && item.getUpdateTime().compareTo(cancelTime) >= 0)
  1446. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.CANCEL.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != 4 && item.getWmUpdateTime().compareTo(cancelTime) >= 0)).collect(Collectors.toList());
  1447. // 已完成
  1448. List<OrderListDto> completedList = list.stream().filter(item -> (item.getWaimaiOrderId() == null && DeliveryStatusEnum.FINISH.getStatus().equals(item.getDeliveryStatus()))
  1449. || (item.getWaimaiOrderId() != null && item.getWmstatus() == 4)).collect(Collectors.toList());
  1450. // 近七日完成/取消
  1451. Date sevenFinishCancelTime = DateUtils.addDaysToTimeDate(new Date(), -7, DateUtils.yyyyMMdd000000);
  1452. List<OrderListDto> sevenDayCancelList = list.stream().filter(item -> (item.getWaimaiOrderId() == null && DeliveryStatusEnum.CANCEL.getStatus().equals(item.getDeliveryStatus()) && item.getUpdateTime().compareTo(sevenFinishCancelTime) >= 0)
  1453. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.CANCEL.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != 4 && item.getWmUpdateTime().compareTo(sevenFinishCancelTime) >= 0)).collect(Collectors.toList());
  1454. // 已完成
  1455. List<OrderListDto> sevenDayFinishList = list.stream().filter(item -> (item.getWaimaiOrderId() == null && DeliveryStatusEnum.FINISH.getStatus().equals(item.getDeliveryStatus()) && item.getUpdateTime().compareTo(sevenFinishCancelTime) >= 0)
  1456. || (item.getWaimaiOrderId() != null && item.getWmstatus() == 4 && item.getWmUpdateTime().compareTo(sevenFinishCancelTime) >= 0)).collect(Collectors.toList());
  1457. return OrderMarkerDto.builder()
  1458. .toBeBillNum(newOrderList.size())
  1459. .toBePickedNum(inPickUpList.size())
  1460. .appointNum(appointList.size())
  1461. .InDeliveryNum(inDeliveryList.size())
  1462. .toBeReceivedNum(toBeReceivedList.size())
  1463. .exceptionNum(exceptionList.size())
  1464. .cancelNum(cancelList.size())
  1465. .completedNum(completedList.size())
  1466. .sevenDayNum(sevenDayCancelList.size() + sevenDayFinishList.size())
  1467. .build();
  1468. }
  1469. /**
  1470. * 获取付款二维码
  1471. * @param amount 订单金额
  1472. * @param orderSn 订单号
  1473. * @param payType 付款方式 1-支付宝 2-微信
  1474. * @return 二维码链接
  1475. */
  1476. @Override
  1477. public PaymentQRCodeDto getPaymentQRCode(BigDecimal amount, String orderSn, Integer payType) {
  1478. PaymentQRCodeDto paymentQRCodeDto;
  1479. try {
  1480. if (PaymentTypeEnum.ZHI_FU_BAO.type.equals(payType)) {
  1481. paymentQRCodeDto = aliPayService.getCodeUrl(amount, orderSn);
  1482. } else if (PaymentTypeEnum.WEI_XIN.type.equals(payType)) {
  1483. paymentQRCodeDto = wechatPayService.getCodeUrl(amount, orderSn);
  1484. } else {
  1485. log.warn("无效的付款类型! orderSn: {}, payType: {}", orderSn, payType);
  1486. throw new CustomException("payType参数错误!");
  1487. }
  1488. paymentQRCodeDto.setOrderSn(orderSn);
  1489. } catch (Exception e) {
  1490. log.error("获取付款二维码失败, orderSn:{}, amount:{}, payType:{}, error: {}", orderSn, amount, payType, e);
  1491. throw new CustomException("获取付款二维码失败!");
  1492. }
  1493. return paymentQRCodeDto;
  1494. }
  1495. @Override
  1496. @Transactional(rollbackFor = Exception.class)
  1497. public void ignoreOrder(Long memberId, Integer orderId) {
  1498. Order order = iOrderService.getOrderByMemberIdAndOrderId(memberId, orderId);
  1499. if (Objects.isNull(order)) {
  1500. log.info("用户memberId: {}, 无此订单: {}", memberId, orderId);
  1501. throw new CustomAppException("订单不存在!");
  1502. }
  1503. if (!DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(order.getDeliveryStatus())
  1504. && !DeliveryStatusEnum.ABNORMAL.getStatus().equals(order.getDeliveryStatus())) {
  1505. log.info("非待发单、异常单状态下订单不可忽略! orderId: {}, deliveryStatus: {}", orderId, order.getDeliveryStatus());
  1506. throw new CustomAppException("该状态下订单不可忽略!");
  1507. }
  1508. iWaimaiOrderService.update(new UpdateWrapper<WaimaiOrder>()
  1509. .set("status", DeliveryStatusEnum.FINISH.status)
  1510. .eq("id", order.getWaimaiOrderId()));
  1511. }
  1512. @Override
  1513. @Transactional(rollbackFor = Exception.class)
  1514. public void saveOrder(Long loginId, OrderReq req) {
  1515. Member member = iMemberService.getById(loginId);
  1516. if (Objects.isNull(member)) {
  1517. throw new CustomAppException("用户不存在!");
  1518. }
  1519. // if (MemberTypeEnum.SHOP.type.equals(member.getMemberType())) {
  1520. // member = iMemberService.getOne(new QueryWrapper<Member>().eq("member_type", MemberTypeEnum.MERCHANT.type).eq("merchant_id", member.getMerchantId()));
  1521. // }
  1522. Product product = apiProductService.findById(req.getProductId());
  1523. if (product == null) {
  1524. throw new CustomAppException(ExceptionEnum.PRODUCT_NOT_EXISTS);
  1525. }
  1526. // 地址处理重复楼层
  1527. this.handleAddress(req);
  1528. // 保存发件信息, 如果发件Id不存在, 则为手工录入信息, 保存到缓存
  1529. // apiCacheUserAddress.cacheAddress(loginId, req);
  1530. try {
  1531. apiCacheUserAddress.cacheSendReceiveAddress(loginId, req.getSendAddress(), req.getReceiptAddress());
  1532. } catch (Exception e) {
  1533. log.error("缓存收发件地址异常, {}", e.getMessage());
  1534. }
  1535. Order order = createOrder(product, req, loginId, member);
  1536. Merchant merchant = iMerchantService.getById(member.getMerchantId());
  1537. // 达达配送商
  1538. if (merchant != null && merchant.getDadaDspId() != null) {
  1539. DadaDsp dadaDsp = iDadaDspService.getById(merchant.getDadaDspId());
  1540. if (dadaDsp != null) {
  1541. order.setDadaDspId(dadaDsp.getId());
  1542. order.setDadaDspType(DadaDspRoleEnum.SELF_DELIVERY.type.equals(dadaDsp.getDspRole()) ? OrderDadaDspTypeEnum.DELIVERY.type : OrderDadaDspTypeEnum.DELIVERY_RAP.type);
  1543. }
  1544. } else {
  1545. if (member.getAgentId() != null) {
  1546. order.setAgentId(member.getAgentId());
  1547. order.setAgentIdSource(member.getAgentSource());
  1548. if (member.getPersonnelId() != null) {
  1549. order.setPersonnelId(member.getPersonnelId());
  1550. }
  1551. } else {
  1552. // 判断区域,只给一级代理商
  1553. Agent agent = iAgentService.findByArea(order.getSendCityName(), order.getSendDistrictName());
  1554. if (agent != null) {
  1555. order.setAgentId(agent.getId());
  1556. order.setAgentIdSource(AgentSourceEnum.QU_YU.status);
  1557. }
  1558. }
  1559. }
  1560. // 设置外卖平台, 订单流水号
  1561. if ((order.getShopId() != null || order.getMemberId() != null) && req.getPlatformType() != null) {
  1562. if (req.getPlatformType() != 0 && req.getDaySeq() == null) {
  1563. throw new CustomAppException("流水号不能为空!");
  1564. }
  1565. if (req.getPlatformType() == 0) {
  1566. // 猎豹平台生成流水号
  1567. String daySeq = this.getLieBaoDaySeq(order.getShopId(), order.getMemberId());
  1568. req.setDaySeq(daySeq);
  1569. }
  1570. order.setPlatformType(req.getPlatformType());
  1571. order.setLbDaySeq(req.getDaySeq());
  1572. }
  1573. boolean result = iOrderService.save(order);
  1574. if (!result) {
  1575. throw new CustomAppException("预约发单保存失败!");
  1576. }
  1577. // 设置订单延迟发单
  1578. this.createOrderDelay(order.getId(), order.getDeliveryTime());
  1579. }
  1580. private String getLieBaoDaySeq(Long shopId, Long memberId) {
  1581. int daySeq = 1;
  1582. String memberKey = RedisKeyConstant.MEMBER_DAY_SEQ + DateUtils.getDate() + ":member_id:" + memberId;
  1583. Boolean hasMemberKey = redisCache.hasKey(memberKey);
  1584. if (shopId == null) {
  1585. if (hasMemberKey) {
  1586. daySeq = redisCache.increment(memberKey).intValue();
  1587. } else {
  1588. // 36小时后过期自动清除
  1589. redisCache.setCacheObject(memberKey, daySeq, 36, TimeUnit.HOURS);
  1590. }
  1591. } else {
  1592. String shopKey = RedisKeyConstant.SHOP_DAY_SEQ + DateUtils.getDate() + ":shop_id:" + shopId;
  1593. if (redisCache.hasKey(shopKey)) {
  1594. daySeq = redisCache.increment(shopKey).intValue();
  1595. } else {
  1596. // 个人申请成为门店账号, 订单流水号不间断
  1597. if (hasMemberKey) {
  1598. daySeq = redisCache.increment(memberKey).intValue();
  1599. }
  1600. // 36小时后过期自动清除
  1601. redisCache.setCacheObject(shopKey, daySeq, 36, TimeUnit.HOURS);
  1602. }
  1603. }
  1604. return Integer.toString(daySeq);
  1605. }
  1606. private void createOrderDelay(Long orderId, Date deliveryTime) {
  1607. boolean result;
  1608. String orderKey = orderId + "_0";
  1609. OrderDelay orderDelay = iOrderDelayService.getOne(new QueryWrapper<OrderDelay>().eq("order_id", orderId));
  1610. if (orderDelay != null) {
  1611. orderDelay.setModifyNum(orderDelay.getModifyNum() + 1);
  1612. result = iOrderDelayService.updateById(orderDelay);
  1613. orderKey = orderId + "_" + orderDelay.getModifyNum();
  1614. } else {
  1615. orderDelay = new OrderDelay();
  1616. orderDelay.setCreateTime(new Date());
  1617. orderDelay.setOrderId(orderId);
  1618. result = iOrderDelayService.save(orderDelay);
  1619. }
  1620. if (!result) {
  1621. throw new CustomAppException("预约发单保存失败!");
  1622. }
  1623. if (deliveryTime != null && deliveryTime.compareTo(new Date()) > 0) {
  1624. long diff = deliveryTime.getTime() - new Date().getTime();
  1625. if(diff >= 0) {
  1626. log.info("手动发预约单, 延时发送时间" + diff);
  1627. rabbitSender.sendDelay(orderKey, "delay.waimai", (int) diff);
  1628. }
  1629. }
  1630. }
  1631. private void handleAddress(OrderReq req){
  1632. String sendAddress = req.getSendAddress().getAddress();
  1633. String sendStreet = req.getSendAddress().getStreet();
  1634. String receiptAddress = req.getReceiptAddress().getAddress();
  1635. String receiptStreet = req.getReceiptAddress().getStreet();
  1636. if(StringUtils.isNotBlank(sendStreet)&&sendAddress.endsWith(sendStreet)){
  1637. req.getSendAddress().setAddress(sendAddress.substring(0,sendAddress.lastIndexOf(sendStreet)));
  1638. }
  1639. if(StringUtils.isNotBlank(receiptStreet)&&receiptAddress.endsWith(receiptStreet)){
  1640. req.getReceiptAddress().setAddress(receiptAddress.substring(0,receiptAddress.lastIndexOf(receiptStreet)));
  1641. }
  1642. }
  1643. private Order createOrder(Product product, OrderReq req, Long memberId, Member member) {
  1644. Order order = new Order();
  1645. order.setMemberId(memberId);
  1646. order.setCreateTime(new Date());
  1647. order.setTakeType(req.getTakeType());
  1648. order.setTakeDate(DateUtils.parseDate(req.getTakeTime()));
  1649. order.setTakeTime(DateUtils.parseDate(req.getTakeTime()));
  1650. order.setOrderSn(SnCodeUtils.createSn());
  1651. order.setTotalAmount(BigDecimal.ZERO);
  1652. order.setMaxAmount(BigDecimal.ZERO);
  1653. order.setPayAmount(BigDecimal.ZERO);
  1654. order.setCommission(BigDecimal.ZERO);
  1655. order.setPaymentType(PaymentTypeEnum.BALANCE.type);
  1656. order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
  1657. order.setStatus(PayStatusEnum.NO_PAYED.status);
  1658. order.setRefundMoney(BigDecimal.ZERO);
  1659. order.setSaveFlag(req.getSaveFlag());
  1660. order.setDeliveryTime(DateUtils.parseDate(req.getTakeTime()));
  1661. order.setInvoiceTitle(req.getInvoiceTitle());
  1662. order.setTaxpayerId(req.getTaxpayerId());
  1663. /*if(TakeTypeEnum.APPOINTMENT.type.equals(req.getTakeType())){
  1664. if(DateUtils.addMinutes(new Date(),130).compareTo(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS,req.getTakeTime()))>0){
  1665. order.setTakeType(TakeTypeEnum.APPOINTMENT_2.type);
  1666. } else {
  1667. order.setTakeTime(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS,req.getTakeTime()));
  1668. }
  1669. }*/
  1670. order.setMerchantId(member.getMerchantId());
  1671. order.setWeight(req.getWeight());
  1672. order.setTakeRemark(req.getTakeRemark());
  1673. order.setDeliveryType(req.getDeliveryType());
  1674. order.setPreDeliveryIds(req.getPreDeliveryIds());
  1675. order.setProductId(product.getId());
  1676. order.setProductName(product.getName());
  1677. order.setCouponAmount(BigDecimal.ZERO);
  1678. Long shopId = req.getShopId();
  1679. if (shopId == null){
  1680. if (member.getShopId() != null){
  1681. shopId = member.getShopId();
  1682. order.setDefaultShop(DefaultShopEnum.SHOW.status);
  1683. }
  1684. }
  1685. order.setShopId(shopId);
  1686. order.setShopName(req.getShopName());
  1687. AddressReq sendAddress = req.getSendAddress();
  1688. AddressReq receiveAddress = req.getReceiptAddress();
  1689. if (Objects.isNull(sendAddress) || Objects.isNull(receiveAddress)) {
  1690. throw new CustomAppException("取件地址和发件地址不可为空!");
  1691. }
  1692. if(StringUtils.isNotBlank(sendAddress.getStreet())){
  1693. order.setSendStreet(sendAddress.getStreet());
  1694. }
  1695. order.setSendAddress(sendAddress.getAddress());
  1696. order.setSendAddressId(sendAddress.getId());
  1697. order.setSendCityName(sendAddress.getCityName());
  1698. order.setSendContactName(sendAddress.getContact());
  1699. order.setSendPhone(sendAddress.getPhone());
  1700. order.setSendExtension(sendAddress.getExtension());
  1701. order.setSendDistrictName((String)sendAddress.getDistrictName());
  1702. order.setSendProvinceName(sendAddress.getProvinceName());
  1703. order.setSendLat(sendAddress.getLat());
  1704. order.setSendLng(sendAddress.getLng());
  1705. order.setSendCityCode(sendAddress.getCityCode());
  1706. if(StringUtils.isNotBlank(receiveAddress.getStreet())){
  1707. order.setReceiptStreet(receiveAddress.getStreet());
  1708. }
  1709. order.setReceiptAddress(receiveAddress.getAddress());
  1710. order.setReceiptAddressId(receiveAddress.getId());
  1711. order.setReceiptCityName(receiveAddress.getCityName());
  1712. order.setReceiptContactName(receiveAddress.getContact());
  1713. order.setReceiptPhone(receiveAddress.getPhone());
  1714. order.setReceiptExtension(receiveAddress.getExtension());
  1715. order.setReceiptDistrictName((String)receiveAddress.getDistrictName());
  1716. order.setReceiptProvinceName(receiveAddress.getProvinceName());
  1717. order.setReceiptLat(receiveAddress.getLat());
  1718. order.setReceiptLng(receiveAddress.getLng());
  1719. order.setReceiptCityCode(receiveAddress.getCityCode());
  1720. if (order.getWaimaiOrderId() != null){
  1721. order.setWaimaiOrderId(order.getWaimaiOrderId());
  1722. }else {
  1723. order.setWaimaiOrderId(req.getWaimaiOrderId());
  1724. }
  1725. order.setProductAmount(req.getProductAmount());
  1726. return order;
  1727. }
  1728. @Override
  1729. public DeliveryLocationDto showMap(Long orderId) {
  1730. DeliveryLocationDto dto = new DeliveryLocationDto();
  1731. Order order = iOrderService.getById(orderId);
  1732. if (Objects.isNull(order)) {
  1733. throw new CustomAppException("订单不存在!");
  1734. }
  1735. OrderDelivery orderDelivery = iOrderDeliveryService.getOne(new QueryWrapper<OrderDelivery>().eq("order_sn", order.getOrderSn()).eq("delivery_id", order.getDeliveryId()));
  1736. DspDelivery delivery = iDspDeliveryService.getById(order.getDeliveryId());
  1737. dto.setSendLat(order.getSendLat());
  1738. dto.setSendLng(order.getSendLng());
  1739. dto.setReceiptLat(order.getReceiptLat());
  1740. dto.setReceiptLng(order.getReceiptLng());
  1741. dto.setId(order.getId());
  1742. // 计算收发距离
  1743. StopWatch t1 = new StopWatch();
  1744. t1.start();
  1745. if (order.getOrderDistance() == null || order.getOrderDistance().compareTo(BigDecimal.ZERO) == 0) {
  1746. String startLat = dto.getSendLng() + "," + dto.getSendLat();
  1747. String endLat = dto.getReceiptLng() + "," + dto.getReceiptLat();
  1748. if (!Objects.isNull(delivery) && DeliveryTypeEnums.HUO_LA_LA.getType().equals(delivery.getType()) && !Objects.isNull(orderDelivery)){
  1749. dto.setOrderDistance(BigDecimal.valueOf(AddressLngLatExchanger.getDriveDistince(startLat, endLat)));
  1750. } else {
  1751. GDMapTripResult result = AddressLngLatExchanger.getBicyclingInfo(startLat, endLat);
  1752. dto.setOrderDistance(BigDecimal.valueOf(result.getDistance()));
  1753. }
  1754. } else {
  1755. dto.setOrderDistance(order.getOrderDistance());
  1756. }
  1757. t1.stop();
  1758. log.info("计算收发距离耗时: " + t1.getTotalTimeMillis() + "MS");
  1759. // 待配送、配送中设置时间
  1760. if (OrderStatusEnum.TO_BE_DELIVERED.status.equals(order.getDeliveryStatus())
  1761. || OrderStatusEnum.IN_DELIVERY.status.equals(order.getDeliveryStatus())) {
  1762. OrderDto orderDto = new OrderDto();
  1763. if (!Objects.isNull(orderDelivery) && !Objects.isNull(delivery)) {
  1764. orderDto = apiRiderLocationService.getRiderLocation(order, orderDelivery, orderDto, delivery);
  1765. String startLonLat = orderDto.getShipperLng() + "," + orderDto.getShipperLat();
  1766. String endLonLat = OrderStatusEnum.TO_BE_DELIVERED.status.equals(order.getDeliveryStatus()) ? (dto.getSendLng() + "," + dto.getSendLat()) : (dto.getReceiptLng() + "," + dto.getReceiptLat());
  1767. GDMapTripResult result = AddressLngLatExchanger.getBicyclingInfo(startLonLat, endLonLat);
  1768. if (DeliveryTypeEnums.HUO_LA_LA.getType().equals(delivery.getType())) {
  1769. result = AddressLngLatExchanger.getDrivingInfo(startLonLat, endLonLat);
  1770. }
  1771. if (OrderStatusEnum.TO_BE_DELIVERED.status.equals(order.getDeliveryStatus())) {
  1772. dto.setRiderArriveMinute(Math.max(result.getDuration() / 60, 0));
  1773. } else {
  1774. Date estimateArriveTime = DateUtils.addSecondsToTimeDate(new Date(), Integer.parseInt(String.valueOf(result.getDuration())));
  1775. dto.setEstimateArriveTime(estimateArriveTime);
  1776. }
  1777. dto.setShipperDistance(BigDecimal.valueOf(result.getDistance()));
  1778. dto.setShipperLat(orderDto.getShipperLat() == null ? "" : orderDto.getShipperLat().setScale(6, BigDecimal.ROUND_HALF_UP).toString());
  1779. dto.setShipperLng(orderDto.getShipperLng() == null ? "" : orderDto.getShipperLng().setScale(6, BigDecimal.ROUND_HALF_UP).toString());
  1780. }
  1781. }
  1782. return dto;
  1783. }
  1784. @Override
  1785. public DeliveryLocationDto getRiderArriveTime(Long orderId) {
  1786. DeliveryLocationDto dto = new DeliveryLocationDto();
  1787. Order order = iOrderService.getById(orderId);
  1788. if (Objects.isNull(order)) {
  1789. throw new CustomAppException("订单不存在!");
  1790. }
  1791. // 骑手预计到店时长、预计送达时间
  1792. if (DeliveryStatusEnum.TO_BE_DELIVERED.status.equals(order.getDeliveryStatus())
  1793. || DeliveryStatusEnum.IN_DELIVERY.status.equals(order.getDeliveryStatus())) {
  1794. DspDelivery delivery = iDspDeliveryService.getById(order.getDeliveryId());
  1795. OrderDelivery orderDelivery = iOrderDeliveryService.getOne(new QueryWrapper<OrderDelivery>().eq("order_sn", order.getOrderSn()).eq("delivery_id", order.getDeliveryId()));
  1796. if (!Objects.isNull(orderDelivery) && !Objects.isNull(delivery)) {
  1797. OrderDto orderDto = new OrderDto();
  1798. // 获取骑手位置
  1799. StopWatch t1 = new StopWatch();
  1800. t1.start();
  1801. orderDto = apiRiderLocationService.getRiderLocation(order, orderDelivery, orderDto, delivery);
  1802. t1.stop();
  1803. log.info("获取骑手位置耗时: " + t1.getTotalTimeMillis() + "MS");
  1804. if (orderDto.getShipperLat() != null && orderDto.getShipperLng() != null) {
  1805. String startLonLat = orderDto.getShipperLng() + "," + orderDto.getShipperLat();
  1806. String endLonLat = OrderStatusEnum.TO_BE_DELIVERED.status.equals(order.getDeliveryStatus()) ? (order.getSendLng() + "," + order.getSendLat()) : (order.getReceiptLng() + "," + order.getReceiptLat());
  1807. GDMapTripResult result = AddressLngLatExchanger.getBicyclingInfo(startLonLat, endLonLat);
  1808. if (DeliveryTypeEnums.HUO_LA_LA.getType().equals(delivery.getType())) {
  1809. result = AddressLngLatExchanger.getDrivingInfo(startLonLat, endLonLat);
  1810. }
  1811. if (DeliveryStatusEnum.TO_BE_DELIVERED.status.equals(order.getDeliveryStatus())) {
  1812. // dto.setRiderArriveMinute(Math.max(DateUtils.parseMsToMinute(result.getDuration() * 1000), 0));
  1813. dto.setRiderArriveMinute(Math.max(result.getDuration() / 60, 0));
  1814. log.info("配送平台: {}, 骑手取货中, 三方平台返回预计到店时间: {}, 计算预计到店时长: {} 分钟", DeliveryTypeEnums.getNameByType(delivery.getType()), orderDto.getEstimateArriveTimeStr(), Math.max(DateUtils.parseMsToMinute(result.getDuration() * 1000), 0));
  1815. } else if (DeliveryStatusEnum.IN_DELIVERY.status.equals(order.getDeliveryStatus())) {
  1816. Date estimateArriveTime = DateUtils.addSecondsToTimeDate(new Date(), Integer.parseInt(String.valueOf(result.getDuration())));
  1817. dto.setEstimateArriveTime(estimateArriveTime);
  1818. log.info("配送平台: {}, 骑手配送中, 三方平台返回预计送达时间: {}, 计算预计送达时间: {}", DeliveryTypeEnums.getNameByType(delivery.getType()), orderDto.getEstimateArriveTimeStr(), estimateArriveTime);
  1819. }
  1820. }
  1821. }
  1822. }
  1823. return dto;
  1824. }
  1825. @Override
  1826. public PrintOrderDto getPrintOrderInfos(Long orderId, Long waimaiOrderId) {
  1827. WaimaiOrder waimaiOrder = null;
  1828. if (Objects.nonNull(orderId)) {
  1829. Order order = iOrderService.getById(orderId);
  1830. if (Objects.isNull(order)) {
  1831. return null;
  1832. }
  1833. waimaiOrder = iWaimaiOrderService.getById(order.getWaimaiOrderId());
  1834. }
  1835. if (Objects.nonNull(waimaiOrderId)) {
  1836. waimaiOrder = iWaimaiOrderService.getById(waimaiOrderId);
  1837. }
  1838. if (Objects.isNull(waimaiOrder)) {
  1839. return null;
  1840. }
  1841. PrintOrderDto printOrderDto = new PrintOrderDto();
  1842. BeanUtil.copyProperties(waimaiOrder, printOrderDto);
  1843. // 取消单
  1844. if (waimaiOrder.getStatus().equals(OrderStatusEnum.CANCEL.status)){
  1845. printOrderDto.setOrderStatus(OrderStatusEnum.CANCEL.status);
  1846. }
  1847. if (waimaiOrder.getCaution().contains("收餐人隐私号")){
  1848. printOrderDto.setCaution(waimaiOrder.getCaution().substring(0,waimaiOrder.getCaution().indexOf("收餐人隐私号")));
  1849. } else {
  1850. printOrderDto.setCaution(waimaiOrder.getCaution());
  1851. }
  1852. if (waimaiOrder.getDeliveryTime() != 0) {
  1853. String deliverTimeStr = DateUtils.format( new Date(waimaiOrder.getDeliveryTime() * 1000),"MM月dd日 HH:mm") + "送达";
  1854. printOrderDto.setDeliveryTime(deliverTimeStr);
  1855. }
  1856. // 设置商品信息
  1857. printOrderDto.setOrderGoodsDtoList(this.getOrderGoods(waimaiOrder.getId()));
  1858. // 设置订单活动信息
  1859. DspWaimai dspWaimai = iDspWaimaiService.getById(waimaiOrder.getWaimaiId());
  1860. printOrderDto.setActDtos(this.getOrderActs(waimaiOrder, dspWaimai.getType()));
  1861. if (waimaiOrder.getShippingFee() != null) {
  1862. printOrderDto.setDeliverFee(waimaiOrder.getShippingFee().toString());
  1863. }
  1864. if (waimaiOrder.getBoxFee() != null) {
  1865. printOrderDto.setBoxFee(waimaiOrder.getBoxFee().toString());
  1866. }
  1867. printOrderDto.setIsBook(waimaiOrder.getDeliveryTime() > 0 ? 1 : 0);
  1868. if (waimaiOrder.getOrderTime() != null) {
  1869. printOrderDto.setCreateTime(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,waimaiOrder.getOrderTime()));
  1870. } else {
  1871. printOrderDto.setCreateTime(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD_HH_MM_SS));
  1872. }
  1873. printOrderDto.setOrderSource(dspWaimai.getName());
  1874. printOrderDto.setShopName(waimaiOrder.getPoiName());
  1875. printOrderDto.setRecipientPrivacyPhone(waimaiOrder.getReceiptPrivacyPhone());
  1876. if (waimaiOrder.getLogisticsCode() != null && !waimaiOrder.getLogisticsCode().equals("0000") && !waimaiOrder.getLogisticsCode().equals("5001") && !waimaiOrder.getLogisticsCode().equals("00009003")){
  1877. printOrderDto.setRecipientAddress(waimaiOrder.getRecipientAddressDesensitization());
  1878. } else {
  1879. printOrderDto.setRecipientAddress(waimaiOrder.getRecipientAddress());
  1880. }
  1881. printOrderDto.setOpenQrCode(iShopService.getOpenQrCode(waimaiOrder.getShopId()));
  1882. printOrderDto.setQrCode(waimaiOrder.getOutOrderId());
  1883. return printOrderDto;
  1884. }
  1885. private List<PrintOrderActDto> getOrderActs(WaimaiOrder waimaiOrder, Integer waimaiType) {
  1886. List<PrintOrderActDto> orderActs = Lists.newArrayList();
  1887. if (StringUtils.isBlank(waimaiOrder.getExtras())) {
  1888. return orderActs;
  1889. }
  1890. if (WaimaiTypeEnums.E_LE_ME.getType().equals(waimaiType)) {
  1891. List<OActivity> list = JSONArray.parseArray(waimaiOrder.getExtras(), OActivity.class);
  1892. if (CollectionUtils.isNotEmpty(list)) {
  1893. for (OActivity activity : list) {
  1894. if (activity != null) {
  1895. PrintOrderActDto actDto = new PrintOrderActDto();
  1896. actDto.setAmount(String.valueOf(activity.getAmount()));
  1897. actDto.setName(activity.getName());
  1898. actDto.setType(activity.getType());
  1899. orderActs.add(actDto);
  1900. }
  1901. }
  1902. }
  1903. } else if (WaimaiTypeEnums.MEI_TUAN.getType().equals(waimaiType)) {
  1904. List<MeituanOrderExtraVo> list =JSONArray.parseArray(waimaiOrder.getExtras(), MeituanOrderExtraVo.class);
  1905. if (CollectionUtils.isNotEmpty(list)) {
  1906. for (MeituanOrderExtraVo vo : list) {
  1907. if(vo != null && vo.getRemark() != null) {
  1908. PrintOrderActDto actDto = new PrintOrderActDto();
  1909. actDto.setAmount(String.valueOf(vo.getReduceFee()));
  1910. actDto.setType(String.valueOf(vo.getType()));
  1911. actDto.setName(vo.getRemark());
  1912. orderActs.add(actDto);
  1913. }
  1914. }
  1915. }
  1916. } else if (WaimaiTypeEnums.E_LE_ME_RETAIL.getType().equals(waimaiType)) {
  1917. JSONArray array = JSONArray.parseArray(waimaiOrder.getExtras());
  1918. if(array != null && array.size() > 0){
  1919. for(int i = 0; i < array.size(); i++){
  1920. JSONObject json1 = array.getJSONObject(i);
  1921. PrintOrderActDto actDto = new PrintOrderActDto();
  1922. actDto.setAmount(new BigDecimal(json1.getString("fee")).divide(new BigDecimal("100")).toString());
  1923. actDto.setName(json1.getString("desc"));
  1924. actDto.setType(json1.getString("type"));
  1925. orderActs.add(actDto);
  1926. }
  1927. }
  1928. }
  1929. orderActs = MeiTuanConvertPrint.merge(orderActs);
  1930. return orderActs;
  1931. }
  1932. private List<PrintOrderGoodsDto> getOrderGoods(Long waimaiOrderId) {
  1933. List<PrintOrderGoodsDto> orderGoods = Lists.newArrayList();
  1934. List<WaimaiOrderDetail> detailList = iWaimaiOrderDetailService.list(new QueryWrapper<WaimaiOrderDetail>().eq("waimai_order_id", waimaiOrderId));
  1935. for (WaimaiOrderDetail waimaiOrderDetail : detailList) {
  1936. PrintOrderGoodsDto printOrderGoodsDto = new PrintOrderGoodsDto();
  1937. BeanUtil.copyProperties(waimaiOrderDetail, printOrderGoodsDto);
  1938. StringBuilder spec = new StringBuilder();
  1939. if (StringUtils.isNotBlank(waimaiOrderDetail.getFoodProperty())){
  1940. spec.append(waimaiOrderDetail.getFoodProperty());
  1941. }
  1942. if (StringUtils.isNotBlank(spec.toString()) && StringUtils.isNotBlank(waimaiOrderDetail.getSpec())) {
  1943. spec.append(",").append(waimaiOrderDetail.getSpec());
  1944. } else if (StringUtils.isBlank(spec.toString()) && StringUtils.isNotBlank(waimaiOrderDetail.getSpec())) {
  1945. spec.append(waimaiOrderDetail.getSpec());
  1946. }
  1947. if (StringUtils.isNotBlank(spec.toString())) {
  1948. printOrderGoodsDto.setFoodName(waimaiOrderDetail.getFoodName() + "(" + spec.toString() + ")");
  1949. }
  1950. orderGoods.add(printOrderGoodsDto);
  1951. }
  1952. return orderGoods;
  1953. }
  1954. @Override
  1955. public List<OrderListSearchCacheDto> getSearchHistory(Long loginId) {
  1956. List<OrderListSearchCacheDto> list = Lists.newArrayList();
  1957. Set<ZSetOperations.TypedTuple> set = redisCache.zSetGet(RedisKeyConstant.ORDER_LIST_SEARCH + loginId, 0, 10);
  1958. for (ZSetOperations.TypedTuple next : set) {
  1959. OrderListSearchCacheDto cacheDto = (OrderListSearchCacheDto) next.getValue();
  1960. list.add(cacheDto);
  1961. }
  1962. return list;
  1963. }
  1964. @Override
  1965. public void clearSearchHistory(Long loginId, OrderListSearchCacheDto orderListSearchCacheDto) {
  1966. String key = RedisKeyConstant.ORDER_LIST_SEARCH + loginId;
  1967. if (orderListSearchCacheDto != null && StringUtils.isNotEmpty(orderListSearchCacheDto.getSearchKey())) {
  1968. Set<ZSetOperations.TypedTuple> set = redisCache.zSetGet(key, 0, 10);
  1969. if (CollectionUtils.isNotEmpty(set)) {
  1970. int index = 0;
  1971. for (ZSetOperations.TypedTuple next : set) {
  1972. OrderListSearchCacheDto cacheDto = (OrderListSearchCacheDto) next.getValue();
  1973. if (orderListSearchCacheDto.equals(cacheDto)) {
  1974. redisCache.zSetRemove(key, set.size() - index - 1, set.size() - index - 1);
  1975. return;
  1976. }
  1977. index++;
  1978. }
  1979. }
  1980. } else {
  1981. redisCache.deleteObject(key);
  1982. }
  1983. }
  1984. @Override
  1985. public OrderInfoDto getOrderInfo(Long orderId, Long memberId) {
  1986. OrderInfoDto dto = iOrderService.getOrderInfoByOrderId(orderId);
  1987. if (dto == null) {
  1988. throw new CustomAppException("订单不存在");
  1989. }
  1990. if (dto.getWaimaiOrderId() != null) {
  1991. DspWaimai waiMai = iDspWaimaiService.getById(dto.getWaimaiId());
  1992. dto.setLogo(Objects.isNull(waiMai) ? "" : waiMai.getLogo());
  1993. } else if (dto.getPlatformType() != 0) {
  1994. // 手动发外卖单
  1995. String logo = iDspWaimaiService.selectLogoByType(dto.getPlatformType());
  1996. dto.setLogo(logo);
  1997. } else {
  1998. dto.setLogo(AppConstant.LIE_BAO_LOGO);
  1999. }
  2000. // if (dto.getWaimaiOrderId() != null) {
  2001. // DspWaimai waiMai = iDspWaimaiService.getById(dto.getWaimaiId());
  2002. // dto.setLogo(Objects.isNull(waiMai) ? "" : waiMai.getLogo());
  2003. // } else {
  2004. // dto.setLogo(AppConstant.LIE_BAO_LOGO);
  2005. // }
  2006. if (dto.getShopId() != null && StringUtils.isNull(dto.getShopName())) {
  2007. Shop shop = iShopService.getById(dto.getShopId());
  2008. dto.setShopName(Objects.isNull(shop) ? "" : shop.getName());
  2009. }
  2010. // 设置外卖订单件数
  2011. List<WaimaiOrderDetail> orderDetailList = iWaimaiOrderDetailService.list(new QueryWrapper<WaimaiOrderDetail>()
  2012. .eq("waimai_order_id", dto.getWaimaiOrderId())
  2013. .eq("deleted", 0));
  2014. if (CollectionUtils.isNotEmpty(orderDetailList)){
  2015. long totalNum = orderDetailList.stream().mapToLong(WaimaiOrderDetail::getQuantity).sum();
  2016. dto.setSkuNum(orderDetailList.size());
  2017. dto.setTotalNum(totalNum);
  2018. }
  2019. // 设置外卖门店名称
  2020. if (dto.getShopId() != null) {
  2021. List<ShopWaimai> shopWaimai = iShopWaimaiService.list(new QueryWrapper<ShopWaimai>()
  2022. .eq("shop_id", dto.getShopId())
  2023. .eq("bind_status", 1)
  2024. .eq("deleted", 0)
  2025. .orderByDesc("id"));
  2026. // 设置外卖门店名称
  2027. if (CollectionUtils.isNotEmpty(shopWaimai) && shopWaimai.get(0) != null && dto.getShopId() != null && dto.getWaimaiId() != null) {
  2028. dto.setWaimaiShopName(shopWaimai.get(0).getThirdShopName());
  2029. }
  2030. }
  2031. // 计算外卖单用户期望送达时间
  2032. if (dto.getWmDeliveryTime() != null && dto.getWmDeliveryTime() != 0) {
  2033. dto.setExceptTime(new Date(dto.getWmDeliveryTime() * 1000L));
  2034. }
  2035. // 设置相关操作时间
  2036. this.setOrderInfoTime(dto);
  2037. // 设置发件详细地址(发单计价用)
  2038. if (dto.getSendStreet() == null && dto.getSendAddressId() != null && DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(dto.getDeliveryStatus())) {
  2039. MemberAddress memberAddress = iMemberAddressService.findById(memberId, dto.getSendAddressId());
  2040. dto.setSendStreet(memberAddress != null ? memberAddress.getStreet() : "");
  2041. }
  2042. // 设置收件详细地址(发单计价用)
  2043. if (dto.getReceiptStreet() == null && dto.getReceiptAddressId() != null && DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(dto.getDeliveryStatus())) {
  2044. MemberAddress memberAddress = iMemberAddressService.findById(memberId, dto.getReceiptAddressId());
  2045. dto.setReceiptStreet(memberAddress != null ? memberAddress.getStreet() : "");
  2046. }
  2047. // 子订单号、客服电话
  2048. if (StringUtils.isNotEmpty(dto.getOutTradeNo()) && dto.getDeliveryId() != null) {
  2049. String childOrderSn = iOrderDeliveryService.getChildOrderSnByOutTradeNo(dto.getOutTradeNo(), dto.getDeliveryId());
  2050. dto.setChildOrderSn(childOrderSn);
  2051. DspDelivery dspDelivery = iDspDeliveryService.findById(dto.getDeliveryId());
  2052. dto.setCustomerPhone(dspDelivery != null ? dspDelivery.getCustomerPhone() : "");
  2053. }
  2054. // 配送距离
  2055. if (dto.getDeliveryId() == null || dto.getOrderDistance() == null || dto.getOrderDistance().compareTo(BigDecimal.ZERO) == 0) {
  2056. DspDelivery delivery = iDspDeliveryService.getById(dto.getDeliveryId());
  2057. String startLat = dto.getSendLng() + "," + dto.getSendLat();
  2058. String endLat = dto.getReceiptLng() + "," + dto.getReceiptLat();
  2059. if (!Objects.isNull(delivery) && DeliveryTypeEnums.HUO_LA_LA.getType().equals(delivery.getType())){
  2060. dto.setOrderDistance(BigDecimal.valueOf(AddressLngLatExchanger.getDriveDistince(startLat, endLat)));
  2061. } else {
  2062. GDMapTripResult result = AddressLngLatExchanger.getBicyclingInfo(startLat, endLat);
  2063. dto.setOrderDistance(BigDecimal.valueOf(result.getDistance()));
  2064. }
  2065. } else {
  2066. dto.setOrderDistance(dto.getOrderDistance());
  2067. }
  2068. // 设置按钮状态
  2069. dto.setButtonStatus(this.setButtonStatus(dto));
  2070. OrderDelay orderDelay = iOrderDelayService.list(new QueryWrapper<OrderDelay>()
  2071. .eq("order_id", dto.getOrderId())
  2072. .eq("deleted", 0))
  2073. .stream().findFirst().orElse(null);
  2074. // 外卖预约单
  2075. if (dto.getTakeType() > 0 && dto.getWaimaiOrderId() != null) {
  2076. this.setDelayTime(orderDelay, null, dto);
  2077. }
  2078. return dto;
  2079. }
  2080. private void setOrderInfoTime(OrderInfoDto dto) {
  2081. List<OrderLog> orderLogs = iOrderLogService.getOrderLogListByOrderId(dto.getOrderId());
  2082. if (CollectionUtils.isNotEmpty(orderLogs)) {
  2083. List<OrderLog> payList = orderLogs.stream().filter(item -> item.getOrderStatus() != null && item.getOrderStatus() == 5).collect(Collectors.toList());
  2084. List<OrderLog> toBeReceiveList = orderLogs.stream().filter(item -> DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status.equals(item.getOrderStatus())).collect(Collectors.toList());
  2085. List<OrderLog> toBeDeliveredList = orderLogs.stream().filter(item -> DeliveryStatusEnum.TO_BE_DELIVERED.status.equals(item.getOrderStatus())).collect(Collectors.toList());
  2086. List<OrderLog> cancelList = orderLogs.stream().filter(item -> DeliveryStatusEnum.CANCEL.status.equals(item.getOrderStatus()) || DeliveryStatusEnum.ABNORMAL.status.equals(item.getOrderStatus())).collect(Collectors.toList());
  2087. List<OrderLog> finishList = orderLogs.stream().filter(item -> DeliveryStatusEnum.FINISH.status.equals(item.getOrderStatus())).collect(Collectors.toList());
  2088. List<OrderLog> inDeliveredList = orderLogs.stream().filter(item -> DeliveryStatusEnum.IN_DELIVERY.status.equals(item.getOrderStatus())).collect(Collectors.toList());
  2089. // 支付时间
  2090. dto.setPayTime(CollectionUtils.isNotEmpty(payList) ? payList.get(0).getCreateTime() : null);
  2091. // 发单时间
  2092. dto.setSendTime(CollectionUtils.isNotEmpty(toBeReceiveList) ? toBeReceiveList.get(0).getCreateTime() : null);
  2093. // 取消时间
  2094. dto.setCancelTime(CollectionUtils.isNotEmpty(cancelList) ? cancelList.get(0).getCreateTime() : null);
  2095. // 完成时间
  2096. dto.setFinishTime(CollectionUtils.isNotEmpty(finishList) ? finishList.get(0).getCreateTime() : null);
  2097. // 骑手接单时间
  2098. dto.setShipperReceiveTime(CollectionUtils.isEmpty(toBeDeliveredList) ? null : toBeDeliveredList.get(0).getCreateTime());
  2099. // 骑手取货时间
  2100. dto.setShipperTakeTime(CollectionUtils.isEmpty(inDeliveredList) ? null : inDeliveredList.get(0).getCreateTime());
  2101. }
  2102. }
  2103. private Integer setButtonStatus(OrderInfoDto item) {
  2104. if (DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(item.getDeliveryStatus())
  2105. && item.getWmstatus() != null && item.getWmstatus() != 4
  2106. && item.getTakeType()!= null && TakeTypeEnum.NOW.getType().equals(item.getTakeType())) {
  2107. // 新订单
  2108. return 0;
  2109. } else if (DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(item.getDeliveryStatus())
  2110. && item.getTakeType() != null && !TakeTypeEnum.NOW.getType().equals(item.getTakeType())
  2111. && (item.getWaimaiOrderId() == null || (item.getWaimaiOrderId() != null && item.getWmstatus() != null && item.getWmstatus() != 4))) {
  2112. // 预约单
  2113. return 10;
  2114. } else if ((item.getWaimaiOrderId() == null && DeliveryStatusEnum.ABNORMAL.getStatus().equals(item.getDeliveryStatus()))
  2115. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.ABNORMAL.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != null && item.getWmstatus() != 4)) {
  2116. // 异常单
  2117. return -2;
  2118. } else if ((item.getWaimaiOrderId() == null && DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.getStatus().equals(item.getDeliveryStatus()))
  2119. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != null && item.getWmstatus() != 4)) {
  2120. // 待接单
  2121. return 1;
  2122. } else if ((item.getWaimaiOrderId() == null && DeliveryStatusEnum.TO_BE_DELIVERED.getStatus().equals(item.getDeliveryStatus()))
  2123. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.TO_BE_DELIVERED.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != null && item.getWmstatus() != 4)) {
  2124. // 取货中
  2125. return 2;
  2126. } else if ((item.getWaimaiOrderId() == null && DeliveryStatusEnum.IN_DELIVERY.getStatus().equals(item.getDeliveryStatus()))
  2127. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.IN_DELIVERY.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != null && item.getWmstatus() != 4)) {
  2128. // 配送中
  2129. return 3;
  2130. } else if (item.getWaimaiOrderId() == null && DeliveryStatusEnum.CANCEL.getStatus().equals(item.getDeliveryStatus())
  2131. || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.CANCEL.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != 4)) {
  2132. // 已取消
  2133. return -1;
  2134. } else if (DeliveryStatusEnum.FINISH.getStatus().equals(item.getDeliveryStatus())) {
  2135. // 本平台完成
  2136. return 97;
  2137. } else if (item.getWaimaiOrderId() != null && item.getWmstatus() == 4 && !DeliveryStatusEnum.FINISH.getStatus().equals(item.getDeliveryStatus())) {
  2138. // 其他平台完成
  2139. return 98;
  2140. }
  2141. return null;
  2142. }
  2143. @Override
  2144. public OrderGoodsInfoDto getGoodsInfo(Long orderId, Long memberId) {
  2145. Order order = iOrderService.getById(orderId);
  2146. if (order == null) {
  2147. throw new CustomAppException("订单不存在");
  2148. }
  2149. OrderGoodsInfoDto dto = new OrderGoodsInfoDto();
  2150. WaimaiOrder waimaiOrder = iWaimaiOrderService.findById(order.getWaimaiOrderId());
  2151. dto.setOrderTime(waimaiOrder.getOrderTime());
  2152. dto.setOutOrderId(waimaiOrder.getOutOrderId());
  2153. dto.setTotalPrice(waimaiOrder.getTotalPrice());
  2154. List<OrderGoodsInfoDto.Item> goodsItems = Lists.newArrayList();
  2155. // 外卖订单件数
  2156. List<WaimaiOrderDetail> orderDetailList = iWaimaiOrderDetailService.list(new QueryWrapper<WaimaiOrderDetail>()
  2157. .eq("waimai_order_id", order.getWaimaiOrderId())
  2158. .eq("deleted", 0));
  2159. if (CollectionUtils.isNotEmpty(orderDetailList)){
  2160. long totalNum = orderDetailList.stream().mapToLong(WaimaiOrderDetail::getQuantity).sum();
  2161. dto.setSkuNum(orderDetailList.size());
  2162. dto.setTotalNum(totalNum);
  2163. // 外卖商品信息
  2164. MemberConfigDto memberConfig = iMemberConfigService.findDetail(memberId);
  2165. boolean showFoodImg = memberConfig == null || memberConfig.getShowFoodImg() == 1;
  2166. goodsItems = orderDetailList.stream().map(waimaiDetail -> {
  2167. OrderGoodsInfoDto.Item goodsItem = new OrderGoodsInfoDto.Item();
  2168. goodsItem.setFoodName(waimaiDetail.getFoodName());
  2169. goodsItem.setQuantity(waimaiDetail.getQuantity());
  2170. goodsItem.setPrice(waimaiDetail.getPrice());
  2171. goodsItem.setFoodProperty(waimaiDetail.getFoodProperty() == null ? "" : waimaiDetail.getFoodProperty());
  2172. StringBuilder spec = new StringBuilder();
  2173. if(StringUtils.isNotBlank(waimaiDetail.getFoodProperty())){
  2174. spec.append(waimaiDetail.getFoodProperty());
  2175. }
  2176. if(StringUtils.isNotBlank(spec.toString())&&StringUtils.isNotBlank(waimaiDetail.getSpec())){
  2177. spec.append(",").append(waimaiDetail.getSpec());
  2178. }else if(StringUtils.isBlank(spec.toString())&&StringUtils.isNotBlank(waimaiDetail.getSpec())){
  2179. spec.append(waimaiDetail.getSpec());
  2180. }
  2181. // goodsItem.setSpec(waimaiDetail.getSpec() == null ? "" : waimaiDetail.getSpec());
  2182. goodsItem.setSpec(spec.toString());
  2183. if (showFoodImg) {
  2184. WaimaiFoodImg waimaiFoodImg = iWaimaiFoodImgService.getOne(new QueryWrapper<WaimaiFoodImg>()
  2185. .eq("sku_id", waimaiDetail.getSkuId())
  2186. .eq("waimai_id", waimaiOrder.getWaimaiId())
  2187. .eq("shop_id", order.getShopId())
  2188. .eq("deleted", 0));
  2189. goodsItem.setFoodPic(Objects.isNull(waimaiFoodImg) ? "" : waimaiFoodImg.getImg());
  2190. }
  2191. return goodsItem;
  2192. }).collect(Collectors.toList());
  2193. }
  2194. dto.setGoodsList(goodsItems);
  2195. return dto;
  2196. }
  2197. @Override
  2198. public Map<String, Object> pullNewOrder(Long loginId, List<Integer> orderIds, Integer status, String searchShopIdStr) {
  2199. List<OrderDetailDto> list = new ArrayList<>();
  2200. Member member = iMemberService.getById(loginId);
  2201. if (Objects.isNull(member)) {
  2202. throw new CustomAppException("用户不存在!");
  2203. }
  2204. Long shopId = member.getShopId();
  2205. Long merchant = null;
  2206. if (member.getMemberType().equals(MemberTypeEnum.MERCHANT.type)) {
  2207. merchant = member.getMerchantId();
  2208. }
  2209. if(status == null || DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status.equals(status)
  2210. || DeliveryStatusEnum.APPOINTMENT.status.equals(status)) {
  2211. String shopNewOrderListKey = "shop" + shopId + "";
  2212. if (member.getShopId() != null && merchant == null && redisCache.hasKey(shopNewOrderListKey)) {
  2213. Long size = redisCache.getListSize(shopNewOrderListKey);
  2214. log.info("外卖新订单数量:" + size);
  2215. for (int i = 0; i < size.intValue(); i++) {
  2216. list.add((OrderDetailDto) redisCache.rPop(shopNewOrderListKey));
  2217. }
  2218. }
  2219. String merchantNewOrderListKey = "merchant" + merchant + "";
  2220. if (merchant != null && redisCache.hasKey(merchantNewOrderListKey)) {
  2221. Long size = redisCache.getListSize(merchantNewOrderListKey);
  2222. log.info("商家外卖新订单数量:" + size);
  2223. for (int i = 0; i < size.intValue(); i++) {
  2224. list.add((OrderDetailDto) redisCache.rPop(merchantNewOrderListKey));
  2225. }
  2226. }
  2227. } else if (DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status.equals(status)){
  2228. String shopReceivedOrderListKey = "shop_received" + shopId + "";
  2229. if (shopId != null && merchant == null && redisCache.hasKey(shopReceivedOrderListKey)) {
  2230. Long size = redisCache.getListSize(shopReceivedOrderListKey);
  2231. log.info("外卖待接单数量:" + size);
  2232. for (int i = 0; i < size.intValue(); i++) {
  2233. list.add((OrderDetailDto) redisCache.rPop(shopReceivedOrderListKey));
  2234. }
  2235. }
  2236. String merchantReceivedOrderListKey = "merchant_received" + merchant + "";
  2237. if (merchant != null && redisCache.hasKey(merchantReceivedOrderListKey)) {
  2238. Long size = redisCache.getListSize(merchantReceivedOrderListKey);
  2239. log.info("商家待接单数量:" + size);
  2240. for (int i = 0; i < size.intValue(); i++) {
  2241. list.add((OrderDetailDto) redisCache.rPop(merchantReceivedOrderListKey));
  2242. }
  2243. }
  2244. }
  2245. // 过滤已选门店的订单
  2246. if (StringUtils.isNotEmpty(searchShopIdStr)) {
  2247. List<Long> searchShopIds = Lists.newArrayList();
  2248. String[] split = searchShopIdStr.split(",");
  2249. for (String item : split) {
  2250. searchShopIds.add(Long.valueOf(item));
  2251. }
  2252. if (CollectionUtils.isNotEmpty(searchShopIds) && CollectionUtils.isNotEmpty(list)) {
  2253. list = list.stream().filter(item -> searchShopIds.contains(item.getShopId())).collect(Collectors.toList());
  2254. }
  2255. }
  2256. Map<String, Object> map = new HashMap<>();
  2257. List<Long> ids = new ArrayList<>();
  2258. if (CollectionUtils.isNotEmpty(orderIds)) {
  2259. if(DeliveryStatusEnum.APPOINTMENT.status.equals(status)){
  2260. status = DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status;
  2261. }
  2262. List<Order> orderList = iOrderService.list(new QueryWrapper<Order>().in("id", orderIds).ne("delivery_status", status));
  2263. ids = orderList.stream().map(Order::getId).collect(Collectors.toList());
  2264. // 待接单状态下缓存过滤
  2265. list = list.stream().filter(item -> !orderIds.contains(item.getId().intValue())).collect(Collectors.toList());
  2266. }
  2267. log.info("原始新订单: {}", JSONObject.toJSONString(list));
  2268. List<OrderListDto> result = this.buildNewOrderList(list, loginId, status);
  2269. log.info("处理后新订单: {}", JSONObject.toJSONString(result));
  2270. map.put("newList", result);
  2271. map.put("deliveryList", ids);
  2272. return map;
  2273. }
  2274. private List<OrderListDto> buildNewOrderList(List<OrderDetailDto> list, Long memberId, Integer status) {
  2275. List<OrderListDto> result = Lists.newArrayList();
  2276. if (CollectionUtils.isEmpty(list)) {
  2277. return result;
  2278. }
  2279. // 获取订单日志信息
  2280. Map<Long, List<OrderLog>> orderLogMap = new HashMap<>();
  2281. // 获取订单延迟发单信息
  2282. Map<Long, List<OrderDelay>> orderDelayMap = new HashMap<>();
  2283. if (CollectionUtils.isNotEmpty(list)){
  2284. List<Long> orderIds = list.stream().map(OrderDetailDto::getId).collect(Collectors.toList());
  2285. List<OrderLog> orderLogs = iOrderLogService.getOrderLogByOrderIds(orderIds);
  2286. orderLogMap = orderLogs.stream().collect(Collectors.groupingBy(OrderLog::getOrderId));
  2287. orderDelayMap = iOrderDelayService.list(new QueryWrapper<OrderDelay>()
  2288. .in("order_id", orderIds)
  2289. .eq("deleted", 0)).stream().collect(Collectors.groupingBy(OrderDelay::getOrderId));
  2290. }
  2291. List<Long> waimaiOrderIds = list.stream().map(OrderDetailDto::getWaimaiOrderId).collect(Collectors.toList());
  2292. // 外卖订单
  2293. Map<Long, List<WaimaiOrder>> waiMaiOrderMap = new HashMap<>();
  2294. // 外卖商品
  2295. Map<Long, List<WaimaiOrderDetail>> orderDetailMap = new HashMap<>();
  2296. if (CollectionUtils.isNotEmpty(waimaiOrderIds)) {
  2297. waiMaiOrderMap = iWaimaiOrderService.list(new QueryWrapper<WaimaiOrder>()
  2298. .in("id", waimaiOrderIds))
  2299. .stream()
  2300. .collect(Collectors.groupingBy(WaimaiOrder::getId));
  2301. orderDetailMap = iWaimaiOrderDetailService.list(new QueryWrapper<WaimaiOrderDetail>()
  2302. .in("waimai_order_id", waimaiOrderIds)
  2303. .eq("deleted", 0))
  2304. .stream()
  2305. .collect(Collectors.groupingBy(WaimaiOrderDetail::getWaimaiOrderId));
  2306. }
  2307. // 获取外卖门店
  2308. List<Long> shopIds = list.stream().filter(item -> item.getShopId() != null).map(OrderDetailDto::getShopId).collect(Collectors.toList());
  2309. Map<String, List<ShopWaimai>> shopWaiMaiMap = new HashMap<>();
  2310. if (CollectionUtils.isNotEmpty(shopIds)) {
  2311. shopWaiMaiMap = iShopWaimaiService.list(new QueryWrapper<ShopWaimai>()
  2312. .in("shop_id", shopIds)
  2313. .eq("bind_status", 1)
  2314. .eq("deleted", 0))
  2315. .stream()
  2316. .collect(Collectors.groupingBy(item -> item.getShopId() + "-" + item.getWaimaiId()));
  2317. }
  2318. // 待接单状态下获取运力
  2319. Map<String, List<OrderDelivery>> deliveryMap = new HashMap<>();
  2320. if (DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status.equals(status)) {
  2321. List<String> orderSns = list.stream().filter(item -> item.getOrderSn() != null && item.getDeliveryStatus() == 1).map(OrderDetailDto::getOrderSn).collect(Collectors.toList());
  2322. if (CollectionUtils.isNotEmpty(orderSns)) {
  2323. deliveryMap = iOrderDeliveryService.list(new QueryWrapper<OrderDelivery>()
  2324. .in("order_sn", orderSns)
  2325. .eq("deleted", 0))
  2326. .stream()
  2327. .collect(Collectors.groupingBy(OrderDelivery::getOrderSn));
  2328. }
  2329. }
  2330. for (OrderDetailDto detailDto : list) {
  2331. OrderListDto dto = new OrderListDto();
  2332. BeanUtils.copyProperties(detailDto, dto);
  2333. // 外卖订单
  2334. if (waiMaiOrderMap != null && CollectionUtils.isNotEmpty(waiMaiOrderMap.get(dto.getWaimaiOrderId()))){
  2335. List<WaimaiOrder> waimaiOrderList = waiMaiOrderMap.get(dto.getWaimaiOrderId());
  2336. WaimaiOrder waimaiOrder = waimaiOrderList.get(0);
  2337. if (waimaiOrder != null && dto.getWaimaiOrderId() != null) {
  2338. dto.setWaimaiOrderId(waimaiOrder.getId());
  2339. dto.setWaimaiId(waimaiOrder.getWaimaiId());
  2340. dto.setWmstatus(waimaiOrder.getStatus());
  2341. dto.setWmDeliveryTime(waimaiOrder.getDeliveryTime());
  2342. dto.setOrderType(waimaiOrder.getOrderType());
  2343. dto.setProductAmount(waimaiOrder.getTotalPrice());
  2344. dto.setOrderTime(waimaiOrder.getOrderTime());
  2345. DspWaimai waiMai = iDspWaimaiService.getById(waimaiOrder.getWaimaiId());
  2346. dto.setLogo(Objects.isNull(waiMai) ? "" : waiMai.getLogo());
  2347. } else {
  2348. dto.setLogo(AppConstant.LIE_BAO_LOGO);
  2349. }
  2350. }
  2351. if (dto.getShopId() != null && StringUtils.isNull(dto.getShopName())) {
  2352. Shop shop = iShopService.getById(dto.getShopId());
  2353. dto.setShopName(Objects.isNull(shop) ? "" : shop.getName());
  2354. }
  2355. // 设置运力logo
  2356. if (deliveryMap != null && CollectionUtils.isNotEmpty(deliveryMap.get(dto.getOrderSn()))) {
  2357. List<OrderDelivery> orderDeliveries = deliveryMap.get(dto.getOrderSn());
  2358. List<String> logos = orderDeliveries.stream().map(OrderDelivery::getDeliveryLogo).collect(Collectors.toList());
  2359. dto.setDeliveryLogos(logos);
  2360. }
  2361. // 设置外卖门店名称
  2362. if (shopWaiMaiMap != null && shopWaiMaiMap.size() > 0 && dto.getShopId() != null && dto.getWaimaiId() != null) {
  2363. List<ShopWaimai> shopWaimais = shopWaiMaiMap.get(dto.getShopId() + "-" + dto.getWaimaiId());
  2364. if (CollectionUtils.isNotEmpty(shopWaimais) && shopWaimais.get(0) != null) {
  2365. dto.setWaimaiShopName(shopWaimais.get(0).getThirdShopName());
  2366. }
  2367. }
  2368. // 设置外卖订单件数
  2369. if (orderDetailMap != null && CollectionUtils.isNotEmpty(orderDetailMap.get(dto.getWaimaiOrderId()))){
  2370. List<WaimaiOrderDetail> orderDetailList = orderDetailMap.get(dto.getWaimaiOrderId());
  2371. long totalNum = orderDetailList.stream().mapToLong(WaimaiOrderDetail::getQuantity).sum();
  2372. dto.setSkuNum(orderDetailList.size());
  2373. dto.setTotalNum(totalNum);
  2374. }
  2375. // 计算外卖单用户期望送达时间
  2376. if (dto.getWmDeliveryTime() != null && dto.getWmDeliveryTime() != 0) {
  2377. dto.setExceptTime(new Date(dto.getWmDeliveryTime() * 1000L));
  2378. }
  2379. // 设置相关操作时间
  2380. if (orderLogMap.size() > 0) {
  2381. this.setOrderTime(dto, orderLogMap);
  2382. }
  2383. // 设置发件详细地址(发单计价用)
  2384. if (dto.getSendStreet() == null && dto.getSendAddressId() != null && DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(dto.getDeliveryStatus())) {
  2385. MemberAddress memberAddress = iMemberAddressService.findById(memberId, dto.getSendAddressId());
  2386. dto.setSendStreet(memberAddress != null ? memberAddress.getStreet() : "");
  2387. }
  2388. // 设置收件详细地址(发单计价用)
  2389. if (dto.getReceiptStreet() == null && dto.getReceiptAddressId() != null && DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(dto.getDeliveryStatus())) {
  2390. MemberAddress memberAddress = iMemberAddressService.findById(memberId, dto.getReceiptAddressId());
  2391. dto.setReceiptStreet(memberAddress != null ? memberAddress.getStreet() : "");
  2392. }
  2393. OrderDelay orderDelay = null;
  2394. if (orderDelayMap != null && CollectionUtils.isNotEmpty(orderDelayMap.get(dto.getId()))) {
  2395. List<OrderDelay> orderDelays = orderDelayMap.get(dto.getId());
  2396. if (CollectionUtils.isNotEmpty(orderDelays) && orderDelays.get(0) != null) {
  2397. orderDelay = orderDelays.get(0);
  2398. }
  2399. }
  2400. // 外卖预约单
  2401. if (dto.getTakeType() > 0 && dto.getWaimaiOrderId() != null) {
  2402. this.setDelayTime(orderDelay, dto, null);
  2403. }
  2404. // 设置按钮状态
  2405. dto.setButtonStatus(this.getButtonStatus(dto));
  2406. result.add(dto);
  2407. }
  2408. return result;
  2409. }
  2410. }