云
2026-09-28 d7538a8fb830c3de582b25e70566211987c4151f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
<script lang="ts" setup>
import type { FormType } from '../data';
import type { UmsApplicationApi } from '#/api/ums/application';
 
import { computed, ref } from 'vue';
 
import { useVbenModal } from '@vben/common-ui';
import { $t } from '@vben/locales';
 
import { Alert, message } from 'ant-design-vue';
 
import { useVbenForm } from '#/adapter/form';
import {
  createApplication,
  getApplication,
  updateApplication,
} from '#/api/ums/application';
 
import { ApplicationStatus, useFormSchema } from '../data';
 
const emit = defineEmits(['success']);
 
const formData = ref<UmsApplicationApi.Application>({
  memberType: 1,
  applicantName: '',
  memberGrade: '',
  contactPhone: '',
  contactEmail: '',
  legalPerson: '',
  organizationCode: '',
  researchDirection: '',
  workUnit: '',
  title: '',
  regionCode: '',
  industry: '',
  remark: '',
});
 
const formType = ref<FormType>('create'); // 表单类型:'create' | 'edit' | 'detail'
 
const getTitle = computed(() => {
  if (formType.value === 'create') {
    return $t('ui.actionTitle.create', ['入会申请']);
  } else if (formType.value === 'edit') {
    return $t('ui.actionTitle.edit', ['入会申请']);
  } else {
    return '入会申请详情';
  }
});
 
/** 账号凭据提醒:仅在详情态且审批已通过时展示 */
const credentialTip = computed(() => {
  if (
    formType.value !== 'detail' ||
    formData.value.status !== ApplicationStatus.APPROVED
  ) {
    return null;
  }
  const phone = formData.value.contactPhone;
  if (!phone) {
    return {
      type: 'warning' as const,
      message:
        '未填写联系电话,账号用户名/密码使用了兜底值 unknown,请到会员列表核实并手工修正。',
    };
  }
  return {
    type: 'success' as const,
    message: `系统登录账号已自动开通:用户名 ${phone},初始密码 ${phone}。请通知申请人尽快登录并修改密码。`,
  };
});
 
const [Form, formApi] = useVbenForm({
  commonConfig: {
    componentProps: {
      class: 'w-full',
    },
    labelWidth: 120,
  },
  wrapperClass: 'grid-cols-2',
  layout: 'vertical',
  schema: useFormSchema(formType.value),
  showDefaultActions: false,
});
 
/** 创建或更新入会申请 */
const [Modal, modalApi] = useVbenModal({
  async onConfirm() {
    const { valid } = await formApi.validate();
    if (!valid) {
      return;
    }
 
    modalApi.lock();
    const data = (await formApi.getValues()) as UmsApplicationApi.Application;
    // 附件为全量替换语义:清空附件时必须显式传空数组
    data.blobIds = data.blobIds ?? [];
    try {
      await (formType.value === 'create'
        ? createApplication(data)
        : updateApplication(data));
      await modalApi.close();
      emit('success');
      message.success($t('ui.actionMessage.operationSuccess'));
    } finally {
      modalApi.unlock();
    }
  },
  async onOpenChange(isOpen: boolean) {
    if (!isOpen) {
      formData.value = {} as UmsApplicationApi.Application;
      return;
    }
    const data = modalApi.getData<{ formType: FormType; id?: number }>();
    formType.value = data.formType;
    formApi.setDisabled(formType.value === 'detail');
    formApi.updateSchema(useFormSchema(formType.value));
    if (!data || !data.id) {
      // 新建时默认个人会员等级选项
      await formApi.setValues({ memberType: 1 }, false);
      return;
    }
    modalApi.lock();
    try {
      formData.value = await getApplication(data.id);
      // 已有附件转成上传组件可识别的文件对象,提交时按 valueKey=id 提取为 blobId
      const blobIds = (formData.value.attachmentList ?? []).map((item) => ({
        uid: String(item.id),
        name: item.name || '',
        url: item.url || '',
        status: 'done',
        id: item.id,
      }));
      await formApi.setValues(
        { ...formData.value, blobIds },
        false,
      );
    } finally {
      modalApi.unlock();
    }
  },
});
</script>
 
<template>
  <Modal
    :title="getTitle"
    class="w-3/4"
    :close-on-click-modal="false"
    :show-confirm-button="formType !== 'detail'"
  >
    <Alert
      v-if="credentialTip"
      :type="credentialTip.type"
      :message="credentialTip.message"
      show-icon
      class="mx-3 mb-3"
    />
    <Form class="mx-3" />
  </Modal>
</template>