廖井涛
2025-11-03 80db9cb305d2603bb3646b65fb7515d7d315f610
Merge branch 'master' of http://10.153.19.25:10105/r/ERP_override
17个文件已修改
801 ■■■■■ 已修改文件
north-glass-erp/northglass-erp/public/config.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/sd/companySet/温州巨星.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizationRectPrint.vue 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeParms.vue 166 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectMange.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/GlassInventory.vue 111 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/OptimizationRect.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCard.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/replenish/AddReplenish.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/report/ProductionSchedule.vue 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/mapper/pp/GlassOptimizeMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/ReportService.java 200 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/PatchLogMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/Report.xml 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/public/config.js
@@ -10,4 +10,5 @@
//公司 bore.pub 10.153.19.150
//洛阳 172.17.2.7
//天津 192.168.150.39
//上海 10.153.18.3
//上海 10.153.18.3
//温州 192.168.2.14
north-glass-erp/northglass-erp/src/stores/sd/companySet/ÎÂÖݾÞÐÇ.js
@@ -108,7 +108,7 @@
                },
            },
            hideButton:'true',//流程卡打印界面按钮是否显示
            getSelectFlowCard:1,//流程卡打印查询是否合并  1合并2不合并
            getSelectFlowCard:2,//流程卡打印查询是否合并  1合并2不合并
            columnsLabel:2,//一行两列成品标签 1新疆一行两列成品标签,2其它
        },
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizationRectPrint.vue
@@ -31,13 +31,13 @@
      <!-- PDF加载完成时显示PDF -->
      <iframe
          v-else
          :src="pdfUrl"          style="width: 100%; height: 800px; border: 1px solid #ddd;"
          :src="pdfUrl"          style="width: 100%; height: 780px; border: 1px solid #ddd;"
          title="PDF预览">
      </iframe>
    </div>
    <div v-else style="margin-top: 20px;">
      <div style="display: flex; justify-content: center; align-items: center; height: 800px; border: 1px solid #ddd; background-color: white;">
      <div style="display: flex; justify-content: center; align-items: center; height: 780px; border: 1px solid #ddd; background-color: white;">
        <div style="text-align: center; color: #999;">
          <p style="font-size: 20px; margin-bottom: 10px;">优化报告预览区</p>
          <p style="font-size: 14px;">点击上方"预览"按钮生成并查看优化报告</p>
