CacheGlassModule/src/main/java/com/mes/mapper/HangzhouMesMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
CacheGlassModule/src/main/java/com/mes/mapper/PpMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
CacheGlassModule/src/main/java/com/mes/service/CacheGlassService/LogicService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
CacheGlassModule/src/main/java/com/mes/service/pp/PpService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
UI-Project/src/views/TL/Temperedlayout/Temperedlayout.vue | ●●●●● 补丁 | 查看 | 原始文档 | 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>