From ad5fef776eb9d66a0fcfc2ddf89698c5642e0eec Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期五, 06 三月 2026 08:36:24 +0800
Subject: [PATCH] 增加一个定时任务。如果拣货出库过程中,相同料箱号,存在(199 ,200)的任务 并且同时存在  101,196的任务 则101和196的任务会 自动变成199

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java |  280 ++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 200 insertions(+), 80 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
index 09c9ea8..9368e62 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
@@ -8,7 +8,6 @@
 import com.fasterxml.jackson.databind.cfg.CoercionAction;
 import com.fasterxml.jackson.databind.cfg.CoercionInputShape;
 import com.vincent.rsf.framework.common.Cools;
-import com.vincent.rsf.framework.common.DateUtils;
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.server.api.config.RemotesInfoProperties;
@@ -105,10 +104,11 @@
 
 
     /**
-     * @param
-     * @return
+     * 瀹屾垚鍏ュ簱锛屾洿鏂板簱浣嶆槑缁嗐�佺粍鎵樼姸鎬侊紝骞跺湪姝ょ粺涓�鎵ц 9.1 鍏�/鍑哄簱缁撴灉涓婃姤浜戜粨銆�
+     * 涓� RCS 鍥炶皟褰㈡垚闂幆锛歊CS 涓婃姤浠诲姟缁撴潫鍚庝粎灏嗕换鍔$姸鎬佺疆涓� COMPLETE_IN锛堣 WcsServiceImpl.receiveExMsg锛夛紝
+     * 鏈畾鏃朵换鍔℃壂鎻� COMPLETE_IN 骞舵墽琛� complateInTask锛堝簱浣嶃�佺粍鎵樸��9.1 涓婃姤浜戜粨锛夈��
+     *
      * @author Ryan
-     * @description 瀹屾垚鍏ュ簱锛屾洿鏂板簱瀛�
      * @time 2025/4/2 12:37
      */
     @Scheduled(cron = "0/3 * * * * ?")
@@ -123,10 +123,12 @@
     }
 
     /**
+     * 瀹屾垚鍑哄簱浠诲姟锛屾洿鏂板簱浣�/鍑哄簱鍗曪紝骞跺湪姝ょ粺涓�鎵ц 9.1 鍏�/鍑哄簱缁撴灉涓婃姤浜戜粨銆�
+     * 涓� RCS 鍥炶皟褰㈡垚闂幆锛歊CS 涓婃姤 END 鍚庝粎灏嗗嚭搴撲换鍔$姸鎬佺疆涓� COMPLETE_OUT锛堣 WcsServiceImpl.receiveExMsg锛夛紝
+     * 鏈畾鏃朵换鍔℃壂鎻� COMPLETE_OUT 骞舵墽琛� completeTask锛堟墸搴撲綅銆佹洿鏂板嚭搴撳崟銆�9.1 涓婃姤浜戜粨锛夈��
+     *
      * @author Ryan
      * @date 2025/5/20
-     * @description: 瀹屾垚鍑哄簱浠诲姟锛屾洿鏂板簱瀛�
-     * @version 1.0
      */
     @Scheduled(cron = "0/5 * * * * ?  ")
     @Transactional(rollbackFor = Exception.class)
@@ -249,27 +251,63 @@
     /**
      * 闈炲厜鐢电珯鐐逛换鍔′笅鍙�
      */
