From 10776dd6f7f9ef9e47419427fcb1b692ed73d54d Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期二, 03 二月 2026 14:34:20 +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/OutStockServiceImpl.java           |    2 
 .gitignore                                                                                              |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java                    |   34 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskStsType.java                          |   40 -
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java                      |    7 
 rsf-admin/src/page/basicInfo/basStation/CrossZoneAreaField.jsx                                          |   22 
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/WmsServerFeignClient.java                  |    8 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java               |  164 ++++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java                                |   33 +
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/CallBackEvent.java                     |    1 
 rsf-admin/src/page/components/PageDrawer.jsx                                                            |   30 +
 rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskMissionSchedules.java             |   22 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java             |  182 +++++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/MissionStepType.java                      |   30 +
 rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepInstance.java                     |    6 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/InBoundServiceImpl.java                |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java            |   25 
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/ERPController.java                   |  245 +++++++---
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java                    |    2 
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/fallback/WmsServerFeignClientFallback.java |   85 +++
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/ErpQueryController.java              |   18 
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java                       |    6 
 rsf-server/src/main/java/com/vincent/rsf/server/common/domain/PageParam.java                            |  131 +++++
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/InventorySummary.java                    |    2 
 rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx                                                        |    7 
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/WmsConstant.java                     |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java                    |  232 ++++++----
 rsf-admin/src/page/task/TaskList.jsx                                                                    |    6 
 28 files changed, 1,069 insertions(+), 278 deletions(-)

