From 51c27e505842ce3343dfabfb994d2fc28ae0d8a8 Mon Sep 17 00:00:00 2001
From: 1 <1@123>
Date: 星期三, 11 三月 2026 14:56:44 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/devlop-phyz' into devlop-phyz

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java |  182 ++++++++++++++++++++++++++++++++++-----------
 1 files changed, 138 insertions(+), 44 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
index db8643e..f31aa37 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.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.server.api.config.RemotesInfoProperties;
 import com.vincent.rsf.server.api.controller.erp.params.TaskInParam;
 import com.vincent.rsf.server.api.entity.CommonResponse;
@@ -34,7 +33,8 @@
 import com.vincent.rsf.server.manager.enums.LocStsType;
 import com.vincent.rsf.server.system.entity.Config;
 import com.vincent.rsf.server.system.service.ConfigService;
-import com.vincent.rsf.server.system.service.impl.ConfigServiceImpl;
+import com.vincent.rsf.server.system.entity.FlowStepInstance;
+import com.vincent.rsf.server.system.service.FlowStepInstanceService;
 import com.vincent.rsf.server.system.utils.SerialRuleUtils;
 import com.vincent.rsf.server.system.utils.SystemAuthUtils;
 import lombok.Synchronized;
@@ -122,6 +122,10 @@
     private RestTemplate restTemplate;
     @Autowired
     private RemotesInfoProperties.RcsApi rcsApi;