-    @Scheduled(cron = "0/55 * * * * ?  ")
+    @Scheduled(cron = "0/35 * * * * ?  ")
     @Transactional(rollbackFor = Exception.class)
     public void pubTaskToWcs() {
+        log.debug("瀹氭椂浠诲姟寮�濮嬫墽琛岋細浠诲姟涓嬪彂鍒癛CS");
         Long loginUserId = SystemAuthUtils.getLoginUserId();
-        List<Integer> list = Arrays.asList(TaskType.TASK_TYPE_IN.type, TaskType.TASK_TYPE_OUT.type, TaskType.TASK_TYPE_LOC_MOVE.type, TaskType.TASK_TYPE_EMPITY_IN.type
-                , TaskType.TASK_TYPE_CHECK_IN.type, TaskType.TASK_TYPE_MERGE_IN.type, TaskType.TASK_TYPE_EMPITY_OUT.type, TaskType.TASK_TYPE_PICK_IN.type,
-                TaskType.TASK_TYPE_PICK_AGAIN_OUT.type, TaskType.TASK_TYPE_CHECK_OUT.type, TaskType.TASK_TYPE_MERGE_OUT.type);
-        List<Integer> integers = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id);
+        List<Integer> list = Arrays.asList(
+                 TaskType.TASK_TYPE_LOC_MOVE.type
+                ,TaskType.TASK_TYPE_OUT.type
+                ,TaskType.TASK_TYPE_EMPITY_OUT.type
+                ,TaskType.TASK_TYPE_CHECK_OUT.type
+                ,TaskType.TASK_TYPE_MERGE_OUT.type
+                ,TaskType.TASK_TYPE_PICK_AGAIN_OUT.type
+                ,TaskType.TASK_TYPE_IN.type
+                ,TaskType.TASK_TYPE_EMPITY_IN.type
+                ,TaskType.TASK_TYPE_CHECK_IN.type
+                ,TaskType.TASK_TYPE_MERGE_IN.type
+                ,TaskType.TASK_TYPE_PICK_IN.type
+        );
+        List<Integer> integers = Arrays.asList(/*TaskStsType.GENERATE_IN.id,*/ TaskStsType.GENERATE_OUT.id);
         List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>()
                 .in(Task::getTaskType, list)
                 .in(Task::getTaskStatus, integers)
                 .orderByDesc(Task::getSort));
+        log.debug("鏌ヨ鍒板緟涓嬪彂浠诲姟鏁伴噺锛歿}", tasks.size());
         if (tasks.isEmpty()) {
+            log.debug("娌℃湁寰呬笅鍙戠殑浠诲姟锛屽畾鏃朵换鍔$粨鏉�");
             return;
         }
         Config config = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_RUN_CHECK_ORDERS));
         if (!Objects.isNull(config) && !Objects.isNull(config.getVal())) {
             if (Boolean.parseBoolean(config.getVal())) {
-               return;
+                log.info("閰嶇疆椤笰UTO_RUN_CHECK_ORDERS涓簍rue锛岃烦杩囦换鍔′笅鍙�");
+                return;
             }
         }
+        // 鍚屾枡绠卞彿瑙勫垯锛氳嫢 101 浠诲姟鎵�鍦ㄦ枡绠卞彿涓嬪凡瀛樺湪 196/198/199/200 浠诲姟锛屽垯涓嶅悜 RCS 鍙戦�佽 101 浠诲姟锛�/api/open/bus/submit锛�
+        List<Integer> higherStatuses = Arrays.asList(TaskStsType.AWAIT.id, TaskStsType.COMPLETE_OUT.id, TaskStsType.WAVE_SEED.id, TaskStsType.UPDATED_OUT.id);
+        List<Task> higherTasks = taskService.list(new LambdaQueryWrapper<Task>()
+                .in(Task::getTaskStatus, higherStatuses)
+                .isNotNull(Task::getBarcode)
+                .ne(Task::getBarcode, ""));
+        Set<String> barcodesWithHigher = higherTasks.stream().map(Task::getBarcode).filter(StringUtils::isNotBlank).collect(Collectors.toSet());
+        final Set<String> skipBarcodes = barcodesWithHigher;
+        List<Task> toPublish = tasks.stream()
+                .filter(t -> {
+                    if (TaskStsType.GENERATE_OUT.id.equals(t.getTaskStatus()) && StringUtils.isNotBlank(t.getBarcode()) && skipBarcodes.contains(t.getBarcode())) {
+                        log.debug("鍚屾枡绠卞彿{}涓嬪凡瀛樺湪196/198/199/200浠诲姟锛岃烦杩�101浠诲姟涓嬪彂锛歵askId={}", t.getBarcode(), t.getId());
+                        return false;
+                    }
+                    return true;
+                })
+                .collect(Collectors.toList());
+        if (toPublish.isEmpty()) {
+            log.debug("杩囨护鍚庢棤寰呬笅鍙戜换鍔★紝瀹氭椂浠诲姟缁撴潫");
+            return;
+        }
+        tasks = toPublish;
 //        for (Task task : tasks) {
 //            /**绉诲簱涓嶅仛绔欑偣鎿嶄綔*/
 //            if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) {
