wangfei
2025-05-23 0b28598dabd95862411a75a3cd2152f896671261
Merge branch 'master' of http://10.153.19.25:10105/r/YiWuProject
17个文件已修改
1个文件已添加
1082 ■■■■ 已修改文件
UI-Project/src/lang/en.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/zh.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/router/index.js 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/largescreendisplay/screendisplay.vue 212 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/largescreendisplay/statistics.vue 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/largescreendisplay/timeaxis.vue 437 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/gateway/pom.xml 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/pom.xml 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassNewTask.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/pom.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/pom.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-prod.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/pom.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/pom.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/pom.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/job/OpcHollowRemoveTask.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/pom.xml 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/en.js
@@ -511,6 +511,16 @@
        createTime: 'Return date',
    },
    large: {
        Productionsituation:'Production situation',
        Productionandoperationstatus:'Production and operation status',
        cuttingState:'Operation status on the day of cutting',
        edgingState:'Operation status on the day of edge grinding',
        temperingState:'Operation status of tempered steel on the day of tempering',
        hollowState:'Production and operation status of hollow on the same day',
        switch: 'Switch',
        running: 'Running',
        stopping:'Stopping',
        diffMinutes:'diffMinutes',
        loadstart:'Load start',
        loadend:'Load end',
        loadtotal: 'Load total',
UI-Project/src/lang/zh.js
@@ -513,6 +513,16 @@
          createTime :'返库日期',
      },
      large:{
        Productionsituation:'生产情况',
        Productionandoperationstatus:'生产运行情况',
        cuttingState:'切割当天运行情况',
        edgingState:'磨边当天运行情况',
        temperingState:'钢化当天运行情况',
        hollowState:'中空当天运行情况',
        switch:'切换',
        running:'运行中',
        stopping:'停止中',
        diffMinutes:'分钟',
        loadstart:'切割开始时间',
        loadend:'切割结束时间',
        loadtotal: '切割总时间',
UI-Project/src/router/index.js
@@ -502,6 +502,18 @@
                       },
                     ]
                    },
                    {
                    path: '/timeaxis',
                     name: 'timeaxis',
                     component: () => import('../views/largescreendisplay/timeaxis.vue'),
                     children: [
                       {
                        path: '/largescreendisplay/timeaxis',
                        name: 'timeaxis',
                        component: () => import('../views/largescreendisplay/timeaxis.vue')
                       },
                     ]
                    }
  ]
})
// 导航守卫  
UI-Project/src/views/largescreendisplay/screendisplay.vue
@@ -51,8 +51,10 @@
    numBoxes2.value = edgTwoTasks.value.length;
    initBoxes(boxes2, numBoxes2, 'firstup');
  }
  timeAxisCreate("切割当天运行情况", chartLoad.value, myChartLoad, data.loadRunTimes[0]);
  timeAxisCreate("磨边当天运行情况", chartEdg.value, myChartEdg, data.loadRunTimes[0]);
  timeAxisCreate(t('large.cuttingState'), chartLoad.value, myChartLoad, tableDataTime(false, data.loadRunTimes[0]));
  timeAxisCreate(t('large.edgingState'), chartEdg.value, myChartEdg, tableDataTime(false, data.loadRunTimes[0]));
};
let socket2 = null;
const temperingTaskType = ref([])
@@ -87,7 +89,7 @@
const socketUrl3 = `ws://${WebSocketHost}:${host}/api/cacheVerticalGlass/api/talk/largenScreen`;
const handleMessage3 = (data) => {
  bigStorageCageUsage.value = data.bigStorageCageUsage[0];
  timeAxisCreate("钢化当天运行情况", chartTemp.value, myChartTemp, data.tempRunTimes[0]);
  timeAxisCreate(t('large.temperingState'), chartTemp.value, myChartTemp, tableDataTime(false, data.tempRunTimes[0]));
};
// let mychart = null; // 建议设为外部变量避免重复初始化
@@ -99,6 +101,34 @@
  const seconds = date.getSeconds().toString().padStart(2, '0');
  return `${hours}:${minutes}:${seconds}`;
}
const tableDataTime = (result, tableDatax) => {
  const tableData = [];
  if (tableDatax.length > 0) {
    tableDatax.forEach((item, index) => {
      tableData.push({
        firstTimestamp: index == 0 ? item.startTimestamp : tableDatax[index - 1].secondTimestamp,
        secondTimestamp: index == tableDatax.length - 1 ? item.endTimestamp : item.firstTimestamp,
        diffMinutes: item.diffMinutes,
        startTimestamp: item.startTimestamp,
        endTimestamp: item.endTimestamp,
        state: 1
      });
      if (result) {
        tableData.push({
          firstTimestamp: item.firstTimestamp,
          secondTimestamp: item.secondTimestamp,
          diffMinutes: item.diffMinutes,
          startTimestamp: item.startTimestamp,
          endTimestamp: item.endTimestamp,
          state: 2
        });
      }
    });
  }
  return tableData;
};
const timeAxisCreate = (title, chartDom, mychart, RunTimes) => {
  if (!chartDom) {
@@ -119,24 +149,25 @@
    secondTime = RunTimes[0].endTimestamp;
  }
  let datas = ref([])
  RunTimes.forEach((item, index) => {
    // if (index % 2 === 0) {
    datas.value.push([item.firstTimestamp, -1, formatToTimeString(item.firstTimestamp)])
    datas.value.push([item.secondTimestamp, 1, formatToTimeString(item.secondTimestamp)])
    // } else {
    //   datas.value.push([item.firstTimestamp, -1, item.diffMinutes])
    //   datas.value.push([item.firstTimestamp, -1, item.diffMinutes])
    // }
  })
  // console.log(D)
  // 构建线段数组
  const segments = RunTimes.map(item => ({
    type: 'line',
    symbol: 'none',
    data: [
      [item.firstTimestamp, 0],
      [item.secondTimestamp, 0]
      {
        value: [item.firstTimestamp, 0],
        extra: {
          start: item.firstTimestamp,
          end: item.secondTimestamp
        }
      },
      {
        value: [item.secondTimestamp, 0],
        extra: {
          start: item.firstTimestamp,
          end: item.secondTimestamp
        }
      }
    ],
    lineStyle: {
      color: 'red', // 支持不同颜色
@@ -161,7 +192,21 @@
      trigger: 'axis',
      axisPointer: { type: 'line' },
      backgroundColor: 'rgba(50,50,50,0.7)',
      textStyle: { color: '#fff' }
      textStyle: { color: '#fff' },
      formatter: (params) => {
        const items = params
          .map(p => {
            const start = p.data?.extra?.start;
            const end = p.data?.extra?.end;
            const timeStr = p.axisValueLabel;
            if (start && end) {
              return `开始时间:${start}<br/>结束时间:${end}`;
            }
            return `时间:${timeStr}`;
          })
          .filter(Boolean);
        return items.join('<br/>');
      }
    },
    grid: {
      top: '20%',
@@ -203,8 +248,8 @@
        ],
        lineStyle: {
          color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
            { offset: 0, color: '#4facfe' },
            { offset: 1, color: '#00f2fe' }
            { offset: 0, color: 'red' },
            { offset: 1, color: 'red' }
          ]),
          width: 5,
          shadowColor: 'rgba(0,0,0,0.2)',
@@ -216,83 +261,12 @@
      ...segments.map(seg => ({
        ...seg,
        lineStyle: {
          color: '#ffcc00',
          color: '#4facfe',
          width: 3,
          shadowColor: 'rgba(255,204,0,0.5)',
          shadowBlur: 5
        }
      })),
      // 卡片事件(优化样式)
      {
        type: 'custom',
        renderItem: function (params, api) {
          const x = api.coord([api.value(0), api.value(1)])[0];
          const yBase = api.coord([api.value(0), 0])[1];
          const yOffset = api.value(1) > 0 ? -70 : 30;
          const cardWidth = 40;
          const cardHeight = 22;
          const cardX = x;
          const cardY = yBase + yOffset;
          const text = api.value(2);
          return {
            type: 'group',
            children: [
              {
                type: 'line',
                shape: {
                  x1: x,
                  y1: yBase,
                  x2: x,
                  y2: cardY + (api.value(1) > 0 ? cardHeight : 0)
                },
                style: {
                  stroke: '#888',
                  lineWidth: 1.5,
                  lineDash: [4, 2]
                }
              },
              {
                type: 'rect',
                shape: {
                  x: cardX - cardWidth / 2,
                  y: cardY,
                  width: cardWidth,
                  height: cardHeight,
                  r: 6 // 圆角
                },
                style: {
                  fill: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                    { offset: 0, color: '#ffffff' },
                    { offset: 1, color: '#e0f7fa' }
                  ]),
                  stroke: '#00acc1',
                  lineWidth: 1,
                  shadowColor: '#ccc',
                  shadowBlur: 6
                }
              },
              {
                type: 'text',
                style: {
                  text: text,
                  x: cardX,
                  y: cardY + cardHeight / 2,
                  textAlign: 'center',
                  textVerticalAlign: 'middle',
                  font: '12px sans-serif',
                  fill: '#006064'
                }
              }
            ]
          };
        },
        encode: {
          x: 0
        },
        data: datas.value,
        z: 10
      }
    ]
  };
