wuyouming666
2024-06-21 4063326d3002b13df49e0b36cd1c52b0763d0dd3
增加按照流程卡顺序下片逻辑
9个文件已修改
225 ■■■■ 已修改文件
UI-Project/src/views/GlassStorage/MaterialRackManagement.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/WebSocketConfig.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/service/impl/GlassInfoServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/mapper/DownGlassInfoMapper.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassTaskServiceImpl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/DownStorageCageDetailsService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/impl/DownStorageCageDetailsServiceImpl.java 118 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/DownCacheGlassTask.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/test/java/mes/UnloadGlassModuleApplicationTest.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/GlassStorage/MaterialRackManagement.vue
@@ -73,9 +73,16 @@
    ref="table"
    empty-text="No Data"
  >
  <template #header>
        <div style="display: flex; align-items: center;">
          <span style="font-size: 16px; font-weight: bold; margin-right: 20px;">任务列表</span>
        </div>
      </template>
    <el-table-column prop="Glassid" label="Glassid"></el-table-column>
    <el-table-column prop="taskDescription" label="任务描述" width="250"></el-table-column>
    <el-table-column prop="taskStatus" label="任务状态"></el-table-column>
    <el-table-column prop="glassThickness" label="玻璃厚度"></el-table-column>
    <el-table-column prop="glassFilm" label="玻璃膜系"></el-table-column>
    <el-table-column prop="creationTime" label="创建时间"></el-table-column>
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/WebSocketConfig.java
@@ -13,9 +13,9 @@
     * bean注册:会自动扫描带有@ServerEndpoint注解声明的Websocket Endpoint(端点),注册成为Websocket bean。
     * 要注意,如果项目使用外置的servlet容器,而不是直接使用springboot内置容器的话,就不要注入ServerEndpointExporter,因为它将由容器自己提供和管理。
     */
