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

---
 src/main/resources/mapper/BasStationMapper.xml                            |    1 
 src/main/java/com/zy/core/utils/StationOperateProcessUtils.java           |   13 ++++
 src/main/resources/sql/20260321_add_out_task_limit_to_asr_bas_station.sql |   24 ++++++++
 src/main/webapp/static/js/basStation/basStation.js                        |   36 ++++++++++++
 src/main/java/com/zy/asrs/entity/BasStation.java                          |    7 ++
 src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java           |   30 ++++++++++
 src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java               |   31 ++++++++++
 7 files changed, 142 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/zy/asrs/entity/BasStation.java b/src/main/java/com/zy/asrs/entity/BasStation.java
index 5c5dac5..ddf4bfc 100644
--- a/src/main/java/com/zy/asrs/entity/BasStation.java
+++ b/src/main/java/com/zy/asrs/entity/BasStation.java
@@ -109,6 +109,13 @@
     @TableField("station_alias")
     private String stationAlias;
 
+    /**
+     * 鍑哄簱浠诲姟涓婇檺
+     */
+    @ApiModelProperty(value= "鍑哄簱浠诲姟涓婇檺")
+    @TableField("out_task_limit")
+    private Integer outTaskLimit;
+
     public BasStation() {}
 
     public BasStation(Integer status,Integer wrkNo,String inEnable,String outEnable,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo,Integer stationLev) {
diff --git a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
index 3e5a8e6..903d756 100644
--- a/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/CrnOperateProcessUtils.java
@@ -8,10 +8,12 @@
 import com.core.exception.CoolException;
 import com.zy.asrs.domain.enums.NotifyMsgType;
 import com.zy.asrs.domain.param.CreateLocMoveTaskParam;
+import com.zy.asrs.entity.BasStation;
 import com.zy.asrs.entity.BasCrnp;
 import com.zy.asrs.entity.LocMast;
 import com.zy.asrs.entity.WrkMast;
 import com.zy.asrs.service.BasCrnpService;
+import com.zy.asrs.service.BasStationService;
 import com.zy.asrs.service.LocMastService;
 import com.zy.asrs.service.WrkMastService;
 import com.zy.asrs.utils.NotifyUtils;
@@ -49,6 +51,8 @@
     private BasCrnpService basCrnpService;
     @Autowired
     private LocMastService locMastService;
+    @Autowired
+    private BasStationService basStationService;
     @Autowired
     private RedisUtil redisUtil;
     @Autowired
@@ -340,6 +344,9 @@
         );
 
         for (WrkMast wrkMast : wrkMasts) {
+            if (isOutboundTargetStationTaskLimitReached(wrkMast)) {
+                continue;
+            }
             if (!allowBatchOutboundExecute(wrkMast)) {
                 continue;
             }
@@ -526,6 +533,10 @@
 
         Integer crnNo = basCrnp.getCrnNo();
 
+        if (isOutboundTargetStationTaskLimitReached(wrkMast)) {
+            return false;
+        }
+
         if (!allowBatchOutboundExecute(wrkMast)) {
             return false;
         }
@@ -663,6 +674,26 @@
         return false;
     }
 
