chenlu
8 天以前 23bca603bee6a1ec044949a89c0daa3002fbbe55
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/GlassInventory.vue
@@ -4,22 +4,27 @@
import request from "@/utils/request";
import {ElMessage, ElMessageBox} from "element-plus";
import {useRoute} from "vue-router";
const {t} = useI18n()
import {addListener, toolbarButtonClickEvent} from "@/hook/mouseMove";
import useOrderInfoStore from "@/stores/sd/order/orderInfo";
import useUserInfoStore from "@/stores/userInfo";
const { t } = useI18n()
const userStore = useUserInfoStore()
const orderInfo = useOrderInfoStore()
const username = userStore.user.userName
const xGrid = ref()
const gridOptions = reactive({
  height: '100%',
  height:'100%',
  loading: false,
  border: "full",//表格加边框
  border:  "full",//表格加边框
  keepSource: true,//保持源数据
  align: 'center',//文字居中
  stripe: true,//斑马纹
  rowConfig: {isCurrent: true, isHover: true, height: 30, useKey: true},//鼠标移动或选择高亮
  stripe:true,//斑马纹
  rowConfig: {isCurrent: true, isHover: true,height: 30, useKey: true},//鼠标移动或选择高亮
  id: 'GlassInventory',
  scrollX: {enabled: true},
  scrollY: {enabled: true, gt: 0},//开启虚拟滚动
  showOverflow: true,
  scrollX:{enabled: true},
  scrollY:{ enabled: true ,gt:0},//开启虚拟滚动
  showOverflow:true,
  columnConfig: {
    resizable: true,
    useKey: true
@@ -31,69 +36,63 @@
    storage: true
  },
  editConfig: {
    trigger: 'click',
    mode: 'row',
    trigger: 'dblclick',
    mode: 'cell',
    showStatus: true
  },
  columns: [
    {type: 'seq', fixed: "left", title: ' ', width: 50},
    {type: 'checkbox', fixed: "left", title: t('basicData.check'), width: 80},
  columns:[
    {type:'seq',fixed:"left", title:' ', width: 50},
    {type: 'checkbox', fixed: "left", title: t('basicData.check'),  width: 80},
    {field: 'id', title: '物料编码',},
    {field: 'width', title: t('order.width'),},
    {field: 'height', title: t('order.height')},
    {field:'width',editRender: { name: 'input',attrs: {disabled:true}}, title: t('order.width'),},
    {field: 'height',editRender: { name: 'input',attrs: {disabled:true}},title: t('order.height')},
    {field: 'thickness', title: t('order.totalThickness'),},
    {field: 'model', title: t('warehouseBasicData.type'),},
    {field: 'leftTrim', title: '左修边',},
    {field: 'downTrim', title: '下修边',},
    {field: 'rigthTrim', title: '右修边',},
    {field: 'upTrim', title: '上修边',},
    {field: 'available_quantity', title: '库存数量',},
    {field: '', title: '加工数量',},
    {field: 'leftTrim',editRender: { name: 'input',attrs: {disabled:false}}, title: '左修边',},
    {field: 'downTrim',editRender: { name: 'input',attrs: {disabled:false}}, title: '下修边',},
    {field: 'rightTrim',editRender: { name: 'input',attrs: {disabled:false}}, title: '右修边',},
    {field: 'upTrim',editRender: { name: 'input',attrs: {disabled:false}}, title: '上修边',},
    {field: 'available_quantity',editRender: { name: 'input',attrs: {disabled:false}}, title: '库存数量',},
    {field: 'processingQuantity', title: '加工数量',},
    {field: 'name', title: '名称',},
    {field: 'producer', title: '供应商',}
  ],//表头参数
  data: null,//表格数据
  data:null,//表格数据
  //右键菜单
  menuConfig: {
    body: {
      options: [
        [
          {code: 'choose', name: '选择',},
          {code: 'selectTrimming', name: '设置统一修边',},
          {code: 'selectTrimming', name: '设置统一修边',prefixIcon: 'vxe-icon-edit'},
          {code: 'Exports', name: '数据导出', prefixIcon: 'vxe-icon-download', visible: true, disabled: false},
          {code: 'addRow', name: '添加原片', prefixIcon: 'vxe-icon-square-plus', visible: true, disabled: true },
        ],
        []
      ]
    },
  },
  toolbarConfig: {
    buttons: [],
    slots: {
      buttons: "toolbar_buttons"
    },
  },
})
const emit = defineEmits(['select-trimming']);
const emit = defineEmits(['select-trimming'],['checkboxChange']);
// 右键菜单
const operationConfigs = [
  {
    code: 'choose',
    successMsg: '已选中!',
    gridRef: xGrid,
    requiresRow: false,
    showMessage: () => {
      ElMessage.info('此功能暂未完善,暂时无法执行隐藏流程卡操作。');
    }
  },
  {
    code: 'selectTrimming', // 设置统一修边
    successMsg: '已打开!',
    gridRef: xGrid,
    requiresRow: false,
    openTrimming: async () => {
      emit('select-trimming', true)
      // 获取当前选中的记录
      const selectedRecords = xGrid.value.getCheckboxRecords();
      // 发送事件给父组件,包含选中的数据
      emit('select-trimming', {
        action: 'open-trimming-dialog',
        selectedData: selectedRecords && selectedRecords.length > 0 ? selectedRecords : null,
        timestamp: Date.now()
      });
    }
  },
  {
@@ -102,6 +101,64 @@
    gridRef: xGrid,
    requiresRow: false,
  },
  {
    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('添加成功!');
      }
    }
  }
]
// 右键菜单点击逻辑
@@ -116,16 +173,28 @@
          ElMessage.success(config.successMsg);
          return;
        }
        if (config.code === 'addRow') {
          if (config.handler) {
            config.handler();
          }
          return;
        }
        if (config.code === 'selectTrimming') {
          config.openTrimming();
          return;
        }
        // 添加确认提示弹窗,询问用户是否进行当前操作
        ElMessageBox.confirm('是否进行当前操作?', '确认操作', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          if (config.code === 'selectTrimming') {
            config.openTrimming();
            ElMessage.success(config.successMsg);
          }
          // if (config.code === 'selectTrimming') {
          //   config.openTrimming();
          //   ElMessage.success(config.successMsg);
          // }
        }).catch(() => {
          // 用户点击取消后执行的逻辑
          ElMessage.info('已取消操作');
@@ -142,12 +211,15 @@
const thickness = ref(route.params.thickNess);
const model = ref(route.params.model);
let projectNo = ref(null);
let type = ref(1);
const selectMaterialStore = () => {
  request.post(`/glassOptimize/materialStore/${thickness.value}/${model.value}`).then((res) => {
const selectMaterialStore = async () =>{
  request.get(`/glassOptimize/materialStore/${thickness.value}/${model.value}/${projectNo.value}?type=${type.value}&username=${username}`).then((res) => {
    if (Number(res.code) === 200) {
      const rawData = res.data.data;
      const edgeTrimming = res.data.edgeTrimming;
      let state = res.data.state;
      if (Array.isArray(rawData) && rawData.length > 0) {
        const formattedData = rawData.map(item => {
          const formattedItem = {};
@@ -159,17 +231,75 @@
              formattedItem[key] = item[key];
            }
          }
          if (!formattedItem.thickness) {
            formattedItem.thickness = thickness.value;
          }
          if (!formattedItem.model) {
            formattedItem.model = model.value;
          }
          return formattedItem;
        });
        const data = formattedData;
        data.forEach(item => {
          item.leftTrim = 0;
          item.downTrim = 0;
          item.rigthTrim = 0;
          item.upTrim = 0;
        });
        if(edgeTrimming!=null){
          const edgeTrimmingData = edgeTrimming.map(item => {
            const edgeTrimmingItem = {};
            for (const key in item) {
              if (typeof item[key] === 'string') {
                //去除字符串属性值开头和结尾的双引号
                edgeTrimmingItem[key] = item[key].replace(/^\"|\"$/g, '');
              } else {
                edgeTrimmingItem[key] = item[key];
              }
            }
            return edgeTrimmingItem;
          });
          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
          gridOptions.columns[4].editRender.attrs.disabled=false
          gridOptions.menuConfig.body.options[0][2].disabled = false
        }else if(state>20){
          gridOptions.columns[7].editRender.attrs.disabled=true
          gridOptions.columns[8].editRender.attrs.disabled=true
          gridOptions.columns[9].editRender.attrs.disabled=true
          gridOptions.columns[10].editRender.attrs.disabled=true
          gridOptions.columns[11].editRender.attrs.disabled=true
        }
        if(orderInfo.optimizeData.originalFilm!==null){
          formattedData.forEach(item => {
            orderInfo.optimizeData.originalFilm.forEach(items => {
              if(item.id===items.stockCode){
                item.processingQuantity=items.count
              }
            });
          });
        }
        xGrid.value.loadData(formattedData);
        gridOptions.data = formattedData;
        // 将 formattedData 保存到 localStorage
        localStorage.setItem('glassInventoryData', JSON.stringify(formattedData));
        console.log('已将库存数据保存到 localStorage');
      } else {
      }
    } else {
@@ -179,42 +309,61 @@
  });
};
const defaultTrims = reactive({
  leftTrim: 0,
  downTrim: 0,
  rightTrim: 0,
  upTrim: 0
});
onMounted(() => {
  selectMaterialStore();
  addListener(xGrid.value,gridOptions)
  if(route.params.projectNo!=null){
    projectNo.value=route.params.projectNo
    selectMaterialStore();
  }else if(orderInfo.projectNo!==null){
    projectNo.value=orderInfo.projectNo.projectNo
    thickness.value=orderInfo.projectNo.thickNess
    model.value=orderInfo.projectNo.model
    selectMaterialStore();
  }
});
watch(() => props.receivedData, (newData) => {
  if (newData) {
    Trimming(newData);
  }
}, {immediate: true});
}, { immediate: true });
watch(() => props.InventoryData, (newInventoryData) => {
  if (newInventoryData) {
    thickness.value = newInventoryData.selectedLabel1;
    model.value = newInventoryData.selectedLabel2;
    type.value=newInventoryData.type
    // 由于 thickness 和 model 的值改变了,更新表格,调用 selectMaterialStore 重新获取数据
    selectMaterialStore();
  }
});
const props = defineProps({
  receivedData: {
  receivedData : {
    type: Object,
    required: false,
    properties: {
      quicksetLeft: {type: Number},
      quicksetBottom: {type: Number},
      quicksetRight: {type: Number},
      quicksetTop: {type: Number}
      quicksetLeft: { type: Number },
      quicksetBottom: { type: Number },
      quicksetRight: { type: Number },
      quicksetTop: { type: Number }
    }
  },
  InventoryData: {
  InventoryData : {
    type: Object,
    required: false,
    properties: {
      selectedLabel1: {type: String},
      selectedLabel2: {type: String},
      selectedLabel1: { type: String },
      selectedLabel2: { type: String },
      type: { type: String }
    }
  }
});
@@ -225,24 +374,42 @@
    const data = gridOptions.data;
    if (data) {
      try {
        const updatedData = [];
        for (let i = 0; i < data.length; i++) {
          const item = data[i];
          const updatedItem = {
        // 检查是否只对选中的项目应用修边
        const shouldApplyToSelectedOnly = receivedData.selectedItemsOnly;
        let targetData = data;
        if (shouldApplyToSelectedOnly) {
          // 只对选中的数据应用修边
          targetData = receivedData.selectedGlassData || [];
          if (!targetData || targetData.length === 0) {
            ElMessage.warning('未选择任何项目,修边未应用');
            return;
          }
        }
        const updatedData = data.map(item => {
          // 如果只对选中项应用,检查当前项是否在选中列表中
          if (shouldApplyToSelectedOnly) {
            const isSelected = targetData.some(selectedItem => selectedItem.id === item.id);
            if (!isSelected) {
              return item; // 不在选中列表中,不修改
            }
          }
          // 应用修边值
          return {
            ...item,
            // 从 receivedData 中获取对应的值来更新表格数据项
            leftTrim: Number(receivedData.quicksetLeft),
            downTrim: Number(receivedData.quicksetBottom),
            rigthTrim: Number(receivedData.quicksetRight),
            rightTrim: Number(receivedData.quicksetRight),
            upTrim: Number(receivedData.quicksetTop),
          };
          updatedData.push(updatedItem);
        }
        });
        gridOptions.data = updatedData;
        xGrid.value.loadData(updatedData);
      } catch (error) {
        console.error('更新表格数据时出错:', error);
        // 这里可以根据实际需求添加一些回滚操作或者提示用户的逻辑,比如显示一个错误提示框等
        ElMessage.error('更新表格数据时出现错误,请检查输入或联系管理员');
      }
    } else {
@@ -252,6 +419,11 @@
};
const checkboxChanges= () => {
  return xGrid.value.getCheckboxRecords();
}
defineExpose({checkboxChanges})
</script>
<template>
@@ -268,8 +440,7 @@
      <template #num2_filter="{ column, $panel }">
        <div>
          <div v-for="(option, index) in column.filters" :key="index">
            <vxe-select v-model="option.data" :placeholder="$t('processCard.pleaseSelect')"
                        @change="changeFilterEvent($event, option, $panel)">
            <vxe-select v-model="option.data" :placeholder="$t('processCard.pleaseSelect')"  @change="changeFilterEvent($event, option, $panel)">
              <vxe-option value="0" :label="$t('basicData.unchecked')"></vxe-option>
              <vxe-option value="1" :label="$t('basicData.selected')"></vxe-option>
            </vxe-select>