+    @Autowired
+    private FlowStepInstanceService flowStepInstanceService;
+    @Autowired
+    private RemotesInfoProperties.WmsOpenApi wmsOpenApi;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -764,7 +768,7 @@
                     //绉诲簱
                     moveInStock(task, loginUserId);
                 } else if (task.getTaskType().equals(TaskType.TASK_TYPE_EMPTY_IN.type)) {
-                    //绉诲簱
+                    //绌烘澘鍏ュ簱
                     complateInstockE(task, loginUserId);
                 } else if (task.getTaskType().equals(TaskType.TASK_TYPE_CROSS_DOCKING_OUT.type)) {
                     //瓒婂簱
@@ -808,26 +812,82 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Task operateComplete(Long id, Long loginUserId) {
-        List<Integer> longs = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id);
-        Task task = taskService.getOne(new LambdaQueryWrapper<Task>()
-                .eq(Task::getId, id)
-                .in(Task::getTaskStatus, longs));
-
+        Task task = getById(id);
         if (Objects.isNull(task)) {
-            throw new CoolException("鏁版嵁閿欒锛氬綋鍓嶄换鍔′笉鍙墽琛屽畬缁撴搷浣滐紒锛�");
+            throw new CoolException("鏁版嵁閿欒锛氫换鍔′笉瀛樺湪锛侊紒");
         }
-
+        if (task.getTaskStatus() != null && TERMINAL_OR_WAITING_STATUS.contains(task.getTaskStatus())) {
+            throw new CoolException("浠诲姟宸插浜庣粓鎬佹垨绛夊緟搴撳瓨鏇存柊锛屾棤闇�瀹岀粨");
+        }
+        List<FlowStepInstance> steps = flowStepInstanceService.list(
+                new LambdaQueryWrapper<FlowStepInstance>()
+                        .eq(FlowStepInstance::getTaskNo, task.getTaskCode())
+                        .orderByAsc(FlowStepInstance::getStepOrder));
+        int maxCompletedOrder = steps.stream()
+                .filter(s -> s.getStepOrder() != null && s.getStatus() != null && s.getStatus() == 3)
+                .mapToInt(FlowStepInstance::getStepOrder)
+                .max().orElse(-1);
+        for (FlowStepInstance step : steps) {
+            if (step.getStepOrder() != null && step.getStepOrder() > maxCompletedOrder) {
+                step.setStatus((short) 5);
+                flowStepInstanceService.updateById(step);
+            }
+        }
         modiftyTaskSort(task, loginUserId);
-        //
-//        if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) {
-//            task.setTaskStatus(TaskStsType.COMPLETE_OUT.id);
-//        } else {
-        task.setTaskStatus(task.getTaskType() < 100 ? TaskStsType.COMPLETE_IN.id : task.getTaskType()==101? TaskStsType.COMPLETE_OUT.id:TaskStsType.AWAIT.id);
-//        }
-        if (!this.updateById(task)) {
-            throw new CoolException("瀹屾垚浠诲姟澶辫触");
+        applyTransferEndStatus(task);
+        // applyTransferEndStatus 鏈尮閰嶅埌鐨勪换鍔$被鍨嬶紙鏈疆涓� 98/196/198/9999锛夋椂鍏滃簳缃粓鎬�
+        if (task.getTaskStatus() == null || (!task.getTaskStatus().equals(TaskStsType.COMPLETE_IN.id)
+                && !task.getTaskStatus().equals(TaskStsType.AWAIT.id)
+                && !task.getTaskStatus().equals(TaskStsType.COMPLETE_OUT.id)
+                && !task.getTaskStatus().equals(TaskStsType.MISSION_TRANSFER.id))) {
+            task.setTaskStatus(task.getTaskType() != null && task.getTaskType() < 100
+                    ? TaskStsType.COMPLETE_IN.id
+                    : Integer.valueOf(101).equals(task.getTaskType()) ? TaskStsType.COMPLETE_OUT.id : TaskStsType.AWAIT.id);
+            updateById(task);
         }
         return task;
+    }
+    @Override
+    public void applyTransferEndStatus(Task task) {
+        if (TaskType.TASK_TYPE_IN.type.equals(task.getTaskType())
+                || TaskType.TASK_TYPE_PICK_IN.type.equals(task.getTaskType())
+                || TaskType.TASK_TYPE_CHECK_IN.type.equals(task.getTaskType())
+                || TaskType.TASK_TYPE_EMPTY_IN.type.equals(task.getTaskType())
+                || TaskType.TASK_TYPE_MERGE_IN.type.equals(task.getTaskType())
+                || TaskType.TASK_TYPE_LOC_MOVE.type.equals(task.getTaskType())) {
+            task.setTaskStatus(TaskStsType.COMPLETE_IN.id);
+        } else if (TaskType.TASK_TYPE_OUT.type.equals(task.getTaskType())
+                || TaskType.TASK_TYPE_PICK_AGAIN_OUT.type.equals(task.getTaskType())) {
+            task.setTaskStatus(TaskStsType.COMPLETE_OUT.id);
+        } else if (TaskType.TASK_TYPE_CHECK_OUT.type.equals(task.getTaskType())) {
+            task.setTaskStatus(TaskStsType.AWAIT.id);
+        } else if (TaskType.TASK_TYPE_MERGE_OUT.type.equals(task.getTaskType())) {
+            task.setTaskStatus(TaskStsType.MISSION_TRANSFER.id);
+        } else if (TaskType.TASK_TYPE_CROSS_DOCKING_OUT.type.equals(task.getTaskType())
+                || TaskType.TASK_TYPE_EMPTY_OUT.type.equals(task.getTaskType())) {
+            task.setTaskStatus(TaskStsType.COMPLETE_OUT.id);
+        } else {
+            return;
+        }
+        updateById(task);
+    }
+
+    /** 缁堟�佹垨绛夊緟瀹氭椂浠诲姟鏇存柊搴撳瓨鐨勭姸鎬侊紝涓嶅睍绀哄畬鎴愭寜閽� */
+    private static final Set<Integer> TERMINAL_OR_WAITING_STATUS = new HashSet<>(Arrays.asList(
+            TaskStsType.COMPLETE_IN.id, TaskStsType.REPORT_IN.id, TaskStsType.UPDATED_IN.id,
+            TaskStsType.COMPLETE_OUT.id, TaskStsType.WAVE_SEED.id, TaskStsType.UPDATED_OUT.id,
+            TaskStsType.MISSION_TRANSFER_END.id));
+
+    /** 瀹岀粨涓嶄緷璧栨祦绋嬫楠わ紝浠呮湭缁堟�佷换鍔″睍绀哄畬鎴愭寜閽� */
+    @Override
+    public void fillCanComplete(List<Task> tasks) {
+        if (tasks == null || tasks.isEmpty()) {
+            return;
+        }
+        for (Task task : tasks) {
+            boolean terminal = task.getTaskStatus() != null && TERMINAL_OR_WAITING_STATUS.contains(task.getTaskStatus());
+            task.setCanComplete(!terminal);
+        }
     }
 
     /**
@@ -932,7 +992,7 @@
         }
 
         List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
-
+        String type = LocStsType.LOC_STS_TYPE_F.type;
         if (!taskItems.isEmpty()) {
             //绉诲簱鏈夊彲鑳芥槸绌烘澘
             try {
@@ -945,12 +1005,14 @@
             if (!locItemService.remove(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocCode, task.getOrgLoc()))) {
                 throw new CoolException("婧愬簱浣嶆槑缁嗗垹闄ゅけ璐ワ紒");
             }
+        } else {
+            type = LocStsType.LOC_STS_TYPE_D.type;
         }
 
         /**淇敼搴撲綅鐘舵�佷负F.鍦ㄥ簱*/
         if (!locService.update(new LambdaUpdateWrapper<Loc>()
                 .set(Loc::getBarcode, task.getBarcode())
-                .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type)
+                .set(Loc::getUseStatus, type)
                 .set(Loc::getUpdateBy, loginUserId)
                 .set(Loc::getUpdateTime, new Date())
                 .eq(Loc::getCode, task.getTargLoc()))) {
@@ -995,14 +1057,14 @@
                 } else if (task.getTaskType().equals(TaskType.TASK_TYPE_CROSS_DOCKING_OUT.type)) {
                     //109.澶囪揣
                     complateOutStockDocking(task, loginUserId);
-                } else if (task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type)) {
+                } else if (task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type) || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)) {
                     //107.鐩�
 //                    pickOrCheckTask(task.getId(), Constants.TASK_TYPE_OUT_CHECK);
                     complateOutStock2(task, loginUserId);
-                } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)) {
-                    //103.鎷i��
-//                    pickOrCheckTask(task.getId(), Constants.TASK_TYPE_OUT_PICK);
-                    complateOutStock2(task, loginUserId);
+//                } else if () {
+//                    //103.鎷i��
+////                    pickOrCheckTask(task.getId(), Constants.TASK_TYPE_OUT_PICK);
+//                    complateOutStock2(task, loginUserId);
                 } else {
                     complateOutStock(task, loginUserId);
                 }
