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' }]"
>
getNameChange(value, index, item)">
-
+
@@ -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 @@
-
+