//    @Bean
//    public ServerEndpointExporter serverEndpointExporter() {
//        return new ServerEndpointExporter();
//    }
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/service/impl/GlassInfoServiceImpl.java
@@ -4,14 +4,12 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.github.yulichang.query.MPJQueryWrapper;
import com.github.yulichang.toolkit.JoinWrappers;
import com.mes.glassinfo.entity.GlassInfo;
import com.mes.glassinfo.entity.OptimizeGlassinfo;
import com.mes.glassinfo.mapper.GlassInfoMapper;
import com.mes.glassinfo.service.GlassInfoService;
import com.mes.pp.entity.OptimizeProject;
import com.mes.pp.mapper.OptimizeProjectMapper;
import com.mes.uppattenusage.entity.UpPattenUsage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -35,6 +33,7 @@
public class GlassInfoServiceImpl extends MPJBaseServiceImpl<GlassInfoMapper, GlassInfo> implements GlassInfoService {
    @Autowired
    OptimizeProjectMapper optimizeProjectMapper;
    @Override
    @DS("pp")
    public List<GlassInfo> selectGlassInfo(String engineeringId) {
@@ -88,16 +87,11 @@
    }
    @Override
    public int getGlassInfoCountByFlowCardId(String flowCardId) {
        return baseMapper.selectCount(new QueryWrapper<GlassInfo>().lambda()
                .eq(GlassInfo::getFlowCardId, flowCardId));
    }
    @Override
@@ -131,12 +125,6 @@
log.info("result: {}", result);
        return result;
    }
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/mapper/DownGlassInfoMapper.java
@@ -1,11 +1,13 @@
package com.mes.downglassinfo.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.mes.downglassinfo.entity.DownGlassInfo;
import com.mes.glassinfo.entity.GlassInfo;
import org.springframework.stereotype.Repository;
@Repository
public interface DownGlassInfoMapper extends BaseMapper<DownGlassInfo> {
public interface DownGlassInfoMapper extends BaseMapper<DownGlassInfo>, MPJBaseMapper<DownGlassInfo> {
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassTaskServiceImpl.java
@@ -5,15 +5,21 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mes.downglassinfo.entity.DownGlassInfo;
import com.mes.downglassinfo.entity.DownGlassTask;
import com.mes.downglassinfo.mapper.DownGlassInfoMapper;
import com.mes.downglassinfo.mapper.DownGlassTaskMapper;
import com.mes.downglassinfo.service.DownGlassInfoService;
import com.mes.downglassinfo.service.DownGlassTaskService;
import com.mes.downworkstation.entity.DownWorkstation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
@@ -27,15 +33,33 @@
@Service
public class DownGlassTaskServiceImpl extends ServiceImpl<DownGlassTaskMapper, DownGlassTask> implements DownGlassTaskService {
    @Autowired
    private DownGlassInfoService downGlassInfoService; // MySQL Mapper
    @Autowired
    private DownGlassTaskMapper downGlassTaskMapper; // SQL Server Mapper
    @Override
    public List<DownGlassTask> getUnloadingTaskState() {
        log.info("出片或直通任务状态为1 的任务");
        log.info("排除已经下片的出片或直通任务状态为1的任务");
        // Step 1: 从 MySQL 中获取玻璃 ID 列表
        // Step 2: 从 SQL Server 中过滤掉这些玻璃 ID 并查询任务
        QueryWrapper<DownGlassTask> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("task_stauts", 1).eq("task_type", 2).or().eq("task_type", 3);
        queryWrapper.eq("task_stauts", 1)
                .and(qw -> qw.eq("task_type", 2).or().eq("task_type", 3));
        List<DownGlassInfo> excludedGlassIds = downGlassInfoService.list();
        if (!excludedGlassIds.isEmpty()) {
            queryWrapper.notIn("glass_id", excludedGlassIds.stream().map(DownGlassInfo::getGlassId).collect(Collectors.toList()));
        }
        log.info(String.valueOf(excludedGlassIds));
        return baseMapper.selectList(queryWrapper);
    }
    @Override
    public void updateTaskState(String id) {
        UpdateWrapper<DownGlassTask> updateWrapper = new UpdateWrapper<>();
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/DownStorageCageDetailsService.java
@@ -56,7 +56,17 @@
    /**
     * @param start
     * @param end
     * @return   根据传入的料架号 查询符合按照流程卡中顺序出片的小片
     */
    List<DownStorageCageDetails> CacheOut2(int start, int end);
//    /**
//     * @return 直通查询
//     */
//    List<GlassInfo>  DirectConnection();
    /**
     * @return 直通查询
     */
    List<GlassInfo>  DirectConnection();
    boolean DirectConnection(GlassInfo glassInfo);
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/impl/DownStorageCageDetailsServiceImpl.java
@@ -162,23 +162,39 @@
//
//    }
  //  @Override
//    public List<GlassInfo>  DirectConnection(){
//        LambdaQueryWrapper<GlassInfo> queryWrapper2 = Wrappers.lambdaQuery();
//        queryWrapper2.select(GlassInfo::getFlowCardId,
//                GlassInfo::getGlassId,
//                GlassInfo::getTemperingLayoutId,
//                GlassInfo::getTemperingFeedSequence)
//                .notInSql(GlassInfo::getGlassId, "SELECT glass_id FROM down_glass_info")
//                .orderByAsc(GlassInfo::getTemperingLayoutId)
//                .orderByDesc(GlassInfo::getTemperingFeedSequence)
//                .last("LIMIT 1");
//
//        // 查询 GlassInfo 表
//        log.info("直通查询");
//        return glassInfoMapper.selectList(queryWrapper2);
//
//    };
    @Override
    public List<GlassInfo>  DirectConnection(){
        LambdaQueryWrapper<GlassInfo> queryWrapper2 = Wrappers.lambdaQuery();
        queryWrapper2.select(GlassInfo::getFlowCardId,
                GlassInfo::getGlassId,
                GlassInfo::getTemperingLayoutId,
                GlassInfo::getTemperingFeedSequence)
    public boolean DirectConnection(GlassInfo glassInfo) {
        LambdaQueryWrapper<GlassInfo> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(GlassInfo::getGlassId, glassInfo.getGlassId())
                .notInSql(GlassInfo::getGlassId, "SELECT glass_id FROM down_glass_info")
                .orderByAsc(GlassInfo::getTemperingLayoutId)
                .orderByDesc(GlassInfo::getTemperingFeedSequence)
                .orderByDesc(GlassInfo::getGlassType)
                .groupBy(GlassInfo::getFlowCardId)
                .last("LIMIT 1");
        // 查询 GlassInfo 表
        log.info("直通查询");
        return glassInfoMapper.selectList(queryWrapper2);
        // 查询符合条件的 GlassInfo 记录数量
        int count = glassInfoMapper.selectCount(queryWrapper);
    };
        return count > 0;
    }
@@ -197,7 +213,6 @@
        if (cageDetails.size() == 9) {
            log.info("1、笼子满了的时候,按照笼内版图id 版图片序出");
            List<DownWorkstation> workstationList = downWorkstationMapper.selectList(new QueryWrapper<DownWorkstation>().between("workstation_id", start, end));
            List<String> flowCardIds = new ArrayList<>();
            for (DownWorkstation workstation : workstationList) {
@@ -221,12 +236,10 @@
            // Step 1: 查询 DownWorkstation 表获取对应 workstation_id 的 flow_card_id
            List<DownWorkstation> workstationList = downWorkstationMapper.selectList(new QueryWrapper<DownWorkstation>().between("workstation_id", start, end));
            List<String> flowCardIds = new ArrayList<>();
            for (DownWorkstation workstation : workstationList) {
                flowCardIds.add(workstation.getFlowCardId());
            }
            if (flowCardIds.isEmpty()) {
                log.error("2、未找到对应的 flow_card_id");
                return Collections.emptyList(); // 返回空列表或者抛出异常,视情况而定
@@ -254,7 +267,6 @@
            cageDetailsQueryWrapper.in(DownStorageCageDetails::getGlassId, glassIds);
            cageDetailsQueryWrapper.in(DownStorageCageDetails::getFlowCardId, flowCardIds);
            cageDetailsQueryWrapper.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN);
            log.info("按照流程卡的版图id 版图片序出");
            // Step 4: 查询 down_storage_cage_details 表并返回结果
            return downStorageCageDetailsMapper.selectList(cageDetailsQueryWrapper);
@@ -264,4 +276,78 @@
    }
        @Override
        public List<DownStorageCageDetails> CacheOut2(int start, int end) {
            // 创建一个 LambdaQueryWrapper 实例
            LambdaQueryWrapper<DownStorageCageDetails> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// 条件 state=100
            lambdaQueryWrapper.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN);
            List<DownStorageCageDetails> cageDetails = downStorageCageDetailsMapper.selectList(lambdaQueryWrapper);
            // Step 5: 判断 down_storage_cage_details 结果数量是否为9,如果是,则执行另外一个查询
            if (cageDetails.size() == 9) {
                log.info("1、笼子满了的时候,按照笼内流程卡顺序出 GlassType目前是流程卡中的顺序");
                List<DownWorkstation> workstationList = downWorkstationMapper.selectList(new QueryWrapper<DownWorkstation>().between("workstation_id", start, end));
                List<String> flowCardIds = new ArrayList<>();
                for (DownWorkstation workstation : workstationList) {
                    flowCardIds.add(workstation.getFlowCardId());
                }
                if (flowCardIds.isEmpty()) {
                    log.error("未找到对应的 flow_card_id");
                    return Collections.emptyList(); // 返回空列表或者抛出异常,视情况而定
                }
                LambdaQueryWrapper<DownStorageCageDetails> anotherQueryWrapper = Wrappers.lambdaQuery();
                anotherQueryWrapper.orderByAsc(DownStorageCageDetails::getGlassType);
                anotherQueryWrapper.in(DownStorageCageDetails::getFlowCardId, flowCardIds);
                anotherQueryWrapper.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN);
                anotherQueryWrapper.last("LIMIT 1");
                return downStorageCageDetailsMapper.selectList(anotherQueryWrapper);
            } else {
                // Step 1: 查询 DownWorkstation 表获取对应 workstation_id 的 flow_card_id
                List<DownWorkstation> workstationList = downWorkstationMapper.selectList(new QueryWrapper<DownWorkstation>().between("workstation_id", start, end));
                List<String> flowCardIds = new ArrayList<>();
                for (DownWorkstation workstation : workstationList) {
                    flowCardIds.add(workstation.getFlowCardId());
                }
                if (flowCardIds.isEmpty()) {
                    log.error("2、未找到对应的 flow_card_id");
                    return Collections.emptyList(); // 返回空列表或者抛出异常,视情况而定
                }
                log.info("流程卡:{}", flowCardIds);
                LambdaQueryWrapper<GlassInfo> queryWrapper2 = Wrappers.lambdaQuery();
                queryWrapper2.select(GlassInfo::getFlowCardId,
                        GlassInfo::getGlassId)
                        .notInSql(GlassInfo::getGlassId, "SELECT glass_id FROM down_glass_info")
                        .orderByAsc(GlassInfo::getGlassType)
                        .last("LIMIT 1");
                // 查询 GlassInfo 表
                List<GlassInfo> glassInfos = glassInfoMapper.selectList(queryWrapper2);
                if (glassInfos.isEmpty()) {
                    log.error("未找到对应的玻璃信息");
                    return Collections.emptyList(); // 返回空列表或者抛出异常,视情况而定
                }
                // Step 3: 构造查询 down_storage_cage_details 表的条件
                List<String> glassIds = glassInfos.stream().map(GlassInfo::getGlassId).collect(Collectors.toList());
                LambdaQueryWrapper<DownStorageCageDetails> cageDetailsQueryWrapper = Wrappers.lambdaQuery();
                cageDetailsQueryWrapper.in(DownStorageCageDetails::getGlassId, glassIds);
                cageDetailsQueryWrapper.in(DownStorageCageDetails::getFlowCardId, flowCardIds);
                cageDetailsQueryWrapper.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN);
                log.info("按照流程卡的顺序出");
                // Step 4: 查询 down_storage_cage_details 表并返回结果
                return downStorageCageDetailsMapper.selectList(cageDetailsQueryWrapper);
            }
    }
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/DownCacheGlassTask.java
@@ -129,12 +129,12 @@
            }
        }
        if (("1".equals(G11RobotTaskRequestWord) || "1".equals(G06RobotTaskRequestWord)) || "1".equals(G13RobotTaskRequestWord)) {
            log.info("4、有机器人下片请求,执行下片任务");
        if (("0".equals(G11RobotTaskRequestWord) || "0".equals(G06RobotTaskRequestWord)) || "0".equals(G13RobotTaskRequestWord)) {
            log.info("4、有下片完成信号更新落架数量");
            insertdownglassinfo();
        }
        //自动绑定架子,如果工位表没有绑定架子,默认将笼子中数量最多的流程卡号绑定机器手2的空架子
    }
