Просмотр исходного кода

上午9点,下午4点发送物流信息

yh 3 дней назад
Родитель
Сommit
7b7935a9eb

+ 45 - 0
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -1820,4 +1820,49 @@ public class Task {
     }
 
 
+    /**
+     * 金牛:上午9点,下午4点发送物流信息
+     */
+    public void sendExpressInfoAt9And16() {
+        // 查询待收货订单
+        List<FsIntegralOrder> integralOrders = fsIntegralOrderMapper.selectList(Wrappers.<FsIntegralOrder>lambdaQuery().eq(FsIntegralOrder::getStatus, 2).isNotNull(FsIntegralOrder::getDeliverySn));
+        List<FsStoreOrder> fsStoreOrders = fsStoreOrderMapper.selectShippedOrder();
+        IErpOrderService erpOrderService = getErpService();
+
+        // 合并异步执行逻辑
+        List<CompletableFuture<Void>> futures = new ArrayList<>();
+
+        // 处理待收货订单
+        if (integralOrders != null && !integralOrders.isEmpty()) {
+            for (FsIntegralOrder order : integralOrders) {
+                CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
+                    // 使用 OrderContextHolder 和局部副本
+                    OrderContextHolder.setIntegralOrder(order);
+                    try {
+                        // 直接创建 FsStoreOrder 并调用 ERP 服务
+                        FsStoreOrder storeOrder = new FsStoreOrder();
+                        storeOrder.setDeliverySn(order.getDeliverySn());
+                        storeOrder.setOrderCode(order.getOrderCode());
+                        storeOrder.setOrderId(order.getOrderId());
+                        erpOrderService.sendExpressInfoAt9And16(storeOrder);
+                    } finally {
+                        OrderContextHolder.clear();
+                    }
+                });
+                futures.add(future);
+            }
+        }
+
+        if (fsStoreOrders != null && !fsStoreOrders.isEmpty()) {
+            for (FsStoreOrder order : fsStoreOrders) {
+                CompletableFuture<Void> future = CompletableFuture.runAsync(() ->
+                        erpOrderService.sendExpressInfoAt9And16(order)
+                );
+                futures.add(future);
+            }
+        }
+
+        // 等待所有异步任务完成
+        CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
+    }
 }

+ 2 - 0
fs-service/src/main/java/com/fs/erp/service/IErpOrderService.java

@@ -34,5 +34,7 @@ public interface IErpOrderService
 
     void getOrderScrmDeliveryStatus(FsStoreOrderScrm order);
     void getOrderLiveDeliveryStatus(LiveOrder order);
+
+    void sendExpressInfoAt9And16(FsStoreOrder order);
 }
 

+ 261 - 0
fs-service/src/main/java/com/fs/erp/service/impl/DfOrderServiceImpl.java

@@ -1146,6 +1146,267 @@ public class DfOrderServiceImpl implements IErpOrderService {
         }
     }
 
