guoyuji
2025-03-10 46bf33053daa5f2bfe163822ce4f793f669024f8
north-glass-erp/northglass-erp/src/views/pp/processCard/AddProcessCard.vue
@@ -12,38 +12,17 @@
import BasicTable from '@/components/sd/product/BasicTable.vue'
import {VXETable} from "vxe-table";
import useUserInfoStore from "@/stores/userInfo";
import { useI18n } from 'vue-i18n'
import {useI18n} from 'vue-i18n'
import footSum from "@/hook/footSum"
import {changeFilterEvent,filterChanged} from "@/hook"
import userInfo from "@/stores/userInfo"
//语言获取
const { t } = useI18n()
const {t} = useI18n()
let productGlassTypeStore = useProductGlassTypeStore()
let router = useRouter()
const userStore = useUserInfoStore()
const username = userStore.user.userName
const getTableRow = (row, type) => {
  switch (type) {
    case 'edit' : {
      router.push({path: '/main/processCard/PrintFlowCard', query: {id: row.id}})
      break
    }
    case 'setType': {
      alert('我接收到子组件传送的删除信息')
      break
    }
    case 'delete': {
      request.post(`/processCard/deleteFlowCard/${row.orderId}/${row.processId}`).then((res) => {
        if (res.code == 200) {
          ElMessage.success(t('workOrder.deleteOk'))
          location.reload();
        } else {
          ElMessage.warning(res.msg)
         // router.push("/login")
        }
      })
      break
    }
  }
}
const user=userInfo()
let flag = $ref(true)
function intoCreateProduct() {
@@ -92,16 +71,35 @@
const {currentRoute} = useRouter()
const route = currentRoute.value
let orderId = route.query.orderId
let productionId = route.query.productionId
const orderId = route.query.orderId
const productionId = route.query.productionId
const orderQuantity = route.query.quantity
const orderOtherMoney = ref(null)
let maxProcseeId=null
//第一次加载数据
request.post(`/processCard/selectNoCard/${orderId}/${productionId}`, 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
    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 = produceList.value.concat(deepClone(res.data.data))
    xGrid.value.reloadData(produceList)
    gridOptions.loading = false
@@ -110,11 +108,7 @@
  }
})
/*使用筛选,后端获取数据*/
const changeFilterEvent = (event, option, $panel,) => {
  // 手动触发筛选
  $panel.changeOption(event, !!option.data, option)
}
function padLeftZero(str) {
  return ('00' + str).substr(str.length)
@@ -128,14 +122,7 @@
}
//筛选方法
const filterChanged = ({option, row, column}) => {
  if (option.data) {
    return row[column.field].toString().toLowerCase().indexOf(option.data) > -1
  }
  return true
  //@filter-change="filterChanged"
}
//右侧子组件接收参数
const xGrid = ref()
@@ -144,8 +131,8 @@
  keepSource: true,//保持源数据
  align: 'center',//文字居中
  stripe: true,//斑马纹
  rowConfig: {isCurrent: true, isHover: true, height: 30},//鼠标移动或选择高亮
  id: 'CustomerList',
  rowConfig: {isCurrent: true, isHover: true, height: 30, useKey: false},//鼠标移动或选择高亮
  id: 'AddProcessCardRight',
  showFooter: true,//显示脚
  printConfig: {},
  importConfig: {},
