wangfei
2024-11-29 c377d90fe2a01c2118f6c69c3c177f75be7c318b
Merge remote-tracking branch 'origin/master'
7个文件已修改
1个文件已添加
231 ■■■■■ 已修改文件
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatDetail.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatDetailService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatLayoutService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatDetailServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatLayoutServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/OpcNGTemperingTask.java 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/OptimizeHeatDetail.java
@@ -113,4 +113,13 @@
    @TableField("strRemark")
    private String strRemark;
    public double getWidth()
    {
        return width;
    }
    public double getHeigth()
    {
        return height;
    }
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatDetailService.java
@@ -3,6 +3,9 @@
import com.github.yulichang.base.MPJBaseService;
import com.mes.pp.entity.OptimizeDetail;
import com.mes.pp.entity.OptimizeHeatDetail;
import com.mes.pp.entity.OptimizeHeatLayout;
import java.util.List;
/**
 * <p>
@@ -14,4 +17,9 @@
 */
public interface OptimizeHeatDetailService extends MPJBaseService<OptimizeHeatDetail> {
    /**
     * 返回指定工程 指定版图号的小片玻璃信息
     * @return
     */
    List<OptimizeHeatDetail> selectHeatDetailGlassInfo(String engineerId, Integer temperingid);
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/OptimizeHeatLayoutService.java
@@ -3,6 +3,9 @@
import com.github.yulichang.base.MPJBaseService;
import com.mes.pp.entity.OptimizeDetail;
import com.mes.pp.entity.OptimizeHeatLayout;
import com.mes.temperingglass.entity.TemperingGlassInfo;
import java.util.List;
/**
 * <p>
@@ -13,5 +16,9 @@
 * @since 2024-04-16
 */
public interface OptimizeHeatLayoutService extends MPJBaseService<OptimizeHeatLayout> {
    /**
     * 返回指定工程 指定版图号的版图信息
     * @return
     */
    OptimizeHeatLayout selectHeatLayoutInfo(String engineerId,Integer temperingid);
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatDetailServiceImpl.java
@@ -1,14 +1,18 @@
package com.mes.pp.service.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.mes.pp.entity.OptimizeDetail;
import com.mes.pp.entity.OptimizeHeatDetail;
import com.mes.pp.entity.OptimizeHeatLayout;
import com.mes.pp.mapper.OptimizeDetailMapper;
import com.mes.pp.mapper.OptimizeHeatDetailMapper;
import com.mes.pp.service.OptimizeDetailService;
import com.mes.pp.service.OptimizeHeatDetailService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
@@ -22,4 +26,12 @@
@DS("pp")
public class OptimizeHeatDetailServiceImpl extends MPJBaseServiceImpl<OptimizeHeatDetailMapper, OptimizeHeatDetail> implements OptimizeHeatDetailService {
    @Override
    public List<OptimizeHeatDetail> selectHeatDetailGlassInfo(String engineerId, Integer temperingid) {
        QueryWrapper<OptimizeHeatDetail> wrapper = new QueryWrapper<>();
        wrapper.eq("project_no", engineerId)
                .eq("layout_id", temperingid)
        .orderByAsc("sort");
        return baseMapper.selectList(wrapper);
    }
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/OptimizeHeatLayoutServiceImpl.java
@@ -1,6 +1,7 @@
package com.mes.pp.service.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.mes.pp.entity.OptimizeDetail;
import com.mes.pp.entity.OptimizeHeatLayout;
@@ -8,6 +9,9 @@
import com.mes.pp.mapper.OptimizeHeatLayoutMapper;
import com.mes.pp.service.OptimizeDetailService;
import com.mes.pp.service.OptimizeHeatLayoutService;
import com.mes.temperingglass.entity.TemperingGlassInfo;
import com.mes.temperingglass.mapper.TemperingGlassInfoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
@@ -22,4 +26,14 @@
@DS("pp")
public class OptimizeHeatLayoutServiceImpl extends MPJBaseServiceImpl<OptimizeHeatLayoutMapper, OptimizeHeatLayout> implements OptimizeHeatLayoutService {
    @Override
    public OptimizeHeatLayout selectHeatLayoutInfo(String engineerId, Integer temperingid) {
        QueryWrapper<OptimizeHeatLayout> wrapper = new QueryWrapper<>();
        wrapper.select("Top 1 *").eq("project_no", engineerId)
                .eq("layout_id", temperingid);
        return baseMapper.selectOne(wrapper);
    }
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java
@@ -47,5 +47,10 @@
     * @return
     */
    Integer updateTemperingState(TemperingGlassInfo temperingGlassInfo);
    /**
     * 根据炉号查钢化版图玻璃信息
     * @return
     */
    List<TemperingGlassInfo> selectGlassInfoById(Integer id);
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java
@@ -108,4 +108,21 @@
            return 100;
        }
    }
    @Override
    public List<TemperingGlassInfo> selectGlassInfoById(Integer id)
    {
        List<TemperingGlassInfo> result=null;
        QueryWrapper<TemperingGlassInfo> wrapper = new QueryWrapper<>();
        wrapper.select("Top 1 *").in("state",1,0).eq("temperingLayoutId",id);
        TemperingGlassInfo glass=temperingMapper.selectOne(wrapper);
        if(glass!=null) {
            QueryWrapper<TemperingGlassInfo> glassinfo = new QueryWrapper<>();
            glassinfo.eq("engineer_id", glass.getEngineerId())
                    .eq("tempering_layout_id", id);
            //return temperingMapper.selectList(glassinfo);
            result= temperingMapper.selectByEngineerIdAndLayoutId(glass.getEngineerId(),glass.getTemperingLayoutId());
        }
        return result;
    }
}
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/OpcNGTemperingTask.java
New file
@@ -0,0 +1,157 @@
package com.mes.job;
import com.kangaroohy.milo.model.ReadWriteEntity;
import com.kangaroohy.milo.service.MiloService;
import com.mes.pp.entity.OptimizeHeatDetail;
import com.mes.pp.entity.OptimizeHeatLayout;
import com.mes.pp.service.OptimizeHeatDetailService;
import com.mes.pp.service.OptimizeHeatLayoutService;
import com.mes.temperingglass.entity.TemperingGlass;
import com.mes.temperingglass.entity.TemperingGlassInfo;
import com.mes.temperingglass.service.TemperingGlassInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
@Component
@Slf4j
public class OpcNGTemperingTask {
    @Autowired(required = false)
    MiloService miloService;
    @Autowired
    private TemperingGlassInfoService temperingAgoService;
    @Autowired
    private OptimizeHeatLayoutService optimizeHeatLayoutService;
    @Autowired
    private OptimizeHeatDetailService optimizeHeatDetailService;
    /**
     * 摆片台请求进片逻辑处理
     * fixedRate : 上一个调用开始后再次调用的延时(不用等待上一次调用完成)
     * fixedDelay : 上一个调用结束后再次调用的延时
     */
    //@Scheduled(fixedDelay = 1000)
    public void requestTemperingTask() throws Exception {
        ReadWriteEntity requestInTempering = miloService.readFromOpcUa("GH1S7.GH1S7.requestInTempering");//请求进片
        ReadWriteEntity requestTemperingId = miloService.readFromOpcUa("GH1S7.GH1S7.requestTemperingId");//请求进片 炉号ID
        Integer request = Integer.parseInt(requestInTempering.getValue().toString());
        Integer id = Integer.parseInt(requestTemperingId.getValue().toString());
        if (request == 0) {
            miloService.writeToOpcUa(generateReadWriteEntity("GH1S7.GH1S7.responseInTempering", 0));//允许送片清零
        } else {
            ReadWriteEntity placedNumber = miloService.readFromOpcUa("GH1S7.GH1S7.placedNumber");//已摆片数量
            List<TemperingGlassInfo> glassList = temperingAgoService.selectGlassInfoById(id);
            if (glassList.size() == Integer.parseInt(placedNumber.getValue().toString())) {
                miloService.writeToOpcUa(generateReadWriteEntity("GH1S7.GH1S7.responseInTempering", 1));//写入允许送片
            } else {
                miloService.writeToOpcUa(generateReadWriteEntity("GH1S7.GH1S7.responseInTempering", 2));//不满足进炉条件
            }
        }
    }
    /**
     * 钢化上片台下发参数逻辑处理
     * fixedRate : 上一个调用开始后再次调用的延时(不用等待上一次调用完成)
     * fixedDelay : 上一个调用结束后再次调用的延时
     */
    //@Scheduled(fixedDelay = 1000)
    public void loadTemperingTask() throws Exception {
        ReadWriteEntity loadTemperingId = miloService.readFromOpcUa("GH1S7.GH1S7.loadTemperingId");//进片完成 炉号ID
        getNewTemperingID(Integer.parseInt(loadTemperingId.getValue().toString()));//进片完成 下发参数
    }
    //获取到炉号id执行参数下发任务
    private void getNewTemperingID(Integer temperingid) throws Exception {
        ReadWriteEntity AutoStatus = miloService.readFromOpcUa("GH1.GH1.AutoStatus");
        if (1 != Integer.parseInt(AutoStatus.getValue().toString())) {
            log.info("当前为非联机状态,结束钢化下发参数任务");
            return;
        }
        ReadWriteEntity QandA = miloService.readFromOpcUa("GH1.GH1.QandA");
        ReadWriteEntity RecipeStatus = miloService.readFromOpcUa("GH1.GH1.RecipeStatus");
        if (1 == Integer.parseInt(QandA.getValue().toString()) && 2 == Integer.parseInt(RecipeStatus.getValue().toString())) {
            log.info("版面信息已经下发,并且已经匹配参数,结束钢化下发参数任务");
            return;
        }
        List<TemperingGlassInfo> glassList = temperingAgoService.selectGlassInfoById(temperingid);
        if (glassList != null && glassList.size() > 0) {
            int glasstype = GetGlassType(glassList.get(0).getFilmsid());//膜系
            int process = 0;//钢化类型
            int thiness = (int) glassList.get(0).getThickness();//厚度
            String engineerId = glassList.get(0).getEngineerId();
            Integer temperingLayoutId = glassList.get(0).getTemperingLayoutId();
            OptimizeHeatLayout heatLayoutinfo = optimizeHeatLayoutService.selectHeatLayoutInfo(engineerId, temperingLayoutId);
            int loadingRate = (int) (heatLayoutinfo.getLayoutRate() * 100); //装载率
            loadingRate = loadingRate > 10000 ? 10000 : loadingRate;
            List<OptimizeHeatDetail> heatDetailGlassInfoList = optimizeHeatDetailService.selectHeatDetailGlassInfo(engineerId, temperingLayoutId);
            Optional<Double> maxProductOpt = heatDetailGlassInfoList.stream()
                    .map(ohd -> ohd.getWidth() * ohd.getHeight())
                    .max(Double::compareTo);
            double totalarea = heatDetailGlassInfoList.stream().mapToDouble(ohd -> ohd.getWidth() * ohd.getHeight()).sum();
            int shape = 0; //最大片占总面积的比例
            if (maxProductOpt.isPresent()) {
                shape = (int) (maxProductOpt.get() / totalarea * 100);
            }
            shape = shape > 10000 ? 10000 : shape;
            int workmode = 0; //工位数
            int furmode = 0; //双室/联室
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.TemperingId", temperingid));//写入炉号
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.GlassType", glasstype));//写入玻璃类型
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.Process", process));//写入钢化类型 全钢 半钢 防火
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.Thickness", thiness));//写入厚度
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.LoadingRate", loadingRate));//写入装载率
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.Shape", shape));//写入大片比例
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.WorkMode", workmode));//写入工位数
            miloService.writeToOpcUa(generateReadWriteEntity("GH1.GH1.FurnaceMode", furmode));//写入炉体工作方式
            log.info("炉号" + temperingid + "版面信息尝试下发");
        }
    }
    //根据膜系返回玻璃类型
    private int GetGlassType(String glasstype) {
        int result = 0;
        String str = glasstype.toLowerCase();
        if (str.contains("白玻")) {
            result = 0;
        }
        if (str.contains("超白")) {
            result = 4;
        }
        if (str.contains("lowe") || str.contains("low-e")) {
            result = 1;
        }
        if (str.contains("双银")) {
            result = 2;
        }
        if (str.contains("三银")) {
            result = 3;
        }
        if (str.contains("热反射")) {
            result = 5;
        }
        return result;
    }
    private ReadWriteEntity generateReadWriteEntity(String identifier, Object value) {
        return ReadWriteEntity.builder()
                .identifier(identifier)
                //Kep中是Long类型,即:Int32,Java中的int类型
                .value(value)
                .build();
    }
}