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<StationProtocol> statusList = new ArrayList<>();
|
private final Map<Integer, StationProtocol> statusMap = new HashMap<>();
|
private volatile List<Integer> 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<BasDevp>().eq("devp_no", deviceConfig.getDeviceNo()));
|
if (basDevp == null) {
|
return;
|
}
|
|
List<ZyStationStatusEntity> 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<ZyStationStatusEntity> zyStationStatusEntities = zyStationConnectDriver.getStatus();
|
if (zyStationStatusEntities == null || zyStationStatusEntities.isEmpty()) {
|
return;
|
}
|
LinkedHashSet<Integer> taskNoSet = new LinkedHashSet<>();
|
LinkedHashSet<Integer> 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<Integer, ZyStationStatusEntity> 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<Integer, ZyStationStatusEntity> buildStationStatusMap(List<ZyStationStatusEntity> zyStationStatusEntities) {
|
HashMap<Integer, ZyStationStatusEntity> 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<StationProtocol> getStatusList() {
|
return statusList;
|
}
|
|
public List<Integer> 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());
|
}
|
}
|