chenlu
2025-05-23 9b7aead180feb9dcd283b67221ef108dc95b3175
Merge branch 'master' of http://10.153.19.25:10105/r/ERP_override
26个文件已修改
2483 ■■■■ 已修改文件
north-glass-erp/northglass-erp/src/assets/main.css 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheet1.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/金华天成.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/Optimization.vue 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizationRectPrint.vue 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeControl.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeParms.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeProject.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectMange.vue 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ComputeCard.vue 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/GlassInventory.vue 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/OptimizationRect.vue 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/OptimizeCompute.vue 1537 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectDetail.vue 151 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/RectRenderer.vue 223 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/SetAmount.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/SetTrimming.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/system/app/appDownload.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/pp/GlassOptimizeController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/entity/sd/BasicData.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/pp/GlassOptimizeMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderProcessDetailMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml 145 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/sd/OrderProcessDetailMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/assets/main.css
@@ -7,8 +7,8 @@
  font-weight: normal;
  height: 100%;
  width: 100%;
  min-width: 1536px;
  min-height: 730px;
  /*min-width: 1536px;
  min-height: 730px;*/
}
a,
north-glass-erp/northglass-erp/src/components/sd/delivery/PrintSheet1.vue
@@ -15,8 +15,8 @@
let money = ref("")
let otherMoneys = 0
let sumMoney = 0
let takeCare = "注意:请妥善保管好我司的玻璃架,如有丢失或损坏,按1500元只赔偿。谢谢配合!"
let remark = company.deliveryRemark
let takeCare =ref("注意:请妥善保管好我司的玻璃架,如有丢失或损坏,按1500元只赔偿。谢谢配合!")
let remark =ref(company.deliveryRemark)
@@ -298,8 +298,8 @@
            </tr>
            <tr class="day-in" style="border: 0;">
              <td colspan="9" style="border: 0;">
                <div style="display:flex;text-align: left" class="bottom" v-for="item in  remark">
                  {{item}}
                <div style="display:flex;text-align: left;border: 0;margin-top: 10px " class="bottom" >
                  <el-input type="textarea" :autosize="{ minRows: 2, maxRows: 20 }" v-model="remark"/>
                </div>
              </td>
