From 7a717a0bbc0eac8e494cd84207482e983ef56a3c Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期日, 08 二月 2026 17:42:55 +0800
Subject: [PATCH] RCS入库流程优化
---
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java | 234 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 231 insertions(+), 3 deletions(-)
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
index b836ec9..266582d 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
@@ -29,6 +29,7 @@
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.service.*;
import com.vincent.rsf.server.manager.service.impl.LocServiceImpl;
+import com.vincent.rsf.server.system.utils.SystemAuthUtils;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.manager.enums.LocStsType;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
@@ -44,6 +45,9 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.Random;
@@ -77,6 +81,8 @@
private WaitPakinItemService waitPakinItemService;
@Autowired
private BasStationService basStationService;
+ @Autowired
+ private LocItemWorkingService locItemWorkingService;
@Autowired
private RestTemplate restTemplate;
@Autowired
@@ -118,8 +124,179 @@
// 楠岃瘉璁惧绔欑偣
DeviceSite deviceSite = validateDeviceSite(param);
- // 楠岃瘉缁勬嫋鐘舵��
- WaitPakin waitPakin = validateWaitPakin(param.getBarcode());
+ // 鎻愬墠瀹氫箟waitPakin锛岄伩鍏嶄綔鐢ㄥ煙闂
+ WaitPakin waitPakin = null;
+
+ // 鍏堥獙璇佺粍鎷栫姸鎬侊紝鑾峰彇缁勬墭鏄庣粏淇℃伅锛堢敤浜庢壒鍙峰尮閰嶅拰鍗曞彿妫�鏌ワ級
+ waitPakin = validateWaitPakin(param.getBarcode());
+ List<WaitPakinItem> waitPakinItems = waitPakinItemService.list(
+ new LambdaQueryWrapper<WaitPakinItem>()
+ .eq(WaitPakinItem::getPakinId, waitPakin.getId()));
+
+ // 鍏堟鏌ユ槸鍚︽湁鎷f枡鍏ュ簱浠诲姟锛堥渶瑕佸悓鏃跺尮閰嶇鍙峰拰鎵瑰彿锛�
+ Task pickInTask = null;
+ // 妫�鏌ユ槸鍚︽湁鐩樼偣鍏ュ簱浠诲姟锛堥渶瑕佸悓鏃跺尮閰嶇鍙峰拰鎵瑰彿锛�
+ Task checkInTask = null;
+
+ if (!waitPakinItems.isEmpty()) {
+ // 鑾峰彇缁勬墭鏄庣粏涓殑鎵瑰彿鍒楄〃锛堝幓閲嶏級
+ List<String> batchList = waitPakinItems.stream()
+ .map(WaitPakinItem::getBatch)
+ .filter(Objects::nonNull)
+ .filter(batch -> !batch.trim().isEmpty())
+ .distinct()
+ .collect(Collectors.toList());
+
+ if (!batchList.isEmpty()) {
+ log.info("妫�鏌ョ粍鎵樻槑缁嗘壒鍙� - 鎵瑰彿鍒楄〃锛歿}", batchList);
+
+ // 鏌ヨ鎷f枡鍏ュ簱浠诲姟锛氱鍙峰尮閰嶄笖鐘舵�佷负1鎴�2
+ List<Task> pickInTasks = taskService.list(new LambdaQueryWrapper<Task>()
+ .eq(Task::getBarcode, param.getBarcode())
+ .eq(Task::getTaskType, TaskType.TASK_TYPE_PICK_IN.type)
+ .in(Task::getTaskStatus, TaskStsType.GENERATE_IN.id, TaskStsType.WCS_EXECUTE_IN.id)
+ .orderByDesc(Task::getCreateTime));
+
+ // 閫氳繃TaskItem鐨刡atch瀛楁鍖归厤鎵瑰彿
+ for (Task task : pickInTasks) {
+ List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>()
+ .eq(TaskItem::getTaskId, task.getId())
+ .in(TaskItem::getBatch, batchList));
+
+ if (!taskItems.isEmpty()) {
+ pickInTask = task;
+ log.info("鎵惧埌鍖归厤鐨勬嫞鏂欏叆搴撲换鍔★紙绠卞彿鍜屾壒鍙烽兘鍖归厤锛� - 浠诲姟缂栫爜锛歿}锛屾壒鍙凤細{}",
+ task.getTaskCode(), batchList);
+ break;
+ }
+ }
+
+ // 鏌ヨ鐩樼偣鍏ュ簱浠诲姟锛氱鍙峰尮閰嶄笖鐘舵�佷负1鎴�2
+ List<Task> checkInTasks = taskService.list(new LambdaQueryWrapper<Task>()
+ .eq(Task::getBarcode, param.getBarcode())
+ .eq(Task::getTaskType, TaskType.TASK_TYPE_CHECK_IN.type)
+ .in(Task::getTaskStatus, TaskStsType.GENERATE_IN.id, TaskStsType.WCS_EXECUTE_IN.id)
+ .orderByDesc(Task::getCreateTime));
+
+ // 閫氳繃TaskItem鐨刡atch瀛楁鍖归厤鎵瑰彿
+ for (Task task : checkInTasks) {
+ List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>()
+ .eq(TaskItem::getTaskId, task.getId())
+ .in(TaskItem::getBatch, batchList));
+
+ if (!taskItems.isEmpty()) {
+ checkInTask = task;
+ log.info("鎵惧埌鍖归厤鐨勭洏鐐瑰叆搴撲换鍔★紙绠卞彿鍜屾壒鍙烽兘鍖归厤锛� - 浠诲姟缂栫爜锛歿}锛屾壒鍙凤細{}",
+ task.getTaskCode(), batchList);
+ break;
+ }
+ }
+ }
+ }
+
+ // 濡傛灉鏄嫞鏂欏叆搴撲换鍔★紝鐩存帴杩斿洖锛屼笉鏍¢獙缁勬墭
+ if (Objects.nonNull(pickInTask)) {
+ log.info("鎷f枡鍏ュ簱浠诲姟锛岀洿鎺ヨ繑鍥烇紝涓嶆牎楠岀粍鎵� - 浠诲姟缂栫爜锛歿}", pickInTask.getTaskCode());
+
+ // 鏇存柊鍏ュ簱绔欑偣淇℃伅锛堝鏋滀笌褰撳墠鐢宠鐨勭珯鐐逛笉鍚岋級
+ if (StringUtils.isNotBlank(param.getSourceStaNo()) &&
+ !param.getSourceStaNo().equals(pickInTask.getOrgSite())) {
+ log.info("鏇存柊鎷f枡鍏ュ簱浠诲姟鐨勫叆搴撶珯鐐� - 浠诲姟缂栫爜锛歿}锛屽師绔欑偣锛歿}锛屾柊绔欑偣锛歿}",
+ pickInTask.getTaskCode(), pickInTask.getOrgSite(), param.getSourceStaNo());
+ pickInTask.setOrgSite(param.getSourceStaNo());
+ if (!taskService.updateById(pickInTask)) {
+ log.warn("鏇存柊鎷f枡鍏ュ簱浠诲姟鐨勫叆搴撶珯鐐瑰け璐� - 浠诲姟缂栫爜锛歿}", pickInTask.getTaskCode());
+ }
+ }
+
+ // 杩斿洖鎷f枡鍏ュ簱浠诲姟鐨勪俊鎭�
+ InTaskMsgDto msgDto = new InTaskMsgDto();
+ msgDto.setWorkNo(pickInTask.getTaskCode());
+ msgDto.setTaskId(pickInTask.getId());
+ msgDto.setLocNo(pickInTask.getTargLoc());
+ msgDto.setSourceStaNo(pickInTask.getOrgSite());
+ msgDto.setStaNo(pickInTask.getTargSite());
+ return msgDto;
+ }
+
+ // 濡傛灉鏄洏鐐瑰叆搴撲换鍔★紝鐩存帴杩斿洖锛屼笉鏍¢獙缁勬墭
+ if (Objects.nonNull(checkInTask)) {
+ log.info("鐩樼偣鍏ュ簱浠诲姟锛岀洿鎺ヨ繑鍥烇紝涓嶆牎楠岀粍鎵� - 浠诲姟缂栫爜锛歿}", checkInTask.getTaskCode());
+
+ // 鏇存柊鍏ュ簱绔欑偣淇℃伅锛堝鏋滀笌褰撳墠鐢宠鐨勭珯鐐逛笉鍚岋級
+ if (StringUtils.isNotBlank(param.getSourceStaNo()) &&
+ !param.getSourceStaNo().equals(checkInTask.getOrgSite())) {
+ log.info("鏇存柊鐩樼偣鍏ュ簱浠诲姟鐨勫叆搴撶珯鐐� - 浠诲姟缂栫爜锛歿}锛屽師绔欑偣锛歿}锛屾柊绔欑偣锛歿}",
+ checkInTask.getTaskCode(), checkInTask.getOrgSite(), param.getSourceStaNo());
+ checkInTask.setOrgSite(param.getSourceStaNo());
+ if (!taskService.updateById(checkInTask)) {
+ log.warn("鏇存柊鐩樼偣鍏ュ簱浠诲姟鐨勫叆搴撶珯鐐瑰け璐� - 浠诲姟缂栫爜锛歿}", checkInTask.getTaskCode());
+ }
+ }
+
+ // 杩斿洖鐩樼偣鍏ュ簱浠诲姟鐨勪俊鎭�
+ InTaskMsgDto msgDto = new InTaskMsgDto();
+ msgDto.setWorkNo(checkInTask.getTaskCode());
+ msgDto.setTaskId(checkInTask.getId());
+ msgDto.setLocNo(checkInTask.getTargLoc());
+ msgDto.setSourceStaNo(checkInTask.getOrgSite());
+ msgDto.setStaNo(checkInTask.getTargSite());
+ return msgDto;
+ }
+
+ // 妫�鏌ュ叾浠栧叆搴撲换鍔$被鍨嬶紙鐢ㄧ鍙锋煡璇紝鐘舵�佷负1鎴�2锛�
+ // 娉ㄦ剰锛氱洏鐐瑰叆搴撳凡鍗曠嫭澶勭悊锛屼笉鍐嶅寘鍚湪姝ゅ垪琛ㄤ腑
+ List<Integer> otherInboundTaskTypes = Arrays.asList(
+ TaskType.TASK_TYPE_IN.type,
+ TaskType.TASK_TYPE_MERGE_IN.type,
+ TaskType.TASK_TYPE_EMPITY_IN.type
+ );
+
+ Task existingInTask = taskService.getOne(new LambdaQueryWrapper<Task>()
+ .eq(Task::getBarcode, param.getBarcode())
+ .in(Task::getTaskType, otherInboundTaskTypes)
+ .in(Task::getTaskStatus, TaskStsType.GENERATE_IN.id, TaskStsType.WCS_EXECUTE_IN.id)
+ .orderByDesc(Task::getCreateTime)
+ .last("LIMIT 1"));
+
+ if (Objects.nonNull(existingInTask)) {
+ log.info("鎵惧埌鍖归厤鐨勫叾浠栧叆搴撲换鍔� - 浠诲姟缂栫爜锛歿}锛屼换鍔$被鍨嬶細{}锛岀鍙凤細{}",
+ existingInTask.getTaskCode(), existingInTask.getTaskType(), param.getBarcode());
+
+ // 妫�鏌ョ粍鎵樻槑缁嗘槸鍚︽湁璁㈠崟缂栫爜锛堜换鍔$紪鍙凤級
+ List<WaitPakinItem> itemsWithAsnCode = waitPakinItems.stream()
+ .filter(item -> StringUtils.isNotBlank(item.getAsnCode()))
+ .collect(Collectors.toList());
+
+ if (!itemsWithAsnCode.isEmpty()) {
+ log.info("缁勬墭妗f湁浠诲姟缂栧彿锛屼娇鐢ㄧ幇鏈夊叆搴撲换鍔″崟鍙� - 浠诲姟缂栫爜锛歿}锛岀鍙凤細{}锛屼换鍔$紪鍙锋暟閲忥細{}",
+ existingInTask.getTaskCode(), param.getBarcode(), itemsWithAsnCode.size());
+
+ // 鏇存柊鍏ュ簱绔欑偣淇℃伅锛堝鏋滀笌褰撳墠鐢宠鐨勭珯鐐逛笉鍚岋級
+ if (StringUtils.isNotBlank(param.getSourceStaNo()) &&
+ !param.getSourceStaNo().equals(existingInTask.getOrgSite())) {
+ log.info("鏇存柊鍏ュ簱浠诲姟鐨勫叆搴撶珯鐐� - 浠诲姟缂栫爜锛歿}锛屽師绔欑偣锛歿}锛屾柊绔欑偣锛歿}",
+ existingInTask.getTaskCode(), existingInTask.getOrgSite(), param.getSourceStaNo());
+ existingInTask.setOrgSite(param.getSourceStaNo());
+ if (!taskService.updateById(existingInTask)) {
+ log.warn("鏇存柊鍏ュ簱浠诲姟鐨勫叆搴撶珯鐐瑰け璐� - 浠诲姟缂栫爜锛歿}", existingInTask.getTaskCode());
+ }
+ }
+
+ // 杩斿洖鐜版湁鍏ュ簱浠诲姟鐨勪俊鎭�
+ InTaskMsgDto msgDto = new InTaskMsgDto();
+ msgDto.setWorkNo(existingInTask.getTaskCode());
+ msgDto.setTaskId(existingInTask.getId());
+ msgDto.setLocNo(existingInTask.getTargLoc());
+ msgDto.setSourceStaNo(existingInTask.getOrgSite());
+ msgDto.setStaNo(existingInTask.getTargSite());
+ return msgDto;
+ } else {
+ log.info("缁勬墭妗f病鏈変换鍔$紪鍙凤紝缁х画鍒涘缓鏂颁换鍔� - 绠卞彿锛歿}", param.getBarcode());
+ }
+ } else {
+ log.info("鏈壘鍒板尮閰嶇殑鍏朵粬鍏ュ簱浠诲姟锛岀户缁垱寤烘柊浠诲姟 - 绠卞彿锛歿}", param.getBarcode());
+ }
// 鐢熸垚浠诲姟缂栫爜
String ruleCode = generateTaskCode();
@@ -140,7 +317,7 @@
updateLocStatus(task.getTargLoc(), waitPakin.getBarcode());
// 鑾峰彇骞堕獙璇佺粍鎷栨槑缁�
- List<WaitPakinItem> waitPakinItems = getWaitPakinItems(waitPakin.getId());
+ waitPakinItems = getWaitPakinItems(waitPakin.getId());
// 鍒涘缓骞朵繚瀛樹换鍔℃槑缁�
saveTaskItems(task.getId(), waitPakinItems, param.getUser());
@@ -676,6 +853,57 @@
throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛佸綋鍓嶄换鍔$姸鎬侊細" + task.getTaskStatus() + "锛岀洰鏍囩姸鎬侊細" + TaskStsType.COMPLETE_OUT.id);
}
log.info("鍑哄簱浠诲姟鐘舵�佹洿鏂版垚鍔� - 浠诲姟缂栫爜锛歿}", task.getTaskCode());
+
+ // 鍏ㄧ増鍑哄簱鍦≧CS鍥炶皟鍚庣洿鎺ュ鐞嗗苟璁剧疆涓�200
+ if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type)) {
+ log.info("鍏ㄧ増鍑哄簱浠诲姟锛屽紑濮嬪鐞嗗簱瀛樺苟鏇存柊鐘舵�佷负200 - 浠诲姟缂栫爜锛歿}", task.getTaskCode());
+ try {
+ // 閲嶆柊鏌ヨ浠诲姟浠ヨ幏鍙栨渶鏂扮姸鎬侊紙198锛�
+ task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode()));
+
+ // 璋冪敤completeTask澶勭悊搴撳瓨锛堜細璁剧疆涓�199锛�
+ List<Task> taskList = new ArrayList<>();
+ taskList.add(task);
+ taskService.completeTask(taskList);
+
+ // 閲嶆柊鏌ヨ浠诲姟浠ヨ幏鍙栨渶鏂扮姸鎬侊紙199锛�
+ task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode()));
+
+ // 濡傛灉鐘舵�佸凡缁忔槸199锛岀户缁鐞嗗苟璁剧疆涓�200
+ if (task.getTaskStatus().equals(TaskStsType.WAVE_SEED.id)) {
+ Long loginUserId = SystemAuthUtils.getLoginUserId();
+ if (loginUserId == null) {
+ log.warn("鏃犳硶鑾峰彇绯荤粺鐢ㄦ埛ID锛屼娇鐢ㄩ粯璁ゅ��1");
+ loginUserId = 1L;
+ }
+
+ // 鍒犻櫎浣滀笟涓簱瀛樿褰曪紙LocItemWorking锛�
+ locItemWorkingService.remove(new LambdaQueryWrapper<LocItemWorking>()
+ .eq(LocItemWorking::getTaskId, task.getId()));
+
+ // 鏇存柊浠诲姟鐘舵�佷负搴撳瓨鏇存柊瀹屾垚锛�200锛�
+ boolean finalUpdated = taskService.update(new LambdaUpdateWrapper<Task>()
+ .eq(Task::getTaskCode, task.getTaskCode())
+ .eq(Task::getTaskStatus, TaskStsType.WAVE_SEED.id)
+ .set(Task::getTaskStatus, TaskStsType.UPDATED_OUT.id)
+ .set(Task::getUpdateBy, loginUserId)
+ .set(Task::getUpdateTime, new Date()));
+
+ if (!finalUpdated) {
+ log.warn("鍏ㄧ増鍑哄簱浠诲姟鐘舵�佹洿鏂颁负200澶辫触锛屽彲鑳界姸鎬佸凡鍙樻洿 - 浠诲姟缂栫爜锛歿}锛屽綋鍓嶇姸鎬侊細{}",
+ task.getTaskCode(), task.getTaskStatus());
+ } else {
+ log.info("鍏ㄧ増鍑哄簱浠诲姟鐘舵�佸凡鏇存柊涓�200锛堝簱瀛樻洿鏂板畬鎴愶級 - 浠诲姟缂栫爜锛歿}", task.getTaskCode());
+ }
+ } else {
+ log.warn("鍏ㄧ増鍑哄簱浠诲姟鐘舵�佷笉鏄�199锛屾棤娉曟洿鏂颁负200 - 浠诲姟缂栫爜锛歿}锛屽綋鍓嶇姸鎬侊細{}",
+ task.getTaskCode(), task.getTaskStatus());
+ }
+ } catch (Exception e) {
+ log.error("鍏ㄧ増鍑哄簱浠诲姟澶勭悊澶辫触 - 浠诲姟缂栫爜锛歿}锛岄敊璇細{}", task.getTaskCode(), e.getMessage(), e);
+ // 涓嶆姏鍑哄紓甯革紝閬垮厤褰卞搷RCS鍥炶皟鐨勬甯歌繑鍥�
+ }
+ }
}
}
} else {
--
Gitblit v1.9.1