严智鑫
2024-04-10 e56c13df7566789368c3811ab63dd2affa8e47d4
文件名称调整
5个文件已添加
555 ■■■■■ 已修改文件
CacheGlassModule/src/main/java/com/mes/mapper/HangzhouMesMapper.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CacheGlassModule/src/main/java/com/mes/mapper/PpMapper.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CacheGlassModule/src/main/java/com/mes/service/CacheGlassService/LogicService.java 175 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CacheGlassModule/src/main/java/com/mes/service/pp/PpService.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/TL/Temperedlayout/Temperedlayout.vue 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CacheGlassModule/src/main/java/com/mes/mapper/HangzhouMesMapper.java
New file
@@ -0,0 +1,78 @@
package com.mes.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.mes.entity.EdgStorageCageDetails;
import com.mes.entity.GlassInfo;
import com.mes.entity.TaskCache;
import com.mes.entity.Tempered;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.*;
@DS("hangzhoumes")
@Mapper
public interface HangzhouMesMapper {
    // 玻璃信息 按ID查询
    @Select("select * from `glass_info` where id=#{id}")
    GlassInfo selectGlassId(String id);
    // 查询磨边信息
    @Select("select * from task_cache where task_type='2' and task_stauts='2' and end_cell=#{EndCell}")
    List<Map> selectEdgInfo(String EndCell);
    // 查询笼子内空闲
    @Select("select escd.* from edg_storage_cage as esc LEFT JOIN edg_storage_cage_details as escd on esc.slot=escd.slot where escd.slot is null order by escd.slot")
    List<EdgStorageCageDetails> selectCacheLeisure();
    // 查询笼子内出片任务
    @Select("select escd.* from edg_storage_cage as esc LEFT JOIN edg_storage_cage_details as escd on esc.slot=escd.slot WHERE escd.slot IS NOT NULL order by escd.tempering_layout_id,escd.tempering_feed_sequence")
    List<EdgStorageCageDetails> selectCacheOut();
    // 查询笼子内信息
    @Select("select esc.*,escd.id as detailsID,escd.device_id as details_device_id,escd.glass_id,escd.sequence,escd.flow_card_id,escd.glass_type,escd.width,escd.height,escd.thickness,escd.edg_width,escd.edg_height,escd.tempering_layout_id,escd.tempering_feed_sequence,escd.pattern_sequence,escd.state,escd.gap from edg_storage_cage as esc LEFT JOIN edg_storage_cage_details as escd on esc.slot=escd.slot order by esc.slot")
    List<Map> selectCachInfo();
    // 查询可进此片玻璃的栅格号
    @Select("select escd.* from edg_storage_cage as esc LEFT JOIN edg_storage_cage_details as escd on esc.slot=escd.slot where escd.slot is not null escd.tempering_layout_id=#{tempering_layout_id} and escd.tempering_feed_sequence<#{tempering_feed_sequence} and esc.remain_width-#{width}>0 order by escd.tempering_feed_sequence")
    List<EdgStorageCageDetails> selectIsExistIntoCache(Integer tempering_layout_id, Integer tempering_feed_sequence,double width);
    // 查询可进此片玻璃的栅格号
    @Select("select escd.* from edg_storage_cage as esc LEFT JOIN edg_storage_cage_details as escd on esc.slot=escd.slot where escd.slot is not null escd.tempering_layout_id<#{tempering_layout_id} and esc.remain_width-#{width}>0 order by escd.tempering_layout_id desc,escd.tempering_feed_sequence")
    List<EdgStorageCageDetails> selectIsExistIntoCache(Integer tempering_layout_id, double width);
    // 查询全部任务
    @Select("select * from task_cache")
    List<TaskCache> selectCacheInfoAll();
    // 查询进片任务
    @Select("select * from task_cache where task_type='1' and task_stauts='0'")
    List<TaskCache> selectInputCacheInfo();
    // 查询出片任务
    @Select("select * from task_cache where task_type='2' and task_stauts='0'")
    List<TaskCache> selectOutCacheInfo();
    // 查询  A09  或 A10 最新的一片 出片任务
    @Select("select * from task_cache where task_type='2' and task_stauts='2' and end_cell=#{EndCell} limit 1")
    GlassInfo selectLastOutCacheInfo(String EndCell);
    // 修改笼子内信息
    @Update("update")
    Integer updateCache(@Param("id") Integer id, @Param("order_id") String order_id);
    // 添加理片任务
    @Insert("INSERT into task_cache VALUES(#{id},#{start},#{end},#{type},0)")
    Integer insertCacheTask(String id, String start, String end, String type);
    //
    // @Insert("INSERT `order`(order_id)VALUES(#{order_id})")
    // Integer insert(Order order);
    //
    // @Delete("delete from `order` where id=#{id}")
    // Integer deleteById(@Param("id") Integer id);
    //
    // @Update("update `order` set order_id=#{order_id} where id=#{id}")
    // Integer update(@Param("id") Integer id,@Param("order_id") String order_id);
}
CacheGlassModule/src/main/java/com/mes/mapper/PpMapper.java
New file
@@ -0,0 +1,39 @@
package com.mes.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.mes.entity.EdgStorageCageDetails;
import com.mes.entity.GlassInfo;
import com.mes.entity.TaskCache;
import com.mes.entity.Tempered;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.*;
@DS("pp")
@Mapper
public interface PpMapper {
    // 钢化按工程查询
    @Select("select * from `v_optimize_heat_layout` where project_no=#{projeceid} ")
    List<Tempered> selectTemperedTerritory(String projeceid);
    // 切割版图 按工程,版图编号查询
    @Select("select * from optimize_detail where project_no=#{projeceid} ")
    List<Map> selectCutTerritory(String projeceid,String TerritoryId);
    // 切割版图 按工程查询
    @Select("select * from optimize_detail where project_no=#{projeceid} ")
    List<Map> selectCutTerritory(String projeceid);
    //
    // @Insert("INSERT `order`(order_id)VALUES(#{order_id})")
    // Integer insert(Order order);
    //
    // @Delete("delete from `order` where id=#{id}")
    // Integer deleteById(@Param("id") Integer id);
    //
    // @Update("update `order` set order_id=#{order_id} where id=#{id}")
    // Integer update(@Param("id") Integer id,@Param("order_id") String order_id);
}
CacheGlassModule/src/main/java/com/mes/service/CacheGlassService/LogicService.java
New file
@@ -0,0 +1,175 @@
package com.mes.service.CacheGlassService;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mes.common.PlcTools.S7control;
import com.mes.entity.EdgStorageCageDetails;
import com.mes.entity.GlassInfo;
import com.mes.entity.TaskCache;
import com.mes.entity.device.PLCAutoMes;
import com.mes.entity.device.PlcParameterObject;
import com.mes.mapper.HangzhouMesMapper;
import com.mes.mapper.PpMapper;
@Service
public class LogicService {
    @Autowired
    private HangzhouMesMapper hangzhouMesMapper;
    //识别逻辑    不交互
    public void identify(String Number){
        //查询任务
        PlcParameterObject plcmes=PLCAutoMes.PlcMesObject;
        S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToGaStatus").getAddress(),(short) 1);
        String s=S7control.getinstance().ReadWord("DB14.26", 1).get(0)+"";
        boolean isexist=isExist(Number);
        if (isexist) {
            //存在逻辑    1.添加信息 2.回复PLC存在
            //S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToGaStatus").getAddress(),(short) 1);
        }else {
            //不存在逻辑  1.回复PLC不存在
            //S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToGaStatus").getAddress(),(short) 2);
        }
    }
    //理片
    public void Process(){
        String Result=S7control.getinstance().ReadWord("DB14.0", 1).get(0)+"";
        String Number=S7control.getinstance().ReadWord("DB14.2", 1).get(0)+"";
        if(Result=="1"){//进片请求
            processInto(Number);
        }else if(Result=="2"){//出片请求
            processOut();
        }else if(Result=="3"){//进出片请求
            if (!processOut()) {   //先出后进
                processInto(Number);
            }
        }
    }
    //理片 进
    public boolean processInto(String Number){
        //查询消息队列里的玻璃
        GlassInfo GlassInfo=hangzhouMesMapper.selectGlassId(Number);
        PlcParameterObject plcmes=PLCAutoMes.PlcMesObject;
        if(GlassInfo!=null){//存在此玻璃编号
            //同钢化版图内的栅格号
            List<EdgStorageCageDetails> list=hangzhouMesMapper.selectIsExistIntoCache(GlassInfo.getTemperinglayoutid(),GlassInfo.getTemperingfeedsequence(),GlassInfo.getWidth());
            //空栅格号
            if (list.size()==0) {
                list=hangzhouMesMapper.selectCacheLeisure();
            }
            //小于此玻璃钢化版图序号的栅格号
            if(list.size()==0){
                list=hangzhouMesMapper.selectIsExistIntoCache(GlassInfo.getTemperinglayoutid(),GlassInfo.getWidth());
            }
            if(list.size()>0){
                //存在空格
                //1.生成任务:  起始位置0   结束位置this.slot  任务类型 1   (进片任务)
                //2.回复 1进片
                EdgStorageCageDetails item=list.get(0);
                hangzhouMesMapper.insertCacheTask(GlassInfo.getId()+"","0",item.getSlot()+"","1");
                S7control.getinstance().WriteWord(plcmes.getPlcParameter("MESToGaStatus").getAddress(),(short) 1);
                return true;
            }
        }else{
            // ID编号不存在   不处理/回复PLC  进行报警提示
        }
        //返回结果
        return false;
    }
    //理片 出
    public boolean processOut(){
        //查询任务
        String A09=S7control.getinstance().ReadWord("DB14.56", 1).get(0)+"";
        String A10=S7control.getinstance().ReadWord("DB14.58", 1).get(0)+"";
        PlcParameterObject plcmes=PLCAutoMes.PlcMesObject;
        List<EdgStorageCageDetails> list=hangzhouMesMapper.selectCacheOut();
        boolean isOut=true;//其他情况条件 如:后续设备故障禁止理片出片 等
        if (list.size()>0&&isOut) {
            EdgStorageCageDetails item=list.get(0);
            if(A09=="0"&&A10=="1"){
                //出到  A09
                hangzhouMesMapper.insertCacheTask(item.getGlassid()+"","0","09","2");
                S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.28").getAddress(), "1");
                S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.20").getAddress(), "1");
                return true;
            }else if(A09=="1"&&A10=="0"){
                //出到  A10
                hangzhouMesMapper.insertCacheTask(item.getGlassid()+"","0","10","2");
                S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.28").getAddress(), "2");
                S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.20").getAddress(), "1");
                return true;
            }else if(A09=="0"&&A10=="0"){
                //都允许    A09/A10  上一片是否和此片玻璃尺寸尺寸相同
                String endcell="09";
                String SendEndcell="1";
                boolean If_=false;
                GlassInfo glassInfo09= hangzhouMesMapper.selectLastOutCacheInfo("09");
                GlassInfo glassInfo10= hangzhouMesMapper.selectLastOutCacheInfo("10");
                if(glassInfo10!=null&&glassInfo10.getWidth()==item.getWidth()&&glassInfo10.getHeight()==item.getHeight()){
                    endcell="10";
                    SendEndcell="2";
                }else if(glassInfo10!=null&&If_){
                    //其他条件
                }
                hangzhouMesMapper.insertCacheTask(item.getGlassid()+"","0",endcell,"2");
                S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.28").getAddress(), SendEndcell);
                S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.20").getAddress(), "1");
                return true;
            }
        }
        //返回结果
        return false;
    }
    //磨边   不交互  理片和磨边机自己交互
    public void processMb(String Number){
        //查询任务
        GlassInfo GlassInfo=hangzhouMesMapper.selectGlassId(Number);
        PlcParameterObject plcmes=PLCAutoMes.PlcMesObject;
        if(GlassInfo!=null){
            //发送任务   ID   长 宽 厚 倒角 工艺功能等
            S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.22").getAddress(),"N10000");
            S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.24").getAddress(), "1000");
            S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.26").getAddress(),"800");
            S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.28").getAddress(),"60");
            S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.30").getAddress(), "2");
            S7control.getinstance().writeString(plcmes.getPlcParameter("DB14.20").getAddress(), "1");
        }
        //返回结果
    }
    //查询消息队列里此玻璃ID的数据
    public boolean SelectMessageId(String Number){
        //查询是否存在
        GlassInfo GlassInfo=hangzhouMesMapper.selectGlassId(Number);
        if(GlassInfo==null){
            return false;//返回 不存在
        }
        return true;//返回 存在
    }
    //删除消息队列里此玻璃ID的数据
    public boolean DeleteMessageId(String Number){
        //查询是否存在
        GlassInfo GlassInfo=hangzhouMesMapper.selectGlassId(Number);
        if(GlassInfo==null){
            return false;//返回 不存在
        }
        return true;//返回 存在
    }
    //是否存在此编号玻璃
    public boolean isExist(String Number){
        //查询是否存在
        GlassInfo GlassInfo=hangzhouMesMapper.selectGlassId(Number);
        if(GlassInfo==null){
            return false;//返回 不存在
        }
        return true;//返回 存在
    }
}
CacheGlassModule/src/main/java/com/mes/service/pp/PpService.java
New file
@@ -0,0 +1,51 @@
package com.mes.service.pp;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.mes.entity.GlassInfo;
import com.mes.entity.Tempered;
import com.mes.mapper.HangzhouMesMapper;
import com.mes.mapper.PpMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class PpService {
    @Autowired
    private PpMapper selectInfoMapper;
    @Autowired
    private HangzhouMesMapper hangzhouMesMapper;
    // public GlassInfo getUserInfo(String process_id){
    //     return hangzhouMesMapper.selectGlassId(process_id);
    // }
    public List<Tempered> selectTemperedTerritory(String process_id){
        return selectInfoMapper.selectTemperedTerritory(process_id);
    }
    //切割版图   当前识别版图
    public List<Map> selectCutTerritory(){
        //1.得到要显示的 工程ID 以及版图ID
        //2.在Hangzhoumes数据库里 得到目前已经  领取但未完成的 工程ID集合
        //3.拿工程集合去PP数据库里 得到对应的小片集合
        //4.拿对应的小片集合 与 缓存任务表进行对比 查找下一版图显示
        String process_id = "P24032204";
        String territory_id = "1";
        return selectInfoMapper.selectCutTerritory(process_id,territory_id);
    }
    //切割版图 根据工程号查询   所有版图小片数据
    public List<Map> selectCutTerritory(String process_id){
        return selectInfoMapper.selectCutTerritory(process_id);
    }
    //切割版图 根据工程号,版图编号查询   版图编号里所有小片数据
    public List<Map> selectCutTerritory(String process_id,String TerritoryId){
        return selectInfoMapper.selectCutTerritory(process_id,TerritoryId);
    }
}
UI-Project/src/views/TL/Temperedlayout/Temperedlayout.vue
New file
@@ -0,0 +1,212 @@
<!--  物料资料  -->
<script setup>
import { ref } from "vue";
import { ArrowLeftBold, ArrowRight, Search } from "@element-plus/icons-vue";
import request from "@/utils/request";
import deepClone from "@/utils/deepClone";
import { ElMessage } from "element-plus";
import { useRouter } from "vue-router";
const router = useRouter()
let indexFlag = $ref(1)
function changeRouter(index) {
  indexFlag = index
}
</script>
<script>
export default {
  mounted() {
    //获取数据
    var data="ProcessId="+"P24032508";
    request.get("/TidyUpGlassModule/SelectTerritoryInfo?"+data).then((res) => {
      if (res.code == 200) {
        var StoveCount=0;
        var temperid;
        for(var i=0;i<res.data.length;i++){
          if (temperid != res.data[i].layoutid) {
            StoveCount++;
            temperid=res.data[i].layoutid;
          }
        }
        // console.log(res.data);
        this.CanvaDraws("mycanvas",res.data,StoveCount);
      } else {
        ElMessage.warning(res.msg)
        router.push("/login")
      }
    });
    request.get("/TidyUpGlassModule/CurrentCutTerritory").then((res) => {
      if (res.code == 200) {
        console.log(res.data);
      } else {
        ElMessage.warning(res.msg)
        router.push("/login")
      }
    });
  },
  methods: {
    //Canva(id,基础数据,页面长:实际长,显示行内版图数, )
    //基础数据:实际炉长,实际炉宽, 小片X轴, 小片y轴, 小片长, 小片宽,显示数据(尺寸,ID,流程卡号,版图号)
    CanvaDraws(id,Datas,StoveCount) {
        //var StoveCount=43;//炉数
        var ArrangementMode='linefeed';//排布方式:linefeed(换行) /Wholeline  整行
        var RowMaxCount=4;//每行最多显示的图数
        var StoveWidth=3000; //实际炉宽 2850
        var StoveLength=5500;//实际炉长 5000
        var StoveColor='#CFC8C5';//炉子背景颜色
        var StoveIntervalX=30; //页面每一炉之间的间距X  px
        var StoveIntervalY=50; //页面每一炉之间的间距Y  px
        var HtmlWidth=1800;   //页面横向
        //var actualWidth=12000;//页面横向所对应的实际长度
        var actualWidth=StoveWidth*RowMaxCount;//页面横向所对应的实际长度
        var Bli = actualWidth / (HtmlWidth-StoveIntervalX*RowMaxCount);//比例:实际长度mm/页面长度px
        var StoveCross=StoveWidth/Bli;   //页面炉子横向 像素
        var StoveVertical=StoveLength/Bli;//页面炉子纵向 像素
        var Font1=(StoveCross*0.05);
        var Font2=(StoveCross*0.028);
        // var TerritoryWidth=dataTempered.loadwidth; //实际版图宽
        //   var TerritoryLength=dataTempered.loadlength;//实际版图长
        //   var TerritoryColor='#0DB637';//版图背景颜色
        //   var TerritoryCross=TerritoryWidth/Bli;   //页面版图横向 像素
        //   var TerritoryVertical=TerritoryLength/Bli;//页面版图纵向 像素
        console.log(Font1);
        var canva = this.$refs[id];
        var content = canva.getContext('2d');
        canva.width = HtmlWidth;
        canva.height = StoveCount%RowMaxCount==0?((StoveVertical+StoveIntervalY)*(StoveCount/RowMaxCount)):((StoveVertical+StoveIntervalY)*(StoveCount/RowMaxCount+1));
        //console.log(StoveCount%RowMaxCount==0?((StoveVertical+StoveIntervalY)*(StoveCount/RowMaxCount)):((StoveVertical+StoveIntervalY)*(StoveCount/RowMaxCount+1)) );
        var temperid;//初始版图
        var Xlayout = 0; //炉子X轴起点
        var Ylayout = StoveIntervalY; //炉子Y轴起点
        var layoutCount = 0;//版图数
        var row=0;
        for (var i = 0; i < Datas.length; i++) {
          var dataTempered = Datas[i];
          var TerritoryWidth=dataTempered.loadwidth; //实际版图宽
          var TerritoryLength=dataTempered.loadlength;//实际版图长
          var TerritoryColor='#0DB637';//版图背景颜色
          var TerritoryCross=TerritoryWidth/Bli;   //页面版图横向 像素
          var TerritoryVertical=TerritoryLength/Bli;//页面版图纵向 像素
          if (temperid != dataTempered.layoutid) {
            //画版图  更改基础倍数
            if(layoutCount>0){
              Xlayout += StoveCross + StoveIntervalX;
              if (layoutCount %RowMaxCount== 0) {
                //换行
                Ylayout += StoveVertical+StoveIntervalY;
                Xlayout=0;
                row++;
              }
            }
            temperid=dataTempered.layoutid;
            layoutCount++;
            content.font ='bold '+Font1+'px Arial' ; //文字样式:加粗 16像素 字体Arial
            content.fillStyle = '#000000'; //字体颜色
            content.textAlign = 'center'; //文字居中
            content.fillText((dataTempered.layoutid), (StoveCross / 2+ Xlayout), 50/2+(StoveVertical+50)*row+10);
            //炉子
            content.fillStyle = StoveColor;
            content.fillRect(Xlayout, Ylayout, StoveCross, StoveVertical);
            //版图
            content.fillStyle = TerritoryColor;
            content.fillRect(Xlayout, Ylayout, TerritoryCross, TerritoryVertical);
          }
          var Rx = dataTempered.xaxis / Bli + Xlayout;
          var Ry = dataTempered.yaxis / Bli + Ylayout;
          var Rwidth = dataTempered.width / Bli;
          var Rheight = dataTempered.height / Bli;
          var Xwidth;
          var Xheight;
          content.fillStyle = '#5CADFE';
          if (dataTempered.rotateangle != 0) {
            Xwidth = Rwidth;
            Xheight = Rheight;
          } else {
            Xwidth = Rheight;
            Xheight = Rwidth;
          }
          content.fillRect(Rx, Ry, Xwidth, Xheight);
          content.font = 'bold '+Font2+'px Arial' ; //文字样式:加粗 16像素 字体Arial
          content.fillStyle = '#000000'; //字体颜色
          content.textAlign = 'center'; //文字居中
          content.fillText(('版图:'+dataTempered.layoutid+'-'+dataTempered.sort), (Xwidth / 2) + Rx, (Xheight) / 2 + Ry-Font2);
          content.fillText((dataTempered.width + '  *  ' + dataTempered.height), (Xwidth / 2) + Rx, (Xheight) / 2 + Ry); //fillText里面的可填写的值(文本内容, x坐标, y坐标, 文本最大宽度)
          content.fillText((dataTempered.processid), (Xwidth / 2) + Rx, (Xheight) / 2 + Ry+Font2);
          //content.rotate(30*Math.PI/180);
          content.stroke();
        }
    }
  }
}
</script>
<template>
  <div ref="content">
    <canvas ref="mycanvas"></canvas>
  </div>
</template>
<style scoped>
#main {
  width: 100%;
  height: 100%;
}
#div-title {
  height: 5%;
  width: 100%;
}
#searchButton {
  margin-top: -5px;
  margin-left: 1rem;
}
#searchButton1 {
  /* margin-left: 10rem; */
}
/*main-body样式*/
#main-body {
  width: 99%;
  height: 92%;
  margin-top: 1%;
}
#select {
  margin-left: 0.5rem;
}
:deep(.indexTag .el-breadcrumb__inner) {
  color: #5CADFE !important;
}
</style>