north-glass-erp/northglass-erp/src/stores/sd/companySet/½ð»ªÌì³É.js
@@ -3,7 +3,7 @@
export default defineStore('companyInfo', {
    state: () => ({
        timeOut:true,//金华true,其他false,是否开启超时改变复选框状态
        timeOut:true,//金华true,其他false,是否开启发货超时改变复选框状态颜色
        connectMes:true,//常州,义乌true,其他false,显示订单报工转移是否启用
        companyName: '金华福喜天成玻璃有限公司',
        address:'浙江省金华市金东区曹宅镇工业功能区鹤岩街28号2号',
@@ -22,7 +22,7 @@
        selectOrderReviewShow:true, //订单首页加工单审核按钮是否显示
        productName:"product_name",
        decValue:2,//订单保留位数,天津3位,常州2位
        label:1,//标签类型
        label:1,//标签类型(自定义打印标签常州2,其他1)
        calculateType:1,//订单计算方式
        reportType:2,//报工是否查询样品订单2查询,1不查询
        qualityInsStatus:2,//跨工序质检审核,1不需要,2需要
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/Optimization.vue
@@ -29,25 +29,26 @@
const dataLoaded = ref(false);
const selectLayout = () => {
  request.post(`/glassOptimize/selectOptimizeResult/${processId}`)
    .then((res) => {
      if (res.code == 200) {
        try {
          const parsedData = JSON.parse(res.data.data[0].Layouts);
          layoutData.value = parsedData;
          dataLoaded.value = true;
          ElMessage.success("打开版图成功");
        } catch (error) {
          ElMessage.error("解析数据时出错:", error);
        }
      } else {
        ElMessage.error(t('basicData.msg.requestFailed'));
      }
    })
    .catch((error) => {
      console.error("请求失败:", error);
      ElMessage.error(t('basicData.msg.requestFailed'));
    });
  if(processId!=="undefined"){
    request.post(`/glassOptimize/selectOptimizeResult/${processId}`)
        .then((res) => {
          if (res.code == 200) {
            try {
              const parsedData = JSON.parse(res.data.data[0].Layouts);
              layoutData.value = parsedData;
              dataLoaded.value = true;
              ElMessage.success("打开版图成功");
            } catch (error) {
              ElMessage.error("解析数据时出错:", error);
            }
          }
        })
        .catch((error) => {
          console.error("请求失败:", error);
          ElMessage.error(t('basicData.msg.ServerConnectionError'));
        });
  }
}
onMounted(() => {
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizationRectPrint.vue
@@ -1,16 +1,6 @@
<template>
  <div>
    <el-button id="button" type="primary" @click="handlePrint">打印版图</el-button>
    <el-select
      v-model="printLayout"
      placeholder="选择打印布局"
      @change="handleLayoutChange"
      style="width: 150px; margin-bottom: 10px;">
      <el-option label="四行两列" value="4rows-2cols"></el-option>
      <el-option label="三行两列" value="3rows-2cols"></el-option>
      <el-option label="三行一列" value="3rows-1col"></el-option>
      <el-option label="两行两列" value="2rows-2cols"></el-option>
    </el-select>
    <el-button id="button" type="primary" @click="handlePrint">打印</el-button>
    
    <div ref="printContainer" style="position: relative;">
      <RectRenderer 
@@ -21,7 +11,9 @@
        :printLayout="printLayout"
        :printWidth="currentPrintWidth"
        :printHeight="currentPrintHeight"
        style="position: absolute;"
        :materialDetails="materialDetails"
        :state="state"
        style=""
        v-if="dataLoaded"
      />
    </div>
@@ -33,12 +25,18 @@
import RectRenderer from './page/RectRenderer.vue';
import request from "@/utils/request";
const props = defineProps({
  project : null,
  state : null
});
const printLayout = ref('2rows-2cols');
const rectRenderer = ref(null);
const savedProjectNo = localStorage.getItem('projectNo');
const processId = savedProjectNo;
const layoutData = ref(null);
let processId = null;
const layoutData = ref();
const dataLoaded = ref(false);
const materialDetails = ref();
const state = ref();
// å®šä¹‰ä¸åŒå¸ƒå±€å¯¹åº”的尺寸
const layoutDimensions = {
  '4rows-2cols': { width: 1000, height: 1000 },
@@ -58,9 +56,9 @@
    .then((res) => {
      if (res.code == 200) {
        try {
          const parsedData = JSON.parse(res.data.data[0].Layouts);
          layoutData.value = parsedData;
          dataLoaded.value = true;
          layoutData.value = JSON.parse(res.data.data[0].Layouts);
          materialDetails.value=res.data.optimizeUse;
          dataLoaded.value=true;
        } catch (error) {
          console.error("解析布局数据失败:", error);
        }
@@ -74,7 +72,12 @@
};
onMounted(() => {
  selectLayout();
  if (props.project) {
    processId=props.project.projectNumber;
    state.value=props.state;
    selectLayout();
  }
});
const handlePrint = () => {
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeControl.vue
@@ -4,6 +4,7 @@
    :layoutData="layoutData" 
    :gw="1400"
    :gh="800"
    :state=0
    style="width: 1500px; height: 800px; position: relative;"
    v-if="dataLoaded"
  />
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeParms.vue
@@ -349,7 +349,8 @@
                >
                  <option 
                    v-for="option in getOptions(param.key)" 
                    :key="option.value"
                    :key="option.value"
                    :value="option.value"
                    :selected="option.value === settings.optimization[param.key]"
                  >
                    {{ option.label }}
@@ -369,7 +370,7 @@
      </template>
    </div>
    <button class="button" @click="saveToDatabase">保存</button>
    <button class="button" style="height: 40px;" @click="saveToDatabase">保存</button>
  </div>
</template>
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeProject.vue
@@ -4,11 +4,13 @@
import ProjectCreate from "@/views/pp/glassOptimize/ProjectCreate.vue"
import GlassComputed from "@/views/pp/glassOptimize/GlassComputed.vue";
import ProjectMange from "@/views/pp/glassOptimize/ProjectMange.vue";
import OptimizationRectPrint from "@/views/pp/glassOptimize/OptimizationRectPrint.vue";
import {ref} from "vue";
import {ElMessage} from "element-plus";
let dialogVisible = ref(false)
let detailPage = ref(0)
let state = ref(1)
const changeDialog = (value) => {
  dialogVisible.value = true
  detailPage.value = value
@@ -21,6 +23,18 @@
const switchDialog = (number) => {
  projectNumber.value = number;
  detailPage.value = 3;
};
const switchDialog1 = (number) => {
  projectNumber.value = number;
  detailPage.value = 4;
  state.value=1;
};
const switchDialog2 = (number) => {
  projectNumber.value = number;
  detailPage.value = 4;
  state.value=2;
};
//工程管理关闭弹窗
@@ -79,12 +93,14 @@
       v-model="dialogVisible"
       :title="detailPage ===1? '创建工程' : detailPage ===2? '工程管理' : detailPage ===3? '模拟计算':''"
       destroy-on-close
       style="width: 90%;height:90%;margin-top: 3vh"
       style="width: 90%;height:90%;margin-top: 3vh;overflow: auto"
       z-index="100"
   >
     <project-create v-if="detailPage===1" @switch-dialog="switchDialog"/>
     <project-mange  v-if="detailPage===2" @switch-dialog="switchDialog" @closeDetailPage="handlePopupClose"/>
     <project-mange  v-if="detailPage===2" @switch-dialog="switchDialog" @switch-dialog-print="switchDialog1"
                     @switch-dialog-print2="switchDialog2" @closeDetailPage="handlePopupClose"/>
     <glass-computed v-if="detailPage===3" :project="projectNumber"/>
     <optimization-rect-print  v-if="detailPage===4"  :project="projectNumber" :state="state"/>
     <div v-else></div>
   </el-dialog>
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectMange.vue
@@ -104,6 +104,8 @@
          {code: 'viewTempered', name: '查看钢化版图', prefixIcon: 'vxe-icon-custom-column'},
          {code: 'viewOptimize', name: '查看优化版图', prefixIcon: 'vxe-icon-layout'},
          {code: 'Export', name: '数据导出', prefixIcon: 'vxe-icon-download', visible: true, disabled: false},
          {code: 'print', name: '打印优化报告', prefixIcon: 'vxe-icon-layout'},
          {code: 'print2', name: '打印优化版图报告', prefixIcon: 'vxe-icon-layout'},
        ],
        []
@@ -153,6 +155,32 @@
    actionFunction: async ({row}) => {
      const projectNo = row.projectNumber;
      emit('switch-dialog', row);
    }
  },
  {
    code: 'print', // æ‰“印
    initialState: '1',
    temperingState: '0',
    targetState: null,
    successMsg: '模拟计算已启动!',
    checkMessage: '当前工程状态不符合模拟计算条件,请确认工程状态后再操作!',
    requiresRow: true,
    actionFunction: async ({row}) => {
      const projectNo = row.projectNumber;
      emit('switch-dialog-print', row);
    }
  },
  {
    code: 'print2', // æ‰“印
    initialState: '1',
    temperingState: '0',
    targetState: null,
    successMsg: '模拟计算已启动!',
    checkMessage: '当前工程状态不符合模拟计算条件,请确认工程状态后再操作!',
    requiresRow: true,
    actionFunction: async ({row}) => {
      const projectNo = row.projectNumber;
      emit('switch-dialog-print2', row);
    }
  },
  {
@@ -301,6 +329,22 @@
        }
        if (config.code === 'compute') {
          if(row.state===1 && row.temperingState===0){
            config.actionFunction({row});
          }else{
            ElMessage.warning(config.checkMessage);
          }
          return;
        }
        if (config.code === 'print') {
          if(row.optimizeState===1 ){
            config.actionFunction({row});
          }else{
            ElMessage.warning(config.checkMessage);
          }
          return;
        }
        if (config.code === 'print2') {
          if(row.optimizeState===1 ){
            config.actionFunction({row});
          }else{
            ElMessage.warning(config.checkMessage);
@@ -537,7 +581,7 @@
}
//定义切换模拟计算弹窗
const emit = defineEmits(['switch-dialog', 'close-detail-page']);
const emit = defineEmits(['switch-dialog', 'close-detail-page','switch-dialog-print','switch-dialog-print2']);
//定义工程状态
const optionVal = ref('all')
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ComputeCard.vue
@@ -4,6 +4,7 @@
import {useI18n} from "vue-i18n";
import {ElMessage} from "element-plus";
import deepClone from "@/utils/deepClone";
import {addListener, toolbarButtonClickEvent} from "@/hook/mouseMove";
const { t } = useI18n()
const xGrid = ref()
@@ -31,6 +32,16 @@
  scrollX:{enabled: true},
  scrollY:{ enabled: true ,gt:0},//开启虚拟滚动
  showOverflow:true,
  menuConfig: {
    body: {
      options: [
        [
          { 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 },
        ]
      ]
    }
  },
  columnConfig: {
    resizable: true,
    useKey: true
@@ -96,6 +107,7 @@
watch(() => props.tableData, async (newData) => {
  if (Array.isArray(newData)) {
    addListener(xGrid.value,gridOptions)
    console.log(newData)
    xGrid.value.loadData(deepClone(newData))
    const data = xGrid.value.getTableData().fullData
@@ -119,6 +131,70 @@
    // Emit äº‹ä»¶å°†æ›´æ–°åŽçš„值传递给父组件
    emit('upProcessId', rowClickIndex.value.processId,rowClickIndex.value.patch_state,rowClickIndex.value.technologyNumber);
    emit('updateTechnologyNumber', rowClickIndex.value.processId,rowClickIndex.value.patch_state,rowClickIndex.value.technologyNumber);
  },
  menuClick ({ menu, row, column }) {
    const $grid = xGrid.value
    if ($grid) {
      switch (menu.code) {
        case 'copyChecked' :{
          let result = toolbarButtonClickEvent()
          if(result){
            const dataList = xGrid.value.getTableData().visibleData
            let firstVal=null;
            if(result.cell.indexOf('.')>-1){
              firstVal = eval("dataList["+result.start +"]."+result.cell)
            }else {
              firstVal=dataList[result.start][result.cell];
            }
            dataList.forEach((item,index) =>{
              if(index>=result.start && index<=result.end){
                //取消选中
                if(parseInt(firstVal)<=0){
                  xGrid.value.setCheckboxRow(item, false);
                }
                if(result.cell.indexOf('.')>-1){
                  const  columnArr = result.cell.split('.')
                  item[columnArr[0]][columnArr[1]]  = firstVal
                }else{
                  item[result.cell]  = firstVal
                }
              }
            })
          }
          break
        }
        case 'copyAll' :{
          let result = toolbarButtonClickEvent()
          if(result){
            const dataList = xGrid.value.getTableData().visibleData
            let firstVal=null;
            if(result.cell.indexOf('.')>-1){
              firstVal = eval("dataList["+result.start +"]."+result.cell)
            }else {
              firstVal=dataList[result.start][result.cell];
            }
            dataList.forEach((item,index) =>{
              if(index>=result.start){
                //取消选中
                if(parseInt(firstVal)<=0){
                  xGrid.value.setCheckboxRow(item, false);
                }
                if(result.cell.indexOf('.')>-1){
                  const  columnArr = result.cell.split('.')
                  item[columnArr[0]][columnArr[1]]  = firstVal
                }else{
                  item[result.cell]  = firstVal
                }
              }
            })
          }
          break
        }
      }
    }
  }
}
@@ -181,5 +257,12 @@
  height: 20px;
  margin-top: -20px;
}
.vxe-grid {
  /* ç¦ç”¨æµè§ˆå™¨é»˜è®¤é€‰ä¸­ */
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}
</style>
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/GlassInventory.vue
@@ -6,8 +6,11 @@
import {useRoute} from "vue-router";
import {addListener, toolbarButtonClickEvent} from "@/hook/mouseMove";
import useOrderInfoStore from "@/stores/sd/order/orderInfo";
import useUserInfoStore from "@/stores/userInfo";
const { t } = useI18n()
const userStore = useUserInfoStore()
const orderInfo = useOrderInfoStore()
const username = userStore.user.userName
const xGrid = ref()
const gridOptions = reactive({
@@ -163,7 +166,7 @@
let type = ref(1);
const selectMaterialStore = async () =>{
  request.get(`/glassOptimize/materialStore/${thickness.value}/${model.value}/${projectNo.value}?type=${type.value}`).then((res) => {
  request.get(`/glassOptimize/materialStore/${thickness.value}/${model.value}/${projectNo.value}?type=${type.value}&username=${username}`).then((res) => {
    if (Number(res.code) === 200) {
      const rawData = res.data.data;
      const edgeTrimming = res.data.edgeTrimming;
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/OptimizationRect.vue
@@ -9,7 +9,7 @@
        @click="selectLayout(layoutIndex)"
        :class="{ 'selected': selectedLayoutIndex === layoutIndex }"
      >
        {{ layout.width }} Ã— {{ layout.height }} Ã— {{ layout.quantity  }}
        {{ layout.realWidth }} Ã— {{ layout.realHeight }} Ã— {{ layout.quantity  }}
      </div>
    </div>
@@ -27,6 +27,7 @@
        </div>
        <!-- Layout Container -->
        <div class="layout-container" :style="layoutContainerStyle1(layoutIndex)">
        <div class="layout-container" :style="layoutContainerStyle(layoutIndex)">
          <!-- ç°è‰²çŸ©å½¢ -->
          <div
@@ -34,7 +35,7 @@
            :key="`gray-${rectIndex}`"
            :ref="(el) => { if (el) rectsElements[layoutIndex + '-' + rectIndex] = el }"
            class="layout-glassDetail"
            :style="rectStyle(glassDetail, layoutIndex)"
            :style="rectStyle1(glassDetail, layoutIndex)"
            @contextmenu.prevent="handleGrayRectRightClick(layoutIndex, rectIndex,glassDetail)"
          >
<!--            <div class="glassDetail-content">
@@ -60,11 +61,12 @@
          >
            <div class="glassDetail-content">
              <div class="size">{{ glassDetail.realWidth }}×{{ glassDetail.realHeight }}</div>
              <div>{{rectIndex }}</div>
              <div>{{glassDetail.polySort }}</div>
              <div v-if="showJiaHao" class="jia-hao">{{ glassDetail.rackNo }}</div>
              <div v-if="showProcessId" class="liuchengka">{{ glassDetail.processId }}</div>
            </div>
          </div>
        </div>
        </div>
      </div>
    </div>
@@ -248,12 +250,28 @@
  );
  return {
    position: 'absolute',
    left: `20px`,
    top: `140px`,
    left: `${layout.leftTrim * scale}px`,
    top: `${layout.upTrim * scale}px`,
    width: `${layout.width * scale}px`,
    height: `${layout.height * scale}px`,
    overflow: 'visible',
    border: '1px solid #ccc',
    //border: '1px solid #ccc',
    background: '#fff'
  };
};
const layoutContainerStyle1 = (layoutIndex) => {
  const layout = layouts.value[layoutIndex];
  const scale = Math.min(0.25
  );
  return {
    position: 'absolute',
    left: `20px`,
    top: `140px`,
    width: `${layout.realWidth * scale}px`,
    height: `${layout.realHeight * scale}px`,
    overflow: 'visible',
    //border: '1px solid #ccc',
    background: '#fff'
  };
};
@@ -282,6 +300,24 @@
    position: 'absolute',
    left: `${glassDetail.x * scale}px`,
    bottom: `${glassDetail.y * scale}px`,
    width: `${glassDetail.width * scale}px`,
    height: `${glassDetail.height * scale}px`,
    backgroundColor: glassDetail.isRemain ? '#f0f0f0' : themeColor.value,
    border: '1px solid #000',
    cursor: 'pointer',
    draggable: !glassDetail.isRemain,
    zIndex: glassDetail.isRemain ? 1 : 2
  };
};
const rectStyle1 = (glassDetail, layoutIndex) => {
  const layout = layouts.value[layoutIndex];
  const scale = Math.min(0.25
  );
  return {
    position: 'absolute',
    left: `${glassDetail.x * scale}px`,
    top: `${glassDetail.y * scale}px`,
    width: `${glassDetail.width * scale}px`,
    height: `${glassDetail.height * scale}px`,
    backgroundColor: glassDetail.isRemain ? '#f0f0f0' : themeColor.value,
@@ -891,8 +927,8 @@
  if (!glassDetail) return '';*/
  const totalRects = layouts.value.length;
  const currentRectIndex = layoutIndex + 1;
  const width = layout.width;
  const height = layout.height;
  const width = layout.realWidth;
  const height = layout.realHeight;
  const percentage = (layout.usageRate * 100).toFixed(2) + '%';
  return `${currentRectIndex}/${totalRects} ${width}×${height} Ã—1 ${percentage}`;
};
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/OptimizeCompute.vue
@@ -70,164 +70,1381 @@
    mockData.value = {
      code: 200,
      data: [{
        "projectNo":"P25041001",
        "totalQuantity":1,
        "glassTotalQuantity":1,
        "glassTotalArea":1,
        "avgCutRate":1,
        "lastCutRate":1,
        "validCutRate":1,
        "layouts":[
          {
            "stockId":3,
            "usageRate":0.9,
            "width":4500,
            "height":2440,
            "stockCode":11,
            "upTrim":12,
            "downTrim":12,
            "leftTrim":12,
            "rightTrim":12,
            "quantity":1,
            "glassQuantity":6,
            "glassArea":45,
            "materialType":1,
            "mergeID":1,
            "glassDetails":[
              {"isRemain":false,
                "width":2070,
                "height":725,
                "realWidth":2070,
                "realHeight":725,
                "layer":1,
                "totalLayer":2,
                "orderSort":1,
                "processId":"NG22091408A06",
                "stockSort":1,
                "polySort":1,
                "markIcon":"",
                "x":0,
                "y":0,
                "patchState":0,
                "isRotate":0,
                "rackNo":1,
                "glassPoint":{}
              },
              {"isRemain":false,
                "width":2070,
                "height":725,
                "realWidth":2070,
                "realHeight":725,
                "layer":1,
                "totalLayer":2,
                "orderSort":1,
                "processId":"NG22091408A06",
                "stockSort":1,
                "polySort":2,
                "markIcon":"",
                "x":2070,
                "y":0,
                "patchState":0,
                "isRotate":0,
                "rackNo":1,
                "glassPoint":{}
              },
              {"isRemain":false,
                "width":2070,
                "height":725,
                "realWidth":2070,
                "realHeight":725,
                "layer":1,
                "totalLayer":2,
                "orderSort":1,
                "processId":"NG22091408A06",
                "stockSort":1,
                "polySort":3,
                "markIcon":"",
                "x":0,
                "y":725,
                "patchState":0,
                "isRotate":0,
                "rackNo":1,
                "glassPoint":{}
              },
              {"isRemain":false,
                "width":2070,
                "height":725,
                "realWidth":2070,
                "realHeight":725,
                "layer":1,
                "totalLayer":2,
                "orderSort":1,
                "processId":"NG22091408A06",
                "stockSort":1,
                "polySort":4,
                "markIcon":"",
                "x":2070,
                "y":725,
                "patchState":0,
                "isRotate":0,
                "rackNo":1,
                "glassPoint":{}
              },
              {"isRemain":false,
                "width":2070,
                "height":725,
                "realWidth":2070,
                "realHeight":725,
                "layer":1,
                "totalLayer":2,
                "orderSort":1,
                "processId":"NG22091408A06",
                "stockSort":1,
                "polySort":5,
                "markIcon":"",
                "x":0,
                "y":1450,
                "patchState":0,
                "isRotate":0,
                "rackNo":1,
                "glassPoint":{}
              },
              {"isRemain":false,
                "width":2070,
                "height":725,
                "realWidth":2070,
                "realHeight":725,
                "layer":1,
                "totalLayer":2,
                "orderSort":1,
                "processId":"NG22091408A06",
                "stockSort":1,
                "polySort":6,
                "markIcon":"",
                "x":2070,
                "y":1450,
                "patchState":0,
                "isRotate":0,
                "rackNo":1,
                "glassPoint":{}
              },
              {"isRemain":true,
                "width":2070,
                "height":265,
                "x":0,
                "y":2175
              },
              {"isRemain":true,
                "width":2070,
                "height":265,
                "x":2070,
                "y":2175
              },
              {"isRemain":true,
                "width":360,
                "height":2440,
                "x":4140,
                "y":0
              }]
          }
        ]}]
        "projectNo": "P25051501",
        "totalQuantity": 3,
        "glassTotalQuantity": 52,
        "glassTotalArea": "22.65",
        "avgCutRate": "91.06",
        "lastCutRate": "85.06",
        "validCutRate": "95.63",
        "layouts": [{
          "width": 3285.0,
          "height": 2125.0,
          "stockId": 1,
          "realWidth": 3300.0,
          "realHeight": 2140.0,
          "usageRate": "0.9595522",
          "stockCode": "138",
          "upTrim": 0.0,
          "downTrim": 15.0,
          "leftTrim": 15.0,
          "rightTrim": 0.0,
          "quantity": 1,
          "glassQuantity": 0,
          "glassArea": 0.0,
          "materialType": 1,
          "mergeId": 1,
          "glassDetails": [{
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1100.0,
            "realHeight": 1037.0,
            "width": 1102.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 17,
            "stockSort": 1,
            "polySort": 1,
            "x": 0.0,
            "y": 0.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 0.0,
              "Y": 1086.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 0.0,
              "Y": 2125.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1102.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 1102.0,
              "Y": 2125.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 1102.0,
              "Y": 1086.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1102.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1098.0,
            "realHeight": 1037.0,
            "width": 1100.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 21,
            "stockSort": 1,
            "polySort": 2,
            "x": 1102.0,
            "y": 0.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 1102.0,
              "Y": 1086.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 1102.0,
              "Y": 2125.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1100.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 2202.0,
              "Y": 2125.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 2202.0,
              "Y": 1086.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1100.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1058.0,
            "realHeight": 1037.0,
            "width": 1060.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 5,
            "stockSort": 1,
            "polySort": 3,
            "x": 2202.0,
            "y": 0.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 2202.0,
              "Y": 1086.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 2202.0,
              "Y": 2125.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1060.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 3262.0,
              "Y": 2125.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 3262.0,
              "Y": 1086.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1060.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1098.0,
            "realHeight": 1037.0,
            "width": 1100.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 21,
            "stockSort": 1,
            "polySort": 4,
            "x": 0.0,
            "y": 1039.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 0.0,
              "Y": 47.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 0.0,
              "Y": 1086.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1100.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 1100.0,
              "Y": 1086.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 1100.0,
              "Y": 47.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1100.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1098.0,
            "realHeight": 1037.0,
            "width": 1100.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 21,
            "stockSort": 1,
            "polySort": 5,
            "x": 1100.0,
            "y": 1039.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 1100.0,
              "Y": 47.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 1100.0,
              "Y": 1086.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1100.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 2200.0,
              "Y": 1086.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 2200.0,
              "Y": 47.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1100.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1058.0,
            "realHeight": 1037.0,
            "width": 1060.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 5,
            "stockSort": 1,
            "polySort": 6,
            "x": 2200.0,
            "y": 1039.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 2200.0,
              "Y": 47.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 2200.0,
              "Y": 1086.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1060.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 3260.0,
              "Y": 1086.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 3260.0,
              "Y": 47.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1060.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": true,
            "isRotate": false,
            "realWidth": 25.0,
            "realHeight": 1086.0,
            "width": 25.0,
            "height": 1086.0,
            "processId": null,
            "layer": 0,
            "totalLayer": 0,
            "orderSort": 0,
            "stockSort": 1,
            "polySort": 1,
            "x": 3260.0,
            "y": 0.0,
            "markIcon": null,
            "patchState": 0,
            "rackNo": null,
            "glassPoint": null
          }, {
            "isRemain": true,
            "isRotate": false,
            "realWidth": 3260.0,
            "realHeight": 47.0,
            "width": 3260.0,
            "height": 47.0,
            "processId": null,
            "layer": 0,
            "totalLayer": 0,
            "orderSort": 0,
            "stockSort": 1,
            "polySort": 2,
            "x": 0.0,
            "y": 0.0,
            "markIcon": null,
            "patchState": 0,
            "rackNo": null,
            "glassPoint": null
          }, {
            "isRemain": true,
            "isRotate": false,
            "realWidth": 23.0,
            "realHeight": 1039.0,
            "width": 23.0,
            "height": 1039.0,
            "processId": null,
            "layer": 0,
            "totalLayer": 0,
            "orderSort": 0,
            "stockSort": 1,
            "polySort": 3,
            "x": 3262.0,
            "y": 1086.0,
            "markIcon": null,
            "patchState": 0,
            "rackNo": null,
            "glassPoint": null
          }]
        }, {
          "width": 3285.0,
          "height": 2125.0,
          "stockId": 2,
          "realWidth": 3300.0,
          "realHeight": 2140.0,
          "usageRate": "0.9530787",
          "stockCode": "138",
          "upTrim": 0.0,
          "downTrim": 15.0,
          "leftTrim": 15.0,
          "rightTrim": 0.0,
          "quantity": 1,
          "glassQuantity": 0,
          "glassArea": 0.0,
          "materialType": 1,
          "mergeId": 2,
          "glassDetails": [{
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1085.0,
            "realHeight": 1037.0,
            "width": 1087.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 20,
            "stockSort": 2,
            "polySort": 1,
            "x": 0.0,
            "y": 0.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 0.0,
              "Y": 1086.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 0.0,
              "Y": 2125.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1087.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 1087.0,
              "Y": 2125.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 1087.0,
              "Y": 1086.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1087.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1055.0,
            "realHeight": 1037.0,
            "width": 1057.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 8,
            "stockSort": 2,
            "polySort": 2,
            "x": 1087.0,
            "y": 0.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 1087.0,
              "Y": 1086.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 1087.0,
              "Y": 2125.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1057.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 2144.0,
              "Y": 2125.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 2144.0,
              "Y": 1086.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1057.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1098.0,
            "realHeight": 1037.0,
            "width": 1100.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 21,
            "stockSort": 2,
            "polySort": 3,
            "x": 2144.0,
            "y": 0.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 2144.0,
              "Y": 1086.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 2144.0,
              "Y": 2125.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1100.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 3244.0,
              "Y": 2125.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 3244.0,
              "Y": 1086.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1100.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1098.0,
            "realHeight": 1037.0,
            "width": 1100.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 21,
            "stockSort": 2,
            "polySort": 4,
            "x": 0.0,
            "y": 1039.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 0.0,
              "Y": 47.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 0.0,
              "Y": 1086.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1100.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 1100.0,
              "Y": 1086.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 1100.0,
              "Y": 47.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1100.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1065.0,
            "realHeight": 1037.0,
            "width": 1067.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 9,
            "stockSort": 2,
            "polySort": 5,
            "x": 1100.0,
            "y": 1039.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 1100.0,
              "Y": 47.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 1100.0,
              "Y": 1086.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1067.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 2167.0,
              "Y": 1086.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 2167.0,
              "Y": 47.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1067.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1065.0,
            "realHeight": 1037.0,
            "width": 1067.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 9,
            "stockSort": 2,
            "polySort": 6,
            "x": 2167.0,
            "y": 1039.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 2167.0,
              "Y": 47.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 2167.0,
              "Y": 1086.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1067.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 3234.0,
              "Y": 1086.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 3234.0,
              "Y": 47.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1067.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": true,
            "isRotate": false,
            "realWidth": 51.0,
            "realHeight": 1086.0,
            "width": 51.0,
            "height": 1086.0,
            "processId": null,
            "layer": 0,
            "totalLayer": 0,
            "orderSort": 0,
            "stockSort": 2,
            "polySort": 1,
            "x": 3234.0,
            "y": 0.0,
            "markIcon": null,
            "patchState": 0,
            "rackNo": null,
            "glassPoint": null
          }, {
            "isRemain": true,
            "isRotate": false,
            "realWidth": 3234.0,
            "realHeight": 47.0,
            "width": 3234.0,
            "height": 47.0,
            "processId": null,
            "layer": 0,
            "totalLayer": 0,
            "orderSort": 0,
            "stockSort": 2,
            "polySort": 2,
            "x": 0.0,
            "y": 0.0,
            "markIcon": null,
            "patchState": 0,
            "rackNo": null,
            "glassPoint": null
          }, {
            "isRemain": true,
            "isRotate": false,
            "realWidth": 41.0,
            "realHeight": 1039.0,
            "width": 41.0,
            "height": 1039.0,
            "processId": null,
            "layer": 0,
            "totalLayer": 0,
            "orderSort": 0,
            "stockSort": 2,
            "polySort": 3,
            "x": 3244.0,
            "y": 1086.0,
            "markIcon": null,
            "patchState": 0,
            "rackNo": null,
            "glassPoint": null
          }]
        }, {
          "width": 3755.0,
          "height": 2835.0,
          "stockId": 3,
          "realWidth": 3770.0,
          "realHeight": 2850.0,
          "usageRate": "0.8505788",
          "stockCode": "117",
          "upTrim": 0.0,
          "downTrim": 15.0,
          "leftTrim": 15.0,
          "rightTrim": 0.0,
          "quantity": 1,
          "glassQuantity": 0,
          "glassArea": 0.0,
          "materialType": 1,
          "mergeId": 3,
          "glassDetails": [{
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1037.0,
            "realHeight": 908.0,
            "width": 1039.0,
            "height": 910.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 19,
            "stockSort": 3,
            "polySort": 2,
            "x": 0.0,
            "y": 1007.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 0.0,
              "Y": 1828.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 1039.0,
              "Y": 1828.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 910.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 1039.0,
              "Y": 918.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 0.0,
              "Y": 918.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 910.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1037.0,
            "realHeight": 1005.0,
            "width": 1039.0,
            "height": 1007.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 18,
            "stockSort": 3,
            "polySort": 1,
            "x": 0.0,
            "y": 0.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 0.0,
              "Y": 2835.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 1039.0,
              "Y": 2835.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1007.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 1039.0,
              "Y": 1828.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 0.0,
              "Y": 1828.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1007.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1037.0,
            "realHeight": 810.0,
            "width": 1039.0,
            "height": 812.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 12,
            "stockSort": 3,
            "polySort": 3,
            "x": 0.0,
            "y": 1917.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 0.0,
              "Y": 918.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 1039.0,
              "Y": 918.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 812.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 1039.0,
              "Y": 106.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 0.0,
              "Y": 106.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 812.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1037.0,
            "realHeight": 908.0,
            "width": 1039.0,
            "height": 910.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 19,
            "stockSort": 3,
            "polySort": 5,
            "x": 1039.0,
            "y": 1032.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 1039.0,
              "Y": 1803.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 2078.0,
              "Y": 1803.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 910.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 2078.0,
              "Y": 893.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 1039.0,
              "Y": 893.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 910.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1037.0,
            "realHeight": 1030.0,
            "width": 1039.0,
            "height": 1032.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 10,
            "stockSort": 3,
            "polySort": 4,
            "x": 1039.0,
            "y": 0.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 1039.0,
              "Y": 2835.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 2078.0,
              "Y": 2835.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1032.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 2078.0,
              "Y": 1803.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 1039.0,
              "Y": 1803.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1032.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 1037.0,
            "realHeight": 823.0,
            "width": 1039.0,
            "height": 825.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 13,
            "stockSort": 3,
            "polySort": 6,
            "x": 1039.0,
            "y": 1942.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 1039.0,
              "Y": 893.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 2078.0,
              "Y": 893.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 825.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 2078.0,
              "Y": 68.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 1039.0,
              "Y": 68.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 825.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 823.0,
            "realHeight": 1037.0,
            "width": 825.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 13,
            "stockSort": 3,
            "polySort": 7,
            "x": 2078.0,
            "y": 0.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 2078.0,
              "Y": 1796.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 2078.0,
              "Y": 2835.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 825.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 2903.0,
              "Y": 2835.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 2903.0,
              "Y": 1796.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 825.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 823.0,
            "realHeight": 1037.0,
            "width": 825.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 13,
            "stockSort": 3,
            "polySort": 9,
            "x": 2078.0,
            "y": 1039.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 2078.0,
              "Y": 757.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 2078.0,
              "Y": 1796.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 825.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 2903.0,
              "Y": 1796.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 2903.0,
              "Y": 757.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 825.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 823.0,
            "realHeight": 1037.0,
            "width": 825.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 13,
            "stockSort": 3,
            "polySort": 8,
            "x": 2903.0,
            "y": 0.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 2903.0,
              "Y": 1796.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 2903.0,
              "Y": 2835.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 825.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 3728.0,
              "Y": 2835.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 3728.0,
              "Y": 1796.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 825.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": false,
            "isRotate": false,
            "realWidth": 823.0,
            "realHeight": 1037.0,
            "width": 825.0,
            "height": 1039.0,
            "processId": "NG24090106A003",
            "layer": 2,
            "totalLayer": 1,
            "orderSort": 13,
            "stockSort": 3,
            "polySort": 10,
            "x": 2903.0,
            "y": 1039.0,
            "markIcon": "{\"trademark\":\"3C\",\"xImage\":false,\"yImage\":false,\"tag\":true,\"tag2\":true,\"tag3\":true,\"xMargin\":30,\"yMargin\":30,\"location\":\"右下\"}",
            "patchState": 0,
            "rackNo": "0",
            "glassPoint": [{
              "X": 2903.0,
              "Y": 757.0,
              "theta": 1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 0,
              "L": 1.0
            }, {
              "X": 2903.0,
              "Y": 1796.0,
              "theta": 0.0,
              "angle": 1.5707963705062866,
              "distance": 825.0,
              "index": 3,
              "L": 1.0
            }, {
              "X": 3728.0,
              "Y": 1796.0,
              "theta": -1.5707963267948966,
              "angle": 1.5707963705062866,
              "distance": 1039.0,
              "index": 2,
              "L": 1.0
            }, {
              "X": 3728.0,
              "Y": 757.0,
              "theta": 3.1415926535897931,
              "angle": 1.5707963705062866,
              "distance": 825.0,
              "index": 1,
              "L": 1.0
            }]
          }, {
            "isRemain": true,
            "isRotate": false,
            "realWidth": 1039.0,
            "realHeight": 106.0,
            "width": 1039.0,
            "height": 106.0,
            "processId": null,
            "layer": 0,
            "totalLayer": 0,
            "orderSort": 0,
            "stockSort": 3,
            "polySort": 1,
            "x": 0.0,
            "y": 0.0,
            "markIcon": null,
            "patchState": 0,
            "rackNo": null,
            "glassPoint": null
          }, {
            "isRemain": true,
            "isRotate": false,
            "realWidth": 27.0,
            "realHeight": 2835.0,
            "width": 27.0,
            "height": 2835.0,
            "processId": null,
            "layer": 0,
            "totalLayer": 0,
            "orderSort": 0,
            "stockSort": 3,
            "polySort": 2,
            "x": 3728.0,
            "y": 0.0,
            "markIcon": null,
            "patchState": 0,
            "rackNo": null,
            "glassPoint": null
          }, {
            "isRemain": true,
            "isRotate": false,
            "realWidth": 1039.0,
            "realHeight": 68.0,
            "width": 1039.0,
            "height": 68.0,
            "processId": null,
            "layer": 0,
            "totalLayer": 0,
            "orderSort": 0,
            "stockSort": 3,
            "polySort": 3,
            "x": 1039.0,
            "y": 0.0,
            "markIcon": null,
            "patchState": 0,
            "rackNo": null,
            "glassPoint": null
          }, {
            "isRemain": true,
            "isRotate": false,
            "realWidth": 1650.0,
            "realHeight": 757.0,
            "width": 1650.0,
            "height": 757.0,
            "processId": null,
            "layer": 0,
            "totalLayer": 0,
            "orderSort": 0,
            "stockSort": 3,
            "polySort": 4,
            "x": 2078.0,
            "y": 0.0,
            "markIcon": null,
            "patchState": 0,
            "rackNo": null,
            "glassPoint": null
          }]
        }]
      }]
    }
    }
@@ -279,8 +1496,8 @@
        })
        orderInfo.optimizeData.originalFilm=originalFilm.value
        totalUtilizationRate.value=mockData.value.data[0].avgCutRate*100
        tailPieceRate.value=mockData.value.data[0].layouts*100
        totalUtilizationRate.value=mockData.value.data[0].avgCutRate
        tailPieceRate.value=mockData.value.data[0].lastCutRate
        pauseTimer()
        document.getElementById("complete").style.display="block"
        document.getElementById("start").disabled=false
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectDetail.vue
@@ -11,12 +11,14 @@
import {useRoute} from 'vue-router';
import useUserInfoStore from "@/stores/userInfo";
import useOrderInfoStore from "@/stores/sd/order/orderInfo";
import {addListener,toolbarButtonClickEvent} from "@/hook/mouseMove";
const { t } = useI18n();
const userStore = useUserInfoStore()
const orderInfo = useOrderInfoStore()
const username = userStore.user.userName
let cellArea = ref()
const xGrid = ref()
const gridOptions = reactive({
  height: '100%',
@@ -41,7 +43,7 @@
    storage: true
  },
  editConfig: {
    trigger: 'click',
    trigger: 'dblclick',
    mode: 'row',
    showStatus: true
  },
@@ -72,32 +74,28 @@
      field: 'longGrind1',
      width: 150,
      title: '长磨1',
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      editRender: { name: 'input' },filters:[{ data: '' }],slots: { filter: 'num1_filter' },
      sortable: true
    },
    {
      field: 'longGrind2',
      width: 150,
      title: '长磨2',
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      editRender: { name: 'input' },filters:[{ data: '' }],slots: { filter: 'num1_filter' },
      sortable: true
    },
    {
      field: 'shortGrind1',
      width: 150,
      title: '短磨1',
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      editRender: { name: 'input' },filters:[{ data: '' }],slots: { filter: 'num1_filter' },
      sortable: true
    },
    {
      field: 'shortGrind2',
      width: 150,
      title: '短磨2',
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      editRender: { name: 'input' },filters:[{ data: '' }],slots: { filter: 'num1_filter' },
      sortable: true
    },
    {
@@ -166,7 +164,7 @@
    },
    {
      field: 'layout_id',
      field: 'rackNo',
      width: 150,
      title: '架号',
      filters: [{data: ''}],
@@ -220,6 +218,8 @@
          {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 },
        ],
        []
      ]
@@ -311,6 +311,22 @@
      ElMessage.info('此功能暂未完善,暂时无法执行导出数据到OPTIMA操作。');
    }
  },
  {
    code: 'copyChecked',
    successMsg: '操作成功!',
    gridRef: xGrid,
    requiresRow: false,
    hideProcess: () => {
    }
  },
  {
    code: 'copyAll',
    successMsg: '操作成功!',
    gridRef: xGrid,
    requiresRow: false,
    hideProcess: () => {
    }
  },
]
// å³é”®èœå•点击逻辑
@@ -323,6 +339,62 @@
        if (config.code === 'Export') {
          config.gridRef.value.exportData();
          ElMessage.success(config.successMsg);
          return;
        }
        if (config.code === 'copyChecked') {
          let result = toolbarButtonClickEvent()
          if(result){
            const dataList = xGrid.value.getTableData().visibleData
            let firstVal=null;
            if(result.cell.indexOf('.')>-1){
              firstVal = eval("dataList["+result.start +"]."+result.cell)
            }else {
              firstVal=dataList[result.start][result.cell];
            }
            dataList.forEach((item,index) =>{
              if(index>=result.start && index<=result.end){
                //取消选中
                if(parseInt(firstVal)<=0){
                  xGrid.value.setCheckboxRow(item, false);
                }
                if(result.cell.indexOf('.')>-1){
                  const  columnArr = result.cell.split('.')
                  item[columnArr[0]][columnArr[1]]  = firstVal
                }else{
                  item[result.cell]  = firstVal
                }
              }
            })
          }
          return;
        }
        if (config.code === 'copyAll') {
          let result = toolbarButtonClickEvent()
          if(result){
            const dataList = xGrid.value.getTableData().visibleData
            let firstVal=null;
            if(result.cell.indexOf('.')>-1){
              firstVal = eval("dataList["+result.start +"]."+result.cell)
            }else {
              firstVal=dataList[result.start][result.cell];
            }
            dataList.forEach((item,index) =>{
              if(index>=result.start){
                //取消选中
                if(parseInt(firstVal)<=0){
                  xGrid.value.setCheckboxRow(item, false);
                }
                if(result.cell.indexOf('.')>-1){
                  const  columnArr = result.cell.split('.')
                  item[columnArr[0]][columnArr[1]]  = firstVal
                }else{
                  item[result.cell]  = firstVal
                }
              }
            })
          }
          return;
        }
        // æ·»åŠ ç¡®è®¤æç¤ºå¼¹çª—ï¼Œè¯¢é—®ç”¨æˆ·æ˜¯å¦è¿›è¡Œå½“å‰æ“ä½œ
@@ -372,6 +444,8 @@
  optimizeMode:null,
  travType:null,
  rackCycleQty:null,
  glassThickness:null,
  glassType:null,
  glassDetails :[],
  materialDetails:[]
});
@@ -403,7 +477,7 @@
      }
      detail.width=items.width
      detail.height=items.height
      detail.processId=items.process_id
      detail.processId=items.process_ids
      detail.layer=items.layer
      detail.totalLayer=items.total_layer
      detail.orderSort=items.order_number
@@ -414,6 +488,7 @@
      detail.downGrind=items.longGrind2
      detail.leftGrind=items.shortGrind1
      detail.rightGrind=items.shortGrind2
      detail.rackNo=items.id
      optimizeData.value.glassDetails .push(detail)
    })
@@ -482,8 +557,8 @@
const projectName = ref('');
const thickNess = ref(route.params.thickNess);
const model = ref(route.params.model);
const quantitys = ref(route.params.quantity);
const areas = ref(route.params.area);
const quantitys = ref();
const areas = ref();
const optimizeState = ref(route.params.optimizeState);
onBeforeUnmount(() => {
  localStorage.setItem('projectNo', projectNo.value);
@@ -491,16 +566,21 @@
const saveOptimizeData = () => {
  if(orderInfo.optimizeData!==null){
    request.post(`/glassOptimize/saveOptimizeData/${projectNo.value}`,orderInfo.optimizeData).then((res) => {
      if ((Number(res.code) === 200)) {
        ElMessage.success("保存成功");
      } else {
        ElMessage.warning(res.msg);
      }
    if(quantitys.value===orderInfo.optimizeData.optimalResults.glassTotalQuantity){
      request.post(`/glassOptimize/saveOptimizeData/${projectNo.value}`,orderInfo.optimizeData).then((res) => {
        if ((Number(res.code) === 200)) {
          ElMessage.success("保存成功");
        } else {
          ElMessage.warning(res.msg);
        }
    }).catch((error) => {
      console.error("获取数据出错:", error);
    });
      }).catch((error) => {
        console.error("获取数据出错:", error);
      });
    }else{
      ElMessage.warning("原片不足,小片未全部优化");
    }
  }else {
    ElMessage.warning("数据未优化");
  }
@@ -508,7 +588,9 @@
}
const fetchData = () => {
  request.post(`/glassOptimize/projectInfo/${projectNo.value}`).then((res) => {
  //启用表格拖动选中
  addListener(xGrid.value,gridOptions,cellArea.value)
  request.post(`/glassOptimize/projectInfo/${projectNo.value}/${username}`).then((res) => {
    if ((Number(res.code) === 200)) {
      const data = res.data.data;
      const grindingTrimming = res.data.grindingTrimming;
@@ -533,14 +615,10 @@
            item.shortGrind1=0
            item.shortGrind2=0
            if(item.width>=formattedData[0].minAutoLenght){
              item.width+=parseFloat(formattedData[0].leftEdge)
              item.width+=parseFloat(formattedData[0].rightEdge)
              item.longGrind1 = formattedData[0].leftEdge;
              item.longGrind2 = formattedData[0].rightEdge;
            }
            if(item.height>=formattedData[0].minAutoLenght){
              item.height+=parseFloat(formattedData[0].upEdge)
              item.height+=parseFloat(formattedData[0].downEdge)
              item.shortGrind1 = formattedData[0].upEdge;
              item.shortGrind2 = formattedData[0].downEdge;
            }
@@ -553,6 +631,8 @@
      xGrid.value.loadData(data);
      gridOptions.data = data;
      projectName.value = data[0].project_name;
      quantitys.value=res.data.project.glass_total
      areas.value=res.data.project.glass_total_area
    } else {
      ElMessage.warning(res.msg);
    }
@@ -566,6 +646,8 @@
    if (res.code == "200") {
      const parsedData = JSON.parse(res.data);
      optimizeData.value.projectNo=projectNo.value
      optimizeData.value.glassType=model.value
      optimizeData.value.glassThickness=thickNess.value
      optimizeData.value.allowRotate=parsedData.optimization.smallPieceRotationProhibited
      optimizeData.value.optimizeMode=parsedData.optimization.optimizationMethod
      optimizeData.value.minCutDistance=parsedData.optimization.bendEdgeDistance
@@ -586,6 +668,8 @@
    firstLoading();
  }else if(orderInfo.projectNo!==null){
    projectNo.value=orderInfo.projectNo.projectNo
    model.value=orderInfo.projectNo.model
    thickNess.value=orderInfo.projectNo.thickNess
    fetchData();
    firstLoading();
  }
@@ -765,6 +849,11 @@
      </vxe-grid>
    </div>
    <div class="vxe-table--cell-area" ref="cellArea" >
      <span  class="vxe-table--cell-main-area"  ></span>
      <span class="vxe-table--cell-active-area"  ></span>
    </div>
  </div>
</template>
@@ -803,4 +892,12 @@
  margin-left: 10px;
}
.vxe-grid {
  /* ç¦ç”¨æµè§ˆå™¨é»˜è®¤é€‰ä¸­ */
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}
</style>
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/RectRenderer.vue
@@ -1,25 +1,70 @@
<template>
  <div ref="layoutPanel" :class="panelClass" :style="panelStyle">
    <div id="printFlowCard">
      <div v-for="(layout, layoutIndex) in layouts" :key="layoutIndex" class="layout-wrapper">
        <div class="header" :style="headerStyle(layoutIndex)">
          å·¥ç¨‹å·{{ processId }}
          {{ getCurrentRectInfo(layoutIndex) }}
        </div>
  <div ref="layoutPanel" id="printFlowCard" :class="panelClass" :style="panelStyle">
    <div v-if="dataLoadeds">
      <h3>工程号【{{ processId }}】</h3>
      <div style="width: 400px;margin: auto;">
        <h1 style="margin: auto;text-align: center;">上海北玻自动化</h1>
        <h2 style="margin: auto;text-align: center;">优化报告</h2>
        ä¼˜åŒ–报工
        <el-table :data="layoutDetails">
          <el-table-column prop="avgCutRate" label="切裁率"></el-table-column>
          <el-table-column prop="validCutRate" label="有效切割"></el-table-column>
          <el-table-column prop="lastCutRate" label="尾片"></el-table-column>
          <el-table-column prop="" label="原片类型"></el-table-column>
          <el-table-column prop="totalQuantity" label="版面数量"></el-table-column>
        </el-table>
        <br>
        ç‰©æ–™ä¿¡æ¯
        <el-table :data="materialDetails">
          <el-table-column prop="width" label="原片宽"></el-table-column>
          <el-table-column prop="height" label="原片高"></el-table-column>
          <el-table-column prop="processingQuantity" label="数量"></el-table-column>
        </el-table>
      </div>
    </div>
    <div
        v-for="(layout, layoutIndex) in layouts"
        :key="layoutIndex"
        class="layout-wrapper"
        :style="titleStyle(layoutIndex)"
        v-if="dataLoaded"
    >
      <!-- Layout Info Label -->
      <div class="layout-info" :style="layoutInfoStyle(layoutIndex)">
        å·¥ç¨‹å·{{ processId }}
        {{ getCurrentRectInfo(layoutIndex) }}
      </div>
      <!-- Layout Container -->
      <div class="layout-container" :style="layoutContainerStyle1(layoutIndex)">
        <div class="layout-container" :style="layoutContainerStyle(layoutIndex)">
          <div class="grid-container" :class="`cols-${printColumns}`">
            <div
              v-for="(glassDetail, rectIndex) in layout.glassDetails"
              :key="rectIndex"
          <!-- ç°è‰²çŸ©å½¢ -->
          <div
              v-for="(glassDetail, rectIndex) in layout.glassDetails.filter(r => r.isRemain)"
              :key="`gray-${rectIndex}`"
              :ref="(el) => { if (el) rectsElements[layoutIndex + '-' + rectIndex] = el }"
              :class="rectClass"
              class="layout-glassDetail"
              :style="rectStyle1(glassDetail, layoutIndex)"
          >
            <!--            <div class="glassDetail-content">
                          <div class="size">{{ glassDetail.width }}×{{ glassDetail.height }}</div>
                          <div v-if="showJiaHao" class="jia-hao">{{ glassDetail.JiaHao }}</div>
                          <div v-if="showProcessId" class="liuchengka">{{ glassDetail.liuchengka }}</div>
                        </div>-->
          </div>
          <!-- è“è‰²çŸ©å½¢ -->
          <div
              v-for="(glassDetail, rectIndex) in layout.glassDetails.filter(r => !r.isRemain)"
              :key="`blue-${rectIndex}`"
              :ref="(el) => { if (el) rectsElements[layoutIndex + '-' + rectIndex] = el }"
              class="layout-glassDetail"
              :style="rectStyle(glassDetail, layoutIndex)"
              @click="handleRectClick(layoutIndex, rectIndex)"
            >
              <div v-if="!glassDetail.isRemain" class="glassDetail-content">
                <div class="size">{{ glassDetail.realWidth }}×{{ glassDetail.realHeight }}</div>
                <div class="jia-hao">{{ glassDetail.rackNo}}</div>
              </div>
          >
            <div class="glassDetail-content">
              <div class="size">{{ glassDetail.realWidth }}×{{ glassDetail.realHeight }}</div>
              <div>{{glassDetail.polySort }}</div>
            </div>
          </div>
        </div>
@@ -38,7 +83,9 @@
  gh: { type: Number, default: 800 },
  style: { type: String, default: 'width:100%;height:800px;display:block;background:gray' },
  printLayout: { type: String, default: '2rows-2cols' }, // å¯é€‰å€¼ï¼š4rows-2cols, 3rows-2cols, 3rows-1col, 2rows-2cols
  fixedPageHeight: { type: Number, default: 1100 } // å›ºå®šé¡µé¢é«˜åº¦
  fixedPageHeight: { type: Number, default: 1100 }, // å›ºå®šé¡µé¢é«˜åº¦
  materialDetails:null,
  state:null
});
const emit = defineEmits(['rectClicked']);
@@ -46,12 +93,20 @@
const rectsElements = ref({});
const focusIndex = ref(null);
const layouts = ref([]);
const materialDetails = ref([]);
const panelClass = ref('');
const panelStyle = ref(props.style);
const rectClass = ref('layout-glassDetail');
const processId = ref();
const printColumns = ref(2); // åˆå§‹åŒ–为2列
const layoutsPerPage = ref(4); // é»˜è®¤æ¯é¡µæ˜¾ç¤º4个布局(2行×2列)
const selectedLayoutIndex = ref(0);
const layoutDetails = ref([]);
const dataLoaded = ref(false);
const dataLoadeds = ref(false);
const scale = 0.1;
let tops = 0;
let lefts = 0;
// å®šä¹‰ä¸åŒå¸ƒå±€çš„æ”¾å¤§æ¯”例
const layoutScales = {
@@ -67,57 +122,78 @@
  updateLayout();
});
const layoutContainerStyle = (layoutIndex) => {
  const containerWidth = (props.gw - 20) / printColumns.value; // å‡å°‘边距
  const containerHeight = (props.gh - 20) / Math.ceil(layoutsPerPage.value / printColumns.value);
  const x = (layoutIndex % printColumns.value) * containerWidth;
  const y = Math.floor(layoutIndex / printColumns.value) * containerHeight;
const titleStyle = (layoutIndex) => {
  const layout = layouts.value[layoutIndex-1];
  if(layoutIndex<2){
    if(layoutIndex===0){
      tops = 0;
      lefts = 0;
    }else{
      lefts = "50%";
    }
  }else{
    if(layoutIndex%2===0){
      tops = tops+layout.height*scale+50;
      lefts=0;
    }else{
      lefts = "50%";
    }
  }
  return {
    position: 'absolute',
    left: `${x}px`,
    top: `${y-25}px`,
    width: `${containerWidth}px`,
    height: `${containerHeight}px`,
    overflow: 'visible',
    padding: '10px' // æ·»åŠ å†…è¾¹è·
    width: `50%`,
    left: `${lefts}`,
    top: `${tops}px`,
  };
};
const headerStyle = (layoutIndex) => {
  const containerWidth = (props.gw - 20) / printColumns.value;
  const containerHeight = (props.gh - 20) / Math.ceil(layoutsPerPage.value / printColumns.value);
  const x = (layoutIndex % printColumns.value) * containerWidth;
  const y = Math.floor(layoutIndex / printColumns.value) * containerHeight;
  const scale = Math.min(
    containerWidth,
    containerHeight
  ) * 1.2; // æ”¾å¤§1.2倍
const layoutContainerStyle = (layoutIndex) => {
  const layout = layouts.value[layoutIndex];
  return {
    position: 'absolute',
    left: `${x}px`,
    top: `${y-25}px`,
    width: `${scale}px`,
    left: `${layout.leftTrim * scale}px`,
    top: `${layout.upTrim * scale}px`,
    width: `${layout.width * scale}px`,
    height: `${layout.height * scale}px`,
    overflow: 'visible',
    //border: '1px solid #ccc',
    background: '#fff'
  };
};
const layoutContainerStyle1 = (layoutIndex) => {
  const layout = layouts.value[layoutIndex];
  return {
    position: 'absolute',
    left: `20px`,
    top: `40px`,
    width: `${layout.realWidth * scale}px`,
    height: `${layout.realHeight * scale}px`,
    overflow: 'visible',
    //border: '1px solid #ccc',
    background: '#fff'
  };
};
//版图内容头部样式加载
const layoutInfoStyle = (layoutIndex) => {
  const layout = layouts.value[layoutIndex];
  return {
    position: 'absolute',
    left: `40px`,
    top: `0px`,
    textAlign: 'center',
    zIndex: 1000,
    background: '#ffffff',
    padding: '5px',
    fontSize: '12px'
    fontSize: '15px'
  };
};
//版图内容小片样式加载
const rectStyle = (glassDetail, layoutIndex) => {
  const layout = layouts.value[layoutIndex];
  const containerWidth = (props.gw - 100) / printColumns.value;
  const containerHeight = (props.gh - 100) / Math.ceil(layoutsPerPage.value / printColumns.value);
  // æ ¹æ®å½“前打印布局获取放大比例
  const currentScale = layoutScales[props.printLayout] || 1.0;
  const scale = Math.min(
    containerWidth / layout.width,
    containerHeight / layout.height
  ) ; // åº”用当前布局的放大比例
  return {
    position: 'absolute',
    left: `${glassDetail.x * scale}px`,
@@ -126,7 +202,25 @@
    height: `${glassDetail.height * scale}px`,
    backgroundColor: glassDetail.isRemain ? '#f0f0f0' : '#a0d8ef',
    border: '1px solid #000',
    cursor: 'pointer'
    cursor: 'pointer',
    draggable: !glassDetail.isRemain,
    zIndex: glassDetail.isRemain ? 1 : 2
  };
};
const rectStyle1 = (glassDetail, layoutIndex) => {
  const layout = layouts.value[layoutIndex];
  return {
    position: 'absolute',
    left: `${glassDetail.x * scale}px`,
    top: `${glassDetail.y * scale}px`,
    width: `${glassDetail.width * scale}px`,
    height: `${glassDetail.height * scale}px`,
    backgroundColor: glassDetail.isRemain ? '#f0f0f0' : '#a0d8ef',
    border: '1px solid #000',
    cursor: 'pointer',
    draggable: !glassDetail.isRemain,
    zIndex: glassDetail.isRemain ? 1 : 2
  };
};
@@ -140,8 +234,8 @@
  const layout = layouts.value[layoutIndex];
  const totalRects = layouts.value.length;
  const currentRectIndex = layoutIndex + 1;
  const width = layout.width;
  const height = layout.height;
  const width = layout.realWidth;
  const height = layout.realHeight;
  const sum = layout.glassDetails.reduce((sum, r) => sum + (width * height), 0);
  const percentage = (layout.usageRate * 100).toFixed(2) + '%';
  return `${currentRectIndex}/${totalRects} ${width}X${height}X${layout.quantity} ${percentage}`;
@@ -187,13 +281,22 @@
        }
      })
  layouts.value=originalFilm.value
  layoutDetails.value.push(props.layoutData)
  materialDetails.value=props.materialDetails
  console.log(layouts.value)
  adjustPrintLayout();
  // å¼ºåˆ¶é‡æ–°æ¸²æŸ“
  layoutPanel.value.offsetHeight; // è§¦å‘布局更新
};
onMounted(() => {
updateLayout();
  if(props.state===2||props.state===0){
    dataLoaded.value=true
  }
  if(props.state>0){
    dataLoadeds.value=true
  }
  updateLayout();
});
onUnmounted(() => {
@@ -309,7 +412,7 @@
.layout-wrapper {
  position: relative;
  margin-top: 50px;
  display: block;
}
.header {
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/SetAmount.vue
@@ -3,13 +3,19 @@
import {defineEmits} from 'vue';
import request from "@/utils/request";
import {ElMessage} from "element-plus";
import useUserInfoStore from "@/stores/userInfo";
import useOrderInfoStore from "@/stores/sd/order/orderInfo";
const userStore = useUserInfoStore()
const orderInfo = useOrderInfoStore()
const username = userStore.user.userName
onMounted(async() => {
  await firstLoading()
})
const firstLoading = async() => {
  request.post(`/glassOptimize/getConfiguration/磨量`).then((res) => {
  request.post(`/glassOptimize/getConfiguration/磨量/${username}`).then((res) => {
    if (res.code == "200") {
      const rawData = res.data.data;
      if (Array.isArray(rawData) && rawData.length > 0) {
@@ -102,7 +108,7 @@
    json:json,
  }
  request.post(`/glassOptimize/saveConfiguration/磨量`,configuration).then((res) => {
  request.post(`/glassOptimize/saveConfiguration/磨量/${username}`,configuration).then((res) => {
    if(res.code==200 && res.data===true){
      const amountData = {
        quicksetTop: quicksetTop.value,
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/SetTrimming.vue
@@ -3,14 +3,19 @@
import {defineEmits} from 'vue';
import request from "@/utils/request";
import {ElMessage} from "element-plus";
import useUserInfoStore from "@/stores/userInfo";
import useOrderInfoStore from "@/stores/sd/order/orderInfo";
const userStore = useUserInfoStore()
const orderInfo = useOrderInfoStore()
const username = userStore.user.userName
onMounted(async() => {
  await firstLoading()
})
const firstLoading = async() => {
  request.post(`/glassOptimize/getConfiguration/修边`).then((res) => {
  request.post(`/glassOptimize/getConfiguration/修边/${username}`).then((res) => {
    if (res.code == "200") {
      const rawData = res.data.data;
      if (Array.isArray(rawData) && rawData.length > 0) {
@@ -94,7 +99,7 @@
      json:json,
    }
  request.post(`/glassOptimize/saveConfiguration/修边`,configuration).then((res) => {
  request.post(`/glassOptimize/saveConfiguration/修边/${username}`,configuration).then((res) => {
    if(res.code==200 && res.data===true){
      const dataToSend = {
        quicksetTop: quicksetTop.value,
north-glass-erp/northglass-erp/src/views/system/app/appDownload.vue
@@ -1,5 +1,7 @@
<script setup>
document.querySelector('#app').style.minWidth = 'unset';
document.querySelector('#app').style.minHeight = 'unset';
</script>
<template>
@@ -11,5 +13,4 @@
</template>
<style scoped>
</style>
north-glass-erp/src/main/java/com/example/erp/controller/pp/GlassOptimizeController.java
@@ -33,10 +33,10 @@
    private UserService userService;
    //工程信息
    @ApiOperation("工程信息接口")
    @PostMapping  ("/projectInfo/{projectNo}")
    @PostMapping  ("/projectInfo/{projectNo}/{username}")
    public Result projectInfo(
            @PathVariable String projectNo){
        return Result.seccess(glassOptimizeService.projectInfoSv(projectNo));
            @PathVariable String projectNo,@PathVariable String username){
        return Result.seccess(glassOptimizeService.projectInfoSv(projectNo,username));
    }
    //工程信息流程卡
@@ -53,8 +53,8 @@
    public Result materialStore(
            @PathVariable  String thickness,
            @PathVariable  String model,@PathVariable  String projectNumber,
            @RequestParam(name = "type", required = false) Integer type ){
        return Result.seccess(glassOptimizeService.materialStoreSv(thickness,model,projectNumber,type));
            @RequestParam(name = "type", required = false) Integer type,@RequestParam(name = "username", required = false) String username  ){
        return Result.seccess(glassOptimizeService.materialStoreSv(thickness,model,projectNumber,type,username));
    }
@@ -271,15 +271,15 @@
        return new ResponseEntity<>(optContent.getBytes(), headers, HttpStatus.OK);
    }
    @PostMapping("/getConfiguration/{type}")
    public Result getConfiguration(@PathVariable String type) {
        return Result.seccess(glassOptimizeService.getConfiguration(type));
    @PostMapping("/getConfiguration/{type}/{username}")
    public Result getConfiguration(@PathVariable String type,@PathVariable String username) {
        return Result.seccess(glassOptimizeService.getConfiguration(type,username));
    }
    @ApiOperation("修片磨量修改")
    @PostMapping("/saveConfiguration/{type}")
    public Result saveConfiguration(@PathVariable String type, @RequestBody Map<String,Object>  object){
        return Result.seccess(glassOptimizeService.saveConfiguration(object,type));
    @PostMapping("/saveConfiguration/{type}/{username}")
    public Result saveConfiguration(@PathVariable String type,@PathVariable String username, @RequestBody Map<String,Object>  object){
        return Result.seccess(glassOptimizeService.saveConfiguration(object,type,username));
    }
    @ApiOperation("模拟排版")
north-glass-erp/src/main/java/com/example/erp/entity/sd/BasicData.java
@@ -2,11 +2,13 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDate;
@Data
@TableName("sd.basic_data")
public class BasicData {
    @TableId(type = IdType.AUTO)
    private Integer id;
north-glass-erp/src/main/java/com/example/erp/mapper/pp/GlassOptimizeMapper.java
@@ -19,6 +19,8 @@
    List<Map<String, Object>> analogComputationOptimization(String projectNo);
    List<Map<String, Object>> getOptimizeDetail(String projectNo);
    List<Map<String, Object>> simulatedTypesettingUsingOpt(List<String> processId,List<Integer> technologyNumber);
    //工程信息流程卡
@@ -146,13 +148,13 @@
    Boolean updateProjectMp(String projectId, String projectNmae, String glassThickness, String glassType,
                         Integer sumQuantity, Double sumArea, String userName,Integer processIdCount, String processId, Integer type);
    List<Map<String, Object>> getTemperedConfiguration();
    List<Map<String, Object>> getTemperedConfiguration(String username);
    List<Map<String, Object>> getGrindingTrimming();
    List<Map<String, Object>> getGrindingTrimming(String username);
    List<Map<String, Object>> getEdgeTrimming();
    List<Map<String, Object>> getEdgeTrimming(String username);
    Boolean updateOptimizeConfig(String json,Integer type);
    Boolean updateOptimizeConfig(String json,Integer type,String username);
    List<Map<String, Object>> getFlowCardListSimulated(String optionVal);
north-glass-erp/src/main/java/com/example/erp/mapper/sd/OrderProcessDetailMapper.java
@@ -8,7 +8,6 @@
import org.apache.ibatis.annotations.Param;
import java.sql.Date;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
@@ -33,5 +32,5 @@
    String selectNextProcess(String processId, String technologyNumber, String thisProcess);
    List<Map<String, String>> selectShiftQuantitySv(String creatorId, String startDate,String endDate);
    List<Map<String, String>> selectShiftQuantitySv(String creatorId, String startDatetime, String endDatetime, String step);
}
north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java
@@ -304,21 +304,29 @@
    public Map<String, Object> selectOptimizeResult(String processId) {
        Map<String, Object> map = new HashMap<>();
        map.put("data", glassOptimizeMapper.selectOptimizeResult(processId));
        map.put("optimizeUse", glassOptimizeMapper.materialStoreOptimizeUse(processId));
        return map;
    }
    //工程信息
    public Map<String, Object> projectInfoSv(String projectNo) {
    public Map<String, Object> projectInfoSv(String projectNo,String username) {
        Map<String, Object> stringObjectMap = glassOptimizeMapper.selectProjectCount(projectNo);
        Map<String, Object> map = new HashMap<>();
        if(Integer.parseInt(stringObjectMap.get("optimize_state").toString())==1||Integer.parseInt(stringObjectMap.get("tempering_state").toString())==1){
        if(Integer.parseInt(stringObjectMap.get("optimize_state").toString())==1){
            map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString()));
            map.put("data", glassOptimizeMapper.getOptimizeDetail(projectNo));
            map.put("project", glassOptimizeMapper.selectProjectCount(projectNo));
            map.put("grindingTrimming", null);
        } else if (Integer.parseInt(stringObjectMap.get("tempering_state").toString())==1) {
            map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString()));
            map.put("data", glassOptimizeMapper.analogComputationOptimization(projectNo));
            map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming());
        }else{
            map.put("project", glassOptimizeMapper.selectProjectCount(projectNo));
            map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming(username));
        } else{
            map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString()));
            map.put("data", glassOptimizeMapper.firstOptimization(projectNo));
            map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming());
            map.put("project", glassOptimizeMapper.selectProjectCount(projectNo));
            map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming(username));
        }
        return map;
    }
@@ -332,7 +340,7 @@
    }
    //库存信息
    public Map<String, Object> materialStoreSv(String thickness, String model, String projectNumber,Integer type) {
    public Map<String, Object> materialStoreSv(String thickness, String model, String projectNumber,Integer type,String username) {
        Map<String, Object> stringObjectMap = glassOptimizeMapper.selectProjectCount(projectNumber);
        Map<String, Object> map = new HashMap<>();
        if(Integer.parseInt(stringObjectMap.get("optimize_state").toString())==0){
@@ -343,12 +351,13 @@
            }else{
                map.put("data", glassOptimizeMapper.materialStoreSurplusMp(thickness,model));
            }
            map.put("edgeTrimming", glassOptimizeMapper.getEdgeTrimming());
            map.put("edgeTrimming", glassOptimizeMapper.getEdgeTrimming(username));
        }else{
            map.put("data", glassOptimizeMapper.materialStoreOptimizeUse(projectNumber));
            map.put("edgeTrimming", null);
        }
        map.put("state", Integer.parseInt(stringObjectMap.get("state").toString()));
        return map;
    }
@@ -602,30 +611,30 @@
    }
    public Map<String, Object> getConfiguration(String type) {
    public Map<String, Object> getConfiguration(String type,String username) {
        Map<String, Object> map = new HashMap<>();
        if(type.equals("钢化")){
            map.put("data", glassOptimizeMapper.getTemperedConfiguration());
            map.put("data", glassOptimizeMapper.getTemperedConfiguration(username));
        }else if(type.equals("磨量")){
            map.put("data", glassOptimizeMapper.getGrindingTrimming());
            map.put("data", glassOptimizeMapper.getGrindingTrimming(username));
        }else if(type.equals("修边")){
            map.put("data", glassOptimizeMapper.getEdgeTrimming());
            map.put("data", glassOptimizeMapper.getEdgeTrimming(username));
        }
        return map;
    }
    public Boolean saveConfiguration(Map<String,Object> object,String type) {
    public Boolean saveConfiguration(Map<String,Object> object,String type,String username) {
        String json = "";
        if (object.get("json") != null) {
            json = object.get("json").toString();
        }
        if(type.equals("钢化")){
            glassOptimizeMapper.updateOptimizeConfig(json,1);
            glassOptimizeMapper.updateOptimizeConfig(json,1,username);
        } else if (type.equals("修边")) {
            glassOptimizeMapper.updateOptimizeConfig(json,5);
            glassOptimizeMapper.updateOptimizeConfig(json,5,username);
        }else if (type.equals("磨量")) {
            glassOptimizeMapper.updateOptimizeConfig(json,4);
            glassOptimizeMapper.updateOptimizeConfig(json,4,username);
        }
        return true;
north-glass-erp/src/main/java/com/example/erp/service/pp/ReportingWorkService.java
@@ -10,6 +10,7 @@
import com.example.erp.common.Constants;
import com.example.erp.dto.pp.OrderNumberTransferDTO;
import com.example.erp.entity.pp.*;
import com.example.erp.entity.sd.BasicData;
import com.example.erp.entity.sd.Order;
import com.example.erp.entity.sd.OrderDetail;
import com.example.erp.entity.sd.OrderProcessDetail;
@@ -19,10 +20,7 @@
import com.example.erp.mapper.mm.FinishedOperateLogMapper;
import com.example.erp.mapper.pp.*;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.example.erp.mapper.sd.OrderDetailMapper;
import com.example.erp.mapper.sd.OrderGlassDetailMapper;
import com.example.erp.mapper.sd.OrderMapper;
import com.example.erp.mapper.sd.OrderProcessDetailMapper;
import com.example.erp.mapper.sd.*;
import com.example.erp.mapper.userInfo.LogMapper;
import com.example.erp.service.sd.OrderProcessDetailService;
import com.example.erp.service.userInfo.LogService;
@@ -71,6 +69,7 @@
    private final RestTemplate restTemplate;
    private final PatchLogMapper patchLogMapper;
    private final ReworkMapper reworkMapper;
    private final BasicDateMapper basicDataMapper;
    /*public ReportingWorkService(ReportingWorkMapper reportingWorkMapper, BasicDateProduceMapper basicDateProduceMapper, DamageDetailsMapper damageDetailsMapper, ReportingWorkDetailMapper reportingWorkDetailMapper, OrderProcessDetailMapper orderProcessDetailMapper, OrderProcessDetailService orderProcessDetailService, OrderMapper orderMapper, FlowCardMapper flowCardMapper, LogService logService, LogMapper logMapper, OrderGlassDetailMapper orderGlassDetailMapper, SysErrorService sysErrorService, OrderDetailMapper orderDetailMapper, FinishedOperateLogMapper finishedOperateLogMapper, ReportingWorkTransferMapper reportingWorkTransferMapper) {
@@ -1165,7 +1164,9 @@
        date.add(startDate);
        date.add(endDate);
        Map<String, Object> result = new HashMap<>();
        result.put("data",orderProcessDetailMapper.selectShiftQuantitySv(creatorId, startDate, endDate));
        BasicData basicData = basicDataMapper
                .selectOne(new QueryWrapper<BasicData>().eq("basic_name", reportingWork.get("process")));
        result.put("data",orderProcessDetailMapper.selectShiftQuantitySv(creatorId, startDate, endDate,basicData.getNickname()));
        result.put("date",date);
        return result;
    }
north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml
@@ -95,39 +95,45 @@
    <!--第一次优化查询-->
    <select id="firstOptimization">
        ( SELECT
              c.project_no,
              d.child_width as 'width',
              d.child_height as 'height',
              c.quantity,
              o.shape,
              concat( c.process_id, '-', c.technology_number ) AS 'process_id',
              c.technology_number as layer,
              c.layers_number as total_layer,
              d.glass_child,
              o.product_name,
              o.price,
              o.remarks,
              o.building_number,
              round( d.area * c.quantity, 4 ) as 'area',
              c.order_number,
              d.icon,
              op.project_name,
              0 as patch_state
          FROM
              pp.flow_card c
                  LEFT JOIN sd.order_detail o ON c.order_id = o.order_id
                  AND c.order_number = o.order_number
                  LEFT JOIN sd.order_glass_detail d ON c.order_id = d.order_id
                  AND c.order_number = d.order_number
                  AND c.technology_number = d.technology_number
                  INNER JOIN pp.optimize_project AS op ON op.project_no = c.project_no
          WHERE
              c.project_no IS NOT NULL
            and c.project_no = #{projectNo}
          ORDER BY
              c.process_id,
              c.order_number
        (SELECT
             c.project_no,
             d.child_width as 'width',
             d.child_height as 'height',
             c.quantity,
             o.shape,
             concat( c.process_id, '-', c.technology_number ) AS 'process_id',
             c.process_id AS 'process_ids',
             c.technology_number as layer,
             c.layers_number as total_layer,
             d.glass_child,
             o.product_name,
             o.price,
             o.remarks,
             o.building_number,
             round( d.area * c.quantity, 4 ) as 'area',
             c.order_number,
             d.icon,
             op.project_name,
             0 as patch_state,
             a.id as rackNo
         FROM
             pp.flow_card c
                 LEFT JOIN sd.order_detail o ON c.order_id = o.order_id
                 AND c.order_number = o.order_number
                 LEFT JOIN sd.order_glass_detail d ON c.order_id = d.order_id
                 AND c.order_number = d.order_number
                 AND c.technology_number = d.technology_number
                 INNER JOIN pp.optimize_project AS op ON op.project_no = c.project_no
                 left join
             (select (@row_number := @row_number + 1) as id,process_id as process_id,technology_number as technology_number from (select process_id,technology_number from pp.flow_card tt where project_no =#{projectNo} group by process_id,technology_number) tt,(select @row_number := 0) as t) a
             on a.process_id=c.process_id and a.technology_number=c.technology_number
         WHERE
             c.project_no IS NOT NULL
           and c.project_no = #{projectNo}
         ORDER BY
             a.id,
             c.process_id,
             c.order_number
        ) union
        (
            SELECT
@@ -137,6 +143,7 @@
                c.patch_num as quantity,
                o.shape,
                concat( c.process_id, '-', c.technology_number ) AS 'process_id',
                c.process_id AS 'process_ids',
                c.technology_number as layer,
                fc.layers_number as total_layer,
                d.glass_child,
@@ -148,7 +155,8 @@
                c.order_sort as order_number,
                d.icon,
                op.project_name,
                1 as patch_state
                1 as patch_state,
                a.id as rackNo
            FROM
                pp.patch_log c
                    LEFT JOIN sd.order_detail o ON c.order_id = o.order_id
@@ -158,10 +166,14 @@
                    AND c.technology_number = d.technology_number
                    INNER JOIN pp.optimize_project AS op ON op.project_no = c.project_no
                    LEFT JOIN pp.flow_card fc ON c.process_id = fc.process_id and fc.technology_number=c.technology_number
                    left join
                    (select (@row_number := @row_number + 1) as id,process_id as process_id,technology_number as technology_number from (select process_id,technology_number from pp.flow_card tt where project_no =#{projectNo} group by process_id,technology_number) tt,(select @row_number := 0) as t) a
            on a.process_id=c.process_id and a.technology_number=c.technology_number
            WHERE
                c.project_no IS NOT NULL
              and c.project_no = #{projectNo}
            ORDER BY
                a.id,
                c.process_id,
                c.order_sort)
    </select>
@@ -171,7 +183,7 @@
    <select id="analogComputationOptimization">
        SELECT
            h.project_no,
            h.layout_id,
            h.layout_id as rackNo,
            h.width AS width,
            h.height AS height,
            count( 1 ) AS quantity,
@@ -225,6 +237,57 @@
        ORDER BY
            LENGTH( h.layout_id ),
            h.layout_id;
    </select>
    <select id="getOptimizeDetail">
        SELECT
            h.project_no,
            h.heat_layout_id as rackNo,
            h.o_width AS width,
            h.o_height AS height,
            (h.height-h.o_height)/2 as shortGrind1,
            (h.height-h.o_height)/2 as shortGrind2,
            (h.width-h.o_width)/2 as longGrind2,
            (h.width-h.o_width)/2  as longGrind1,
            count( 1 ) AS quantity,
            o.shape,
            concat( h.process_id, '-', h.layer ) AS 'process_id',
            h.process_id as process_ids,
            h.layer,
            h.total_layer as total_layer,
            d.glass_child,
            o.product_name,
            o.price,
            o.remarks,
            o.building_number,
            round( d.area * count( 1 ), 4 ) AS 'area',
            c.order_number,
            d.icon,
            o.price,
            h.patch_state
        from
            pp.`optimize_detail` h
                LEFT JOIN pp.flow_card c ON h.process_id = c.process_id
                AND h.layer = c.technology_number
                AND h.order_sort = c.order_number
                LEFT JOIN sd.order_detail o ON c.order_id = o.order_id
                AND c.order_number = o.order_number
                LEFT JOIN sd.order_glass_detail d ON c.order_id = d.order_id
                AND c.order_number = d.order_number
                AND c.technology_number = d.technology_number
        WHERE
            h.project_no =#{projectNo}
        GROUP BY
            h.project_no,
            h.heat_layout_id,
            h.width,
            h.height,
            h.process_id,
            h.layer,
            c.order_number
        ORDER BY
            h.heat_layout_id;
    </select>
    <!--工程信息流程卡-->
@@ -1063,8 +1126,8 @@
            #{glass.orderSort},
            #{glass.stockSort},
            #{glass.polySort},
            #{glass.realwidth},
            #{glass.realheight},
            #{glass.realWidth},
            #{glass.realHeight},
            #{glass.width},
            #{glass.height},
            #{glass.x},
@@ -1219,7 +1282,7 @@
               JSON_EXTRACT( oc.config_detail, '$.load_length' ) as load_length,
               JSON_EXTRACT( oc.config_detail, '$.x_space' ) as x_space,
               JSON_EXTRACT( oc.config_detail, '$.y_space' ) as y_space
        from pp.optimize_admin oa left join pp.optimize_config oc on oa.h_id=oc.id where name='admin'
        from pp.optimize_admin oa where config_type=1 and creater=#{username}
    </select>
    <select id="getEdgeTrimming">
@@ -1229,7 +1292,7 @@
               JSON_EXTRACT( oc.config_detail, '$.down_trim' ) as downTrim,
               JSON_EXTRACT( oc.config_detail, '$.auto_fill_trim' ) as autoFillTrim,
               JSON_EXTRACT( oc.config_detail, '$.quick_trim' ) as quickTrim
        from  pp.optimize_config oc where config_type=5
        from  pp.optimize_config oc where config_type=5 and creater=#{username}
    </select>
    <select id="getGrindingTrimming">
@@ -1240,12 +1303,12 @@
               JSON_EXTRACT( oc.config_detail, '$.auto_fill_edge' ) as autoFillEdge,
               JSON_EXTRACT( oc.config_detail, '$.quick_edge' ) as quickEdge,
                JSON_EXTRACT( oc.config_detail, '$.min_auto_lenght' ) as minAutoLenght
        from  pp.optimize_config oc where config_type=4
        from  pp.optimize_config oc where config_type=4 and creater=#{username}
    </select>
    <update id="updateOptimizeConfig">
        UPDATE pp.optimize_config set config_detail=#{json},create_time=now()
        where config_type=#{type}
        where config_type=#{type} and creater=#{username}
    </update>
    <select id="simulatedTypesettingUsingOpt">
north-glass-erp/src/main/resources/mapper/sd/OrderProcessDetailMapper.xml
@@ -166,11 +166,12 @@
    </select>
    <select id="selectShiftQuantitySv">
        select CAST(concat(b.order_id,'/',a.order_number,'/',a.technology_number) as char ) as 'order_id',
        select * from(select CAST(concat(b.order_id,'/',a.order_number,'/',a.technology_number) as char ) as 'order_id',
               c.child_width,
               c.child_height,
               a.completed_quantity,
               a.breakage_quantity
               a.breakage_quantity,
               a.order_number
        from pp.reporting_work as b
        left join pp.reporting_work_detail as a
            on a.reporting_work_id = b.reporting_work_id
@@ -180,7 +181,10 @@
            and c.technology_number = a.technology_number
        where b.reviewed_state >=0
        and b.creator_id = #{creatorId}
        and UNIX_TIMESTAMP(b.reporting_work_time) BETWEEN UNIX_TIMESTAMP(#{startDate}) and UNIX_TIMESTAMP(#{endDate})
        order by b.id desc
        and UNIX_TIMESTAMP(b.reporting_work_time) BETWEEN UNIX_TIMESTAMP(#{startDatetime}) and UNIX_TIMESTAMP(#{endDatetime})
        order by b.id desc ) as e
        <if test="step != null and step != ''">
            group by e.order_number
        </if>
    </select>
</mapper>