@@ -238,8 +238,8 @@
      glassThickness : optimizeUse.value.thickness,
      glassType : optimizeUse.value.model,
      quantity : String(optimizeUse.value.processingQuantity),
      printLayouts : printLayouts.value === '0' ? '1' : '0',  // 0表示是,1表示否
      printReport : printReport.value === '0' ? '1' : '0',    // 0表示是,1表示否
      printLayouts : printLayouts.value || '0',
      printReport : printReport.value || '0',
      layouts : layoutData.value,
      reportData:{
        rectangleQuantity: reportData.value.rectangleQuantity,
@@ -469,70 +469,6 @@
    }
  }
};
// const autoPreviewReport = async () => {
//   try {
//     await generateReport();
//     if (!filePath.value) {
//       // å¦‚果没有文件路径,不执行预览
//       return;
//     }
//     const encodedFilePath = encodeURIComponent(filePath.value);
//
//     const response = await request.get('/glassOptimize/reports/pdf', {
//       params: { filePath: encodedFilePath },
//       responseType: 'blob',
//       headers: {
//         'Accept': 'application/pdf'
//       }
//     });
//
//     // æ£€æŸ¥å“åº”数据是否存在且有效
//     if (!response) {
//       ElMessage.error('未能获取到PDF数据');
//       return;
//     }
//
//     const blob = new Blob([response], { type: 'application/pdf' });
//
//     // æ£€æŸ¥ blob æ˜¯å¦æœ‰æ•ˆ
//     if (blob.size === 0) {
//       ElMessage.error('接收到空的PDF文件');
//       return;
//     }
//
//     // åˆ›å»ºPDF URL并赋值给 pdfUrl ç”¨äºŽç•Œé¢æ˜¾ç¤º
//     const url = URL.createObjectURL(blob);
//     pdfUrl.value = url;
//
//   } catch (error) {
//     console.error('自动预览流程异常:', error);
//   }
// };
//
// onMounted(() => {
//   // ä¼˜å…ˆä½¿ç”¨æ³¨å…¥çš„ projectNo,其次使用 props,最后使用 localStorage
//   if (injectedProjectNo) {
//     processId.value = injectedProjectNo.value || injectedProjectNo;
//   } else if (props.project) {
//     processId.value = props.project.projectNumber || '';
//     state.value = props.state;
//   } else if (savedProjectNo) {
//     processId.value = savedProjectNo;
//   }
//
//   if (processId.value) {
//     selectLayout();
//     selectReportData();
//     selectMaterialData();
//     selectProductData();
//
//     // æ•°æ®åŠ è½½å®ŒæˆåŽè‡ªåŠ¨é¢„è§ˆ
//     setTimeout(() => {
//       autoPreviewReport();
//     }, 1000); // å»¶è¿Ÿ1秒确保所有数据加载完成
//   }
// });
const config = reactive({
  columnTypes: '两列',
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeParms.vue
@@ -24,7 +24,7 @@
};
const saveToDatabase = () => {
  if (settings.server.printLayouts === '1' && settings.server.printReport === '1') {
  if (settings.server.printLayouts === '0' && settings.server.printReport === '0') {
    ElMessage.warning('版图和报告不能同时不打印,请至少选择一项');
    return;
  }
@@ -38,46 +38,122 @@
  });
};
// ä¿®æ”¹ fetchSettings æ–¹æ³•
const fetchSettings = async (username) => {
  try {
    const response = await request.post(`/glassOptimize/selectOptimizeParms/${username}`);
    if (response.code == 200) {
      if (!response.data) {
        console.error('响应数据为空');
        return;
    let parsedData = {};
    if (response.code == 200 && response.data) {
      try {
        parsedData = JSON.parse(response.data);
      } catch (parseError) {
        console.error('解析响应数据失败:', parseError);
        parsedData = {};
      }
      const parsedData = JSON.parse(response.data);
      if (!parsedData.server) {
        parsedData.server = {};
      }
      if (!parsedData.server.printLayouts) {
        parsedData.server.printLayouts = '0'; // é»˜è®¤æ‰“印版图
      }
      if (!parsedData.server.printReport) {
        parsedData.server.printReport = '0'; // é»˜è®¤æ‰“印报告
      }
      if (!parsedData.server.layoutRows) {
        parsedData.server.layoutRows = '2'; // é»˜è®¤2行
      }
      if (!parsedData.server.layoutColumns) {
        parsedData.server.layoutColumns = '2'; // é»˜è®¤2列
      }
      if (!parsedData.server.glassInfoShow) {
        parsedData.server.glassInfoShow = '2'; // é»˜è®¤æ˜¾ç¤ºåœ¨ä¸‹ä¾§
      }
      if (!parsedData.server.cutInfoShow) {
        parsedData.server.cutInfoShow = '1'; // é»˜è®¤æ˜¾ç¤º
      }
      if (!parsedData.server.fileMode) {
        parsedData.server.fileMode = '1'; // é»˜è®¤ä¸ºå•文件模式
      }
      Object.assign(settings, parsedData);
      console.log('设置已更新:', settings);
    } else {
      console.error('请求失败,状态码:', response.code);
      console.log('未获取到设置数据或响应失败,使用默认设置');
      parsedData = {};
    }
    // ç¡®ä¿æ‰€æœ‰æ¨¡å—都存在
    if (!parsedData.optimization) parsedData.optimization = {};
    if (!parsedData.display) parsedData.display = {};
    if (!parsedData.cutting) parsedData.cutting = {};
    if (!parsedData.server) parsedData.server = {};
    if (!parsedData.tempering) parsedData.tempering = {};
    parsedData.optimization.yShapeJoinOptimization = parsedData.optimization.yShapeJoinOptimization !== undefined ? parsedData.optimization.yShapeJoinOptimization : true;
    parsedData.optimization.autoMiddleEmptyPairing = parsedData.optimization.autoMiddleEmptyPairing !== undefined ? parsedData.optimization.autoMiddleEmptyPairing : true;
    parsedData.optimization.smallPieceRotationProhibited = parsedData.optimization.smallPieceRotationProhibited !== undefined ? parsedData.optimization.smallPieceRotationProhibited : true;
    // parsedData.optimization.maxFramesOnSite = parsedData.optimization.maxFramesOnSite !== undefined ? parsedData.optimization.maxFramesOnSite : 10;
    parsedData.optimization.bendEdgeDistance = parsedData.optimization.bendEdgeDistance !== undefined ? parsedData.optimization.bendEdgeDistance : 10;
    // parsedData.optimization.positiveTolerance = parsedData.optimization.positiveTolerance !== undefined ? parsedData.optimization.positiveTolerance : 0;
    // parsedData.optimization.negativeTolerance = parsedData.optimization.negativeTolerance !== undefined ? parsedData.optimization.negativeTolerance : 0;
    parsedData.optimization.cutterOriginPosition = parsedData.optimization.cutterOriginPosition !== undefined ? parsedData.optimization.cutterOriginPosition : 1;
    // parsedData.optimization.uniformShapeEdgeTrimAmount = parsedData.optimization.uniformShapeEdgeTrimAmount !== undefined ? parsedData.optimization.uniformShapeEdgeTrimAmount : 0;
    parsedData.optimization.optimizationMethod = parsedData.optimization.optimizationMethod !== undefined ? parsedData.optimization.optimizationMethod : '1';
    parsedData.optimization.travType = parsedData.optimization.travType !== undefined ? parsedData.optimization.travType : 'X';
    // parsedData.optimization.optimizationIterations = parsedData.optimization.optimizationIterations !== undefined ? parsedData.optimization.optimizationIterations : 0;
    // parsedData.optimization.finishedProductGrindingAmount = parsedData.optimization.finishedProductGrindingAmount !== undefined ? parsedData.optimization.finishedProductGrindingAmount : 0;
    // parsedData.optimization.rawPieceEdgeTrimAmount = parsedData.optimization.rawPieceEdgeTrimAmount !== undefined ? parsedData.optimization.rawPieceEdgeTrimAmount : 0;
    // parsedData.optimization.finishedSinglePieceBelowGrindingAmount = parsedData.optimization.finishedSinglePieceBelowGrindingAmount !== undefined ? parsedData.optimization.finishedSinglePieceBelowGrindingAmount : 0;
    parsedData.optimization.rackCycleQty = parsedData.optimization.rackCycleQty !== undefined ? parsedData.optimization.rackCycleQty :5;
    // ä¸º display å‚数添加默认值
    parsedData.display.themeColor = parsedData.display.themeColor !== undefined ? parsedData.display.themeColor : '#5168c8';
    parsedData.display.includeProductEdge = parsedData.display.includeProductEdge !== undefined ? parsedData.display.includeProductEdge : true;
    parsedData.display.includeIrregularEdge = parsedData.display.includeIrregularEdge !== undefined ? parsedData.display.includeIrregularEdge : true;
    parsedData.display.mergeByFrameNumber = parsedData.display.mergeByFrameNumber !== undefined ? parsedData.display.mergeByFrameNumber : true;
    parsedData.display.frameNumber = parsedData.display.frameNumber !== undefined ? parsedData.display.frameNumber : true;
    parsedData.display.orderNumber = parsedData.display.orderNumber !== undefined ? parsedData.display.orderNumber : true;
    parsedData.display.productName = parsedData.display.productName !== undefined ? parsedData.display.productName : true;
    parsedData.display.processingInfo = parsedData.display.processingInfo !== undefined ? parsedData.display.processingInfo : true;
    parsedData.display.remarks = parsedData.display.remarks !== undefined ? parsedData.display.remarks : true;
    parsedData.display.floorNumber = parsedData.display.floorNumber !== undefined ? parsedData.display.floorNumber : true;
    parsedData.display.edgeLength = parsedData.display.edgeLength !== undefined ? parsedData.display.edgeLength : false;
    parsedData.display.manufacturingProcess = parsedData.display.manufacturingProcess !== undefined ? parsedData.display.manufacturingProcess : false;
    parsedData.display.identifier = parsedData.display.identifier !== undefined ? parsedData.display.identifier : false;
    // ä¸º cutting å‚数添加默认值
    parsedData.cutting.cutting_direction = parsedData.cutting.cutting_direction !== undefined ? parsedData.cutting.cutting_direction : true;
    parsedData.cutting.show_cutting_path = parsedData.cutting.show_cutting_path !== undefined ? parsedData.cutting.show_cutting_path : true;
    parsedData.cutting.force_continuous_cutting = parsedData.cutting.force_continuous_cutting !== undefined ? parsedData.cutting.force_continuous_cutting : true;
    // parsedData.cutting.min_radius = parsedData.cutting.min_radius !== undefined ? parsedData.cutting.min_radius : 0;
    // parsedData.cutting.min_parallel_offset = parsedData.cutting.min_parallel_offset !== undefined ? parsedData.cutting.min_parallel_offset : 0;
    // parsedData.cutting.t_shaped_recess = parsedData.cutting.t_shaped_recess !== undefined ? parsedData.cutting.t_shaped_recess : 0;
    // parsedData.cutting.down_cut_spacing = parsedData.cutting.down_cut_spacing !== undefined ? parsedData.cutting.down_cut_spacing : 0;
    // parsedData.cutting.lift_retract = parsedData.cutting.lift_retract !== undefined ? parsedData.cutting.lift_retract : 0;
    // ä¸º server å‚数添加默认值
    parsedData.server.printLayouts = parsedData.server.printLayouts !== undefined ? parsedData.server.printLayouts : '1';
    parsedData.server.printReport = parsedData.server.printReport !== undefined ? parsedData.server.printReport : '1';
    parsedData.server.layoutRows = parsedData.server.layoutRows !== undefined ? parsedData.server.layoutRows : '2';
    parsedData.server.layoutColumns = parsedData.server.layoutColumns !== undefined ? parsedData.server.layoutColumns : '2';
    parsedData.server.glassInfoShow = parsedData.server.glassInfoShow !== undefined ? parsedData.server.glassInfoShow : '2';
    parsedData.server.cutInfoShow = parsedData.server.cutInfoShow !== undefined ? parsedData.server.cutInfoShow : '1';
    parsedData.server.fileMode = parsedData.server.fileMode !== undefined ? parsedData.server.fileMode : '1';
    parsedData.server.haveMark = parsedData.server.haveMark !== undefined ? parsedData.server.haveMark : '1';
    parsedData.server.haveOptimaMark = parsedData.server.haveOptimaMark !== undefined ? parsedData.server.haveOptimaMark : '1';
    parsedData.server.haveQMark = parsedData.server.haveQMark !== undefined ? parsedData.server.haveQMark : '1';
    parsedData.server.glassIdMode = parsedData.server.glassIdMode !== undefined ? parsedData.server.glassIdMode : '1';
    parsedData.server.optimaMarkPosition = parsedData.server.optimaMarkPosition !== undefined ? parsedData.server.optimaMarkPosition : '1';
    parsedData.server.optimaMarkName = parsedData.server.optimaMarkName !== undefined ? parsedData.server.optimaMarkName : 'erweima_8mm';
    parsedData.server.optimaMarkWidth = parsedData.server.optimaMarkWidth !== undefined ? parsedData.server.optimaMarkWidth : 8;
    parsedData.server.optimaMarkHeight = parsedData.server.optimaMarkHeight !== undefined ? parsedData.server.optimaMarkHeight : 8;
    parsedData.server.output_format = parsedData.server.output_format !== undefined ? parsedData.server.output_format : '';
    parsedData.server.cutting_code_save_path = parsedData.server.cutting_code_save_path !== undefined ? parsedData.server.cutting_code_save_path : '';
    parsedData.server.open_folder_after_save = parsedData.server.open_folder_after_save !== undefined ? parsedData.server.open_folder_after_save : '';
    parsedData.server.g_code_file_format = parsedData.server.g_code_file_format !== undefined ? parsedData.server.g_code_file_format : '';
    parsedData.server.trf_file_save_path = parsedData.server.trf_file_save_path !== undefined ? parsedData.server.trf_file_save_path : '';
    parsedData.server.btl_file_save_path = parsedData.server.btl_file_save_path !== undefined ? parsedData.server.btl_file_save_path : '';
    parsedData.server.optima_file_save_path = parsedData.server.optima_file_save_path !== undefined ? parsedData.server.optima_file_save_path : '';
    parsedData.server.optimization_depth_limit_enable = parsedData.server.optimization_depth_limit_enable !== undefined ? parsedData.server.optimization_depth_limit_enable : '';
    parsedData.server.original_sheet_material_calculation = parsedData.server.original_sheet_material_calculation !== undefined ? parsedData.server.original_sheet_material_calculation : '';
    // ä¸º tempering å‚数添加默认值
    parsedData.tempering.furnaceLength = parsedData.tempering.furnaceLength !== undefined ? parsedData.tempering.furnaceLength : 5000;
    parsedData.tempering.furnaceWidth = parsedData.tempering.furnaceWidth !== undefined ? parsedData.tempering.furnaceWidth : 2800;
    parsedData.tempering.maxLoadingRate = parsedData.tempering.maxLoadingRate !== undefined ? parsedData.tempering.maxLoadingRate : 50;
    parsedData.tempering.chaosLevel = parsedData.tempering.chaosLevel !== undefined ? parsedData.tempering.chaosLevel : 0;
    parsedData.tempering.temperingTime = parsedData.tempering.temperingTime !== undefined ? parsedData.tempering.temperingTime : 160;
    parsedData.tempering.defaultTemperingMode = parsedData.tempering.defaultTemperingMode !== undefined ? parsedData.tempering.defaultTemperingMode : 'auto';
    parsedData.tempering.maxArea = parsedData.tempering.maxArea !== undefined ? parsedData.tempering.maxArea : 0;
    parsedData.tempering.maxPieceCount = parsedData.tempering.maxPieceCount !== undefined ? parsedData.tempering.maxPieceCount : 10;
    parsedData.tempering.xAxisInterval = parsedData.tempering.xAxisInterval !== undefined ? parsedData.tempering.xAxisInterval : 80;
    parsedData.tempering.yAxisInterval = parsedData.tempering.yAxisInterval !== undefined ? parsedData.tempering.yAxisInterval : 80;
    Object.assign(settings, parsedData);
    console.log('设置已更新:', settings);
    // ä¸º optimization å‚数设置默认值
    initializeOptimizationDefaults();
  } catch (error) {
    console.error('请求发生错误:', error);
    // å‡ºçŽ°é”™è¯¯æ—¶ä¹Ÿè®¾ç½®é»˜è®¤å€¼
    setDefaultSettings();
  }
};
@@ -278,7 +354,7 @@
              <input
                  type="radio"
                  id="printLayouts"
                  value="0"
                  value="1"
                  v-model="settings.server.printLayouts"
              />
              <label for="printLayouts">是</label>
@@ -286,7 +362,7 @@
              <input
                  type="radio"
                  id="noPrintLayouts"
                  value="1"
                  value="0"
                  v-model="settings.server.printLayouts"
                  style="margin-left: 20px;"
              />
@@ -300,14 +376,14 @@
              <input
                  type="radio"
                  id="printReport"
                  value="0"
                  value="1"
                  v-model="settings.server.printReport"
              />
              <label for="printReport">是</label>
              <input
                  type="radio"
                  id="noPrintReport"
                  value="1"
                  value="0"
                  v-model="settings.server.printReport"
                  style="margin-left: 20px;"
              />
@@ -328,7 +404,7 @@
            </select>
          </div>
          <div class="form-group">
            <label>显示小片信息</label>
            <label>小片信息</label>
            <select v-model="settings.server.glassInfoShow" class="cs" style="width: 10px; margin-right: 10px;">
              <option value="0">不显示</option>
              <option value="1">显示在右侧</option>
@@ -336,7 +412,7 @@
            </select>
          </div>
          <div class="form-group">
            <label>显示切割信息</label>
            <label>切割信息</label>
            <select v-model="settings.server.cutInfoShow" class="cs" style="width: 10px; margin-right: 10px;">
              <option value="0">不显示</option>
              <option value="1">显示</option>
@@ -378,7 +454,7 @@
                <input
                    type="radio"
                    id="singleFile"
                    value="0"
                    value="1"
                    v-model="settings.server.haveMark"
                />
                <label for="singleFile">是</label>
@@ -386,7 +462,7 @@
                <input
                    type="radio"
                    id="multiFile"
                    value="1"
                    value="0"
                    v-model="settings.server.haveMark"
                    style="margin-left: 20px;"
                />
@@ -400,7 +476,7 @@
                <input
                    type="radio"
                    id="singleFile"
                    value="0"
                    value="1"
                    v-model="settings.server.haveOptimaMark"
                />
                <label for="singleFile">是</label>
@@ -408,7 +484,7 @@
                <input
                    type="radio"
                    id="multiFile"
                    value="1"
                    value="0"
                    v-model="settings.server.haveOptimaMark"
                    style="margin-left: 20px;"
                />
@@ -422,7 +498,7 @@
                <input
                    type="radio"
                    id="singleFile"
                    value="0"
                    value="1"
                    v-model="settings.server.haveQMark"
                />
                <label for="singleFile">是</label>
@@ -430,7 +506,7 @@
                <input
                    type="radio"
                    id="multiFile"
                    value="1"
                    value="0"
                    v-model="settings.server.haveQMark"
                    style="margin-left: 20px;"
                />
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/ProjectMange.vue
@@ -235,7 +235,7 @@
  {
    code: 'production',
    initialState: 1,
    temperingState: 1,
    // temperingState: 1,
    optimizeState: 1,
    targetState: 100,
    targetStates: 0,
@@ -246,7 +246,7 @@
  {
    code: 'novisible',
    initialState: 100,
    temperingState: 1,
    // temperingState: 1,
    optimizeState: 1,
    targetState: 1,
    targetStates: 0,
@@ -463,7 +463,7 @@
                }
              }
              else if(config.code === 'production'){
                if(row.temperingState==1&&row.optimizeState===1&&row.state===1){
                if(row.optimizeState===1&&row.state===1){
                  row.state = config.targetState;
                  code=3
                }else{
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/GlassInventory.vue
@@ -102,11 +102,63 @@
    requiresRow: false,
  },
  {
    code: 'addRow', // å¯¼å‡ºæ–‡ä»¶æ“ä½œçš„配置
    code: 'addRow',
    successMsg: '添加成功!',
    gridRef: xGrid,
    requiresRow: false,
  },
    handler: async () => {
      const $grid = xGrid.value;
      if ($grid) {
        // ç”Ÿæˆ6位随机编码
        const generateCode = () => {
          // ä½¿ç”¨å½“前时间戳生成唯一编码
          const timestamp = Date.now().toString();
          // å–时间戳的后6位,确保是6位数
          const code = timestamp.substring(timestamp.length - 6).padStart(6, '0');
          return code;
        };
        // åˆ›å»ºæ–°è¡Œæ•°æ®
        const newRow = {
          id: generateCode(), // è‡ªåŠ¨ç”Ÿæˆ6位编码
          width: '', // å®½åº¦å¾…用户填写
          height: '', // é«˜åº¦å¾…用户填写
          thickness: thickness.value, // è‡ªåŠ¨å¡«å……åŽšåº¦
          model: model.value,// è‡ªåŠ¨å¡«å……ç±»åž‹
          available_quantity: 999,
          leftTrim: defaultTrims.leftTrim,   // ä½¿ç”¨é»˜è®¤å·¦ä¿®è¾¹
          downTrim: defaultTrims.downTrim,   // ä½¿ç”¨é»˜è®¤ä¸‹ä¿®è¾¹
          rightTrim: defaultTrims.rightTrim, // ä½¿ç”¨é»˜è®¤å³ä¿®è¾¹
          upTrim: defaultTrims.upTrim
        };
        // æ’入新行
        let result = toolbarButtonClickEvent();
        let lengths = 0;
        if (result != null) {
          lengths = result.start;
        }
        if ($grid.getTableData().tableData.length >= 100) {
          ElMessage.error(t('order.msg.tableLengthMax'));
          return;
        }
        if ($grid.getCheckedFilters().length !== 0) {
          ElMessage.error(t('order.msg.pleaseCancelTheFilteringFirst'));
          return;
        }
        if ($grid.getTableData().fullData.length > lengths + 1) {
          $grid.insertAt(newRow, lengths + 1);
        } else {
          $grid.insertAt(newRow, -1);
        }
        ElMessage.success('添加成功!');
      }
    }
  }
]
// å³é”®èœå•点击逻辑
@@ -122,24 +174,8 @@
          return;
        }
        if (config.code === 'addRow') {
          if ($grid.getTableData().tableData.length >=100){
            ElMessage.error(t('order.msg.tableLengthMax'))
            return
          }
          if ($grid.getCheckedFilters().length!==0){
            ElMessage.error(t('order.msg.pleaseCancelTheFilteringFirst'))
            return
          }
          console.log($grid.getTableData().visibleData)
          let result = toolbarButtonClickEvent()
          let lengths = 0
          if (result!=null){
            lengths=result.start
          }
          if($grid.getTableData().fullData.length>lengths+1){
            $grid.insertAt({}, lengths+1)
          }else{
            $grid.insertAt({}, -1)
          if (config.handler) {
            config.handler();
          }
          return;
        }
@@ -210,13 +246,27 @@
            }
            return edgeTrimmingItem;
          });
          console.log(edgeTrimmingData)
          formattedData.forEach(item => {
            item.leftTrim = edgeTrimmingData[0].leftTrim;
            item.downTrim = edgeTrimmingData[0].downTrim;
            item.rightTrim = edgeTrimmingData[0].rightTrim;
            item.upTrim = edgeTrimmingData[0].upTrim;
          });
          if (edgeTrimmingData && edgeTrimmingData.length > 0) {
            defaultTrims.leftTrim = edgeTrimmingData[0].leftTrim || 0;
            defaultTrims.downTrim = edgeTrimmingData[0].downTrim || 0;
            defaultTrims.rightTrim = edgeTrimmingData[0].rightTrim || 0;
            defaultTrims.upTrim = edgeTrimmingData[0].upTrim || 0;
            formattedData.forEach(item => {
              item.leftTrim = edgeTrimmingData[0].leftTrim || 0;
              item.downTrim = edgeTrimmingData[0].downTrim || 0;
              item.rightTrim = edgeTrimmingData[0].rightTrim || 0;
              item.upTrim = edgeTrimmingData[0].upTrim || 0;
            });
          } else {
            // å¦‚果没有修边数据,使用默认值0
            formattedData.forEach(item => {
              item.leftTrim = 0;
              item.downTrim = 0;
              item.rightTrim = 0;
              item.upTrim = 0;
            });
          }
        }
        if(state<10){
          gridOptions.columns[3].editRender.attrs.disabled=false
@@ -253,6 +303,13 @@
  });
};
const defaultTrims = reactive({
  leftTrim: 0,
  downTrim: 0,
  rightTrim: 0,
  upTrim: 0
});
onMounted(() => {
  addListener(xGrid.value,gridOptions)
  if(route.params.projectNo!=null){
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/OptimizationRect.vue
@@ -71,10 +71,9 @@
      </div>
    </div>
    <!-- æäº¤æŒ‰é’® -->
    <button @click="submitLayouts" style="position: fixed; top: 90px; right: 20px; padding: 10px; background: #409eff; color: white; border: none; border-radius: 5px; cursor: pointer;">
      ä¿å­˜è°ƒæ•´
    </button>
<!--    <button @click="submitLayouts" style="position: fixed; top: 90px; right: 20px; padding: 10px; background: #409eff; color: white; border: none; border-radius: 5px; cursor: pointer;">-->
<!--      ä¿å­˜è°ƒæ•´-->
<!--    </button>-->
  </div>
</template>
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProcessCard.vue
@@ -338,6 +338,17 @@
  }
}
watch(optionVal, (newVal, oldVal) => {
  if (newVal) {
    // å½“膜系改变时,更新工程名称为当前膜系值
    projectNmae.value = newVal;
    // å½“膜系改变时,自动刷新数据
    selectFlowCardList();
  }
}, { flush: 'post' });
const handleRowClassName = ({ row, rowIndex }) => {
  if (row.patch_state === 1) {
    return 'high-score';
north-glass-erp/northglass-erp/src/views/pp/replenish/AddReplenish.vue
@@ -143,6 +143,7 @@
    {field: 'responsibleEquipment', width: 120, title: t('reportingWorks.responsibleEquipment'), sortable: true,filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
    {field: 'responsibleTeam', width: 120, title: t('reportingWorks.responsibleTeam'), sortable: true,filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
    {field: 'qualityInspector', width: 120, title: t('reportingWorks.qualityInspector'), sortable: true,filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
    {field: 'responsiblePersonnel', width: 120,title: t('rework.responsibilityInformation'), sortable: true,showOverflow:"ellipsis",filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
    {field: 'productName', width: 120, title: t('order.product'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
    {field: 'reportingWorkId', width: 120, title: t('reportingWorks.reportingWorkId'), filters: [{data: ''}], slots: {filter: 'num1_filter'}},
north-glass-erp/northglass-erp/src/views/pp/report/ProductionSchedule.vue
@@ -57,21 +57,20 @@
        ElMessage.warning(t('report.noDataFoundForThisOrder'))
        return
      }
      //gridOptions.columns = JSON.parse(JSON.stringify(columns))
      // åŠ¨æ€æ·»åŠ åˆ—
      res.data.title.forEach((item, index) => {
        let column = { slots: { default: 'quantitySum' }, width: 90, title: item.process,
        let column = {
          slots: { default: 'quantitySum' },
          width: 150,
          title: item.process,
          field: `dynamicColumn${index}` // ä¸ºåŠ¨æ€åˆ—æ·»åŠ å”¯ä¸€çš„ field
        };
        const insertIndex = 5;  // è®¾ç½®æ’入位置的索引
        gridOptions.columns = [
          ...gridOptions.columns.slice(0, insertIndex + index), // å–插入位置之前的部分
          column,
          ...gridOptions.columns.slice(insertIndex + index) // å–插入位置之后的部分
        ];
      });
        }
        gridOptions.columns.push(column)
      })
      res.data.data.forEach(item => {
        item.reportWorkQuantity=JSON.parse(item.reportWorkQuantity)
        item.reportWorkQuantityCount=JSON.parse(item.reportWorkQuantityCount)
        item.reportWorkQuantityShow=JSON.parse(item.reportWorkQuantityShow)
      })
      mergeCells.value = res.data.mergeCell
      xGrid.value.loadData(res.data.data)
@@ -90,17 +89,16 @@
  return sum.toFixed(2);
}
const quantitySum = ( row,column )=>{
  const reportWorkQuantity = row.reportWorkQuantity[column.title] || 0
  const reportWorkQuantityCount = row.reportWorkQuantityCount[column.title] || 0
  if(reportWorkQuantity===reportWorkQuantityCount){
    return reportWorkQuantity
  const reportWorkQuantityCount = row.reportWorkQuantityCount[column.title] || ''
  const reportWorkQuantityShow = row.reportWorkQuantityShow[column.title] || ''
  if(reportWorkQuantityShow === reportWorkQuantityCount ){
    return reportWorkQuantityShow
  }
  return (reportWorkQuantity
  return (reportWorkQuantityShow
      +'('
      +reportWorkQuantityCount
      +')' )
  //return
}
north-glass-erp/src/main/java/com/example/erp/controller/pp/ReportController.java
@@ -159,7 +159,7 @@
    @ApiOperation("生产发货进度")
    @PostMapping("/productionSchedule/{orderId}")
    public Result productionSchedule(@PathVariable String orderId, @RequestBody List<Integer> columns) {
    public Result productionSchedule(@PathVariable String orderId, @RequestBody List<String> columns) {
        return Result.success(reportService.productionScheduleSv(orderId, columns));
    }
north-glass-erp/src/main/java/com/example/erp/mapper/pp/GlassOptimizeMapper.java
@@ -229,4 +229,8 @@
    List<Map<String, Object>> materialOptimizeUse(String processId);
    List<Map<String, Object>> getLayoutSetSv(String processId);
    String selectConfigByUserAndType(String username, int type);
    void insertOptimizeConfig(String json, int type, String userName, String configName);
}
north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java
@@ -943,11 +943,30 @@
            json = object.get("json").toString();
        }
        if(type.equals("钢化")){
            glassOptimizeMapper.updateOptimizeConfig(json,1,username);
            String existingConfig = glassOptimizeMapper.selectConfigByUserAndType(username, 1);
            if (existingConfig == null) {
                String configName = "钢化推荐";
                glassOptimizeMapper.insertOptimizeConfig(json,1,username,configName);
            }else {
                glassOptimizeMapper.updateOptimizeConfig(json,1,username);
            }
        } else if (type.equals("修边")) {
            glassOptimizeMapper.updateOptimizeConfig(json,5,username);
            String existingConfig = glassOptimizeMapper.selectConfigByUserAndType(username, 5);
            if (existingConfig == null) {
                String configName = "修边配置";
                glassOptimizeMapper.insertOptimizeConfig(json,5,username,configName);
            }else {
                glassOptimizeMapper.updateOptimizeConfig(json,5,username);
            }
        }else if (type.equals("磨量")) {
            glassOptimizeMapper.updateOptimizeConfig(json,4,username);
            String existingConfig = glassOptimizeMapper.selectConfigByUserAndType(username, 4);
            if (existingConfig == null) {
                String configName = "磨量配置";
                glassOptimizeMapper.insertOptimizeConfig(json,4,username,configName);
            }else{
                glassOptimizeMapper.updateOptimizeConfig(json,4,username);
            }
        }
        return true;
north-glass-erp/src/main/java/com/example/erp/service/pp/ReportService.java
@@ -666,70 +666,166 @@
        return map;
    }
    public Map<String, Object> productionScheduleSv(String orderId, List<Integer> columns) {
    public Map<String, Object> productionScheduleSv(String orderId, List<String> columns) {
        Map<String, Object> map = new HashMap<>();
        //获取表格内容数据
        map.put("data", reportMapper.productionScheduleMp(orderId));
        List<Map<String, String>> dataList = reportMapper.productionScheduleMp(orderId);
        //获取表头工序筛选数据
        List<Map<String, String>> processFilterList = orderProcessDetailMapper.filterOrderProcess(orderId);
        List<Map<String, String>> processList = processFilterList;
        List<Map<String, String>> uniqueList = orderProcessDetailMapper.filterOrderProcess(orderId);
        List<String> filterList = new ArrayList<>();
        //循环遍历数组,判断此序号当前的工序
        for (int i = 1; i < processFilterList.size(); i++) {
            filterList.add(processFilterList.get(i).get("process"));
            List<Map<String, String>> lastProcessList =
                    orderProcessDetailMapper.filterLastProcess(
                            orderId,
                            String.valueOf(processFilterList.get(i).get("order_number")),
                            String.valueOf(processFilterList.get(i).get("technology_number")),
                            String.valueOf(processFilterList.get(i).get("id"))
                    );
            if (!lastProcessList.isEmpty()) {
                int finalI = i;
                lastProcessList.forEach(lastProcess -> {
                    if (filterList.contains(lastProcess.get("process"))) {
                        processList.add(lastProcess);
                    }
                });
            }
        }
        // ä½¿ç”¨HashSet来记录已经遇到的value值
        Set<String> seenValues = new HashSet<>();
        // åˆ›å»ºä¸€ä¸ªæ–°çš„List来存储结果
        List<Map<String, String>> uniqueList = new ArrayList<>();
        // åå‘遍历原始List
        for (int i = processList.size() - 1; i >= 0; i--) {
            Map<String, String> maps = processList.get(i);
            String value = maps.values().iterator().next(); // å‡è®¾æ¯ä¸ªMap只有一个value
            // å¦‚æžœvalue还没有被看到过,就添加到结果List和HashSet中
            if (!seenValues.contains(value)) {
                uniqueList.add(0, maps); // æ·»åŠ åˆ°ç»“æžœList的开头,以保持原顺序
                seenValues.add(value);
            }
        }
        map.put("title", uniqueList);
        Map<String,Integer> clos = new HashMap<>();
        HashMap<String,HashMap<String,Map<String, Integer>>> rowCount = new HashMap<String,HashMap<String,Map<String, Integer>>>();
        for (int i=0;i<uniqueList.size();i++){
            //根据流程查询基础数据
            BasicData basicData =  basicDataMapper.selectOne(
                    new QueryWrapper<BasicData>()
                            .eq("basic_category","process")
                            .eq("basic_name",uniqueList.get(i).get("process"))
                            .last("limit 1")
            );
            //判断夹胶和夹胶后工序
            //Objects.equals(basicData.getNickname(), "stepA") || Objects.equals(basicData.getNickname(), "stepC")
            if(Objects.equals(basicData.getNickname(), "stepA") || Objects.equals(basicData.getNickname(), "stepC")){
                clos.put(uniqueList.get(i).get("process"), 14+i);
            }
            //判断中空和中空后工序
            //Objects.equals(basicData.getNickname(), "stepB") || Objects.equals(basicData.getNickname(), "stepD")
            if(Objects.equals(basicData.getNickname(), "stepB") || Objects.equals(basicData.getNickname(), "stepD")){
                columns.add("reportWorkQuantity."+uniqueList.get(i).get("process"));
            }
        }
        List<Map<String, Object>> getRowCount = orderProcessDetailMapper.getGlassLRow(orderId);
        List<Map<String, Integer>> rowCount = new ArrayList<>();
        columns.forEach(col -> {
            getRowCount.forEach(row -> {
                Map<String, Integer> getRow = new HashMap<>();
                // { row: 0, col: 1, rowspan: 3, colspan: 0},
                getRow.put("row", ((Number) row.get("RowNum")).intValue());
                getRow.put("col", col);
                getRow.put("rowspan", ((Number) row.get("rowCount")).intValue());
                getRow.put("colspan", 0);
                rowCount.add(getRow);
            });
        HashMap<Integer,Map<String, Object>> getRowCountMap = new HashMap<>();
        getRowCount.forEach(col -> {
            Integer getRowCountOrderNumber = ((Number) col.get("order_number")).intValue();
            getRowCountMap.put(getRowCountOrderNumber, col);
        });
        //循环结果
        for (int i=0;i<dataList.size();i++ ) {
            Integer orderNumber = Integer.parseInt(String.valueOf(dataList.get(i).get("order_number")));
            Integer technologyNumber = Integer.parseInt(String.valueOf(dataList.get(i).get("technology_number")));
            int finalI1 = i;
            columns.forEach(col -> {
                if(rowCount.get(col) == null){
                    rowCount.put(col, new HashMap<String,Map<String,Integer>>());
                }
                if(getRowCountMap.get(orderNumber) != null){
                    Map<String,Object> row = getRowCountMap.get(orderNumber);
                    Map<String, Integer> getRow = new HashMap<>();
                    //判断当前此次 æ˜¯å¦ä¸ºç¬¬ä¸€è¡Œ å¹¶ä¸”相同序号
                    if(technologyNumber==1){
                        getRow.put("rowspan", ((Number) row.get("rowCount")).intValue());
                        getRow.put("colspan", 1);
                    }else{
                        getRow.put("rowspan", 0);
                        getRow.put("colspan", 0);
                    }
                    rowCount.get(col).put(finalI1+"_"+col, getRow);
                }
            });
            Map<String, String> data = JSON.parseObject(dataList.get(i).get("reportWorkQuantity"),
                    new TypeReference<Map<String, String>>() {
                    });
            Map<String, String> dataShow = JSON.parseObject(dataList.get(i).get("reportWorkQuantityShow"),
                    new TypeReference<Map<String, String>>() {
                    });
            //判断后工序此流程卡号是否有次破
            List<DamageDetails> hasBreak = damageDetailsMapper
                    .getNotReview(dataList.get(i).get("processId"),
                            String.valueOf(dataList.get(i).get("order_number")),
                            String.valueOf(dataList.get(i).get("technology_number"))
                    );
            if(!hasBreak.isEmpty()){
                int finalI = i;
                data.forEach((thisProcess, index)->{
                    String behindProcess = orderProcessDetailMapper.getBehindProcess(
                            dataList.get(finalI).get("processId"),
                            String.valueOf(dataList.get(finalI).get("order_number")),
                            String.valueOf(dataList.get(finalI).get("technology_number")),
                            thisProcess,
                            orderId
                    );
                    if(behindProcess!=null &&!behindProcess.isEmpty()){
                        Integer behindDamageSum = damageDetailsMapper.getBehindDamageSum(
                                dataList.get(finalI).get("processId"),
                                String.valueOf(dataList.get(finalI).get("order_number")),
                                String.valueOf(dataList.get(finalI).get("technology_number")),
                                behindProcess,1
                        );
                        if(behindDamageSum>0){
                            data.put(thisProcess, String.valueOf(Integer.parseInt(data.get(thisProcess) )- behindDamageSum));
                            dataShow.put(thisProcess, String.valueOf(Integer.parseInt(dataShow.get(thisProcess) )- behindDamageSum));
                        }
                    }
                });
            }
            //夹胶工序判断合并行数
            if(!clos.isEmpty()){
                Integer max = orderGlassDetailMapper
                        .getMaxTechnologyNumberByGroup(dataList.get(i).get("order_id"),
                                String.valueOf(dataList.get(i).get("order_number")),
                                String.valueOf(dataList.get(i).get("group"))
                        );
                Integer min = orderGlassDetailMapper
                        .getMinTechnologyNumberByGroup(dataList.get(i).get("order_id"),
                                String.valueOf(dataList.get(i).get("order_number")),
                                String.valueOf(dataList.get(i).get("group"))
                        );
                for (String key : clos.keySet()) {
                    if(data.get(key) != null){
                        if (rowCount.get("reportWorkQuantity."+key)==null){
                            rowCount.put("reportWorkQuantity."+key, new HashMap<String,Map<String,Integer>>());
                        }
                        Map<String, Integer> getRow = new HashMap<>();
                        if(min == Integer.parseInt(String.valueOf(dataList.get(i).get("technology_number")))  ){
                            // { row: 0, col: 1, rowspan: 3, colspan: 0},
                            //getRow.put("row", i );
                            getRow.put("rowspan", max-min+1);
                            getRow.put("colspan", 1);
                        }else{
                            getRow.put("rowspan", 0);
                            getRow.put("colspan", 0);
                            data.put(key,"0");
                        }
                        rowCount.get("reportWorkQuantity."+key).put(i+"_reportWorkQuantity."+key, getRow);
                    }
                }
            }
            dataList.get(i).put("reportWorkQuantity",JSON.toJSONString(data));
            dataList.get(i).put("reportWorkQuantityShow",JSON.toJSONString(dataShow));
        }
        map.put("data",dataList );
        map.put("mergeCells", rowCount);
        return map;
north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml
@@ -118,7 +118,7 @@
             a.id as rackNo
         FROM
             pp.flow_card c
                 LEFT JOIN sd.order_detail o ON c.order_id = o.order_id
                 LEFT JOIN sd.order_detail o ON c.order_id = o.order_id and c.order_number = o.order_number
                 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
@@ -211,7 +211,7 @@
                 AND c.technology_number = d.technology_number
                 INNER JOIN pp.optimize_project AS op ON op.project_no = c.project_no
                 LEFT JOIN sd.ORDER o ON o.order_id = c.order_id
                 LEFT JOIN order_detail od ON c.order_id = od.order_id
                 LEFT JOIN sd.order_detail od ON c.order_id = od.order_id
         WHERE
             c.project_no IS NOT NULL
           and c.project_no = #{projectNo}
@@ -251,7 +251,7 @@
                    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 sd.ORDER o ON o.order_id = c.order_id
                    LEFT JOIN order_detail od ON c.order_id = od.order_id
                    LEFT JOIN sd.order_detail od ON c.order_id = od.order_id
                    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
@@ -358,7 +358,7 @@
                AND c.order_number = d.order_number
                AND c.technology_number = d.technology_number
                LEFT JOIN sd.order o on  o.order_id = c.order_id
                LEFT JOIN order_detail od on  c.order_id = od.order_id
                LEFT JOIN sd.order_detail od on  c.order_id = od.order_id and c.order_number = od.order_number
        WHERE
            h.project_no = #{projectNo}
        GROUP BY
@@ -1261,6 +1261,7 @@
            mark_icon,
            isRotate,
            glass_point,
            glass_id,
            rack_no
            ) VALUES (
            #{projectId},
@@ -1280,6 +1281,11 @@
            #{glass.markIcon},
            #{glass.isRotate},
            #{glass.glassPoint},
            CONCAT(
            LPAD(SUBSTR(#{projectId}, 2), 8, '0'),
            LPAD(#{glass.stockSort}, 4, '0'),
            LPAD(#{glass.polySort}, 6, '0')
            ),
            #{glass.rackNo}
            );
        </foreach>
@@ -1515,6 +1521,23 @@
        UPDATE pp.optimize_config set config_detail=#{json},create_time=now()
        where config_type=#{type} and creater=#{username}
    </update>
    <insert id="insertOptimizeConfig">
        INSERT INTO pp.optimize_config (
            config_type,
            config_name,
            creater,
            config_detail,
            state,
            create_time
        ) VALUES (
            #{type},
            #{configName},
            #{userName},
            #{json},
            1,
            now()
        )
    </insert>
    <update id="updateFlowCardRack">
        UPDATE pp.flow_card
        SET rack = #{rackValue}
@@ -1907,6 +1930,7 @@
            od.order_sort AS orderSort,
            od.stock_id AS layoutId,
            od.stock_number AS glassSort,
            od.polys_id AS polySort,
            od.x_axis AS x,
            od.y_axis AS y,
            od.mark_icon AS markIcon,
@@ -1919,7 +1943,7 @@
            o.project AS projectName,
            ord.product_name AS productName,
            ord.building_number AS buildingNumber,
            COALESCE(h.layout_id, 0) as heatLayoutId,
#             COALESCE(h.layout_id, 0) as heatLayoutId,
            od.rack_no AS rackNo
        FROM
            pp.optimize_detail od
@@ -1927,7 +1951,7 @@
                LEFT JOIN sd.order_glass_detail ogd ON (fc.order_id = ogd.order_id and od.order_sort = ogd.order_number AND ogd.technology_number = fc.technology_number)
                LEFT JOIN sd.ORDER o ON o.order_id = fc.order_id
                LEFT JOIN sd.order_detail ord ON (fc.order_id = ord.order_id  and od.order_sort = ord.order_number)
                LEFT JOIN pp.optimize_heat_detail h ON (h.process_id = fc.process_id  and od.order_sort = h.sort)
#                 LEFT JOIN pp.optimize_heat_detail h ON (h.process_id = fc.process_id  and od.order_sort = h.sort)
        WHERE
            od.project_no =  #{projectId}
    </select>
@@ -2063,6 +2087,16 @@
        WHERE
            project_no = #{processId}
    </select>
    <select id="selectConfigByUserAndType" resultType="java.lang.String">
        SELECT
            id,
            config_type,
            config_detail,
            creater
        FROM
            pp.optimize_config
        WHERE creater = #{username} AND config_type = #{type}
    </select>
</mapper>
north-glass-erp/src/main/resources/mapper/pp/PatchLogMapper.xml
@@ -309,7 +309,8 @@
               rw.quality_inspector as qualityInspector,
               ogd.glass_child as glassChild,
               if(dd.responsible_process=rw.this_process,2,dd.quality_ins_status) as qualityInsStatus,
               if(dd.quality_ins_status=1,1,2) as orderBy
               if(dd.quality_ins_status=1,1,2) as orderBy,
               dd.responsible_personnel as responsiblePersonnel
        from pp.damage_details dd
                 left join    pp.reporting_work_detail rwd on dd.reporting_work_id = rwd.reporting_work_id and dd.order_number=rwd.order_number  and dd.technology_number=rwd.technology_number
                 left join pp.reporting_work rw on dd.reporting_work_id = rw.reporting_work_id
north-glass-erp/src/main/resources/mapper/pp/Report.xml
@@ -1033,23 +1033,44 @@
    </select>
    <select id="productionScheduleMp">
        select a.order_number,
               if(a.shape='' || ISNULL(a.shape),'普形',if(a.shape = 1, '普形', if(a.shape = 2, '异形', ''))) as shape,
               a.product_name,
        select a.product_name,
               b.glass_child,
               d.order_type,
               concat(c.process_id, '/', c.technology_number) as process_id,
               c.process_id as 'processId',
                c.order_id,
               c.order_number,
               c.technology_number,
               b.child_width,
               b.child_height,
               c.quantity - ifnull(c.termination_quantity,0) as quantity,
               c.technology_number,
               b.glass_child,
               ifnull(e.reportWorkQuantity, 0)                      as reportWorkQuantity,
               ifnull(e.reportWorkQuantityCount, 0)                 as reportWorkQuantityCount,
               ifnull(f.inventory, 0)                               as inventoryNum,
               round(ifnull(f.inventory, 0) * a.area, 2)            as inventoryArea,
               ifnull(dd.quantity, 0)                               as shippedQuantity,
               ifnull(dd.area, 0)                                   as area,
               ifnull(JSON_UNQUOTE(JSON_EXTRACT(a.other_columns, '$.S01')),'') AS glassNumber
               c.quantity,
        from flow_card as c
               c.quantity-ifnull(c.termination_quantity,0) as thisQuantity,/*用于判断是否改变颜色*/
               e.reportWorkQuantity,
               e.reportWorkQuantityShow,
               e.reportWorkQuantityCount,
               e.reportWorkTime,
               e.broken_num,
               c.quantity-ifnull(c.termination_quantity,0) as glassQuantity,
               c.quantity-ifnull(c.termination_quantity,0) as quantityShow,
               round( (c.quantity-ifnull(c.termination_quantity,0))*a.compute_area,2) as grossAreaShow,
               ifnull(c.received_quantity, 0) as inventoryNum,
               ifnull(dd.quantity, 0) as shippedQuantityShow, -- å‘货数量
               round(ifnull(dd.quantity, 0)*a.compute_area,2) as shippedAreaShow, -- å‘货面积
               round((ifnull(c.received_quantity, 0))*a.compute_area,2)  as inventoryArea,-- å…¥åº“面积
               round((c.quantity-ifnull(c.termination_quantity,0))*a.compute_area,2)as grossArea,
               ifnull(c.received_quantity, 0)                       as Storage,
               ifnull(dd.quantity, 0)                        as shippedQuantity,
               round(ifnull(dd.quantity, 0)*a.compute_area,2)        as shippedArea,
               round((ifnull(c.received_quantity, 0))*a.compute_area,2) as StorageArea,
               ifnull(JSON_UNQUOTE(JSON_EXTRACT(a.other_columns, '$.S01')),'') AS glassNumber,
               b.`group`
        from pp.flow_card as c
                 left join
             sd.order_detail as a
             on c.order_id = a.order_id
@@ -1060,30 +1081,45 @@
                               and c.technology_number = b.technology_number
                 left join sd.`order` as d
                           on c.order_id = d.order_id
                 left join mm.finished_goods_inventory as f
                           on c.order_id = f.order_id and f.order_number = c.order_number
                 left join (SELECT process_id,
                                   order_number,
                                   technology_number,
                                   sum(a.broken_num) as broken_num,
                                   concat('{',
                                          GROUP_CONCAT(concat("\"", process, "\":\"", reporting_work_num, "\"")),
                                          '}'
                                       )             as reportWorkQuantity,
                                   concat('{',
                                          GROUP_CONCAT(concat("\"", process, "\":\"", reporting_work_num_count, "\"")),
                                          '}'
                                       )             as reportWorkQuantityCount
                            FROM sd.order_process_detail as a
                            where a.order_id = #{orderId}
                            GROUP BY process_id, a.order_number,a.technology_number) as e
                           on e.process_id = c.process_id
                                and   e.order_number=c.order_number
                               and e.technology_number = c.technology_number
                 left join sd.delivery_detail as dd on dd.order_id = a.order_id and dd.order_number = a.order_number
        where a.order_id = #{orderId} and d.create_order>0 and c.quantity - ifnull(c.termination_quantity,0)>0
        group by c.order_number,c.technology_number
        ORDER BY a.order_number
            #                  left join mm.finished_goods_inventory as f
#                            on c.order_id = f.order_id and f.order_number = c.order_number
            left join sd.delivery_detail as dd on dd.order_id = a.order_id and dd.order_number = a.order_number
            left join (SELECT process_id,
            order_number,
            technology_number,
            sum(a.broken_num) as broken_num,
            concat('{',
            GROUP_CONCAT(concat("\"", process, "\":\"", if(technology_number!=1 and (bd.nickname='stepD' || bd.nickname='stepB' ) ,0,reporting_work_num), "\"")),
            '}'
            )             as reportWorkQuantity,
            concat('{',
            GROUP_CONCAT(concat("\"", process, "\":\"", reporting_work_num, "\"")),
            '}'
            )             as reportWorkQuantityShow,
            concat('{',
            GROUP_CONCAT(concat("\"", process, "\":\"", reporting_work_num_count, "\"")),
            '}'
            )             as reportWorkQuantityCount,
            concat('{',
            GROUP_CONCAT(concat("\"", process, "\":\"", IFNULL(date(update_time),''), "\"")),
            '}'
            )             as reportWorkTime
            FROM sd.order_process_detail as a
            left join (SELECT DISTINCT basic_name,nickname from sd.basic_data as bd where  bd.basic_category = 'process') as bd
            on a.process = bd.basic_name
            where a.order_id =#{orderId}
            GROUP BY process_id, a.order_number, a.technology_number
            ) as e
            on e.process_id = c.process_id
            and e.technology_number = c.technology_number
            and e.order_number = c.order_number
        where a.order_id = #{orderId} and d.create_order>0 and c.quantity-ifnull(c.termination_quantity,0)>0
        group by c.order_number,
            c.technology_number,
            c.process_id
        order by c.process_id, c.order_number, c.technology_number
    </select>
    <select id="taskCompletionStatusMp">