From cb249acbd7ed7f3bc2afa2bc9bee7d69ac8b5e30 Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期二, 10 三月 2026 14:22:43 +0800
Subject: [PATCH] 空板自动出库定时任务
---
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/MaterialAutoSchedules.java | 103 ++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 96 insertions(+), 7 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 4c56377..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,14 +3,18 @@
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;
+import com.vincent.rsf.server.manager.enums.TaskType;
import com.vincent.rsf.server.manager.service.*;
import com.vincent.rsf.server.manager.utils.LocManageUtil;
import com.vincent.rsf.server.system.constant.GlobalConfigCode;
@@ -19,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;
@@ -29,10 +34,11 @@
import java.util.stream.Collectors;
/**
- * 鎸囧畾鐗╂枡鑷姩鍖栧畾鏃朵换鍔★細鍙厤缃墿鏂欑紪鐮佸悗锛�
+ * 鎸囧畾鐗╂枡/绌烘澘鑷姩鍖栧畾鏃朵换鍔★細鍙厤缃悗
* 1锛夋湁搴撳瓨鏃惰嚜鍔ㄧ敓鎴愬叏鐗堝嚭搴撳崟锛�
* 2锛夎鐗╂枡鍑哄簱鍗曡嚜鍔ㄤ笅鍙戜换鍔★紱
- * 3锛塕CS 鍏ュ簱閫氱煡鏃讹紙鍙�夛級鑷姩缁勬墭锛屾暟閲忓彲閰嶇疆銆�
+ * 3锛塕CS 鍏ュ簱閫氱煡鏃讹紙鍙�夛級鑷姩缁勬墭锛屾暟閲忓彲閰嶇疆锛�
+ * 4锛夌┖鏉�(D)搴撲綅瀹氭椂鑷姩鐢熸垚绌烘澘鍑哄簱浠诲姟骞朵笅鍙� RCS锛圓UTO_EMPTY_OUT_ENABLED锛夈��
*/
@Slf4j
@Component
@@ -65,10 +71,10 @@
private WaitPakinItemService waitPakinItemService;
/**
- * 瀹氭椂浠诲姟1锛氭寚瀹氱墿鏂欐湁搴撳瓨鏃惰嚜鍔ㄧ敓鎴愬叏鐗堝嚭搴撳崟锛堟瘡 2 鍒嗛挓锛�
+ * 瀹氭椂浠诲姟1锛氭寚瀹氱墿鏂欐湁搴撳瓨鏃惰嚜鍔ㄧ敓鎴愬叏鐗堝嚭搴撳崟
* 閰嶇疆锛欰UTO_FULL_OUT_MATNR_CODE锛堢墿鏂欑紪鐮侊級銆丄UTO_FULL_OUT_ENABLED锛坱rue 鍚敤锛�
*/
- @Scheduled(cron = "0 0/2 * * * ?")
+ @Scheduled(cron = "0/35 * * * * ?")
@Transactional(rollbackFor = Exception.class)
public void autoCreateFullOutOrder() {
Config enabledConfig = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_FULL_OUT_ENABLED));
@@ -227,11 +233,94 @@
}
/**
- * 瀹氭椂浠诲姟3锛氭棤璁㈠崟缁勬墭 + 鑷姩鐢熸垚鍏ュ簱鍗曪紙浠呴拡瀵归厤缃墿鏂欙紝姣� 2 鍒嗛挓锛�
+ * 瀹氭椂浠诲姟锛氱┖鏉垮簱瀛樿嚜鍔ㄥ嚭搴擄紙姣� 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锛堢墿鏂欑紪鐮侊紝閰嶇疆浜嗗垯瀵硅鐗╂枡鐢熸晥锛�
+ */
+ @Scheduled(cron = "0 0/1 * * * ?")
+ public void autoConfirmPickOut() {
+ Config matnrConfig = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_FULL_OUT_MATNR_CODE));
+ if (matnrConfig == null || StringUtils.isBlank(matnrConfig.getVal())) {
+ return;
+ }
+ String matnrCode = matnrConfig.getVal().trim();
+ List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>()
+ .eq(Task::getTaskType, TaskType.TASK_TYPE_OUT.type)
+ .eq(Task::getTaskStatus, TaskStsType.WAVE_SEED.id));
+ for (Task task : tasks) {
+ long cnt = taskItemService.count(new LambdaQueryWrapper<TaskItem>()
+ .eq(TaskItem::getTaskId, task.getId())
+ .eq(TaskItem::getMatnrCode, matnrCode));
+ if (cnt == 0) {
+ continue;
+ }
+ try {
+ taskService.completeFullOutStock(task.getId(), SYSTEM_USER_ID);
+ log.info("[鑷姩鎷h揣瀹屾垚] 浠诲姟: {}, 鏂欑: {}, 鐗╂枡: {} 宸茶嚜鍔ㄧ‘璁ゅ嚭搴撳苟鏇存柊搴撳瓨", task.getTaskCode(), task.getBarcode(), matnrCode);
+ } catch (Exception e) {
+ log.warn("[鑷姩鎷h揣瀹屾垚] 浠诲姟: {} 澶勭悊澶辫触: {}", task.getTaskCode(), e.getMessage());
+ }
+ }
+ }
+
+ /**
+ * 瀹氭椂浠诲姟3锛氭棤璁㈠崟缁勬墭 + 鑷姩鐢熸垚鍏ュ簱鍗曪紙浠呴拡瀵归厤缃墿鏂欙紝锛�
* 鍏堟寜閰嶇疆鐗╂枡涓庢暟閲忓仛鏃犺鍗曠粍鎵橈紝鍐嶇敓鎴愬叆搴撳崟骞跺叧鑱旂粍鎵樻槑缁嗭紝渚夸簬 RCS 鍏ュ簱闂幆銆�
* 閰嶇疆锛欰UTO_PAKIN_ON_ASN_ENABLED锛坱rue锛夈�丄UTO_FULL_OUT_MATNR_CODE銆丄UTO_PAKIN_QTY锛堟暟閲忥級
*/
- @Scheduled(cron = "0 0/2 * * * ?")
+// @Scheduled(cron = "0/35 * * * * ?")
@Transactional(rollbackFor = Exception.class)
public void autoPakinOnInbound() {
Config enabledConfig = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_PAKIN_ON_ASN_ENABLED));
@@ -288,7 +377,7 @@
waitPakin = mobileService.mergeItems(param, SYSTEM_USER_ID);
} catch (Exception e) {
log.warn("[鏃犺鍗曡嚜鍔ㄧ粍鎵榏 缁勬墭澶辫触: {}", e.getMessage());
- return;
+ throw e; // 閲嶆柊鎶涘嚭锛岄伩鍏嶄簨鍔¤鏍囪 rollback-only 鍚庝粛灏濊瘯鎻愪氦瀵艰嚧 UnexpectedRollbackException
}
// 2锛夎嚜鍔ㄧ敓鎴愬叆搴撳崟锛堜竴鏉℃槑缁嗭紝閰嶇疆鐗╂枡 + 鏁伴噺锛�
String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ASN_ORDER, null);
--
Gitblit v1.9.1