@@ -304,7 +278,7 @@
const socketUrl4 = `ws://${WebSocketHost}:${host}/api/hollowGlass/api/talk/largenScreen`;
const handleMessage4 = (data) => {
  hollowBigStorageCageUsage.value = data.hollowBigStorageCageUsage[0];
  timeAxisCreate("中空当天运行情况", chartHollow.value, myChartHollow, data.hollowRunTimes[0]);
  timeAxisCreate(t('large.hollowState'), chartHollow.value, myChartHollow, tableDataTime(false, data.hollowRunTimes[0]));
};
let socket5 = null;
let myChart = null;
@@ -334,13 +308,12 @@
    console.error('图表容器未找到');
    return;
  }
  // myChart = echarts.init(chartDom);
  if (!myChart) {
    myChart = echarts.init(chartDom);
  }
  // else {
  //     myChart.clear();
  //   }
  const option = {
@@ -375,6 +348,7 @@
  };
  myChart.setOption(option);
  const chartDom2 = chartRef2.value;
  if (!chartDom2) {
@@ -454,7 +428,7 @@
const exportToExcel = async () => {
  try {
    window.open('http://'+{WebSocketHost}+':10011/largenScreen/exportDailyProduction', '_blank');
    window.open('http://' + { WebSocketHost } + ':10011/largenScreen/exportDailyProduction', '_blank');
    // const response = await request.get('/cacheGlass/largenScreen/exportDailyProduction');
    // if (response.code == 200) {
    //   ElMessage.success(response.message);
@@ -536,7 +510,7 @@
    orderDTOS.value = orderDTOS.value.slice(-MAX_ITEMS);
    // ...其他数组
  }
  // 清理图表
  [myChart, myChart2, myChartLoad, myChartEdg, myChartTemp, myChartHollow].forEach(chart => {
    if (chart) {
@@ -566,15 +540,15 @@
  const cleanupInterval = setInterval(() => {
    cleanupWebSocketData(true); // 完全清理
  }, 3000);
  }, 300000);
  // 每次收到消息时检查数据量
  const originalHandleMessage = handleMessage;
  handleMessage = (data) => {
    originalHandleMessage(data);
    cleanupWebSocketData(false); // 部分清理
  };
  onUnmounted(() => {
    clearInterval(cleanupInterval);
    cleanupWebSocketData(true); // 组件卸载时完全清理
@@ -694,11 +668,11 @@
  if (box.frameCount % 2 === 0 && box.el) {
    box.el.style.top = `${box.y}px`;
    if (box.x > 0) {
      if(box.direction=="right"){
      if (box.direction == "right") {
        box.el.style.right = `-${box.x}px`;
      }else{
      } else {
        box.el.style.right = `${box.x}px`;
      }
      box.el.style.left = '';
@@ -857,6 +831,17 @@
  iframe11.value = true;
  iframeUrl11.value = `${window.location.origin}/#/largescreendisplay/productionstatistics`;
};
const iframeUrl12 = ref('');
const iframe12 = ref(false);
const handlehistorical12 = (key) => {
  iframe12.value = true;
  const params = new URLSearchParams({
    key: key,
  });
  iframeUrl12.value = `${window.location.origin}/#/largescreendisplay/timeaxis?${params.toString()}`;
};
const transposedData = computed(() => {
  const keys = Object.keys(fieldNames); // 按 fieldNames 的顺序
  return keys.map(key => {
@@ -925,14 +910,17 @@
        frameborder="0"></iframe>
    </el-dialog>
    <el-dialog v-model="iframe10" top="5vh" width="95%" @close="iframeUrl10 = ''">
      <iframe :src="iframeUrl10" marginwidth="2000px" marginheight="2000px" width="100%" height="750px"
        frameborder="0"></iframe>
      <iframe :src="iframeUrl10" marginwidth="2000px" marginheight="2000px" width="100%"
        height="700px" frameborder="0"></iframe>
    </el-dialog>
    <el-dialog v-model="iframe11" top="5vh" width="95%" @close="iframeUrl11 = ''">
      <iframe :src="iframeUrl11" marginwidth="2000px" marginheight="2000px" width="100%" height="750px"
        frameborder="0"></iframe>
    </el-dialog>
    <el-dialog v-model="iframe12" top="5vh" width="95%" @close="iframeUrl12 = ''">
      <iframe :src="iframeUrl12" marginwidth="2000px" marginheight="2000px" width="100%" height="750px"
        frameborder="0"></iframe>
    </el-dialog>
    <div class="awatch" style="display: flex;">
      <!-- 生产统计 -->
      <div style="height: 100px;width: 25%;float: right;">
@@ -940,10 +928,10 @@
          <div ref="chartRef" style="width: 600px; height: 400px;" @dblclick="handlehistorical10()"></div>
        </div>
        <div style="width: 100%;height: 245px;display: flex;">
          <div ref="chartLoad" style="width: 100%;"></div>
          <div ref="chartLoad" style="width: 100%;" @dblclick="handlehistorical12(1)"></div>
        </div>
        <div style="width: 100%;height: 245px;display: flex;">
          <div ref="chartEdg" style="width: 100%;"></div>
          <div ref="chartEdg" style="width: 100%;" @dblclick="handlehistorical12(2)"></div>
        </div>
      </div>
      <div style="width: 50%;">
@@ -1122,10 +1110,10 @@
          <div ref="chartRef2" style="width: 600px; height: 400px;" @dblclick="handlehistorical10()"></div>
        </div>
        <div style="width: 100%;height: 245px;display: flex;">
          <div ref="chartTemp" style="width: 100%;"></div>
          <div ref="chartTemp" style="width: 100%;" @dblclick="handlehistorical12(3)"></div>
        </div>
        <div style="width: 100%;height: 245px;display: flex;">
          <div ref="chartHollow" style="width: 100%;"></div>
          <div ref="chartHollow" style="width: 100%;" @dblclick="handlehistorical12(4)"></div>
        </div>
      </div>
    </div>
UI-Project/src/views/largescreendisplay/statistics.vue
@@ -8,8 +8,9 @@
      <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="sethistorical()">{{
        $t('reportmanage.inquire') }}</el-button>
        <el-button type="primary" @click="exportToExcel">{{$t('large.ExporttoExcel')}}</el-button>
        <el-button type="primary" @click="showchart=!showchart" style="margin-left: 10px;">{{ $t('large.switch') }}</el-button>
    </div>
    <el-table ref="table" style="margin-top: 20px;height: 580px;width: 1770px;" :data="tableDatax"
    <el-table v-show="!showchart" ref="table" style="margin-top: 20px;height: 580px;width: 1770px;" :data="tableDatax"
      :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
      <el-table-column prop="date" align="center" :label="$t('large.date')" min-width="70" />
      <el-table-column prop="countOutOne" align="center" :label="$t('large.countOutOne')" min-width="40" />
@@ -27,10 +28,16 @@
      <el-table-column prop="hollowTotalAreaOutTwo" align="center" :label="$t('large.hollowTotalAreaOutTwo')"
        min-width="40" />
    </el-table>
    <div style="margin-top: 20px;margin-left: 40%;">
    <div v-show="!showchart" style="margin-top: 20px;margin-left: 40%;">
      <el-pagination v-model:current-page="currentPage2" :page-size="pageSize" :size="large" :disabled="disabled"
        layout="prev, pager, next, jumper" :total="totalRecords" @current-change="handlePageChange2"
        style="margin-top: 10px;" />
    </div>
    <div v-show="showchart" id="ss" style="width: 100%; display: flex; justify-content: center;">
          <div ref="chartRef" style="width: 1770px; height: 320px;"></div>
    </div>
    <div v-show="showchart" id="ss" style="width: 100%; display: flex; justify-content: center;">
          <div ref="chartRef2" style="width: 1770px; height: 320px;"></div>
    </div>
  </div>
</template>
@@ -39,9 +46,10 @@
import { useRouter } from "vue-router"
import request from "@/utils/request"
import { host, WebSocketHost } from '@/utils/constants'
import { onBeforeUnmount, onMounted, onUnmounted, reactive, ref } from "vue";
import { onBeforeUnmount, onMounted, onUnmounted, reactive, ref , nextTick} from "vue";
import { closeWebSocket, initializeWebSocket } from '@/utils/WebSocketService';
import { ElMessage, ElMessageBox } from 'element-plus'
import * as echarts from 'echarts';
const { t } = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
import { inject } from 'vue';
@@ -76,6 +84,7 @@
      }));
      // tableDatax.value = response.data.records;
      tableDatax.value = formattedData;
      createchart(tableDatax);
      totalRecords.value = response.data.total / 2 || 0
    } else {
      ElMessage.error(response.message);
@@ -121,6 +130,7 @@
      }));
      // tableDatax.value = response.data.records;
      tableDatax.value = formattedData;
      createchart(tableDatax);
      totalRecords.value = response.data.total / 2 || 0
    } else {
      ElMessage.error(response.message);
@@ -163,6 +173,7 @@
      }));
      // tableDatax.value = response.data.records;
      tableDatax.value = formattedData;
      createchart(tableDatax);
      totalRecords.value = response.data.total / 2 || 0
    } else {
      ElMessage.error(response.message);
@@ -266,8 +277,132 @@
  // 导出为文件
  const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
  const blob = new Blob([excelBuffer], { type: 'application/octet-stream' });
  saveAs(blob, '生产情况导出.xlsx');
  saveAs(blob, t('large.Productionsituation'));
};
let categories = ref([]); // 获取日期作为 x 轴
let totalAreaOutOne = ref([]);
let countIn = ref([]);
let totalAreaOutTwo = ref([]);
let totalAreaOut = ref([]);
let countOut = ref([]);
let hollowTotalAreaOutTwo = ref([]);
let hollowCountOutOne = ref([]);
let countOutTwo = ref([]);
let hollowCountOutTwo = ref([]);
let hollowTotalAreaOutOne = ref([]);
let totalAreaIn = ref([]);
let countOutOne = ref([]);
let myChart = null;
let myChart2 = null;
const chartRef = ref(null)
const chartRef2 = ref(null)
const showchart = ref(false)
const createchart = (productionVO) => {
  categories = productionVO.value.map(item => item.date); // 获取日期作为 x 轴
  totalAreaOutOne = productionVO.value.map(item => item.totalAreaOutOne);
  countIn = productionVO.value.map(item => item.countIn);
  totalAreaOutTwo = productionVO.value.map(item => item.totalAreaOutTwo);
  totalAreaOut = productionVO.value.map(item => item.totalAreaOut);
  countOut = productionVO.value.map(item => item.countOut);
  hollowTotalAreaOutTwo = productionVO.value.map(item => item.hollowTotalAreaOutTwo);
  hollowCountOutOne = productionVO.value.map(item => item.hollowCountOutOne);
  countOutTwo = productionVO.value.map(item => item.countOutTwo);
  hollowCountOutTwo = productionVO.value.map(item => item.hollowCountOutTwo);
  hollowTotalAreaOutOne = productionVO.value.map(item => item.hollowTotalAreaOutOne);
  totalAreaIn = productionVO.value.map(item => item.totalAreaIn);
  countOutOne = productionVO.value.map(item => item.countOutOne);
  //图表
  nextTick() // 确保 DOM 加载完成
  const chartDom = chartRef.value;
  if (!chartDom) {
    console.error('图表容器未找到');
    return;
  }
  if (!myChart) {
    myChart = echarts.init(chartDom);
  }
  const option = {
    title: { text: '' },
    tooltip: { trigger: 'axis' },
    legend: {
      data: [
        t('large.countOutOne'),
        t('large.totalAreaOutOne'),
        t('large.countOutTwo'),
        t('large.totalAreaOutTwo'),
        t('large.countIn'),
        t('large.totalAreaIn')
      ]
    },
    grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true },
    toolbox: { feature: { saveAsImage: {} } },
    xAxis: {
      type: 'category',
      boundaryGap: false,
      data: categories // 这是日期数据
    },
    yAxis: { type: 'value' },
    series: [
      { name: t('large.countOutOne'), type: 'bar', data: countOutOne },
      { name: t('large.totalAreaOutOne'), type: 'bar', data: totalAreaOutOne },
      { name: t('large.countOutTwo'), type: 'bar', data: countOutTwo },
      { name: t('large.totalAreaOutTwo'), type: 'bar', data: totalAreaOutTwo },
      { name: t('large.countIn'), type: 'bar', data: countIn },
      { name: t('large.totalAreaIn'), type: 'bar', data: totalAreaIn }
    ]
  };
  myChart.setOption(option);
  const chartDom2 = chartRef2.value;
  if (!chartDom2) {
    console.error('图表容器未找到');
    return;
  }
  // myChart2 = echarts.init(chartDom2);
  if (!myChart2) {
    myChart2 = echarts.init(chartDom2);
  }
  // else {
  //     myChart2.clear();
  //   }
  const option2 = {
    title: { text: '' },
    tooltip: { trigger: 'axis' },
    legend: {
      data: [
        t('large.totalAreaOut'),
        t('large.countOut'),
        t('large.hollowTotalAreaOutOne'),
        t('large.hollowCountOutOne'),
        t('large.hollowCountOutTwo'),
        t('large.hollowTotalAreaOutTwo')
      ]
    },
    grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true },
    toolbox: { feature: { saveAsImage: {} } },
    xAxis: {
      type: 'category',
      boundaryGap: false,
      data: categories // 这是日期数据
    },
    yAxis: { type: 'value' },
    series: [
      { name: t('large.totalAreaOut'), type: 'bar', data: totalAreaOut },
      { name: t('large.countOut'), type: 'bar', data: countOut },
      { name: t('large.hollowTotalAreaOutOne'), type: 'bar', data: hollowTotalAreaOutOne },
      { name: t('large.hollowCountOutOne'), type: 'bar', data: hollowCountOutOne },
      { name: t('large.hollowCountOutTwo'), type: 'bar', data: hollowCountOutTwo },
      { name: t('large.hollowTotalAreaOutTwo'), type: 'bar', data: hollowTotalAreaOutTwo }
    ]
  };
  myChart2.setOption(option2);
}
</script>
<style scoped></style>
UI-Project/src/views/largescreendisplay/timeaxis.vue
New file
@@ -0,0 +1,437 @@
<template>
  <div>
    <div style="display: flex;width: 1770px;justify-content: center;">
      <el-date-picker v-model="timeRange[1]" type="date" :placeholder="$t('reportmanage.starttime')"
        value-format="YYYY-MM-DD" style="margin-left: 15px;">
      </el-date-picker>
      <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="sethistorical()">{{
        $t('reportmanage.inquire') }}</el-button>
      <el-button type="primary" @click="exportToExcel">{{ $t('large.ExporttoExcel') }}</el-button>
    </div>
    <div style="width: 100%;height: 20%;display: flex;justify-content: center;">
      <div ref="chart" style="width: 100%;"></div>
    </div>
    <el-table ref="table" style="margin-top: 20px;height: 500px;width: 100%;" :data="tableDataTime(true)"
      :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
      <el-table-column prop="firstTimestamp" align="center" :label="$t('large.starttime')" min-width="70" />
      <el-table-column prop="secondTimestamp" align="center" :label="$t('large.endtime')" min-width="70" />
      <!-- <el-table-column prop="diffMinutes" align="center" :label="$t('large.diffMinutes')" min-width="70" /> -->
      <el-table-column prop="state" align="center" :label="$t('large.warehousing')" min-width="70">
        <template #default="scope">
          <span v-if="scope.row.state === 1">{{ $t('large.running') }}</span>
          <span v-else>{{ $t('large.stopping') }}</span>
        </template>
      </el-table-column>
    </el-table>
    <!-- <div style="margin-top: 20px;margin-left: 40%;">
      <el-pagination v-model:current-page="currentPage2" :page-size="pageSize" :size="large" :disabled="disabled"
        layout="prev, pager, next, jumper" :total="totalRecords" @current-change="handlePageChange2"
        style="margin-top: 10px;" />
    </div> -->
  </div>
