liu
2 天以前 fe2d6627b8f1002af7a31b08f6f43bec034d04ee
src/views/research/application/modules/form.vue
@@ -21,7 +21,8 @@
  getPublishedGuidelineList,
} from '#/api/research/guideline';
import { useFormSchema } from '../data';
import { toSubmitMembers, useFormSchema } from '../data';
import MemberTable from './member-table.vue';
defineOptions({ name: 'ResearchApplicationForm' });
@@ -30,6 +31,9 @@
const formType = ref<FormType>('create');
/** 供「所属课题指南」下拉与类别带出使用 */
const guidelines = ref<ResearchGuidelineApi.Guideline[]>([]);
/** 成员表格回显数据源:只在打开弹窗时赋值,增删改只通过 emit 单向流到表单值 */
const initialMembers = ref<ResearchApplicationApi.ApplicationMember[]>([]);
const memberTableRef = ref<InstanceType<typeof MemberTable>>();
const getTitle = computed(() => {
  if (formType.value === 'create') {
@@ -67,7 +71,7 @@
    jobTitle: values.jobTitle,
    contactPhone: values.contactPhone,
    contactEmail: values.contactEmail,
    teamMembers: values.teamMembers,
    members: toSubmitMembers(values.members),
    budgetAmount: values.budgetAmount,
    planContent: values.planContent,
    remark: values.remark,
@@ -81,6 +85,12 @@
  async onConfirm() {
    const { valid } = await formApi.validate();
    if (!valid) {
      return;
    }
    try {
      memberTableRef.value?.validate();
    } catch (error) {
      message.error((error as Error).message || '课题组成员校验失败');
      return;
    }
    modalApi.lock();
@@ -112,6 +122,8 @@
          schema: useFormSchema(formType.value, formApi, guidelines.value),
        });
        formApi.setDisabled(formType.value === 'detail');
        // 成员子表回显:保留原 id 供表格行 key 使用,提交时再剥离
        initialMembers.value = application.members ?? [];
        // 已有附件转成上传组件可识别的文件对象,提交时按 valueKey=id 提取为 blobId
        const blobIds = (application.attachmentList ?? []).map((item) => ({
          uid: String(item.id),
@@ -120,13 +132,21 @@
          status: 'done',
          id: item.id,
        }));
        await formApi.setValues({ ...application, blobIds }, false);
        await formApi.setValues(
          {
            ...application,
            members: toSubmitMembers(application.members),
            blobIds,
          },
          false,
        );
      } else {
        guidelines.value = await getPublishedGuidelineList();
        formApi.setState({
          schema: useFormSchema(formType.value, formApi, guidelines.value),
        });
        formApi.setDisabled(false);
        initialMembers.value = [];
        await formApi.resetForm();
      }
    } finally {
@@ -159,6 +179,16 @@
    :close-on-click-modal="false"
    :show-confirm-button="formType !== 'detail'"
  >
    <Form class="mx-3" />
    <Form class="mx-3">
      <template #members>
        <MemberTable
          ref="memberTableRef"
          :members="initialMembers"
          :disabled="formType === 'detail'"
          class="w-full"
          @update:members="(members) => formApi.setValues({ members }, false)"
        />
      </template>
    </Form>
  </Modal>
</template>