From 83044bcc31cfbd38d9ac4aa50a8d92833e53fbfa Mon Sep 17 00:00:00 2001
From: zwl <1051256694@qq.com>
Date: 星期六, 21 三月 2026 10:43:24 +0800
Subject: [PATCH] wms获取设备wcs状态
---
src/main/java/com/zy/api/controller/WcsApiController.java | 7 +
src/main/java/com/zy/asrs/task/WcsDeviceStatusScheduler.java | 36 +++++++++
src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java | 150 +++++++++++++++++++++++++++++++++++++
src/main/resources/application.yml | 7 +
src/main/java/com/zy/api/service/WcsApiService.java | 8 ++
5 files changed, 208 insertions(+), 0 deletions(-)
diff --git a/src/main/java/com/zy/api/controller/WcsApiController.java b/src/main/java/com/zy/api/controller/WcsApiController.java
index c639fae..0c86a2d 100644
--- a/src/main/java/com/zy/api/controller/WcsApiController.java
+++ b/src/main/java/com/zy/api/controller/WcsApiController.java
@@ -57,6 +57,13 @@
}
@ManagerAuth
+ @ApiOperation("涓诲姩鍚屾WCS璁惧鐘舵��")
+ @PostMapping("/sync/deviceStatus")
+ public R syncDeviceStatusFromWcs() {
+ return wcsApiService.syncDeviceStatusFromWcs();
+ }
+
+ @ManagerAuth
@ApiOperation("鑾峰彇缁勬墭鍏ュ簱鎵樼洏淇℃伅")
@PostMapping("/openapi/waitPakins")
public R waitPakins() {
diff --git a/src/main/java/com/zy/api/service/WcsApiService.java b/src/main/java/com/zy/api/service/WcsApiService.java
index 1b1ed6f..a820563 100644
--- a/src/main/java/com/zy/api/service/WcsApiService.java
+++ b/src/main/java/com/zy/api/service/WcsApiService.java
@@ -39,6 +39,14 @@
R receviceTaskFromWcs(ReceviceTaskParams params);
/**
+ * 涓诲姩鎷夊彇WCS璁惧鐘舵�佸苟鍚屾鍒癢MS璁惧鐘舵�佽〃
+ * @author Ryan
+ * @date 2026/3/21 11:30
+ * @return com.core.common.R
+ */
+ R syncDeviceStatusFromWcs();
+
+ /**
* batch pause out tasks
* @param params
* @return
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 9c80922..46067fc 100644
--- a/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
+++ b/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
@@ -9,6 +9,9 @@
import com.zy.api.controller.params.ReceviceTaskParams;
import com.zy.api.controller.params.StopOutTaskParams;
import com.zy.api.controller.params.WorkTaskParams;
+import com.zy.api.entity.CrnProtocol;
+import com.zy.api.entity.DeviceStatusVo;
+import com.zy.api.entity.StationProtocol;
import com.zy.api.service.WcsApiService;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.*;
@@ -31,6 +34,9 @@
@Slf4j
@Service
public class WcsApiServiceImpl implements WcsApiService {
+ private static final Long WCS_SYNC_USER = 9999L;
+ private static final String YES = "Y";
+ private static final String NO = "N";
@Autowired
private LocMastService locMastService;
@@ -61,8 +67,16 @@
@Value("${wcs.address.stopOutTask}")
private String stopOutTask;
+ @Value("${wcs.address.getDeviceStatus:/openapi/getDeviceStatus}")
+ private String getDeviceStatus;
+ @Value("${wcs.status-sync.method:GET}")
+ private String deviceStatusMethod;
@Autowired
private CommonService commonService;
+ @Autowired
+ private BasDevpService basDevpService;
+ @Autowired
+ private BasCrnpService basCrnpService;
/**
@@ -267,6 +281,39 @@
}
return R.ok();
+ }
+
+ @Override
+ public R syncDeviceStatusFromWcs() {
+ if (!Boolean.parseBoolean(String.valueOf(switchValue))) {
+ return R.ok("WCS寮�鍏冲叧闂�");
+ }
+ String response = null;
+ try {
+ response = requestDeviceStatusFromWcs();
+ JSONObject jsonObject = JSON.parseObject(response == null ? "{}" : response);
+ Integer code = jsonObject.getInteger("code");
+ if (!Objects.equals(code, 200)) {
+ String msg = jsonObject.getString("msg");
+ return R.error(Cools.isEmpty(msg) ? "鑾峰彇WCS璁惧鐘舵�佸け璐�" : msg);
+ }
+ JSONObject data = jsonObject.getJSONObject("data");
+ DeviceStatusVo deviceStatusVo = data == null
+ ? new DeviceStatusVo()
+ : JSON.parseObject(data.toJSONString(), DeviceStatusVo.class);
+
+ int stationCount = syncStationStatus(deviceStatusVo.getStationList());
+ int crnCount = syncCrnStatus(deviceStatusVo.getCrnList());
+
+ Map<String, Object> result = new LinkedHashMap<>();
+ result.put("stationCount", stationCount);
+ result.put("crnCount", crnCount);
+ log.info("鍚屾WCS璁惧鐘舵�佹垚鍔�, stationCount={}, crnCount={}", stationCount, crnCount);
+ return R.ok("鍚屾鎴愬姛").add(result);
+ } catch (Exception e) {
+ log.error("鍚屾WCS璁惧鐘舵�佸紓甯�, response={}", response, e);
+ return R.error("鍚屾WCS璁惧鐘舵�佸け璐�: " + e.getMessage());
+ }
}
private boolean requiresOutboundErpConfirm(WrkMast wrkMast) {
@@ -481,4 +528,107 @@
}
}
+ private String requestDeviceStatusFromWcs() throws IOException {
+ HttpHandler.Builder builder = new HttpHandler.Builder()
+ .setUri(wcs_address)
+ .setPath(getDeviceStatus)
+ .setTimeout(10, TimeUnit.SECONDS);
+ String method = Cools.isEmpty(deviceStatusMethod) ? "GET" : deviceStatusMethod.trim().toUpperCase(Locale.ROOT);
+ if ("POST".equals(method)) {
+ return builder.setJson("{}").build().doPost();
+ }
+ return builder.build().doGet();
+ }
+
+ private int syncStationStatus(List<StationProtocol> stationList) {
+ if (stationList == null || stationList.isEmpty()) {
+ return 0;
+ }
+ int count = 0;
+ Date now = new Date();
+ for (StationProtocol stationProtocol : stationList) {
+ if (stationProtocol == null || stationProtocol.getStationId() == null) {
+ continue;
+ }
+ BasDevp basDevp = basDevpService.selectById(stationProtocol.getStationId());
+ boolean isNew = Objects.isNull(basDevp);
+ if (isNew) {
+ basDevp = new BasDevp();
+ basDevp.setDevNo(stationProtocol.getStationId());
+ basDevp.setAppeUser(WCS_SYNC_USER);
+ basDevp.setAppeTime(now);
+ }
+ basDevp.setInEnable(toFlag(stationProtocol.isInEnable()));
+ basDevp.setOutEnable(toFlag(stationProtocol.isOutEnable()));
+ basDevp.setAutoing(toFlag(stationProtocol.isAutoing()));
+ basDevp.setLoading(toFlag(stationProtocol.isLoading()));
+ basDevp.setCanining(toFlag(stationProtocol.isEnableIn()));
+ basDevp.setCanouting(toFlag(!stationProtocol.isRunBlock()));
+ basDevp.setWrkNo(defaultZero(stationProtocol.getTaskNo()));
+ basDevp.setBarcode(normalizeText(stationProtocol.getBarcode()));
+ basDevp.setGrossWt(stationProtocol.getWeight() == null ? 0D : stationProtocol.getWeight());
+ basDevp.setModiUser(WCS_SYNC_USER);
+ basDevp.setModiTime(now);
+ if (isNew) {
+ if (!basDevpService.insert(basDevp)) {
+ throw new CoolException("鏂板绔欑偣鐘舵�佸け璐�, stationId=" + stationProtocol.getStationId());
+ }
+ } else if (!basDevpService.updateById(basDevp)) {
+ throw new CoolException("鏇存柊绔欑偣鐘舵�佸け璐�, stationId=" + stationProtocol.getStationId());
+ }
+ count++;
+ }
+ return count;
+ }
+
+ private int syncCrnStatus(List<CrnProtocol> crnList) {
+ if (crnList == null || crnList.isEmpty()) {
+ return 0;
+ }
+ int count = 0;
+ Date now = new Date();
+ for (CrnProtocol crnProtocol : crnList) {
+ if (crnProtocol == null || crnProtocol.getCrnNo() == null) {
+ continue;
+ }
+ BasCrnp basCrnp = basCrnpService.selectById(crnProtocol.getCrnNo());
+ boolean isNew = Objects.isNull(basCrnp);
+ if (isNew) {
+ basCrnp = new BasCrnp();
+ basCrnp.setCrnNo(crnProtocol.getCrnNo());
+ basCrnp.setInEnable(YES);
+ basCrnp.setOutEnable(YES);
+ basCrnp.setAppeUser(WCS_SYNC_USER);
+ basCrnp.setAppeTime(now);
+ }
+ // crn_sts 鏈湴琛ㄥ瓨鐨勬槸鈥滃爢鍨涙満妯″紡(鎵嬪姩/鑷姩/鐢佃剳)鈥濓紝鍥犳蹇呴』鍐� mode锛屼笉鑳藉啓 status銆�
+ basCrnp.setCrnSts(defaultZero(crnProtocol.getMode()));
+ basCrnp.setWrkNo(defaultZero(crnProtocol.getTaskNo()));
+ basCrnp.setCrnErr(crnProtocol.getAlarm() == null ? 0L : Long.valueOf(crnProtocol.getAlarm()));
+ basCrnp.setModiUser(WCS_SYNC_USER);
+ basCrnp.setModiTime(now);
+ if (isNew) {
+ if (!basCrnpService.insert(basCrnp)) {
+ throw new CoolException("鏂板鍫嗗灈鏈虹姸鎬佸け璐�, crnNo=" + crnProtocol.getCrnNo());
+ }
+ } else if (!basCrnpService.updateById(basCrnp)) {
+ throw new CoolException("鏇存柊鍫嗗灈鏈虹姸鎬佸け璐�, crnNo=" + crnProtocol.getCrnNo());
+ }
+ count++;
+ }
+ return count;
+ }
+
+ private Integer defaultZero(Integer value) {
+ return value == null ? 0 : value;
+ }
+
+ private String normalizeText(String value) {
+ return Cools.isEmpty(value) ? "" : value;
+ }
+
+ private String toFlag(boolean value) {
+ return value ? YES : NO;
+ }
+
}
diff --git a/src/main/java/com/zy/asrs/task/WcsDeviceStatusScheduler.java b/src/main/java/com/zy/asrs/task/WcsDeviceStatusScheduler.java
new file mode 100644
index 0000000..901adb0
--- /dev/null
+++ b/src/main/java/com/zy/asrs/task/WcsDeviceStatusScheduler.java
@@ -0,0 +1,36 @@
+package com.zy.asrs.task;
+
+import com.core.common.R;
+import com.zy.api.service.WcsApiService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.Objects;
+
+@Slf4j
+@Component
+public class WcsDeviceStatusScheduler {
+
+ @Autowired
+ private WcsApiService wcsApiService;
+
+ @Value("${wcs.status-sync.enabled:true}")
+ private Boolean enabled;
+
+ @Scheduled(
+ initialDelayString = "${wcs.status-sync.initial-delay:10000}",
+ fixedDelayString = "${wcs.status-sync.fixed-delay:5000}"
+ )
+ private void execute() {
+ if (!Boolean.TRUE.equals(enabled)) {
+ return;
+ }
+ R result = wcsApiService.syncDeviceStatusFromWcs();
+ if (!Objects.equals(result.get("code"), 200)) {
+ log.warn("杞鍚屾WCS璁惧鐘舵�佸け璐�, result={}", result);
+ }
+ }
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 41b879f..ea11f2b 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -103,6 +103,11 @@
wcs:
# 寮�鍏�
switch: true
+ status-sync:
+ enabled: true
+ initial-delay: 10000
+ fixed-delay: 5000
+ method: GET
# 鍦板潃
address:
URL: https://127.0.0.1:9090/wcs
@@ -114,3 +119,5 @@
createLocMoveTask: /openapi/createLocMoveTask
#pause out task
stopOutTask: /openapi/cancelTaskBatch
+ #璁惧鐘舵�佽幏鍙栧湴鍧�
+ getDeviceStatus: /openapi/deviceStatus
--
Gitblit v1.9.1