package com.zy.core.thread.impl.v5; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.core.common.Cools; import com.core.common.DateUtils; import com.core.common.SpringUtils; import com.zy.asrs.entity.BasDevp; import com.zy.asrs.entity.DeviceConfig; import com.zy.asrs.entity.DeviceDataLog; import com.zy.asrs.service.BasDevpService; import com.zy.asrs.utils.Utils; import com.zy.common.utils.RedisUtil; import com.zy.core.cache.OutputQueue; import com.zy.core.enums.SlaveType; import com.zy.core.model.protocol.StationProtocol; import com.zy.core.network.ZyStationConnectDriver; import com.zy.core.network.entity.ZyStationStatusEntity; import com.zy.core.task.DeviceAsyncLogPublisher; import com.zy.core.thread.support.RecentStationArrivalTracker; import com.zy.core.thread.support.StationErrLogSupport; import com.zy.core.thread.support.StationTaskLocationRegistry; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; public class StationV5StatusReader { private final DeviceConfig deviceConfig; private final RedisUtil redisUtil; private final RecentStationArrivalTracker recentArrivalTracker; private final DeviceAsyncLogPublisher devpAsyncLogPublisher; private final StationTaskLocationRegistry stationTaskLocationRegistry; private final List statusList = new ArrayList<>(); private final Map statusMap = new HashMap<>(); private volatile List taskNoList = new ArrayList<>(); private boolean initialized = false; private long deviceDataLogTime = System.currentTimeMillis(); public StationV5StatusReader(DeviceConfig deviceConfig, RedisUtil redisUtil, RecentStationArrivalTracker recentArrivalTracker) { this.deviceConfig = deviceConfig; this.redisUtil = redisUtil; this.recentArrivalTracker = recentArrivalTracker; this.devpAsyncLogPublisher = SpringUtils.getBean(DeviceAsyncLogPublisher.class); this.stationTaskLocationRegistry = SpringUtils.getBean(StationTaskLocationRegistry.class); } public void readStatus(ZyStationConnectDriver zyStationConnectDriver) { if (zyStationConnectDriver == null) { return; } if (statusList.isEmpty()) { BasDevpService basDevpService = null; try { basDevpService = SpringUtils.getBean(BasDevpService.class); } catch (Exception ignore) { } if (basDevpService == null) { return; } BasDevp basDevp = basDevpService .getOne(new QueryWrapper().eq("devp_no", deviceConfig.getDeviceNo())); if (basDevp == null) { return; } List list = JSONObject.parseArray(basDevp.getStationList(), ZyStationStatusEntity.class); for (ZyStationStatusEntity entity : list) { StationProtocol stationProtocol = new StationProtocol(); stationProtocol.setStationId(entity.getStationId()); statusList.add(stationProtocol); statusMap.put(entity.getStationId(), stationProtocol); } initialized = true; } int deviceLogCollectTime = initialized ? Utils.getDeviceLogCollectTime() : 200; List zyStationStatusEntities = zyStationConnectDriver.getStatus(); if (zyStationStatusEntities == null || zyStationStatusEntities.isEmpty()) { return; } LinkedHashSet taskNoSet = new LinkedHashSet<>(); LinkedHashSet loadingTaskNoSet = new LinkedHashSet<>(); long observeAt = System.currentTimeMillis(); for (ZyStationStatusEntity statusEntity : zyStationStatusEntities) { if (statusEntity == null || statusEntity.getStationId() == null) { continue; } StationProtocol stationProtocol = statusMap.get(statusEntity.getStationId()); if (stationProtocol == null) { continue; } stationProtocol.setTaskNo(statusEntity.getTaskNo()); stationProtocol.setTargetStaNo(statusEntity.getTargetStaNo()); stationProtocol.setAutoing(statusEntity.isAutoing()); stationProtocol.setLoading(statusEntity.isLoading()); stationProtocol.setInEnable(statusEntity.isInEnable()); stationProtocol.setOutEnable(statusEntity.isOutEnable()); stationProtocol.setEmptyMk(statusEntity.isEmptyMk()); stationProtocol.setFullPlt(statusEntity.isFullPlt()); stationProtocol.setPalletHeight(statusEntity.getPalletHeight()); stationProtocol.setError(statusEntity.getError()); stationProtocol.setErrorMsg(statusEntity.getErrorMsg()); stationProtocol.setBarcode(statusEntity.getBarcode()); stationProtocol.setRunBlock(statusEntity.isRunBlock()); stationProtocol.setEnableIn(statusEntity.isEnableIn()); stationProtocol.setWeight(statusEntity.getWeight()); stationProtocol.setTaskWriteIdx(statusEntity.getTaskWriteIdx()); stationProtocol.setTaskBufferItems(statusEntity.getTaskBufferItems()); stationProtocol.setIoMode(statusEntity.getIoMode()); stationProtocol.setInBarcodeError(statusEntity.isInBarcodeError()); if (statusEntity.getTaskNo() != null && statusEntity.getTaskNo() > 0) { taskNoSet.add(statusEntity.getTaskNo()); if (statusEntity.isLoading()) { loadingTaskNoSet.add(statusEntity.getTaskNo()); } } if (statusEntity.getTaskBufferItems() != null) { statusEntity.getTaskBufferItems().forEach(item -> { Integer bufferTaskNo = item == null ? null : item.getTaskNo(); if (bufferTaskNo != null && bufferTaskNo > 0) { taskNoSet.add(bufferTaskNo); } }); } recentArrivalTracker.observe(statusEntity.getStationId(), statusEntity.getTaskNo(), statusEntity.isLoading()); syncTaskLocation(statusEntity, observeAt); if (!Cools.isEmpty(stationProtocol.getSystemWarning()) && stationProtocol.isAutoing() && !stationProtocol.isLoading()) { stationProtocol.setSystemWarning(""); } } taskNoList = new ArrayList<>(taskNoSet); if (stationTaskLocationRegistry != null) { stationTaskLocationRegistry.cleanupByDevice(deviceConfig.getDeviceNo(), loadingTaskNoSet); } OutputQueue.DEVP.offer(MessageFormat.format("【{0}】[id:{1}] <<<<< 实时数据更新成功", DateUtils.convert(new Date()), deviceConfig.getDeviceNo())); StationErrLogSupport.sync(deviceConfig, redisUtil, statusList); if (System.currentTimeMillis() - deviceDataLogTime > deviceLogCollectTime) { Date createTime = new Date(); HashMap originDataMap = buildStationStatusMap(zyStationStatusEntities); for (int i = 0; i < statusList.size(); i++) { StationProtocol stationProtocol = statusList.get(i); if (stationProtocol == null || stationProtocol.getStationId() == null) { continue; } DeviceDataLog deviceDataLog = new DeviceDataLog(); ZyStationStatusEntity originEntity = originDataMap.get(stationProtocol.getStationId()); deviceDataLog.setOriginData(originEntity == null ? null : JSON.toJSONString(originEntity)); deviceDataLog.setWcsData(JSON.toJSONString(stationProtocol)); deviceDataLog.setType(String.valueOf(SlaveType.Devp)); deviceDataLog.setDeviceNo(deviceConfig.getDeviceNo()); deviceDataLog.setStationId(stationProtocol.getStationId()); deviceDataLog.setCreateTime(createTime); devpAsyncLogPublisher.publishLatest(deviceDataLog); } deviceDataLogTime = System.currentTimeMillis(); } } private HashMap buildStationStatusMap(List zyStationStatusEntities) { HashMap map = new HashMap<>(); if (zyStationStatusEntities == null) { return map; } for (ZyStationStatusEntity statusEntity : zyStationStatusEntities) { if (statusEntity == null || statusEntity.getStationId() == null) { continue; } map.put(statusEntity.getStationId(), statusEntity); } return map; } public List getStatusList() { return statusList; } public List getTaskNoList() { return taskNoList; } private void syncTaskLocation(ZyStationStatusEntity statusEntity, long observeAt) { if (stationTaskLocationRegistry == null || statusEntity == null) { return; } Integer taskNo = statusEntity.getTaskNo(); if (taskNo != null && taskNo > 0 && statusEntity.isLoading()) { stationTaskLocationRegistry.update( taskNo, deviceConfig.getDeviceNo(), statusEntity.getStationId(), true, statusEntity.isRunBlock(), observeAt ); return; } stationTaskLocationRegistry.remove(taskNo, deviceConfig.getDeviceNo(), statusEntity.getStationId()); } }