廖井涛
2025-08-06 547294b0c7a7de8cc84a8a8df297548c7b2f9846
Merge branch 'master' of http://10.153.19.25:10101/r/ERP_override
23个文件已修改
493 ■■■■ 已修改文件
north-glass-erp/northglass-erp/src/components/pp/PrintProcessReplenish.vue 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/sd/order/OrderProcess.vue 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/ar.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/en.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/kr.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/ru.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/lang/zh.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/stores/userInfo.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/utils/request.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/utils/requestOptimize.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/utils/requestTemp.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/LoginView.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizationRectPrint.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeControl.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/OptimizationRect.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectDetail.vue 141 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/processCard/AddProcessCard.vue 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/reportingWorks/AddReportingWork.vue 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/sd/basicData/CreateBasicData.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/sd/order/SelectOrder.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/ReportingWork.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/components/pp/PrintProcessReplenish.vue
@@ -176,7 +176,11 @@
           flowCardCount=produceList.value.length
          handleSummary()
          handleGetQRCode()
          if (name=='天津北玻玻璃工业技术有限公司(TJBB-QR7.1-01)'){
            handleGetQRCodeTj()//天津扫码枪报工需要合并层号二维码
          }else{
            handleGetQRCode()//拆分层号二维码
          }
        } else {
          ElMessage.warning(res.msg)
          router.push("/login")
@@ -185,44 +189,54 @@
    }
)
const handleGetQRCode = async () => {
  for (let i = 0; i < produceList.value.length; i++) {
    const detail = produceList.value[i].detail[0];
    const processId = detail.process_id;
    const mergeStr = detail.mergeTechnologyNumber?.toString() || '';
    const detailItem = produceList.value[i].detail[0];
    const detailList = produceList.value[i].detailList;
    detail.qrcodeList = []; // 初始化
    const mergeTechNumber = detailItem.mergeTechnologyNumber.toString();
    const processId = detailItem.process_id;
    const url = `${processId}/${mergeTechNumber}`;
    for (let j = 0; j < mergeStr.length; j++) {
      const singleTech = mergeStr[j]; // 取出每一位字符
      const url = `${processId}/${singleTech}`;
      const qrcodeData = await QRCode.toDataURL(url);
      detail.qrcodeList.push({
    detailItem.qrcodeList = [];
    //储存层号
    const seenTechNumbers = new Set();
    for (let j = 0; j < detailList.length; j++) {
      const techNum = detailList[j].technology_number;
      //有则跳过
      if (seenTechNumbers.has(techNum)) continue;
      detailItem.qrcodeList.push({
        qrcode: qrcodeData,
        technologyNumber: singleTech
        technologyNumber: techNum
      });
      seenTechNumbers.add(techNum);
    }
  }
};
// const handleGetQRCode = async () => {
//   let technologyNumber=''
//   for (let i = 0; i < produceList.value.length; i++) {
//
//     const technologyNumber = produceList.value[i].detail[0].technologyNumber.toString(); // 转换为字符串以便处理每个字符
//     produceList.value[i].detail[0]["qrcodeList"] = []; // 初始化一个空数组用来存储 QR Code
//     const merge = produceList.value[i].detail[0].mergeTechnologyNumber.toString();
//     const processId = produceList.value[i].detail[0].process_id;
//     const url = `${processId}/${technologyNumber}`;
//     // 生成 QR Code 并存储到数组中
//     const qrcodeData = await QRCode.toDataURL(url);
//     produceList.value[i].detail[0]["qrcodeList"].push({
//       qrcode: qrcodeData,
//       technologyNumber: technologyNumber
//     });
//   }
// };
const handleGetQRCodeTj = async () => {
  let technologyNumber=''
  for (let i = 0; i < produceList.value.length; i++) {
    const technologyNumber = produceList.value[i].detail[0].mergeTechnologyNumber.toString(); // 转换为字符串以便处理每个字符
    produceList.value[i].detail[0]["qrcodeList"] = []; // 初始化一个空数组用来存储 QR Code
    const processId = produceList.value[i].detail[0].process_id;
    const url = `${processId}/${technologyNumber}`;
    // 生成 QR Code 并存储到数组中
    const qrcodeData = await QRCode.toDataURL(url);
    produceList.value[i].detail[0]["qrcodeList"].push({
      qrcode: qrcodeData,
      technologyNumber: technologyNumber
    });
  }
};
//根据输入的数量重新汇总
north-glass-erp/northglass-erp/src/components/sd/order/OrderProcess.vue
@@ -35,13 +35,13 @@
  },
  columns:[
  ],
  mergeCells:[],
  toolbarConfig: {
    slots:{
      buttons: "title"
    },
    zoom: true,
    /*custom: true*/
    // custom: true
  },
  cellClassName ({ row, column,columnIndex})  {
    if (columnIndex>10 && row.thisQuantity*1 === row.reportWorkQuantity[column.title]*1){
@@ -66,7 +66,8 @@
const list = ref([])
let props = defineProps({
  orderId:null
  orderId:null,
  row: {}
})
const columns = [
  {field: 'order_number',fixed:"left", width: 90,title: t('order.OrderNum'),showOverflow:"ellipsis"},
@@ -75,9 +76,9 @@
  {field: 'glass_child',width: 130, title: t('reportingWorks.glassChild') ,filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
  {field: 'order_type', width: 120,title: t('order.orderType'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
  {field: 'process_id',width: 110, title: t('processCard.processId'),filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
  {field: 'technology_number', width: 90,title:  t('processCard.technologyNumber'),showOverflow:"ellipsis"},
  {field: 'child_width', width: 90,title:  t('order.width'),showOverflow:"ellipsis"},
  {field: 'child_height', width: 90,title:  t('order.height'),showOverflow:"ellipsis"},
  {field: 'technology_number', width: 90,title:  t('processCard.technologyNumber'),showOverflow:"ellipsis",filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
  {field: 'child_width', width: 90,title:  t('order.width'),showOverflow:"ellipsis",filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
  {field: 'child_height', width: 90,title:  t('order.height'),showOverflow:"ellipsis",filters:[{ data: '' }],slots: { filter: 'num1_filter' }},
  {field: 'quantity', width: 90,title: t('order.quantity')},
  {field: 'glassQuantity', width: 90,title: t('order.glassQuantity')},
  {field: 'gross_area', width: 90,title: t('order.area')},
@@ -86,7 +87,7 @@
  {field: 'inventoryArea',width: 120, title: t('report.inventoryArea')},
  {field: 'broken_num',width: 90, title: t('reportingWorks.quantityBroken')},
]
let column = [0,1,3,6,7,8,10,11,12,13]
let column = [0,1,3,8,10,11,12,13]
onMounted(()=>{
@@ -126,6 +127,7 @@
      await xGrid.value.setMergeCells(res.data.mergeCells)
      mergeCells.value = res.data.mergeCells
      gridOptions.loading = false
      xGrid.value.commitProxy('reset_custom')
    } else {
      ElMessage.warning(res.msg)
@@ -173,12 +175,17 @@
      +')' )
  //return
}
let showTitle = ref(false)
const changeZoom = ()=> {
  showTitle.value = !showTitle.value
}
</script>
<template>
  <div style="width: 100%;height: 100%">
    <vxe-grid
        @filter-change ='filterChange'
        @zoom="changeZoom"
        height="100%"
        size="mini"
        class="mytable-scrollbar"
@@ -201,6 +208,15 @@
        <span>{{ quantitySum(row,column) }} </span>
      </template>
      <template #title>
        <span style="font-weight: bold" v-show="showTitle">
          {{ row.orderId }}
          {{ row.project?'--':'' }}
          {{row.project}}
          {{ row.batch?'--':'' }}
          {{row.batch}}
        </span>
      </template>
    </vxe-grid>
  </div>
</template>
north-glass-erp/northglass-erp/src/lang/ar.js
@@ -639,6 +639,10 @@
        pleaseNumber8:'الرجاء إدخال الرقم التسلسلي',
        pleaseNumber9:'تصحيح الكمية النهائية أو المعلقة',
        pleaseNumber10:'完工数不能大于流程卡数量',
        pleaseNumber11:'完工+次破数量不能大于可完工数量',
        pleaseNumber12:'本工序报工数:',
        pleaseNumber13:'下工序报工数:',
        pleaseNumber14:'本工序修改数不能小于下工序报工数',
    },
    productStock:{
        page:{
north-glass-erp/northglass-erp/src/lang/en.js
@@ -640,6 +640,10 @@
        pleaseNumber8:'Please enter serial number',
        pleaseNumber9:'Correct number of completions or breakdowns',
        pleaseNumber10:'The number of completions cannot be greater than the number of process cards',
        pleaseNumber11:'完工+次破数量不能大于可完工数量',
        pleaseNumber12:'本工序报工数:',
        pleaseNumber13:'下工序报工数:',
        pleaseNumber14:'本工序修改数不能小于下工序报工数',
    },
    productStock:{
north-glass-erp/northglass-erp/src/lang/kr.js
@@ -648,6 +648,10 @@
        pleaseNumber8:'일련번호를 입력해 주세요',
        pleaseNumber9:'정확한 양품 혹은 불량 수량',
        pleaseNumber10:'양품 수량은 프로세스 카드 총량을 초과할 수 없습니다.',
        pleaseNumber11:'完工+次破数量不能大于可完工数量',
        pleaseNumber12:'本工序报工数:',
        pleaseNumber13:'下工序报工数:',
        pleaseNumber14:'本工序修改数不能小于下工序报工数',
    },
    productStock:{
        page:{
north-glass-erp/northglass-erp/src/lang/ru.js
@@ -637,6 +637,10 @@
        pleaseNumber8:'Введите серийный номер.',
        pleaseNumber9:'Правильное завершение и количество поврежденных',
        pleaseNumber10:'完工数不能大于流程卡数量',
        pleaseNumber11:'完工+次破数量不能大于可完工数量',
        pleaseNumber12:'本工序报工数:',
        pleaseNumber13:'下工序报工数:',
        pleaseNumber14:'本工序修改数不能小于下工序报工数',
    },
    productStock:{
        page:{
north-glass-erp/northglass-erp/src/lang/zh.js
@@ -627,6 +627,7 @@
        passAudit:'审核通过',
        patchCondition:'补片状态',
        changeFailed:'修改失败,请检查是否为报工转移订单',
        hiddenVal:'隐藏',
        selectResponsibleTeam:'请选择责任班组',
@@ -655,7 +656,10 @@
        pleaseNumber8:'请输入序号',
        pleaseNumber9:'正确的完工或次破数量',
        pleaseNumber10:'完工数不能大于流程卡数量',
        pleaseNumber11:'可修改数量不足',
        pleaseNumber11:'完工+次破数量不能大于可完工数量',
        pleaseNumber12:'本工序报工数:',
        pleaseNumber13:'下工序报工数:',
        pleaseNumber14:'本工序修改数不能小于下工序报工数',
    },
    productStock:{
        page:{
north-glass-erp/northglass-erp/src/stores/userInfo.js
@@ -8,7 +8,8 @@
                userName:null,
                userId:null,
                address:null,
                permissions:[]
                permissions:[],
                token:null
            }),
            responseCode:null,
            msg:null
north-glass-erp/northglass-erp/src/utils/request.js
@@ -15,7 +15,7 @@
request.interceptors.request.use(config => {
    config.headers['Content-Type'] = 'application/json;charset=utf-8';
    if(userStore.user){
        config.headers['satoken'] = userStore.user.token;
        config.headers['satoken'] = localStorage.getItem('saToken');
    }
      // 设置请求头
    return config
north-glass-erp/northglass-erp/src/utils/requestOptimize.js
@@ -17,7 +17,7 @@
request.interceptors.request.use(config => {
    config.headers['Content-Type'] = 'application/json;charset=utf-8';
    if(userStore.user){
        config.headers['satoken'] = userStore.user.token;
        config.headers['satoken'] = localStorage.getItem('saToken');
    }
      // 设置请求头
    return config
north-glass-erp/northglass-erp/src/utils/requestTemp.js
@@ -17,7 +17,7 @@
request.interceptors.request.use(config => {
    config.headers['Content-Type'] = 'application/json;charset=utf-8';
    if(userStore.user){
        config.headers['satoken'] = userStore.user.token;
        config.headers['satoken'] = localStorage.getItem('saToken');
    }
      // 设置请求头
    return config
north-glass-erp/northglass-erp/src/views/LoginView.vue
@@ -64,6 +64,7 @@
          userForm).then((res) => {
        if(res['code']==200 && res['data']){
          store.$patch({user:res.data})
          localStorage.setItem('saToken', store.user.token)
          orderInfo.clearSelectDate()
          router.push('/main')
          ElMessage.success(t('login.loginSuccessful'))
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizationRectPrint.vue
@@ -1,6 +1,8 @@
<template>
  <div>
    <el-button id="button" type="primary" @click="handlePrint">打印</el-button>
    <el-button id="button" type="primary" @click="handlePrint" style="position: fixed; top: 90px; right: 20px; padding: 20px; background: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer;">
      打印
    </el-button>
    
    <div ref="printContainer" style="position: relative;">
      <RectRenderer 
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeControl.vue
@@ -11,7 +11,7 @@
  
  
    </div>
    <button @click="submitLayouts" style="position: fixed; bottom: 20px; right: 20px; padding: 10px; background: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer;">
    <button @click="submitLayouts" style="position: fixed; top: 90px; right: 20px; padding: 10px; background: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer;">
      保存OPT
    </button>
  </template>
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/OptimizationRect.vue
@@ -72,7 +72,7 @@
    </div>
    <!-- 提交按钮 -->
    <button @click="submitLayouts" style="position: fixed; bottom: 20px; right: 20px; padding: 10px; background: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer;">
    <button @click="submitLayouts" style="position: fixed; top: 90px; right: 20px; padding: 10px; background: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer;">
      保存调整
    </button>
  </div>
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectDetail.vue
@@ -458,6 +458,7 @@
      return;
    }
    emit('getSmallPieceData', 1);
    optimizeData.value.glassDetails = [];
    xGrid.value.getTableData().fullData.forEach(items=>{
      let rackNoValue = 0;
      if (items.rackNo !== undefined && items.rackNo !== null && items.rackNo !== '') {
@@ -524,6 +525,7 @@
        dialogVisible.value[3] = newValue;
      }
      if (props.CheckboxChangeData!=null && props.CheckboxChangeData.length>0){
        optimizeData.value.materialDetails = [];
        props.CheckboxChangeData.forEach(items=>{
          const detail={
            width :null,
@@ -601,29 +603,10 @@
      const grindingTrimming = res.data.grindingTrimming;
      optimizeState.value=res.data.optimizeState;
      // 加载磨量配置
      loadGrindingConfiguration().then((grindConfig) => {
        console.log("加载的磨量配置:", grindConfig);
        data = data.map(item => {
          // 保留从后端返回的原始磨量值,如果存在的话
          const originalLongGrind1 = item.longGrind1;
          const originalLongGrind2 = item.longGrind2;
          const originalShortGrind1 = item.shortGrind1;
          const originalShortGrind2 = item.shortGrind2;
          // 如果没有原始磨量值,则初始化为0
          item.longGrind1 = originalLongGrind1 !== undefined && originalLongGrind1 !== null ?
              parseFloat(originalLongGrind1) : 0;
          item.longGrind2 = originalLongGrind2 !== undefined && originalLongGrind2 !== null ?
              parseFloat(originalLongGrind2) : 0;
          item.shortGrind1 = originalShortGrind1 !== undefined && originalShortGrind1 !== null ?
              parseFloat(originalShortGrind1) : 0;
          item.shortGrind2 = originalShortGrind2 !== undefined && originalShortGrind2 !== null ?
              parseFloat(originalShortGrind2) : 0;
          // 处理 grindingTrimming 数据(如果存在)
      let processedGrindConfig = null;
          if(grindingTrimming!==null && grindingTrimming.length > 0){
        // 处理 grindingTrimming 数据,去除双引号
            const formattedData = grindingTrimming.map(item => {
              const formattedItem = {};
              for (const key in item) {
@@ -636,48 +619,49 @@
              }
              return formattedItem;
            });
        processedGrindConfig = formattedData[0];
      }
            // 如果有自动填充配置,使用它来设置磨量
            if(formattedData[0].autoFillEdge==="true"){
              const minAutoLenght = parseFloat(formattedData[0].minAutoLenght) || 0;
              const leftEdge = parseFloat(formattedData[0].leftEdge) || 0;
              const rightEdge = parseFloat(formattedData[0].rightEdge) || 0;
              const upEdge = parseFloat(formattedData[0].upEdge) || 0;
              const downEdge = parseFloat(formattedData[0].downEdge) || 0;
      data = data.map(item => {
        // 直接将 grindingTrimming 中的磨量信息写到表中
        if (processedGrindConfig) {
          // 使用 grindingTrimming 中的配置设置磨量
          const leftEdge = parseFloat(processedGrindConfig.leftEdge) || 0;
          const rightEdge = parseFloat(processedGrindConfig.rightEdge) || 0;
          const upEdge = parseFloat(processedGrindConfig.upEdge) || 0;
          const downEdge = parseFloat(processedGrindConfig.downEdge) || 0;
              if(item.width >= minAutoLenght){
                item.longGrind1 = leftEdge;
                item.longGrind2 = rightEdge;
              }
              if(item.height >= minAutoLenght){
                item.shortGrind1 = upEdge;
                item.shortGrind2 = downEdge;
              }
            }
          } else if(grindConfig) {
            // 使用从 getConfiguration 接口加载的配置
            if(grindConfig.autoFillEdge==="true"){
              const minAutoLenght = parseFloat(grindConfig.minAutoLenght) || 0;
              const leftEdge = parseFloat(grindConfig.leftEdge) || 0;
              const rightEdge = parseFloat(grindConfig.rightEdge) || 0;
              const upEdge = parseFloat(grindConfig.upEdge) || 0;
              const downEdge = parseFloat(grindConfig.downEdge) || 0;
          item.longGrind1 = leftEdge;   // 长磨1
          item.longGrind2 = rightEdge;  // 长磨2
          item.shortGrind1 = upEdge;    // 短磨1
          item.shortGrind2 = downEdge;  // 短磨2
              if(item.width >= minAutoLenght){
                item.longGrind1 = leftEdge;
                item.longGrind2 = rightEdge;
          // 如果启用了自动填充功能,根据尺寸判断是否应用磨量
          if(processedGrindConfig.autoFillEdge === "true"){
            const minAutoLength = parseFloat(processedGrindConfig.minAutoLenght) || 0;
            // 如果宽度小于最小自动长度,不应用左右磨量
            if(item.width < minAutoLength){
              item.longGrind1 = 0;
              item.longGrind2 = 0;
              }
              if(item.height >= minAutoLenght){
                item.shortGrind1 = upEdge;
                item.shortGrind2 = downEdge;
            // 如果高度小于最小自动长度,不应用上下磨量
            if(item.height < minAutoLength){
              item.shortGrind1 = 0;
              item.shortGrind2 = 0;
            }
              }
            }else {
              // 即使没有启用自动填充,也应该应用默认的磨量值
              item.longGrind1 = parseFloat(grindConfig.leftEdge) || 0;
              item.longGrind2 = parseFloat(grindConfig.rightEdge) || 0;
              item.shortGrind1 = parseFloat(grindConfig.upEdge) || 0;
              item.shortGrind2 = parseFloat(grindConfig.downEdge) || 0;
            }
          // 如果没有 grindingTrimming 数据,初始化为0
          item.longGrind1 = item.longGrind1 !== undefined && item.longGrind1 !== null ?
              parseFloat(item.longGrind1) : 0;
          item.longGrind2 = item.longGrind2 !== undefined && item.longGrind2 !== null ?
              parseFloat(item.longGrind2) : 0;
          item.shortGrind1 = item.shortGrind1 !== undefined && item.shortGrind1 !== null ?
              parseFloat(item.shortGrind1) : 0;
          item.shortGrind2 = item.shortGrind2 !== undefined && item.shortGrind2 !== null ?
              parseFloat(item.shortGrind2) : 0;
          }
          item.height=parseFloat(item.height.toFixed(2))
@@ -686,14 +670,14 @@
          return item;
        });
        console.log("处理后的数据:", data);
        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
      });
      // 更新 optimizeData 中的磨量配置
      updateOptimizeDataWithGrindingConfig(processedGrindConfig);
    } else {
      ElMessage.warning(res.msg);
    }
@@ -702,6 +686,19 @@
  });
};
const updateOptimizeDataWithGrindingConfig = (grindConfig) => {
  if (grindConfig) {
    // 更新 optimizeData 中的磨量配置
    optimizeData.value.grindingConfig = {
      leftEdge: parseFloat(grindConfig.leftEdge) || 0,
      upEdge: parseFloat(grindConfig.upEdge) || 0,
      rightEdge: parseFloat(grindConfig.rightEdge) || 0,
      downEdge: parseFloat(grindConfig.downEdge) || 0,
      autoFillEdge: grindConfig.autoFillEdge === "true",
      minAutoLength: parseFloat(grindConfig.minAutoLenght) || 0
    };
  }
};
const firstLoading = async() => {
  request.post(`/glassOptimize/selectOptimizeParms/${username}`).then((res) => {
@@ -798,6 +795,7 @@
  });*/
};
const grindingConfig = ref(null);
const loadGrindingConfiguration = async () => {
  return new Promise((resolve) => {
@@ -817,10 +815,11 @@
            }
            return formattedItem;
          });
          // 保存磨量配置
          grindingConfig.value = formattedData[0];
          resolve(formattedData[0]);
        } else {
          // 提供默认配置
          resolve({
          const defaultConfig = {
            leftEdge: '0',
            upEdge: '0',
            rightEdge: '0',
@@ -828,12 +827,13 @@
            quickEdge: '1',
            autoFillEdge: 'false',
            minAutoLenght: '0'
          });
          };
          grindingConfig.value = defaultConfig;
          resolve(defaultConfig);
        }
      } else {
        ElMessage.warning(res.msg);
        // 提供默认配置
        resolve({
        const defaultConfig = {
          leftEdge: '0',
          upEdge: '0',
          rightEdge: '0',
@@ -841,11 +841,12 @@
          quickEdge: '1',
          autoFillEdge: 'false',
          minAutoLenght: '0'
        });
        };
        grindingConfig.value = defaultConfig;
        resolve(defaultConfig);
      }
    }).catch(() => {
      // 提供默认配置
      resolve({
      const defaultConfig = {
        leftEdge: '0',
        upEdge: '0',
        rightEdge: '0',
@@ -853,7 +854,9 @@
        quickEdge: '1',
        autoFillEdge: 'false',
        minAutoLenght: '0'
      });
      };
      grindingConfig.value = defaultConfig;
      resolve(defaultConfig);
    });
  });
};
north-glass-erp/northglass-erp/src/views/pp/processCard/AddProcessCard.vue
@@ -218,7 +218,8 @@
    storage: true
  },
  sortConfig: {
    multiple: true
    multiple: true,
    chronological: true
  },
  editConfig: {
    trigger: 'click',
@@ -283,12 +284,6 @@
  ],//表头按钮
  toolbarConfig: {
    slots:{
      buttons: "toolbar_buttons"
    },
    buttons: [{
    }],
    // import: false,
    // export: true,
    // print: true,
@@ -323,54 +318,6 @@
})
const gridEventsRight = {
  toolbarButtonClick({code}) {
    const $grid = xGridLeft.value
    if ($grid) {
      switch (code) {
        case 'sorting': {
          request.post(`/processCard/selectSortingCard/${orderId}/${productionId}/${flashback.value}/${optionVal.value}`, filterData.value).then((res) => {
            if (res.code == 200) {
              pageTotal.value = res.data.total
              maxProcseeId = res.data.maxFlowCard[0].process_id
              orderOtherMoney.value = res.data.orderOtherMoney
              //已有的不添加
              const dynamicFields = orderOtherMoney.value.map(item => item.column)
              gridOptions.columns = gridOptions.columns.filter(col => !dynamicFields.includes(col.field))
              // 添加新的动态列
              orderOtherMoney.value.forEach(item => {
                let column = {
                  field: `${item.column}`,
                  width: 100,
                  title: item.alias,
                  filters: [{data: ''}],
                  slots: {filter: 'num1_filter'},
                  filterMethod: filterChanged,
                  sortable: true
                }
                gridOptions.columns.push(column)
              })
              produceList = res.data.data
              produceList.forEach(item => {
                item.shape = (item.shape == 2) ? t('order.alien') : t('order.universalShape');
              })
              xGrid.value.reloadData(produceList)
              gridOptions.loading = false
            } else {
              ElMessage.warning(res.msg)
            }
          })
          return;
        }
      }
    }
  },
  formSubmit () {
    let form = gridOptions.formConfig.data
    form.orderId =orderId
@@ -1138,46 +1085,6 @@
                @checkbox-all="handleCheckboxChange"
                @checkbox-range-end="handleCheckboxChange"
            >
              <!-- 自定义 toolbar_buttons 插槽 -->
              <template #toolbar_buttons="{ $grid }">
                <!-- 手动写出所有按钮 -->
                &nbsp;
                <el-select
                    :default-first-option="true"
                    ref="getSelect" style="width: 80px"
                    v-model="optionVal"
                    class="m-2"
                >
                  <el-option
                      v-for="item in options"
                      :key="item.value"
                      :label="item.label"
                      :value="item.value"
                  />
                </el-select>
                &nbsp;
                <el-button
                    type="primary"
                    style="margin-right:8px;width: 50px"
                    @click="$grid.dispatchEvent('toolbar-button-click', { code: 'sorting' })"
                >
                  {{ t('processCard.sorting') }}
                </el-button>
                <el-checkbox
                    :model-value="flashback === 0"
                    @change="onFlashbackChange"
                >
                  {{ t('processCard.flashback') }}
                </el-checkbox>
              </template>
              <!--      @toolbar-button-click="toolbarButtonClickEvent"-->
              <!--      下拉显示所有信息插槽-->
north-glass-erp/northglass-erp/src/views/pp/reportingWorks/AddReportingWork.vue
@@ -2,7 +2,7 @@
import {computed, nextTick, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
import {useRouter,useRoute} from 'vue-router'
import request from "@/utils/request";
import {ElMessage} from "element-plus";
import {ElCheckbox, ElMessage} from "element-plus";
import {changeFilterEvent, filterChanged} from "@/hook"
import domZIndex from 'dom-zindex'
import {indexOf} from "xe-utils";
@@ -21,6 +21,9 @@
const router = useRouter()
const route = useRoute()
const user=userInfo()
//是否复合工序
const laminating = ref(null)
//定义表头数据
const titleUploadData = ref({
  //是否合片工序
@@ -76,6 +79,9 @@
let layer=''
let technologicalProcess=''
let processName = ref([])
//隐藏全部完工序号
let  hiddenVal = ref(1)
//定义接收加载表头下拉数据
const titleSelectJson = ref({
@@ -420,7 +426,7 @@
            return new Error(t('reportingWorks.enterIntegerGreaterThanEqualTo'))
            //完工+次破数量不能大于可完工数量
          }else if((row.completedQuantity*1+brokenNum*1)>row.quantity*1){
            return new Error((`完工+次破数量不能大于可完工数量`))
            return new Error(t('reportingWorks.pleaseNumber11'))
            //本次完工数量不能大于完工数量
          }else  if(row.quantity_card<row.completedQuantity){
            return new Error(t('reportingWorks.pleaseNumber10'))
@@ -438,9 +444,9 @@
          //当可操作数量为0,并且完工数量不等于可完工数量时
          if(row.minQuantity===0 && val!==totalQuantity ){
            return new Error(`本工序报工数:${okVal}+${val}=${okVal+val}\n
                              下工序报工数:${nextQuantitySum}\n
                              本工序修改数不能小于下工序报工数
            return new Error(`${t('reportingWorks.pleaseNumber12')} ${okVal}+${val}=${okVal+val}\n
                              ${t('reportingWorks.pleaseNumber13')} ${nextQuantitySum}\n
                              ${t('reportingWorks.pleaseNumber14')}
            `)
          }
          if(titleUploadData.value.reportingWorkId!=null  && (val>totalQuantity ||  val<(row.quantity-row.minQuantity) )){
@@ -458,6 +464,9 @@
      {code: 'saveReportingWorkReview', name: t('reportingWorks.saveAndReview'), status: 'primary', icon: 'vxe-icon-save',disabled:true},
      {code: 'saveWorkStorage', name: t('reportingWorks.saveWorkStorage'), status: 'primary', icon: 'vxe-icon-save'},
    ],
    // slots: {
    //   tools: 'toolbar_buttons'
    // },
    zoom: true,
    custom: true
  },
@@ -1282,9 +1291,9 @@
      //绑定下方表格
      detail.value = res.data.Detail
      // 使用map方法来处理每个对象
      let modifiedCollection = detail.value.map(item => {
      let modifiedCollection = res.data.Detail.map(item => {
        if (item.reviewed_state === 1) {
          return { ...item, reviewed_state: "已审核" };
        }
@@ -1296,8 +1305,12 @@
          return item;
        }
      });
      xGrid.value.reloadData(modifiedCollection)
      detail.value = modifiedCollection
      xGrid.value.reloadData(detail.value)
      hideButton()
      // nextTick(() => {
      //   hiddenCompletedOk()
      // })
    } else {
      ElMessage.warning(res.msg)
    }
@@ -1483,7 +1496,7 @@
  const seen = new Set();
  const result = rawData.filter(item => {
    // 1. 先把 completedQuantity 为 0 的剔除
    if (item.completedQuantity === 0) {
    if (item.completedQuantity === 0 || item.completedQuantity =="0" || item.completedQuantity =="") {
      return false;
    }
    // 2. 遇到相同 order_number,只保留第一次,后面都丢弃
@@ -1585,6 +1598,29 @@
  }
}
const onHiddenChange = (checked) => {
  hiddenVal.value = checked ? 1 : 0
  hiddenCompletedOk()
}
const hiddenCompletedOk = () => {
  const $grid = xGrid.value
  const data = $grid.getTableData().fullData
  const laminating = titleUploadData.value.laminating
  const filteredData = data.filter(row => {
    return row.completedQuantity>0 //过滤可完工数量为0的
  })
  if (laminating == ''){
    if (hiddenVal.value == 1){
      // 重新加载过滤后的数据
      $grid.loadData(filteredData)
    }else {
      //原始数据
      $grid.loadData(detail.value);
    }
  }
}
</script>
@@ -1793,7 +1829,15 @@
            </div>
          </div>
        </template>
        <template #toolbar_buttons>
          <el-checkbox
              :model-value="hiddenVal === 1"
              @change="onHiddenChange"
          >
            {{ t('reportingWorks.hiddenVal') }}
          </el-checkbox>
          &nbsp;&nbsp;
        </template>
      </vxe-grid>
    </div>
north-glass-erp/northglass-erp/src/views/sd/basicData/CreateBasicData.vue
@@ -229,6 +229,11 @@
          <el-option  :label="$t('orderBasicData.laminatingProcessB')" value="stepB" />
          <el-option  :label="$t('orderBasicData.laminatingProcessC')" value="stepC" />
          <el-option  :label="$t('orderBasicData.laminatingProcessD')" value="stepD" />
<!--          <el-option  :label="$t('orderBasicData.laminatingProcessC')" value="stepA" />夹胶工序-->
<!--          <el-option  :label="$t('orderBasicData.laminatingProcessA')" value="stepB" />-->
<!--          <el-option  :label="$t('orderBasicData.laminatingProcessD')" value="stepC" />-->
<!--          <el-option  :label="$t('orderBasicData.laminatingProcessB')" value="stepD" />-->
        </el-select>
      </el-col>
    </el-row>
north-glass-erp/northglass-erp/src/views/sd/order/SelectOrder.vue
@@ -750,6 +750,7 @@
          <order-process
              v-if="tabsValue==='3'"
              :orderId="rowClickIndex===null?null:rowClickIndex.orderId"
              :row="rowClickIndex===null?{}:rowClickIndex"
          />
        </el-tab-pane>
      </el-tabs>
north-glass-erp/src/main/java/com/example/erp/service/pp/GlassOptimizeService.java
@@ -312,22 +312,26 @@
    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){
            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("project", glassOptimizeMapper.selectProjectCount(projectNo));
            map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming(username));
        } else{
//        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("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("project", glassOptimizeMapper.selectProjectCount(projectNo));
//            map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming(username));
//        }
            map.put("optimizeState", Integer.parseInt(stringObjectMap.get("optimize_state").toString()));
            map.put("data", glassOptimizeMapper.firstOptimization(projectNo));
            map.put("project", glassOptimizeMapper.selectProjectCount(projectNo));
            map.put("grindingTrimming", glassOptimizeMapper.getGrindingTrimming(username));
        }
        return map;
    }
north-glass-erp/src/main/resources/mapper/pp/GlassOptimize.xml
@@ -243,7 +243,7 @@
    <select id="getOptimizeDetail">
        SELECT
            h.project_no,
            h.heat_layout_id as rackNo,
            h.rack_no as rackNo,
            h.o_width AS width,
            h.o_height AS height,
            (h.height-h.o_height)/2 as shortGrind1,
@@ -280,14 +280,14 @@
            h.project_no =#{projectNo}
        GROUP BY
            h.project_no,
            h.heat_layout_id,
            h.rack_no,
            h.width,
            h.height,
            h.process_id,
            h.layer,
            c.order_number
        ORDER BY
            h.heat_layout_id;
            h.rack_no;
    </select>
    <!--工程信息流程卡-->
@@ -1118,7 +1118,8 @@
            x_axis,
            y_axis,
            patch_state,
            mark_icon
            mark_icon,
            rack_no
            ) VALUES (
            #{projectId},
            #{glass.processId},
@@ -1134,7 +1135,8 @@
            #{glass.x},
            #{glass.y},
            #{glass.patchState},
            #{glass.markIcon}
            #{glass.markIcon},
            #{glass.rackNo}
            );
        </foreach>
    </insert>
north-glass-erp/src/main/resources/mapper/pp/ReportingWork.xml
@@ -512,7 +512,8 @@
                  and g.technology_number = a.technology_number
        </if>
        where b.reporting_work_id = #{reportingWorkId}
        GROUP BY c.order_number,c.technology_number) as result
        GROUP BY c.order_number,c.technology_number
        order BY c.order_number,c.technology_number) as result
    </select>
<select id="selectReportingWorkMp" resultMap="reportingWorkMap">
    select rw.reporting_work_id,