guoyuji
2024-12-17 cfa4a3fdb3dcd9a811157c4bd8f82ba4025917bc
Merge branch 'master' of http://bore.pub:10439/r/ERP_override
7个文件已修改
445 ■■■■ 已修改文件
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeProject.vue 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/CheckInventory.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/GlassInventory.vue 149 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectDetail.vue 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectList.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/SetAmount.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/src/main/resources/mapper/pp/FolwCard.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/OptimizeProject.vue
@@ -26,15 +26,34 @@
  dataForGlassInventory.value = data;
};
//获取GlassInventory的值(查询库存)
const sendDataGlassInventory = ref()
const handleInventoyData = (selectedLabel1,selectedLabel2) => {
  sendDataGlassInventory.value = {
    selectedLabel1, selectedLabel2
  };
};
//右键菜单打开修边
const isTrimmingDialogVisible = ref(false);
const sendTrimming = (value) => {
    isTrimmingDialogVisible.value = value;
  };
</script>
<template >
 <div style="width: 100%;height: 100%">
   <div id="main-body">
     <project-detail @changeDialog="changeDialog"  @forward-data-to-grandparent="handleProjectDetailData"/>
     <project-detail @changeDialog="changeDialog"
                     @forward-data-to-grandparent="handleProjectDetailData"
                     @send-inventory-to-op="handleInventoyData"
                     :TrimmingDialogVisible="isTrimmingDialogVisible" />
   </div>
   <div id="main-footer">
     <glass-inventory :receivedData="dataForGlassInventory"/>
     <glass-inventory :receivedData="dataForGlassInventory"
                      :InventoryData="sendDataGlassInventory"
                      @select-trimming="sendTrimming"/>
   </div>
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/CheckInventory.vue
@@ -1,5 +1,5 @@
<script setup>
import {ref} from "vue";
import {defineEmits, ref} from "vue";
const value1 = ref('')
const value2 = ref('')
@@ -40,6 +40,24 @@
    label: 'Low-e',
  },
]
const emit = defineEmits(['send-data-inventory',]);
const props = defineProps({
  closeDialog: Function
});
const CheckInventory = () => {
  const selectedLabel1 = options1.find((option) => option.value === value1.value)?.label || '';
  const selectedLabel2 = options2.find((option) => option.value === value2.value)?.label || '';
  // 判断两个值是否都被选择了,如果有一个为空字符串,则提示并返回,不执行后续操作
  if (!selectedLabel1 ||!selectedLabel2) {
    window.alert('请选择相关选项');
    return;
  }
  props.closeDialog(1);
  emit('send-data-inventory', selectedLabel1,selectedLabel2);
};
</script>
<template>
@@ -69,7 +87,7 @@
    </div>
    <div style="float: right; margin:-55px 35px 0 0;">
      <el-button type="primary">查询</el-button>
      <el-button type="primary" @click="CheckInventory">查询</el-button>
    </div>
  </div>
