From bc25276b90cf8256bbe37126120d66d9142c9c29 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期六, 21 三月 2026 17:07:58 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/core/plugin/store/StoreInTaskContext.java           |   22 +
 src/main/java/com/zy/core/plugin/store/StoreInTaskGenerationService.java |  190 +++++++++
 src/main/java/com/zy/core/utils/WmsOperateUtils.java                     |  197 +++++++-
 src/main/java/com/zy/core/plugin/store/AsyncInTaskStatus.java            |    9 
 src/main/java/com/zy/core/plugin/store/StoreInTaskPolicy.java            |   84 ++++
 src/main/java/com/zy/core/plugin/store/InTaskApplyRequest.java           |   23 +
 src/main/java/com/zy/core/plugin/NormalProcess.java                      |  135 -----
 src/main/java/com/zy/asrs/controller/ConsoleController.java              |    1 
 src/main/java/com/zy/asrs/domain/vo/StationLatestDataVo.java             |    3 
 src/main/java/com/zy/core/plugin/XiaosongProcess.java                    |  172 +------
 src/main/java/com/zy/core/plugin/store/AsyncInTaskResult.java            |   24 +
 src/main/webapp/components/DevpCard.js                                   |    1 
 src/main/java/com/zy/core/plugin/FakeProcess.java                        |  164 +------
 src/main/java/com/zy/core/plugin/GslProcess.java                         |  191 ++------
 14 files changed, 660 insertions(+), 556 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/ConsoleController.java b/src/main/java/com/zy/asrs/controller/ConsoleController.java
index 13029ed..68877f8 100644
--- a/src/main/java/com/zy/asrs/controller/ConsoleController.java
+++ b/src/main/java/com/zy/asrs/controller/ConsoleController.java
@@ -133,6 +133,7 @@
                 vo.setError(stationProtocol.getError()); // 閿欒鐮�
                 vo.setErrorMsg(stationProtocol.getErrorMsg()); // 鎶ヨ淇℃伅
                 vo.setBarcode(stationProtocol.getBarcode()); // 鏉$爜
+                vo.setSystemWarning(stationProtocol.getSystemWarning()); // 绯荤粺鍛婅/涓氬姟鎻愮ず
                 vo.setWeight(stationProtocol.getWeight());//閲嶉噺
                 vo.setTaskWriteIdx(stationProtocol.getTaskWriteIdx());//浠诲姟鍙啓鍖�
                 String stationStatus = StationStatusType.process(stationProtocol).toString().toLowerCase().replaceAll("_", "-");
diff --git a/src/main/java/com/zy/asrs/domain/vo/StationLatestDataVo.java b/src/main/java/com/zy/asrs/domain/vo/StationLatestDataVo.java
index 749a635..84967b0 100644
--- a/src/main/java/com/zy/asrs/domain/vo/StationLatestDataVo.java
+++ b/src/main/java/com/zy/asrs/domain/vo/StationLatestDataVo.java
@@ -52,6 +52,9 @@
 
     private String stationStatus;
 
+    //绯荤粺鍛婅/涓氬姟鎻愮ず
+    private String systemWarning;
+
     //閲嶉噺
     private Double weight;
 
diff --git a/src/main/java/com/zy/core/plugin/FakeProcess.java b/src/main/java/com/zy/core/plugin/FakeProcess.java
index 6e2bb05..c93863d 100644
--- a/src/main/java/com/zy/core/plugin/FakeProcess.java
+++ b/src/main/java/com/zy/core/plugin/FakeProcess.java
@@ -25,6 +25,9 @@
 import com.zy.core.model.protocol.DualCrnProtocol;
 import com.zy.core.model.protocol.StationProtocol;
 import com.zy.core.plugin.api.MainProcessPluginApi;
+import com.zy.core.plugin.store.StoreInTaskContext;
+import com.zy.core.plugin.store.StoreInTaskGenerationService;
+import com.zy.core.plugin.store.StoreInTaskPolicy;
 import com.zy.core.properties.SystemProperties;
 import com.zy.core.thread.CrnThread;
 import com.zy.core.thread.DualCrnThread;
@@ -49,7 +52,7 @@
 
 @Slf4j
 @Component
-public class FakeProcess implements MainProcessPluginApi {
+public class FakeProcess implements MainProcessPluginApi, StoreInTaskPolicy {
 
     private static final long METHOD_TIMEOUT_MS = 15000; // 15绉掕秴鏃�
     private static final ExecutorService timeoutExecutor = Executors.newCachedThreadPool();
@@ -86,6 +89,8 @@
     private WmsOperateUtils wmsOperateUtils;
     @Autowired
     private DualCrnOperateProcessUtils dualCrnOperateProcessUtils;
+    @Autowired
+    private StoreInTaskGenerationService storeInTaskGenerationService;
 
     /**
      * 甯﹁秴鏃朵繚鎶ゆ墽琛屾柟娉�
@@ -425,141 +430,38 @@
      * 鍏ュ簱绔欙紝鏍规嵁鏉$爜鎵弿鐢熸垚鍏ュ簱宸ヤ綔妗�
      */
     public synchronized void generateStoreWrkFile() {
-        try {
-            if (fakeRealTaskRequestWms.equals("N")) {
-                return;
-            }
+        storeInTaskGenerationService.generate(this);
+    }
 
-            Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
-            if (systemConfigMapObj == null) {
-                return;
-            }
-            HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
+    @Override
+    public boolean isEnabled() {
+        return !"N".equals(fakeRealTaskRequestWms);
+    }
 
-            int conveyorStationTaskLimit = 30;
-            String conveyorStationTaskLimitStr = systemConfigMap.get("conveyorStationTaskLimit");
-            if (conveyorStationTaskLimitStr != null) {
-                conveyorStationTaskLimit = Integer.parseInt(conveyorStationTaskLimitStr);
-            }
-            int currentStationTaskCount = stationOperateProcessUtils.getCurrentStationTaskCount();
-            if (currentStationTaskCount > conveyorStationTaskLimit) {
-                News.error("杈撻�佺珯鐐逛换鍔″凡杈惧埌涓婇檺锛屼笂闄愬�硷細{}锛岀珯鐐逛换鍔℃暟锛歿}", conveyorStationTaskLimit, currentStationTaskCount);
-                return;
-            }
+    @Override
+    public boolean matchCandidate(StoreInTaskContext context) {
+        StationProtocol stationProtocol = context.getStationProtocol();
+        return stationProtocol.isAutoing()
+                && stationProtocol.isLoading()
+                && stationProtocol.getTaskNo() > 0
+                && !Cools.isEmpty(stationProtocol.getBarcode());
+    }
 
-            List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<>());
-            for (BasDevp basDevp : basDevps) {
-                StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
-                if (stationThread == null) {
-                    continue;
-                }
+    @Override
+    public void onRequestPermitGranted(StoreInTaskContext context) {
+        redisUtil.set(getGenerateLockKey(context), "lock", 3);
+    }
 
-                Map<Integer, StationProtocol> stationMap = stationThread.getStatusMap();
-
-                List<StationObjModel> list = basDevp.getBarcodeStationList$();
-                for (StationObjModel entity : list) {
-                    Integer stationId = entity.getStationId();
-                    if (!stationMap.containsKey(stationId)) {
-                        continue;
-                    }
-
-                    StationProtocol stationProtocol = stationMap.get(stationId);
-                    if (stationProtocol == null) {
-                        continue;
-                    }
-
-                    // 婊¤冻鑷姩銆佹湁鐗┿�佹湁宸ヤ綔鍙凤紝鐢熸垚鍏ュ簱鏁版嵁
-                    if (stationProtocol.isAutoing()
-                            && stationProtocol.isLoading()
-                            && stationProtocol.getTaskNo() > 0) {
-                        if (Cools.isEmpty(stationProtocol.getBarcode())) {
-                            continue;
-                        }
-
-                        // 妫�娴嬩换鍔℃槸鍚︾敓鎴�
-                        List<WrkMast> wrkMasts = wrkMastService
-                                .list(new QueryWrapper<WrkMast>()
-                                        .eq("barcode", stationProtocol.getBarcode()));
-                        if (!wrkMasts.isEmpty()) {
-                            continue;
-                        }
-
-                        Object lock = redisUtil.get(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId);
-                        if (lock != null) {
-                            continue;
-                        }
-                        redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 3);
-
-                        String barcode = stationProtocol.getBarcode();
-                        Integer stationIdVal = stationProtocol.getStationId();
-                        Integer taskNo = stationProtocol.getTaskNo();
-
-                        // 1. 棣栧厛鏌ヨ鏄惁鏈夊凡瀹屾垚鐨勫紓姝ュ搷搴�
-                        String response = wmsOperateUtils.queryAsyncInTaskResponse(barcode, stationIdVal, taskNo);
-
-                        if (!Cools.isEmpty(response)) {
-                            // 2. 鏈夊搷搴旂粨鏋滐紝澶勭悊鍝嶅簲
-                            if (response.equals("FAILED") || response.startsWith("ERROR:")) {
-                                // 璇锋眰澶辫触锛岄噸鏂板彂璧峰紓姝ヨ姹�
-                                News.error("WMS鍏ュ簱璇锋眰澶辫触锛岄噸鏂板彂璧疯姹傦紝barcode={}锛宻tationId={}锛宺esponse={}", barcode,
-                                        stationIdVal, response);
-                                wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal, taskNo,
-                                        stationProtocol.getPalletHeight());
-                                redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
-
-                                stationProtocol.setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS杩斿洖=" + response);
-                                continue;
-                            }
-
-                            // 瑙f瀽鍝嶅簲
-                            JSONObject jsonObject = JSON.parseObject(response);
-                            if (jsonObject.getInteger("code").equals(200)) {
-                                StartupDto dto = jsonObject.getObject("data", StartupDto.class);
-
-                                CreateInTaskParam taskParam = new CreateInTaskParam();
-                                taskParam.setTaskNo(dto.getTaskNo());
-                                taskParam.setLocNo(dto.getLocNo());
-                                taskParam.setTaskPri(dto.getTaskPri());
-                                taskParam.setBarcode(barcode);
-                                WrkMast wrkMast = commonService.createInTask(taskParam);
-
-                                StationCommand command = stationThread.getCommand(StationCommandType.WRITE_INFO,
-                                        wrkMast.getWrkNo(), stationId, stationId, 0);
-                                if (command == null) {
-                                    News.taskInfo(wrkMast.getWrkNo(), "鑾峰彇杈撻�佺嚎鍛戒护澶辫触");
-                                    continue;
-                                }
-                                MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command));
-
-                                stationProtocol.setSystemWarning("");
-                            } else {
-                                // 鎺ュ彛杩斿洖闈�200锛岄噸鏂板彂璧疯姹�
-                                News.error("WMS鍏ュ簱鎺ュ彛杩斿洖闈�200锛岄噸鏂板彂璧疯姹傦紝barcode={}锛宻tationId={}锛宺esponse={}", barcode,
-                                        stationIdVal, response);
-                                wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal, taskNo,
-                                        stationProtocol.getPalletHeight());
-                                redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
-
-                                stationProtocol.setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS杩斿洖=" + response);
-                            }
-                        } else {
-                            // 3. 娌℃湁鍝嶅簲缁撴灉锛屾鏌ユ槸鍚︽湁璇锋眰姝e湪杩涜涓�
-                            if (!wmsOperateUtils.isAsyncRequestInProgress(barcode, stationIdVal, taskNo)) {
-                                // 娌℃湁璇锋眰杩涜涓紝鍙戣捣鏂扮殑寮傛璇锋眰
-                                News.info("鍙戣捣寮傛WMS鍏ュ簱璇锋眰锛宐arcode={}锛宻tationId={}", barcode, stationIdVal);
-                                wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal, taskNo,
-                                        stationProtocol.getPalletHeight());
-                                redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
-
-                                stationProtocol.setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS鏃犺繑鍥�");
-                            }
-                        }
-                    }
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
+    @Override
+    public void afterTaskCreated(StoreInTaskContext context, WrkMast wrkMast) {
+        Integer stationId = context.getStationObjModel().getStationId();
+        StationCommand command = context.getStationThread().getCommand(StationCommandType.WRITE_INFO,
+                wrkMast.getWrkNo(), stationId, stationId, 0);
+        if (command == null) {
+            News.taskInfo(wrkMast.getWrkNo(), "鑾峰彇杈撻�佺嚎鍛戒护澶辫触");
+            return;
         }
+        MessageQueue.offer(SlaveType.Devp, context.getBasDevp().getDevpNo(), new Task(2, command));
     }
 
     // 璁$畻鎵�鏈夌珯鐐瑰仠鐣欐椂闂�
diff --git a/src/main/java/com/zy/core/plugin/GslProcess.java b/src/main/java/com/zy/core/plugin/GslProcess.java
index d8ebc06..c38b7d8 100644
--- a/src/main/java/com/zy/core/plugin/GslProcess.java
+++ b/src/main/java/com/zy/core/plugin/GslProcess.java
@@ -1,15 +1,10 @@
 package com.zy.core.plugin;
 
 import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.core.common.Cools;
-import com.zy.asrs.domain.param.CreateInTaskParam;
 import com.zy.asrs.entity.BasDevp;
-import com.zy.asrs.entity.WrkMast;
 import com.zy.asrs.service.BasDevpService;
-import com.zy.asrs.service.WrkMastService;
-import com.zy.common.model.StartupDto;
 import com.zy.common.service.CommonService;
 import com.zy.common.utils.RedisUtil;
 import com.zy.core.News;
@@ -24,21 +19,23 @@
 import com.zy.core.model.command.StationCommand;
 import com.zy.core.model.protocol.StationProtocol;
 import com.zy.core.plugin.api.MainProcessPluginApi;
+import com.zy.core.plugin.store.InTaskApplyRequest;
+import com.zy.core.plugin.store.StoreInTaskContext;
+import com.zy.core.plugin.store.StoreInTaskGenerationService;
+import com.zy.core.plugin.store.StoreInTaskPolicy;
 import com.zy.core.thread.StationThread;
 import com.zy.core.utils.CrnOperateProcessUtils;
 import com.zy.core.utils.StationOperateProcessUtils;
-import com.zy.core.utils.WmsOperateUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 @Slf4j
 @Component
