From d1e2202e59224745f6ce04df200cf2499af42e01 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 26 May 2026 22:27:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(mes):=20=E8=BF=81=E7=A7=BB=E7=94=9F?= =?UTF-8?q?=E4=BA=A7=E6=8A=A5=E5=B7=A5=20antd/ele=20=E5=B9=B6=E8=A1=A5?= =?UTF-8?q?=E9=BD=90=E4=BB=BB=E5=8A=A1=E9=80=89=E6=8B=A9=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/mes/pro/feedback/modules/form.vue | 34 +++++++++++++------ .../pro/task/components/pro-task-select.vue | 11 +++--- .../views/mes/pro/feedback/modules/form.vue | 34 +++++++++++++------ .../pro/task/components/pro-task-select.vue | 11 +++--- 4 files changed, 56 insertions(+), 34 deletions(-) diff --git a/apps/web-antd/src/views/mes/pro/feedback/modules/form.vue b/apps/web-antd/src/views/mes/pro/feedback/modules/form.vue index 8b8699b04..d0c8a84ce 100644 --- a/apps/web-antd/src/views/mes/pro/feedback/modules/form.vue +++ b/apps/web-antd/src/views/mes/pro/feedback/modules/form.vue @@ -36,6 +36,7 @@ const formType = ref('create'); const formData = ref(); const userStore = useUserStore(); const subTabsName = ref('itemConsume'); +const originalSnapshot = ref(''); // 表单原始数据快照,用于 submit 时跳过未变更的保存请求 const isEditable = computed(() => ['create', 'submit', 'update'].includes(formType.value), @@ -100,6 +101,13 @@ function alignQuantity(data: MesProFeedbackApi.Feedback) { } } +/** 读取并按提交规则对齐后的表单数据,用于快照和保存 */ +async function getAlignedData(): Promise { + const data = (await formApi.getValues()) as MesProFeedbackApi.Feedback; + alignQuantity(data); + return data; +} + /** 保存:create 后切换为 update 模式 */ async function handleSave() { const { valid } = await formApi.validate(); @@ -108,13 +116,12 @@ async function handleSave() { } modalApi.lock(); try { - const data = (await formApi.getValues()) as MesProFeedbackApi.Feedback; - alignQuantity(data); + const data = await getAlignedData(); if (formType.value === 'create') { const id = await createFeedback(data); + data.id = id; formData.value = { ...data, - id, status: MesProFeedbackStatusEnum.PREPARE, }; formType.value = 'update'; @@ -126,13 +133,15 @@ async function handleSave() { formData.value = { ...formData.value, ...data }; message.success($t('common.updateSuccess')); } + // 刷新快照(已对齐数量并补 id),后续 submit 用于判断是否需要再保存 + originalSnapshot.value = JSON.stringify(data); emit('success'); } finally { modalApi.unlock(); } } -/** 提交:保存最新内容后调用提交接口 */ +/** 提交:仅当表单较快照有变更时才先保存,再调用提交接口 */ async function handleSubmit() { const { valid } = await formApi.validate(); if (!valid) { @@ -140,15 +149,13 @@ async function handleSubmit() { } modalApi.lock(); try { - const data = (await formApi.getValues()) as MesProFeedbackApi.Feedback; - alignQuantity(data); - let id = formData.value?.id; - if (formType.value === 'create' || !id) { - id = await createFeedback(data); - } else { + const data = await getAlignedData(); + // 表单有修改时,先保存 + if (JSON.stringify(data) !== originalSnapshot.value) { await updateFeedback(data); + originalSnapshot.value = JSON.stringify(data); } - await submitFeedback(id!); + await submitFeedback(formData.value!.id!); await modalApi.close(); emit('success'); message.success('报工单已提交'); @@ -217,6 +224,7 @@ const [Modal, modalApi] = useVbenModal({ if (!isOpen) { formData.value = undefined; subTabsName.value = 'itemConsume'; + originalSnapshot.value = ''; return; } // 加载数据 @@ -242,6 +250,8 @@ const [Modal, modalApi] = useVbenModal({ feedbackTime: Date.now(), feedbackUserId: userStore.userInfo?.id, }); + // 记录初始快照(含数量对齐结果),submit 时用于跳过无变更的保存请求 + originalSnapshot.value = JSON.stringify(await getAlignedData()); return; } modalApi.lock(); @@ -253,6 +263,8 @@ const [Modal, modalApi] = useVbenModal({ ); // 设置到 values await formApi.setValues({ ...formData.value, checkFlag }); + // 记录初始快照(含数量对齐结果),submit 时用于跳过无变更的保存请求 + originalSnapshot.value = JSON.stringify(await getAlignedData()); } finally { modalApi.unlock(); } diff --git a/apps/web-antd/src/views/mes/pro/task/components/pro-task-select.vue b/apps/web-antd/src/views/mes/pro/task/components/pro-task-select.vue index fc7e8dae7..60c5e1133 100644 --- a/apps/web-antd/src/views/mes/pro/task/components/pro-task-select.vue +++ b/apps/web-antd/src/views/mes/pro/task/components/pro-task-select.vue @@ -43,12 +43,11 @@ const hovering = ref(false); // 是否悬停 const selectedItem = ref(); // 选中的任务 const displayLabel = computed(() => selectedItem.value?.code ?? ''); // 选择器展示编号 -const showClear = computed( // 是否显示清空图标 - () => - props.allowClear && - !props.disabled && - hovering.value && - props.modelValue !== undefined, +const showClear = computed(() => // 是否显示清空图标 + props.allowClear && + !props.disabled && + hovering.value && + props.modelValue !== undefined, ); /** 根据任务编号回显选择器 */ diff --git a/apps/web-ele/src/views/mes/pro/feedback/modules/form.vue b/apps/web-ele/src/views/mes/pro/feedback/modules/form.vue index da61a777f..91896b74c 100644 --- a/apps/web-ele/src/views/mes/pro/feedback/modules/form.vue +++ b/apps/web-ele/src/views/mes/pro/feedback/modules/form.vue @@ -42,6 +42,7 @@ const formType = ref('create'); const formData = ref(); const userStore = useUserStore(); const subTabsName = ref('itemConsume'); +const originalSnapshot = ref(''); // 表单原始数据快照,用于 submit 时跳过未变更的保存请求 const isEditable = computed(() => ['create', 'submit', 'update'].includes(formType.value), @@ -106,6 +107,13 @@ function alignQuantity(data: MesProFeedbackApi.Feedback) { } } +/** 读取并按提交规则对齐后的表单数据,用于快照和保存 */ +async function getAlignedData(): Promise { + const data = (await formApi.getValues()) as MesProFeedbackApi.Feedback; + alignQuantity(data); + return data; +} + /** 保存:create 后切换为 update 模式 */ async function handleSave() { const { valid } = await formApi.validate(); @@ -114,13 +122,12 @@ async function handleSave() { } modalApi.lock(); try { - const data = (await formApi.getValues()) as MesProFeedbackApi.Feedback; - alignQuantity(data); + const data = await getAlignedData(); if (formType.value === 'create') { const id = await createFeedback(data); + data.id = id; formData.value = { ...data, - id, status: MesProFeedbackStatusEnum.PREPARE, }; formType.value = 'update'; @@ -132,13 +139,15 @@ async function handleSave() { formData.value = { ...formData.value, ...data }; ElMessage.success($t('common.updateSuccess')); } + // 刷新快照(已对齐数量并补 id),后续 submit 用于判断是否需要再保存 + originalSnapshot.value = JSON.stringify(data); emit('success'); } finally { modalApi.unlock(); } } -/** 提交:保存最新内容后调用提交接口 */ +/** 提交:仅当表单较快照有变更时才先保存,再调用提交接口 */ async function handleSubmit() { const { valid } = await formApi.validate(); if (!valid) { @@ -146,15 +155,13 @@ async function handleSubmit() { } modalApi.lock(); try { - const data = (await formApi.getValues()) as MesProFeedbackApi.Feedback; - alignQuantity(data); - let id = formData.value?.id; - if (formType.value === 'create' || !id) { - id = await createFeedback(data); - } else { + const data = await getAlignedData(); + // 表单有修改时,先保存 + if (JSON.stringify(data) !== originalSnapshot.value) { await updateFeedback(data); + originalSnapshot.value = JSON.stringify(data); } - await submitFeedback(id!); + await submitFeedback(formData.value!.id!); await modalApi.close(); emit('success'); ElMessage.success('报工单已提交'); @@ -225,6 +232,7 @@ const [Modal, modalApi] = useVbenModal({ if (!isOpen) { formData.value = undefined; subTabsName.value = 'itemConsume'; + originalSnapshot.value = ''; return; } // 加载数据 @@ -250,6 +258,8 @@ const [Modal, modalApi] = useVbenModal({ feedbackTime: Date.now(), feedbackUserId: userStore.userInfo?.id, }); + // 记录初始快照(含数量对齐结果),submit 时用于跳过无变更的保存请求 + originalSnapshot.value = JSON.stringify(await getAlignedData()); return; } modalApi.lock(); @@ -261,6 +271,8 @@ const [Modal, modalApi] = useVbenModal({ ); // 设置到 values await formApi.setValues({ ...formData.value, checkFlag }); + // 记录初始快照(含数量对齐结果),submit 时用于跳过无变更的保存请求 + originalSnapshot.value = JSON.stringify(await getAlignedData()); } finally { modalApi.unlock(); } diff --git a/apps/web-ele/src/views/mes/pro/task/components/pro-task-select.vue b/apps/web-ele/src/views/mes/pro/task/components/pro-task-select.vue index 99af6c290..41ddaf20a 100644 --- a/apps/web-ele/src/views/mes/pro/task/components/pro-task-select.vue +++ b/apps/web-ele/src/views/mes/pro/task/components/pro-task-select.vue @@ -43,12 +43,11 @@ const hovering = ref(false); // 是否悬停 const selectedItem = ref(); // 选中的任务 const displayLabel = computed(() => selectedItem.value?.code ?? ''); // 选择器展示编号 -const showClear = computed( // 是否显示清空图标 - () => - props.clearable && - !props.disabled && - hovering.value && - props.modelValue !== undefined, +const showClear = computed(() => // 是否显示清空图标 + props.clearable && + !props.disabled && + hovering.value && + props.modelValue !== undefined, ); /** 根据任务编号回显选择器 */