</template>
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/GlassInventory.vue
@@ -2,23 +2,24 @@
import {nextTick, onMounted, reactive, ref, watch} from "vue";
import {useI18n} from "vue-i18n";
import request from "@/utils/request";
import {ElMessage} from "element-plus";
import {ElMessage, ElMessageBox} from "element-plus";
import {useRoute} from "vue-router";
const { t } = useI18n()
const {t} = useI18n()
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
@@ -35,12 +36,12 @@
    showStatus: true
  },
  columns:[
    {type:'seq',fixed:"left", title:' ', width: 50},
  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', title: t('order.width'),},
    {field: 'height', title: t('order.height')},
    {field: 'thickness', title: t('order.totalThickness'),},
    {field: 'model', title: t('warehouseBasicData.type'),},
    {field: 'leftTrim', title: '左修边',},
@@ -52,14 +53,90 @@
    {field: 'name', title: '名称',},
    {field: 'producer', title: '供应商',}
  ],//表头参数
  data:null,//表格数据
  data: null,//表格数据
  //右键菜单
  menuConfig: {
    body: {
      options: [
        [
          {code: 'choose', name: '选择',},
          {code: 'selectTrimming', name: '设置统一修边',},
          {code: 'Exports', name: '数据导出', prefixIcon: 'vxe-icon-download', visible: true, disabled: false},
        ],
        []
      ]
    },
  },
  toolbarConfig: {
    buttons: [],
    slots:{
    slots: {
      buttons: "toolbar_buttons"
    },
  },
})
const emit = defineEmits(['select-trimming']);
// 右键菜单
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)
    }
  },
  {
    code: 'Exports', // 导出文件操作的配置
    successMsg: '文件导出成功!',
    gridRef: xGrid,
    requiresRow: false,
  },
]
// 右键菜单点击逻辑
const gridEvents = {
  menuClick({menu}) {
    const $grid = xGrid.value;
    if ($grid) {
      const config = operationConfigs.find(c => c.code === menu.code);
      if (config) {
        if (config.code === 'Exports') {
          config.gridRef.value.exportData();
          ElMessage.success(config.successMsg);
          return;
        }
        // 添加确认提示弹窗,询问用户是否进行当前操作
        ElMessageBox.confirm('是否进行当前操作?', '确认操作', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          if (config.code === 'selectTrimming') {
            config.openTrimming();
            ElMessage.success(config.successMsg);
          }
        }).catch(() => {
          // 用户点击取消后执行的逻辑
          ElMessage.info('已取消操作');
        });
      } else {
        console.error(`未找到操作选项 ${menu.code} 对应的配置,请检查配置项`);
      }
    }
  },
};
const route = useRoute();
@@ -67,7 +144,7 @@
const model = ref(route.params.model);
const selectMaterialStore = () =>{
const selectMaterialStore = () => {
  request.post(`/glassOptimize/materialStore/${thickness.value}/${model.value}`).then((res) => {
    if (Number(res.code) === 200) {
      const rawData = res.data.data;
@@ -110,26 +187,42 @@
  if (newData) {
    Trimming(newData);
  }
}, { immediate: true });
}, {immediate: true});
watch(() => props.InventoryData, (newInventoryData) => {
  if (newInventoryData) {
    thickness.value = newInventoryData.selectedLabel1;
    model.value = newInventoryData.selectedLabel2;
    // 由于 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: {
    type: Object,
    required: false,
    properties: {
      selectedLabel1: {type: String},
      selectedLabel2: {type: String},
    }
  }
});
//接受SetTrimming的值 (修边)
const Trimming = (receivedData) => {
  nextTick(() => {
    const data = gridOptions.data;
    console.log('接收到的receivedData:', receivedData);
    console.log('表格原始数据:', data);
    if (data) {
      try {
        const updatedData = [];
@@ -137,7 +230,7 @@
          const item = data[i];
          const updatedItem = {
            ...item,
            // 此处修改为从 receivedData 中获取对应的值来更新表格数据项
            // 从 receivedData 中获取对应的值来更新表格数据项
            leftTrim: Number(receivedData.quicksetLeft),
            downTrim: Number(receivedData.quicksetBottom),
            rigthTrim: Number(receivedData.quicksetRight),
@@ -168,13 +261,15 @@
        class="mytable-scrollbar"
        ref="xGrid"
        v-bind="gridOptions"
        v-on="gridEvents"
    >
      <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>
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectDetail.vue
@@ -1,5 +1,5 @@
<script setup>
import {nextTick, onMounted, reactive, ref} from "vue";
import {nextTick, onMounted, reactive, ref, watch} from "vue";
import {useI18n} from "vue-i18n";
import {Folder, Plus, Setting, Operation,} from "@element-plus/icons-vue";
import OptimizeCompute from "@/views/pp/glassOptimize/page/OptimizeCompute.vue";
@@ -7,8 +7,8 @@
import SetTrimming from "@/views/pp/glassOptimize/page/SetTrimming.vue";
import CheckInventory from "@/views/pp/glassOptimize/page/CheckInventory.vue";
import request from "@/utils/request";
import {ElMessage} from "element-plus";
import { useRoute } from 'vue-router';
import {ElMessage, ElMessageBox} from "element-plus";
import {useRoute} from 'vue-router';
const {t} = useI18n()
@@ -45,12 +45,53 @@
  columns: [
    {field: 'order_number', title: '订序', width: 70},
    {field: 'child_width', width: 100, title: t('order.width'), filters: [{data: ''}], slots: {filter: 'num2_filter'}},
    {field: 'child_height', width: 100, title: t('order.height'),filters: [{data: ''}],slots: {filter: 'num2_filter'}},
    {field: 'quantity', width: 150, title: t('order.quantity'), filters: [{data: ''}], slots: {filter: 'num1_filter'}, sortable: true},
    {field: 'longGrind1', width: 150, title: '长磨1', filters: [{data: ''}], slots: {filter: 'num1_filter'}, sortable: true},
    {field: 'longGrind2', width: 150, title: '长磨2', filters: [{data: ''}], slots: {filter: 'num1_filter'}, sortable: true},
    {field: 'shortGrind1', width: 150, title: '短磨1', filters: [{data: ''}], slots: {filter: 'num1_filter'}, sortable: true},
    {field: 'shortGrind2', width: 150, title: '短磨2', filters: [{data: ''}], slots: {filter: 'num1_filter'}, sortable: true},
    {
      field: 'child_height',
      width: 100,
      title: t('order.height'),
      filters: [{data: ''}],
      slots: {filter: 'num2_filter'}
    },
    {
      field: 'quantity',
      width: 150,
      title: t('order.quantity'),
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      sortable: true
    },
    {
      field: 'longGrind1',
      width: 150,
      title: '长磨1',
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      sortable: true
    },
    {
      field: 'longGrind2',
      width: 150,
      title: '长磨2',
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      sortable: true
    },
    {
      field: 'shortGrind1',
      width: 150,
      title: '短磨1',
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      sortable: true
    },
    {
      field: 'shortGrind2',
      width: 150,
      title: '短磨2',
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      sortable: true
    },
    {
      field: 'shape',
      width: 150,
@@ -59,7 +100,14 @@
      slots: {filter: 'num1_filter'},
      sortable: true
    },
    {field: 'process_cards', width: 150, title: '流程卡号', filters: [{data: ''}], slots: {filter: 'num1_filter'}, sortable: true},
    {
      field: 'process_cards',
      width: 150,
      title: '流程卡号',
      filters: [{data: ''}],
      slots: {filter: 'num1_filter'},
      sortable: true
    },
    {
      field: 'product_name',
      width: 150,
@@ -135,14 +183,130 @@
    },
  ],//表头参数
  data: null,//表格数据
  //右键菜单
  menuConfig: {
    body: {
      options: [
        [
          {code: 'setAmount', name: '设置统一磨量',},
          {code: 'displayProcessCard', name: '显示流程卡',},
          {code: 'hideProcessCard', name: '隐藏流程卡',},
          {code: 'setShape', name: '设置图形',},
          {code: 'Export', name: '数据导出', prefixIcon: 'vxe-icon-download', visible: true, disabled: false},
          {code: 'safeDXF', name: '图形另存为DXF',},
          {code: 'exportOPTIMA', name: '导出数据到OPTIMA',},
        ],
        []
      ]
    },
  },
  toolbarConfig: {
    buttons: [],
    slots: {
      buttons: "toolbar"
    },
  },
})
// 右键菜单
const operationConfigs = [
  {
    code: 'setAmount', // 设置统一磨量
    successMsg: '已打开!',
    gridRef: xGrid,
    requiresRow: false,
    openAmount: async () => {
      dialogVisible.value[2] = true;
    }
  },
  {
    code: 'displayProcessCard',
    successMsg: '操作成功!',
    gridRef: xGrid,
    requiresRow: false,
    showMessage: () => {
      ElMessage.info('此功能暂未完善,暂时无法执行显示流程卡操作。');
    }
  },
  {
    code: 'hideProcessCard',
    successMsg: '操作成功!',
    gridRef: xGrid,
    requiresRow: false,
    showMessage: () => {
      ElMessage.info('此功能暂未完善,暂时无法执行隐藏流程卡操作。');
    }
  },
  {
    code: 'setShape',
    successMsg: '操作成功!',
    gridRef: xGrid,
    requiresRow: false,
    showMessage: () => {
      ElMessage.info('此功能暂未完善,暂时无法执行设置图形操作。');
    }
  },
  {
    code: 'Export', // 导出文件操作的配置
    successMsg: '文件导出成功!',
    gridRef: xGrid,
    requiresRow: false,
  },
  {
    code: 'safeDXF',
    successMsg: '操作成功!',
    gridRef: xGrid,
    requiresRow: false,
    showMessage: () => {
      ElMessage.info('此功能暂未完善,暂时无法执行图形另存为DXF操作。');
    }
  },
  {
    code: 'exportOPTIMA',
    successMsg: '操作成功!',
    gridRef: xGrid,
    requiresRow: false,
    showMessage: () => {
      ElMessage.info('此功能暂未完善,暂时无法执行导出数据到OPTIMA操作。');
    }
  },
]
// 右键菜单点击逻辑
const gridEvents = {
  menuClick({menu}) {
    const $grid = xGrid.value;
    if ($grid) {
      const config = operationConfigs.find(c => c.code === menu.code);
      if (config) {
        if (config.code === 'Export') {
          config.gridRef.value.exportData();
          ElMessage.success(config.successMsg);
          return;
        }
        // 添加确认提示弹窗,询问用户是否进行当前操作
        ElMessageBox.confirm('是否进行当前操作?', '确认操作', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          if (config.code === 'setAmount') {
            config.openAmount();
            ElMessage.success(config.successMsg);
          }else if (['displayProcessCard', 'hideProcessCard', 'setShape', 'safeDXF', 'exportOPTIMA'].includes(config.code)) {
            config.showMessage();
          }
        }).catch(() => {
          // 用户点击取消后执行的逻辑
          ElMessage.info('已取消操作');
        });
      } else {
        console.error(`未找到操作选项 ${menu.code} 对应的配置,请检查配置项`);
      }
    }
  },
};
const handleCommand = async (command) => {
  await emit('changeDialog', command)
@@ -153,10 +317,20 @@
const openDialog = (index) => {
  dialogVisible.value[index] = true;
};
//关闭弹窗
const closeDialog = (index) => {
  dialogVisible.value[index] = false;
};
//右键菜单统一修边
const props = defineProps({
  TrimmingDialogVisible: Boolean
});
watch(() => props.TrimmingDialogVisible, (newValue) => {
  if (newValue === true) {
    dialogVisible.value[3] = newValue;
  }
});
const route = useRoute();
//工程号
@@ -194,8 +368,6 @@
const Amount = (amountData) => {
  nextTick(() => {
    const data = gridOptions.data;
    console.log('接收到的amountData:', amountData);
    console.log('表格原始数据:', data);
    if (data) {
      try {
        const updatedData = [];
@@ -223,15 +395,21 @@
  });
};
//中转站接受SetTrimming的值
//中转站接受SetTrimming的值(设置修边)
const emit = defineEmits([
  'changeDialog',
  'forward-data-to-grandparent'
  'forward-data-to-grandparent',
  'send-inventory-to-op'
]);
const handleTrimmingData = (data) => {
  emit('forward-data-to-grandparent', data);
};
//中转站接受CheckInventory的值(查询库存)
const handleInventory = (selectedLabel1, selectedLabel2) => {
  emit('send-inventory-to-op', selectedLabel1, selectedLabel2);
}
</script>
@@ -274,16 +452,17 @@
        <div id="header">
          <div id="title">
            <span>工程编号:</span>
            <el-input disabled  placeholder="" style="width: 150px" v-model="projectNo"></el-input>&nbsp;
            <el-input disabled placeholder="" style="width: 150px" v-model="projectNo"></el-input>&nbsp;
            <span>工程名称:</span>
            <el-input disabled placeholder="" style="width: 150px; margin-right: 350px" v-model="projectName"></el-input>
            <el-input disabled placeholder="" style="width: 150px; margin-right: 350px"
                      v-model="projectName"></el-input>
            <el-button id="checkinventory" type="primary" @click="openDialog(1)">查询库存</el-button>
            <el-dialog
                v-model="dialogVisible[1]"
                title="查询库存"
                destroy-on-close
                style="width: 35%;height:35%;">
              <check-inventory />
              <check-inventory :closeDialog="closeDialog" @send-data-inventory="handleInventory"/>
            </el-dialog>
            <el-button id="button" type="primary" @click="openDialog(2)">设置磨量</el-button>
@@ -292,7 +471,7 @@
                title="设置磨量"
                destroy-on-close
                style="width: 35%;height:80%;margin-top: 3vh;">
               <set-amount :closeDialog="closeDialog" @set-amount="Amount"/>
              <set-amount :closeDialog="closeDialog" @set-amount="Amount"/>
            </el-dialog>
            <el-button id="button" type="primary" @click="openDialog(3)">设置修边</el-button>
@@ -315,7 +494,6 @@
            >
              <optimize-compute/>
            </el-dialog>
          </div>
          <!--工程文件菜单-->
          <el-dropdown @command="handleCommand">
@@ -351,7 +529,7 @@
  margin-top: 8px;
}
#button{
#button {
  margin-left: 10px;
}
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/ProjectList.vue
@@ -35,27 +35,6 @@
    mode: 'row',
    showStatus: true
  },
  /*formConfig: {
    data: {
      width: '',
      height: '',
      quantity: ''
    },
    items: [
      { field: 'width', title: t('order.width')+':', itemRender: { name: 'VxeInput' } },
      { field: 'height', title: t('order.height')+':', itemRender: { name: 'VxeInput' } },
      { field: 'quantity', title: t('order.quantity')+':', itemRender: { name: 'VxeInput' } },
      {
        itemRender: {
          name: 'VxeButtonGroup',
          options: [
            { type: 'submit', content: t('craft.sure'), status: 'primary' },
            { type: 'reset', content: t('product.msg.reset') }
          ]
        }
      }
    ]
  },*/
  columns:[
    {type:'expand',fixed:"left",slots: { content:'content' },width: 50},
    {field: 'id',width: 150, title: 'ID',filters:[{ data: '' }],slots: { filter: 'num1_filter' }, sortable: true},
north-glass-erp/northglass-erp/src/views/pp/glassOptimize/page/SetAmount.vue
@@ -102,7 +102,7 @@
.square-container {
  width: 300px;
  height: 300px;
  height: 250px;
  display: flex;
  position: relative;
  justify-content: center;
@@ -125,7 +125,7 @@
}
.top {
  top: 45px;
  top: 20px;
  left: 50%;
  transform: translateX(-50%);
}
@@ -137,7 +137,7 @@
}
.bottom {
  bottom: 45px;
  bottom: 20px;
  left: 50%;
  transform: translateX(-50%);
}
north-glass-erp/src/main/resources/mapper/pp/FolwCard.xml
@@ -701,7 +701,7 @@
    <select id="getDetailList">
        select fc.order_number,
               concat(round(ogd.child_width), "*", round(ogd.child_height))   as child_width,
               concat(IF(ROUND(ogd.child_width, 1) = FLOOR(ogd.child_width), FLOOR(ogd.child_width), ROUND(ogd.child_width, 1)), "*", IF(ROUND(child_height, 1) = FLOOR(child_height), FLOOR(child_height), ROUND(child_height, 1)))   as child_width,
               fc.quantity,
               round(ogd.total_area, 2)                                       as total_area,
               od.perimeter,
@@ -1285,7 +1285,7 @@
    <select id="getDetailListLike">
        select fc.order_number,
               concat(round(ogd.child_width), "*", round(ogd.child_height))   as child_width,
               concat(IF(ROUND(ogd.child_width, 1) = FLOOR(ogd.child_width), FLOOR(ogd.child_width), ROUND(ogd.child_width, 1)), "*", IF(ROUND(child_height, 1) = FLOOR(child_height), FLOOR(child_height), ROUND(child_height, 1)))   as child_width,
               fc.quantity,
               round(ogd.total_area, 2)                                       as total_area,
               od.perimeter,