diff --git a/.gitignore b/.gitignore
index 0a1a46b..28ca605 100644
--- a/.gitignore
+++ b/.gitignore
@@ -39,3 +39,4 @@
 logs
 logs/**
 /log.path_IS_UNDEFINED/*.log
+/log.path_IS_UNDEFINED/*/*.log
diff --git a/rsf-admin/src/page/basicInfo/basStation/CrossZoneAreaField.jsx b/rsf-admin/src/page/basicInfo/basStation/CrossZoneAreaField.jsx
index 708d31b..f81d839 100644
--- a/rsf-admin/src/page/basicInfo/basStation/CrossZoneAreaField.jsx
+++ b/rsf-admin/src/page/basicInfo/basStation/CrossZoneAreaField.jsx
@@ -20,31 +20,32 @@
     };
 
     const fetchAreaNames = async () => {
-        if (!record?.areas || record.areas.length === 0) return;
+        const areasData = record?.areaIds || record?.areas;
+        if (!areasData || areasData.length === 0) return;
 
         setLoading(true);
         try {
             // 鎻愬彇鎺掑簭淇℃伅鍜孖D
             // Old format: [1, 2, 3] (array of integers)
             // New format: [{id: 1, sort: 1}, {id: 2, sort: 2}] (array of objects)
-            const isObjectArray = record.areas.length > 0 && 
-                typeof record.areas[0] === 'object' && 
-                record.areas[0] !== null && 
-                'id' in record.areas[0];
+            const isObjectArray = areasData.length > 0 && 
+                typeof areasData[0] === 'object' && 
+                areasData[0] !== null && 
+                'id' in areasData[0];
             
             let areaIds = [];
             let sortMap = new Map(); // 瀛樺偍 id -> sort 鐨勬槧灏�
             
             if (isObjectArray) {
                 // 瀵硅薄鏁扮粍鏍煎紡锛屾彁鍙朓D鍜屾帓搴忎俊鎭�
-                areaIds = record.areas.map(area => {
+                areaIds = areasData.map(area => {
                     const id = area.id;
                     sortMap.set(id, area.sort || 0);
                     return id;
                 });
             } else {
                 // 绾疘D鏁扮粍鏍煎紡
-                areaIds = record.areas.map(id => Number(id));
+                areaIds = areasData.map(id => Number(id));
             }
             
             const res = await request.post(`/warehouseAreas/many/${areaIds.join(',')}`);
@@ -70,7 +71,8 @@
     };
 
     useEffect(() => {
-        if (record?.areas && record.areas.length !== 0 && record.areas.length > 0) {
+        const areasData = record?.areaIds || record?.areas;
+        if (areasData && areasData.length > 0) {
             fetchAreaNames();
         }
     }, [record]);
@@ -101,10 +103,10 @@
                         label={`+${areaNames.length - 1}`}
                     />
                 )}
-                {areaNames.length === 0 && record.areas && record.areas.length > 0 && (
+                {areaNames.length === 0 && (record?.areaIds || record?.areas) && (record?.areaIds || record?.areas).length > 0 && (
                     <Chip
                         size="small"
-                        label={`${record.areas.length} 涓尯鍩焋}
+                        label={`${(record?.areaIds || record?.areas).length} 涓尯鍩焋}
                     />
                 )}
             </Stack>
diff --git a/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx b/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
index 0cf5299..8a1160e 100644
--- a/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
+++ b/rsf-admin/src/page/basicInfo/matnr/MatnrEdit.jsx
@@ -187,6 +187,13 @@
                                     />
                                 </Grid>
                                 <Grid item xs={6} display="flex" gap={1}>
+                                    <TextInput
+                                        label="table.field.matnr.model"
+                                        source="model"
+                                        parse={v => v}
+                                    />
+                                </Grid>
+                                <Grid item xs={6} display="flex" gap={1}>
                                     <NumberInput
                                         label="table.field.matnr.weight"
                                         source="weight"
diff --git a/rsf-admin/src/page/components/PageDrawer.jsx b/rsf-admin/src/page/components/PageDrawer.jsx
index 521ee7e..a92a9f5 100644
--- a/rsf-admin/src/page/components/PageDrawer.jsx
+++ b/rsf-admin/src/page/components/PageDrawer.jsx
@@ -23,26 +23,46 @@
         }
     }
 
+    const isOpen = !!drawerVal;
+
     return (
         <Drawer
             variant="persistent"
-            open={!!drawerVal}
+            open={isOpen}
             anchor="right"
             onClose={handleClose}
             sx={{
                 zIndex: 100,
                 '& .MuiDrawer-paper': {
-                    top: '86px', // AppBar(50px) + TabsBar(36px)                    
+                    top: '86px', // AppBar(50px) + TabsBar(36px)
+                    // 褰撳叧闂椂锛岀‘淇濆唴瀹逛笉鍙仛鐒�
+                    ...(isOpen ? {} : {
+                        pointerEvents: 'none',
+                        visibility: 'hidden',
+                    })
                 }
             }}
+            // 瀵逛簬 persistent Drawer锛屼娇鐢� PaperProps 鏉ユ帶鍒跺彲璁块棶鎬�
+            PaperProps={{
+                'aria-hidden': !isOpen,
+                tabIndex: isOpen ? 0 : -1,
+            }}
         >
-            {!!drawerVal && (
-                <Box pt={2} width={{ xs: '100vW', sm: width }} mt={{ xs: 2, sm: 1 }}>
+            {isOpen && (
+                <Box 
+                    pt={2} 
+                    width={{ xs: '100vW', sm: width }} 
+                    mt={{ xs: 2, sm: 1 }}
+                >
                     <Stack direction="row" p={2}>
                         <Typography variant="h6" flex="1">
                             {title}
                         </Typography>
-                        <IconButton onClick={handleClose} size="small">
+                        <IconButton 
+                            onClick={handleClose} 
+                            size="small"
+                            aria-label="鍏抽棴"
+                        >
                             <CloseIcon />
                         </IconButton>
                     </Stack>
diff --git a/rsf-admin/src/page/task/TaskList.jsx b/rsf-admin/src/page/task/TaskList.jsx
index 55d5af7..5fdfbb1 100644
--- a/rsf-admin/src/page/task/TaskList.jsx
+++ b/rsf-admin/src/page/task/TaskList.jsx
@@ -156,7 +156,7 @@
                     rowClick={false}
                     expand={<TaskPanel />}
                     expandSingle={true}
-                    omit={['id', 'createTime', 'createBy$', 'memo', 'robotCode', 'exceStatus', 'expDesc', 'expCode', 'status','warehType$']}
+                    omit={['id', 'createTime', 'createBy$', 'memo', 'robotCode', 'exceStatus', 'expDesc', 'expCode', 'status','warehType$', 'orderType', 'order_type', 'orderType$']}
                 >
                     <NumberField source="id" />
                     <TextField source="taskCode" label="table.field.task.taskCode" />
@@ -164,9 +164,9 @@
                     <NumberField source="taskType$" label="table.field.task.taskType" />
                     <NumberField source="warehType$" label="table.field.task.warehType" />
                     <TextField source="orgLoc" label="table.field.task.orgLoc" />
-                    <TextField source="orgSite" label="table.field.task.orgSite" />
+                    <TextField source="orgSite$" label="table.field.task.orgSite" />
                     <TextField source="targLoc" label="table.field.task.targLoc" />
-                    <TextField source="targSite" label="table.field.task.targSite" />
+                    <TextField source="targSite$" label="table.field.task.targSite" />
                     <TextField source="barcode" label="table.field.task.barcode" />
                     <TextField source="robotCode" label="table.field.task.robotCode" />
                     <NumberField source="exceStatus" label="table.field.task.exceStatus" />
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/ERPController.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/ERPController.java
index 90edbd6..d2f59c7 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/ERPController.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/ERPController.java
@@ -2,17 +2,16 @@
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.openApi.entity.dto.CommonResponse;
 import com.vincent.rsf.openApi.entity.phyz.*;
 import com.vincent.rsf.openApi.feign.wms.WmsServerFeignClient;
+import com.vincent.rsf.openApi.feign.wms.fallback.WmsServerFeignClientFallback;
 import com.vincent.rsf.openApi.service.phyz.ErpReportService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.compress.utils.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -20,6 +19,7 @@
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -153,9 +153,23 @@
         return CommonResponse.ok();
     }
 
+    @ApiOperation("搴撳瓨鏌ヨ鏄庣粏锛堣〃鍗曟彁浜わ級")
+    @PostMapping(value = "/inventory/details", consumes = "application/x-www-form-urlencoded")
+    public CommonResponse queryInventoryDetailsForm(HttpServletRequest request) {
+        // 浠庤〃鍗曞弬鏁版瀯寤烘煡璇㈡潯浠�
+        InventoryQueryCondition condition = buildConditionFromRequestParams(request);
+        // 璋冪敤JSON澶勭悊鏂规硶
+        return queryInventoryDetails(condition);
+    }
+
     @ApiOperation("搴撳瓨鏌ヨ鏄庣粏")
-    @PostMapping("/inventory/details")
-    public CommonResponse queryInventoryDetails(@RequestBody InventoryQueryCondition condition) {
+    @PostMapping(value = "/inventory/details", consumes = "application/json")
+    public CommonResponse queryInventoryDetails(@RequestBody(required = false) InventoryQueryCondition condition) {
+        // JSON鏂瑰紡锛氭敮鎸佷笉浼犻�掑弬鏁帮紙{}鎴杗ull鎴栫┖璇锋眰浣擄級锛屽垱寤洪粯璁ょ殑绌烘煡璇㈡潯浠跺璞�
+        if (condition == null) {
+            condition = new InventoryQueryCondition();
+        }
+        
         if (SIMULATED_DATA_ENABLE.equals("1")) {
             String x = "[\n" +
                     "  {\n" +
@@ -207,11 +221,6 @@
                 return CommonResponse.error("鏈嶅姟鏈垵濮嬪寲");
             }
             
-            // 鍙傛暟楠岃瘉
-            if (condition == null) {
-                return CommonResponse.error("鏌ヨ鏉′欢涓嶈兘涓虹┖");
-            }
-            
             log.info("搴撳瓨鏌ヨ鏄庣粏璇锋眰鍙傛暟锛� {}", JSON.toJSONString(condition));
             
             // 鐩存帴浼犻�掑疄浣撶被锛孎eign浼氳嚜鍔ㄥ簭鍒楀寲涓篔SON
@@ -247,87 +256,114 @@
             }
         } catch (Exception e) {
             log.error("搴撳瓨鏌ヨ鏄庣粏澶辫触", e);
-            // 杩囨护閿欒娑堟伅涓殑URL锛屽彧淇濈暀閿欒绫诲瀷
-            String errorMessage = e.getMessage();
-            if (errorMessage != null) {
-                // 濡傛灉鍖呭惈"executing"锛岃鏄庢槸HTTP璇锋眰閿欒锛屽幓鎺塙RL閮ㄥ垎
-                if (errorMessage.contains("executing")) {
-                    int executingIndex = errorMessage.indexOf("executing");
-                    if (executingIndex > 0) {
-                        // 鎻愬彇"executing"涔嬪墠鐨勯儴鍒嗭紙濡�"Read timed out"锛�
-                        errorMessage = errorMessage.substring(0, executingIndex).trim();
-                    } else {
-                        // 濡傛灉"executing"鍦ㄥ紑澶达紝浣跨敤榛樿閿欒娑堟伅
-                        errorMessage = "璇锋眰瓒呮椂";
-                    }
-                }
-                // 濡傛灉鍖呭惈"http://"鎴�"https://"锛屼篃灏濊瘯鍘绘帀URL閮ㄥ垎
-                else if (errorMessage.contains("http://") || errorMessage.contains("https://")) {
-                    // 浣跨敤姝e垯琛ㄨ揪寮忓幓鎺塙RL
-                    errorMessage = errorMessage.replaceAll("https?://[^\\s]+", "").trim();
-                    if (errorMessage.isEmpty()) {
-                        errorMessage = "璇锋眰澶辫触";
-                    }
-                }
-            }
-            return CommonResponse.error("鏌ヨ澶辫触锛�" + (errorMessage != null && !errorMessage.isEmpty() ? errorMessage : "鏈煡閿欒"));
+            String errorMessage = WmsServerFeignClientFallback.filterErrorMessage(e);
+            return CommonResponse.error(errorMessage);
         }
     }
 
+    @ApiOperation("搴撳瓨鏌ヨ姹囨�伙紙琛ㄥ崟鎻愪氦锛�")
+    @PostMapping(value = "/inventory/summary", consumes = "application/x-www-form-urlencoded")
+    public CommonResponse queryInventorySummaryForm(HttpServletRequest request) {
+        // 浠庤〃鍗曞弬鏁版瀯寤烘煡璇㈡潯浠�
+        InventoryQueryCondition condition = buildConditionFromRequestParams(request);
+        // 璋冪敤JSON澶勭悊鏂规硶
+        return queryInventorySummary(condition);
+    }
+
     @ApiOperation("搴撳瓨鏌ヨ姹囨��")
-    @PostMapping("/inventory/summary")
-    public CommonResponse queryInventorySummary(@RequestBody JSONObject params) {
+    @PostMapping(value = "/inventory/summary", consumes = "application/json")
+    public CommonResponse queryInventorySummary(@RequestBody(required = false) InventoryQueryCondition condition) {
+        // JSON鏂瑰紡锛氭敮鎸佷笉浼犻�掑弬鏁帮紙{}鎴杗ull鎴栫┖璇锋眰浣擄級锛屽垱寤洪粯璁ょ殑绌烘煡璇㈡潯浠跺璞�
+        if (condition == null) {
+            condition = new InventoryQueryCondition();
+        }
+        
         if (SIMULATED_DATA_ENABLE.equals("1")) {
-            String s = "{\n" +
-                    "  \"code\": 200,\n" +
-                    "  \"msg\": \"鎿嶄綔鎴愬姛\",\n" +
-                    "  \"data\": [\n" +
-                    "    {\n" +
-                    "      \"wareHouseId\": \"WH001\",\n" +
-                    "      \"wareHouseName\": \"鍘熸枡浠撳簱\",\n" +
-                    "      \"matNr\": \"MAT10001\",\n" +
-                    "      \"makTx\": \"閽㈡潗Q235\",\n" +
-                    "      \"spec\": \"鍥芥爣GB/T700-2006\",\n" +
-                    "      \"anfme\": 10.5,\n" +
-                    "      \"unit\": \"鍚╘",\n" +
-                    "      \"stockOrgId\": \"ORG001\",\n" +
-                    "      \"batch\": \"BATCH20260106001\",\n" +
-                    "      \"planNo\": \"Plan20260106006\"\n" +
-                    "    },\n" +
-                    "    {\n" +
-                    "      \"wareHouseId\": \"WH001\",\n" +
-                    "      \"wareHouseName\": \"鍘熸枡浠撳簱\",\n" +
-                    "      \"matNr\": \"MAT10002\",\n" +
-                    "      \"makTx\": \"閾濆瀷鏉�6061\",\n" +
-                    "      \"spec\": \"鍥芥爣GB/T3190-2008\",\n" +
-                    "      \"anfme\": 20.3,\n" +
-                    "      \"unit\": \"鍚╘",\n" +
-                    "      \"stockOrgId\": \"ORG001\",\n" +
-                    "      \"batch\": \"BATCH20260106002\",\n" +
-                    "      \"planNo\": \"Plan20260106005\"\n" +
-                    "    },\n" +
-                    "    {\n" +
-                    "      \"wareHouseId\": \"WH002\",\n" +
-                    "      \"wareHouseName\": \"鎴愬搧浠撳簱\",\n" +
-                    "      \"matNr\": \"MAT30001\",\n" +
-                    "      \"makTx\": \"鐢垫満鎴愬搧\",\n" +
-                    "      \"spec\": \"380V 50Hz 15KW\",\n" +
-                    "      \"anfme\": 100,\n" +
-                    "      \"unit\": \"鍙癨",\n" +
-                    "      \"stockOrgId\": \"ORG001\",\n" +
-                    "      \"batch\": \"BATCH20260106003\",\n" +
-                    "      \"planNo\": \"Plan20260106004\"\n" +
-                    "    }\n" +
-                    "  ]\n" +
-                    "}";
-            return JSONObject.parseObject(s, CommonResponse.class);
+            String x = "[\n" +
+                    "  {\n" +
+                    "    \"wareHouseId\": \"WH001\",\n" +
+                    "    \"wareHouseName\": \"鍘熸枡浠撳簱\",\n" +
+                    "    \"matNr\": \"MAT10001\",\n" +
+                    "    \"matTx\": \"閽㈡潗Q235\",\n" +
+                    "    \"spec\": \"鍥芥爣GB/T700-2006\",\n" +
+                    "    \"anfme\": 10.5,\n" +
+                    "    \"unit\": \"鍚╘",\n" +
+                    "    \"stockOrgId\": \"ORG001\",\n" +
+                    "    \"batch\": \"BATCH20260106001\",\n" +
+                    "    \"planNo\": \"Plan20260106006\"\n" +
+                    "  },\n" +
+                    "  {\n" +
+                    "    \"wareHouseId\": \"WH001\",\n" +
+                    "    \"wareHouseName\": \"鍘熸枡浠撳簱\",\n" +
+                    "    \"matNr\": \"MAT10002\",\n" +
+                    "    \"matTx\": \"閾濆瀷鏉�6061\",\n" +
+                    "    \"spec\": \"鍥芥爣GB/T3190-2008\",\n" +
+                    "    \"anfme\": 20.3,\n" +
+                    "    \"unit\": \"鍚╘",\n" +
+                    "    \"stockOrgId\": \"ORG001\",\n" +
+                    "    \"batch\": \"BATCH20260106002\",\n" +
+                    "    \"planNo\": \"Plan20260106005\"\n" +
+                    "  },\n" +
+                    "  {\n" +
+                    "    \"wareHouseId\": \"WH002\",\n" +
+                    "    \"wareHouseName\": \"鎴愬搧浠撳簱\",\n" +
+                    "    \"matNr\": \"MAT30001\",\n" +
+                    "    \"matTx\": \"鐢垫満鎴愬搧\",\n" +
+                    "    \"spec\": \"380V 50Hz 15KW\",\n" +
+                    "    \"anfme\": 100,\n" +
+                    "    \"unit\": \"鍙癨",\n" +
+                    "    \"stockOrgId\": \"ORG001\",\n" +
+                    "    \"batch\": \"BATCH20260106003\",\n" +
+                    "    \"planNo\": \"Plan20260106004\"\n" +
+                    "  }\n" +
+                    "]";
+            return CommonResponse.ok(JSONArray.parseArray(x, InventorySummary.class));
         }
 
-        InventoryQueryCondition condition = JSON.parseObject(params.toJSONString(), InventoryQueryCondition.class);
-        // 鏁版嵁澶勭悊锛岃浆鍙憇erver
-        List<InventorySummary> inventorySummaries = Lists.newArrayList();
-        return new CommonResponse().setCode(200).setData(inventorySummaries);
-
+        try {
+            if (wmsServerFeignClient == null) {
+                log.warn("WmsServerFeignClient鏈敞鍏ワ紝鏃犳硶杩涜璋冪敤");
+                return CommonResponse.error("鏈嶅姟鏈垵濮嬪寲");
+            }
+            
+            log.info("搴撳瓨鏌ヨ姹囨�昏姹傚弬鏁帮細 {}", JSON.toJSONString(condition));
+            
+            // 鐩存帴浼犻�掑疄浣撶被锛孎eign浼氳嚜鍔ㄥ簭鍒楀寲涓篔SON
+            R result = wmsServerFeignClient.queryInventorySummary(condition);
+            
+            log.info("搴撳瓨鏌ヨ姹囨�昏繑鍥炵粨鏋滐細 {}", JSON.toJSONString(result));
+            
+            if (result != null) {
+                // R绫荤户鎵胯嚜HashMap锛屼娇鐢╣et鏂规硶鑾峰彇鍊�
+                Integer code = (Integer) result.get("code");
+                String msg = (String) result.get("msg");
+                Object data = result.get("data");
+                
+                if (code != null && code == 200) {
+                    // 灏哅ap鍒楄〃杞崲涓篒nventorySummary鍒楄〃
+                    if (data != null) {
+                        @SuppressWarnings("unchecked")
+                        List<Map<String, Object>> dataList = (List<Map<String, Object>>) data;
+                        List<InventorySummary> inventorySummaries = new ArrayList<>();
+                        for (Map<String, Object> item : dataList) {
+                            InventorySummary summary = JSON.parseObject(JSON.toJSONString(item), InventorySummary.class);
+                            inventorySummaries.add(summary);
+                        }
+                        return CommonResponse.ok(inventorySummaries);
+                    } else {
+                        return CommonResponse.ok(new ArrayList<>());
+                    }
+                } else {
+                    return CommonResponse.error(msg != null ? msg : "鏌ヨ澶辫触");
+                }
+            } else {
+                return CommonResponse.error("鏌ヨ澶辫触锛氳繑鍥炵粨鏋滀负绌�");
+            }
+        } catch (Exception e) {
+            log.error("搴撳瓨鏌ヨ姹囨�诲け璐�", e);
+            String errorMessage = WmsServerFeignClientFallback.filterErrorMessage(e);
+            return CommonResponse.error(errorMessage);
+        }
     }
 
     @ApiOperation("鐩樼偣缁撴灉纭")
@@ -400,4 +436,47 @@
     }
     // endregion
 
+
+    /**
+     * 浠庤姹傚弬鏁帮紙琛ㄥ崟鏁版嵁锛夋瀯寤烘煡璇㈡潯浠跺璞�
+     * 鏀寔 application/x-www-form-urlencoded 鏍煎紡
+     */
+    private InventoryQueryCondition buildConditionFromRequestParams(HttpServletRequest request) {
+        InventoryQueryCondition condition = new InventoryQueryCondition();
+        
+        // 浠庤姹傚弬鏁颁腑鑾峰彇瀛楁鍊�
+        String wareHouseId = request.getParameter("wareHouseId");
+        String locId = request.getParameter("locId");
+        String matNr = request.getParameter("matNr");
+        String matGroup = request.getParameter("matGroup");
+        String orderNo = request.getParameter("orderNo");
+        String planNo = request.getParameter("planNo");
+        String batch = request.getParameter("batch");
+        
+        // 璁剧疆瀛楁鍊硷紙濡傛灉瀛樺湪锛�
+        if (wareHouseId != null && !wareHouseId.isEmpty()) {
+            condition.setWareHouseId(wareHouseId);
+        }
+        if (locId != null && !locId.isEmpty()) {
+            condition.setLocId(locId);
+        }
+        if (matNr != null && !matNr.isEmpty()) {
+            condition.setMatNr(matNr);
+        }
+        if (matGroup != null && !matGroup.isEmpty()) {
+            condition.setMatGroup(matGroup);
+        }
+        if (orderNo != null && !orderNo.isEmpty()) {
+            condition.setOrderNo(orderNo);
+        }
+        if (planNo != null && !planNo.isEmpty()) {
+            condition.setPlanNo(planNo);
+        }
+        if (batch != null && !batch.isEmpty()) {
+            condition.setBatch(batch);
+        }
+        
+        return condition;
+    }
+
 }
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/WmsConstant.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/WmsConstant.java
index f36148d..73da571 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/WmsConstant.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/WmsConstant.java
@@ -43,5 +43,8 @@
     //搴撳瓨鏌ヨ鏄庣粏锛圗RP鎺ュ彛锛屽搴攐pen-api鐨�/inventory/details锛�
     public static final String QUERY_INVENTORY_DETAILS = "/rsf-server/erp/inventory/details";
 
+    //搴撳瓨鏌ヨ姹囨�伙紙ERP鎺ュ彛锛屽搴攐pen-api鐨�/inventory/summary锛�
+    public static final String QUERY_INVENTORY_SUMMARY = "/rsf-server/erp/inventory/summary";
+
 
 }
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/InventorySummary.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/InventorySummary.java
index 7d51252..1fcfd78 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/InventorySummary.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/InventorySummary.java
@@ -18,7 +18,7 @@
     // 鐗╂枡缂栫爜
     private String matNr;
     // 鐗╂枡鍚嶇О
-    private String makTx;
+    private String matTx;
     // 瑙勬牸
     private String spec;
     // 鏁伴噺锛屽皬鏁扮偣鏈�闀�6浣�
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/WmsServerFeignClient.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/WmsServerFeignClient.java
index e48e236..299c917 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/WmsServerFeignClient.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/WmsServerFeignClient.java
@@ -31,4 +31,12 @@
      */
     @PostMapping(WmsConstant.QUERY_INVENTORY_DETAILS)
     R queryInventoryDetails(@RequestBody InventoryQueryCondition condition);
+
+    /**
+     * 搴撳瓨鏌ヨ姹囨�伙紙璋冪敤server绔殑erpQueryInventorySummary鏂规硶锛�
+     * @param condition 鏌ヨ鏉′欢瀹炰綋绫�
+     * @return 搴撳瓨姹囨�诲垪琛�
+     */
+    @PostMapping(WmsConstant.QUERY_INVENTORY_SUMMARY)
+    R queryInventorySummary(@RequestBody InventoryQueryCondition condition);
 }
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/fallback/WmsServerFeignClientFallback.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/fallback/WmsServerFeignClientFallback.java
index 0c846f7..2e33cf4 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/fallback/WmsServerFeignClientFallback.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/fallback/WmsServerFeignClientFallback.java
@@ -15,7 +15,88 @@
 
     @Override
     public R queryInventoryDetails(InventoryQueryCondition condition) {
-        log.error("璋冪敤WMS Server搴撳瓨鏌ヨ鏄庣粏鎺ュ彛澶辫触锛岃Е鍙戦檷绾у鐞�");
-        return R.error("鏈嶅姟璋冪敤澶辫触锛岃绋嶅悗閲嶈瘯");
+        return queryInventoryDetails(condition, null);
+    }
+
+    /**
+     * 搴撳瓨鏌ヨ鏄庣粏闄嶇骇澶勭悊锛堝甫寮傚父淇℃伅锛�
+     * @param condition 鏌ヨ鏉′欢
+     * @param throwable 寮傚父淇℃伅锛堝彲閫夛級
+     * @return 閿欒鍝嶅簲
+     */
+    public R queryInventoryDetails(InventoryQueryCondition condition, Throwable throwable) {
+        log.error("璋冪敤WMS Server搴撳瓨鏌ヨ鏄庣粏鎺ュ彛澶辫触锛岃Е鍙戦檷绾у鐞�", throwable);
+        String errorMessage = filterErrorMessage(throwable);
+        return R.error(errorMessage);
+    }
+
+    @Override
+    public R queryInventorySummary(InventoryQueryCondition condition) {
+        return queryInventorySummary(condition, null);
+    }
+
+    /**
+     * 搴撳瓨鏌ヨ姹囨�婚檷绾у鐞嗭紙甯﹀紓甯镐俊鎭級
+     * @param condition 鏌ヨ鏉′欢
+     * @param throwable 寮傚父淇℃伅锛堝彲閫夛級
+     * @return 閿欒鍝嶅簲
+     */
+    public R queryInventorySummary(InventoryQueryCondition condition, Throwable throwable) {
+        log.error("璋冪敤WMS Server搴撳瓨鏌ヨ姹囨�绘帴鍙eけ璐ワ紝瑙﹀彂闄嶇骇澶勭悊", throwable);
+        String errorMessage = filterErrorMessage(throwable);
+        return R.error(errorMessage);
+    }
+
+    /**
+     * 杩囨护閿欒娑堟伅涓殑URL锛屽彧淇濈暀閿欒绫诲瀷
+     * @param throwable 寮傚父瀵硅薄锛堝彲閫夛級
+     * @return 杩囨护鍚庣殑瀹屾暣閿欒娑堟伅锛堝寘鍚�"鏌ヨ澶辫触锛�"鍓嶇紑锛�
+     */
+    public static String filterErrorMessage(Throwable throwable) {
+        if (throwable == null) {
+            return "鏌ヨ澶辫触锛氭湇鍔¤皟鐢ㄥけ璐ワ紝璇风◢鍚庨噸璇�";
+        }
+        return filterErrorMessage(throwable.getMessage());
+    }
+
+    /**
+     * 杩囨护閿欒娑堟伅涓殑URL锛屽彧淇濈暀閿欒绫诲瀷
+     * @param errorMessage 閿欒娑堟伅瀛楃涓诧紙鍙�夛級
+     * @return 杩囨护鍚庣殑瀹屾暣閿欒娑堟伅锛堝寘鍚�"鏌ヨ澶辫触锛�"鍓嶇紑锛�
+     */
+    public static String filterErrorMessage(String errorMessage) {
+        if (errorMessage == null || errorMessage.isEmpty()) {
+            return "鏌ヨ澶辫触锛氭湭鐭ラ敊璇�";
+        }
+        
+        String filteredMessage = errorMessage;
+        
+        // 濡傛灉鍖呭惈"executing"锛岃鏄庢槸HTTP璇锋眰閿欒锛屽幓鎺塙RL閮ㄥ垎
+        if (filteredMessage.contains("executing")) {
+            int executingIndex = filteredMessage.indexOf("executing");
+            if (executingIndex > 0) {
+                // 鎻愬彇"executing"涔嬪墠鐨勯儴鍒嗭紙濡�"Read timed out"锛�
+                filteredMessage = filteredMessage.substring(0, executingIndex).trim();
+            } else {
+                // 濡傛灉"executing"鍦ㄥ紑澶达紝浣跨敤榛樿閿欒娑堟伅
+                filteredMessage = "璇锋眰瓒呮椂";
+            }
+        }
+        // 濡傛灉鍖呭惈"http://"鎴�"https://"锛屼篃灏濊瘯鍘绘帀URL閮ㄥ垎
+        else if (filteredMessage.contains("http://") || filteredMessage.contains("https://")) {
+            // 浣跨敤姝e垯琛ㄨ揪寮忓幓鎺塙RL
+            filteredMessage = filteredMessage.replaceAll("https?://[^\\s]+", "").trim();
+            if (filteredMessage.isEmpty()) {
+                filteredMessage = "璇锋眰澶辫触";
+            }
+        }
+        
+        // 濡傛灉杩囨护鍚庣殑娑堟伅涓虹┖锛屼娇鐢ㄩ粯璁ら敊璇秷鎭�
+        if (filteredMessage.isEmpty()) {
+            filteredMessage = "鏈煡閿欒";
+        }
+        
+        // 杩斿洖鍖呭惈"鏌ヨ澶辫触锛�"鍓嶇紑鐨勫畬鏁撮敊璇秷鎭�
+        return "鏌ヨ澶辫触锛�" + filteredMessage;
     }
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java
index b5daeb8..8f328d5 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java
@@ -143,9 +143,9 @@
     @OperationLog("WCS浠诲姟涓婃姤閫氱煡")
     @PostMapping("/task/report")
     public R wcsTaskReport(@RequestBody TaskReportParam params) {
-        if (params.getType() != 0){
-            return wcsService.wcsTaskReport2(params);
-        }
+//        if (params.getType() != 0){
+//            return wcsService.wcsTaskReport2(params);
+//        }
         return wcsService.wcsTaskReport(params);
     }
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/ErpQueryController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/ErpQueryController.java
index c70bf3d..36457c8 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/ErpQueryController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/ErpQueryController.java
@@ -121,4 +121,22 @@
         return receiveMsgService.erpQueryInventoryDetails(condition);
     }
 
+    /**
+     * ERP搴撳瓨鏌ヨ姹囨�伙紙渚沷pen-api妯″潡璋冪敤锛�
+     * 瀵瑰簲open-api鐨� /inventory/summary 鎺ュ彛
+     * @param condition 鏌ヨ鏉′欢
+     * @return 搴撳瓨姹囨�诲垪琛�
+     */
+    @PostMapping("/inventory/summary")
+    @ApiOperation(value = "ERP搴撳瓨鏌ヨ姹囨��", hidden = true)
+    @OperationLog("ERP搴撳瓨鏌ヨ姹囨��")
+    public R erpQueryInventorySummary(@RequestBody InventoryQueryConditionParam condition) {
+        // 鍙傛暟楠岃瘉
+        if (condition == null) {
+            return R.error("鏌ヨ鏉′欢涓嶈兘涓虹┖");
+        }
+        
+        return receiveMsgService.erpQueryInventorySummary(condition);
+    }
+
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/CallBackEvent.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/CallBackEvent.java
index d7a2dcb..a633c0a 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/CallBackEvent.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/CallBackEvent.java
@@ -12,7 +12,6 @@
     CALL_BACK_EVENT_OBIT("OTBIN", "鎼繍涓�"),
     CALL_BACK_EVENT_BIN("BIN", "鍑虹珯"),
     CALL_BACK_EVENT_END("END", "鏀剧瀹屾垚"),
-    CALL_BACK_EVENT_TRANSFER("TRANSFER", "涓浆"),
     ;
 
     CallBackEvent( String event,  String desc) {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java
index 78a0464..f9b7559 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java
@@ -159,4 +159,11 @@
      * @return 搴撳瓨鏄庣粏鍒楄〃
      */
     R erpQueryInventoryDetails(InventoryQueryConditionParam condition);
+
+    /**
+     * 搴撳瓨鏌ヨ姹囨�伙紙渚沷pen-api璋冪敤锛�
+     * @param condition 鏌ヨ鏉′欢
+     * @return 搴撳瓨姹囨�诲垪琛�
+     */
+    R erpQueryInventorySummary(InventoryQueryConditionParam condition);
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java
index 7b7e4c9..adbcaeb 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java
@@ -327,7 +327,7 @@
             throw new CoolException("绔欑偣鐘舵�佷笉涓虹┖闂�");
         }
         if (basStation.getType().equals(StationTypeEnum.STATION_TYPE_MUTI.type)) {
-            throw new CoolException("绔欑偣涓烘櫤鑳界珯鐐癸紝绂佹鍛煎彨AGV");
+            throw new CoolException("绔欑偣涓哄厜鐢电珯鐐癸紝绂佹鍛煎彨AGV");
         }
 
         List<String> areaList = JSONObject.parseArray(basStation.getCrossZoneArea(), String.class);
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/InBoundServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/InBoundServiceImpl.java
index c50d583..4ac1630 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/InBoundServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/InBoundServiceImpl.java
@@ -182,6 +182,9 @@
         }
         StringBuilder errorBuilder = new StringBuilder();
         List<Long> areaTypeList = LocUtils.getAreaTypeList(station.getStationName());
