From c9944fa15889ef97236960fcc9370a582cd86267 Mon Sep 17 00:00:00 2001
From: zwl <1051256694@qq.com>
Date: 星期二, 17 三月 2026 14:37:34 +0800
Subject: [PATCH] 1.wcs下发出库任务方式需更改,先采集数据再一次性下发:下发组batch和序号batch_seq 2.库位分配逻辑需优化,目前分配单个巷道 3.
---
src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java | 315 ++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 278 insertions(+), 37 deletions(-)
diff --git a/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java b/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
index 534fbc6..791622b 100644
--- a/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
+++ b/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
@@ -75,37 +75,24 @@
*/
@Override
public R pubWrkToWcs(WorkTaskParams params) {
- if (Objects.isNull(params.getTaskNo())) {
- return R.error("浠诲姟鍙蜂笉鑳戒负绌猴紒锛�");
+ if (params == null) {
+ return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
}
- if (Objects.isNull(params.getBarcode())) {
- return R.error("鎵樼洏鐮佷笉鑳戒负绌猴紒锛�");
+ WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", params.getTaskNo()));
+ String validateMsg = validatePubTask(params, wrkMast);
+ if (!Cools.isEmpty(validateMsg)) {
+ return R.error(validateMsg);
}
- if (Objects.isNull(params.getLocNo())) {
- return R.error("鐩爣搴撲綅涓嶈兘涓虹┖锛侊紒");
- }
- String url = createInTask;
- if (!Objects.isNull(params.getType()) && params.getType().equals("out")) {
- url = getWcs_address;
- }else if (!Objects.isNull(params.getType()) && params.getType().equals("move")) {
- url = createLocMoveTask;
- }
+ String url = resolveTaskPath(params);
String response;
R r = R.ok();
- WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", params.getTaskNo()));
- if (!Objects.isNull(wrkMast) && "out".equalsIgnoreCase(params.getType())) {
- if ("Y".equalsIgnoreCase(wrkMast.getPauseMk())) {
- return R.error("task paused");
- }
- if (requiresOutboundErpConfirm(wrkMast) && !"Y".equalsIgnoreCase(wrkMast.getPdcType())) {
- return R.error("task not confirmed by erp");
- }
- }
try {
log.info("涓嬪彂鎼繍浠诲姟缁檞cs="+JSON.toJSONString(params));
response = new HttpHandler.Builder()
.setUri(wcs_address)
.setPath(url)
+ .setHttps(wcs_address != null && wcs_address.startsWith("https://"))
+ .setTimeout(10, TimeUnit.SECONDS)
.setJson(JSON.toJSONString(params))
.build()
.doPost();
@@ -114,21 +101,7 @@
Integer code = jsonObject.getInteger("code");
if (code==200) {
- if (!Objects.isNull(wrkMast)) {
- if (wrkMast.getIoType()==1 || wrkMast.getIoType()==10) {
- wrkMast.setWrkSts(2L);
- wrkMast.setModiTime(new Date());
- wrkMastService.updateById(wrkMast);
- }else if(wrkMast.getIoType()==2){
- wrkMast.setWrkSts(2L);
- wrkMast.setModiTime(new Date());
- wrkMastService.updateById(wrkMast);
- }else if (wrkMast.getIoType()==101 || wrkMast.getIoType()==110) {
- wrkMast.setWrkSts(12L);
- wrkMast.setModiTime(new Date());
- wrkMastService.updateById(wrkMast);
- }
- }
+ updateWrkMastAfterPublish(wrkMast);
//TODO 涓婃姤鏄惁鎴愬姛
}else {
r =R.error();
@@ -137,6 +110,100 @@
throw new RuntimeException(e);
}
return r;
+ }
+
+ @Override
+ public R pubWrksToWcs(List<WorkTaskParams> paramsList) {
+ if (paramsList == null || paramsList.isEmpty()) {
+ return R.error("浠诲姟涓嶈兘涓虹┖锛侊紒");
+ }
+
+ // 鍏堜竴娆℃�ф妸鏈壒浠诲姟瀵瑰簲鐨勫伐浣滄。鎹炲嚭鏉ワ紝閬垮厤寰幆鍐呴噸澶嶆煡搴撱��
+ Map<String, WrkMast> wrkMastMap = getWrkMastMap(paramsList);
+ Map<String, List<WorkTaskParams>> groupedTasks = new LinkedHashMap<>();
+ List<String> skipMsgs = new ArrayList<>();
+
+ for (WorkTaskParams params : paramsList) {
+ if (params == null) {
+ skipMsgs.add("浠诲姟涓嶈兘涓虹┖锛侊紒");
+ continue;
+ }
+ WrkMast wrkMast = wrkMastMap.get(params.getTaskNo());
+ String validateMsg = validatePubTask(params, wrkMast);
+ if (!Cools.isEmpty(validateMsg)) {
+ skipMsgs.add(buildTaskMsg(params, validateMsg));
+ continue;
+ }
+
+ // 鍒嗙粍涓婚敭 = 鎺ュ彛璺緞 + userNo銆�
+ // 杩欐牱鏃㈣兘淇濊瘉鍏ュ簱/鍑哄簱/绉诲簱涓嶄細娣峰彂锛屼篃鑳戒繚璇佺浉鍚� userNo 鐨勪换鍔′細鎵撳寘鍒板悓涓�娆� WCS 璇锋眰涓��
+ String groupKey = buildBatchGroupKey(params, wrkMast);
+ groupedTasks.computeIfAbsent(groupKey, key -> new ArrayList<>()).add(params);
+ }
+
+ if (groupedTasks.isEmpty()) {
+ return R.error(skipMsgs.isEmpty() ? "鏃犲彲涓嬪彂浠诲姟" : skipMsgs.get(0)).add(skipMsgs);
+ }
+
+ int successCount = 0;
+ List<String> failMsgs = new ArrayList<>();
+ for (List<WorkTaskParams> group : groupedTasks.values()) {
+ if (group == null || group.isEmpty()) {
+ continue;
+ }
+
+ // 鍚屼竴缁勫唴鐨勪换鍔$被鍨嬩竴鑷达紝鍥犳鍙栫涓�鏉″嵆鍙‘瀹氭湰缁勫簲璇ヨ皟鐢ㄥ摢涓� WCS 鎺ュ彛銆�
+ String path = resolveTaskPath(group.get(0));
+ Map<String, Object> payload = new HashMap<>();
+ // WCS 鎵归噺涓嬪彂鎶ユ枃缁熶竴浣跨敤 {"tasks":[...]} 缁撴瀯銆�
+ payload.put("tasks", buildTaskPayloads(group));
+ String response = null;
+ try {
+ log.info("鎵归噺涓嬪彂鎼繍浠诲姟缁檞cs={}", JSON.toJSONString(payload));
+ response = new HttpHandler.Builder()
+ .setUri(wcs_address)
+ .setPath(path)
+ .setHttps(wcs_address != null && wcs_address.startsWith("https://"))
+ .setTimeout(10, TimeUnit.SECONDS)
+ .setJson(JSON.toJSONString(payload))
+ .build()
+ .doPost();
+ JSONObject jsonObject = JSON.parseObject(response == null ? "{}" : response);
+ log.info("鎵归噺涓嬪彂浠诲姟缁檞cs鐨勮繑鍥炲��={}", response);
+ Integer code = jsonObject.getInteger("code");
+ if (code != null && code == 200) {
+ successCount += group.size();
+ // 鍙湁鏁寸粍涓嬪彂鎴愬姛锛屾墠鍥炲啓鏈湴宸ヤ綔妗g姸鎬侊紝閬垮厤 WMS/WCS 鐘舵�佸垎鍙夈��
+ for (WorkTaskParams params : group) {
+ updateWrkMastAfterPublish(wrkMastMap.get(params.getTaskNo()));
+ }
+ } else {
+ String msg = jsonObject.getString("msg");
+ failMsgs.add("path=" + path + ", msg=" + (Cools.isEmpty(msg) ? "WCS涓嬪彂浠诲姟澶辫触" : msg));
+ log.error("鎵归噺涓嬪彂浠诲姟缁檞cs澶辫触, path:{}, request:{}, response:{}", path, JSON.toJSONString(payload), response);
+ }
+ } catch (IOException e) {
+ failMsgs.add("path=" + path + ", msg=" + e.getMessage());
+ log.error("鎵归噺涓嬪彂浠诲姟缁檞cs寮傚父, path:{}, request:{}, response:{}", path, JSON.toJSONString(payload), response, e);
+ }
+ }
+
+ Map<String, Object> result = new HashMap<>();
+ result.put("successCount", successCount);
+ result.put("skipCount", skipMsgs.size());
+ result.put("failCount", failMsgs.size());
+ if (!skipMsgs.isEmpty()) {
+ result.put("skipMsgs", skipMsgs);
+ }
+ if (!failMsgs.isEmpty()) {
+ result.put("failMsgs", failMsgs);
+ }
+
+ if (successCount == 0) {
+ String msg = !failMsgs.isEmpty() ? failMsgs.get(0) : (skipMsgs.isEmpty() ? "WCS涓嬪彂浠诲姟澶辫触" : skipMsgs.get(0));
+ return R.error(msg).add(result);
+ }
+ return R.ok(failMsgs.isEmpty() && skipMsgs.isEmpty() ? "鎿嶄綔鎴愬姛" : "閮ㄥ垎浠诲姟涓嬪彂鎴愬姛").add(result);
}
/**
@@ -206,6 +273,180 @@
Integer ioType = wrkMast == null ? null : wrkMast.getIoType();
return ioType != null && (ioType == 101 || ioType == 103 || ioType == 104 || ioType == 107 || ioType == 110);
}
+
+ /**
+ * 鏍¢獙鍗曟潯浠诲姟鏄惁婊¤冻涓嬪彂鍓嶆彁銆�
+ * <p>
+ * 杩欓噷鏃㈡牎楠屾帴鍙e繀濉」锛屼篃鏍¢獙涓氬姟绾︽潫锛屼緥濡傦細
+ * 1. 鍑哄簱浠诲姟鏄惁琚殏鍋滐紱
+ * 2. 闇�瑕� ERP 纭鐨勫嚭搴撲换鍔℃槸鍚﹀凡纭銆�
+ */
+ private String validatePubTask(WorkTaskParams params, WrkMast wrkMast) {
+ if (params == null) {
+ return "鍙傛暟涓嶈兘涓虹┖锛侊紒";
+ }
+ if (Cools.isEmpty(params.getTaskNo())) {
+ return "浠诲姟鍙蜂笉鑳戒负绌猴紒锛�";
+ }
+ if (Cools.isEmpty(params.getBarcode())) {
+ return "鎵樼洏鐮佷笉鑳戒负绌猴紒锛�";
+ }
+ if (Cools.isEmpty(params.getLocNo())) {
+ return "鐩爣搴撲綅涓嶈兘涓虹┖锛侊紒";
+ }
+ if (!Objects.isNull(wrkMast) && "out".equalsIgnoreCase(params.getType())) {
+ if ("Y".equalsIgnoreCase(wrkMast.getPauseMk())) {
+ return "task paused";
+ }
+ if (requiresOutboundErpConfirm(wrkMast) && !"Y".equalsIgnoreCase(wrkMast.getPdcType())) {
+ return "task not confirmed by erp";
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 鎸変换鍔$被鍨嬮�夋嫨 WCS 鎺ュ彛鍦板潃銆�
+ * in -> 鍏ュ簱鎺ュ彛
+ * out -> 鍑哄簱鎺ュ彛
+ * move -> 绉诲簱鎺ュ彛
+ */
+ private String resolveTaskPath(WorkTaskParams params) {
+ if (!Objects.isNull(params.getType()) && params.getType().equals("out")) {
+ return getWcs_address;
+ }
+ if (!Objects.isNull(params.getType()) && params.getType().equals("move")) {
+ return createLocMoveTask;
+ }
+ return createInTask;
+ }
+
+ /**
+ * WCS 涓嬪彂鎴愬姛鍚庢帹杩涙湰鍦板伐浣滄。鐘舵�併��
+ * <p>
+ * 杩欓噷鍙鐞嗏�滃凡涓嬪彂鈥濊繖涓�灞傜姸鎬侊紝涓嶅鐞嗚澶囨墽琛屽畬鎴愮姸鎬侊紱
+ * 璁惧鎵ц瀹屾垚渚濈劧浠� WCS 鍥炲啓涓哄噯銆�
+ */
+ private void updateWrkMastAfterPublish(WrkMast wrkMast) {
+ if (Objects.isNull(wrkMast)) {
+ return;
+ }
+ if (wrkMast.getIoType()==1 || wrkMast.getIoType()==10) {
+ wrkMast.setWrkSts(2L);
+ wrkMast.setModiTime(new Date());
+ wrkMastService.updateById(wrkMast);
+ }else if(wrkMast.getIoType()==2){
+ wrkMast.setWrkSts(2L);
+ wrkMast.setModiTime(new Date());
+ wrkMastService.updateById(wrkMast);
+ }else if (wrkMast.getIoType()==101 || wrkMast.getIoType()==110) {
+ wrkMast.setWrkSts(12L);
+ wrkMast.setModiTime(new Date());
+ wrkMastService.updateById(wrkMast);
+ }
+ }
+
+ /**
+ * 鎶婃湰娆″緟涓嬪彂鐨� taskNo 鎵归噺鏄犲皠鎴愬伐浣滄。锛屼緵鍚庣画鏍¢獙銆佹寜 userNo 鍒嗙粍銆佺姸鎬佸洖鍐欏鐢ㄣ��
+ */
+ private Map<String, WrkMast> getWrkMastMap(List<WorkTaskParams> paramsList) {
+ List<String> taskNos = paramsList.stream()
+ .filter(Objects::nonNull)
+ .map(WorkTaskParams::getTaskNo)
+ .filter(taskNo -> !Cools.isEmpty(taskNo))
+ .distinct()
+ .collect(Collectors.toList());
+ if (taskNos.isEmpty()) {
+ return Collections.emptyMap();
+ }
+ List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_no", taskNos));
+ if (wrkMasts == null || wrkMasts.isEmpty()) {
+ return Collections.emptyMap();
+ }
+ return wrkMasts.stream()
+ .filter(Objects::nonNull)
+ .collect(Collectors.toMap(mast -> String.valueOf(mast.getWrkNo()), mast -> mast, (left, right) -> left, LinkedHashMap::new));
+ }
+
+ /**
+ * 鏋勯�犳壒閲忎笅鍙戠殑鍒嗙粍閿��
+ * <p>
+ * 鍒嗙粍瑙勫垯锛�
+ * 1. 鍏堟寜鎺ュ彛璺緞鍖哄垎锛岄伩鍏嶄笉鍚屼换鍔$被鍨嬫贩鐢ㄥ悓涓�涓� WCS 鎺ュ彛锛�
+ * 2. 鍐嶆寜 userNo 鍖哄垎锛岀‘淇濈浉鍚� userNo 鐨勪换鍔′竴璧蜂笂鎶ャ��
+ * <p>
+ * 姝e父鎯呭喌涓� userNo 鍙栬嚜 work_mast.user_no锛�
+ * 濡傛灉褰撳墠娌℃煡鍒板伐浣滄。锛屽垯鍥為��鍒拌姹傞噷鐨� batch 瀛楁锛屼繚璇佸吋瀹瑰凡鏈夎皟鐢ㄣ��
+ */
+ private String buildBatchGroupKey(WorkTaskParams params, WrkMast wrkMast) {
+ String path = resolveTaskPath(params);
+ String userNo = wrkMast == null ? null : wrkMast.getUserNo();
+ if (Cools.isEmpty(userNo)) {
+ userNo = params.getBatch();
+ }
+ if (Cools.isEmpty(userNo)) {
+ userNo = "_NO_USER_";
+ }
+ return path + "#" + userNo;
+ }
+
+ /**
+ * 灏嗕竴缁勪笟鍔″弬鏁拌浆鎹㈡垚 WCS 鎵归噺鎺ュ彛鐨� tasks 鏁扮粍銆�
+ */
+ private List<Map<String, Object>> buildTaskPayloads(List<WorkTaskParams> tasks) {
+ List<Map<String, Object>> payloads = new ArrayList<>();
+ for (WorkTaskParams task : tasks) {
+ payloads.add(buildTaskPayload(task));
+ }
+ return payloads;
+ }
+
+ /**
+ * 缁勮鍗曟潯浠诲姟鐨� WCS 璇锋眰浣撱��
+ * 鍙斁褰撳墠浠诲姟绫诲瀷瀹為檯闇�瑕佺殑瀛楁锛涚┖瀛楁涓嶉�忎紶锛岄伩鍏嶇粰 WCS 閫犳垚姝т箟銆�
+ */
+ private Map<String, Object> buildTaskPayload(WorkTaskParams params) {
+ Map<String, Object> task = new LinkedHashMap<>();
+ if (!Cools.isEmpty(params.getTaskNo())) {
+ task.put("taskNo", params.getTaskNo());
+ }
+ if (!Cools.isEmpty(params.getLocNo())) {
+ task.put("locNo", params.getLocNo());
+ }
+ if (!Cools.isEmpty(params.getSourceLocNo())) {
+ task.put("sourceLocNo", params.getSourceLocNo());
+ }
+ if (!Cools.isEmpty(params.getSourceStaNo())) {
+ task.put("sourceStaNo", params.getSourceStaNo());
+ }
+ if (!Cools.isEmpty(params.getBarcode())) {
+ task.put("barcode", params.getBarcode());
+ }
+ if (!Objects.isNull(params.getTaskPri())) {
+ task.put("taskPri", params.getTaskPri());
+ }
+ if (!Cools.isEmpty(params.getStaNo())) {
+ task.put("staNo", params.getStaNo());
+ }
+ if (!Cools.isEmpty(params.getBatch())) {
+ task.put("batch", params.getBatch());
+ }
+ if (!Objects.isNull(params.getBatchSeq())) {
+ task.put("batchSeq", params.getBatchSeq());
+ }
+ return task;
+ }
+
+ /**
+ * 鏋勯�犺烦杩�/澶辫触淇℃伅鏃剁粺涓�甯︿笂 taskNo锛屼究浜庢帓鏌ュ叿浣撴槸鍝竴鏉″伐浣滄。鏈涓嬪彂銆�
+ */
+ private String buildTaskMsg(WorkTaskParams params, String msg) {
+ if (params == null || Cools.isEmpty(params.getTaskNo())) {
+ return msg;
+ }
+ return "taskNo=" + params.getTaskNo() + ", msg=" + msg;
+ }
+
@Override
public R pauseOutTasks(List<HashMap<String,Object>> params) {
if (params == null || params.size() == 0) {
--
Gitblit v1.9.1