| <template> | 
|   <ContentScrollView :paddingH="false"> | 
|     <nut-form :model-value="form" ref="formRef" :rules="rules"> | 
|       <nut-form-item label="证书类型:" class="bole-form-item" prop="typeCode"> | 
|         <ChooseInputWithPicker | 
|           v-model="form.typeCode" | 
|           placeholder="请选择证书类型" | 
|           :value-enum="certificateTypeList" | 
|         /> | 
|       </nut-form-item> | 
|       <nut-form-item label="证书编号:" class="bole-form-item" prop="code"> | 
|         <nut-input v-model="form.code" type="number" placeholder="请输入"> </nut-input> | 
|       </nut-form-item> | 
|       <nut-form-item | 
|         label="永久证书:" | 
|         class="bole-form-item permanent-certificate" | 
|         prop="isForever" | 
|       > | 
|         <nut-switch v-model="form.isForever" /> | 
|       </nut-form-item> | 
|       <template v-if="!form.isForever"> | 
|         <nut-form-item label="开始日期:" class="bole-form-item" prop="startDate"> | 
|           <ChooseInputWithDatePicker | 
|             v-model="form.startDate" | 
|             placeholder="请选择开始日期" | 
|           ></ChooseInputWithDatePicker> | 
|         </nut-form-item> | 
|         <nut-form-item label="结束日期:" class="bole-form-item" prop="endDate"> | 
|           <ChooseInputWithDatePicker | 
|             v-model="form.endDate" | 
|             placeholder="请选择结束日期" | 
|           ></ChooseInputWithDatePicker> | 
|         </nut-form-item> | 
|       </template> | 
|       <nut-form-item label="发证单位:" class="bole-form-item" prop="issueUnit"> | 
|         <nut-input v-model="form.issueUnit" placeholder="请输入"> </nut-input> | 
|       </nut-form-item> | 
|       <div class="certificate-upload"> | 
|         <div class="certificate-upload-title">上传证书</div> | 
|         <nut-form-item | 
|           label="证书正面照片(请确保证书号、头像照片等清晰可见)" | 
|           class="bole-form-item" | 
|           prop="img" | 
|           label-position="top" | 
|         > | 
|           <Uploader v-model:file-list="form.img" :maximum="1" class="bole-uploader"> </Uploader> | 
|         </nut-form-item> | 
|         <nut-form-item | 
|           label="证书反面照片(或其他有内容页)" | 
|           class="bole-form-item" | 
|           prop="backImg" | 
|           label-position="top" | 
|         > | 
|           <Uploader v-model:file-list="form.backImg" :maximum="1" class="bole-uploader"> </Uploader> | 
|         </nut-form-item> | 
|       </div> | 
|     </nut-form> | 
|   </ContentScrollView> | 
|   <PageFooter> | 
|     <PageFooterBtn type="primary" @click="handleConfirm">保存</PageFooterBtn> | 
|   </PageFooter> | 
| </template> | 
|   | 
| <script setup lang="ts"> | 
| import { ChooseInputWithPicker, ChooseInputWithDatePicker } from '@12333/components'; | 
| import * as userResumeServices from '@12333/services/apiV2/userResume'; | 
| import { FormRules } from '@nutui/nutui-taro/dist/types/__VUE/form/types'; | 
| import { useQuery, useQueryClient } from '@tanstack/vue-query'; | 
| import Taro from '@tarojs/taro'; | 
| import { useDictionaryDataSelect, useUpdateResume } from '@12333/hooks'; | 
| import { CategoryCode } from '@12333/constants'; | 
| import { convertApi2FormUrlOnlyOne, Message, setOSSLink, FormValidator } from '@12333/utils'; | 
| import dayjs from 'dayjs'; | 
| import { goBack } from '@/utils'; | 
|   | 
| defineOptions({ | 
|   name: 'InnerPage', | 
| }); | 
|   | 
| const router = Taro.useRouter(); | 
| const id = router.params?.id as string; | 
| const isEdit = computed(() => !!id); | 
| const { updateUserResumeCredentials } = useUpdateResume(); | 
|   | 
| const { dictionaryDataList: certificateTypeList } = useDictionaryDataSelect({ | 
|   categoryCode: CategoryCode.CertificateType, | 
| }); | 
|   | 
| const form = reactive({ | 
|   typeCode: '', | 
|   code: '', | 
|   startDate: '', | 
|   endDate: '', | 
|   issueUnit: '', | 
|   isForever: false, | 
|   img: [], | 
|   backImg: [], | 
| }); | 
|   | 
| const { | 
|   isLoading, | 
|   isError, | 
|   data: detail, | 
|   refetch, | 
| } = useQuery({ | 
|   queryKey: ['userResumeServices/getUserResumeCredential', id], | 
|   queryFn: async () => { | 
|     return await userResumeServices.getUserResumeCredential( | 
|       { id: id }, | 
|       { | 
|         showLoading: false, | 
|       } | 
|     ); | 
|   }, | 
|   placeholderData: () => ({} as API.GetUserResumeCredentialQueryResult), | 
|   enabled: computed(() => isEdit.value), | 
|   onSuccess(data) { | 
|     form.typeCode = data.typeCode; | 
|     form.code = data.code; | 
|     form.startDate = data.startDate ? dayjs(data.startDate).format('YYYY-MM-DD') : ''; | 
|     form.endDate = data.startDate ? dayjs(data.endDate).format('YYYY-MM-DD') : ''; | 
|     form.issueUnit = data.issueUnit; | 
|     form.isForever = data.isForever; | 
|     form.img = convertApi2FormUrlOnlyOne(setOSSLink(data.img)); | 
|     form.backImg = convertApi2FormUrlOnlyOne(setOSSLink(data.backImg)); | 
|   }, | 
| }); | 
|   | 
| const rules = reactive<FormRules>({ | 
|   typeCode: [{ required: true, message: '请选择证书类型' }], | 
|   startDate: [{ required: true, message: '请选择开始日期' }], | 
|   endDate: [ | 
|     { | 
|       required: true, | 
|       message: '请选择结束日期', | 
|       validator(value) { | 
|         if (!value) return Promise.reject('请选择结束日期'); | 
|         if (value <= form.startDate) return Promise.reject('结束日期不能小于开始日期'); | 
|         return Promise.resolve(true); | 
|       }, | 
|     }, | 
|   ], | 
|   img: [{ required: true, message: '请上传证书正面照', validator: FormValidator.validatorArray }], | 
|   backImg: [ | 
|     { required: true, message: '请上传证书反面照', validator: FormValidator.validatorArray }, | 
|   ], | 
| }); | 
| const formRef = ref<any>(null); | 
| function handleConfirm() { | 
|   if (!formRef.value) return; | 
|   formRef.value.validate().then(({ valid, errors }: any) => { | 
|     if (valid) { | 
|       confirm(); | 
|     } | 
|   }); | 
| } | 
|   | 
| async function confirm() { | 
|   try { | 
|     let params: API.SaveUserResumeCredentialCommand = { | 
|       typeCode: form.typeCode, | 
|       code: form.code, | 
|       isForever: form.isForever, | 
|       startDate: form.isForever ? '' : dayjs(form.startDate).format('YYYY-MM-DD 00:00:00'), | 
|       endDate: form.isForever ? '' : dayjs(form.endDate).format('YYYY-MM-DD 23:59:59'), | 
|       issueUnit: form.issueUnit, | 
|       img: form.img?.[0]?.path, | 
|       backImg: form.backImg?.[0]?.path, | 
|     }; | 
|     if (isEdit.value) { | 
|       params.id = id; | 
|     } | 
|     let res = await userResumeServices.saveUserResumeCredential(params); | 
|     if (res) { | 
|       Message.success(isEdit.value ? '编辑成功' : '添加成功', { | 
|         onClosed() { | 
|           goBack(); | 
|           updateUserResumeCredentials(); | 
|         }, | 
|       }); | 
|     } | 
|   } catch (error) {} | 
| } | 
| </script> | 
|   | 
| <style lang="scss"> | 
| @import '@/styles/common.scss'; | 
|   | 
| .mineCertificateAddOrEdit-page-wrapper { | 
|   .nut-form .nut-cell.bole-form-item:not(.alignTop), | 
|   page .nut-form .nut-cell.bole-form-item:not(.alignTop) { | 
|     align-items: flex-start !important; | 
|   } | 
|   | 
|   .permanent-certificate { | 
|     --nut-form-item-body-slots-text-align: right; | 
|   } | 
|   | 
|   .certificate-upload { | 
|     .certificate-upload-title { | 
|       font-size: 28px; | 
|       padding: 26px 32px 0; | 
|     } | 
|   | 
|     .nut-form-item__label { | 
|       padding-right: 0; | 
|       font-size: 24px; | 
|       width: 98%; | 
|     } | 
|   } | 
| } | 
| </style> |