+        if (areaTypeList.isEmpty()) {
+            throw new CoolException("鏈煡璇㈠埌璧风偣鍙叆搴撳尯锛堝簱浣嶈鍒欐湭閰嶇疆锛夛紒锛侊紒");
+        }
         for (Long areaType : areaTypeList) {
             if (errorBuilder.length() > 0) {
                 errorBuilder.append(",");
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java
index f771b8f..cd0ab43 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java
@@ -1200,4 +1200,186 @@
 
         return details;
     }
+
+    /**
+     * 搴撳瓨鏌ヨ姹囨�伙紙渚沷pen-api璋冪敤锛�
+     *
+     * @param condition 鏌ヨ鏉′欢瀹炰綋绫�
+     * @return 搴撳瓨姹囨�诲垪琛�
+     */
+    @Override
+    public R erpQueryInventorySummary(InventoryQueryConditionParam condition) {
+        try {
+            // 鍙傛暟楠岃瘉
+            if (condition == null) {
+                return R.error("鏌ヨ鏉′欢涓嶈兘涓虹┖");
+            }
+
+            // 灏咵RP鍙傛暟鏄犲皠涓烘暟鎹簱瀛楁鍚嶏紙涓嬪垝绾挎牸寮忥級
+            Map<String, Object> queryMap = new HashMap<>();
+            
+            // 浠庡疄浣撶被涓彁鍙栨煡璇㈡潯浠讹紝鏄犲皠涓虹湡瀹炵殑鏁版嵁搴撳瓧娈靛悕
+            if (StringUtils.isNotBlank(condition.getMatNr())) {
+                queryMap.put("matnr_code", condition.getMatNr());
+            }
+            if (StringUtils.isNotBlank(condition.getPlanNo())) {
+                queryMap.put("track_code", condition.getPlanNo());
+            }
+            if (StringUtils.isNotBlank(condition.getBatch())) {
+                queryMap.put("batch", condition.getBatch());
+            }
+
+            BaseParam baseParam = new BaseParam();
+            baseParam.syncMap(queryMap);
+            PageParam<LocItem, BaseParam> pageParam = new PageParam<>(baseParam, LocItem.class);
+
+            QueryWrapper<LocItem> wrapper = pageParam.buildWrapper(false);
+
+            // 鐗╂枡缁勶紙闇�瑕侀�氳繃鐗╂枡琛ㄥ叧鑱旀煡璇級
+            if (StringUtils.isNotBlank(condition.getMatGroup())) {
+                // 璋冪敤鐗╂枡Service鏌ヨ鐗╂枡缁勫搴旂殑鐗╂枡ID鍒楄〃锛堝鐢ㄥ凡鏈夋柟娉曪級
+                LambdaQueryWrapper<Matnr> matnrWrapper = new LambdaQueryWrapper<>();
+                matnrWrapper.eq(Matnr::getGroupId, condition.getMatGroup());
+                List<Matnr> matnrs = matnrService.list(matnrWrapper);
+                if (!matnrs.isEmpty()) {
+                    List<Long> matnrIds = matnrs.stream().map(Matnr::getId).collect(Collectors.toList());
+                    wrapper.in("matnr_id", matnrIds);
+                } else {
+                    // 濡傛灉娌℃湁鎵惧埌鐗╂枡锛岃繑鍥炵┖缁撴灉
+                    return R.ok().add(new ArrayList<>());
+                }
+            }
+
+            // 鍙煡璇㈡甯哥姸鎬佺殑搴撳瓨锛坰tatus=1琛ㄧず姝e父锛�
+            wrapper.eq("status", 1);
+
+            // 璁剧疆鍒嗛〉鍙傛暟锛屾煡璇㈡墍鏈夋暟鎹敤浜庢眹鎬�
+            pageParam.setCurrent(1);
+            pageParam.setSize(Integer.MAX_VALUE);
+            PageParam<LocItem, BaseParam> pageResult = locItemService.page(pageParam, wrapper);
+            List<LocItem> locItems = pageResult.getRecords();
+
+            if (locItems.isEmpty()) {
+                return R.ok().add(new ArrayList<>());
+            }
+
+            // 鑾峰彇鎵�鏈夐渶瑕佸叧鑱旂殑ID
+            List<Long> locIds = locItems.stream()
+                    .map(LocItem::getLocId)
+                    .filter(Objects::nonNull)
+                    .distinct()
+                    .collect(Collectors.toList());
+
+            List<Long> warehouseIds = new ArrayList<>();
+
+            // 璋冪敤LocService鏌ヨ搴撲綅淇℃伅锛堝鐢⊿ervice灞傛柟娉曪級
+            Map<Long, Loc> locMap = new HashMap<>();
+            if (!locIds.isEmpty()) {
+                List<Loc> locs = locService.listByIds(locIds);
+                locMap = locs.stream().collect(Collectors.toMap(Loc::getId, loc -> loc));
+
+                // 鏀堕泦浠撳簱ID
+                warehouseIds = locs.stream()
+                        .map(Loc::getWarehouseId)
+                        .filter(Objects::nonNull)
+                        .distinct()
+                        .collect(Collectors.toList());
+            }
+
+            // 浠撳簱缂栫爜杩囨护
+            if (StringUtils.isNotBlank(condition.getWareHouseId())) {
+                String wareHouseId = condition.getWareHouseId();
+                LambdaQueryWrapper<Warehouse> whWrapper = new LambdaQueryWrapper<>();
+                whWrapper.eq(Warehouse::getCode, wareHouseId);
+                // 璋冪敤WarehouseService鏌ヨ浠撳簱淇℃伅锛堝鐢⊿ervice灞傛柟娉曪級
+                List<Warehouse> warehouses = warehouseService.list(whWrapper);
+                if (!warehouses.isEmpty()) {
+                    Long targetWarehouseId = warehouses.get(0).getId();
+                    // 杩囨护搴撲綅锛屽彧淇濈暀鐩爣浠撳簱鐨勫簱浣�
+                    locMap = locMap.entrySet().stream()
+                            .filter(entry -> Objects.equals(entry.getValue().getWarehouseId(), targetWarehouseId))
+                            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+
+                    // 杩囨护locItems锛屽彧淇濈暀鐩爣浠撳簱鐨�
+                    Set<Long> validLocIds = locMap.keySet();
+                    locItems = locItems.stream()
+                            .filter(item -> item.getLocId() != null && validLocIds.contains(item.getLocId()))
+                            .collect(Collectors.toList());
+
+                    warehouseIds = Collections.singletonList(targetWarehouseId);
+                } else {
+                    return R.ok().add(new ArrayList<>());
+                }
+            }
+
+            // 璋冪敤WarehouseService鏌ヨ浠撳簱淇℃伅锛堝鐢⊿ervice灞傛柟娉曪級
+            Map<Long, Warehouse> warehouseMap = new HashMap<>();
+            if (!warehouseIds.isEmpty()) {
+                List<Warehouse> warehouses = warehouseService.listByIds(warehouseIds);
+                warehouseMap = warehouses.stream().collect(Collectors.toMap(Warehouse::getId, wh -> wh));
+            }
+
+            // 鎸変粨搴撱�佺墿鏂欍�佹壒鍙枫�佸簱瀛樼粍缁囧垎缁勬眹鎬�
+            // 浣跨敤Map鐨刱ey浣滀负鍒嗙粍閿細wareHouseId_matNr_batch_stockOrgId
+            Map<String, Map<String, Object>> summaryMap = new HashMap<>();
+            
+            for (LocItem locItem : locItems) {
+                // 鑾峰彇浠撳簱淇℃伅
+                Loc loc = null;
+                if (locItem.getLocId() != null) {
+                    loc = locMap.get(locItem.getLocId());
+                }
+                
+                if (loc == null) {
+                    continue;
+                }
+                
+                Warehouse warehouse = null;
+                if (loc.getWarehouseId() != null && warehouseMap.containsKey(loc.getWarehouseId())) {
+                    warehouse = warehouseMap.get(loc.getWarehouseId());
+                }
+                
+                if (warehouse == null) {
+                    continue;
+                }
+                
+                // 鏋勫缓鍒嗙粍閿細wareHouseId_matNr_batch_stockOrgId
+                String wareHouseId = warehouse.getCode();
+                String matNr = locItem.getMatnrCode();
+                String batch = locItem.getBatch() != null ? locItem.getBatch() : "";
+                String stockOrgId = locItem.getUseOrgId() != null ? locItem.getUseOrgId() : "";
+                String groupKey = wareHouseId + "_" + matNr + "_" + batch + "_" + stockOrgId;
+                
+                // 濡傛灉璇ュ垎缁勫凡瀛樺湪锛岀疮鍔犳暟閲�
+                if (summaryMap.containsKey(groupKey)) {
+                    Map<String, Object> summary = summaryMap.get(groupKey);
+                    Double currentAnfme = (Double) summary.get("anfme");
+                    Double newAnfme = currentAnfme + (locItem.getAnfme() != null ? locItem.getAnfme() : 0.0);
+                    summary.put("anfme", newAnfme);
+                } else {
+                    // 鍒涘缓鏂扮殑姹囨�昏褰�
+                    Map<String, Object> summary = new HashMap<>();
+                    summary.put("wareHouseId", wareHouseId);
+                    summary.put("wareHouseName", warehouse.getName());
+                    summary.put("matNr", matNr);
+                    summary.put("matTx", locItem.getMaktx());
+                    summary.put("spec", locItem.getSpec());
+                    summary.put("unit", locItem.getUnit());
+                    summary.put("anfme", locItem.getAnfme() != null ? locItem.getAnfme() : 0.0);
+                    summary.put("batch", locItem.getBatch());
+                    summary.put("stockOrgId", locItem.getUseOrgId());
+                    summary.put("planNo", locItem.getTrackCode());
+                    summaryMap.put(groupKey, summary);
+                }
+            }
+
+            // 杞崲涓哄垪琛�
+            List<Map<String, Object>> result = new ArrayList<>(summaryMap.values());
+
+            return R.ok().add(result);
+        } catch (Exception e) {
+            log.error("搴撳瓨鏌ヨ姹囨�诲け璐�", e);
+            return R.error("鏌ヨ澶辫触锛�" + e.getMessage());
+        }
+    }
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
index 2d28fc9..fc647cb 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
@@ -31,8 +31,8 @@
 import com.vincent.rsf.server.manager.service.impl.LocServiceImpl;
 import com.vincent.rsf.server.system.constant.SerialRuleCode;
 import com.vincent.rsf.server.manager.enums.LocStsType;
-import com.vincent.rsf.server.system.entity.User;
-import com.vincent.rsf.server.system.service.impl.UserServiceImpl;
+import com.vincent.rsf.server.system.entity.*;
+import com.vincent.rsf.server.system.service.impl.*;
 import com.vincent.rsf.server.system.utils.SerialRuleUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -86,6 +86,14 @@
     private RemotesInfoProperties.RcsApi rcsApi;
     @Autowired
     private UserServiceImpl userService;
+    @Autowired
+    private TaskInstanceServiceImpl taskInstanceService;
+    @Autowired
+    private TaskInstanceNodeServiceImpl taskInstanceNodeService;
+    @Autowired
+    private FlowStepInstanceServiceImpl flowStepInstanceService;
+    @Autowired
+    private FlowInstanceServiceImpl flowInstanceService;
 
 
     @Override
@@ -477,9 +485,40 @@
         if (Objects.isNull(task)) {
             throw new CoolException("浠诲姟涓嶅瓨鍦ㄥ彲浠ョ粨鏉燂紒锛�");
         }
+        FlowStepInstance flowStepInstance = flowStepInstanceService.getOne(new LambdaQueryWrapper<FlowStepInstance>()
+                .eq(FlowStepInstance::getTaskNo, task.getTaskCode())
+                .eq(FlowStepInstance::getWmsNowTaskStatus, task.getTaskStatus())
+                .eq(FlowStepInstance::getStatus, (short) 1).last("limit 1"));
+        if (Cools.isEmpty(flowStepInstance)){
+            return R.error(task.getTaskCode()+"浠诲姟鍙�==>鏈煡璇㈠埌鐩稿叧浠诲姟鎵ц娴佺▼锛侊紒锛�");
+        }
+        if (!MissionStepType.getTaskRECEIVE().contains(flowStepInstance.getStepType())){
+            return R.error(task.getTaskCode()+"浠诲姟鍙�==>鐩稿叧浠诲姟绫诲瀷闈炴帴鏀跺瀷锛屾楠ら敊涔憋紒锛侊紒");
+        }
+
+        FlowInstance flowInstance = flowInstanceService.getById(flowStepInstance.getFlowInstanceId());
+        if (Cools.isEmpty(flowInstance)) {
+            return R.error(task.getTaskCode()+"浠诲姟鍙�==>鏈煡璇㈠埌鐩稿叧浠诲姟鎵ц娴佺▼锛侊紒锛�");
+        }
+        List<FlowStepInstance> flowStepInstances = flowStepInstanceService.list(new LambdaQueryWrapper<FlowStepInstance>()
+                .eq(FlowStepInstance::getFlowInstanceId, flowInstance.getId()).eq(FlowStepInstance::getStatus, (short) 0));
+        flowInstance.setStatus(flowStepInstances.isEmpty()? (short) 2:(short) 1);
+        TaskInstanceNode taskInstanceNode = taskInstanceNodeService.getById(flowInstance.getNodeInstanceId());
+        if (Cools.isEmpty(taskInstanceNode)) {
+            return R.error(task.getTaskCode()+"浠诲姟鍙�==>鏈煡璇㈠埌鐩稿叧浠诲姟鎵ц娴佺▼锛侊紒锛�");
+        }
+        taskInstanceNode.setStatus(flowInstance.getStatus());
+        TaskInstance taskInstance = taskInstanceService.getById(flowInstance.getTaskId());
+        if (Cools.isEmpty(taskInstance)) {
+            return R.error(task.getTaskCode()+"浠诲姟鍙�==>鏈煡璇㈠埌鐩稿叧浠诲姟鎵ц娴佺▼锛侊紒锛�");
+        }
+
 
         /**鏂欑鎼繍涓紝 淇敼绔欑偣鐘舵��*/
         if (params.getEventType().equals(CallBackEvent.CALL_BACK_EVENT_BIN.event)) {
+            if (!flowStepInstance.getStepType().equals(MissionStepType.MISSION_STEP_TYPE_RECEIVE_BIN.type)) {
+                return R.error(task.getTaskCode()+"浠诲姟鍙�==>鏈煡璇㈠埌鐩稿叧浠诲姟鎵ц娴佺▼锛侊紒锛�");
+            }
             if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)
                     || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)
                     || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)