@@ -159,8 +146,59 @@
  filterConfig: {   //筛选配置项
                    //remote: true
  },
  formConfig: {
    data: {
      shelfThickness: 800,
      spacerThickness: 0,
      inWeight: 4000,
      inMaxQuantity: 20,
      inLenMin:400,
      inLenMax:3500,
      inShortMax:2500,
      inShortMin:400
    },
    rules:{
      shelfThickness: [
        { required: true, message: t('basicData.msg.greater0'),type:'number',pattern:/^[1-9]\d*$/ }
      ],
      spacerThickness: [
        { required: true, message: t('delivery.pleaseEnterANumericalValueGreaterThanOrEqualTo0'),type:'number',pattern:/^[0-9]\d*$/ }
      ],
      inWeight: [
        { required: true, message: t('basicData.msg.greater0'),type:'number',pattern:/^[1-9]\d*$/ }
      ],
      inMaxQuantity: [
        { required: true, message: t('basicData.msg.greater0'),type:'number',pattern:/^[1-9]\d*$/ }
      ]
    },
    items:[
      { field: 'shelfThickness', title: '架子纵深(mm)', itemRender: { name: 'VxeInput' },span:8,folding: true},
      { field: 'inWeight', title: '架子承重(KG)', itemRender: { name: 'VxeInput' },span:8,folding: true },
      { field: 'spacerThickness', title: '间隔厚度(mm)', itemRender: { name: 'VxeInput' } ,span:8,folding: true},
      { field: 'inLenMax', title: '长边最大(mm)', itemRender: { name: 'VxeInput' },span:8,folding: true },
      { field: 'inLenMin', title: '长边最短(mm)', itemRender: { name: 'VxeInput' },span:8,folding: true },
      { field: 'inMaxQuantity', title: '最大数量', itemRender: { name: 'VxeInput' } ,span:8,folding: true},
      { field: 'inShortMax', title: '短边最大(mm)', itemRender: { name: 'VxeInput' },span:8,folding: true },
      { field: 'inShortMin', title: '短边最短(mm)', itemRender: { name: 'VxeInput' },span:8,folding: true },
      {
        span: 24,
        collapseNode: true,
        align: 'center',
        itemRender: {
          name: 'VxeButtonGroup',
          options: [
            { type: 'submit', content: '智能分架', status: 'primary' },
            { type: 'reset', content: '重置' }
          ]
        }
      }
    ]
  },
  customConfig: {
    storage: true
  },
  sortConfig: {
    multiple: true
  },
  editConfig: {
    trigger: 'click',
@@ -168,13 +206,14 @@
    showStatus: true
  },//表头参数
  columns: [
    {type: 'checkbox', fixed: "left", title: t('basicData.check')},
    {type: 'checkbox', fixed: "left", title: t('basicData.check'), width: '80px'},
    {
      field: 'orderNumber',
      title: t('order.OrderNum'),
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      filterMethod: filterChanged
      filterMethod: filterChanged,
      width: '100px'
    },
    {
      field: 'shape',
@@ -182,7 +221,8 @@
      showOverflow: "ellipsis",
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      filterMethod: filterChanged
      filterMethod: filterChanged,
      width: '70px'
    },
    {
      field: 'width',
@@ -191,7 +231,7 @@
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      filterMethod: filterChanged,
      width: '60px'
      width: '78px'
    },
    {
      field: 'height',
@@ -200,13 +240,26 @@
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      filterMethod: filterChanged,
      width: '60px'
      width: '78px'
    },
    {field: 'baiscQuantity', title: t('processCard.quantityToDivided'), showOverflow: "ellipsis", width: '60px'},
    {field: 'computeGrossArea', title: t('processCard.areaToDivided'), width: '60px'},
    {
      field: 'building_number',
      title: t('order.buildingNumber'),
      sortable: true,
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      filterMethod: filterChanged,
      width: '120px'
    },
    {field: 'baiscQuantity', title: t('processCard.quantityToDivided'), showOverflow: "ellipsis", width: '80px'},
    {field: 'computeGrossArea', title: t('processCard.areaToDivided'), width: '80px'},
    {field: 'totalThickness', title: t('processCard.totalThickness'), width: '80px'},
    {field: 'thickness', title: t('processCard.glassThickness'), width: '60px'},
    {field: 'weight', title: t('processCard.weight')}
    {field: 'thickness', title: t('processCard.glassThickness'), width: '80px'},
    {field: 'weight', title: t('processCard.weight'), slots: {default: 'weight_sum'}, width: '85px'},
    {field: 'remarks', title: t('processCard.notes'),  width: '85px',filters: [{data: ''}], slots: {filter: 'num1_filter'},filterMethod: filterChanged},
    {field: 'processing_note', title: t('order.processingNote'),  width: '105px',filters: [{data: ''}], slots: {filter: 'num1_filter'},filterMethod: filterChanged},
    {field: 'bend_radius', title: t('order.bendRadius'),  width: '120px',filters: [{data: ''}], slots: {filter: 'num1_filter'},filterMethod: filterChanged,sortable: true,}
  ],//表头按钮
  toolbarConfig: {
@@ -221,22 +274,51 @@
  },
  data: [],//table body实际数据
  //脚部求和
  footerMethod({columns, data}) {//页脚函数
    let footList = ['', '', '', '', '']
    let count = 0
    return [
      columns.map((column, columnIndex) => {
        if (columnIndex === 0) {
          return t('basicData.total')
        }
        if (footList.includes(column.field)) {
          return sumNum(data, column.field)
        const List = ["baiscQuantity", 'computeGrossArea']
        if (List.includes(column.field)) {
          return footSum(data, column.field)
        }
        if (column.field === 'weight') {
          data.forEach(row => {
            count += weightSum(row)
          })
          return parseFloat(count.toFixed(2))
        }
        return ''
      })
    ]
  }
  },
})
const gridEventsRight = {
  formSubmit () {
    let form = gridOptions.formConfig.data
    form.orderId =orderId
    form.productionId = productionId
    request.post(`/processCard/processCardAutoRack`,form).then(res => {
      xGridLeft.value.reloadData(res.data.orderDetailList)
      xGrid.value.reloadData(res.data.orderDetailsNotScope)
    })
  },
  formReset () {
    router.push({
      path: '/main/processCard/AddProcessCard',
      query: {orderId: orderId,
        productionId: productionId,
        random:Math.random()
      }
    })
  }
}
//左侧子组件接收参数
const xGridLeft = ref()
@@ -245,8 +327,8 @@
  keepSource: true,//保持源数据
  align: 'center',//文字居中
  stripe: true,//斑马纹
  rowConfig: {isCurrent: true, isHover: true, height: 30},//鼠标移动或选择高亮
  id: 'CustomerList',
  rowConfig: {isCurrent: true, isHover: true, height: 30, useKey: false},//鼠标移动或选择高亮
  id: 'AddProcessCardLeft',
  showFooter: true,//显示脚
  printConfig: {},
  importConfig: {},
