UI-Project/src/lang/en.js
@@ -232,6 +232,7 @@ // cancel:'取消', temperingtotal:'Number of tempering furnaces:', glasstotal:'Total number of glasses:', scheduletime:'Time of schedule:' }, workOrder:{ glassID:'Glass ID', UI-Project/src/lang/zh.js
@@ -236,6 +236,7 @@ cancel:'取消', temperingtotal:'钢化炉数:', glasstotal:'玻璃总数:', scheduletime:'调度时间:' }, workOrder:{ glassID:'玻璃ID', UI-Project/src/views/Slicecage/slicecage.vue
@@ -80,6 +80,7 @@ const selectedRow = ref(null); // 存储选中的行数据 const temperingtotal = ref(0); const glasstotal = ref(0); const scheduletime = ref(0); const fulltotals = ref(0); const temperingengineerId=ref(''); // 当前页码和每页显示的条数 @@ -645,6 +646,7 @@ const handleganghua = () => { dialogFormVisiblec.value = true; // 打开绑定架子对话框 fetchFlow(); scheduleTime(); }; // 钢化查询 @@ -675,6 +677,22 @@ } } const scheduleTime = async () => { try { const response = await request.post('/cacheVerticalGlass/bigStorageCageDetails/scheduleTime') if (response.code == 200) { scheduletime.value = response.data } else { ElMessage.error(response.message); } } catch (error) { // 处理错误 console.error(error); } } const fetchFlow = async () => { try { @@ -1589,6 +1607,13 @@ <div style="margin-bottom: 20px"> <el-form> <el-row style="margin-top: -15px;margin-bottom: -2px;"> <el-col :span="5"> <div id="dta" style="font-size: 15px;"> <el-form-item :label="$t('searchOrder.scheduletime')" style="width: 14vw"> {{ scheduletime }} </el-form-item> </div> </el-col> <el-col :span="4"> <div id="dt" style="font-size: 15px;"> <el-form-item :label="$t('searchOrder.temperingtotal')" style="width: 14vw"> hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java
@@ -154,5 +154,11 @@ return Result.build(200, "修改成功", 1); } @ApiOperation("调度时间查询") @PostMapping("/scheduleTime") public Result scheduleTime() { return Result.build(200, "修改成功", bigStorageCageDetailsService.scheduleTime()); } } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java
@@ -78,4 +78,6 @@ String temperingSwitch(Boolean flag); void appointEngineerId(String engineerId); long scheduleTime(); } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
@@ -2,10 +2,12 @@ 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.toolkit.CollectionUtils; import com.github.yulichang.base.MPJBaseServiceImpl; import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.mes.base.entity.BigStorageCageBaseInfo; import com.mes.bigstorage.entity.BigStorageCage; import com.mes.bigstorage.entity.BigStorageCageDetails; import com.mes.bigstorage.entity.BigStorageDTO; @@ -19,6 +21,7 @@ import com.mes.bigstoragetask.entity.UpdateBigStorageCageDTO; import com.mes.bigstoragetask.mapper.BigStorageCageFeedTaskMapper; import com.mes.bigstoragetask.mapper.BigStorageCageOutTaskMapper; import com.mes.bigstoragetask.service.BigStorageCageOutTaskService; import com.mes.common.config.Const; import com.mes.damage.entity.Damage; import com.mes.damage.service.DamageService; @@ -36,10 +39,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.*; import java.util.stream.Collectors; /** @@ -78,6 +78,10 @@ private DamageService damageService; @Resource private RedisUtil redisUtil; @Resource private BigStorageCageOutTaskService bigStorageCageOutTaskService; @Resource private BigStorageCageDetailsService bigStorageCageDetailsService; @Value("${mes.minCount}") private int minCount; @@ -467,4 +471,60 @@ public void appointEngineerId(String engineerId) { redisUtil.setCacheObject("temperingengineerId", engineerId); } @Override public long scheduleTime() { //执行内部调度任务 List<TemperingLayoutDTO> temperingOccupySlotList = bigStorageCageDetailsService.queryTemperingOccupySlot(); List<BigStorageCageOutTask> bigStorageCageOutTasks = new ArrayList<>(); if (CollectionUtils.isNotEmpty(temperingOccupySlotList)) { for (TemperingLayoutDTO temperingOccupySlot : temperingOccupySlotList) { List<GlassInfo> glassInfos = glassInfoService.list( new LambdaQueryWrapper<GlassInfo>() .eq(GlassInfo::getEngineerId, temperingOccupySlot.getEngineerId()) .eq(GlassInfo::getTemperingLayoutId, temperingOccupySlot.getTemperingLayoutId()) .notInSql(GlassInfo::getGlassId, "select glass_id from damage where type=8 and engineer_id='" + temperingOccupySlot.getEngineerId() + "' and tempering_layout_id = '" + temperingOccupySlot.getTemperingLayoutId() + "'") .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence) ); Map<Integer, List<GlassInfo>> listMap = glassInfos.stream().collect(Collectors.groupingBy(item -> item.getTargetSlot())); for (Map.Entry<Integer, List<GlassInfo>> entry : listMap.entrySet()) { List<GlassInfo> valueList = entry.getValue(); List<String> glassIds = valueList.stream().map(GlassInfo::getGlassId).collect(Collectors.toList()); List<BigStorageCageDetails> bigStorageCageDetailsList = bigStorageCageDetailsService.list( new LambdaQueryWrapper<BigStorageCageDetails>() .in(BigStorageCageDetails::getGlassId, glassIds) .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) .orderBy(Boolean.TRUE, sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence) ); //当一格玻璃都到齐时 if (bigStorageCageDetailsList.size() == valueList.size()) { long distinctSlotCount = bigStorageCageDetailsList.stream() .map(BigStorageCageDetails::getSlot) .distinct() .count(); //当玻璃不在同一格时 if (distinctSlotCount > 1) { BigStorageCageDetails maxSequenceDetail = bigStorageCageDetailsList.stream() .max(Comparator.comparingInt(BigStorageCageDetails::getTemperingFeedSequence)) .orElse(null); // 如果没有元素,返回 null int maxSlot = maxSequenceDetail.getSlot(); int serialNumber = 1; for (BigStorageCageDetails bigStorageCageDetails : bigStorageCageDetailsList ) { if (bigStorageCageDetails.getSlot() != maxSlot) { bigStorageCageOutTasks.add(new BigStorageCageOutTask(bigStorageCageDetails.getGlassId(), bigStorageCageDetails.getSlot(), maxSlot, bigStorageCageDetails.getWidth() * 10, bigStorageCageDetails.getHeight() * 10, 1, serialNumber++, Const.BIG_STORAGE_OUT_NEW, new Date())); } } } } } } } long startSlotCount = bigStorageCageOutTasks.stream().map(BigStorageCageOutTask::getStartSlot).distinct().count(); long endSlotCount = bigStorageCageOutTasks.stream().map(BigStorageCageOutTask::getEndSlot).distinct().count(); long time = (startSlotCount * 10 + endSlotCount * 20) / 60; return time; } } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java
@@ -427,102 +427,12 @@ .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT)); //两次更新笼子的剩余尺寸:第一次防止有玻璃继续进调度后的笼子,第二次更新:计算格子的实际尺寸 // 仅更新调度后的格子信息:起始格子完成后更新:防止调度出片过程中有新玻璃进入, // List<Integer> updateSlots = new ArrayList<>(); // updateSlots.add(bigStorageCageDetails.getSlot()); // updateSlotRemainBySlots(updateSlots); } } break loop; } } } // List<GlassInfo> glassInfoList = glassInfoService.list( // new LambdaQueryWrapper<GlassInfo>() // .eq(GlassInfo::getTemperingLayoutId, temperingOccupySlot.getTemperingLayoutId()) // .eq(GlassInfo::getEngineerId, temperingOccupySlot.getEngineerId()) // .notInSql(GlassInfo::getGlassId, "select glass_id from damage where type=8 and engineer_id='" // + temperingOccupySlot.getEngineerId() + "' and tempering_layout_id = '" + temperingOccupySlot.getTemperingLayoutId() + "'") // ); // List<BigStorageCageDetails> glassInfoLists = new ArrayList<>(); // glassInfoList.forEach(glassInfo -> { // BigStorageCageDetails details = new BigStorageCageDetails(); // BeanUtils.copyProperties(glassInfo, details); // details.setSlot(1); // glassInfoLists.add(details); // }); // List<BigStorageCageDetails> bigStorageCageDetailsList = bigStorageCageDetailsService.list( // new LambdaQueryWrapper<BigStorageCageDetails>() // .eq(BigStorageCageDetails::getEngineerId, temperingOccupySlot.getEngineerId()) // .eq(BigStorageCageDetails::getTemperingLayoutId, temperingOccupySlot.getTemperingLayoutId()) // .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) // .orderBy(Boolean.TRUE, sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence) // ); //// if (glassInfoLists.size() == bigStorageCageDetailsList.size()) { // computeOutMoreGlassInfo(glassInfoLists, Boolean.TRUE, 2); // computeOutMoreGlassInfo(bigStorageCageDetailsList, Boolean.TRUE, 3); // int allTrainNumber = allTask.stream() // .map(BigStorageCageOutTask::getTrainNumber) // .collect(Collectors.toSet()) // .size(); // int allTrainSlot = allTask.stream() // .map(BigStorageCageOutTask::getStartSlot) // .collect(Collectors.toSet()) // .size(); // int notallTrainNumber = notAllTask.stream() // .map(BigStorageCageOutTask::getTrainNumber) // .collect(Collectors.toSet()) // .size(); // int notallTrainSlot = notAllTask.stream() // .map(BigStorageCageOutTask::getStartSlot) // .collect(Collectors.toSet()) // .size(); //// if (allTrainNumber < notallTrainNumber || (allTrainNumber == notallTrainNumber && allTrainSlot < notallTrainSlot)) { // List<SlotSequenceDTO> slotSequenceList = bigStorageCageDetailsService.queryGlassMaxAndMin(temperingOccupySlot.getEngineerId(), temperingOccupySlot.getTemperingLayoutId()); // for (int i = 0; i < slotSequenceList.size() - 1; i++) { // SlotSequenceDTO first = slotSequenceList.get(i); // SlotSequenceDTO second = slotSequenceList.get(i + 1); // int slotWidth = first.getRemainWidth() - glassGap; // List<BigStorageCageDetails> list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() // .eq(BigStorageCageDetails::getSlot, second.getSlot()).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN) // .orderBy(Boolean.TRUE, !sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence)); // if (CollectionUtils.isNotEmpty(list)) { // List<BigStorageCageOutTask> outTasks = new ArrayList<>(); // int serialNumber = 1; // for (BigStorageCageDetails item : list) { // int maxlength = (int) Math.max(item.getWidth(), item.getHeight()); // if (slotWidth > maxlength) { // slotWidth = slotWidth - maxlength - glassGap; // outTasks.add(new BigStorageCageOutTask(item.getGlassId(), second.getSlot(), first.getSlot(), // item.getWidth() * 10, item.getHeight() * 10, 1, serialNumber++, Const.BIG_STORAGE_OUT_NEW, new Date())); // } else { // outTasks.add(new BigStorageCageOutTask(item.getGlassId(), second.getSlot(), second.getSlot(), // item.getWidth() * 10, item.getHeight() * 10, 1, serialNumber++, Const.BIG_STORAGE_OUT_NEW, new Date())); // } // } // List<String> glassList = outTasks.stream() // .filter(item -> !item.getStartSlot().equals(item.getEndSlot())) // .map(BigStorageCageOutTask::getGlassId) // .collect(Collectors.toList()); // if (glassList.size() > 0) { // //新增调度任务 // bigStorageCageOutTaskService.saveBatch(outTasks); // //更新理片笼详情表调度的后的玻璃位置信息:生成任务后先将玻璃格子位置进行调整,玻璃状态改为调度中,新增调度完成任务,处理调度完成后玻璃状态改为100. //// List<String> glassList = list.stream().map(BigStorageCageDetails::getGlassId).collect(Collectors.toList()); // // bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>().set(BigStorageCageDetails::getState, Const.GLASS_STATE_SCHEDULE_ING) // .set(BigStorageCageBaseInfo::getSlot, first.getSlot()).in(BigStorageCageDetails::getGlassId, glassList) // .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT)); // // //两次更新笼子的剩余尺寸:第一次防止有玻璃继续进调度后的笼子,第二次更新:计算格子的实际尺寸 // // 仅更新调度后的格子信息:起始格子完成后更新:防止调度出片过程中有新玻璃进入, // updateSlotRemainBySlots(Arrays.asList(second.getSlot())); // break loop; // } // // } // } // } // } } // //向plc写入确认字 // int returnData = 0; @@ -894,8 +804,8 @@ * 按照玻璃id判断玻璃状态及卧转立是否可直接启动 */ public Boolean judgeGlassTypeStatus(String glassId, Integer line, String mesAddress) { //预排格子 computeSlot(glassId); // 预排格子 // computeSlot(glassId); //判断此玻璃是在笼内或已生成进片任务 BigStorageCageFeedTask bigStorageCageFeedTask = bigStorageCageFeedTaskService.getOne( new LambdaQueryWrapper<BigStorageCageFeedTask>() hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
@@ -52,7 +52,7 @@ TEMPERING_LAYOUT_ID, COUNT(DISTINCT SLOT) as SLOT_COUNT FROM BIG_STORAGE_CAGE_DETAILS WHERE STATE = 100 AND TEMPERING_LAYOUT_ID!=0 WHERE STATE = 100 AND TEMPERING_LAYOUT_ID!=0 AND THICKNESS < 8 GROUP BY ENGINEER_ID, TEMPERING_LAYOUT_ID HAVING SLOT_COUNT >= #{count} hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageFeedTaskMapper.xml
@@ -18,7 +18,7 @@ and deleted = 0 and (target_slot = 0 or target_slot is null) group by line HAVING DATEDIFF(SECOND, max(create_time), GETDATE()) + 45>20 or SUM(case task_state when 2 then 1 else 0 end)>1 HAVING DATEDIFF(SECOND, max(create_time), GETDATE()) + 45 > 40 or SUM(case task_state when 2 then 1 else 0 end)>1 ) t where t.total_count = t.real_count order by real_count desc,line desc hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageMapper.xml
@@ -8,7 +8,7 @@ FROM BIG_STORAGE_CAGE T LEFT JOIN (SELECT * FROM BIG_STORAGE_CAGE_DETAILS WHERE STATE NOT IN (101, 8, 9)) T1 ON T.SLOT = T1.SLOT WHERE T.MAX_THICKNESS >= #{thickness} WHERE T.MAX_THICKNESS >= #{thickness} AND T.REMAIN_WIDTH = 5000 AND T.ENABLE_STATE = 1 GROUP BY T.DEVICE_ID ORDER BY min(T.MAX_THICKNESS), hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java
@@ -11,6 +11,7 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.mes.bigstorage.entity.BigStorageCage; import com.mes.bigstorage.entity.BigStorageCageDetails; import com.mes.bigstorage.entity.dto.TemperingLayoutDTO; import com.mes.bigstorage.service.BigStorageCageDetailsService; import com.mes.bigstorage.service.BigStorageCageService; import com.mes.bigstoragetask.entity.BigStorageCageFeedTask; @@ -297,7 +298,12 @@ // plcStorageCageTask.computeTargetByLineCar(bigStorageCageFeedTasks.get(0).getLine(), glassIdsCar); // } // plcStorageCageTask.queryAndChangeGlass("P24111102|1|6"); bigStorageCageDetailsService.selectFeedTask(); // bigStorageCageDetailsService.selectFeedTask(); // plcStorageCageTask.computeSlot("P24121401|1|6"); // plcStorageCageTask.computeSlot("P24121401|1|4"); List<TemperingLayoutDTO> temperingOccupySlotList = bigStorageCageDetailsService.queryTemperingOccupySlot(); log.info("sd"+temperingOccupySlotList); } @Test