From 50393719d85fc30438456b0d0f065573a404fba5 Mon Sep 17 00:00:00 2001
From: cl <1442464845@qq.com>
Date: 星期五, 01 五月 2026 17:26:31 +0800
Subject: [PATCH] 增加一个单条上报的模式
---
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java | 201 +++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 172 insertions(+), 29 deletions(-)
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
index c3f2963..033f6b8 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -27,6 +27,7 @@
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.api.utils.LocUtils;
+import com.vincent.rsf.server.manager.constant.CloudWmsInoutReportMode;
import com.vincent.rsf.server.manager.controller.params.GenerateTaskParams;
import com.vincent.rsf.server.manager.entity.CloudWmsNotifyLog;
import com.vincent.rsf.server.manager.entity.*;
@@ -55,6 +56,8 @@
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.web.client.HttpStatusCodeException;
import org.springframework.web.client.RestTemplate;
@@ -211,6 +214,7 @@
throw new CoolException("缁勬墭鏄庣粏淇墽琛屾暟閲忎慨鏀瑰け璐ワ紒锛�");
}
});
+ syncAsnOrderItemBarcodeByPakin(waitPakinItems, pakin.getBarcode(), loginUserId);
});
if (!waitPakinService.update(new LambdaUpdateWrapper<WaitPakin>()
@@ -301,6 +305,7 @@
throw new CoolException("缁勬墭鏄庣粏淇墽琛屾暟閲忎慨鏀瑰け璐ワ紒锛�");
}
});
+ syncAsnOrderItemBarcodeByPakin(waitPakinItems, pakin.getBarcode(), loginUserId);
});
if (!waitPakinService.update(new LambdaUpdateWrapper<WaitPakin>()
@@ -453,6 +458,7 @@
throw new CoolException("缁勬墭鏄庣粏淇墽琛屾暟閲忎慨鏀瑰け璐ワ紒锛�");
}
});
+ syncAsnOrderItemBarcodeByPakin(waitPakinItems, pakin.getBarcode(), loginUserId);
});
if (!waitPakinService.update(new LambdaUpdateWrapper<WaitPakin>()
@@ -463,6 +469,27 @@
throw new CoolException("缁勬嫋鐘舵�佷慨鏀瑰け璐ワ紒锛�");
}
return R.ok("浠诲姟鐢熸垚瀹屾瘯锛�");
+ }
+
+ /** 缁勬墭鍚庡皢閫氱煡鍗曟槑缁嗘潯鐮佸洖鍐欎负鏂欑鐮� */
+ private void syncAsnOrderItemBarcodeByPakin(List<WaitPakinItem> waitPakinItems, String pakinBarcode, Long loginUserId) {
+ if (waitPakinItems == null || waitPakinItems.isEmpty() || StringUtils.isBlank(pakinBarcode)) {
+ return;
+ }
+ Set<Long> asnItemIds = waitPakinItems.stream()
+ .map(WaitPakinItem::getAsnItemId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+ if (asnItemIds.isEmpty()) {
+ return;
+ }
+ if (!asnOrderItemService.update(new LambdaUpdateWrapper<WkOrderItem>()
+ .in(WkOrderItem::getId, asnItemIds)
+ .set(WkOrderItem::getBarcode, pakinBarcode)
+ .set(WkOrderItem::getUpdateBy, loginUserId)
+ .set(WkOrderItem::getUpdateTime, new Date()))) {
+ throw new CoolException("閫氱煡鍗曟槑缁嗘潯鐮佸洖鍐欏け璐ワ紒锛�");
+ }
}
/**
@@ -597,15 +624,44 @@
if (StringUtils.isNotBlank(task.getTaskCode())) {
rcsBusTaskNoticeService.notifyTaskStatus(task.getTaskCode(), task.getTaskStatus());
}
+ final Long taskIdForFinish = task.getId();
+ if (TransactionSynchronizationManager.isSynchronizationActive()) {
+ TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+ @Override
+ public void afterCommit() {
+ taskService.runStockFinishAfterManualComplete(taskIdForFinish);
+ }
+ });
+ }
return task;
}
+ @Override
+ public void runStockFinishAfterManualComplete(Long taskId) {
+ if (taskId == null) {
+ return;
+ }
+ try {
+ Task t = taskService.getById(taskId);
+ if (t == null) {
+ return;
+ }
+ if (Objects.equals(t.getTaskStatus(), TaskStsType.COMPLETE_IN.id)) {
+ taskService.complateInTask(Collections.singletonList(t));
+ } else if (Objects.equals(t.getTaskStatus(), TaskStsType.COMPLETE_OUT.id)) {
+ taskService.completeTask(Collections.singletonList(t));
+ }
+ } catch (Exception e) {
+ log.warn("鎵嬪姩瀹岀粨鍚庣珛鍗冲簱瀛樻敹灏惧け璐ワ紝灏嗙敱瀹氭椂浠诲姟閲嶈瘯锛宼askId={}锛歿}", taskId, e.getMessage());
+ }
+ }
+
/**
- * 鍏ㄧ増鍑哄簱瀹岀粨锛氭墸闄ゅ簱浣嶆暟閲忥紝灏嗗簱浣嶇姸鎬佽涓虹┖
+ * 鍏ㄦ澘鍑哄簱瀹岀粨锛氭墸闄ゅ簱浣嶆暟閲忥紝灏嗗簱浣嶇姸鎬佽涓虹┖
*
* @param id 浠诲姟ID
* @param loginUserId 鐧诲綍鐢ㄦ埛ID
- * @param notifyRcsFromAdmin 绠$悊鍚庡彴鍏ㄧ増鍑哄簱瀹岀粨鎺ュ彛涓� true 鏃堕�氱煡 RCS锛涘畾鏃�/PDA 绛変负 false
+ * @param notifyRcsFromAdmin 绠$悊鍚庡彴鍏ㄦ澘鍑哄簱瀹岀粨鎺ュ彛涓� true 鏃堕�氱煡 RCS锛涘畾鏃�/PDA 绛変负 false
* @return 浠诲姟瀵硅薄
*/
@Override
@@ -619,9 +675,9 @@
throw new CoolException("浠诲姟涓嶅瓨鍦紒锛�");
}
- // 妫�鏌ヤ换鍔$被鍨嬫槸鍚︿负鍏ㄧ増鍑哄簱
+ // 妫�鏌ヤ换鍔$被鍨嬫槸鍚︿负鍏ㄦ澘鍑哄簱
if (!task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type)) {
- throw new CoolException("褰撳墠浠诲姟涓嶆槸鍏ㄧ増鍑哄簱浠诲姟锛屾棤娉曟墽琛屾鎿嶄綔锛侊紒");
+ throw new CoolException("褰撳墠浠诲姟涓嶆槸鍏ㄦ澘鍑哄簱浠诲姟锛屾棤娉曟墽琛屾鎿嶄綔锛侊紒");
}
// 妫�鏌ヤ换鍔$姸鎬侊細蹇呴』鏄�199锛圵AVE_SEED锛夌姸鎬佹墠鑳芥墜鍔ㄥ畬缁�
@@ -1767,7 +1823,7 @@
try {
// 鏍规嵁浠诲姟绫诲瀷鏇存柊搴撲綅鏄庣粏
if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type)) {
- // 鍏ㄧ増鍑哄簱锛氫笉鍒犻櫎搴撲綅鏄庣粏锛岀瓑寰匬DA蹇�熸嫞璐х‘璁ゆ椂鍐嶅垹闄�
+ // 鍏ㄦ澘鍑哄簱锛氫笉鍒犻櫎搴撲綅鏄庣粏锛岀瓑寰匬DA蹇�熸嫞璐х‘璁ゆ椂鍐嶅垹闄�
// subtractLocItem(loc); // 宸茬Щ闄わ紝鏀逛负鍦╟ompleteFullOutStock涓垹闄�
} else if (!TaskType.TASK_TYPE_PICK_AGAIN_OUT.type.equals(task.getTaskType())) {
// 閮ㄥ垎鍑哄簱锛堝鐩樼偣鍑哄簱锛夛細鏍规嵁TaskItem鏁伴噺鎵e噺搴撲綅鏄庣粏锛涙嫞鏂欏嚭搴撳湪鐢熸垚鎷f枡鍏ュ簱鍗曟椂鎵e噺
@@ -1836,7 +1892,7 @@
// 鎷f枡鍑哄簱/鐩樼偣鍑哄簱锛氬湪鏈敓鎴愭嫞鏂欏叆搴撳崟涔嬪墠淇濇寔 R.棰勭害鍑哄簱锛屽惁鍒欎笅鍙戜换鍔℃椂鏌ヤ笉鍒拌搴撲綅锛堝彧鏌� F+R锛夊鑷粹�滃簱瀛樹笉瓒斥��
// 绛� PDA 纭骞剁敓鎴愭嫞鏂欏叆搴撲换鍔℃椂锛屽啀鍦� pickOrCheckTask 涓皢鐩爣搴撲綅鏀逛负 S.棰勭害鍏ュ簱
} else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type)) {
- // 鍏ㄧ増鍑哄簱锛氫笉鏇存柊搴撲綅鐘舵�佷负O锛岀瓑寰匬DA蹇�熸嫞璐х‘璁ゆ椂鍐嶆洿鏂�
+ // 鍏ㄦ澘鍑哄簱锛氫笉鏇存柊搴撲綅鐘舵�佷负O锛岀瓑寰匬DA蹇�熸嫞璐х‘璁ゆ椂鍐嶆洿鏂�
// 搴撲綅鐘舵�佷繚鎸佸師鏍凤紙R.鍑哄簱棰勭害鐘舵�侊級
} else {
/**淇敼涓哄簱浣嶇姸鎬佷负O.绌哄簱*/
@@ -2403,7 +2459,7 @@
/**
* @author Ryan
* @date 2025/5/20
- * @description: 鎵e噺搴撳瓨鏄庣粏锛堝叏鐗堝嚭搴擄細鍒犻櫎鎵�鏈夊簱浣嶆槑缁嗭級
+ * @description: 鎵e噺搴撳瓨鏄庣粏锛堝叏鏉垮嚭搴擄細鍒犻櫎鎵�鏈夊簱浣嶆槑缁嗭級
* @version 1.0
*/
@Transactional(rollbackFor = Exception.class)
@@ -2566,6 +2622,10 @@
WkOrder o = asnOrderService.getById(e.getKey());
if (o != null) {
Double newQty = QuantityUtils.roundToScale(QuantityUtils.add(o.getQty() != null ? o.getQty() : 0.0, e.getValue()));
+ Double planQty = QuantityUtils.roundToScale(o.getAnfme() != null ? o.getAnfme() : 0.0);
+ if (QuantityUtils.compare(newQty, planQty) > 0) {
+ newQty = planQty;
+ }
o.setQty(newQty);
if (!asnOrderService.updateById(o)) {
throw new CoolException("鍏ュ簱鍗曞畬鎴愭暟閲忔洿鏂板け璐ワ紒锛�");
@@ -2576,6 +2636,10 @@
WkOrderItem oi = asnOrderItemService.getById(e.getKey());
if (oi != null) {
Double newQty = QuantityUtils.roundToScale(QuantityUtils.add(oi.getQty() != null ? oi.getQty() : 0.0, e.getValue()));
+ Double planQty = QuantityUtils.roundToScale(oi.getAnfme() != null ? oi.getAnfme() : 0.0);
+ if (QuantityUtils.compare(newQty, planQty) > 0) {
+ newQty = planQty;
+ }
oi.setQty(newQty);
if (!asnOrderItemService.updateById(oi)) {
throw new CoolException("鍏ュ簱鍗曟槑缁嗗畬鎴愭暟閲忔洿鏂板け璐ワ紒锛�");
@@ -2817,19 +2881,61 @@
}
}
}
- // 鍑哄簱浠呬簯浠撴潵婧愬崟鎹弬涓庝笂鎶�
- if (!isInbound) {
- boolean hasCloudSource = taskItems.stream().anyMatch(this::hasCloudOrderRef);
- if (!hasCloudSource) {
-// log.info("鍏�/鍑哄簱缁撴灉涓婃姤寰呭姙璺宠繃锛氭棤浜戜粨鏉ユ簮鍗曟嵁锛宼askId={}", task.getId());
- log.info("鍏�/鍑哄簱缁撴灉涓婃姤寰呭姙璺宠繃锛氭墜鍔ㄥ垱寤哄嚭搴撳崟鎹笉閫氱煡浜戜粨锛宼askId={}", task.getId());
- return;
+ // 鍏ュ簱缁勬墭鍦烘櫙鍏佽鎸� WaitPakinItem.asnCode 鍏滃簳璇嗗埆浜戜粨鏉ユ簮锛岄伩鍏� plat* 涓虹┖鏃惰璺宠繃
+ boolean hasCloudSource = taskItems.stream().anyMatch(this::hasCloudOrderRef)
+ || (isInbound && !sourceToOrderNo.isEmpty());
+ if (!hasCloudSource) {
+ log.info("鍏�/鍑哄簱缁撴灉涓婃姤寰呭姙璺宠繃锛氭棤浜戜粨鏉ユ簮鍗曟嵁锛宼askId={}", task.getId());
+ return;
+ }
+ Set<Long> orderIdSet = taskItems.stream()
+ .filter(Objects::nonNull)
+ .map(TaskItem::getOrderId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+ Map<Long, WkOrder> orderById = new HashMap<>();
+ if (!orderIdSet.isEmpty()) {
+ for (WkOrder o : asnOrderService.listByIds(orderIdSet)) {
+ if (o != null && o.getId() != null) {
+ orderById.put(o.getId(), o);
+ }
+ }
+ }
+ Set<String> orderCodeSet = new HashSet<>();
+ for (TaskItem ti : taskItems) {
+ if (ti == null) {
+ continue;
+ }
+ String on = isInbound && ti.getSource() != null
+ ? sourceToOrderNo.get(ti.getSource())
+ : (ti.getPlatOrderCode() != null ? ti.getPlatOrderCode() : ti.getPlatWorkCode());
+ if (on == null && isInbound) {
+ on = ti.getPlatOrderCode() != null ? ti.getPlatOrderCode() : ti.getPlatWorkCode();
+ }
+ if (StringUtils.isNotBlank(on)) {
+ orderCodeSet.add(on);
+ }
+ }
+ Map<String, WkOrder> orderByCode = new HashMap<>();
+ if (!orderCodeSet.isEmpty()) {
+ for (WkOrder o : asnOrderService.list(new LambdaQueryWrapper<WkOrder>().in(WkOrder::getCode, orderCodeSet))) {
+ if (o != null && StringUtils.isNotBlank(o.getCode())) {
+ orderByCode.put(o.getCode(), o);
+ }
}
}
ObjectMapper om = new ObjectMapper();
Date now = new Date();
+ Map<String, List<InOutResultReportParam>> byOrder = new LinkedHashMap<>();
for (TaskItem item : taskItems) {
- if (!isInbound && !hasCloudOrderRef(item)) {
+ if (item == null) {
+ continue;
+ }
+ boolean hasTaskItemCloudRef = hasCloudOrderRef(item);
+ boolean hasInboundAsnFallbackRef = isInbound
+ && item.getSource() != null
+ && StringUtils.isNotBlank(sourceToOrderNo.get(item.getSource()));
+ if (!hasTaskItemCloudRef && !hasInboundAsnFallbackRef) {
continue;
}
String orderNo = isInbound ? sourceToOrderNo.get(item.getSource()) : (item.getPlatOrderCode() != null ? item.getPlatOrderCode() : item.getPlatWorkCode());
@@ -2839,31 +2945,56 @@
if (orderNo == null || item.getMatnrCode() == null) {
continue;
}
+ WkOrder asnOrder = null;
+ if (item.getOrderId() != null) {
+ asnOrder = orderById.get(item.getOrderId());
+ }
+ if (asnOrder == null) {
+ asnOrder = orderByCode.get(orderNo);
+ }
InOutResultReportParam param = new InOutResultReportParam()
.setOrderNo(orderNo)
.setPlanNo(item.getPlatWorkCode())
+ .setWkType(item.getWkType())
+ .setUnitNo(item.getUnit())
.setLineId(item.getPlatItemId())
.setWareHouseId(wareHouseId)
+ .setDocWarehouseNo(asnOrder != null ? asnOrder.getDocTaskWarehouseNo() : null)
+ .setOrgNo(asnOrder != null ? asnOrder.getDocOrgNo() : null)
+ .setInWarehouseNo(isInbound && asnOrder != null ? asnOrder.getDocInWarehouseNo() : null)
+ .setOutWarehouseNo(!isInbound && asnOrder != null ? asnOrder.getDocOutWarehouseNo() : null)
.setLocId(locId)
.setMatNr(item.getMatnrCode())
.setQty(item.getAnfme() != null ? String.valueOf(item.getAnfme()) : "0")
.setBatch(item.getBatch())
.setInbound(isInbound)
.setBarcode(task.getBarcode());
- try {
- String requestBody = om.writeValueAsString(param);
- CloudWmsNotifyLog notifyLog = new CloudWmsNotifyLog()
- .setReportType(cloudWmsNotifyLogService.getReportTypeInOutResult())
- .setRequestBody(requestBody)
- .setNotifyStatus(cloudWmsNotifyLogService.getNotifyStatusPending())
- .setRetryCount(0)
- .setBizRef("taskId=" + task.getId() + ",orderNo=" + orderNo)
- .setCreateTime(now)
- .setUpdateTime(now);
- cloudWmsNotifyLogService.fillFromConfig(notifyLog);
- cloudWmsNotifyLogService.save(notifyLog);
- } catch (JsonProcessingException e) {
- log.warn("鍏�/鍑哄簱缁撴灉涓婃姤寰呭姙钀藉簱澶辫触锛堜笉褰卞搷涓绘祦绋嬶級锛宼askId={}锛宱rderNo={}锛歿}", task.getId(), orderNo, e.getMessage());
+ byOrder.computeIfAbsent(orderNo, k -> new ArrayList<>()).add(param);
+ }
+ String mode = resolveCloudWmsInoutReportMode();
+ boolean sendHold = CloudWmsInoutReportMode.MANUAL.equals(mode) || CloudWmsInoutReportMode.WAIT_ORDER.equals(mode);
+ for (Map.Entry<String, List<InOutResultReportParam>> e : byOrder.entrySet()) {
+ String orderNo = e.getKey();
+ for (InOutResultReportParam param : e.getValue()) {
+ try {
+ String requestBody = om.writeValueAsString(param);
+ CloudWmsNotifyLog notifyLog = new CloudWmsNotifyLog()
+ .setReportType(cloudWmsNotifyLogService.getReportTypeInOutResult())
+ .setRequestBody(requestBody)
+ .setRetryCount(0)
+ .setBizRef("taskId=" + task.getId() + ",orderNo=" + orderNo)
+ .setCreateTime(now)
+ .setUpdateTime(now)
+ .setSourceOrderNo(orderNo)
+ .setInboundFlag(isInbound ? 1 : 0)
+ .setWareHouseCode(wareHouseId)
+ .setSendHold(sendHold ? 1 : 0)
+ .setSending(0);
+ cloudWmsNotifyLogService.fillFromConfig(notifyLog);
+ cloudWmsNotifyLogService.save(notifyLog);
+ } catch (JsonProcessingException ex) {
+ log.warn("鍏�/鍑哄簱缁撴灉涓婃姤寰呭姙钀藉簱澶辫触锛堜笉褰卞搷涓绘祦绋嬶級锛宼askId={}锛宱rderNo={}锛歿}", task.getId(), orderNo, ex.getMessage());
+ }
}
}
} catch (Exception e) {
@@ -2878,4 +3009,16 @@
return StringUtils.isNotBlank(item.getPlatOrderCode())
|| StringUtils.isNotBlank(item.getPlatWorkCode());
}
+
+ /** sys_config CLOUD_WMS_INOUT_REPORT_MODE锛歩mmediate / wait_order / manual / single */
+ private String resolveCloudWmsInoutReportMode() {
+ try {
+ Config cfg = configService.getCachedOrLoad(GlobalConfigCode.CLOUD_WMS_INOUT_REPORT_MODE);
+ if (cfg != null && StringUtils.isNotBlank(cfg.getVal())) {
+ return cfg.getVal().trim().toLowerCase();
+ }
+ } catch (Exception ignored) {
+ }
+ return CloudWmsInoutReportMode.IMMEDIATE;
+ }
}
--
Gitblit v1.9.1