package com.mes.job;
|
|
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.lang.Assert;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
import com.github.xingshuangs.iot.protocol.modbus.service.ModbusTcp;
|
import com.github.xingshuangs.iot.protocol.s7.serializer.S7Serializer;
|
import com.kangaroohy.milo.model.ReadWriteEntity;
|
import com.kangaroohy.milo.service.MiloService;
|
import com.mes.alarm.entity.ProductAlarmInfo;
|
import com.mes.alarm.service.ProductAlarmInfoService;
|
import com.mes.base.entity.HollowBigStorageCageBaseInfo;
|
import com.mes.bigstoragecagetask.entity.BigStorageCageTask;
|
import com.mes.bigstoragecagetask.service.BigStorageCageTaskService;
|
import com.mes.common.config.Const;
|
import com.mes.common.config.ConstSysConfig;
|
import com.mes.damage.entity.Damage;
|
import com.mes.damage.service.DamageService;
|
import com.mes.glassinfo.entity.GlassInfo;
|
import com.mes.glassinfo.service.GlassInfoService;
|
import com.mes.hollow.entity.HollowBigStorageCage;
|
import com.mes.hollow.entity.HollowBigStorageCageDetails;
|
import com.mes.hollow.entity.HollowGlassOutRelationInfo;
|
import com.mes.hollow.entity.HollowGlassRelationInfo;
|
import com.mes.hollow.entity.dto.BigStorageSequenceDTO;
|
import com.mes.hollow.entity.dto.FlowCardVirtualSlotDTO;
|
import com.mes.hollow.entity.dto.HollowBigStorageDTO;
|
import com.mes.hollow.entity.dto.UpdateHollowBigStorageCageDTO;
|
import com.mes.hollow.service.HollowBigStorageCageDetailsService;
|
import com.mes.hollow.service.HollowBigStorageCageService;
|
import com.mes.hollow.service.HollowGlassOutRelationInfoService;
|
import com.mes.hollow.service.HollowGlassRelationInfoService;
|
import com.mes.hollowqueue.entity.HollowGlassQueueInfo;
|
import com.mes.hollowqueue.service.HollowGlassQueueInfoService;
|
import com.mes.hollowtask.entity.HollowBigStorageCageHistoryTask;
|
import com.mes.hollowtask.service.HollowBigStorageCageHistoryTaskService;
|
import com.mes.s7.entity.S7DataZKDLPOne;
|
import com.mes.s7.entity.S7DataZKDLPTwo;
|
import com.mes.s7.entity.S7DataZKExtra;
|
import com.mes.sysconfig.service.SysConfigService;
|
import com.mes.temperingglass.entity.TemperingGlassInfo;
|
import com.mes.temperingglass.service.TemperingGlassInfoService;
|
import com.mes.utils.RedisUtil;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang.StringUtils;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.Resource;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
/**
|
* @author SNG-015
|
*/
|
@Component
|
@Slf4j
|
public class OpcPlcStorageCageHollowTask {
|
@Resource
|
private HollowBigStorageCageService hollowBigStorageCageService;
|
|
@Resource
|
private HollowBigStorageCageHistoryTaskService hollowBigStorageCageHistoryTaskService;
|
@Resource
|
private HollowGlassRelationInfoService hollowGlassRelationInfoService;
|
@Resource
|
private HollowBigStorageCageDetailsService hollowBigStorageCageDetailsService;
|
@Resource
|
private DamageService damageService;
|
@Resource
|
private GlassInfoService glassInfoService;
|
@Resource
|
private BigStorageCageTaskService bigStorageCageTaskService;
|
|
@Resource
|
private TemperingGlassInfoService temperingGlassInfoService;
|
@Resource
|
private HollowGlassQueueInfoService hollowGlassQueueInfoService;
|
@Resource
|
private HollowGlassOutRelationInfoService hollowGlassOutRelationInfoService;
|
@Resource
|
private SysConfigService sysConfigService;
|
|
@Autowired
|
@Qualifier("s7SerializerZKDLPOne")
|
private S7Serializer s7SerializerZKDLPOne;
|
|
@Autowired
|
@Qualifier("s7SerializerZKDLPTwo")
|
private S7Serializer s7SerializerZKDLPTwo;
|
|
@Autowired
|
@Qualifier("s7SerializerZKQ2")
|
private S7Serializer s7SerializerZKQ2;
|
|
@Autowired
|
@Qualifier("CMJ1ModbusTcp")
|
ModbusTcp CMJ1ModbusTcp;
|
|
@Resource
|
private ProductAlarmInfoService productAlarmInfoService;
|
|
private static final String BIG_STORAGE_CAGE_IN_TWO_TASK = "big_storage_cage_in_two_task";
|
private static final String BIG_STORAGE_CAGE_OUT_TWO_TASK = "big_storage_cage_out_two_task";
|
|
private static final List<Integer> ONE_LINE_FIRST = Arrays.asList(930, 931, 932);
|
private static final List<Integer> TWO_LINE_FIRST = Arrays.asList(931, 930, 932);
|
|
|
private static final String ALARM_MODULE = "中空";
|
private static final String ALARM_TYPE = "中空大理片";
|
private static final String ALARM_CODE_SIZE = "sizeSame";
|
private static final String ALARM_CODE_ID = "idSame";
|
|
/**
|
* 直通格子
|
*/
|
private static final Integer THROUGH_SLOT = 920;
|
@Autowired(required = false)
|
MiloService miloService;
|
@Resource
|
private RedisUtil redisUtil;
|
|
@Scheduled(fixedDelay = 1000)
|
public void inBigStorageTask() {
|
List<ProductAlarmInfo> alarmInfos = productAlarmInfoService.list(new LambdaQueryWrapper<ProductAlarmInfo>()
|
.eq(ProductAlarmInfo::getState, Const.LOAD_RAW_GLASS_NEW)
|
.eq(ProductAlarmInfo::getAlarmModule, ALARM_MODULE)
|
.eq(ProductAlarmInfo::getAlarmType, ALARM_TYPE));
|
if (CollectionUtil.isNotEmpty(alarmInfos)) {
|
log.info("界面报警,等待人工干预处理");
|
return;
|
}
|
S7DataZKDLPOne s7DataZKDLPOne = s7SerializerZKDLPOne.read(S7DataZKDLPOne.class);
|
log.info("进片任务读取s7DataZKDLPOne:{}", s7DataZKDLPOne);
|
Boolean inkageEntity = s7DataZKDLPOne.getMesControl();
|
if (!inkageEntity) {
|
log.info("当前为非联机状态,结束进片任务");
|
return;
|
}
|
Integer requestEntity = s7DataZKDLPOne.getRequestMes();
|
if (1 != requestEntity) {
|
log.info("当前未收到进片请求,结束进片任务");
|
return;
|
}
|
Integer mesReplyEntity = s7DataZKDLPOne.getMesReply();
|
if (1 == mesReplyEntity) {
|
log.info("有正在执行的任务,结束进片任务");
|
return;
|
}
|
|
List<BigStorageCageTask> inTaskList = new ArrayList();
|
Integer from = s7DataZKDLPOne.getFrom1();
|
List<String> glassIdList = new ArrayList<>();
|
List<String> requestWords = s7DataZKDLPOne.getIds();
|
for (int i = 1; i <= 6; i++) {
|
String requestWord = requestWords.get(i - 1);
|
if (null != requestWord && !requestWord.isEmpty()) {
|
BigStorageCageTask task = new BigStorageCageTask();
|
task.setGlassId(requestWord);
|
task.setStartSlot(from);
|
inTaskList.add(task);
|
glassIdList.add(requestWord);
|
continue;
|
}
|
}
|
if (CollectionUtil.isEmpty(inTaskList)) {
|
log.info("当前大车无进片玻璃,结束进片任务");
|
return;
|
}
|
log.info("获取任务的玻璃id:{}", glassIdList);
|
Map<String, Long> glassCountMap = glassIdList.stream().collect(Collectors.groupingBy(e -> e, Collectors.counting()));
|
for (Map.Entry<String, Long> entry : glassCountMap.entrySet()) {
|
if (entry.getValue() > 1) {
|
log.info("进片玻璃{}存在相同,结束本次任务", entry.getKey());
|
ProductAlarmInfo alarmInfo = new ProductAlarmInfo();
|
alarmInfo.setState(Const.LOAD_RAW_GLASS_NEW);
|
alarmInfo.setAlarmModule(ALARM_MODULE);
|
alarmInfo.setAlarmType(ALARM_TYPE);
|
alarmInfo.setAlarmCode(ALARM_CODE_ID);
|
alarmInfo.setAlarmMessage(entry.getKey());
|
productAlarmInfoService.save(alarmInfo);
|
//向plc发送报警:同一车进片玻璃存在相同
|
s7DataZKDLPOne = new S7DataZKDLPOne();
|
s7DataZKDLPOne.setAlramSignal(2);
|
s7SerializerZKDLPOne.write(s7DataZKDLPOne);
|
return;
|
}
|
}
|
List<HollowBigStorageCageDetails> detailsList = hollowBigStorageCageDetailsService.list(new LambdaQueryWrapper<HollowBigStorageCageDetails>().in(HollowBigStorageCageDetails::getGlassId, glassIdList)
|
.in(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL_ZERO));
|
if (CollectionUtil.isNotEmpty(detailsList)) {
|
log.info("理片笼存在相同的进片玻璃{},结束本次任务", detailsList);
|
//向plc发送报警:理片笼存在相同的进片玻璃
|
List<String> sameGlassIds = detailsList.stream()
|
.map(HollowBigStorageCageDetails::getGlassId)
|
.collect(Collectors.toList());
|
ProductAlarmInfo alarmInfo = new ProductAlarmInfo();
|
alarmInfo.setState(Const.LOAD_RAW_GLASS_NEW);
|
alarmInfo.setAlarmModule(ALARM_MODULE);
|
alarmInfo.setAlarmType(ALARM_TYPE);
|
alarmInfo.setAlarmCode(ALARM_CODE_ID);
|
alarmInfo.setAlarmMessage(sameGlassIds.toString());
|
productAlarmInfoService.save(alarmInfo);
|
s7DataZKDLPOne = new S7DataZKDLPOne();
|
s7DataZKDLPOne.setAlramSignal(4);
|
s7SerializerZKDLPOne.write(s7DataZKDLPOne);
|
return;
|
}
|
List<GlassInfo> glassInfoList = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().in(GlassInfo::getGlassId, glassIdList));
|
|
if (glassInfoList.size() != inTaskList.size()) {
|
log.info("进片任务数量{}与玻璃数量{}不匹配,结束本次进片", inTaskList.size(), glassInfoList.size());
|
//向plc发送报警:进片任务数量与系统查询到的玻璃数量不匹配
|
s7DataZKDLPOne = new S7DataZKDLPOne();
|
s7DataZKDLPOne.setAlramSignal(8);
|
s7SerializerZKDLPOne.write(s7DataZKDLPOne);
|
return;
|
}
|
|
Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_WIDTH);
|
Integer slotMaxThickness = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_MAX_THICKNESS);
|
//按照玻璃厚度分组,判断剩余格子是否可以存放
|
Map<Double, Long> thickCountMap = glassInfoList.stream().collect(Collectors.groupingBy(GlassInfo::getThickness, Collectors.counting()));
|
if (glassInfoList.get(0).getThickness() < slotMaxThickness) {
|
for (Map.Entry<Double, Long> entry : thickCountMap.entrySet()) {
|
int count = hollowBigStorageCageService.count(new LambdaQueryWrapper<HollowBigStorageCage>()
|
.eq(HollowBigStorageCage::getEnableState, Const.SLOT_ON).eq(HollowBigStorageCage::getRemainWidth, slotWidth)
|
.le(HollowBigStorageCage::getMinThickness, entry.getKey())
|
.ge(HollowBigStorageCage::getMaxThickness, entry.getKey()));
|
if (count < entry.getValue()) {
|
log.info("笼内格子剩余数量不足,结束本次进片");
|
//向plc发送报警:笼内格子剩余数量不足
|
s7DataZKDLPOne = new S7DataZKDLPOne();
|
s7DataZKDLPOne.setAlramSignal(16);
|
s7SerializerZKDLPOne.write(s7DataZKDLPOne);
|
return;
|
}
|
}
|
}
|
//超大尺寸
|
Integer slotMaxHeight = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_MAX_HEIGHT);
|
Integer slotMaxthickness = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_MAX_THICKNESS);
|
if (slotMaxHeight < Math.min(glassInfoList.get(0).getWidth(), glassInfoList.get(0).getHeight()) || glassInfoList.get(0).getThickness() >= slotMaxthickness) {
|
int count = hollowBigStorageCageDetailsService.count(new LambdaQueryWrapper<HollowBigStorageCageDetails>()
|
.eq(HollowBigStorageCageDetails::getSlot, THROUGH_SLOT)
|
.in(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL));
|
if (count > 0) {
|
log.info("直通片台存在玻璃,结束本次进片");
|
//向plc发送报警:直通片台存在玻璃,无法继续直通
|
s7DataZKDLPOne = new S7DataZKDLPOne();
|
s7DataZKDLPOne.setAlramSignal(64);
|
s7SerializerZKDLPOne.write(s7DataZKDLPOne);
|
return;
|
}
|
}
|
|
log.info("将钢化小片表内的状态改为钢化结束,玻璃id有:{}", glassIdList);
|
//修改钢化任务表中的状态
|
temperingGlassInfoService.update(new LambdaUpdateWrapper<TemperingGlassInfo>()
|
.set(TemperingGlassInfo::getState, Const.TEMPERING_END).in(TemperingGlassInfo::getGlassId, glassIdList));
|
//报工
|
log.info("将接收到的玻璃进行钢化自动报工,玻璃id有:{}", glassIdList);
|
for (String glass : glassIdList) {
|
damageService.autoSubmitReport(glass, inTaskList.get(0).getStartSlot(), "钢化", "进中空理片笼", 1);
|
}
|
Map<String, List<GlassInfo>> glassListMap = glassInfoList.stream().collect(Collectors.groupingBy(GlassInfo::getGlassId));
|
|
//计算目标格子
|
List<HollowBigStorageCageHistoryTask> historyTasks = new ArrayList<>();
|
|
Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_GLASS_GAP);
|
|
log.info("开始计算目标格子,玻璃id有:{}", inTaskList);
|
if (slotMaxHeight > Math.min(glassInfoList.get(0).getWidth(), glassInfoList.get(0).getHeight()) && glassInfoList.get(0).getThickness() < slotMaxthickness) {
|
for (BigStorageCageTask task : inTaskList) {
|
GlassInfo info = glassListMap.get(task.getGlassId()).get(0);
|
HollowBigStorageDTO bigStorageDTO = null;
|
try {
|
bigStorageDTO = hollowGlassRelationInfoService.queryHollowTargetSlot(info.getFlowCardId(), info.getGlassType(),
|
info.getWidth(), info.getHeight(), info.getTotalLayer(), info.getLayer());
|
} catch (Exception exception) {
|
log.info("进片任务执行中发生异常:{}", exception);
|
//保存故障信息
|
ProductAlarmInfo alarmInfo = new ProductAlarmInfo();
|
alarmInfo.setState(Const.LOAD_RAW_GLASS_NEW);
|
alarmInfo.setAlarmModule(ALARM_MODULE);
|
alarmInfo.setAlarmType(ALARM_TYPE);
|
alarmInfo.setAlarmCode(ALARM_CODE_SIZE);
|
alarmInfo.setAlarmMessage(info.getGlassId());
|
productAlarmInfoService.save(alarmInfo);
|
//重置详情表数据
|
hollowBigStorageCageDetailsService.update(new LambdaUpdateWrapper<HollowBigStorageCageDetails>()
|
.set(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_TAKE)
|
.eq(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_NEW));
|
//重置中空关系表数据
|
hollowGlassRelationInfoService.update(new LambdaUpdateWrapper<HollowGlassRelationInfo>()
|
.set(HollowGlassRelationInfo::getGlassId, null)
|
.set(HollowGlassRelationInfo::getTemperingLayoutId, null)
|
.set(HollowGlassRelationInfo::getTemperingFeedSequence, null)
|
.set(HollowGlassRelationInfo::getEngineerId, null)
|
.set(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_NEW)
|
.eq(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_OCCUPY)
|
);
|
//将格子尺寸恢复
|
hollowBigStorageCageService.resetCage();
|
return;
|
}
|
|
// 临时更新格子的剩余尺寸:防止相邻玻璃进同一格子造成剩余尺寸不足,玻璃越界的情况,任务完成后再次更新大理片笼表剩余宽度(按照笼内玻璃数量更新大理片笼剩余尺寸)
|
hollowBigStorageCageService.update(new LambdaUpdateWrapper<HollowBigStorageCage>()
|
.set(HollowBigStorageCage::getRemainWidth, bigStorageDTO.getRemainWidth() - Math.max(info.getWidth(), info.getHeight()) - glassGap)
|
.eq(HollowBigStorageCage::getSlot, bigStorageDTO.getSlot()));
|
task.setTargetSlot(bigStorageDTO.getSlot());
|
task.setGlassId(info.getGlassId());
|
//存放历史任务
|
HollowBigStorageCageHistoryTask historyTask = new HollowBigStorageCageHistoryTask();
|
BeanUtils.copyProperties(task, historyTask);
|
historyTask.setTaskType(Const.BIG_STORAGE_AFTER_IN);
|
historyTask.setGlassCount(glassInfoList.size());
|
historyTask.setTaskState(Const.ENGINEERING_NEW);
|
historyTasks.add(historyTask);
|
//存放详情数据
|
HollowBigStorageCageDetails cageDetails = new HollowBigStorageCageDetails();
|
BeanUtils.copyProperties(bigStorageDTO, cageDetails);
|
BeanUtils.copyProperties(info, cageDetails);
|
cageDetails.setState(Const.GLASS_STATE_NEW);
|
cageDetails.setSequence(bigStorageDTO.getSlotSequence());
|
cageDetails.setGap(glassGap);
|
cageDetails.setId(null);
|
hollowBigStorageCageDetailsService.save(cageDetails);
|
hollowGlassRelationInfoService.update(new LambdaUpdateWrapper<HollowGlassRelationInfo>()
|
.set(HollowGlassRelationInfo::getGlassId, cageDetails.getGlassId())
|
.set(HollowGlassRelationInfo::getTemperingLayoutId, cageDetails.getTemperingLayoutId())
|
.set(HollowGlassRelationInfo::getTemperingFeedSequence, cageDetails.getTemperingFeedSequence())
|
.set(HollowGlassRelationInfo::getEngineerId, cageDetails.getEngineerId())
|
.set(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_OCCUPY)
|
.eq(HollowGlassRelationInfo::getFlowCardId, bigStorageDTO.getFlowCardId())
|
.eq(HollowGlassRelationInfo::getLayer, bigStorageDTO.getLayer())
|
.eq(HollowGlassRelationInfo::getVirtualSlot, bigStorageDTO.getVirtualSlot())
|
.eq(HollowGlassRelationInfo::getSlotSequence, bigStorageDTO.getSlotSequence())
|
.eq(HollowGlassRelationInfo::getHollowSequence, bigStorageDTO.getHollowSequence())
|
);
|
}
|
} else {
|
BigStorageCageTask task = inTaskList.get(0);
|
task.setTargetSlot(THROUGH_SLOT);
|
//存放历史任务
|
HollowBigStorageCageHistoryTask historyTask = new HollowBigStorageCageHistoryTask();
|
BeanUtils.copyProperties(task, historyTask);
|
historyTask.setTaskType(Const.BIG_STORAGE_AFTER_IN);
|
historyTask.setGlassCount(glassInfoList.size());
|
historyTask.setTaskState(Const.ENGINEERING_NEW);
|
historyTasks.add(historyTask);
|
GlassInfo info = glassInfoList.get(0);
|
HollowBigStorageCageDetails cageDetails = new HollowBigStorageCageDetails();
|
BeanUtils.copyProperties(info, cageDetails);
|
cageDetails.setSlot(THROUGH_SLOT);
|
cageDetails.setState(Const.GLASS_STATE_NEW);
|
cageDetails.setDeviceId(0);
|
cageDetails.setSequence(0);
|
cageDetails.setHollowSequence(0);
|
cageDetails.setGap(glassGap);
|
cageDetails.setFilmsId(info.getFilmsid());
|
cageDetails.setId(null);
|
hollowBigStorageCageDetailsService.save(cageDetails);
|
}
|
|
//历史数据入库
|
hollowBigStorageCageHistoryTaskService.saveBatch(historyTasks);
|
//向opc发送启动信号
|
s7DataZKDLPOne = new S7DataZKDLPOne();
|
for (int i = 0; i < inTaskList.size() && i < 6; i++) {
|
Integer value = inTaskList.get(i).getTargetSlot();
|
switch (i) {
|
case 0:
|
s7DataZKDLPOne.setTo1(value);
|
break;
|
case 1:
|
s7DataZKDLPOne.setTo2(value);
|
break;
|
case 2:
|
s7DataZKDLPOne.setTo3(value);
|
break;
|
case 3:
|
s7DataZKDLPOne.setTo4(value);
|
break;
|
case 4:
|
s7DataZKDLPOne.setTo5(value);
|
break;
|
case 5:
|
s7DataZKDLPOne.setTo6(value);
|
break;
|
}
|
}
|
s7SerializerZKDLPOne.write(s7DataZKDLPOne);
|
s7DataZKDLPOne = new S7DataZKDLPOne();
|
s7DataZKDLPOne.setMesReply(1);
|
s7SerializerZKDLPOne.write(s7DataZKDLPOne);
|
}
|
|
@Scheduled(fixedDelay = 1000)
|
public void outBigStorageTask() throws Exception {
|
Date startDate = new Date();
|
S7DataZKDLPTwo s7DataZKDLPTwo = s7SerializerZKDLPTwo.read(S7DataZKDLPTwo.class);
|
log.info("出片任务读取s7DataZKDLPTwo:{}", s7DataZKDLPTwo);
|
Boolean inkageEntity = s7DataZKDLPTwo.getMesControl();
|
if (!inkageEntity) {
|
log.info("当前为非联机状态,结束进片任务");
|
return;
|
}
|
Integer requestEntity = s7DataZKDLPTwo.getRequestMes();
|
if (1 != requestEntity) {
|
log.info("当前未收到出片请求,结束出片任务");
|
return;
|
}
|
//获取出片任务表
|
List<BigStorageCageTask> outTaskList = getOutTaskList(s7DataZKDLPTwo);
|
if (CollectionUtil.isNotEmpty(outTaskList)) {
|
log.info("有正在执行的出片任务,结束本次出片任务");
|
return;
|
}
|
//获取所有空闲的线路信息
|
HashMap<Integer, Boolean> map = new HashMap<>();
|
//获取空闲且领取任务的数据信息,没有任务直接走玻璃调度
|
try {
|
if (CMJ1ModbusTcp.checkConnected()) {
|
Boolean oneState = CMJ1ModbusTcp.readUInt16(42027 - 40001) != 0;
|
map.put(930, oneState);
|
} else {
|
map.put(930, Boolean.FALSE);
|
}
|
} catch (Exception e) {
|
//nothing
|
log.info("一线空闲状态获取异常");
|
}
|
try {
|
S7DataZKExtra s7DataZKExtra = s7SerializerZKQ2.read(S7DataZKExtra.class);
|
log.info("中空额外读取{}", s7DataZKExtra);
|
map.put(931, s7DataZKExtra.getIsFree());
|
map.put(932, s7DataZKExtra.getIsFree03());
|
} catch (Exception e) {
|
//nothing
|
log.info("二/三线线空闲状态获取异常");
|
}
|
List<Integer> resultList = new ArrayList<>();
|
if (redisUtil.getCacheObject("priorityHollowSwitch")) {
|
resultList = TWO_LINE_FIRST;
|
} else {
|
resultList = ONE_LINE_FIRST;
|
}
|
|
HollowGlassOutRelationInfo hollowGlassOutRelationInfo = null;
|
int cell = -1;
|
for (Integer i : resultList) {
|
if (null == hollowGlassOutRelationInfo) {
|
Boolean entity = map.get(i);
|
cell = i;
|
if (null != entity && entity) {
|
hollowGlassOutRelationInfo = hollowGlassOutRelationInfoService
|
.getOne(new LambdaQueryWrapper<HollowGlassOutRelationInfo>()
|
.eq(HollowGlassOutRelationInfo::getCell, cell)
|
.eq(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_START)
|
.orderByAsc(HollowGlassOutRelationInfo::getId)
|
.last("limit 1")
|
);
|
}
|
} else {
|
break;
|
}
|
}
|
for (Integer i : resultList) {
|
if (null == hollowGlassOutRelationInfo) {
|
cell = i;
|
hollowGlassOutRelationInfo = hollowGlassOutRelationInfoService
|
.getOne(new LambdaQueryWrapper<HollowGlassOutRelationInfo>()
|
.eq(HollowGlassOutRelationInfo::getCell, cell)
|
.eq(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_START)
|
.orderByAsc(HollowGlassOutRelationInfo::getId)
|
.last("limit 1")
|
);
|
} else {
|
break;
|
}
|
}
|
|
if (null != hollowGlassOutRelationInfo) {
|
//是否允许中空
|
//是否有正在中空的玻璃:中空小片表筛选未出笼的玻璃信息
|
// 获取当前中空任务未完成出片的玻璃信息
|
List<HollowGlassQueueInfo> unFinishHollowQueueList = hollowGlassQueueInfoService.list(new LambdaQueryWrapper<HollowGlassQueueInfo>()
|
.eq(HollowGlassQueueInfo::getFlowCardId, hollowGlassOutRelationInfo.getFlowCardId())
|
.eq(HollowGlassQueueInfo::getCell, hollowGlassOutRelationInfo.getCell())
|
.eq(HollowGlassQueueInfo::getState, Const.TEMPERING_NEW)
|
.orderByAsc(HollowGlassQueueInfo::getHollowSequence));
|
if (CollectionUtil.isNotEmpty(unFinishHollowQueueList)) {
|
log.info("有正在出片的中空任务");
|
Integer isPair = unFinishHollowQueueList.get(0).getIsPair();
|
hollowOutGlassByIsPair(unFinishHollowQueueList, hollowGlassOutRelationInfo.getCell(), isPair, hollowGlassOutRelationInfo.getTotalLayer(), hollowGlassOutRelationInfo.getIsForce());
|
Date endDate = new Date();
|
log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime());
|
return;
|
} else {
|
//将中空任务状态改为已完成
|
hollowGlassOutRelationInfoService.update(new LambdaUpdateWrapper<HollowGlassOutRelationInfo>()
|
.eq(HollowGlassOutRelationInfo::getFlowCardId, hollowGlassOutRelationInfo.getFlowCardId())
|
.eq(HollowGlassOutRelationInfo::getCell, hollowGlassOutRelationInfo.getCell())
|
.set(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_SUCCESS));
|
}
|
}
|
//是否存在需要内部调度的格子:执行内部调度任务
|
if (redisUtil.getCacheObject("dispatchHollowSwitch")) {
|
//todo:获取笼内单格已经到齐的玻璃格子信息
|
List<FlowCardVirtualSlotDTO> virtualList = hollowBigStorageCageDetailsService.queryIsAllNeedDispatchVirtualSlot();
|
if (CollectionUtil.isEmpty(virtualList)) {
|
log.info("没有需要调度的格子");
|
return;
|
}
|
List<HollowBigStorageCageDetails> list = new ArrayList<>();
|
loop:
|
for (FlowCardVirtualSlotDTO dto : virtualList) {
|
List<BigStorageSequenceDTO> sequenceDTOList = hollowBigStorageCageDetailsService.queryNeedDispatchSlot(dto);
|
if (CollectionUtil.isEmpty(sequenceDTOList) || sequenceDTOList.size() == 1) {
|
continue;
|
}
|
int sequence = -1;
|
int startSlot = -1;
|
for (BigStorageSequenceDTO item : sequenceDTOList) {
|
if (item.getMinSequence() == sequence + 1) {
|
//生成调度任务
|
int targetSlot = item.getSlot();
|
list = hollowBigStorageCageDetailsService.list(new LambdaQueryWrapper<HollowBigStorageCageDetails>()
|
.eq(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_IN).eq(HollowBigStorageCageDetails::getSlot, startSlot));
|
hollowOutGlassByIsPair(list, targetSlot, 0, 0, 0);
|
List<Integer> slotList = new ArrayList<>();
|
slotList.add(targetSlot);
|
updateSlotRemainBySlots(slotList);
|
break loop;
|
}
|
sequence = item.getMaxSequence();
|
startSlot = item.getSlot();
|
}
|
}
|
}
|
Date endDate = new Date();
|
log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime());
|
return;
|
}
|
|
@Scheduled(fixedDelay = 1000)
|
public void finishInBigStorageTask() throws Exception {
|
S7DataZKDLPOne s7DataZKDLPOne = s7SerializerZKDLPOne.read(S7DataZKDLPOne.class);
|
Boolean inkageEntity = s7DataZKDLPOne.getMesControl();
|
if (true != inkageEntity) {
|
log.info("当前为非联机状态,结束完成进片任务");
|
return;
|
}
|
//获取进片任务表
|
List<BigStorageCageTask> inTaskList = new ArrayList();
|
List<String> glassIdList = new ArrayList<>();
|
String toWord = s7DataZKDLPOne.getTo1().toString();
|
if ("0".equals(toWord)) {
|
log.info("完成任务已执行,结束本次完成进片任务");
|
return;
|
}
|
for (int i = 1; i <= 6; i++) {
|
String requestWord = "";
|
String statetWord = "";
|
String toOpcUa = "";
|
String fromOpcUa = "";
|
switch (i) {
|
case 1:
|
requestWord = s7DataZKDLPOne.getId1();
|
statetWord = s7DataZKDLPOne.getState1().toString();
|
toOpcUa = s7DataZKDLPOne.getTo1().toString();
|
fromOpcUa = s7DataZKDLPOne.getFrom1().toString();
|
break;
|
case 2:
|
requestWord = s7DataZKDLPOne.getId2();
|
statetWord = s7DataZKDLPOne.getState2().toString();
|
toOpcUa = s7DataZKDLPOne.getTo2().toString();
|
fromOpcUa = s7DataZKDLPOne.getFrom2().toString();
|
break;
|
case 3:
|
requestWord = s7DataZKDLPOne.getId3();
|
statetWord = s7DataZKDLPOne.getState3().toString();
|
toOpcUa = s7DataZKDLPOne.getTo3().toString();
|
fromOpcUa = s7DataZKDLPOne.getFrom3().toString();
|
break;
|
case 4:
|
requestWord = s7DataZKDLPOne.getId4();
|
statetWord = s7DataZKDLPOne.getState4().toString();
|
toOpcUa = s7DataZKDLPOne.getTo4().toString();
|
fromOpcUa = s7DataZKDLPOne.getFrom4().toString();
|
break;
|
case 5:
|
requestWord = s7DataZKDLPOne.getId5();
|
statetWord = s7DataZKDLPOne.getState5().toString();
|
toOpcUa = s7DataZKDLPOne.getTo5().toString();
|
fromOpcUa = s7DataZKDLPOne.getFrom5().toString();
|
break;
|
case 6:
|
requestWord = s7DataZKDLPOne.getId6();
|
statetWord = s7DataZKDLPOne.getState6().toString();
|
toOpcUa = s7DataZKDLPOne.getTo6().toString();
|
fromOpcUa = s7DataZKDLPOne.getFrom6().toString();
|
break;
|
}
|
|
// if (null != requestWord.getValue()) {
|
if (null != requestWord && !requestWord.isEmpty()) {
|
BigStorageCageTask task = new BigStorageCageTask();
|
task.setGlassId(requestWord);
|
task.setTargetSlot(Integer.parseInt(toOpcUa));
|
task.setTaskState(Integer.parseInt(statetWord));
|
task.setStartSlot(Integer.parseInt(fromOpcUa));
|
inTaskList.add(task);
|
glassIdList.add(requestWord);
|
continue;
|
}
|
}
|
if (CollectionUtil.isEmpty(inTaskList)) {
|
log.info("当前大车无进片玻璃,结束完成进片任务");
|
return;
|
}
|
List<BigStorageCageTask> unFinishTaskList = inTaskList.stream().filter(e -> e.getTaskState() <= 1 || e.getStartSlot() == 0).collect(Collectors.toList());
|
if (CollectionUtil.isNotEmpty(unFinishTaskList)) {
|
log.info("存在未完成的玻璃信息,玻璃:{}", unFinishTaskList);
|
return;
|
}
|
Map<Integer, List<BigStorageCageTask>> taskMap = inTaskList.stream().collect(Collectors.groupingBy(BigStorageCageTask::getTaskState));
|
//按照任务状态修改大理片笼内的玻璃数据
|
// 重新计算大理片笼内的剩余尺寸
|
taskMap.forEach((e1, v) -> {
|
if (e1 == 2) {
|
//进片完成
|
log.info("3、获取进片已完成的玻璃信息id:{}", v);
|
List<Integer> inSuccessGlassSlot = v.stream().map(BigStorageCageTask::getTargetSlot).collect(Collectors.toList());
|
List<UpdateHollowBigStorageCageDTO> storageCageDTOList = v.stream().map(e -> {
|
UpdateHollowBigStorageCageDTO storageCageDTO = new UpdateHollowBigStorageCageDTO();
|
BeanUtils.copyProperties(e, storageCageDTO);
|
return storageCageDTO;
|
}).collect(Collectors.toList());
|
hollowBigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_IN);
|
log.info("4、大理片笼进片状态已完成已完成的玻璃信息id:{}", v);
|
updateSlotRemainBySlots(inSuccessGlassSlot);
|
List<String> glassList = v.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList());
|
hollowGlassRelationInfoService.update(new LambdaUpdateWrapper<HollowGlassRelationInfo>()
|
.set(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_SUCCESS)
|
.eq(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_OCCUPY)
|
.in(HollowGlassRelationInfo::getGlassId, glassList)
|
);
|
} else if (e1 == 3) {
|
//破损处理
|
dealDamageInTask(v);
|
List<String> glassList = v.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList());
|
hollowGlassRelationInfoService.update(new LambdaUpdateWrapper<HollowGlassRelationInfo>()
|
.set(HollowGlassRelationInfo::getGlassId, null)
|
.set(HollowGlassRelationInfo::getTemperingLayoutId, null)
|
.set(HollowGlassRelationInfo::getTemperingFeedSequence, null)
|
.set(HollowGlassRelationInfo::getEngineerId, null)
|
.set(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_NEW)
|
.eq(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_OCCUPY)
|
.in(HollowGlassRelationInfo::getGlassId, glassList)
|
);
|
} else {
|
//清空理片笼空数据
|
noDealInTask(v);
|
List<String> glassList = v.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList());
|
hollowGlassRelationInfoService.update(new LambdaUpdateWrapper<HollowGlassRelationInfo>()
|
.set(HollowGlassRelationInfo::getGlassId, null)
|
.set(HollowGlassRelationInfo::getTemperingLayoutId, null)
|
.set(HollowGlassRelationInfo::getTemperingFeedSequence, null)
|
.set(HollowGlassRelationInfo::getEngineerId, null)
|
.set(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_NEW)
|
.eq(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_OCCUPY)
|
.in(HollowGlassRelationInfo::getGlassId, glassList)
|
);
|
}
|
});
|
for (BigStorageCageTask item : inTaskList) {
|
//更新历史任务表中的任务状态
|
hollowBigStorageCageHistoryTaskService.update(new LambdaUpdateWrapper<HollowBigStorageCageHistoryTask>()
|
.set(HollowBigStorageCageHistoryTask::getTaskState, item.getTaskState())
|
.eq(HollowBigStorageCageHistoryTask::getTaskType, Const.BIG_STORAGE_AFTER_IN)
|
.eq(HollowBigStorageCageHistoryTask::getTargetSlot, item.getTargetSlot())
|
.eq(HollowBigStorageCageHistoryTask::getGlassId, item.getGlassId()));
|
item.setTargetSlot(0);
|
//清空任务表数据
|
// bigStorageCageTaskService.updateTaskMessage("big_storage_cage_in_one_task", item);
|
}
|
//清空启动状态
|
//向opc发送启动信号
|
s7DataZKDLPOne = new S7DataZKDLPOne();
|
s7DataZKDLPOne.setTo1(0);
|
s7DataZKDLPOne.setTo2(0);
|
s7DataZKDLPOne.setTo3(0);
|
s7DataZKDLPOne.setTo4(0);
|
s7DataZKDLPOne.setTo5(0);
|
s7DataZKDLPOne.setTo6(0);
|
s7SerializerZKDLPOne.write(s7DataZKDLPOne);
|
s7DataZKDLPOne = new S7DataZKDLPOne();
|
s7DataZKDLPOne.setMesReply(0);
|
s7SerializerZKDLPOne.write(s7DataZKDLPOne);
|
}
|
|
@Scheduled(fixedDelay = 1000)
|
public void finishOutBigStorageTask() throws Exception {
|
try {
|
S7DataZKDLPTwo s7DataZKDLPTwo = s7SerializerZKDLPTwo.read(S7DataZKDLPTwo.class);
|
Boolean inkageEntity = s7DataZKDLPTwo.getMesControl();
|
if (true != inkageEntity) {
|
log.info("当前为非联机状态,结束完成出片任务");
|
return;
|
}
|
//获取出片任务表
|
List<BigStorageCageTask> outTaskList = getOutTaskList(s7DataZKDLPTwo);
|
if (CollectionUtil.isEmpty(outTaskList)) {
|
log.info("当前大车无出片玻璃,结束完成出片任务");
|
return;
|
}
|
log.info("中空理片笼出片完成任务:{}", outTaskList);
|
log.info("中空理片笼出片汇报情况:{}", s7DataZKDLPTwo);
|
List<BigStorageCageTask> unFinishTaskList = outTaskList.stream().filter(e -> e.getTaskState() <= 1 || e.getStartSlot() == 0).collect(Collectors.toList());
|
if (CollectionUtil.isNotEmpty(unFinishTaskList)) {
|
log.info("存在未完成的玻璃信息,玻璃:{}", unFinishTaskList);
|
return;
|
}
|
Map<Integer, List<BigStorageCageTask>> taskMap = outTaskList.stream().collect(Collectors.groupingBy(BigStorageCageTask::getTaskState));
|
int taskType = 0;
|
if (Const.OUT_TARGET_POSITION_ALL.contains(outTaskList.get(0).getTargetSlot())) {
|
taskType = Const.BIG_STORAGE_AFTER_OUT;
|
} else {
|
taskType = Const.BIG_STORAGE_AFTER_DISPATCH;
|
}
|
//按照任务状态修改大理片笼内的玻璃数据
|
// 重新计算大理片笼内的剩余尺寸
|
Integer finalTaskType = taskType;
|
taskMap.forEach((e1, v) -> {
|
if (e1 == 2) {
|
//进片完成
|
log.info("3、获取出片已完成的玻璃信息id:{}", v);
|
List<Integer> outSuccessGlassSlot = new ArrayList<>();
|
if (finalTaskType.equals(Const.BIG_STORAGE_AFTER_OUT)) {
|
outSuccessGlassSlot = v.stream().map(BigStorageCageTask::getStartSlot).collect(Collectors.toList());
|
} else {
|
List<Integer> targetSuccessGlassSlot = v.stream().map(BigStorageCageTask::getTargetSlot).collect(Collectors.toList());
|
List<Integer> startoutSuccessGlassSlot = v.stream().map(BigStorageCageTask::getStartSlot).collect(Collectors.toList());
|
outSuccessGlassSlot.addAll(targetSuccessGlassSlot);
|
outSuccessGlassSlot.addAll(startoutSuccessGlassSlot);
|
}
|
List<UpdateHollowBigStorageCageDTO> storageCageDTOList = v.stream().map(e -> {
|
UpdateHollowBigStorageCageDTO storageCageDTO = new UpdateHollowBigStorageCageDTO();
|
storageCageDTO.setGlassId(e.getGlassId());
|
if (finalTaskType.equals(Const.BIG_STORAGE_AFTER_OUT)) {
|
storageCageDTO.setTargetSlot(e.getStartSlot());
|
} else {
|
storageCageDTO.setTargetSlot(e.getTargetSlot());
|
}
|
return storageCageDTO;
|
}).collect(Collectors.toList());
|
if (finalTaskType.equals(Const.BIG_STORAGE_AFTER_OUT)) {
|
hollowBigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_OUT);
|
} else {
|
hollowBigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_IN);
|
//按照格子信息更新对应的设备id
|
List<Integer> slotList = storageCageDTOList.stream().map(UpdateHollowBigStorageCageDTO::getTargetSlot).distinct().collect(Collectors.toList());
|
hollowBigStorageCageDetailsService.updateDeviceIdBySlot(slotList);
|
}
|
log.info("4、大理片笼出片状态已完成已完成的玻璃信息id:{}", v);
|
updateSlotRemainBySlots(outSuccessGlassSlot);
|
} else if (e1 == 3) {
|
//破损处理
|
dealDamageOutTask(v);
|
} else {
|
//清空理片笼空数据
|
noDealOutTask(v);
|
}
|
});
|
|
for (BigStorageCageTask item : outTaskList) {
|
//更新历史任务表中的任务状态
|
hollowBigStorageCageHistoryTaskService.update(new LambdaUpdateWrapper<HollowBigStorageCageHistoryTask>()
|
.set(HollowBigStorageCageHistoryTask::getTaskState, item.getTaskState())
|
.eq(HollowBigStorageCageHistoryTask::getTaskType, taskType)
|
.eq(HollowBigStorageCageHistoryTask::getGlassId, item.getGlassId()));
|
//更新中空小片表
|
Integer taskState = item.getTaskState();
|
if (taskState == 2) {
|
hollowGlassQueueInfoService.update(new LambdaUpdateWrapper<HollowGlassQueueInfo>()
|
.set(HollowGlassQueueInfo::getState, Const.TEMPERING_OUT).eq(HollowGlassQueueInfo::getGlassId, item.getGlassId()));
|
} else if (taskState == 3) {
|
// temperingGlassInfoService.remove(new LambdaQueryWrapper<TemperingGlassInfo>().eq(TemperingGlassInfo::getGlassId, item.getGlassId()));
|
hollowGlassQueueInfoService.update(new LambdaUpdateWrapper<HollowGlassQueueInfo>()
|
.set(HollowGlassQueueInfo::getState, Const.TEMPERING_DAMAGE).eq(HollowGlassQueueInfo::getGlassId, item.getGlassId()));
|
|
} else {
|
// 空执行
|
}
|
}
|
try {
|
//更新数量
|
//按照玻璃id获取需要出片对列表中的数据
|
if (finalTaskType.equals(Const.BIG_STORAGE_AFTER_OUT)) {
|
HollowGlassQueueInfo hollowGlassQueueInfo = hollowGlassQueueInfoService.getOne(new LambdaQueryWrapper<HollowGlassQueueInfo>()
|
.eq(HollowGlassQueueInfo::getGlassId, outTaskList.get(0).getGlassId())
|
.orderByDesc(HollowGlassQueueInfo::getUpdateTime).last("limit 1"));
|
List<HollowGlassQueueInfo> list = hollowGlassQueueInfoService.list(new LambdaQueryWrapper<HollowGlassQueueInfo>()
|
.eq(HollowGlassQueueInfo::getFlowCardId, hollowGlassQueueInfo.getFlowCardId())
|
.eq(HollowGlassQueueInfo::getCell, hollowGlassQueueInfo.getCell())
|
// .eq(HollowGlassQueueInfo::getIsPair, 1)
|
.eq(HollowGlassQueueInfo::getState, Const.TEMPERING_NEW)
|
);
|
if (CollectionUtil.isEmpty(list)) {
|
// 任务更新为已完成
|
hollowGlassOutRelationInfoService.update(new UpdateWrapper<HollowGlassOutRelationInfo>()
|
.eq("flow_card_id", hollowGlassQueueInfo.getFlowCardId())
|
.eq("cell", hollowGlassQueueInfo.getCell())
|
.setSql("pair_quantity = total_pair_quantity")
|
.set("state", Const.HOLLOW_FLOW_CARD_SUCCESS)
|
);
|
} else {
|
// 计算剩余玻璃对数,用任务总队数减剩余对数
|
int remainCount = list.size() / hollowGlassQueueInfo.getTotalLayer();
|
hollowGlassOutRelationInfoService.update(new UpdateWrapper<HollowGlassOutRelationInfo>()
|
.eq("flow_card_id", hollowGlassQueueInfo.getFlowCardId())
|
.eq("cell", hollowGlassQueueInfo.getCell())
|
.setSql("pair_quantity = total_pair_quantity -" + remainCount)
|
);
|
}
|
}
|
} catch (Exception e) {
|
log.info("计算玻璃数量过程中出现错误,错误信息{}", e.getMessage());
|
}
|
|
// 重置任务表数据
|
resetOutTask();
|
//清空启动状态
|
//向opc发送启动信号
|
s7DataZKDLPTwo = new S7DataZKDLPTwo();
|
s7DataZKDLPTwo.setMesReply(0);
|
s7SerializerZKDLPTwo.write(s7DataZKDLPTwo);
|
} catch (Exception e) {
|
log.info("中空理片笼出片汇报任务异常:{}", e);
|
}
|
|
}
|
|
private void dealDamageInTask(List<BigStorageCageTask> damageTaskList) {
|
// 获取进片任务表中状态为破损的数据
|
log.info("破损的玻璃信息有:{}", damageTaskList);
|
//移除理片笼详情表任务执行过程中破损的玻璃
|
hollowBigStorageCageDetailsService.remove(new LambdaQueryWrapper<HollowBigStorageCageDetails>()
|
.eq(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_NEW)
|
.in(HollowBigStorageCageDetails::getGlassId, damageTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList())));
|
//将破损信息新增入破损表
|
List<Integer> slotList = new ArrayList<>();
|
for (BigStorageCageTask item : damageTaskList) {
|
Damage damage = new Damage();
|
damage.setGlassId(item.getGlassId());
|
damage.setLine(item.getStartSlot());
|
damage.setWorkingProcedure("磨边");
|
damage.setRemark("进笼前卧转立");
|
damage.setStatus(1);
|
damage.setType(item.getTaskState());
|
damageService.insertDamage(damage);
|
slotList.add(item.getTargetSlot());
|
}
|
//更新格子剩余宽度
|
updateSlotRemainBySlots(slotList);
|
log.info("进片任务-破损任务执行完成");
|
}
|
|
private void dealDamageOutTask(List<BigStorageCageTask> damageTaskList) {
|
// 获取进片任务表中状态为破损的数据
|
log.info("破损的玻璃信息有:{}", damageTaskList);
|
//移除理片笼详情表任务执行过程中破损的玻璃
|
hollowBigStorageCageDetailsService.remove(new LambdaQueryWrapper<HollowBigStorageCageDetails>()
|
.in(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL_ZERO)
|
.in(HollowBigStorageCageDetails::getGlassId, damageTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList())));
|
//将破损信息新增入破损表
|
List<Integer> slotList = new ArrayList<>();
|
for (BigStorageCageTask item : damageTaskList) {
|
Damage damage = new Damage();
|
damage.setGlassId(item.getGlassId());
|
damage.setLine(item.getStartSlot());
|
damage.setWorkingProcedure("中空前");
|
damage.setRemark("进笼后卧转立");
|
damage.setStatus(1);
|
damage.setType(item.getTaskState());
|
damageService.insertDamage(damage);
|
slotList.add(item.getTargetSlot());
|
slotList.add(item.getStartSlot());
|
}
|
//更新格子剩余宽度
|
updateSlotRemainBySlots(slotList);
|
log.info("出片任务-破损任务执行完成");
|
}
|
|
private void noDealInTask(List<BigStorageCageTask> noDealTaskList) {
|
// 获取进片任务表中状态为破损的数据
|
log.info("破损的玻璃信息有:{}", noDealTaskList);
|
//移除理片笼详情表未执行任务的空记录信息
|
hollowBigStorageCageDetailsService.remove(new LambdaQueryWrapper<HollowBigStorageCageDetails>()
|
.eq(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_NEW)
|
.in(HollowBigStorageCageDetails::getGlassId, noDealTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList())));
|
//记录格子号,按格子号更新剩余尺寸
|
List<Integer> slotList = new ArrayList<>();
|
for (BigStorageCageTask item : noDealTaskList) {
|
slotList.add(item.getTargetSlot());
|
slotList.add(item.getStartSlot());
|
}
|
//更新格子剩余宽度
|
updateSlotRemainBySlots(slotList);
|
log.info("进片任务-无动作执行完成");
|
}
|
|
private void noDealOutTask(List<BigStorageCageTask> noDealTaskList) {
|
// 获取进片任务表中状态为破损的数据
|
log.info("破损的玻璃信息有:{}", noDealTaskList);
|
if (Const.OUT_TARGET_POSITION_ALL.contains(noDealTaskList.get(0).getTargetSlot())) {
|
//出片任务:将出片中状态恢复为在笼内
|
List<String> glassList = noDealTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList());
|
hollowBigStorageCageDetailsService.update(new LambdaUpdateWrapper<HollowBigStorageCageDetails>()
|
.set(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_IN)
|
.notIn(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_OUT, Const.GLASS_STATE_DAMAGE, Const.GLASS_STATE_TAKE)
|
.in(HollowBigStorageCageDetails::getGlassId, glassList));
|
|
} else {
|
//调度任务:将调度中状态改为在笼内,格子号恢复为调度前的格子
|
for (BigStorageCageTask item : noDealTaskList) {
|
hollowBigStorageCageDetailsService.update(new LambdaUpdateWrapper<HollowBigStorageCageDetails>()
|
.set(HollowBigStorageCageDetails::getSlot, item.getStartSlot())
|
.set(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_IN)
|
.notIn(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_OUT, Const.GLASS_STATE_DAMAGE, Const.GLASS_STATE_TAKE)
|
.eq(HollowBigStorageCageDetails::getGlassId, item.getGlassId()));
|
}
|
}
|
//将破损信息新增入破损表
|
List<Integer> slotList = new ArrayList<>();
|
for (BigStorageCageTask item : noDealTaskList) {
|
slotList.add(item.getTargetSlot());
|
slotList.add(item.getStartSlot());
|
}
|
//更新格子剩余宽度
|
updateSlotRemainBySlots(slotList);
|
log.info("出片任务-无动作执行完成");
|
}
|
|
|
private <T extends HollowBigStorageCageBaseInfo> Boolean hollowOutGlassByIsPair(List<T> list,
|
int targetSlot, int isPair, int totalLayer, int isForce) throws Exception {
|
List<T> resultList = new ArrayList<>();
|
List<T> tempList = new ArrayList<>();
|
int taskType = Const.BIG_STORAGE_AFTER_OUT;
|
int taskState = Const.GLASS_STATE_OUT_ING;
|
for (T t : list) {
|
if (isPair == (t.getIsPair() == null ? 0 : t.getIsPair())) {
|
tempList.add(t);
|
} else {
|
break;
|
}
|
}
|
|
Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_WIDTH);
|
if (isPair == 0 && isForce != 1) {
|
taskType = Const.BIG_STORAGE_AFTER_DISPATCH;
|
taskState = Const.GLASS_STATE_SCHEDULE_ING;
|
//目前调度任务totalLayer为0 出片调度任务有层号,用于区分调度方式
|
// 因为出片存在调度,如果为调度,提前占用格子,更新格子剩余尺寸,避免被进片玻璃占用
|
if (totalLayer != 0) {
|
resultList.add(list.get(0));
|
HollowBigStorageCage storageCage = hollowBigStorageCageService.getOne(new LambdaQueryWrapper<HollowBigStorageCage>()
|
.eq(HollowBigStorageCage::getEnableState, Const.SLOT_ON)
|
.le(HollowBigStorageCage::getMinThickness, list.get(0).getThickness())
|
.ge(HollowBigStorageCage::getMaxThickness, list.get(0).getThickness())
|
.eq(HollowBigStorageCage::getRemainWidth, slotWidth)
|
.orderByAsc(HollowBigStorageCage::getMaxThickness).last("limit 1"));
|
|
if (null == storageCage) {
|
//向plc发送报警:直通片台存在玻璃,无法继续直通
|
// miloService.writeToOpcWord(generateReadWriteEntity("DLP1A.DLP1A.alarmSignal", 16));
|
S7DataZKDLPOne s7DataZKDLPOne = new S7DataZKDLPOne();
|
s7DataZKDLPOne.setAlramSignal(16);
|
s7SerializerZKDLPOne.write(s7DataZKDLPOne);
|
Assert.isFalse(storageCage == null, "任务调度没有多余格子,结束调度任务");
|
}
|
|
targetSlot = storageCage.getSlot();
|
hollowBigStorageCageService.update(new LambdaUpdateWrapper<HollowBigStorageCage>()
|
.set(HollowBigStorageCage::getRemainWidth, 0).eq(HollowBigStorageCage::getSlot, targetSlot));
|
} else {
|
resultList = tempList;
|
}
|
totalLayer = 0;
|
} else {
|
resultList = tempList;
|
}
|
return computeOutGlassInfo(resultList, BIG_STORAGE_CAGE_OUT_TWO_TASK, targetSlot, taskState, taskType, totalLayer, isForce);
|
}
|
|
/**
|
* 出片一次仅生成一车玻璃
|
*
|
* @param <T>
|
* @param list
|
* @param totalLayer
|
* @return
|
*/
|
private <T extends HollowBigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, String tableName,
|
int targetSlot, int state, int taskType, int totalLayer, int isForce) {
|
//任务数据:获取车子存放玻璃最大数量,玻璃间隔
|
List<T> templist = new ArrayList<>();
|
//打车剩余尺寸
|
Integer remainWidth = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_WIDTH);
|
Integer outCarMaxSize = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_OUT_CAR_SIZE);
|
// Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_GLASS_GAP);
|
Integer glassGap = hollowGlassRelationInfoService.getGlassGapByThickness(list.get(0).getThickness());
|
for (T e : list) {
|
if (templist.size() >= outCarMaxSize || Math.max((int) e.getWidth(), (int) e.getHeight()) > remainWidth) {
|
break;
|
}
|
//计算当前出片车剩尺寸
|
remainWidth = remainWidth - Math.max((int) e.getWidth(), (int) e.getHeight()) - glassGap;
|
templist.add(e);
|
}
|
Assert.isFalse(CollectionUtil.isEmpty(templist), "未获取出片数据,结束出片任务");
|
log.info("获取出片任务数据{}条,执行保存", templist.size());
|
List<T> baseInfoList = templist;
|
if (1 != isForce) {
|
if (taskType == Const.BIG_STORAGE_AFTER_OUT) {
|
//校验防止小于等于总层数玻璃片序不匹配的问题,该问题多出现在大片玻璃,3层
|
if (templist.size() <= totalLayer) {
|
int tempSequence = templist.get(0).getHollowSequence();
|
List<T> resultList = new ArrayList<>();
|
for (int i = 0; i < templist.size(); i++) {
|
if (tempSequence == list.get(i).getHollowSequence()) {
|
resultList.add(templist.get(i));
|
} else {
|
break;
|
}
|
}
|
baseInfoList = resultList;
|
} else {
|
//大于总层数先取totalLayer倍数数量的玻璃,保证大车上的玻璃成对传
|
int remainCount = templist.size() % totalLayer;
|
if (targetSlot == 930) {
|
int tempSequence = templist.get(0).getHollowSequence();
|
List<T> resultList = new ArrayList<>();
|
for (int i = 0; i < templist.size(); i++) {
|
if (tempSequence == list.get(i).getHollowSequence()) {
|
resultList.add(templist.get(i));
|
} else {
|
break;
|
}
|
}
|
baseInfoList = resultList;
|
} else {
|
baseInfoList = templist.subList(0, templist.size() - remainCount);
|
}
|
}
|
}
|
}
|
List<String> glassIds = baseInfoList.stream().map(T::getGlassId).collect(Collectors.toList());
|
int glassCount = baseInfoList.size();
|
List<BigStorageCageTask> bigStorageCageTaskList = new ArrayList<>();
|
//生成出片任务条数不足6补全
|
for (T t : baseInfoList) {
|
bigStorageCageTaskList.add(new BigStorageCageTask(t.getGlassId(), t.getSlot(), targetSlot, 0));
|
}
|
//清空任务表数据
|
resetOutTask();
|
log.info("生成出片任务数据{}", bigStorageCageTaskList);
|
S7DataZKDLPTwo s7DataZKDLPTwo = new S7DataZKDLPTwo();
|
for (int i = 0; i < bigStorageCageTaskList.size() && i < 6; i++) {
|
String glassId = bigStorageCageTaskList.get(i).getGlassId();
|
Integer startSlot = bigStorageCageTaskList.get(i).getStartSlot();
|
Integer target = bigStorageCageTaskList.get(i).getTargetSlot();
|
if (startSlot > 0) {
|
switch (i) {
|
case 0:
|
s7DataZKDLPTwo.setId1(glassId);
|
s7DataZKDLPTwo.setFrom1(startSlot);
|
s7DataZKDLPTwo.setTo1(target);
|
break;
|
case 1:
|
s7DataZKDLPTwo.setId2(glassId);
|
s7DataZKDLPTwo.setFrom2(startSlot);
|
s7DataZKDLPTwo.setTo2(target);
|
break;
|
case 2:
|
s7DataZKDLPTwo.setId3(glassId);
|
s7DataZKDLPTwo.setFrom3(startSlot);
|
s7DataZKDLPTwo.setTo3(target);
|
break;
|
case 3:
|
s7DataZKDLPTwo.setId4(glassId);
|
s7DataZKDLPTwo.setFrom4(startSlot);
|
s7DataZKDLPTwo.setTo4(target);
|
break;
|
case 4:
|
s7DataZKDLPTwo.setId5(glassId);
|
s7DataZKDLPTwo.setFrom5(startSlot);
|
s7DataZKDLPTwo.setTo5(target);
|
break;
|
case 5:
|
s7DataZKDLPTwo.setId6(glassId);
|
s7DataZKDLPTwo.setFrom6(startSlot);
|
s7DataZKDLPTwo.setTo6(target);
|
break;
|
}
|
}
|
}
|
s7SerializerZKDLPTwo.write(s7DataZKDLPTwo);
|
log.info("出片任务写入数据{}", s7DataZKDLPTwo);
|
S7DataZKDLPTwo s7DataZKDLPTwo1 = s7SerializerZKDLPTwo.read(S7DataZKDLPTwo.class);
|
log.info("写入出片任务后读取数据{}", s7DataZKDLPTwo1);
|
List<HollowBigStorageCageHistoryTask> historyList = bigStorageCageTaskList.stream().filter(e -> StringUtils.isNotBlank(e.getGlassId())).map(e -> {
|
HollowBigStorageCageHistoryTask history = new HollowBigStorageCageHistoryTask();
|
BeanUtils.copyProperties(e, history);
|
history.setGlassCount(glassCount);
|
history.setTaskType(taskType);
|
return history;
|
}).collect(Collectors.toList());
|
log.info("历史任务保存{}", historyList);
|
hollowBigStorageCageHistoryTaskService.saveBatch(historyList);
|
log.info("将出片玻璃{}玻璃状态改为出片中", glassIds);
|
hollowBigStorageCageDetailsService.update(new LambdaUpdateWrapper<HollowBigStorageCageDetails>()
|
.set(HollowBigStorageCageDetails::getState, state)
|
.set(Const.BIG_STORAGE_AFTER_DISPATCH.equals(taskType), HollowBigStorageCageDetails::getSlot, targetSlot)
|
.notIn(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_OUT, Const.GLASS_STATE_DAMAGE, Const.GLASS_STATE_TAKE)
|
.in(HollowBigStorageCageDetails::getGlassId, glassIds));
|
try {
|
s7DataZKDLPTwo = new S7DataZKDLPTwo();
|
s7DataZKDLPTwo.setMesReply(1);
|
s7SerializerZKDLPTwo.write(s7DataZKDLPTwo);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
return Boolean.TRUE;
|
}
|
|
public void updateSlotRemainBySlots(List<Integer> slotList) {
|
//获取格子内所有的玻璃信息
|
List<HollowBigStorageCageDetails> inSlotGlassList = hollowBigStorageCageDetailsService.list(new LambdaQueryWrapper<HollowBigStorageCageDetails>()
|
.in(HollowBigStorageCageDetails::getSlot, slotList).in(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL));
|
Map<Integer, Double> slotRemainMap = new HashMap<>();
|
//是否存在有格子非空的玻璃
|
Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_GLASS_GAP);
|
Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_SLOT_WIDTH);
|
if (CollectionUtils.isNotEmpty(inSlotGlassList)) {
|
//存在 将格子内的玻璃分别进行更新
|
slotRemainMap = inSlotGlassList.stream()
|
.collect(Collectors.groupingBy(HollowBigStorageCageDetails::getSlot, Collectors.summingDouble(item -> Math.max(item.getWidth(), item.getHeight()) + glassGap)));
|
slotRemainMap.forEach((e, v) -> {
|
double remainWidth = slotWidth - v >= 0 ? slotWidth - v : 0;
|
hollowBigStorageCageService.update(new LambdaUpdateWrapper<HollowBigStorageCage>().set(HollowBigStorageCage::getRemainWidth, remainWidth)
|
.eq(HollowBigStorageCage::getSlot, e));
|
});
|
}
|
//过滤不存在玻璃的格子 将宽度重置为原始宽度6200
|
Set<Integer> remainSlotList = slotRemainMap.keySet();
|
slotList.removeAll(remainSlotList);
|
if (CollectionUtils.isNotEmpty(slotList)) {
|
hollowBigStorageCageService.update(new LambdaUpdateWrapper<HollowBigStorageCage>().set(HollowBigStorageCage::getRemainWidth, slotWidth)
|
.in(HollowBigStorageCage::getSlot, slotList));
|
}
|
}
|
|
public ReadWriteEntity generateReadWriteEntity(String identifier, Object value) {
|
return ReadWriteEntity.builder()
|
.identifier(identifier)
|
//Kep中是Long类型,即:Int32,Java中的int类型
|
.value(value)
|
.build();
|
}
|
|
//读取出片地址
|
private List<BigStorageCageTask> getOutTaskList(S7DataZKDLPTwo s7DataZKDLPTwo) {
|
List<BigStorageCageTask> outTaskList = new ArrayList<>();
|
List<String> glassIds = s7DataZKDLPTwo.getIds();
|
List<Integer> startSlots = s7DataZKDLPTwo.getFroms();
|
List<Integer> endSlots = s7DataZKDLPTwo.getTos();
|
List<Integer> states = s7DataZKDLPTwo.getStates();
|
for (int i = 0; i < 6; i++) {
|
if (glassIds.get(i) != null && !glassIds.get(i).isEmpty()) {
|
BigStorageCageTask bigStorageCageTask = new BigStorageCageTask();
|
bigStorageCageTask.setGlassId(glassIds.get(i));
|
bigStorageCageTask.setStartSlot(startSlots.get(i));
|
bigStorageCageTask.setTargetSlot(endSlots.get(i));
|
bigStorageCageTask.setTaskState(states.get(i));
|
outTaskList.add(bigStorageCageTask);
|
}
|
}
|
return outTaskList;
|
}
|
|
//重置任务表
|
private void resetOutTask() {
|
S7DataZKDLPTwo s7DataZKDLPTwo = new S7DataZKDLPTwo();
|
s7DataZKDLPTwo.setId1("");
|
s7DataZKDLPTwo.setId2("");
|
s7DataZKDLPTwo.setId3("");
|
s7DataZKDLPTwo.setId4("");
|
s7DataZKDLPTwo.setId5("");
|
s7DataZKDLPTwo.setId6("");
|
s7DataZKDLPTwo.setFrom1(0);
|
s7DataZKDLPTwo.setFrom2(0);
|
s7DataZKDLPTwo.setFrom3(0);
|
s7DataZKDLPTwo.setFrom4(0);
|
s7DataZKDLPTwo.setFrom5(0);
|
s7DataZKDLPTwo.setFrom6(0);
|
s7DataZKDLPTwo.setTo1(0);
|
s7DataZKDLPTwo.setTo2(0);
|
s7DataZKDLPTwo.setTo3(0);
|
s7DataZKDLPTwo.setTo4(0);
|
s7DataZKDLPTwo.setTo5(0);
|
s7DataZKDLPTwo.setTo6(0);
|
s7DataZKDLPTwo.setState1(0);
|
s7DataZKDLPTwo.setState2(0);
|
s7DataZKDLPTwo.setState3(0);
|
s7DataZKDLPTwo.setState4(0);
|
s7DataZKDLPTwo.setState5(0);
|
s7DataZKDLPTwo.setState6(0);
|
s7SerializerZKDLPTwo.write(s7DataZKDLPTwo);
|
}
|
}
|