@@ -1051,7 +1113,7 @@
                     .eq(LocItemWorking::getTaskId, taskItem.getTaskId())
                     .eq(LocItemWorking::getFieldsIndex, taskItem.getFieldsIndex())
                     .eq(StringUtils.isNotEmpty(taskItem.getBatch()), LocItemWorking::getBatch, taskItem.getBatch())
-                    .eq(LocItemWorking::getMatnrId, taskItem.getMatnrId()));
+                    .eq(LocItemWorking::getMatnrId, taskItem.getMatnrId()).last("limit 1"));
             if (Objects.isNull(locWorking)) {
                continue;
             }
@@ -1134,7 +1196,39 @@
         if (!taskService.updateById(task)) {
             throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
         }
+        // 鐩樼偣鍐嶅叆搴撲换鍔$粨鏉燂細灏嗗叧鑱旂殑鐩樼偣宸紓鍗曠疆涓哄凡瀹℃牳
+        if (TaskType.TASK_TYPE_CHECK_IN.type.equals(task.getTaskType())) {
+            markCheckDiffApprovedWhenCheckInDone(task);
+        }
+    }
 
+    /**
+     * 鐩樼偣鍐嶅叆搴撳畬鎴愬悗锛屽皢鍏宠仈鐨勭洏鐐瑰樊寮傚崟缃负宸插鏍革紙鏈夊崟鎸� orderId锛屾棤鍗曟寜 鍑哄簱浠诲姟鍙� orderCode锛�
+     */
+    @Override
+    public void markCheckDiffApprovedWhenCheckInDone(Task checkInTask) {
+        List<TaskItem> items = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, checkInTask.getId()).last("limit 1"));
+        Long orderId = items.isEmpty() ? null : items.get(0).getOrderId();
+        CheckDiff checkDiff = null;
+        if (orderId != null && !orderId.equals(0L)) {
+            checkDiff = checkDiffService.getOne(new LambdaQueryWrapper<CheckDiff>().eq(CheckDiff::getOrderId, orderId).last("limit 1"));
+        } else {
+            Task outTask = taskService.getOne(new LambdaQueryWrapper<Task>()
+                    .eq(Task::getBarcode, checkInTask.getBarcode())
+                    .eq(Task::getTaskType, TaskType.TASK_TYPE_CHECK_OUT.type)
+                    .last("limit 1"));
+            if (outTask != null) {
+                checkDiff = checkDiffService.getOne(new LambdaQueryWrapper<CheckDiff>()
+                        .eq(CheckDiff::getOrderCode, outTask.getTaskCode())
+                        .and(w -> w.isNull(CheckDiff::getOrderId).or().eq(CheckDiff::getOrderId, 0))
+                        .last("limit 1"));
+            }
+        }
+        if (checkDiff != null && !CheckDiffExceStatus.CHECK_DIFF_EXCE_STATUS_END.val.equals(checkDiff.getExceStatus())) {
+            checkDiffService.update(new LambdaUpdateWrapper<CheckDiff>()
+                    .eq(CheckDiff::getId, checkDiff.getId())
+                    .set(CheckDiff::getExceStatus, CheckDiffExceStatus.CHECK_DIFF_EXCE_STATUS_END.val));
+        }
     }
 
     /**
@@ -1380,7 +1474,7 @@
         Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>()
                 .eq(Loc::getCode, task.getOrgLoc()));
         if (Objects.isNull(loc)) {
-            throw new CoolException("娌℃湁绌哄簱浣嶏紒锛�");
+            throw new CoolException("婧愬簱浣嶄笉瀛樺湪锛侊紒");
         }
 
         String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, task);
@@ -1426,9 +1520,9 @@
                 if (taskItem.getFieldsIndex().equals(working.getFieldsIndex())) {
                     Double minQty = taskItem.getAnfme();
                     if (!task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)) {
-                        minQty = Math.round((working.getAnfme() - taskItem.getQty()) * 1000000) / 1000000.0;
+                        minQty = Math.round((working.getAnfme() - taskItem.getAnfme()) * 1000000) / 1000000.0;
                     }
-                    if (minQty.compareTo(0.0) >= 0) {
+                    if (!minQty.equals(0D) && minQty>0D) {
                         taskItem.setAnfme(minQty);
                         if (!taskItemService.updateById(taskItem)) {
                             throw new CoolException("浠诲姟鏄庣粏淇敼澶辫触锛侊紒");
@@ -1527,21 +1621,21 @@
             throw new CoolException("搴撲綅鏄庣粏涓嶅瓨鍦紒锛�");
         }
 
-        List<LocItemWorking> workings = new ArrayList<>();
-        for (LocItem item : locItems) {
-            LocItemWorking working = new LocItemWorking();
-            BeanUtils.copyProperties(item, working);
-            working.setId(null)
-                    .setTaskId(task.getId())
-                    .setLocItemId(item.getId())
-                    .setUpdateBy(loginUserId)
-                    .setUpdateTime(new Date());
-            workings.add(working);
-        }
-
-        if (!locItemWorkingService.saveBatch(workings)) {
-            throw new CoolException("涓存椂搴撳瓨淇濆瓨澶辫触锛侊紒");
-        }
+//        List<LocItemWorking> workings = new ArrayList<>();
+//        for (LocItem item : locItems) {
+//            LocItemWorking working = new LocItemWorking();
+//            BeanUtils.copyProperties(item, working);
+//            working.setId(null)
+//                    .setTaskId(task.getId())
+//                    .setLocItemId(item.getId())
+//                    .setUpdateBy(loginUserId)
+//                    .setUpdateTime(new Date());
+//            workings.add(working);
+//        }
+//
+//        if (!locItemWorkingService.saveBatch(workings)) {
+//            throw new CoolException("涓存椂搴撳瓨淇濆瓨澶辫触锛侊紒");
+//        }
 
         try {
             //鏇存柊搴撲綅鏄庣粏

--
Gitblit v1.9.1