ZengTao
2024-12-19 3c257eb3bda403d984b50c7f16781c1919b2e74c
大理片获取可进笼子时过滤满笼的笼子,添加预计调度时间功能
11个文件已修改
211 ■■■■ 已修改文件
UI-Project/src/lang/en.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/zh.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Slicecage/slicecage.vue 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageFeedTaskMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 &lt; 8
        GROUP BY ENGINEER_ID,
                 TEMPERING_LAYOUT_ID
        HAVING SLOT_COUNT &gt;= #{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