</template>
<script lang="ts" setup>
import { useI18n } from 'vue-i18n'
import { useRouter, useRoute } from "vue-router"
import request from "@/utils/request"
import { host, WebSocketHost } from '@/utils/constants'
import { onBeforeUnmount, onMounted, onUnmounted, reactive, ref } from "vue";
import { closeWebSocket, initializeWebSocket } from '@/utils/WebSocketService';
import { ElMessage, ElMessageBox } from 'element-plus'
import * as echarts from 'echarts';
import { inject } from 'vue';
const { t } = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
const globalDate = inject('globalDate');
const router = useRoute()
const key = router.query.key;
const timeRange = ref([])
const selectValuesa = reactive([]);
const tableDatax = ref([])
const currentPage2 = ref(1)
const totalRecords = ref(0)
const rawGlassHeight = ref('');
const rawGlassThickness = ref('');
const rawGlassWidth = ref('');
const rawGlassfilmsId = ref('');
const slot = ref('');
let getglobalDate = window.localStorage.getItem('getglobalDate')
const historical = async () => {
  try {
    let startTime = window.localStorage.getItem('startTime')
    const response = await request.get("/cacheGlass/edgStorageDeviceTaskHistory/queryRunTimes?days=" + timeRange.value[1])
    if (response.code == 200) {
      ElMessage.success(response.message);
      // const formattedData = response.data.records.map(record => ({
      //   ...record,
      //   formattedCreateTime: formatTimestamp(record.createTime),
      //   formattedUpdateTime: formatTimestamp(record.updateTime),
      // }));
      tableDatax.value = response.data;
      timeAxisCreate("", chart.value, myChart, tableDataTime(false));
      // tableDatax.value = formattedData;
      // totalRecords.value = response.data.total / 2 || 0
    } else {
      ElMessage.error(response.message);
    }
  }
  catch (error) {
    console.error(error);
  }
}
const handlePageChange2 = (newPage) => {
  currentPage2.value = newPage;
  window.localStorage.setItem('pagenumber', currentPage2.value)
  historicala(currentPage2.value);
};
const tableDataTime = (result) => {
  const tableData = [];
  if (tableDatax.value.length > 0) {
    tableDatax.value.forEach((item, index) => {
      tableData.push({
        firstTimestamp: index == 0 ? item.startTimestamp : tableDatax.value[index - 1].secondTimestamp,
        secondTimestamp: index == tableDatax.length - 1 ? item.endTimestamp : item.firstTimestamp,
        diffMinutes: item.diffMinutes,
        startTimestamp: item.startTimestamp,
        endTimestamp: item.endTimestamp,
        state: 1
      });
      if (result) {
        tableData.push({
          firstTimestamp: item.firstTimestamp,
          secondTimestamp: item.secondTimestamp,
          diffMinutes: item.diffMinutes,
          startTimestamp: item.startTimestamp,
          endTimestamp: item.endTimestamp,
          state: 2
        });
      }
    });
  }
  return tableData;
};
const historicala = async (page) => {
  try {
    let pslot = ''
    let celllist = []
    if (selectValuesa[0] != null && selectValuesa[0] != 'undefined') {
      if (selectValuesa[0] != "") {
        celllist = [selectValuesa[0]];
      }
    }
    if (slot.value != "") {
      pslot = slot.value
    } else {
      pslot = '0'
    }
    let page = window.localStorage.getItem('pagenumber')
    let startTime = window.localStorage.getItem('startTime')
    const response = await request.get("/cacheGlass/edgStorageDeviceTaskHistory/queryRunTimes?days=" + timeRange.value[1])
    if (response.code == 200) {
      ElMessage.success(response.message);
      // const formattedData = response.data.records.map(record => ({
      //   ...record,
      //   formattedCreateTime: formatTimestamp(record.createTime),
      //   formattedUpdateTime: formatTimestamp(record.updateTime),
      // }));
      tableDatax.value = response.data;
      timeAxisCreate("", chart.value, myChart, tableDataTime(false));
      // tableDatax.value = formattedData;
      // totalRecords.value = response.data.total / 2 || 0
    } else {
      ElMessage.error(response.message);
    }
  }
  catch (error) {
    console.error(error);
  }
}
// 历史查询点击
const sethistorical = async () => {
  try {
    let pslot = ''
    let celllist = []
    if (selectValuesa[0] != null && selectValuesa[0] != 'undefined') {
      if (selectValuesa[0] != "") {
        celllist = [selectValuesa[0]];
      }
    }
    if (slot.value != "") {
      pslot = slot.value
    } else {
      pslot = '0'
    }
    let startTime = window.localStorage.getItem('startTime')
    let page = window.localStorage.getItem('pagenumber')
    const response = await request.get("/cacheGlass/edgStorageDeviceTaskHistory/queryRunTimes?days=" + timeRange.value[1])
    if (response.code == 200) {
      currentPage2.value = 1
      ElMessage.success(response.message);
      // const formattedData = response.data.records.map(record => ({
      //   ...record,
      //   formattedCreateTime: formatTimestamp(record.createTime),
      //   formattedUpdateTime: formatTimestamp(record.updateTime),
      // }));
      tableDatax.value = response.data;
      timeAxisCreate("", chart.value, myChart, tableDataTime(false));
      // tableDatax.value = formattedData;
      // totalRecords.value = response.data.total / 2 || 0
    } else {
      ElMessage.error(response.message);
    }
  }
  catch (error) {
    console.error(error);
  }
}
// 格式化时间戳为年月日时间字符串的函数
function formatTimestamp(timestamp) {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1,并补零
  const day = String(date.getDate()).padStart(2, '0'); // 补零
  const hours = String(date.getHours()).padStart(2, '0'); // 补零(如果需要显示时间)
  const minutes = String(date.getMinutes()).padStart(2, '0'); // 补零(如果需要显示时间)
  const seconds = String(date.getSeconds()).padStart(2, '0'); // 补零(如果需要显示时间)
  // return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
  return `${year}-${month}-${day}`;
}
// 格式化后端时间并计算一周前的时间
const defaultTime = ref<[Date, Date]>([new Date(), new Date()]);
function parseAndSetTime() {
  const backendTime = new Date(getglobalDate);
  const oneWeekAgo = new Date(backendTime.getTime() - 7 * 24 * 60 * 60 * 1000); // 减去7天
  oneWeekAgo.setHours(0, 0, 0, 0);
  backendTime.setHours(0, 0, 0, 0);
  timeRange.value = [formatTimestamp(oneWeekAgo), formatTimestamp(backendTime)];
  window.localStorage.setItem('startTime', formatTimestamp(oneWeekAgo))
}
function getStatusTypeb(taskState: number) {
  switch (taskState) {
    case 0:
      return 'primary';
    case 1:
      return 'success';
    case 2:
      return 'info';
  }
}
function getStatusTextb(taskState: number) {
  switch (taskState) {
    case 0:
      return t('searchOrder.empty');
    case 1:
      return t('film.execution');
    case 2:
      return t('searchOrder.endtask');
  }
}
function getStatusTypea(taskRunning: number) {
  switch (taskRunning) {
    case 0:
      return 'primary';
    case 1:
      return 'success';
  }
}
onMounted(() => {
  parseAndSetTime();
  historical();
});
import * as XLSX from 'xlsx';
import { saveAs } from 'file-saver';
const exportToExcel = () => {
  // 表格数据(深拷贝防止污染)
  const data = JSON.parse(JSON.stringify(tableDatax.value));
  // 表头转换为中文或国际化文本
  const headerMap = {
    date: t('large.date'),
    countOutOne: t('large.countOutOne'),
    totalAreaOutOne: t('large.totalAreaOutOne'),
    countOutTwo: t('large.countOutTwo'),
    totalAreaOutTwo: t('large.totalAreaOutTwo'),
    countIn: t('large.countIn'),
    totalAreaIn: t('large.totalAreaIn'),
    countOut: t('large.countOut'),
    totalAreaOut: t('large.totalAreaOut'),
    hollowCountOutOne: t('large.hollowCountOutOne'),
    hollowTotalAreaOutOne: t('large.hollowTotalAreaOutOne'),
    hollowCountOutTwo: t('large.hollowCountOutTwo'),
    hollowTotalAreaOutTwo: t('large.hollowTotalAreaOutTwo')
  };
  // 将数据中的 key 替换为中文表头
  const exportData = data.map(row => {
    const newRow = {};
    for (const key in headerMap) {
      newRow[headerMap[key]] = row[key];
    }
    return newRow;
  });
  // 转换为工作表
  const worksheet = XLSX.utils.json_to_sheet(exportData);
  const workbook = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
  // 导出为文件
  const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
  const blob = new Blob([excelBuffer], { type: 'application/octet-stream' });
  saveAs(blob, t('large.Productionandoperationstatus'));
};
let myChart = null;
const chart = ref(null)
const timeAxisCreate = (title, chartDom, mychart, RunTimes) => {
  if (!chartDom) {
    console.error('图表容器未找到');
    return;
  }
  if (!mychart) {
    mychart = echarts.init(chartDom);
  }
  let firstTime = null;
  let secondTime = null;
  if (RunTimes.length == 0) {
    firstTime = "00-00-00 00:00:00";
    secondTime = "00-00-00 00:00:00";
  } else {
    firstTime = RunTimes[0].startTimestamp;
    secondTime = RunTimes[0].endTimestamp;
  }
  // 构建线段数组
  const segments = RunTimes.map(item => ({
    type: 'line',
    symbol: 'none',
    data: [
      {
        value: [item.firstTimestamp, 0],
        extra: {
          start: item.firstTimestamp,
          end: item.secondTimestamp
        }
      },
      {
        value: [item.secondTimestamp, 0],
        extra: {
          start: item.firstTimestamp,
          end: item.secondTimestamp
        }
      }
    ],
    lineStyle: {
      color: 'red', // 支持不同颜色
      width: 4
    },
    z: 1
  }));
  const optionOne = {
    title: {
      text: title,
      left: 'center',
      top: '5%',
      textStyle: {
        fontSize: 16,
        fontWeight: 'bold',
        color: '#333'
      }
    },
    tooltip: {
      trigger: 'axis',
      axisPointer: { type: 'line' },
      backgroundColor: 'rgba(50,50,50,0.7)',
      textStyle: { color: '#fff' },
      formatter: (params) => {
        const items = params
          .map(p => {
            const start = p.data?.extra?.start;
            const end = p.data?.extra?.end;
            const timeStr = p.axisValueLabel;
            if (start && end) {
              return `开始时间:${start}<br/>结束时间:${end}`;
            }
            return `时间:${timeStr}`;
          })
          .filter(Boolean);
        return items.join('<br/>');
      }
    },
    grid: {
      top: '20%',
      left: '5%',
      right: '5%',
      bottom: '15%'
    },
    xAxis: {
      type: 'time',
      axisLabel: {
        formatter: function (value) {
          const date = new Date(value);
          return (
            date.getHours().toString().padStart(2, '0') + ':' +
            date.getMinutes().toString().padStart(2, '0') + ':' +
            date.getSeconds().toString().padStart(2, '0')
          );
        },
        fontSize: 10,
        color: '#666'
      },
      splitLine: { show: false },
      axisLine: { lineStyle: { color: '#aaa' } }
    },
    yAxis: {
      type: 'value',
      min: -1,
      max: 1,
      show: false
    },
    series: [
      // 主时间线(蓝色渐变,稍微加粗)
      {
        type: 'line',
        symbol: 'none',
        data: [
          [firstTime, 0],
          [secondTime, 0]
        ],
        lineStyle: {
          color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [
            { offset: 0, color: 'red' },
            { offset: 1, color: 'red' }
          ]),
          width: 5,
          shadowColor: 'rgba(0,0,0,0.2)',
          shadowBlur: 8
        },
        z: 0
      },
      // 小段时间线(统一柔和的黄色)
      ...segments.map(seg => ({
        ...seg,
        lineStyle: {
          color: '#4facfe',
          width: 3,
          shadowColor: 'rgba(255,204,0,0.5)',
          shadowBlur: 5
        }
      })),
    ]
  };
  mychart.setOption(optionOne);
};
</script>
<style scoped></style>
hangzhoumesParent/gateway/pom.xml
@@ -13,8 +13,7 @@
    <artifactId>gateway</artifactId>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <java.run.main.class>com.mes.GateWayApplication</java.run.main.class>
    </properties>
    <dependencies>
        <!--        服务注册/发现-->
