zhoushihao
2025-09-05 dd4778d2cc47467a39473f02513ec5438b5c9512
1、合并冲突
14个文件已修改
655 ■■■■ 已修改文件
UI-Project/src/lang/en.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/kr.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/py.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/zh.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Identify/identifwu.vue 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Identify/identifwutwo.vue 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Identify/identify.vue 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/hollow/hollowslicecage.vue 236 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application-dev.yml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskHistoryMapper.xml 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageHistoryTaskMapper.xml 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcScreenTask.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowBigStorageCageHistoryTaskMapper.xml 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowGlassRelationInfoMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/en.js
@@ -129,12 +129,16 @@
    },
    order: {
        projectnumber: 'Please enter the project number',
        noGlassToDamage:'No broken glass!',
        dilapidation: 'Breakage',
        dilapidationWhether:'Whether it is broken with one click?',
        takeaway: 'Manual removal',
        takeawaya: 'Should the information be manually taken away?',
        takeon: 'The arrangement is complete',
    },
    searchOrder: {
        firstLinePriority: 'First-line priority',
        secondLinePriority: 'second-line priority',
        hollowPriority:'Hollow priority',
        furnaces:'Number of full furnaces',
        furnfullTemp: 'Total amount of glass',
UI-Project/src/lang/kr.js
@@ -128,12 +128,16 @@
      },
      order:{
          projectnumber:'프로젝트 번호를 입력해 주세요',
          noGlassToDamage:'깨진 유리 없음!',
          dilapidation:'파손',
          dilapidationWhether:'한 번의 클릭으로 깨졌는지 여부?',
          takeaway:'수동 제거',
          takeawaya:'정보가 수동으로 수집되었는지 여부?',
          takeon:'준비가 완료되었습니다',
      },
      searchOrder:{
          firstLinePriority: '일선 우선 순위',
          secondLinePriority: '2선 우선순위',
          hollowPriority:'중공 우선 순위',
          furnaces:'가득 차있는 용광로의 수',
          furnfullTemp:'유리의 총량',
UI-Project/src/lang/py.js
@@ -129,11 +129,15 @@
    order: {
        projectnumber:'请输入工程号',
        takeon:'摆片完成',
        noGlassToDamage:'Никакого битого стекла!',
        dilapidation: 'Повреждение',
        dilapidationWhether:'Сломается ли он одним кликом?',
        takeawaya:'是否人工拿走该条信息?',
        takeaway: 'Взять вручную',
    },
    searchOrder: {
        firstLinePriority: 'Приоритет первой линии',
        secondLinePriority: 'Приоритет второй линии',
        hollowPriority:'中空优先级',
        furnaces:'满炉炉数',
        furnfullTemp:'玻璃总量',
UI-Project/src/lang/zh.js
@@ -128,12 +128,16 @@
      },
      order:{
          projectnumber:'请输入工程号',
          noGlassToDamage:'没有可破损的玻璃!',
          dilapidation:'破损',
          dilapidationWhether:'是否一键破损?',
          takeaway:'人工拿走',
          takeawaya:'是否人工拿走该条信息?',
          takeon:'摆片完成',
      },
      searchOrder:{
          firstLinePriority: '一线优先',
          secondLinePriority: '二线优先',
          hollowPriority:'中空优先级',
          furnaces:'满炉炉数',
          furnfullTemp:'玻璃总量',
UI-Project/src/views/Identify/identifwu.vue
@@ -1,7 +1,10 @@
<template>
  <div style="height: 500px;">
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;">
  <div style="height: 600px;">
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 850px;">
    <div style="display: flex;margin-left: 40%;margin-bottom: 5px;">
    <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}:{{ ava }}-{{ avanum }} </div>
     <el-button @click="handleAllDamage" style="margin-left: 80%;margin-top: -5px;">{{$t('order.dilapidation')}}</el-button>
    </div>
      <el-scrollbar height="750px" width="1400px" style="background-color: #e9e9eb;">
        <div style="position: relative;">
          <div
@@ -14,9 +17,9 @@
              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 style="font-size: 10px;font-weight: bold;">{{ rect.glassId }}</div>
              <div style="font-size: 10px;font-weight: bold;">{{ rect.flowCardId }}</div>
              <div style="font-size: 15px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>
            </div>
          </div>
        </div>
@@ -38,7 +41,7 @@
  </div>
</template>
<script setup lang="ts">
import {avatarEmits, ElMessage} from 'element-plus'
import {avatarEmits,  ElMessage, ElMessageBox } from 'element-plus'
import {onBeforeUnmount, computed, onMounted, onUnmounted, ref} from 'vue';
import request from "@/utils/request"
import {host, WebSocketHost} from '@/utils/constants'
@@ -70,6 +73,47 @@
    isActive: false
  }));
}
// 一键破损所有玻璃
const handleAllDamage = async () => {
  try {
      const confirmResult = await ElMessageBox.confirm(
      t('order.dilapidationWhether'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    // 筛选出state不是8和9的玻璃ID
    const glassIdList = adjustedRects.value
      .filter(rect => rect.state !== 8 && rect.state !== 9)
      .map(rect => rect.glassId);
    if (glassIdList.length === 0) {
      ElMessage.warning(t('order.noGlassToDamage')); // 没有可破损的玻璃
      return;
    }
    const response = await request.post('/cacheGlass/taskCache/identControlsByPatternSequence', {
      glassIdList: glassIdList,
      state: 8,
      line: 1,
      workingProcedure: '切割',
      remark: '掰片'
    });
    if (response.code === 200) {
      ElMessage.success(response.message);
      // 更新所有玻璃状态
      glassIdList.forEach(glassId => {
        updateRectStatus(glassId, 8);
      });
    } else {
      ElMessage.error(response.msg);
    }
  } catch (error) {
    console.error(error);
    ElMessage.error(t(''));
  }
};
// 破损
const handleDamage = async () => {
  try {
UI-Project/src/views/Identify/identifwutwo.vue
@@ -1,7 +1,10 @@
<template>
  <div style="height: 500px;">
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;">
     <div style="display: flex;margin-left: 40%;margin-bottom: 5px;">
    <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}:{{ ava }}-{{ avanum }} </div>
     <el-button @click="handleAllDamage" style="margin-left: 80%;margin-top: -5px;">{{$t('order.dilapidation')}}</el-button>
    </div>
    <el-scrollbar height="750px" width="1400px" style="background-color: #e9e9eb;">
        <div style="position: relative;">
          <div
@@ -14,9 +17,9 @@
              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 style="font-size: 10px;font-weight: bold;">{{ rect.glassId }}</div>
              <div style="font-size: 10px;font-weight: bold;">{{ rect.flowCardId }}</div>
              <div style="font-size: 15px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>
            </div>
          </div>
        </div>
@@ -38,7 +41,7 @@
  </div>
</template>
<script setup lang="ts">
import {ElMessage} from 'element-plus'
import {avatarEmits,  ElMessage, ElMessageBox } from 'element-plus'
import {onBeforeUnmount, computed, onMounted, onUnmounted, ref} from 'vue';
import request from "@/utils/request"
import {host, WebSocketHost} from '@/utils/constants'
@@ -131,6 +134,47 @@
    isActive: false
  }));
}
// 一键破损所有玻璃
const handleAllDamage = async () => {
  try {
      const confirmResult = await ElMessageBox.confirm(
      t('order.dilapidationWhether'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    // 筛选出state不是8和9的玻璃ID
    const glassIdList = adjustedRects.value
      .filter(rect => rect.state !== 8 && rect.state !== 9)
      .map(rect => rect.glassId);
    if (glassIdList.length === 0) {
      ElMessage.warning(t('order.noGlassToDamage')); // 没有可破损的玻璃
      return;
    }
    const response = await request.post('/cacheGlass/taskCache/identControlsByPatternSequence', {
      glassIdList: glassIdList,
      state: 8,
      line: 2,
      workingProcedure: '切割',
      remark: '掰片'
    });
    if (response.code === 200) {
      ElMessage.success(response.message);
      // 更新所有玻璃状态
      glassIdList.forEach(glassId => {
        updateRectStatus(glassId, 8);
      });
    } else {
      ElMessage.error(response.msg);
    }
  } catch (error) {
    console.error(error);
    ElMessage.error(t(''));
  }
};
// 破损
const handleDamage = async () => {
  try {
UI-Project/src/views/Identify/identify.vue
@@ -3,7 +3,7 @@
    <div style="display: flex;">
      <el-input v-model="engineerId" style="margin-left: 15px;margin-top: 10px;width: 240px" :placeholder="$t('order.projectnumber')"/>
          <el-button type="primary" style="margin-left: 10px;margin-top: 10px;" @click="sethistorical()">{{$t('reportmanage.inquire')}}</el-button>
       <el-pagination
          <el-pagination
          v-model:current-page="currentPage"
          :page-size="pageSize"
          :size="size"
@@ -13,8 +13,31 @@
          @current-change="handleCurrentChange"
          style="margin-top: 10px;"
      />
       <el-select
        v-model="allDamagePatternSequence"
        :placeholder="$t('workOrder.cway')"
        clearable
        style="width: 140px; margin-left: 35%; margin-top: 10px;"
      >
        <el-option
          v-for="item in optionsb"
          :key="item.value"
          :label="item.label"
          :value="item.value"
        />
      </el-select>
      <!-- 修改一键破损按钮,添加禁用状态 -->
      <el-button
        type="warning"
        style="margin-left: 10px; margin-top: 10px;"
        @click="handleAllDamage"
        :disabled="!allDamagePatternSequence"
      >
        {{$t('order.dilapidation')}}
      </el-button>
      </div>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;">
     <!-- <el-button @click="handleAllDamage" style="margin-left: 90%;margin-top: -20px;margin-bottom: 5px;">{{$t('order.dilapidation')}}</el-button> -->
      <el-scrollbar height="750px" width="1400px" style="background-color: #e9e9eb;">
  <div style="position: relative;">  
    <div
@@ -64,7 +87,7 @@
  </div>
</template>
<script setup lang="ts">
import {ElMessage} from 'element-plus'
import {avatarEmits,  ElMessage, ElMessageBox } from 'element-plus'
import {computed, onMounted, onUnmounted, ref} from 'vue';
import request from "@/utils/request"
import {host, WebSocketHost} from '@/utils/constants'
@@ -84,6 +107,7 @@
const currentPage = ref('');
const realwidth = ref('');
const realheight = ref('');
const allDamagePatternSequence = ref();
const disabled = false;
const size = 'small';
const rawData = ref([]);
@@ -104,6 +128,52 @@
    isActive: false  
  }));  
}
// 一键破损所有玻璃
const handleAllDamage = async () => {
   if (!allDamagePatternSequence.value) {
    ElMessage.warning(t('workOrder.cway')); // 提示需要选择线路
    return;
  }
  try {
      const confirmResult = await ElMessageBox.confirm(
      t('order.dilapidationWhether'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    // 筛选出state不是8和9的玻璃ID
    const glassIdList = adjustedRects.value
      .filter(rect => rect.state !== 8 && rect.state !== 9)
      .map(rect => rect.glassId);
    if (glassIdList.length === 0) {
      ElMessage.warning(t('order.noGlassToDamage')); // 没有可破损的玻璃
      return;
    }
    const response = await request.post('/cacheGlass/taskCache/identControlsByPatternSequence', {
      glassIdList: glassIdList,
      state: 8,
      line: allDamagePatternSequence.value,
      workingProcedure: '切割',
      remark: '掰片'
    });
    if (response.code === 200) {
      ElMessage.success(response.message);
      // 更新所有玻璃状态
      glassIdList.forEach(glassId => {
        updateRectStatus(glassId, 8);
      });
      allDamagePatternSequence.value = '';
    } else {
      ElMessage.error(response.msg);
    }
  } catch (error) {
    console.error(error);
    ElMessage.error(t(''));
  }
};
// 破损
const handleDamage = async () => {
  try  {
UI-Project/src/views/hollow/hollowslicecage.vue
@@ -28,10 +28,13 @@
const tableDatae = ref([])
const carPosition = ref([])
const tableDatass = ref([])
const tableDataLack = ref([])
const ganghua = ref('')
const diaodu = ref('')
const hollowPriority = ref('')
const flowCardId = ref('')
const glassType = ref('')
const layer = ref('')
const filmsId = ref('')
const adjust = ref([]);
const adjusta = ref([]);
@@ -46,6 +49,7 @@
const subRectsCountsc = ref([]);
const subRectsCountsd = ref([]);
const currentRow = reactive({}); // 当前行的数据 
const currentLack = reactive({});
const currentPage2 = ref(1)
const add = ref(false)
const glassId = ref('');
@@ -59,13 +63,9 @@
const cell8=ref(true);
const cell9=ref(true);
const blindb = ref(false)
const dialogFormVisibleb = ref(false)
const selectedRow = ref(null);
const temperingengineerId=ref('');
const handlePageChange2 = (newPage) => {
  currentPage2.value = newPage;
  window.localStorage.setItem('pagenumber', currentPage2.value)
  fetchxiang();
};
const handleBindRack = (row) => {
  selectedRow.value = row; // 更新选中的行数据  
  currentRow.deviceId  = row.deviceId; // 直接设置响应式属性  
@@ -73,6 +73,64 @@
  window.localStorage.setItem('deviceId', row.deviceId)
  window.localStorage.setItem('slot', row.slot)
  add.value = true;
};
// 缺片详情
const handleMissingFilms = (row) => {
  currentPage2.value = 1;
  const { flowCardId } = row;
  currentLack.flowCardId = row.flowCardId;
  dialogFormVisibleb.value = true;
  fetchFlowBind(flowCardId, currentPage2.value);
};
const handlePageChange2 = (newPage) => {
  currentPage2.value = newPage;
  fetchFlowBind(currentLack.flowCardId, currentPage2.value);
};
const fetchFlowBind = async (flowCardId, page) => {
  try {
    var url = "/hollowGlass/hollowGlassRelationInfo/queryLackByFlowCard?flowCardId=" + flowCardId + "&layer=" + 1;
    const response = await request.post(url)
    if (response.code == 200) {
      tableDataLack.value = response.data[page];
      ElMessage.success(response.message);
    } else {
    }
  } catch (error) {
  }
}
// 计算合计行的方法
const getSummaries = (param) => {
  const { columns, data } = param;
  const sums: string[] = [];
  columns.forEach((column, index) => {
    if (index === 0) {
      sums[index] = '合计';
      return;
    }
    // 只对需要计算的列进行求和
    const needSumColumns = ['sumCount', 'pairCount', 'totalNumber', 'realCount'];
    if (needSumColumns.includes(column.property)) {
      const values = data.map(item => Number(item[column.property]));
      if (!values.every(value => isNaN(value))) {
        sums[index] = values.reduce((prev, curr) => {
          const value = Number(curr);
          if (!isNaN(value)) {
            return prev + curr;
          } else {
            return prev;
          }
        }, 0);
        sums[index] += ''; // 转为字符串
      } else {
        sums[index] = 'N/A';
      }
    } else {
      sums[index] = '';
    }
  });
  return sums;
};
// 搜索
const searchout = async () => {
@@ -132,6 +190,38 @@
  } catch (error) {
  }  
}; 
// 缺片详情-破损
const handleBroke = async (row) => {
  try {
     const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.broke'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    const response = await request.post('/hollowGlass/hollowGlassRelationInfo/hollowBigStorageGlassDamage', {
      flowCardId: row.flowCardId,
      glassType: row.glassType,
      layer: row.layer,
      state: 8,
      line: 1,
      workingProcedure: '中空',
      remark: '中空'
    })
    if (response.code == 200) {
      ElMessage.success(response.message);
      const { flowCardId } = row;
      fetchFlowBind(flowCardId, currentPage2.value);
    } else {
      ElMessage.error(response.msg);
    }
  } catch (error) {
    console.error(error);
  }
}
 // 破损
 const broke = async(row) => {  
  try {
@@ -315,23 +405,23 @@
  }
}
// 中空优先级开关
// const handlehollowPriority = async () => {
//   try  {
//     const body = {
//       flag: hollowPriority.value,
//     };
//   var url="/hollowGlass/hollowGlassOutRelationInfo/priorityHollowSwitch?flag="+hollowPriority.value;
//   const response = await request.post(url)
//     if (response.code == 200) {
//       ElMessage.success(response.message);
//       hollowPriority.value = response.data
//     }else {
//       ElMessage.error(response.message);
//       }
// }
// catch (error) {
//   }
// }
const handlehollowPriority = async () => {
  try  {
    const body = {
      flag: hollowPriority.value,
    };
  var url="/hollowGlass/hollowGlassOutRelationInfo/priorityHollowSwitch?flag="+hollowPriority.value;
  const response = await request.post(url)
    if (response.code == 200) {
      ElMessage.success(response.message);
      hollowPriority.value = response.data
    }else {
      ElMessage.error(response.message);
      }
}
catch (error) {
  }
}
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/hollowGlass/api/talk/hollowGlassMessage`;
const handleMessage = (data) => {
@@ -411,11 +501,11 @@
}else{
  diaodu.value = ''
  }
// if(data.priorityHollowSwitch!=null){
//   hollowPriority.value = data.priorityHollowSwitch[0]
// }else{
//   hollowPriority.value = ''
//   }
if(data.priorityHollowSwitch!=null){
  hollowPriority.value = data.priorityHollowSwitch[0]
}else{
  hollowPriority.value = ''
  }
  if(data.bigStorageCageInfos!=null){
    adjustedRects.value = data.bigStorageCageInfos[0][1].map((rect, index) => ({
    id: index + 1,
@@ -678,11 +768,23 @@
</script>
<template>
  <div style="height: 600px;">
    <div style="display: flex;">
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="primary" @click="handlexiang">{{ $t('searchOrder.cageinformation') }}</el-button>
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="success" @click="handlehistorical">{{ $t('searchOrder.historicaltasks') }}</el-button>
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="danger" @click="handleptask()">{{ $t('searchOrder.partask') }}</el-button>
    <el-switch style="margin-top: 7px;margin-left: 10px;" v-model="diaodu" class="mb-2" :inactive-text="$t('searchOrder.Schedulingswitch')" @change="handlediaodu" />
    <!-- <el-switch style="margin-top: 7px;margin-left: 10px;" v-model="hollowPriority" class="mb-2" :inactive-text="$t('searchOrder.hollowPriority')" @change="handlehollowPriority" /> -->
    <div style="display: flex;">
   <div style="margin-left: 15px;margin-top: 5px;font-size: 14px;top: 5vh;margin-top: 12px;">{{ $t('searchOrder.hollowPriority') }}:</div>
   <div style="margin-left: 15px;margin-top: 5px;font-size: 14px;top: 5vh;margin-top: 12px;color: #911005;">{{ $t('searchOrder.firstLinePriority') }}</div>
    <el-switch
       style="margin-top: 7px;margin-left: 10px;"
       v-model="hollowPriority"
       class="mb-2"
       @change="handlehollowPriority"
     />
   <div style="margin-left: 15px;margin-top: 5px;font-size: 14px;top: 5vh;margin-top: 12px;color: rgb(184, 130, 48)">{{ $t('searchOrder.secondLinePriority') }}</div>
     </div>
</div>
    <div id="dotClass">
        <div>{{ $t('searchOrder.inkageEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: inkageEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
@@ -781,18 +883,32 @@
</div>
</div>
<el-card style="flex: 1; height: 500px; overflow-y: auto;">
      <div style="width: 100%; height: calc(100% - 35px); overflow-y: auto;max-height: 450px;">
       <el-table height="550px" ref="table" border
       :data="tableDatass" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
         <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.cardnumber')" min-width="140" />
         <el-table-column prop="sumCount" align="center" :label="$t('searchOrder.totallogarithms')" min-width="120" />
         <el-table-column prop="pairCount" align="center" :label="$t('searchOrder.numberpairs')" min-width="120" />
         <el-table-column prop="totalNumber" align="center" :label="$t('hellow.totalnumber')" min-width="100" />
         <el-table-column prop="realCount" align="center" :label="$t('hellow.realpieces')" min-width="120" />
         <el-table-column prop="slotCount" align="center" :label="$t('searchOrder.numberoccupied')" min-width="120" />
       </el-table>
       </div>
    </el-card>
  <div style="width: 100%; height: 100%; overflow: hidden;">
    <el-table
      ref="table"
      border
      :data="tableDatass"
      :header-cell-style="{background:'#F2F3F5', color:'#1D2129'}"
      show-summary
      :summary-method="getSummaries"
      max-height="calc(500px - 35px)"
      style="width: 100%;"
    >
      <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.cardnumber')" min-width="140" />
      <el-table-column prop="sumCount" align="center" :label="$t('searchOrder.totallogarithms')" min-width="120" />
      <el-table-column prop="pairCount" align="center" :label="$t('searchOrder.numberpairs')" min-width="120" />
      <el-table-column prop="totalNumber" align="center" :label="$t('hellow.totalnumber')" min-width="100" />
      <el-table-column prop="realCount" align="center" :label="$t('hellow.realpieces')" min-width="120" />
      <el-table-column fixed="right" :label="$t('hellow.operate')" align="center">
        <template #default="scope">
          <el-button type="text" plain @click="handleMissingFilms(scope.row)">
            {{ $t('hellow.missingfilms') }}
          </el-button>
        </template>
      </el-table-column>
    </el-table>
  </div>
</el-card>
  </div>
    <div style="padding: 10px;display: flex;height:110px;margin-top: -170px;">
            <div v-for="(item, index) in tableDatae" :key="index" id="occupy">  
@@ -994,18 +1110,38 @@
        </el-table-column>
        </el-table>
        <div>
    <!-- <div style="margin-top: 20px;margin-left: 40%;">
      <el-pagination
          background
          size="large"
          layout="prev, pager, next"
          :total="50"
          :current-page.sync="currentPage2"
          @current-change="handlePageChange2"
        />
    </div> -->
  </div>
  </el-dialog>
  <!-- 缺片详情 -->
  <el-dialog v-model="dialogFormVisibleb" top="7vh" width="70%" height="500">
    <div style="margin-top: -20px;text-align: center;margin-left: 400px;">
      <el-form-item :label="$t('hellow.cardnumbera')" style="width: 14vw">
        {{ currentLack.flowCardId }}
      </el-form-item>
    </div>
    <el-table ref="table" style="margin-top: 20px;height: 400px;" :data="tableDataLack"
      :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
      <el-table-column prop="glassType" align="center" :label="$t('large.serialnumber')" min-width="80" />
      <el-table-column prop="thickness" align="center" :label="$t('hellow.thickness')" min-width="80" />
      <el-table-column prop="filmsId" align="center" :label="$t('hellow.coatingtypes')" min-width="80" />
      <el-table-column prop="height" align="center" :label="$t('hellow.height')" min-width="80" />
      <el-table-column prop="width" align="center" :label="$t('hellow.width')" min-width="80" />
      <el-table-column prop="lackCount" align="center" :label="$t('hellow.missingnumber')" min-width="80" />
      <el-table-column prop="damageCount" align="center" :label="$t('large.brokenNum')"/>
      <el-table-column fixed="right" :label="$t('searchOrder.operate')" align="center">
            <template #default="scope">
              <el-button type="text" plain  @click="handleBroke(scope.row)">{{ $t('order.dilapidation') }}</el-button>
            </template>
        </el-table-column>
      <div style="float: right;margin-bottom: 5px;">
        <el-pagination layout="prev, pager, next" :total="50" />
      </div>
    </el-table>
    <div style="display: flex;margin-left: 40%;margin-top: 10px;">
      <el-pagination background size="large" layout="prev, pager, next" :total="30" :current-page.sync="currentPage2"
        @current-change="handlePageChange2" />
    </div>
  </el-dialog>
  <!-- 历史任务 -->
<el-dialog v-model="blindb" top="5vh" width="95%" @close="iframeUrl=''">
     <iframe 
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application-dev.yml
@@ -40,14 +40,4 @@
        endpoint: opc.tcp://10.153.19.150:49320
        security-policy: basic256sha256
        username: admin
        password: 1qaz2wsx3edc4rfv
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/CacheGlassModule/src/main/resources/mapper/EdgStorageDeviceTaskHistoryMapper.xml
@@ -36,33 +36,47 @@
        </if>
    </select>
    <select id="queryRunTimes" resultType="com.mes.largenscreen.entity.RunTime">
        with edg_storage_cage_history_task_temp as (
            select distinct create_time from edg_storage_device_task_history  where task_type in (1,3) and
                create_time LIKE '%${days}%'
        )
        WITH edg_storage_cage_history_task_temp AS
                 (SELECT DISTINCT create_time
                  FROM edg_storage_device_task_history
                  WHERE task_type IN (1, 3) AND DATE ( create_time ) = '${days}' ),
            time_temp AS (
        SELECT
            date (create_time) AS day_time,
            MIN(create_time) AS start_timestamp,
            MAX(create_time) AS end_timestamp
        FROM
            edg_storage_device_task_history
        WHERE
            Date ( create_time ) = '${days}'
        GROUP BY
            date ( create_time )
            ),
            result_temp AS (
        SELECT
            date ( t1.create_time ) AS day_time,
            t1.create_time AS first_timestamp,
            t2.create_time AS second_timestamp,
            TIMESTAMPDIFF(MINUTE, t1.create_time, t2.create_time) as diff_minutes
                ,(select min(create_time) from edg_storage_cage_history_task_temp) as start_timestamp
                ,(select max(create_time) from edg_storage_cage_history_task_temp) as end_timestamp
            TIMESTAMPDIFF( MINUTE, t1.create_time, t2.create_time ) AS diff_minutes
        FROM
            (SELECT
                 create_time,
                 LEAD(create_time) OVER (ORDER BY create_time) AS next_timestamp
             FROM
                 edg_storage_cage_history_task_temp ) t1
                JOIN
            (SELECT
                 create_time,
                 LEAD(create_time) OVER (ORDER BY create_time) AS next_timestamp
             FROM
                 edg_storage_cage_history_task_temp ) t2 ON t1.next_timestamp = t2.create_time
            ( SELECT create_time, LEAD( create_time ) OVER ( ORDER BY create_time ) AS next_timestamp FROM edg_storage_cage_history_task_temp ) t1
            JOIN ( SELECT create_time, LEAD( create_time ) OVER ( ORDER BY create_time ) AS next_timestamp FROM edg_storage_cage_history_task_temp ) t2
        ON t1.next_timestamp = t2.create_time
        WHERE
            TIMESTAMPDIFF(MINUTE, t1.create_time, t2.create_time) between 6 and 500
        GROUP BY t1.create_time,t2.create_time
        ;
            TIMESTAMPDIFF( MINUTE
            , t1.create_time
            , t2.create_time ) BETWEEN 6
          AND 500
        GROUP BY
            t1.create_time,
            t2.create_time
            ),
            result AS (
        SELECT first_timestamp, second_timestamp, diff_minutes, start_timestamp, end_timestamp
        FROM time_temp t1 LEFT JOIN result_temp t2
        ON t1.day_time = t2.day_time )
        SELECT *
        FROM result
    </select>
    <select id="queryEdgDailyProduction" resultMap="baseMap">
        SELECT
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageHistoryTaskMapper.xml
@@ -44,30 +44,47 @@
        INNER join big_storage_out_temp on 1 = 1
    </select>
    <select id="queryRunTimes" resultType="com.mes.largenscreen.entity.RunTime">
        with big_storage_cage_history_task_temp as (
            select distinct create_time
            from big_storage_cage_history_task
            where task_type = 2
              and create_time LIKE '%${days}%'
        )
        SELECT t1.create_time                                                    AS first_timestamp,
               t2.create_time                                                    AS second_timestamp,
               TIMESTAMPDIFF(MINUTE, t1.create_time, t2.create_time)             as diff_minutes
                ,
               (select min(create_time) from big_storage_cage_history_task_temp) as start_timestamp
                ,
               (select max(create_time) from big_storage_cage_history_task_temp) as end_timestamp
        FROM (SELECT create_time,
                     LEAD(create_time) OVER (ORDER BY create_time) AS next_timestamp
              FROM big_storage_cage_history_task_temp) t1
                 JOIN
             (SELECT create_time,
                     LEAD(create_time) OVER (ORDER BY create_time) AS next_timestamp
              FROM big_storage_cage_history_task_temp) t2 ON t1.next_timestamp = t2.create_time
        WHERE TIMESTAMPDIFF(MINUTE, t1.create_time, t2.create_time) between 11 and 500
        GROUP BY t1.create_time, t2.create_time
        ;
        WITH big_storage_cage_history_task_temp AS
                 (SELECT DISTINCT create_time
                  FROM big_storage_cage_history_task
                  WHERE task_type = 2 AND DATE ( create_time ) = '${days}' ),
            time_temp AS (
        SELECT
            date (create_time) AS day_time,
            MIN(create_time) AS start_timestamp,
            MAX(create_time) AS end_timestamp
        FROM
            big_storage_cage_history_task
        WHERE
            Date ( create_time ) = '${days}'
        GROUP BY
            date ( create_time )
            ),
            result_temp AS (
        SELECT
            date ( t1.create_time ) AS day_time,
            t1.create_time AS first_timestamp,
            t2.create_time AS second_timestamp,
            TIMESTAMPDIFF( MINUTE, t1.create_time, t2.create_time ) AS diff_minutes
        FROM
            ( SELECT create_time, LEAD( create_time ) OVER ( ORDER BY create_time ) AS next_timestamp FROM big_storage_cage_history_task_temp ) t1
            JOIN ( SELECT create_time, LEAD( create_time ) OVER ( ORDER BY create_time ) AS next_timestamp FROM big_storage_cage_history_task_temp ) t2
        ON t1.next_timestamp = t2.create_time
        WHERE
            TIMESTAMPDIFF( MINUTE
            , t1.create_time
            , t2.create_time ) BETWEEN 11
          AND 500
        GROUP BY
            t1.create_time,
            t2.create_time
            ),
            result AS (
        SELECT first_timestamp, second_timestamp, diff_minutes, start_timestamp, end_timestamp
        FROM time_temp t1 LEFT JOIN result_temp t2
        ON t1.day_time = t2.day_time )
        SELECT *
        FROM result
    </select>
</mapper>
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcScreenTask.java
@@ -1,21 +1,20 @@
package com.mes.job;
import cn.hutool.json.JSONObject;
import com.mes.order.entity.Orders;
import com.mes.order.service.OrdersService;
import com.mes.pp.entity.OptimizeProject;
import com.mes.pp.entity.request.AwaitingRepair;
import com.mes.pp.entity.request.Reportingdamage;
import com.mes.pp.service.OptimizeProjectService;
import com.mes.pp.service.ReportingWorkService;
import com.mes.tools.WebSocketServer;
import com.mes.tools.WebSocketUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
/**
@@ -31,6 +30,8 @@
    private OptimizeProjectService optimizeProjectService;
    @Autowired
    private OrdersService ordersService;
    @Resource
    private WebSocketUtils webSocketUtils;
    /**
     * fixedRate : 上一个调用开始后再次调用的延时(不用等待上一次调用完成)
     * fixedDelay : 上一个调用结束后再次调用的延时
@@ -70,17 +71,17 @@
        /*现场规划图显示*/
        ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("screen");
        if (sendwServer != null) {
            for (WebSocketServer webserver : sendwServer) {
                if (webserver != null) {
                    webserver.sendMessage(jsonObject.toString());
                } else {
                    log.info("Home is closed");
                }
            }
        }
        webSocketUtils.sendToWeb("screen", jsonObject);
//        ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("screen");
//        if (sendwServer != null) {
//            for (WebSocketServer webserver : sendwServer) {
//                if (webserver != null) {
//                    webserver.sendMessage(jsonObject.toString());
//                } else {
//                    log.info("Home is closed");
//                }
//            }
//        }
    }
}
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowBigStorageCageHistoryTaskMapper.xml
@@ -48,29 +48,46 @@
        inner join hollow_out_two_temp on 1 = 1
    </select>
    <select id="queryRunTimes" resultType="com.mes.largenscreen.entity.RunTime">
        with big_storage_cage_history_task_temp as (
            select distinct create_time from hollow_big_storage_cage_history_task  where task_type = 5 and
                create_time  LIKE '%${days}%'
        )
        WITH big_storage_cage_history_task_temp AS
                 (SELECT DISTINCT create_time
                  FROM hollow_big_storage_cage_history_task
                  WHERE task_type = 5 AND DATE ( create_time ) = '2025-06-23' ),
            time_temp AS (
        SELECT
            date (create_time) AS day_time,
            MIN(create_time) AS start_timestamp,
            MAX(create_time) AS end_timestamp
        FROM
            hollow_big_storage_cage_history_task
        WHERE
            Date ( create_time ) = '2025-06-23'
        GROUP BY
            date ( create_time )
            ),
            result_temp AS (
        SELECT
            date ( t1.create_time ) AS day_time,
            t1.create_time AS first_timestamp,
            t2.create_time AS second_timestamp,
            TIMESTAMPDIFF(MINUTE, t1.create_time, t2.create_time) as diff_minutes,
               (select min(create_time) from big_storage_cage_history_task_temp) as start_timestamp
                ,(select max(create_time) from big_storage_cage_history_task_temp) as end_timestamp
            TIMESTAMPDIFF( MINUTE, t1.create_time, t2.create_time ) AS diff_minutes
        FROM
            (SELECT
                 create_time,
                 LEAD(create_time) OVER (ORDER BY create_time) AS next_timestamp
             FROM
                 big_storage_cage_history_task_temp ) t1
                JOIN
            (SELECT
                 create_time,
                 LEAD(create_time) OVER (ORDER BY create_time) AS next_timestamp
             FROM
                 big_storage_cage_history_task_temp ) t2 ON t1.next_timestamp = t2.create_time
            ( SELECT create_time, LEAD( create_time ) OVER ( ORDER BY create_time ) AS next_timestamp FROM big_storage_cage_history_task_temp ) t1
            JOIN ( SELECT create_time, LEAD( create_time ) OVER ( ORDER BY create_time ) AS next_timestamp FROM big_storage_cage_history_task_temp ) t2
        ON t1.next_timestamp = t2.create_time
        WHERE
            TIMESTAMPDIFF(MINUTE, t1.create_time, t2.create_time) between 11 and 500;
            TIMESTAMPDIFF( MINUTE
            , t1.create_time
            , t2.create_time ) BETWEEN 11
          AND 500
        GROUP BY
            t1.create_time,
            t2.create_time
            ),
            result AS (
        SELECT first_timestamp, second_timestamp, diff_minutes, start_timestamp, end_timestamp
        FROM time_temp t1 LEFT JOIN result_temp t2
        ON t1.day_time = t2.day_time )
        SELECT *
        FROM result
    </select>
</mapper>
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowGlassRelationInfoMapper.xml
@@ -141,7 +141,7 @@
                        order_number      as order_sort,
                        count(1)          as damage_count
                 from damage
                 where process_id = #{flowCardId}
                 where process_id = #{flowCardId} and type in (8,9) and status < 3
                 group by process_id, technology_number, order_number
             ),
             result_count as (