+    @Override
+    public void sendExpressInfoAt9And16(FsStoreOrder order) {
+        Map<String, Object> map = new HashMap<>();
+        Long orderId = order.getOrderId();
+        Long dfAccountId = getSFAccountIndex(orderId);
+        if (OrderContextHolder.hasIntegralOrder())
+            dfAccountId = getSFAccountIndexIntegral(orderId);
+        if (dfAccountId == null){
+            log.info("代服管家 getOrderDeliveryStatus-订单id: {}", orderId);
+        }
+        map.put("orderNumber", order.getOrderCode());
+        map.put("mailNumber", order.getDeliverySn());
+        try {
+            String response = client.execute(RequestUrlEnum.ORDER_DELIVERY_STATUS, map, dfAccountId);
+            if (StringUtils.isBlank(response)) {
+                return;
+            }
+            DFApiResponse dfApiResponse = JSON.parseObject(response, DFApiResponse.class);
+            log.info("顺丰返回数据{}",dfApiResponse);
+            if ("运单不存在".equals(dfApiResponse.getMsg())) {
+
+                //查看原来物流状态
+                if (OrderContextHolder.hasIntegralOrder()) {
+                    cancelOrder(OrderContextHolder.getIntegralOrder());
+                }else {
+                    cancelOrder(order);
+                }
+                log.info("代服管家 getOrderDeliveryStatus: {}", response);
+                return;
+            }
+            //3.处理请求结果
+            if (dfApiResponse != null && "ok".equals(dfApiResponse.getCode())) {
+                String jsonString = JSON.toJSONString(dfApiResponse.getResult());
+//                List<DFOrderStatusResultRequest> requestList = JSON.parseArray(jsonString, DFOrderStatusResultRequest.class);
+                DFOrderStatusResultRequest temp = JSON.parseObject(jsonString, DFOrderStatusResultRequest.class);
+                //0待揽收 1已揽收 2运输中 3派送中 4异常件 5退回件 6退回签收 7转寄件 8作废件 9已签收 10 已取消
+                Integer deliveryStatus = 0;
+                String stateEx = "0";
+                FsStoreOrder fsStoreOrderMap = new FsStoreOrder();
+                fsStoreOrderMap.setOrderId(orderId);
+                Integer status = temp.getStatus();
+                switch (status) {
+                    case 0:
+                        //0待揽收 1已揽收 2运输中
+                        deliveryStatus = status;
+                        stateEx = status.toString();
+                        break;
+                    case 1:
+                        //0待揽收 1已揽收 2运输中
+                        deliveryStatus = status;
+                        stateEx = status.toString();
+                        break;
+                    case 2:
+                        //0待揽收 1已揽收 2运输中
+                        deliveryStatus = status;
+                        stateEx = status.toString();
+                        break;
+                    case 3:
+                        //3派送中
+                        deliveryStatus = 2;
+                        stateEx = "202";
+                        break;
+                    case 4:
+                        // 4异常件
+                        deliveryStatus = status;
+                        stateEx = status.toString();
+                        break;
+                    case 5:
+                        //5退回件
+                        deliveryStatus = 4;
+                        stateEx = "407"; //退货未签收
+                        break;
+                    case 6:
+                        // 6退回签收 7转寄件 8作废件 9已签收 10 已取消
+                        deliveryStatus = status;
+                        stateEx = "406"; //退货签收
+                        break;
+                    case 9:
+                        //已签收
+                        deliveryStatus = 3;
+                        stateEx = "301";
+                        break;
+                    case 10:
+                }
+
+                //判断物流状态是否更新 更新ai发送物流给客户
+                try {
+                    aiSendExpressAt9And16(order, stateEx);
+                } catch (Exception e) {
+                    log.error("ai发送物流信息错误:{}", e.getMessage());
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    private void aiSendExpressAt9And16(FsStoreOrder order, String stateEx) {
+        Long orderId = order.getOrderId();
+
+        // 检查是否已签收
+        boolean signed = redisCache.sIsMember(signedKey, orderId.toString());
+        if ("301".equals(stateEx) && signed){
+            log.info("每日上午9点和下午4点发送物流消息:签收消息已发送过,跳过 - orderId: {}", orderId);
+            return;
+        }
+
+        //判断是否添加相关企微员工
+        if(order.getUserId() != null){
+            log.info("检查企微联系人 - orderId: {}, userId: {}, companyUserId: {}",
+                    orderId, order.getUserId(), order.getCompanyUserId());
+
+            List<QwExternalContact> qwExternalContact = externalContactService.selectQwExternalContactByFsUserIdAndCompany(order.getUserId(), order.getCompanyUserId());
+
+            log.info("企微联系人查询结果 - orderId: {}, 联系人数量: {}",
+                    orderId, qwExternalContact != null ? qwExternalContact.size() : 0);
+
+            if(qwExternalContact != null && !qwExternalContact.isEmpty()) {
+                for (QwExternalContact externalContact : qwExternalContact) {
+                    Long qwUserId = externalContact.getQwUserId();
+
+                    log.info("处理企微联系人 - orderId: {}, externalUserId: {}, qwUserId: {}",
+                            orderId, externalContact.getExternalUserId(), qwUserId);
+
+                    if (qwUserId != null) {
+                        QwUser qwUser = qwUserMapper.selectQwUserById(qwUserId);
+
+                        log.info("企微用户信息 - orderId: {}, qwUserId: {}, uid: {}, fastGptRoleId: {}, serverId: {}, serverStatus: {}, ipadStatus: {}",
+                                orderId, qwUserId,
+                                qwUser != null ? qwUser.getUid() : null,
+                                qwUser != null ? qwUser.getFastGptRoleId() : null,
+                                qwUser != null ? qwUser.getServerId() : null,
+                                qwUser != null ? qwUser.getServerStatus() : null,
+                                qwUser != null ? qwUser.getIpadStatus() : null);
+
+                        if (qwUser != null && qwUser.getUid() != null && qwUser.getFastGptRoleId() != null && qwUser.getServerId() != null && qwUser.getServerStatus() == 1 && qwUser.getIpadStatus() == 1) {
+                            FastGptRole fastGptRole = fastGptRoleService.selectFastGptRoleByRoleId(qwUser.getFastGptRoleId());
+
+                            log.info("AI角色信息 - orderId: {}, roleId: {}, 物流功能状态: {}",
+                                    orderId, qwUser.getFastGptRoleId(),
+                                    fastGptRole != null ? fastGptRole.getLogistics() : "角色不存在");
+
+                            if (fastGptRole.getLogistics() == 0) {
+                                log.error("物流功能未开启,roleId:" + qwUser.getFastGptRoleId() + "订单号:" + orderId);
+                                continue; // 跳过这个联系人,继续处理下一个
+                            }
+                            WxWorkUserId2VidDTO wxWorkUserId2VidDTO = new WxWorkUserId2VidDTO();
+                            wxWorkUserId2VidDTO.setOpenid(Collections.singletonList(externalContact.getExternalUserId()));
+                            wxWorkUserId2VidDTO.setUuid(qwUser.getUid());
+
+                            log.info("调用企微接口获取用户ID - orderId: {}, externalUserId: {}, uid: {}, serverId: {}",
+                                    orderId, externalContact.getExternalUserId(), qwUser.getUid(), qwUser.getServerId());
+
+                            WxWorkResponseDTO<List<WxWorkVid2UserIdRespDTO>> WxWorkVid2UserIdRespDTO = wxWorkService.UserId2Vid(wxWorkUserId2VidDTO, qwUser.getServerId());
+                            List<WxWorkVid2UserIdRespDTO> data = WxWorkVid2UserIdRespDTO.getData();
+
+                            log.info("企微接口返回结果 - orderId: {}, 返回数据数量: {}, 返回数据: {}",
+                                    orderId, data != null ? data.size() : 0, data);
+
+                            StringBuilder sBuilder = new StringBuilder();
+                            if (data != null && !data.isEmpty()) {
+                                Long sendId = data.get(0).getUser_id();
+                                switch (order.getStatus()) {
+                                    case -1:
+                                        break;
+                                    case -2:
+                                        break;
+                                    case 1:
+                                        break;
+                                    case 2:
+                                        break;
+                                    case 3:
+                                        //你好,这边查询到您购买的XXX(购买套餐)在XXX(时间)已经送到了,送货员电话为XXX(送货员信息)
+                                        ErpDeliverysRequest erpDeliverysRequest = new ErpDeliverysRequest();
+                                        erpDeliverysRequest.setCode(order.getOrderCode());
+                                        ErpDeliverysResponse express = null;
+                                        express = getDeliver(erpDeliverysRequest);
+                                        if (express != null && express.getDeliverys() != null && !express.getDeliverys().isEmpty()) {
+                                            List<ErpDeliverys> deliverys = express.getDeliverys();
+                                            ErpDeliverys tracesDTO = deliverys.get(deliverys.size() - 1);
+                                            String remark = tracesDTO.getRemark();
+
+                                            if ("0".equals(stateEx) || "1".equals(stateEx) || "2".equals(stateEx)) {
+                                                if (remark.contains("已收取快件")){
+                                                    sBuilder.append("您好,您有一个包裹正在准备发货,请耐心等待;\n");
+                                                    if (order.getDeliverySn() != null && !order.getDeliverySn().isEmpty()) {
+                                                        sBuilder.append(" 物流单号为:").append(order.getDeliverySn()).append("\n");
+                                                    }
+                                                    sBuilder.append("\uD83C\uDF39\uD83C\uDF39\uD83C\uDF39");
+                                                }
+                                            } else if ("202".equals(stateEx)) {
+                                                if (remark.contains("正在派送")) {
+                                                    sBuilder.append("这边查询到您有一个包裹 ");
+                                                    sBuilder.append("正在派送中\n");
+                                                    sBuilder.append(" 物流单号为:").append(order.getDeliverySn()).append("\n");
+                                                    sBuilder.append("物流信息:").append(remark).append("\n");
+                                                    sBuilder.append("\uD83C\uDF39\uD83C\uDF39\uD83C\uDF39");
+                                                }
+
+                                            } else if ("301".equals(stateEx)){
+                                                if (remark.contains("派送至本人") || remark.contains("签收")) {
+                                                    sBuilder.append("这边查询到您有一个包裹 ");
+                                                    sBuilder.append(" 在").append(tracesDTO.getAcceptTime()).append("已经签收了\n");
+                                                    sBuilder.append(" 物流单号为:").append(order.getDeliverySn()).append("\n");
+                                                    sBuilder.append("物流信息:").append(remark).append("\n");
+                                                }
+                                            }
+                                        }
+                                        break;
+                                    case 4:
+                                    case 5:
+                                }
+
+                                if (!"".contentEquals(sBuilder)) {
+                                    //2.发送模板中的文字内容
+                                    String content = sBuilder.toString();
+                                    content = content.replace("(有事呼叫我,勿找平台,少一次投诉,多一份感恩)", "");
+
+                                    log.info("准备发送AI物流消息 - orderId: {}, sendId: {}, 消息内容: {}",
+                                            orderId, sendId, content);
+
+                                    WxWorkSendTextMsgDTO wxWorkSendTextMsgDTO = new WxWorkSendTextMsgDTO();
+                                    wxWorkSendTextMsgDTO.setSend_userid(sendId);
+                                    wxWorkSendTextMsgDTO.setUuid(qwUser.getUid());
+                                    wxWorkSendTextMsgDTO.setContent(content);
+                                    wxWorkSendTextMsgDTO.setIsRoom(false);
+
+                                    try {
+//                                        wxWorkService.SendTextMsg(wxWorkSendTextMsgDTO, qwUser.getServerId());
+                                        log.info("AI物流消息发送成功 - orderId: {}, sendId: {}", orderId, sendId);
+                                    } catch (Exception e) {
+                                        log.error("AI物流消息发送失败 - orderId: {}, sendId: {}, 错误信息: {}", orderId, sendId, e.getMessage(), e);
+                                    }
+                                } else {
+                                    log.info("未生成有效的消息内容 - orderId: {}, stateEx: {}, sBuilder长度: {}",
+                                            orderId, stateEx, sBuilder.length());
+                                }
+                            } else {
+                                log.warn("企微接口未返回有效的用户ID - orderId: {}, data为空", orderId);
+                            }
+                        } else {
+                            log.warn("企微用户配置不完整 - orderId: {}, qwUserId: {}, uid: {}, fastGptRoleId: {}, serverId: {}, serverStatus: {}, ipadStatus: {}",
+                                    orderId, qwUserId,
+                                    qwUser.getUid(),
+                                    qwUser.getFastGptRoleId(),
+                                    qwUser.getServerId(),
+                                    qwUser.getServerStatus(),
+                                    qwUser.getIpadStatus());
+                        }
+                    } else {
+                        log.warn("未找到企微用户 - orderId: {}, externalUserId: {}", orderId, externalContact.getExternalUserId());
+                    }
+                }
+            } else {
+                log.warn("未找到有效的企微联系人 - orderId: {}, qwExternalContact为空", orderId);
+            }
+        } else {
+            log.warn("订单用户ID为空 - orderId: {}", orderId);
+        }
+    }
+
     private void cancelOrderLive(LiveOrder order) {
         Integer deliveryStatus = order.getDeliveryStatus();
         if (deliveryStatus == null || deliveryStatus == 0) {

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/impl/ErpOrderServiceImpl.java

@@ -193,4 +193,9 @@ public class ErpOrderServiceImpl implements IErpOrderService
     public void getOrderLiveDeliveryStatus(LiveOrder order) {
 
     }
+
+    @Override
+    public void sendExpressInfoAt9And16(FsStoreOrder order) {
+
+    }
 }

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/impl/HzOMSErpOrderServiceImpl.java

@@ -345,6 +345,11 @@ public class HzOMSErpOrderServiceImpl implements IErpOrderService {
 
     }
 
+    @Override
+    public void sendExpressInfoAt9And16(FsStoreOrder order) {
+
+    }
+
     /**
      * 构建瀚智创建订单参数
      *

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/impl/JSTErpOrderServiceImpl.java

@@ -973,5 +973,10 @@ public class JSTErpOrderServiceImpl implements IErpOrderService {
     public void getOrderLiveDeliveryStatus(LiveOrder order) {
 
     }
+
+    @Override
+    public void sendExpressInfoAt9And16(FsStoreOrder order) {
+
+    }
 }
 

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/impl/K9OrderScrmServiceImpl.java

@@ -636,4 +636,9 @@ public class K9OrderScrmServiceImpl implements IErpOrderService {
     public void getOrderLiveDeliveryStatus(LiveOrder order) {
 
     }
+
+    @Override
+    public void sendExpressInfoAt9And16(FsStoreOrder order) {
+
+    }
 }

+ 5 - 0
fs-service/src/main/java/com/fs/erp/service/impl/WdtErpOrderServiceImpl.java

@@ -1295,6 +1295,11 @@ public class WdtErpOrderServiceImpl implements IErpOrderService {
 
     }
 
+    @Override
+    public void sendExpressInfoAt9And16(FsStoreOrder order) {
+
+    }
+
     public static String convertToSnakeCase(Object obj) {
         SerializeConfig config = new SerializeConfig();
         config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;