ApiWaimaiServiceImpl.java 89 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702
  1. package com.ydd.app.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.ydd.api.*;
  5. import com.ydd.app.service.ApiOrderCancelService;
  6. import com.ydd.app.service.ApiWaimaiPrintService;
  7. import com.ydd.app.service.ApiWaimaiService;
  8. import com.ydd.app.task.TriggerProcessTask;
  9. import com.ydd.common.core.redis.RedisCache;
  10. import com.ydd.common.enums.WaimaiTypeEnums;
  11. import com.ydd.common.utils.DateUtils;
  12. import com.ydd.common.utils.SnCodeUtils;
  13. import com.ydd.common.utils.StringUtils;
  14. import com.ydd.ecloud.core.utils.JsonMapper;
  15. import com.ydd.module.domain.*;
  16. import com.ydd.module.dto.OrderDetailDto;
  17. import com.ydd.module.dto.WaimaiListDto;
  18. import com.ydd.module.enums.*;
  19. import com.ydd.module.expection.CustomAppException;
  20. import com.ydd.module.push.MessagePushService;
  21. import com.ydd.module.service.*;
  22. import com.ydd.third.common.config.WaimaiConfig;
  23. import com.ydd.third.common.vo.ResObject;
  24. import com.ydd.third.common.vo.waimai.*;
  25. import com.ydd.third.common.vo.waimai.eleme.api.entity.order.OGoodsItem;
  26. import com.ydd.third.common.vo.waimai.eleme.api.entity.order.OOrder;
  27. import com.ydd.third.common.vo.waimai.eleme.api.entity.order.OrderList;
  28. import com.ydd.third.common.vo.waimai.eleme.api.entity.order.UserExtraInfo;
  29. import com.ydd.third.common.vo.waimai.jdHome.vo.JdHomeOrderResultVo;
  30. import com.ydd.third.common.vo.waimai.meituan.OrderDetailVo;
  31. import com.ydd.third.print.request.PrintOrderDto;
  32. import com.ydd.third.waimai.eleRetai.param.*;
  33. import com.ydd.third.waimai.eleRetai.vo.OrderEBaiInfo;
  34. import com.ydd.third.waimai.eleRetai.vo.OrderEBaiList;
  35. import com.ydd.third.waimai.jdHome.dto.OrderInfoDTO;
  36. import com.ydd.third.waimai.jdHome.dto.OrderInvoiceDTO;
  37. import com.ydd.third.waimai.jdHome.dto.OrderProductDTO;
  38. import com.ydd.third.waimai.jdHome.dto.StoreInfo;
  39. import com.ydd.third.waimai.jdHome.vo.JdHomeParamJsonVo;
  40. import com.ydd.third.waimai.meituanSg.vo.SgOrderDetailVo;
  41. import lombok.RequiredArgsConstructor;
  42. import lombok.SneakyThrows;
  43. import lombok.extern.slf4j.Slf4j;
  44. import org.apache.commons.collections4.CollectionUtils;
  45. import org.springframework.beans.BeanUtils;
  46. import org.springframework.beans.factory.annotation.Autowired;
  47. import org.springframework.context.ApplicationContext;
  48. import org.springframework.scheduling.annotation.Async;
  49. import org.springframework.stereotype.Service;
  50. import org.springframework.transaction.annotation.Transactional;
  51. import org.springframework.transaction.support.TransactionSynchronizationAdapter;
  52. import org.springframework.transaction.support.TransactionSynchronizationManager;
  53. import java.math.BigDecimal;
  54. import java.net.URLDecoder;
  55. import java.text.DecimalFormat;
  56. import java.util.*;
  57. import java.util.concurrent.Executors;
  58. import java.util.concurrent.ScheduledExecutorService;
  59. import java.util.concurrent.TimeUnit;
  60. /**
  61. * Project:lb-server
  62. * Class:ApiWaimaiServiceImpl
  63. * Description:TODO
  64. * Time:2021/3/2 17:16
  65. *
  66. * @author zoe
  67. */
  68. @Slf4j
  69. @Service
  70. @RequiredArgsConstructor(onConstructor_ = @Autowired)
  71. public class ApiWaimaiServiceImpl implements ApiWaimaiService {
  72. public static ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
  73. private final IShopWaimaiService iShopWaimaiService;
  74. private final IShopService iShopService;
  75. private final IMemberConfigService iMemberConfigService;
  76. private final IDspWaimaiService iDspWaimaiService;
  77. private final MeiTuanApi meituanClient;
  78. private final MeiTuanSgApi meituanSgClient;
  79. private final JdHomeApi jdHomeClient;
  80. private final IWaimaiOrderService iWaimaiOrderService;
  81. private final IMemberService iMemberService;
  82. private final IMerchantService iMerchantService;
  83. private final IDadaDspService iDadaDspService;
  84. private final IOrderService iOrderService;
  85. private final IWaimaiOrderDetailService iWaimaiOrderDetailService;
  86. // private final IShopDeviceService iShopDeviceService;
  87. // private final ApiProductService apiProductService;
  88. //
  89. // private final UnifiedPrintService unifiedPrintService;
  90. private final MessagePushService messagePushService;
  91. private final ElemeApi elemeClient;
  92. private final ApplicationContext applicationContext;
  93. // private final Client client;
  94. //
  95. // private final IDspDeliveryService iDspDeliveryService;
  96. //
  97. // private final IMemberBalanceLogService iMemberBalanceLogService;
  98. private final RedisCache redisCache;
  99. private final ApiOrderCancelService apiOrderCancelService;
  100. private final EleRetailApi eleRetaiClient;
  101. private final IAgentService iAgentService;
  102. // private final IShopUserService iShopUserService;
  103. private final IMerchantCategoryService iMerchantCategoryService;
  104. private final WaimaiConfig waimaiConfig;
  105. private final ApiWaimaiPrintService apiWaimaiPrintService;
  106. private final IOrderDeliveryService iOrderDeliveryService;
  107. private final IWaimaiFoodImgService iWaimaiFoodImgService;
  108. private final IShopJdHomeService iShopJdHomeService;
  109. private final IShopJdHomeCodeService iShopJdHomeCodeService;
  110. //
  111. // /**
  112. // * 绑定外卖平台
  113. // *
  114. // * @param loginId
  115. // * @param waimaiId
  116. // * @param shopId
  117. // * @param isNew 是否是新版本,有值是新版本
  118. // * @param mtBindType 美团外卖绑定类型:1->冲突模式,2->非冲突模式
  119. // * @return
  120. // */
  121. // @Override
  122. // public String bind(Long loginId, Long waimaiId, Long shopId, Integer isNew,Integer mtBindType) {
  123. // Shop shop = iShopService.getById(shopId);
  124. // if (isNew != null) {
  125. // // 判断门店是否有员工账号,没有提示
  126. //// List<ShopUser> shopUsers = iShopUserService.queryByShopId(shopId);
  127. //// if (shopUsers == null || shopUsers.size() == 0){
  128. //// throw new CustomAppException("请先添加该门店账号",201);
  129. //// }
  130. // ShopWaimai shopWaimai = iShopWaimaiService.findById(shopId, waimaiId);
  131. // if (shopWaimai != null) {
  132. // throw new CustomAppException("已绑定成功!");
  133. // }
  134. // }
  135. // DspWaimai waimai = iDspWaimaiService.getById(waimaiId);
  136. // String url = null;
  137. // if (waimai.getType().equals(WaimaiTypeEnums.MEI_TUAN.getType())) {
  138. // url = meituanClient.storeMapUrl(shop.getCode(), shop.getName(),mtBindType);
  139. // } else if (waimai.getType().equals(WaimaiTypeEnums.E_LE_ME.getType())) {
  140. // url = elemeAuthClient.getOAuthUrl(shop.getCode());
  141. // } else if (waimai.getType().equals(WaimaiTypeEnums.E_LE_ME_RETAIL.getType())) {
  142. // url = waimaiConfig.getEleRetailUrl();
  143. // } else if (waimai.getType().equals(WaimaiTypeEnums.MEI_TUAN_SG.getType())) {
  144. // url = waimaiConfig.getMeituansgUrl();
  145. // }
  146. // return url;
  147. // }
  148. @Override
  149. @Transactional
  150. @Async
  151. public void doNewOrder(MeituanOrderResultVo orderVo) {
  152. DspWaimai waimai = iDspWaimaiService.findOne(WaimaiTypeEnums.MEI_TUAN.getType());
  153. // Shop shop = iShopService.getOne(new QueryWrapper<Shop>().eq("code", orderVo.getEPoiId()));
  154. ShopWaimai shopWaimai =iShopWaimaiService.getOne(new QueryWrapper<ShopWaimai>().eq("epoid", orderVo.getEPoiId())
  155. .eq("deleted",IsDeleteEnum.NORMAL.status)
  156. .eq("waimai_id",waimai.getId())
  157. .eq("bind_status",BindStatusEnum.BIND.status));
  158. Long memberId = null;
  159. List<Long> memberIds = iMemberService.selectByShopId(shopWaimai.getShopId());
  160. if(CollectionUtils.isNotEmpty(memberIds)){
  161. memberId = memberIds.get(0);
  162. }else{
  163. Member member = iMemberService.findOne(shopWaimai.getMerchantId());
  164. memberId = member.getId();
  165. }
  166. MemberConfig config = iMemberConfigService.getOne(new QueryWrapper<MemberConfig>().eq("member_id",memberId));
  167. // ShopWaimai shopWaimai = iShopWaimaiService.findById(shop.getId(), waimai.getId());
  168. if (config != null && StatusEnum.SHOW.status.equals(config.getOpenAutoorder())) {
  169. ConfirmOrderVo confirmOrderVo = new ConfirmOrderVo();
  170. confirmOrderVo.setLbClient(WaimaiTypeEnums.MEI_TUAN.getName());
  171. confirmOrderVo.setOrderId(orderVo.getOrderId());
  172. confirmOrderVo.setAppAuthToken(shopWaimai.getAuthToken());
  173. ResObject resObject = meituanClient.confirmOrder(confirmOrderVo);
  174. log.info("=======美团订单确认结果=====" + JsonMapper.nonEmptyMapper().toJson(resObject));
  175. }
  176. }
  177. @Override
  178. @Transactional
  179. @Async
  180. public void sgDoNewOrder(MeituanSgOrderResultVo orderVo) {
  181. DspWaimai waimai = iDspWaimaiService.findOne(WaimaiTypeEnums.MEI_TUAN_SG.getType());
  182. // Shop shop = iShopService.getOne(new QueryWrapper<Shop>().eq("code", orderVo.getAppPoiCode()));
  183. ShopWaimai shopWaimai =iShopWaimaiService.getOne(new QueryWrapper<ShopWaimai>().eq("epoid", orderVo.getAppPoiCode())
  184. .eq("deleted",IsDeleteEnum.NORMAL.status)
  185. .eq("waimai_id",waimai.getId())
  186. .eq("bind_status",BindStatusEnum.BIND.status));
  187. Long memberId = null;
  188. List<Long> memberIds = iMemberService.selectByShopId(shopWaimai.getShopId());
  189. if(CollectionUtils.isNotEmpty(memberIds)){
  190. memberId = memberIds.get(0);
  191. }else{
  192. Member member = iMemberService.findOne(shopWaimai.getMerchantId());
  193. memberId = member.getId();
  194. }
  195. MemberConfig config = iMemberConfigService.getOne(new QueryWrapper<MemberConfig>().eq("member_id",memberId));
  196. // DspWaimai waimai = iDspWaimaiService.findOne(WaimaiTypeEnums.MEI_TUAN_SG.getType());
  197. // ShopWaimai shopWaimai = iShopWaimaiService.findById(shop.getId(), waimai.getId());
  198. if (config != null && StatusEnum.SHOW.status.equals(config.getOpenAutoorder())) {
  199. ConfirmOrderVo confirmOrderVo = new ConfirmOrderVo();
  200. confirmOrderVo.setLbClient(WaimaiTypeEnums.MEI_TUAN_SG.getName());
  201. confirmOrderVo.setOrderId(orderVo.getOrderId());
  202. confirmOrderVo.setAppAuthToken(shopWaimai.getAuthToken());
  203. ResObject resObject = meituanSgClient.confirmOrder(confirmOrderVo);
  204. log.info("=======美团闪购订单确认结果=====" + JsonMapper.nonEmptyMapper().toJson(resObject));
  205. }
  206. }
  207. @Override
  208. @Async
  209. public void doCancelOrder(MeituanOrderCancelResultVo orderCancelVo) {
  210. WaimaiOrder waimaiOrder = iWaimaiOrderService.getOne(new QueryWrapper<WaimaiOrder>().eq("out_order_id", orderCancelVo.getOrderId()));
  211. if (waimaiOrder != null) {
  212. String title = "您有一个外卖订单被顾客取消,请及时查看";
  213. String content = "您有一个外卖订单被顾客取消,请及时查看";
  214. redisCache.redisTemplate.opsForValue().set(orderCancelVo.getOrderId()+ "_lock", "1", 60, TimeUnit.MINUTES);
  215. messagePushService.userCancelOrderMessage(waimaiOrder.getShopId(), title, content, waimaiOrder.getId());
  216. log.info("------->取消订单" + orderCancelVo.getOrderId());
  217. cancelOrder(waimaiOrder);
  218. try {
  219. String json = redisCache.redisTemplate.opsForValue().get("mt-order:"+orderCancelVo.getOrderId()) + "";
  220. if (StringUtils.isNotBlank(json)){
  221. MeituanOrderResultVo meiTuanOrderResultVo = JSONObject.parseObject(json, MeituanOrderResultVo.class);
  222. PrintOrderDto printOrderDto = MeiTuanConvertPrint.convert(meiTuanOrderResultVo);
  223. printOrderDto.setOrderStatus(OrderStatusEnum.CANCEL.status);
  224. List<WaimaiOrderDetail> detailList = iWaimaiOrderDetailService.list(new QueryWrapper<WaimaiOrderDetail>().eq("waimai_order_id", waimaiOrder.getId()));
  225. apiWaimaiPrintService.autoPrintWaimaiNew(printOrderDto, detailList, waimaiOrder.getShopId(),waimaiOrder);
  226. }
  227. } catch (Exception e) {
  228. log.error("自动打印异常!", e);
  229. }
  230. }
  231. }
  232. @Override
  233. @Async
  234. public void sgDoCancelOrder(MeituanSgOrderCancelResultVo orderCancelVo) {
  235. WaimaiOrder waimaiOrder = iWaimaiOrderService.getOne(new QueryWrapper<WaimaiOrder>().eq("out_order_id", orderCancelVo.getOrderId()));
  236. if (waimaiOrder != null) {
  237. String title = "您有一个外卖订单被顾客取消,请及时查看";
  238. String content = "您有一个外卖订单被顾客取消,请及时查看";
  239. redisCache.redisTemplate.opsForValue().set(orderCancelVo.getOrderId()+ "_lock", "1", 60, TimeUnit.MINUTES);
  240. messagePushService.userCancelOrderMessage(waimaiOrder.getShopId(), title, content,waimaiOrder.getId());
  241. log.info("------->闪购取消订单" + orderCancelVo.getOrderId());
  242. cancelOrder(waimaiOrder);
  243. try {
  244. String json = redisCache.redisTemplate.opsForValue().get("mtsg-order:"+orderCancelVo.getOrderId()) + "";
  245. if (StringUtils.isNotBlank(json)){
  246. MeituanSgOrderResultVo vo = JSONObject.parseObject(json, MeituanSgOrderResultVo.class);
  247. PrintOrderDto printOrderDto = MeiTuanSgConvertPrint.convert(vo);
  248. printOrderDto.setOrderStatus(OrderStatusEnum.CANCEL.status);
  249. List<WaimaiOrderDetail> detailList = iWaimaiOrderDetailService.list(new QueryWrapper<WaimaiOrderDetail>().eq("waimai_order_id", waimaiOrder.getId()));
  250. apiWaimaiPrintService.autoPrintWaimaiNew(printOrderDto, detailList, waimaiOrder.getShopId(),waimaiOrder);
  251. }
  252. } catch (Exception e) {
  253. log.error("自动打印异常!", e);
  254. }
  255. }
  256. }
  257. //
  258. @Override
  259. @Async
  260. @Transactional
  261. public void doConfirmOrder(MeituanOrderResultVo orderVo) {
  262. // Shop shop = iShopService.getOne(new QueryWrapper<Shop>().eq("code", orderVo.getEPoiId()));
  263. DspWaimai waimai = iDspWaimaiService.findOne(WaimaiTypeEnums.MEI_TUAN.getType());
  264. ShopWaimai shopWaimai =iShopWaimaiService.getOne(new QueryWrapper<ShopWaimai>().eq("epoid", orderVo.getEPoiId())
  265. .eq("deleted",IsDeleteEnum.NORMAL.status)
  266. .eq("waimai_id",waimai.getId())
  267. .eq("bind_status",BindStatusEnum.BIND.status));
  268. Shop shop = iShopService.getById(shopWaimai.getShopId());
  269. WaimaiOrder waimaiOrder = iWaimaiOrderService.getOne(new QueryWrapper<WaimaiOrder>().eq("out_order_id", orderVo.getOrderId()));
  270. if (waimaiOrder == null) {
  271. waimaiOrder = new WaimaiOrder();
  272. BeanUtils.copyProperties(orderVo, waimaiOrder);
  273. ResObject<String> res = meituanClient.getRealRecipientAddress(shopWaimai.getAuthToken(),orderVo.getOrderId());
  274. String recipientAddress = orderVo.getRecipientAddress();
  275. if(res.getCode()==0){
  276. recipientAddress = res.getData();
  277. }
  278. String recipientAddressDesensitization = orderVo.getRecipientAddressDesensitization();
  279. if (recipientAddress.contains("@#")) {
  280. recipientAddress = recipientAddress.substring(0,recipientAddress.indexOf("@#"));
  281. }
  282. waimaiOrder.setRecipientAddress(recipientAddress);
  283. waimaiOrder.setRecipientAddressDesensitization(recipientAddressDesensitization);
  284. waimaiOrder.setLogisticsCode(orderVo.getLogisticsCode());
  285. String remark = orderVo.getCaution();
  286. if(StringUtils.isNotBlank(remark)&&remark.contains("[预")){
  287. remark = remark.substring(remark.indexOf("[预"),remark.indexOf("[预")+8)+"****"+remark.substring(remark.indexOf("[预")+12,remark.length());
  288. }
  289. waimaiOrder.setCaution(remark);
  290. // Map<String, Double> map = AddressLngLatExchanger.addressToLngAndLag(recipientAddress);
  291. //
  292. // if (map != null) {
  293. // waimaiOrder.setReceiptLat(map.get("lat") + "");
  294. // waimaiOrder.setReceiptLng(map.get("lng") + "");
  295. // }
  296. // todo: 美团收货人隐私号
  297. waimaiOrder.setReceiptPrivacyPhone(null);
  298. waimaiOrder.setReceiptLat(orderVo.getLatitude().toString());
  299. waimaiOrder.setReceiptLng(orderVo.getLongitude().toString());
  300. waimaiOrder.setExtras(JSONObject.toJSONString(orderVo.getExtras()));
  301. waimaiOrder.setStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
  302. waimaiOrder.setShopId(shop.getId());
  303. waimaiOrder.setWaimaiId(waimai.getId());
  304. waimaiOrder.setOrderidView(orderVo.getOrderIdView());
  305. waimaiOrder.setOutOrderId(orderVo.getOrderId());
  306. waimaiOrder.setOrderType(WaimaiOrderTypeEnum.MEI_TUAN.getType());
  307. waimaiOrder.setTotalPrice(orderVo.getTotal());
  308. waimaiOrder.setCreateTime(new Date());
  309. long createTime = orderVo.getCtime() * 1000L;
  310. waimaiOrder.setOrderTime(new Date(createTime));
  311. BigDecimal boxFee = BigDecimal.ZERO;
  312. if (CollectionUtils.isNotEmpty(orderVo.getDetail())) {
  313. for (OrderDetailVo vo : orderVo.getDetail()) {
  314. boxFee = vo.getBoxPrice().multiply(new BigDecimal(vo.getBoxNum()));
  315. }
  316. }
  317. waimaiOrder.setBoxFee(boxFee);
  318. waimaiOrder.setThirdShopId(shopWaimai.getThirdShopId());
  319. iWaimaiOrderService.save(waimaiOrder);
  320. //消息推送
  321. // messagePushService.waimaiMessage(shop.getId(), waimaiOrder);
  322. //记录商品详情
  323. List<WaimaiOrderDetail> detailList = new ArrayList<>();
  324. if (CollectionUtils.isNotEmpty(orderVo.getDetail())) {
  325. for (OrderDetailVo vo : orderVo.getDetail()) {
  326. WaimaiOrderDetail detail = new WaimaiOrderDetail();
  327. BeanUtils.copyProperties(vo, detail);
  328. if(vo.getActualPrice()!=null){
  329. detail.setPrice(vo.getActualPrice());
  330. }
  331. detail.setQuantity(Long.valueOf(vo.getQuantity()));
  332. detail.setWaimaiOrderId(waimaiOrder.getId());
  333. detail.setSkuId(vo.getMtSpuId()+"");
  334. detailList.add(detail);
  335. //iWaimaiOrderDetailService.save(detail);
  336. }
  337. iWaimaiOrderDetailService.saveBatch(detailList);
  338. }
  339. //自动打印外卖单
  340. redisCache.redisTemplate.opsForValue().set("mt-order:"+orderVo.getOrderId() + "", JSONObject.toJSONString(orderVo),2,TimeUnit.DAYS);
  341. try {
  342. // redisCache.setNumber(shop.getId(),Integer.parseInt(orderVo.getDaySeq()));
  343. // autoPrintWaimai(waimaiOrder, detailList);
  344. PrintOrderDto printOrderDto = MeiTuanConvertPrint.convert(orderVo);
  345. apiWaimaiPrintService.autoPrintWaimaiNew(printOrderDto, detailList, shop.getId(),waimaiOrder);
  346. } catch (Exception e) {
  347. log.error("自动打印异常!", e);
  348. }
  349. try {
  350. //推送外卖新消息
  351. messagePushService.waimaiMessage(shop.getId(), waimaiOrder);
  352. } catch (Exception e) {
  353. log.error("推送外卖订单消息异常,订单号:" + waimaiOrder.getOutOrderId());
  354. }
  355. //产生配送订单
  356. addOrder(shop, waimaiOrder,waimai,SnCodeUtils.createSn());
  357. }
  358. }
  359. @SneakyThrows
  360. @Override
  361. @Async
  362. @Transactional
  363. public void sgConfirmOrder(MeituanSgOrderResultVo orderVo) {
  364. DspWaimai waimai = iDspWaimaiService.findOne(WaimaiTypeEnums.MEI_TUAN_SG.getType());
  365. ShopWaimai shopWaimai =iShopWaimaiService.getOne(new QueryWrapper<ShopWaimai>()
  366. .eq("epoid", orderVo.getAppPoiCode())
  367. .eq("deleted",IsDeleteEnum.NORMAL.status)
  368. .eq("waimai_id",waimai.getId())
  369. .eq("bind_status",BindStatusEnum.BIND.status));
  370. Shop shop = iShopService.getById(shopWaimai.getShopId());
  371. WaimaiOrder waimaiOrder = iWaimaiOrderService.getOne(new QueryWrapper<WaimaiOrder>().eq("out_order_id", orderVo.getOrderId()));
  372. if (waimaiOrder == null) {
  373. waimaiOrder = new WaimaiOrder();
  374. BeanUtils.copyProperties(orderVo, waimaiOrder);
  375. String recipientAddress = URLDecoder.decode(orderVo.getRecipientAddress(), "utf-8");
  376. // String recipientAddressDesensitization = orderVo.getRecipientAddressDesensitization();
  377. if (recipientAddress.contains("@#")) {
  378. recipientAddress = recipientAddress.substring(0,recipientAddress.indexOf("@#"));
  379. waimaiOrder.setRecipientAddress(recipientAddress);
  380. }
  381. waimaiOrder.setRecipientAddressDesensitization(recipientAddress);
  382. waimaiOrder.setLogisticsCode(orderVo.getLogisticsCode());
  383. String remark = URLDecoder.decode(orderVo.getCaution(), "utf-8");
  384. if(StringUtils.isNotBlank(remark)&&remark.contains("[预")){
  385. remark = remark.substring(remark.indexOf("[预"),remark.indexOf("[预")+8)+"****"+remark.substring(remark.indexOf("[预")+12,remark.length());
  386. }
  387. waimaiOrder.setCaution(remark);
  388. // Map<String, Double> map = AddressLngLatExchanger.addressToLngAndLag(recipientAddress);
  389. //
  390. // if (map != null) {
  391. // waimaiOrder.setReceiptLat(map.get("lat") + "");
  392. // waimaiOrder.setReceiptLng(map.get("lng") + "");
  393. // }
  394. // todo: 美团收货人隐私号
  395. waimaiOrder.setWaimaiId(waimai.getId());
  396. waimaiOrder.setShopId(shop.getId());
  397. waimaiOrder.setCityId(orderVo.getCityId());
  398. waimaiOrder.setOutOrderId(orderVo.getOrderId());
  399. waimaiOrder.setOrderidView(orderVo.getWmOrderIdView());
  400. long createTime = orderVo.getCtime() * 1000L;
  401. waimaiOrder.setOrderTime(new Date(createTime));
  402. orderVo.setRecipientName(URLDecoder.decode(orderVo.getRecipientName(), "utf-8"));
  403. waimaiOrder.setRecipientName(orderVo.getRecipientName());
  404. waimaiOrder.setDaySeq(orderVo.getDaySeq().toString());
  405. orderVo.setDetail(URLDecoder.decode(orderVo.getDetail(), "utf-8"));
  406. waimaiOrder.setDetail(orderVo.getDetail());
  407. orderVo.setExtras(URLDecoder.decode(orderVo.getExtras(), "utf-8"));
  408. waimaiOrder.setExtras(orderVo.getExtras());
  409. waimaiOrder.setIsThirdShipping(orderVo.getIsThirdShipping());
  410. waimaiOrder.setReceiptLat(orderVo.getLatitude().toString());
  411. waimaiOrder.setReceiptLng(orderVo.getLongitude().toString());
  412. orderVo.setWmPoiAddress(URLDecoder.decode(orderVo.getWmPoiAddress(), "utf-8"));
  413. waimaiOrder.setPoiAddress(orderVo.getWmPoiAddress());
  414. orderVo.setWmPoiName(URLDecoder.decode(orderVo.getWmPoiName(), "utf-8"));
  415. waimaiOrder.setPoiName(orderVo.getWmPoiName());
  416. waimaiOrder.setPoiPhone(orderVo.getWmPoiPhone());
  417. waimaiOrder.setPoiReceiveDetail(null);
  418. waimaiOrder.setReceiptPrivacyPhone(null);
  419. waimaiOrder.setStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
  420. waimaiOrder.setOrderType(WaimaiOrderTypeEnum.MEI_TUAN_SG.getType());
  421. waimaiOrder.setTotalPrice(orderVo.getTotal());
  422. waimaiOrder.setCreateTime(new Date());
  423. BigDecimal boxFee = BigDecimal.ZERO;
  424. if (CollectionUtils.isNotEmpty(orderVo.getDetailList())) {
  425. for (SgOrderDetailVo vo : orderVo.getDetailList()) {
  426. boxFee = vo.getBoxPrice().multiply(vo.getBoxNum());
  427. }
  428. }
  429. waimaiOrder.setBoxFee(boxFee);
  430. waimaiOrder.setThirdShopId(shopWaimai.getThirdShopId());
  431. iWaimaiOrderService.save(waimaiOrder);
  432. //消息推送
  433. // messagePushService.waimaiMessage(shop.getId(), waimaiOrder);
  434. //记录商品详情
  435. List<WaimaiOrderDetail> detailList = new ArrayList<>();
  436. if (CollectionUtils.isNotEmpty(orderVo.getDetailList())) {
  437. for (SgOrderDetailVo vo : orderVo.getDetailList()) {
  438. WaimaiOrderDetail detail = new WaimaiOrderDetail();
  439. BeanUtils.copyProperties(vo, detail);
  440. detail.setQuantity(Long.valueOf(vo.getQuantity()));
  441. detail.setWaimaiOrderId(waimaiOrder.getId());
  442. detail.setBoxNum(vo.getBoxNum().toString());
  443. detailList.add(detail);
  444. //iWaimaiOrderDetailService.save(detail);
  445. }
  446. iWaimaiOrderDetailService.saveBatch(detailList);
  447. }
  448. //自动打印外卖单
  449. redisCache.redisTemplate.opsForValue().set("mtsg-order:"+orderVo.getOrderId() + "", JSONObject.toJSONString(orderVo),2,TimeUnit.DAYS);
  450. try {
  451. // redisCache.setNumber(shop.getId(),Integer.parseInt(orderVo.getDaySeq()));
  452. // autoPrintWaimai(waimaiOrder, detailList);
  453. PrintOrderDto printOrderDto = MeiTuanSgConvertPrint.convert(orderVo);
  454. apiWaimaiPrintService.autoPrintWaimaiNew(printOrderDto, detailList, shop.getId(),waimaiOrder);
  455. } catch (Exception e) {
  456. log.error("自动打印异常!", e);
  457. }
  458. try {
  459. //推送外卖新消息
  460. messagePushService.waimaiMessage(shop.getId(), waimaiOrder);
  461. } catch (Exception e) {
  462. log.error("推送外卖订单消息异常,订单号:" + waimaiOrder.getOutOrderId());
  463. }
  464. //产生配送订单
  465. addOrder(shop, waimaiOrder,waimai,SnCodeUtils.createSn());
  466. }
  467. }
  468. @Override
  469. @Transactional
  470. public void addOrder(Shop shop, WaimaiOrder waimaiOrder,DspWaimai waimai,String orderSn) {
  471. // Order order = iOrderService.getOne(new QueryWrapper<Order>().eq("waimai_order_id", waimaiOrder.getId()).ne("delivery_status",DeliveryStatusEnum.CANCEL.status));
  472. Order order = iOrderService.getOne(new QueryWrapper<Order>().eq("waimai_order_id", waimaiOrder.getId()).eq("deleted",0));
  473. // Member member = iMemberService.findOne(shop.getMerchantId());
  474. Member member = new Member();
  475. List<Member> memberList = iMemberService.list(new QueryWrapper<Member>().eq("shop_id", shop.getId()).eq("status", StatusEnum.SHOW.status).eq("deleted", 0));
  476. if (CollectionUtils.isNotEmpty(memberList)) {
  477. member = memberList.get(0);
  478. } else {
  479. member = iMemberService.findOne(shop.getMerchantId());
  480. }
  481. if (order == null) {
  482. order = new Order();
  483. if (waimaiOrder.getDeliveryTime().intValue() == 0) {
  484. order.setTakeTime(DateUtils.getNowDate());
  485. order.setTakeType(TakeTypeEnum.NOW.type);
  486. } else {
  487. // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  488. //预计送达时间 减一小时 转换预计取件时间
  489. order.setTakeTime( DateUtils.addHours(new Date(Long.valueOf(waimaiOrder.getDeliveryTime() + "000")),-1));
  490. order.setTakeType(TakeTypeEnum.APPOINTMENT.type);
  491. }
  492. order.setSendLng(shop.getLng());
  493. order.setSendLat(shop.getLat());
  494. order.setPaymentType(PaymentTypeEnum.BALANCE.type);
  495. order.setOrderSn(orderSn);
  496. order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
  497. order.setStatus(OrderStatusEnum.NO_PAYED.status);
  498. if (waimaiOrder.getStatus() != null && waimaiOrder.getStatus().equals(DeliveryStatusEnum.CANCEL.status)){
  499. order.setDeliveryStatus(DeliveryStatusEnum.CANCEL.status);
  500. order.setCancelReason("用户取消");
  501. order.setStatus(DeliveryStatusEnum.CANCEL.status);
  502. }
  503. order.setMemberId(member.getId());
  504. order.setReceiptAddress(waimaiOrder.getRecipientAddress());
  505. order.setReceiptContactName(waimaiOrder.getRecipientName());
  506. order.setReceiptPhone(waimaiOrder.getRecipientPhone());
  507. order.setReceiptPrivacyPhone(waimaiOrder.getReceiptPrivacyPhone());
  508. order.setReceiptLng(waimaiOrder.getReceiptLng());
  509. order.setReceiptLat(waimaiOrder.getReceiptLat());
  510. order.setReceiptCityName(shop.getCityName());
  511. order.setReceiptCityCode(shop.getCityCode());
  512. order.setReceiptDistrictName(shop.getDistrictName());
  513. // if (shop.getStreet() != null) {
  514. // order.setSendStreet(shop.getStreet());
  515. // }
  516. if (shop.getStreet() != null) {
  517. order.setSendStreet(shop.getStreet());
  518. order.setSendAddress(shop.getAddress() + shop.getStreet());
  519. } else {
  520. order.setSendAddress(shop.getAddress());
  521. }
  522. order.setSendCityName(shop.getCityName());
  523. order.setSendContactName(shop.getContactName());
  524. order.setSendDistrictName(shop.getDistrictName());
  525. order.setSendPhone(shop.getMobile());
  526. order.setSendProvinceName(shop.getProvinceName());
  527. order.setSendCityCode(shop.getCityCode());
  528. order.setSendLat(shop.getLat());
  529. order.setSendLng(shop.getLng());
  530. order.setShopName(shop.getName());
  531. order.setWaimaiOrderId(waimaiOrder.getId());
  532. order.setShopId(waimaiOrder.getShopId());
  533. order.setMerchantId(shop.getMerchantId());
  534. order.setProductId(shop.getCategoryId());
  535. MerchantCategory category = iMerchantCategoryService.getById(shop.getCategoryId());
  536. if (category != null) {
  537. order.setProductName(category.getName());
  538. } else {
  539. order.setProductName("其他");
  540. }
  541. order.setWeight(1);
  542. order.setDeleted(0);
  543. Member member1 = iMemberService.findOne(shop.getMerchantId());
  544. if (member1.getAgentId() != null) {
  545. order.setAgentId(member1.getAgentId());
  546. order.setAgentIdSource(member1.getAgentSource());
  547. if (member1.getPersonnelId() != null){
  548. order.setPersonnelId(member1.getPersonnelId());
  549. }
  550. } else {
  551. // 判断区域,只给一级代理商
  552. Agent agent = iAgentService.findByArea(order.getSendCityName(), order.getSendDistrictName());
  553. if (agent != null) {
  554. order.setAgentId(agent.getId());
  555. order.setAgentIdSource(AgentSourceEnum.QU_YU.status);
  556. }
  557. }
  558. iOrderService.save(order);
  559. //新订单轮询用
  560. OrderDetailDto dto = new OrderDetailDto();
  561. BeanUtils.copyProperties(order,dto);
  562. dto.setCaution(waimaiOrder.getCaution());
  563. dto.setOutOrderId(waimaiOrder.getOutOrderId());
  564. dto.setDaySeq(waimaiOrder.getDaySeq());
  565. dto.setOrderType(waimaiOrder.getOrderType());
  566. dto.setUpdateTime(new Date());
  567. dto.setWaimaiLogo(waimai.getLogo());
  568. dto.setExceptTime(waimaiOrder.getDeliveryTime());
  569. dto.setOrderTime(waimaiOrder.getOrderTime());
  570. redisCache.redisTemplate.opsForList().leftPush("shop"+shop.getId() + "", dto);
  571. redisCache.redisTemplate.expire("shop"+shop.getId(),30,TimeUnit.MINUTES);
  572. redisCache.redisTemplate.opsForList().leftPush("merchant"+shop.getMerchantId() + "", dto);
  573. redisCache.redisTemplate.expire("merchant"+shop.getMerchantId(),30,TimeUnit.MINUTES);
  574. // Product product = apiProductService.findById(order.getProductId().intValue());
  575. // order.setProduct(product);
  576. }
  577. if (StringUtils.isNotBlank(waimaiOrder.getTakeRemark())){
  578. order.setTakeRemark(waimaiOrder.getTakeRemark());
  579. }
  580. Merchant merchant = iMerchantService.getById(shop.getMerchantId());
  581. if (merchant != null && merchant.getDadaDspId() != null) {
  582. DadaDsp dadaDsp = iDadaDspService.getById(merchant.getDadaDspId());
  583. if (dadaDsp != null) {
  584. order.setDadaDspId(dadaDsp.getId());
  585. order.setDadaDspType(DadaDspRoleEnum.SELF_DELIVERY.type.equals(dadaDsp.getDspRole()) ? OrderDadaDspTypeEnum.DELIVERY.type : OrderDadaDspTypeEnum.DELIVERY_RAP.type);
  586. }
  587. }
  588. MemberConfig config = iMemberConfigService.getShopMemberConfig(shop.getId(), null);
  589. // 非自动拉取、非撤回的预约单, 设置预约单提前发单时间快照
  590. if (waimaiOrder.getAutoOrder() == null && order.getTakeType() > 0 && config != null && StatusEnum.SHOW.status.equals(config.getOpenBookingAutodelivery()) && config.getBookingAutodeliveryOrderTime() != null) {
  591. order.setAutoDeliveryMinutes(config.getBookingAutodeliveryOrderTime() / 60);
  592. }
  593. iOrderService.updateById(order);
  594. log.info("自动配送外卖信息==="+JSONObject.toJSONString(waimaiOrder));
  595. if (waimaiOrder.getAutoOrder() == null) { // 自动配送,并且是非自动拉取的订单, 非撤回订单
  596. log.info("自动配送用户信息==="+JSONObject.toJSONString(config));
  597. // 即时单发单配置
  598. if (config != null && order.getTakeType() == 0) {
  599. if (StatusEnum.SHOW.status.equals(config.getOpenAutodelivery())) {
  600. final Long deliver = config.getAutodeliveryOrderTime();
  601. log.info("立即单,订单号 {}触发自动配送, 预计{} 秒后发起" + order.getOrderSn(), deliver);
  602. try {
  603. autoDelivery(order, config, deliver);
  604. } catch (Exception e) {
  605. log.error("自动配送异常", e);
  606. }
  607. }
  608. }
  609. // 预约单发单配置
  610. if (config != null && order.getTakeType() > 0) {
  611. if (StatusEnum.SHOW.status.equals(config.getOpenBookingAutodelivery())) {
  612. long diff = waimaiOrder.getDeliveryTime() - config.getBookingAutodeliveryOrderTime();
  613. final Long deliver = diff - (new Date().getTime() / 1000);
  614. log.info("预约单,订单号 {}触发自动配送, 预计{} 秒后发起", order.getOrderSn(), deliver);
  615. try {
  616. autoDelivery(order, config, deliver);
  617. } catch (Exception e) {
  618. log.error("自动配送异常", e);
  619. }
  620. }
  621. }
  622. }
  623. }
  624. public void autoDelivery(final Order order, MemberConfig config, Long deliver) {
  625. TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
  626. @Override
  627. public void afterCommit() {
  628. scheduledExecutorService.schedule(new TriggerProcessTask(order, config.getAutodeliveryIds(), applicationContext), deliver, TimeUnit.SECONDS);
  629. }
  630. });
  631. }
  632. // @Override
  633. // @Transactional(rollbackFor = Exception.class)
  634. // public void doOAuth(ElemeMerchantResultVo resultVo) {
  635. // DspWaimai waimai = iDspWaimaiService.findOne(WaimaiTypeEnums.E_LE_ME.getType());
  636. // if (waimai != null) {
  637. // Shop shop = iShopService.getOne(new QueryWrapper<Shop>().eq("code", resultVo.getState()));
  638. // //先解除其他绑定
  639. // iShopWaimaiService.updateStatus(String.valueOf(resultVo.getShopList().get(0).getId()));
  640. // ShopWaimai shopWaimai = new ShopWaimai();
  641. // shopWaimai.setWaimaiId(waimai.getId());
  642. // shopWaimai.setShopId(shop.getId());
  643. // shopWaimai.setMerchantId(shop.getMerchantId());
  644. // shopWaimai.setThirdShopId(String.valueOf(resultVo.getShopList().get(0).getId()));
  645. // shopWaimai.setThirdShopName(resultVo.getShopList().get(0).getName());
  646. // shopWaimai.setAuthToken(resultVo.getToken().getAccessToken());
  647. // shopWaimai.setBindStatus(BindStatusEnum.BIND.status);
  648. // shopWaimai.setExpiresIn(resultVo.getToken().getExpiresIn());
  649. // shopWaimai.setRefreshToken(resultVo.getToken().getRefreshToken());
  650. // iShopWaimaiService.save(shopWaimai);
  651. // // 拉取当天订单
  652. //// getEleOrders(shopWaimai.getAuthToken(),Long.valueOf(shopWaimai.getThirdShopId()),DateUtils.parseDateToStr("yyyy-MM-dd",new Date()));
  653. // }
  654. // }
  655. public void getEleOrders(String token,Long shopId,String date){
  656. Integer i = 1;
  657. Integer pageNo = 1;
  658. Integer pages = 0;
  659. Integer pageSize = 50;
  660. while (i>0){
  661. ResObject<OrderList> resObject = elemeClient.getAllOrders(token,shopId,pageNo,pageSize,date);
  662. if (resObject.getCode() == 0){
  663. OrderList listList = resObject.getData();
  664. List<OOrder> oOrders = listList.getList();
  665. // 保存数据
  666. for (OOrder o : oOrders){
  667. ElemeOrderResultVo v = new ElemeOrderResultVo();
  668. BeanUtils.copyProperties(o,v);
  669. if (!v.getStatus().name().equals("valid") && !v.getStatus().name().equals("refunding") && !v.getStatus().name().equals("settled")){
  670. return;
  671. }
  672. ShopWaimai shopWaimai = iShopWaimaiService.getOne(new QueryWrapper<ShopWaimai>().eq("third_shop_id", String.valueOf(v.getShopId())).eq("deleted", IsDeleteEnum.NORMAL.status));
  673. Shop shop = iShopService.getById(shopWaimai.getShopId());
  674. DspWaimai waimai = iDspWaimaiService.findOne(WaimaiTypeEnums.E_LE_ME.getType());
  675. WaimaiOrder waimaiOrder = createWaimaiOrder(v,shop, waimai.getId());
  676. waimaiOrder.setAutoOrder(1);
  677. if (v.getStatus().name().equals("settled")){
  678. waimaiOrder.setStatus(DeliveryStatusEnum.FINISH.status);
  679. iWaimaiOrderService.updateById(waimaiOrder);
  680. }
  681. if (v.getStatus().name().equals("refunding")){
  682. waimaiOrder.setStatus(DeliveryStatusEnum.CANCEL.status);
  683. iWaimaiOrderService.updateById(waimaiOrder);
  684. }
  685. addOrder(shop, waimaiOrder,waimai,SnCodeUtils.createSn());
  686. }
  687. Integer total = listList.getTotal();
  688. if (total <= oOrders.size()){
  689. i = 0;
  690. }
  691. if (total > oOrders.size() && pageNo == 1){
  692. // 还需要拉取的次数
  693. pages = (total - oOrders.size())/pageSize;
  694. Integer a = (total - oOrders.size())%pageSize;
  695. if (a > 0){
  696. pages = pages +1 ;
  697. }
  698. i = pages;
  699. }
  700. if (pageNo > 1 && pages>0){
  701. i--;
  702. }
  703. pageNo++;
  704. }else {
  705. log.info("拉取饿了么订单失败==="+resObject.getMsg());
  706. i = 0;
  707. }
  708. }
  709. }
  710. /**
  711. * 饿了么新订单处理
  712. */
  713. @Override
  714. @Transactional
  715. @Async
  716. public void doElmNewOrder(ElemeOrderResultVo orderVo) {
  717. // log.info("=====饿了么新订单参数====" + JsonMapper.nonEmptyMapper().toJson(orderVo));
  718. // DspWaimai waimai = iDspWaimaiService.findOne(WaimaiTypeEnums.E_LE_ME.getType());
  719. ShopWaimai shopWaimai = iShopWaimaiService.getOne(new QueryWrapper<ShopWaimai>().eq("third_shop_id", String.valueOf(orderVo.getShopId())).eq("deleted", IsDeleteEnum.NORMAL.status));
  720. if (shopWaimai != null) {
  721. Shop shop = iShopService.getById(shopWaimai.getShopId());
  722. Long memberId = null;
  723. List<Long> memberIds = iMemberService.selectByShopId(shop.getId());
  724. if(CollectionUtils.isNotEmpty(memberIds)){
  725. memberId = memberIds.get(0);
  726. }else{
  727. Member member = iMemberService.findOne(shop.getMerchantId());
  728. memberId = member.getId();
  729. }
  730. MemberConfig config = iMemberConfigService.getOne(new QueryWrapper<MemberConfig>().eq("member_id",memberId));
  731. //产生外卖订单
  732. // WaimaiOrder waimaiOrder = createWaimaiOrder(orderVo, shop, waimai.getId());
  733. redisCache.redisTemplate.opsForValue().set("ele-order:"+orderVo.getId() + "", JSONObject.toJSONString(orderVo),2,TimeUnit.DAYS);
  734. WaimaiOrder waimaiOrder = new WaimaiOrder();
  735. waimaiOrder.setOutOrderId(orderVo.getId());
  736. waimaiOrder.setTotalPrice(new BigDecimal(orderVo.getTotalPrice() + ""));
  737. // messagePushService.waimaiMessage(shop.getId(), waimaiOrder);
  738. if (config!=null&&StatusEnum.SHOW.status.equals(config.getOpenAutoorder())) {
  739. ConfirmOrderVo confirmOrderVo = new ConfirmOrderVo();
  740. confirmOrderVo.setLbClient(WaimaiTypeEnums.E_LE_ME.getName());
  741. confirmOrderVo.setOrderId(orderVo.getId());
  742. confirmOrderVo.setAppAuthToken(shopWaimai.getAuthToken());
  743. ResObject resObject = elemeClient.confirmOrder(confirmOrderVo);
  744. log.info("=======饿了么订单确认结果=====" + JsonMapper.nonEmptyMapper().toJson(resObject));
  745. }
  746. }
  747. }
  748. @Override
  749. public WaimaiOrder createWaimaiOrder(ElemeOrderResultVo orderVo, Shop shop, Long waimaiId) {
  750. WaimaiOrder waimaiOrder = iWaimaiOrderService.getOne(new QueryWrapper<WaimaiOrder>().eq("out_order_id", orderVo.getId()).eq("deleted",0));
  751. if (waimaiOrder == null) {
  752. waimaiOrder = new WaimaiOrder();
  753. waimaiOrder.setShopId(shop.getId());
  754. waimaiOrder.setWaimaiId(waimaiId);
  755. // waimaiOrder.setOrderidView(String.valueOf(orderVo.getPickUpNumber()));
  756. waimaiOrder.setOrderidView(orderVo.getId());
  757. waimaiOrder.setOutOrderId(orderVo.getId());
  758. UserExtraInfo userExtraInfo = orderVo.getUserExtraInfo();
  759. waimaiOrder.setCaution(orderVo.getDescription());
  760. if(userExtraInfo!=null&&StringUtils.isNotBlank(userExtraInfo.getGreeting())){
  761. waimaiOrder.setCaution("[祝福语]:"+userExtraInfo.getGreeting()+orderVo.getDescription());
  762. }
  763. waimaiOrder.setOrderTime(orderVo.getCreatedAt());
  764. waimaiOrder.setDaySeq(String.valueOf(orderVo.getDaySn()));
  765. waimaiOrder.setInvoiceTitle(orderVo.getInvoice());
  766. waimaiOrder.setTaxpayerId(orderVo.getTaxpayerId());
  767. waimaiOrder.setHasInvoiced(orderVo.getInvoiced() ? 1 : 0);
  768. waimaiOrder.setIsThirdShipping(1);
  769. waimaiOrder.setOriginalPrice(new BigDecimal(orderVo.getTotalPrice()));
  770. waimaiOrder.setPayType(orderVo.getOnlinePaid() ? 1 : 0);
  771. waimaiOrder.setPoiAddress(shop.getAddress());
  772. waimaiOrder.setPoiName(shop.getName());
  773. waimaiOrder.setOrderType(WaimaiOrderTypeEnum.E_LE_ME.getType());
  774. waimaiOrder.setPoiPhone(shop.getMobile());
  775. waimaiOrder.setRecipientAddress(orderVo.getDeliveryPoiAddress());
  776. waimaiOrder.setRecipientName(orderVo.getConsignee());
  777. String phone = orderVo.getPhoneList().get(0);
  778. phone = phone.replace(",", "_");
  779. waimaiOrder.setRecipientPhone(phone);
  780. waimaiOrder.setReceiptPrivacyPhone(CollectionUtils.isEmpty(orderVo.getConsigneePhones()) ? null : orderVo.getConsigneePhones().get(0));
  781. waimaiOrder.setReceiptLat(orderVo.getDeliveryGeo().split(",")[1]);
  782. waimaiOrder.setReceiptLng(orderVo.getDeliveryGeo().split(",")[0]);
  783. waimaiOrder.setTotalPrice(new BigDecimal(orderVo.getTotalPrice() + ""));
  784. waimaiOrder.setExtras(JSONObject.toJSONString(orderVo.getOrderActivities()));
  785. waimaiOrder.setBoxFee(new BigDecimal(orderVo.getPackageFee() + ""));
  786. if (orderVo.getBook()) {
  787. waimaiOrder.setDeliveryTime(orderVo.getDeliverTime().getTime() / 1000);
  788. } else {
  789. waimaiOrder.setDeliveryTime(0l);
  790. }
  791. waimaiOrder.setThirdShopId(orderVo.getShopId()+"");
  792. iWaimaiOrderService.save(waimaiOrder);
  793. //记录商品详情
  794. List<WaimaiOrderDetail> detailList = new ArrayList<>();
  795. if (CollectionUtils.isNotEmpty(orderVo.getGroups())) {
  796. List<OGoodsItem> items = orderVo.getGroups().get(0).getItems();
  797. for (OGoodsItem item : items) {
  798. WaimaiOrderDetail detail = new WaimaiOrderDetail();
  799. // List<OGroupItemSpec> specs = item.getNewSpecs();
  800. // List<OGroupItemAttribute> attributeList = item.getAttributes();
  801. // if(CollectionUtils.isNotEmpty(specs)){
  802. // StringBuilder sb = new StringBuilder();
  803. // for(OGroupItemSpec spec:specs){
  804. // sb.append(spec.getValue()).append(",");
  805. // }
  806. // if(sb.length()>0){
  807. // detail.setSpec(sb.toString().substring(0,sb.length()-1));
  808. // }
  809. // }
  810. // if(CollectionUtils.isNotEmpty(attributeList)){
  811. // StringBuilder sb = new StringBuilder();
  812. // for(OGroupItemAttribute attr:attributeList){
  813. // sb.append(attr.getValue()).append(",");
  814. // }
  815. // if(sb.length()>0){
  816. // detail.setFoodProperty(sb.toString().substring(0,sb.length()-1));
  817. // }
  818. //
  819. // }
  820. detail.setWaimaiOrderId(waimaiOrder.getId());
  821. detail.setSkuId(item.getId() + "");
  822. detail.setFoodName(item.getName());
  823. detail.setPrice(new BigDecimal(item.getPrice()));
  824. detail.setQuantity((long) item.getQuantity());
  825. detail.setUnit(item.getWeight().toString());
  826. detailList.add(detail);
  827. // iWaimaiOrderDetailService.save(detail);
  828. }
  829. iWaimaiOrderDetailService.saveBatch(detailList);
  830. }
  831. }
  832. return waimaiOrder;
  833. }
  834. @Override
  835. @Transactional
  836. @Async
  837. public void doStateNewOrder(ElemeOrderStateResultVo orderVo, Integer type) {
  838. String json = redisCache.redisTemplate.opsForValue().get("ele-order:"+orderVo.getOrderId()) + "";
  839. ElemeOrderResultVo elemeOrderResultVo = JSONObject.parseObject(json, ElemeOrderResultVo.class);
  840. DspWaimai waimai = iDspWaimaiService.findOne(WaimaiTypeEnums.E_LE_ME.getType());
  841. ShopWaimai shopWaimai = iShopWaimaiService.getOne(new QueryWrapper<ShopWaimai>().eq("third_shop_id", String.valueOf(orderVo.getShopId())).eq("deleted", IsDeleteEnum.NORMAL.status));
  842. if (shopWaimai != null) {
  843. Shop shop = iShopService.getById(shopWaimai.getShopId());
  844. WaimaiOrder waimaiOrder = createWaimaiOrder(elemeOrderResultVo, shop, waimai.getId());
  845. // WaimaiOrder waimaiOrder = iWaimaiOrderService.getOne(new QueryWrapper<WaimaiOrder>().eq("out_order_id", orderVo.getOrderId()));
  846. if (waimaiOrder != null) {
  847. // Shop shop = iShopService.getById(waimaiOrder.getShopId());
  848. //自动打印外卖单
  849. //List<WaimaiOrderDetail> detailList = iWaimaiOrderDetailService.findList(waimaiOrder.getId());
  850. List<WaimaiOrderDetail> detailList = iWaimaiOrderDetailService.list(new QueryWrapper<WaimaiOrderDetail>().eq("waimai_order_id", waimaiOrder.getId()));
  851. try {
  852. if (type.intValue() == 12) {
  853. // redisCache.setNumber(shop.getId(),elemeOrderResultVo.getDaySn());
  854. // autoPrintWaimai(waimaiOrder, detailList);
  855. PrintOrderDto printOrderDto = EleConvertPrint.convert(elemeOrderResultVo);
  856. apiWaimaiPrintService.autoPrintWaimaiNew(printOrderDto, detailList, shop.getId(),waimaiOrder);
  857. }
  858. } catch (Exception e) {
  859. log.error("自动打印异常!", e);
  860. }
  861. try {
  862. //推送外卖新消息
  863. if (type.intValue() == 12) {
  864. messagePushService.waimaiMessage(shop.getId(), waimaiOrder);
  865. }
  866. } catch (Exception e) {
  867. log.error("推送外卖订单消息异常,订单号:" + waimaiOrder.getOutOrderId());
  868. }
  869. //产生配送订单
  870. if (type.intValue() == 12) {
  871. addOrder(shop, waimaiOrder,waimai,SnCodeUtils.createSn());
  872. }
  873. if (type.intValue() == 14 || type.intValue() == 15 || type.intValue() == 17) {
  874. doEleCancelOrder(orderVo.getOrderId(), type);
  875. }
  876. }
  877. }
  878. }
  879. @Override
  880. @Async
  881. public void doEleCancelOrder(String orderId, int type) {
  882. if (type == 14 || type == 17 || type == 23) {
  883. WaimaiOrder waimaiOrder = iWaimaiOrderService.getOne(new QueryWrapper<WaimaiOrder>().eq("out_order_id", orderId));
  884. if (waimaiOrder != null) {
  885. //用户取消取消订单
  886. String title = "您有一个外卖订单被顾客取消,请及时查看";
  887. String content = "您有一个外卖订单被顾客取消,请及时查看";
  888. log.info("------->取消订单" + orderId);
  889. cancelOrder(waimaiOrder);
  890. if (type == 23 || type == 17) {
  891. redisCache.redisTemplate.opsForValue().set(orderId+ "_lock", "1", 60, TimeUnit.MINUTES);
  892. messagePushService.userCancelOrderMessage(waimaiOrder.getShopId(), title, content, waimaiOrder.getId());
  893. // 打印取消订单
  894. try {
  895. String json = redisCache.redisTemplate.opsForValue().get("ele-order:"+orderId) + "";
  896. if (StringUtils.isNotBlank(json)){
  897. ElemeOrderResultVo elemeOrderResultVo = JSONObject.parseObject(json, ElemeOrderResultVo.class);
  898. PrintOrderDto printOrderDto = EleConvertPrint.convert(elemeOrderResultVo);
  899. printOrderDto.setOrderStatus(OrderStatusEnum.CANCEL.status);
  900. List<WaimaiOrderDetail> detailList = iWaimaiOrderDetailService.list(new QueryWrapper<WaimaiOrderDetail>().eq("waimai_order_id", waimaiOrder.getId()));
  901. apiWaimaiPrintService.autoPrintWaimaiNew(printOrderDto, detailList, waimaiOrder.getShopId(),waimaiOrder);
  902. }
  903. } catch (Exception e) {
  904. log.error("自动打印取消订单异常!", e);
  905. }
  906. }
  907. }
  908. }
  909. }
  910. // @Override
  911. // public void saveShop(ElemeRetailMerchantResultVo shopMappingVo) {
  912. // log.info("饿百绑定门店回调");
  913. // DspWaimai waimai = iDspWaimaiService.findOne(WaimaiTypeEnums.E_LE_ME_RETAIL.getType());
  914. // if (waimai != null) {
  915. // for (BindShop bindShop : shopMappingVo.getShopList()) {
  916. // Shop shop = iShopService.getOne(new QueryWrapper<Shop>().eq("code", bindShop.getShopId()));
  917. // if (shop == null) {
  918. // log.error("门店未找到,门店code" + bindShop.getShopId());
  919. // return;
  920. // }
  921. // //先解除其他绑定
  922. // ShopWaimai waimai1 = iShopWaimaiService.getOne(new QueryWrapper<ShopWaimai>().eq("third_shop_id", bindShop.getBaiduShopId()).eq("bind_status", BindStatusEnum.BIND.status).eq("shop_id", bindShop.getShopId()).eq("deleted", 0));
  923. // if (waimai1 != null) {
  924. // return;
  925. // }
  926. // ShopWaimai shopWaimai = new ShopWaimai();
  927. // shopWaimai.setWaimaiId(waimai.getId());
  928. // shopWaimai.setShopId(shop.getId());
  929. // shopWaimai.setMerchantId(shop.getMerchantId());
  930. // shopWaimai.setThirdShopId(String.valueOf(bindShop.getBaiduShopId()));
  931. // shopWaimai.setThirdShopName(bindShop.getName());
  932. // //shopWaimai.setAuthToken(resultVo.getToken().getAccessToken());
  933. // shopWaimai.setBindStatus(BindStatusEnum.BIND.status);
  934. //// shopWaimai.setExpiresIn(bindShop.getExpiresIn());
  935. //// shopWaimai.setRefreshToken(bindShop.getRefreshToken());
  936. // iShopWaimaiService.save(shopWaimai);
  937. // // 拉取当天订单
  938. //// log.info("拉取数据");
  939. //// pullOrders(String.valueOf(bindShop.getBaiduShopId()));
  940. // }
  941. // }
  942. // }
  943. public void pullOrders(String thirdShopId){
  944. log.info("开始拉取数据");
  945. Integer i = 1;
  946. Integer pageNo = 1;
  947. Integer pages = 0;
  948. Integer pageSize = 100;
  949. long startTime = (com.ydd.third.common.utils.DateUtils.getAutoTime(new Date(),0,0,0))/1000;
  950. long endTime = System.currentTimeMillis()/1000;
  951. while (i>0){
  952. ResObject<OrderEBaiList> resObject = eleRetaiClient.getOrderList(thirdShopId,pageNo,pageSize,String.valueOf(startTime),String.valueOf(endTime),"");
  953. OrderEBaiList listList = resObject.getData();
  954. List<OrderEBaiInfo> oOrders = listList.getList();
  955. // 保存数据
  956. for (OrderEBaiInfo o : oOrders){
  957. // 待确认订单不要
  958. if (o.getOrder_status().equals("1")){
  959. continue;
  960. }
  961. // 查询订单详情
  962. OrderGetResult orderGetResult = eleRetaiClient.getOrder(o.getOrder_id());
  963. if (orderGetResult.getData().getOrder().getDown_flag() == 1) {
  964. orderGetResult = eleRetaiClient.getOrder(o.getOrder_id());
  965. }
  966. if (o.getOrder_status().equals("9")){
  967. orderGetResult.setOrderStatus(DeliveryStatusEnum.FINISH.status);
  968. }
  969. if (o.getOrder_status().equals("10") || o.getOrder_status().equals("15")){
  970. orderGetResult.setOrderStatus(DeliveryStatusEnum.CANCEL.status);
  971. }
  972. orderGetResult.setAutoOrder(1);
  973. redisCache.redisTemplate.opsForValue().set("ebai.order:"+o.getOrder_id() + "", SnCodeUtils.createSn(),30,TimeUnit.MINUTES);
  974. String orderId = createOrder(orderGetResult);
  975. }
  976. Integer total = listList.getTotal();
  977. if (total <= oOrders.size()){
  978. i = 0;
  979. }
  980. if (total > oOrders.size() && pageNo == 1){
  981. // 还需要拉取的次数
  982. pages = (total - oOrders.size())/pageSize;
  983. Integer a = (total - oOrders.size())%pageSize;
  984. if (a > 0){
  985. pages = pages +1 ;
  986. }
  987. i = pages;
  988. }
  989. if (pageNo > 1 && pages>0){
  990. i--;
  991. }
  992. pageNo++;
  993. }
  994. }
  995. // @Override
  996. // public void updateShop(ElemeRetailMerchantResultVo shopMappingVo) {
  997. // DspWaimai waimai = iDspWaimaiService.findOne(WaimaiTypeEnums.E_LE_ME_RETAIL.getType());
  998. // if (waimai != null) {
  999. // for (BindShop bindShop : shopMappingVo.getShopList()) {
  1000. // // Shop shop = iShopService.getOne(new QueryWrapper<Shop>().eq("code", bindShop.getShopId()));
  1001. // //先解除其他绑定
  1002. // iShopWaimaiService.updateStatus(String.valueOf(bindShop.getBaiduShopId()));
  1003. // }
  1004. // }
  1005. // }
  1006. @Override
  1007. @Transactional
  1008. public void updateOrderStatus(JSONObject jsonObject) {
  1009. String orderId = jsonObject.getString("order_id");
  1010. // WaimaiOrder waimaiOrder = iWaimaiOrderService.getOne(new QueryWrapper<WaimaiOrder>().eq("out_order_id", orderId));
  1011. // Order order = iOrderService.getOne(new QueryWrapper<Order>().eq("waimai_order_id", waimaiOrder.getId()));
  1012. //1、待确认;5、订单已确认; 7、骑士已接单开始取餐(此时可通过订单详情接口获取骑士手机号); 8、骑士已取餐正在配送; 9、订单完成; 10、订单取消。推送地址和创建订单地址相同。
  1013. if (jsonObject.getString("status").equals("5")) {
  1014. OrderGetResult result = eleRetaiClient.getOrder(orderId);
  1015. String order1 = createOrder(result);
  1016. // messagePushService.riderReceiveOrderMessage(order.getMemberId(), "您的订单已被骑手接单,请及时备货", "您的订单编号" + order.getOrderSn() + "已被骑手接单,配送平台:" + order.getDeliveryName() + ",请留意订单状态");
  1017. } else if ("9".equals(jsonObject.getString("status"))) {
  1018. updateWaimaiOrderStatus(orderId, DeliveryStatusEnum.FINISH.status);
  1019. }
  1020. // else if ("10".equals(jsonObject.getString("status"))) {
  1021. // updateWaimaiOrderStatus(orderId, DeliveryStatusEnum.CANCEL.status);
  1022. // }
  1023. }
  1024. /**
  1025. * 饿百新订单
  1026. *
  1027. * @param orderGetResult
  1028. */
  1029. @Override
  1030. @Transactional
  1031. public String createOrder(OrderGetResult orderGetResult) {
  1032. try {
  1033. //String orderSn = redisCache.redisTemplate.opsForValue().get("ebai.order:"+orderGetResult.getData().getOrder().getOrder_id() + "")+"";
  1034. String shop_id = orderGetResult.getData().getShop().getBaidu_shop_id();
  1035. ShopWaimai shopWaimai = iShopWaimaiService.getOne(new QueryWrapper<ShopWaimai>().eq("third_shop_id", String.valueOf(shop_id)).eq("deleted", IsDeleteEnum.NORMAL.status));
  1036. if (shopWaimai == null) {
  1037. log.error("未找到饿百绑定的商户,商户id为---" + shop_id);
  1038. return "";
  1039. }
  1040. Shop shop = iShopService.getById(shopWaimai.getShopId());
  1041. Member member = iMemberService.findOne(shop.getMerchantId());
  1042. MemberConfig config = iMemberConfigService.getOne(new QueryWrapper<MemberConfig>().eq("member_id", member.getId()));
  1043. //redisCache.redisTemplate.opsForValue().set(orderGetResult.getData().getOrder().getOrder_id() + "", JSONObject.toJSONString(orderGetResult.getData().getOrder()));
  1044. DspWaimai waimai = iDspWaimaiService.findOne(WaimaiTypeEnums.E_LE_ME_RETAIL.getType());
  1045. WaimaiOrder order = transform(orderGetResult.getData(), waimai.getId(), shop);
  1046. if (orderGetResult.getOrderStatus() != null){
  1047. if (orderGetResult.getOrderStatus().equals(DeliveryStatusEnum.FINISH.status)){
  1048. order.setStatus(DeliveryStatusEnum.FINISH.status);
  1049. }else if (orderGetResult.getOrderStatus().equals(DeliveryStatusEnum.CANCEL.status)){
  1050. order.setStatus(DeliveryStatusEnum.CANCEL.status);
  1051. }
  1052. iWaimaiOrderService.updateById(order);
  1053. }
  1054. order.setAutoOrder(orderGetResult.getOrderStatus());
  1055. //推送外卖新消息
  1056. if(orderGetResult.getData().getOrder().getStatus().intValue()==5){//新订单
  1057. messagePushService.waimaiMessage(shop.getId(), order);
  1058. }
  1059. // Integer status = DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status;
  1060. // if (config != null) {
  1061. // if (config.getOpenAutoorder().equals(StatusEnum.SHOW.status)) {
  1062. // boolean flat = eleRetaiClient.confirm(orderGetResult.getData().getOrder().getOrder_id());
  1063. // if (flat) {
  1064. // status = DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status;
  1065. // order.setStatus(OrderStatusEnum.TO_BE_DELIVERED.status);
  1066. // iWaimaiOrderService.updateById(order);
  1067. // }
  1068. // }
  1069. // }
  1070. // addRetaiOrder(shop, order, status);
  1071. // if(StringUtils.isBlank(orderSn)){
  1072. String orderSn = SnCodeUtils.createSn();
  1073. //}
  1074. addOrder(shop, order,waimai,orderSn);
  1075. return order.getId().toString();
  1076. } catch (Exception e) {
  1077. log.error("饿百订单出现异常");
  1078. e.printStackTrace();
  1079. return "";
  1080. }
  1081. }
  1082. @Override
  1083. public void doEleRetaiCancel(String orderId, int type) {
  1084. if (type == 40 || type == 60) {
  1085. WaimaiOrder waimaiOrder = iWaimaiOrderService.getOne(new QueryWrapper<WaimaiOrder>().eq("out_order_id", orderId));
  1086. if (waimaiOrder != null&&!redisCache.redisTemplate.hasKey(orderId+ "_lock")) {
  1087. //用户取消取消订单
  1088. String title = "您有一个外卖订单被顾客取消,请及时查看";
  1089. String content = "您有一个外卖订单被顾客取消,请及时查看";
  1090. log.info("------->取消订单" + orderId);
  1091. cancelOrder(waimaiOrder);
  1092. redisCache.redisTemplate.opsForValue().set(orderId+ "_lock", "1", 60, TimeUnit.MINUTES);
  1093. messagePushService.userCancelOrderMessage(waimaiOrder.getShopId(), title, content, waimaiOrder.getId());
  1094. try {
  1095. String json = redisCache.redisTemplate.opsForValue().get("ebai.order.print:"+orderId) + "";
  1096. if (StringUtils.isNotBlank(json)){
  1097. OrderGetDataResultDataDto data = JSONObject.parseObject(json, OrderGetDataResultDataDto.class);
  1098. PrintOrderDto printOrderDto = EleRetailConvertPrint.convert(data);
  1099. printOrderDto.setOrderStatus(OrderStatusEnum.CANCEL.status);
  1100. List<WaimaiOrderDetail> detailList = iWaimaiOrderDetailService.list(new QueryWrapper<WaimaiOrderDetail>().eq("waimai_order_id", waimaiOrder.getId()));
  1101. apiWaimaiPrintService.autoPrintWaimaiNew(printOrderDto, detailList,waimaiOrder.getShopId(),waimaiOrder);
  1102. }
  1103. } catch (Exception e) {
  1104. log.error("自动打印异常!", e);
  1105. }
  1106. }
  1107. }
  1108. }
  1109. private WaimaiOrder transform(OrderGetDataResultDataDto data, Long waimaiId, Shop shop) {
  1110. WaimaiOrder waimaiOrder = iWaimaiOrderService.getOne(new QueryWrapper<WaimaiOrder>().eq("out_order_id", data.getOrder().getOrder_id()));
  1111. if (waimaiOrder == null) {
  1112. waimaiOrder = new WaimaiOrder();
  1113. DecimalFormat df = new DecimalFormat("#.00");
  1114. waimaiOrder.setShopId(shop.getId());
  1115. waimaiOrder.setWaimaiId(waimaiId);
  1116. waimaiOrder.setOrderidView(data.getOrder().getEleme_order_id());
  1117. waimaiOrder.setOutOrderId(data.getOrder().getOrder_id());
  1118. String remark = "0".equals(data.getOrder().getRemark()) ? "" : data.getOrder().getRemark();
  1119. String greeting ="";
  1120. if(data.getOrder().getExt()!=null){
  1121. greeting = data.getOrder().getExt().getGreeting();
  1122. if(StringUtils.isNotBlank(greeting)){
  1123. greeting ="[祝福语]"+greeting+" ";
  1124. }
  1125. }
  1126. if(StringUtils.isNotBlank(greeting)){
  1127. remark = greeting+remark;
  1128. }
  1129. waimaiOrder.setCaution(remark);
  1130. long createTime = Long.parseLong(data.getOrder().getCreate_time()) * 1000L;
  1131. waimaiOrder.setOrderTime(new Date(createTime));
  1132. waimaiOrder.setDaySeq(String.valueOf(data.getOrder().getOrder_index()));
  1133. waimaiOrder.setInvoiceTitle(data.getOrder().getInvoice_title());
  1134. waimaiOrder.setTaxpayerId(data.getOrder().getTaxer_id());
  1135. waimaiOrder.setHasInvoiced(data.getOrder().getNeed_invoice() == 1 ? 1 : 0);
  1136. waimaiOrder.setIsThirdShipping(1);
  1137. String format1 = df.format((double) data.getOrder().getTotal_fee() / 100);
  1138. waimaiOrder.setOriginalPrice(new BigDecimal(format1));
  1139. waimaiOrder.setPayType(data.getOrder().getPay_type() == 2 ? 2 : 1);
  1140. waimaiOrder.setPoiAddress(shop.getAddress());
  1141. waimaiOrder.setPoiName(shop.getName());
  1142. waimaiOrder.setOrderType(WaimaiOrderTypeEnum.E_LE_ME_RETAIL.getType());
  1143. waimaiOrder.setPoiPhone(shop.getMobile());
  1144. waimaiOrder.setRecipientAddress(data.getUser().getAddress());
  1145. waimaiOrder.setRecipientName(data.getUser().getName());
  1146. waimaiOrder.setRecipientPhone(data.getUser().getPhone());
  1147. waimaiOrder.setReceiptPrivacyPhone(data.getUser().getPrivacy_phone());
  1148. waimaiOrder.setReceiptLat(data.getUser().getCoord_amap().getLatitude().toString());
  1149. waimaiOrder.setReceiptLng(data.getUser().getCoord_amap().getLongitude().toString());
  1150. String format2 = df.format((double) data.getOrder().getUser_fee() / 100);
  1151. waimaiOrder.setTotalPrice(new BigDecimal(format2));
  1152. waimaiOrder.setStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
  1153. waimaiOrder.setExtras(JSONObject.toJSONString(data.getDiscount()));
  1154. waimaiOrder.setThirdShopId(data.getShop().getBaidu_shop_id());
  1155. if (data.getOrder().getSend_immediately() == 2) {
  1156. waimaiOrder.setDeliveryTime(data.getOrder().getSend_time());
  1157. } else {
  1158. waimaiOrder.setDeliveryTime(0L);
  1159. }
  1160. iWaimaiOrderService.save(waimaiOrder);
  1161. //记录商品详情
  1162. List<WaimaiOrderDetail> detailList = new ArrayList<>();
  1163. if (data.getProducts() != null && data.getProducts().length > 0) {
  1164. OrderGetProduct[][] products = data.getProducts();
  1165. HashMap<String, Integer> map = new HashMap<>();
  1166. for (int i = 0; i < products.length; i++) {
  1167. for (int j = 0; j < products[i].length; j++) {
  1168. OrderGetProduct[] product = products[i];
  1169. WaimaiOrderDetail detail = new WaimaiOrderDetail();
  1170. detail.setWaimaiOrderId(waimaiOrder.getId());
  1171. detail.setSkuId(product[j].getBaidu_product_id());
  1172. detail.setFoodName(product[j].getProduct_name());
  1173. String format = df.format((double) product[j].getProduct_price() / 100);
  1174. detail.setPrice(new BigDecimal(product[j].getProduct_price() > 0 ? format : "0"));
  1175. OrderGetProductFeatures[] product_features = product[j].getProduct_features();
  1176. OrderGetProductAttr[] attrs = product[j].getProduct_attr();
  1177. OrderGetProductProperties[] properties = product[j].getProperties();
  1178. if (product_features != null && product_features.length > 0) {
  1179. StringBuilder sb = new StringBuilder();
  1180. for (int k = 0; k < product_features.length; k++) {
  1181. OrderGetProductFeatures features = product_features[k];
  1182. sb.append(features.getOption()).append(",");
  1183. }
  1184. if (sb.length() > 0) {
  1185. detail.setSpec(sb.toString().substring(0, sb.length() - 1));
  1186. }
  1187. }
  1188. // if (attrs != null && attrs.length > 0) {
  1189. // StringBuilder sb = new StringBuilder();
  1190. // for (int k = 0; k < attrs.length; k++) {
  1191. // OrderGetProductAttr attr = attrs[k];
  1192. // sb.append(attr.getOption()).append(",");
  1193. // }
  1194. // if (sb.length() > 0) {
  1195. // detail.setFoodProperty(sb.toString().substring(0, sb.length() - 1));
  1196. // }
  1197. //
  1198. // }
  1199. if (properties != null && properties.length > 0) {
  1200. StringBuilder sb = new StringBuilder();
  1201. for (int k = 0; k < properties.length; k++) {
  1202. OrderGetProductProperties attr = properties[k];
  1203. sb.append(attr.getName()).append(":").append(attr.getValue()).append(",");
  1204. }
  1205. if (sb.length() > 0) {
  1206. detail.setFoodProperty(sb.toString().substring(0, sb.length() - 1));
  1207. }
  1208. }
  1209. //detail.setFoodProperty(JSON.toJSONString(product_features));
  1210. detail.setQuantity((long) product[j].getProduct_amount());
  1211. detail.setBoxNum(product[j].getPackage_amount().toString());
  1212. detail.setBoxPrice(new BigDecimal(product[j].getPackage_fee() > 0 ? (double) product[j].getPackage_fee() / 100 : 0));
  1213. detailList.add(detail);
  1214. // iWaimaiOrderDetailService.save(detail);
  1215. }
  1216. iWaimaiOrderDetailService.saveBatch(detailList);
  1217. }
  1218. }
  1219. // redisCache.setNumber(shop.getId(),data.getOrder().getOrder_index());
  1220. /**打印外卖单*/
  1221. //autoPrintWaimai(waimaiOrder, detailList);
  1222. redisCache.redisTemplate.opsForValue().set("ebai.order.print:"+data.getOrder().getOrder_id() + "",JSONObject.toJSONString(data),2,TimeUnit.DAYS);
  1223. PrintOrderDto printOrderDto = EleRetailConvertPrint.convert(data);
  1224. apiWaimaiPrintService.autoPrintWaimaiNew(printOrderDto, detailList, shop.getId(),waimaiOrder);
  1225. }
  1226. return waimaiOrder;
  1227. }
  1228. private void cancelOrder(WaimaiOrder waimaiOrder) {
  1229. String cancelReason = "用户取消";
  1230. waimaiOrder.setStatus(OrderStatusEnum.CANCEL.status);
  1231. iWaimaiOrderService.updateById(waimaiOrder);
  1232. Order order = iOrderService.getOne(new QueryWrapper<Order>().eq("waimai_order_id", waimaiOrder.getId()));
  1233. if (order != null && !DeliveryStatusEnum.CANCEL.status.equals(order.getDeliveryStatus())) {
  1234. apiOrderCancelService.cancel(order.getMemberId(), order.getId().intValue(), cancelReason,DeliveryStatusEnum.CANCEL.status,OrderCancelTypeEnum.USER_CANCEL.type);
  1235. }
  1236. }
  1237. @Override
  1238. public void updateWaimaiOrderStatus(String orderId, int status) {
  1239. WaimaiOrder waimaiOrder = iWaimaiOrderService.getOne(new QueryWrapper<WaimaiOrder>().eq("out_order_id", orderId));
  1240. if (waimaiOrder != null) {
  1241. waimaiOrder.setStatus(status);
  1242. if(DeliveryStatusEnum.FINISH.status.intValue() == status){
  1243. waimaiOrder.setFinishTime(new Date());
  1244. }
  1245. if(DeliveryStatusEnum.CANCEL.status.intValue() == status){
  1246. return;
  1247. }
  1248. iWaimaiOrderService.updateById(waimaiOrder);
  1249. }
  1250. }
  1251. /**
  1252. * 异常单撤回
  1253. *
  1254. * @param loginId
  1255. * @param orderId
  1256. */
  1257. @Override
  1258. @Transactional(rollbackFor = Exception.class)
  1259. public void rollOrder(Long loginId, Integer orderId) {
  1260. Order order = iOrderService.getById(orderId);
  1261. if (order == null){
  1262. throw new CustomAppException("该订单已撤回");
  1263. }
  1264. if (!order.getDeliveryStatus().equals(DeliveryStatusEnum.ABNORMAL.status) || order.getWaimaiOrderId() == null){
  1265. throw new CustomAppException("该订单不允许撤回");
  1266. }
  1267. List<OrderDelivery> deliverys = iOrderDeliveryService.getByOrderSn(order.getOrderSn());
  1268. boolean checkCancel = true;
  1269. for (OrderDelivery delivery : deliverys){
  1270. if (StringUtils.isNotBlank(delivery.getOutTradeNo()) && !delivery.getOutTradeNo().equals(-1) && delivery.getDeliveryStatus() != -1){
  1271. checkCancel = false;
  1272. break;
  1273. }
  1274. }
  1275. if (!checkCancel){
  1276. throw new CustomAppException("操作太频繁,请稍后再试");
  1277. }
  1278. // 将原始订单删除-逻辑删除
  1279. iOrderService.removeById(order);
  1280. WaimaiOrder waimaiOrder = iWaimaiOrderService.getById(order.getWaimaiOrderId());
  1281. if (waimaiOrder.getStatus().equals(DeliveryStatusEnum.CANCEL.status)){
  1282. waimaiOrder.setStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
  1283. }
  1284. waimaiOrder.setTakeRemark(order.getTakeRemark());
  1285. // 预约单撤回后, 不支持设置自动发单
  1286. if (waimaiOrder.getDeliveryTime() != null && waimaiOrder.getDeliveryTime() > 0) {
  1287. waimaiOrder.setAutoOrder(0);
  1288. }
  1289. iWaimaiOrderService.updateById(waimaiOrder);
  1290. Shop shop = iShopService.getById(order.getShopId());
  1291. DspWaimai waiMai = iDspWaimaiService.findOne(waimaiOrder.getOrderType());
  1292. addOrder(shop,waimaiOrder,waiMai,SnCodeUtils.createSn());
  1293. }
  1294. @Override
  1295. public String newEBaiOrder(String orderId,String shopId) {
  1296. ShopWaimai shopWaimai = iShopWaimaiService.getOne(new QueryWrapper<ShopWaimai>().eq("third_shop_id", shopId).eq("deleted", IsDeleteEnum.NORMAL.status));
  1297. if (shopWaimai == null) {
  1298. log.error("未找到饿百绑定的商户,商户id为---" + shopId);
  1299. return null;
  1300. }
  1301. Shop shop = iShopService.getById(shopWaimai.getShopId());
  1302. Long memberId = null;
  1303. List<Long> memberIds = iMemberService.selectByShopId(shop.getId());
  1304. if(CollectionUtils.isNotEmpty(memberIds)){
  1305. memberId = memberIds.get(0);
  1306. }else{
  1307. Member member = iMemberService.findOne(shop.getMerchantId());
  1308. memberId = member.getId();
  1309. }
  1310. MemberConfig config = iMemberConfigService.getOne(new QueryWrapper<MemberConfig>().eq("member_id",memberId));
  1311. if (config != null) {
  1312. if (config.getOpenAutoorder().equals(StatusEnum.SHOW.status)) {
  1313. boolean flat = eleRetaiClient.confirm(orderId);
  1314. log.info("饿百自动接单返回"+flat);
  1315. }
  1316. }
  1317. String orderSn=SnCodeUtils.createSn();
  1318. redisCache.redisTemplate.opsForValue().set("ebai.order:"+orderId + "",orderSn,2,TimeUnit.DAYS);
  1319. return orderSn;
  1320. }
  1321. // public static void main(String[] args) {
  1322. // String remark="[预定人]18669794657 [蛋糕祝语]祝妮可生日快乐 [其他备注]两个1的数字蜡烛 收餐人隐私号 15192663044_7856,手机号 186****4657";
  1323. // if(remark.contains("[预")){
  1324. // remark = remark.substring(remark.indexOf("[预"),remark.indexOf("[预")+8)+"****"+remark.substring(remark.indexOf("[预")+12,remark.length());
  1325. // }
  1326. // System.out.println(
  1327. // remark
  1328. // );
  1329. // }
  1330. @Override
  1331. public void syncFoodImg(Long loginId) {
  1332. Member member = iMemberService.getById(loginId);
  1333. List<WaimaiListDto> shopList = iShopWaimaiService.findWMList(member.getShopId());
  1334. if(CollectionUtils.isNotEmpty(shopList)){
  1335. for(WaimaiListDto shopWaimai:shopList){
  1336. if(WaimaiTypeEnums.E_LE_ME.getType().equals(shopWaimai.getType())){
  1337. log.info("shopId: {} 同步饿了么菜品图片开始", member.getShopId());
  1338. iWaimaiFoodImgService.syncEleFoodImgByShop(shopWaimai.getAuthToken(), shopWaimai.getThirdShopId(), shopWaimai.getShopId().intValue());
  1339. }
  1340. if(WaimaiTypeEnums.MEI_TUAN.getType().equals(shopWaimai.getType())&&(shopWaimai.getBusinessId().intValue()!=16)){
  1341. log.info("shopId: {} 同步美团菜品图片开始", member.getShopId());
  1342. iWaimaiFoodImgService.syncMeituanFoodImgByShop(shopWaimai.getAuthToken(), shopWaimai.getShopId().intValue(),shopWaimai.getThirdShopId());
  1343. }
  1344. if(WaimaiTypeEnums.E_LE_ME_RETAIL.getType().equals(shopWaimai.getType())){
  1345. log.info("shopId: {} 同步饿百菜品图片开始", member.getShopId());
  1346. iWaimaiFoodImgService.syncEleRetailFoodImgByShop(shopWaimai.getEpoid(), shopWaimai.getShopId().intValue(),shopWaimai.getThirdShopId());
  1347. }
  1348. if(WaimaiTypeEnums.MEI_TUAN_SG.getType().equals(shopWaimai.getType())){
  1349. // 同步美团闪购图片
  1350. log.info("shopId: {} 同步美团闪购菜品图片开始", member.getShopId());
  1351. iWaimaiFoodImgService.syncMeituanSgFoodImgByShop(shopWaimai.getAuthToken(), shopWaimai.getShopId().intValue(), shopWaimai.getThirdShopId());
  1352. }
  1353. if(WaimaiTypeEnums.MEI_TUAN.getType().equals(shopWaimai.getType())&&shopWaimai.getBusinessId().intValue()==16){
  1354. log.info("shopId: {} 同步美团非冲突菜品图片开始", member.getShopId());
  1355. iWaimaiFoodImgService.syncMeituanNgFoodImgByShop(shopWaimai.getAuthToken(), shopWaimai.getShopId().intValue(),shopWaimai.getThirdShopId());
  1356. }
  1357. }
  1358. }
  1359. }
  1360. /**
  1361. * 处理京东到家新订单
  1362. *
  1363. * @param orderResultVo
  1364. */
  1365. @Override
  1366. @Transactional
  1367. @Async
  1368. public void jdHomeNewOrder(JdHomeOrderResultVo orderResultVo) {
  1369. ShopJdHomeCode shopJdHomeCode = iShopJdHomeCodeService.getOne(new QueryWrapper<ShopJdHomeCode>().eq("deleted", 0).eq("app_key", orderResultVo.getAppKey()));
  1370. List<ShopWaimai> shopWaimais = iShopWaimaiService.list(new QueryWrapper<ShopWaimai>().eq("bind_status", 1).eq("business_id", shopJdHomeCode.getId()));
  1371. Long memberId = null;
  1372. ShopWaimai shopWaimai = new ShopWaimai();
  1373. if (CollectionUtils.isNotEmpty(shopWaimais)) {
  1374. shopWaimai = shopWaimais.get(0);
  1375. }
  1376. List<Long> memberIds = iMemberService.selectByShopId(shopWaimai.getShopId());
  1377. if(CollectionUtils.isNotEmpty(memberIds)){
  1378. memberId = memberIds.get(0);
  1379. }else{
  1380. Member member = iMemberService.findOne(shopWaimai.getMerchantId());
  1381. memberId = member.getId();
  1382. }
  1383. MemberConfig config = iMemberConfigService.getOne(new QueryWrapper<MemberConfig>().eq("member_id",memberId));
  1384. // DspWaimai waimai = iDspWaimaiService.findOne(WaimaiTypeEnums.MEI_TUAN_SG.getType());
  1385. // ShopWaimai shopWaimai = iShopWaimaiService.findById(shop.getId(), waimai.getId());
  1386. if (config != null && StatusEnum.SHOW.status.equals(config.getOpenAutoorder())) {
  1387. ConfirmOrderVo confirmOrderVo = new ConfirmOrderVo();
  1388. confirmOrderVo.setOrderId(orderResultVo.getBillId());
  1389. confirmOrderVo.setAppAuthToken(shopJdHomeCode.getToken());
  1390. ResObject resObject = jdHomeClient.confirmOrder(confirmOrderVo, shopJdHomeCode.getAppKey(), shopJdHomeCode.getAppSecret());
  1391. log.info("=======京东到家订单确认结果=====" + JsonMapper.nonEmptyMapper().toJson(resObject));
  1392. }
  1393. }
  1394. /**
  1395. * 处理京东到家商家已接单
  1396. *
  1397. * @param orderVo
  1398. */
  1399. @SneakyThrows
  1400. @Override
  1401. @Async
  1402. @Transactional
  1403. public void jdHomeConfirmOrder(JdHomeOrderResultVo orderVo) {
  1404. DspWaimai waimai = iDspWaimaiService.findOne(WaimaiTypeEnums.JD_HOME.getType());
  1405. ShopJdHomeCode shopJdHomeCode = iShopJdHomeCodeService.getOne(new QueryWrapper<ShopJdHomeCode>().eq("deleted", 0).eq("app_key", orderVo.getAppKey()));
  1406. WaimaiOrder waimaiOrder = iWaimaiOrderService.getOne(new QueryWrapper<WaimaiOrder>().eq("out_order_id", orderVo.getBillId()));
  1407. JdHomeParamJsonVo jsonVo = new JdHomeParamJsonVo();
  1408. jsonVo.setAppAuthToken(shopJdHomeCode.getToken());
  1409. jsonVo.setOrderId(orderVo.getBillId());
  1410. List<OrderInfoDTO> orderInfoDTOList = jdHomeClient.selectJdHomeOrder(jsonVo, shopJdHomeCode.getAppKey(), shopJdHomeCode.getAppSecret());
  1411. OrderInfoDTO orderInfoDTO = new OrderInfoDTO();
  1412. if (orderInfoDTOList != null && orderInfoDTOList.size() > 0) {
  1413. orderInfoDTO = orderInfoDTOList.get(0);
  1414. }
  1415. ShopWaimai shopWaimai = iShopWaimaiService.getOne(new QueryWrapper<ShopWaimai>()
  1416. .eq("business_id", shopJdHomeCode.getId())
  1417. .eq("deleted", IsDeleteEnum.NORMAL.status)
  1418. .eq("waimai_id", waimai.getId())
  1419. .eq("bind_status", BindStatusEnum.BIND.status)
  1420. .eq("third_shop_id", orderInfoDTO.getDeliveryStationNo()));
  1421. Shop shop = iShopService.getById(shopWaimai.getShopId());
  1422. if (waimaiOrder == null && shopWaimai != null) {
  1423. waimaiOrder = new WaimaiOrder();
  1424. BeanUtils.copyProperties(orderInfoDTO, waimaiOrder);
  1425. String recipientAddress = orderInfoDTO.getBuyerFullAddress();
  1426. waimaiOrder.setRecipientAddress(recipientAddress);
  1427. waimaiOrder.setRecipientAddressDesensitization(recipientAddress);
  1428. waimaiOrder.setLogisticsCode(orderInfoDTO.getDeliveryCarrierNo());
  1429. String remark = orderInfoDTO.getOrderBuyerRemark();
  1430. if (StringUtils.isNotBlank(remark) && remark.contains("\n")) {
  1431. remark = remark.replace("\n", "");
  1432. }
  1433. if (StringUtils.isNotBlank(remark) && remark.contains("[预")) {
  1434. remark = remark.substring(remark.indexOf("[预"), remark.indexOf("[预") + 8) + "****" + remark.substring(remark.indexOf("[预") + 12, remark.length());
  1435. }
  1436. waimaiOrder.setCaution(remark);
  1437. waimaiOrder.setWaimaiId(waimai.getId());
  1438. waimaiOrder.setShopId(shop.getId());
  1439. waimaiOrder.setCityId(Long.valueOf(orderInfoDTO.getBuyerCity()));
  1440. waimaiOrder.setOutOrderId(orderInfoDTO.getOrderId().toString());
  1441. waimaiOrder.setOrderidView(orderInfoDTO.getOrderId().toString());
  1442. waimaiOrder.setOrderTime(orderInfoDTO.getOrderStartTime());
  1443. waimaiOrder.setRecipientName(orderInfoDTO.getBuyerFullName());
  1444. waimaiOrder.setRecipientPhone(orderInfoDTO.getBuyerMobile());
  1445. waimaiOrder.setDaySeq(orderInfoDTO.getOrderNum().toString());
  1446. Long deliveryTime = orderInfoDTO.getOrderPreStartDeliveryTime().getTime();
  1447. String businessTag = orderInfoDTO.getBusinessTag();
  1448. String[] reTag = businessTag.split(";");
  1449. List<String> tagList = Arrays.asList(reTag);
  1450. // 预计送达时间,如果立即达set 0
  1451. if (tagList.contains("one_dingshida") || tagList.contains("dj_aging_nextday")) {
  1452. waimaiOrder.setDeliveryTime(deliveryTime/1000);
  1453. }else if (tagList.contains("dj_aging_immediately")) {
  1454. waimaiOrder.setDeliveryTime(0L);
  1455. }
  1456. waimaiOrder.setHasInvoiced(orderInfoDTO.getOrderInvoiceOpenMark() == 1 ? 1 : 0);
  1457. // waimaiOrder.setLatitude(orderInfoDTO.getBuyerLng();
  1458. // waimaiOrder.setLongitude(orderInfoDTO.getBuyerLat());
  1459. // 发票具体信息
  1460. OrderInvoiceDTO orderInvoiceDTO = orderInfoDTO.getOrderInvoice();
  1461. if (orderInvoiceDTO != null) {
  1462. waimaiOrder.setInvoiceTitle(orderInvoiceDTO.getInvoiceTitle());
  1463. waimaiOrder.setTaxpayerId(orderInvoiceDTO.getInvoiceDutyNo());
  1464. }
  1465. // waimaiOrder.setExtras(orderInfoDTO.getDiscount().toString());
  1466. // waimaiOrder.setIsThirdShipping(orderVo.getIsThirdShipping());
  1467. waimaiOrder.setReceiptLat(orderInfoDTO.getBuyerLat().toString());
  1468. waimaiOrder.setReceiptLng(orderInfoDTO.getBuyerLng().toString());
  1469. BigDecimal originalPrice = new BigDecimal(String.valueOf(orderInfoDTO.getOrderTotalMoney()));
  1470. waimaiOrder.setOriginalPrice(originalPrice.divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_HALF_UP));
  1471. waimaiOrder.setPayType(orderInfoDTO.getOrderPayType());
  1472. // waimaiOrder.setPickType(Integer.valueOf(orderInfoDTO.getDeliveryCarrierNo()));
  1473. // orderVo.setWmPoiAddress(URLDecoder.decode(orderVo.getWmPoiAddress(), "utf-8"));
  1474. waimaiOrder.setPoiName(orderInfoDTO.getDeliveryStationName());
  1475. BigDecimal orderReceivableFreight = new BigDecimal(String.valueOf(orderInfoDTO.getOrderReceivableFreight()));
  1476. waimaiOrder.setShippingFee(orderReceivableFreight.divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_HALF_UP));
  1477. // 门店具体信息
  1478. jsonVo.setStoreNo(orderInfoDTO.getDeliveryStationNo());
  1479. StoreInfo storeInfo = jdHomeClient.selectJdHomeShop(jsonVo, shopJdHomeCode.getAppKey(), shopJdHomeCode.getAppSecret());
  1480. waimaiOrder.setPoiAddress(storeInfo.getStationAddress());
  1481. waimaiOrder.setPoiPhone(storeInfo.getPhone());
  1482. waimaiOrder.setPoiReceiveDetail(null);
  1483. waimaiOrder.setReceiptPrivacyPhone(null);
  1484. waimaiOrder.setStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
  1485. waimaiOrder.setOrderType(WaimaiOrderTypeEnum.JD_HOME.getType());
  1486. BigDecimal totalPrice = new BigDecimal(String.valueOf(orderInfoDTO.getOrderBuyerPayableMoney()));
  1487. waimaiOrder.setTotalPrice(totalPrice.divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_HALF_UP));
  1488. waimaiOrder.setCreateTime(new Date());
  1489. BigDecimal boxFee = BigDecimal.ZERO;
  1490. List<OrderProductDTO> orderProductDTOS = orderInfoDTO.getProduct();
  1491. for (OrderProductDTO dto : orderProductDTOS) {
  1492. boxFee = boxFee.add(BigDecimal.valueOf(dto.getCanteenMoney()));
  1493. }
  1494. waimaiOrder.setBoxFee(boxFee);
  1495. waimaiOrder.setThirdShopId(shopWaimai.getThirdShopId());
  1496. iWaimaiOrderService.save(waimaiOrder);
  1497. //消息推送
  1498. // messagePushService.waimaiMessage(shop.getId(), waimaiOrder);
  1499. //记录商品详情
  1500. List<WaimaiOrderDetail> detailList = new ArrayList<>();
  1501. if (CollectionUtils.isNotEmpty(orderInfoDTO.getProduct())) {
  1502. for (OrderProductDTO vo : orderInfoDTO.getProduct()) {
  1503. WaimaiOrderDetail detail = new WaimaiOrderDetail();
  1504. BeanUtils.copyProperties(vo, detail);
  1505. detail.setAppFoodCode(vo.getSkuIdIsv());
  1506. detail.setSkuId(vo.getSkuId().toString());
  1507. detail.setQuantity(Long.valueOf(vo.getSkuCount()));
  1508. detail.setWaimaiOrderId(waimaiOrder.getId());
  1509. detail.setFoodName(vo.getSkuName());
  1510. detail.setPrice(new BigDecimal(String.valueOf(vo.getSkuStorePrice())).divide(BigDecimal.valueOf(100), 2, BigDecimal.ROUND_HALF_UP));
  1511. detail.setSpec(vo.getSkuCostumeProperty());
  1512. // detail.setBoxNum(vo.getBoxNum().toString());
  1513. detailList.add(detail);
  1514. //iWaimaiOrderDetailService.save(detail);
  1515. }
  1516. iWaimaiOrderDetailService.saveBatch(detailList);
  1517. }
  1518. //自动打印外卖单
  1519. redisCache.redisTemplate.opsForValue().set("jd-order:" + orderInfoDTO.getOrderId() + "", JSONObject.toJSONString(orderInfoDTO), 2, TimeUnit.DAYS);
  1520. try {
  1521. // redisCache.setNumber(shop.getId(),Integer.parseInt(orderVo.getDaySeq()));
  1522. // autoPrintWaimai(waimaiOrder, detailList);
  1523. PrintOrderDto printOrderDto = JdHomeConvertPrint.convert(orderInfoDTO);
  1524. apiWaimaiPrintService.autoPrintWaimaiNew(printOrderDto, detailList, shop.getId(), waimaiOrder);
  1525. } catch (Exception e) {
  1526. log.error("自动打印异常!", e);
  1527. }
  1528. try {
  1529. //推送外卖新消息
  1530. messagePushService.waimaiMessage(shop.getId(), waimaiOrder);
  1531. } catch (Exception e) {
  1532. log.error("推送外卖订单消息异常,订单号:" + waimaiOrder.getOutOrderId());
  1533. }
  1534. //产生配送订单
  1535. addOrder(shop, waimaiOrder, waimai, SnCodeUtils.createSn());
  1536. }
  1537. }
  1538. @Override
  1539. @Async
  1540. public void jdHomeDoCancelOrder(JdHomeOrderResultVo orderCancelVo) {
  1541. if (!redisCache.redisTemplate.hasKey(orderCancelVo.getBillId()+ "_lock")){
  1542. WaimaiOrder waimaiOrder = iWaimaiOrderService.getOne(new QueryWrapper<WaimaiOrder>().eq("out_order_id", orderCancelVo.getBillId()));
  1543. if (waimaiOrder != null) {
  1544. String title = "您有一个外卖订单被顾客取消,请及时查看";
  1545. String content = "您有一个外卖订单被顾客取消,请及时查看";
  1546. redisCache.redisTemplate.opsForValue().set(orderCancelVo.getBillId()+ "_lock", "1", 60, TimeUnit.MINUTES);
  1547. messagePushService.userCancelOrderMessage(waimaiOrder.getShopId(), title, content,waimaiOrder.getId());
  1548. log.info("------->京东到家取消订单" + orderCancelVo.getBillId());
  1549. cancelOrder(waimaiOrder);
  1550. try {
  1551. String json = redisCache.redisTemplate.opsForValue().get("jd-order:"+orderCancelVo.getBillId()) + "";
  1552. if (StringUtils.isNotBlank(json)){
  1553. OrderInfoDTO vo = JSONObject.parseObject(json, OrderInfoDTO .class);
  1554. PrintOrderDto printOrderDto = JdHomeConvertPrint.convert(vo);
  1555. printOrderDto.setOrderStatus(OrderStatusEnum.CANCEL.status);
  1556. List<WaimaiOrderDetail> detailList = iWaimaiOrderDetailService.list(new QueryWrapper<WaimaiOrderDetail>().eq("waimai_order_id", waimaiOrder.getId()));
  1557. apiWaimaiPrintService.autoPrintWaimaiNew(printOrderDto, detailList, waimaiOrder.getShopId(),waimaiOrder);
  1558. }
  1559. } catch (Exception e) {
  1560. log.error("自动打印异常!", e);
  1561. }
  1562. }
  1563. }
  1564. }
  1565. }