|
@@ -1,389 +1,389 @@
|
|
|
-/*
|
|
|
- * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
|
|
|
- *
|
|
|
- * https://www.gz-yami.com/
|
|
|
- *
|
|
|
- * 未经允许,不可做商业用途!
|
|
|
- *
|
|
|
- * 版权所有,侵权必究!
|
|
|
- */
|
|
|
-
|
|
|
-package com.yami.shop.platform.task;
|
|
|
-
|
|
|
-import cn.hutool.core.collection.CollectionUtil;
|
|
|
-import cn.hutool.core.date.DateUtil;
|
|
|
-import cn.hutool.core.util.ObjectUtil;
|
|
|
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
-import com.yami.shop.bean.bo.PayInfoBo;
|
|
|
-import com.yami.shop.bean.enums.DvyType;
|
|
|
-import com.yami.shop.bean.enums.OrderStatus;
|
|
|
-import com.yami.shop.bean.model.*;
|
|
|
-import com.yami.shop.bean.param.OrderDto;
|
|
|
-import com.yami.shop.common.enums.PayType;
|
|
|
-import com.yami.shop.common.exception.YamiShopBindException;
|
|
|
-import com.yami.shop.dao.DeviceFeyMapper;
|
|
|
-import com.yami.shop.delivery.comment.api.paotui.PaoTuiApi;
|
|
|
-import com.yami.shop.delivery.comment.param.DeliveryOrderItemParam;
|
|
|
-import com.yami.shop.delivery.comment.service.DeliveryOrderService;
|
|
|
-import com.yami.shop.service.*;
|
|
|
-import com.yami.shop.service.impl.FeiEYunApi;
|
|
|
-import org.apache.commons.lang3.StringUtils;
|
|
|
-import org.apache.logging.log4j.core.util.JsonUtils;
|
|
|
-import org.slf4j.Logger;
|
|
|
-import org.slf4j.LoggerFactory;
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.http.ResponseEntity;
|
|
|
-import org.springframework.stereotype.Component;
|
|
|
-
|
|
|
-import java.math.BigDecimal;
|
|
|
-import java.text.SimpleDateFormat;
|
|
|
-import java.util.*;
|
|
|
-import java.util.stream.Collectors;
|
|
|
-
|
|
|
-
|
|
|
-@Component("orderTask")
|
|
|
-public class OrderTask {
|
|
|
-
|
|
|
-
|
|
|
- private Logger logger = LoggerFactory.getLogger(getClass());
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private OrderService orderService;
|
|
|
- @Autowired
|
|
|
- private ProductService productService;
|
|
|
- @Autowired
|
|
|
- private SkuService skuService;
|
|
|
- @Autowired
|
|
|
- private PayService payService;
|
|
|
- @Autowired
|
|
|
- private OrderSettlementService orderSettlementService;
|
|
|
- @Autowired
|
|
|
- private PayManagerService payManagerService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private PaoTuiApi paoTuiApi;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private OrderRefundService orderRefundService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private OrderItemService orderItemService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private UserAddrOrderService userAddrOrderService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private DeliveryOrderService deliveryOrderService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private IQnhService qnhService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private UserService userService;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- private ShopDetailService shopDetailService;
|
|
|
- @Autowired
|
|
|
- private DeviceFeyMapper deviceFeyMapper;
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- public void cancelOrder(){
|
|
|
- Date now = new Date();
|
|
|
- logger.info("取消超时未支付订单。。。");
|
|
|
- // 获取30分钟之前未支付的订单
|
|
|
- List<Order> orders = orderService.listUnRefundOrderAndOrderItems(OrderStatus.UNPAY.value(),DateUtil.offsetMinute(now, -30));
|
|
|
- if (CollectionUtil.isEmpty(orders)) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- List<Order> cancelOrderList = this.chackOrders(orders);
|
|
|
- orderService.cancelOrders(cancelOrderList);
|
|
|
- // 移除缓存
|
|
|
- this.removeCache(cancelOrderList);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 确认收货
|
|
|
- */
|
|
|
- public void confirmOrder(){
|
|
|
- Date now = new Date();
|
|
|
- logger.info("系统自动确认收货订单。。。");
|
|
|
- // 获取15天之前等待确认收货的订单
|
|
|
- List<Order> orders = orderService.listUnRefundOrderAndOrderItems(OrderStatus.CONSIGNMENT.value(),DateUtil.offsetDay(now, -15));
|
|
|
- if (CollectionUtil.isEmpty(orders)) {
|
|
|
- return;
|
|
|
- }
|
|
|
- orderService.receiptOrder(orders);
|
|
|
- // 移除缓存
|
|
|
- this.removeCache(orders);
|
|
|
- }
|
|
|
-
|
|
|
- public void createDistributionOrder(){
|
|
|
- SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
- Date now = new Date();
|
|
|
- logger.info("用户订单五分钟后未取消则创建物流订单。。。");
|
|
|
- List<Order> orders = orderService.listUnRefundOrderAndOrderItems(OrderStatus.PADYED.value(),DateUtil.offsetMinute(now, -5));
|
|
|
- if(CollectionUtil.isEmpty(orders)){
|
|
|
- return;
|
|
|
- }
|
|
|
-// List<Order> orders =orderService.list(new QueryWrapper<Order>().lambda().like(Order::getOrderNumber,"1879830276981526528"));
|
|
|
- for (Order order:orders){
|
|
|
- //创建物流订单
|
|
|
- if (!Objects.equals(order.getStatus(), OrderStatus.PADYED.value()) && Objects.equals(order.getDvyType(), DvyType.FETCH.value())){
|
|
|
- System.out.println("订单不处于已付款状态,无法进行发货");
|
|
|
- continue;
|
|
|
- }else if (!Objects.equals(order.getStatus(), OrderStatus.PADYED.value())){
|
|
|
- System.out.println("订单不处于待发货状态,无法进行发货");
|
|
|
- continue;
|
|
|
- }
|
|
|
- UserAddrOrder userAddrOrder = userAddrOrderService.getById(order.getAddrOrderId());
|
|
|
- if(ObjectUtil.isEmpty(userAddrOrder)){
|
|
|
- System.out.println("该订单地址存在问题,请检查");
|
|
|
- continue;
|
|
|
- }
|
|
|
- int count = orderRefundService.count(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getOrderId, order.getOrderId()));
|
|
|
- if(count>0){
|
|
|
- LambdaQueryWrapper<OrderRefund> orderRefundLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
- orderRefundLambdaQueryWrapper.eq(OrderRefund::getOrderId,order.getOrderId());
|
|
|
- //发货时只有订单不存在退款或退款被拒绝才会创建仓储与物流订单
|
|
|
- orderRefundLambdaQueryWrapper.and(wrapper->wrapper.eq(OrderRefund::getReturnMoneySts,-1).or().eq(OrderRefund::getReturnMoneySts,7).or().eq(OrderRefund::getReturnMoneySts,6));
|
|
|
- List<OrderRefund> orderRefunds = orderRefundService.list(orderRefundLambdaQueryWrapper);
|
|
|
- if (CollectionUtil.isEmpty(orderRefunds)) {
|
|
|
- System.out.println("该订单有退款信息正在处理或已退款中,无法进行发货操作");
|
|
|
- continue;
|
|
|
- }
|
|
|
- }
|
|
|
- try {
|
|
|
- boolean success = createQNHOrder(order);
|
|
|
- if(!success){
|
|
|
- continue;
|
|
|
- }
|
|
|
- }catch (Exception e){
|
|
|
- System.out.println(e.getMessage());
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- List<OrderItem> orderItems = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
|
|
|
-
|
|
|
- //先创建物流订单
|
|
|
- DeliveryOrderItemParam deliveryOrderItemParam = new DeliveryOrderItemParam();
|
|
|
- deliveryOrderItemParam.setOrderNumber(order.getOrderNumber());
|
|
|
- deliveryOrderItemParam.setDvyId(16l);
|
|
|
- deliveryOrderItemParam.setDeliveryType(1);
|
|
|
- deliveryOrderItemParam.setDvyFlowId("sdfsf");
|
|
|
- deliveryOrderItemParam.setSelectOrderItems(orderItems);
|
|
|
- for (OrderItem orderItem:deliveryOrderItemParam.getSelectOrderItems()){
|
|
|
- orderItem.setChangeNum(orderItem.getProdCount());
|
|
|
- }
|
|
|
-
|
|
|
- try {
|
|
|
- deliveryOrderService.saveDeliveriesInfo(deliveryOrderItemParam);
|
|
|
- order=orderService.getById(order.getOrderId());
|
|
|
- order.setDvyStatus(1);
|
|
|
- }catch (Exception e){
|
|
|
- System.out.println(e.getMessage());
|
|
|
- order.setDvyStatus(0);
|
|
|
- }
|
|
|
- orderService.updateById(order);
|
|
|
- }
|
|
|
-// this.removeCache(orders);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 查询订单,去除已支付的订单
|
|
|
- * @param orders
|
|
|
- */
|
|
|
- private List<Order> chackOrders(List<Order> orders){
|
|
|
- List<String> orderNumbers=orders.stream().map(Order::getOrderNumber).collect(Collectors.toList());
|
|
|
- // 收集未支付的订单
|
|
|
- List<Order> orderList = new ArrayList<>();
|
|
|
- //获取订单对应的订单结算数据
|
|
|
- List<OrderSettlement> orderSettlementList = orderSettlementService.list(new LambdaQueryWrapper<OrderSettlement>()
|
|
|
- .in(OrderSettlement::getOrderNumber, orderNumbers));
|
|
|
- Map<String, OrderSettlement> orderSettlementMap = orderSettlementList.stream()
|
|
|
- .collect(Collectors.toMap(OrderSettlement::getOrderNumber, orderSettlement -> orderSettlement));
|
|
|
- for (Order order : orders) {
|
|
|
- OrderSettlement orderSettlement = orderSettlementMap.get(order.getOrderNumber());
|
|
|
- if (Objects.isNull(orderSettlement) || Objects.isNull(orderSettlement.getPayType()) || Objects.isNull(orderSettlement.getPayNo())){
|
|
|
- orderList.add(order);
|
|
|
- continue;
|
|
|
- }
|
|
|
- PayInfoBo payInfo = payManagerService.getPayInfo(PayType.instance(orderSettlement.getPayType()), orderSettlement.getPayNo());
|
|
|
- if(payInfo.getIsPaySuccess()){
|
|
|
- // 根据内部订单号更新order settlement
|
|
|
- List<Order> successOrderList = payService.paySuccess(payInfo.getPayNo(), payInfo.getBizPayNo(),order.getPayType());
|
|
|
- // 移除缓存
|
|
|
- this.removeCache(successOrderList);
|
|
|
- }else {
|
|
|
- orderList.add(order);
|
|
|
- }
|
|
|
- }
|
|
|
- return orderList;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 移除缓存
|
|
|
- */
|
|
|
- private void removeCache(List<Order> orders){
|
|
|
- for (Order order : orders) {
|
|
|
- List<OrderItem> orderItems = order.getOrderItems();
|
|
|
- for (OrderItem orderItem : orderItems) {
|
|
|
- productService.removeProductCacheByProdId(orderItem.getProdId());
|
|
|
- skuService.removeSkuCacheBySkuId(orderItem.getSkuId(), orderItem.getProdId());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 创建牵牛花订单
|
|
|
- * @param order
|
|
|
- * @return
|
|
|
- */
|
|
|
- public boolean createQNHOrder(Order order) {
|
|
|
- SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
- // 待添加创建牵牛花订单
|
|
|
- OrderDto orderDto = new OrderDto();
|
|
|
- orderDto.setChannelSheetno(order.getOrderNumber());
|
|
|
- orderDto.setChannelKeyword("YYG");
|
|
|
- orderDto.setPayOver(true);
|
|
|
- orderDto.setBilltype(1+"");
|
|
|
- orderDto.setTotalSaleValue(BigDecimal.valueOf(order.getTotal()));
|
|
|
- orderDto.setTotalDiscValue(BigDecimal.ZERO);
|
|
|
- orderDto.setTotalSjDisc(BigDecimal.ZERO);
|
|
|
- orderDto.setTotalSaleValue(BigDecimal.ZERO);
|
|
|
- orderDto.setTotalPtDp(BigDecimal.ZERO);
|
|
|
- orderDto.setTotalSjDp(BigDecimal.ZERO);
|
|
|
- orderDto.setTotalPtDisc(BigDecimal.ZERO);
|
|
|
- orderDto.setCommissionValue(BigDecimal.ZERO);
|
|
|
- orderDto.setPayableValue(BigDecimal.valueOf(order.getTotal()));
|
|
|
- orderDto.setTotalItemValue(BigDecimal.valueOf(order.getTotal()));
|
|
|
- orderDto.setLogisticsModeKeyword(order.getFreightAmount().toString());
|
|
|
-
|
|
|
-
|
|
|
- ShopDetail shopDetailByShopId = shopDetailService.getById(order.getShopId());
|
|
|
-// orderDto.setOrgName(shopDetailByShopId.getShopName());
|
|
|
- orderDto.setOrgCode(shopDetailByShopId.getThirdPartyCode());
|
|
|
- orderDto.setOrgName(shopDetailByShopId.getShopName());
|
|
|
- orderDto.setPreOrder(false);
|
|
|
- orderDto.setOfflineOrder(false);
|
|
|
- orderDto.setOrderTime(formatter.format(order.getCreateTime()));
|
|
|
- orderDto.setGroupId(0);
|
|
|
- orderDto.setGoodsReturn("true");
|
|
|
- UserAddrOrder addrOrder = userAddrOrderService.getById(order.getAddrOrderId());
|
|
|
- User user = userService.getUserByUserId(order.getUserId());
|
|
|
-
|
|
|
- //填充收件人信息
|
|
|
- orderDto.setReceiver(new OrderDto.Receiver());
|
|
|
- orderDto.getReceiver().setAddress(addrOrder.getAddress());
|
|
|
- orderDto.getReceiver().setMobile(user.getUserMobile());
|
|
|
- orderDto.getReceiver().setName(user.getNickName());
|
|
|
- orderDto.getReceiver().setType("0");
|
|
|
- orderDto.getReceiver().setLatitude(String.valueOf(addrOrder.getLatitude()));
|
|
|
- orderDto.getReceiver().setLongitude(String.valueOf(addrOrder.getLongitude()));
|
|
|
- orderDto.setPayableLogisticsValue(BigDecimal.valueOf(order.getPlatformAmount()));
|
|
|
- orderDto.setLogisticsModeKeyword("0");
|
|
|
-
|
|
|
- //填充买家信息
|
|
|
- orderDto.setBuyer(new OrderDto.Buyer());
|
|
|
- orderDto.getBuyer().setAddress(addrOrder.getAddress());
|
|
|
- orderDto.getBuyer().setNick(user.getNickName());
|
|
|
- orderDto.getBuyer().setEmail(user.getUserMail());
|
|
|
- orderDto.getBuyer().setNote(order.getRemarks());
|
|
|
- orderDto.getBuyer().setTel(user.getUserMobile());
|
|
|
-
|
|
|
- //填充支付信息
|
|
|
- orderDto.setOrderPayments(new OrderDto.OrderPayments());
|
|
|
- orderDto.getOrderPayments().setPayment(BigDecimal.valueOf(order.getTotal()));
|
|
|
- orderDto.getOrderPayments().setKeyword("10002");
|
|
|
- orderDto.getOrderPayments().setName("商城系统支付");
|
|
|
- ArrayList<OrderDto.OrderDetails> orderDetails = new ArrayList<>();
|
|
|
- int weight = 0;
|
|
|
- List<OrderItem> orderItems1 = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
|
|
|
- for (OrderItem orderItem:orderItems1){
|
|
|
- OrderDto.OrderDetails orderDetails1 = new OrderDto.OrderDetails();
|
|
|
- Sku sku = skuService.getById(orderItem.getSkuId());
|
|
|
- orderDetails1.setSkuId(sku.getPartyCode());
|
|
|
- orderDetails1.setItemCode("");
|
|
|
- orderDetails1.setBarcode("");
|
|
|
- orderDetails1.setOrderItemId(orderItem.getOrderItemId().toString());
|
|
|
- orderDetails1.setName(orderItem.getProdName());
|
|
|
- orderDetails1.setOriginalPrice(BigDecimal.valueOf(sku.getOriPrice()));
|
|
|
- orderDetails1.setWeight((int)Math.round(sku.getWeight()));
|
|
|
- weight+=orderDetails1.getWeight();
|
|
|
- orderDetails1.setSalePrice(BigDecimal.valueOf(sku.getPrice()));
|
|
|
- orderDetails1.setQty(orderItem.getProdCount());
|
|
|
- orderDetails1.setMoney(orderDetails1.getSalePrice().multiply(BigDecimal.valueOf(orderDetails1.getQty())));
|
|
|
- orderDetails.add(orderDetails1);
|
|
|
- }
|
|
|
- orderDto.setOrderDetails(orderDetails);
|
|
|
- orderDto.setWeight(weight);
|
|
|
- String s = qnhService.addOrder(orderDto);
|
|
|
-// ResponseEntity responseEntity = qnhService.addOrder(orderDto);
|
|
|
- if(!StringUtils.isBlank(s)){
|
|
|
- order.setQnhOrderId(s);
|
|
|
- order.setQnhOrderStatus("1");
|
|
|
- orderService.updateById(order);
|
|
|
- DeviceFey deviceFey = deviceFeyMapper.selectOne(Wrappers.<DeviceFey>lambdaQuery().eq(DeviceFey::getShopId, order.getShopId()).last("limit 1"));
|
|
|
- FeiEYunApi.print(deviceFey.getDeviceSn(),print(order.getOrderNumber()));
|
|
|
- return true;
|
|
|
- }
|
|
|
- return false;
|
|
|
- }
|
|
|
- private String print(String orderByOrderNumber){
|
|
|
- Order order = orderService.getOrderByOrderNumber(orderByOrderNumber);
|
|
|
- List<OrderItem> orderItemsByOrderNumber = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
|
|
|
- String lastFourDigits = order.getOrderNumber().length() >= 4
|
|
|
- ? order.getOrderNumber().substring(order.getOrderNumber().length() - 4)
|
|
|
- : order.getOrderNumber(); // 如果长度不足4位,直接返回原字符串
|
|
|
- UserAddrOrder userAddrOrder = userAddrOrderService.selectByAddrOrderId(order.getAddrOrderId());
|
|
|
- String userMobile = userAddrOrder.getMobile().length() >= 4
|
|
|
- ? userAddrOrder.getMobile().substring(userAddrOrder.getMobile().length() - 4)
|
|
|
- : userAddrOrder.getMobile(); // 如果长度不足4位,直接返回原字符串
|
|
|
- String receiverName = userAddrOrder.getReceiver();
|
|
|
- String maskedName = receiverName.length() > 1
|
|
|
- ? receiverName.substring(0, 1) + "*".repeat(receiverName.length() - 1)
|
|
|
- : receiverName;
|
|
|
- StringBuilder content = new StringBuilder();
|
|
|
- content.append("<BR>");
|
|
|
- content.append("<BR>");
|
|
|
- content.append("<CB>#").append(lastFourDigits).append(" 海马购外卖</CB><BR>");
|
|
|
- content.append("--------------------------------<BR>");
|
|
|
- content.append("<BR>");
|
|
|
- content.append("备注:").append(order.getRemarks()).append("<BR>");
|
|
|
- content.append("<BR>");
|
|
|
- content.append("--------------------------------<BR>");
|
|
|
- content.append("下单时间:").append(DateUtil.date(order.getCreateTime())).append("<BR>");
|
|
|
- content.append("<BR>");
|
|
|
- content.append("订单编号:").append(order.getOrderNumber()).append("<BR>");
|
|
|
- content.append("<BR>");
|
|
|
- content.append("名称 单价 数量 金额<BR>");
|
|
|
- content.append("----------商品信息----------<BR>");
|
|
|
- for (OrderItem orderItem:orderItemsByOrderNumber){
|
|
|
- content.append("<BR>");
|
|
|
- content.append(orderItem.getProdName()).append("<BR>").append(" ").append(orderItem.getPrice()).append(" ").append(orderItem.getProdCount()).append(" ").append(orderItem.getActualTotal()).append("<BR>");
|
|
|
- }
|
|
|
- content.append("<BR>");
|
|
|
- content.append("----------付款情况----------<BR>");
|
|
|
- content.append("<BR>");
|
|
|
- content.append("订单金额:").append(order.getTotal()).append("元<BR>");
|
|
|
- content.append("<BR>");
|
|
|
- content.append("实际支付:<B>").append(order.getActualTotal()).append("元</B><BR>");
|
|
|
- content.append("--------------------------------<BR>");
|
|
|
- content.append("<BR>");
|
|
|
- content.append(maskedName);
|
|
|
- content.append("<BR>");
|
|
|
- content.append("顾客号码:手机尾号").append(userMobile).append("<BR>");
|
|
|
- String add = userAddrOrder.getAddress() + userAddrOrder.getAddressName() + userAddrOrder.getAddrDetail();
|
|
|
- content.append("顾客地址:").append(add).append("<BR>");
|
|
|
- content.append("########海马购外卖#").append(lastFourDigits).append("########<BR>");
|
|
|
- content.append("<BR>");
|
|
|
- content.append("<BR>");
|
|
|
- return content.toString();
|
|
|
- }
|
|
|
-}
|
|
|
+/*
|
|
|
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
|
|
|
+ *
|
|
|
+ * https://www.gz-yami.com/
|
|
|
+ *
|
|
|
+ * 未经允许,不可做商业用途!
|
|
|
+ *
|
|
|
+ * 版权所有,侵权必究!
|
|
|
+ */
|
|
|
+
|
|
|
+package com.yami.shop.platform.task;
|
|
|
+
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.yami.shop.bean.bo.PayInfoBo;
|
|
|
+import com.yami.shop.bean.enums.DvyType;
|
|
|
+import com.yami.shop.bean.enums.OrderStatus;
|
|
|
+import com.yami.shop.bean.model.*;
|
|
|
+import com.yami.shop.bean.param.OrderDto;
|
|
|
+import com.yami.shop.common.enums.PayType;
|
|
|
+import com.yami.shop.common.exception.YamiShopBindException;
|
|
|
+import com.yami.shop.dao.DeviceFeyMapper;
|
|
|
+import com.yami.shop.delivery.comment.api.paotui.PaoTuiApi;
|
|
|
+import com.yami.shop.delivery.comment.param.DeliveryOrderItemParam;
|
|
|
+import com.yami.shop.delivery.comment.service.DeliveryOrderService;
|
|
|
+import com.yami.shop.service.*;
|
|
|
+import com.yami.shop.service.impl.FeiEYunApi;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.apache.logging.log4j.core.util.JsonUtils;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.http.ResponseEntity;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+
|
|
|
+@Component("orderTask")
|
|
|
+public class OrderTask {
|
|
|
+
|
|
|
+
|
|
|
+ private Logger logger = LoggerFactory.getLogger(getClass());
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private OrderService orderService;
|
|
|
+ @Autowired
|
|
|
+ private ProductService productService;
|
|
|
+ @Autowired
|
|
|
+ private SkuService skuService;
|
|
|
+ @Autowired
|
|
|
+ private PayService payService;
|
|
|
+ @Autowired
|
|
|
+ private OrderSettlementService orderSettlementService;
|
|
|
+ @Autowired
|
|
|
+ private PayManagerService payManagerService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private PaoTuiApi paoTuiApi;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private OrderRefundService orderRefundService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private OrderItemService orderItemService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private UserAddrOrderService userAddrOrderService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private DeliveryOrderService deliveryOrderService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IQnhService qnhService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private UserService userService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ShopDetailService shopDetailService;
|
|
|
+ @Autowired
|
|
|
+ private DeviceFeyMapper deviceFeyMapper;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ public void cancelOrder(){
|
|
|
+ Date now = new Date();
|
|
|
+ logger.info("取消超时未支付订单。。。");
|
|
|
+ // 获取30分钟之前未支付的订单
|
|
|
+ List<Order> orders = orderService.listUnRefundOrderAndOrderItems(OrderStatus.UNPAY.value(),DateUtil.offsetMinute(now, -30));
|
|
|
+ if (CollectionUtil.isEmpty(orders)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<Order> cancelOrderList = this.chackOrders(orders);
|
|
|
+ orderService.cancelOrders(cancelOrderList);
|
|
|
+ // 移除缓存
|
|
|
+ this.removeCache(cancelOrderList);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 确认收货
|
|
|
+ */
|
|
|
+ public void confirmOrder(){
|
|
|
+ Date now = new Date();
|
|
|
+ logger.info("系统自动确认收货订单。。。");
|
|
|
+ // 获取15天之前等待确认收货的订单
|
|
|
+ List<Order> orders = orderService.listUnRefundOrderAndOrderItems(OrderStatus.CONSIGNMENT.value(),DateUtil.offsetDay(now, -15));
|
|
|
+ if (CollectionUtil.isEmpty(orders)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ orderService.receiptOrder(orders);
|
|
|
+ // 移除缓存
|
|
|
+ this.removeCache(orders);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void createDistributionOrder(){
|
|
|
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ Date now = new Date();
|
|
|
+ logger.info("用户订单五分钟后未取消则创建物流订单。。。");
|
|
|
+ List<Order> orders = orderService.listUnRefundOrderAndOrderItems(OrderStatus.PADYED.value(),DateUtil.offsetMinute(now, -5));
|
|
|
+ if(CollectionUtil.isEmpty(orders)){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+// List<Order> orders =orderService.list(new QueryWrapper<Order>().lambda().like(Order::getOrderNumber,"1879830276981526528"));
|
|
|
+ for (Order order:orders){
|
|
|
+ //创建物流订单
|
|
|
+ if (!Objects.equals(order.getStatus(), OrderStatus.PADYED.value()) && Objects.equals(order.getDvyType(), DvyType.FETCH.value())){
|
|
|
+ System.out.println("订单不处于已付款状态,无法进行发货");
|
|
|
+ continue;
|
|
|
+ }else if (!Objects.equals(order.getStatus(), OrderStatus.PADYED.value())){
|
|
|
+ System.out.println("订单不处于待发货状态,无法进行发货");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ UserAddrOrder userAddrOrder = userAddrOrderService.getById(order.getAddrOrderId());
|
|
|
+ if(ObjectUtil.isEmpty(userAddrOrder)){
|
|
|
+ System.out.println("该订单地址存在问题,请检查");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ int count = orderRefundService.count(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getOrderId, order.getOrderId()));
|
|
|
+ if(count>0){
|
|
|
+ LambdaQueryWrapper<OrderRefund> orderRefundLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ orderRefundLambdaQueryWrapper.eq(OrderRefund::getOrderId,order.getOrderId());
|
|
|
+ //发货时只有订单不存在退款或退款被拒绝才会创建仓储与物流订单
|
|
|
+ orderRefundLambdaQueryWrapper.and(wrapper->wrapper.eq(OrderRefund::getReturnMoneySts,-1).or().eq(OrderRefund::getReturnMoneySts,7).or().eq(OrderRefund::getReturnMoneySts,6));
|
|
|
+ List<OrderRefund> orderRefunds = orderRefundService.list(orderRefundLambdaQueryWrapper);
|
|
|
+ if (CollectionUtil.isEmpty(orderRefunds)) {
|
|
|
+ System.out.println("该订单有退款信息正在处理或已退款中,无法进行发货操作");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ boolean success = createQNHOrder(order);
|
|
|
+ if(!success){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }catch (Exception e){
|
|
|
+ System.out.println(e.getMessage());
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ List<OrderItem> orderItems = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
|
|
|
+
|
|
|
+ //先创建物流订单
|
|
|
+ DeliveryOrderItemParam deliveryOrderItemParam = new DeliveryOrderItemParam();
|
|
|
+ deliveryOrderItemParam.setOrderNumber(order.getOrderNumber());
|
|
|
+ deliveryOrderItemParam.setDvyId(16l);
|
|
|
+ deliveryOrderItemParam.setDeliveryType(1);
|
|
|
+ deliveryOrderItemParam.setDvyFlowId("sdfsf");
|
|
|
+ deliveryOrderItemParam.setSelectOrderItems(orderItems);
|
|
|
+ for (OrderItem orderItem:deliveryOrderItemParam.getSelectOrderItems()){
|
|
|
+ orderItem.setChangeNum(orderItem.getProdCount());
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ deliveryOrderService.saveDeliveriesInfo(deliveryOrderItemParam);
|
|
|
+ order=orderService.getById(order.getOrderId());
|
|
|
+ order.setDvyStatus(1);
|
|
|
+ }catch (Exception e){
|
|
|
+ System.out.println(e.getMessage());
|
|
|
+ order.setDvyStatus(0);
|
|
|
+ }
|
|
|
+ orderService.updateById(order);
|
|
|
+ }
|
|
|
+// this.removeCache(orders);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询订单,去除已支付的订单
|
|
|
+ * @param orders
|
|
|
+ */
|
|
|
+ private List<Order> chackOrders(List<Order> orders){
|
|
|
+ List<String> orderNumbers=orders.stream().map(Order::getOrderNumber).collect(Collectors.toList());
|
|
|
+ // 收集未支付的订单
|
|
|
+ List<Order> orderList = new ArrayList<>();
|
|
|
+ //获取订单对应的订单结算数据
|
|
|
+ List<OrderSettlement> orderSettlementList = orderSettlementService.list(new LambdaQueryWrapper<OrderSettlement>()
|
|
|
+ .in(OrderSettlement::getOrderNumber, orderNumbers));
|
|
|
+ Map<String, OrderSettlement> orderSettlementMap = orderSettlementList.stream()
|
|
|
+ .collect(Collectors.toMap(OrderSettlement::getOrderNumber, orderSettlement -> orderSettlement));
|
|
|
+ for (Order order : orders) {
|
|
|
+ OrderSettlement orderSettlement = orderSettlementMap.get(order.getOrderNumber());
|
|
|
+ if (Objects.isNull(orderSettlement) || Objects.isNull(orderSettlement.getPayType()) || Objects.isNull(orderSettlement.getPayNo())){
|
|
|
+ orderList.add(order);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ PayInfoBo payInfo = payManagerService.getPayInfo(PayType.instance(orderSettlement.getPayType()), orderSettlement.getPayNo());
|
|
|
+ if(payInfo.getIsPaySuccess()){
|
|
|
+ // 根据内部订单号更新order settlement
|
|
|
+ List<Order> successOrderList = payService.paySuccess(payInfo.getPayNo(), payInfo.getBizPayNo(),order.getPayType());
|
|
|
+ // 移除缓存
|
|
|
+ this.removeCache(successOrderList);
|
|
|
+ }else {
|
|
|
+ orderList.add(order);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return orderList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 移除缓存
|
|
|
+ */
|
|
|
+ private void removeCache(List<Order> orders){
|
|
|
+ for (Order order : orders) {
|
|
|
+ List<OrderItem> orderItems = order.getOrderItems();
|
|
|
+ for (OrderItem orderItem : orderItems) {
|
|
|
+ productService.removeProductCacheByProdId(orderItem.getProdId());
|
|
|
+ skuService.removeSkuCacheBySkuId(orderItem.getSkuId(), orderItem.getProdId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 创建牵牛花订单
|
|
|
+ * @param order
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public boolean createQNHOrder(Order order) {
|
|
|
+ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
+ // 待添加创建牵牛花订单
|
|
|
+ OrderDto orderDto = new OrderDto();
|
|
|
+ orderDto.setChannelSheetno(order.getOrderNumber());
|
|
|
+ orderDto.setChannelKeyword("YYG");
|
|
|
+ orderDto.setPayOver(true);
|
|
|
+ orderDto.setBilltype(1+"");
|
|
|
+ orderDto.setTotalSaleValue(BigDecimal.valueOf(order.getTotal()));
|
|
|
+ orderDto.setTotalDiscValue(BigDecimal.ZERO);
|
|
|
+ orderDto.setTotalSjDisc(BigDecimal.ZERO);
|
|
|
+ orderDto.setTotalSaleValue(BigDecimal.ZERO);
|
|
|
+ orderDto.setTotalPtDp(BigDecimal.ZERO);
|
|
|
+ orderDto.setTotalSjDp(BigDecimal.ZERO);
|
|
|
+ orderDto.setTotalPtDisc(BigDecimal.ZERO);
|
|
|
+ orderDto.setCommissionValue(BigDecimal.ZERO);
|
|
|
+ orderDto.setPayableValue(BigDecimal.valueOf(order.getTotal()));
|
|
|
+ orderDto.setTotalItemValue(BigDecimal.valueOf(order.getTotal()));
|
|
|
+ orderDto.setLogisticsModeKeyword(order.getFreightAmount().toString());
|
|
|
+
|
|
|
+
|
|
|
+ ShopDetail shopDetailByShopId = shopDetailService.getById(order.getShopId());
|
|
|
+// orderDto.setOrgName(shopDetailByShopId.getShopName());
|
|
|
+ orderDto.setOrgCode(shopDetailByShopId.getThirdPartyCode());
|
|
|
+ orderDto.setOrgName(shopDetailByShopId.getShopName());
|
|
|
+ orderDto.setPreOrder(false);
|
|
|
+ orderDto.setOfflineOrder(false);
|
|
|
+ orderDto.setOrderTime(formatter.format(order.getCreateTime()));
|
|
|
+ orderDto.setGroupId(0);
|
|
|
+ orderDto.setGoodsReturn("true");
|
|
|
+ UserAddrOrder addrOrder = userAddrOrderService.getById(order.getAddrOrderId());
|
|
|
+ User user = userService.getUserByUserId(order.getUserId());
|
|
|
+
|
|
|
+ //填充收件人信息
|
|
|
+ orderDto.setReceiver(new OrderDto.Receiver());
|
|
|
+ orderDto.getReceiver().setAddress(addrOrder.getAddress());
|
|
|
+ orderDto.getReceiver().setMobile(user.getUserMobile());
|
|
|
+ orderDto.getReceiver().setName(user.getNickName());
|
|
|
+ orderDto.getReceiver().setType("0");
|
|
|
+ orderDto.getReceiver().setLatitude(String.valueOf(addrOrder.getLatitude()));
|
|
|
+ orderDto.getReceiver().setLongitude(String.valueOf(addrOrder.getLongitude()));
|
|
|
+ orderDto.setPayableLogisticsValue(BigDecimal.valueOf(order.getPlatformAmount()));
|
|
|
+ orderDto.setLogisticsModeKeyword("0");
|
|
|
+
|
|
|
+ //填充买家信息
|
|
|
+ orderDto.setBuyer(new OrderDto.Buyer());
|
|
|
+ orderDto.getBuyer().setAddress(addrOrder.getAddress());
|
|
|
+ orderDto.getBuyer().setNick(user.getNickName());
|
|
|
+ orderDto.getBuyer().setEmail(user.getUserMail());
|
|
|
+ orderDto.getBuyer().setNote(order.getRemarks());
|
|
|
+ orderDto.getBuyer().setTel(user.getUserMobile());
|
|
|
+
|
|
|
+ //填充支付信息
|
|
|
+ orderDto.setOrderPayments(new OrderDto.OrderPayments());
|
|
|
+ orderDto.getOrderPayments().setPayment(BigDecimal.valueOf(order.getTotal()));
|
|
|
+ orderDto.getOrderPayments().setKeyword("10002");
|
|
|
+ orderDto.getOrderPayments().setName("商城系统支付");
|
|
|
+ ArrayList<OrderDto.OrderDetails> orderDetails = new ArrayList<>();
|
|
|
+ int weight = 0;
|
|
|
+ List<OrderItem> orderItems1 = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
|
|
|
+ for (OrderItem orderItem:orderItems1){
|
|
|
+ OrderDto.OrderDetails orderDetails1 = new OrderDto.OrderDetails();
|
|
|
+ Sku sku = skuService.getById(orderItem.getSkuId());
|
|
|
+ orderDetails1.setSkuId(sku.getPartyCode());
|
|
|
+ orderDetails1.setItemCode("");
|
|
|
+ orderDetails1.setBarcode("");
|
|
|
+ orderDetails1.setOrderItemId(orderItem.getOrderItemId().toString());
|
|
|
+ orderDetails1.setName(orderItem.getProdName());
|
|
|
+ orderDetails1.setOriginalPrice(BigDecimal.valueOf(sku.getOriPrice()));
|
|
|
+ orderDetails1.setWeight((int)Math.round(sku.getWeight()));
|
|
|
+ weight+=orderDetails1.getWeight();
|
|
|
+ orderDetails1.setSalePrice(BigDecimal.valueOf(sku.getPrice()));
|
|
|
+ orderDetails1.setQty(orderItem.getProdCount());
|
|
|
+ orderDetails1.setMoney(orderDetails1.getSalePrice().multiply(BigDecimal.valueOf(orderDetails1.getQty())));
|
|
|
+ orderDetails.add(orderDetails1);
|
|
|
+ }
|
|
|
+ orderDto.setOrderDetails(orderDetails);
|
|
|
+ orderDto.setWeight(weight);
|
|
|
+ String s = qnhService.addOrder(orderDto);
|
|
|
+// ResponseEntity responseEntity = qnhService.addOrder(orderDto);
|
|
|
+ if(!StringUtils.isBlank(s)){
|
|
|
+ order.setQnhOrderId(s);
|
|
|
+ order.setQnhOrderStatus("1");
|
|
|
+ orderService.updateById(order);
|
|
|
+ DeviceFey deviceFey = deviceFeyMapper.selectOne(Wrappers.<DeviceFey>lambdaQuery().eq(DeviceFey::getShopId, order.getShopId()).last("limit 1"));
|
|
|
+ FeiEYunApi.print(deviceFey.getDeviceSn(),print(order.getOrderNumber()));
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ private String print(String orderByOrderNumber){
|
|
|
+ Order order = orderService.getOrderByOrderNumber(orderByOrderNumber);
|
|
|
+ List<OrderItem> orderItemsByOrderNumber = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
|
|
|
+ String lastFourDigits = order.getOrderNumber().length() >= 4
|
|
|
+ ? order.getOrderNumber().substring(order.getOrderNumber().length() - 4)
|
|
|
+ : order.getOrderNumber(); // 如果长度不足4位,直接返回原字符串
|
|
|
+ UserAddrOrder userAddrOrder = userAddrOrderService.selectByAddrOrderId(order.getAddrOrderId());
|
|
|
+ String userMobile = userAddrOrder.getMobile().length() >= 4
|
|
|
+ ? userAddrOrder.getMobile().substring(userAddrOrder.getMobile().length() - 4)
|
|
|
+ : userAddrOrder.getMobile(); // 如果长度不足4位,直接返回原字符串
|
|
|
+ String receiverName = userAddrOrder.getReceiver();
|
|
|
+ String maskedName = receiverName.length() > 1
|
|
|
+ ? receiverName.substring(0, 1) + "*".repeat(receiverName.length() - 1)
|
|
|
+ : receiverName;
|
|
|
+ StringBuilder content = new StringBuilder();
|
|
|
+ content.append("<BR>");
|
|
|
+ content.append("<BR>");
|
|
|
+ content.append("<CB>#").append(lastFourDigits).append(" 海马购外卖</CB><BR>");
|
|
|
+ content.append("--------------------------------<BR>");
|
|
|
+ content.append("<BR>");
|
|
|
+ content.append("备注:").append(order.getRemarks()).append("<BR>");
|
|
|
+ content.append("<BR>");
|
|
|
+ content.append("--------------------------------<BR>");
|
|
|
+ content.append("下单时间:").append(DateUtil.date(order.getCreateTime())).append("<BR>");
|
|
|
+ content.append("<BR>");
|
|
|
+ content.append("订单编号:").append(order.getOrderNumber()).append("<BR>");
|
|
|
+ content.append("<BR>");
|
|
|
+ content.append("名称 单价 数量 金额<BR>");
|
|
|
+ content.append("----------商品信息----------<BR>");
|
|
|
+ for (OrderItem orderItem:orderItemsByOrderNumber){
|
|
|
+ content.append("<BR>");
|
|
|
+ content.append(orderItem.getProdName()).append("<BR>").append(" ").append(orderItem.getPrice()).append(" ").append(orderItem.getProdCount()).append(" ").append(orderItem.getActualTotal()).append("<BR>");
|
|
|
+ }
|
|
|
+ content.append("<BR>");
|
|
|
+ content.append("----------付款情况----------<BR>");
|
|
|
+ content.append("<BR>");
|
|
|
+ content.append("订单金额:").append(order.getTotal()).append("元<BR>");
|
|
|
+ content.append("<BR>");
|
|
|
+ content.append("实际支付:<B>").append(order.getActualTotal()).append("元</B><BR>");
|
|
|
+ content.append("--------------------------------<BR>");
|
|
|
+ content.append("<BR>");
|
|
|
+ content.append(maskedName);
|
|
|
+ content.append("<BR>");
|
|
|
+ content.append("顾客号码:手机尾号").append(userMobile).append("<BR>");
|
|
|
+ String add = userAddrOrder.getAddress() + userAddrOrder.getAddressName() + userAddrOrder.getAddrDetail();
|
|
|
+ content.append("顾客地址:").append(add).append("<BR>");
|
|
|
+ content.append("########海马购外卖#").append(lastFourDigits).append("########<BR>");
|
|
|
+ content.append("<BR>");
|
|
|
+ content.append("<BR>");
|
|
|
+ return content.toString();
|
|
|
+ }
|
|
|
+}
|