package com.ydd.app.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.ydd.api.DeliveryService; import com.ydd.app.dto.*; import com.ydd.app.service.ApiOrderNewService; import com.ydd.app.service.OpenApiOrderService; import com.ydd.app.vo.OrderLocationVo; import com.ydd.app.vo.OrderCreateVo; import com.ydd.app.vo.PushOrderVo; import com.ydd.common.constant.RedisKeyConstant; import com.ydd.common.core.domain.ResponseResult; import com.ydd.common.core.redis.RedisCache; import com.ydd.common.enums.DeliveryTypeEnums; import com.ydd.common.enums.ResponseResultCodeEnum; import com.ydd.common.enums.WaimaiTypeEnums; import com.ydd.common.utils.SnCodeUtils; import com.ydd.common.utils.StringUtils; import com.ydd.ecloud.core.enums.DeletedEnum; import com.ydd.ecloud.core.utils.BigDecimalUtils; import com.ydd.module.CancelOrderUtils; import com.ydd.module.domain.*; import com.ydd.module.dto.CancelOrderDto; import com.ydd.module.dto.CouponDto; import com.ydd.module.enums.*; import com.ydd.module.expection.CustomAppException; import com.ydd.module.service.*; import com.ydd.third.common.utils.CoordinateUtils; import com.ydd.third.common.vo.ResObject; import com.ydd.third.common.vo.huolalavo.HirtualPhoneInfo; import com.ydd.third.common.vo.vo.order.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.math.BigDecimal; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** * 订单类开放接口 ServiceImpl * * @author 叶君翔 * @date 2022/04/08 15:20 */ @Slf4j @Service @RequiredArgsConstructor(onConstructor_ = @Autowired) public class OpenApiOrderServiceImpl implements OpenApiOrderService { private final IOrderService iOrderService; private final IOrderLogService iOrderLogService; private final IProductService iProductService; private final IShopService iShopService; private final IDspDeliveryService iDspDeliveryService; private final IShopDeliveryBindService iShopDeliveryBindService; private final IOrderDeliveryService iOrderDeliveryService; private final ApiOrderNewService apiOrderNewService; private final IOrderTipService iOrderTipService; // redis控制台 private final RedisTemplate redisTemplate; private final RedisCache redisCache; private final DeliveryService client; private final IShopWaimaiService iShopWaimaiService; private final IDspWaimaiService iDspWaimaiService; private final IMerchantService iMerchantService; private final IMemberService iMemberService; @Override public ResponseResult pushOrder(OrderPushReq pushReq) { // 特殊必填处理 ResponseResult result = specialJudge(pushReq); if (result.getCode() != ResponseResultCodeEnum.SUCCESS.getCode()) { return result; } Merchant merchant = iMerchantService.getOne(new QueryWrapper().eq("deleted", 0).eq("app_id", pushReq.getAppId())); if (Objects.isNull(merchant)) { return ResponseResult.error(ResponseResultCodeEnum.APP_ID_ERR); } Member member = iMemberService.getOne(new QueryWrapper().eq("deleted", 0) .eq("merchant_id", merchant.getId()).eq("member_type", MemberTypeEnum.MERCHANT.getType())); Order order = iOrderService.getOne(new QueryWrapper().eq("deleted", 0).eq("out_order_sn", pushReq.getOutOrderSn())); if (order == null) { order = new Order(); } // 添加订单其它属性 order.setMemberId(member.getId()); order.setMerchantId(merchant.getId()); order.setOutOrderSn(pushReq.getOutOrderSn()); order.setProductId(pushReq.getCategoryId().longValue()); Product product = iProductService.getById(order.getProductId()); order.setProductName(product.getName()); order.setWeight(pushReq.getWeight()); if (StringUtils.isNotBlank(pushReq.getRemark())) { order.setTakeRemark(pushReq.getRemark()); } order.setReceiptContactName(pushReq.getReceiverName()); order.setReceiptPhone(pushReq.getReceiverPhone()); order.setReceiptProvinceName(pushReq.getReceiverProvinceName()); order.setReceiptCityName(pushReq.getReceiverCityName()); if (StringUtils.isNotBlank(pushReq.getReceiverDistrictName())) { order.setReceiptDistrictName(pushReq.getReceiverDistrictName()); } order.setReceiptAddress(pushReq.getReceiverAddress()); if (StringUtils.isNotBlank(pushReq.getReceiverHouseNumber())) { order.setReceiptStreet(pushReq.getReceiverHouseNumber()); } order.setReceiptLng(pushReq.getReceiverLng()); order.setReceiptLat(pushReq.getReceiverLat()); order.setReceiptCityCode(pushReq.getReceiverCityCode()); order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus()); if (StringUtils.isNotBlank(pushReq.getShopCode())) { Shop shop = iShopService.getOne(new QueryWrapper().eq("deleted", 0).eq("code", pushReq.getShopCode())); if (shop != null) { order.setShopId(shop.getId()); order.setShopName(shop.getName()); order.setSendProvinceName(shop.getProvinceName()); order.setSendCityName(shop.getCityName()); order.setSendDistrictName(shop.getDistrictName()); order.setSendAddress(shop.getAddress()); order.setSendContactName(shop.getContactName()); order.setSendPhone(shop.getMobile()); order.setSendLng(shop.getLng()); order.setSendLat(shop.getLat()); order.setSendStreet(shop.getStreet()); order.setSendCityCode(shop.getCityCode()); }else { return ResponseResult.error(ResponseResultCodeEnum.SHOP_NOT_EXIST); } } else { order.setShopId(member.getShopId()); Shop shop = iShopService.getById(order.getShopId()); order.setShopName(shop.getName()); order.setSendContactName(pushReq.getSendName()); order.setSendPhone(pushReq.getSendPhone()); order.setSendProvinceName(pushReq.getSendProvinceName()); order.setSendCityName(pushReq.getSendCityName()); if (StringUtils.isNotBlank(pushReq.getSendDistrictName())) { order.setSendDistrictName(pushReq.getSendDistrictName()); } order.setSendAddress(pushReq.getSendAddress()); if (StringUtils.isNotBlank(pushReq.getSendHouseNumber())) { order.setSendStreet(pushReq.getSendHouseNumber()); } order.setSendLng(pushReq.getSendLng()); order.setSendLat(pushReq.getSendLat()); order.setSendCityCode(pushReq.getSendCityCode()); } order.setLbDaySeq(pushReq.getDaySeq()); order.setOrderSn(SnCodeUtils.createSn()); if (order.getId() == null) { iOrderService.save(order); } else { iOrderService.updateById(order); } PushOrderVo vo = new PushOrderVo(); vo.setOutOrderSn(pushReq.getOutOrderSn()); vo.setOrderSn(order.getOrderSn()); result.setData(vo); return result; } private ResponseResult specialJudge(OrderPushReq orderDto) { ResponseResult result = ResponseResult.success(); if (StringUtils.isBlank(orderDto.getShopCode())) { if (StringUtils.isBlank(orderDto.getSendName())) { return ResponseResult.error(ResponseResultCodeEnum.FIELD_EMPTY, "发件人名称", null); } if (StringUtils.isBlank(orderDto.getSendPhone())) { return ResponseResult.error(ResponseResultCodeEnum.FIELD_EMPTY, "发件人联系电话", null); } if (StringUtils.isBlank(orderDto.getSendProvinceName())) { return ResponseResult.error(ResponseResultCodeEnum.FIELD_EMPTY, "发件人所在省", null); } if (StringUtils.isBlank(orderDto.getSendCityName())) { return ResponseResult.error(ResponseResultCodeEnum.FIELD_EMPTY, "发件人所在市", null); } if (StringUtils.isBlank(orderDto.getSendAddress())) { return ResponseResult.error(ResponseResultCodeEnum.FIELD_EMPTY, "发件人详细地址", null); } if (StringUtils.isBlank(orderDto.getSendLng())) { return ResponseResult.error(ResponseResultCodeEnum.FIELD_EMPTY, "发件人纬度", null); } if (StringUtils.isBlank(orderDto.getSendLat())) { return ResponseResult.error(ResponseResultCodeEnum.FIELD_EMPTY, "发件人经度", null); } if (StringUtils.isBlank(orderDto.getSendCityCode())) { return ResponseResult.error(ResponseResultCodeEnum.FIELD_EMPTY, "发件人测试code", null); } } return result; } @Override @Transactional(rollbackFor = Exception.class) public ResponseResult cancelOrder(OrderCancelReq cancelReq) { ResponseResult result = ResponseResult.success(); if (StringUtils.isBlank(cancelReq.getOrderSn()) || StringUtils.isBlank(cancelReq.getOutOrderSn())) { return ResponseResult.error(ResponseResultCodeEnum.FIELD_EMPTY, "猎豹订单号", null); } if (StringUtils.isBlank(cancelReq.getOutOrderSn())) { return ResponseResult.error(ResponseResultCodeEnum.FIELD_EMPTY, "接入方订单编号", null); } Order order = iOrderService.selectOrderBySn(cancelReq.getOrderSn(), cancelReq.getOutOrderSn()); if (Objects.isNull(order)) { return ResponseResult.error(ResponseResultCodeEnum.ORDER_NOT_EXIST); } Integer orderStatus = DeliveryStatusEnum.CANCEL.status; if (orderStatus.equals(order.getDeliveryStatus())) { return ResponseResult.error(ResponseResultCodeEnum.ORDER_HAS_BEEN_CANCEL); } if (1 != cancelReq.getCancelType() && 4 != cancelReq.getCancelType()) { return ResponseResult.error(ResponseResultCodeEnum.ORDER_CANCEL_TYPE_NOT_EXIST); } order.setCancelType(cancelReq.getCancelType()); int count = 0; ResponseResult responseResult = new ResponseResult(); try { boolean flag = (order.getDeliveryStatus().equals(DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status) || order.getDeliveryStatus().equals(DeliveryStatusEnum.TO_BE_DELIVERED.status)) || order.getDeliveryStatus().equals(DeliveryStatusEnum.IN_DELIVERY.status); if (flag) { if (redisTemplate.hasKey(order.getOrderSn() + "_cancel")) { Long size = redisTemplate.opsForList().size(order.getOrderSn() + "_cancel"); if (size != null) { for (long i = 0; i < size; i++) { OrderResultVo vo = (OrderResultVo) redisTemplate.opsForList().rightPop(order.getOrderSn() + "_cancel"); responseResult = cancelThirdOrder(order, vo.getDeliveryId(), count, vo.getAptOrderId(), vo.getPhone(), cancelReq.getCancelType(), cancelReq.getCancelReason()); } } } else if (order.getDeliveryStatus().intValue() >= DeliveryStatusEnum.TO_BE_DELIVERED.status.intValue()) { cancelOrder(order, cancelReq.getCancelReason(), orderStatus); responseResult = cancelThirdOrder(order,order.getDeliveryId(),count,order.getAptOrderId(),order.getAptPhone(), cancelReq.getCancelType(),order.getCancelReason()); } else if (order.getDeliveryStatus().intValue() == DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status.intValue()) { cancelOrder(order, cancelReq.getCancelReason(), orderStatus); } else if (order.getDeliveryStatus().equals(DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status)) { cancelOrder(order, cancelReq.getCancelReason(), orderStatus); List list = iOrderDeliveryService.list(new QueryWrapper().eq("order_sn", order.getOrderSn()).ne("delivery_id",19).ge("delivery_status",DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status)); if(CollectionUtils.isNotEmpty(list)){ for(OrderDelivery orderDelivery:list){ responseResult = cancelThirdOrder(order,orderDelivery.getDeliveryId(),count,null,null, cancelReq.getCancelType(),cancelReq.getCancelReason()); } } } } else if (order.getStatus().equals(PayStatusEnum.NO_PAYED.status) && order.getDeliveryStatus().equals(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status)) { cancelOrder(order, cancelReq.getCancelReason(), orderStatus); } else if (DeliveryStatusEnum.ABNORMAL.status.equals(order.getDeliveryStatus()) && DeliveryStatusEnum.CANCEL.status.equals(orderStatus)) { cancelOrder(order, cancelReq.getCancelReason(), orderStatus); } } catch (Exception e) { count += 1; // 回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); } if (count > 0 || responseResult.getCode() == ResponseResultCodeEnum.FAIL.getCode()) { return ResponseResult.error(ResponseResultCodeEnum.FAIL); } return result; } public ResponseResult cancelThirdOrder(Order order,Long deliveryId,int result,Integer aptOrderId,String aptPhone,Integer cancelType,String cancenlResonMsg){ ResponseResult responseResult = new ResponseResult(); responseResult.setCode(ResponseResultCodeEnum.SUCCESS.getCode()); DspDelivery delivery = iDspDeliveryService.getById(deliveryId); OrderDelivery orderDelivery = iOrderDeliveryService.getOne(new QueryWrapper().eq("order_sn", order.getOrderSn()).eq("delivery_id", deliveryId)); // 违约金处理 BigDecimal deductFee = BigDecimal.ZERO; if (DeliveryStatusEnum.CANCEL.status.equals(orderDelivery.getDeliveryStatus())) { // 三方平台已取消 cancelSf(deductFee, order,deliveryId,""); } else { //调用配送平台取消接口 ResObject resObject = getCancelOrderResultVoResObject(orderDelivery.getChildOrderSn(), orderDelivery.getOutTradeNo(), orderDelivery.getUuptOpenId(), aptOrderId, aptPhone, order.getId(), delivery, cancelType, cancenlResonMsg); if (resObject.getCode() != 0) { result += 1; orderDelivery.setCancelResult(resObject.getMsg()); iOrderDeliveryService.update(orderDelivery, new UpdateWrapper().eq("order_sn", order.getOrderSn()).eq("delivery_id", deliveryId)); if(resObject.getCode() !=2011&&!orderDelivery.getDeliveryName().contains("达达")){ responseResult.setCode(ResponseResultCodeEnum.FAIL.getCode()); } } if (resObject.getData() != null&&!DeliveryTypeEnums.SHAN_SONG.getType().equals(delivery.getType())) { deductFee = resObject.getData().getDeductFee() == null ? BigDecimal.ZERO : resObject.getData().getDeductFee(); if (deductFee.compareTo(BigDecimal.ZERO) > 0) { redisCache.setCacheObject("deuctFee_"+order.getOrderSn(), deductFee); redisCache.expire("deuctFee_"+order.getOrderSn(),2, TimeUnit.HOURS); } } //商家取消订单 顺丰是实时处理不回调 if (DeliveryTypeEnums.SHUN_FENG.getType().equals(delivery.getType()) || DeliveryTypeEnums.FENG_NIAO.getType().equals(delivery.getType()) || DeliveryTypeEnums.FENG_NIAO_PT.getType().equals(delivery.getType()) || DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType()) || DeliveryTypeEnums.MEI_TUAN_SG_ZB.getType().equals(delivery.getType())) { cancelSf(deductFee, order,deliveryId,resObject.getMsg()); } if (result > 0) { responseResult.setCode(ResponseResultCodeEnum.FAIL.getCode()); } } return responseResult; } public void cancelOrder(Order order, String cancelReason, Integer orderStatus) { order.setStatus(PayStatusEnum.CANCEL.status); order.setDeliveryStatus(orderStatus); order.setCancelReason(cancelReason); iOrderService.updateById(order); iOrderLogService.addOrderLog(order.getId(), order.getDeliveryStatus()); } private void cancelSf(BigDecimal deductFee, Order order,Long deliveryId,String cancelResult) { OrderDelivery orderDelivery = new OrderDelivery(); orderDelivery.setDeliveryStatus(DeliveryStatusEnum.CANCEL.status); orderDelivery.setCancelTime(new Date()); orderDelivery.setCancelResult(cancelResult); iOrderDeliveryService.update(orderDelivery, new UpdateWrapper().eq("order_sn", order.getOrderSn()).eq("delivery_id", deliveryId)); int count = iOrderDeliveryService.count(new QueryWrapper().eq("order_sn", order.getOrderSn()) .ne("delivery_status", DeliveryStatusEnum.CANCEL.status).ne("out_trade_no", -1).isNotNull("out_trade_no")); BigDecimal result = redisCache.getCacheObject(order.getOrderSn()); if (result != null) { deductFee = result; redisCache.deleteObject(order.getOrderSn()); } if (count == 0) { order = iOrderService.getById(order.getId()); if (order.getRefundMoney().compareTo(BigDecimal.ZERO) == 0) { order.setRefundMoney(order.getPayAmount().subtract(deductFee)); List orderTips = iOrderTipService.list(new QueryWrapper().eq("order_no", order.getOrderSn()).eq("status", PayStatusEnum.PAYED.status)); BigDecimal refundMoney = order.getPayAmount().subtract(deductFee); BigDecimal tips = orderTips.stream().map(OrderTip::getAmount).reduce(BigDecimal.ZERO, BigDecimalUtils::sum); refundMoney = refundMoney.subtract(tips); apiOrderNewService.refundTip(orderTips, "加小费退款", order.getMemberId(), order.getMerchantId()); apiOrderNewService.refund(order.getOrderSn(), refundMoney, "取消订单退款", order.getMemberId(), order.getMerchantId()); redisTemplate.delete(order.getOrderSn()+"to_recive:"); } iOrderService.updateById(order); } } private ResObject getCancelOrderResultVoResObject(String orderNo, String outTradeNo, String uuptOpenId, Integer aptOrderId, String aptPhone, Long orderId, DspDelivery delivery, Integer cancelType,String cancenlResonMsg) { OrderDelivery orderDelivery = iOrderDeliveryService.getOne(new QueryWrapper().eq("child_order_sn", orderNo)); CancelOrderDto dto = new CancelOrderDto(); dto.setOrderSn(orderNo); dto.setReason(OrderCancelTypeEnum.getNameByType(cancelType)); dto.setCancelCode(cancelType); dto.setCancenlResonMsg(cancenlResonMsg); dto.setOutTradeNo(outTradeNo); dto.setUuptOpenId(uuptOpenId); dto.setAptOrderId(aptOrderId); dto.setAptPhone(aptPhone); dto.setKfAccessToken(orderDelivery.getKfToken()); // 美团众包 dto.setZbOrderSn(orderDelivery.getOutTradeNo()); dto.setZbAccessToken(orderDelivery.getZbToken()); // 美团在我们平台的订单id dto.setOrderId(orderId); dto.setIsMine(orderDelivery.getIsMine()); // 货拉拉订单状态 dto.setHllStatus(orderDelivery.getHllStatus()); //顺丰需要shopId delivery配送平台信息 CancelOrderVo orderVo = CancelOrderUtils.createOrderVo(dto, delivery); Order order = iOrderService.getById(orderId); if (order.getMerchantId() != null && orderDelivery.getIsMine().equals(1)) { ShopDeliveryBind shopDeliveryBind = iShopDeliveryBindService.getShopDeliveryBind(order.getMerchantId(), order.getShopId(), delivery.getId(), delivery.getType()); if (shopDeliveryBind != null) { orderVo.setAccessToken(shopDeliveryBind.getAuthToken()); orderVo.setMerchantId(shopDeliveryBind.getThirdShopId()); } } //订单取消返回结果 ResObject resObject = client.cancelOrder(orderVo); if (resObject.getCode() != 0) { try { log.info("<===========>重新发起取消开始********************"); TimeUnit.SECONDS.sleep(5); resObject = client.cancelOrder(orderVo); } catch (Exception e) { } log.error("取消订单失败" + JSONObject.toJSONString(orderVo)); } return resObject; } @Override public ResponseResult riderLocation(OrderLocationReq locationReq) { ResponseResult result = ResponseResult.success(); if (StringUtils.isBlank(locationReq.getOrderSn()) || StringUtils.isBlank(locationReq.getOutOrderSn())) { return ResponseResult.error(ResponseResultCodeEnum.FIELD_EMPTY, "订单号", null); } Order order = iOrderService.selectOrderBySn(locationReq.getOrderSn(), locationReq.getOutOrderSn()); if (Objects.isNull(order)) { return ResponseResult.error(ResponseResultCodeEnum.ORDER_NOT_EXIST); } boolean flag = order.getDeliveryStatus() > DeliveryStatusEnum.IN_DELIVERY.getStatus() || DeliveryStatusEnum.CANCEL.status.equals(order.getDeliveryStatus()) || DeliveryStatusEnum.ABNORMAL.status.equals(order.getDeliveryStatus()); OrderDelivery orderDelivery = iOrderDeliveryService.getOne(new QueryWrapper() .eq("deleted", 0) .eq("order_sn", order.getOrderSn()) .eq("delivery_id", order.getDeliveryId())); DspDelivery delivery = iDspDeliveryService.findById(order.getDeliveryId()); if (flag || Objects.isNull(delivery) || Objects.isNull(orderDelivery)) { return ResponseResult.error(ResponseResultCodeEnum.ORDER_STATUS_FAIL); } OrderLocationVo vo = getRiderLocation(order, orderDelivery, delivery); if (Objects.isNull(vo)) { return ResponseResult.error(ResponseResultCodeEnum.FAIL); }else { result.setData(vo); } return result; } private OrderLocationVo getRiderLocation(Order order, OrderDelivery orderDelivery, DspDelivery delivery) { OrderLocationVo locationVo = new OrderLocationVo(); if (DeliveryTypeEnums.DADA.getType().equals(delivery.getType())&&orderDelivery!=null) { OrderQueryVo orderQueryVo = new OrderQueryVo(); orderQueryVo.setLbClient(DeliveryTypeEnums.DADA.getName()); orderQueryVo.setOrderNo(orderDelivery.getChildOrderSn()); orderQueryVo.setIsDirectDelivery(0); if (orderDelivery.getIsMine() == 1L){ ShopDeliveryBind shopDeliveryBind = iShopDeliveryBindService.getShopDeliveryBind(order.getMerchantId(), order.getShopId(), delivery.getId(), delivery.getType()); if (shopDeliveryBind != null){ orderQueryVo.setMerchantId(shopDeliveryBind.getThirdShopId()); } } ResObject resObject = client.queryOrderInfo(orderQueryVo); if (DeletedEnum.NO.getValue().equals(resObject.getCode())) { String riderLat = resObject.getData().getRiderLat().toString(); String riderLng = resObject.getData().getRiderLng().toString(); locationVo.setShipperLat(riderLat); locationVo.setShipperLng(riderLng); locationVo.setShipperName(resObject.getData().getRiderName()); locationVo.setShipperPhone(resObject.getData().getRiderPhone()); } } else if (DeliveryTypeEnums.DADA_YZ.getType().equals(delivery.getType())&&orderDelivery!=null) { OrderQueryVo orderQueryVo = new OrderQueryVo(); orderQueryVo.setLbClient(DeliveryTypeEnums.DADA_YZ.getName()); orderQueryVo.setOrderNo(orderDelivery.getChildOrderSn()); orderQueryVo.setIsDirectDelivery(1); if (orderDelivery.getIsMine() == 1){ ShopDeliveryBind shopDeliveryBind = iShopDeliveryBindService.getShopDeliveryBind(order.getMerchantId(), order.getShopId(), delivery.getId(), delivery.getType()); if (shopDeliveryBind != null){ orderQueryVo.setMerchantId(shopDeliveryBind.getThirdShopId()); } } ResObject resObject = client.queryOrderInfo(orderQueryVo); if (DeletedEnum.NO.getValue().equals(resObject.getCode())) { String riderLat = resObject.getData().getRiderLat().toString(); String riderLng = resObject.getData().getRiderLng().toString(); locationVo.setShipperLat(riderLat); locationVo.setShipperLng(riderLng); locationVo.setShipperName(resObject.getData().getRiderName()); locationVo.setShipperPhone(resObject.getData().getRiderPhone()); } } else if (DeliveryTypeEnums.UUPT.getType().equals(delivery.getType())) { OrderQueryVo orderQueryVo = new OrderQueryVo(); orderQueryVo.setLbClient(DeliveryTypeEnums.UUPT.getName()); orderQueryVo.setOrderNo(order.getOutTradeNo()); orderQueryVo.setUuptOpenId(order.getUuptOpenId()); ResObject resObject = client.queryOrderInfo(orderQueryVo); if (DeletedEnum.NO.getValue().equals(resObject.getCode())) { if(resObject.getData().getRiderLat() != null){ double[] receiverGps = CoordinateUtils.bd09_To_Gcj02(resObject.getData().getRiderLat().doubleValue(), resObject.getData().getRiderLng().doubleValue()); locationVo.setShipperLat(receiverGps[0] + ""); locationVo.setShipperLng(receiverGps[1] + ""); locationVo.setShipperName(resObject.getData().getRiderName()); locationVo.setShipperPhone(resObject.getData().getRiderPhone()); } } } else if (DeliveryTypeEnums.AIPT.getType().equals(delivery.getType())) { OrderQueryVo orderQueryVo = new OrderQueryVo(); orderQueryVo.setLbClient(DeliveryTypeEnums.AIPT.getName()); orderQueryVo.setAptOrderId(order.getAptOrderId()); orderQueryVo.setAptPhone(order.getAptPhone()); if (order.getDeliveryStatus() > DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status) { ResObject resObject = client.queryOrderInfo(orderQueryVo); if (DeletedEnum.NO.getValue().equals(resObject.getCode())) { if(resObject.getData().getRiderLat() != null){ double[] receiverGps = CoordinateUtils.bd09_To_Gcj02(resObject.getData().getRiderLat().doubleValue(), resObject.getData().getRiderLng().doubleValue()); locationVo.setShipperLat(receiverGps[0] + ""); locationVo.setShipperLng(receiverGps[1] + ""); locationVo.setShipperName(resObject.getData().getRiderName()); locationVo.setShipperPhone(resObject.getData().getRiderPhone()); } } } } else if (DeliveryTypeEnums.FENG_NIAO.getType().equals(delivery.getType())&&orderDelivery!=null) { if (order.getDeliveryStatus() > DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status) { OrderQueryVo orderQueryVo = new OrderQueryVo(); orderQueryVo.setLbClient(DeliveryTypeEnums.FENG_NIAO.getName()); orderQueryVo.setOrderNo(orderDelivery.getChildOrderSn()); orderQueryVo.setAccessToken(delivery.getAuthToken()); orderQueryVo.setMerchantId(delivery.getShopId()); ResObject resObject = client.queryOrderInfo(orderQueryVo); if (DeletedEnum.NO.getValue().equals(resObject.getCode())) { locationVo.setShipperName(resObject.getData().getRiderName()); locationVo.setShipperPhone(resObject.getData().getRiderPhone()); } RiderLocationVo riderLocationVo = new RiderLocationVo(); riderLocationVo.setLbClient(DeliveryTypeEnums.FENG_NIAO.getName()); riderLocationVo.setOrderNo(orderDelivery.getChildOrderSn()); riderLocationVo.setAccessToken(delivery.getAuthToken()); riderLocationVo.setMerchantId(delivery.getShopId()); ResObject res = client.getRiderLocation(riderLocationVo); if (DeletedEnum.NO.getValue().equals(res.getCode())) { String riderLat = res.getData().getLat().toString(); String riderLng = res.getData().getLng().toString(); locationVo.setShipperLat(riderLat); locationVo.setShipperLng(riderLng); } } } else if (DeliveryTypeEnums.MEI_TUAN.getType().equals(delivery.getType())) { if (order.getDeliveryStatus() > DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status) { RiderLocationVo orderQueryVo = new RiderLocationVo(); orderQueryVo.setLbClient(DeliveryTypeEnums.MEI_TUAN.getName()); // 美团订单号 orderQueryVo.setOrderNo(order.getOutTradeNo()); // 我们平台订单号 orderQueryVo.setDeliveryId(order.getId()); ResObject resObject = client.getRiderLocation(orderQueryVo); if (DeletedEnum.NO.getValue().equals(resObject.getCode())) { String riderLat = resObject.getData().getLat().toString(); String riderLng = resObject.getData().getLng().toString(); locationVo.setShipperLat(riderLat); locationVo.setShipperLng(riderLng); } OrderQueryVo orderQuery = new OrderQueryVo(); orderQuery.setLbClient(DeliveryTypeEnums.MEI_TUAN.getName()); // 美团订单号 orderQuery.setOrderNo(order.getOutTradeNo()); // 我们平台订单号 orderQuery.setDeliveryId(order.getId()); ResObject resObject1 = client.queryOrderInfo(orderQuery); if (DeletedEnum.NO.getValue().equals(resObject1.getCode())) { locationVo.setShipperName(resObject1.getData().getRiderName()); locationVo.setShipperPhone(resObject1.getData().getRiderPhone()); } } } else if (DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType())) { if (order.getDeliveryStatus() > DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status) { RiderLocationVo orderQueryVo = new RiderLocationVo(); orderQueryVo.setLbClient(DeliveryTypeEnums.MEI_TUAN_ZB.getName()); // 美团订单号 orderQueryVo.setOrderNo(orderDelivery.getOutTradeNo()); // token orderQueryVo.setAccessToken(orderDelivery.getZbToken()); ResObject resObject = client.getRiderLocation(orderQueryVo); if (DeletedEnum.NO.getValue().equals(resObject.getCode())) { String riderLat = resObject.getData().getLat().toString(); String riderLng = resObject.getData().getLng().toString(); locationVo.setShipperLat(riderLat); locationVo.setShipperLng(riderLng); } } } else if (DeliveryTypeEnums.SHAN_SONG.getType().equals(delivery.getType())&&orderDelivery!=null) { OrderQueryVo orderQueryVo = new OrderQueryVo(); orderQueryVo.setLbClient(DeliveryTypeEnums.SHAN_SONG.getName()); orderQueryVo.setOrderNo(orderDelivery.getChildOrderSn()); orderQueryVo.setIssOrderNo(order.getOutTradeNo()); if (orderDelivery.getIsMine() == 1){ orderQueryVo.setIsShansongSH(true); ShopDeliveryBind shopDeliveryBind = iShopDeliveryBindService.getShopDeliveryBind(order.getMerchantId(), order.getShopId(), delivery.getId(), delivery.getType()); if (shopDeliveryBind != null){ orderQueryVo.setAccessToken(shopDeliveryBind.getAuthToken()); } } if (order.getDeliveryStatus() > DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status) { ResObject resObject = client.queryOrderInfo(orderQueryVo); if (DeletedEnum.NO.getValue().equals(resObject.getCode())) { if(resObject.getData().getRiderLat() != null){ double[] receiverGps = CoordinateUtils.bd09_To_Gcj02(resObject.getData().getRiderLat().doubleValue(), resObject.getData().getRiderLng().doubleValue()); locationVo.setShipperLat(receiverGps[0] + ""); locationVo.setShipperLng(receiverGps[1] + ""); locationVo.setShipperName(resObject.getData().getRiderName()); locationVo.setShipperPhone(resObject.getData().getRiderPhone()); } } } } else if (DeliveryTypeEnums.KUAI_FU.getType().equals(delivery.getType())&&orderDelivery!=null) { OrderQueryVo orderQueryVo = new OrderQueryVo(); orderQueryVo.setLbClient(DeliveryTypeEnums.KUAI_FU.getName()); orderQueryVo.setOrderNo(orderDelivery.getChildOrderSn()); orderQueryVo.setIssOrderNo(order.getOutTradeNo()); // 现在快服相关信息 orderQueryVo.setAccessToken(orderDelivery.getKfToken()); orderQueryVo.setKfOpenId(orderDelivery.getKfOpenId()); orderQueryVo.setIsMine(orderDelivery.getIsMine() ); if (order.getDeliveryStatus() > DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status) { ResObject resObject = client.queryOrderInfo(orderQueryVo); if (DeletedEnum.NO.getValue().equals(resObject.getCode())) { if(resObject.getData().getRiderLat() != null){ double[] receiverGps = CoordinateUtils.bd09_To_Gcj02(resObject.getData().getRiderLat().doubleValue(), resObject.getData().getRiderLng().doubleValue()); locationVo.setShipperLat(receiverGps[0] + ""); locationVo.setShipperLng(receiverGps[1] + ""); locationVo.setShipperName(resObject.getData().getRiderName()); locationVo.setShipperPhone(resObject.getData().getRiderPhone()); } } } }else if (DeliveryTypeEnums.HUO_LA_LA.getType().equals(delivery.getType())&&orderDelivery!=null){ OrderQueryVo orderQueryVo = new OrderQueryVo(); orderQueryVo.setLbClient(DeliveryTypeEnums.HUO_LA_LA.getName()); orderQueryVo.setIssOrderNo(orderDelivery.getOutTradeNo()); orderQueryVo.setAccessToken(delivery.getAuthToken()); ResObject orderInfo = client.queryOrderInfo(orderQueryVo); if (orderInfo!=null) { locationVo.setShipperName(orderInfo.getData().getRiderName()); locationVo.setShipperPhone(orderInfo.getData().getRiderPhone()); List list = orderInfo.getData().getHllPhones(); if(!org.springframework.util.CollectionUtils.isEmpty(list)){ for(HirtualPhoneInfo info:list ){ if(info.getUser_phone_no().equals(order.getSendPhone())){ locationVo.setShipperPhone(info.getConnect_phone_no()); } } }else{ String phone = client.bindVirtualPhone(delivery.getAuthToken(),orderDelivery.getOutTradeNo(),order.getSendPhone()); locationVo.setShipperPhone(phone); } String riderLat = orderInfo.getData().getRiderLat().toString(); String riderLng = orderInfo.getData().getRiderLng().toString(); locationVo.setShipperLat(riderLat); locationVo.setShipperLng(riderLng); } } else if (DeliveryTypeEnums.SHUN_FENG.getType().equals(delivery.getType())) { RiderLocationVo orderQueryVo = new RiderLocationVo(); orderQueryVo.setLbClient(DeliveryTypeEnums.SHUN_FENG.getName()); orderQueryVo.setOrderNo(order.getOutTradeNo()); orderQueryVo.setOrderType(1); ResObject resObject = client.getRiderLocation(orderQueryVo); if (DeletedEnum.NO.getValue().equals(resObject.getCode())) { if(resObject.getData().getLat() != null){ String riderLat = resObject.getData().getLat().toString(); String riderLng = resObject.getData().getLng().toString(); locationVo.setShipperLat(riderLat); locationVo.setShipperLng(riderLng); locationVo.setShipperName(resObject.getData().getName()); locationVo.setShipperPhone(resObject.getData().getPhone()); } } } else if (DeliveryTypeEnums.MEI_TUAN_SG_ZB.getType().equals(delivery.getType())) { if (order.getDeliveryStatus() > DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status) { DspWaimai waiMai = iDspWaimaiService.findOne(WaimaiTypeEnums.MEI_TUAN.getType()); ShopWaimai shopWaimai = iShopWaimaiService.findByToken(order.getShopId(), waiMai.getId(),orderDelivery.getZbToken()); RiderLocationVo orderQueryVo = new RiderLocationVo(); orderQueryVo.setLbClient(DeliveryTypeEnums.MEI_TUAN_SG_ZB.getName()); // 美团订单号 orderQueryVo.setOrderNo(orderDelivery.getOutTradeNo()); // token orderQueryVo.setAccessToken(orderDelivery.getZbToken()); orderQueryVo.setThirdShopId(shopWaimai.getThirdShopId()); ResObject resObject = client.getRiderLocation(orderQueryVo); if (DeletedEnum.NO.getValue().equals(resObject.getCode())) { String riderLat = resObject.getData().getLat().toString(); String riderLng = resObject.getData().getLng().toString(); locationVo.setShipperLat(riderLat); locationVo.setShipperLng(riderLng); } } }else if (DeliveryTypeEnums.FENG_NIAO_PT.getType().equals(delivery.getType())&&orderDelivery!=null) { if (order.getDeliveryStatus() > DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status) { OrderQueryVo orderQueryVo = new OrderQueryVo(); orderQueryVo.setLbClient(DeliveryTypeEnums.FENG_NIAO_PT.getName()); orderQueryVo.setOrderNo(orderDelivery.getChildOrderSn()); orderQueryVo.setAccessToken(delivery.getAuthToken()); orderQueryVo.setMerchantId(delivery.getShopId()); ResObject resObject = client.queryOrderInfo(orderQueryVo); if (DeletedEnum.NO.getValue().equals(resObject.getCode())) { locationVo.setShipperName(resObject.getData().getRiderName()); locationVo.setShipperPhone(resObject.getData().getRiderPhone()); } RiderLocationVo riderLocationVo = new RiderLocationVo(); riderLocationVo.setLbClient(DeliveryTypeEnums.FENG_NIAO_PT.getName()); riderLocationVo.setOrderNo(orderDelivery.getChildOrderSn()); riderLocationVo.setAccessToken(delivery.getAuthToken()); riderLocationVo.setMerchantId(delivery.getShopId()); ResObject res = client.getRiderLocation(riderLocationVo); if (DeletedEnum.NO.getValue().equals(res.getCode())) { String riderLat = res.getData().getLat().toString(); String riderLng = res.getData().getLng().toString(); locationVo.setShipperLat(riderLat); locationVo.setShipperLng(riderLng); } } } return locationVo; } @Override public ResponseResult createOrder(OrderCreateReq orderCreateReq) { // 计价结果缓存到redis, 10分钟有效, 过时需重新计价 if (!redisCache.hasKey(RedisKeyConstant.VALUATION_RESULT + orderCreateReq.getOutOrderSn())) { return ResponseResult.error(ResponseResultCodeEnum.VALUATION_INVALID); } OrderReq orderReq = redisCache.getCacheObject(RedisKeyConstant.VALUATION_RESULT + orderCreateReq.getOutOrderSn()); List valuationResList = orderReq.getValuationRes(); if (CollectionUtils.isEmpty(valuationResList)) { return ResponseResult.error(ResponseResultCodeEnum.VALUATION_INVALID); } List deliveryIds = Arrays.asList(orderCreateReq.getDeliveryIdStr().split(",")); List valuationRes = valuationResList.stream().filter(item -> deliveryIds.contains(String.valueOf(item.getDeliveryType()))).collect(Collectors.toList()); if (CollectionUtils.isEmpty(valuationRes)) { return ResponseResult.error(ResponseResultCodeEnum.DELIVERY_ID_INVALID); } orderReq.setValuationRes(valuationRes); try { Object result = apiOrderNewService.createOrder(orderReq.getMemberId(), orderReq, 1); if ("amount_not_enough".equals(result)) { return ResponseResult.error(ResponseResultCodeEnum.AMOUNT_NOT_ENOUGH); } else if ("ok".equals(result)) { OrderCreateVo orderCreateVo = OrderCreateVo.builder().orderSn(orderReq.getOrderNo()).outOrderSn(orderCreateReq.getOutOrderSn()).build(); return ResponseResult.success(orderCreateVo); } } catch (CustomAppException e) { return ResponseResult.error(ResponseResultCodeEnum.ORDER_CREATE_ERR.getCode(), e.getMessage()); } catch (Exception e) { return ResponseResult.error(ResponseResultCodeEnum.ORDER_CREATE_ERR, null); } return ResponseResult.error(ResponseResultCodeEnum.ORDER_CREATE_ERR); } }