廖井涛
2025-12-01 21eed4f6a8065bb59d0aaf7481dfe145dba74f2a
Merge branch 'master' of http://10.153.19.25:10105/r/ERP_override
37个文件已修改
1个文件已添加
1396 ■■■■ 已修改文件
north-glass-erp/northglass-erp/src/components/BrokenReportTemplate.vue 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/pp/PrintProcess.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/ar.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/en.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/kr.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/ru.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/zh.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/上海北玻.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/天津北玻.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/常州吉利.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/新疆恒鑫.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/洛阳北玻.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/温州巨星.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/金华天成.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCard.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectDetail.vue 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/replenish/SelectReplenish.vue 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/report/DamageReport.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/report/QualityReport.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/report/TeamOutput.vue 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/sd/order/UpdateOrderCraft.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/pp/ReplenishController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/dto/pp/TeamOutputDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/dto/pp/exportReplenishDTO.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/pp/GlassOptimizeMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/pp/PatchLogMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java 123 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/ReplenishService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/ReportService.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/sd/OrderFileService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/PatchLogMapper.xml 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/Report.xml 478 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/ReportingWork.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/ReworkMapper.xml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/sd/OrderProcessDetailMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/BrokenReportTemplate.vue
@@ -10,10 +10,13 @@
import * as XLSX from "xlsx";
import {useI18n} from "vue-i18n";
import useOrderInfoStore from "@/stores/sd/order/orderInfo";
import companyInfo from "@/stores/sd/companyInfo";
import {VxeUI} from "vxe-pc-ui";
const { t } = useI18n()
const xGrid = ref()
const company = companyInfo()
let filterData = ref({})
const reportTime=company.reportTime
const orderInfo = useOrderInfoStore()
const gridOptions = reactive({
  loading:true,
@@ -184,7 +187,7 @@
    })
    return
  }
  request.post(`${props.childrenData.url}/${basicProp.value.pageNum}/${basicProp.value.pageSize}/${orderInfo.brokenDate}`,filterData.value).then(res => {
  request.post(`${props.childrenData.url}/${basicProp.value.pageNum}/${basicProp.value.pageSize}/${orderInfo.brokenDate}/${reportTime}`,filterData.value).then(res => {
    if(res.code === '200'){
      props.childrenData.data = res.data.data
      basicProp.value.pageTotal = res.data.total.pageTotal
@@ -205,7 +208,9 @@
  }
}
const handleCellDblClick = ({ row, column, cell, $event }) => {
  VxeUI.clipboard.copy(row[column.property])
}
</script>
<template>
@@ -234,6 +239,7 @@
          ref="xGrid"
          v-bind="gridOptions"
          v-on="gridEvents"
          @cell-dblclick="handleCellDblClick"
      >
        <!--      ä¸‹æ‹‰æ˜¾ç¤ºæ‰€æœ‰ä¿¡æ¯æ’æ§½-->
        <template #content="{ row }">
north-glass-erp/northglass-erp/src/components/pp/PrintProcess.vue
@@ -346,18 +346,18 @@
    </tr>
    <tr v-for="(items,index) in item.detail" :key="index">
      <td class="tdNowrap">客户名称:</td>
      <td colspan="2">{{ items.customer_name }}</td>
      <td colspan="4">{{ items.customer_name }}</td>
      <td class="tdNowrap">项目名称:</td>
      <td colspan="4" style="min-width: 250px;">{{ items.projectBatch }}</td>
      <td colspan="3" style="min-width: 250px;">{{ items.projectBatch }}</td>
      <td class="tdNowrap">工艺流程:</td>
      <td :colspan="2+item.processList.length*2"  style="width: 500px">{{ items.process }}</td>
    </tr>
    <tr v-for="(itemTr,index) in item.detail" :key="index">
      <td class="tdNowrap">磨边类型:</td>
      <td v-if="name=='天津北玻玻璃工业技术有限公司(TJBB-QR7.1-01)'"  colspan="2">{{ itemTr.other_remarks }}</td>
      <td v-else colspan="2">{{ itemTr.edging_type }}</td>
      <td v-if="name=='天津北玻玻璃工业技术有限公司(TJBB-QR7.1-01)'"  colspan="4">{{ itemTr.other_remarks }}</td>
      <td v-else colspan="4">{{ itemTr.edging_type }}</td>
      <td class="tdNowrap">单片名称:</td>
      <td colspan="4">{{ itemTr.glass_child }}</td>
      <td colspan="3">{{ itemTr.glass_child }}</td>
      <td class="tdNowrap">产品名称:</td>
      <td :colspan="2+item.processList.length*2">{{ itemTr.product_name }}</td>
    </tr>
@@ -365,7 +365,7 @@
      <td rowspan='2'>序号</td>
      <td rowspan='2'>图号</td>
      <td rowspan='2'>编号</td>
      <td rowspan="2">小片顺序</td>
      <td rowspan="2">层号</td>
      <td rowspan='2' style="width: 90px">宽(弧长)*高</td>
      <td rowspan='2' >数量</td>
      <td rowspan='2'>面积</td>
@@ -419,7 +419,7 @@
      <td colspan="2"></td>
      <td colspan="2"></td>
      <td colspan="2"></td>
      <td colspan="2"></td>
      <td colspan="1"></td>
      <template v-for=" n in item.processList.length">
        <td colspan="2"></td>
      </template>
@@ -430,7 +430,7 @@
      <td colspan="2"></td>
      <td colspan="2"></td>
      <td colspan="2"></td>
      <td colspan="2"></td>
      <td colspan="1"></td>
      <template v-for=" n in item.processList.length">
        <td colspan="2"></td>
      </template>
@@ -475,7 +475,9 @@
      <tr v-for="(itemtextareas,index) in item.detail" :key="index">
        <td  colspan="31"  style="width: 480px;height: 150px ">
          <div style="width: 100%;height: 100%;text-align: left"><textarea style="height: 99%;width: 99%;border: none;;font-size: 16px;font-weight: bold;overflow: hidden;text-align: left;vertical-align: middle">{{itemtextareas.processing_note}}</textarea>
          <div style="width: 100%;height: 100%;text-align: left">
            <textarea v-if="!company.processFontSize" style="height: 99%;width: 99%;border: none;;font-size: 14px;font-weight: bold;overflow: hidden;text-align: left;vertical-align: middle">{{itemtextareas.processing_note}}</textarea>
            <textarea v-else style="height: 99%;width: 99%;border: none;;font-size: 36px;font-weight: bold;overflow: hidden;text-align: left;vertical-align: middle">{{itemtextareas.processing_note}}</textarea>
          </div>
        </td>
      </tr>
north-glass-erp/northglass-erp/src/lang/ar.js
@@ -1156,7 +1156,8 @@
        finishedProductReport :'تقرير Ø§Ù„منتجات Ø§Ù„نهائية',
        workProcessName:'在制品名称',
        StorageArea:'入库面积',
        shippedArea:'发货面积'
        shippedArea:'发货面积',
        thicknessArea:'平方毫米'
    },
    productionBasicData:{
north-glass-erp/northglass-erp/src/lang/en.js
@@ -1156,7 +1156,8 @@
        finishedProductReport :'Finished product report',
        workProcessName:'在制品名称',
        StorageArea:'入库面积',
        shippedArea:'发货面积'
        shippedArea:'发货面积',
        thicknessArea:'平方毫米'
    },
    productionBasicData:{
north-glass-erp/northglass-erp/src/lang/kr.js
@@ -1156,7 +1156,8 @@
        finishedProductReport :'완제품 ë³´ê³ ì„œ',
        workProcessName:'在制品名称',
        StorageArea:'入库面积',
        shippedArea:'发货面积'
        shippedArea:'发货面积',
        thicknessArea:'平方毫米'
    },
    productionBasicData:{
north-glass-erp/northglass-erp/src/lang/ru.js
@@ -1156,7 +1156,8 @@
        finishedProductReport :'Отчет Ð¾ Ð³Ð¾Ñ‚овой Ð¿Ñ€Ð¾Ð´ÑƒÐºÑ†Ð¸Ð¸',
        workProcessName:'在制品名称',
        StorageArea:'入库面积',
        shippedArea:'发货面积'
        shippedArea:'发货面积',
        thicknessArea:'平方毫米'
    },
    productionBasicData:{
north-glass-erp/northglass-erp/src/lang/zh.js
@@ -1158,7 +1158,8 @@
        finishedProductReport :'成品报表',
        workProcessName:'在制品名称',
        StorageArea:'入库面积',
        shippedArea:'发货面积'
        shippedArea:'发货面积',
        thicknessArea:'平方毫米'
    },
    productionBasicData:{
north-glass-erp/northglass-erp/src/stores/sd/companySet/ÉϺ£±±²£.js
@@ -50,6 +50,8 @@
        alienFunction:false,//是否开启异形功能,暂时都是false
        replenishQRCode:1,//是否补片二维码是否拆分层,1拆分,2不拆
        soleQRCode:false,//流程卡合并二维码显示单层,义乌true.其它false
        reportTime:"08:00",//次破、产量报表默认时间
        processFontSize:false,//流程卡加工要求字体加大
        //天津
        printLabel: {
            custom: (item1) => {
north-glass-erp/northglass-erp/src/stores/sd/companySet/Ìì½ò±±²£.js
@@ -49,6 +49,8 @@
        alienFunction:false,//是否开启异形功能,暂时都是false
        replenishQRCode:2,//是否补片二维码是否拆分层,1拆分,2不拆
        soleQRCode:false,//流程卡合并二维码显示单层,义乌true.其它false
        reportTime:"08:00",//次破、产量报表默认时间
        processFontSize:false,//流程卡加工要求字体加大
        //天津
        printLabel: {
            custom: (item1) => {
north-glass-erp/northglass-erp/src/stores/sd/companySet/³£ÖݼªÀû.js
@@ -49,6 +49,8 @@
        alienFunction:false,//是否开启异形功能,暂时都是false
        replenishQRCode:1,//是否补片二维码是否拆分层,1拆分,2不拆
        soleQRCode:false,//流程卡合并二维码显示单层,义乌true.其它false
        reportTime:"08:00",//次破、产量报表默认时间
        processFontSize:false,//流程卡加工要求字体加大
        //天津
        printLabel: {
            custom: (item1) => {
north-glass-erp/northglass-erp/src/stores/sd/companySet/н®ºãöÎ.js
@@ -49,6 +49,8 @@
        alienFunction:false,//是否开启异形功能,暂时都是false
        replenishQRCode:1,//是否补片二维码是否拆分层,1拆分,2不拆
        soleQRCode:false,//流程卡合并二维码显示单层,义乌true.其它false
        reportTime:"08:00",//次破、产量报表默认时间
        processFontSize:false,//流程卡加工要求字体加大
        //天津
        printLabel: {
            custom: (item1) => {
north-glass-erp/northglass-erp/src/stores/sd/companySet/ÂåÑô±±²£.js
@@ -50,6 +50,8 @@
        alienFunction:false,//是否开启异形功能,暂时都是false
        replenishQRCode:1,//是否补片二维码是否拆分层,1拆分,2不拆
        soleQRCode:false,//流程卡合并二维码显示单层,义乌true.其它false
        reportTime:"08:00",//次破、产量报表默认时间
        processFontSize:false,//流程卡加工要求字体加大
        //天津
        printLabel: {
            custom: (item1) => {
north-glass-erp/northglass-erp/src/stores/sd/companySet/ÎÂÖݾÞÐÇ.js
@@ -51,6 +51,8 @@
        alienFunction:true,//是否开启异形功能,暂时都是false
        replenishQRCode:1,//是否补片二维码是否拆分层,1拆分,2不拆
        soleQRCode:false,//流程卡合并二维码显示单层,义乌true.其它false
        reportTime:"07:30",//次破、产量报表默认时间
        processFontSize:true,//流程卡加工要求字体加大
        //天津
        printLabel: {
            custom: (item1) => {
north-glass-erp/northglass-erp/src/stores/sd/companySet/½ð»ªÌì³É.js
@@ -51,6 +51,8 @@
        alienFunction:false,//是否开启异形功能,暂时都是false
        replenishQRCode:1,//是否补片二维码是否拆分层,1拆分,2不拆
        soleQRCode:true,//流程卡合并二维码显示单层,义乌true.其它false
        reportTime:"08:00",//次破、产量报表默认时间
        processFontSize:false,//流程卡加工要求字体加大
        //天津
        printLabel: {
            custom: (item1) => {
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCard.vue
@@ -309,10 +309,10 @@
      ElMessage.error(t('order.msg.pleaseCancelTheFilteringFirst'))
      return
    }
    if (selectRecords.length == 0) {
      ElMessage.warning(t('reportingWorks.selectProcessCardData'))
      return;
    }
    // if (selectRecords.length == 0) {
    //   ElMessage.warning(t('reportingWorks.selectProcessCardData'))
    //   return;
    // }
    let projectData = ref({
      projectdetail: selectRecords,
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectDetail.vue
@@ -55,18 +55,21 @@
    {field: 'width',
      width: 100,
      title: t('order.width'),
      editRender: { name: 'input' },
      sortable: true
    },
    {
      field: 'height',
      width: 100,
      title: t('order.height'),
      editRender: { name: 'input' },
      sortable: true
    },
    {
      field: 'quantity',
      width: 150,
      title: t('order.quantity'),
      editRender: { name: 'input' },
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      sortable: true
@@ -212,15 +215,28 @@
    body: {
      options: [
        [
          {code: 'setAmount', name: '设置统一磨量',},
          {code: 'setAmount', name: '设置统一磨量',prefixIcon:'vxe-icon-edit'},
          {code: 'addRow', name: '添加临时小片', prefixIcon: 'vxe-icon-add', visible: true, disabled: false},
          {code: 'displayProcessCard', name: '显示流程卡',},
          {code: 'hideProcessCard', name: '隐藏流程卡',},
          {code: 'setShape', name: '设置图形',},
          {code: 'Export', name: '数据导出', prefixIcon: 'vxe-icon-download', visible: true, disabled: false},
          {code: 'safeDXF', name: '图形另存为DXF',},
          {code: 'exportOPTIMA', name: '导出数据到OPTIMA',},
          {code: 'copyChecked', name: t('basicData.selectSame'), prefixIcon: 'vxe-icon-copy', visible: true, disabled: false },
          {code: 'copyAll', name: t('basicData.sameAfterwards'), prefixIcon: 'vxe-icon-feedback', visible: true, disabled: false },
          {
            code: 'copyChecked',
            name: t('basicData.selectSame'),
            prefixIcon: 'vxe-icon-copy',
            visible: true,
            disabled: false
          },
          {
            code: 'copyAll',
            name: t('basicData.sameAfterwards'),
            prefixIcon: 'vxe-icon-feedback',
            visible: true,
            disabled: false
          },
        ],
        []
      ]
@@ -307,10 +323,89 @@
    }
  },
  {
    code: 'Export', // å¯¼å‡ºæ–‡ä»¶æ“ä½œçš„配置
    successMsg: '文件导出成功!',
    code: 'addRow',
    successMsg: '已添加',
    gridRef: xGrid,
    requiresRow: false,
    addNewRow: async () => {
      // èŽ·å–å½“å‰çš„ç£¨é‡é…ç½®
      let currentGrindConfig = null;
      try {
        const res = await request.post(`/glassOptimize/getConfiguration/磨量/${username}`);
        if (res.code == "200" && res.data.data && res.data.data.length > 0) {
          const rawData = res.data.data[0];
          currentGrindConfig = {};
          for (const key in rawData) {
            if (typeof rawData[key] === 'string') {
              currentGrindConfig[key] = rawData[key].replace(/^\"|\"$/g, '');
            } else {
              currentGrindConfig[key] = rawData[key];
            }
          }
        }
      } catch (error) {
        console.warn('获取磨量配置失败:', error);
      }
      // æ ¹æ®ç£¨é‡é…ç½®è®¾ç½®é»˜è®¤å€¼
      let defaultLongGrind1 = 0;
      let defaultLongGrind2 = 0;
      let defaultShortGrind1 = 0;
      let defaultShortGrind2 = 0;
      if (currentGrindConfig) {
        defaultLongGrind1 = parseFloat(currentGrindConfig.leftEdge) || 0;
        defaultLongGrind2 = parseFloat(currentGrindConfig.rightEdge) || 0;
        defaultShortGrind1 = parseFloat(currentGrindConfig.upEdge) || 0;
        defaultShortGrind2 = parseFloat(currentGrindConfig.downEdge) || 0;
      }
      // åˆ›å»ºæ–°è¡Œæ•°æ®ï¼Œå°† width、height、quantity è®¾ç½®ä¸ºæ•°å€¼ç±»åž‹
      const newRow = {
        order_number: 0,
        width: 0,
        height: 0,
        quantity: 0,
        longGrind1: defaultLongGrind1,
        longGrind2: defaultLongGrind2,
        shortGrind1: defaultShortGrind1,
        shortGrind2: defaultShortGrind2,
        shape: '',
        process_id: '',
        productName: '',
        price: 0,
        remark: '',
        buildingNumber: '',
        perimeter: 0,
        area: 0,
        rackNo: 1,
        layer: 1,
        glass_child: '',
        markIcon: '',
        processId: '',
        totalLayer: 0,
        patchState: 0,
        heatLayoutId: 0,
        process: '',
        orderNo: '',
        customerName: '',
        processingNote: '',
        projectName: ''
      };
      // å°†æ–°è¡Œæ·»åŠ åˆ°è¡¨æ ¼æ•°æ®ä¸­
      const currentData = gridOptions.data || [];
      const updatedData = [...currentData, newRow];
      gridOptions.data = updatedData;
      xGrid.value.loadData(updatedData);
      // èŽ·å–æ–°æ·»åŠ è¡Œçš„ç´¢å¼•
      const newIndex = updatedData.length - 1;
      // é€‰ä¸­å¹¶ç¼–辑新行
      await nextTick();
      xGrid.value.setActiveRow(newRow);
    }
  },
  {
    code: 'safeDXF',
@@ -358,6 +453,20 @@
        if (config.code === 'Export') {
          config.gridRef.value.exportData();
          ElMessage.success(config.successMsg);
          return;
        }
        if (config.code === 'addRow') {
          // æ·»åŠ ç¡®è®¤æç¤ºå¼¹çª—ï¼Œè¯¢é—®ç”¨æˆ·æ˜¯å¦è¿›è¡Œå½“å‰æ“ä½œ
          ElMessageBox.confirm('是否添加临时小片?', '确认操作', {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
          }).then(() => {
            config.addNewRow();
            ElMessage.success(config.successMsg);
          }).catch(() => {
            ElMessage.info('已取消操作');
          });
          return;
        }
        if (config.code === 'copyChecked') {
@@ -487,20 +596,35 @@
    optimizeData.value.glassDetails = [];
    // ä»Žè¡¨æ ¼ä¸­èŽ·å– glassDetail æ•°æ®ï¼Œè€Œä¸æ˜¯ä»ŽåŽç«¯æŽ¥å£è¯»å–
    const tableData = xGrid.value.getTableData().fullData;
    let totalQuantity = 0;
    let totalArea = 0;
    tableData.forEach(item => {
      const width = parseFloat(item.width) || 0;
      const height = parseFloat(item.height) || 0;
      const quantity = parseInt(item.quantity) || 0;
      // ä½¿ç”¨é•¿Ã—宽×数量来计算总面积
      totalArea += (width * height * quantity) / 1000000; // è½¬æ¢ä¸ºå¹³æ–¹ç±³
      totalQuantity += quantity;
    });
    quantitys.value = totalQuantity;
    areas.value = totalArea;
    const glassDetailData = tableData.map(item => {
      let rackNoValue = 0;
      if (item.rackNo !== undefined && item.rackNo !== null && item.rackNo !== '') {
        rackNoValue = item.rackNo;
      }
      return {
        width: item.width,
        height: item.height,
        width: parseFloat(item.width) || 0,
        height: parseFloat(item.height) || 0,
        processId: item.processId,
        layer: item.layer,
        totalLayer: item.totalLayer,
        orderSort: item.order_number,
        markIcon: item.markIcon,
        quantity: item.quantity,
        quantity: parseInt(item.quantity) || 0,
        patchState: item.patchState,
        upGrind: item.longGrind1,
        downGrind: item.longGrind2,
@@ -573,7 +697,6 @@
      }
    }
);
// å•独处理选中原片数据的逻辑
watch(
    () => props.CheckboxChangeData,
@@ -746,7 +869,7 @@
      xGrid.value.loadData(data);
      gridOptions.data = data;
      projectName.value = data[0].project_name;
      projectName.value = res.data.project.project_name;
      quantitys.value=res.data.project.glass_total
      areas.value=res.data.project.glass_total_area
north-glass-erp/northglass-erp/src/views/pp/replenish/SelectReplenish.vue
@@ -190,6 +190,10 @@
        'code':'cancelReview'
      }
    ],
    slots: {
      tools: 'toolbar_buttons',
      buttons:'buttons'
    },
    /*import: false,
    export: true,
    print: true,*/
@@ -362,8 +366,53 @@
  reserve:true
}
const exportEvent = () => {
  const $table = xGrid.value
  if ($table) {
    $table.exportData({
      filename: 'order_export',
      sheetName: 'Sheet1',
      type: 'xlsx'
    })
  }
}
function exportExcel(url, fileName,date) {
  gridOptions.loading = true
  if(date===null){
    ElMessage.warning(t('report.pleaseSelectADateFirst'))
    return
  }
  const date1 = new Date(date[0]);
  const date2 = new Date(date[1]);
  const timeDiff = Math.abs(date2.getTime() - date1.getTime());
  const daysDiff = timeDiff / (1000 * 3600 * 24);
  if(Math.floor(daysDiff)>180){
    ElMessage.warning(t('report.theFilteringTimeForExportCannotExceed180Days'))
    return
  }
  let dataMp = ref({
    date: date,
  })
  request.post(url,date,{responseType :'blob'}).then(res => {
    const blob = new Blob([res])
    if ('download' in document.createElement('a')) { // éžIE下载
      const elink = document.createElement('a')
      elink.download = `${fileName}.xlsx`
      elink.style.display = 'none'
      elink.href = URL.createObjectURL(blob)
      document.body.appendChild(elink)
      elink.click()
      URL.revokeObjectURL(elink.href) // é‡Šæ”¾URL å¯¹è±¡
      document.body.removeChild(elink)
      gridOptions.loading = false
    } else { // IE10+下载
      navigator.msSaveBlob(blob, fileName)
    }
  })
}
</script>
<template>
@@ -444,7 +493,18 @@
          >
          </vxe-pager>
        </template>
        <template #toolbar_buttons>
          <vxe-button icon="vxe-icon-download" circle
                      style="margin-right: 0.5rem"
                      @click="exportEvent" />
          <vxe-button icon="vxe-icon-cloud-download" style="margin-right: 0.5rem"
                      circle
                      @click="exportExcel('/Replenish/exportReplenish',
                                          t('replenish.patchManagement'),
                                          selectDate)" />
        </template>
      </vxe-grid>
    </div>
north-glass-erp/northglass-erp/src/views/pp/report/DamageReport.vue
@@ -44,8 +44,8 @@
    {field: 'breakageReason', width: 120, title: t('reportingWorks.breakageReason'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
    {field: 'thisProcess',width: 120, title: t('reportingWorks.reportingProcess'), sortable: true,showOverflow:"ellipsis" ,filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
    {field: 'creator',width: 120, title: t('product.creator'), sortable: true,showOverflow:"ellipsis" ,filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
    {field: 'childWidth', width: 100, title: t('order.width'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
    {field: 'childHeight', width: 100, title: t('order.height'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
    {field: 'childWidth', width: 100, title: t('order.width')},
    {field: 'childHeight', width: 100, title: t('order.height')},
    {field: 'breakageQuantity', width: 120, title: t('reportingWorks.quantityBroken')},
    {field: 'area', width: 120, title: t('reportingWorks.wornArea')},
    {field: 'personnel', width: 120, title: t('reportingWorks.responsiblePersonnel')},
north-glass-erp/northglass-erp/src/views/pp/report/QualityReport.vue
@@ -92,6 +92,7 @@
    gridOptions.loading = false
  } else {
    ElMessage.warning(res.msg)
    gridOptions.loading = false
  }
})
@@ -99,14 +100,16 @@
const selectPageList = () => {
  let startTime = form.date1[0]
  let endTime = form.date1[1]
  gridOptions.loading = true
  request.post(`/report/qualityReport/${pageNum.value}/${total.pageSize}/${startTime}/${endTime}/${inputVal}`, filterData.value).then((res) => {
    if (res.code == 200) {
      produceList = deepClone(res.data.data)
      xGrid.value.reloadData(produceList)
      gridOptions.loading = false
    } else {
      gridOptions.loading = false
      ElMessage.warning(res.msg)
    }
  })
@@ -114,7 +117,7 @@
//点击查询
const getWorkOrder = () => {
  gridOptions.loading = true
  let startTime = form.date1[0]
  let endTime = form.date1[1]
  request.post(`/report/qualityReport/${startTime}/${endTime}`, filterData.value).then((res) => {
@@ -125,8 +128,10 @@
      // pageTotal.value = res.data.total
      produceList = deepClone(res.data.data)
      xGrid.value.reloadData(produceList)
      gridOptions.loading = false
    } else {
      ElMessage.warning(res.msg)
      gridOptions.loading = false
    }
  })
}
@@ -173,6 +178,7 @@
//子组件接收参数
const xGrid = ref()
const gridOptions = reactive({
  loading: true,
  border: "full",//表格加边框
  keepSource: true,//保持源数据
  align: 'center',//文字居中
north-glass-erp/northglass-erp/src/views/pp/report/TeamOutput.vue
@@ -9,10 +9,12 @@
import footSum from "@/hook/footSum"
import {addListener, toolbarButtonClickEvent} from "@/hook/mouseMove"
import {VxeUI} from "vxe-pc-ui";
import companyInfo from "@/stores/sd/companyInfo";
//语言获取
const {t} = useI18n()
let router = useRouter()
let filterData = ref({})
const company = companyInfo()
//提交的表单
const form = reactive({
  date1: '',
@@ -65,6 +67,7 @@
  return includeEnd ? diffDays + 1 : diffDays
}
const times=company.reportTime
//获取七天前到当前时间
function getNowTime() {
  const pad = (n) => n.toString().padStart(2, '0');
@@ -73,7 +76,7 @@
    const year = date.getFullYear();
    const month = pad(date.getMonth() + 1);
    const day = pad(date.getDate());
    return `${year}-${month}-${day} 08:00:00`;
    return `${year}-${month}-${day} ${times}`;
  };
  const now = new Date();
@@ -112,7 +115,7 @@
let year = date.getFullYear();
let month = pad(date.getMonth() + 1);
let day = pad(date.getDate());
let newEndTime = `${year}-${month}-${day} 08:00:00`;
let newEndTime = `${year}-${month}-${day} ${times}`;
//第一次加载数据
request.post(`/report/teamOutput/1/${total.pageSize}/${startTime}/${newEndTime}/${selectProcesses}`, filterData.value).then((res) => {
@@ -136,14 +139,28 @@
//页脚翻页查询
const selectPageList = () => {
  gridOptions.loading = true
  // è§£æž company.reportTime
  const [reportHourStr, reportMinuteStr] = company.reportTime.split(":");
  const reportHour = parseInt(reportHourStr);
  const reportMinute = parseInt(reportMinuteStr);
  // åŽŸå§‹ form.date1 æ˜¯æ—¥æœŸå¯¹è±¡æ•°ç»„
  const rawStart = new Date(form.date1[0]);
  const rawEnd = new Date(form.date1[1]);
  // å¦‚果时间部分是 00:00,则设置为 08:00
  if (rawStart.getHours() === 8 || rawStart.getHours() === 0) {
    rawStart.setHours(8, 0, 0, 0);
  // åˆ¤æ–­æ—¶é—´éƒ¨åˆ†æ˜¯å¦éœ€è¦ä¿®æ­£ä¸º company.reportTime
  const isZeroOrReport = (dateObj) => {
    const h = dateObj.getHours();
    const m = dateObj.getMinutes();
    // åˆ¤æ–­æ¡ä»¶ï¼šæ˜¯ 00:00 æˆ–者是 reportTime å¯¹åº”的时间
    return (h === 0 && m === 0) || (h === reportHour && m === reportMinute);
  };
  if (isZeroOrReport(rawStart)) {
    rawStart.setHours(reportHour, reportMinute, 0, 0);
  }
  if (rawEnd.getHours() === 8 || rawEnd.getHours() === 0) {
    rawEnd.setHours(8, 0, 0, 0);
  if (isZeroOrReport(rawEnd)) {
    rawEnd.setHours(reportHour, reportMinute, 0, 0);
  }
  const startTime = formatDateTime(rawStart);
  const endPlusOne = new Date(rawEnd);
@@ -178,48 +195,71 @@
//点击查询
const getWorkOrder = () => {
  gridOptions.loading = true
  gridOptions.loading = true;
  // è§£æž company.reportTime
  const [reportHourStr, reportMinuteStr] = company.reportTime.split(":");
  const reportHour = parseInt(reportHourStr);
  const reportMinute = parseInt(reportMinuteStr);
  // åŽŸå§‹ form.date1 æ˜¯æ—¥æœŸå¯¹è±¡æ•°ç»„
  const rawStart = new Date(form.date1[0]);
  const rawEnd = new Date(form.date1[1]);
  // å¦‚果时间部分是 00:00,则设置为 08:00
  if (rawStart.getHours() === 8 || rawStart.getHours() === 0) {
    rawStart.setHours(8, 0, 0, 0);
  // åˆ¤æ–­æ—¶é—´éƒ¨åˆ†æ˜¯å¦éœ€è¦ä¿®æ­£ä¸º company.reportTime
  const isZeroOrReport = (dateObj) => {
    const h = dateObj.getHours();
    const m = dateObj.getMinutes();
    // åˆ¤æ–­æ¡ä»¶ï¼šæ˜¯ 00:00 æˆ–者是 reportTime å¯¹åº”的时间
    return (h === 0 && m === 0) || (h === reportHour && m === reportMinute);
  };
  if (isZeroOrReport(rawStart)) {
    rawStart.setHours(reportHour, reportMinute, 0, 0);
  }
  if (rawEnd.getHours() === 8 || rawEnd.getHours() === 0) {
    rawEnd.setHours(8, 0, 0, 0);
  if (isZeroOrReport(rawEnd)) {
    rawEnd.setHours(reportHour, reportMinute, 0, 0);
  }
  // æ ¼å¼åŒ–
  const startTime = formatDateTime(rawStart);
  const endPlusOne = new Date(rawEnd);
  endPlusOne.setDate(endPlusOne.getDate());
  const newEndTime = formatDateTime(endPlusOne);
  const selectProcesses = procseeValue.value;
  const timeDifference = getDaysBetween(startTime, newEndTime)
  if (timeDifference>180){
    ElMessage.warning(t('report.theTimeLimitCannotExceed180Days'))
    gridOptions.loading = false
    return
  }
  form.date1 = [startTime, newEndTime];
  request.post(`/report/teamOutput/${pageNum.value}/${total.pageSize}/${startTime}/${newEndTime}/${selectProcesses}`, filterData.value).then((res) => {
    if (res.code == 200) {
      total.value = res.data.footSum
      total.dataTotal = res.data.total.total * 1
      total.pageTotal = res.data.total.pageTotal
      pageTotal.value = res.data.total
      produceList = res.data.data
      produceList.forEach(item => {
        item.mmTotal = sumMmValues(item.workProcessName);
  const selectProcesses = procseeValue.value;
  const timeDifference = getDaysBetween(startTime, newEndTime);
  if (timeDifference > 180) {
    ElMessage.warning(t('report.theTimeLimitCannotExceed180Days'));
    gridOptions.loading = false;
    return;
  }
  form.date1 = [startTime, newEndTime];
  request.post(`/report/teamOutput/${pageNum.value}/${total.pageSize}/${startTime}/${newEndTime}/${selectProcesses}`, filterData.value)
      .then((res) => {
        if (res.code == 200) {
          total.value = res.data.footSum;
          total.dataTotal = res.data.total.total * 1;
          total.pageTotal = res.data.total.pageTotal;
          pageTotal.value = res.data.total;
          produceList = res.data.data;
          produceList.forEach(item => {
            item.mmTotal = sumMmValues(item.workProcessName);
          });
          xGrid.value.loadData(produceList);
          gridOptions.loading = false;
        } else {
          ElMessage.warning(res.msg);
        }
      });
      xGrid.value.loadData(produceList)
      gridOptions.loading = false
    } else {
      ElMessage.warning(res.msg)
    }
  })
}
 const sumMmValues = (workProcessName) => {
  if (!workProcessName) return 0;
@@ -261,14 +301,28 @@
    filterData.value[column.property] = value
  }
  // è§£æž company.reportTime
  const [reportHourStr, reportMinuteStr] = company.reportTime.split(":");
  const reportHour = parseInt(reportHourStr);
  const reportMinute = parseInt(reportMinuteStr);
  // åŽŸå§‹ form.date1 æ˜¯æ—¥æœŸå¯¹è±¡æ•°ç»„
  const rawStart = new Date(form.date1[0]);
  const rawEnd = new Date(form.date1[1]);
  // å¦‚果时间部分是 00:00,则设置为 08:00
  if (rawStart.getHours() === 8 || rawStart.getHours() === 0) {
    rawStart.setHours(8, 0, 0, 0);
  // åˆ¤æ–­æ—¶é—´éƒ¨åˆ†æ˜¯å¦éœ€è¦ä¿®æ­£ä¸º company.reportTime
  const isZeroOrReport = (dateObj) => {
    const h = dateObj.getHours();
    const m = dateObj.getMinutes();
    // åˆ¤æ–­æ¡ä»¶ï¼šæ˜¯ 00:00 æˆ–者是 reportTime å¯¹åº”的时间
    return (h === 0 && m === 0) || (h === reportHour && m === reportMinute);
  };
  if (isZeroOrReport(rawStart)) {
    rawStart.setHours(reportHour, reportMinute, 0, 0);
  }
  if (rawEnd.getHours() === 8 || rawEnd.getHours() === 0) {
    rawEnd.setHours(8, 0, 0, 0);
  if (isZeroOrReport(rawEnd)) {
    rawEnd.setHours(reportHour, reportMinute, 0, 0);
  }
  const startTime = formatDateTime(rawStart);
  const endPlusOne = new Date(rawEnd);
@@ -362,7 +416,8 @@
    {field: 'code', width: 100, title: t('reportingWorks.glassNumber')},
    {field: 'width', width: 90, title: t('order.width')},
    {field: 'height', width: 90, title: t('order.height')},
    {field: 'mmTotal', width: 90, title: t('order.totalThickness')},
    {field: 'thicknessSum',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, width: 90, title: t('order.totalThickness')},
    {field: 'thicknessArea', width: 90, title: t('report.thicknessArea')},
    {
      field: 'deviceName', width: 140, title: t('machine.basicName'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }
    },
@@ -397,7 +452,7 @@
        if (columnIndex === 0) {
          return t('basicData.total')
        }
        const List = ["completedQuantity",'area',]
        const List = ["completedQuantity",'area','thicknessArea']
        if (List.includes(column.field)) {
          //return footSum(data, column.field)
          return total.value?.[column.field] ?? 0
north-glass-erp/northglass-erp/src/views/sd/order/UpdateOrderCraft.vue
@@ -13,6 +13,7 @@
import DxfParser from 'dxf-parser';
import { Leafer, Polygon,Ellipse,Line,Path } from 'leafer-ui'
import {round} from "xe-utils";
import {add} from '@/utils/decimal'
const { t } = useI18n()
const router = useRouter()
@@ -174,8 +175,7 @@
                const value1 = value*1
                $grid.getTableData().visibleData.forEach((item,index) =>{
                  if(index>=result.start && index<=result.end){
                    item[result.cell] = item[result.cell]*1+value1
                    item[result.cell] =add(item[result.cell]*1,value1)
                  }
                })
north-glass-erp/src/main/java/com/example/erp/controller/pp/ReplenishController.java
@@ -5,18 +5,24 @@
import com.example.erp.common.Result;
import com.example.erp.dto.pp.PatchLogAddDTO;
import com.example.erp.dto.pp.PatchLogDTO;
import com.example.erp.dto.pp.TeamOutputDTO;
import com.example.erp.dto.pp.exportReplenishDTO;
import com.example.erp.entity.pp.FlowCard;
import com.example.erp.entity.pp.PatchLog;
import com.example.erp.entity.pp.Rework;
import com.example.erp.exception.ServiceException;
import com.example.erp.service.pp.ReplenishService;
import com.example.erp.service.pp.ReworkService;
import com.example.erp.tools.DownExcel;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Date;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
@@ -93,4 +99,13 @@
    public Result updateCancelReview( @RequestBody Map<String,Object> object){
        return Result.success(replenishService.updateCancelReviewSv(object));
    }
    @ApiOperation("补片信息导出")
    @PostMapping("/exportReplenish")
    public void exportReplenish(HttpServletResponse response,
                                 @RequestBody List<LocalDate> dates
    ) throws IOException, IllegalAccessException, InstantiationException {
        //参数:相应的数据,实体类信息,相应的方法(数据获取),生成的excel名字
        DownExcel.download(response, exportReplenishDTO.class, replenishService.exportReplenishSv(dates), "PatchLogAddDTO");
    }
}
north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportController.java
@@ -46,22 +46,24 @@
    }
    @ApiOperation("跨工序次破")
    @PostMapping("/crossProcessBreaking/{pageNum}/{pageSize}/{selectDate}")
    @PostMapping("/crossProcessBreaking/{pageNum}/{pageSize}/{selectDate}/{reportTime}")
    public Result getOrderReport(@PathVariable Integer pageNum,
                                 @PathVariable Integer pageSize,
                                 @PathVariable List<String> selectDate,
                                 @PathVariable String reportTime,
                                 @RequestBody CrossProcessBreakingDTO crossProcessBreakingDTO) {
        return Result.success(reportService.crossProcessBreakingSv(pageNum, pageSize, selectDate, crossProcessBreakingDTO));
        return Result.success(reportService.crossProcessBreakingSv(pageNum, pageSize, selectDate,reportTime, crossProcessBreakingDTO));
    }
    @ApiOperation("非跨工序次破")
    @PostMapping("/notCrossProcessBreaking/{pageNum}/{pageSize}/{selectDate}")
    @PostMapping("/notCrossProcessBreaking/{pageNum}/{pageSize}/{selectDate}/{reportTime}")
    public Result notCrossProcessBreaking(@PathVariable Integer pageNum,
                                 @PathVariable Integer pageSize,
                                 @PathVariable List<String> selectDate,
                                 @PathVariable String reportTime,
                                 @RequestBody CrossProcessBreakingDTO crossProcessBreakingDTO) {
        return Result.success(reportService.notCrossProcessBreakingSv(pageNum, pageSize, selectDate, crossProcessBreakingDTO));
        return Result.success(reportService.notCrossProcessBreakingSv(pageNum, pageSize, selectDate,reportTime, crossProcessBreakingDTO));
    }
@@ -107,13 +109,14 @@
    }
    @ApiOperation("次破明细报表")
    @PostMapping("/damageReport/{pageNum}/{pageSize}/{selectDate}")
    @PostMapping("/damageReport/{pageNum}/{pageSize}/{selectDate}/{reportTime}")
    public Result damageReport(
            @PathVariable Integer pageNum,
            @PathVariable Integer pageSize,
            @PathVariable List<String> selectDate,
            @PathVariable String reportTime,
            @RequestBody DamageReportDTO damageReportDTO) {
        return Result.success(reportService.selectDamageReportSv(pageNum, pageSize, selectDate, damageReportDTO));
        return Result.success(reportService.selectDamageReportSv(pageNum, pageSize, selectDate,reportTime, damageReportDTO));
    }
north-glass-erp/src/main/java/com/example/erp/dto/pp/TeamOutputDTO.java
@@ -53,4 +53,8 @@
    private String batch;
    @ExcelProperty("订单类型")
    private String orderType;
    @ExcelProperty("在制品厚度")
    private String thicknessSum;
    @ExcelProperty("平方毫米")
    private String thicknessArea;
}
north-glass-erp/src/main/java/com/example/erp/dto/pp/exportReplenishDTO.java
New file
@@ -0,0 +1,68 @@
package com.example.erp.dto.pp;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
public class exportReplenishDTO {
    @ExcelProperty("销售单号")
    private String orderId;
    @ExcelProperty("补片单号")
    private String patchId;
    @ExcelProperty("报工编号")
    private String reportingWorkId;
    @ExcelProperty("流程卡号")
    private String processId;
    @ExcelProperty("项目名称")
    private String project;
    @ExcelProperty("批次")
    private String batch;
    @ExcelProperty("审核人")
    private String reviewer;
    @ExcelProperty("编号")
    private String glassNumber;
    @ExcelProperty("订单序号")
    private Integer orderSort;
    @ExcelProperty("产品名称")
    private String productName;
    @ExcelProperty("层号")
    private Integer technologyNumber;
    @ExcelProperty("片标记")
    private String glassAddress;
    @ExcelProperty("单片名称")
    private String glassChild;
    @ExcelProperty("数量")
    private Integer patchNum;
    @ExcelProperty("宽")
    private Double width;
    @ExcelProperty("高")
    private Double height;
    @ExcelProperty("形状")
    private String shape;
    @ExcelProperty("报工工序")
    private String patchProcesses;
    @ExcelProperty("补片原因")
    private String patchReason;
    @ExcelProperty("补片类型")
    private String patchType;
    @ExcelProperty("责任信息")
    private String responsiblePersonnel;
    @ExcelProperty("责任设备")
    private String responsibleEquipment;
    @ExcelProperty("责任班组")
    private String responsibleTeam;
    @ExcelProperty("面积")
    private String patchArea;
    @ExcelProperty("制单时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;
    @ExcelProperty("审核时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime updateTime;
}
north-glass-erp/src/main/java/com/example/erp/mapper/pp/GlassOptimizeMapper.java
@@ -239,4 +239,8 @@
    Map<String, Object> getProjectState(String projectNo);
    void updateProjectTemperingId(String projectNumber);
    List<Map<String, Object>> optimizeTemp(String projectNo);
    List<Map<String, Object>> selectTempProject(String processId);
}
north-glass-erp/src/main/java/com/example/erp/mapper/pp/PatchLogMapper.java
@@ -2,12 +2,15 @@
import com.example.erp.dto.pp.PatchLogAddDTO;
import com.example.erp.dto.pp.PatchLogDTO;
import com.example.erp.dto.pp.exportReplenishDTO;
import com.example.erp.dto.sd.OrderDTO;
import com.example.erp.entity.pp.PatchLog;
import com.example.erp.entity.pp.ReportingWork;
import com.github.yulichang.base.MPJBaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
@@ -50,5 +53,7 @@
    Boolean updateReplenishCancel(@Param("patchLog") PatchLog patchLog);
    Integer selectProjectCount(String processId, String patchId, Integer technologyNumber);
    List<exportReplenishDTO> exportReplenishMp(List<LocalDate> dates);
}
north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java
@@ -639,6 +639,10 @@
        } else {
            dataList = glassOptimizeMapper.directOptimization(projectNo);
        }
        List<Map<String, Object>> tempDataList = null;
        if (Integer.parseInt(stringObjectMap.get("optimize_state").toString())==1) {
            tempDataList = glassOptimizeMapper.optimizeTemp(projectNo);
        }
        // èŽ·å–ç£¨é‡é…ç½®æ•°æ®
        List<Map<String, Object>> grindingTrimmingList = glassOptimizeMapper.getGrindingOptimize(username);
@@ -656,6 +660,9 @@
                    }
                }
            }
        }
        if (tempDataList != null && !tempDataList.isEmpty()) {
            dataList.addAll(tempDataList);
        }
        map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString()));
        map.put("data", dataList);
@@ -920,68 +927,68 @@
            int state2 = 0;
            StringBuilder processId= new StringBuilder();
            List<FlowCard> flowCardList = JSONArray.parseArray(JSONObject.toJSONString(object.get("projectdetail")), FlowCard.class);
            if (!flowCardList.isEmpty()) {
                if(projectType.equals("2")){
                    deleteProject(projectId,2);
            if(projectType.equals("2")){
                deleteProject(projectId,2);
            }
            // åˆ›å»ºä¸€ä¸ªæ˜ å°„来存储 (processId-technologyNumber) ç»„合到 rack ç¼–号的映射
            Map<String, Integer> rackMap = new HashMap<>();
            int rackCounter = 1;
            // å¦‚果为空流程卡,则将 type è®¾ç½®ä¸º 1
            if (flowCardList == null || flowCardList.isEmpty()) {
                type = 1;
            }
            for (FlowCard flowCard : flowCardList) {
                // ä¸ºæ¯ä¸ªå”¯ä¸€çš„ processId-technologyNumber ç»„合分配 rack ç¼–号
                String key = flowCard.getProcessId() + "-" + flowCard.getTechnologyNumber();
                if (!rackMap.containsKey(key)) {
                    rackMap.put(key, rackCounter++);
                }
                int rackValue = rackMap.get(key);
                if(flowCard.getPatchState().equals(0)){
                    state1=1;
                    //给流程卡表添加对应的工程号
                    Boolean a = glassOptimizeMapper.updateFlowCardProject(flowCard.getProcessId(),flowCard.getTechnologyNumber(),projectId);
                    // æ›´æ–°æµç¨‹å¡çš„rack字段
                    glassOptimizeMapper.updateFlowCardRack(flowCard.getProcessId(), flowCard.getTechnologyNumber(), rackValue);
                    area = glassOptimizeMapper.getSelectArea(flowCard.getProcessId(),flowCard.getTechnologyNumber()).doubleValue();
                    sumArea = sumArea.add(BigDecimal.valueOf(area));
                    sumQuantity +=flowCard.getQuantity();
                    processId.append(flowCard.getProcessId()).append("-").append(flowCard.getTechnologyNumber()).append(";");
                }else{
                    state2=1;
                    Boolean a=glassOptimizeMapper.updatePatchLogProject(flowCard.getProcessId(),flowCard.getTechnologyNumber(),projectId);
                    area = glassOptimizeMapper.getSelectAreaPatchLog(flowCard.getProcessId(),flowCard.getTechnologyNumber()).doubleValue();
                    sumArea = sumArea.add(BigDecimal.valueOf(area));
                    sumQuantity +=flowCard.getQuantity();
                    processId.append(flowCard.getProcessId()).append("-").append(flowCard.getTechnologyNumber()).append(";");
                }
                // åˆ›å»ºä¸€ä¸ªæ˜ å°„来存储 (processId-technologyNumber) ç»„合到 rack ç¼–号的映射
                Map<String, Integer> rackMap = new HashMap<>();
                int rackCounter = 1;
            }
            if(state1==1&&state2==0){
                type=1;
            }else if(state1==1&&state2==1){
                type=2;
            }
                for (FlowCard flowCard : flowCardList) {
                    // ä¸ºæ¯ä¸ªå”¯ä¸€çš„ processId-technologyNumber ç»„合分配 rack ç¼–号
                    String key = flowCard.getProcessId() + "-" + flowCard.getTechnologyNumber();
                    if (!rackMap.containsKey(key)) {
                        rackMap.put(key, rackCounter++);
                    }
                    int rackValue = rackMap.get(key);
                    if(flowCard.getPatchState().equals(0)){
                        state1=1;
                        //给流程卡表添加对应的工程号
                        Boolean a = glassOptimizeMapper.updateFlowCardProject(flowCard.getProcessId(),flowCard.getTechnologyNumber(),projectId);
                        // æ›´æ–°æµç¨‹å¡çš„rack字段
                        glassOptimizeMapper.updateFlowCardRack(flowCard.getProcessId(), flowCard.getTechnologyNumber(), rackValue);
                        area = glassOptimizeMapper.getSelectArea(flowCard.getProcessId(),flowCard.getTechnologyNumber()).doubleValue();
                        sumArea = sumArea.add(BigDecimal.valueOf(area));
                        sumQuantity +=flowCard.getQuantity();
                        processId.append(flowCard.getProcessId()).append("-").append(flowCard.getTechnologyNumber()).append(";");
                    }else{
                        state2=1;
                        Boolean a=glassOptimizeMapper.updatePatchLogProject(flowCard.getProcessId(),flowCard.getTechnologyNumber(),projectId);
                        area = glassOptimizeMapper.getSelectAreaPatchLog(flowCard.getProcessId(),flowCard.getTechnologyNumber()).doubleValue();
                        sumArea = sumArea.add(BigDecimal.valueOf(area));
                        sumQuantity +=flowCard.getQuantity();
                        processId.append(flowCard.getProcessId()).append("-").append(flowCard.getTechnologyNumber()).append(";");
                    }
                }
                if(state1==1&&state2==0){
                    type=1;
                }else if(state1==1&&state2==1){
                    type=2;
                }
                int index = optionVal.indexOf("mm");
                // èŽ·å– "mm" å‰é¢çš„部分
                String glass_thickness = optionVal.substring(0, index);
                // èŽ·å– "mm" åŽé¢çš„部分
                String glass_type = optionVal.substring(index + 2);
                if(projectType.equals("2")){
                    glassOptimizeMapper.updateProjectMp(projectId,projectNmae,glass_thickness,glass_type,sumQuantity,sumArea.doubleValue(),userName,
            int index = optionVal.indexOf("mm");
            // èŽ·å– "mm" å‰é¢çš„部分
            String glass_thickness = optionVal.substring(0, index);
            // èŽ·å– "mm" åŽé¢çš„部分
            String glass_type = optionVal.substring(index + 2);
            if(projectType.equals("2")){
                glassOptimizeMapper.updateProjectMp(projectId,projectNmae,glass_thickness,glass_type,sumQuantity,sumArea.doubleValue(),userName,
                        flowCardList.size(), String.valueOf(processId),type);
            }else{
                if(glassOptimizeMapper.selectProjectCount(projectId)==null){
                    glassOptimizeMapper.addProjectMp(projectId,projectNmae,glass_thickness,glass_type,sumQuantity,sumArea.doubleValue(),userName,
                            flowCardList.size(), String.valueOf(processId),type);
                }else{
                    if(glassOptimizeMapper.selectProjectCount(projectId)==null){
                        glassOptimizeMapper.addProjectMp(projectId,projectNmae,glass_thickness,glass_type,sumQuantity,sumArea.doubleValue(),userName,
                                flowCardList.size(), String.valueOf(processId),type);
                    }else{
                        TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
                        return "false1";
                    }
                    TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
                    return "false1";
                }
            }else {
                return "false2";
            }
        } catch (Exception e) {
            TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savePoint);
@@ -1387,6 +1394,8 @@
    public Map<String, Object> getProductListSv(String processId) {
        Map<String, Object> productMap = new HashMap<>();
        List<Map<String, Object>> productInfo = glassOptimizeMapper.selectProjectList(processId);
        List<Map<String, Object>> tempProductInfo = glassOptimizeMapper.selectTempProject(processId);
        productInfo.addAll(tempProductInfo);
        productMap.put("productInfo", productInfo);
        Map<String, Object> map = new HashMap<>();
@@ -1394,7 +1403,7 @@
            // æŒ‰ç…§ processCard åˆ†ç»„
            Map<String, List<Map<String, Object>>> groupedByProcessCard = new HashMap<>();
            for (Map<String, Object> item : productInfo) {
                String processCard = (String) item.get("processCard");
                String processCard = String.valueOf(item.get("processCard"));
                if (processCard != null) {
                    groupedByProcessCard.computeIfAbsent(processCard, k -> new ArrayList<>()).add(item);
                }
north-glass-erp/src/main/java/com/example/erp/service/pp/ReplenishService.java
@@ -7,6 +7,8 @@
import com.example.erp.common.AsyncQueryExecutor;
import com.example.erp.dto.pp.PatchLogAddDTO;
import com.example.erp.dto.pp.PatchLogDTO;
import com.example.erp.dto.pp.exportReplenishDTO;
import com.example.erp.dto.sd.OrderDTO;
import com.example.erp.entity.pp.FlowCard;
import com.example.erp.entity.pp.PatchLog;
import com.example.erp.entity.pp.ReportingWork;
@@ -340,6 +342,13 @@
                        reportingWorkMapper.updateRWDPatchNum(patchLog1.getReportingWorkId(),patchLog1.getOrderSort(),patchLog1.getTechnologyNumber(),patchLog1.getPatchNum());
                        //更新报工流程表数据
                        reportingWorkMapper.updateReplenishWorkProcess(patchLog1.getProcessId(),patchLog1.getOrderSort(),patchLog1.getTechnologyNumber(),patchLog1.getPatchNum(),patchLog1.getPatchProcesses());
                        Log log = new Log();
                        log.setContent(object.toString());
                        log.setFunction("deleteReplenishSv补片删除");
                        log.setOperatorId((String) object.get("userId"));
                        log.setOperator((String) object.get("userName"));
                        logService.saveLog(log);
                    }
                    else{
                        saveState = false;
@@ -417,5 +426,11 @@
        return saveState;
    }
//    public List exportReplenishSv(Map<String, Object> dates) {
//    }
    public List<exportReplenishDTO> exportReplenishSv(List<LocalDate> dates) {
        return patchMapper.exportReplenishMp(dates);
    }
}
north-glass-erp/src/main/java/com/example/erp/service/pp/ReportService.java
@@ -26,6 +26,9 @@
import java.sql.Date;
import java.sql.SQLOutput;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.Function;
@@ -332,29 +335,47 @@
//        return map;
//    }
    private static String to080000(String s) {
        if (s == null || s.isEmpty()) return null;
        String v = s.trim();
        // åªä¿ç•™æ—¥æœŸéƒ¨åˆ†ï¼ˆå‰10位 yyyy-MM-dd)
        String datePart = v.length() >= 10 ? v.substring(0, 10) : v;
        return datePart + " 08:00:00";
    private static final DateTimeFormatter DATE_TIME_FMT =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    private String toReportTime(String dateStr, String reportTime) {
        if (dateStr == null || dateStr.isEmpty()) {
            return null;
        }
        // åªä¿ç•™ yyyy-MM-dd,防止前端传完整时间导致 parse å¼‚常
        String onlyDate = dateStr.length() > 10 ? dateStr.substring(0, 10) : dateStr;
        String[] parts = reportTime.split(":");
        int hour   = Integer.parseInt(parts[0]);
        int minute = parts.length > 1 ? Integer.parseInt(parts[1]) : 0;
        int second = parts.length > 2 ? Integer.parseInt(parts[2]) : 0;
        LocalDate date = LocalDate.parse(onlyDate);
        LocalTime time = LocalTime.of(hour, minute, second);
        return LocalDateTime.of(date, time).format(DATE_TIME_FMT);
    }
    //跨工序次破
    public Map<String, Object> crossProcessBreakingSv(Integer pageNum, Integer pageSize,
                                                      List<String> selectDate,
                                                      String reportTime,
                                                      CrossProcessBreakingDTO crossProcessBreakingDTO) {
        Integer offset = (pageNum - 1) * pageSize;
        // é»˜è®¤æ—¶é—´èŒƒå›´ï¼šè¿‡åŽ» 15 å¤©
        String startDate = to080000(LocalDate.now().minusDays(15).toString());
        String endDate   = to080000(LocalDate.now().toString());
        // é»˜è®¤æ—¶é—´èŒƒå›´ï¼šè¿‡åŽ» 15 å¤©ï¼ˆæ—¥æœŸ + reportTime)
        String startDate = toReportTime(LocalDate.now().minusDays(15).toString(), reportTime);
        String endDate   = toReportTime(LocalDate.now().toString(), reportTime);
        // å¦‚果前端传了时间,就用前端日期 + reportTime
        if (selectDate != null && selectDate.size() == 2) {
            if (selectDate.get(0) != null && !selectDate.get(0).isEmpty()) {
                startDate = to080000(selectDate.get(0));
                startDate = toReportTime(selectDate.get(0), reportTime);
            }
            if (selectDate.get(1) != null && !selectDate.get(1).isEmpty()) {
                endDate = to080000(selectDate.get(1));
                endDate = toReportTime(selectDate.get(1), reportTime);
            }
        }
@@ -363,7 +384,6 @@
        // ä½¿ç”¨å¼‚步线程池
        String finalEndDate = endDate;
        String finalStartDate = startDate;
        System.out.println(finalEndDate+"==="+finalStartDate);
        CompletableFuture<List<CrossProcessBreakingDTO>> dataFuture = asyncExecutor.runAsync(() ->
                reportMapper.getProcessBreaking(offset, pageSize, finalStartDate, finalEndDate, crossProcessBreakingDTO));
@@ -392,19 +412,21 @@
    //非跨工序次破
    public Map<String, Object> notCrossProcessBreakingSv(Integer pageNum, Integer pageSize,
                                                      List<String> selectDate,
                                                      String reportTime,
                                                      CrossProcessBreakingDTO crossProcessBreakingDTO) {
        Integer offset = (pageNum - 1) * pageSize;
        // é»˜è®¤æ—¶é—´èŒƒå›´ï¼šè¿‡åŽ» 15 å¤©
        String startDate = to080000(LocalDate.now().minusDays(15).toString());
        String endDate   = to080000(LocalDate.now().toString());
        // é»˜è®¤æ—¶é—´èŒƒå›´ï¼šè¿‡åŽ» 15 å¤©ï¼ˆæ—¥æœŸ + reportTime)
        String startDate = toReportTime(LocalDate.now().minusDays(15).toString(), reportTime);
        String endDate   = toReportTime(LocalDate.now().toString(), reportTime);
        // å¦‚果前端传了时间,就用前端日期 + reportTime
        if (selectDate != null && selectDate.size() == 2) {
            if (selectDate.get(0) != null && !selectDate.get(0).isEmpty()) {
                startDate = to080000(selectDate.get(0));
                startDate = toReportTime(selectDate.get(0), reportTime);
            }
            if (selectDate.get(1) != null && !selectDate.get(1).isEmpty()) {
                endDate = to080000(selectDate.get(1));
                endDate = toReportTime(selectDate.get(1), reportTime);
            }
        }
@@ -601,25 +623,31 @@
    public Map<String, Object> selectDamageReportSv(Integer pageNum, Integer pageSize,
                                                    List<String> selectDate,
                                                    String reportTime,
                                                    DamageReportDTO damageReportDTO) {
        Integer offset = (pageNum - 1) * pageSize;
        // é»˜è®¤æ—¶é—´èŒƒå›´ï¼šè¿‡åŽ» 15 å¤©
        String startDate = to080000(LocalDate.now().minusDays(15).toString());
        String endDate   = to080000(LocalDate.now().toString());
        Integer offset = (pageNum - 1) * pageSize;
        // é»˜è®¤æ—¶é—´èŒƒå›´ï¼šè¿‡åŽ» 15 å¤©ï¼ˆæ—¥æœŸ + reportTime)
        String startDate = toReportTime(LocalDate.now().minusDays(15).toString(), reportTime);
        String endDate   = toReportTime(LocalDate.now().toString(), reportTime);
        // å¦‚果前端传了时间,就用前端日期 + reportTime
        if (selectDate != null && selectDate.size() == 2) {
            if (selectDate.get(0) != null && !selectDate.get(0).isEmpty()) {
                startDate = to080000(selectDate.get(0));
                startDate = toReportTime(selectDate.get(0), reportTime);
            }
            if (selectDate.get(1) != null && !selectDate.get(1).isEmpty()) {
                endDate = to080000(selectDate.get(1));
                endDate = toReportTime(selectDate.get(1), reportTime);
            }
        }
        Map<String, Object> result = new HashMap<>();
        String finalEndDate = endDate;
        String finalStartDate = startDate;
        // å¼‚步任务定义
        Map<String, Object> result = new HashMap<>();
        String finalStartDate = startDate;
        String finalEndDate = endDate;
        // å¼‚步任务定义
        CompletableFuture<List<DamageReportDTO>> dataFuture = asyncExecutor.runAsync(() ->
                reportMapper.selectDamageReportMp(offset, pageSize, finalStartDate, finalEndDate, damageReportDTO));
@@ -629,7 +657,7 @@
        CompletableFuture<Map<String, Float>> footSumFuture = asyncExecutor.runAsync(() ->
                reportMapper.damageReportFootSum(finalStartDate, finalEndDate, damageReportDTO));
        //等待全部任务完成
        // ç­‰å¾…全部任务完成
        CompletableFuture.allOf(dataFuture, totalFuture, footSumFuture).join();
        try {
@@ -638,8 +666,10 @@
            result.put("footSum", footSumFuture.get());
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("并行查询异常:" + e.getMessage(), e);
            throw new RuntimeException("次破总表并行查询异常:" + e.getMessage(), e);
        }
        // å›žä¼ å‰ç«¯çš„æ—¶é—´ï¼ˆçŽ°åœ¨æ˜¯å¸¦æ—¶åˆ†ç§’çš„ï¼‰
        List<String> list = new ArrayList<>();
        list.add(startDate);
        list.add(endDate);
@@ -647,6 +677,7 @@
        return result;
    }
    public Map<String, Object> splittingDetailsOutsideSv(String orderId, Report report) {
        Map<String, Object> map = new HashMap<>();
@@ -972,14 +1003,14 @@
        }
        String inputVal= (String) dates.get("inputVal");
        String project= (String) dates.get("project");
        String terminationVals= (String) dates.get("terminationVals");
        if ("null".equals(inputVal)) {
        String terminationVals= dates.get("terminationVals").toString();;
        if (inputVal==null) {
            inputVal = "";
        }
        if ("null".equals(project)) {
        if (project==null) {
            project = "";
        }
        if ("null".equals(terminationVals)) {
        if (terminationVals==null) {
            terminationVals = "";
        }
        List<WorkInProgressDTO> dataList1  =reportMapper.exportWorkInProgressMp(process,inputVal,project,terminationVals);
@@ -1243,14 +1274,14 @@
        }
        String inputVal= (String) dates.get("inputVal");
        String project= (String) dates.get("project");
        String terminationVals= (String) dates.get("terminationVals");
        if ("null".equals(inputVal)) {
        String terminationVals= dates.get("terminationVals").toString();;
        if (inputVal==null) {
            inputVal = "";
        }
        if ("null".equals(project)) {
        if (project==null) {
            project = "";
        }
        if ("null".equals(terminationVals)) {
        if (terminationVals==null) {
            terminationVals = "";
        }
north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java
@@ -189,7 +189,7 @@
                   // if (reviewedState==1){//已审核
                        //不是第一道工序,查询报工数据
                        List<Map<String,String>>  details = reportingWorkMapper.SelectReworlDetailMp(processIdStr, splitTechNumbers(technologyStr), process,previousProcess,laminating);
                        if(process.equals("中空")){
                        if(laminating.equals("stepD")){
                            //获取该流程卡订单号
                            String orderId = reportingWorkMapper.selectOrderid(processIdStr);
                            details.forEach( detail -> {
@@ -914,7 +914,7 @@
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("并行查询报工记录异常:" + e.getMessage(), e);
            throw new RuntimeException("报工查询并行查询报工记录异常:" + e.getMessage(), e);
        }
        return result;
north-glass-erp/src/main/java/com/example/erp/service/sd/OrderFileService.java
@@ -67,7 +67,7 @@
            // è®¾ç½®å®½åº¦
            rasterizationOptions.setPageWidth(1000);
            // è®¾ç½®é«˜åº¦
            rasterizationOptions.setPageHeight(1000);
            rasterizationOptions.setPageHeight(700);
            // è°ƒç”¨è¿™ä¸ªsetEmbedBackground方法来设置背景色是否不等于输出格式的默认背景色
            //rasterizationOptions.setEmbedBackground(true);
            // ä¸ºç”Ÿæˆçš„图像创建一个PngOptions的实例,并将其分配给ImageOptionsBase类的实例。
north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml
@@ -185,7 +185,7 @@
             c.project_no,
             d.child_width as 'width',
             d.child_height as 'height',
             (d.child_width + d.child_height) * 2 as 'perimeter',
             (d.child_width + d.child_height) * 2/ 1000 as 'perimeter',
             c.quantity,
             od.shape,
             concat( c.process_id, '-', c.technology_number ) AS 'process_id',
@@ -229,7 +229,7 @@
                c.project_no,
                d.child_width as 'width',
                d.child_height as 'height',
                (d.child_width + d.child_height) * 2 as 'perimeter',
                (d.child_width + d.child_height) * 2/ 1000 as 'perimeter',
                c.patch_num as quantity,
                od.shape,
                concat( c.process_id, '-', c.technology_number ) AS 'process_id',
@@ -343,7 +343,7 @@
#             h.layout_id as heatLayoutId,
            h.width AS width,
            h.height AS height,
            (h.width + h.height) * 2 as 'perimeter',
            (h.width + h.height) * 2 / 1000 as 'perimeter',
            od.shape,
            count( 1 ) AS quantity,
            concat( h.process_id, '-', h.layer ) AS process_id,
@@ -2148,6 +2148,55 @@
        WHERE
            project_no = #{projectNo}
    </select>
    <select id="optimizeTemp" resultType="java.util.Map" parameterType="java.lang.String">
        SELECT
        project_no,
        layer,
        o_width as width,
        o_height as height,
        rack_no as rackNo,
        COUNT(*) as quantity,
        ROUND((o_width + o_height) * 2 / 1000, 2) as perimeter,
        ROUND(o_width * o_height * COUNT(*) / 1000000, 4) as area
    FROM
        pp.`optimize_detail`
    WHERE
        project_no =  #{projectNo}
      AND process_id = ''
    GROUP BY
        project_no,
        layer,
        o_width,
        o_height,
        rack_no
    ORDER BY
        o_width,
        o_height
    </select>
    <select id="selectTempProject" resultType="java.util.Map" parameterType="java.lang.String">
        SELECT
            project_no,
            o_width as width,
            o_height as height,
            rack_no as order_number,
            layer as processCard,
            COUNT(*) as quantity,
            ROUND(o_width * o_height * COUNT(*) / 1000000, 4) as Area
        FROM
            pp.`optimize_detail`
        WHERE
            project_no =  #{processId}
          AND process_id = ''
        GROUP BY
            project_no,
            layer,
            o_width,
            o_height,
            rack_no
        ORDER BY
            o_width,
            o_height
    </select>
</mapper>
north-glass-erp/src/main/resources/mapper/pp/PatchLogMapper.xml
@@ -100,7 +100,7 @@
                and ogd.glass_child regexp #{patchLog.glassChild}
            </if>
            <if test="patchLog.responsibleTeam != null and patchLog.responsibleTeam != ''">
                and r.responsible_team regexp #{patchLog.responsibleTeam}
                and r.responsible_team like concat('%', #{patchLog.responsibleTeam}, '%')
            </if>
            <if test="patchLog.responsibleEquipment != null and patchLog.responsibleEquipment != ''">
                and r.responsible_equipment regexp #{patchLog.responsibleEquipment}
@@ -124,7 +124,7 @@
                and r.patch_processes regexp #{patchLog.patchProcesses}
            </if>
            <if test="patchLog.reviewer != null and patchLog.reviewer != ''">
                and r.reviewer regexp #{patchLog.reviewer}
                and r.reviewer like concat('%', #{patchLog.reviewer}, '%')
            </if>
        </where>
         order by r.review_status,r.id desc
@@ -193,7 +193,7 @@
                and ogd.glass_child regexp #{patchLog.glassChild}
            </if>
            <if test="patchLog.responsibleTeam != null and patchLog.responsibleTeam != ''">
                and r.responsible_team regexp #{patchLog.responsibleTeam}
                and r.responsible_team like concat('%', #{patchLog.responsibleTeam}, '%')
            </if>
            <if test="patchLog.responsibleEquipment != null and patchLog.responsibleEquipment != ''">
                and r.responsible_equipment regexp #{patchLog.responsibleEquipment}
@@ -217,7 +217,7 @@
                and r.patch_processes regexp #{patchLog.patchProcesses}
            </if>
            <if test="patchLog.reviewer != null and patchLog.reviewer != ''">
                and r.reviewer regexp #{patchLog.reviewer}
                and r.reviewer like concat('%', #{patchLog.reviewer}, '%')
            </if>
        </where>
        ) as zu
@@ -368,7 +368,7 @@
                and ogd.glass_child regexp #{patchLogAddDTO.glassChild}
            </if>
            <if test="patchLogAddDTO.responsibleTeam != null and patchLogAddDTO.responsibleTeam != ''">
                and dd.responsible_team regexp #{patchLogAddDTO.responsibleTeam}
                and dd.responsible_team like concat('%', #{patchLogAddDTO.responsibleTeam}, '%')
            </if>
            <if test="patchLogAddDTO.responsibleEquipment != null and patchLogAddDTO.responsibleEquipment != ''">
                and dd.responsible_equipment regexp #{patchLogAddDTO.responsibleEquipment}
@@ -432,4 +432,46 @@
          and project_no IS not NULL;
    </select>
    <select id="exportReplenishMp">
        select
        r.id,
        r.review_status,
        r.reporting_work_id,
        r.patch_id,
        r.process_id,
        r.order_id,
        r.order_sort,
        o.project,
        o.batch,
        od.building_number,
        od.product_name,
        r.technology_number,
        ogd.glass_address,
        ogd.glass_child,
        r.patch_num,
        ogd.child_width as width,
        ogd.child_height as height,
        od.shape,
        r.patch_type,
        r.patch_reason,
        r.responsible_team,
        r.responsible_personnel,
        r.responsible_equipment,
        r.patch_area,
        r.quality_inspector,
        r.patch_processes,
        r.reviewer,
        r.create_time as create_time,
        date(r.update_time) as update_time,
        JSON_UNQUOTE( JSON_EXTRACT( od.other_columns, '$.S01' )) AS glassNumber
        from pp.patch_log r left join sd.order_detail od on r.order_id=od.order_id and r.order_sort=od.order_number
        left join sd.`order` o on r.order_id = o.order_id
        left join (select * from sd.order_glass_detail group by order_id,order_number,technology_number) as ogd
        on r.order_id = ogd.order_id and r.order_sort = ogd.order_number and r.technology_number=ogd.technology_number
        <where>
            date(r.create_time)>=#{dates[0]} and date(r.create_time) &lt;= #{dates[1]}
            and o.create_order>0
        </where>
        order by r.review_status,r.id desc
    </select>
</mapper>
north-glass-erp/src/main/resources/mapper/pp/Report.xml
@@ -132,6 +132,8 @@
        <result column="workProcessName" property="workProcessName"/>
        <result column="device_name" property="deviceName"/>
        <result column="order_type" property="orderType"/>
        <result column="thicknessSum" property="thicknessSum"/>
        <result column="thicknessArea" property="thicknessArea"/>
    </resultMap>
    <resultMap id="scheduleProductionScheduleMap" type="com.example.erp.dto.pp.ScheduleProductionScheduleDTO">
@@ -291,43 +293,43 @@
          and rw.this_process != dd.responsible_process
        and o.create_order>0
        <if test="crossProcessBreakingDTO.code != null and crossProcessBreakingDTO.code != ''">
            and JSON_UNQUOTE( JSON_EXTRACT( od.other_columns, '$.S01' )) regexp #{crossProcessBreakingDTO.code}
            and JSON_UNQUOTE( JSON_EXTRACT( od.other_columns, '$.S01' )) like concat('%', #{crossProcessBreakingDTO.code}, '%')
        </if>
        <if test="crossProcessBreakingDTO.processId != null and crossProcessBreakingDTO.processId != ''">
            and rw.process_id regexp #{crossProcessBreakingDTO.processId}
            and rw.process_id  like concat('%', #{crossProcessBreakingDTO.processId}, '%')
        </if>
        <if test="crossProcessBreakingDTO.thisProcess != null and crossProcessBreakingDTO.thisProcess != ''">
            and rw.this_process regexp #{crossProcessBreakingDTO.thisProcess}
            and rw.this_process  like concat('%', #{crossProcessBreakingDTO.thisProcess}, '%')
        </if>
        <if test="crossProcessBreakingDTO.responsibleProcess != null and crossProcessBreakingDTO.responsibleProcess != ''">
            and dd.responsible_process regexp #{crossProcessBreakingDTO.responsibleProcess}
            and dd.responsible_process like concat('%', #{crossProcessBreakingDTO.responsibleProcess}, '%')
        </if>
        <if test="crossProcessBreakingDTO.responsibleTeam != null and crossProcessBreakingDTO.responsibleTeam != ''">
            and dd.responsible_team regexp #{crossProcessBreakingDTO.responsibleTeam}
            and dd.responsible_team like concat('%', #{crossProcessBreakingDTO.responsibleTeam}, '%')
        </if>
        <if test="crossProcessBreakingDTO.glassChild != null and crossProcessBreakingDTO.glassChild != ''">
            and ogd.glass_child regexp #{crossProcessBreakingDTO.glassChild}
            and ogd.glass_child like concat('%', #{crossProcessBreakingDTO.glassChild}, '%')
        </if>
        <if test="crossProcessBreakingDTO.breakageType != null and crossProcessBreakingDTO.breakageType != ''">
            and dd.breakage_type regexp #{crossProcessBreakingDTO.breakageType}
            and dd.breakage_type like concat('%', #{crossProcessBreakingDTO.breakageType}, '%')
        </if>
        <if test="crossProcessBreakingDTO.project != null and crossProcessBreakingDTO.project != ''">
            and o.project regexp #{crossProcessBreakingDTO.project}
            and o.project like concat('%', #{crossProcessBreakingDTO.project}, '%')
        </if>
        <if test="crossProcessBreakingDTO.orderId != null and crossProcessBreakingDTO.orderId != ''">
            and o.order_id regexp #{crossProcessBreakingDTO.orderId}
            and o.order_id like concat('%', #{crossProcessBreakingDTO.orderId}, '%')
        </if>
        <if test="crossProcessBreakingDTO.responsiblePersonnel != null and crossProcessBreakingDTO.responsiblePersonnel != ''">
            and dd.responsible_personnel regexp #{crossProcessBreakingDTO.responsiblePersonnel}
            and dd.responsible_personnel like concat('%', #{crossProcessBreakingDTO.responsiblePersonnel}, '%')
        </if>
        <if test="crossProcessBreakingDTO.creator != null and crossProcessBreakingDTO.creator != ''">
            and rw.creator regexp #{crossProcessBreakingDTO.creator}
            and rw.creator like concat('%', #{crossProcessBreakingDTO.creator}, '%')
        </if>
        <if test="crossProcessBreakingDTO.code != null and crossProcessBreakingDTO.code != ''">
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') regexp #{crossProcessBreakingDTO.code}
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') like concat('%', #{crossProcessBreakingDTO.code}, '%')
        </if>
        <if test="crossProcessBreakingDTO.reportingWorkId != null and crossProcessBreakingDTO.reportingWorkId != ''">
            and rw.reporting_work_id regexp #{crossProcessBreakingDTO.reportingWorkId}
            and rw.reporting_work_id like concat('%', #{crossProcessBreakingDTO.reportingWorkId}, '%')
        </if>
        GROUP BY dd.id
        order by dd.id desc
@@ -367,43 +369,43 @@
        and rw.this_process = dd.responsible_process
        and o.create_order>0
        <if test="crossProcessBreakingDTO.code != null and crossProcessBreakingDTO.code != ''">
            and JSON_UNQUOTE( JSON_EXTRACT( od.other_columns, '$.S01' )) regexp #{crossProcessBreakingDTO.code}
            and JSON_UNQUOTE( JSON_EXTRACT( od.other_columns, '$.S01' )) like concat('%', #{crossProcessBreakingDTO.code}, '%')
        </if>
        <if test="crossProcessBreakingDTO.processId != null and crossProcessBreakingDTO.processId != ''">
            and rw.process_id regexp #{crossProcessBreakingDTO.processId}
            and rw.process_id  like concat('%', #{crossProcessBreakingDTO.processId}, '%')
        </if>
        <if test="crossProcessBreakingDTO.thisProcess != null and crossProcessBreakingDTO.thisProcess != ''">
            and rw.this_process regexp #{crossProcessBreakingDTO.thisProcess}
            and rw.this_process  like concat('%', #{crossProcessBreakingDTO.thisProcess}, '%')
        </if>
        <if test="crossProcessBreakingDTO.responsibleProcess != null and crossProcessBreakingDTO.responsibleProcess != ''">
            and dd.responsible_process regexp #{crossProcessBreakingDTO.responsibleProcess}
            and dd.responsible_process like concat('%', #{crossProcessBreakingDTO.responsibleProcess}, '%')
        </if>
        <if test="crossProcessBreakingDTO.responsibleTeam != null and crossProcessBreakingDTO.responsibleTeam != ''">
            and dd.responsible_team regexp #{crossProcessBreakingDTO.responsibleTeam}
            and dd.responsible_team like concat('%', #{crossProcessBreakingDTO.responsibleTeam}, '%')
        </if>
        <if test="crossProcessBreakingDTO.glassChild != null and crossProcessBreakingDTO.glassChild != ''">
            and ogd.glass_child regexp #{crossProcessBreakingDTO.glassChild}
            and ogd.glass_child like concat('%', #{crossProcessBreakingDTO.glassChild}, '%')
        </if>
        <if test="crossProcessBreakingDTO.breakageType != null and crossProcessBreakingDTO.breakageType != ''">
            and dd.breakage_type regexp #{crossProcessBreakingDTO.breakageType}
            and dd.breakage_type like concat('%', #{crossProcessBreakingDTO.breakageType}, '%')
        </if>
        <if test="crossProcessBreakingDTO.project != null and crossProcessBreakingDTO.project != ''">
            and o.project regexp #{crossProcessBreakingDTO.project}
            and o.project like concat('%', #{crossProcessBreakingDTO.project}, '%')
        </if>
        <if test="crossProcessBreakingDTO.orderId != null and crossProcessBreakingDTO.orderId != ''">
            and o.order_id regexp #{crossProcessBreakingDTO.orderId}
            and o.order_id like concat('%', #{crossProcessBreakingDTO.orderId}, '%')
        </if>
        <if test="crossProcessBreakingDTO.responsiblePersonnel != null and crossProcessBreakingDTO.responsiblePersonnel != ''">
            and dd.responsible_personnel regexp #{crossProcessBreakingDTO.responsiblePersonnel}
            and dd.responsible_personnel like concat('%', #{crossProcessBreakingDTO.responsiblePersonnel}, '%')
        </if>
        <if test="crossProcessBreakingDTO.creator != null and crossProcessBreakingDTO.creator != ''">
            and rw.creator regexp #{crossProcessBreakingDTO.creator}
            and rw.creator like concat('%', #{crossProcessBreakingDTO.creator}, '%')
        </if>
        <if test="crossProcessBreakingDTO.code != null and crossProcessBreakingDTO.code != ''">
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') regexp #{crossProcessBreakingDTO.code}
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') like concat('%', #{crossProcessBreakingDTO.code}, '%')
        </if>
        <if test="crossProcessBreakingDTO.reportingWorkId != null and crossProcessBreakingDTO.reportingWorkId != ''">
            and rw.reporting_work_id regexp #{crossProcessBreakingDTO.reportingWorkId}
            and rw.reporting_work_id like concat('%', #{crossProcessBreakingDTO.reportingWorkId}, '%')
        </if>
        GROUP BY dd.id
        order by dd.id desc
@@ -429,40 +431,43 @@
          and rw.reviewed_state>=0
          and rw.this_process != dd.responsible_process
        <if test="crossProcessBreakingDTO.code != null and crossProcessBreakingDTO.code != ''">
            and JSON_UNQUOTE( JSON_EXTRACT( od.other_columns, '$.S01' )) regexp #{crossProcessBreakingDTO.code}
            and JSON_UNQUOTE( JSON_EXTRACT( od.other_columns, '$.S01' )) like concat('%', #{crossProcessBreakingDTO.code}, '%')
        </if>
        <if test="crossProcessBreakingDTO.processId != null and crossProcessBreakingDTO.processId != ''">
            and rw.process_id regexp #{crossProcessBreakingDTO.processId}
            and rw.process_id  like concat('%', #{crossProcessBreakingDTO.processId}, '%')
        </if>
        <if test="crossProcessBreakingDTO.thisProcess != null and crossProcessBreakingDTO.thisProcess != ''">
            and rw.this_process regexp #{crossProcessBreakingDTO.thisProcess}
            and rw.this_process  like concat('%', #{crossProcessBreakingDTO.thisProcess}, '%')
        </if>
        <if test="crossProcessBreakingDTO.responsibleProcess != null and crossProcessBreakingDTO.responsibleProcess != ''">
            and dd.responsible_process regexp #{crossProcessBreakingDTO.responsibleProcess}
            and dd.responsible_process like concat('%', #{crossProcessBreakingDTO.responsibleProcess}, '%')
        </if>
        <if test="crossProcessBreakingDTO.responsibleTeam != null and crossProcessBreakingDTO.responsibleTeam != ''">
            and dd.responsible_team regexp #{crossProcessBreakingDTO.responsibleTeam}
            and dd.responsible_team like concat('%', #{crossProcessBreakingDTO.responsibleTeam}, '%')
        </if>
        <if test="crossProcessBreakingDTO.glassChild != null and crossProcessBreakingDTO.glassChild != ''">
            and ogd.glass_child regexp #{crossProcessBreakingDTO.glassChild}
            and ogd.glass_child like concat('%', #{crossProcessBreakingDTO.glassChild}, '%')
        </if>
        <if test="crossProcessBreakingDTO.breakageType != null and crossProcessBreakingDTO.breakageType != ''">
            and dd.breakage_type regexp #{crossProcessBreakingDTO.breakageType}
            and dd.breakage_type like concat('%', #{crossProcessBreakingDTO.breakageType}, '%')
        </if>
        <if test="crossProcessBreakingDTO.project != null and crossProcessBreakingDTO.project != ''">
            and o.project regexp #{crossProcessBreakingDTO.project}
            and o.project like concat('%', #{crossProcessBreakingDTO.project}, '%')
        </if>
        <if test="crossProcessBreakingDTO.orderId != null and crossProcessBreakingDTO.orderId != ''">
            and o.order_id regexp #{crossProcessBreakingDTO.orderId}
            and o.order_id like concat('%', #{crossProcessBreakingDTO.orderId}, '%')
        </if>
        <if test="crossProcessBreakingDTO.responsiblePersonnel != null and crossProcessBreakingDTO.responsiblePersonnel != ''">
            and dd.responsible_personnel regexp #{crossProcessBreakingDTO.responsiblePersonnel}
            and dd.responsible_personnel like concat('%', #{crossProcessBreakingDTO.responsiblePersonnel}, '%')
        </if>
        <if test="crossProcessBreakingDTO.creator != null and crossProcessBreakingDTO.creator != ''">
            and rw.creator like concat('%', #{crossProcessBreakingDTO.creator}, '%')
        </if>
        <if test="crossProcessBreakingDTO.code != null and crossProcessBreakingDTO.code != ''">
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') regexp #{crossProcessBreakingDTO.code}
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') like concat('%', #{crossProcessBreakingDTO.code}, '%')
        </if>
        <if test="crossProcessBreakingDTO.reportingWorkId != null and crossProcessBreakingDTO.reportingWorkId != ''">
            and rw.reporting_work_id regexp #{crossProcessBreakingDTO.reportingWorkId}
            and rw.reporting_work_id like concat('%', #{crossProcessBreakingDTO.reportingWorkId}, '%')
        </if>
        order by dd.id desc
    </select>
@@ -486,37 +491,43 @@
        and reviewed_state != 2
        and rw.this_process = dd.responsible_process
        <if test="crossProcessBreakingDTO.code != null and crossProcessBreakingDTO.code != ''">
            and JSON_UNQUOTE( JSON_EXTRACT( od.other_columns, '$.S01' )) regexp #{crossProcessBreakingDTO.code}
            and JSON_UNQUOTE( JSON_EXTRACT( od.other_columns, '$.S01' )) like concat('%', #{crossProcessBreakingDTO.code}, '%')
        </if>
        <if test="crossProcessBreakingDTO.processId != null and crossProcessBreakingDTO.processId != ''">
            and rw.process_id regexp #{crossProcessBreakingDTO.processId}
            and rw.process_id  like concat('%', #{crossProcessBreakingDTO.processId}, '%')
        </if>
        <if test="crossProcessBreakingDTO.thisProcess != null and crossProcessBreakingDTO.thisProcess != ''">
            and rw.this_process regexp #{crossProcessBreakingDTO.thisProcess}
            and rw.this_process  like concat('%', #{crossProcessBreakingDTO.thisProcess}, '%')
        </if>
        <if test="crossProcessBreakingDTO.responsibleProcess != null and crossProcessBreakingDTO.responsibleProcess != ''">
            and dd.responsible_process regexp #{crossProcessBreakingDTO.responsibleProcess}
            and dd.responsible_process like concat('%', #{crossProcessBreakingDTO.responsibleProcess}, '%')
        </if>
        <if test="crossProcessBreakingDTO.responsibleTeam != null and crossProcessBreakingDTO.responsibleTeam != ''">
            and dd.responsible_team regexp #{crossProcessBreakingDTO.responsibleTeam}
            and dd.responsible_team like concat('%', #{crossProcessBreakingDTO.responsibleTeam}, '%')
        </if>
        <if test="crossProcessBreakingDTO.glassChild != null and crossProcessBreakingDTO.glassChild != ''">
            and ogd.glass_child regexp #{crossProcessBreakingDTO.glassChild}
            and ogd.glass_child like concat('%', #{crossProcessBreakingDTO.glassChild}, '%')
        </if>
        <if test="crossProcessBreakingDTO.breakageType != null and crossProcessBreakingDTO.breakageType != ''">
            and dd.breakage_type regexp #{crossProcessBreakingDTO.breakageType}
            and dd.breakage_type like concat('%', #{crossProcessBreakingDTO.breakageType}, '%')
        </if>
        <if test="crossProcessBreakingDTO.project != null and crossProcessBreakingDTO.project != ''">
            and o.project regexp #{crossProcessBreakingDTO.project}
            and o.project like concat('%', #{crossProcessBreakingDTO.project}, '%')
        </if>
        <if test="crossProcessBreakingDTO.orderId != null and crossProcessBreakingDTO.orderId != ''">
            and o.order_id regexp #{crossProcessBreakingDTO.orderId}
            and o.order_id like concat('%', #{crossProcessBreakingDTO.orderId}, '%')
        </if>
        <if test="crossProcessBreakingDTO.responsiblePersonnel != null and crossProcessBreakingDTO.responsiblePersonnel != ''">
            and dd.responsible_personnel regexp #{crossProcessBreakingDTO.responsiblePersonnel}
            and dd.responsible_personnel like concat('%', #{crossProcessBreakingDTO.responsiblePersonnel}, '%')
        </if>
        <if test="crossProcessBreakingDTO.creator != null and crossProcessBreakingDTO.creator != ''">
            and rw.creator like concat('%', #{crossProcessBreakingDTO.creator}, '%')
        </if>
        <if test="crossProcessBreakingDTO.code != null and crossProcessBreakingDTO.code != ''">
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') regexp #{crossProcessBreakingDTO.code}
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') like concat('%', #{crossProcessBreakingDTO.code}, '%')
        </if>
        <if test="crossProcessBreakingDTO.reportingWorkId != null and crossProcessBreakingDTO.reportingWorkId != ''">
            and rw.reporting_work_id like concat('%', #{crossProcessBreakingDTO.reportingWorkId}, '%')
        </if>
        order by dd.id desc
    </select>
@@ -790,49 +801,49 @@
        AND dd.available = 0 and rw.reviewed_state>=0
        <if test="damageReportDTO.orderId != null and damageReportDTO.orderId != ''">
            and o.order_id regexp #{damageReportDTO.orderId}
            and o.order_id like concat('%', #{damageReportDTO.orderId}, '%')
        </if>
        <if test="damageReportDTO.project != null and damageReportDTO.project != ''">
            and o.project regexp #{damageReportDTO.project}
            and o.project like concat('%', #{damageReportDTO.project}, '%')
        </if>
        <if test="damageReportDTO.processId != null and damageReportDTO.processId != ''">
            and rw.process_id regexp #{damageReportDTO.processId}
            and rw.process_id like concat('%', #{damageReportDTO.processId}, '%')
        </if>
        <if test="damageReportDTO.orderNumber != null and damageReportDTO.orderNumber != ''">
            and dd.order_number regexp #{damageReportDTO.orderNumber}
            and dd.order_number like concat('%', #{damageReportDTO.orderNumber}, '%')
        </if>
        <if test="damageReportDTO.technologyNumber != null and damageReportDTO.technologyNumber != ''">
            and dd.technology_number regexp #{damageReportDTO.technologyNumber}
            and dd.technology_number like concat('%', #{damageReportDTO.technologyNumber}, '%')
        </if>
        <if test="damageReportDTO.responsibleProcess != null and damageReportDTO.responsibleProcess != ''">
            and dd.responsible_process regexp #{damageReportDTO.responsibleProcess}
            and dd.responsible_process like concat('%', #{damageReportDTO.responsibleProcess}, '%')
        </if>
        <if test="damageReportDTO.responsibleTeam != null and damageReportDTO.responsibleTeam != ''">
            and dd.responsible_team regexp #{damageReportDTO.responsibleTeam}
            and dd.responsible_team like concat('%', #{damageReportDTO.responsibleTeam}, '%')
        </if>
        <if test="damageReportDTO.responsibleEquipment != null and damageReportDTO.responsibleEquipment != ''">
            and dd.responsible_equipment regexp #{damageReportDTO.responsibleEquipment}
            and dd.responsible_equipment like concat('%', #{damageReportDTO.responsibleEquipment}, '%')
        </if>
        <if test="damageReportDTO.breakageType != null and damageReportDTO.breakageType != ''">
            and dd.breakage_type regexp #{damageReportDTO.breakageType}
            and dd.breakage_type like concat('%', #{damageReportDTO.breakageType}, '%')
        </if>
        <if test="damageReportDTO.breakageReason != null and damageReportDTO.breakageReason != ''">
            and dd.breakage_reason regexp #{damageReportDTO.breakageReason}
            and dd.breakage_reason like concat('%', #{damageReportDTO.breakageReason}, '%')
        </if>
        <if test="damageReportDTO.glassChild != null and damageReportDTO.glassChild != ''">
            and ogd.glass_child regexp #{damageReportDTO.glassChild}
            and ogd.glass_child like concat('%', #{damageReportDTO.glassChild}, '%')
        </if>
        <if test="damageReportDTO.glassNumber != null and damageReportDTO.glassNumber != ''">
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') regexp #{damageReportDTO.glassNumber}
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') like concat('%', #{damageReportDTO.glassNumber}, '%')
        </if>
        <if test="damageReportDTO.thisProcess != null and damageReportDTO.thisProcess != ''">
            and rw.this_process regexp #{damageReportDTO.thisProcess}
            and rw.this_process like concat('%', #{damageReportDTO.thisProcess}, '%')
        </if>
        <if test="damageReportDTO.creator != null and damageReportDTO.creator != ''">
            and rw.creator regexp #{damageReportDTO.creator}
            and rw.creator like concat('%', #{damageReportDTO.creator}, '%')
        </if>
        <if test="damageReportDTO.reportingWorkId != null and damageReportDTO.reportingWorkId != ''">
            and rw.reporting_work_id regexp #{damageReportDTO.reportingWorkId}
            and rw.reporting_work_id like concat('%', #{damageReportDTO.reportingWorkId}, '%')
        </if>
        GROUP BY
        dd.id
@@ -850,42 +861,55 @@
        LEFT JOIN pp.damage_details AS dd ON dd.reporting_work_id = rw.reporting_work_id
        AND dd.order_number = ogd.order_number
        AND dd.technology_number = ogd.technology_number
        left join sd.order_detail as od on o.order_id = od.order_id and od.order_number=ogd.order_number
        WHERE
        rw.reporting_work_time >= #{selectTime1}
        AND rw.reporting_work_time &lt;=  #{selectTime2}
        AND dd.available = 0 and rw.reviewed_state>=0
        <if test="damageReportDTO.orderId != null and damageReportDTO.orderId != ''">
            and o.order_id regexp #{damageReportDTO.orderId}
            and o.order_id like concat('%', #{damageReportDTO.orderId}, '%')
        </if>
        <if test="damageReportDTO.project != null and damageReportDTO.project != ''">
            and o.project regexp #{damageReportDTO.project}
            and o.project like concat('%', #{damageReportDTO.project}, '%')
        </if>
        <if test="damageReportDTO.processId != null and damageReportDTO.processId != ''">
            and rw.process_id regexp #{damageReportDTO.processId}
            and rw.process_id like concat('%', #{damageReportDTO.processId}, '%')
        </if>
        <if test="damageReportDTO.orderNumber != null and damageReportDTO.orderNumber != ''">
            and dd.order_number regexp #{damageReportDTO.orderNumber}
            and dd.order_number like concat('%', #{damageReportDTO.orderNumber}, '%')
        </if>
        <if test="damageReportDTO.technologyNumber != null and damageReportDTO.technologyNumber != ''">
            and dd.technology_number regexp #{damageReportDTO.technologyNumber}
            and dd.technology_number like concat('%', #{damageReportDTO.technologyNumber}, '%')
        </if>
        <if test="damageReportDTO.responsibleProcess != null and damageReportDTO.responsibleProcess != ''">
            and dd.responsible_process regexp #{damageReportDTO.responsibleProcess}
            and dd.responsible_process like concat('%', #{damageReportDTO.responsibleProcess}, '%')
        </if>
        <if test="damageReportDTO.responsibleTeam != null and damageReportDTO.responsibleTeam != ''">
            and dd.responsible_team regexp #{damageReportDTO.responsibleTeam}
            and dd.responsible_team like concat('%', #{damageReportDTO.responsibleTeam}, '%')
        </if>
        <if test="damageReportDTO.responsibleEquipment != null and damageReportDTO.responsibleEquipment != ''">
            and dd.responsible_equipment regexp #{damageReportDTO.responsibleEquipment}
            and dd.responsible_equipment like concat('%', #{damageReportDTO.responsibleEquipment}, '%')
        </if>
        <if test="damageReportDTO.breakageType != null and damageReportDTO.breakageType != ''">
            and dd.breakage_type regexp #{damageReportDTO.breakageType}
            and dd.breakage_type like concat('%', #{damageReportDTO.breakageType}, '%')
        </if>
        <if test="damageReportDTO.breakageReason != null and damageReportDTO.breakageReason != ''">
            and dd.breakage_reason regexp #{damageReportDTO.breakageReason}
            and dd.breakage_reason like concat('%', #{damageReportDTO.breakageReason}, '%')
        </if>
        <if test="damageReportDTO.glassChild != null and damageReportDTO.glassChild != ''">
            and ogd.glass_child regexp #{damageReportDTO.glassChild}
            and ogd.glass_child like concat('%', #{damageReportDTO.glassChild}, '%')
        </if>
        <if test="damageReportDTO.glassNumber != null and damageReportDTO.glassNumber != ''">
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') like concat('%', #{damageReportDTO.glassNumber}, '%')
        </if>
        <if test="damageReportDTO.thisProcess != null and damageReportDTO.thisProcess != ''">
            and rw.this_process like concat('%', #{damageReportDTO.thisProcess}, '%')
        </if>
        <if test="damageReportDTO.creator != null and damageReportDTO.creator != ''">
            and rw.creator like concat('%', #{damageReportDTO.creator}, '%')
        </if>
        <if test="damageReportDTO.reportingWorkId != null and damageReportDTO.reportingWorkId != ''">
            and rw.reporting_work_id like concat('%', #{damageReportDTO.reportingWorkId}, '%')
        </if>
        limit #{offset},#{pageSize};
    </select>
@@ -1669,7 +1693,25 @@
    <select id="teamOutputMp" resultMap="teamOutputMap">
        SELECT
        *
        t.*,
        -- çŽ»ç’ƒæ€»åŽšåº¦ï¼ˆmm)
        (
        SELECT SUM(CAST(REGEXP_SUBSTR(seg, '^[0-9]+') AS UNSIGNED))
        FROM JSON_TABLE(
        CONCAT('["', REPLACE(t.workProcessName, '+', '","'), '"]'),
        '$[*]' COLUMNS (seg VARCHAR(100) PATH '$')
        ) jt
        ) AS thicknessSum,
        ROUND(
        (
        SELECT SUM(CAST(REGEXP_SUBSTR(seg, '^[0-9]+') AS UNSIGNED))
        FROM JSON_TABLE(
        CONCAT('["', REPLACE(t.workProcessName, '+', '","'), '"]'),
        '$[*]' COLUMNS (seg VARCHAR(100) PATH '$')
        ) jt2
        ) * t.area,
        2
        ) AS thicknessArea
        FROM
        (
        SELECT
@@ -1778,6 +1820,10 @@
        <if test="teamOutputDTO.workProcessName != null and teamOutputDTO.workProcessName != ''">
            AND t.workProcessName REGEXP #{teamOutputDTO.workProcessName}
        </if>
        HAVING 1 = 1
        <if test="teamOutputDTO.thicknessSum != null and teamOutputDTO.thicknessSum != ''">
            AND thicknessSum REGEXP #{teamOutputDTO.thicknessSum}
        </if>
        ORDER BY
        t.this_process,
        t.process_id,
@@ -1854,52 +1900,116 @@
    <select id="teamOutputPageTotal">
        SELECT
        CEILING(count(*)/#{pageSize}) as 'pageTotal',
        count(*) as 'total'
        FROM
        CEILING(COUNT(*) / #{pageSize}) AS pageTotal,
        COUNT(*) AS total
        FROM (
        SELECT
        t.*,
        CASE
        WHEN t.workProcessName IS NULL OR t.workProcessName = '' THEN 0
        ELSE (
        SELECT SUM(CAST(REGEXP_SUBSTR(seg, '^[0-9]+') AS UNSIGNED))
        FROM JSON_TABLE(
        CONCAT('["', REPLACE(t.workProcessName, '+', '","'), '"]'),
        '$[*]' COLUMNS (seg VARCHAR(100) PATH '$')
        ) jt
        )
        END AS thicknessSum,
        CASE
        WHEN t.workProcessName IS NULL OR t.workProcessName = '' THEN 0
        ELSE ROUND(
        (
        SELECT SUM(CAST(REGEXP_SUBSTR(seg2, '^[0-9]+') AS UNSIGNED))
        FROM JSON_TABLE(
        CONCAT('["', REPLACE(t.workProcessName, '+', '","'), '"]'),
        '$[*]' COLUMNS (seg2 VARCHAR(100) PATH '$')
        ) jt2
        ) * t.area,
        2
        )
        END AS thicknessArea
        FROM (
        SELECT
        rw.reporting_work_time,
        rw.this_process,
        rw.teams_groups_name,
        o.project,
        o.order_id,
        rw.process_id,
        fc.order_number,
        MAX( ogd.child_width ) as width,
        MAX( ogd.child_height ) as height,
        MAX(ogd.child_width)  AS width,
        MAX(ogd.child_height) AS height,
        od.edging_type,
        rwd.completed_quantity as completed_quantity,
        ROUND(MAX( ogd.child_width )*MAX( ogd.child_height )*rwd.completed_quantity/1000000,2) as area,
        rwd.completed_quantity AS completed_quantity,
        ROUND(MAX(ogd.child_width) * MAX(ogd.child_height) * rwd.completed_quantity / 1000000, 2) AS area,
        od.product_name,
        JSON_UNQUOTE( JSON_EXTRACT( od.other_columns, '$.S01' )) AS code
        JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')) AS code,
        rw.reviewed,
        rw.examine_time,
        rw.device_name,
        o.order_type,
        CASE
        WHEN LOCATE('step', #{laminating}) > 0 THEN GROUP_CONCAT(ogd.glass_child SEPARATOR '+')
        ELSE MAX(ogd.glass_child)
        END AS workProcessName,
        o.batch
        FROM
        pp.reporting_work as rw left join pp.reporting_work_detail as rwd on rwd.reporting_work_id=rw.reporting_work_id
        left join pp.flow_card as fc on fc.order_id=rw.order_id and fc.process_id=rw.process_id  and fc.order_number=rwd.order_number and fc.technology_number=rwd.technology_number
        left join sd.order_glass_detail as ogd on ogd.order_id=fc.order_id and ogd.order_number=fc.order_number and ogd.technology_number=fc.technology_number
        left join sd.order_detail as od  on od.order_id=ogd.order_id and od.order_number=ogd.order_number
        left join sd.`order` as o on o.order_id=od.order_id
        where o.create_order>0 and rw.reviewed_state>=0 and rwd.completed_quantity>0 and
        rw.reporting_work_time >= #{selectTime1}
        pp.reporting_work AS rw
        LEFT JOIN pp.reporting_work_detail AS rwd
        ON rwd.reporting_work_id = rw.reporting_work_id
        LEFT JOIN pp.flow_card AS fc
        ON fc.order_id = rw.order_id
        AND fc.process_id = rw.process_id
        AND fc.order_number = rwd.order_number
        AND fc.technology_number = rwd.technology_number
        LEFT JOIN sd.order_glass_detail AS ogd
        ON ogd.order_id = fc.order_id
        AND ogd.order_number = fc.order_number
        AND ogd.technology_number = fc.technology_number
        LEFT JOIN sd.order_detail AS od
        ON od.order_id = ogd.order_id
        AND od.order_number = ogd.order_number
        LEFT JOIN sd.`order` AS o
        ON o.order_id = od.order_id
        WHERE
        o.create_order > 0
        AND rw.reviewed_state >= 0
        AND rwd.completed_quantity > 0
        AND rw.reporting_work_time &gt;= #{selectTime1}
        AND rw.reporting_work_time &lt;  #{selectTime2}
        and position(#{selectProcesses} in rw.this_process)
        <choose>
            <!-- æœ‰ä¼ å·¥åºï¼šç²¾ç¡®åŒ¹é… -->
            <when test="selectProcesses != null and selectProcesses != ''">
                AND rw.this_process = #{selectProcesses}
            </when>
            <!-- æœªä¼ å·¥åºï¼šä¸åŠ é™åˆ¶ -->
            <otherwise>
            </otherwise>
        </choose>
        <if test="teamOutputDTO.thisProcess != null and teamOutputDTO.thisProcess != ''">
            and rw.this_process regexp #{teamOutputDTO.thisProcess}
            AND rw.this_process REGEXP #{teamOutputDTO.thisProcess}
        </if>
        <if test="teamOutputDTO.teamsGroupsName != null and teamOutputDTO.teamsGroupsName != ''">
            and rw.teams_groups_name like concat('%', #{teamOutputDTO.teamsGroupsName}, '%')
            AND rw.teams_groups_name LIKE CONCAT('%', #{teamOutputDTO.teamsGroupsName}, '%')
        </if>
        <if test="teamOutputDTO.project != null and teamOutputDTO.project != ''">
            and o.project regexp #{teamOutputDTO.project}
            AND o.project REGEXP #{teamOutputDTO.project}
        </if>
        <if test="teamOutputDTO.processId != null and teamOutputDTO.processId != ''">
            and rw.process_id regexp #{teamOutputDTO.processId}
            AND rw.process_id REGEXP #{teamOutputDTO.processId}
        </if>
        <if test="teamOutputDTO.edgingType != null and teamOutputDTO.edgingType != ''">
            and od.edging_type regexp #{teamOutputDTO.edgingType}
            AND od.edging_type REGEXP #{teamOutputDTO.edgingType}
        </if>
        <if test="teamOutputDTO.deviceName != null and teamOutputDTO.deviceName != ''">
            AND rw.device_name REGEXP #{teamOutputDTO.deviceName}
        </if>
        <if test="teamOutputDTO.batch != null and teamOutputDTO.batch != ''">
            AND o.batch REGEXP #{teamOutputDTO.batch}
        </if>
        <choose>
            <when test="laminating == ''">
                GROUP BY
@@ -1919,13 +2029,19 @@
                rwd.order_number
            </otherwise>
        </choose>
        ORDER BY
        rw.this_process,
        rw.process_id,
        rwd.order_number,
        rw.reporting_work_time,
        rw.teams_groups_name
        ) as page_toal
        ) t
        WHERE 1 = 1
        <if test="teamOutputDTO.workProcessName != null and teamOutputDTO.workProcessName != ''">
            AND t.workProcessName REGEXP #{teamOutputDTO.workProcessName}
        </if>
        ) x
        WHERE 1 = 1
        <if test="teamOutputDTO.thicknessSum != null and teamOutputDTO.thicknessSum != ''">
            AND x.thicknessSum REGEXP #{teamOutputDTO.thicknessSum}
        </if>
        <if test="teamOutputDTO.thicknessArea != null and teamOutputDTO.thicknessArea != ''">
            AND x.thicknessArea REGEXP #{teamOutputDTO.thicknessArea}
        </if>
        limit #{offset},#{pageSize}
    </select>
@@ -2384,29 +2500,48 @@
        <if test="terminationVals != '1' and terminationVals != 1">
            and fc.termination_status !=1
        </if>
        <if test="workInProgressDTO.thisProcess != null and workInProgressDTO.thisProcess != ''">
            and d.process like concat('%', #{workInProgressDTO.thisProcess}, '%')
        </if>
        <if test="workInProgressDTO.customerName != null and workInProgressDTO.customerName != ''">
            and o.customer_name regexp #{workInProgressDTO.customerName}
            and o.customer_name like concat('%', #{workInProgressDTO.customerName}, '%')
        </if>
        <if test="workInProgressDTO.project != null and workInProgressDTO.project != ''">
            and o.project regexp #{workInProgressDTO.project}
            and o.project like concat('%', #{workInProgressDTO.project}, '%')
        </if>
        <if test="workInProgressDTO.orderId != null and workInProgressDTO.orderId != ''">
            and o.order_id regexp #{workInProgressDTO.orderId}
            and o.order_id like concat('%', #{workInProgressDTO.orderId}, '%')
        </if>
        <if test="workInProgressDTO.batch != null and workInProgressDTO.batch != ''">
            and o.batch regexp #{workInProgressDTO.batch}
            and o.batch like concat('%', #{workInProgressDTO.batch}, '%')
        </if>
        <if test="workInProgressDTO.processId != null and workInProgressDTO.processId != ''">
            and fc.process_id regexp #{workInProgressDTO.processId}
            and fc.process_id like concat('%', #{workInProgressDTO.processId}, '%')
        </if>
        <if test="workInProgressDTO.orderNumber != null and workInProgressDTO.orderNumber != ''">
            and ogd.order_number regexp #{workInProgressDTO.orderNumber}
            and ogd.order_number like concat('%', #{workInProgressDTO.orderNumber}, '%')
        </if>
        <if test="workInProgressDTO.technologyNumber != null and workInProgressDTO.technologyNumber != ''">
            and ogd.technology_number regexp #{workInProgressDTO.technologyNumber}
            and ogd.technology_number like concat('%', #{workInProgressDTO.technologyNumber}, '%')
        </if>
        <if test="workInProgressDTO.quantity != null and workInProgressDTO.quantity != ''">
            and od.quantity like concat('%', #{workInProgressDTO.quantity}, '%')
        </if>
        <if test="workInProgressDTO.childWidth != null and workInProgressDTO.childWidth != ''">
            and ogd.child_width regexp REGEXP_REPLACE(#{workInProgressDTO.childWidth},'\\.0+$','')
        </if>
        <if test="workInProgressDTO.childHeight != null and workInProgressDTO.childHeight != ''">
            and ogd.child_height regexp REGEXP_REPLACE(#{workInProgressDTO.childHeight},'\\.0+$','')
        </if>
        <if test="workInProgressDTO.stockNum != null and workInProgressDTO.stockNum != ''">
            and (d.numCounts + d.patchNumSum - d.numCount -d.broken_num) like concat('%', #{workInProgressDTO.stockNum}, '%')
        </if>
        <if test="workInProgressDTO.stockArea != null and workInProgressDTO.stockArea != ''">
            and ROUND(ogd.child_width * ogd.child_height * (d.numCounts + d.patchNumSum - d.numCount -
            d.broken_num) / 1000000, 2) regexp REGEXP_REPLACE(#{workInProgressDTO.stockArea},'\\.0+$','')
        </if>
        <if test="workInProgressDTO.glassNumber != null and workInProgressDTO.glassNumber != ''">
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') regexp #{workInProgressDTO.glassNumber}
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') like concat('%', #{workInProgressDTO.glassNumber}, '%')
        </if>
        group by fc.process_id, fc.order_number, fc.technology_number,d.process
@@ -2467,49 +2602,91 @@
          AND rw.reporting_work_time &lt;=  #{selectTime2}
          AND dd.available = 0 and rw.reviewed_state>=0
        <if test="damageReportDTO.orderId != null and damageReportDTO.orderId != ''">
            and o.order_id regexp #{damageReportDTO.orderId}
            and o.order_id like concat('%', #{damageReportDTO.orderId}, '%')
        </if>
        <if test="damageReportDTO.project != null and damageReportDTO.project != ''">
            and o.project regexp #{damageReportDTO.project}
            and o.project like concat('%', #{damageReportDTO.project}, '%')
        </if>
        <if test="damageReportDTO.processId != null and damageReportDTO.processId != ''">
            and rw.process_id regexp #{damageReportDTO.processId}
            and rw.process_id like concat('%', #{damageReportDTO.processId}, '%')
        </if>
        <if test="damageReportDTO.orderNumber != null and damageReportDTO.orderNumber != ''">
            and dd.order_number regexp #{damageReportDTO.orderNumber}
            and dd.order_number like concat('%', #{damageReportDTO.orderNumber}, '%')
        </if>
        <if test="damageReportDTO.technologyNumber != null and damageReportDTO.technologyNumber != ''">
            and dd.technology_number regexp #{damageReportDTO.technologyNumber}
            and dd.technology_number like concat('%', #{damageReportDTO.technologyNumber}, '%')
        </if>
        <if test="damageReportDTO.responsibleProcess != null and damageReportDTO.responsibleProcess != ''">
            and dd.responsible_process regexp #{damageReportDTO.responsibleProcess}
            and dd.responsible_process like concat('%', #{damageReportDTO.responsibleProcess}, '%')
        </if>
        <if test="damageReportDTO.responsibleTeam != null and damageReportDTO.responsibleTeam != ''">
            and dd.responsible_team regexp #{damageReportDTO.responsibleTeam}
            and dd.responsible_team like concat('%', #{damageReportDTO.responsibleTeam}, '%')
        </if>
        <if test="damageReportDTO.responsibleEquipment != null and damageReportDTO.responsibleEquipment != ''">
            and dd.responsible_equipment regexp #{damageReportDTO.responsibleEquipment}
            and dd.responsible_equipment like concat('%', #{damageReportDTO.responsibleEquipment}, '%')
        </if>
        <if test="damageReportDTO.breakageType != null and damageReportDTO.breakageType != ''">
            and dd.breakage_type regexp #{damageReportDTO.breakageType}
            and dd.breakage_type like concat('%', #{damageReportDTO.breakageType}, '%')
        </if>
        <if test="damageReportDTO.breakageReason != null and damageReportDTO.breakageReason != ''">
            and dd.breakage_reason regexp #{damageReportDTO.breakageReason}
            and dd.breakage_reason like concat('%', #{damageReportDTO.breakageReason}, '%')
        </if>
        <if test="damageReportDTO.glassChild != null and damageReportDTO.glassChild != ''">
            and ogd.glass_child regexp #{damageReportDTO.glassChild}
            and ogd.glass_child like concat('%', #{damageReportDTO.glassChild}, '%')
        </if>
        <if test="damageReportDTO.glassNumber != null and damageReportDTO.glassNumber != ''">
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') regexp #{damageReportDTO.glassNumber}
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') like concat('%', #{damageReportDTO.glassNumber}, '%')
        </if>
        <if test="damageReportDTO.thisProcess != null and damageReportDTO.thisProcess != ''">
            and rw.this_process like concat('%', #{damageReportDTO.thisProcess}, '%')
        </if>
        <if test="damageReportDTO.creator != null and damageReportDTO.creator != ''">
            and rw.creator like concat('%', #{damageReportDTO.creator}, '%')
        </if>
        <if test="damageReportDTO.reportingWorkId != null and damageReportDTO.reportingWorkId != ''">
            and rw.reporting_work_id like concat('%', #{damageReportDTO.reportingWorkId}, '%')
        </if>
    </select>
    <select id="teamOutputFootSum">
        SELECT
        SUM(completed_quantity) as completedQuantity,
        ifnull(SUM(ROUND(width * height * completed_quantity / 1000000, 2)),0) AS area
        FROM
        -- æ•°é‡åˆè®¡
        SUM(x.completed_quantity)              AS completedQuantity,
        -- é¢ç§¯åˆè®¡
        IFNULL(SUM(x.area), 0)                 AS area,
        -- åŽšåº¦Ã—é¢ç§¯åˆè®¡
        IFNULL(SUM(x.thicknessArea), 0)        AS thicknessArea
        FROM (
        /* ç¬¬ 2 å±‚:在这里根据 workProcessName è®¡ç®— thicknessSum / thicknessArea */
        SELECT
        t.*,
        /* çŽ»ç’ƒæ€»åŽšåº¦ï¼šåªå–æ¯æ®µå‰é¢çš„æ•°å­—ç›¸åŠ  */
        CASE
        WHEN t.workProcessName IS NULL OR t.workProcessName = '' THEN 0
        ELSE (
        SELECT SUM(CAST(REGEXP_SUBSTR(seg, '^[0-9]+') AS UNSIGNED))
        FROM JSON_TABLE(
        CAST(CONCAT('["', REPLACE(t.workProcessName, '+', '","'), '"]') AS JSON),
        '$[*]' COLUMNS (seg VARCHAR(100) PATH '$')
        ) jt
        )
        END AS thicknessSum,
        /* åŽšåº¦ Ã— é¢ç§¯ */
        CASE
        WHEN t.workProcessName IS NULL OR t.workProcessName = '' THEN 0
        ELSE ROUND(
        (
        SELECT SUM(CAST(REGEXP_SUBSTR(seg2, '^[0-9]+') AS UNSIGNED))
        FROM JSON_TABLE(
        CAST(CONCAT('["', REPLACE(t.workProcessName, '+', '","'), '"]') AS JSON),
        '$[*]' COLUMNS (seg2 VARCHAR(100) PATH '$')
        ) jt2
        ) * t.area,
        2
        )
        END AS thicknessArea
        FROM (
        /* ç¬¬ 1 å±‚:只负责算好 workProcessName、area ç­‰åŸºç¡€å­—段 */
        SELECT
        rw.reporting_work_time,
        rw.this_process,
@@ -2570,7 +2747,7 @@
            AND rw.this_process REGEXP #{teamOutputDTO.thisProcess}
        </if>
        <if test="teamOutputDTO.teamsGroupsName != null and teamOutputDTO.teamsGroupsName != ''">
            and rw.teams_groups_name like concat('%', #{teamOutputDTO.teamsGroupsName}, '%')
            AND rw.teams_groups_name LIKE CONCAT('%', #{teamOutputDTO.teamsGroupsName}, '%')
        </if>
        <if test="teamOutputDTO.project != null and teamOutputDTO.project != ''">
            AND o.project REGEXP #{teamOutputDTO.project}
@@ -2614,12 +2791,17 @@
        <if test="teamOutputDTO.workProcessName != null and teamOutputDTO.workProcessName != ''">
            AND t.workProcessName REGEXP #{teamOutputDTO.workProcessName}
        </if>
        ORDER BY
        t.this_process,
        t.process_id,
        t.order_number,
        t.reporting_work_time,
        t.teams_groups_name
        ) x
        WHERE 1 = 1
        <if test="teamOutputDTO.thicknessSum != null and teamOutputDTO.thicknessSum != ''">
            AND x.thicknessSum REGEXP #{teamOutputDTO.thicknessSum}
        </if>
        <if test="teamOutputDTO.thicknessArea != null and teamOutputDTO.thicknessArea != ''">
            AND x.thicknessArea REGEXP #{teamOutputDTO.thicknessArea}
        </if>
        ;
    </select>
    <select id="getLaminating">
@@ -2711,47 +2893,47 @@
            and fc.termination_status !=1
        </if>
        <if test="workInProgressDTO.thisProcess != null and workInProgressDTO.thisProcess != ''">
            and d.process regexp #{workInProgressDTO.thisProcess}
            and d.process like concat('%', #{workInProgressDTO.thisProcess}, '%')
        </if>
        <if test="workInProgressDTO.customerName != null and workInProgressDTO.customerName != ''">
            and o.customer_name regexp #{workInProgressDTO.customerName}
            and o.customer_name like concat('%', #{workInProgressDTO.customerName}, '%')
        </if>
        <if test="workInProgressDTO.project != null and workInProgressDTO.project != ''">
            and o.project regexp #{workInProgressDTO.project}
            and o.project like concat('%', #{workInProgressDTO.project}, '%')
        </if>
        <if test="workInProgressDTO.orderId != null and workInProgressDTO.orderId != ''">
            and o.order_id regexp #{workInProgressDTO.orderId}
            and o.order_id like concat('%', #{workInProgressDTO.orderId}, '%')
        </if>
        <if test="workInProgressDTO.batch != null and workInProgressDTO.batch != ''">
            and o.batch regexp #{workInProgressDTO.batch}
            and o.batch like concat('%', #{workInProgressDTO.batch}, '%')
        </if>
        <if test="workInProgressDTO.processId != null and workInProgressDTO.processId != ''">
            and fc.process_id regexp #{workInProgressDTO.processId}
            and fc.process_id like concat('%', #{workInProgressDTO.processId}, '%')
        </if>
        <if test="workInProgressDTO.orderNumber != null and workInProgressDTO.orderNumber != ''">
            and ogd.order_number regexp #{workInProgressDTO.orderNumber}
            and ogd.order_number like concat('%', #{workInProgressDTO.orderNumber}, '%')
        </if>
        <if test="workInProgressDTO.technologyNumber != null and workInProgressDTO.technologyNumber != ''">
            and ogd.technology_number regexp #{workInProgressDTO.technologyNumber}
            and ogd.technology_number like concat('%', #{workInProgressDTO.technologyNumber}, '%')
        </if>
        <if test="workInProgressDTO.quantity != null and workInProgressDTO.quantity != ''">
            and od.quantity regexp #{workInProgressDTO.quantity}
            and od.quantity like concat('%', #{workInProgressDTO.quantity}, '%')
        </if>
        <if test="workInProgressDTO.childWidth != null and workInProgressDTO.childWidth != ''">
            and ogd.child_width regexp #{workInProgressDTO.childWidth}
            and ogd.child_width regexp REGEXP_REPLACE(#{workInProgressDTO.childWidth},'\\.0+$','')
        </if>
        <if test="workInProgressDTO.childHeight != null and workInProgressDTO.childHeight != ''">
            and ogd.child_height regexp #{workInProgressDTO.childHeight}
            and ogd.child_height regexp REGEXP_REPLACE(#{workInProgressDTO.childHeight},'\\.0+$','')
        </if>
        <if test="workInProgressDTO.stockNum != null and workInProgressDTO.stockNum != ''">
            and (d.numCounts + d.patchNumSum - d.numCount -d.broken_num) regexp #{workInProgressDTO.stockNum}
            and (d.numCounts + d.patchNumSum - d.numCount -d.broken_num) like concat('%', #{workInProgressDTO.stockNum}, '%')
        </if>
        <if test="workInProgressDTO.stockArea != null and workInProgressDTO.stockArea != ''">
            and ROUND(ogd.child_width * ogd.child_height * (d.numCounts + d.patchNumSum - d.numCount -
            d.broken_num) / 1000000, 2) regexp #{workInProgressDTO.stockArea}
            d.broken_num) / 1000000, 2) regexp REGEXP_REPLACE(#{workInProgressDTO.stockArea},'\\.0+$','')
        </if>
        <if test="workInProgressDTO.glassNumber != null and workInProgressDTO.glassNumber != ''">
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') regexp #{workInProgressDTO.glassNumber}
            and ifnull(JSON_UNQUOTE(JSON_EXTRACT(od.other_columns, '$.S01')),'') like concat('%', #{workInProgressDTO.glassNumber}, '%')
        </if>
        <choose>
            <when test="laminating != null and laminating == 'stepC'">
north-glass-erp/src/main/resources/mapper/pp/ReportingWork.xml
@@ -1064,7 +1064,7 @@
            and o.order_id regexp #{reportingWork.orderId}
        </if>
        <if test="reportingWork.processId != null and reportingWork.processId != ''">
            and rw.process_id regexp #{reportingWork.processId}
            and CONCAT(rw.process_id,'/',rwd.goup) LIKE CONCAT('%', #{reportingWork.processId}, '%')
        </if>
        <if test="reportingWork.order.project != null and reportingWork.order.project != ''">
            and o.project regexp #{reportingWork.order.project}
@@ -1079,7 +1079,7 @@
            and rw.device_name regexp #{reportingWork.deviceName}
        </if>
        <if test="reportingWork.teamsGroupsName != null and reportingWork.teamsGroupsName != ''">
            and rw.teams_groups_name regexp #{reportingWork.teamsGroupsName}
            and rw.teams_groups_name like concat('%', #{reportingWork.teamsGroupsName}, '%')
        </if>
    </select>
north-glass-erp/src/main/resources/mapper/pp/ReworkMapper.xml
@@ -51,7 +51,7 @@
                and r.rework_id regexp #{rework.reworkId}
            </if>
            <if test="rework.reworkTeam != null and rework.reworkTeam != ''">
                and r.rework_team regexp #{rework.reworkTeam}
                and r.rework_team like concat('%', #{rework.reworkTeam}, '%')
            </if>
            <if test="rework.orderId != null and rework.orderId != ''">
                and r.order_id regexp #{rework.orderId}
@@ -99,7 +99,7 @@
                and ogd.glass_address regexp #{rework.glassAddress}
            </if>
            <if test="rework.responsibleTeam != null and rework.responsibleTeam != ''">
                and r.responsible_team regexp #{rework.responsibleTeam}
                and r.responsible_team like concat('%', #{rework.responsibleTeam}, '%')
            </if>
            <if test="rework.responsibleEquipment != null and rework.responsibleEquipment != ''">
                and r.responsible_equipment regexp #{rework.responsibleEquipment}
@@ -123,7 +123,7 @@
                and r.rework_processes regexp #{rework.reworkProcesses}
            </if>
            <if test="rework.reviewer != null and rework.reviewer != ''">
                and r.reviewer regexp #{rework.reviewer}
                and r.reviewer like concat('%', #{rework.reviewer}, '%')
            </if>
        </where>
         order by r.review_status,r.id desc limit #{offset},#{pageSize};
@@ -145,7 +145,7 @@
                and r.rework_id regexp #{rework.reworkId}
            </if>
            <if test="rework.reworkTeam != null and rework.reworkTeam != ''">
                and r.rework_team regexp #{rework.reworkTeam}
                and r.rework_team like concat('%', #{rework.reworkTeam}, '%')
            </if>
            <if test="rework.orderId != null and rework.orderId != ''">
                and r.order_id regexp #{rework.orderId}
@@ -193,7 +193,7 @@
                and ogd.glass_address regexp #{rework.glassAddress}
            </if>
            <if test="rework.responsibleTeam != null and rework.responsibleTeam != ''">
                and r.responsible_team regexp #{rework.responsibleTeam}
                and r.responsible_team like concat('%', #{rework.responsibleTeam}, '%')
            </if>
            <if test="rework.responsibleEquipment != null and rework.responsibleEquipment != ''">
                and r.responsible_equipment regexp #{rework.responsibleEquipment}
@@ -217,7 +217,7 @@
                and r.rework_processes regexp #{rework.reworkProcesses}
            </if>
            <if test="rework.reviewer != null and rework.reviewer != ''">
                and r.reviewer regexp #{rework.reviewer}
                and r.reviewer like concat('%', #{rework.reviewer}, '%')
            </if>
        </where>
        ) as zu;
north-glass-erp/src/main/resources/mapper/sd/OrderProcessDetailMapper.xml
@@ -79,7 +79,7 @@
                            when 'stepD' then 4
                            when 'stepB' then 4
                            else 1
                     end as sort,
                     end as sortByprocess,
                    b.sort as 'sort2'
@@ -101,7 +101,7 @@
                                                    group by opd.id) as a
                    GROUP BY process)   as sort1
        on sort1.process = a.process
        order by sort,sort2,sort1.count,id
        order by sortByprocess,sort1.count,sort2,id
    </select>