<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> 
 |