From 0c497375461a8f8cb644f9dc2f4473dabb52abd2 Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期二, 10 三月 2026 15:16:39 +0800
Subject: [PATCH] 空板自动出库定时任务

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/MaterialAutoSchedules.java |   62 ++++++++++++++++++++++++++++++-
 1 files changed, 60 insertions(+), 2 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/MaterialAutoSchedules.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/MaterialAutoSchedules.java
index 14cdc65..48ae660 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/MaterialAutoSchedules.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/MaterialAutoSchedules.java
@@ -3,11 +3,14 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.vincent.rsf.framework.exception.CoolException;
+import com.vincent.rsf.server.manager.controller.params.LocToTaskParams;
 import com.vincent.rsf.server.manager.controller.params.OutStockToTaskParams;
 import com.vincent.rsf.server.manager.controller.params.PakinItem;
 import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
 import com.vincent.rsf.server.manager.entity.*;
+import com.vincent.rsf.server.common.constant.Constants;
 import com.vincent.rsf.server.manager.enums.AsnExceStatus;
+import com.vincent.rsf.server.manager.enums.LocStsType;
 import com.vincent.rsf.server.manager.enums.OrderType;
 import com.vincent.rsf.server.manager.enums.OrderWorkType;
 import com.vincent.rsf.server.manager.enums.TaskStsType;
@@ -20,6 +23,7 @@
 import com.vincent.rsf.server.system.service.ConfigService;
 import com.vincent.rsf.server.system.utils.SerialRuleUtils;
 import lombok.extern.slf4j.Slf4j;
+import lombok.val;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
@@ -30,10 +34,11 @@
 import java.util.stream.Collectors;
 
 /**
- * 鎸囧畾鐗╂枡鑷姩鍖栧畾鏃朵换鍔★細鍙厤缃墿鏂欑紪鐮佸悗锛�
+ * 鎸囧畾鐗╂枡/绌烘澘鑷姩鍖栧畾鏃朵换鍔★細鍙厤缃悗
  * 1锛夋湁搴撳瓨鏃惰嚜鍔ㄧ敓鎴愬叏鐗堝嚭搴撳崟锛�
  * 2锛夎鐗╂枡鍑哄簱鍗曡嚜鍔ㄤ笅鍙戜换鍔★紱
- * 3锛塕CS 鍏ュ簱閫氱煡鏃讹紙鍙�夛級鑷姩缁勬墭锛屾暟閲忓彲閰嶇疆銆�
+ * 3锛塕CS 鍏ュ簱閫氱煡鏃讹紙鍙�夛級鑷姩缁勬墭锛屾暟閲忓彲閰嶇疆锛�
+ * 4锛夌┖鏉�(D)搴撲綅瀹氭椂鑷姩鐢熸垚绌烘澘鍑哄簱浠诲姟骞朵笅鍙� RCS锛圓UTO_EMPTY_OUT_ENABLED锛夈��
  */
 @Slf4j
 @Component
@@ -228,6 +233,59 @@
     }
 
     /**
+     * 瀹氭椂浠诲姟锛氱┖鏉垮簱瀛樿嚜鍔ㄥ嚭搴擄紙姣� 2 鍒嗛挓锛�
+     * 閰嶇疆锛欰UTO_EMPTY_OUT_ENABLED=true 鏃讹紝鎵弿绌烘澘(D)搴撲綅锛岀敓鎴愮┖鏉垮嚭搴撲换鍔″苟涓嬪彂 RCS锛屾祦绋嬩笌 AUTO_FULL_OUT 瀵瑰簲瀹氭椂浠诲姟涓�鑷淬��
+     */
+    @Scheduled(cron = "0 0/2 * * * ?")
+    @Transactional(rollbackFor = Exception.class)
+    public void autoEmptyOutTask() {
+        Config enabledConfig = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_EMPTY_OUT_ENABLED));
+        if (enabledConfig == null || !Boolean.parseBoolean(enabledConfig.getVal())) {
+            return;
+        }
+        List<Loc> emptyLocs = locService.list(new LambdaQueryWrapper<Loc>()
+                .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_D.type));
+        if (emptyLocs.isEmpty()) {
+            return;
+        }
+        List<Task> existingEmptyOut = taskService.list(new LambdaQueryWrapper<Task>()
+                .eq(Task::getTaskType, TaskType.TASK_TYPE_EMPITY_OUT.type)
+                .lt(Task::getTaskStatus, TaskStsType.COMPLETE_OUT.id));
+        Set<String> locCodesInProgress = existingEmptyOut.stream()
+                .map(Task::getOrgLoc).filter(Objects::nonNull).collect(Collectors.toSet());
+        List<Task> created = new ArrayList<>();
+        for (Loc loc : emptyLocs) {
+            if (locCodesInProgress.contains(loc.getCode())) {
+                continue;
+            }
+            try {
+                LocToTaskParams params = new LocToTaskParams();
+                params.setType(Constants.TASK_TYPE_OUT_STOCK_EMPTY)
+                        .setOrgLoc(loc.getCode())
+                        .setSiteNo(DEFAULT_SITE_NO);
+                Task task = locItemService.generateTaskEmpty(params, SYSTEM_USER_ID);
+                created.add(task);
+                locCodesInProgress.add(loc.getCode());
+            } catch (Exception e) {
+                log.warn("[鑷姩绌烘澘鍑哄簱] 搴撲綅 {} 鐢熸垚浠诲姟澶辫触: {}", loc.getCode(), e.getMessage());
+            }
+        }
+        if (!created.isEmpty()) {
+            List<Task> toPublish = created.stream()
+                    .filter(t -> TaskStsType.GENERATE_OUT.id.equals(t.getTaskStatus()))
+                    .collect(Collectors.toList());
+            if (!toPublish.isEmpty()) {
+                try {
+                    taskService.pubTaskToWcs(toPublish);
+                    log.info("[鑷姩绌烘澘鍑哄簱] 宸茬敓鎴愬苟涓嬪彂 {} 涓┖鏉垮嚭搴撲换鍔�", toPublish.size());
+                } catch (Exception e) {
+                    log.error("[鑷姩绌烘澘鍑哄簱] 涓嬪彂 RCS 澶辫触", e);
+                }
+            }
+        }
+    }
+
+    /**
      * 瀹氭椂浠诲姟锛氶厤缃墿鏂欏嚭搴撲换鍔″湪 RCS 鍥炶皟涓� 199锛堝緟纭锛夊悗鑷姩鎷h揣瀹屾垚锛屾棤闇� PDA 蹇�熸嫞璐х‘璁ゅ嵆鍙洿鏂板簱瀛樸��
      * 閰嶇疆锛欰UTO_FULL_OUT_MATNR_CODE锛堢墿鏂欑紪鐮侊紝閰嶇疆浜嗗垯瀵硅鐗╂枡鐢熸晥锛�
      */

--
Gitblit v1.9.1