From f574055ed80a64cbccd601b200afc437a87b52eb Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期六, 07 二月 2026 16:03:39 +0800
Subject: [PATCH] RCS入库流程优化
---
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java | 365 +++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 345 insertions(+), 20 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 11a9ab3..b836ec9 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
@@ -18,7 +18,9 @@
import com.vincent.rsf.server.api.entity.dto.LocTypeDto;
import com.vincent.rsf.server.api.controller.erp.params.TaskInParam;
import com.vincent.rsf.server.api.entity.dto.SyncLocsDto;
+import com.vincent.rsf.server.api.entity.enums.CallBackEvent;
import com.vincent.rsf.server.api.entity.params.CommonRequest;
+import com.vincent.rsf.server.api.entity.params.ExMsgParams;
import com.vincent.rsf.server.api.entity.params.WcsTaskParams;
import com.vincent.rsf.server.manager.enums.*;
import com.vincent.rsf.server.api.service.WcsService;
@@ -44,6 +46,7 @@
import java.util.List;
import java.util.Objects;
+import java.util.Random;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -147,6 +150,7 @@
// 璁剧疆宸ヤ綔鍗曞彿骞惰繑鍥�
locNo.setWorkNo(ruleCode);
+ locNo.setTaskId(task.getId());
return locNo;
}
@@ -171,7 +175,7 @@
private WaitPakin validateWaitPakin(String barcode) {
WaitPakin waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
.eq(WaitPakin::getBarcode, barcode)
- .eq(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val));
+ .in(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val));
if (Cools.isEmpty(waitPakin)) {
throw new CoolException("璇锋鏌ョ粍鎷栫姸鎬佹槸鍚﹀畬鎴愶紒锛�");
@@ -228,13 +232,30 @@
/**
* 鑾峰彇骞堕獙璇佺粍鎷栨槑缁�
+ * 鍙繑鍥炴湭瀹屽叏浣跨敤鐨勬槑缁嗭紙workQty < anfme 鎴� workQty 涓� null锛�
*/
private List<WaitPakinItem> getWaitPakinItems(Long pakinId) {
- List<WaitPakinItem> waitPakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, pakinId));
+ List<WaitPakinItem> waitPakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>()
+ .eq(WaitPakinItem::getPakinId, pakinId));
+
if (waitPakinItems.isEmpty()) {
throw new CoolException("鏁版嵁閿欒锛氱粍鎷栨槑缁嗕笉瀛樺湪");
}
- return waitPakinItems;
+
+ // 杩囨护鎺夊凡瀹屽叏浣跨敤鐨勬槑缁嗭紙workQty >= anfme锛�
+ List<WaitPakinItem> availableItems = waitPakinItems.stream()
+ .filter(item -> {
+ Double workQty = item.getWorkQty() == null ? 0.0 : item.getWorkQty();
+ Double anfme = item.getAnfme() == null ? 0.0 : item.getAnfme();
+ return workQty < anfme; // 鍙繑鍥炴湭瀹屽叏浣跨敤鐨勬槑缁�
+ })
+ .collect(Collectors.toList());
+
+ if (availableItems.isEmpty()) {
+ throw new CoolException("缁勬嫋鏄庣粏宸插叏閮ㄤ娇鐢紝鏃犳硶鍐嶆鍒涘缓浠诲姟");
+ }
+
+ return availableItems;
}
/**
@@ -258,6 +279,15 @@
if (!taskItemService.saveBatch(taskItems)) {
throw new CoolException("浠诲姟鏄庣粏淇濆瓨澶辫触锛侊紒");
}
+
+ // 鏇存柊缁勬墭鏄庣粏鐨勬墽琛屾暟閲忥紝鏍囪鏄庣粏宸茶鎻愬彇浣跨敤
+ waitPakinItems.forEach(item -> {
+ if (!waitPakinItemService.update(new LambdaUpdateWrapper<WaitPakinItem>()
+ .set(WaitPakinItem::getWorkQty, item.getAnfme())
+ .eq(WaitPakinItem::getId, item.getId()))) {
+ throw new CoolException("缁勬墭鏄庣粏鎵ц鏁伴噺淇敼澶辫触锛侊紒");
+ }
+ });
}
/**
@@ -407,13 +437,14 @@
*/
@Override
@Transactional(rollbackFor = Exception.class)
- public R syncLocsToWms() {
+ public void syncLocsToWms() {
/**RCS鍩虹閰嶇疆閾炬帴*/
CommonRequest params = new CommonRequest();
params.setPageSize(100);
ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(1);
scheduled.scheduleWithFixedDelay(new Runnable() {
int current = 1;
+
@Override
public void run() {
params.setCurrent(current);
@@ -421,34 +452,251 @@
if (dtos.isEmpty()) {
scheduled.shutdown();
}
- dtos.forEach(dto -> {
+ for (SyncLocsDto dto : dtos) {
Loc loc = new Loc();
+ String string = new Random().nextInt(10000000) + "";
+ Loc one = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, dto.getLocNo()));
+ if (!Objects.isNull(one)) {
+ string = new Random().nextInt(10000000) + "";
+ }
loc.setCode(dto.getLocNo())
.setBarcode(dto.getBarcode())
.setRow(dto.getRow())
.setLev(dto.getLev())
.setId(null)
- .setAreaId(41L)
- .setWarehouseId(27L)
+ .setAreaId(42L)
+ .setWarehouseId(29L)
+ .setBarcode(string)
.setCol(dto.getBay())
- .setType(dto.getLocType())
+ .setType(dto.getLocType().equals("16") ? "17" : "15")
.setStatus(dto.getStatusBool())
.setUseStatus(LocStsType.getLocSts(dto.getLocSts()));
if (!locService.save(loc)) {
scheduled.shutdown();
throw new CoolException("WCS搴撲綅鍚屾澶辫触锛侊紒");
}
- });
+ }
current++;
}
}, 1, 1, TimeUnit.SECONDS);
- return R.ok();
}
- private List<SyncLocsDto> syncLocs(CommonRequest params) {
- String rcsUrl = rcsApi.getHost() + ":" + rcsApi.getPort() + RcsConstant.syncLocs;
- log.info("浠诲姟涓嬪彂锛岃姹傚湴鍧�锛� {}锛� 璇锋眰鍙傛暟锛� {}", rcsUrl, JSONObject.toJSONString(params));
+ /**
+ * 寮傚父淇℃伅涓婃姤
+ *
+ * @return
+ */
+ @Override
+ public R receiveExMsg(ExMsgParams params) {
+ if (Objects.isNull(params)) {
+ log.error("RCS鍥炶皟涓虹┖锛�");
+ return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+ }
+ log.info("========== 鎺ユ敹RCS鍥炶皟 ==========");
+ log.info("浠诲姟缂栧彿锛歿}锛屾壒娆″彿锛歿}锛屼簨浠剁被鍨嬶細{}", params.getSeqNum(), params.getBatchNo(), params.getEventType());
+
+ // 浼樺厛浣跨敤鎵规鍙锋煡璇换鍔′富琛紙鎵规鍙� = 浠诲姟缂栫爜锛屾洿鍙潬锛�
+ String taskCode = params.getBatchNo();
+ String taskNo = params.getSeqNum();
+ String locCode = null; // 搴撲綅浠g爜锛堝搴撲綅浠诲姟鏃朵粠浠诲姟鍙蜂腑鎻愬彇锛�
+
+ // 濡傛灉鎵规鍙蜂负绌猴紝浣跨敤浠诲姟鍙锋煡璇�
+ if (StringUtils.isBlank(taskCode)) {
+ taskCode = taskNo;
+ }
+
+ // 澶勭悊鍑哄簱浠诲姟澶氬簱浣嶇殑鎯呭喌锛氫换鍔″彿鏍煎紡鍙兘鏄� "浠诲姟缂栫爜_搴撲綅浠g爜"
+ // 濡傛灉浠诲姟鍙峰寘鍚笅鍒掔嚎锛屾彁鍙栧簱浣嶄唬鐮�
+ if (StringUtils.isNotBlank(taskNo) && taskNo.contains("_")) {
+ locCode = taskNo.substring(taskNo.lastIndexOf("_") + 1);
+ // 濡傛灉鎵规鍙蜂负绌猴紝浠庝换鍔″彿涓彁鍙栧師濮嬩换鍔$紪鐮�
+ if (StringUtils.isBlank(taskCode)) {
+ taskCode = taskNo.substring(0, taskNo.lastIndexOf("_"));
+ }
+ log.info("妫�娴嬪埌澶氬簱浣嶄换鍔★紝鎻愬彇搴撲綅浠g爜锛歿}锛屽師濮嬩换鍔$紪鐮侊細{}", locCode, taskCode);
+ }
+
+ // 浣跨敤鎵规鍙凤紙浠诲姟缂栫爜锛夋煡璇换鍔′富琛�
+ Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getTaskCode, taskCode));
+
+ if (Objects.isNull(task)) {
+ log.error("浠诲姟涓嶅瓨鍦ㄦ垨宸茬粨鏉燂紒浠诲姟缂栧彿锛歿}锛屾壒娆″彿锛歿}", taskNo, taskCode);
+ throw new CoolException("浠诲姟涓嶅瓨鍦ㄦ垨宸茬粨鏉燂紒锛佷换鍔$紪鍙凤細" + taskNo + "锛屾壒娆″彿锛�" + taskCode);
+ }
+
+ // 楠岃瘉鎵规鍙峰拰浠诲姟鍙风殑鍏宠仈鍏崇郴
+ if (StringUtils.isNotBlank(params.getBatchNo()) && !params.getBatchNo().equals(task.getTaskCode())) {
+ log.warn("鎵规鍙蜂笌浠诲姟缂栫爜涓嶅尮閰嶏紒鎵规鍙凤細{}锛屼换鍔$紪鐮侊細{}", params.getBatchNo(), task.getTaskCode());
+ }
+ log.info("鏌ヨ鍒颁换鍔� - 浠诲姟缂栫爜锛歿}锛屼换鍔$被鍨嬶細{}锛屽綋鍓嶇姸鎬侊細{}",
+ task.getTaskCode(), task.getTaskType(), task.getTaskStatus());
+
+ // 瀵逛簬澶氬簱浣嶅嚭搴撲换鍔★紝閫氳繃搴撲綅浠g爜绮剧‘鍏宠仈浠诲姟鏄庣粏
+ List<TaskItem> relatedTaskItems = null;
+ if (StringUtils.isNotBlank(locCode)) {
+ // 1. 閫氳繃搴撲綅浠g爜鏌ヨLocItem
+ LocItem locItem = locItemService.getOne(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocCode, locCode));
+ if (Objects.isNull(locItem)) {
+ log.warn("鏈壘鍒板簱浣嶆槑缁嗭紒搴撲綅浠g爜锛歿}锛屼换鍔$紪鐮侊細{}", locCode, task.getTaskCode());
+ } else {
+ // 2. 閫氳繃浠诲姟ID鍜孡ocItem.id锛堝嵆TaskItem.source锛夋煡璇㈠搴旂殑浠诲姟鏄庣粏
+ relatedTaskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>()
+ .eq(TaskItem::getTaskId, task.getId())
+ .eq(TaskItem::getSource, locItem.getId()));
+ if (relatedTaskItems.isEmpty()) {
+ log.warn("鏈壘鍒板搴旂殑浠诲姟鏄庣粏锛佷换鍔$紪鐮侊細{}锛屽簱浣嶄唬鐮侊細{}锛孡ocItem.id锛歿}",
+ task.getTaskCode(), locCode, locItem.getId());
+ } else {
+ log.info("閫氳繃搴撲綅浠g爜绮剧‘鍏宠仈鍒颁换鍔℃槑缁� - 浠诲姟缂栫爜锛歿}锛屽簱浣嶄唬鐮侊細{}锛屼换鍔℃槑缁嗘暟閲忥細{}",
+ task.getTaskCode(), locCode, relatedTaskItems.size());
+ }
+ }
+ }
+
+ // 楠岃瘉浠诲姟鐘舵�侊細鍙湁宸蹭笅鍙戝埌RCS鐨勪换鍔℃墠鑳借鍥炶皟澶勭悊
+ // 鍏ュ簱浠诲姟锛氱姸鎬� >= WCS_EXECUTE_IN(2) 琛ㄧず宸蹭笅鍙�
+ // 鍑哄簱浠诲姟锛氱姸鎬� >= WCS_EXECUTE_OUT(102) 琛ㄧず宸蹭笅鍙�
+ boolean isValidStatus = false;
+ if (task.getTaskType() < 100) {
+ // 鍏ュ簱浠诲姟
+ if (task.getTaskStatus() >= TaskStsType.WCS_EXECUTE_IN.id) {
+ isValidStatus = true;
+ }
+ } else {
+ // 鍑哄簱浠诲姟
+ if (task.getTaskStatus() >= TaskStsType.WCS_EXECUTE_OUT.id) {
+ isValidStatus = true;
+ }
+ }
+
+ if (!isValidStatus) {
+ log.error("浠诲姟鐘舵�佷笉姝g‘锛屾棤娉曞鐞嗗洖璋冿紒浠诲姟缂栫爜锛歿}锛屼换鍔$被鍨嬶細{}锛屽綋鍓嶇姸鎬侊細{}锛屾湡鏈涚姸鎬侊細宸蹭笅鍙戝埌RCS",
+ task.getTaskCode(), task.getTaskType(), task.getTaskStatus());
+ throw new CoolException("浠诲姟鐘舵�佷笉姝g‘锛屾棤娉曞鐞嗗洖璋冿紒浠诲姟缂栫爜锛�" + task.getTaskCode() +
+ "锛屽綋鍓嶇姸鎬侊細" + task.getTaskStatus() + "锛屼换鍔″彲鑳芥湭涓嬪彂鍒癛CS鎴栧凡琚鐞�");
+ }
+
+ /**鏂欑鎼繍涓紝 淇敼绔欑偣鐘舵��*/
+// if (params.getEventType().equals(CallBackEvent.CALL_BACK_EVENT_OBIT.event)) {
+// if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)
+// || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)
+// || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)
+// || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type)
+// || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type)
+// || task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) {
+//
+// }
+// /**鍙栫瀹屾垚锛� 淇敼浠诲姟鐘舵��*/
+// } else
+ if (params.getEventType().equals(CallBackEvent.CALL_BACK_EVENT_END.event)) {
+ if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)
+ || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)
+ || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)
+ || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type)
+ || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_IN.type)
+ || task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) {
+
+ if (!task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) {
+ BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>().eq(BasStation::getStationName, task.getOrgSite()));
+ if (Objects.isNull(station)) {
+ log.error("鍏ュ簱绔欑偣涓嶅瓨鍦� - 绔欑偣鍚嶇О锛歿}锛屼换鍔$紪鐮侊細{}", task.getOrgSite(), task.getTaskCode());
+ throw new CoolException("鏁版嵁閿欒锛岀珯鐐逛笉瀛樺湪锛侊紒");
+ }
+ log.info("鏌ヨ鍒板叆搴撶珯鐐� - 绔欑偣鍚嶇О锛歿}锛岀珯鐐圭被鍨嬶細{}锛屽綋鍓嶇姸鎬侊細{}",
+ station.getStationName(), station.getType(), station.getUseStatus());
+ if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) {
+ log.info("鏇存柊鍏ュ簱绔欑偣鐘舵�� - 绔欑偣鍚嶇О锛歿}锛屾柊鐘舵�侊細{}", station.getStationName(), LocStsType.LOC_STS_TYPE_O.type);
+ station.setUseStatus(LocStsType.LOC_STS_TYPE_O.type);
+ if (!basStationService.updateById(station)) {
+ log.error("鍏ュ簱绔欑偣鐘舵�佷慨鏀瑰け璐� - 绔欑偣鍚嶇О锛歿}", station.getStationName());
+ throw new CoolException("绔欑偣鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+ }
+ log.info("鍏ュ簱绔欑偣鐘舵�佹洿鏂版垚鍔� - 绔欑偣鍚嶇О锛歿}", station.getStationName());
+ }
+ }
+
+ log.info("鍑嗗鏇存柊鍏ュ簱浠诲姟鐘舵�� - 浠诲姟缂栫爜锛歿}锛屽綋鍓嶇姸鎬侊細{}锛岀洰鏍囩姸鎬侊細{}",
+ task.getTaskCode(), task.getTaskStatus(), TaskStsType.COMPLETE_IN.id);
+
+ // 濡傛灉浠诲姟鐘舵�佸凡缁忓ぇ浜庣瓑浜庣洰鏍囩姸鎬侊紝璺宠繃鏇存柊
+ if (task.getTaskStatus() >= TaskStsType.COMPLETE_IN.id) {
+ log.warn("鍏ュ簱浠诲姟鐘舵�佸凡澶т簬绛変簬鐩爣鐘舵�侊紝璺宠繃鏇存柊 - 浠诲姟缂栫爜锛歿}锛屽綋鍓嶇姸鎬侊細{}锛岀洰鏍囩姸鎬侊細{}",
+ task.getTaskCode(), task.getTaskStatus(), TaskStsType.COMPLETE_IN.id);
+ } else {
+ boolean updated = taskService.update(new LambdaUpdateWrapper<Task>()
+ .lt(Task::getTaskStatus, TaskStsType.COMPLETE_IN.id)
+ .eq(Task::getTaskCode, task.getTaskCode())
+ .set(Task::getTaskStatus, TaskStsType.COMPLETE_IN.id));
+ if (!updated) {
+ log.error("鍏ュ簱浠诲姟鐘舵�佷慨鏀瑰け璐� - 浠诲姟缂栫爜锛歿}锛屽綋鍓嶇姸鎬侊細{}锛岀洰鏍囩姸鎬侊細{}锛屽彲鑳戒换鍔$姸鎬佸凡澶т簬绛変簬鐩爣鐘舵��",
+ task.getTaskCode(), task.getTaskStatus(), TaskStsType.COMPLETE_IN.id);
+ throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛佸綋鍓嶄换鍔$姸鎬侊細" + task.getTaskStatus() + "锛岀洰鏍囩姸鎬侊細" + TaskStsType.COMPLETE_IN.id);
+ }
+ log.info("鍏ュ簱浠诲姟鐘舵�佹洿鏂版垚鍔� - 浠诲姟缂栫爜锛歿}", task.getTaskCode());
+ }
+ } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type)
+ || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)
+ || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type)
+ || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type)
+ || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_OUT.type)) {
+
+ /**淇敼鍑哄簱绔欑偣鐘舵��*/
+ BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
+ .eq(BasStation::getStationName, task.getTargSite()));
+ if (Objects.isNull(station)) {
+ log.error("鍑哄簱绔欑偣涓嶅瓨鍦� - 绔欑偣鍚嶇О锛歿}锛屼换鍔$紪鐮侊細{}", task.getTargSite(), task.getTaskCode());
+ throw new CoolException("鏁版嵁閿欒锛岀珯鐐逛笉瀛樺湪锛侊紒");
+ }
+ log.info("鏌ヨ鍒板嚭搴撶珯鐐� - 绔欑偣鍚嶇О锛歿}锛岀珯鐐圭被鍨嬶細{}锛屽綋鍓嶇姸鎬侊細{}",
+ station.getStationName(), station.getType(), station.getUseStatus());
+ if (station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) {
+ log.info("鏇存柊鍑哄簱绔欑偣鐘舵�� - 绔欑偣鍚嶇О锛歿}锛屾柊鐘舵�侊細{}", station.getStationName(), LocStsType.LOC_STS_TYPE_F.type);
+ station.setUseStatus(LocStsType.LOC_STS_TYPE_F.type);
+ if (!basStationService.updateById(station)) {
+ log.error("鍑哄簱绔欑偣鐘舵�佷慨鏀瑰け璐� - 绔欑偣鍚嶇О锛歿}", station.getStationName());
+ throw new CoolException("绔欑偣鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+ }
+ log.info("鍑哄簱绔欑偣鐘舵�佹洿鏂版垚鍔� - 绔欑偣鍚嶇О锛歿}", station.getStationName());
+ }
+ log.info("鍑嗗鏇存柊鍑哄簱浠诲姟鐘舵�� - 浠诲姟缂栫爜锛歿}锛屽綋鍓嶇姸鎬侊細{}锛岀洰鏍囩姸鎬侊細{}",
+ task.getTaskCode(), task.getTaskStatus(), TaskStsType.COMPLETE_OUT.id);
+
+ // 濡傛灉浠诲姟鐘舵�佸凡缁忓ぇ浜庣瓑浜庣洰鏍囩姸鎬侊紝璺宠繃鏇存柊
+ if (task.getTaskStatus() >= TaskStsType.COMPLETE_OUT.id) {
+ log.warn("鍑哄簱浠诲姟鐘舵�佸凡澶т簬绛変簬鐩爣鐘舵�侊紝璺宠繃鏇存柊 - 浠诲姟缂栫爜锛歿}锛屽綋鍓嶇姸鎬侊細{}锛岀洰鏍囩姸鎬侊細{}",
+ task.getTaskCode(), task.getTaskStatus(), TaskStsType.COMPLETE_OUT.id);
+ } else {
+ boolean updated = taskService.update(new LambdaUpdateWrapper<Task>().eq(Task::getTaskCode, task.getTaskCode())
+ .lt(Task::getTaskStatus, TaskStsType.COMPLETE_OUT.id)
+ .set(Task::getTaskStatus, TaskStsType.COMPLETE_OUT.id));
+ if (!updated) {
+ log.error("鍑哄簱浠诲姟鐘舵�佷慨鏀瑰け璐� - 浠诲姟缂栫爜锛歿}锛屽綋鍓嶇姸鎬侊細{}锛岀洰鏍囩姸鎬侊細{}锛屽彲鑳戒换鍔$姸鎬佸凡澶т簬绛変簬鐩爣鐘舵��",
+ task.getTaskCode(), task.getTaskStatus(), TaskStsType.COMPLETE_OUT.id);
+ throw new CoolException("浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛佸綋鍓嶄换鍔$姸鎬侊細" + task.getTaskStatus() + "锛岀洰鏍囩姸鎬侊細" + TaskStsType.COMPLETE_OUT.id);
+ }
+ log.info("鍑哄簱浠诲姟鐘舵�佹洿鏂版垚鍔� - 浠诲姟缂栫爜锛歿}", task.getTaskCode());
+ }
+ }
+ } else {
+ log.warn("鏈鐞嗙殑浜嬩欢绫诲瀷 - 浜嬩欢绫诲瀷锛歿}锛屼换鍔$紪鐮侊細{}锛屼换鍔$被鍨嬶細{}",
+ params.getEventType(), task.getTaskCode(), task.getTaskType());
+ }
+ log.info("========== 浠诲姟鎵ц閫氱煡涓婃姤澶勭悊瀹屾垚 ==========");
+ log.info("澶勭悊缁撴灉锛歿}", JSONObject.toJSONString(params));
+ return R.ok(JSONObject.toJSONString(params));
+ }
+
+ /**
+ * 涓嬪彂浠诲姟鑷充腑杞珹PI
+ *
+ * @param params
+ * @return
+ */
+ @Override
+ public R pubWcsTask(WcsTaskParams params) {
+ String rcsUrl = rcsApi.getHost() + ":" + rcsApi.getPort() + RcsConstant.pubTask;
+ log.info("浠诲姟涓嬪彂锛岃姹傚湴鍧�3锛� {}锛� 璇锋眰鍙傛暟锛� {}", rcsUrl, JSONObject.toJSONString(params));
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
headers.add("api-version", "v2.0");
@@ -464,8 +712,7 @@
try {
CommonResponse result = objectMapper.readValue(exchange.getBody(), CommonResponse.class);
if (result.getCode() == 200) {
- JSONObject jsonObject = JSONObject.parseObject(exchange.getBody()).getJSONObject("data");
- return JSONArray.parseArray(jsonObject.getJSONArray("records").toJSONString(), SyncLocsDto.class);
+ return R.ok();
} else {
throw new CoolException("浠诲姟涓嬪彂澶辫触锛侊紒");
}
@@ -475,7 +722,37 @@
}
}
- private InTaskMsgDto getLocNoCrn(String orgLoc, DeviceBind deviceBind, Long area, Integer sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) {
+
+ private List<SyncLocsDto> syncLocs(CommonRequest params) {
+ String rcsUrl = rcsApi.getHost() + ":" + rcsApi.getPort() + RcsConstant.syncLocs;
+ log.info("搴撲綅鍚屾锛岃姹傚湴鍧�锛� {}锛� 璇锋眰鍙傛暟锛� {}", rcsUrl, JSONObject.toJSONString(params));
+ HttpHeaders headers = new HttpHeaders();
+ headers.add("Content-Type", "application/json");
+ headers.add("api-version", "v2.0");
+ HttpEntity httpEntity = new HttpEntity(params, headers);
+ ResponseEntity<String> exchange = restTemplate.exchange(rcsUrl, HttpMethod.POST, httpEntity, String.class);
+ log.info("搴撲綅鍚屾锛屽搷搴旂粨鏋滐細 {}", exchange);
+ if (Objects.isNull(exchange.getBody())) {
+ throw new CoolException("搴撲綅鍚屾涓嬪彂澶辫触锛侊紒");
+ } else {
+ ObjectMapper objectMapper = new ObjectMapper();
+ objectMapper.coercionConfigDefaults()
+ .setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty);
+ try {
+ CommonResponse result = objectMapper.readValue(exchange.getBody(), CommonResponse.class);
+ if (result.getCode() == 200) {
+ JSONObject jsonObject = JSONObject.parseObject(exchange.getBody());
+ return JSONArray.parseArray(jsonObject.getJSONArray("data").toJSONString(), SyncLocsDto.class);
+ } else {
+ throw new CoolException("搴撲綅鍚屾澶辫触锛侊紒");
+ }
+ } catch (JsonProcessingException e) {
+ throw new CoolException(e.getMessage());
+ }
+ }
+ }
+
+ private InTaskMsgDto getLocNoCrn(String orgLoc, DeviceBind deviceBind, Long area, String sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) {
if (Cools.isEmpty(matnr)) { //鐗╂枡鍙�
matnr = "";
}
@@ -564,7 +841,7 @@
if (Cools.isEmpty(deviceSite)) {
channel = 0;
} else {
- inTaskMsgDto.setStaNo(Integer.parseInt(deviceSite.getDeviceSite()));
+ inTaskMsgDto.setStaNo(deviceSite.getDeviceSite());
}
//鏇存柊褰撳墠鎺�
@@ -728,7 +1005,7 @@
return inTaskMsgDto;
}
- private InTaskMsgDto getLocNoCtu(DeviceBind deviceBind, Long area, Integer sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) {
+ private InTaskMsgDto getLocNoCtu(DeviceBind deviceBind, Long area, String sourceStaNo, String matnr, String batch, LocTypeDto locTypeDto, int times, Integer ioType) {
if (Cools.isEmpty(matnr)) { //鐗╂枡鍙�
matnr = "";
}
@@ -738,10 +1015,13 @@
int deviceNo = 0;
Loc loc = new Loc();
InTaskMsgDto inTaskMsgDto = new InTaskMsgDto();
+ locTypeDto.setLocType1(18);
List<Loc> loc1 = locService.list(new LambdaQueryWrapper<Loc>()
.eq(Loc::getAreaId, area)
.eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type)
.eq(Loc::getType, locTypeDto.getLocType1())
+ .ge(Loc::getRow, deviceBind.getStartRow())
+ .le(Loc::getRow, deviceBind.getEndRow())
.orderByAsc(Loc::getLev)
.orderByAsc(Loc::getCol)
.orderByAsc(Loc::getRow)
@@ -757,13 +1037,13 @@
DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
.eq(DeviceSite::getType, ioType)
.eq(DeviceSite::getSite, sourceStaNo)
- .eq(DeviceSite::getDeviceCode, loc.getDeviceNo())
+ .eq(!Objects.isNull(loc.getDeviceNo()), DeviceSite::getDeviceCode, loc.getDeviceNo())
);
if (Cools.isEmpty(deviceSite)) {
deviceNo = 0;
loc = null;
} else {
- inTaskMsgDto.setStaNo(Integer.parseInt(deviceSite.getDeviceSite()));
+ inTaskMsgDto.setStaNo(deviceSite.getDeviceSite());
}
// 閫掑綊鏌ヨ
if (Cools.isEmpty(loc) || !loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) {
@@ -791,4 +1071,49 @@
inTaskMsgDto.setLocNo(locNo);
return inTaskMsgDto;
}
+
+ /**
+ * @author Ryan
+ * @date 2026/2/6
+ * @description: 鐢宠鍏ュ簱浠诲姟锛屽垎閰嶅簱浣�
+ * @version 1.0
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public R allocateLocation(String barcode, String staNo, Integer type) {
+ log.info("========== 寮�濮嬬敵璇峰叆搴撲换鍔★紝鍒嗛厤搴撲綅 ==========");
+ log.info("鏂欑鐮侊細{}锛屽叆搴撶珯鐐癸細{}锛屽叆搴撶被鍨嬶細{}", barcode, staNo, type);
+
+ // 鏋勫缓 TaskInParam 鍙傛暟锛屼笌 /wcs/create/in/task 鎺ュ彛鍙傛暟涓�鑷�
+ TaskInParam param = new TaskInParam();
+ param.setBarcode(barcode);
+ param.setSourceStaNo(staNo);
+ param.setIoType(TaskType.TASK_TYPE_IN.type); // 鍏ュ簱绫诲瀷
+ param.setLocType1(type); // 搴撲綅绫诲瀷锛堥珮浣庢娴嬩俊鍙凤級
+ param.setUser(1L); // 榛樿鐢ㄦ埛ID锛屽彲浠ユ牴鎹疄闄呴渶姹傝皟鏁�
+
+ // 璋冪敤 createInTask 鏂规硶锛屽垱寤哄畬鏁寸殑鍏ュ簱浠诲姟
+ // 璇ユ柟娉曚細鎵ц浠ヤ笅娴佺▼锛�
+ // 1. 楠岃瘉璁惧绔欑偣
+ // 2. 楠岃瘉缁勬嫋鐘舵��
+ // 3. 鐢熸垚浠诲姟缂栫爜
+ // 4. 鑾峰彇搴撲綅鍙�
+ // 5. 鍒涘缓骞朵繚瀛樹换鍔�
+ // 6. 鏇存柊搴撲綅鐘舵��
+ // 7. 鑾峰彇骞堕獙璇佺粍鎷栨槑缁�
+ // 8. 鍒涘缓骞朵繚瀛樹换鍔℃槑缁�
+ // 9. 鏇存柊缁勬墭鐘舵��
+ InTaskMsgDto msgDto = createInTask(param);
+ //RCS宸茬粡鍦ㄨ緭閫佺嚎涓婏紝鎵�浠ヤ笉闇�瑕佷笅鍙戜换鍔�
+ taskService.updateById(new Task(){{setId(msgDto.getTaskId());setTaskStatus(2);}});
+ log.info("========== RCS-鐢宠鍏ュ簱浠诲姟鎴愬姛 ==========");
+ log.info("RCS-杩斿洖 浠诲姟缂栫爜锛歿}锛屽簱浣嶅彿锛歿}", msgDto.getWorkNo(), msgDto.getLocNo());
+
+ // 杩斿洖缁撴灉锛屽彧杩斿洖搴撲綅鍙凤紙鏍规嵁鎺ュ彛鏂囨。瑕佹眰锛�
+ JSONObject result = new JSONObject();
+ result.put("locNo", msgDto.getLocNo());
+ result.put("batchNo", msgDto.getWorkNo());
+ result.put("taskNo", msgDto.getWorkNo());
+ return R.ok(result);
+ }
}
--
Gitblit v1.9.1