UI-Project/src/views/PurchaseReturn/purchaseReturn.vue
@@ -500,7 +500,7 @@ } function getRectColor2(state) { switch (state) { case 2: case 2: return 'lightblue'; case 8: return '#911005'; UI-Project/src/views/PurchaseReturn/purchaseStorage.vue
@@ -1,43 +1,166 @@ <script setup> import {onBeforeUnmount, onMounted, onUnmounted, ref} from "vue"; <template> <div style="height: 500px;"> <div style="display: flex;"> <el-input v-model="engineerId" style="margin-left: 15px;margin-top: 10px;width: 240px" :placeholder="$t('order.projectnumber')" @blur="handleBlur"/> <el-button type="primary" style="margin-left: 10px;margin-top: 10px;" @click="sethistorical()">{{$t('reportmanage.inquire')}}</el-button> <el-pagination v-model:current-page="currentPage" :page-size="pageSize" :size="size" :disabled="disabled" layout="prev, pager, next, jumper" :total="totalPages" @current-change="handleCurrentChange" style="margin-top: 10px;" /> </div> <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;" v-loading="loading"> <el-scrollbar height="750px" width="1400px" style="background-color: #e9e9eb;"> <div style="position: relative;"> <div v-for="(rect, index) in adjustedRects" :key="rect.glassId" class="rect" @click="showDialog(rect.glassId)" :style="{ position: 'absolute', top: `${rect.y}px`, left: `${rect.x}px`, width: `${rect.width}px`, height: `${rect.height}px`, backgroundColor: rect.isActive ? '#ADFF2F' : getRectColor(rect.state) }" > <div class="centered-text"> <div style="font-size: 20px;font-weight: bold;">{{ rect.glassId }}</div> <div style="font-size: 20px;font-weight: bold;">{{ rect.flowCardId }}</div> <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div> </div> </div> </div> </el-scrollbar> <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose"> <el-button :disabled="currentGlassRect?.state === 8 || currentGlassRect?.state === 9" type="warning" plain :icon="Delete" @click="handleDamage(currentGlassId)" style="width: 140px;margin-left: 10px;"> {{ $t('order.dilapidation') }} </el-button> <el-button :disabled="currentGlassRect?.state === 9 || currentGlassRect?.state === 8" type="danger" plain @click="handleManualTake(currentGlassId)" style="width: 140px;margin-top: 10px;"> <el-icon class="el-icon--right"> <Upload/> </el-icon> {{ $t('order.takeaway') }} </el-button> </el-dialog> </el-card> </div> </template> <script setup lang="ts"> import {ElMessage} from 'element-plus' import {computed, onMounted, onUnmounted, ref} from 'vue'; import request from "@/utils/request" import {host, WebSocketHost} from '@/utils/constants' import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService'; const adjustedRects = ref([]); const currentGlassId = ref(null); const currenttemperingFeedSequence = ref(null); const currentRect = ref(null); const canSelectProject = ref(true); const dialogFormVisible = ref(true) const dialogFormVisiblea = ref(false) import {useI18n} from 'vue-i18n' const {t} = useI18n() let language = ref(localStorage.getItem('lang') || 'zh') const blind = ref(false) const getTableRow = (row,type) =>{ switch (type) { case 'edit' :{ router.push({path: '/main/returns/createReturns', query: { ReturnID: 'TH24010101' }}) break const engineerId = ref(); const currentGlassId = ref(null); const currentstate = ref(null); const adjustedRects = ref([]); const raw = ref([]); let webSocket: WebSocket | null = null; const totalPages = ref(0); const pageSize = ref(1); const currentPage = ref(''); const disabled = false; const size = 'small'; const rawData = ref([]); // 显示对话框并设置当前 glassId const currentGlassRect = computed(() => { return adjustedRects.value.find(rect => rect.glassId === currentGlassId.value); }); function showDialog(glassId: number) { currentGlassId.value = glassId; blind.value = true; adjustedRects.value = adjustedRects.value.map(rect => rect.glassId === glassId ? { ...rect, isActive: true } : rect ); } const handleDialogClose = () => { adjustedRects.value = adjustedRects.value.map(rect => ({ ...rect, isActive: false })); } // 破损 const handleDamage = async () => { try { const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', { glassId: currentGlassId.value, line: 4001, state: 8, workingProcedure: '钢化', }) if (response.code == 200) { ElMessage.success(response.message); blind.value = false; updateRectStatus(currentGlassId.value, 8); } else { ElMessage.error(response.msg); } case 'delete':{ break } } catch (error) { // 处理错误 console.error(error); } } let socket = null; const socketUrl = `ws://${WebSocketHost}:${host}/api/temperingGlass/api/talk/temperingGlass`; const handleMessage = (data) => { if (data.overGlass && data.overGlass.length > 0) { // 提取新的矩形ID const newGlassIds = new Set(data.overGlass[0].map(rect => rect.glassId)); // 过滤出已存在的矩形 const existingRects = adjustedRects.value.filter(rect => newGlassIds.has(rect.glassId)); // 计算新的矩形 const newRects = data.overGlass[0].map(rect => { const scaleFactor = 1390/5190; // 人工拿走 const handleManualTake = async () => { try { const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', { glassId: currentGlassId.value, line: 4001, state: 9, workingProcedure: '钢化', }) if (response.code == 200) { ElMessage.success(response.message); blind.value = false; updateRectStatus(currentGlassId.value, 9); } else { ElMessage.error(response.msg); } } catch (error) { console.error(error); } } const sethistorical = async () => { search() fetchTableData() } const fetchTableData = async () => { try { const response = await request.post("/temperingGlass/temperingGlassInfo/selectTempering", { engineerId: engineerId.value, }) if (response.code === 200) { totalPages.value = response.data.id; } } catch (error) { ElMessage.error(response.message); } }; const search = async () => { const response = await request.post('/temperingGlass/temperingGlassInfo/selectTemperingGlass', { engineerId: engineerId.value, temperingLayoutId: 1 }) if (response.code === 200) { const scaleFactor = 1621.78/6000; const scaleFactory = 750/2800; const adjustedRectsData = response.data.map(rect => { const scaleFactor = 1621.78/6000; const scaleFactorY = 750/2800; let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta; let newX = rect.yCoordinate; let adjustedWidth, adjustedHeight,widtha,heighta;; let newX = rect.ycoordinate; if (rect.width < rect.height) { widtha = rect.height; heighta = rect.width; @@ -45,168 +168,136 @@ widtha = rect.width; heighta = rect.height; } if (rect.angle === 0) { if (rect.angle === 0) { adjustedWidth = widtha * scaleFactor; adjustedHeight = heighta * scaleFactorY; } else { adjustedHeight = heighta * scaleFactorY; newX = 6000 - (rect.ycoordinate + widtha); } else { adjustedWidth = heighta * scaleFactor; adjustedHeight = widtha * scaleFactorY; newX = 6000 - (rect.ycoordinate + heighta); } return { ...rect, xcoordinate: newX * scaleFactor, ycoordinate: rect.xCoordinate * scaleFactorY, x: newX * scaleFactor, y: rect.xcoordinate* scaleFactorY, width: adjustedWidth, height: adjustedHeight, widtha: rect.width, heighta: rect.height, } }); // 合并新旧矩形,并保留 isActive 状态 adjustedRects.value = existingRects.map(oldRect => { const newRect = newRects.find(r => r.glassId === oldRect.glassId); if (newRect) { return { ...oldRect, ...newRect, isActive: oldRect.isActive }; } return oldRect; // 如果旧矩形在新数据中不存在,但保留在newGlassIds中,则保留原样 }).concat(newRects.filter(r => !existingRects.some(o => o.glassId === r.glassId))); } else if (data.overGlass == null) { adjustedRects.value = [] } adjustedRects.value = adjustedRectsData; currentPage.value = 1; } }; function updateRectColors() { const handleCurrentChange = async(val: number) => { currentPage.value = val; console.log(currentPage.value); const response = await request.post('/temperingGlass/temperingGlassInfo/selectTemperingGlass', { engineerId: engineerId.value, temperingLayoutId: currentPage.value }) if (response.code === 200) { const scaleFactor = 1621.78/6000; const scaleFactory = 750/2800; const adjustedRectsData = response.data.map(rect => { const scaleFactor = 1621.78/6000; const scaleFactorY = 750/2800; let adjustedWidth, adjustedHeight,widtha,heighta;; let newX = rect.ycoordinate; if (rect.width < rect.height) { widtha = rect.height; heighta = rect.width; }else { widtha = rect.width; heighta = rect.height; } if (rect.angle === 0) { adjustedWidth = widtha * scaleFactor; adjustedHeight = heighta * scaleFactorY; newX = 6000 - (rect.ycoordinate + widtha); } else { adjustedWidth = heighta * scaleFactor; adjustedHeight = widtha * scaleFactorY; newX = 6000 - (rect.ycoordinate + heighta); } return { ...rect, x: newX * scaleFactor, y: rect.xcoordinate* scaleFactorY, width: adjustedWidth, height: adjustedHeight, widtha: rect.width, heighta: rect.height, } }); adjustedRects.value = adjustedRectsData; } }; function getRectColor(state: number): string { switch (state) { case -1: return '#CDAF95'; case 0: return '#7AC5CD'; case 1: return '#95d475'; case 2: return 'lightblue'; case 3: return '#eebe77'; case 4: return '#CD6090'; case 8: return '#911005'; case 9: return '#4682B4'; } } // 更新矩形状态 function updateRectStatus(glassId: string, status: number) { adjustedRects.value.forEach(rect => { if (rect.glassId === glassId) { rect.state = 8; } rect.state = status; // 更新矩形的状态 } }); } function getRectColora(state) { switch (state) { case 3: return '#eebe77'; case 4: return '#CD6090'; case 8: return '#911005'; } } function showDialog(rect) { const index = adjustedRects.value.findIndex(r => r.glassId === rect.glassId); if (index !== -1) { adjustedRects.value[index].isActive = true; } currentGlassId.value = rect.glassId; currenttemperingFeedSequence.value = rect.temperingFeedSequence; blind.value = true; currentRect.value = rect; if (currentRect.value.state == 8) { canSelectProject.value = false; } else if (currentRect.value.state !== 8) { canSelectProject.value = true; } } const handleDialogClose = () => { adjustedRects.value.forEach(rect => { rect.isActive = false; }); blind.value = false; }; // 破损 const handleDamage = async () => { try { const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', { glassId: currentGlassId.value, line: 4001, status: 8, workingProcedure: '钢化', }) if (response.code == 200) { ElMessage.success(response.message); blind.value = false; updateRectColors(); } else { ElMessage.error(response.message); } } catch (error) { console.error(error); } } onMounted(() => { socket = initializeWebSocket(socketUrl, handleMessage); }); onUnmounted(() => { if (socket) { closeWebSocket(socket); } }); onBeforeUnmount(() => { console.log("关闭了") closeWebSocket(); }); </script> <template> <div style="height: 500px;"> <div style="margin-top: 10px;"> <div> <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;" v-loading="loading"> <div v-if="adjustedRects.length > 0"> <div style="text-align: center;">炉号:{{ adjustedRects[0].engineerId }}-{{ adjustedRects[0].temperingLayoutId }} </div> <el-scrollbar height="750px" width="1400px" style="background-color: #e9e9eb;"> <div style="position: relative;"> <div v-for="(rect, index) in adjustedRects" :key="index" @click="showDialog(rect)" class="rect" :style="{ position: 'absolute', top: `${rect.ycoordinate}px`, left: `${rect.xcoordinate}px`, width: `${rect.width}px`, height: `${rect.height}px`, backgroundColor: rect.isActive ? '#ADFF2F' : getRectColora(rect.state) }"> <div class="centered-text"> <div style="font-size: 15px;font-weight: bold;">{{ rect.glassId }}</div> <div style="font-size: 15px;font-weight: bold;">{{ rect.flowCardId }}</div> <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div> </div> </div> </div> </el-scrollbar> </div> </el-card> </div> <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose"> <el-button :disabled="!canSelectProject" type="warning" plain :icon="Delete" @click="handleDamage" style="width: 140px;margin-left: 10px;"> {{ $t('order.dilapidation') }} </el-button> </el-dialog> </div> </div> </template> <style scoped> #boxa{ border: 1px solid rgb(119, 116, 116); background-color: #529b2e; text-align: center; display: inline-block; margin-left: 20px; margin-top: 70px; margin-bottom: 50px; } </script> <style scoped> .rect { border: 1px solid black; /* 设置矩形的边框 */ background-color: lightblue; } .centered-text { /* display: flex; */ justify-content: center; align-items: center; height: 100%; font-size: small; } justify-content: center; align-items: center; height: 100%; /* font-size: large; */ } #rect { position: relative; /* 确保箭头可以相对于矩形定位 */ } #arrow { position: absolute; top: 70%; /* 箭头位于矩形中间 */ left: 200px; /* 箭头在矩形左侧一些距离 */ transform: translateY(-50%); /* 垂直居中 */ width: 0; height: 0; border-top: 10px solid transparent; /* 上边框 */ border-bottom: 10px solid transparent; /* 下边框 */ border-right: 20px solid #911005; /* 右边框,形成箭头 */ } #line { position: absolute; top: 70%; /* 直线位于矩形中间 */ left: 210px; /* 直线在箭头右侧一些距离 */ transform: translateY(-50%); /* 垂直居中 */ height: 2px; /* 直线的高度 */ width: 240px; /* 直线的长度,根据需要调整 */ background-color: #911005; /* 直线的颜色 */ } </style> UI-Project/src/views/StockBasicData/stockBasicData.vue
@@ -115,6 +115,26 @@ closeWebSocket(socket); } }); function getStatusTypeb(state) { switch (state) { case 0: return 'info'; case 1: return 'success'; case 1: return 'danger'; } } function getStatusTextb(state) { switch (state) { case 0: return t('workOrder.nedging'); case 1: return t('workOrder.edging'); case 2: return t('workOrder.finedging'); } } onBeforeUnmount(() => { console.log("关闭了") closeWebSocket(); @@ -127,8 +147,8 @@ <div style="display: flex;"> <el-select v-model="selectValuesa[0]" filterable :placeholder="$t('workOrder.cway')" clearable style="margin-left: 20px;margin-bottom: 10px;"> <el-option :label="$t('workOrder.edgingone')" value="2001"></el-option> <el-option :label="$t('workOrder.edgingtwo')" value="2002"></el-option> <el-option :label="$t('workOrder.edgingone')" value="930"></el-option> <el-option :label="$t('workOrder.edgingtwo')" value="931"></el-option> </el-select> <el-select v-model="selectValuesa[1]" filterable :placeholder="$t('workOrder.cstate')" clearable style="margin-left: 20px;margin-bottom: 10px;"> @@ -154,10 +174,15 @@ <el-table-column prop="thickness" align="center" :label="$t('workOrder.thickness')" min-width="120" /> <el-table-column prop="glassType" align="center" :label="$t('workOrder.glasstype')" min-width="120" /> <el-table-column prop="line" align="center" :label="$t('workOrder.line')" min-width="120" /> <el-table-column prop="status" :label="$t('workOrder.status')" align="center" width="200"> <template #default="scope"> <el-table-column prop="state" :label="$t('workOrder.status')" align="center" width="200"> <!-- <template #default="scope"> {{ scope.row.status==0?"未磨边":scope.row.status==1?"磨边中":"已磨边" }} </template> </template> --> <template #default="scope"> <el-tag :type="getStatusTypeb(scope.row.state)"> {{ getStatusTextb(scope.row.state) }} </el-tag> </template> </el-table-column> <el-table-column fixed="right" :label="$t('workOrder.operate')" align="center" width="200"> <template #default="scope"> UI-Project/src/views/hollow/hollowequipment.vue
@@ -1096,8 +1096,8 @@ const allPageData = data; const currentPageKeyValue = currentPageKey.value; const currentPageData = allPageData[currentPageKeyValue]; if (data.free0neReguestEntity != null) { freeone.value = data.free0neReguestEntity == 1 ? 'green' : '#911005'; if (data.freeOneRequestEntity != null) { freeone.value = data.freeOneRequestEntity == 1 ? 'green' : '#911005'; } // if (currentPageData && Array.isArray(currentPageData) && currentPageData.length > 0) { // tableDataa.value = currentPageData[0]; UI-Project/src/views/hollow/hollowequipmenttwo.vue
@@ -30,35 +30,8 @@ </div> <div id="dotClass"> <!-- <div style="margin-bottom: -5px;margin-left: 5px;"> --> <!-- <el-form> --> <!-- <el-row> --> <!-- <el-col :span="4"> <div style="font-size: 15px;"> <el-form-item :label="$t('hellow.currenttask')" style="width: 14vw"> {{ temperingtotal }} </el-form-item> </div> </el-col> --> <!-- <el-col :span="5"> <div style="font-size: 15px;"> <el-form-item :label="$t('hellow.claimednumber')" style="width: 14vw"> {{ glasstotal }} </el-form-item> </div> </el-col> --> <!-- <el-col :span="4"> <div style="font-size: 15px;"> <el-form-item :label="$t('hellow.linenumber')" style="width: 14vw"> {{ fulltotals }} </el-form-item> </div> </el-col> --> <div style="margin-left: 70px;">{{ $t('hellow.freetwo') }}</div> <i :style="{ marginTop: '2px', backgroundColor: freetwo, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i> <!-- </el-row> --> <!-- </el-form> --> <!-- </div> --> </div> <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;"> <el-table height="650" ref="table" :data="tableDataa" @@ -598,8 +571,8 @@ const allPageData = data; const currentPageKeyValue = currentPageKey.value; const currentPageData = allPageData[currentPageKeyValue]; if (data.freeTwoReqvestEntity != null) { freetwo.value = data.freeTwoReqvestEntity[0] == true ? 'green' : '#911005'; if (data.freeTwoRequestEntity != null) { freetwo.value = data.freeTwoRequestEntity[0] == true ? 'green' : '#911005'; } // if (currentPageData && Array.isArray(currentPageData) && currentPageData.length > 0) { // tableDataa.value = currentPageData[0]; UI-Project/src/views/hollow/hollowslicecage.vue
@@ -309,14 +309,14 @@ if (data.outInkageEntity != null) { outInkageEntity.value = data.outInkageEntity[0] == true ? 'green' : '#911005'; } if (data.freeTwoReqvestEntity != null) { freetwo.value = data.freeTwoReqvestEntity[0] == true ? 'green' : '#911005'; if (data.freeTwoRequestEntity != null) { freetwo.value = data.freeTwoRequestEntity[0] == true ? 'green' : '#911005'; } if (data.outRequestEntity != null) { outRequestEntity.value = data.outRequestEntity == 1 ? 'green' : '#911005'; } if (data.free0neReguestEntity != null) { freeone.value = data.free0neReguestEntity == 1 ? 'green' : '#911005'; if (data.freeOneRequestEntity != null) { freeone.value = data.freeOneRequestEntity == 1 ? 'green' : '#911005'; } if(data.bigStorageCageDetailsOutTask!=null){ tableDatac.value = data.bigStorageCageDetailsOutTask[0] UI-Project/src/views/largescreendisplay/screendisplay.vue
@@ -13,7 +13,6 @@ const {t} = useI18n() let language = ref(localStorage.getItem('lang') || 'zh') const tableData = ref([]) const timeRange = ref([]) let socket = null; const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/edgTasks`; const handleMessage = (data) => { @@ -51,7 +50,7 @@ const endTime = dayjs().startOf('minute'); // 当前时间,精确到分钟 const startTime = endTime.subtract(1, 'day').startOf('minute'); // 当前时间的前一天,精确到分钟 // 设置时间范围为 [开始时间, 结束时间] timeRange.value = [startTime.format('YYYY-MM-DD HH:mm:ss'), endTime.format('YYYY-MM-DD HH:mm:ss')]; // timeRange.value = [startTime.format('YYYY-MM-DD HH:mm:ss'), endTime.format('YYYY-MM-DD HH:mm:ss')]; }); // onMounted(() => { // socket = initializeWebSocket(socketUrl, handleMessage); @@ -121,12 +120,12 @@ :value="item.value" /> </el-select> <span class="demonstration" style="margin-left: 20px;margin-top: 3px;">{{ $t('workOrder.time') }}</span> <!-- <span class="demonstration" style="margin-left: 20px;margin-top: 3px;">{{ $t('workOrder.time') }}</span> --> <!-- <el-date-picker v-model="timeRange" type="datetimerange" range-separator="至" :start-placeholder="$t('reportmanage.starttime')" style="margin-left: 15px;" value-format = "YYYY-MM-DD hh:mm:ss" :end-placeholder="$t('reportmanage.endtime')"> </el-date-picker> --> <el-date-picker <!-- <el-date-picker v-model="timeRange" type="datetimerange" range-separator="至" @@ -134,7 +133,7 @@ style="margin-left: 15px;" value-format="YYYY-MM-DD hh:mm:ss" :end-placeholder="$t('reportmanage.endtime')"> </el-date-picker> </el-date-picker> --> <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="sethistorical()">{{ $t('reportmanage.inquire') }}</el-button> hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/vo/BigStorageVO.java
@@ -11,6 +11,8 @@ @Data public class BigStorageVO { @ApiModelProperty(value = "笼子号") private int deviceId; @ApiModelProperty(value = "格子号") private int slot; @ApiModelProperty(value = "数量") hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/entity/dto/RawGlassStorageDetailsDTO.java
New file @@ -0,0 +1,52 @@ package com.mes.rawglassdetails.entity.dto; import lombok.Data; /** * @Author : zhoush * @Date: 2024/9/20 16:31 * @Description: */ @Data public class RawGlassStorageDetailsDTO { /** * 原片宽 */ private Double patternWidth; /** * 原片高 */ private Double patternHeight; /** * 原片厚度 */ private Double patternThickness; /** * 膜系 */ private String filmsId; /** * 总原片数 */ private Integer totalCount; /** * 笼内片数 */ private String count; /** * 上片片数 */ private String finishCount; /** * 破损片数 */ private String damageCount; } hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/mapper/RawGlassStorageDetailsMapper.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.mes.rawglassdetails.entity.RawGlassStorageDetails; import com.mes.rawglassdetails.entity.dto.RawGlassStorageDetailsDTO; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -24,4 +25,6 @@ * @return */ List<RawGlassStorageDetails> listBySlotState(@Param("leftingStation") List<Integer> liftingStation, @Param("state") List<Integer> state); List<RawGlassStorageDetailsDTO> patternUsage(@Param("width") String width, @Param("height") String height, @Param("thickness") String thickness, @Param("films") String films); } hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/RawGlassStorageDetailsService.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.mes.rawglassdetails.entity.RawGlassStorageDetails; import com.mes.rawglassdetails.entity.dto.RawGlassStorageDetailsDTO; import com.mes.rawglassdetails.entity.request.RawGlassRequest; import java.util.List; @@ -44,4 +45,6 @@ boolean generateTask(int startSlot, int endSlot, int shelf, int patternQuantity, int taskType) throws Exception; String shelfReset(Long slot); List<RawGlassStorageDetailsDTO> patternUsage(String width, String height, String thickness, String films); } hangzhoumesParent/common/servicebase/src/main/java/com/mes/rawglassdetails/service/impl/RawGlassStorageDetailsServiceImpl.java
@@ -8,6 +8,7 @@ import com.kangaroohy.milo.service.MiloService; import com.mes.common.config.Const; import com.mes.rawglassdetails.entity.RawGlassStorageDetails; import com.mes.rawglassdetails.entity.dto.RawGlassStorageDetailsDTO; import com.mes.rawglassdetails.entity.request.RawGlassRequest; import com.mes.rawglassdetails.mapper.RawGlassStorageDetailsMapper; import com.mes.rawglassdetails.service.RawGlassStorageDetailsService; @@ -212,4 +213,9 @@ //生成一条详情数据 仅记录架子状态 return "success"; } @Override public List<RawGlassStorageDetailsDTO> patternUsage(String width, String height, String thickness, String films){ return baseMapper.patternUsage(width, height, thickness, films); } } hangzhoumesParent/common/servicebase/src/main/resources/mapper/RawGlassStorageDetailsMapper.xml
@@ -6,6 +6,17 @@ <result column="DEVICE_ID" property="deviceId"/> <result column="SLOT" property="slot"/> </resultMap> <resultMap id="RawGlassStorageDetailsDTO" type="com.mes.rawglassdetails.entity.dto.RawGlassStorageDetailsDTO"> <result property="patternWidth" column="pattern_width"/> <result property="patternHeight" column="pattern_height"/> <result property="patternThickness" column="pattern_thickness"/> <result property="filmsId" column="films_id"/> <result property="count" column="count"/> <result property="finishCount" column="finishCount"/> <result property="damageCount" column="damageCount"/> <!-- 如果有其他字段,请继续添加 --> </resultMap> <select id="listBySlotState" resultMap="baseMap"> SELECT @@ -27,4 +38,32 @@ </foreach> AND T1.SLOT IS NULL </select> <select id="listBySlotState" resultMap="RawGlassStorageDetailsDTO"> select rgsd.pattern_width, rgsd.pattern_height, rgsd.pattern_thickness, rgsd.films_id, rgsd.count + sum(lgdth.finish_count) + sum(damage_count), rgsd.count, sum(lgdth.finish_count) as finishCount, sum(damage_count) as damageCount from (select pattern_width, pattern_height, pattern_thickness, films_id, sum(case when state = 100 then remain_quantity else 0 end) as count from raw_glass_storage_details group by pattern_width, pattern_height, pattern_thickness, films_id) as rgsd left JOIN load_glass_device_task_history as lgdth on rgsd.pattern_width = lgdth.raw_glass_width and rgsd.pattern_height = lgdth.raw_glass_height and rgsd.pattern_thickness = lgdth.raw_glass_thickness and rgsd.films_id = lgdth.raw_glass_films_id where rgsd.pattern_width like "%#{processId}%" and rgsd.pattern_height like "%#{pattern_height}%" and rgsd.pattern_thickness like "%#{pattern_thickness}%" and rgsd.films_id like "%#{films_id}%" group by rgsd.pattern_width, rgsd.pattern_height, rgsd.pattern_thickness, rgsd.films_id </select> </mapper> hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java
@@ -102,8 +102,7 @@ patternSequence = lastGlass.getPatternSequence() + 1; } else { //当前版图是否有剩余,有剩余显示当前版图 patternSequence = lastGlass.getPatternSequence(); } patternSequence = lastGlass.getPatternSequence(); } } return baseMapper.queryCutDrawingByEngineerId(engineering.getEngineerId(), patternSequence, 0); } hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/PushMessageToIndex.java
@@ -9,6 +9,8 @@ import com.mes.edgstoragecage.entity.vo.EdgStorageCageVO; import com.mes.edgstoragecage.service.EdgStorageCageDetailsService; import com.mes.edgstoragecage.service.EdgStorageCageService; import com.mes.engineering.entity.Engineering; import com.mes.engineering.service.EngineeringService; import com.mes.opctask.entity.EdgStorageDeviceTask; import com.mes.opctask.entity.EdgStorageDeviceTaskHistory; import com.mes.opctask.service.EdgStorageDeviceTaskHistoryService; @@ -22,6 +24,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.CompletionStage; /** * @Author : zhoush @@ -42,6 +45,8 @@ EdgStorageDeviceTaskService edgStorageDeviceTaskService; @Resource EdgStorageDeviceTaskHistoryService edgStorageDeviceTaskHistoryService; @Resource EngineeringService engineeringService; private static final String EDG_STORAGE_DEVICE_ONE_TASK = "edg_storage_device_one_task"; @@ -143,4 +148,47 @@ } } } @Scheduled(fixedDelay = 1000) public void largenScreen() { JSONObject jsonObject = new JSONObject(); //磨边信息 List<EdgStorageDeviceTaskHistory> edgOneTasks = edgStorageDeviceTaskHistoryService.list( new LambdaQueryWrapper<EdgStorageDeviceTaskHistory>() .eq(EdgStorageDeviceTaskHistory::getDeviceId, 1) .eq(EdgStorageDeviceTaskHistory::getTaskState, Const.EDG_GLASS_BEFORE) ); List<EdgStorageDeviceTaskHistory> edgTwoTasks = edgStorageDeviceTaskHistoryService.list( new LambdaQueryWrapper<EdgStorageDeviceTaskHistory>() .eq(EdgStorageDeviceTaskHistory::getDeviceId, 1) .eq(EdgStorageDeviceTaskHistory::getTaskState, Const.EDG_GLASS_BEFORE) ); jsonObject.append("edgOneTasks", edgOneTasks); jsonObject.append("edgOneTasks", edgTwoTasks); List<Engineering> engineeringOne = engineeringService.list( new LambdaQueryWrapper<Engineering>() .eq(Engineering::getStationCell, 5) ); List<Engineering> engineeringTow = engineeringService.list( new LambdaQueryWrapper<Engineering>() .eq(Engineering::getStationCell, 6) ); jsonObject.append("engineeringOne", engineeringOne); jsonObject.append("engineeringTow", engineeringTow); ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("largenScreen"); if (sendwServer != null) { for (WebSocketServer webserver : sendwServer) { if (webserver != null) { webserver.sendMessage(jsonObject.toString()); List<String> messages = webserver.getMessages(); if (!messages.isEmpty()) { // // 将最后一个消息转换为整数类型的列表 webserver.clearMessages(); } } else { log.info("largenScreen is closed"); } } } } } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java
@@ -9,6 +9,7 @@ import com.mes.glassinfo.entity.GlassInfo; import java.util.List; import java.util.Map; /** * <p> @@ -107,5 +108,5 @@ */ List<BigStorageCageDetails> queryRealGlassInfo(BigStorageQueryVO bigStorageQueryVO); List<BigStorageVO> querybigStorageCageDetail(); Map<Integer, List<BigStorageVO>> querybigStorageCageDetail(); } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
@@ -451,8 +451,9 @@ } @Override public List<BigStorageVO> querybigStorageCageDetail() { return baseMapper.querybigStorageCageDetail(); public Map<Integer, List<BigStorageVO>> querybigStorageCageDetail() { List<BigStorageVO> bigStorageCages= baseMapper.querybigStorageCageDetail(); return bigStorageCages.stream().collect(Collectors.groupingBy(item -> item.getDeviceId())); } @Override hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
@@ -66,14 +66,14 @@ T.TEMPERING_LAYOUT_ID, COUNT(T.TEMPERING_FEED_SEQUENCE) AS COUNT FROM GLASS_INFO T LEFT JOIN DAMAGE T1 ON T.ENGINEER_ID = T1.ENGINEER_ID AND T.GLASS_ID = T1.GLASS_ID AND (T1.TYPE = 8 OR T1.TYPE = 9) LEFT JOIN DAMAGE T1 ON T.ENGINEER_ID = T1.ENGINEER_ID AND T.GLASS_ID = T1.GLASS_ID AND (T1.TYPE = 8 OR T1.TYPE = 9) WHERE T1.GLASS_ID IS NULL GROUP BY T.ENGINEER_ID, T.TEMPERING_LAYOUT_ID T.TEMPERING_LAYOUT_ID ) T2 INNER JOIN (SELECT ENGINEER_ID, TEMPERING_LAYOUT_ID, COUNT(TEMPERING_FEED_SEQUENCE) AS COUNT FROM BIG_STORAGE_CAGE_DETAILS @@ -267,10 +267,10 @@ FROM result </select> <select id="querybigStorageCageDetail" resultType="com.mes.base.entity.vo.BigStorageVO"> SELECT SLOT, COUNT(1) AS COUNT FROM BIG_STORAGE_CAGE_DETAILS where state in (100, 102, 103, 104) group by SLOT ORDER BY SLOT select bsc.device_id, bsc.slot, count(bscd.glass_id) as count from big_storage_cage bsc left join big_storage_cage_details bscd on bsc.slot=bscd.slot and bscd.state in (100, 102, 103, 104) group by bsc.device_id, bsc.slot order by bsc.device_id, bsc.slot </select> </mapper> hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassPushMessage.java
@@ -2,7 +2,10 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.mes.common.config.Const; import com.mes.rawglassdetails.entity.RawGlassStorageDetails; import com.mes.rawglassdetails.service.RawGlassStorageDetailsService; import com.mes.rawglassstation.service.RawGlassStorageStationService; import com.mes.rawglasstask.entity.RawGlassStorageTask; import com.mes.rawglasstask.service.RawGlassStorageTaskService; @@ -27,6 +30,9 @@ @Resource private RawGlassStorageTaskService rawGlassStorageTaskService; @Resource private RawGlassStorageDetailsService rawGlassStorageDetailsService; @Scheduled(fixedDelay = 2000) public void sendRawGlassMessage() { log.info("发送任务信息和架子信息"); @@ -43,4 +49,21 @@ }); } } @Scheduled(fixedDelay = 1000) public void largenScreen() { log.info("发送任务信息和架子信息"); JSONObject jsonObject = new JSONObject(); List<RawGlassStorageDetails> rawGlassStorageDetailList = rawGlassStorageDetailsService.list( new LambdaUpdateWrapper<RawGlassStorageDetails>() .eq(RawGlassStorageDetails::getState, Const.RAW_GLASS_STATE_IN) ); jsonObject.append("rawGlassStorageDetailList", rawGlassStorageDetailList); List<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("largenScreen"); if (CollectionUtil.isNotEmpty(sendwServer)) { sendwServer.stream().forEach(e -> { e.sendMessage(String.valueOf(jsonObject)); }); } } } hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/rawglassdetails/controller/RawGlassStorageDetailsController.java
@@ -1,5 +1,6 @@ package com.mes.rawglassdetails.controller; import com.mes.rawglassdetails.entity.dto.RawGlassStorageDetailsDTO; import com.mes.rawglassdetails.entity.request.RawGlassRequest; import com.mes.rawglassdetails.service.RawGlassStorageDetailsService; import com.mes.utils.Result; @@ -11,6 +12,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; /** * 前端控制器 * @@ -21,51 +24,58 @@ @RequestMapping("/rawGlassStorageDetails") public class RawGlassStorageDetailsController { @Autowired private RawGlassStorageDetailsService rawGlassStorageDetailsService; @Autowired private RawGlassStorageDetailsService rawGlassStorageDetailsService; @ApiOperation("入库请求") @PostMapping("/warehousingRequest") public Result<String> warehousingRequest(int leftingStation) { return Result.build( 200, "入库已完成,等待任务执行", rawGlassStorageDetailsService.warehousingRequest(leftingStation)); } @ApiOperation("入库请求") @PostMapping("/warehousingRequest") public Result<String> warehousingRequest(int leftingStation) { return Result.build( 200, "入库已完成,等待任务执行", rawGlassStorageDetailsService.warehousingRequest(leftingStation)); } @ApiOperation("原片入库") @PostMapping("/patternWarehousing") public Result<String> patternWarehousing(@Validated @RequestBody RawGlassRequest request) { return Result.build( 200, "入库已完成,等待任务执行", rawGlassStorageDetailsService.patternWarehousing(request)); } @ApiOperation("更新剩余数量") @PostMapping("/updateQuantity") public Result<Object> updateQuantity(@Validated @RequestBody RawGlassRequest request) { return Result.success(rawGlassStorageDetailsService.UpdateQuantity(request)); } @ApiOperation("删除原片") @PostMapping("/deleteWarehousing") public Result<Object> deleteWarehousing(Long slotId) { return Result.success(rawGlassStorageDetailsService.deleteWarehousing(slotId)); } @ApiOperation("原片出库") @PostMapping("/outWarehousing") public Result<Object> outWarehousing(Long slotId) { return Result.success(rawGlassStorageDetailsService.outWarehousing(slotId)); } @ApiOperation("原片入库") @PostMapping("/patternWarehousing") public Result<String> patternWarehousing(@Validated @RequestBody RawGlassRequest request) { return Result.build( 200, "入库已完成,等待任务执行", rawGlassStorageDetailsService.patternWarehousing(request)); } @ApiOperation("出库请求") @PostMapping("/outWarehousingRequest") public Result<String> outWarehousingRequest(int leftingStation) { return Result.build( 200, "入库已完成,等待任务执行", rawGlassStorageDetailsService.outWarehousingRequest(leftingStation)); } @ApiOperation("原片出库") @PostMapping("/outWarehousing") public Result<Object> outWarehousing(@RequestBody Long slotId) { return Result.success(rawGlassStorageDetailsService.outWarehousing(slotId)); } @ApiOperation("架子复位") @PostMapping("/shelfReset") public Result<String> shelfReset(Long slot) { return Result.success(rawGlassStorageDetailsService.shelfReset(slot)); } @ApiOperation("出库请求") @PostMapping("/outWarehousingRequest") public Result<String> outWarehousingRequest(int leftingStation) { return Result.build( 200, "入库已完成,等待任务执行", rawGlassStorageDetailsService.outWarehousingRequest(leftingStation)); } @ApiOperation("架子复位") @PostMapping("/shelfReset") public Result<String> shelfReset(Long slot) { return Result.success(rawGlassStorageDetailsService.shelfReset(slot)); } @ApiOperation("原片使用情况") @PostMapping("/patternUsage") public Result<List<RawGlassStorageDetailsDTO>> patternUsage(String width, String height, String thickness, String films) { return Result.build(200, "查询成功", rawGlassStorageDetailsService.patternUsage(width, height, thickness, films)); } @ApiOperation("更新剩余数量") @PostMapping("/updateQuantity") public Result<Object> updateQuantity(@Validated @RequestBody RawGlassRequest request) { return Result.success(rawGlassStorageDetailsService.UpdateQuantity(request)); } @ApiOperation("删除原片") @PostMapping("/deleteWarehousing") public Result<Object> deleteWarehousing(@RequestBody Long slotId) { return Result.success(rawGlassStorageDetailsService.deleteWarehousing(slotId)); } } hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcTemperingGlassTask.java
@@ -2,9 +2,11 @@ import cn.hutool.json.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.mes.common.config.Const; import com.mes.damage.entity.Damage; import com.mes.damage.service.DamageService; import com.mes.engineering.entity.Engineering; import com.mes.temperingglass.service.TemperingGlassInfoService; import com.mes.temperingglass.entity.TemperingGlassInfo; import com.mes.tools.WebSocketServer; @@ -101,5 +103,38 @@ } @Scheduled(fixedDelay = 1000) public void largenScreen() { JSONObject jsonObject = new JSONObject(); //大屏钢化信息 Integer putGlass = temperingAgoService.count( new LambdaUpdateWrapper<TemperingGlassInfo>() .eq(TemperingGlassInfo::getState, Const.TEMPERING_NEW) ); jsonObject.append("temperingTaskType", putGlass); //大屏钢化信息 Integer temperingGlass = temperingAgoService.count( new LambdaUpdateWrapper<TemperingGlassInfo>() .eq(TemperingGlassInfo::getState, Const.TEMPERING_START) .groupBy(TemperingGlassInfo::getEngineerId, TemperingGlassInfo::getTemperingLayoutId) ); jsonObject.append("temperingGlass", temperingGlass); ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("largenScreen"); if (sendwServer != null) { for (WebSocketServer webserver : sendwServer) { if (webserver != null) { webserver.sendMessage(jsonObject.toString()); List<String> messages = webserver.getMessages(); if (!messages.isEmpty()) { // // 将最后一个消息转换为整数类型的列表 webserver.clearMessages(); } } else { log.info("largenScreen is closed"); } } } } } hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-dev.yml
@@ -36,4 +36,14 @@ port: 6379 password: 123456 liquibase: change-log: classpath:changelog/changelogBase.xml change-log: classpath:changelog/changelogBase.xml kangaroohy: milo: enabled: true primary: default config: default: endpoint: opc.tcp://10.153.19.150:49320 security-policy: basic256sha256 username: admin password: 1qaz2wsx3edc4rfv hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowBigStorageCageDetailsMapper.xml
@@ -207,11 +207,11 @@ </if> </select> <select id="queryHollowbigStorageCageDetail" resultType="com.mes.base.entity.vo.BigStorageVO"> SELECT SLOT, COUNT(1) AS COUNT FROM HOLLOW_BIG_STORAGE_CAGE_DETAILS where state in (100, 102, 103, 104) group by SLOT ORDER BY SLOT select hbsc.device_id, hbsc.slot, count(hbscd.glass_id) as count from hollow_big_storage_cage hbsc left join hollow_big_storage_cage_details hbscd on hbsc.slot=hbscd.slot and hbscd.state in (100, 102, 103, 104) group by hbsc.device_id, hbsc.slot order by hbsc.device_id, hbsc.slot </select> <select id="querySlotMaxSequence" resultType="com.mes.hollow.entity.HollowBigStorageCageDetails"> select max(sequence) as sequence, device_id, slot