-public class GslProcess implements MainProcessPluginApi {
+public class GslProcess implements MainProcessPluginApi, StoreInTaskPolicy {
 
     @Autowired
     private CrnOperateProcessUtils crnOperateUtils;
@@ -49,11 +46,9 @@
     @Autowired
     private BasDevpService basDevpService;
     @Autowired
-    private WrkMastService wrkMastService;
-    @Autowired
     private RedisUtil redisUtil;
     @Autowired
-    private WmsOperateUtils wmsOperateUtils;
+    private StoreInTaskGenerationService storeInTaskGenerationService;
 
     @Override
     public void run() {
@@ -90,141 +85,51 @@
      * 鍏ュ簱绔欙紝鏍规嵁鏉$爜鎵弿鐢熸垚鍏ュ簱宸ヤ綔妗�
      */
     public synchronized void generateStoreWrkFile() {
-        try {
-            Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
-            if (systemConfigMapObj == null) {
-                return;
-            }
-            HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
+        storeInTaskGenerationService.generate(this);
+    }
 
-            int conveyorStationTaskLimit = 30;
-            String conveyorStationTaskLimitStr = systemConfigMap.get("conveyorStationTaskLimit");
-            if (conveyorStationTaskLimitStr != null) {
-                conveyorStationTaskLimit = Integer.parseInt(conveyorStationTaskLimitStr);
-            }
-            int currentStationTaskCount = stationOperateProcessUtils.getCurrentStationTaskCount();
-            if (currentStationTaskCount > conveyorStationTaskLimit) {
-                News.error("杈撻�佺珯鐐逛换鍔″凡杈惧埌涓婇檺锛屼笂闄愬�硷細{}锛岀珯鐐逛换鍔℃暟锛歿}", conveyorStationTaskLimit, currentStationTaskCount);
-                return;
-            }
+    @Override
+    public boolean matchCandidate(StoreInTaskContext context) {
+        StationProtocol stationProtocol = context.getStationProtocol();
+        return stationProtocol.isAutoing()
+                && stationProtocol.isLoading()
+                && stationProtocol.isInEnable()
+                && stationProtocol.getTaskNo() > 0
+                && !Cools.isEmpty(stationProtocol.getBarcode());
+    }
 
-            List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<>());
-            for (BasDevp basDevp : basDevps) {
-                StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
-                if (stationThread == null) {
-                    continue;
-                }
-
-                Map<Integer, StationProtocol> stationMap = stationThread.getStatusMap();
-
-                List<StationObjModel> list = basDevp.getBarcodeStationList$();
-                for (StationObjModel entity : list) {
-                    Integer stationId = entity.getStationId();
-                    if (!stationMap.containsKey(stationId)) {
-                        continue;
-                    }
-
-                    StationProtocol stationProtocol = stationMap.get(stationId);
-                    if (stationProtocol == null) {
-                        continue;
-                    }
-
-                    // 婊¤冻鑷姩銆佹湁鐗┿�佹湁宸ヤ綔鍙凤紝鐢熸垚鍏ュ簱鏁版嵁
-                    if (stationProtocol.isAutoing()
-                            && stationProtocol.isLoading()
-                            && stationProtocol.isInEnable()
-                            && stationProtocol.getTaskNo() > 0) {
-                        if (Cools.isEmpty(stationProtocol.getBarcode())) {
-                            continue;
-                        }
-
-                        if (stationProtocol.getError() > 0) {
-                            Object lock = redisUtil.get(RedisKeyType.GENERATE_STATION_BACK_LIMIT.key + stationProtocol.getStationId());
-                            if (lock != null) {
-                                continue;
-                            }
-                            StationObjModel backStation = entity.getBackStation();
-                            StationCommand command = stationThread.getCommand(StationCommandType.MOVE, commonService.getWorkNo(WrkIoType.STATION_BACK.id), stationId, backStation.getStationId(), 0);
-                            if (command == null) {
-                                News.taskInfo(stationProtocol.getTaskNo(), "{}宸ヤ綔,鑾峰彇杈撻�佺嚎鍛戒护澶辫触", stationProtocol.getTaskNo());
-                                continue;
-                            }
-                            MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command));
-                            News.taskInfo(stationProtocol.getTaskNo(), "{}鎵爜寮傚父锛屽凡閫�鍥炶嚦{}", backStation.getStationId());
-                            redisUtil.set(RedisKeyType.GENERATE_STATION_BACK_LIMIT.key + stationProtocol.getStationId(), "lock", 10);
-                        }
-
-                        // 妫�娴嬩换鍔℃槸鍚︾敓鎴�
-                        List<WrkMast> wrkMasts = wrkMastService
-                                .list(new QueryWrapper<WrkMast>()
-                                        .eq("barcode", stationProtocol.getBarcode()));
-                        if (!wrkMasts.isEmpty()) {
-                            continue;
-                        }
-
-                        Object lock = redisUtil.get(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId);
-                        if (lock != null) {
-                            continue;
-                        }
-
-                        String barcode = stationProtocol.getBarcode();
-                        Integer stationIdVal = stationProtocol.getStationId();
-                        Integer taskNo = stationProtocol.getTaskNo();
-
-                        // 1. 棣栧厛鏌ヨ鏄惁鏈夊凡瀹屾垚鐨勫紓姝ュ搷搴�
-                        String response = wmsOperateUtils.queryAsyncInTaskResponse(barcode, stationIdVal, taskNo);
-
-                        if (!Cools.isEmpty(response)) {
-                            // 2. 鏈夊搷搴旂粨鏋滐紝澶勭悊鍝嶅簲
-                            if (response.equals("FAILED") || response.startsWith("ERROR:")) {
-                                // 璇锋眰澶辫触锛岄噸鏂板彂璧峰紓姝ヨ姹�
-                                News.error("WMS鍏ュ簱璇锋眰澶辫触锛岄噸鏂板彂璧疯姹傦紝barcode={}锛宻tationId={}锛宺esponse={}", barcode,
-                                        stationIdVal, response);
-                                wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal, taskNo,
-                                        stationProtocol.getPalletHeight());
-                                redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
-                                stationProtocol.setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS杩斿洖=" + response);
-                                continue;
-                            }
-
-                            // 瑙f瀽鍝嶅簲
-                            JSONObject jsonObject = JSON.parseObject(response);
-                            if (jsonObject.getInteger("code").equals(200)) {
-                                StartupDto dto = jsonObject.getObject("data", StartupDto.class);
-
-                                CreateInTaskParam taskParam = new CreateInTaskParam();
-                                taskParam.setTaskNo(dto.getTaskNo());
-                                taskParam.setLocNo(dto.getLocNo());
-                                taskParam.setTaskPri(dto.getTaskPri());
-                                taskParam.setBarcode(barcode);
-                                WrkMast wrkMast = commonService.createInTask(taskParam);
-                                stationProtocol.setSystemWarning("");
-                            } else {
-                                // 鎺ュ彛杩斿洖闈�200锛岄噸鏂板彂璧疯姹�
-                                News.error("WMS鍏ュ簱鎺ュ彛杩斿洖闈�200锛岄噸鏂板彂璧疯姹傦紝barcode={}锛宻tationId={}锛宺esponse={}", barcode,
-                                        stationIdVal, response);
-                                wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal, taskNo,
-                                        stationProtocol.getPalletHeight());
-                                redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
-                                stationProtocol.setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS杩斿洖=" + response);
-                            }
-                        } else {
-                            // 3. 娌℃湁鍝嶅簲缁撴灉锛屾鏌ユ槸鍚︽湁璇锋眰姝e湪杩涜涓�
-                            if (!wmsOperateUtils.isAsyncRequestInProgress(barcode, stationIdVal, taskNo)) {
-                                // 娌℃湁璇锋眰杩涜涓紝鍙戣捣鏂扮殑寮傛璇锋眰
-                                News.info("鍙戣捣寮傛WMS鍏ュ簱璇锋眰锛宐arcode={}锛宻tationId={}", barcode, stationIdVal);
-                                wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal, taskNo,
-                                        stationProtocol.getPalletHeight());
-                                redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
-                                stationProtocol.setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS鏃犺繑鍥�");
-                            }
-                        }
-                    }
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
+    @Override
+    public boolean beforeApply(StoreInTaskContext context) {
+        StationProtocol stationProtocol = context.getStationProtocol();
+        if (stationProtocol.getError() <= 0) {
+            return true;
         }
+
+        Object lock = redisUtil.get(RedisKeyType.GENERATE_STATION_BACK_LIMIT.key + stationProtocol.getStationId());
+        if (lock != null) {
+            return false;
+        }
+
+        StationObjModel backStation = context.getStationObjModel().getBackStation();
+        StationCommand command = context.getStationThread().getCommand(StationCommandType.MOVE,
+                commonService.getWorkNo(WrkIoType.STATION_BACK.id),
+                context.getStationObjModel().getStationId(),
+                backStation.getStationId(), 0);
+        if (command == null) {
+            News.taskInfo(stationProtocol.getTaskNo(), "{}宸ヤ綔,鑾峰彇杈撻�佺嚎鍛戒护澶辫触", stationProtocol.getTaskNo());
+            return false;
+        }
+        MessageQueue.offer(SlaveType.Devp, context.getBasDevp().getDevpNo(), new Task(2, command));
+        News.taskInfo(stationProtocol.getTaskNo(), "{}鎵爜寮傚父锛屽凡閫�鍥炶嚦{}", backStation.getStationId());
+        redisUtil.set(RedisKeyType.GENERATE_STATION_BACK_LIMIT.key + stationProtocol.getStationId(), "lock", 10);
+        return true;
+    }
+
+    @Override
+    public InTaskApplyRequest buildApplyRequest(StoreInTaskContext context) {
+        InTaskApplyRequest request = StoreInTaskPolicy.super.buildApplyRequest(context);
+        request.getExtraParams().put("weight", context.getStationProtocol().getWeight());
+        return request;
     }
 
     //妫�娴嬪叆搴撶珯鏄惁鏈変换鍔$敓鎴愶紝骞跺惎鍔ㄥ叆搴�
diff --git a/src/main/java/com/zy/core/plugin/NormalProcess.java b/src/main/java/com/zy/core/plugin/NormalProcess.java
index 05e5421..3216f4d 100644
--- a/src/main/java/com/zy/core/plugin/NormalProcess.java
+++ b/src/main/java/com/zy/core/plugin/NormalProcess.java
@@ -24,6 +24,9 @@
 import com.zy.core.model.command.StationCommand;
 import com.zy.core.model.protocol.StationProtocol;
 import com.zy.core.plugin.api.MainProcessPluginApi;
+import com.zy.core.plugin.store.StoreInTaskContext;
+import com.zy.core.plugin.store.StoreInTaskGenerationService;
+import com.zy.core.plugin.store.StoreInTaskPolicy;
 import com.zy.core.thread.StationThread;
 import com.zy.core.utils.CrnOperateProcessUtils;
 import com.zy.core.utils.StationOperateProcessUtils;
@@ -38,7 +41,7 @@
 
 @Slf4j
 @Component