@@ -504,92 +543,47 @@
                     || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type)
                     || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type)
                     || task.getTaskType().equals(TaskType.TASK_TYPE_EMPTY_OUT.type)) {
-
-
-                /**淇敼鍑哄簱绔欑偣鐘舵��*/
-                BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
-                        .eq(BasStation::getStationName, task.getOrgLoc()));
-                if (Objects.isNull(station)) {
-                    throw new CoolException("鏁版嵁閿欒锛岀珯鐐逛笉瀛樺湪锛侊紒");
-                }
-                if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) {
-                    station.setUseStatus(LocStsType.LOC_STS_TYPE_O.type);
-                    station.setBarcode(null);
-                    if (!basStationService.updateById(station)) {
-                        throw new CoolException("绔欑偣鐘舵�佷慨鏀瑰け璐ワ紒锛�");
-                    }
-                }
+//                /**淇敼鍑哄簱绔欑偣鐘舵��*/
+//                BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
+//                        .eq(BasStation::getStationName, task.getOrgLoc()));
+//                if (Objects.isNull(station)) {
+//                    throw new CoolException("鏁版嵁閿欒锛岀珯鐐逛笉瀛樺湪锛侊紒");
+//                }
+//                if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) {
+//                    station.setUseStatus(LocStsType.LOC_STS_TYPE_O.type);
+//                    station.setBarcode(null);
+//                    if (!basStationService.updateById(station)) {
+//                        throw new CoolException("绔欑偣鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+//                    }
+//                }
             }
             /**鍙栫瀹屾垚锛� 淇敼浠诲姟鐘舵��*/
