UI-Project/src/views/UnLoadGlass/loadmachinerack.vue
@@ -1,19 +1,19 @@ <script setup> import { Search } from "@element-plus/icons-vue"; import { reactive, onMounted, onBeforeUnmount, onUnmounted } from "vue"; import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue"; import { useRouter } from "vue-router" const router = useRouter() import { useI18n } from 'vue-i18n' import {ElMessage} from 'element-plus' import request from "@/utils/request"; import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService'; import {host, WebSocketHost} from '@/utils/constants' const router = useRouter() const { t } = useI18n() let language = ref(localStorage.getItem('lang') || 'zh') import { ref } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' import Landingindication from "./Landingindication.vue"; import Landingindicationtwo from "./Landingindicationtwo.vue"; import request from "@/utils/request"; import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService'; import { WebSocketHost, host } from '@/utils/constants' // import PrintFlow from './PrintFlow.vue' const printLoading = ref(true) const fullFlowCard = ref('') const autoPrint = ref(false) const dialogFormVisiblea = ref(false) const dialogFormVisiblea2 = ref(false) const dialogFormVisibleaDownGlass = ref(false) @@ -28,12 +28,37 @@ const flowCardOptions = ref('[]'); const tableData = reactive([]); const downGlass = ref([]); const timeRange = ref(["2022-01-01", "2025-01-01"]) const selectValuesa = reactive({}); const selectOptionsa = ref([]); const dialogTableVisible = ref(false) // const printFlowCardId = ref('') // const printLayer=ref('') const printFlowCardId = ref('') const printLayer = ref('') const now = new Date(); const timeRange = ref([new Date(now.setHours(0, 0, 0, 0)), new Date(now.setHours(23, 59, 59, 999))]) const handleChange = async () => { console.log("触发开关") try { const body = { flag: autoPrint.value, // 使用 ganghua.value 获取当前开关的状态 }; var url = "/unLoadGlass/downWorkStation/autoPrint?flag=" + autoPrint.value; const response = await request.post(url) if (response.code == 200) { // 绑定成功,处理逻辑 ElMessage.success(response.message); autoPrint.value = response.data } else { ElMessage.error(response.message); } } catch (error) { // 处理错误 console.error(error); } } const handleInputChangea = (value, rowId) => { // 更新对应行的 select 值 @@ -155,6 +180,7 @@ const socketUrl = `ws://${WebSocketHost}:${host}/api/unLoadGlass/api/talk/unloadglass`; // 定义消息处理函数,更新 receivedData 变量 const handleMessage = (data) => { // 更新 tableData 的数据 if (data.downGlassInfos != null) { downGlass.value = data.downGlassInfos[0][1]; @@ -162,8 +188,27 @@ if (data.engineerIdList != null) { selectOptionsa.value = data.engineerIdList[0] } if (data.autoPrint != null) { autoPrint.value = data.autoPrint; } console.log(autoPrint.value) // tableData.splice(0, tableData.length, ...data.params[0]); tableData.splice(0, tableData.length, ...data.params[0]); if (fullFlowCard.value == "") { for (let i = 0; i < tableData.length; i++) { if (tableData[i].totalQuantity != 0) { if (tableData[i].totalQuantity == tableData[i].racksNumber + tableData[i].otherNumber && fullFlowCard.value != tableData[i].flowCardId) { // printFlowCardId.value = tableData[i].flowCardId; fullFlowCard.value = tableData[i].flowCardId; open(tableData[i]); break; } } else { console.log("没有flowCardId") } } } // console.log("更新后数据", data.params[0]); }; @@ -218,14 +263,13 @@ // 查询数据 const selectDownGlassData = async () => { const response = await request.post("/unLoadGlass/downGlassInfo/selectDownGlassInfo", { const response = await request.post("/unLoadGlass/downGlassInfo/setDownGlassInfoRequest", { workStationId: selectValuesa[0], engineerId: selectValuesa[1], beginDate: timeRange.value[0], endDate: timeRange.value[1], }) if (response.code === 200) { sendDownGlass.value = response.data; ElMessage.success(response.message); } else { ElMessage.error(response.message); @@ -234,56 +278,58 @@ } // const open=async(row)=>{ const open = async (row) => { // printFlowCardId.value=row.flowCardId; // printLayer.value=row.layer // dialogTableVisible.value = true; // setTimeout(() => { // printFlowCard(); // 替换成你要执行的函数名 // }, 1000); // ; // } printFlowCardId.value = row.flowCardId; printLayer.value = row.layer dialogTableVisible.value = true; setTimeout(() => { printFlowCard(); // 替换成你要执行的函数名 dialogTableVisible.value = false; }, 1000); ; // const printFlowCard = () => { // // 需要打印的局部区域赋予"print-wrap"的id // let el = document.getElementById("child"); // let doc = document; // let body = doc.body || doc.getElementsByTagName("body")[0]; // let printId = "print-" + Date.now(); } // // 创建无副作用的打印容器(因不确定页面的打印元素有无其它样式) // let content = doc.createElement("div"); // content.id = printId; const printFlowCard = () => { // 需要打印的局部区域赋予"print-wrap"的id let el = document.getElementById("child"); let doc = document; let body = doc.body || doc.getElementsByTagName("body")[0]; let printId = "print-" + Date.now(); // // 样式控制与打印无关的元素隐藏 // let style = doc.createElement("style"); // style.innerHTML = // "body>#" + // printId + // "{display:none}@media print{" + // "@page {" + // " size: auto; " + // " margin: 2mm 2mm 0mm 1mm; " + // " }body>:not(#" + // printId + // "){display:none !important}body>#" + // printId + // "{display:block;padding-top:1px}}"; // // // content.innerHTML = el.outerHTML; // // // console.log("el.outerHTML", el.outerHTML); // body.appendChild(style); // 创建无副作用的打印容器(因不确定页面的打印元素有无其它样式) let content = doc.createElement("div"); content.id = printId; // // 与style元素设置的样式相配合 // // 把打印内容的元素添加到body(作为body的子元素,可用body的子选择器 '>' 控制打印样式) // body.appendChild(content); // setTimeout(() => { // window.print(); // body.removeChild(content); // body.removeChild(style); // }, 20); // } // 样式控制与打印无关的元素隐藏 let style = doc.createElement("style"); style.innerHTML = "body>#" + printId + "{display:none}@media print{" + "@page {" + " size: auto; " + " margin: 2mm 2mm 0mm 1mm; " + " }body>:not(#" + printId + "){display:none !important}body>#" + printId + "{display:block;padding-top:1px}}"; // content.innerHTML = el.outerHTML; // // console.log("el.outerHTML", el.outerHTML); body.appendChild(style); // 与style元素设置的样式相配合 // 把打印内容的元素添加到body(作为body的子元素,可用body的子选择器 '>' 控制打印样式) body.appendChild(content); setTimeout(() => { window.print(); body.removeChild(content); body.removeChild(style); }, 20); } // beforeUnmount(() => { @@ -294,7 +340,10 @@ <template> <div> <el-button style="margin-top: 5px;margin-left: 10px;" id="searchButton" type="primary" @click="dialogFormVisibleaDownGlass = true">落架详情</el-button> @click="dialogFormVisibleaDownGlass = true">落架详情 </el-button> <el-switch style="margin-top: 5px;margin-left: 10px;" v-model="autoPrint" class="mb-2" :inactive-text="$t('自动打印')" @change="handleChange"/> <el-card style="flex: 1;" v-loading="loading"> <el-card style="flex: 1;margin-left: 4px;margin-top: 1px;" v-loading="loading"> <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;"> @@ -321,7 +370,8 @@ <el-table-column fixed="right" :label="$t('reportWork.operate')" align="center" width="200"> <template #default="scope"> <el-button size="mini" type="text" plain v-show="scope.row.enableState !== '已启用'" @click="handleBindRack(scope.row)">{{ $t('reportWork.bindingshelves') }}</el-button> @click="handleBindRack(scope.row)">{{ $t('reportWork.bindingshelves') }} </el-button> <el-button size="mini" type="text" plain @click="handleBindRack2(scope.row)">{{ $t('reportWork.clear') }}</el-button> <el-button @click="open(scope.row)" :disabled="scope.row.flowCardId==null">打印</el-button> @@ -351,12 +401,16 @@ @input="handleInputChangea($event, row.id)"> <el-option v-for="item in selectOptionsa" :key="item" :label="item" :value="item" /> </el-select> <el-date-picker style="margin-left: 10px;" v-model="timeRange" type="daterange" format="YYYY/MM/DD" value-format="YYYY-MM-DD" :start-placeholder="$t('reportmanage.starttime')" :end-placeholder="$t('reportmanage.endtime')" :default-time="defaultTime" /> <span class="demonstration">时间段</span> <el-date-picker v-model="timeRange" type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"> </el-date-picker> <el-button type="primary" style="margin-left: 10px;" @click="selectDownGlassData()">{{ $t('reportmanage.inquire') }}</el-button> }} </el-button> <el-table height="200px" ref="table" @selection-change="handleSelectionChange" :data="downGlass" :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }"> <el-table-column prop="workStationId" align="center" :label="$t('工位号')" min-width="80" /> @@ -429,17 +483,13 @@ </template> </el-dialog> <!-- <el-dialog id="sizePrintCalrd" v-model="dialogTableVisible" destroy-on-close style="width: 75%;height:75% "> <print-flow id="child" :printFlowCardId="printFlowCardId" :printLayer="printLayer" <el-dialog id="sizePrintCalrd" v-model="dialogTableVisible" destroy-on-close style="width: 75%;height:75% "> <!-- <template #header="{ close, titleId, titleClass }"> <el-button @click="printFlowCard" >打印</el-button> </template> --> <print-flow id="child" :printFlowCardId="printFlowCardId" :printLayer="printLayer" style="width: 100%;height: 100%"/> </el-dialog> --> </el-dialog> </template> <style scoped> hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/controller/EdgStorageCageController.java
@@ -1,20 +1,16 @@ package com.mes.edgstoragecage.controller; import com.mes.edgglasstask.entity.request.IdentWornRequest; import com.mes.edgstoragecage.entity.EdgStorageCage; import com.mes.edgstoragecage.entity.EdgStorageCageDetails; import com.mes.edgstoragecage.service.EdgStorageCageDetailsService; import com.mes.edgstoragecage.service.EdgStorageCageService; import com.mes.edgstoragecage.service.impl.EdgStorageCageServiceImpl; import com.mes.taskcache.entity.TaskCache; import com.mes.taskcache.service.impl.TaskCacheServiceImpl; import com.mes.utils.Result; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.awt.image.ImageProducer; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -44,13 +40,7 @@ List<Map<String, Object>> list=edgStorageCageService.selectEdgStorageCages(); return Result.build(200,"成功",list); } // @ApiOperation("添加磨边缓存理片笼信息 功能:笼内绑定玻璃 参数(EdgStorageCage edgStorageCage)") // @PostMapping("/insertEdgStorageCage") // @ResponseBody // public Result insertEdgStorageCage(@RequestBody EdgStorageCage edgStorageCage) { // boolean isSucess=edgStorageCageService.updateEdgStorageCage(edgStorageCage); // return Result.build(200,"添加成功",1); // } @ApiOperation("修改磨边缓存理片笼信息 功能:对笼内栅格进行【启用/禁用】") @PostMapping("/updateEdgStorageCage") @ResponseBody @@ -68,16 +58,11 @@ return Result.build(200,"【清除/更换/绑定】"+isSucess,1); } @ApiOperation("磨边模块汇报玻璃状态 功能:对笼内栅格玻璃进行【破损/拿走】 ") @PostMapping("/edgReportStatus") @ResponseBody public Result edgReportStatus(@RequestBody Map<String, String> arguments) { /*arguments.put("line","1002"); arguments.put("machine","卧式理片");*/ String isSucess=edgStorageCageDetailsService.identWorn(arguments)?"成功":"失败"; return Result.build(200,"【破损/拿走】"+isSucess,1); public Result edgReportStatus(@RequestBody IdentWornRequest request) { return Result.build(200, "【破损/拿走】" + edgStorageCageDetailsService.edgReportStatus(request), 1); } } hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/EdgStorageCageDetailsService.java
@@ -1,6 +1,7 @@ package com.mes.edgstoragecage.service; import com.github.yulichang.base.MPJBaseService; import com.mes.edgglasstask.entity.request.IdentWornRequest; import com.mes.edgstoragecage.entity.EdgStorageCageDetails; import java.util.List; @@ -15,13 +16,6 @@ * @since 2024-04-07 */ public interface EdgStorageCageDetailsService extends MPJBaseService<EdgStorageCageDetails> { /** * 识别 破损/拿走 * @param arguments * @return */ boolean identWorn(Map<String, String> arguments); /** * 获取 切割当前版图 @@ -46,9 +40,26 @@ /** * 获取出片信息数据 * * @param glassId * @param threshold * @return */ EdgStorageCageDetails selectOutGlass(String glassId, int threshold); /** * 识别 拿走:9/破损:8 * * @param request * @return */ String identControls(IdentWornRequest request); /** * 磨边模块汇报玻璃状态 功能:对笼内栅格玻璃进行【破损/拿走】 * * @param request * @return */ String edgReportStatus(IdentWornRequest request); } hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java
@@ -2,6 +2,7 @@ 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.query.MPJLambdaQueryWrapper; @@ -10,12 +11,14 @@ import com.mes.common.config.Const; import com.mes.damage.entity.Damage; import com.mes.damage.service.DamageService; import com.mes.edgglasstask.entity.EdgGlassTaskInfo; import com.mes.edgglasstask.entity.request.IdentWornRequest; import com.mes.edgglasstask.service.EdgGlassTaskInfoService; import com.mes.edgstoragecage.entity.EdgStorageCage; import com.mes.edgstoragecage.entity.EdgStorageCageDetails; import com.mes.edgstoragecage.mapper.EdgStorageCageDetailsMapper; import com.mes.edgstoragecage.mapper.EdgStorageCageMapper; import com.mes.edgstoragecage.service.EdgStorageCageDetailsService; import com.mes.glassinfo.entity.GlassInfo; import com.mes.glassinfo.mapper.GlassInfoMapper; import com.mes.pp.entity.OptimizeDetail; import com.mes.pp.entity.OptimizeLayout; @@ -26,12 +29,11 @@ import com.mes.uppattenusage.mapper.UpPattenUsageMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.print.attribute.standard.MediaSize; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -65,66 +67,8 @@ @Autowired DamageService damageService; /** * 识别 拿走:200/破损:201 * * @param arguments * @return */ @Override public boolean identWorn(Map<String, String> arguments) { String glassId=arguments.get("glassId"); int controlsId=arguments.get("controlsId").isEmpty()?0:Integer.parseInt(arguments.get("controlsId")); int line=arguments.get("line").isEmpty()?0:Integer.parseInt(arguments.get("line")); String machine=arguments.get("machine"); if(controlsId==0||line==0||machine==null||glassId==null||glassId.isEmpty()){ log.info("前端传递数据不全:{}",arguments); return false; } int state; if(controlsId==200||controlsId==201){ state=controlsId==200?3:2; }else if (controlsId==300||controlsId==301){ state=controlsId==300?3:2; }else{ log.info("前端传递状态不合法:{}",arguments); return false; } List<GlassInfo> GlassInfos = glassInfoMapper.selectList(new MPJLambdaQueryWrapper<GlassInfo>() .selectAll(GlassInfo.class) .eq(GlassInfo::getGlassId, glassId)); if (GlassInfos.size() == 1) { Damage damage =new Damage(); damage.setGlassId(glassId); damage.setLine(line); damage.setWorkingProcedure(machine); damage.setRemark(""); damage.setStatus(state);//201破损,200拿走 =》破损表 2破损 3 拿走 damageService.insertDamage(damage); }else{ return false; } List<EdgStorageCageDetails> edgStorageCageDetails = baseMapper.selectList(new MPJLambdaQueryWrapper<EdgStorageCageDetails>() .selectAll(EdgStorageCageDetails.class) .eq(EdgStorageCageDetails::getGlassId, glassId)); if (edgStorageCageDetails.size() == 1) { EdgStorageCageDetails item = edgStorageCageDetails.get(0); item.setState(controlsId); baseMapper.update(item, new MPJLambdaWrapper<EdgStorageCageDetails>().selectAll(EdgStorageCageDetails.class).eq(EdgStorageCageDetails::getGlassId, glassId)); } // Sql版本 // List<EdgStorageCageDetails> edgStorageCageDetails = baseMapper.selectList(new QueryWrapper<EdgStorageCageDetails>().eq("glass_id", glassId)); // if (edgStorageCageDetails.size() == 1) { // EdgStorageCageDetails item=edgStorageCageDetails.get(0); // item.setState(ControlsId); // baseMapper.update(edgStorageCageDetails.get(0), new QueryWrapper<EdgStorageCageDetails>().eq("glass_id", glassId)); // return true; // } return true; } @Autowired EdgGlassTaskInfoService edgGlassTaskInfoService; /** * 获取 切割当前版图 @@ -331,4 +275,31 @@ } return outEdgStorageCageDetails; } @Override public String identControls(IdentWornRequest request) { //将识别破损的玻璃直接加入破损表 Damage damage = new Damage(); BeanUtils.copyProperties(request, damage); damage.setType(request.getState()); damage.setRemark(""); damage.setStatus(0); damageService.insertDamage(damage); return "success"; } @Override public String edgReportStatus(IdentWornRequest request) { //将磨边队列破损的玻璃直接加入破损表 Damage damage = new Damage(); BeanUtils.copyProperties(request, damage); damage.setType(request.getState()); damage.setRemark(""); damage.setStatus(0); damageService.insertDamage(damage); //修改磨边队列数据状态 edgGlassTaskInfoService.update(new LambdaUpdateWrapper<EdgGlassTaskInfo>() .set(EdgGlassTaskInfo::getStatus, request.getState()).eq(EdgGlassTaskInfo::getGlassId, request.getGlassId())); return "success"; } } hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/taskcache/controller/TaskCacheController.java
@@ -1,8 +1,7 @@ package com.mes.taskcache.controller; import com.mes.edgglasstask.entity.request.IdentWornRequest; import com.mes.edgstoragecage.service.EdgStorageCageDetailsService; import com.mes.edgstoragecage.service.EdgStorageCageService; import com.mes.taskcache.entity.TaskCache; import com.mes.taskcache.service.TaskCacheService; import com.mes.utils.Result; import io.swagger.annotations.Api; @@ -12,8 +11,6 @@ import java.util.List; import java.util.Map; import static com.mes.job.CacheGlassTask.engineerId; /** * <p> @@ -32,8 +29,6 @@ private EdgStorageCageDetailsService edgStorageCageDetailsService; @Autowired private EdgStorageCageService edgStorageCageService; @Autowired private TaskCacheService taskCacheService; @ApiOperation("查询切割版图信息-根据 工程号 参数(工程号)") @@ -44,6 +39,7 @@ List<List<Map<String, Object>>> h = edgStorageCageDetailsService.selectCurrentCutTerritory(current); return Result.build(200,"成功",h); } @ApiOperation("识别显示 当前版图 参数()") @PostMapping("/currentCutTerritory") @ResponseBody @@ -51,16 +47,12 @@ List<Map<String, Object>> h = edgStorageCageDetailsService.selectCutTerritory(); return Result.build(200,"成功",h); } @ApiOperation("识别操作: 破损/拿走 参数(ID,功能[200:拿走,201:破损])") @ApiOperation("识别操作: 破损/拿走 参数(ID,功能[9:拿走,8:破损])") @PostMapping("/identControls") @ResponseBody public Result identControls(@RequestBody Map<String, String> arguments) { /* arguments.put("glassId","玻璃ID"); arguments.put("controlsId","功能号[200拿走/201破损]");*/ /*arguments.put("line","1001"); arguments.put("machine","识别");*/ boolean issucess = edgStorageCageDetailsService.identWorn(arguments); return Result.build(200,"成功",issucess); public Result<String> identControls(@RequestBody IdentWornRequest request) { return Result.build(200, "成功", edgStorageCageDetailsService.identControls(request)); } @ApiOperation("磨边任务 参数()") hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java
@@ -506,10 +506,10 @@ } //获取出片任务表中状态为破损的数据 List<BigStorageCageOutTask> outDamageTaskInfoList = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>() .eq(BigStorageCageOutTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); .in(BigStorageCageOutTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); if (CollectionUtils.isNotEmpty(outDamageTaskInfoList)) { log.info("获取出片任务表中破损的玻璃信息{}", outDamageTaskInfoList); bigStorageCageOutTaskService.remove(new LambdaQueryWrapper<BigStorageCageOutTask>().eq(BigStorageCageOutTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); bigStorageCageOutTaskService.remove(new LambdaQueryWrapper<BigStorageCageOutTask>().in(BigStorageCageOutTask::getTaskState, Const.GLASS_STATE_DAMAGE_TAKE)); List<String> glassIdList = outDamageTaskInfoList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList()); //移除钢化下片表数据 temperingGlassInfoService.remove(new LambdaQueryWrapper<TemperingGlassInfo>().in(TemperingGlassInfo::getGlassId, glassIdList)); @@ -713,7 +713,7 @@ while (returnData == 0) { s7control.writeWord(outLine, 2); returnData = s7control.readWord(outLine, 1).get(0); log.info("已向plc第{}次发送送片任务确认,地址为:{},写入的内容为{}", count++, outLine, returnData); log.info("已向plc第{}次发送进片任务确认,地址为:{},写入的内容为{}", count++, outLine, returnData); } } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application.yml
@@ -3,20 +3,20 @@ spring: profiles: active: prod active: cz application: name: cacheVerticalGlass mybatis-plus: mapper-locations: classpath*:mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # configuration: # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mes: sequence: order: false minCount: 5 minCount: 20 carWidth: 5000 #大车宽度 slotWidth: 5000 #大车宽度 inCarMaxSize: 2 #进片大车最大存放玻璃数量 inCarMaxSize: 3 #进片大车最大存放玻璃数量 outCarMaxSize: 3 #出片大车最大存放玻璃数量 glassGap: 1000 #玻璃间距 glassGap: 350 #玻璃间距 xMaxSize: 2850 hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/controller/DownGlassInfoController.java
@@ -1,5 +1,6 @@ package com.mes.downglassinfo.controller; import com.mes.downglassinfo.entity.DownGlassInfo; import com.mes.downglassinfo.entity.request.DownGlassInfoRequest; import com.mes.downglassinfo.service.DownGlassInfoService; import com.mes.utils.Result; @@ -31,4 +32,9 @@ } @PostMapping("/downGlassPrint") public Result downGlassPrint(@RequestBody DownGlassInfo downGlassInfo) { return Result.build(200, "查询成功", downGlassInfoService.downGlassPrint(downGlassInfo)); } } hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/entity/request/DownGlassInfoRequest.java
@@ -6,7 +6,6 @@ import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.sql.Timestamp; import java.util.Date; /** @@ -34,14 +33,14 @@ /** * 开始时间 */ @DateTimeFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd") private Date beginDate; /** * 结束时间 */ @DateTimeFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd") private Date endDate; hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassInfoServiceImpl.java
@@ -1,7 +1,6 @@ package com.mes.downglassinfo.service.impl; import cn.smallbun.screw.core.util.CollectionUtils; import cn.smallbun.screw.core.util.CollectionUtils; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -27,8 +26,9 @@ import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.HashMap;import java.util.Map; import java.util.Map; import java.util.stream.Collectors; @Service @@ -105,6 +105,7 @@ BeanUtils.copyProperties(details, downGlassInfo); //获取当前流程卡最大片序 downGlassInfo.setSequence(this.getMaxSequenceByFlowCardId(details.getFlowCardId(), details.getLayer()) + 1); downGlassInfo.setWorkStationId(Const.G13_WORK_STATION); this.save(downGlassInfo); //生成任务信息 并向plc发送出片任务 GlassInfo glassInfo = new GlassInfo(); hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/controller/DownWorkstationController.java
@@ -1,6 +1,7 @@ package com.mes.downworkstation.controller; import com.mes.common.utils.RedisUtil; import com.mes.downworkstation.entity.DownWorkstation; import com.mes.downworkstation.entity.request.DownWorkRequest; import com.mes.downworkstation.service.DownWorkstationService; @@ -11,6 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; import java.util.Map; @@ -32,6 +34,8 @@ private DownWorkstationService downWorkstationService; @Autowired private GlassInfoService glassInfoService; @Resource private RedisUtil redisUtil; @ApiOperation("获取工位信息") @GetMapping("/getone") @@ -81,7 +85,6 @@ return Result.build(200, "清除工位信息成功", 1); // 构建响应数据 } @@ -127,6 +130,13 @@ return Result.build(200, "更换成功", downWorkstationService.closeAlarmSignal()); } @ApiOperation("是否自动打印") @PostMapping("/autoPrint") public Result autoPrint(Boolean flag) { downWorkstationService.autoPrint(flag); return Result.build(200, "修改成功", redisUtil.getCacheObject("autoPrint")); } } hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/service/DownWorkstationService.java
@@ -79,4 +79,6 @@ boolean updateDownWorkstationstate(DownWorkstation downWorkstation); String closeAlarmSignal(); void autoPrint(Boolean flag); } hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/service/impl/DownWorkstationServiceImpl.java
@@ -5,13 +5,12 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.query.MPJQueryWrapper; import com.mes.common.S7object; import com.mes.common.utils.RedisUtil; import com.mes.damage.entity.Damage; import com.mes.damage.service.DamageService; import com.mes.device.PlcParameterObject; import com.mes.downglassinfo.entity.DownGlassInfo; import com.mes.downglassinfo.mapper.DownGlassInfoMapper; import com.mes.downglassinfo.service.DownGlassInfoService; import com.mes.downglassinfo.service.DownGlassTaskService; import com.mes.downworkstation.entity.DownWorkstation; import com.mes.downworkstation.entity.DownWorkstationTask; import com.mes.downworkstation.entity.DownWorkstionAndDownGlassinfo; @@ -25,6 +24,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -39,11 +39,7 @@ @Autowired(required = false) private DownWorkstationTaskMapper downWorkstationTaskMapper; @Autowired private DownGlassInfoService downGlassInfoService; @Autowired private DownGlassInfoMapper downGlassInfoMapper; @Autowired private DownGlassTaskService downGlassTaskService; @Autowired private GlassInfoService glassInfoService; @Autowired @@ -51,6 +47,8 @@ @Autowired private DownWorkstationTaskService downWorkstationTaskService; @Resource private RedisUtil redisUtil; // @Override // public List<DownWorkstation> gettwoDownWorkstations() { @@ -223,5 +221,9 @@ return "success"; } @Override public void autoPrint(Boolean flag) { redisUtil.setCacheObject("autoPrint", flag); } } hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/DownLoadCacheGlassTask.java
@@ -3,6 +3,7 @@ import cn.hutool.core.lang.Assert; import cn.smallbun.screw.core.util.CollectionUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.mes.common.S7object; @@ -164,6 +165,31 @@ log.info("本次任务结束时间:{},共耗时:{}ms", endDate, endDate.getTime() - startDate.getTime()); } /** * 更新已绑定工位流程卡的破损/拿走的数量信息 */ @Scheduled(fixedDelay = 1000) public void updateWorkStationOtherCount() { Date startDate = new Date(); log.info("下片破更新损玻璃数量任务开始执行时间:{}", startDate); //获取已绑定流程卡的工位信息 List<DownWorkstation> downWorkstationList = downWorkstationService.list(new LambdaQueryWrapper<DownWorkstation>() .isNotNull(DownWorkstation::getFlowCardId) .ne(DownWorkstation::getFlowCardId, "") .orderByDesc(DownWorkstation::getWorkstationId)); for (DownWorkstation downWorkstation : downWorkstationList) { //更新工位其他玻璃信息的数量 QueryWrapper<Damage> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("process_id", downWorkstation.getFlowCardId()); queryWrapper.eq("technology_number", downWorkstation.getLayer()); int otherNumber = damageService.count(queryWrapper); downWorkstationService.update(new LambdaUpdateWrapper<DownWorkstation>().set(DownWorkstation::getOtherNumber, otherNumber) .eq(DownWorkstation::getWorkstationId, downWorkstation.getWorkstationId())); } Date endDate = new Date(); log.info("下片破更新损玻璃数量任务结束时间:{},共耗时:{}ms", endDate, endDate.getTime() - startDate.getTime()); } public void inTo(String glassId, String requestWord, String currentSlot) { log.info("1、按照玻璃id:{}获取玻璃小片信息,当前格子为:{}", glassId, currentSlot); //添加进片任务 查找空格 @@ -253,6 +279,7 @@ BeanUtils.copyProperties(glassInfo, downStorageCageDetails); downStorageCageDetails.setState(Const.GLASS_STATE_IN); downStorageCageDetails.setSlot(nearestEmpty.getSlot()); downStorageCageDetails.setDeviceId(nearestEmpty.getDeviceId()); downStorageCageDetailsService.save(downStorageCageDetails); // 生成进片任务 initDownGlassTask(glassInfo, 0, nearestEmpty.getSlot(), Const.GLASS_CACHE_TYPE_IN); @@ -275,6 +302,7 @@ //获取当前笼子空格信息 DownStorageCage empty = downStorageCageService.selectCacheEmpty(Integer.parseInt(currentSlot), Boolean.TRUE); cageDetails.setSlot(empty.getSlot()); cageDetails.setDeviceId(empty.getDeviceId()); tempList.add(cageDetails); } log.info("出片2:笼内玻璃的数据(包括待进片)有:{}", tempList); @@ -378,8 +406,15 @@ .filter(item -> StringUtils.isNotBlank(item.getFlowCardId())).collect(Collectors.groupingBy(item -> item.getFlowCardId() + ":" + item.getLayer())); //过滤筛选获取架子上对应流程卡+层数的笼子内的玻璃信息 list = tempList.stream().filter(item -> listMap.containsKey(item.getFlowCardId() + ":" + item.getLayer())).collect(Collectors.toList()); if (CollectionUtils.isEmpty(list) && flag08 && !"2".equals(glassStatus13)) { list = tempList.stream().filter(item -> { double firstLength = Math.max(item.getWidth(), item.getHeight()); double secondLength = Math.min(item.getWidth(), item.getHeight()); return firstLength > maxWidth || secondLength > maxHeight; }).collect(Collectors.toList()); } } else { log.info("存在未绑定流程卡架子,直接获取笼内所有玻璃,且未绑定架子的玻璃信息"); log.info("存在未绑定流程卡架子,直接获取笼内所有玻璃,且未绑定架子的玻璃信息(都可以出的玻璃)"); //获取禁用及非本机械臂的架子的流程号及层数对应的玻璃信息 List<DownWorkstation> downWorkstationOffList = downWorkstationService.list(new LambdaQueryWrapper<DownWorkstation>() .and(i -> i.in(DownWorkstation::getWorkstationId, offWorkStationList).or().eq(DownWorkstation::getEnableState, Const.SLOT_OFF))); @@ -409,6 +444,8 @@ log.info("笼内玻璃无法执行出片"); return Boolean.FALSE; } //获取具体出那一片玻璃 //tao:人工--> 所有架子都未绑定时进行绑定 --->有未绑定架子时进行绑定 --->绑定过流程卡的玻璃-->玻璃流程卡多层--->玻璃流程卡单层 String tempGlassId = null; Boolean isNeedBind = Boolean.FALSE; @@ -426,7 +463,7 @@ loop: if (StringUtils.isBlank(tempGlassId)) { //获取正在落架的绑定流程卡的信息(流程卡、层数、落架数量) //todo:落架玻璃数为0,即使绑定了流程卡,也无法找到对应的架子信息,只能重新绑定 //落架玻璃数为0,即使绑定了流程卡,也无法找到对应的架子信息,只能重新绑定 List<DownGlassInfoDTO> downGlassInfoDTOList = downGlassInfoService.queryWorkStationFlowCard(workList); List<String> downGlassFlowList = downGlassInfoDTOList.stream().map(item -> item.getFlowCardId() + ":" + item.getLayer()).collect(Collectors.toList()); if (CollectionUtils.isEmpty(downGlassFlowList)) { @@ -436,6 +473,7 @@ break loop; } //将笼子内的玻璃进行过滤,仅获取无法落架的流程卡玻璃 //tao:当有空架时优先对笼内可出片且未绑架子的玻璃进出绑架并出片 List<DownStorageCageDetails> noDownLoadList = list.stream().filter(item -> !downGlassFlowList.contains(item.getFlowCardId() + ":" + item.getLayer())) .collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(noDownLoadList)) { @@ -456,7 +494,7 @@ return Boolean.FALSE; } //将笼内玻璃的流程卡+层号 和落架的流程卡 去重,得出展示无法落架的玻璃,判断玻璃数是否超过阈值 //笼内玻璃是否可落架:笼内是否有需要中空的 //笼内玻璃是否可落架:笼内是否有需要中空 List<DownStorageCageDetails> multiLayerList = list.stream().filter(item -> item.getTotalLayer() >= 2).collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(multiLayerList)) { for (DownStorageCageDetails item : multiLayerList) { @@ -473,7 +511,7 @@ break loop; } Integer sequence = downGlassInfoService.queryMaxSequence(item.getFlowCardId(), item.getLayer()); log.info("获取当前玻璃需要放的次序:笼内同流程 同层数的通达次序+1:{}", sequence); log.info("获取当前玻璃需要放的次序:笼内同流程 同层数的落架次序+1:{}", sequence); DownGlassInfo downGlassInfo = downGlassInfoService.getOne(new LambdaQueryWrapper<DownGlassInfo>() .eq(DownGlassInfo::getFlowCardId, downGlassInfoDTO.getFlowCardId()) .eq(DownGlassInfo::getLayer, downGlassInfoDTO.getLayer()).eq(DownGlassInfo::getSequence, sequence)); hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/Downpush.java
@@ -129,6 +129,16 @@ JSONObject jsonObject4 = new JSONObject(); jsonObject4.append("downGlassInfos", listMap); jsonObject4.append("engineerIdList", engineerIdList); //钢化开关 boolean autoPrint = false; if (redisUtil.getCacheObject("autoPrint") == null) { redisUtil.setCacheObject("autoPrint", false); } else { autoPrint = redisUtil.getCacheObject("autoPrint"); } jsonObject4.append("autoPrint", autoPrint); ArrayList<WebSocketServer> sendwServer4 = WebSocketServer.sessionMap.get("unloadglass"); if (sendwServer4 != null) { for (WebSocketServer webserver : sendwServer4) {