@@ -282,7 +320,44 @@
 //            }
 //        }
         /**涓嬪彂鏅�氱珯鐐逛换鍔★紝鎶ラ敊鍥炴粴锛屼笉鍐嶅線涓嬫墽琛�*/
+        log.debug("寮�濮嬩笅鍙憑}涓换鍔″埌RCS", tasks.size());
         taskService.pubTaskToWcs(tasks);
+        log.debug("瀹氭椂浠诲姟鎵ц瀹屾垚锛氫换鍔′笅鍙戝埌RCS");
+    }
+
+    /**
+     * 鎷h揣鍑哄簱鍚屾枡绠卞彿鐘舵�佸悓姝ワ細鐩稿悓鏂欑鍙蜂笅鑻ュ悓鏃跺瓨鍦�(199銆�200)浠诲姟涓�(101銆�196)浠诲姟锛屽垯灏� 101銆�196 鑷姩鏇存柊涓� 199銆�
+     * 鎵ц鍛ㄦ湡涓庝换鍔′笅鍙戜竴鑷达紝渚夸簬鍦ㄤ笅鍙戝墠瀹屾垚鐘舵�佸悓姝ャ��
+     */
+    @Scheduled(cron = "0/35 * * * * ?  ")
+    @Transactional(rollbackFor = Exception.class)
+    public void syncBarcodeTaskStatusTo199() {
+        List<Integer> statuses = Arrays.asList(TaskStsType.GENERATE_OUT.id, TaskStsType.AWAIT.id, TaskStsType.WAVE_SEED.id, TaskStsType.UPDATED_OUT.id);
+        List<Task> candidates = taskService.list(new LambdaQueryWrapper<Task>()
+                .in(Task::getTaskStatus, statuses)
+                .isNotNull(Task::getBarcode)
+                .ne(Task::getBarcode, ""));
+        if (candidates.isEmpty()) return;
+        Map<String, Set<Integer>> statusByBarcode = new HashMap<>();
+        for (Task t : candidates) {
+            statusByBarcode.computeIfAbsent(t.getBarcode(), k -> new HashSet<>()).add(t.getTaskStatus());
+        }
+        List<Integer> to199 = Arrays.asList(TaskStsType.GENERATE_OUT.id, TaskStsType.AWAIT.id);
+        List<Integer> has199Or200 = Arrays.asList(TaskStsType.WAVE_SEED.id, TaskStsType.UPDATED_OUT.id);
+        for (Map.Entry<String, Set<Integer>> e : statusByBarcode.entrySet()) {
+            Set<Integer> set = e.getValue();
+            boolean hasHigh = set.stream().anyMatch(has199Or200::contains);
+            boolean hasLow = set.stream().anyMatch(to199::contains);
+            if (!hasHigh || !hasLow) continue;
+            String barcode = e.getKey();
+            boolean updated = taskService.update(new LambdaUpdateWrapper<Task>()
+                    .eq(Task::getBarcode, barcode)
+                    .in(Task::getTaskStatus, to199)
+                    .set(Task::getTaskStatus, TaskStsType.WAVE_SEED.id));
+            if (updated) {
+                log.info("鍚屾枡绠卞彿{}涓嬪瓨鍦�199/200涓斿瓨鍦�101/196锛屽凡灏�101/196浠诲姟鑷姩鏇存柊涓�199", barcode);
+            }
+        }
     }
 
     /**
@@ -357,7 +432,7 @@
 
     /**
      * 姣忎簲绉掓牎楠屾繁搴撲綅鏄惁涓虹┖锛屽鏋滄祬搴撲綅鏈夎揣锛屽皢娴呭簱浣嶇Щ鑷虫繁搴撲綅
-     *///TODO 鐢熸垚绉诲簱浠诲姟鍓嶏紝闇�瑕佹鏌ユ槸鍚︽湁浠诲姟鍓嶅線褰撳墠鎵樼洏
+     *///TODO 鐢熸垚绉诲簱浠诲姟鍓嶏紝闇�瑕佹鏌ユ槸鍚︽湁浠诲姟鍓嶅線褰撳墠鏂欑
 //    @Scheduled(cron = "0/35 * * * * ?  ")
 //    @Transactional(rollbackFor = Exception.class)
 //    public void shallocToDeep() throws Exception {