-public class NormalProcess implements MainProcessPluginApi {
+public class NormalProcess implements MainProcessPluginApi, StoreInTaskPolicy {
 
     @Autowired
     private CrnOperateProcessUtils crnOperateUtils;
@@ -54,6 +57,8 @@
     private RedisUtil redisUtil;
     @Autowired
     private WmsOperateUtils wmsOperateUtils;
+    @Autowired
+    private StoreInTaskGenerationService storeInTaskGenerationService;
 
     @Override
     public void run() {
@@ -84,125 +89,17 @@
      * 鍏ュ簱绔欙紝鏍规嵁鏉$爜鎵弿鐢熸垚鍏ュ簱宸ヤ綔妗�
      */
     public synchronized void generateStoreWrkFile() {
-        try {
-            Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
-            if (systemConfigMapObj == null) {
-                return;
-            }
-            HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
+        storeInTaskGenerationService.generate(this);
+    }
 
-            int conveyorStationTaskLimit = 30;
-            String conveyorStationTaskLimitStr = systemConfigMap.get("conveyorStationTaskLimit");
-            if (conveyorStationTaskLimitStr != null) {
-                conveyorStationTaskLimit = Integer.parseInt(conveyorStationTaskLimitStr);
-            }
-            int currentStationTaskCount = stationOperateProcessUtils.getCurrentStationTaskCount();
-            if (currentStationTaskCount > conveyorStationTaskLimit) {
-                News.error("杈撻�佺珯鐐逛换鍔″凡杈惧埌涓婇檺锛屼笂闄愬�硷細{}锛岀珯鐐逛换鍔℃暟锛歿}", conveyorStationTaskLimit, currentStationTaskCount);
-                return;
-            }
-
-            List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<>());
-            for (BasDevp basDevp : basDevps) {
-                StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
-                if (stationThread == null) {
-                    continue;
-                }
-
-                Map<Integer, StationProtocol> stationMap = stationThread.getStatusMap();
-
-                List<StationObjModel> list = basDevp.getBarcodeStationList$();
-                for (StationObjModel entity : list) {
-                    Integer stationId = entity.getStationId();
-                    if (!stationMap.containsKey(stationId)) {
-                        continue;
-                    }
-
-                    StationProtocol stationProtocol = stationMap.get(stationId);
-                    if (stationProtocol == null) {
-                        continue;
-                    }
-
-                    // 婊¤冻鑷姩銆佹湁鐗┿�佹湁宸ヤ綔鍙凤紝鐢熸垚鍏ュ簱鏁版嵁
-                    if (stationProtocol.isAutoing()
-                            && stationProtocol.isLoading()
-                            && stationProtocol.isInEnable()
-                            && stationProtocol.getTaskNo() > 0) {
-                        if (Cools.isEmpty(stationProtocol.getBarcode())) {
-                            continue;
-                        }
-
-                        // 妫�娴嬩换鍔℃槸鍚︾敓鎴�
-                        List<WrkMast> wrkMasts = wrkMastService
-                                .list(new QueryWrapper<WrkMast>()
-                                        .eq("barcode", stationProtocol.getBarcode()));
-                        if (!wrkMasts.isEmpty()) {
-                            continue;
-                        }
-
-                        Object lock = redisUtil.get(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId);
-                        if (lock != null) {
-                            continue;
-                        }
-
-                        String barcode = stationProtocol.getBarcode();
-                        Integer stationIdVal = stationProtocol.getStationId();
-                        Integer taskNo = stationProtocol.getTaskNo();
-
-                        // 1. 棣栧厛鏌ヨ鏄惁鏈夊凡瀹屾垚鐨勫紓姝ュ搷搴�
-                        String response = wmsOperateUtils.queryAsyncInTaskResponse(barcode, stationIdVal, taskNo);
-
-                        if (!Cools.isEmpty(response)) {
-                            // 2. 鏈夊搷搴旂粨鏋滐紝澶勭悊鍝嶅簲
-                            if (response.equals("FAILED") || response.startsWith("ERROR:")) {
-                                // 璇锋眰澶辫触锛岄噸鏂板彂璧峰紓姝ヨ姹�
-                                News.error("WMS鍏ュ簱璇锋眰澶辫触锛岄噸鏂板彂璧疯姹傦紝barcode={}锛宻tationId={}锛宺esponse={}", barcode,
-                                        stationIdVal, response);
-                                wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal, taskNo,
-                                        stationProtocol.getPalletHeight());
-                                redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
-                                stationProtocol.setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS杩斿洖=" + response);
-                                continue;
-                            }
-
-                            // 瑙f瀽鍝嶅簲
-                            JSONObject jsonObject = JSON.parseObject(response);
-                            if (jsonObject.getInteger("code").equals(200)) {
-                                StartupDto dto = jsonObject.getObject("data", StartupDto.class);
-
-                                CreateInTaskParam taskParam = new CreateInTaskParam();
-                                taskParam.setTaskNo(dto.getTaskNo());
-                                taskParam.setLocNo(dto.getLocNo());
-                                taskParam.setTaskPri(dto.getTaskPri());
-                                taskParam.setBarcode(barcode);
-                                WrkMast wrkMast = commonService.createInTask(taskParam);
-                                stationProtocol.setSystemWarning("");
-                            } else {
-                                // 鎺ュ彛杩斿洖闈�200锛岄噸鏂板彂璧疯姹�
-                                News.error("WMS鍏ュ簱鎺ュ彛杩斿洖闈�200锛岄噸鏂板彂璧疯姹傦紝barcode={}锛宻tationId={}锛宺esponse={}", barcode,
-                                        stationIdVal, response);
-                                wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal, taskNo,
-                                        stationProtocol.getPalletHeight());
-                                redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
-                                stationProtocol.setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS杩斿洖=" + response);
-                            }
-                        } else {
-                            // 3. 娌℃湁鍝嶅簲缁撴灉锛屾鏌ユ槸鍚︽湁璇锋眰姝e湪杩涜涓�
-                            if (!wmsOperateUtils.isAsyncRequestInProgress(barcode, stationIdVal, taskNo)) {
-                                // 娌℃湁璇锋眰杩涜涓紝鍙戣捣鏂扮殑寮傛璇锋眰
-                                News.info("鍙戣捣寮傛WMS鍏ュ簱璇锋眰锛宐arcode={}锛宻tationId={}", barcode, stationIdVal);
-                                wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal, taskNo,
-                                        stationProtocol.getPalletHeight());
-                                redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
-                                stationProtocol.setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS鏃犺繑鍥�");
-                            }
-                        }
-                    }
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
+    @Override
+    public boolean matchCandidate(StoreInTaskContext context) {
+        StationProtocol stationProtocol = context.getStationProtocol();
+        return stationProtocol.isAutoing()
+                && stationProtocol.isLoading()
+                && stationProtocol.isInEnable()
+                && stationProtocol.getTaskNo() > 0
+                && !Cools.isEmpty(stationProtocol.getBarcode());
     }
 
     //妫�娴嬪叆搴撶珯鏄惁鏈変换鍔$敓鎴愶紝骞跺惎鍔ㄥ叆搴�
diff --git a/src/main/java/com/zy/core/plugin/XiaosongProcess.java b/src/main/java/com/zy/core/plugin/XiaosongProcess.java
index bfc10ca..bfed9a4 100644
--- a/src/main/java/com/zy/core/plugin/XiaosongProcess.java
+++ b/src/main/java/com/zy/core/plugin/XiaosongProcess.java
@@ -24,6 +24,9 @@
 import com.zy.core.model.command.StationCommand;
 import com.zy.core.model.protocol.StationProtocol;
 import com.zy.core.plugin.api.MainProcessPluginApi;
+import com.zy.core.plugin.store.StoreInTaskContext;
+import com.zy.core.plugin.store.StoreInTaskGenerationService;
+import com.zy.core.plugin.store.StoreInTaskPolicy;
 import com.zy.core.thread.StationThread;
 import com.zy.core.utils.CrnOperateProcessUtils;
 import com.zy.core.utils.DualCrnOperateProcessUtils;
@@ -39,7 +42,7 @@
 
 @Slf4j
 @Component
-public class XiaosongProcess implements MainProcessPluginApi {
+public class XiaosongProcess implements MainProcessPluginApi, StoreInTaskPolicy {
 
     @Autowired
     private CrnOperateProcessUtils crnOperateUtils;
@@ -57,6 +60,8 @@
     private WmsOperateUtils wmsOperateUtils;
     @Autowired
     private DualCrnOperateProcessUtils dualCrnOperateProcessUtils;
+    @Autowired
+    private StoreInTaskGenerationService storeInTaskGenerationService;
 
     @Override
     public void run() {
@@ -96,140 +101,43 @@
      * 鍏ュ簱绔欙紝鏍规嵁鏉$爜鎵弿鐢熸垚鍏ュ簱宸ヤ綔妗�
      */
     public synchronized void generateStoreWrkFile() {
-        try {
-            Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
-            if (systemConfigMapObj == null) {
-                return;
-            }
-            HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
+        storeInTaskGenerationService.generate(this);
+    }
 
-            int conveyorStationTaskLimit = 30;
-            String conveyorStationTaskLimitStr = systemConfigMap.get("conveyorStationTaskLimit");
-            if (conveyorStationTaskLimitStr != null) {
-                conveyorStationTaskLimit = Integer.parseInt(conveyorStationTaskLimitStr);
-            }
-            int currentStationTaskCount = stationOperateProcessUtils.getCurrentStationTaskCount();
-            if (currentStationTaskCount > conveyorStationTaskLimit) {
-                News.error("杈撻�佺珯鐐逛换鍔″凡杈惧埌涓婇檺锛屼笂闄愬�硷細{}锛岀珯鐐逛换鍔℃暟锛歿}", conveyorStationTaskLimit, currentStationTaskCount);
-                return;
-            }
+    @Override
+    public boolean matchCandidate(StoreInTaskContext context) {
+        StationProtocol stationProtocol = context.getStationProtocol();
+        return stationProtocol.isAutoing()
+                && stationProtocol.isLoading()
+                && stationProtocol.isInEnable()
+                && stationProtocol.getTaskNo() > 0
+                && !Cools.isEmpty(stationProtocol.getBarcode());
+    }
 
-            List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<>());
-            for (BasDevp basDevp : basDevps) {
-                StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
-                if (stationThread == null) {
-                    continue;
-                }
-
-                Map<Integer, StationProtocol> stationMap = stationThread.getStatusMap();
-
-                List<StationObjModel> list = basDevp.getBarcodeStationList$();
-                for (StationObjModel entity : list) {
-                    Integer stationId = entity.getStationId();
-                    if (!stationMap.containsKey(stationId)) {
-                        continue;
-                    }
-
-                    StationProtocol stationProtocol = stationMap.get(stationId);
-                    if (stationProtocol == null) {
-                        continue;
-                    }
-
-                    if (stationProtocol.isAutoing()
-                            && stationProtocol.isLoading()
-                            && stationProtocol.isInEnable()
-                            && stationProtocol.getTaskNo() > 0) {
-                        if (Cools.isEmpty(stationProtocol.getBarcode())) {
-                            continue;
-                        }
-
-                        if (stationProtocol.getError() > 0) {
-                            Object lock = redisUtil.get(RedisKeyType.GENERATE_STATION_BACK_LIMIT.key + stationProtocol.getTaskNo());
-                            if (lock != null) {
-                                continue;
-                            }
-                            StationObjModel backStation = entity.getBackStation();
-                            StationCommand command = stationThread.getCommand(StationCommandType.MOVE, commonService.getWorkNo(WrkIoType.STATION_BACK.id), stationId, backStation.getStationId(), 0);
-                            if (command == null) {
-                                News.taskInfo(stationProtocol.getTaskNo(), "{}宸ヤ綔,鑾峰彇杈撻�佺嚎鍛戒护澶辫触", stationProtocol.getTaskNo());
-                                continue;
-                            }
-                            MessageQueue.offer(SlaveType.Devp, basDevp.getDevpNo(), new Task(2, command));
-                            News.taskInfo(stationProtocol.getTaskNo(), "{}鎵爜寮傚父锛屽凡閫�鍥炶嚦{}", backStation.getStationId());
-                            redisUtil.set(RedisKeyType.GENERATE_STATION_BACK_LIMIT.key + stationProtocol.getTaskNo(), "lock", 10);
-                        }
-
-                        // 妫�娴嬩换鍔℃槸鍚︾敓鎴�
-                        List<WrkMast> wrkMasts = wrkMastService
-                                .list(new QueryWrapper<WrkMast>()
-                                        .eq("barcode", stationProtocol.getBarcode()));
-                        if (!wrkMasts.isEmpty()) {
-                            continue;
-                        }
-
-                        Object lock = redisUtil.get(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId);
-                        if (lock != null) {
-                            continue;
-                        }
-
-                        String barcode = stationProtocol.getBarcode();
-                        Integer stationIdVal = stationProtocol.getStationId();
-                        Integer taskNo = stationProtocol.getTaskNo();
-
-                        // 1. 棣栧厛鏌ヨ鏄惁鏈夊凡瀹屾垚鐨勫紓姝ュ搷搴�
-                        String response = wmsOperateUtils.queryAsyncInTaskResponse(barcode, stationIdVal, taskNo);
-
-                        if (!Cools.isEmpty(response)) {
-                            // 2. 鏈夊搷搴旂粨鏋滐紝澶勭悊鍝嶅簲
-                            if (response.equals("FAILED") || response.startsWith("ERROR:")) {
-                                // 璇锋眰澶辫触锛岄噸鏂板彂璧峰紓姝ヨ姹�
-                                News.error("WMS鍏ュ簱璇锋眰澶辫触锛岄噸鏂板彂璧疯姹傦紝barcode={}锛宻tationId={}锛宺esponse={}", barcode,
-                                        stationIdVal, response);
-                                wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal, taskNo,
-                                        stationProtocol.getPalletHeight());
-                                redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
-                                stationProtocol.setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS杩斿洖=" + response);
-                                continue;
-                            }
-
-                            // 瑙f瀽鍝嶅簲
-                            JSONObject jsonObject = JSON.parseObject(response);
-                            if (jsonObject.getInteger("code").equals(200)) {
-                                StartupDto dto = jsonObject.getObject("data", StartupDto.class);
-
-                                CreateInTaskParam taskParam = new CreateInTaskParam();
-                                taskParam.setTaskNo(dto.getTaskNo());
-                                taskParam.setLocNo(dto.getLocNo());
-                                taskParam.setTaskPri(dto.getTaskPri());
-                                taskParam.setBarcode(barcode);
-                                WrkMast wrkMast = commonService.createInTask(taskParam);
-                                stationProtocol.setSystemWarning("");
-                            } else {
-                                // 鎺ュ彛杩斿洖闈�200锛岄噸鏂板彂璧疯姹�
-                                News.error("WMS鍏ュ簱鎺ュ彛杩斿洖闈�200锛岄噸鏂板彂璧疯姹傦紝barcode={}锛宻tationId={}锛宺esponse={}", barcode,
-                                        stationIdVal, response);
-                                wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal, taskNo,
-                                        stationProtocol.getPalletHeight());
-                                redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
-                                stationProtocol.setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS杩斿洖=" + response);
-                            }
-                        } else {
-                            // 3. 娌℃湁鍝嶅簲缁撴灉锛屾鏌ユ槸鍚︽湁璇锋眰姝e湪杩涜涓�
-                            if (!wmsOperateUtils.isAsyncRequestInProgress(barcode, stationIdVal, taskNo)) {
-                                // 娌℃湁璇锋眰杩涜涓紝鍙戣捣鏂扮殑寮傛璇锋眰
-                                News.info("鍙戣捣寮傛WMS鍏ュ簱璇锋眰锛宐arcode={}锛宻tationId={}", barcode, stationIdVal);
-                                wmsOperateUtils.applyInTaskAsync(barcode, stationIdVal, taskNo,
-                                        stationProtocol.getPalletHeight());
-                                redisUtil.set(RedisKeyType.GENERATE_IN_TASK_LIMIT.key + stationId, "lock", 2);
-                                stationProtocol.setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS鏃犺繑鍥�");
-                            }
-                        }
-                    }
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
+    @Override
+    public boolean beforeApply(StoreInTaskContext context) {
+        StationProtocol stationProtocol = context.getStationProtocol();
+        if (stationProtocol.getError() <= 0) {
+            return true;
         }
+
+        Object lock = redisUtil.get(RedisKeyType.GENERATE_STATION_BACK_LIMIT.key + stationProtocol.getTaskNo());
+        if (lock != null) {
+            return false;
+        }
+        StationObjModel backStation = context.getStationObjModel().getBackStation();
+        StationCommand command = context.getStationThread().getCommand(StationCommandType.MOVE,
+                commonService.getWorkNo(WrkIoType.STATION_BACK.id),
+                context.getStationObjModel().getStationId(),
+                backStation.getStationId(), 0);
+        if (command == null) {
+            News.taskInfo(stationProtocol.getTaskNo(), "{}宸ヤ綔,鑾峰彇杈撻�佺嚎鍛戒护澶辫触", stationProtocol.getTaskNo());
+            return false;
+        }
+        MessageQueue.offer(SlaveType.Devp, context.getBasDevp().getDevpNo(), new Task(2, command));
+        News.taskInfo(stationProtocol.getTaskNo(), "{}鎵爜寮傚父锛屽凡閫�鍥炶嚦{}", backStation.getStationId());
+        redisUtil.set(RedisKeyType.GENERATE_STATION_BACK_LIMIT.key + stationProtocol.getTaskNo(), "lock", 10);
+        return true;
     }
 
     //妫�娴嬪叆搴撶珯鏄惁鏈変换鍔$敓鎴愶紝骞跺惎鍔ㄥ叆搴�
diff --git a/src/main/java/com/zy/core/plugin/store/AsyncInTaskResult.java b/src/main/java/com/zy/core/plugin/store/AsyncInTaskResult.java
new file mode 100644
index 0000000..f45d6c4
--- /dev/null
+++ b/src/main/java/com/zy/core/plugin/store/AsyncInTaskResult.java
@@ -0,0 +1,24 @@
+package com.zy.core.plugin.store;
+
+import lombok.Data;
+
+@Data
+public class AsyncInTaskResult {
+
+    private String bizKey;
+
+    private AsyncInTaskStatus status;
+
+    private String response;
+
+    private String message;
+
+    public boolean isSuccess() {
+        return AsyncInTaskStatus.SUCCESS.equals(status);
+    }
+
+    public boolean isRetryableFailure() {
+        return AsyncInTaskStatus.RETRYABLE_FAIL.equals(status);
+    }
+
+}
diff --git a/src/main/java/com/zy/core/plugin/store/AsyncInTaskStatus.java b/src/main/java/com/zy/core/plugin/store/AsyncInTaskStatus.java
new file mode 100644
index 0000000..ee1bb59
--- /dev/null
+++ b/src/main/java/com/zy/core/plugin/store/AsyncInTaskStatus.java
@@ -0,0 +1,9 @@
+package com.zy.core.plugin.store;
+
+public enum AsyncInTaskStatus {
+
+    SUCCESS,
+    RETRYABLE_FAIL,
+    FINAL_FAIL
+
+}
diff --git a/src/main/java/com/zy/core/plugin/store/InTaskApplyRequest.java b/src/main/java/com/zy/core/plugin/store/InTaskApplyRequest.java
new file mode 100644
index 0000000..d2cb8ae
--- /dev/null
+++ b/src/main/java/com/zy/core/plugin/store/InTaskApplyRequest.java
@@ -0,0 +1,23 @@
+package com.zy.core.plugin.store;
+
+import lombok.Data;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@Data
+public class InTaskApplyRequest {
+
+    private String bizKey;
+
+    private String barcode;
+
+    private Integer sourceStaNo;
+
+    private Integer taskNo;
+
+    private Integer locType1;
+
+    private Map<String, Object> extraParams = new LinkedHashMap<>();
+
+}
diff --git a/src/main/java/com/zy/core/plugin/store/StoreInTaskContext.java b/src/main/java/com/zy/core/plugin/store/StoreInTaskContext.java
new file mode 100644
index 0000000..d8fb14e
--- /dev/null
+++ b/src/main/java/com/zy/core/plugin/store/StoreInTaskContext.java
@@ -0,0 +1,22 @@
+package com.zy.core.plugin.store;
+
+import com.zy.asrs.entity.BasDevp;
+import com.zy.core.model.StationObjModel;
+import com.zy.core.model.protocol.StationProtocol;
+import com.zy.core.thread.StationThread;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class StoreInTaskContext {
+
+    private BasDevp basDevp;
+
+    private StationThread stationThread;
+
+    private StationObjModel stationObjModel;
+
+    private StationProtocol stationProtocol;
+
+}
diff --git a/src/main/java/com/zy/core/plugin/store/StoreInTaskGenerationService.java b/src/main/java/com/zy/core/plugin/store/StoreInTaskGenerationService.java
new file mode 100644
index 0000000..0436732
--- /dev/null
+++ b/src/main/java/com/zy/core/plugin/store/StoreInTaskGenerationService.java
@@ -0,0 +1,190 @@
+package com.zy.core.plugin.store;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.core.common.Cools;
+import com.zy.asrs.domain.param.CreateInTaskParam;
+import com.zy.asrs.entity.BasDevp;
+import com.zy.asrs.entity.WrkMast;
+import com.zy.asrs.service.BasDevpService;
+import com.zy.asrs.service.WrkMastService;
+import com.zy.common.model.StartupDto;
+import com.zy.common.service.CommonService;
+import com.zy.common.utils.RedisUtil;
+import com.zy.core.News;
+import com.zy.core.cache.SlaveConnection;
+import com.zy.core.enums.RedisKeyType;
+import com.zy.core.enums.SlaveType;
+import com.zy.core.model.StationObjModel;
+import com.zy.core.model.protocol.StationProtocol;
+import com.zy.core.thread.StationThread;
+import com.zy.core.utils.StationOperateProcessUtils;
+import com.zy.core.utils.WmsOperateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class StoreInTaskGenerationService {
+
+    @Autowired
+    private BasDevpService basDevpService;
+    @Autowired
+    private WrkMastService wrkMastService;
+    @Autowired
+    private StationOperateProcessUtils stationOperateProcessUtils;
+    @Autowired
+    private RedisUtil redisUtil;
+    @Autowired
+    private WmsOperateUtils wmsOperateUtils;
+    @Autowired
+    private CommonService commonService;
+
+    public void generate(StoreInTaskPolicy policy) {
+        try {
+            if (!policy.isEnabled()) {
+                return;
+            }
+
+            Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
+            if (systemConfigMapObj == null) {
+                return;
+            }
+            HashMap<String, String> systemConfigMap = (HashMap<String, String>) systemConfigMapObj;
+
+            int conveyorStationTaskLimit = 30;
+            String conveyorStationTaskLimitStr = systemConfigMap.get("conveyorStationTaskLimit");
+            if (conveyorStationTaskLimitStr != null) {
+                conveyorStationTaskLimit = Integer.parseInt(conveyorStationTaskLimitStr);
+            }
+            int currentStationTaskCount = stationOperateProcessUtils.getCurrentStationTaskCount();
+            if (currentStationTaskCount > conveyorStationTaskLimit) {
+                News.error("杈撻�佺珯鐐逛换鍔″凡杈惧埌涓婇檺锛屼笂闄愬�硷細{}锛岀珯鐐逛换鍔℃暟锛歿}", conveyorStationTaskLimit, currentStationTaskCount);
+                return;
+            }
+
+            List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<>());
+            for (BasDevp basDevp : basDevps) {
+                StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, basDevp.getDevpNo());
+                if (stationThread == null) {
+                    continue;
+                }
+
+                Map<Integer, StationProtocol> stationMap = stationThread.getStatusMap();
+                List<StationObjModel> barcodeStations = policy.getBarcodeStations(basDevp);
+                for (StationObjModel stationObjModel : barcodeStations) {
+                    Integer stationId = stationObjModel.getStationId();
+                    if (!stationMap.containsKey(stationId)) {
+                        continue;
+                    }
+
+                    StationProtocol stationProtocol = stationMap.get(stationId);
+                    if (stationProtocol == null) {
+                        continue;
+                    }
+
+                    StoreInTaskContext context = new StoreInTaskContext(basDevp, stationThread, stationObjModel,
+                            stationProtocol);
+                    if (!policy.matchCandidate(context)) {
+                        continue;
+                    }
+                    if (!policy.beforeApply(context)) {
+                        continue;
+                    }
+
+                    List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>()
+                            .eq("barcode", stationProtocol.getBarcode()));
+                    if (!wrkMasts.isEmpty()) {
+                        continue;
+                    }
+
+                    String generateLockKey = policy.getGenerateLockKey(context);
+                    Object lock = redisUtil.get(generateLockKey);
+                    if (lock != null) {
+                        continue;
+                    }
+
+                    policy.onRequestPermitGranted(context);
+
+                    InTaskApplyRequest request = policy.buildApplyRequest(context);
+                    AsyncInTaskResult result = wmsOperateUtils.queryAsyncInTaskResponse(request);
+                    if (result != null) {
+                        handleApplyResult(policy, context, request, result);
+                        continue;
+                    }
+
+                    if (wmsOperateUtils.isAsyncRequestInProgress(request)) {
+                        continue;
+                    }
+
+                    News.info("鍙戣捣寮傛WMS鍏ュ簱璇锋眰锛宐arcode={}锛宻tationId={}", request.getBarcode(),
+                            request.getSourceStaNo());
+                    wmsOperateUtils.applyInTaskAsync(request);
+                    redisUtil.set(generateLockKey, "lock", policy.getSubmitLockSeconds(context));
+                    policy.onApplySubmitted(context);
+                }
+            }
+        } catch (Exception e) {
+            News.error("鐢熸垚鍏ュ簱浠诲姟寮傚父锛宲olicy={}", policy.getPolicyName(), e);
+        }
+    }
+
+    private void handleApplyResult(StoreInTaskPolicy policy, StoreInTaskContext context, InTaskApplyRequest request,
+                                   AsyncInTaskResult result) {
+        if (result.isSuccess()) {
+            handleApplySuccess(policy, context, request, result);
+            return;
+        }
+
+        if (result.isRetryableFailure()) {
+            News.error("WMS鍏ュ簱璇锋眰澶辫触锛岄噸鏂板彂璧疯姹傦紝barcode={}锛宻tationId={}锛宺esponse={}",
+                    request.getBarcode(), request.getSourceStaNo(), policy.buildFailureMessage(result));
+            wmsOperateUtils.clearAsyncInTaskResponse(request);
+            wmsOperateUtils.applyInTaskAsync(request);
+            redisUtil.set(policy.getGenerateLockKey(context), "lock", policy.getRetryLockSeconds(context));
+            policy.onApplyFailed(context, result);
+            return;
+        }
+
+        policy.onApplyFailed(context, result);
+    }
+
+    private void handleApplySuccess(StoreInTaskPolicy policy, StoreInTaskContext context, InTaskApplyRequest request,
+                                    AsyncInTaskResult result) {
+        try {
+            JSONObject jsonObject = JSON.parseObject(result.getResponse());
+            if (jsonObject == null || !Integer.valueOf(200).equals(jsonObject.getInteger("code"))) {
+                AsyncInTaskResult failResult = new AsyncInTaskResult();
+                failResult.setStatus(AsyncInTaskStatus.RETRYABLE_FAIL);
+                failResult.setResponse(result.getResponse());
+                failResult.setMessage("WMS杩斿洖闈�200");
+                handleApplyResult(policy, context, request, failResult);
+                return;
+            }
+
+            StartupDto dto = jsonObject.getObject("data", StartupDto.class);
+            if (dto == null) {
+                AsyncInTaskResult failResult = new AsyncInTaskResult();
+                failResult.setStatus(AsyncInTaskStatus.RETRYABLE_FAIL);
+                failResult.setResponse(result.getResponse());
+                failResult.setMessage("WMS杩斿洖data涓虹┖");
+                handleApplyResult(policy, context, request, failResult);
+                return;
+            }
+
+            CreateInTaskParam taskParam = policy.buildCreateInTaskParam(context, dto);
+            WrkMast wrkMast = commonService.createInTask(taskParam);
+            policy.afterTaskCreated(context, wrkMast);
+            context.getStationProtocol().setSystemWarning("");
+            wmsOperateUtils.clearAsyncInTaskResponse(request);
+        } catch (Exception e) {
+            News.error("澶勭悊WMS鍏ュ簱鎴愬姛鍝嶅簲澶辫触锛宐arcode={}锛宻tationId={}", request.getBarcode(),
+                    request.getSourceStaNo(), e);
+        }
+    }
+
+}
diff --git a/src/main/java/com/zy/core/plugin/store/StoreInTaskPolicy.java b/src/main/java/com/zy/core/plugin/store/StoreInTaskPolicy.java
new file mode 100644
index 0000000..7549ec5
--- /dev/null
+++ b/src/main/java/com/zy/core/plugin/store/StoreInTaskPolicy.java
@@ -0,0 +1,84 @@
+package com.zy.core.plugin.store;
+
+import com.core.common.Cools;
+import com.zy.asrs.domain.param.CreateInTaskParam;
+import com.zy.asrs.entity.BasDevp;
+import com.zy.asrs.entity.WrkMast;
+import com.zy.common.model.StartupDto;
+import com.zy.core.enums.RedisKeyType;
+import com.zy.core.model.StationObjModel;
+
+import java.util.List;
+
+public interface StoreInTaskPolicy {
+
+    default boolean isEnabled() {
+        return true;
+    }
+
+    default String getPolicyName() {
+        return getClass().getSimpleName();
+    }
+
+    default List<StationObjModel> getBarcodeStations(BasDevp basDevp) {
+        return basDevp.getBarcodeStationList$();
+    }
+
+    boolean matchCandidate(StoreInTaskContext context);
+
+    default boolean beforeApply(StoreInTaskContext context) {
+        return true;
+    }
+
+    default void onRequestPermitGranted(StoreInTaskContext context) {
+    }
+
+    default String getGenerateLockKey(StoreInTaskContext context) {
+        return RedisKeyType.GENERATE_IN_TASK_LIMIT.key + context.getStationObjModel().getStationId();
+    }
+
+    default int getSubmitLockSeconds(StoreInTaskContext context) {
+        return 2;
+    }
+
+    default int getRetryLockSeconds(StoreInTaskContext context) {
+        return 2;
+    }
+
+    default InTaskApplyRequest buildApplyRequest(StoreInTaskContext context) {
+        InTaskApplyRequest request = new InTaskApplyRequest();
+        request.setBarcode(context.getStationProtocol().getBarcode());
+        request.setSourceStaNo(context.getStationProtocol().getStationId());
+        request.setTaskNo(context.getStationProtocol().getTaskNo());
+        request.setLocType1(context.getStationProtocol().getPalletHeight());
+        return request;
+    }
+
+    default CreateInTaskParam buildCreateInTaskParam(StoreInTaskContext context, StartupDto dto) {
+        CreateInTaskParam taskParam = new CreateInTaskParam();
+        taskParam.setTaskNo(dto.getTaskNo());
+        taskParam.setLocNo(dto.getLocNo());
+        taskParam.setTaskPri(dto.getTaskPri());
+        taskParam.setBarcode(context.getStationProtocol().getBarcode());
+        return taskParam;
+    }
+
+    default void afterTaskCreated(StoreInTaskContext context, WrkMast wrkMast) {
+    }
+
+    default void onApplySubmitted(StoreInTaskContext context) {
+        context.getStationProtocol().setSystemWarning("璇锋眰鍏ュ簱涓�");
+    }
+
+    default void onApplyFailed(StoreInTaskContext context, AsyncInTaskResult result) {
+        context.getStationProtocol().setSystemWarning("璇锋眰鍏ュ簱澶辫触锛學MS杩斿洖=" + buildFailureMessage(result));
+    }
+
+    default String buildFailureMessage(AsyncInTaskResult result) {
+        if (!Cools.isEmpty(result.getResponse())) {
+            return result.getResponse();
+        }
+        return result.getMessage();
+    }
+
+}
diff --git a/src/main/java/com/zy/core/utils/WmsOperateUtils.java b/src/main/java/com/zy/core/utils/WmsOperateUtils.java
index a99d80a..e11ffec 100644
--- a/src/main/java/com/zy/core/utils/WmsOperateUtils.java
+++ b/src/main/java/com/zy/core/utils/WmsOperateUtils.java
@@ -23,6 +23,9 @@
 import com.zy.core.News;
 import com.zy.core.enums.RedisKeyType;
 import com.zy.core.enums.SlaveType;
+import com.zy.core.plugin.store.AsyncInTaskResult;
+import com.zy.core.plugin.store.AsyncInTaskStatus;
+import com.zy.core.plugin.store.InTaskApplyRequest;
 import com.zy.system.entity.Config;
 import com.zy.system.service.ConfigService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -31,7 +34,9 @@
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.LinkedBlockingQueue;
@@ -82,6 +87,23 @@
 
     private final ConcurrentMap<String, Boolean> asyncInTaskInflight = new ConcurrentHashMap<>();
 
+    private String buildAsyncInTaskBizKey(InTaskApplyRequest request) {
+        if (!Cools.isEmpty(request.getBizKey())) {
+            return request.getBizKey();
+        }
+        StringBuilder keyBuilder = new StringBuilder(request.getBarcode())
+                .append("_")
+                .append(request.getSourceStaNo());
+        if (request.getTaskNo() != null && request.getTaskNo() > 0) {
+            keyBuilder.append("_").append(request.getTaskNo());
+        }
+        return keyBuilder.toString();
+    }
+
+    private String buildAsyncInTaskKey(String prefix, InTaskApplyRequest request) {
+        return prefix + buildAsyncInTaskBizKey(request);
+    }
+
     private String buildAsyncInTaskKey(String prefix, String barcode, Integer stationId, Integer taskNo) {
         StringBuilder keyBuilder = new StringBuilder(prefix)
                 .append(barcode)
@@ -95,6 +117,14 @@
 
     // 鐢宠鍏ュ簱浠诲姟
     public String applyInTask(String barcode, Integer sourceStaNo, Integer locType1) {
+        InTaskApplyRequest request = new InTaskApplyRequest();
+        request.setBarcode(barcode);
+        request.setSourceStaNo(sourceStaNo);
+        request.setLocType1(locType1);
+        return applyInTask(request);
+    }
+
+    public String applyInTask(InTaskApplyRequest request) {
         Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
         if (systemConfigMapObj == null) {
             News.error("绯荤粺Config缂撳瓨澶辨晥");
@@ -114,26 +144,29 @@
             return null;
         }
 
-        HashMap<String, Object> requestParam = new HashMap<>();
+        Map<String, Object> requestParam = new LinkedHashMap<>();
         String response = null;
         int result = 0;
         try {
             BasStation basStation = basStationService
-                    .getOne(new QueryWrapper<BasStation>().eq("station_id", sourceStaNo));
+                    .getOne(new QueryWrapper<BasStation>().eq("station_id", request.getSourceStaNo()));
             if (basStation == null) {
-                News.error("绔欑偣{}涓嶅瓨鍦�", sourceStaNo);
+                News.error("绔欑偣{}涓嶅瓨鍦�", request.getSourceStaNo());
                 return null;
             }
 
-            String stationNo = String.valueOf(sourceStaNo);
+            String stationNo = String.valueOf(request.getSourceStaNo());
             if (!Cools.isEmpty(basStation.getStationAlias())) {
                 stationNo = basStation.getStationAlias();
             }
 
-            requestParam.put("barcode", barcode);
+            requestParam.put("barcode", request.getBarcode());
             requestParam.put("sourceStaNo", stationNo);
-            requestParam.put("locType1", locType1 == null ? 1 : locType1);
-            requestParam.put("row", Utils.getInTaskEnableRow(sourceStaNo));
+            requestParam.put("locType1", request.getLocType1() == null ? 1 : request.getLocType1());
+            requestParam.put("row", Utils.getInTaskEnableRow(request.getSourceStaNo()));
+            if (request.getExtraParams() != null && !request.getExtraParams().isEmpty()) {
+                requestParam.putAll(request.getExtraParams());
+            }
 
             response = new HttpHandler.Builder()
                     .setUri(wmsUrl)
@@ -184,8 +217,17 @@
     }
 
     public void applyInTaskAsync(String barcode, Integer sourceStaNo, Integer taskNo, Integer locType1) {
-        String requestKey = buildAsyncInTaskKey(RedisKeyType.ASYNC_WMS_IN_TASK_REQUEST.key, barcode, sourceStaNo, taskNo);
-        String responseKey = buildAsyncInTaskKey(RedisKeyType.ASYNC_WMS_IN_TASK_RESPONSE.key, barcode, sourceStaNo, taskNo);
+        InTaskApplyRequest request = new InTaskApplyRequest();
+        request.setBarcode(barcode);
+        request.setSourceStaNo(sourceStaNo);
+        request.setTaskNo(taskNo);
+        request.setLocType1(locType1);
+        applyInTaskAsync(request);
+    }
+
+    public void applyInTaskAsync(InTaskApplyRequest request) {
+        String requestKey = buildAsyncInTaskKey(RedisKeyType.ASYNC_WMS_IN_TASK_REQUEST.key, request);
+        String responseKey = buildAsyncInTaskKey(RedisKeyType.ASYNC_WMS_IN_TASK_RESPONSE.key, request);
 
         if (asyncInTaskInflight.putIfAbsent(requestKey, Boolean.TRUE) != null) {
             return;
@@ -204,20 +246,17 @@
         try {
             APPLY_IN_TASK_EXECUTOR.execute(() -> {
                 try {
-                    String response = applyInTask(barcode, sourceStaNo, locType1);
-                    if (response != null) {
-                        redisUtil.set(responseKey, response, APPLY_IN_TASK_RESPONSE_TTL_SECONDS);
-                        News.info("寮傛WMS鍏ュ簱璇锋眰瀹屾垚锛宐arcode={}锛宻tationId={}锛宼askNo={}锛宺esponse={}",
-                                barcode, sourceStaNo, taskNo, response);
-                    } else {
-                        redisUtil.set(responseKey, "FAILED", 10);
-                        News.error("寮傛WMS鍏ュ簱璇锋眰澶辫触锛宐arcode={}锛宻tationId={}锛宼askNo={}",
-                                barcode, sourceStaNo, taskNo);
-                    }
+                    String response = applyInTask(request);
+                    AsyncInTaskResult result = buildAsyncInTaskResult(request, response, null);
+                    redisUtil.set(responseKey, JSON.toJSONString(result), APPLY_IN_TASK_RESPONSE_TTL_SECONDS);
+                    News.info("寮傛WMS鍏ュ簱璇锋眰瀹屾垚锛宐arcode={}锛宻tationId={}锛宼askNo={}锛宻tatus={}锛宺esponse={}",
+                            request.getBarcode(), request.getSourceStaNo(), request.getTaskNo(),
+                            result.getStatus(), response);
                 } catch (Exception e) {
                     News.error("寮傛WMS鍏ュ簱璇锋眰寮傚父锛宐arcode={}锛宻tationId={}锛宼askNo={}锛宔rror={}",
-                            barcode, sourceStaNo, taskNo, e.getMessage());
-                    redisUtil.set(responseKey, "ERROR:" + e.getMessage(), 10);
+                            request.getBarcode(), request.getSourceStaNo(), request.getTaskNo(), e.getMessage());
+                    AsyncInTaskResult result = buildAsyncInTaskResult(request, null, e);
+                    redisUtil.set(responseKey, JSON.toJSONString(result), APPLY_IN_TASK_RESPONSE_TTL_SECONDS);
                 } finally {
                     asyncInTaskInflight.remove(requestKey);
                     redisUtil.del(requestKey);
@@ -226,9 +265,13 @@
         } catch (RejectedExecutionException e) {
             asyncInTaskInflight.remove(requestKey);
             redisUtil.del(requestKey);
-            redisUtil.set(responseKey, "ERROR:ASYNC_QUEUE_FULL", 10);
+            AsyncInTaskResult result = new AsyncInTaskResult();
+            result.setBizKey(buildAsyncInTaskBizKey(request));
+            result.setStatus(AsyncInTaskStatus.RETRYABLE_FAIL);
+            result.setMessage("ERROR:ASYNC_QUEUE_FULL");
+            redisUtil.set(responseKey, JSON.toJSONString(result), APPLY_IN_TASK_RESPONSE_TTL_SECONDS);
             News.error("寮傛WMS鍏ュ簱璇锋眰琚嫆缁濓紝绾跨▼姹犲凡婊★紝barcode={}锛宻tationId={}锛宼askNo={}",
-                    barcode, sourceStaNo, taskNo);
+                    request.getBarcode(), request.getSourceStaNo(), request.getTaskNo());
         }
     }
 
@@ -244,14 +287,68 @@
     }
 
     public String queryAsyncInTaskResponse(String barcode, Integer stationId, Integer taskNo) {
-        String responseKey = buildAsyncInTaskKey(RedisKeyType.ASYNC_WMS_IN_TASK_RESPONSE.key, barcode, stationId, taskNo);
-        Object response = redisUtil.get(responseKey);
-        if (response != null) {
-            // 鑾峰彇鍚庡垹闄わ紝閬垮厤閲嶅澶勭悊
-            redisUtil.del(responseKey);
-            return response.toString();
+        InTaskApplyRequest request = new InTaskApplyRequest();
+        request.setBarcode(barcode);
+        request.setSourceStaNo(stationId);
+        request.setTaskNo(taskNo);
+        AsyncInTaskResult result = queryAsyncInTaskResponse(request);
+        if (result == null) {
+            return null;
         }
-        return null;
+        clearAsyncInTaskResponse(request);
+        if (result.isSuccess()) {
+            return result.getResponse();
+        }
+        if (!Cools.isEmpty(result.getMessage())) {
+            return result.getMessage();
+        }
+        return result.getResponse();
+    }
+
+    public AsyncInTaskResult queryAsyncInTaskResponse(InTaskApplyRequest request) {
+        String responseKey = buildAsyncInTaskKey(RedisKeyType.ASYNC_WMS_IN_TASK_RESPONSE.key, request);
+        Object response = redisUtil.get(responseKey);
+        if (response == null) {
+            return null;
+        }
+        return parseAsyncInTaskResult(buildAsyncInTaskBizKey(request), response.toString());
+    }
+
+    public void clearAsyncInTaskResponse(InTaskApplyRequest request) {
+        String responseKey = buildAsyncInTaskKey(RedisKeyType.ASYNC_WMS_IN_TASK_RESPONSE.key, request);
+        redisUtil.del(responseKey);
+    }
+
+    private AsyncInTaskResult parseAsyncInTaskResult(String bizKey, String responseValue) {
+        AsyncInTaskResult result = null;
+        try {
+            JSONObject jsonObject = JSON.parseObject(responseValue);
+            if (jsonObject != null && jsonObject.containsKey("status")) {
+                result = jsonObject.toJavaObject(AsyncInTaskResult.class);
+            } else if (jsonObject != null && jsonObject.containsKey("code")) {
+                result = new AsyncInTaskResult();
+                result.setBizKey(bizKey);
+                result.setResponse(responseValue);
+                if (Integer.valueOf(200).equals(jsonObject.getInteger("code"))) {
+                    result.setStatus(AsyncInTaskStatus.SUCCESS);
+                } else {
+                    result.setStatus(AsyncInTaskStatus.RETRYABLE_FAIL);
+                    result.setMessage(responseValue);
+                }
+            }
+        } catch (Exception ignored) {
+        }
+
+        if (result != null) {
+            return result;
+        }
+
+        result = new AsyncInTaskResult();
+        result.setBizKey(bizKey);
+        result.setResponse(responseValue);
+        result.setStatus(AsyncInTaskStatus.RETRYABLE_FAIL);
+        result.setMessage(responseValue);
+        return result;
     }
 
     /**
@@ -266,10 +363,48 @@
     }
 
     public boolean isAsyncRequestInProgress(String barcode, Integer stationId, Integer taskNo) {
-        String requestKey = buildAsyncInTaskKey(RedisKeyType.ASYNC_WMS_IN_TASK_REQUEST.key, barcode, stationId, taskNo);
+        InTaskApplyRequest request = new InTaskApplyRequest();
+        request.setBarcode(barcode);
+        request.setSourceStaNo(stationId);
+        request.setTaskNo(taskNo);
+        return isAsyncRequestInProgress(request);
+    }
+
+    public boolean isAsyncRequestInProgress(InTaskApplyRequest request) {
+        String requestKey = buildAsyncInTaskKey(RedisKeyType.ASYNC_WMS_IN_TASK_REQUEST.key, request);
         return asyncInTaskInflight.containsKey(requestKey) || redisUtil.get(requestKey) != null;
     }
 
+    private AsyncInTaskResult buildAsyncInTaskResult(InTaskApplyRequest request, String response, Exception exception) {
+        AsyncInTaskResult result = new AsyncInTaskResult();
+        result.setBizKey(buildAsyncInTaskBizKey(request));
+        result.setResponse(response);
+        if (exception != null) {
+            result.setStatus(AsyncInTaskStatus.RETRYABLE_FAIL);
+            result.setMessage("ERROR:" + exception.getMessage());
+            return result;
+        }
+
+        if (response == null) {
+            result.setStatus(AsyncInTaskStatus.RETRYABLE_FAIL);
+            result.setMessage("FAILED");
+            return result;
+        }
+
+        try {
+            JSONObject jsonObject = JSON.parseObject(response);
+            if (jsonObject != null && Integer.valueOf(200).equals(jsonObject.getInteger("code"))) {
+                result.setStatus(AsyncInTaskStatus.SUCCESS);
+                return result;
+            }
+        } catch (Exception ignored) {
+        }
+
+        result.setStatus(AsyncInTaskStatus.RETRYABLE_FAIL);
+        result.setMessage(response);
+        return result;
+    }
+
     // 鐢宠浠诲姟閲嶆柊鍒嗛厤搴撲綅
     public synchronized String applyReassignTaskLocNo(Integer taskNo, Integer stationId) {
         String wmsUrl = null;
diff --git a/src/main/webapp/components/DevpCard.js b/src/main/webapp/components/DevpCard.js
index 4aecb86..b55e1d4 100644
--- a/src/main/webapp/components/DevpCard.js
+++ b/src/main/webapp/components/DevpCard.js
@@ -277,6 +277,7 @@
         { label: "浠诲姟鍙啓鍖�", value: this.orDash(item.taskWriteIdx) },
         { label: "鏁呴殰浠g爜", value: this.orDash(item.error) },
         { label: "鏁呴殰淇℃伅", value: this.orDash(item.errorMsg) },
+        { label: "绯荤粺鍛婅", value: this.orDash(item.systemWarning) },
         { label: "鎵╁睍鏁版嵁", value: this.orDash(item.extend) }
       ];
     },

--
Gitblit v1.9.1