-        } else
-        if (params.getEventType().equals(CallBackEvent.CALL_BACK_EVENT_END.event)) {
-            if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)
-                    || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)
-                    || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)
-                    || task.getTaskType().equals(TaskType.TASK_TYPE_EMPTY_IN.type)
-                    || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type)
-                    || task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) {
-
-                if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) {
-                    BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getOrgSite()));
-                    if (Objects.isNull(station)) {
-                        throw new CoolException("鏁版嵁閿欒锛岀珯鐐逛笉瀛樺湪锛侊紒");
-                    }
-                    if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) {
-                        station.setUseStatus(LocStsType.LOC_STS_TYPE_O.type);
-                        if (!basStationService.updateById(station)) {
-                            throw new CoolException("绔欑偣鐘舵�佷慨鏀瑰け璐ワ紒锛�");
-                        }
-                    }
-                }
-
-                if (!taskService.update(new LambdaUpdateWrapper<Task>()
-                        .lt(Task::getTaskStatus, TaskStsType.COMPLETE_IN.id)
-                        .eq(Task::getTaskCode, task.getTaskCode())
-                        .set(Task::getTaskStatus, TaskStsType.COMPLETE_IN.id))) {
-                    throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
-                }
-            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type)
-                    || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)
-                    || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type)
-                    || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type)
-                    || task.getTaskType().equals(TaskType.TASK_TYPE_EMPTY_OUT.type)) {
-
-
-                /**淇敼鍑哄簱绔欑偣鐘舵��*/
-                BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
-                        .eq(BasStation::getStationName, task.getTargSite()));
-                if (Objects.isNull(station)) {
-                    throw new CoolException("鏁版嵁閿欒锛岀珯鐐逛笉瀛樺湪锛侊紒");
-                }
-                if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) {
-                    station.setUseStatus(LocStsType.LOC_STS_TYPE_F.type);
-                    if (!basStationService.updateById(station)) {
-                        throw new CoolException("绔欑偣鐘舵�佷慨鏀瑰け璐ワ紒锛�");
-                    }
-                }
-
-                if (!taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode())
-                        .lt(Task::getTaskStatus, TaskStsType.COMPLETE_OUT.id)
-                        .set(Task::getTaskStatus, TaskStsType.AWAIT.id))) {
-                    throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
-                }
+        } else if (params.getEventType().equals(CallBackEvent.CALL_BACK_EVENT_END.event)) {
+            if (flowStepInstance.getStepType().equals(MissionStepType.MISSION_STEP_TYPE_RECEIVE_BIN.type)) {
+                return R.error(task.getTaskCode()+"浠诲姟鍙�==>璇峰厛鍑虹珯璇锋眰锛侊紒锛�");
             }
-        } else if (params.getEventType().equals(CallBackEvent.CALL_BACK_EVENT_TRANSFER.event)) {
-            if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)
-                    || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)
-                    || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)
-                    || task.getTaskType().equals(TaskType.TASK_TYPE_EMPTY_IN.type)
-                    || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type)
-                    || task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) {
-                if (!taskService.update(new LambdaUpdateWrapper<Task>()
-                        .lt(Task::getTaskStatus, TaskStsType.WCS_EXECUTE_IN.id)
-                        .eq(Task::getTaskCode, task.getTaskCode())
-                        .set(Task::getOrgSite, task.getTargSite())
-                        .set(Task::getTaskStatus, TaskStsType.WCS_EXECUTE_IN.id))) {
-                    throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
-                }
+        }
+
+
+        task.setTaskStatus(flowStepInstance.getWmsNextTaskStatus());
+        flowStepInstance.setStatus((short)3);
+
+        flowStepInstanceService.updateById(flowStepInstance);
+        taskService.updateById(task);
+        if (flowStepInstance.getWmsNextTaskStatus() != 9999) {
+            FlowStepInstance nextFlowStepInstance = flowStepInstanceService.getOne(new LambdaQueryWrapper<FlowStepInstance>()
+                    .eq(FlowStepInstance::getStatus, (short)0)
+                    .eq(FlowStepInstance::getStepOrder, flowStepInstance.getStepOrder() + 1)
+                    .eq(FlowStepInstance::getWmsNowTaskStatus, flowStepInstance.getWmsNextTaskStatus()));
+            if (Cools.isEmpty(nextFlowStepInstance)) {
+                return R.error(task.getTaskCode()+"浠诲姟鍙�==>鏈煡璇㈠埌鐩稿叧浠诲姟鎵ц娴佺▼锛侊紒锛�");
             }
+            nextFlowStepInstance.setStatus((short)1);
+
+            flowStepInstanceService.updateById(nextFlowStepInstance);
+        } else {
+            taskInstance.setStatus((short)2);
+            taskInstanceService.updateById(taskInstance);
         }
         log.info(JSONObject.toJSONString(params));
         return R.ok(JSONObject.toJSONString(params));
