| | |
| | | <script setup> |
| | | import {reactive, ref} from "vue"; |
| | | import {nextTick, onMounted, reactive, ref, watch} from "vue"; |
| | | import {useI18n} from "vue-i18n"; |
| | | import request from "@/utils/request"; |
| | | import {ElMessage, ElMessageBox} from "element-plus"; |
| | | import {useRoute} from "vue-router"; |
| | | 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({ |
| | |
| | | storage: true |
| | | }, |
| | | editConfig: { |
| | | trigger: 'click', |
| | | mode: 'row', |
| | | trigger: 'dblclick', |
| | | mode: 'cell', |
| | | 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:[ |
| | | {title: '选择', type:'radio', width: 70}, |
| | | {type:'seq',fixed:"left", title:' ', width: 50}, |
| | | {type: 'checkbox', fixed: "left", title: t('basicData.check'), width: 80}, |
| | | {field: 'id', title: '物料编码',}, |
| | | {field:'state',title: t('order.width'),}, |
| | | {type: 'seq',title: t('order.height')}, |
| | | {field: 'id', title: t('order.totalThickness'),}, |
| | | {field: 'id', title: t('warehouseBasicData.type'),}, |
| | | {field: 'id', title: '左修边',}, |
| | | {field: 'id', title: '下修边',}, |
| | | {field: 'id', title: '右修边',}, |
| | | {field: 'id', title: '上修边',}, |
| | | {field: 'id', title: '库存数量',}, |
| | | {field: 'id', title: '加工数量',}, |
| | | {field: 'id', title: '名称',}, |
| | | {field: 'id', title: '供应商',} |
| | | {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',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,//表格数据 |
| | | toolbarConfig: { |
| | | buttons: [], |
| | | slots:{ |
| | | buttons: "toolbar_buttons" |
| | | //右键菜单 |
| | | menuConfig: { |
| | | body: { |
| | | options: [ |
| | | [ |
| | | {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: [], |
| | | }, |
| | | }) |
| | | |
| | | const emit = defineEmits(['select-trimming'],['checkboxChange']); |
| | | // 右键菜单 |
| | | const operationConfigs = [ |
| | | { |
| | | code: 'selectTrimming', // 设置统一修边 |
| | | successMsg: '已打开!', |
| | | gridRef: xGrid, |
| | | requiresRow: false, |
| | | openTrimming: async () => { |
| | | // 获取当前选中的记录 |
| | | const selectedRecords = xGrid.value.getCheckboxRecords(); |
| | | // 发送事件给父组件,包含选中的数据 |
| | | emit('select-trimming', { |
| | | action: 'open-trimming-dialog', |
| | | selectedData: selectedRecords && selectedRecords.length > 0 ? selectedRecords : null, |
| | | timestamp: Date.now() |
| | | }); |
| | | } |
| | | }, |
| | | { |
| | | code: 'Exports', // 导出文件操作的配置 |
| | | successMsg: '文件导出成功!', |
| | | 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('添加成功!'); |
| | | } |
| | | } |
| | | } |
| | | ] |
| | | |
| | | // 右键菜单点击逻辑 |
| | | 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; |
| | | } |
| | | 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); |
| | | // } |
| | | }).catch(() => { |
| | | // 用户点击取消后执行的逻辑 |
| | | ElMessage.info('已取消操作'); |
| | | }); |
| | | } else { |
| | | console.error(`未找到操作选项 ${menu.code} 对应的配置,请检查配置项`); |
| | | } |
| | | } |
| | | }, |
| | | }; |
| | | |
| | | |
| | | const route = useRoute(); |
| | | |
| | | const thickness = ref(route.params.thickNess); |
| | | const model = ref(route.params.model); |
| | | let projectNo = ref(null); |
| | | let type = ref(1); |
| | | |
| | | 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 = {}; |
| | | for (const key in item) { |
| | | if (typeof item[key] === 'string') { |
| | | //去除字符串属性值开头和结尾的双引号 |
| | | formattedItem[key] = item[key].replace(/^\"|\"$/g, ''); |
| | | } else { |
| | | formattedItem[key] = item[key]; |
| | | } |
| | | } |
| | | if (!formattedItem.thickness) { |
| | | formattedItem.thickness = thickness.value; |
| | | } |
| | | if (!formattedItem.model) { |
| | | formattedItem.model = model.value; |
| | | } |
| | | return formattedItem; |
| | | }); |
| | | 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 { |
| | | ElMessage.warning(res.msg); |
| | | console.error('请求获取库存失败,状态码:', res.code, ',错误信息:', res.msg); |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | const defaultTrims = reactive({ |
| | | leftTrim: 0, |
| | | downTrim: 0, |
| | | rightTrim: 0, |
| | | upTrim: 0 |
| | | }); |
| | | |
| | | onMounted(() => { |
| | | 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 }); |
| | | |
| | | 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 : { |
| | | type: Object, |
| | | required: false, |
| | | properties: { |
| | | quicksetLeft: { type: Number }, |
| | | quicksetBottom: { type: Number }, |
| | | quicksetRight: { type: Number }, |
| | | quicksetTop: { type: Number } |
| | | } |
| | | }, |
| | | InventoryData : { |
| | | type: Object, |
| | | required: false, |
| | | properties: { |
| | | selectedLabel1: { type: String }, |
| | | selectedLabel2: { type: String }, |
| | | type: { type: String } |
| | | } |
| | | } |
| | | }); |
| | | |
| | | //接受SetTrimming的值 (修边) |
| | | const Trimming = (receivedData) => { |
| | | nextTick(() => { |
| | | const data = gridOptions.data; |
| | | if (data) { |
| | | try { |
| | | // 检查是否只对选中的项目应用修边 |
| | | 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, |
| | | leftTrim: Number(receivedData.quicksetLeft), |
| | | downTrim: Number(receivedData.quicksetBottom), |
| | | rightTrim: Number(receivedData.quicksetRight), |
| | | upTrim: Number(receivedData.quicksetTop), |
| | | }; |
| | | }); |
| | | |
| | | gridOptions.data = updatedData; |
| | | xGrid.value.loadData(updatedData); |
| | | } catch (error) { |
| | | console.error('更新表格数据时出错:', error); |
| | | ElMessage.error('更新表格数据时出现错误,请检查输入或联系管理员'); |
| | | } |
| | | } else { |
| | | console.warn('表格数据为空,无法更新磨量值'); |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | |
| | | const checkboxChanges= () => { |
| | | return xGrid.value.getCheckboxRecords(); |
| | | } |
| | | |
| | | defineExpose({checkboxChanges}) |
| | | </script> |
| | | |
| | | <template> |
| | | <div style="width: 100%;height: 100%"> |
| | | <vxe-grid |
| | | @filter-change="filterChanged" |
| | | height="100%" |
| | | class="mytable-scrollbar" |
| | | ref="xGrid" |