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 { useRouter } from "vue-router" const router = useRouter() import { useI18n } from 'vue-i18n' 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 {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue"; import {useRouter} from "vue-router" import {useI18n} from 'vue-i18n' import {ElMessage} from 'element-plus' import request from "@/utils/request"; import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService'; import { WebSocketHost, host } from '@/utils/constants' // import PrintFlow from './PrintFlow.vue' 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') const printLoading = ref(true) const fullFlowCard = ref('') const autoPrint = ref(false) const dialogFormVisiblea = ref(false) const dialogFormVisiblea2 = ref(false) const dialogFormVisibleaDownGlass = ref(false) @@ -23,20 +23,45 @@ const dialogFormVisible = ref(false); // 表单数据 const workstationId = ref(''); const selectedProjectNoa = ref(null); // 当前选中的角色 const selectedProjectNoa = ref(null); // 当前选中的角色 const flowCardId = ref(''); 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 值 // 更新对应行的 select 值 selectValuesa[rowId] = value; }; // 方法 @@ -56,9 +81,9 @@ const response = await request.get('unLoadGlass/downWorkStation/getflowCardId'); console.log(response) if (response.code === 200) { flowCardOptions.value = response.data.filter(item => item !== null) .map(item => ({ flowcard_id: item.flow_card_id })); .map(item => ({flowcard_id: item.flow_card_id})); console.log(flowCardOptions.value); } else { @@ -71,8 +96,8 @@ //确认 const handleConfirm = async () => { try { const firstPart = flowCardId.value.split('|')[0].trim(); // const twoPart = flowCardId.value.split('|')[1].trim(); // const firstPart = flowCardId.value.split('|')[0].trim(); // const twoPart = flowCardId.value.split('|')[1].trim(); // const response = await request.post('unLoadGlass/downWorkStation/updateFlowCardId', { workstationId: workstationId.value, flowCardId: firstPart, @@ -82,7 +107,7 @@ if (response.code == 200) { // 绑定成功,处理逻辑 console.log('绑定成功'); ElMessage.success(response.message); updatePageData(); dialogFormVisiblea.value = false; @@ -111,8 +136,8 @@ const response = await request.post('unLoadGlass/downWorkStation/clear', { workstationId: workstationId.value, }); if (response.code === 200) { // 清除成功的逻辑 console.log('清除成功'); @@ -136,7 +161,7 @@ try { // 发送获取表格数据的请求,并等待响应 const response = await request.get('unLoadGlass/downWorkStation/getone'); // 检查响应状态 if (response.code === 200) { // 更新表格数据 @@ -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,9 +188,28 @@ if (data.engineerIdList != null) { selectOptionsa.value = data.engineerIdList[0] } // tableData.splice(0, tableData.length, ...data.params[0]); if (data.autoPrint != null) { autoPrint.value = data.autoPrint; } console.log(autoPrint.value) 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]); }; // 初始化 WebSocket,并传递消息处理函数 @@ -182,30 +227,30 @@ console.log("关闭了") closeWebSocket(); }); const getTagType = (status) => { return status === 1 ? 'success' : 'danger'; // 根据状态值决定标签类型,这里假设状态为1时为成功(绿色),否则为失败(红色) } const toggleStatus = (row) => { // 切换料架状态的逻辑 row.enableState = 1 - row.enableState; // Toggle between 0 and 1 // 此处可以添加保存状态的逻辑,比如调用 API 更新数据 updateRowStatus(row); }; const updateRowStatus = async (row) => { try { // 假设你的后端 API 接收 PUT 请求,并且需要传递 row.id 和 row.enableState 参数 const response = await request.post('unLoadGlass/downWorkStation/updateDownWorkstation', { enableState: row.enableState, id: row.id }); console.log('Updated row status:', response.data); // 可以根据后端返回的数据进行进一步处理,比如更新本地状态等 @@ -214,78 +259,79 @@ // 处理错误情况,比如提示用户更新失败 } }; // 查询数据 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); } } // const open=async(row)=>{ // printFlowCardId.value=row.flowCardId; // printLayer.value=row.layer // dialogTableVisible.value = true; // setTimeout(() => { // printFlowCard(); // 替换成你要执行的函数名 // }, 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; // // 样式控制与打印无关的元素隐藏 // 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); // } const open = async (row) => { 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; // 样式控制与打印无关的元素隐藏 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(() => { // closeWebSocket(); // }); @@ -294,21 +340,24 @@ <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;"> <el-table height="200px" ref="table" @selection-change="handleSelectionChange" :data="tableData" :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }"> <el-table-column prop="workstationId" align="center" :label="$t('reportWork.lowerbit')" min-width="80" /> :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }"> <el-table-column prop="workstationId" align="center" :label="$t('reportWork.lowerbit')" min-width="80"/> <el-table-column prop="workstationId" align="center" :label="$t('reportWork.shelfnumber')" min-width="120" /> <el-table-column prop="flowCardId" align="center" :label="$t('reportWork.cardnumber')" min-width="150" /> min-width="120"/> <el-table-column prop="flowCardId" align="center" :label="$t('reportWork.cardnumber')" min-width="150"/> <el-table-column prop="totalQuantity" align="center" :label="$t('reportWork.totalquantity')" min-width="120" /> <el-table-column prop="racksNumber" align="center" :label="$t('reportWork.beendropped')" min-width="120" /> <el-table-column prop="layer" align="center" label="层数" min-width="120" /> <el-table-column prop="otherNumber" align="center" label="人工下片数" min-width="120" /> min-width="120"/> <el-table-column prop="racksNumber" align="center" :label="$t('reportWork.beendropped')" min-width="120"/> <el-table-column prop="layer" align="center" label="层数" min-width="120"/> <el-table-column prop="otherNumber" align="center" label="人工下片数" min-width="120"/> <!-- <el-table-column prop="work_state" align="center" :label="$t('reportWork.state')" min-width="120" /> --> <el-table-column prop="deviceId" align="center" :label="$t('reportWork.devicenumber')" min-width="120" /> <el-table-column align="center" :label="$t('reportWork.startstatus')" min-width="80" prop="enableState"> @@ -321,18 +370,19 @@ <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> <el-button @click="open(scope.row)" :disabled="scope.row.flowCardId == null">打印</el-button> </template> </el-table-column> </el-table> </div> <el-dialog v-model="dialogFormVisibleaDownGlass" top="2vh" width="97%" :title="$t('searchOrder.cageinformation')"> :title="$t('searchOrder.cageinformation')"> <el-select v-model="selectValuesa[0]" filterable :placeholder="$t('请选择工位')" clearable> <el-option label="全部" value="0"></el-option> <el-option label="1" value="1"></el-option> @@ -346,33 +396,37 @@ <el-option label="9" value="9"></el-option> <el-option label="10" value="10"></el-option> </el-select> <el-select v-model="selectValuesa[1]" filterable :placeholder="$t('basicData.plselectproject')" clearable @input="handleInputChangea($event, row.id)"> <el-option v-for="item in selectOptionsa" :key="item" :label="item" :value="item" /> @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> $t('reportmanage.inquire') }} </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" /> <el-table-column prop="engineerId" align="center" :label="$t('工程号')" min-width="80" /> <el-table-column prop="flowCardId" align="center" :label="$t('流程卡号')" min-width="80" /> <el-table-column prop="layer" align="center" :label="$t('层')" min-width="120" /> <el-table-column prop="sequence" align="center" :label="$t('顺序')" min-width="150" /> <el-table-column prop="width" align="center" :label="$t('宽')" min-width="120" /> <el-table-column prop="height" align="center" :label="$t('高')" min-width="120" /> <el-table-column prop="Filmsid" align="center" :label="$t('膜系')" min-width="120" /> <el-table-column prop="thickness" align="center" label="厚度" min-width="120" /> <el-table-column prop="glassId" align="center" :label="$t('玻璃id')" min-width="120" /> :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }"> <el-table-column prop="workStationId" align="center" :label="$t('工位号')" min-width="80"/> <el-table-column prop="engineerId" align="center" :label="$t('工程号')" min-width="80"/> <el-table-column prop="flowCardId" align="center" :label="$t('流程卡号')" min-width="80"/> <el-table-column prop="layer" align="center" :label="$t('层')" min-width="120"/> <el-table-column prop="sequence" align="center" :label="$t('顺序')" min-width="150"/> <el-table-column prop="width" align="center" :label="$t('宽')" min-width="120"/> <el-table-column prop="height" align="center" :label="$t('高')" min-width="120"/> <el-table-column prop="Filmsid" align="center" :label="$t('膜系')" min-width="120"/> <el-table-column prop="thickness" align="center" label="厚度" min-width="120"/> <el-table-column prop="glassId" align="center" :label="$t('玻璃id')" min-width="120"/> </el-table> </el-dialog> </el-card> <!-- workstationId: '1', workstationId: '1005', @@ -389,9 +443,9 @@ </div> </div> </el-card> </div> <el-dialog v-model="dialogFormVisiblea" top="21vh" width="40%" :title="$t('reportWork.bindingshelves')"> <div style="margin-left: 50px;margin-top: 10px;margin-bottom: 10px;"> <el-form size="mini" label-width="100px"> @@ -402,7 +456,7 @@ <el-form-item :label="$t('reportWork.cardnumbera')" :required="true" style="width: 25vw;"> <el-select v-model="flowCardId" :placeholder="$t('reportWork.incardnumber')"> <el-option v-for="item in flowCardOptions" :key="item.flowcard_id" :label="item.flowcard_id" :value="item.flowcard_id" /> :value="item.flowcard_id"/> </el-select> </el-form-item> </el-form> @@ -410,7 +464,7 @@ </div> <template #footer> <div id="dialog-footer"> <el-button type="primary" @click="handleConfirm"> {{ $t('reportWork.sure') }} </el-button> @@ -428,19 +482,15 @@ </div> </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" style="width: 100%;height: 100%"/> </el-dialog> --> <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> </template> <style scoped> #dt { @@ -449,19 +499,19 @@ line-height: 20px; margin-left: 100px; } #dta { display: block; float: left; line-height: 20px; margin-left: 80%; } #dialog-footer { text-align: center; margin-top: -15px; } #message { text-align: center; align-items: center; @@ -471,21 +521,21 @@ background-color: #337ecc; margin-left: 28%; } .awatch { max-width: 100%; } #main-body { margin-top: -40px; margin-left: 150px; } #main-bodya { margin-top: -40px; margin-left: 100px; } :deep(#sizePrintCalrd .el-dialog__body) { height: 85%; width: 100%; hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/controller/EdgStorageCageController.java
@@ -1,26 +1,22 @@ 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; /** * <p> * 前端控制器 * 前端控制器 * </p> * * @author zhoush @@ -40,44 +36,33 @@ @ApiOperation("查询磨边缓存理片笼内详情 参数()") @PostMapping("/selectEdgStorageCage") @ResponseBody public Result selectEdgStorageCage () { List<Map<String, Object>> list=edgStorageCageService.selectEdgStorageCages(); return Result.build(200,"成功",list); public Result selectEdgStorageCage() { 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 public Result updateEdgStorageCage(@RequestBody EdgStorageCage edgStorageCage) { String isSucess=edgStorageCageService.updateEdgStorageCage(edgStorageCage)?"成功":"失败"; return Result.build(200,"【启用/禁用】"+isSucess,1); String isSucess = edgStorageCageService.updateEdgStorageCage(edgStorageCage) ? "成功" : "失败"; return Result.build(200, "【启用/禁用】" + isSucess, 1); } @ApiOperation("磨边缓存理片笼信息 功能:对笼内栅格玻璃进行【清除/更换/绑定】 EdgStorageCage格子信息,EdgStorageCageDetails 玻璃信息 ") @PostMapping("/edgStorageCageGlass") @ResponseBody public Result edgStorageCageGlass(@RequestBody EdgStorageCageDetails edgStorageCageDetails,int edgStorageCageId) { public Result edgStorageCageGlass(@RequestBody EdgStorageCageDetails edgStorageCageDetails, int edgStorageCageId) { String isSucess=edgStorageCageService.updateEdgStorageCageDetails(edgStorageCageId,edgStorageCageDetails)?"成功":"失败"; return Result.build(200,"【清除/更换/绑定】"+isSucess,1); String isSucess = edgStorageCageService.updateEdgStorageCageDetails(edgStorageCageId, edgStorageCageDetails) ? "成功" : "失败"; 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; /** * 获取 切割当前版图 @@ -139,7 +83,7 @@ .orderByDesc(UpPattenUsage::getId)); if (!upPattenUsage.isEmpty()) { UpPattenUsage upPattenUsage1 = upPattenUsage.get(0); List<Map<String, Object>> cutTerritorys=optimizeDetailMapper.selectJoinMaps(JoinWrappers.lambda(OptimizeDetail.class) List<Map<String, Object>> cutTerritorys = optimizeDetailMapper.selectJoinMaps(JoinWrappers.lambda(OptimizeDetail.class) .selectAll(OptimizeDetail.class) .selectAs(OptimizeLayout::getWidth, "olWidth") .selectAs(OptimizeLayout::getHeight, "olHeight") @@ -149,17 +93,17 @@ .eq(OptimizeDetail::getProjectNo, upPattenUsage1.getEngineeringId()) .eq(OptimizeDetail::getStockId, upPattenUsage1.getLayoutSequence()) ); List<Map<String, Object>> ResultcutTerritorys=new ArrayList<>(); List<Map<String, Object>> ResultcutTerritorys = new ArrayList<>(); for (Map<String, Object> cutTerritory : cutTerritorys) { EdgStorageCageDetails edgStorageCageDetails=baseMapper.selectOne(new MPJLambdaQueryWrapper<EdgStorageCageDetails>() EdgStorageCageDetails edgStorageCageDetails = baseMapper.selectOne(new MPJLambdaQueryWrapper<EdgStorageCageDetails>() .selectAll(EdgStorageCageDetails.class) .eq(EdgStorageCageDetails::getGlassId, cutTerritory.get("glass_id")) .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN)); // log.info("内容:{}-------{}",cutTerritory,edgStorageCageDetails); if(edgStorageCageDetails!=null){ cutTerritory.put("glass_state",edgStorageCageDetails.getState()); }else{ cutTerritory.put("glass_state",0); if (edgStorageCageDetails != null) { cutTerritory.put("glass_state", edgStorageCageDetails.getState()); } else { cutTerritory.put("glass_state", 0); } ResultcutTerritorys.add(cutTerritory); } @@ -185,9 +129,9 @@ @Override public List<List<Map<String, Object>>> selectCurrentCutTerritory(String current) { //结果 List<Map<String, Object>> ResultcutTerritorys=new ArrayList<>(); List<Map<String, Object>> ResultcutTerritorys = new ArrayList<>(); //此工程的所有优化数据 List<Map<String, Object>> cutTerritorys=optimizeDetailMapper.selectJoinMaps(JoinWrappers.lambda(OptimizeDetail.class) List<Map<String, Object>> cutTerritorys = optimizeDetailMapper.selectJoinMaps(JoinWrappers.lambda(OptimizeDetail.class) .selectAll(OptimizeDetail.class) .selectAs(OptimizeLayout::getWidth, "olWidth") .selectAs(OptimizeLayout::getHeight, "olHeight") @@ -197,24 +141,24 @@ .eq(OptimizeDetail::getProjectNo, current) ); Map<String, EdgStorageCageDetails> edgMaps=baseMapper.selectList(new MPJLambdaQueryWrapper<EdgStorageCageDetails>() Map<String, EdgStorageCageDetails> edgMaps = baseMapper.selectList(new MPJLambdaQueryWrapper<EdgStorageCageDetails>() .selectAll(EdgStorageCageDetails.class) .eq(EdgStorageCageDetails::getEngineerId,current) .eq(EdgStorageCageDetails::getEngineerId, current) .eq(EdgStorageCageDetails::getState, Const.GLASS_STATE_IN) ).stream().collect(Collectors.toMap(EdgStorageCageDetails::getGlassId,EdgStorageCageDetails->EdgStorageCageDetails)); ).stream().collect(Collectors.toMap(EdgStorageCageDetails::getGlassId, EdgStorageCageDetails -> EdgStorageCageDetails)); for (Map<String, Object> cutTerritory : cutTerritorys) { // log.info("内容:{}-------{}",cutTerritory,edgStorageCageDetails); if(cutTerritory.get("glass_id")==null||"".equals(cutTerritory.get("glass_id"))){ log.info("优化数据中glassId存在空值-----内容:{}",cutTerritorys); if (cutTerritory.get("glass_id") == null || "".equals(cutTerritory.get("glass_id"))) { log.info("优化数据中glassId存在空值-----内容:{}", cutTerritorys); return new ArrayList<>(); }else if(edgMaps.get(cutTerritory.get("glass_id"))!=null){ cutTerritory.put("glass_state",edgMaps.get(cutTerritory.get("glass_id")).getState()); }else{ cutTerritory.put("glass_state",0); } else if (edgMaps.get(cutTerritory.get("glass_id")) != null) { cutTerritory.put("glass_state", edgMaps.get(cutTerritory.get("glass_id")).getState()); } else { cutTerritory.put("glass_state", 0); } ResultcutTerritorys.add(cutTerritory); } Map<String, List<Map<String, Object>>> groupBy=ResultcutTerritorys.stream().collect(Collectors.groupingBy(item->item.get("stock_id").toString())); Map<String, List<Map<String, Object>>> groupBy = ResultcutTerritorys.stream().collect(Collectors.groupingBy(item -> item.get("stock_id").toString())); // List<List<Map<String, Object>>> Result=groupBy.values().stream().collect(Collectors.toList()); return new ArrayList<>(groupBy.values()); //Sql版本 @@ -313,22 +257,49 @@ EdgStorageCageDetails outEdgStorageCageDetails = null; // if (queryMaxMinDiff(threshold)) //todo:逻辑1:获取两条线已出最后一块玻璃在笼内相同尺寸所剩数量,优先走数量少的线 //todo:需要在卧式理片笼详情表中新增状态,用来表示玻璃进出理片笼情况 if (oldEdgStorageCageDetails != null && minTemperingLayoutId != null) { log.info("按照上一片已出玻璃宽度{},高度{},及版图id区间{}到{}获取出片任务玻璃信息", oldEdgStorageCageDetails.getWidth() , oldEdgStorageCageDetails.getHeight(), minTemperingLayoutId.getTemperingLayoutId(), minTemperingLayoutId.getTemperingLayoutId() + threshold); outEdgStorageCageDetails = this.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() .notIn(CollectionUtils.isNotEmpty(glassIds), EdgStorageCageDetails::getGlassId, glassIds) .eq(EdgStorageCageDetails::getWidth, oldEdgStorageCageDetails.getWidth()) .eq(EdgStorageCageDetails::getHeight, oldEdgStorageCageDetails.getHeight()) .orderByAsc(EdgStorageCageDetails::getTemperingLayoutId, EdgStorageCageDetails::getTemperingFeedSequence) .last("limit 1")); log.info("出片任务的玻璃信息:{}", outEdgStorageCageDetails); } //todo:逻辑1:获取两条线已出最后一块玻璃在笼内相同尺寸所剩数量,优先走数量少的线 //todo:需要在卧式理片笼详情表中新增状态,用来表示玻璃进出理片笼情况 if (oldEdgStorageCageDetails != null && minTemperingLayoutId != null) { log.info("按照上一片已出玻璃宽度{},高度{},及版图id区间{}到{}获取出片任务玻璃信息", oldEdgStorageCageDetails.getWidth() , oldEdgStorageCageDetails.getHeight(), minTemperingLayoutId.getTemperingLayoutId(), minTemperingLayoutId.getTemperingLayoutId() + threshold); outEdgStorageCageDetails = this.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>() .notIn(CollectionUtils.isNotEmpty(glassIds), EdgStorageCageDetails::getGlassId, glassIds) .eq(EdgStorageCageDetails::getWidth, oldEdgStorageCageDetails.getWidth()) .eq(EdgStorageCageDetails::getHeight, oldEdgStorageCageDetails.getHeight()) .orderByAsc(EdgStorageCageDetails::getTemperingLayoutId, EdgStorageCageDetails::getTemperingFeedSequence) .last("limit 1")); log.info("出片任务的玻璃信息:{}", outEdgStorageCageDetails); } if (outEdgStorageCageDetails == null) { outEdgStorageCageDetails = minTemperingLayoutId; } 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; @@ -13,11 +12,9 @@ import java.util.List; import java.util.Map; import static com.mes.job.CacheGlassTask.engineerId; /** * <p> * 前端控制器 * 前端控制器 * </p> * * @author zhoush @@ -32,8 +29,6 @@ private EdgStorageCageDetailsService edgStorageCageDetailsService; @Autowired private EdgStorageCageService edgStorageCageService; @Autowired private TaskCacheService taskCacheService; @ApiOperation("查询切割版图信息-根据 工程号 参数(工程号)") @@ -42,34 +37,31 @@ public Result cutTerritory(String current) { //engineerId=current; List<List<Map<String, Object>>> h = edgStorageCageDetailsService.selectCurrentCutTerritory(current); return Result.build(200,"成功",h); return Result.build(200, "成功", h); } @ApiOperation("识别显示 当前版图 参数()") @PostMapping("/currentCutTerritory") @ResponseBody public Result currentCutTerritory() { List<Map<String, Object>> h = edgStorageCageDetailsService.selectCutTerritory(); return Result.build(200,"成功",h); 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("磨边任务 参数()") @PostMapping("/selectEdgTask") @ResponseBody public Result selectEdgTask(@RequestBody Map<String, String> arguments) { String line=arguments.get("line"); List<Map<String,Object>> EdgTasks = taskCacheService.selectEdgInfo(line); return Result.build(200,"成功",EdgTasks); String line = arguments.get("line"); List<Map<String, Object>> EdgTasks = taskCacheService.selectEdgInfo(line); return Result.build(200, "成功", EdgTasks); } } 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") @@ -77,9 +81,8 @@ // 调用 DownWorkstationService 中的方法清除指定工位ID的信息 int workstationId = (int) requestData.get("workstationId"); downWorkstationService.clearFlowCardId(workstationId); return Result.build(200, "清除工位信息成功", 1); downWorkstationService.clearFlowCardId(workstationId); 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) {