自动化立体仓库 - WMS系统
zwl
4 天以前 83044bcc31cfbd38d9ac4aa50a8d92833e53fbfa
wms获取设备wcs状态
1个文件已添加
4个文件已修改
208 ■■■■■ 已修改文件
src/main/java/com/zy/api/controller/WcsApiController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/service/WcsApiService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/WcsDeviceStatusScheduler.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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() {
src/main/java/com/zy/api/service/WcsApiService.java
@@ -39,6 +39,14 @@
    R receviceTaskFromWcs(ReceviceTaskParams params);
    /**
     * 主动拉取WCS设备状态并同步到WMS设备状态表
     * @author Ryan
     * @date 2026/3/21 11:30
     * @return com.core.common.R
     */
    R syncDeviceStatusFromWcs();
    /**
     * batch pause out tasks
     * @param params
     * @return
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;
    }
}
src/main/java/com/zy/asrs/task/WcsDeviceStatusScheduler.java
New file
@@ -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);
        }
    }
}
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