@@ -999,8 +993,8 @@
         }
         Task one = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, params.getBarcode()));
         if (!Cools.isEmpty(one)) {
-            if (!one.getTaskStatus().equals(TaskStsType.WCS_EXECUTE_IN.id)) {
-                return R.error("浠诲姟宸插瓨鍦ㄤ絾鏄姸鎬佷笉涓�鑷达紒锛侊紒").add("浠诲姟宸插瓨鍦ㄤ絾鏄姸鎬佷笉涓�鑷达紒锛侊紒");
+            if (one.getTaskStatus().equals(TaskStsType.MISSION_TRANSFER.id)) {
+                return R.error("浠诲姟宸插瓨鍦ㄤ絾鏄姸鎬佷笉涓�鑷达紒锛侊紒").add("浠诲姟宸插瓨鍦ㄤ絾鏄姸鎬佷笉涓�鑷达紒锛侊紒浠诲姟宸插畬鎴愶紒锛侊紒");
             }
             InTaskWcsReportParam inTaskWcsReportParam = new InTaskWcsReportParam();
             inTaskWcsReportParam.setTaskNo(one.getTaskCode());
@@ -1046,18 +1040,68 @@
         if (Objects.isNull(params)) {
             return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
-        Task one = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskCode, params.getSuperTaskNo()));
-        if (Cools.isEmpty(one)) {
+        Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskCode, params.getSuperTaskNo()));
+        if (Cools.isEmpty(task)) {
             return R.error(params.getSuperTaskNo()+"浠诲姟鍙�==>鏈煡璇㈠埌鐩稿叧浠诲姟锛侊紒锛�");
         }
         if (params.getMsgType().equals(WcsMsgTypeEvent.TASK_COMPLETE.event)){
-            if (!Cools.isEmpty(one)) {
-                one.setTaskStatus(one.getTaskType() < 100 ? TaskStsType.COMPLETE_IN.id : TaskStsType.AWAIT.id);
-                if (!taskService.updateById(one)) {
-//                    throw new CoolException("瀹屾垚浠诲姟澶辫触");
-                    return R.error("瀹屾垚浠诲姟澶辫触").add(one);
+            if (!Cools.isEmpty(task)) {
+                FlowStepInstance flowStepInstance = flowStepInstanceService.getOne(new LambdaQueryWrapper<FlowStepInstance>()
+                        .eq(FlowStepInstance::getTaskNo, task.getTaskCode())
+                        .eq(FlowStepInstance::getWmsNowTaskStatus, task.getTaskStatus())
+                        .eq(FlowStepInstance::getStatus, (short) 1).last("limit 1"));
+                if (Cools.isEmpty(flowStepInstance)){
+                    return R.error(params.getSuperTaskNo()+"浠诲姟鍙�==>鏈煡璇㈠埌鐩稿叧浠诲姟鎵ц娴佺▼锛侊紒锛�");
                 }
-                return R.ok("浠诲姟瀹屾垚鎴愬姛").add(one);
+
+                if (!MissionStepType.getTaskRECEIVE().contains(flowStepInstance.getStepType())){
+                    return R.error(params.getSuperTaskNo()+"浠诲姟鍙�==>鐩稿叧浠诲姟绫诲瀷闈炴帴鏀跺瀷锛屾楠ら敊涔憋紒锛侊紒");
+                }
+
+                FlowInstance flowInstance = flowInstanceService.getById(flowStepInstance.getFlowInstanceId());
+                if (Cools.isEmpty(flowInstance)) {
+                    return R.error(params.getSuperTaskNo()+"浠诲姟鍙�==>鏈煡璇㈠埌鐩稿叧浠诲姟鎵ц娴佺▼锛侊紒锛�");
+                }
+                List<FlowStepInstance> flowStepInstances = flowStepInstanceService.list(new LambdaQueryWrapper<FlowStepInstance>()
+                        .eq(FlowStepInstance::getFlowInstanceId, flowInstance.getId()).eq(FlowStepInstance::getStatus, (short) 0));
+                flowInstance.setStatus(flowStepInstances.isEmpty()? (short) 2:(short) 1);
+                TaskInstanceNode taskInstanceNode = taskInstanceNodeService.getById(flowInstance.getNodeInstanceId());
+                if (Cools.isEmpty(taskInstanceNode)) {
+                    return R.error(params.getSuperTaskNo()+"浠诲姟鍙�==>鏈煡璇㈠埌鐩稿叧浠诲姟鎵ц娴佺▼锛侊紒锛�");
+                }
+                taskInstanceNode.setStatus(flowInstance.getStatus());
+                TaskInstance taskInstance = taskInstanceService.getById(flowInstance.getTaskId());
+                if (Cools.isEmpty(taskInstance)) {
+                    return R.error(params.getSuperTaskNo()+"浠诲姟鍙�==>鏈煡璇㈠埌鐩稿叧浠诲姟鎵ц娴佺▼锛侊紒锛�");
+                }
+                task.setTaskStatus(flowStepInstance.getWmsNextTaskStatus());
+                flowStepInstance.setStatus((short)3);
+
+                flowStepInstanceService.updateById(flowStepInstance);
+                taskService.updateById(task);
+                if (flowStepInstance.getWmsNextTaskStatus() != 9999) {
+                    FlowStepInstance nextFlowStepInstance = flowStepInstanceService.getOne(new LambdaQueryWrapper<FlowStepInstance>()
+                            .eq(FlowStepInstance::getStatus, (short)0)
+                            .eq(FlowStepInstance::getStepOrder, flowStepInstance.getStepOrder() + 1)
+                            .eq(FlowStepInstance::getWmsNowTaskStatus, flowStepInstance.getWmsNextTaskStatus()));
+                    if (Cools.isEmpty(nextFlowStepInstance)) {
+                        return R.error(task.getTaskCode()+"浠诲姟鍙�==>鏈煡璇㈠埌鐩稿叧浠诲姟鎵ц娴佺▼锛侊紒锛�");
+                    }
+                    nextFlowStepInstance.setStatus((short)1);
+
+                    flowStepInstanceService.updateById(nextFlowStepInstance);
+                } else {
+                    taskInstance.setStatus((short)2);
+                    taskInstanceService.updateById(taskInstance);
+                }
+                return R.ok("浠诲姟瀹屾垚鎴愬姛").add(task);
+
+
+//                one.setTaskStatus(one.getTaskType() < 100 ? TaskStsType.COMPLETE_IN.id : TaskStsType.AWAIT.id);
+//                if (!taskService.updateById(one)) {
+////                    throw new CoolException("瀹屾垚浠诲姟澶辫触");
+//                    return R.error("瀹屾垚浠诲姟澶辫触").add(one);
+//                }
             }
         } else if (params.getMsgType().equals(WcsMsgTypeEvent.TASK_CANCEL.event)){
 //            if (!Cools.isEmpty(one)) {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/domain/PageParam.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/domain/PageParam.java
index 01bb3f2..4c952c0 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/domain/PageParam.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/domain/PageParam.java
@@ -8,7 +8,11 @@
 import com.vincent.rsf.framework.common.Cools;
 import com.vincent.rsf.framework.common.DateUtils;
 import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
 
+import javax.servlet.http.HttpServletRequest;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.*;
@@ -17,6 +21,7 @@
 /**
  * Created by vincent on 2/13/2024
  */
+@Slf4j
 public class PageParam<T, U extends BaseParam> extends Page<T> {
 
     private static final long serialVersionUID = 1L;
@@ -31,6 +36,11 @@
     private final boolean isToUnderlineCase;
 
     private final Class<T> cls;
+
+    /**
+     * 棰濆鐨勫瓧娈甸獙璇佺被鍒楄〃锛堢敤浜庢敮鎸� DTO銆乂O 绛夌被鐨勫瓧娈甸獙璇侊級
+     */
+    private List<Class<?>> additionalFieldClasses;
 
     public PageParam() {
         this(null);
@@ -129,7 +139,13 @@
 
         if (!Cools.isEmpty(where.getOrderBy())) {
             if (sortIsSQL(where.getOrderBy())) {
-                setOrders(parseOrderSQL(where.getOrderBy()));
+                List<OrderItem> orders = parseOrderSQL(where.getOrderBy());
+                // 濡傛灉鎵�鏈夋帓搴忓瓧娈甸兘鏃犳晥锛屼娇鐢ㄩ粯璁ゆ帓搴�
+                if (orders.isEmpty()) {
+                    queryWrapper.orderByDesc("create_time");
+                } else {
+                    setOrders(orders);
+                }
             }
         } else {
 //            queryWrapper.orderByDesc("create_time");
@@ -221,7 +237,13 @@
 
         if (!Cools.isEmpty(where.getOrderBy())) {
             if (sortIsSQL(where.getOrderBy())) {
-                setOrders(parseOrderSQL(where.getOrderBy()));
+                List<OrderItem> orders = parseOrderSQL(where.getOrderBy());
+                // 濡傛灉鎵�鏈夋帓搴忓瓧娈甸兘鏃犳晥锛屼娇鐢ㄩ粯璁ゆ帓搴�
+                if (orders.isEmpty()) {
+                    queryWrapper.orderByDesc("create_time");
+                } else {
+                    setOrders(orders);
+                }
             }
         } else {
 //            queryWrapper.orderByDesc("create_time");
@@ -282,10 +304,21 @@
     private List<OrderItem> parseOrderSQL(String orderSQL) {
         List<OrderItem> orders = new ArrayList<>();
         if (!Cools.isEmpty(orderSQL)) {
+            // 鑾峰彇瀹炰綋绫荤殑鏈夋晥瀛楁鍒楄〃
+            Set<String> validColumns = getValidColumns();
+            
             for (String item : orderSQL.split(",")) {
                 String[] temp = item.trim().split(" ");
                 if (!temp[0].isEmpty()) {
                     String column = this.isToUnderlineCase ? Utils.toSymbolCase(temp[0], '_') : temp[0];
+                    // 楠岃瘉瀛楁鏄惁瀛樺湪锛屽鏋滀笉瀛樺湪鍒欒烦杩�
+                    if (validColumns != null && !validColumns.isEmpty() && !validColumns.contains(column)) {
+                        // 鑾峰彇褰撳墠璇锋眰淇℃伅
+                        String requestInfo = getRequestInfo();
+//                        log.warn("璺宠繃鏃犳晥鐨勬帓搴忓瓧娈�: '{}' (鍘熷鍊�: '{}')锛屽疄浣撶被: {}锛岃姹傚湴鍧�: {}",
+//                                column, temp[0], cls != null ? cls.getSimpleName() : "null", requestInfo);
+                        continue;
+                    }
                     boolean asc = temp.length == 1 || !temp[temp.length - 1].toLowerCase().equals(ORDER_DESC_VALUE);
                     orders.add(new OrderItem(column, asc));
                 }
@@ -294,6 +327,100 @@
         return orders;
     }
 
+    /**
+     * 鑾峰彇褰撳墠璇锋眰淇℃伅锛堣矾寰勫拰鏂规硶锛�
+     * @return 璇锋眰淇℃伅瀛楃涓诧紝鏍煎紡锛欻TTP鏂规硶 璇锋眰璺緞
+     */
+    private String getRequestInfo() {
+        try {
+            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+            if (attributes != null) {
+                HttpServletRequest request = attributes.getRequest();
+                if (request != null) {
+                    String method = request.getMethod();
+                    String uri = request.getRequestURI();
+                    return String.format("%s %s", method, uri);
+                }
+            }
+        } catch (Exception e) {
+            // 蹇界暐寮傚父锛岄伩鍏嶅奖鍝嶄富娴佺▼
+            log.debug("鑾峰彇璇锋眰淇℃伅澶辫触: {}", e.getMessage());
+        }
+        return "鏈煡";
+    }
+
+    /**
+     * 鑾峰彇瀹炰綋绫荤殑鏈夋晥瀛楁鍒楄〃锛堢敤浜庨獙璇佹帓搴忓瓧娈碉級
+     * 鍖呮嫭锛氬疄浣撶被瀛楁銆佷互鍙婇澶栨寚瀹氱殑DTO/VO绫诲瓧娈�
+     * 娉ㄦ剰锛欱aseParam 鐨勫瓧娈垫槸鏌ヨ鍙傛暟锛屼笉鐢ㄤ簬鏁版嵁搴撳瓧娈甸獙璇�
+     */
+    private Set<String> getValidColumns() {
+        Set<String> columns = new HashSet<>();
+        
+        // 1. 鑾峰彇瀹炰綋绫伙紙cls锛夌殑瀛楁
+        if (cls != null) {
+            addFieldsFromClass(cls, columns);
+        }
+        
+        // 2. 鑾峰彇棰濆鎸囧畾鐨勭被锛圖TO/VO绛夛級鐨勫瓧娈�
+        if (additionalFieldClasses != null && !additionalFieldClasses.isEmpty()) {
+            for (Class<?> clazz : additionalFieldClasses) {
+                addFieldsFromClass(clazz, columns);
+            }
+        }
+        
+        return columns.isEmpty() ? null : columns;
+    }
+
+    /**
+     * 浠庢寚瀹氱被涓彁鍙栧瓧娈靛苟娣诲姞鍒伴泦鍚堜腑
+     * @param clazz 瑕佹彁鍙栧瓧娈电殑绫�
+     * @param columns 瀛楁闆嗗悎
+     */
+    private void addFieldsFromClass(Class<?> clazz, Set<String> columns) {
+        for (Field field : Cools.getAllFields(clazz)) {
+            // 璺宠繃 final銆乻tatic銆乼ransient 瀛楁
+            if (Modifier.isFinal(field.getModifiers())
+                    || Modifier.isStatic(field.getModifiers())
+                    || Modifier.isTransient(field.getModifiers())) {
+                continue;
+            }
+
+            // 璺宠繃鏍囪涓� exist=false 鐨勫瓧娈碉紙杩欎簺瀛楁涓嶅瓨鍦ㄤ簬鏁版嵁搴撲腑锛�
+            if (field.isAnnotationPresent(TableField.class)) {
+                TableField annotation = field.getAnnotation(TableField.class);
+                if (!annotation.exist()) {
+                    continue;
+                }
+            }
+
+            String column = Utils.toSymbolCase(field.getName(), '_');
+            columns.add(column);
+        }
+    }
+
+    /**
+     * 璁剧疆棰濆鐨勫瓧娈甸獙璇佺被鍒楄〃锛堢敤浜庢敮鎸� DTO銆乂O 绛夌被鐨勫瓧娈甸獙璇侊級
+     * @param classes 棰濆鐨勭被鍒楄〃
+     * @return 褰撳墠瀹炰緥锛屾敮鎸侀摼寮忚皟鐢�
+     */
+    public PageParam<T, U> setAdditionalFieldClasses(Class<?>... classes) {
+        if (classes != null && classes.length > 0) {
+            this.additionalFieldClasses = Arrays.asList(classes);
+        }
+        return this;
+    }
+
+    /**
+     * 璁剧疆棰濆鐨勫瓧娈甸獙璇佺被鍒楄〃锛堢敤浜庢敮鎸� DTO銆乂O 绛夌被鐨勫瓧娈甸獙璇侊級
+     * @param classes 棰濆鐨勭被鍒楄〃
+     * @return 褰撳墠瀹炰緥锛屾敮鎸侀摼寮忚皟鐢�
+     */
+    public PageParam<T, U> setAdditionalFieldClasses(List<Class<?>> classes) {
+        this.additionalFieldClasses = classes;
+        return this;
+    }
+
     public Map<String, Object> checkoutMap() {
         Map<String, Object> map = where.getMap();
         if (!Cools.isEmpty(where.getOrderBy())) {
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 eb42464..c5c7be2 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
@@ -34,7 +34,7 @@
 import java.io.Serializable;
 import java.util.Date;
 import java.util.stream.Collectors;
-
+import com.vincent.rsf.server.manager.service.BasStationService;
 @Data
 @Accessors(chain = true)
 @TableName("man_task")
@@ -390,5 +390,36 @@
                 return null;
         }
     }
+    /**
+     * 鑾峰彇婧愮珯鐐瑰悕绉帮紙绔欑偣缂栧彿 + 绔欑偣鍚嶇О锛�
+     */
+    public String getOrgSite$(){
+        if (Cools.isEmpty(this.orgSite)) {
+            return this.orgSite;
+        }
+        BasStationService basStationService = SpringUtils.getBean(BasStationService.class);
+        BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
+                .eq(BasStation::getStationName, this.orgSite));
+        if (!Cools.isEmpty(station) && !Cools.isEmpty(station.getStationId())) {
+            return this.orgSite + "(" + station.getStationId() + ")";
+        }
+        return this.orgSite;
+    }
+
+    /**
+     * 鑾峰彇鐩爣绔欑偣鍚嶇О锛堢珯鐐圭紪鍙� + 绔欑偣鍚嶇О锛�
+     */
+    public String getTargSite$(){
+        if (Cools.isEmpty(this.targSite)) {
+            return this.targSite;
+        }
+        BasStationService basStationService = SpringUtils.getBean(BasStationService.class);
+        BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
+                .eq(BasStation::getStationName, this.targSite));
+        if (!Cools.isEmpty(station) && !Cools.isEmpty(station.getStationId())) {
+            return this.targSite + "(" + station.getStationId() + ")";
+        }
+        return this.targSite;
+    }
 
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/MissionStepType.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/MissionStepType.java
index a417a16..76bbe56 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/MissionStepType.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/MissionStepType.java
@@ -1,5 +1,8 @@
 package com.vincent.rsf.server.manager.enums;
 
+import java.util.Arrays;
+import java.util.List;
+
 /**
  * @author Ryan
  * @version 1.0
@@ -10,13 +13,18 @@
 public enum MissionStepType {
     MISSION_STEP_TYPE_RESPONSE("RESPONSE", "鍝嶅簲"),
     MISSION_STEP_TYPE_RECEIVE("RECEIVE", "鎺ユ敹"),
+
+    MISSION_STEP_TYPE_RECEIVE_BIN("RECEIVE_BIN", "鎺ユ敹-瑙g粦"),
+
     MISSION_STEP_TYPE_REQUEST("REQUEST", "璇锋眰"),
-    MISSION_STEP_TYPE_BIND("BIND", "缁戝畾"),
     MISSION_STEP_TYPE_UNBIND("UNBIND", "瑙g粦"),
-    MISSION_STEP_TYPE_VALIDATE("VALIDATE", "鏍¢獙"),
-    MISSION_STEP_TYPE_TRANSFORM("TRANSFORM", "杞崲"),
+    MISSION_STEP_TYPE_BIND("BIND", "缁戝畾"),
     MISSION_STEP_TYPE_OBTAIN("OBTAIN", "鑾峰彇"),
     MISSION_STEP_TYPE_NO_EXECUTE("NO_EXECUTE", "瓒婅繃"),
+
+
+    MISSION_STEP_TYPE_VALIDATE("VALIDATE", "鏍¢獙"),
+    MISSION_STEP_TYPE_TRANSFORM("TRANSFORM", "杞崲"),
     ;
     public String type;
     public String desc;
@@ -26,4 +34,20 @@
         this.desc = desc;
     }
 
+    public static List<String> getTaskISSUE(){
+        return Arrays.asList(
+                MissionStepType.MISSION_STEP_TYPE_REQUEST.type,
+                MissionStepType.MISSION_STEP_TYPE_UNBIND.type,
+                MissionStepType.MISSION_STEP_TYPE_BIND.type,
+                MissionStepType.MISSION_STEP_TYPE_OBTAIN.type,
+                MissionStepType.MISSION_STEP_TYPE_NO_EXECUTE.type);
+    }
+
+    public static List<String> getTaskRECEIVE(){
+        return Arrays.asList(
+                MissionStepType.MISSION_STEP_TYPE_RESPONSE.type,
+                MissionStepType.MISSION_STEP_TYPE_RECEIVE_BIN.type,
+                MissionStepType.MISSION_STEP_TYPE_RECEIVE.type);
+    }
+
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskStsType.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskStsType.java
index 416fec2..6360354 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskStsType.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskStsType.java
@@ -36,38 +36,18 @@
 
 
 
-    MISSION_TEMPLATE_EXECUTE_WCS_ONE1("1001", "1001.WCS璇锋眰涓嬪彂涓�"),
-    MISSION_TEMPLATE_EXECUTE_WCS_ONE2("1002", "1002.WCS浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
-    MISSION_TEMPLATE_EXECUTE_HK_RCS_ONE1("1003", "1003.RCS璇锋眰涓嬪彂涓�"),
-    MISSION_TEMPLATE_EXECUTE_HK_RCS_ONE2("1004", "1004.RCS浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
-    MISSION_TEMPLATE_EXECUTE_HK_RCS_TWO1("1005", "1005.RCS璇锋眰涓嬪彂涓�"),
-    MISSION_TEMPLATE_EXECUTE_HK_RCS_TWO2("1006", "1006.RCS浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
-    MISSION_TEMPLATE_EXECUTE_WCS_TWO1("1007", "1007.WCS璇锋眰涓嬪彂涓�"),
-    MISSION_TEMPLATE_EXECUTE_WCS_TWO2("1008", "1008.WCS浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
-    MISSION_TEMPLATE_EXECUTE_WCS_THREE1("1009", "1009.WCS璇锋眰涓嬪彂涓�"),
-    MISSION_TEMPLATE_EXECUTE_WCS_THREE2("1010", "1010.WCS浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
-    MISSION_TEMPLATE_EXECUTE_WCS_FOUR1("1011", "1011.WCS璇锋眰涓嬪彂涓�"),
-    MISSION_TEMPLATE_EXECUTE_WCS_FOUR2("1012", "1012.WCS浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
-    MISSION_TEMPLATE_EXECUTE_WCS_FIVE1("1013", "1013.WCS璇锋眰涓嬪彂涓�"),
-    MISSION_TEMPLATE_EXECUTE_WCS_FIVE2("1014", "1014.WCS浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
-    MISSION_TEMPLATE_EXECUTE_HK_RCS_THREE1("1015", "1015.RCS璇锋眰涓嬪彂涓�"),
-    MISSION_TEMPLATE_EXECUTE_HK_RCS_THREE2("1016", "1016.RCS浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
-    MISSION_TEMPLATE_EXECUTE_WCS_SIX1("1017", "1017.WCS璇锋眰涓嬪彂涓�"),
-    MISSION_TEMPLATE_EXECUTE_WCS_SIX2("1018", "1018.WCS浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
-    MISSION_TEMPLATE_EXECUTE_WCS_SEVEN1("1019", "1019.WCS璇锋眰涓嬪彂涓�"),
-    MISSION_TEMPLATE_EXECUTE_WCS_SEVEN2("1020", "1020.WCS浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
-    MISSION_TEMPLATE_EXECUTE_HK_RCS_FOUR1("1021", "1021.RCS璇锋眰涓嬪彂涓�"),
-    MISSION_TEMPLATE_EXECUTE_HK_RCS_FOUR2("1022", "1022.RCS浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
-    MISSION_TEMPLATE_EXECUTE_HK_RCS_FIVE1("1023", "1023.RCS璇锋眰涓嬪彂涓�"),
-    MISSION_TEMPLATE_EXECUTE_HK_RCS_FIVE2("1024", "1024.RCS浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
-    MISSION_TEMPLATE_EXECUTE_WCS_EIGHT1("1025", "1025.WCS璇锋眰涓嬪彂涓�"),
-    MISSION_TEMPLATE_EXECUTE_WCS_EIGHT2("1026", "1026.WCS浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
-    MISSION_TEMPLATE_NO_EXECUTE1("1027", "1027.涓嶆墽琛屼换鍔�"),
-    MISSION_TEMPLATE_WEIGHING_ONE2("1028", "1028.绉伴噸浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
+    MISSION_TEMPLATE_EXECUTE_WCS_ONE11("1001", "WCS璇锋眰涓嬪彂涓�"),
+    MISSION_TEMPLATE_EXECUTE_WCS_ONE22("1002", "WCS浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
+    MISSION_TEMPLATE_EXECUTE_HK_RCS_ONE11("1003", "RCS璇锋眰涓嬪彂涓�"),
+    MISSION_TEMPLATE_EXECUTE_HK_RCS_ONE12("1004", "RCS浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
+    MISSION_TEMPLATE_EXECUTE_HK_RCS_ONE13("1005", "绛夊緟RCS鍑虹珯鍙嶉"),
 
-    MISSION_TEMPLATE_EXECUTE_HK_RCS_ONE3("1029", "1029.RCS缁戝畾鏁版嵁"),
-    MISSION_TEMPLATE_EXECUTE_HK_RCS_ONE4("1030", "1030.RCS瑙g粦鏁版嵁"),
+    MISSION_TEMPLATE_EXECUTE_HK_RCS_ONE3("1101", "RCS缁戝畾鏁版嵁"),
+    MISSION_TEMPLATE_EXECUTE_HK_RCS_ONE4("1102", "RCS瑙g粦鏁版嵁"),
 
+    MISSION_TEMPLATE_WEIGHING_ONE2("1901", "绉伴噸浣滀笟涓瓑寰呬笂鎶ュ畬鎴�"),
+
+    MISSION_TEMPLATE_NO_EXECUTE1("9998", "1005.涓嶆墽琛屼换鍔�"),
     MISSION_TRANSFER("9999", "9999.浠诲姟瀹屾垚涓�"),
     ;
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskMissionSchedules.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskMissionSchedules.java
index d33430a..f096f84 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskMissionSchedules.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskMissionSchedules.java
@@ -101,6 +101,10 @@
                 Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getOrgLoc()));
                 sou = loc.getAreaId().toString();
                 end = task.getTargSite();
+            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_CROSS_DOCKING_OUT.type)){
+                Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getOrgLoc()));
+                sou = loc.getAreaId().toString();
+                end = loc.getAreaId().toString();
             }
             List<TaskPathTemplateMerge> taskPathTemplateMergeList = taskPathTemplateMergeService.list(new LambdaQueryWrapper<TaskPathTemplateMerge>().eq(TaskPathTemplateMerge::getSourceType, sou).eq(TaskPathTemplateMerge::getTargetType, end));
             if (Objects.isNull(taskPathTemplateMergeList) || taskPathTemplateMergeList.isEmpty()) {
@@ -156,7 +160,7 @@
             }
             List<TaskPathTemplateNode> taskPathTemplateNodeList = taskPathTemplateNodeService.list(
                     new LambdaQueryWrapper<TaskPathTemplateNode>()
-                            .eq(TaskPathTemplateNode::getTemplateId, taskPathTemplate.getId()));
+                            .eq(TaskPathTemplateNode::getTemplateId, taskPathTemplate.getId()).orderByAsc(TaskPathTemplateNode::getNodeOrder));
 
             for (TaskPathTemplateNode taskPathTemplateNode : taskPathTemplateNodeList) {
                 List<SubsystemFlowTemplate> subsystemFlowTemplateList = subsystemFlowTemplateService.list(
@@ -167,7 +171,7 @@
                 for (SubsystemFlowTemplate subsystemFlowTemplate : subsystemFlowTemplateList) {
                     List<FlowStepTemplate> flowStepTemplateList = flowStepTemplateService.list(
                             new LambdaQueryWrapper<FlowStepTemplate>()
-                                    .eq(FlowStepTemplate::getFlowId, subsystemFlowTemplate.getId()));
+                                    .eq(FlowStepTemplate::getFlowId, subsystemFlowTemplate.getId()).orderByAsc(FlowStepTemplate::getStepOrder));
 
                     allFlowStepTemplates.addAll(flowStepTemplateList);
                 }
@@ -190,7 +194,7 @@
             }
             List<TaskPathTemplateNode> taskPathTemplateNodeList = taskPathTemplateNodeService.list(
                     new LambdaQueryWrapper<TaskPathTemplateNode>()
-                            .eq(TaskPathTemplateNode::getTemplateId, taskPathTemplate.getId()));
+                            .eq(TaskPathTemplateNode::getTemplateId, taskPathTemplate.getId()).orderByAsc(TaskPathTemplateNode::getNodeOrder));
 
             for (TaskPathTemplateNode taskPathTemplateNode : taskPathTemplateNodeList) {
                 TaskInstanceNode taskInstanceNode = new TaskInstanceNode(taskPathTemplateNode);
@@ -217,7 +221,7 @@
 
                     List<FlowStepTemplate> flowStepTemplateList = flowStepTemplateService.list(
                             new LambdaQueryWrapper<FlowStepTemplate>()
-                                    .eq(FlowStepTemplate::getFlowId, subsystemFlowTemplate.getId()));
+                                    .eq(FlowStepTemplate::getFlowId, subsystemFlowTemplate.getId()).orderByAsc(FlowStepTemplate::getStepOrder));
 
                     for (FlowStepTemplate flowStepTemplate : flowStepTemplateList) {
                         j++;
@@ -227,21 +231,21 @@
                         flowStepInstance.setStepOrder(j);
                         flowStepInstance.setStepCode(String.valueOf(snowflakeIdWorker.nextId()));
                         flowStepInstance.setWmsNowTaskStatus(flowStepTemplate.getWmsNowTaskStatus());
+                        flowStepInstance.setTaskNo(taskInstance.getTaskNo());
 
                         // 鍒ゆ柇鏄惁鏄渶鍚庝竴涓�
                         if (globalIndex < allFlowStepTemplates.size() - 1) {
                             // 涓嶆槸鏈�鍚庝竴涓紝鍙栦笅涓�涓殑WmsNowTaskStatus
                             FlowStepTemplate nextFlowStep = allFlowStepTemplates.get(globalIndex + 1);
                             flowStepInstance.setWmsNextTaskStatus(nextFlowStep.getWmsNowTaskStatus());
-                            if (globalIndex == 0){
-                                task.setTaskStatus(flowStepTemplate.getWmsNowTaskStatus());
-                                flowStepInstance.setStatus((short)1);
-                            }
                         } else {
                             // 鏄渶鍚庝竴涓紝璁剧疆涓�9999
                             flowStepInstance.setWmsNextTaskStatus(9999);
                         }
-
+                        if (globalIndex == 0){
+                            task.setTaskStatus(flowStepTemplate.getWmsNowTaskStatus());
+                            flowStepInstance.setStatus((short)1);
+                        }
                         flowStepInstanceService.save(flowStepInstance);
                         globalIndex++; // 鏇存柊鍏ㄥ眬绱㈠紩
                     }
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 bc90f6a..af89fb0 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
@@ -113,19 +113,17 @@
     @Scheduled(cron = "0/2 * * * * ?  ")
     @Transactional(rollbackFor = Exception.class)
     public void missionTaskEXECUTE() {
-        List<String> typeList = Arrays.asList(
-                MissionStepType.MISSION_STEP_TYPE_REQUEST.type,
-                MissionStepType.MISSION_STEP_TYPE_UNBIND.type,
-                MissionStepType.MISSION_STEP_TYPE_BIND.type,
-                MissionStepType.MISSION_STEP_TYPE_OBTAIN.type,
-                MissionStepType.MISSION_STEP_TYPE_NO_EXECUTE.type);
         List<FlowStepInstance> flowStepInstanceList = flowStepInstanceService.list(new LambdaQueryWrapper<FlowStepInstance>()
-                .eq(FlowStepInstance::getStatus, 1).in(FlowStepInstance::getStepType,typeList));
+                .eq(FlowStepInstance::getStatus, 1).in(FlowStepInstance::getStepType,MissionStepType.getTaskISSUE()));
         for (FlowStepInstance flowStepInstance : flowStepInstanceList) {
             FlowInstance flowInstance = flowInstanceService.getById(flowStepInstance.getFlowInstanceId());
             if (Cools.isEmpty(flowInstance)) { continue;}
+            List<FlowStepInstance> flowStepInstances = flowStepInstanceService.list(new LambdaQueryWrapper<FlowStepInstance>()
+                    .eq(FlowStepInstance::getFlowInstanceId, flowInstance.getId()).eq(FlowStepInstance::getStatus, (short) 0));
+            flowInstance.setStatus(flowStepInstances.isEmpty()? (short) 2:(short) 1);
             TaskInstanceNode taskInstanceNode = taskInstanceNodeService.getById(flowInstance.getNodeInstanceId());
             if (Cools.isEmpty(taskInstanceNode)) { continue;}
+            taskInstanceNode.setStatus(flowInstance.getStatus());
             TaskInstance taskInstance = taskInstanceService.getById(flowInstance.getTaskId());
             if (Cools.isEmpty(taskInstance)) { continue;}
             Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskCode, taskInstance.getTaskNo()));
@@ -147,14 +145,21 @@
 
                     if (flowStepInstance.getWmsNextTaskStatus() != 9999) {
                         FlowStepInstance nextFlowStepInstance = flowStepInstanceService.getOne(new LambdaQueryWrapper<FlowStepInstance>()
-                                .eq(FlowStepInstance::getFlowInstanceId, flowStepInstance.getFlowInstanceId())
-                                .eq(FlowStepInstance::getFlowInstanceNo, flowStepInstance.getFlowInstanceNo())
+                                .eq(FlowStepInstance::getStatus, (short)0)
                                 .eq(FlowStepInstance::getStepOrder, flowStepInstance.getStepOrder() + 1)
                                 .eq(FlowStepInstance::getWmsNowTaskStatus, flowStepInstance.getWmsNextTaskStatus()));
+                        if (Cools.isEmpty(nextFlowStepInstance)) {
+                            throw new CoolException("浠诲姟鍙�"+task.getTaskCode()+"浠诲姟姝ラ涓㈠け锛侊紒锛�");
+                        }
                         nextFlowStepInstance.setStatus((short)1);
 
                         flowStepInstanceService.updateById(nextFlowStepInstance);
+                    } else {
+                        taskInstance.setStatus((short)2);
+                        taskInstanceService.updateById(taskInstance);
                     }
+                    flowInstanceService.updateById(flowInstance);
+                    taskInstanceNodeService.updateById(taskInstanceNode);
                 } catch (Exception e) {
                     throw new CoolException(e.getMessage());
                 }
@@ -192,13 +197,18 @@
 
                             if (flowStepInstance.getWmsNextTaskStatus() != 9999) {
                                 FlowStepInstance nextFlowStepInstance = flowStepInstanceService.getOne(new LambdaQueryWrapper<FlowStepInstance>()
-                                        .eq(FlowStepInstance::getFlowInstanceId, flowStepInstance.getFlowInstanceId())
-                                        .eq(FlowStepInstance::getFlowInstanceNo, flowStepInstance.getFlowInstanceNo())
+                                        .eq(FlowStepInstance::getStatus, (short)0)
                                         .eq(FlowStepInstance::getStepOrder, flowStepInstance.getStepOrder() + 1)
                                         .eq(FlowStepInstance::getWmsNowTaskStatus, flowStepInstance.getWmsNextTaskStatus()));
+                                if (Cools.isEmpty(nextFlowStepInstance)) {
+                                    throw new CoolException("浠诲姟鍙�"+task.getTaskCode()+"浠诲姟姝ラ涓㈠け锛侊紒锛�");
+                                }
                                 nextFlowStepInstance.setStatus((short)1);
 
                                 flowStepInstanceService.updateById(nextFlowStepInstance);
+                            } else {
+                                taskInstance.setStatus((short)2);
+                                taskInstanceService.updateById(taskInstance);
                             }
                         } else {
                             flowStepInstance.setRetryTimes(flowStepInstance.getRetryTimes() + 1);
@@ -237,7 +247,7 @@
 
     public void completeStock9999() throws Exception {
         try{
-            List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskStatus, TaskStsType.MISSION_TRANSFER.id).select(Task::getId));
+            List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskStatus, TaskStsType.MISSION_TRANSFER.id));
             if (tasks.isEmpty()) {
                 return;
             }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
index b2bcdf1..6b8cbcf 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
@@ -217,14 +217,25 @@
                     }
                     task.setTaskType(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type).setWarehType(deviceSite.getDevice());
                 } else {
-                    //鍏ㄦ澘鍑哄簱
-                    DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
-                            .eq(!Objects.isNull(loc.getChannel()), DeviceSite::getChannel, loc.getChannel())
-                            .eq(DeviceSite::getSite, siteNo).eq(DeviceSite::getType, TaskType.TASK_TYPE_OUT.type));
-                    if (Objects.isNull(deviceSite)) {
-                        throw new CoolException("绔欑偣涓嶆敮鎸佸叏鏉垮嚭搴擄紒锛�");
+                    if (resouce.equals(TaskResouceType.TASK_RESOUCE_STOCK_UP.val)){
+                        //鍏ㄦ澘鍑哄簱
+                        DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
+                                .eq(DeviceSite::getSite, siteNo).eq(DeviceSite::getType, TaskType.TASK_TYPE_CROSS_DOCKING_OUT.type));
+//                                .eq(!Objects.isNull(loc.getChannel()), DeviceSite::getChannel, loc.getChannel())
+                        if (Objects.isNull(deviceSite)) {
+                            throw new CoolException("绔欑偣涓嶆敮鎸佽秺搴擄紒锛�");
+                        }
+                        task.setTaskType(TaskType.TASK_TYPE_CROSS_DOCKING_OUT.type).setWarehType(deviceSite.getDevice());//瓒婂簱
+                    } else {
+                        //鍏ㄦ澘鍑哄簱
+                        DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
+                                .eq(DeviceSite::getSite, siteNo).eq(DeviceSite::getType, TaskType.TASK_TYPE_OUT.type));
+//                                .eq(!Objects.isNull(loc.getChannel()), DeviceSite::getChannel, loc.getChannel())
+                        if (Objects.isNull(deviceSite)) {
+                            throw new CoolException("绔欑偣涓嶆敮鎸佸叏鏉垮嚭搴擄紒锛�");
+                        }
+                        task.setTaskType(TaskType.TASK_TYPE_OUT.type).setWarehType(deviceSite.getDevice());
                     }
-                    task.setTaskType(TaskType.TASK_TYPE_OUT.type).setWarehType(deviceSite.getDevice());
 
                 }
             } else if (map.getType().equals(Constants.TASK_TYPE_OUT_CHECK)) {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
index fdc69e0..ddb8c49 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
@@ -518,8 +518,8 @@
                 WkOrderItem orderItem = outStockItemService.getOne(new LambdaQueryWrapper<WkOrderItem>()
                         .eq(WkOrderItem::getOrderId, outId)
                         .eq(StringUtils.isNotBlank(locItem.getBatch()), WkOrderItem::getSplrBatch, locItem.getBatch())
-                        .eq(StringUtils.isNotBlank(locItem.getFieldsIndex()), WkOrderItem::getFieldsIndex, locItem.getFieldsIndex())
                         .eq(WkOrderItem::getMatnrId, locItem.getMatnrId()));
+//                        .eq(StringUtils.isNotBlank(locItem.getFieldsIndex()), WkOrderItem::getFieldsIndex, locItem.getFieldsIndex())
 
                 if (Objects.isNull(orderItem)) {
                     throw new CoolException("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�");
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 732a3fa..e0cc9ad 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
@@ -154,7 +154,7 @@
                     .setTaskType(TaskType.TASK_TYPE_IN.type)
                     .setWarehType(WarehType.WAREHOUSE_TYPE_AGV.val)
                     .setTargLoc(targetLoc)
-                    .setTargSite(targSite)
+                    //.setTargSite(targSite)//鍏ュ簱娌℃湁鐩爣绔欑偣
                     .setOrgSite(orgSta)
                     .setBarcode(pakin.getBarcode())
                     .setCreateBy(loginUserId)
@@ -366,7 +366,7 @@
             }
             Task task = new Task();
             task.setTaskCode(ruleCode)
-                    .setTaskStatus(TaskStsType.MISSION_INITIAL.id)
+                    .setTaskStatus(TaskStsType.GENERATE_IN.id)
                     .setTaskType(TaskType.TASK_TYPE_IN.type)
                     .setResource(TaskResouceType.TASK_RESOUCE_PAKIN_TYPE.val)
                     .setTargLoc(targetLoc)
@@ -664,7 +664,7 @@
                 }
                 Task task = new Task();
                 task.setTaskCode(ruleCode)
-                        .setTaskStatus(TaskStsType.WCS_EXECUTE_IN.id)
+                        .setTaskStatus(TaskStsType.MISSION_INITIAL.id)
                         .setTaskType(TaskType.TASK_TYPE_IN.type)
                         .setResource(TaskResouceType.TASK_RESOUCE_PAKIN_TYPE.val)
                         .setTargLoc(targetLoc)
@@ -761,6 +761,9 @@
                 } 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)) {
+                    //瓒婂簱
+                    complateInstockDocking(task, loginUserId);
                 }
             }
         }
@@ -776,7 +779,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Task taskToTop(Long id, Long loginUserId) throws Exception {
-        List<Integer> longs = Arrays.asList(TaskStsType.MISSION_INITIAL.id, TaskStsType.MISSION_INITIAL.id);
+        List<Integer> longs = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id);
         Task tasks = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getId, id).in(Task::getTaskStatus, longs));
         if (Objects.isNull(tasks)) {
             throw new CoolException("浠诲姟宸插鎵ц鐘舵�佷笉鍙竴閿疆椤讹紒锛�");
@@ -800,7 +803,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Task operateComplete(Long id, Long loginUserId) {
-        List<Integer> longs = Arrays.asList(TaskStsType.MISSION_INITIAL.id, TaskStsType.MISSION_INITIAL.id);
+        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));
@@ -984,6 +987,9 @@
                 if (task.getTaskType().equals(TaskType.TASK_TYPE_EMPTY_OUT.type)) {
                     //110.绌烘澘鍑哄簱
                     complateOutStockEmpty(task, loginUserId);
+                } else if (task.getTaskType().equals(TaskType.TASK_TYPE_CROSS_DOCKING_OUT.type)) {
+                    //110.绌烘澘鍑哄簱
+                    complateOutStockDocking(task, loginUserId);
                 } else {
                     complateOutStock(task, loginUserId);
                 }
@@ -1062,6 +1068,50 @@
     }
 
     /**
+     * 瓒婂簱鍥炲簱
+     *
+     * @param task
+     * @param loginUserId
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void complateInstockDocking(Task task, Long loginUserId) {
+        if (Objects.isNull(task)) {
+            return;
+        }
+        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTargLoc()));
+        if (Objects.isNull(loc)) {
+            throw new CoolException("搴撳瓨涓嶅瓨鍦紒锛�");
+        }
+//        if (!loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_S.type)) {
+//            throw new CoolException("褰撳墠搴撲綅鐘舵�佷笉澶勪簬S.鍏ュ簱棰勭害锛屼笉鍙墽琛屽叆搴撴搷浣滐紒");
+//        }
+        loc.setUseStatus(LocStsType.LOC_STS_TYPE_F.type)
+                .setBarcode(task.getBarcode())
+                .setUpdateBy(loginUserId).setUpdateTime(new Date());
+
+        if (!locService.updateById(loc)) {
+            throw new CoolException("搴撲綅淇℃伅鏇存柊澶辫触锛侊紒");
+        }
+
+        List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
+        if (taskItems.isEmpty()) {
+            throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦紒锛�");
+        }
+
+        TaskItem taskItem = taskItems.stream().findFirst().get();
+        //淇濆瓨鍏ュ嚭搴撴祦姘�
+        saveStockItems(taskItems, task, null, null, taskItem.getWkType(), OrderType.ORDER_IN.type, loginUserId);
+
+        locItemWorkingService.remove(new LambdaQueryWrapper<LocItemWorking>().eq(LocItemWorking::getTaskId, task.getId()));
+
+        task.setTaskStatus(TaskStsType.UPDATED_IN.id).setUpdateTime(new Date()).setUpdateBy(loginUserId);
+        if (!taskService.updateById(task)) {
+            throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+        }
+
+    }
+
+    /**
      * 浠诲姟鍙栨秷
      *
      * @param ids
@@ -1071,7 +1121,7 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public R removeTask(Long[] ids, Long loginUserId) {
-        List<Integer> longs = Arrays.asList(TaskStsType.MISSION_INITIAL.id, TaskStsType.MISSION_INITIAL.id);
+        List<Integer> longs = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id);
         List<Integer> list = Arrays.asList(TaskType.TASK_TYPE_IN.type, TaskType.TASK_TYPE_OUT.type, TaskType.TASK_TYPE_PICK_AGAIN_OUT.type,
                 TaskType.TASK_TYPE_CHECK_OUT.type, TaskType.TASK_TYPE_EMPTY_IN.type, TaskType.TASK_TYPE_LOC_MOVE.type,
                 TaskType.TASK_TYPE_EMPTY_OUT.type, TaskType.TASK_TYPE_MERGE_OUT.type);
@@ -1084,7 +1134,7 @@
         }
         for (Task task : tasks) {
             //鍙栨秷绉诲簱浠诲姟
-            if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type) && task.getTaskStatus().equals(TaskStsType.MISSION_INITIAL.id)) {
+            if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type) && task.getTaskStatus().equals(TaskStsType.GENERATE_IN.id)) {
                 if (!locService.update(new LambdaUpdateWrapper<Loc>()
                         .eq(Loc::getCode, task.getOrgLoc())
                         .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type))) {
@@ -1312,7 +1362,7 @@
         task.setTaskCode(ruleCode)
                 .setTaskType(type)
                 .setBarcode(task.getBarcode())
-                .setTaskStatus(TaskStsType.MISSION_INITIAL.id);
+                .setTaskStatus(TaskStsType.GENERATE_IN.id);
 
         TaskInParam param = new TaskInParam();
         param.setSourceStaNo(task.getTargSite())
@@ -1572,6 +1622,100 @@
      */
     @Synchronized
     @Transactional(rollbackFor = Exception.class)
+    public void complateOutStockDocking(Task task, Long loginUserId) throws Exception {
+
+        if (Objects.isNull(task)) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getOrgLoc()));
+        if (Objects.isNull(loc)) {
+            throw new CoolException("搴撲綅涓嶅瓨鍦紒锛�");
+        }
+        if (!loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_R.type)) {
+            throw new CoolException("搴撲綅鐘舵�佷笉澶勭悊浜嶳.鍑哄簱棰勭害锛侊紒");
+        }
+
+        List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
+        if (taskItems.isEmpty()) {
+            throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦紒锛�");
+        }
+
+        List<LocItem> locItems = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocId, loc.getId()));
+        if (locItems.isEmpty()) {
+            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);
+        }
+
+
+        //娣诲姞鍑哄叆搴撹褰曚俊鎭�
+        Map<Short, List<TaskItem>> listMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getWkType));
+        /***鑾峰彇搴撳瓨鍑哄簱鍊硷紝濡傛灉涓虹┖琛ㄧず姝e父鍗曟嵁鍑哄簱锛岄潪绌鸿〃鏄庢槸搴撳瓨鍑哄簱
+         * 1. 搴撳瓨鍑哄簱娌℃湁鍗曟嵁淇℃伅锛屽崟鎹俊鎭粯璁や负绌�
+         * 2. 鍗曟嵁搴撳瓨闇�閫氳繃娉㈡鏌ヨ鍘熷鍗曟嵁淇℃伅锛屽皢鍗曟嵁淇℃伅濉叆stock涓�
+         * */
+        List<TaskItem> list = listMap.get(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type));
+        if (Objects.isNull(list) || list.isEmpty()) {
+            Map<Long, List<TaskItem>> maps = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getSource));
+            maps.keySet().forEach(key -> {
+                if (task.getResource().equals(TaskResouceType.TASK_RESOUCE_STOCK_UP.val)) {
+                    WkOrderItem orderItem = asnOrderItemService.getById(key);
+                    if (Objects.isNull(orderItem)) {
+                        throw new CoolException("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�");
+                    }
+                    try {
+                        saveOutStockItem(maps.get(key), orderItem,  loginUserId);
+                    } catch (Exception e) {
+                        throw new CoolException(e.getMessage());
+                    }
+                }
+            });
+        } else {
+            try {
+                saveOutStockItem(taskItems, null, null, null, loginUserId);
+            } catch (Exception e) {
+                throw new CoolException(e.getMessage());
+            }
+        }
+
+        /**淇敼涓哄簱浣嶇姸鎬佷负O.绌哄簱*/
+        if (!locService.update(new LambdaUpdateWrapper<Loc>()
+                .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_S.type)
+                .set(Loc::getBarcode, loc.getBarcode())
+                .set(Loc::getUpdateBy, loginUserId)
+                .set(Loc::getUpdateTime, new Date())
+                .eq(Loc::getId, loc.getId()))) {
+            throw new CoolException("搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+        }
+
+        if (!this.update(new LambdaUpdateWrapper<Task>()
+                .eq(Task::getId, task.getId())
+                .set(Task::getUpdateBy, loginUserId)
+                .set(Task::getUpdateTime, new Date())
+                .set(Task::getTargLoc, task.getOrgLoc())
+                .set(Task::getTaskStatus, TaskStsType.COMPLETE_IN.id))) {
+            throw new CoolException("搴撳瓨鐘舵�佹洿鏂板け璐ワ紒锛�");
+        }
+    }
+
+    /**
+     * @author Ryan
+     * @date 2025/5/20
+     * @description: 瀹屾垚鍑哄簱浠诲姟锛屾洿鏂板嚭搴撳簱瀛樹俊鎭�
+     * @version 1.0
+     */
+    @Synchronized
+    @Transactional(rollbackFor = Exception.class)
     public void complateOutStockEmpty(Task task, Long loginUserId) throws Exception {
         if (Objects.isNull(task)) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
@@ -1693,7 +1837,7 @@
         if (Objects.isNull(ids) || ids.isEmpty()) {
             return R.error("浠诲姟缂栫爜涓嶈兘涓虹┖锛侊紒");
         }
-        List<Integer> integers = Arrays.asList(TaskStsType.MISSION_INITIAL.id, TaskStsType.MISSION_INITIAL.id);
+        List<Integer> integers = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id);
         List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>()
                 .in(Task::getId, ids)
                 .in(Task::getTaskStatus, integers)
@@ -1739,7 +1883,7 @@
                 }
             }
 
