From 43d6ae86bc229a1a75637fae33be378e105016e3 Mon Sep 17 00:00:00 2001
From: cl <1442464845@qq.com>
Date: 星期日, 29 三月 2026 20:47:11 +0800
Subject: [PATCH] RCS通知
---
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java | 210 +++++++++++++++++++++++++++++++++++++---------------
1 files changed, 148 insertions(+), 62 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 7ebc3ce..6423c9f 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
@@ -13,6 +13,7 @@
import com.vincent.rsf.server.api.config.RemotesInfoProperties;
import com.vincent.rsf.server.api.controller.erp.params.InOutResultReportParam;
import com.vincent.rsf.server.api.controller.erp.params.TaskInParam;
+import com.vincent.rsf.server.api.service.RcsBusTaskNoticeService;
import com.vincent.rsf.server.api.entity.CommonResponse;
import com.vincent.rsf.server.api.entity.constant.RcsConstant;
import com.vincent.rsf.server.api.entity.dto.InTaskMsgDto;
@@ -131,6 +132,8 @@
private CloudWmsNotifyLogService cloudWmsNotifyLogService;
@Autowired
private WarehouseService warehouseService;
+ @Autowired
+ private RcsBusTaskNoticeService rcsBusTaskNoticeService;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -509,7 +512,7 @@
}
/**
- * 鎵嬪姩瀹屾垚浠诲姟
+ * 鎵嬪姩瀹屾垚浠诲姟锛氬叆搴撶被缃� 98銆佸嚭搴撶被缃� 198锛屽簱浣�/鍗曟嵁鎵e噺涓庝笂鎶ョ敱瀵瑰簲瀹氭椂浠诲姟鎵ц
*
* @param id
* @param loginUserId
@@ -549,13 +552,22 @@
}
modiftyTaskSort(task, loginUserId);
-
- // 濡傛灉浠诲姟鐘舵�佸凡缁忔槸AWAIT (196)锛屽啀娆$偣鍑诲畬缁撴椂锛岀洿鎺ュ畬鎴�
- if (task.getTaskStatus().equals(TaskStsType.AWAIT.id)) {
- // AWAIT鐘舵�佺殑浠诲姟鍐嶆瀹岀粨锛岀洿鎺ヨ缃负鍑哄簱瀹屾垚
+
+ // 鍏ュ簱锛�->98锛屽嚭搴擄細-> 198锛岀敱 complateOutStock 瀹氭椂浠诲姟 鏇存柊搴撳瓨
+ if (task.getTaskType() < 100) {
+ task.setTaskStatus(TaskStsType.COMPLETE_IN.id);
+ if (StringUtils.isNotBlank(task.getOrgSite())) {
+ BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
+ .eq(BasStation::getStationName, task.getOrgSite()));
+ if (Objects.nonNull(station) && station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) {
+ station.setUseStatus(LocStsType.LOC_STS_TYPE_O.type);
+ if (!basStationService.updateById(station)) {
+ throw new CoolException("鍏ュ簱绔欑偣鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+ }
+ }
+ }
+ } else {
task.setTaskStatus(TaskStsType.COMPLETE_OUT.id);
-
- // 鏇存柊鍑哄簱绔欑偣鐘舵�侊紙涓嶳CS閫氱煡瀹岀粨淇濇寔涓�鑷达級
if (task.getTaskType() >= TaskType.TASK_TYPE_OUT.type && StringUtils.isNotBlank(task.getTargSite())) {
BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
.eq(BasStation::getStationName, task.getTargSite()));
@@ -566,28 +578,17 @@
}
}
}
- } else {
- // 鍏朵粬鎯呭喌鎸夊師鏈夐�昏緫澶勭悊
- // 鍏ュ簱浠诲姟锛坱askType < 100锛夛細璁剧疆涓哄叆搴撳畬鎴�
- // 鍑哄簱浠诲姟锛坱askType >= 100锛夛細璁剧疆涓虹瓑寰呯‘璁�
- Integer newStatus = task.getTaskType() < 100 ? TaskStsType.COMPLETE_IN.id : TaskStsType.AWAIT.id;
- task.setTaskStatus(newStatus);
-
- // 濡傛灉鏄叆搴撲换鍔″畬鎴愶紝鏇存柊鍏ュ簱绔欑偣鐘舵�侊紙涓嶳CS閫氱煡瀹岀粨淇濇寔涓�鑷达級
- if (newStatus.equals(TaskStsType.COMPLETE_IN.id) && StringUtils.isNotBlank(task.getOrgSite())) {
- BasStation station = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
- .eq(BasStation::getStationName, task.getOrgSite()));
- if (Objects.nonNull(station) && station.getType().equals(StationTypeEnum.STATION_TYPE_NORMAL.type)) {
- station.setUseStatus(LocStsType.LOC_STS_TYPE_O.type);
- if (!basStationService.updateById(station)) {
- throw new CoolException("鍏ュ簱绔欑偣鐘舵�佷慨鏀瑰け璐ワ紒锛�");
- }
- }
- }
}
+ // 鍘燂細196 鏃跺啀鐐逛竴娆℃墠缃� 198锛涘嚭搴撻娆$偣鍑绘浘缃� 196(AWAIT)
+ // if (task.getTaskStatus().equals(TaskStsType.AWAIT.id)) { task.setTaskStatus(TaskStsType.COMPLETE_OUT.id); ... }
+ // else { Integer newStatus = task.getTaskType() < 100 ? COMPLETE_IN.id : AWAIT.id; ... }
if (!this.updateById(task)) {
throw new CoolException("瀹屾垚浠诲姟澶辫触");
+ }
+ // 绠$悊鍚庡彴銆屽畬鎴愪换鍔°�嶉�氱煡 RCS
+ if (StringUtils.isNotBlank(task.getTaskCode())) {
+ rcsBusTaskNoticeService.notifyTaskStatus(task.getTaskCode(), task.getTaskStatus());
}
return task;
}
@@ -597,11 +598,12 @@
*
* @param id 浠诲姟ID
* @param loginUserId 鐧诲綍鐢ㄦ埛ID
+ * @param notifyRcsFromAdmin 绠$悊鍚庡彴鍏ㄧ増鍑哄簱瀹岀粨鎺ュ彛涓� true 鏃堕�氱煡 RCS锛涘畾鏃�/PDA 绛変负 false
* @return 浠诲姟瀵硅薄
*/
@Override
@Transactional(rollbackFor = Exception.class)
- public Task completeFullOutStock(Long id, Long loginUserId) {
+ public Task completeFullOutStock(Long id, Long loginUserId, boolean notifyRcsFromAdmin) {
// 鏌ヨ浠诲姟
Task task = taskService.getOne(new LambdaQueryWrapper<Task>()
.eq(Task::getId, id));
@@ -668,6 +670,9 @@
if (!this.updateById(task)) {
throw new CoolException("浠诲姟鐘舵�佹洿鏂板け璐ワ紒锛�");
}
+ if (notifyRcsFromAdmin && StringUtils.isNotBlank(task.getTaskCode())) {
+ rcsBusTaskNoticeService.notifyTaskStatus(task.getTaskCode(), TaskStsType.UPDATED_OUT.id);
+ }
return task;
}
@@ -682,6 +687,11 @@
String curLoc;
if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)) {
curLoc = task.getTargLoc();
+ } else if (task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_IN.type)) {
+ curLoc = task.getTargLoc();
+ if (StringUtils.isBlank(curLoc)) {
+ return task;
+ }
} else {
curLoc = task.getOrgLoc();
}
@@ -979,59 +989,56 @@
}
}
- // 濡傛灉鏈変换鍔″凡涓嬪彂鍒癛CS锛屽厛璋冪敤RCS鍙栨秷鎺ュ彛
+ // 宸蹭笅鍙� RCS 鐨勫伐浣滄。锛氬繀椤诲厛璋� RCS 鍙栨秷鎺ュ彛鎴愬姛锛屽惁鍒欎笉鍏佽鍙栨秷宸ヤ綔妗�
boolean rcsCancelSuccess = false;
if (!rcsTaskCodes.isEmpty()) {
- // 妫�鏌� RCS API 閰嶇疆鏄惁鏈夋晥
if (rcsApi == null || StringUtils.isBlank(rcsApi.getHost()) || StringUtils.isBlank(rcsApi.getPort())) {
- log.error("========== RCS浠诲姟鍙栨秷澶辫触 ==========");
- log.error("RCS API 閰嶇疆鏃犳晥锛乭ost: {}, port: {}",
- rcsApi != null ? rcsApi.getHost() : "null",
- rcsApi != null ? rcsApi.getPort() : "null");
- // 鍗充娇閰嶇疆鏃犳晥锛屼篃缁х画鎵ц浠诲姟鍒犻櫎鎿嶄綔
- } else {
- try {
- log.info("========== 寮�濮嬪彇娑圧CS浠诲姟 ==========");
- log.info("闇�瑕佸彇娑堢殑RCS浠诲姟缂栧彿锛歿}", rcsTaskCodes);
- String rcsUrl = rcsApi.getHost() + ":" + rcsApi.getPort() + RcsConstant.cancelTask;
- log.info("RCS鍙栨秷浠诲姟璇锋眰鍦板潃锛歿}", rcsUrl);
-
- // 濡傛灉娌℃湁鎵规缂栧彿锛屼娇鐢ㄧ涓�涓换鍔$紪鍙蜂綔涓烘壒娆$紪鍙�
- if (StringUtils.isBlank(batchNo) && !rcsTaskCodes.isEmpty()) {
+ throw new CoolException("浠诲姟宸蹭笅鍙慠CS锛屼絾鏈厤缃甊CS鍦板潃锛屾棤娉曞彇娑堬紒锛�");
+ }
+ if (restTemplate == null) {
+ throw new CoolException("浠诲姟宸蹭笅鍙慠CS锛屼絾鏃犳硶璋冪敤RCS鍙栨秷鎺ュ彛锛屾棤娉曞彇娑堬紒锛�");
+ }
+ try {
+ log.info("========== 寮�濮嬪彇娑圧CS浠诲姟 ==========");
+ log.info("闇�瑕佸彇娑堢殑RCS浠诲姟缂栧彿锛歿}", rcsTaskCodes);
+ String rcsUrl = rcsApi.getHost() + ":" + rcsApi.getPort() + RcsConstant.cancelTask;
+ log.info("RCS鍙栨秷浠诲姟璇锋眰鍦板潃锛歿}", rcsUrl);
+
+ if (StringUtils.isBlank(batchNo)) {
batchNo = rcsTaskCodes.get(0);
}
-
+
Map<String, Object> cancelParams = new HashMap<>();
cancelParams.put("tasks", rcsTaskCodes);
if (StringUtils.isNotBlank(batchNo)) {
cancelParams.put("batchNo", batchNo);
}
-
+
log.info("RCS鍙栨秷浠诲姟璇锋眰鍙傛暟锛歿}", JSONObject.toJSONString(cancelParams));
-
+
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
headers.add("api-version", "v2.0");
HttpEntity<Map<String, Object>> httpEntity = new HttpEntity<>(cancelParams, headers);
-
+
long startTime = System.currentTimeMillis();
ResponseEntity<String> exchange = restTemplate.exchange(rcsUrl, HttpMethod.POST, httpEntity, String.class);
long endTime = System.currentTimeMillis();
-
+
log.info("RCS鍙栨秷浠诲姟鍝嶅簲鑰楁椂锛歿}ms", (endTime - startTime));
log.info("RCS鍙栨秷浠诲姟鍝嶅簲鐘舵�佺爜锛歿}", exchange.getStatusCode());
log.info("RCS鍙栨秷浠诲姟鍝嶅簲浣擄細{}", exchange.getBody());
-
+
if (Objects.isNull(exchange.getBody())) {
log.error("RCS鍙栨秷浠诲姟澶辫触锛氬搷搴斾綋涓虹┖");
throw new CoolException("RCS鍙栨秷浠诲姟澶辫触锛氬搷搴斾綋涓虹┖");
}
-
+
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.coercionConfigDefaults()
.setCoercion(CoercionInputShape.EmptyString, CoercionAction.AsEmpty);
CommonResponse result = objectMapper.readValue(exchange.getBody(), CommonResponse.class);
-
+
if (result.getCode() == 200) {
log.info("========== RCS浠诲姟鍙栨秷鎴愬姛 ==========");
log.info("鎴愬姛鍙栨秷鐨凴CS浠诲姟缂栧彿锛歿}", rcsTaskCodes);
@@ -1040,22 +1047,28 @@
log.error("RCS鍙栨秷浠诲姟澶辫触锛歿}", result.getMsg());
throw new CoolException("RCS鍙栨秷浠诲姟澶辫触锛�" + result.getMsg());
}
- } catch (JsonProcessingException e) {
- log.error("RCS鍙栨秷浠诲姟鍝嶅簲瑙f瀽澶辫触锛歿}", e.getMessage(), e);
- throw new CoolException("RCS鍙栨秷浠诲姟鍝嶅簲瑙f瀽澶辫触锛�" + e.getMessage());
- } catch (Exception e) {
- log.error("RCS鍙栨秷浠诲姟寮傚父锛歿}", e.getMessage(), e);
- throw new CoolException("RCS鍙栨秷浠诲姟寮傚父锛�" + e.getMessage());
- }
+ } catch (CoolException e) {
+ throw e;
+ } catch (JsonProcessingException e) {
+ log.error("RCS鍙栨秷浠诲姟鍝嶅簲瑙f瀽澶辫触锛歿}", e.getMessage(), e);
+ throw new CoolException("RCS鍙栨秷浠诲姟鍝嶅簲瑙f瀽澶辫触锛�" + e.getMessage());
+ } catch (Exception e) {
+ log.error("RCS鍙栨秷浠诲姟寮傚父锛歿}", e.getMessage(), e);
+ throw new CoolException("RCS鍙栨秷浠诲姟寮傚父锛�" + e.getMessage());
}
}
- // 鏌ヨ绗﹀悎鍙栨秷鏉′欢鐨勪换鍔★紙鐘舵�佷负1銆�101銆�199锛�
- List<Integer> allowedStatuses = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id, TaskStsType.WAVE_SEED.id);
+ // 鍙彇娑堢姸鎬侊細鍘� 1/101锛堜笉鍚� 199锛夛紱鎷f枡/鐩樼偣鍑哄簱 RCS 鎵ц涓�(<198)锛涙嫞鏂�/鐩樼偣鍐嶅叆搴�(53/57)涓嶆敮鎸佸彇娑�
List<Task> tasks = this.list(new LambdaQueryWrapper<Task>()
.in(Task::getTaskType, list)
.in(Task::getId, (Object[]) ids)
- .in(Task::getTaskStatus, allowedStatuses));
+ .and(w -> w
+ .in(Task::getTaskStatus, Arrays.asList(
+ TaskStsType.GENERATE_IN.id,
+ TaskStsType.GENERATE_OUT.id))
+ .or(w2 -> w2
+ .in(Task::getTaskType, TaskType.TASK_TYPE_PICK_AGAIN_OUT.type, TaskType.TASK_TYPE_CHECK_OUT.type)
+ .lt(Task::getTaskStatus, TaskStsType.COMPLETE_OUT.id))));
// 濡傛灉绗﹀悎鍙栨秷鏉′欢鐨勪换鍔′负绌猴紝浣哛CS鍙栨秷鎴愬姛锛屽厑璁哥户缁紙鍙兘鏄换鍔$姸鎬佸凡鍙樻洿锛�
if (tasks.isEmpty() && !rcsCancelSuccess) {
@@ -1984,9 +1997,30 @@
rcsApi != null ? rcsApi.getPort() : "null");
return;
}
-
+ // 鍚屾枡绠卞彿瑙勫垯锛�101 浠诲姟鎵�鍦ㄦ枡绠卞彿涓嬭嫢宸插瓨鍦� 196/198/199/200 浠诲姟锛屽垯涓嶅悜 RCS 鍙戦�佽 101 浠诲姟锛�/api/open/bus/submit锛�
+ List<Integer> higherStatuses = Arrays.asList(TaskStsType.AWAIT.id, TaskStsType.COMPLETE_OUT.id, TaskStsType.WAVE_SEED.id, TaskStsType.UPDATED_OUT.id);
+ List<Task> higherTasks = this.list(new LambdaQueryWrapper<Task>()
+ .in(Task::getTaskStatus, higherStatuses)
+ .isNotNull(Task::getBarcode)
+ .ne(Task::getBarcode, ""));
+ Set<String> barcodesWithHigher = higherTasks.stream().map(Task::getBarcode).filter(StringUtils::isNotBlank).collect(Collectors.toSet());
+ List<Task> toSend = tasks.stream()
+ .filter(t -> {
+ if (TaskStsType.GENERATE_OUT.id.equals(t.getTaskStatus()) && StringUtils.isNotBlank(t.getBarcode()) && barcodesWithHigher.contains(t.getBarcode())) {
+ log.debug("鍚屾枡绠卞彿{}涓嬪凡瀛樺湪196/198/199/200浠诲姟锛岃烦杩�101浠诲姟涓嬪彂锛歵askId={}", t.getBarcode(), t.getId());
+ return false;
+ }
+ return true;
+ })
+ .collect(Collectors.toList());
+ if (toSend.isEmpty()) {
+ log.debug("杩囨护鍚庢棤寰呬笅鍙戜换鍔�");
+ return;
+ }
+ tasks = toSend;
+
String pubTakUrl = rcsApi.getHost() + ":" + rcsApi.getPort() + RcsConstant.pubTask;
-
+
for (Task task : tasks) {
WcsTaskParams taskParams = new WcsTaskParams();
List<TaskItemParam> items = new ArrayList<>();
@@ -2400,6 +2434,20 @@
}
List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
+ // 绌烘澘鍏ュ簱鏃犱换鍔℃槑缁嗭紝浠呮洿鏂板簱浣嶄负绌烘澘(D)銆佷换鍔$姸鎬佷负搴撳瓨鏇存柊瀹屾垚
+ if (TaskType.TASK_TYPE_EMPITY_IN.type.equals(task.getTaskType())) {
+ if (!locService.update(new LambdaUpdateWrapper<Loc>().eq(Loc::getCode, task.getTargLoc())
+ .set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_D.type)
+ .set(Loc::getUpdateBy, loginUserId)
+ .set(Loc::getUpdateTime, new Date()))) {
+ throw new CoolException("绌烘澘鍏ュ簱搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+ }
+ if (!this.update(new LambdaUpdateWrapper<Task>().eq(Task::getId, task.getId()).set(Task::getTaskStatus, TaskStsType.UPDATED_IN.id))) {
+ throw new CoolException("绌烘澘鍏ュ簱浠诲姟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+ }
+ reportInOutResultToCloud(task, loc, Collections.emptyList(), null, true);
+ return;
+ }
if (taskItems.isEmpty()) {
throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦紒锛�");
}
@@ -2437,6 +2485,44 @@
throw new CoolException("缁勬嫋鐘舵�佷慨鏀瑰け璐ワ紒锛�");
}
+ // 缁勬墭鍏ュ簱瀹屾垚鍚庣疮鍔犺鍗曞強鏄庣粏鐨勫凡鏀舵暟閲忥紝鐢ㄤ簬鍚庣画鍒ゆ柇鏁村崟鏄惁鍙疆涓哄凡瀹屾垚
+ Map<Long, Double> orderIdToAdd = new HashMap<>();
+ Map<Long, Double> itemIdToAdd = new HashMap<>();
+ for (WaitPakinItem p : pakinItems) {
+ if (StringUtils.isBlank(p.getAsnCode())) {
+ continue;
+ }
+ WkOrder order = asnOrderService.getOne(new LambdaQueryWrapper<WkOrder>().eq(WkOrder::getCode, p.getAsnCode()));
+ if (order == null) {
+ continue;
+ }
+ double addQty = (p.getAnfme() != null ? p.getAnfme() : 0.0);
+ orderIdToAdd.merge(order.getId(), addQty, Double::sum);
+ if (p.getAsnItemId() != null) {
+ itemIdToAdd.merge(p.getAsnItemId(), addQty, Double::sum);
+ }
+ }
+ for (Map.Entry<Long, Double> e : orderIdToAdd.entrySet()) {
+ WkOrder o = asnOrderService.getById(e.getKey());
+ if (o != null) {
+ Double newQty = QuantityUtils.roundToScale(QuantityUtils.add(o.getQty() != null ? o.getQty() : 0.0, e.getValue()));
+ o.setQty(newQty);
+ if (!asnOrderService.updateById(o)) {
+ throw new CoolException("鍏ュ簱鍗曞畬鎴愭暟閲忔洿鏂板け璐ワ紒锛�");
+ }
+ }
+ }
+ for (Map.Entry<Long, Double> e : itemIdToAdd.entrySet()) {
+ WkOrderItem oi = asnOrderItemService.getById(e.getKey());
+ if (oi != null) {
+ Double newQty = QuantityUtils.roundToScale(QuantityUtils.add(oi.getQty() != null ? oi.getQty() : 0.0, e.getValue()));
+ oi.setQty(newQty);
+ if (!asnOrderItemService.updateById(oi)) {
+ throw new CoolException("鍏ュ簱鍗曟槑缁嗗畬鎴愭暟閲忔洿鏂板け璐ワ紒锛�");
+ }
+ }
+ }
+
/**淇敼搴撲綅鐘舵�佷负F.鍦ㄥ簱*/
if (!locService.update(new LambdaUpdateWrapper<Loc>().set(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type).eq(Loc::getCode, task.getTargLoc()))) {
throw new CoolException("搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�");
--
Gitblit v1.9.1