From ead2d1978084349a0d56e122555e76a3c6305fd5 Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期三, 11 三月 2026 14:51:52 +0800
Subject: [PATCH] 任务管理完结功能

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java        |   92 +++++++++++++++++++++++++-----
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java                         |    5 +
 rsf-admin/src/page/task/TaskList.jsx                                                             |    3 
 rsf-admin/src/page/task/FlowStepInstanceModal.jsx                                                |    2 
 rsf-admin/src/i18n/zh.js                                                                         |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatPreparationController.java |    2 
 rsf-admin/src/i18n/en.js                                                                         |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java                 |    6 ++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java           |   10 ++
 9 files changed, 105 insertions(+), 19 deletions(-)

diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index 95a4a9b..00fd50a 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -303,6 +303,8 @@
                 executeResult: "Execute Result",
                 taskNo: "Task No",
                 createTime: "Create Time",
+                wmsNextTaskStatus: "WMS Next Task Status",
+                wmsNowTaskStatus: "WMS Now Task Status",
             },
             subsystemFlowTemplate: {
                 flowCode: "flowCode",
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 532a93a..f54083c 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -267,6 +267,8 @@
                 executeResult: "鎵ц缁撴灉",
                 taskNo: "浠诲姟鍙�",
                 createTime: "鍒涘缓鏃堕棿",
+                wmsNextTaskStatus: "WMS涓嬩竴姝ヤ换鍔$姸鎬�",
+                wmsNowTaskStatus: "WMS褰撳墠浠诲姟鐘舵��",
             },
             basStationArea: {
                 type: "绫诲瀷",
diff --git a/rsf-admin/src/page/task/FlowStepInstanceModal.jsx b/rsf-admin/src/page/task/FlowStepInstanceModal.jsx
index 85793cd..a4949a1 100644
--- a/rsf-admin/src/page/task/FlowStepInstanceModal.jsx
+++ b/rsf-admin/src/page/task/FlowStepInstanceModal.jsx
@@ -190,6 +190,8 @@
                         <NumberField source="status" label={translate("table.field.flowStepInstance.status")} />
                         <TextField source="executeResult" label={translate("table.field.flowStepInstance.executeResult")} />
                         <TextField source="taskNo" label={translate("table.field.flowStepInstance.taskNo")} />
+                        <NumberField source="wmsNextTaskStatus" label={translate("table.field.flowStepInstance.wmsNextTaskStatus")} />
+                        <NumberField source="wmsNowTaskStatus" label={translate("table.field.flowStepInstance.wmsNowTaskStatus")} />
                         <DateField source="createTime" label={translate("table.field.flowStepInstance.createTime")} showTime />
                         <WrapperField cellClassName="opt" label="common.field.opt" onClick={(e) => e.stopPropagation()} >
                             <RowActions onEdit={handleEdit} onDelete={handleDelete} onJumpCurrent={handleJumpCurrent} />
diff --git a/rsf-admin/src/page/task/TaskList.jsx b/rsf-admin/src/page/task/TaskList.jsx
index 445e8cd..51a6b7a 100644
--- a/rsf-admin/src/page/task/TaskList.jsx
+++ b/rsf-admin/src/page/task/TaskList.jsx
@@ -343,8 +343,9 @@
             notify(msg);
         }
     }
+    // 浠呭綋鎺ュ彛杩斿洖 canComplete 涓� true 鏃跺睍绀猴紙瀛樺湪姝ラ婊¤冻 taskStatus=wmsNowTaskStatus 涓� wmsNextTaskStatus!=null锛�
     return (
-        ((record?.taskStatus < 98) || (record?.taskType >= 101 && record?.taskStatus < 198)) || (record?.taskType == 11 && record?.taskStatus == 101) ? (<ConfirmButton label={"toolbar.complete"} color="secondary" startIcon={<TaskAltIcon />} onConfirm={clickComplete} />) : (<></>)
+        record?.canComplete === true ? (<ConfirmButton label={"toolbar.complete"} color="secondary" startIcon={<TaskAltIcon />} onConfirm={clickComplete} />) : (<></>)
     )
 }
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatPreparationController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatPreparationController.java
index 1a347c9..cab6c7b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatPreparationController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/MatPreparationController.java
@@ -59,7 +59,7 @@
         PageParam<WkOrder, BaseParam> pageParam = new PageParam<>(baseParam, WkOrder.class);
         QueryWrapper<WkOrder> queryWrapper = pageParam.buildWrapper(true);
         List<String> list = Arrays.asList(OrderWorkType.ORDER_WORK_TYPE_STOCK_UP.type, OrderWorkType.ORDER_WORK_TYPE_NORMAL_MATERIAL_PREPARATION.type, OrderWorkType.ORDER_WORK_TYPE_FEED_IN_MATERIAL_PREPARATION.type);