-            /**鍒ゆ柇鏄惁鏅鸿兘绔欑偣锛岄潪鍏夊簵绔欑偣闇�绠℃帶绔欑偣鐘舵��*/
+            /**鍒ゆ柇鏄惁鍏夌數绔欑偣锛岄潪鍏夊簵绔欑偣闇�绠℃帶绔欑偣鐘舵��*/
             if (!Objects.isNull(station) && station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) {
                 if (task.getTaskType() <= TaskType.TASK_TYPE_CHECK_IN.type && !task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) {
                     station.setUseStatus(LocStsType.LOC_STS_TYPE_R.type);
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepInstance.java b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepInstance.java
index 7167dc9..489e71b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepInstance.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/system/entity/FlowStepInstance.java
@@ -152,6 +152,12 @@
     @ApiModelProperty(value= "wms褰撳墠浠诲姟绫诲瀷ID")
     private Integer wmsNowTaskStatus;
 
+    /**
+     * 浠诲姟鍙�
+     */
+    @ApiModelProperty(value= "浠诲姟鍙�")
+    private String taskNo;
+
     public FlowStepInstance() {}
     public FlowStepInstance(FlowStepTemplate  flowStepTemplate) {
         this.stepTemplateId = flowStepTemplate.getId();

--
Gitblit v1.9.1