@@ -572,77 +647,121 @@
         }
 
         tasks.forEach(task -> {
-            TaskLog taskLog = new TaskLog();
-            BeanUtils.copyProperties(task, taskLog);
-            taskLog.setTaskId(task.getId()).setId(null);
-            if (!taskLogService.save(taskLog)) {
-                throw new CoolException("浠诲姟鍘嗗彶妗d繚瀛樺け璐ワ紒锛�");
+            // 鍙鍑哄簱 200 鍋氬悓绠辩爜妫�鏌ワ細鍚岀鐮佷笅鑻ユ湁 101/196/198/199 绛夛紙鏈埌 200锛夊垯璺宠繃锛岀瓑鍏ㄩ儴 200 鎵嶄竴娆″鐞嗭紱鎷f枡鍏ュ簱 100 涓嶅彈褰卞搷
+            List<Task> toProcess = Collections.singletonList(task);
+            if (TaskStsType.UPDATED_OUT.id.equals(task.getTaskStatus()) && TaskType.TASK_TYPE_PICK_AGAIN_OUT.type.equals(task.getTaskType()) && StringUtils.isNotBlank(task.getBarcode())) {
+                long not200 = taskService.count(new LambdaQueryWrapper<Task>()
+                        .eq(Task::getBarcode, task.getBarcode())
+                        .ne(Task::getTaskStatus, TaskStsType.UPDATED_OUT.id));
+                if (not200 > 0) {
+                    return; // 鍚岀鐮佸皻鏈� 101/196/198/199 绛夐潪 200 浠诲姟锛屼笉澶勭悊锛岀户缁瓑寰�
+                }
+                // 鍚岀鐮佸凡鍏ㄩ儴 200锛氫竴娆℃�у鐞嗚绠辩爜涓嬫墍鏈� 200 鎷f枡鍑哄簱锛堝悎璁℃墸鍑忋�佹洿鏂板簱瀛樸�佺敓鎴愪竴寮犳嫞鏂欏叆搴撳崟銆佹洿鏂板簱浣嶇姸鎬侊級
+                List<Task> all200 = taskService.list(new LambdaQueryWrapper<Task>()
+                        .eq(Task::getBarcode, task.getBarcode())
+                        .eq(Task::getTaskType, TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)
+                        .eq(Task::getTaskStatus, TaskStsType.UPDATED_OUT.id)
+                        .orderByAsc(Task::getId));
+                if (!all200.isEmpty()) {
+                    taskService.processPickOutBarcodeAll200(all200);
+                    toProcess = all200;
+                }
             }
-            List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
-
-            if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)) {
-                for (TaskItem taskItem : taskItems) {
-                    if (Objects.isNull(taskItem.getOrderId())) {
-                        continue;
-                    }
-                    WkOrder order = asnOrderService.getById(taskItem.getOrderId());
-                    if (Objects.isNull(order)) {
-                        continue;
-                    }
-                    //鍏ュ簱鍗曚换鍔℃槑缁嗕笂鎶�
-                    WkOrderItem wkOrderItem = asnOrderItemService.getOne(new LambdaQueryWrapper<WkOrderItem>()
-                            .eq(WkOrderItem::getOrderId, order.getId())
-                            .eq(WkOrderItem::getFieldsIndex, taskItem.getFieldsIndex()));
-                    if (Objects.isNull(wkOrderItem)) {
-                        throw new CoolException("鏁版嵁閿欒锛屽崟鎹槑缁嗕笉瀛樺湪鎴栧凡瀹屾垚锛侊紒");
-                    }
-                    /**鍏ュ簱鍗曟槑缁嗕笂鎶�*/
-                    reportMsgService.reportOrderItem(wkOrderItem);
+            for (Task t : toProcess) {
+                TaskLog taskLog = new TaskLog();
+                BeanUtils.copyProperties(t, taskLog);
+                taskLog.setTaskId(t.getId()).setId(null);
+                if (!taskLogService.save(taskLog)) {
+                    throw new CoolException("浠诲姟鍘嗗彶妗d繚瀛樺け璐ワ紒锛�");
                 }
-            } else if ((task.getTaskType() >= TaskType.TASK_TYPE_OUT.type && task.getTaskType() <= TaskType.TASK_TYPE_EMPITY_OUT.type)
-                    || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)) {
-                /**鍒ゆ柇鍗曟嵁鏄惁瀹屾垚**/
-                Set<Long> longSet = taskItems.stream().map(TaskItem::getSourceId).collect(Collectors.toSet());
-                List<WaveOrderRela> waveOrderRelas = waveOrderRelaService.list(new LambdaQueryWrapper<WaveOrderRela>()
-                        .in(WaveOrderRela::getWaveId, longSet));
-                if (Cools.isEmpty(waveOrderRelas)) {
-                    throw new CoolException("娉㈡瀵瑰簲鍏宠仈鍗曟湭鎵惧埌");
-                }
-                Set<Long> orderIds = waveOrderRelas.stream().map(WaveOrderRela::getOrderId).collect(Collectors.toSet());
-                List<WkOrder> wkOrders = asnOrderService.listByIds(orderIds);
-                if (wkOrders.isEmpty()) {
-                    throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�");
-                }
+                List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, t.getId()));
 
-                Config allowChang = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.ALLOW_OVER_CHANGE));
-
-                wkOrders.forEach(order -> {
-                    //鍒ゆ柇鏄惁鍏佽瓒呮敹锛屼笉鍏佽瓒呮敹娣诲姞鎷掓敹鍒ゆ柇
-                    if (!Objects.isNull(allowChang)) {
-                        if (!Boolean.parseBoolean(allowChang.getVal())) {
-                            if (order.getAnfme().compareTo(order.getQty()) == 0) {
-                                order.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_DONE.val);
-                                if (!asnOrderService.updateById(order)) {
-                                    throw new CoolException("鍑哄簱鍗曟洿鏂扮姸鎬佸け璐�");
-                                }
-                            }
-                        } else {
-                            if (order.getAnfme().compareTo(order.getQty()) <= 0) {
-                                order.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_DONE.val);
-                                if (!asnOrderService.updateById(order)) {
-                                    throw new CoolException("鍑哄簱鍗曟洿鏂扮姸鎬佸け璐�");
-                                }
-                            }
+            // 涓婃姤ERP鏆傛椂娉ㄩ噴锛�/rsf-open-api/erp/report/order锛�
+            // if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)) {
+            //     for (TaskItem taskItem : taskItems) {
+            //         if (Objects.isNull(taskItem.getOrderId())) {
+            //             continue;
+            //         }
+            //         WkOrder order = asnOrderService.getById(taskItem.getOrderId());
+            //         if (Objects.isNull(order)) {
+            //             continue;
+            //         }
+            //         // 鍏ュ簱鍗曚换鍔℃槑缁嗕笂鎶ワ細浼樺厛鎸� orderItemId锛堝崟鎹槑缁咺D锛夋煡锛屽惁鍒欐寜 orderId+matnrId(+fieldsIndex) 鏌ワ紝纭繚鑳芥壘鍒板崟鎹槑缁�
+            //         WkOrderItem wkOrderItem = null;
+            //         if (taskItem.getOrderItemId() != null) {
+            //             wkOrderItem = asnOrderItemService.getById(taskItem.getOrderItemId());
+            //         }
+            //         if (wkOrderItem == null) {
+            //             LambdaQueryWrapper<WkOrderItem> qw = new LambdaQueryWrapper<WkOrderItem>()
+            //                     .eq(WkOrderItem::getOrderId, order.getId())
+            //                     .eq(WkOrderItem::getMatnrId, taskItem.getMatnrId());
+            //             if (StringUtils.isNotBlank(taskItem.getFieldsIndex())) {
+            //                 qw.eq(WkOrderItem::getFieldsIndex, taskItem.getFieldsIndex());
+            //             }
+            //             wkOrderItem = asnOrderItemService.getOne(qw);
+            //         }
+            //         if (Objects.isNull(wkOrderItem)) {
+            //             logger.warn("浠诲姟鍘嗗彶妗e鐞嗭細鍗曟嵁鏄庣粏涓嶅瓨鍦ㄦ垨宸插畬鎴愶紝璺宠繃涓婃姤 - taskId={}, orderId={}, orderItemId={}, matnrId={}, fieldsIndex={}", task.getId(), order.getId(), taskItem.getOrderItemId(), taskItem.getMatnrId(), taskItem.getFieldsIndex());
+            //             continue;
+            //         }
+            //         /**鍏ュ簱鍗曟槑缁嗕笂鎶�*/
+            //         reportMsgService.reportOrderItem(wkOrderItem);
+            //     }
+            // } else
+            if (t.getTaskType().equals(TaskType.TASK_TYPE_IN.type)) {
+                // 鍏ュ簱绫诲瀷浠呰浆鍘嗗彶锛屼笉涓婃姤ERP锛堝凡娉ㄩ噴锛�
+            } else if ((t.getTaskType() >= TaskType.TASK_TYPE_OUT.type && t.getTaskType() <= TaskType.TASK_TYPE_EMPITY_OUT.type)
+                    || t.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)) {
+                /**鍒ゆ柇鍗曟嵁鏄惁瀹屾垚锛氭尝娆′笅鍙戙�佹寜鍗曚笅鍙戯紙鐐瑰嚮涓嬪彂浠诲姟锛夊畬鎴愬悗鍧囧皢鍑哄簱鍗曠疆涓哄畬缁�*/
+                Set<Long> orderIdsToDone = new HashSet<>();
+                if (t.getResource() != null && t.getResource().equals(TaskResouceType.TASK_RESOUCE_WAVE_TYPE.val)) {
+                    Set<Long> longSet = taskItems.stream()
+                            .map(TaskItem::getSourceId)
+                            .filter(Objects::nonNull)
+                            .collect(Collectors.toSet());
+                    if (!longSet.isEmpty()) {
+                        List<WaveOrderRela> waveOrderRelas = waveOrderRelaService.list(new LambdaQueryWrapper<WaveOrderRela>()
+                                .in(WaveOrderRela::getWaveId, longSet));
+                        if (!Cools.isEmpty(waveOrderRelas)) {
+                            orderIdsToDone.addAll(waveOrderRelas.stream().map(WaveOrderRela::getOrderId).collect(Collectors.toSet()));
                         }
                     }
-                    //妫�鏌ュ崟鎹槸鍚﹀畬鎴�
-
-                });
+                } else if (t.getResource() != null && t.getResource().equals(TaskResouceType.TASK_RESOUCE_ORDER_TYPE.val)) {
+                    // 鎸夊崟涓嬪彂锛氫换鍔℃槑缁� sourceId 涓哄嚭搴撳崟ID
+                    Set<Long> ids = taskItems.stream()
+                            .map(TaskItem::getSourceId)
+                            .filter(Objects::nonNull)
+                            .collect(Collectors.toSet());
+                    orderIdsToDone.addAll(ids);
+                }
+                if (!orderIdsToDone.isEmpty()) {
+                    List<WkOrder> wkOrders = asnOrderService.listByIds(orderIdsToDone);
+                    if (!wkOrders.isEmpty()) {
+                        Config allowChang = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.ALLOW_OVER_CHANGE));
+                        wkOrders.forEach(order -> {
+                            if (order.getAnfme() == null) return;
+                            boolean canDone = Boolean.TRUE.equals(allowChang != null && Boolean.parseBoolean(allowChang.getVal()))
+                                    ? (order.getQty() != null && order.getAnfme().compareTo(order.getQty()) <= 0)
+                                    : (order.getQty() != null && order.getAnfme().compareTo(order.getQty()) == 0);
+                            if (canDone) {
+                                order.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_DONE.val);
+                                if (order.getQty() == null || order.getQty().compareTo(0.0) == 0) {
+                                    order.setQty(order.getWorkQty() != null ? order.getWorkQty() : 0.0);
+                                }
+                                if (!asnOrderService.updateById(order)) {
+                                    logger.error("鍑哄簱鍗曟洿鏂扮姸鎬佸け璐ャ�傝鍗旾D锛歿}锛岃鍗曠紪鐮侊細{}", order.getId(), order.getCode());
+                                }
+                            }
+                        });
+                    }
+                }
+                
                 //鍑哄簱鍗曚笂鎶CS淇敼搴撲綅鐘舵��
                 try {
-                    reportStationStatus(task);
+                    reportStationStatus(t);
                 } catch (Exception e) {
-                    throw new CoolException(e.getMessage());
+                    logger.error("浠诲姟{}涓婃姤RCS淇敼搴撲綅鐘舵�佸け璐ャ�備换鍔$紪鐮侊細{}", t.getId(), t.getTaskCode(), e);
+                    // 涓嶆姏鍑哄紓甯革紝閬垮厤涓柇瀹氭椂浠诲姟
                 }
             }
 
