云
2026-10-31 964cfa12263cf51b2a3d1ef281130d0e808e9078
src/views/mes/pro/feedback/modules/form.vue
@@ -31,6 +31,7 @@
import BatchInputDialog from './batch-input-dialog.vue';
import ItemConsumeList from './item-consume-list.vue';
import ProductProduceList from './product-produce-list.vue';
import FeedbackParamFields from '../components/FeedbackParamFields.vue';
const emit = defineEmits(['success']);
const formType = ref<FormType>('create');
@@ -39,6 +40,10 @@
const userStore = useUserStore();
const subTabsName = ref('itemConsume');
const originalSnapshot = ref(''); // 表单原始数据快照,用于 submit 时跳过未变更的保存请求
const paramTaskId = ref<number>();
const paramSnapshot = ref<string>();
const paramFields = ref<InstanceType<typeof FeedbackParamFields>>();
function onParamTaskChange(taskId?: number) { paramTaskId.value = taskId; paramSnapshot.value = undefined; }
const isEditable = computed(() =>
  ['create', 'submit', 'update'].includes(formType.value),
@@ -102,9 +107,10 @@
}
/** 读取并按提交规则对齐后的表单数据,用于快照和保存 */
async function getAlignedData(): Promise<MesProFeedbackApi.Feedback> {
async function getAlignedData(includeParams = true): Promise<MesProFeedbackApi.Feedback> {
  const data = (await formApi.getValues()) as MesProFeedbackApi.Feedback;
  alignQuantity(data);
  if (includeParams) data.paramValues = paramFields.value?.getValues();
  return data;
}
@@ -125,7 +131,7 @@
        status: MesProFeedbackStatusEnum.PREPARE,
      };
      formType.value = 'update';
      formApi.setState({ schema: useFormSchema(formType.value, formApi) });
      formApi.setState({ schema: useFormSchema(formType.value, formApi, onParamTaskChange) });
      await formApi.setFieldValue('id', id);
      message.success($t('common.createSuccess'));
    } else {
@@ -253,6 +259,8 @@
  async onOpenChange(isOpen: boolean) {
    if (!isOpen) {
      formData.value = undefined;
      paramTaskId.value = undefined;
      paramSnapshot.value = undefined;
      subTabsName.value = 'itemConsume';
      originalSnapshot.value = '';
      return;
@@ -261,7 +269,7 @@
    const data = modalApi.getData<{ formType: FormType; id?: number; showSubmitButton?: boolean }>();
    formType.value = data.formType;
    showSubmitButton.value = data.showSubmitButton !== false;
    formApi.setState({ schema: useFormSchema(formType.value, formApi) });
    formApi.setState({ schema: useFormSchema(formType.value, formApi, onParamTaskChange) });
    // 审批/详情整表禁用,避免审核人误改未提交的字段
    formApi.setDisabled(
      formType.value === 'approve' || formType.value === 'detail',
@@ -283,12 +291,14 @@
        feedbackUserId: userStore.userInfo?.id,
      });
      // 记录初始快照(含数量对齐结果),submit 时用于跳过无变更的保存请求
      originalSnapshot.value = JSON.stringify(await getAlignedData());
      originalSnapshot.value = JSON.stringify(await getAlignedData(false));
      return;
    }
    modalApi.lock();
    try {
      formData.value = await getFeedback(data.id);
      paramTaskId.value = formData.value.taskId;
      paramSnapshot.value = formData.value.paramSnapshot;
      const checkFlag = await resolveCheckFlag(
        formData.value.routeId,
        formData.value.processId,
@@ -296,7 +306,7 @@
      // 设置到 values
      await formApi.setValues({ ...formData.value, checkFlag });
      // 记录初始快照(含数量对齐结果),submit 时用于跳过无变更的保存请求
      originalSnapshot.value = JSON.stringify(await getAlignedData());
      originalSnapshot.value = JSON.stringify(await getAlignedData(false));
    } finally {
      modalApi.unlock();
    }
@@ -307,6 +317,7 @@
<template>
  <Modal :title="getTitle" class="w-3/5">
    <Form class="mx-4" />
    <FeedbackParamFields ref="paramFields" :task-id="paramTaskId" :snapshot="paramSnapshot" :readonly="!isEditable" />
    <Tabs
      v-if="showSubTabs"
      v-model:active-key="subTabsName"