From 27f95371c53a03116d48f3dc04c6f6fa22d54e2e Mon Sep 17 00:00:00 2001 From: taoge1020 Date: Wed, 27 Aug 2025 22:03:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/layout/components/Navbar.vue | 2 +- src/layout/components/Sidebar/SidebarItem.vue | 69 +++++++++++++- src/layout/components/Sidebar/index.vue | 2 +- src/views/design/designChange/indexEdit.vue | 4 +- .../materialIssue/index.vue | 89 ++++++++++++++----- src/views/workflows/task/taskWaiting.vue | 4 +- 6 files changed, 137 insertions(+), 33 deletions(-) diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index ff518f4..8e70d3f 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -23,7 +23,7 @@ - + - + @@ -130,7 +131,7 @@ :rules="[{ required: true, message: '名称不能为空', trigger: 'blur' }]" > - + @@ -200,7 +201,7 @@ - + @@ -304,7 +305,7 @@ const getInitFormData = () => { materialSource: '1', formCode: undefined, projectName: undefined, - materialName: undefined, + materialName: '', // 初始化为空字符串 orderingUnit: undefined, supplierUnit: undefined, issueUnit: undefined, @@ -327,7 +328,7 @@ const getInitFormData = () => { stockQuantity: undefined, issuedQuantity: undefined, remainingQuantity: undefined, - name: undefined, + name: undefined, // 数量验收的名称 remark: undefined, materialsId: undefined } @@ -355,7 +356,7 @@ const data = reactive({ rules: { formCode: [{ required: true, message: '请输入表单编号', trigger: 'blur' }], projectName: [{ required: true, message: '请输入工程名称', trigger: 'blur' }], - materialName: [{ required: true, message: '请输入设备材料名称', trigger: 'blur' }], + materialName: [{ required: true, message: '请先在数量验收列表中选择名称', trigger: 'blur' }], // 确保有名称生成 orderingUnit: [{ required: true, message: '请输入订货单位', trigger: 'blur' }], supplierUnit: [{ required: true, message: '请输入供货单位', trigger: 'blur' }], issueUnit: [{ required: true, message: '请输入领料单位', trigger: 'blur' }], @@ -364,6 +365,24 @@ const data = reactive({ }); const { queryParams, form, rules } = toRefs(data); +const optionsName: any = ref([]); + +/** + * 核心函数:从数量验收列表提取名称,用逗号拼接生成设备材料名称 + */ +const computeMaterialName = () => { + if (!form.value.itemList || form.value.itemList.length === 0) { + form.value.materialName = ''; + return; + } + // 过滤空名称,去重(可选,根据业务需求决定是否去重) + const validNames = form.value.itemList + .filter((item) => item.name && item.name.trim() !== '') + .map((item) => item.name.trim()) + .filter((name, index, self) => self.indexOf(name) === index); // 去重(如需保留重复则删除这行) + + form.value.materialName = validNames.join(','); +}; /** 查询物料领料单列表 */ const getList = async () => { @@ -377,8 +396,6 @@ const getList = async () => { } }; -const optionsName: any = ref([]); - // 获取材料名称列表 const getName = async () => { try { @@ -391,17 +408,16 @@ const getName = async () => { } }; -// 材料名称选择变化处理 +// 材料名称选择变化处理(修改select的value为名称,而非ID) const getNameChange = (value, index, item) => { - const data = optionsName.value.find((item) => item.id == value); - if (data) { - form.value.itemList[index].name = data.materialsName; - form.value.itemList[index].materialsId = data.id; - form.value.itemList[index].specification = data.typeSpecificationName; - form.value.itemList[index].unit = data.weightId; - form.value.itemList[index].stockQuantity = data.inventoryNumber; - // 触发剩余数量计算 - calculateRemaining(index); + const selected = optionsName.value.find((opt) => opt.materialsName === value); + if (selected) { + item.name = selected.materialsName; // 直接赋值名称 + item.materialsId = selected.id; // 保留ID用于后端 + item.specification = selected.typeSpecificationName; + item.unit = selected.weightId; + item.stockQuantity = Number(selected.inventoryNumber) || 0; + calculateRemaining(index); // 计算剩余数量 } }; @@ -477,6 +493,8 @@ const reset = () => { if (form.value.itemList.length > 0) { watchItemChanges(0); } + // 初始计算一次材料名称 + computeMaterialName(); }; /** 监听条目变化,自动计算剩余数量 */ @@ -522,6 +540,8 @@ const handleAdd = () => { reset(); dialog.visible = true; dialog.title = '添加物料领料单'; + // 新增时初始计算材料名称 + computeMaterialName(); }; /** 修改按钮操作 */ @@ -532,33 +552,41 @@ const handleUpdate = async (row?: MaterialIssueVO) => { const res = await getMaterialIssue(_id); Object.assign(form.value, res.data); - // 确保itemList存在 + // 确保itemList存在且格式正确 if (!form.value.itemList) { form.value.itemList = []; } - // 转换数据类型并计算剩余数量(关键修复) + // 转换数据类型并计算剩余数量 form.value.itemList = form.value.itemList.map((item) => ({ ...item, stockQuantity: Number(item.stockQuantity) || 0, issuedQuantity: Number(item.issuedQuantity) || 0, - remainingQuantity: Number(item.remainingQuantity) || 0 + remainingQuantity: Number(item.remainingQuantity) || 0, + name: item.name || '' // 确保名称不为undefined })); // 为每个条目添加监听并强制计算剩余数量 form.value.itemList.forEach((_, index) => { watchItemChanges(index); - calculateRemaining(index); // 强制计算确保数据一致性 + calculateRemaining(index); }); - // 手动触发一次验证(关键修复) + + // 关键:编辑时从itemList重新计算设备材料名称(覆盖后端返回的旧值) + computeMaterialName(); + + // 手动触发一次验证 setTimeout(() => { if (materialIssueFormRef.value) { form.value.itemList.forEach((_, index) => { materialIssueFormRef.value.validateField(`itemList.${index}.issuedQuantity`); materialIssueFormRef.value.validateField(`itemList.${index}.remainingQuantity`); }); + // 验证设备材料名称 + materialIssueFormRef.value.validateField('materialName'); } }, 0); + dialog.visible = true; dialog.title = '修改物料领料单'; } catch (error) { @@ -616,6 +644,8 @@ const addItem = () => { form.value.itemList.push(newItem); // 监听新条目 watchItemChanges(form.value.itemList.length - 1); + // 添加后重新计算材料名称 + computeMaterialName(); }; // 删除数量验收条目 @@ -627,6 +657,8 @@ const removeItem = (index: number) => { } form.value.itemList.splice(index, 1); itemWatchStopFns.value.splice(index, 1); + // 删除后重新计算材料名称 + computeMaterialName(); } else { proxy?.$modal.msgWarning('至少需要保留一条数量验收记录'); } @@ -652,6 +684,15 @@ const handleView = (row) => { wordllssueRef.value?.openDialog(row); }; +// 关键:监听数量验收列表变化,实时更新设备材料名称 +watch( + () => form.value.itemList, + () => { + computeMaterialName(); + }, + { deep: true, immediate: true } // deep监听数组内部变化,immediate初始执行 +); + onMounted(() => { getList(); getName(); diff --git a/src/views/workflows/task/taskWaiting.vue b/src/views/workflows/task/taskWaiting.vue index 02aac32..e678401 100644 --- a/src/views/workflows/task/taskWaiting.vue +++ b/src/views/workflows/task/taskWaiting.vue @@ -4,11 +4,11 @@
- +