@@ -155,9 +155,10 @@
        }
        log.info("2、获取到的玻璃信息为{}", glassInfo);
        if (glassInfo.getGlassId().equals(downStorageCageDetailsService.DirectConnection())) {
        if (downStorageCageDetailsService.DirectConnection(glassInfo)) {
            //直通
            log.info("3、如果当前玻璃属于版图id和片序的顺序则直通,执行下片任务");
            //log.info("3、如果当前玻璃属于版图id和片序的顺序则直通,执行下片任务");
          log.info("3、如果当前玻璃属于流程卡中的片序的顺序则直通,执行下片任务");
            DownWorkstation downWorkstation = downWorkstationService.getOne(new LambdaQueryWrapper<DownWorkstation>().eq(DownWorkstation::getFlowCardId, glassInfo.getFlowCardId()));
            int WorkstationId = downWorkstation.getWorkstationId();
            DownGlassTask downGlassTask = downStorageCageService.createDownGlassTask(glassInfo, "0", String.valueOf(WorkstationId), "3");
@@ -165,7 +166,9 @@
        } else {
            log.info("4、如果不属于版图id和片序的顺序执行进片任务");
           // log.info("4、如果不属于版图id和片序的顺序执行进片任务");
            log.info("4、如果不属于流程卡中的片序的顺序执行进片任务");
            //添加进片任务  查找空格
            List<DownStorageCageDetails> list = downStorageCageService.selectCacheEmpty();
            if (list.size() > 0) {
@@ -201,11 +204,12 @@
     * @param MESSendingWord
     */
    private Boolean outTo(String MESSendingWord) {
        log.info("单片情况根据传入的料架号 查询符合按照版图id和片序出片,并且优先出满架的小片");
       // log.info("单片情况根据传入的料架号 查询符合按照版图id和片序出片,并且优先出满架的小片");
        log.info("单片情况根据传入的料架号 查询符合按照流程卡中顺序出片,并且优先出满架的小片");
//        List<DownStorageCageDetails> list1to3 = downStorageCageDetailsService.CacheOut1(1, 3);
//        List<DownStorageCageDetails> list4to6 = downStorageCageDetailsService.CacheOut1(4, 6);
        List<DownStorageCageDetails> list1to6 = downStorageCageDetailsService.CacheOut1(1, 6);
        List<DownStorageCageDetails> list1to6 = downStorageCageDetailsService.CacheOut2(1, 6);
        DownStorageCageDetails selectedItem = null;
hangzhoumesParent/moduleService/UnLoadGlassModule/src/test/java/mes/UnloadGlassModuleApplicationTest.java
@@ -1,6 +1,7 @@
package mes;
import com.mes.UnLoadGlassApplication;
import com.mes.downglassinfo.service.DownGlassTaskService;
import com.mes.downglassinfo.service.impl.DownGlassInfoServiceImpl;
import com.mes.downglassinfo.service.impl.DownGlassTaskServiceImpl;
import com.mes.downstorage.entity.DownStorageCage;
@@ -58,6 +59,8 @@
    DownWorkstationService downWorkstationService;
    @Autowired
    DownStorageCageService downStorageCageService;
    @Autowired
    DownGlassTaskService downGlassTaskService;
@@ -171,8 +174,15 @@
    @Test
    public void getFlowCardId() {
        glassInfoServiceImpl.getFlowCardId();
    }
    @Test
    public void getUnloadingTaskState() {
        downGlassTaskService.getUnloadingTaskState();
    }
    @Test