+    private boolean isOutboundTargetStationTaskLimitReached(WrkMast wrkMast) {
+        if (wrkMast == null || wrkMast.getStaNo() == null) {
+            return false;
+        }
+        BasStation basStation = basStationService.getById(wrkMast.getStaNo());
+        if (basStation == null || basStation.getOutTaskLimit() == null || basStation.getOutTaskLimit() < 0) {
+            return false;
+        }
+        int currentStationTaskCount = stationOperateProcessUtils.getCurrentOutboundTaskCountByTargetStation(wrkMast.getStaNo());
+        if (currentStationTaskCount >= basStation.getOutTaskLimit()) {
+            News.taskInfo(wrkMast.getWrkNo(),
+                    "鐩爣鍑哄簱绔�:{} 宸茶揪鍑哄簱浠诲姟涓婇檺锛屽綋鍓�={}锛屼笂闄�={}",
+                    wrkMast.getStaNo(),
+                    currentStationTaskCount,
+                    basStation.getOutTaskLimit());
+            return true;
+        }
+        return false;
+    }
+
     private int getSystemConfigInt(String code, int defaultValue) {
         Object systemConfigMapObj = redisUtil.get(RedisKeyType.SYSTEM_CONFIG_MAP.key);
         if (systemConfigMapObj == null) {
diff --git a/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java b/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
index d697601..db09977 100644
--- a/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/DualCrnOperateProcessUtils.java
@@ -7,10 +7,12 @@
 import com.core.exception.CoolException;
 import com.zy.asrs.domain.enums.NotifyMsgType;
 import com.zy.asrs.domain.param.CreateLocMoveTaskParam;
+import com.zy.asrs.entity.BasStation;
 import com.zy.asrs.entity.BasDualCrnp;
 import com.zy.asrs.entity.LocMast;
 import com.zy.asrs.entity.WrkMast;
 import com.zy.asrs.service.BasDualCrnpService;
+import com.zy.asrs.service.BasStationService;
 import com.zy.asrs.service.LocMastService;
 import com.zy.asrs.service.WrkMastService;
 import com.zy.asrs.utils.NotifyUtils;
@@ -53,6 +55,8 @@
     @Autowired
     private LocMastService locMastService;
     @Autowired
+    private BasStationService basStationService;
+    @Autowired
     private RedisUtil redisUtil;
     @Autowired
     private WmsOperateUtils wmsOperateUtils;
@@ -60,6 +64,8 @@
     private CommonService commonService;
     @Autowired
     private NotifyUtils notifyUtils;
+    @Autowired
+    private StationOperateProcessUtils stationOperateProcessUtils;
 
     //鍏ュ嚭搴�  ===>>  鍙屽伐浣嶅爢鍨涙満鍏ュ嚭搴撲綔涓氫笅鍙�
     public synchronized void dualCrnIoExecute() {
@@ -549,6 +555,10 @@
 
         Integer crnNo = basDualCrnp.getCrnNo();
 
+        if (isOutboundTargetStationTaskLimitReached(wrkMast)) {
+            return null;
+        }
+
         for (StationObjModel stationObjModel : outStationList) {
             StationThread stationThread = (StationThread) SlaveConnection.get(SlaveType.Devp, stationObjModel.getDeviceNo());
             if (stationThread == null) {
@@ -629,6 +639,26 @@
         return null;
     }
 
+    private boolean isOutboundTargetStationTaskLimitReached(WrkMast wrkMast) {
+        if (wrkMast == null || wrkMast.getStaNo() == null) {
+            return false;
+        }
+        BasStation basStation = basStationService.getById(wrkMast.getStaNo());
+        if (basStation == null || basStation.getOutTaskLimit() == null || basStation.getOutTaskLimit() < 0) {
+            return false;
+        }
+        int currentStationTaskCount = stationOperateProcessUtils.getCurrentOutboundTaskCountByTargetStation(wrkMast.getStaNo());
+        if (currentStationTaskCount >= basStation.getOutTaskLimit()) {
+            News.taskInfo(wrkMast.getWrkNo(),
+                    "鐩爣鍑哄簱绔�:{} 宸茶揪鍑哄簱浠诲姟涓婇檺锛屽綋鍓�={}锛屼笂闄�={}",
+                    wrkMast.getStaNo(),
+                    currentStationTaskCount,
+                    basStation.getOutTaskLimit());
+            return true;
+        }
+        return false;
+    }
+
     private synchronized SendDualCrnCommandParam crnExecuteLocMove(BasDualCrnp basDualCrnp, DualCrnThread dualCrnThread, WrkMast wrkMast, int station) {
         DualCrnProtocol dualCrnProtocol = dualCrnThread.getStatus();
         if (dualCrnProtocol == null) {
diff --git a/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java b/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
index 485ef91..0f90d81 100644
--- a/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
+++ b/src/main/java/com/zy/core/utils/StationOperateProcessUtils.java
@@ -586,6 +586,19 @@
         return countCurrentStationTask();
     }
 
+    public synchronized int getCurrentOutboundTaskCountByTargetStation(Integer stationId) {
+        if (stationId == null) {
+            return 0;
+        }
+        return (int) wrkMastService.count(new QueryWrapper<WrkMast>()
+                .eq("io_type", WrkIoType.OUT.id)
+                .eq("sta_no", stationId)
+                .in("wrk_sts",
+                        WrkStsType.OUTBOUND_RUN.sts,
+                        WrkStsType.OUTBOUND_RUN_COMPLETE.sts,
+                        WrkStsType.STATION_RUN.sts));
+    }
+
     // 妫�娴嬪嚭搴撴帓搴�
     public synchronized void checkStationOutOrder() {
         List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<BasDevp>());
diff --git a/src/main/resources/mapper/BasStationMapper.xml b/src/main/resources/mapper/BasStationMapper.xml
index df720ea..d9af751 100644
--- a/src/main/resources/mapper/BasStationMapper.xml
+++ b/src/main/resources/mapper/BasStationMapper.xml
@@ -17,6 +17,7 @@
         <result column="station_lev" property="stationLev" />
         <result column="device_no" property="deviceNo" />
         <result column="station_alias" property="stationAlias" />
+        <result column="out_task_limit" property="outTaskLimit" />
 
     </resultMap>
 
diff --git a/src/main/resources/sql/20260321_add_out_task_limit_to_asr_bas_station.sql b/src/main/resources/sql/20260321_add_out_task_limit_to_asr_bas_station.sql
new file mode 100644
index 0000000..a99fd9e
--- /dev/null
+++ b/src/main/resources/sql/20260321_add_out_task_limit_to_asr_bas_station.sql
@@ -0,0 +1,24 @@
+-- asr_bas_station 澧炲姞鍑哄簱浠诲姟涓婇檺閰嶇疆
+-- 鐢ㄩ�旓細鎸夋渶缁堝嚭搴撶珯闄愬埗鍫嗗灈鏈哄彲鍚屾椂鏀捐鐨勫湪閫斿嚭搴撲换鍔℃暟
+-- 閫傜敤鏁版嵁搴擄細MySQL
+
+SET @current_db := DATABASE();
+
+SET @out_task_limit_exists := (
+  SELECT COUNT(1)
+  FROM information_schema.COLUMNS
+  WHERE TABLE_SCHEMA = @current_db
+    AND TABLE_NAME = 'asr_bas_station'
+    AND COLUMN_NAME = 'out_task_limit'
+);
+
+SET @add_out_task_limit_sql := IF(
+  @out_task_limit_exists = 0,
+  'ALTER TABLE asr_bas_station ADD COLUMN out_task_limit INT NULL COMMENT ''鍑哄簱浠诲姟涓婇檺锛�<0鎴朜ULL琛ㄧず涓嶉檺鍒讹紝0琛ㄧず绂佹鏂板嚭搴�'' AFTER station_alias',
+  'SELECT ''column out_task_limit already exists'' '
+);
+PREPARE stmt_out_task_limit FROM @add_out_task_limit_sql;
+EXECUTE stmt_out_task_limit;
+DEALLOCATE PREPARE stmt_out_task_limit;
+
+SHOW COLUMNS FROM asr_bas_station LIKE 'out_task_limit';
diff --git a/src/main/webapp/static/js/basStation/basStation.js b/src/main/webapp/static/js/basStation/basStation.js
index 0ef3129..cd29b53 100644
--- a/src/main/webapp/static/js/basStation/basStation.js
+++ b/src/main/webapp/static/js/basStation/basStation.js
@@ -238,6 +238,24 @@
         checkboxInactiveRaw: 'N'
     },
     {
+        field: 'outTaskLimit',
+        columnName: 'out_task_limit',
+        label: '鍑哄簱浠诲姟涓婇檺',
+        tableProp: 'outTaskLimit',
+        exportField: 'outTaskLimit',
+        kind: 'text',
+        valueType: 'number',
+        required: false,
+        primaryKey: false,
+        sortable: false,
+        textarea: false,
+        minWidth: 130,
+        enumOptions: [],
+        foreignQuery: '',
+        checkboxActiveRaw: '1',
+        checkboxInactiveRaw: '0'
+    },
+    {
         field: 'stationId',
         columnName: 'station_id',
         label: '缂栥��銆�鍙�',
@@ -470,6 +488,24 @@
         foreignQuery: '',
         checkboxActiveRaw: 'Y',
         checkboxInactiveRaw: 'N'
+    },
+    {
+        field: 'outTaskLimit',
+        columnName: 'out_task_limit',
+        label: '鍑哄簱浠诲姟涓婇檺',
+        tableProp: 'outTaskLimit',
+        exportField: 'outTaskLimit',
+        kind: 'text',
+        valueType: 'number',
+        required: false,
+        primaryKey: false,
+        sortable: false,
+        textarea: false,
+        minWidth: 130,
+        enumOptions: [],
+        foreignQuery: '',
+        checkboxActiveRaw: '1',
+        checkboxInactiveRaw: '0'
     }
 
     ]);

--
Gitblit v1.9.1