-        queryWrapper.in("type", OrderType.ORDER_PRE.type,OrderType.ORDER_PRE_NOT_OUT.type);
+        queryWrapper.eq("type", OrderType.ORDER_PRE.type);
         queryWrapper.in("wk_type",list);
         return R.ok().add(outStockService.page(pageParam, queryWrapper));
     }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java
index b0f4d66..1180e8e 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java
@@ -38,19 +38,25 @@
     @Autowired
     private TaskService taskService;
 
+    /** 鍒嗛〉鏌ヨ浠诲姟鍒楄〃锛屽苟鏍规嵁 mission_flow_step_instance 鍒ゆ柇姣忔潯鏄惁鍙偣瀹屾垚锛坈anComplete锛夛紝渚涘墠绔睍绀哄畬鎴愭寜閽� */
     @PreAuthorize("hasAuthority('manager:task:list')")
     @PostMapping("/task/page")
     public R page(@RequestBody Map<String, Object> map) {
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<Task, BaseParam> pageParam = new PageParam<>(baseParam, Task.class);
         QueryWrapper<Task> queryWrapper = pageParam.buildWrapper(true);
-        return R.ok().add(taskService.page(pageParam, queryWrapper));
+        Page<Task> pageResult = taskService.page(pageParam, queryWrapper);
+        taskService.fillCanComplete(pageResult.getRecords());
+        return R.ok().add(pageResult);
     }
 
+    /** 鏌ヨ浠诲姟鍒楄〃锛屽悓鏍锋牴鎹� flowStepInstance 濉厖 canComplete */
     @PreAuthorize("hasAuthority('manager:task:list')")
     @PostMapping("/task/list")
     public R list(@RequestBody Map<String, Object> map) {
-        return R.ok().add(taskService.list());
+        List<Task> list = taskService.list();
+        taskService.fillCanComplete(list);
+        return R.ok().add(list);
     }
 
     @PreAuthorize("hasAuthority('manager:task:list')")
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
index f59751d..8b5483d 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
@@ -51,6 +51,11 @@
     @ApiModelProperty(value= "浠诲姟鐘舵��")
     private Integer taskStatus;
 
+    /** 鏄惁瀛樺湪鍙墽琛岀殑褰撳墠娴佺▼姝ラ锛岀敤浜庡垪琛ㄦ槸鍚﹀睍绀哄畬鎴愭寜閽� */
+    @TableField(exist = false,select = false)
+    @ApiModelProperty(value = "鏄惁鍙偣鍑诲畬鎴愶紙鏈夊綋鍓嶆楠や笖闈炵粓鎬侊級")
+    private Boolean canComplete;
+
     @ApiModelProperty("涓婄骇浠诲姟ID")
     private Long parentId;
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
index 190f5fd..0eb22b1 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
@@ -34,6 +34,12 @@
 
     Task operateComplete(Long id, Long loginUserId);
 
+    /** 鎵归噺濉厖鍒楄〃浠诲姟鐨� canComplete锛氭湁褰撳墠娴佺▼姝ラ涓旈潪缁堟�佹椂涓� true */
+    void fillCanComplete(List<Task> tasks);
+
+    /** 10000 鐘舵�佹寜浠诲姟绫诲瀷缃负鍏ュ簱瀹屾垚/绛夊緟纭/鍑哄簱瀹屾垚锛堜笌瀹氭椂浠诲姟 completeStock10000 鍏辩敤锛� */
+    void applyTransferEndStatus(Task task);
+
     void moveToDeep(Long loginUserId, String curLoc) throws Exception;
 
     void pubTaskToWcs(List<Task> tasks);
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 68a4b56..9e8ca7d 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
@@ -33,6 +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.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;
@@ -120,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)
@@ -806,27 +812,83 @@
     @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())) {
+            task.setTaskStatus(TaskStsType.COMPLETE_OUT.id);
+        } else if (TaskType.TASK_TYPE_PICK_AGAIN_OUT.type.equals(task.getTaskType())
+                || 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);
+        }
+    }
 
     /**
      * 淇敼浠诲姟浼樺厛绾�

--
Gitblit v1.9.1