@@ -33,6 +32,87 @@
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.0.RELEASE</version> <!-- 根据你的Spring Boot版本调整 -->
                <configuration>
                    <layout>ZIP</layout>
                    <includes>
                        <include>
                            <groupId>nothing</groupId>
                            <artifactId>nothing</artifactId>
                        </include>
                    </includes>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.1.2</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/config</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>src/main/resources</directory>
                                    <filtering>true</filtering>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>${java.run.main.class}</mainClass>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>resources/</Class-Path>
                        </manifestEntries>
                    </archive>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>
hangzhoumesParent/moduleService/CacheGlassModule/pom.xml
@@ -23,16 +23,15 @@
            <artifactId>jcifs</artifactId>
            <version>1.2.19</version>
        </dependency>
<!--        <dependency>-->
<!--            <groupId>com.github.yulichang</groupId>-->
<!--            <artifactId>mybatis-plus-join-boot-starter</artifactId>-->
<!--            <version>1.4.12</version>-->
<!--        </dependency>-->
        <!--        <dependency>-->
        <!--            <groupId>com.github.yulichang</groupId>-->
        <!--            <artifactId>mybatis-plus-join-boot-starter</artifactId>-->
        <!--            <version>1.4.12</version>-->
        <!--        </dependency>-->
    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <java.run.main.class>com.mes.CacheGlassModuleApplication</java.run.main.class>
    </properties>
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/OpcCacheGlassNewTask.java
@@ -261,11 +261,14 @@
        }
        int firstLength = minTwoFirstLength;
        int secondLength = minTwoSecondLength;
        int fecondMaxLength = 2300;
        if (deviceId == 1) {
            firstLength = minOneFirstLength;
            secondLength = minOneSecondLength;
            fecondMaxLength = 2500;
        }
        if (Math.max(glassInfo.getWidth(), glassInfo.getHeight()) < firstLength || Math.min(glassInfo.getWidth(), glassInfo.getHeight()) < secondLength) {
        if (Math.max(glassInfo.getWidth(), glassInfo.getHeight()) < firstLength || Math.min(glassInfo.getWidth(), glassInfo.getHeight()) < secondLength
                || Math.max(glassInfo.getWidth(), glassInfo.getHeight()) > fecondMaxLength) {
            log.info("进片玻璃尺寸小于{}*{},禁止进笼玻璃id:{},尺寸为{}、{}", firstLength, secondLength, task.getGlassIdIn(), glassInfo.getWidth(), glassInfo.getHeight());
            Date endDate = new Date();
            log.info("结束进片任务设备为{},结束时间为:{},共耗时:{}ms", deviceId, endDate, endDate.getTime() - startDate.getTime());
hangzhoumesParent/moduleService/CacheVerticalGlassModule/pom.xml
@@ -19,8 +19,7 @@
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <java.run.main.class>com.mes.CacheVerticalClassModuleApplication</java.run.main.class>
    </properties>
</project>
hangzhoumesParent/moduleService/GlassStorageModule/pom.xml
@@ -33,8 +33,7 @@
    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <java.run.main.class>com.mes.GlassStorageApplication</java.run.main.class>
    </properties>
</project>
hangzhoumesParent/moduleService/GlassStorageModule/src/main/java/com/mes/job/RawGlassTask.java
@@ -17,8 +17,6 @@
import com.mes.rawglassstation.service.RawGlassStorageStationService;
import com.mes.rawglasstask.entity.RawGlassStorageTask;
import com.mes.rawglasstask.service.RawGlassStorageTaskService;
import com.mes.s7.entity.S7Data;
import com.mes.s7.job.S7Job;
import com.mes.uppattenusage.entity.UpPattenUsage;
import com.mes.uppattenusage.entity.vo.UpPattenUsageVO;
import com.mes.uppattenusage.mapper.UpPattenUsageMapper;
@@ -92,25 +90,25 @@
        if ("0".equals(requestValue)) {
            if ("1".equals(confireWord) && "0".equals(reportWord)) {
//            if ("1".equals(confireWord.getValue() + "") && "0".equals(reportWord.getValue() + "")) {
                S7Data s7Data = new S7Data();
                s7Data.setConfirmation((short) 0);
                s7Serializer.write(s7Data);
//                List<ReadWriteEntity> list = new ArrayList<>();
//                list.add(generateReadWriteEntity("CC.CC.confirmation", 0));
//                miloService.writeToOpcWord(list);
//                S7Data s7Data = new S7Data();
//                s7Data.setConfirmation((short) 0);
//                s7Serializer.write(s7Data);
                List<ReadWriteEntity> list = new ArrayList<>();
                list.add(generateReadWriteEntity("CC.CC.confirmation", 0));
                miloService.writeToOpcWord(list);
            }
            if ("1".equals(taskWord)) {
//          if ("1".equals(taskWord.getValue() + "")) {
                S7Data s7Data = new S7Data();
                s7Data.setTaskWord((short) 0);
                s7Data.setStartSlot((short) 0);
                s7Data.setEndSlot((short) 0);
                s7Serializer.write(s7Data);
//                List<ReadWriteEntity> list = new ArrayList<>();
//                list.add(generateReadWriteEntity("CC.CC.taskWord", 0));
//                list.add(generateReadWriteEntity("CC.CC.startSlot", 0));
//                list.add(generateReadWriteEntity("CC.CC.endSlot", 0));
//                miloService.writeToOpcWord(list);
//            if ("1".equals(taskWord)) {
          if ("1".equals(taskWord.getValue() + "")) {
//                S7Data s7Data = new S7Data();
//                s7Data.setTaskWord((short) 0);
//                s7Data.setStartSlot((short) 0);
//                s7Data.setEndSlot((short) 0);
//                s7Serializer.write(s7Data);
                List<ReadWriteEntity> list = new ArrayList<>();
                list.add(generateReadWriteEntity("CC.CC.taskWord", 0));
                list.add(generateReadWriteEntity("CC.CC.startSlot", 0));
                list.add(generateReadWriteEntity("CC.CC.endSlot", 0));
                miloService.writeToOpcWord(list);
            }
            return;
        }
@@ -237,12 +235,12 @@
                    .set(RawGlassStorageTask::getTaskState, Const.RAW_GLASS_TASK_FAILURE));
        }
        S7Data s7Data = new S7Data();
        s7Data.setConfirmation((short) 1);
        s7Serializer.write(s7Data);
//        List<ReadWriteEntity> list = new ArrayList<>();
//        list.add(generateReadWriteEntity("CC.CC.confirmation", 1));
//        miloService.writeToOpcWord(list);
//        S7Data s7Data = new S7Data();
//        s7Data.setConfirmation((short) 1);
//        s7Serializer.write(s7Data);
        List<ReadWriteEntity> list = new ArrayList<>();
        list.add(generateReadWriteEntity("CC.CC.confirmation", 1));
        miloService.writeToOpcWord(list);
    }
    private boolean isHasRunningTask() {
hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application-prod.yml
@@ -22,7 +22,7 @@
  cloud:
    nacos:
      discovery:
        server-addr: 10.153.19.150:8848
        server-addr: 10.153.19.150:8849
  redis:
    database: 0
    host: 10.153.19.150
hangzhoumesParent/moduleService/LoadGlassModule/pom.xml
@@ -26,8 +26,7 @@
    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <java.run.main.class>com.mes.LoadGlassModuleApplication</java.run.main.class>
    </properties>
</project>
hangzhoumesParent/moduleService/TemperingGlassModule/pom.xml
@@ -26,8 +26,7 @@
    </dependencies>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <java.run.main.class>com.mes.TemperingGlassModuleApplication</java.run.main.class>
    </properties>
</project>
hangzhoumesParent/moduleService/hollowGlassModule/pom.xml
@@ -12,8 +12,7 @@
    <artifactId>hollowGlass</artifactId>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <java.run.main.class>com.mes.HollowGlassApplication</java.run.main.class>
    </properties>
</project>
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/job/OpcHollowRemoveTask.java
@@ -51,11 +51,14 @@
        }
        int request = Integer.parseInt(requestEntity.getValue() + "");
        int flagRequest = request & 3;
        ReadWriteEntity glassIdEntity = miloService.readFromOpcUa(cell + "glassId");
        log.info("除膜{}获取当前的信号为:{},玻璃id:{}", cell, flagRequest, glassIdEntity);
        if (flagRequest != 3) {
            log.info("当前未收到请求玻璃id数据,结束任务");
            return;
        }
        ReadWriteEntity glassIdEntity = miloService.readFromOpcUa(cell + "glassId");
        log.info("除膜{}获取当前的玻璃id:{}", cell, glassIdEntity);
        if (null == glassIdEntity.getValue() || StringUtils.isBlank(glassIdEntity.getValue() + "")) {
            log.info("当前未收到玻璃id数据,结束任务");
            return;
@@ -71,7 +74,7 @@
        List<ReadWriteEntity> ualist = new ArrayList<>();
        List<ReadWriteEntity> wordlist = new ArrayList<>();
        log.info("除膜{}获取玻璃{},是否除膜:{}", cell, glassIdEntity.getValue(), detailsVO.getFilmRemove());
        if (detailsVO.getFilmRemove() == 0) {
            // 10111011
            int sendId = request & 63;
@@ -120,6 +123,7 @@
        }
        //向电气发送清楚信号
        int sendId = request & 251;
        log.info("{}收到除膜机ID接收完成信号,将写入数据完成置0,发送数据为:{}", cell, sendId);
        List<ReadWriteEntity> list = new ArrayList<>();
        list.add(opcPlcStorageCageHollowTask.generateReadWriteEntity(cell + "mesControl", sendId));
        miloService.writeToOpcWord(list);
hangzhoumesParent/moduleService/pom.xml
@@ -80,6 +80,87 @@
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.0.RELEASE</version> <!-- 根据你的Spring Boot版本调整 -->
                <configuration>
                    <layout>ZIP</layout>
                    <includes>
                        <include>
                            <groupId>nothing</groupId>
                            <artifactId>nothing</artifactId>
                        </include>
                    </includes>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.1.2</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <overWriteReleases>false</overWriteReleases>
                            <overWriteSnapshots>false</overWriteSnapshots>
                            <overWriteIfNewer>true</overWriteIfNewer>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <id>copy-resources</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-resources</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/config</outputDirectory>
                            <resources>
                                <resource>
                                    <directory>src/main/resources</directory>
                                    <filtering>true</filtering>
                                </resource>
                            </resources>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>${java.run.main.class}</mainClass>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>resources/</Class-Path>
                        </manifestEntries>
                    </archive>
                    <outputDirectory>${project.build.directory}</outputDirectory>
                </configuration>
            </plugin>
        </plugins>
    </build>