@@ -651,16 +770,16 @@
                 TaskItemLog itemLog = new TaskItemLog();
                 BeanUtils.copyProperties(item, itemLog);
                 itemLog.setId(null)
-                        .setTaskId(task.getId())
+                        .setTaskId(t.getId())
                         .setLogId(taskLog.getId())
                         .setTaskItemId(item.getId());
                 itemLogs.add(itemLog);
             }
 
-            locItemWorkingService.remove(new LambdaQueryWrapper<LocItemWorking>().eq(LocItemWorking::getTaskId, task.getId()));
+            locItemWorkingService.remove(new LambdaQueryWrapper<LocItemWorking>().eq(LocItemWorking::getTaskId, t.getId()));
 
 
-            if (!taskService.removeById(task.getId())) {
+            if (!taskService.removeById(t.getId())) {
                 throw new CoolException("鍘熷浠诲姟鍒犻櫎澶辫触锛侊紒");
             }
 
@@ -668,11 +787,12 @@
                 if (!taskItemLogService.saveBatch(itemLogs)) {
                     throw new CoolException("浠诲姟鏄庣粏鍘嗗彶妗d繚瀛樺け璐ワ紒锛�");
                 }
-                if (!taskItemService.remove(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()))) {
+                if (!taskItemService.remove(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, t.getId()))) {
                     throw new CoolException("鍘熷浠诲姟鏄庣粏鍒犻櫎澶辫触锛侊紒");
                 }
             }
 
+            }
         });
     }
 

--
Gitblit v1.9.1