wlzboy
2026-03-31 61c4c3f45e4257e2e7662f033e2719e62366c632
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/LegacyTransferSyncServiceImpl.java
@@ -76,7 +76,7 @@
     */
    @Override
    public int syncLegacyTransferOrders(int daysAgo) {
        log.info("开始同步{}天前的旧系统转运单数据", daysAgo);
//        log.info("开始同步{}天前的旧系统转运单数据", daysAgo);
        
        try {
            // 参数验证
@@ -90,63 +90,79 @@
            String startDateStr = DateUtils.parseDateToStr("yyyy-MM-dd", startDate);
            String endDateStr = DateUtils.parseDateToStr("yyyy-MM-dd", new Date());
            
            // 从SQL Server查询转运单数据
            List<Map<String, Object>> transferOrders = legacyTransferSyncMapper.selectTransferOrders(startDateStr, endDateStr);
            if (transferOrders == null || transferOrders.isEmpty()) {
                log.info("未查询到{}天前的转运单数据", daysAgo);
                return 0;
            }
            log.info("查询到{}条转运单数据,开始同步...", transferOrders.size());
            // Keyset游标分页从 SQL Server 拉取转运单数据,每页 10 条,走主键索引彻底规避超时
            final int PAGE_SIZE = 10;
            long lastId = 0L;   // 游标:记录上一页最后一条的 ServiceOrdID,首次传 0
            int successCount = 0;
            int totalCount = transferOrders.size();
            int processedCount = 0;
            for (Map<String, Object> order : transferOrders) {
                processedCount++;
                try {
                    Long serviceOrdID = MapValueUtils.getLongValue(order, "ServiceOrdID");
                    Long dispatchOrdID = MapValueUtils.getLongValue(order, "DispatchOrdID");
                    // 检查参数有效性
                    if (serviceOrdID==null || serviceOrdID<=0) {
                        log.warn("第{}条数据服务单ID为空,跳过处理", processedCount);
                        continue;
                    }
                    log.debug("正在处理第{}/{}条转运单: ServiceOrdID={}, DispatchOrdID={}",
                             processedCount, totalCount, serviceOrdID, dispatchOrdID);
                    // 检查是否已同步
                    if (isTransferOrderSynced(serviceOrdID, dispatchOrdID)) {
                        log.debug("转运单已同步,跳过: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
                        //进行更新操作
                        updateTransferOrder(serviceOrdID, dispatchOrdID, order);
                        continue;
                    }
                    // 同步单个转运单
                    boolean success = syncSingleTransferOrder(serviceOrdID, dispatchOrdID, order);
                    if (success) {
                        successCount++;
                    }
                    // 控制同步频率,避免请求过快
                    Thread.sleep(100);
                } catch (InterruptedException ie) {
                    log.warn("同步任务被中断");
                    Thread.currentThread().interrupt();
            while (true) {
                List<Map<String, Object>> transferOrders = legacyTransferSyncMapper.selectTransferOrders(startDateStr, endDateStr, lastId, PAGE_SIZE);
                if (transferOrders == null || transferOrders.isEmpty()) {
                    break;
                } catch (Exception e) {
                    log.error("同步单个转运单失败: ServiceOrdID={}, DispatchOrdID={}",
                             MapValueUtils.getStringValue(order, "ServiceOrdID"),
                             MapValueUtils.getStringValue(order, "DispatchOrdID"), e);
                }
                int totalCount = transferOrders.size();
                int processedCount = 0;
                for (Map<String, Object> order : transferOrders) {
                    processedCount++;
                    try {
                        Long serviceOrdID = MapValueUtils.getLongValue(order, "ServiceOrdID");
                        Long dispatchOrdID = MapValueUtils.getLongValue(order, "DispatchOrdID");
                        // 检查参数有效性
                        if (serviceOrdID == null || serviceOrdID <= 0) {
                            log.warn("第{}条数据服务单ID为空,跳过处理", processedCount);
                            continue;
                        }
//                        log.debug("正在处理第{}/{}条转运单: ServiceOrdID={}, DispatchOrdID={}",
//                                 processedCount, totalCount, serviceOrdID, dispatchOrdID);
                        // 检查是否已同步
                        if (isTransferOrderSynced(serviceOrdID, dispatchOrdID)) {
//                            log.debug("转运单已同步,跳过: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID);
                            //进行更新操作
                            updateTransferOrder(serviceOrdID, dispatchOrdID, order);
                            continue;
                        }
                        // 同步单个转运单
                        boolean success = syncSingleTransferOrder(serviceOrdID, dispatchOrdID, order);
                        if (success) {
                            successCount++;
                        }
                        // 控制同步频率,避免请求过快
                        Thread.sleep(100);
                    } catch (InterruptedException ie) {
                        log.warn("同步任务被中断");
                        Thread.currentThread().interrupt();
                        break;
                    } catch (Exception e) {
                        log.error("同步单个转运单失败: ServiceOrdID={}, DispatchOrdID={}",
                                MapValueUtils.getStringValue(order, "ServiceOrdID"),
                                MapValueUtils.getStringValue(order, "DispatchOrdID"), e);
                    }
                }
                // 更新游标为本页最后一条的 ServiceOrdID
                Map<String, Object> lastOrder = transferOrders.get(transferOrders.size() - 1);
                Long lastServiceOrdID = MapValueUtils.getLongValue(lastOrder, "ServiceOrdID");
                if (lastServiceOrdID != null && lastServiceOrdID > 0) {
                    lastId = lastServiceOrdID;
                } else {
                    break;
                }
                // 本页未满一页,说明已无更多数据
                if (totalCount < PAGE_SIZE) {
                    break;
                }
            }
            log.info("同步完成,共处理{}条转运单,成功同步{}条转运单数据", totalCount, successCount);
//            log.info("同步完成,成功同步{}条转运单数据", successCount);
            return successCount;
            
        } catch (Exception e) {
@@ -346,13 +362,13 @@
            createTaskVo.setDeptId(deptId);
            int result = sysTaskService.insertTask(createTaskVo,serviceOrdID,dispatchOrdID, serviceOrdNo, taskCreatorId,createUserName, deptId, ServiceOrd_CC_Time, ServiceOrd_CC_Time);
            Long taskId = sysTaskService.insertTask(createTaskVo,serviceOrdID,dispatchOrdID, serviceOrdNo, taskCreatorId,createUserName, deptId, ServiceOrd_CC_Time, ServiceOrd_CC_Time);
            if (result > 0) {
//                log.info("转运单同步成功: ServiceOrdID={}, DispatchOrdID={}, 创建的任务ID={}", serviceOrdID, dispatchOrdID, result);
            if (taskId != null && taskId > 0) {
//                log.info("转运单同步成功: ServiceOrdID={}, DispatchOrdID={}, 创建的任务ID={}", serviceOrdID, dispatchOrdID, taskId);
                try {
                    notifyTransferOrderByWechat((long) result, serviceOrdID, dispatchOrdID, serviceOrdNo, ServiceOrd_CC_Time, dept, order);
                    notifyTransferOrderByWechat(taskId, serviceOrdID, dispatchOrdID, serviceOrdNo, ServiceOrd_CC_Time, dept, order);
                } catch (Exception e) {
                    log.error("转运单同步成功后发送微信通知失败: ServiceOrdID={}, DispatchOrdID={}", serviceOrdID, dispatchOrdID, e);
                }