@@ -269,14 +351,14 @@
    showStatus: true
  },//表头参数
  columns: [
    {type: 'checkbox', fixed: "left", title: t('basicData.check')},
    {type: 'checkbox', fixed: "left", title: t('basicData.check'),width: 78},
    {
      field: 'processId',
      title: t('processCard.processId'),
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      width: 130,
      filterMethod: filterChanged
      width: 135,
      filterMethod: filterChanged,
    },
    {
      field: 'orderNumber',
@@ -284,20 +366,38 @@
      showOverflow: "ellipsis",
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'}
      , filterMethod: filterChanged
      , filterMethod: filterChanged,
      width: 98
    },
    {
      field: 'landingSequence',
      title: '落架顺序',
      title: t('processCard.landingSequence'),
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      filterMethod: filterChanged
      filterMethod: filterChanged,
      width: 99
    },
    {field: 'shape', title: t('order.shape'), filters: [{data: ''}], slots: {filter: 'num1_filter'}, filterMethod: filterChanged},
    {field: 'width', title: t('order.width'), showOverflow: "ellipsis"},
    {field: 'height', title: t('order.height')},
    {field: 'quantity', title: t('order.quantity')},
    {field: 'totalThickness', title: t('processCard.totalThickness')},
    {
      field: 'shape',
      title: t('order.shape'),
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      filterMethod: filterChanged,
      width:70
    },
    {
      field: 'building_number',
      title: t('order.buildingNumber'),
      sortable: true,
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      filterMethod: filterChanged,
      width: '120px'
    },
    {field: 'width', title: t('order.width'), showOverflow: "ellipsis",width:70},
    {field: 'height', title: t('order.height'),width:70},
    {field: 'quantity', title: t('order.quantity'),width:70},
    {field: 'totalThickness', title: t('processCard.totalThickness'),width:70},
  ],//表头按钮
  toolbarConfig: {
@@ -313,14 +413,14 @@
  data: [],//table body实际数据
  //脚部求和
  footerMethod({columns, data}) {//页脚函数
    let footList = ['']
    return [
      columns.map((column, columnIndex) => {
        if (columnIndex === 0) {
          return t('basicData.total')
        }
        if (footList.includes(column.field)) {
          return sumNum(data, column.field)
        const List = ["quantity", 'goodsQuantity', 'area']
        if (List.includes(column.field)) {
          return footSum(data, column.field)
        }
        return ''
      })
@@ -347,7 +447,32 @@
    index = leftData[0].landingSequence + 1
    //index = index.toString().padStart(2, '0')
  }
  const processId = productionId + index.toString().padStart(3, '0')
  let processId= null
  // if (leftData.length !== 0){
  //   processId = productionId + index.toString().padStart(3, '0')
  // }
  // else {
    if (maxProcseeId!== null || maxProcseeId!== undefined|| maxProcseeId!== ''){
      if (leftData.length !== 0){
        const str=leftData[0].processId
        const lastThree = str.slice(-3);
        const result =  lastThree*1 + 1;
        processId= productionId + result.toString().padStart(3, '0')
      }
      else {
        // 截取后三位
        const lastThree = maxProcseeId.slice(-3);
        const result =  lastThree*1 + 1;
        processId= productionId + result.toString().padStart(3, '0')
      }
    }
    else {
      processId = productionId + index.toString().padStart(3, '0')
    }
  //}
  const regex = /^(\d+|)$/;
  if (!regex.test(checkedNum.value)) {
    ElMessage.warning(t('processCard.schedulingNo'))
@@ -357,30 +482,29 @@
  if (/^[1-9]\d*$/.test(checkedNum.value)) {
    checkedList.forEach((item) => {
      //定义key值保持
      //判断可用数量是否大于等于输入的数量,不满足则抛出异常
      if (item.baiscQuantity * 1 < checkedNum.value * 1) throw new Error(t('processCard.schedulingQuantity'));
      item.quantity =  checkedNum.value
      item.quantity = checkedNum.value
      item.processId = processId
      item.landingSequence = index
      item.baiscQuantity=item.baiscQuantity - checkedNum.value
    })
    //删除key
    checkedList.forEach((item) => {
      item.baiscQuantity = item.baiscQuantity - checkedNum.value
      item.computeGrossArea = (item.computeGrossArea - item.width * item.height * checkedNum.value / 1000000).toFixed(2)
      //删除key
      let key = item._X_ROW_KEY
      delete item._X_ROW_KEY
      if (item.baiscQuantity===0){
        $grid.remove(checkedList)
      if (item.baiscQuantity === 0) {
        $grid.remove(item)
      }
      $gridLeft.insertAt(checkedList)
      $gridLeft.insertAt(item)
      //重新赋值key
      item._X_ROW_KEY = key
    })
//清除两边复选框
    //清除两边复选框
    $gridLeft.clearCheckboxRow()
    $grid.clearCheckboxRow()
  }
  else if (checkedNum.value === '') {//判断数量输入框无输入数字
  } else if (checkedNum.value === '') {//判断数量输入框无输入数字
    checkedList.forEach((item) => {
      item.processId = processId
@@ -397,11 +521,79 @@
    $gridLeft.clearCheckboxRow()
    $grid.clearCheckboxRow()
  }
  if (checkedNum.value){
    checkedNum.value =''
  }
}
//按编号创建流程卡
const createProcessCardNo = () => {
  const $grid = xGrid.value
  const checkedList = $grid.getCheckboxRecords()
  if (checkedList.length === 0) {
    ElMessage.warning(t('processCard.schedulingOk'))
    return
  }
  //productionId
  const $gridLeft = xGridLeft.value
  const leftData = $gridLeft.getTableData().fullData
  let index = 0
  if (leftData.length !== 0) {
    index = leftData[0].landingSequence + 1
    //index = index.toString().padStart(2, '0')
  }
  let processId= null
  if (maxProcseeId!== null || maxProcseeId!== undefined|| maxProcseeId!== ''){
    if (leftData.length !== 0){
      const str=leftData[0].processId
      const lastThree = str.slice(-3);
      const result =  lastThree*1 + 1;
      processId= productionId + result.toString().padStart(3, '0')
    }
    else {
      // 截取后三位
      const lastThree = maxProcseeId.slice(-3);
      const result =  lastThree*1 + 1;
      processId= productionId + result.toString().padStart(3, '0')
    }
  }
  else {
      processId = productionId + index.toString().padStart(3, '0')
  }
  const regex = /^(\d+|)$/;
  if (!regex.test(checkedNum.value)) {
    ElMessage.warning(t('processCard.schedulingNo'))
    return
  }
    checkedList.forEach((item) => {
      index++
      processId = productionId + index.toString().padStart(3, '0')
      item.processId = processId
      item.landingSequence = index
      item.quantity = item.baiscQuantity
    })
    //删除key
    checkedList.forEach((item) => {
      delete item._X_ROW_KEY
    })
    $gridLeft.insertAt(checkedList)
    $grid.remove(checkedList)
    //清除两边复选框
    $gridLeft.clearCheckboxRow()
    $grid.clearCheckboxRow()
}
//向右边表格添加数据
@@ -428,7 +620,10 @@
      //对选中的左边表格数据进行循环
      checkedList.forEach((item) => {
        //判断可用数量是否大于等于输入的数量,不满足则抛出异常
        if (item.quantity < checkedNum.value) throw new Error(t('processCard.schedulingQuantity'));
        // if (item.quantity < checkedNum.value*1) throw new Error(t('processCard.schedulingQuantity'));
        if (item.quantity < checkedNum.value * 1) {
          ElMessage.warning(t('processCard.schedulingQuantity'))
        }
        //左边表格可用数量减去输入的数量
        item.quantity = item.quantity - checkedNum.value
        //右边表格数据
@@ -437,45 +632,121 @@
        let filterIndex = rightData.findIndex(item1 => item1.orderNumber === item.orderNumber)
        //如果右边表格数据中存在当前数据则数量相加
        if (filterIndex >= 0) {
          //数量
          rightData[filterIndex].baiscQuantity = rightData[filterIndex].baiscQuantity * 1 + checkedNum.value * 1
          //面积
          rightData[filterIndex].computeGrossArea = (rightData[filterIndex].width * rightData[filterIndex].height * rightData[filterIndex].baiscQuantity / 1000000).toFixed(2)
          //如果左边数量为0时删除此条数据
          if (item.quantity === 0) {
            $gridLeft.remove(item)
          //删除key
          let key = item._X_ROW_KEY
          delete item._X_ROW_KEY
          if (item.baiscQuantity === 0) {
            $grid.remove(item)
          }
          item._X_ROW_KEY = key
        } else {
          //右边表格没有此条数据则往右边表格插入数据
          item.baiscQuantity = checkedNum.value
          item.computeGrossArea = (item.width * item.height * checkedNum.value / 1000000).toFixed(2)
          if (item.quantity === 0) {
            $gridLeft.remove(item)
          }
          $grid.insert(item)
        }
        if (item.quantity === 0) {
          $gridLeft.remove(item)
        }
      })
    } else if (checkedNum.value === '') {//判断数量输入框无输入数字
      checkedList.forEach((item) => {
        //右侧表格
        let rightData = $grid.getTableData().fullData
        let filterIndex = rightData.findIndex(item1 => item1.orderNumber === item.orderNumber)
        //左侧表格
        let leftData = $gridLeft.getTableData().fullData
        let leftfilterIndex = leftData.findIndex(item1 => item1.orderNumber === item.orderNumber)
        //无输入并且如果右边表格数据中存在当前数据则数量相加
        if (filterIndex > -1) {
          rightData[filterIndex].baiscQuantity = rightData[filterIndex].baiscQuantity * 1 + item.quantity * 1
          //面积
          rightData[filterIndex].computeGrossArea = (rightData[filterIndex].width * rightData[filterIndex].height * rightData[filterIndex].baiscQuantity / 1000000).toFixed(2)
        } else {
          delete item._X_ROW_KEY
          $grid.insert(item)
        }
        $gridLeft.remove(item)
      })
    }
    let leftDataList = $gridLeft.getTableData().fullData;
    let baseProcessId = productionId; // 固定的前缀
    // 统计所有不重复的 processId
    let uniqueProcessIds = new Set(leftDataList.map(item => item.processId));
    // 不重复的 processId 的总个数
    let totalUniqueCount = uniqueProcessIds.size;
    // 用于记录已经分配的 processId
    let usedProcessIds = new Set();
    leftDataList.forEach((item) => {
      let newProcessId;
      // 如果该 processId 是第一次出现,使用递减的编号生成新的 processId
      if (!usedProcessIds.has(item.processId)) {
        newProcessId = `${baseProcessId}${(totalUniqueCount).toString().padStart(3, '0')}`;
        usedProcessIds.add(item.processId); // 标记该 processId 已使用
        totalUniqueCount--; // 递减
      } else {
        // 如果该 processId 已经使用过,继续使用已分配的编号
        newProcessId = `${baseProcessId}${(totalUniqueCount + 1).toString().padStart(3, '0')}`;
      }
      // 更新 item.processId
      item.processId = newProcessId;
    });
    // 获取剩余数据,用于对落架顺序重新赋值
    let remainingData = $gridLeft.getTableData().fullData;
    // 按 processId 分组
    let groupedData = remainingData.reduce((acc, curr) => {
      if (!acc[curr.processId]) {
        acc[curr.processId] = [];
      }
      acc[curr.processId].push(curr);
      return acc;
    }, {});
    // 按 processId 排序(倒序)
    let sortedProcessIds = Object.keys(groupedData).sort((a, b) => b - a);
    // 更新每个分组的 landingSequence
    sortedProcessIds.forEach((processId, index) => {
      let group = groupedData[processId];
      // 对每个 processId 分组内的数据,不改变顺序,直接赋相同的 landingSequence
      group.forEach((item) => {
        item.landingSequence = sortedProcessIds.length - index; // 按倒序设置 landingSequence
      });
    });
    //清除两边复选框
    $gridLeft.clearCheckboxRow()
    $grid.clearCheckboxRow()
  } catch (e) {
    ElMessage.warning(e.message)
  }
  //每次点击情况输入框
  if (checkedNum.value){
    checkedNum.value =''
  }
}
//向左边表格添加数据
const addLeft = () => {
  try {
@@ -507,6 +778,7 @@
        //判断可用数量是否大于等于输入的数量,不满足则抛出异常
        if (item.baiscQuantity * 1 < checkedNum.value * 1) throw new Error("请输入小于等于待分数量的数字");
        item.baiscQuantity = item.baiscQuantity - checkedNum.value
        item.computeGrossArea = (item.computeGrossArea - item.width * item.height * checkedNum.value / 1000000).toFixed(2)
        //定义key值保持
        let key = item._X_ROW_KEY
        //左边表格数据
@@ -519,15 +791,18 @@
          //如果右边表格数据中存在当前数据则数量相加
          if (filterIndex >= 0) {
            leftData[filterIndex].quantity = leftData[filterIndex].quantity * 1 + checkedNum.value * 1
            leftData[filterIndex].computeGrossArea = (leftData[filterIndex].computeGrossArea - leftData[filterIndex].width * leftData[filterIndex].height * leftData[filterIndex].baiscQuantity / 1000000).toFixed(2)
            if (item.baiscQuantity === 0) {
              $grid.remove(checkedList)
              $grid.remove(item)
            }
            $gridLeft.reloadData([...$gridLeft.getTableData().fullData])
            //delete item._X_ROW_KEY
          } else {
            item.quantity = checkedNum.value
            item.processId = checkedListLeft[0].processId
            item.landingSequence = checkedListLeft[0].landingSequence
            item.computeGrossArea = (item.computeGrossArea - checkedListLeft[0].width * checkedListLeft[0].height * checkedNum.value / 1000000).toFixed(2)
            delete item._X_ROW_KEY
            $gridLeft.insert(item)
            item._X_ROW_KEY = key
@@ -538,28 +813,33 @@
          item.quantity = checkedNum.value
          item.processId = checkedListLeft[0].processId
          item.landingSequence = checkedListLeft[0].landingSequence
          // /item.computeGrossArea=item.computeGrossArea
          if (item.baiscQuantity === 0) {
            $grid.remove(checkedList)
            $grid.remove(item)
          }
          for (let i = 0; i < leftData.length; i++) {
            if (leftData[i].orderNumber === item.orderNumber && leftData[i].processId === item.processId) {
              leftData[i].quantity = leftData[i].quantity * 1 + checkedNum.value * 1
              leftData[i].computeGrossArea = (leftData[i].computeGrossArea - leftData[i].width * leftData[i].height * leftData[i].baiscQuantity / 1000000).toFixed(2)
              break
            } else if (leftData[i].orderNumber === item.orderNumber && leftData[i].processId !== item.processId) {
              delete item._X_ROW_KEY
              $gridLeft.insert(item)
              item._X_ROW_KEY = key
              break
            } else if (leftData[i].orderNumber !== item.orderNumber && leftData[i].processId !== item.processId) {
              delete item._X_ROW_KEY
              $gridLeft.insert(item)
              item._X_ROW_KEY = key
              break
            } else if (leftData[i].orderNumber !== item.orderNumber && leftData[i].processId == item.processId) {
              delete item._X_ROW_KEY
              $gridLeft.insert(item)
              item._X_ROW_KEY = key
              break
            }
            else if (leftData[i].orderNumber !== item.orderNumber && leftData[i].processId !== item.processId) {
              delete item._X_ROW_KEY
              $gridLeft.insert(item)
              item._X_ROW_KEY = key
              break
            }
          }
        }
@@ -568,7 +848,8 @@
      checkedList.forEach((item) => {
        item.processId = checkedListLeft[0].processId
        item.landingSequence = checkedListLeft[0].landingSequence
        item.quantity = checkedListLeft[0].baiscQuantity
        item.quantity = item.baiscQuantity
        item.computeGrossArea = (item.computeGrossArea - checkedListLeft[0].width * checkedListLeft[0].height * checkedListLeft[0].baiscQuantity / 1000000).toFixed(2)
        delete item._X_ROW_KEY
      })
      $gridLeft.insertAt(checkedList)
@@ -583,6 +864,9 @@
  } catch (e) {
    ElMessage.warning(e.message)
  }
  if (checkedNum.value){
    checkedNum.value =''
  }
}
@@ -593,30 +877,48 @@
    if ($grid) {
      switch (code) {
        case 'saveFlowCard': {
          gridLeftOptions.toolbarConfig.buttons[0].disabled=true
          const $table = xGridLeft.value
          const $tableRight = xGrid.value
          if ($table) {
            const selectRecords = $table.getCheckboxRecords()
          //  const selectRight = $tableRight.getCheckboxRecords()
            //  const selectRight = $tableRight.getCheckboxRecords()
            let leftData = $tableRight.getTableData().fullData
            if (selectRecords.length === 0) {
              ElMessage.warning("请先选择保存的数据")
              ElMessage.warning(t('processCard.pleaseSelectTheSavedDataFirst'))
              gridLeftOptions.toolbarConfig.buttons[0].disabled=false
              return
            }
            if (leftData.length > 0) {
              ElMessage.warning("请先将右侧数据全部建立流程卡后保存")
              ElMessage.warning(t('processCard.pleaseFirstCreateAProcessCardForAllTheDataOnTheRightSideAndSaveIt'))
              gridLeftOptions.toolbarConfig.buttons[0].disabled=false
              return;
            }
            // 计算 $table 里 quantity 字段的总和
            let totalQuantity = selectRecords.reduce((sum, record) => sum + (Number(record.quantity) || 0), 0);
            // 对比全局变量 orderQuantity
            if (totalQuantity !== orderQuantity*1) {
              ElMessage.warning(`所选数据的数量总和 (${totalQuantity}) 与订单数量 (${orderQuantity}) 不匹配,请检查后重试!`);
              gridLeftOptions.toolbarConfig.buttons[0].disabled = false;
              return;
            }
            // if (leftData.length!=selectRecords.length){
            //   ElMessage.warning('请勾选所有数据进行保存')
            //   gridLeftOptions.toolbarConfig.buttons[0].disabled=false
            //   return;
            // }
            let flowCardData = ref({
              flowCard: selectRecords,
              userName: username,
              productionId: productionId
              productionId: productionId,
              userId:user.user.userId
            })
            request.post("/processCard/addFlowCard", flowCardData.value).then((res) => {
            request.post(`/processCard/addFlowCard/${orderId}`, flowCardData.value).then((res) => {
              if (res.code == 200) {
                ElMessage.success("保存成功")
                ElMessage.success(t('basicData.msg.saveSuccess'))
                //router.push('/main/processCard/SplittingDetails?orderId=${orderId}')
                router.push({
                  path: '/main/processCard/AddProcessCard',
@@ -639,36 +941,49 @@
  },
}
const weightSum = (row) => {
  return parseFloat((row.baiscQuantity * row.thickness * row.width * row.height * 2.5 / 1000000).toFixed(2))
}
let quantit = ref('')
let weight = ref('')
const handleCheckboxChange = ({row}) => {
  const $grid = xGrid.value
  //获取右边表格checkbox选中的数据
  const checkedList = $grid.getCheckboxRecords()
  let quantitySum = 0;
  let weightsum = 0;
  checkedList.forEach(item => {
    quantitySum += item.baiscQuantity;
    weightsum += weightSum(item);
  });
  quantit.value = quantitySum;
  weight.value = parseFloat(weightsum.toFixed(2));
}
</script>
<template>
  <div style="width: 100%;height: 100%">
  <div style="width: 75%;height: 90%">
    <div class="common-layout">
      <el-button
          id="searchButton1"
          :icon="ArrowLeftBold"
          round
          style="float: left"
          type="primary"
          @click="intoCreateProduct">
        {{ flag ? t('processCard.return') : t('processCard.return') }}
      </el-button>
      <!--      <el-button  type="primary">保存分架</el-button>-->
      <!--              <el-button type="primary" :hidden="true">分架汇总</el-button>-->
    <div class="common-layout" style="width: 100%;height: 100%">
      <div class="header" style="height: 5%;width: 100%">
        <el-button
            id="searchButton1"
            :icon="ArrowLeftBold"
            round
            style="float: left"
            type="primary"
            @click="intoCreateProduct">
          {{ flag ? t('processCard.return') : t('processCard.return') }}
        </el-button>
        <!--      <el-button  type="primary">保存分架</el-button>-->
        <!--              <el-button type="primary" :hidden="true">分架汇总</el-button>-->
        <div style="width: 100px;">
        </div>
      </div>
      <el-container style="height: 100%;width: 100%">
        <el-aside style="width: 44%;height: 100%">
        <el-aside style="width: 52%;height: 100%">
          <vxe-grid
              ref="xGridLeft"
              checkbox-config="{ reserve: true, strict: true }"
              class="mytable-scrollbar"
              max-height="100%"
              height="650px"
              height="100%"
              v-bind="gridLeftOptions"
              v-on="gridEvents"
          >
@@ -690,41 +1005,51 @@
                <div v-for="(option, index) in column.filters" :key="index">
                  <input v-model="option.data"
                         type="text"
                         @keyup.enter.native="$panel.confirmFilter()"
                         @input="changeFilterEvent($event, option, $panel)"/>
                </div>
              </div>
            </template>
          </vxe-grid>
        </el-aside>
        <div width="12%">
        <div height="100%" style="margin: 5px" width="11%">
          <el-main style="">
            <span>{{$t('processCard.selectedQuantity')}}:<el-input v-model="checkedNum" clearable type="number"></el-input></span><br>
            <el-button type="primary" @click="addRight"> →</el-button>
            <div>
              <span><el-input v-model="quantit" style="width: 80px;"/></span>
              <span><el-input v-model="weight" style="width: 80px;"/></span>
            </div>
            <span>{{ $t('processCard.selectedQuantity') }}:<el-input id="checkedNum" v-model="checkedNum" clearable
                                                                     type="number"></el-input></span><br>
            <el-button style="width: 40px;" type="primary" @click="addRight"> →</el-button>
            <br>
            <br>
            <el-button type="primary" @click="addLeft"> ←</el-button>
            <el-button style="width: 40px;" type="primary" @click="addLeft"> ←</el-button>
            <br>
            <br>
            <el-button type="primary" @click="createProcessCard">{{$t('processCard.establishProcessCards')}}</el-button>
            <el-button type="primary" @click="createProcessCard">{{ $t('processCard.establishProcessCards') }}
            </el-button>
            <br><br><br><br><br>
            <el-button type="primary" @click="createProcessCardNo">{{ $t('processCard.createBySequenceNumber') }}
            </el-button>
          </el-main>
        </div>
        <!--        右侧-->
        <div style="height: 100%;width: 100%">
        <div style="height: 100%;width: 70%">
          <el-aside style="width: 100%;height: 100%">
            <vxe-grid
                id="rightTable"
                ref="xGrid"
                checkbox-config="{ reserve: true, strict: true }"
                class="mytable-scrollbar"
                max-height="100%"
                height="650px"
                height="100%"
                v-bind="gridOptions"
                v-on="gridEventsRight"
                @checkbox-change="handleCheckboxChange"
            >
              <!--      @toolbar-button-click="toolbarButtonClickEvent"-->
              <!--      下拉显示所有信息插槽-->
@@ -739,12 +1064,16 @@
                  </li>
                </ul>
              </template>
              <template #weight_sum="{ row }">
                <span>{{ weightSum(row) }} </span>
              </template>
              <template #num1_filter="{ column, $panel }">
                <div>
                  <div v-for="(option, index) in column.filters" :key="index">
                    <input v-model="option.data"
                           type="text"
                           @keyup.enter.native="$panel.confirmFilter()"
                           @input="changeFilterEvent($event, option, $panel)"/>
                  </div>
                </div>
@@ -758,8 +1087,14 @@
</template>
<style scoped>
* {
  margin: 0;
  padding: 0;
}
.common-layout {
  height: 100%;
  width: 99%;
  height: 96%;
}
.header {
@@ -778,4 +1113,5 @@
}
</style>