| | |
| | | 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'); |
| | |
| | | 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), |
| | |
| | | } |
| | | |
| | | /** 读取并按提交规则对齐后的表单数据,用于快照和保存 */ |
| | | 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; |
| | | } |
| | | |
| | |
| | | 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 { |
| | |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | | formData.value = undefined; |
| | | paramTaskId.value = undefined; |
| | | paramSnapshot.value = undefined; |
| | | subTabsName.value = 'itemConsume'; |
| | | originalSnapshot.value = ''; |
| | | return; |
| | |
| | | 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', |
| | |
| | | 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, |
| | |
| | | // 设置到 values |
| | | await formApi.setValues({ ...formData.value, checkFlag }); |
| | | // 记录初始快照(含数量对齐结果),submit 时用于跳过无变更的保存请求 |
| | | originalSnapshot.value = JSON.stringify(await getAlignedData()); |
| | | originalSnapshot.value = JSON.stringify(await getAlignedData(false)); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | |
| | | <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" |