package com.mes.job; import cn.smallbun.screw.core.util.CollectionUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.mes.common.S7object; import com.mes.common.config.Const; import com.mes.damage.entity.Damage; import com.mes.damage.service.DamageService; import com.mes.device.PlcParameterObject; import com.mes.sysdict.entity.SysDictData; import com.mes.sysdict.service.SysDictDataService; import com.mes.temperingglass.entity.TemperingGlassInfo; import com.mes.temperingglass.service.TemperingGlassInfoService; import com.mes.temperingrecord.entity.TemperingRecord; import com.mes.temperingrecord.service.TemperingRecordService; import com.mes.tools.S7control; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; 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.Comparator; import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * @Author : zhoush * @Date: 2024/7/17 12:47 * @Description: */ @Component @Slf4j public class TemperingTask { @Autowired private TemperingRecordService temperingRecordService; @Autowired private TemperingGlassInfoService temporaryGlassInfoService; @Autowired private DamageService damageService; @Autowired private SysDictDataService sysDictDataService; private static final String ALONE_STATE = "0"; @Value("${mes.width}") private Integer temperingWidth; @Value("${mes.height}") private Integer temperingHeight; @Scheduled(fixedDelay = 1000) public void temperingGlassBefore() { Date startDate = new Date(); log.info("本次任务开始执行时间:{}", startDate); PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject; S7control plcControl = S7object.getinstance().plccontrol; String state = plcParameterObject.getPlcParameter("state").getValue(); // 当前连线状态为 if (ALONE_STATE.equals(state)) { log.info("当前钢化炉连线模式为:{},(0:手动;1:连线),不执行该任务", state); return; } //将确认字置为0 plcControl.writeWord(plcParameterObject.getPlcParameter("confirmationWord").getAddress(), 0); //可能有几炉玻璃同时在钢,需要获取钢化小片表中的数据信息状态为2(旋转台玻璃已送出未钢化,正在钢化) List temperingGlassInfoList = temporaryGlassInfoService.list(new LambdaQueryWrapper() .eq(TemperingGlassInfo::getState, Const.TEMPERING_START)); if (CollectionUtils.isEmpty(temperingGlassInfoList)) { log.info("当前系统没有需要钢化的玻璃信息"); return; } TemperingGlassInfo maxGlassInfo = temperingGlassInfoList.stream().max(Comparator.comparingLong(TemperingGlassInfo::getId)).get(); //拿到工程id及炉号 // List engineerTemperingList = temperingGlassInfoList.stream().map(e -> { // EngineerTemperingDTO engineerTemperingDTO = new EngineerTemperingDTO(); // BeanUtils.copyProperties(e, engineerTemperingDTO); // return engineerTemperingDTO; // }).distinct().collect(Collectors.toList()); //将正在钢化的炉号过滤掉,仅获取待钢化的玻璃 // List temperingRecords = temperingRecordService.list(new LambdaQueryWrapper().and(i -> i.isNull(TemperingRecord::getCoolEnergy).or().eq(TemperingRecord::getCoolEnergy, ""))); // List temperingList = new ArrayList<>(); // if (CollectionUtils.isNotEmpty(temperingRecords)) { // temperingList = temperingRecords.stream().map(e -> { // EngineerTemperingDTO engineerTemperingDTO = new EngineerTemperingDTO(); // BeanUtils.copyProperties(e, engineerTemperingDTO); // return engineerTemperingDTO; // }).collect(Collectors.toList()); // } // engineerTemperingList.removeAll(temperingList); // if (CollectionUtils.isEmpty(engineerTemperingList)) { // log.info("没有待钢化的任务,结束"); // return; // } // if (engineerTemperingList.size() > 1) { // log.info("存在多炉待钢化的任务,请检查现场是否有异常数据未处理"); // return; // } // EngineerTemperingDTO temperingDTO = engineerTemperingList.get(0); //获取待钢化的所有玻璃信息 List temperingGlassList = temperingGlassInfoList.stream() .filter(e -> e.getEngineerId().equals(maxGlassInfo.getEngineerId()) && e.getTemperingLayoutId().equals(maxGlassInfo.getTemperingLayoutId())) .sorted(Comparator.comparing(TemperingGlassInfo::getTemperingFeedSequence)).collect(Collectors.toList()); //按照膜系获取玻璃材质 SysDictData glassTypeSysDictData = sysDictDataService.getOne(new QueryWrapper() .eq(StringUtils.isNotBlank(temperingGlassList.get(0).getFilmsid()), "dict_label", temperingGlassList.get(0).getFilmsid())); double sumArea = temperingGlassList.stream().mapToDouble(e -> e.getWidth() * e.getHeight()).sum(); double maxArea = temperingGlassList.stream().mapToDouble(e -> e.getWidth() * e.getHeight()).max().orElse(0.0); double minArea = temperingGlassList.stream().mapToDouble(e -> e.getWidth() * e.getHeight()).min().orElse(0.0); double areaDifference = (10000 * (maxArea - minArea) / maxArea); double loadingRate = (int) (10000 * sumArea / (temperingHeight * temperingWidth)); TemperingRecord temperingRecord = new TemperingRecord(); temperingRecord.setEngineerId(maxGlassInfo.getEngineerId()); temperingRecord.setTemperingLayoutId(maxGlassInfo.getTemperingLayoutId()); temperingRecord.setGlassType(Integer.parseInt(glassTypeSysDictData.getDictTypeValue())); temperingRecord.setTemperingType(1);//全钢 temperingRecord.setThickness(temperingGlassList.get(0).getThickness()); temperingRecord.setAreaDifference(areaDifference); temperingRecord.setLoadingRate(loadingRate); temperingRecord.setState(Const.GLASS_STATE_NEW); //如果出现同一炉重读被处理,主键直接异常处理,不会发给plc钢化信息 temperingRecordService.save(temperingRecord); // 向plc发送钢化信息 plcControl.writeWord(plcParameterObject.getPlcParameter("temperingLayoutId").getAddress(), maxGlassInfo.getTemperingLayoutId()); plcControl.writeWord(plcParameterObject.getPlcParameter("filmsid").getAddress(), Integer.parseInt(glassTypeSysDictData.getDictTypeValue())); plcControl.writeWord(plcParameterObject.getPlcParameter("temperingType").getAddress(), 1); plcControl.writeWord(plcParameterObject.getPlcParameter("thickness").getAddress(), (int) (temperingGlassList.get(0).getThickness() * 10)); plcControl.writeWord(plcParameterObject.getPlcParameter("areaDifference").getAddress(), (int) areaDifference); plcControl.writeWord(plcParameterObject.getPlcParameter("loadingRate").getAddress(), (int) loadingRate); //完成任务将确认字置为1 plcControl.writeWord(plcParameterObject.getPlcParameter("confirmationWord").getAddress(), 1); Date endDate = new Date(); log.info("本次任务结束时间:{},共耗时:{}ms", endDate, endDate.getTime() - startDate.getTime()); } @Scheduled(fixedDelay = 1000) public void temperingGlassAfter() { //暂不处理 } @Scheduled(fixedDelay = 1000) public void dealDamageTask() { Date startDate = new Date(); log.info("钢化破损玻璃清除任务开始执行时间:{}", startDate); List temperingGlassInfoList = temporaryGlassInfoService.list(new LambdaQueryWrapper().in(TemperingGlassInfo::getState, Const.GLASS_STATE_DAMAGE_TAKE)); if (CollectionUtils.isNotEmpty(temperingGlassInfoList)) { //获取破损/拿走玻璃id List glassList = temperingGlassInfoList.stream().map(TemperingGlassInfo::getGlassId).collect(Collectors.toList()); //将任务表中的数据删除 temporaryGlassInfoService.remove(new LambdaQueryWrapper().in(TemperingGlassInfo::getGlassId, glassList)); List damageList = temperingGlassInfoList.stream().map(e -> { Damage damage = new Damage(); damage.setGlassId(e.getGlassId()); damage.setLine(Const.TEMPERING_OUT_TARGET_POSITION); damage.setWorkingProcedure("钢化"); damage.setRemark("钢化"); damage.setStatus(0); damage.setType(e.getState()); return damage; }).collect(Collectors.toList()); damageService.batchInsertDamage(damageList); } Date endDate = new Date(); log.info("本次任务结束时间:{},共耗时:{}ms", endDate, endDate.getTime() - startDate.getTime()); } }