zrd пре 4 месеци
родитељ
комит
4ae63740e5

+ 51 - 0
src/api/member/userbusinesslicense/index.ts

@@ -0,0 +1,51 @@
+import request from '@/config/axios'
+
+// 营业执照信息 VO
+export interface UserBusinessLicenseVO {
+  id: number // 自增主键
+  unifiedSocialCreditCode: string // 统一社会信用代码
+  businessName: string // 名称
+  businessType: string // 类型
+  legalRepresentative: string // 法定代表人
+  registeredCapital: string // 注册资本
+  establishmentDate: Date // 成立日期
+  businessAddress: string // 住所
+  businessScope: string // 经营范围
+  registrationAuthority: string // 登记机关
+  issueDate: Date // 发证日期
+  infoImages: string // 相关照片
+  infoStatus: string // 数据使用状态 0 使用 1 作废  2 异常
+}
+
+// 营业执照信息 API
+export const UserBusinessLicenseApi = {
+  // 查询营业执照信息分页
+  getUserBusinessLicensePage: async (params: any) => {
+    return await request.get({ url: `/member/user-business-license/page`, params })
+  },
+
+  // 查询营业执照信息详情
+  getUserBusinessLicense: async (id: number) => {
+    return await request.get({ url: `/member/user-business-license/get?id=` + id })
+  },
+
+  // 新增营业执照信息
+  createUserBusinessLicense: async (data: UserBusinessLicenseVO) => {
+    return await request.post({ url: `/member/user-business-license/create`, data })
+  },
+
+  // 修改营业执照信息
+  updateUserBusinessLicense: async (data: UserBusinessLicenseVO) => {
+    return await request.put({ url: `/member/user-business-license/update`, data })
+  },
+
+  // 删除营业执照信息
+  deleteUserBusinessLicense: async (id: number) => {
+    return await request.delete({ url: `/member/user-business-license/delete?id=` + id })
+  },
+
+  // 导出营业执照信息 Excel
+  exportUserBusinessLicense: async (params) => {
+    return await request.download({ url: `/member/user-business-license/export-excel`, params })
+  }
+}

+ 51 - 0
src/api/member/useridcard/index.ts

@@ -0,0 +1,51 @@
+import request from '@/config/axios'
+
+// 身份证信息 VO
+export interface UserIdcardVO {
+  id: number // 自增主键
+  userId: number // 用户编号
+  name: string // 姓名
+  gender: string // 性别
+  ethnicity: string // 民族
+  birthDate: Date // 出生日期
+  address: string // 住址
+  idCardNumber: string // 公民身份号码
+  issuingAuthority: string // 签发机关
+  validityStart: Date // 有效期开始日期
+  validityEnd: Date // 有效期结束日期
+  infoImages: string // 相关照片
+  infoStatus: string // 数据使用状态 0 使用 1 作废  2 异常
+}
+
+// 身份证信息 API
+export const UserIdcardApi = {
+  // 查询身份证信息分页
+  getUserIdcardPage: async (params: any) => {
+    return await request.get({ url: `/member/user-idcard/page`, params })
+  },
+
+  // 查询身份证信息详情
+  getUserIdcard: async (id: number) => {
+    return await request.get({ url: `/member/user-idcard/get?id=` + id })
+  },
+
+  // 新增身份证信息
+  createUserIdcard: async (data: UserIdcardVO) => {
+    return await request.post({ url: `/member/user-idcard/create`, data })
+  },
+
+  // 修改身份证信息
+  updateUserIdcard: async (data: UserIdcardVO) => {
+    return await request.put({ url: `/member/user-idcard/update`, data })
+  },
+
+  // 删除身份证信息
+  deleteUserIdcard: async (id: number) => {
+    return await request.delete({ url: `/member/user-idcard/delete?id=` + id })
+  },
+
+  // 导出身份证信息 Excel
+  exportUserIdcard: async (params) => {
+    return await request.download({ url: `/member/user-idcard/export-excel`, params })
+  }
+}

+ 46 - 0
src/api/member/userinformation/index.ts

@@ -0,0 +1,46 @@
+import request from '@/config/axios'
+
+// 用户信息 VO
+export interface UserInformationVO {
+  id: number // 自增主键
+  userId: number // 用户编号
+  creditInformation: string // 个人征信信息
+  idCardInformation: string // 个人身份证信息
+  businessLicenseInformation: string // 个人营业执照信息
+  creditId: number // 征信id
+  idCardId: number // 身份证ID
+  businessLicenseId: number // 营业执照id
+}
+
+// 用户信息 API
+export const UserInformationApi = {
+  // 查询用户信息分页
+  getUserInformationPage: async (params: any) => {
+    return await request.get({ url: `/member/user-information/page`, params })
+  },
+
+  // 查询用户信息详情
+  getUserInformation: async (id: number) => {
+    return await request.get({ url: `/member/user-information/get?id=` + id })
+  },
+
+  // 新增用户信息
+  createUserInformation: async (data: UserInformationVO) => {
+    return await request.post({ url: `/member/user-information/create`, data })
+  },
+
+  // 修改用户信息
+  updateUserInformation: async (data: UserInformationVO) => {
+    return await request.put({ url: `/member/user-information/update`, data })
+  },
+
+  // 删除用户信息
+  deleteUserInformation: async (id: number) => {
+    return await request.delete({ url: `/member/user-information/delete?id=` + id })
+  },
+
+  // 导出用户信息 Excel
+  exportUserInformation: async (params) => {
+    return await request.download({ url: `/member/user-information/export-excel`, params })
+  }
+}

+ 93 - 0
src/api/member/userpersonalcredit/index.ts

@@ -0,0 +1,93 @@
+import request from '@/config/axios'
+
+// 个人信用报告 VO
+export interface UserPersonalCreditVO {
+  id: number // 自增主键
+  userId: number // 用户编号
+  reportNumber: string // 报告编号
+  reportTime: Date // 报告时间
+  name: string // 被查询者姓名
+  idCardType: string // 被查询者证件类型
+  idCardNumber: string // 被查询者证件号码
+  queryOrganization: string // 查询机构
+  queryReason: string // 查询原因
+  disputeInfo: string // 异议信息提示
+  gender: string // 性别
+  birthDate: Date // 出生日期
+  maritalStatus: string // 婚姻状况
+  employmentStatus: string // 就业状况
+  education: string // 学历
+  degree: string // 学位
+  nationality: string // 国籍
+  email: string // 电子邮箱
+  communicationAddress: string // 通讯地址
+  householdAddress: string // 户籍地址
+  loanType: string // 信贷交易业务类型
+  loanAccountCount: number // 信贷交易账户数
+  firstLoanMonth: string // 首笔业务发放月份
+  nonCyclicLoanManagementCount: number // 非循环贷管理机构数
+  nonCyclicLoanAccountCount: number // 非循环贷账户数
+  nonCyclicLoanCreditTotal: number // 非循环贷授信总额
+  nonCyclicLoanBalance: number // 非循环贷余额
+  nonCyclicLoanAvgRepayment: number // 非循环贷近6个月平均应还款
+  cyclicLoanManagementCount1: number // 循环贷账户一管理机构数
+  cyclicLoanAccountCount1: number // 循环贷账户一账户数
+  cyclicLoanCreditTotal1: number // 循环贷账户一授信总额
+  cyclicLoanBalance1: number // 循环贷账户一余额
+  cyclicLoanAvgRepayment1: number // 循环贷账户一近6个月平均应还款
+  cyclicLoanManagementCount2: number // 循环贷账户二管理机构数
+  cyclicLoanAccountCount2: number // 循环贷账户二账户数
+  cyclicLoanCreditTotal2: number // 循环贷账户二授信总额
+  cyclicLoanBalance2: number // 循环贷账户二余额
+  cyclicLoanAvgRepayment2: number // 循环贷账户二近6个月平均应还款
+  creditCardIssuerCount: number // 贷记卡发卡机构数
+  creditCardAccountCount: number // 贷记卡账户数
+  creditCardCreditTotal: number // 贷记卡授信总额
+  creditCardMaxCredit: number // 贷记卡单家机构最高授信额
+  creditCardMinCredit: number // 贷记卡单家机构最低授信额
+  creditCardUsedLimit: number // 贷记卡已用额度
+  creditCardAvgUsage: number // 贷记卡近6个月平均使用额度
+  queryOrganizationCountLastMonth: number // 最近1个月内的查询机构数
+  queryCountLastMonth: number // 最近1个月内的查询次数
+  queryCountLastTwoYears: number // 最近2年内的查询次数
+  loanApprovalCount: number // 贷款审批次数
+  creditCardApprovalCount: number // 信用卡审批次数
+  postLoanManagementCount: number // 贷后管理次数
+  guaranteeQualificationCount: number // 担保资格审查次数
+  specialMerchantCount: number // 特约商户实名审查次数
+  infoImages: string // 相关照片
+  infoStatus: string // 数据使用状态 0 使用 1 作废  2 异常
+}
+
+// 个人信用报告 API
+export const UserPersonalCreditApi = {
+  // 查询个人信用报告分页
+  getUserPersonalCreditPage: async (params: any) => {
+    return await request.get({ url: `/member/user-personal-credit/page`, params })
+  },
+
+  // 查询个人信用报告详情
+  getUserPersonalCredit: async (id: number) => {
+    return await request.get({ url: `/member/user-personal-credit/get?id=` + id })
+  },
+
+  // 新增个人信用报告
+  createUserPersonalCredit: async (data: UserPersonalCreditVO) => {
+    return await request.post({ url: `/member/user-personal-credit/create`, data })
+  },
+
+  // 修改个人信用报告
+  updateUserPersonalCredit: async (data: UserPersonalCreditVO) => {
+    return await request.put({ url: `/member/user-personal-credit/update`, data })
+  },
+
+  // 删除个人信用报告
+  deleteUserPersonalCredit: async (id: number) => {
+    return await request.delete({ url: `/member/user-personal-credit/delete?id=` + id })
+  },
+
+  // 导出个人信用报告 Excel
+  exportUserPersonalCredit: async (params) => {
+    return await request.download({ url: `/member/user-personal-credit/export-excel`, params })
+  }
+}

+ 5 - 3
src/utils/dict.ts

@@ -1,8 +1,8 @@
 /**
  * 数据字典工具类
  */
-import { useDictStoreWithOut } from '@/store/modules/dict'
-import { ElementPlusInfoType } from '@/types/elementPlus'
+import {useDictStoreWithOut} from '@/store/modules/dict'
+import {ElementPlusInfoType} from '@/types/elementPlus'
 
 const dictStore = useDictStoreWithOut()
 
@@ -245,5 +245,7 @@ export enum DICT_TYPE {
   IOT_PLUGIN_STATUS = 'iot_plugin_status', // IOT 插件状态
   IOT_PLUGIN_TYPE = 'iot_plugin_type', // IOT 插件类型
   IOT_DATA_BRIDGE_DIRECTION_ENUM = 'iot_data_bridge_direction_enum', // 桥梁方向
-  IOT_DATA_BRIDGE_TYPE_ENUM = 'iot_data_bridge_type_enum' // 桥梁类型
+  IOT_DATA_BRIDGE_TYPE_ENUM = 'iot_data_bridge_type_enum', // 桥梁类型
+  PRO_TYPE = 'proType', //
+  INFO_STATUS = 'info_status' //
 }

+ 20 - 0
src/views/mall/product/spu/form/InfoForm.vue

@@ -37,6 +37,7 @@
     <el-form-item label="产品关键字" prop="keyword">
       <el-input v-model="formData.keyword" class="w-80!" placeholder="请输入产品关键字" />
     </el-form-item>
+
     <el-form-item label="产品简介" prop="introduction">
       <el-input
         v-model="formData.introduction"
@@ -55,6 +56,22 @@
     <el-form-item label="产品轮播图" prop="sliderPicUrls">
       <UploadImgs v-model="formData.sliderPicUrls" :disabled="isDetail" />
     </el-form-item>
+    <el-form-item label="产品类型" prop="proType">
+      <el-select v-model="formData.proType" placeholder="请选择产品类型">
+        <el-option
+          v-for="dict in getStrDictOptions(DICT_TYPE.PRO_TYPE)"
+          :key="dict.value"
+          :label="dict.label"
+          :value="dict.value"
+        />
+      </el-select>
+    </el-form-item>
+    <el-form-item label="联系人手机号码" prop="phoneNumber">
+      <el-input v-model="formData.phoneNumber" placeholder="请输入联系人手机号码" />
+    </el-form-item>
+    <el-form-item label="联系人二维码路径" prop="qrCodePath">
+      <UploadImg v-model="formData.qrCodePath" />
+    </el-form-item>
   </el-form>
 </template>
 <script lang="ts" setup>
@@ -87,6 +104,9 @@ const formData = reactive<Spu>({
   picUrl: '', // 产品封面图
   sliderPicUrls: [], // 产品轮播图
   introduction: '', // 产品简介
+  proType: undefined,
+  phoneNumber: undefined,
+  qrCodePath: undefined,
   brandId: undefined // 产品品牌
 })
 const rules = reactive({

+ 177 - 0
src/views/member/userbusinesslicense/UserBusinessLicenseForm.vue

@@ -0,0 +1,177 @@
+<template>
+  <Dialog :title="dialogTitle" v-model="dialogVisible">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      label-width="100px"
+      v-loading="formLoading"
+    >
+      <el-form-item label="统一社会信用代码" prop="unifiedSocialCreditCode">
+        <el-input v-model="formData.unifiedSocialCreditCode" placeholder="请输入统一社会信用代码" />
+      </el-form-item>
+      <el-form-item label="名称" prop="businessName">
+        <el-input v-model="formData.businessName" placeholder="请输入名称" />
+      </el-form-item>
+      <el-form-item label="类型" prop="businessType">
+        <el-select v-model="formData.businessType" placeholder="请选择类型">
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="法定代表人" prop="legalRepresentative">
+        <el-input v-model="formData.legalRepresentative" placeholder="请输入法定代表人" />
+      </el-form-item>
+      <el-form-item label="注册资本" prop="registeredCapital">
+        <el-input v-model="formData.registeredCapital" placeholder="请输入注册资本" />
+      </el-form-item>
+      <el-form-item label="成立日期" prop="establishmentDate">
+        <el-date-picker
+          v-model="formData.establishmentDate"
+          type="date"
+          value-format="x"
+          placeholder="选择成立日期"
+        />
+      </el-form-item>
+      <el-form-item label="住所" prop="businessAddress">
+        <el-input v-model="formData.businessAddress" placeholder="请输入住所" />
+      </el-form-item>
+      <el-form-item label="经营范围" prop="businessScope">
+        <el-input v-model="formData.businessScope" placeholder="请输入经营范围" />
+      </el-form-item>
+      <el-form-item label="登记机关" prop="registrationAuthority">
+        <el-input v-model="formData.registrationAuthority" placeholder="请输入登记机关" />
+      </el-form-item>
+      <el-form-item label="发证日期" prop="issueDate">
+        <el-date-picker
+          v-model="formData.issueDate"
+          type="date"
+          value-format="x"
+          placeholder="选择发证日期"
+        />
+      </el-form-item>
+      <el-form-item label="相关照片" prop="infoImages">
+        <el-input v-model="formData.infoImages" placeholder="请输入相关照片" />
+      </el-form-item>
+      <el-form-item label="数据使用状态 0 使用 1 作废  2 异常" prop="infoStatus">
+        <el-radio-group v-model="formData.infoStatus">
+          <el-radio
+            v-for="dict in getStrDictOptions(DICT_TYPE.INFO_STATUS)"
+            :key="dict.value"
+            :label="dict.value"
+          >
+            {{ dict.label }}
+          </el-radio>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+<script setup lang="ts">
+import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
+import { UserBusinessLicenseApi, UserBusinessLicenseVO } from '@/api/member/userbusinesslicense'
+
+/** 营业执照信息 表单 */
+defineOptions({ name: 'UserBusinessLicenseForm' })
+
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+
+const dialogVisible = ref(false) // 弹窗的是否展示
+const dialogTitle = ref('') // 弹窗的标题
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formType = ref('') // 表单的类型:create - 新增;update - 修改
+const formData = ref({
+  id: undefined,
+  unifiedSocialCreditCode: undefined,
+  businessName: undefined,
+  businessType: undefined,
+  legalRepresentative: undefined,
+  registeredCapital: undefined,
+  establishmentDate: undefined,
+  businessAddress: undefined,
+  businessScope: undefined,
+  registrationAuthority: undefined,
+  issueDate: undefined,
+  infoImages: undefined,
+  infoStatus: undefined
+})
+const formRules = reactive({
+  unifiedSocialCreditCode: [{ required: true, message: '统一社会信用代码不能为空', trigger: 'blur' }],
+  businessName: [{ required: true, message: '名称不能为空', trigger: 'blur' }],
+  businessType: [{ required: true, message: '类型不能为空', trigger: 'change' }],
+  legalRepresentative: [{ required: true, message: '法定代表人不能为空', trigger: 'blur' }],
+  registeredCapital: [{ required: true, message: '注册资本不能为空', trigger: 'blur' }],
+  establishmentDate: [{ required: true, message: '成立日期不能为空', trigger: 'blur' }],
+  businessAddress: [{ required: true, message: '住所不能为空', trigger: 'blur' }],
+  businessScope: [{ required: true, message: '经营范围不能为空', trigger: 'blur' }],
+  registrationAuthority: [{ required: true, message: '登记机关不能为空', trigger: 'blur' }],
+  issueDate: [{ required: true, message: '发证日期不能为空', trigger: 'blur' }]
+})
+const formRef = ref() // 表单 Ref
+
+/** 打开弹窗 */
+const open = async (type: string, id?: number) => {
+  dialogVisible.value = true
+  dialogTitle.value = t('action.' + type)
+  formType.value = type
+  resetForm()
+  // 修改时,设置数据
+  if (id) {
+    formLoading.value = true
+    try {
+      formData.value = await UserBusinessLicenseApi.getUserBusinessLicense(id)
+    } finally {
+      formLoading.value = false
+    }
+  }
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+  // 校验表单
+  await formRef.value.validate()
+  // 提交请求
+  formLoading.value = true
+  try {
+    const data = formData.value as unknown as UserBusinessLicenseVO
+    if (formType.value === 'create') {
+      await UserBusinessLicenseApi.createUserBusinessLicense(data)
+      message.success(t('common.createSuccess'))
+    } else {
+      await UserBusinessLicenseApi.updateUserBusinessLicense(data)
+      message.success(t('common.updateSuccess'))
+    }
+    dialogVisible.value = false
+    // 发送操作成功的事件
+    emit('success')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    id: undefined,
+    unifiedSocialCreditCode: undefined,
+    businessName: undefined,
+    businessType: undefined,
+    legalRepresentative: undefined,
+    registeredCapital: undefined,
+    establishmentDate: undefined,
+    businessAddress: undefined,
+    businessScope: undefined,
+    registrationAuthority: undefined,
+    issueDate: undefined,
+    infoImages: undefined,
+    infoStatus: undefined
+  }
+  formRef.value?.resetFields()
+}
+</script>

+ 324 - 0
src/views/member/userbusinesslicense/index.vue

@@ -0,0 +1,324 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="统一社会信用代码" prop="unifiedSocialCreditCode">
+        <el-input
+          v-model="queryParams.unifiedSocialCreditCode"
+          placeholder="请输入统一社会信用代码"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="名称" prop="businessName">
+        <el-input
+          v-model="queryParams.businessName"
+          placeholder="请输入名称"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="类型" prop="businessType">
+        <el-select
+          v-model="queryParams.businessType"
+          placeholder="请选择类型"
+          clearable
+          class="!w-240px"
+        >
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="法定代表人" prop="legalRepresentative">
+        <el-input
+          v-model="queryParams.legalRepresentative"
+          placeholder="请输入法定代表人"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="注册资本" prop="registeredCapital">
+        <el-input
+          v-model="queryParams.registeredCapital"
+          placeholder="请输入注册资本"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="成立日期" prop="establishmentDate">
+        <el-date-picker
+          v-model="queryParams.establishmentDate"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-220px"
+        />
+      </el-form-item>
+      <el-form-item label="住所" prop="businessAddress">
+        <el-input
+          v-model="queryParams.businessAddress"
+          placeholder="请输入住所"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="经营范围" prop="businessScope">
+        <el-input
+          v-model="queryParams.businessScope"
+          placeholder="请输入经营范围"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="登记机关" prop="registrationAuthority">
+        <el-input
+          v-model="queryParams.registrationAuthority"
+          placeholder="请输入登记机关"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="发证日期" prop="issueDate">
+        <el-date-picker
+          v-model="queryParams.issueDate"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-220px"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker
+          v-model="queryParams.createTime"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-220px"
+        />
+      </el-form-item>
+      <el-form-item label="相关照片" prop="infoImages">
+        <el-input
+          v-model="queryParams.infoImages"
+          placeholder="请输入相关照片"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="数据使用状态 0 使用 1 作废  2 异常" prop="infoStatus">
+        <el-select
+          v-model="queryParams.infoStatus"
+          placeholder="请选择数据使用状态 0 使用 1 作废  2 异常"
+          clearable
+          class="!w-240px"
+        >
+          <el-option
+            v-for="dict in getStrDictOptions(DICT_TYPE.INFO_STATUS)"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+        <el-button
+          type="primary"
+          plain
+          @click="openForm('create')"
+          v-hasPermi="['member:user-business-license:create']"
+        >
+          <Icon icon="ep:plus" class="mr-5px" /> 新增
+        </el-button>
+        <el-button
+          type="success"
+          plain
+          @click="handleExport"
+          :loading="exportLoading"
+          v-hasPermi="['member:user-business-license:export']"
+        >
+          <Icon icon="ep:download" class="mr-5px" /> 导出
+        </el-button>
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+
+  <!-- 列表 -->
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
+      <el-table-column label="自增主键" align="center" prop="id" />
+      <el-table-column label="统一社会信用代码" align="center" prop="unifiedSocialCreditCode" />
+      <el-table-column label="名称" align="center" prop="businessName" />
+      <el-table-column label="类型" align="center" prop="businessType" />
+      <el-table-column label="法定代表人" align="center" prop="legalRepresentative" />
+      <el-table-column label="注册资本" align="center" prop="registeredCapital" />
+      <el-table-column label="成立日期" align="center" prop="establishmentDate" />
+      <el-table-column label="住所" align="center" prop="businessAddress" />
+      <el-table-column label="经营范围" align="center" prop="businessScope" />
+      <el-table-column label="登记机关" align="center" prop="registrationAuthority" />
+      <el-table-column label="发证日期" align="center" prop="issueDate" />
+      <el-table-column
+        label="创建时间"
+        align="center"
+        prop="createTime"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+      <el-table-column label="相关照片" align="center" prop="infoImages" />
+      <el-table-column label="数据使用状态 0 使用 1 作废  2 异常" align="center" prop="infoStatus">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.INFO_STATUS" :value="scope.row.infoStatus" />
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" min-width="120px">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            @click="openForm('update', scope.row.id)"
+            v-hasPermi="['member:user-business-license:update']"
+          >
+            编辑
+          </el-button>
+          <el-button
+            link
+            type="danger"
+            @click="handleDelete(scope.row.id)"
+            v-hasPermi="['member:user-business-license:delete']"
+          >
+            删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+
+  <!-- 表单弹窗:添加/修改 -->
+  <UserBusinessLicenseForm ref="formRef" @success="getList" />
+</template>
+
+<script setup lang="ts">
+import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
+import { dateFormatter } from '@/utils/formatTime'
+import download from '@/utils/download'
+import { UserBusinessLicenseApi, UserBusinessLicenseVO } from '@/api/member/userbusinesslicense'
+import UserBusinessLicenseForm from './UserBusinessLicenseForm.vue'
+
+/** 营业执照信息 列表 */
+defineOptions({ name: 'UserBusinessLicense' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const loading = ref(true) // 列表的加载中
+const list = ref<UserBusinessLicenseVO[]>([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  unifiedSocialCreditCode: undefined,
+  businessName: undefined,
+  businessType: undefined,
+  legalRepresentative: undefined,
+  registeredCapital: undefined,
+  establishmentDate: [],
+  businessAddress: undefined,
+  businessScope: undefined,
+  registrationAuthority: undefined,
+  issueDate: [],
+  createTime: [],
+  infoImages: undefined,
+  infoStatus: undefined
+})
+const queryFormRef = ref() // 搜索的表单
+const exportLoading = ref(false) // 导出的加载中
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await UserBusinessLicenseApi.getUserBusinessLicensePage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 添加/修改操作 */
+const formRef = ref()
+const openForm = (type: string, id?: number) => {
+  formRef.value.open(type, id)
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (id: number) => {
+  try {
+    // 删除的二次确认
+    await message.delConfirm()
+    // 发起删除
+    await UserBusinessLicenseApi.deleteUserBusinessLicense(id)
+    message.success(t('common.delSuccess'))
+    // 刷新列表
+    await getList()
+  } catch {}
+}
+
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await UserBusinessLicenseApi.exportUserBusinessLicense(queryParams)
+    download.excel(data, '营业执照信息.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>

+ 170 - 0
src/views/member/useridcard/UserIdcardForm.vue

@@ -0,0 +1,170 @@
+<template>
+  <Dialog :title="dialogTitle" v-model="dialogVisible">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      label-width="100px"
+      v-loading="formLoading"
+    >
+      <el-form-item label="用户编号" prop="userId">
+        <el-input v-model="formData.userId" placeholder="请输入用户编号" />
+      </el-form-item>
+      <el-form-item label="姓名" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入姓名" />
+      </el-form-item>
+      <el-form-item label="性别" prop="gender">
+        <el-input v-model="formData.gender" placeholder="请输入性别" />
+      </el-form-item>
+      <el-form-item label="民族" prop="ethnicity">
+        <el-input v-model="formData.ethnicity" placeholder="请输入民族" />
+      </el-form-item>
+      <el-form-item label="出生日期" prop="birthDate">
+        <el-date-picker
+          v-model="formData.birthDate"
+          type="date"
+          value-format="x"
+          placeholder="选择出生日期"
+        />
+      </el-form-item>
+      <el-form-item label="住址" prop="address">
+        <el-input v-model="formData.address" placeholder="请输入住址" />
+      </el-form-item>
+      <el-form-item label="公民身份号码" prop="idCardNumber">
+        <el-input v-model="formData.idCardNumber" placeholder="请输入公民身份号码" />
+      </el-form-item>
+      <el-form-item label="签发机关" prop="issuingAuthority">
+        <el-input v-model="formData.issuingAuthority" placeholder="请输入签发机关" />
+      </el-form-item>
+      <el-form-item label="有效期开始日期" prop="validityStart">
+        <el-input v-model="formData.validityStart" placeholder="请输入有效期开始日期" />
+      </el-form-item>
+      <el-form-item label="有效期结束日期" prop="validityEnd">
+        <el-input v-model="formData.validityEnd" placeholder="请输入有效期结束日期" />
+      </el-form-item>
+      <el-form-item label="相关照片" prop="infoImages">
+        <el-input v-model="formData.infoImages" placeholder="请输入相关照片" />
+      </el-form-item>
+      <el-form-item label="数据使用状态 0 使用 1 作废  2 异常" prop="infoStatus">
+        <el-radio-group v-model="formData.infoStatus">
+          <el-radio
+            v-for="dict in getStrDictOptions(DICT_TYPE.INFO_STATUS)"
+            :key="dict.value"
+            :label="dict.value"
+          >
+            {{ dict.label }}
+          </el-radio>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+<script setup lang="ts">
+import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
+import { UserIdcardApi, UserIdcardVO } from '@/api/member/useridcard'
+
+/** 身份证信息 表单 */
+defineOptions({ name: 'UserIdcardForm' })
+
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+
+const dialogVisible = ref(false) // 弹窗的是否展示
+const dialogTitle = ref('') // 弹窗的标题
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formType = ref('') // 表单的类型:create - 新增;update - 修改
+const formData = ref({
+  id: undefined,
+  userId: undefined,
+  name: undefined,
+  gender: undefined,
+  ethnicity: undefined,
+  birthDate: undefined,
+  address: undefined,
+  idCardNumber: undefined,
+  issuingAuthority: undefined,
+  validityStart: undefined,
+  validityEnd: undefined,
+  infoImages: undefined,
+  infoStatus: undefined
+})
+const formRules = reactive({
+  userId: [{ required: true, message: '用户编号不能为空', trigger: 'blur' }],
+  name: [{ required: true, message: '姓名不能为空', trigger: 'blur' }],
+  gender: [{ required: true, message: '性别不能为空', trigger: 'blur' }],
+  ethnicity: [{ required: true, message: '民族不能为空', trigger: 'blur' }],
+  birthDate: [{ required: true, message: '出生日期不能为空', trigger: 'blur' }],
+  address: [{ required: true, message: '住址不能为空', trigger: 'blur' }],
+  idCardNumber: [{ required: true, message: '公民身份号码不能为空', trigger: 'blur' }],
+  issuingAuthority: [{ required: true, message: '签发机关不能为空', trigger: 'blur' }],
+  validityStart: [{ required: true, message: '有效期开始日期不能为空', trigger: 'blur' }],
+  validityEnd: [{ required: true, message: '有效期结束日期不能为空', trigger: 'blur' }]
+})
+const formRef = ref() // 表单 Ref
+
+/** 打开弹窗 */
+const open = async (type: string, id?: number) => {
+  dialogVisible.value = true
+  dialogTitle.value = t('action.' + type)
+  formType.value = type
+  resetForm()
+  // 修改时,设置数据
+  if (id) {
+    formLoading.value = true
+    try {
+      formData.value = await UserIdcardApi.getUserIdcard(id)
+    } finally {
+      formLoading.value = false
+    }
+  }
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+  // 校验表单
+  await formRef.value.validate()
+  // 提交请求
+  formLoading.value = true
+  try {
+    const data = formData.value as unknown as UserIdcardVO
+    if (formType.value === 'create') {
+      await UserIdcardApi.createUserIdcard(data)
+      message.success(t('common.createSuccess'))
+    } else {
+      await UserIdcardApi.updateUserIdcard(data)
+      message.success(t('common.updateSuccess'))
+    }
+    dialogVisible.value = false
+    // 发送操作成功的事件
+    emit('success')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    id: undefined,
+    userId: undefined,
+    name: undefined,
+    gender: undefined,
+    ethnicity: undefined,
+    birthDate: undefined,
+    address: undefined,
+    idCardNumber: undefined,
+    issuingAuthority: undefined,
+    validityStart: undefined,
+    validityEnd: undefined,
+    infoImages: undefined,
+    infoStatus: undefined
+  }
+  formRef.value?.resetFields()
+}
+</script>

+ 321 - 0
src/views/member/useridcard/index.vue

@@ -0,0 +1,321 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="用户编号" prop="userId">
+        <el-input
+          v-model="queryParams.userId"
+          placeholder="请输入用户编号"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="姓名" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入姓名"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="性别" prop="gender">
+        <el-input
+          v-model="queryParams.gender"
+          placeholder="请输入性别"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="民族" prop="ethnicity">
+        <el-input
+          v-model="queryParams.ethnicity"
+          placeholder="请输入民族"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="出生日期" prop="birthDate">
+        <el-date-picker
+          v-model="queryParams.birthDate"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-220px"
+        />
+      </el-form-item>
+      <el-form-item label="住址" prop="address">
+        <el-input
+          v-model="queryParams.address"
+          placeholder="请输入住址"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="公民身份号码" prop="idCardNumber">
+        <el-input
+          v-model="queryParams.idCardNumber"
+          placeholder="请输入公民身份号码"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="签发机关" prop="issuingAuthority">
+        <el-input
+          v-model="queryParams.issuingAuthority"
+          placeholder="请输入签发机关"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="有效期开始日期" prop="validityStart">
+        <el-input
+          v-model="queryParams.validityStart"
+          placeholder="请输入有效期开始日期"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="有效期结束日期" prop="validityEnd">
+        <el-input
+          v-model="queryParams.validityEnd"
+          placeholder="请输入有效期结束日期"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker
+          v-model="queryParams.createTime"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-220px"
+        />
+      </el-form-item>
+      <el-form-item label="相关照片" prop="infoImages">
+        <el-input
+          v-model="queryParams.infoImages"
+          placeholder="请输入相关照片"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="数据使用状态 0 使用 1 作废  2 异常" prop="infoStatus">
+        <el-select
+          v-model="queryParams.infoStatus"
+          placeholder="请选择数据使用状态 0 使用 1 作废  2 异常"
+          clearable
+          class="!w-240px"
+        >
+          <el-option
+            v-for="dict in getStrDictOptions(DICT_TYPE.INFO_STATUS)"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+        <el-button
+          type="primary"
+          plain
+          @click="openForm('create')"
+          v-hasPermi="['member:user-idcard:create']"
+        >
+          <Icon icon="ep:plus" class="mr-5px" /> 新增
+        </el-button>
+        <el-button
+          type="success"
+          plain
+          @click="handleExport"
+          :loading="exportLoading"
+          v-hasPermi="['member:user-idcard:export']"
+        >
+          <Icon icon="ep:download" class="mr-5px" /> 导出
+        </el-button>
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+
+  <!-- 列表 -->
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
+      <el-table-column label="自增主键" align="center" prop="id" />
+      <el-table-column label="用户编号" align="center" prop="userId" />
+      <el-table-column label="姓名" align="center" prop="name" />
+      <el-table-column label="性别" align="center" prop="gender" />
+      <el-table-column label="民族" align="center" prop="ethnicity" />
+      <el-table-column label="出生日期" align="center" prop="birthDate" />
+      <el-table-column label="住址" align="center" prop="address" />
+      <el-table-column label="公民身份号码" align="center" prop="idCardNumber" />
+      <el-table-column label="签发机关" align="center" prop="issuingAuthority" />
+      <el-table-column label="有效期开始日期" align="center" prop="validityStart" />
+      <el-table-column label="有效期结束日期" align="center" prop="validityEnd" />
+      <el-table-column
+        label="创建时间"
+        align="center"
+        prop="createTime"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+      <el-table-column label="相关照片" align="center" prop="infoImages" />
+      <el-table-column label="数据使用状态 0 使用 1 作废  2 异常" align="center" prop="infoStatus">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.INFO_STATUS" :value="scope.row.infoStatus" />
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" min-width="120px">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            @click="openForm('update', scope.row.id)"
+            v-hasPermi="['member:user-idcard:update']"
+          >
+            编辑
+          </el-button>
+          <el-button
+            link
+            type="danger"
+            @click="handleDelete(scope.row.id)"
+            v-hasPermi="['member:user-idcard:delete']"
+          >
+            删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+
+  <!-- 表单弹窗:添加/修改 -->
+  <UserIdcardForm ref="formRef" @success="getList" />
+</template>
+
+<script setup lang="ts">
+import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
+import { dateFormatter } from '@/utils/formatTime'
+import download from '@/utils/download'
+import { UserIdcardApi, UserIdcardVO } from '@/api/member/useridcard'
+import UserIdcardForm from './UserIdcardForm.vue'
+
+/** 身份证信息 列表 */
+defineOptions({ name: 'UserIdcard' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const loading = ref(true) // 列表的加载中
+const list = ref<UserIdcardVO[]>([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  userId: undefined,
+  name: undefined,
+  gender: undefined,
+  ethnicity: undefined,
+  birthDate: [],
+  address: undefined,
+  idCardNumber: undefined,
+  issuingAuthority: undefined,
+  validityStart: undefined,
+  validityEnd: undefined,
+  createTime: [],
+  infoImages: undefined,
+  infoStatus: undefined
+})
+const queryFormRef = ref() // 搜索的表单
+const exportLoading = ref(false) // 导出的加载中
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await UserIdcardApi.getUserIdcardPage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 添加/修改操作 */
+const formRef = ref()
+const openForm = (type: string, id?: number) => {
+  formRef.value.open(type, id)
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (id: number) => {
+  try {
+    // 删除的二次确认
+    await message.delConfirm()
+    // 发起删除
+    await UserIdcardApi.deleteUserIdcard(id)
+    message.success(t('common.delSuccess'))
+    // 刷新列表
+    await getList()
+  } catch {}
+}
+
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await UserIdcardApi.exportUserIdcard(queryParams)
+    download.excel(data, '身份证信息.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>

+ 122 - 0
src/views/member/userinformation/UserInformationForm.vue

@@ -0,0 +1,122 @@
+<template>
+  <Dialog :title="dialogTitle" v-model="dialogVisible">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      label-width="100px"
+      v-loading="formLoading"
+    >
+      <el-form-item label="用户编号" prop="userId">
+        <el-input v-model="formData.userId" placeholder="请输入用户编号" />
+      </el-form-item>
+      <el-form-item label="个人征信信息" prop="creditInformation">
+        <el-input v-model="formData.creditInformation" placeholder="请输入个人征信信息" />
+      </el-form-item>
+      <el-form-item label="个人身份证信息" prop="idCardInformation">
+        <el-input v-model="formData.idCardInformation" placeholder="请输入个人身份证信息" />
+      </el-form-item>
+      <el-form-item label="个人营业执照信息" prop="businessLicenseInformation">
+        <el-input v-model="formData.businessLicenseInformation" placeholder="请输入个人营业执照信息" />
+      </el-form-item>
+      <el-form-item label="征信id" prop="creditId">
+        <el-input v-model="formData.creditId" placeholder="请输入征信id" />
+      </el-form-item>
+      <el-form-item label="身份证ID" prop="idCardId">
+        <el-input v-model="formData.idCardId" placeholder="请输入身份证ID" />
+      </el-form-item>
+      <el-form-item label="营业执照id" prop="businessLicenseId">
+        <el-input v-model="formData.businessLicenseId" placeholder="请输入营业执照id" />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+<script setup lang="ts">
+import { UserInformationApi, UserInformationVO } from '@/api/member/userinformation'
+
+/** 用户信息 表单 */
+defineOptions({ name: 'UserInformationForm' })
+
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+
+const dialogVisible = ref(false) // 弹窗的是否展示
+const dialogTitle = ref('') // 弹窗的标题
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formType = ref('') // 表单的类型:create - 新增;update - 修改
+const formData = ref({
+  id: undefined,
+  userId: undefined,
+  creditInformation: undefined,
+  idCardInformation: undefined,
+  businessLicenseInformation: undefined,
+  creditId: undefined,
+  idCardId: undefined,
+  businessLicenseId: undefined
+})
+const formRules = reactive({
+  userId: [{ required: true, message: '用户编号不能为空', trigger: 'blur' }]
+})
+const formRef = ref() // 表单 Ref
+
+/** 打开弹窗 */
+const open = async (type: string, id?: number) => {
+  dialogVisible.value = true
+  dialogTitle.value = t('action.' + type)
+  formType.value = type
+  resetForm()
+  // 修改时,设置数据
+  if (id) {
+    formLoading.value = true
+    try {
+      formData.value = await UserInformationApi.getUserInformation(id)
+    } finally {
+      formLoading.value = false
+    }
+  }
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+  // 校验表单
+  await formRef.value.validate()
+  // 提交请求
+  formLoading.value = true
+  try {
+    const data = formData.value as unknown as UserInformationVO
+    if (formType.value === 'create') {
+      await UserInformationApi.createUserInformation(data)
+      message.success(t('common.createSuccess'))
+    } else {
+      await UserInformationApi.updateUserInformation(data)
+      message.success(t('common.updateSuccess'))
+    }
+    dialogVisible.value = false
+    // 发送操作成功的事件
+    emit('success')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    id: undefined,
+    userId: undefined,
+    creditInformation: undefined,
+    idCardInformation: undefined,
+    businessLicenseInformation: undefined,
+    creditId: undefined,
+    idCardId: undefined,
+    businessLicenseId: undefined
+  }
+  formRef.value?.resetFields()
+}
+</script>

+ 253 - 0
src/views/member/userinformation/index.vue

@@ -0,0 +1,253 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="用户编号" prop="userId">
+        <el-input
+          v-model="queryParams.userId"
+          placeholder="请输入用户编号"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="个人征信信息" prop="creditInformation">
+        <el-input
+          v-model="queryParams.creditInformation"
+          placeholder="请输入个人征信信息"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="个人身份证信息" prop="idCardInformation">
+        <el-input
+          v-model="queryParams.idCardInformation"
+          placeholder="请输入个人身份证信息"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="个人营业执照信息" prop="businessLicenseInformation">
+        <el-input
+          v-model="queryParams.businessLicenseInformation"
+          placeholder="请输入个人营业执照信息"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker
+          v-model="queryParams.createTime"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-220px"
+        />
+      </el-form-item>
+      <el-form-item label="征信id" prop="creditId">
+        <el-input
+          v-model="queryParams.creditId"
+          placeholder="请输入征信id"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="身份证ID" prop="idCardId">
+        <el-input
+          v-model="queryParams.idCardId"
+          placeholder="请输入身份证ID"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="营业执照id" prop="businessLicenseId">
+        <el-input
+          v-model="queryParams.businessLicenseId"
+          placeholder="请输入营业执照id"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+        <el-button
+          type="primary"
+          plain
+          @click="openForm('create')"
+          v-hasPermi="['member:user-information:create']"
+        >
+          <Icon icon="ep:plus" class="mr-5px" /> 新增
+        </el-button>
+        <el-button
+          type="success"
+          plain
+          @click="handleExport"
+          :loading="exportLoading"
+          v-hasPermi="['member:user-information:export']"
+        >
+          <Icon icon="ep:download" class="mr-5px" /> 导出
+        </el-button>
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+
+  <!-- 列表 -->
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
+      <el-table-column label="自增主键" align="center" prop="id" />
+      <el-table-column label="用户编号" align="center" prop="userId" />
+      <el-table-column label="个人征信信息" align="center" prop="creditInformation" />
+      <el-table-column label="个人身份证信息" align="center" prop="idCardInformation" />
+      <el-table-column label="个人营业执照信息" align="center" prop="businessLicenseInformation" />
+      <el-table-column
+        label="创建时间"
+        align="center"
+        prop="createTime"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+      <el-table-column label="征信id" align="center" prop="creditId" />
+      <el-table-column label="身份证ID" align="center" prop="idCardId" />
+      <el-table-column label="营业执照id" align="center" prop="businessLicenseId" />
+      <el-table-column label="操作" align="center" min-width="120px">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            @click="openForm('update', scope.row.id)"
+            v-hasPermi="['member:user-information:update']"
+          >
+            编辑
+          </el-button>
+          <el-button
+            link
+            type="danger"
+            @click="handleDelete(scope.row.id)"
+            v-hasPermi="['member:user-information:delete']"
+          >
+            删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+
+  <!-- 表单弹窗:添加/修改 -->
+  <UserInformationForm ref="formRef" @success="getList" />
+</template>
+
+<script setup lang="ts">
+import { dateFormatter } from '@/utils/formatTime'
+import download from '@/utils/download'
+import { UserInformationApi, UserInformationVO } from '@/api/member/userinformation'
+import UserInformationForm from './UserInformationForm.vue'
+
+/** 用户信息 列表 */
+defineOptions({ name: 'UserInformation' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const loading = ref(true) // 列表的加载中
+const list = ref<UserInformationVO[]>([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  userId: undefined,
+  creditInformation: undefined,
+  idCardInformation: undefined,
+  businessLicenseInformation: undefined,
+  createTime: [],
+  creditId: undefined,
+  idCardId: undefined,
+  businessLicenseId: undefined
+})
+const queryFormRef = ref() // 搜索的表单
+const exportLoading = ref(false) // 导出的加载中
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await UserInformationApi.getUserInformationPage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 添加/修改操作 */
+const formRef = ref()
+const openForm = (type: string, id?: number) => {
+  formRef.value.open(type, id)
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (id: number) => {
+  try {
+    // 删除的二次确认
+    await message.delConfirm()
+    // 发起删除
+    await UserInformationApi.deleteUserInformation(id)
+    message.success(t('common.delSuccess'))
+    // 刷新列表
+    await getList()
+  } catch {}
+}
+
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await UserInformationApi.exportUserInformation(queryParams)
+    download.excel(data, '用户信息.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>

+ 391 - 0
src/views/member/userpersonalcredit/UserPersonalCreditForm.vue

@@ -0,0 +1,391 @@
+<template>
+  <Dialog :title="dialogTitle" v-model="dialogVisible">
+    <el-form
+      ref="formRef"
+      :model="formData"
+      :rules="formRules"
+      label-width="100px"
+      v-loading="formLoading"
+    >
+      <el-form-item label="用户编号" prop="userId">
+        <el-input v-model="formData.userId" placeholder="请输入用户编号" />
+      </el-form-item>
+      <el-form-item label="报告编号" prop="reportNumber">
+        <el-input v-model="formData.reportNumber" placeholder="请输入报告编号" />
+      </el-form-item>
+      <el-form-item label="报告时间" prop="reportTime">
+        <el-date-picker
+          v-model="formData.reportTime"
+          type="date"
+          value-format="x"
+          placeholder="选择报告时间"
+        />
+      </el-form-item>
+      <el-form-item label="被查询者姓名" prop="name">
+        <el-input v-model="formData.name" placeholder="请输入被查询者姓名" />
+      </el-form-item>
+      <el-form-item label="被查询者证件类型" prop="idCardType">
+        <el-input v-model="formData.idCardType" placeholder="请输入被查询者证件类型" />
+      </el-form-item>
+      <el-form-item label="被查询者证件号码" prop="idCardNumber">
+        <el-input v-model="formData.idCardNumber" placeholder="请输入被查询者证件号码" />
+      </el-form-item>
+      <el-form-item label="查询机构" prop="queryOrganization">
+        <el-input v-model="formData.queryOrganization" placeholder="请输入查询机构" />
+      </el-form-item>
+      <el-form-item label="查询原因" prop="queryReason">
+        <el-input v-model="formData.queryReason" placeholder="请输入查询原因" />
+      </el-form-item>
+      <el-form-item label="异议信息提示" prop="disputeInfo">
+        <el-input v-model="formData.disputeInfo" placeholder="请输入异议信息提示" />
+      </el-form-item>
+      <el-form-item label="性别" prop="gender">
+        <el-input v-model="formData.gender" placeholder="请输入性别" />
+      </el-form-item>
+      <el-form-item label="出生日期" prop="birthDate">
+        <el-date-picker
+          v-model="formData.birthDate"
+          type="date"
+          value-format="x"
+          placeholder="选择出生日期"
+        />
+      </el-form-item>
+      <el-form-item label="婚姻状况" prop="maritalStatus">
+        <el-input v-model="formData.maritalStatus" placeholder="请输入婚姻状况" />
+      </el-form-item>
+      <el-form-item label="就业状况" prop="employmentStatus">
+        <el-input v-model="formData.employmentStatus" placeholder="请输入就业状况" />
+      </el-form-item>
+      <el-form-item label="学历" prop="education">
+        <el-input v-model="formData.education" placeholder="请输入学历" />
+      </el-form-item>
+      <el-form-item label="学位" prop="degree">
+        <el-input v-model="formData.degree" placeholder="请输入学位" />
+      </el-form-item>
+      <el-form-item label="国籍" prop="nationality">
+        <el-input v-model="formData.nationality" placeholder="请输入国籍" />
+      </el-form-item>
+      <el-form-item label="电子邮箱" prop="email">
+        <el-input v-model="formData.email" placeholder="请输入电子邮箱" />
+      </el-form-item>
+      <el-form-item label="通讯地址" prop="communicationAddress">
+        <el-input v-model="formData.communicationAddress" placeholder="请输入通讯地址" />
+      </el-form-item>
+      <el-form-item label="户籍地址" prop="householdAddress">
+        <el-input v-model="formData.householdAddress" placeholder="请输入户籍地址" />
+      </el-form-item>
+      <el-form-item label="信贷交易业务类型" prop="loanType">
+        <el-input v-model="formData.loanType" placeholder="请输入信贷交易业务类型" />
+      </el-form-item>
+      <el-form-item label="信贷交易账户数" prop="loanAccountCount">
+        <el-input v-model="formData.loanAccountCount" placeholder="请输入信贷交易账户数" />
+      </el-form-item>
+      <el-form-item label="首笔业务发放月份" prop="firstLoanMonth">
+        <el-input v-model="formData.firstLoanMonth" placeholder="请输入首笔业务发放月份" />
+      </el-form-item>
+      <el-form-item label="非循环贷管理机构数" prop="nonCyclicLoanManagementCount">
+        <el-input v-model="formData.nonCyclicLoanManagementCount" placeholder="请输入非循环贷管理机构数" />
+      </el-form-item>
+      <el-form-item label="非循环贷账户数" prop="nonCyclicLoanAccountCount">
+        <el-input v-model="formData.nonCyclicLoanAccountCount" placeholder="请输入非循环贷账户数" />
+      </el-form-item>
+      <el-form-item label="非循环贷授信总额" prop="nonCyclicLoanCreditTotal">
+        <el-input v-model="formData.nonCyclicLoanCreditTotal" placeholder="请输入非循环贷授信总额" />
+      </el-form-item>
+      <el-form-item label="非循环贷余额" prop="nonCyclicLoanBalance">
+        <el-input v-model="formData.nonCyclicLoanBalance" placeholder="请输入非循环贷余额" />
+      </el-form-item>
+      <el-form-item label="非循环贷近6个月平均应还款" prop="nonCyclicLoanAvgRepayment">
+        <el-input v-model="formData.nonCyclicLoanAvgRepayment" placeholder="请输入非循环贷近6个月平均应还款" />
+      </el-form-item>
+      <el-form-item label="循环贷账户一管理机构数" prop="cyclicLoanManagementCount1">
+        <el-input v-model="formData.cyclicLoanManagementCount1" placeholder="请输入循环贷账户一管理机构数" />
+      </el-form-item>
+      <el-form-item label="循环贷账户一账户数" prop="cyclicLoanAccountCount1">
+        <el-input v-model="formData.cyclicLoanAccountCount1" placeholder="请输入循环贷账户一账户数" />
+      </el-form-item>
+      <el-form-item label="循环贷账户一授信总额" prop="cyclicLoanCreditTotal1">
+        <el-input v-model="formData.cyclicLoanCreditTotal1" placeholder="请输入循环贷账户一授信总额" />
+      </el-form-item>
+      <el-form-item label="循环贷账户一余额" prop="cyclicLoanBalance1">
+        <el-input v-model="formData.cyclicLoanBalance1" placeholder="请输入循环贷账户一余额" />
+      </el-form-item>
+      <el-form-item label="循环贷账户一近6个月平均应还款" prop="cyclicLoanAvgRepayment1">
+        <el-input v-model="formData.cyclicLoanAvgRepayment1" placeholder="请输入循环贷账户一近6个月平均应还款" />
+      </el-form-item>
+      <el-form-item label="循环贷账户二管理机构数" prop="cyclicLoanManagementCount2">
+        <el-input v-model="formData.cyclicLoanManagementCount2" placeholder="请输入循环贷账户二管理机构数" />
+      </el-form-item>
+      <el-form-item label="循环贷账户二账户数" prop="cyclicLoanAccountCount2">
+        <el-input v-model="formData.cyclicLoanAccountCount2" placeholder="请输入循环贷账户二账户数" />
+      </el-form-item>
+      <el-form-item label="循环贷账户二授信总额" prop="cyclicLoanCreditTotal2">
+        <el-input v-model="formData.cyclicLoanCreditTotal2" placeholder="请输入循环贷账户二授信总额" />
+      </el-form-item>
+      <el-form-item label="循环贷账户二余额" prop="cyclicLoanBalance2">
+        <el-input v-model="formData.cyclicLoanBalance2" placeholder="请输入循环贷账户二余额" />
+      </el-form-item>
+      <el-form-item label="循环贷账户二近6个月平均应还款" prop="cyclicLoanAvgRepayment2">
+        <el-input v-model="formData.cyclicLoanAvgRepayment2" placeholder="请输入循环贷账户二近6个月平均应还款" />
+      </el-form-item>
+      <el-form-item label="贷记卡发卡机构数" prop="creditCardIssuerCount">
+        <el-input v-model="formData.creditCardIssuerCount" placeholder="请输入贷记卡发卡机构数" />
+      </el-form-item>
+      <el-form-item label="贷记卡账户数" prop="creditCardAccountCount">
+        <el-input v-model="formData.creditCardAccountCount" placeholder="请输入贷记卡账户数" />
+      </el-form-item>
+      <el-form-item label="贷记卡授信总额" prop="creditCardCreditTotal">
+        <el-input v-model="formData.creditCardCreditTotal" placeholder="请输入贷记卡授信总额" />
+      </el-form-item>
+      <el-form-item label="贷记卡单家机构最高授信额" prop="creditCardMaxCredit">
+        <el-input v-model="formData.creditCardMaxCredit" placeholder="请输入贷记卡单家机构最高授信额" />
+      </el-form-item>
+      <el-form-item label="贷记卡单家机构最低授信额" prop="creditCardMinCredit">
+        <el-input v-model="formData.creditCardMinCredit" placeholder="请输入贷记卡单家机构最低授信额" />
+      </el-form-item>
+      <el-form-item label="贷记卡已用额度" prop="creditCardUsedLimit">
+        <el-input v-model="formData.creditCardUsedLimit" placeholder="请输入贷记卡已用额度" />
+      </el-form-item>
+      <el-form-item label="贷记卡近6个月平均使用额度" prop="creditCardAvgUsage">
+        <el-input v-model="formData.creditCardAvgUsage" placeholder="请输入贷记卡近6个月平均使用额度" />
+      </el-form-item>
+      <el-form-item label="最近1个月内的查询机构数" prop="queryOrganizationCountLastMonth">
+        <el-input v-model="formData.queryOrganizationCountLastMonth" placeholder="请输入最近1个月内的查询机构数" />
+      </el-form-item>
+      <el-form-item label="最近1个月内的查询次数" prop="queryCountLastMonth">
+        <el-input v-model="formData.queryCountLastMonth" placeholder="请输入最近1个月内的查询次数" />
+      </el-form-item>
+      <el-form-item label="最近2年内的查询次数" prop="queryCountLastTwoYears">
+        <el-input v-model="formData.queryCountLastTwoYears" placeholder="请输入最近2年内的查询次数" />
+      </el-form-item>
+      <el-form-item label="贷款审批次数" prop="loanApprovalCount">
+        <el-input v-model="formData.loanApprovalCount" placeholder="请输入贷款审批次数" />
+      </el-form-item>
+      <el-form-item label="信用卡审批次数" prop="creditCardApprovalCount">
+        <el-input v-model="formData.creditCardApprovalCount" placeholder="请输入信用卡审批次数" />
+      </el-form-item>
+      <el-form-item label="贷后管理次数" prop="postLoanManagementCount">
+        <el-input v-model="formData.postLoanManagementCount" placeholder="请输入贷后管理次数" />
+      </el-form-item>
+      <el-form-item label="担保资格审查次数" prop="guaranteeQualificationCount">
+        <el-input v-model="formData.guaranteeQualificationCount" placeholder="请输入担保资格审查次数" />
+      </el-form-item>
+      <el-form-item label="特约商户实名审查次数" prop="specialMerchantCount">
+        <el-input v-model="formData.specialMerchantCount" placeholder="请输入特约商户实名审查次数" />
+      </el-form-item>
+      <el-form-item label="相关照片" prop="infoImages">
+        <el-input v-model="formData.infoImages" placeholder="请输入相关照片" />
+      </el-form-item>
+      <el-form-item label="数据使用状态 0 使用 1 作废  2 异常" prop="infoStatus">
+        <el-radio-group v-model="formData.infoStatus">
+          <el-radio
+            v-for="dict in getStrDictOptions(DICT_TYPE.INFO_STATUS)"
+            :key="dict.value"
+            :label="dict.value"
+          >
+            {{ dict.label }}
+          </el-radio>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+<script setup lang="ts">
+import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
+import { UserPersonalCreditApi, UserPersonalCreditVO } from '@/api/member/userpersonalcredit'
+
+/** 个人信用报告 表单 */
+defineOptions({ name: 'UserPersonalCreditForm' })
+
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+
+const dialogVisible = ref(false) // 弹窗的是否展示
+const dialogTitle = ref('') // 弹窗的标题
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formType = ref('') // 表单的类型:create - 新增;update - 修改
+const formData = ref({
+  id: undefined,
+  userId: undefined,
+  reportNumber: undefined,
+  reportTime: undefined,
+  name: undefined,
+  idCardType: undefined,
+  idCardNumber: undefined,
+  queryOrganization: undefined,
+  queryReason: undefined,
+  disputeInfo: undefined,
+  gender: undefined,
+  birthDate: undefined,
+  maritalStatus: undefined,
+  employmentStatus: undefined,
+  education: undefined,
+  degree: undefined,
+  nationality: undefined,
+  email: undefined,
+  communicationAddress: undefined,
+  householdAddress: undefined,
+  loanType: undefined,
+  loanAccountCount: undefined,
+  firstLoanMonth: undefined,
+  nonCyclicLoanManagementCount: undefined,
+  nonCyclicLoanAccountCount: undefined,
+  nonCyclicLoanCreditTotal: undefined,
+  nonCyclicLoanBalance: undefined,
+  nonCyclicLoanAvgRepayment: undefined,
+  cyclicLoanManagementCount1: undefined,
+  cyclicLoanAccountCount1: undefined,
+  cyclicLoanCreditTotal1: undefined,
+  cyclicLoanBalance1: undefined,
+  cyclicLoanAvgRepayment1: undefined,
+  cyclicLoanManagementCount2: undefined,
+  cyclicLoanAccountCount2: undefined,
+  cyclicLoanCreditTotal2: undefined,
+  cyclicLoanBalance2: undefined,
+  cyclicLoanAvgRepayment2: undefined,
+  creditCardIssuerCount: undefined,
+  creditCardAccountCount: undefined,
+  creditCardCreditTotal: undefined,
+  creditCardMaxCredit: undefined,
+  creditCardMinCredit: undefined,
+  creditCardUsedLimit: undefined,
+  creditCardAvgUsage: undefined,
+  queryOrganizationCountLastMonth: undefined,
+  queryCountLastMonth: undefined,
+  queryCountLastTwoYears: undefined,
+  loanApprovalCount: undefined,
+  creditCardApprovalCount: undefined,
+  postLoanManagementCount: undefined,
+  guaranteeQualificationCount: undefined,
+  specialMerchantCount: undefined,
+  infoImages: undefined,
+  infoStatus: undefined
+})
+const formRules = reactive({
+  userId: [{ required: true, message: '用户编号不能为空', trigger: 'blur' }],
+  reportNumber: [{ required: true, message: '报告编号不能为空', trigger: 'blur' }],
+  reportTime: [{ required: true, message: '报告时间不能为空', trigger: 'blur' }],
+  name: [{ required: true, message: '被查询者姓名不能为空', trigger: 'blur' }],
+  idCardType: [{ required: true, message: '被查询者证件类型不能为空', trigger: 'blur' }],
+  idCardNumber: [{ required: true, message: '被查询者证件号码不能为空', trigger: 'blur' }],
+  queryOrganization: [{ required: true, message: '查询机构不能为空', trigger: 'blur' }],
+  queryReason: [{ required: true, message: '查询原因不能为空', trigger: 'blur' }],
+  gender: [{ required: true, message: '性别不能为空', trigger: 'blur' }],
+  birthDate: [{ required: true, message: '出生日期不能为空', trigger: 'blur' }],
+  maritalStatus: [{ required: true, message: '婚姻状况不能为空', trigger: 'blur' }],
+  employmentStatus: [{ required: true, message: '就业状况不能为空', trigger: 'blur' }],
+  education: [{ required: true, message: '学历不能为空', trigger: 'blur' }],
+  nationality: [{ required: true, message: '国籍不能为空', trigger: 'blur' }],
+  communicationAddress: [{ required: true, message: '通讯地址不能为空', trigger: 'blur' }],
+  householdAddress: [{ required: true, message: '户籍地址不能为空', trigger: 'blur' }]
+})
+const formRef = ref() // 表单 Ref
+
+/** 打开弹窗 */
+const open = async (type: string, id?: number) => {
+  dialogVisible.value = true
+  dialogTitle.value = t('action.' + type)
+  formType.value = type
+  resetForm()
+  // 修改时,设置数据
+  if (id) {
+    formLoading.value = true
+    try {
+      formData.value = await UserPersonalCreditApi.getUserPersonalCredit(id)
+    } finally {
+      formLoading.value = false
+    }
+  }
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+  // 校验表单
+  await formRef.value.validate()
+  // 提交请求
+  formLoading.value = true
+  try {
+    const data = formData.value as unknown as UserPersonalCreditVO
+    if (formType.value === 'create') {
+      await UserPersonalCreditApi.createUserPersonalCredit(data)
+      message.success(t('common.createSuccess'))
+    } else {
+      await UserPersonalCreditApi.updateUserPersonalCredit(data)
+      message.success(t('common.updateSuccess'))
+    }
+    dialogVisible.value = false
+    // 发送操作成功的事件
+    emit('success')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    id: undefined,
+    userId: undefined,
+    reportNumber: undefined,
+    reportTime: undefined,
+    name: undefined,
+    idCardType: undefined,
+    idCardNumber: undefined,
+    queryOrganization: undefined,
+    queryReason: undefined,
+    disputeInfo: undefined,
+    gender: undefined,
+    birthDate: undefined,
+    maritalStatus: undefined,
+    employmentStatus: undefined,
+    education: undefined,
+    degree: undefined,
+    nationality: undefined,
+    email: undefined,
+    communicationAddress: undefined,
+    householdAddress: undefined,
+    loanType: undefined,
+    loanAccountCount: undefined,
+    firstLoanMonth: undefined,
+    nonCyclicLoanManagementCount: undefined,
+    nonCyclicLoanAccountCount: undefined,
+    nonCyclicLoanCreditTotal: undefined,
+    nonCyclicLoanBalance: undefined,
+    nonCyclicLoanAvgRepayment: undefined,
+    cyclicLoanManagementCount1: undefined,
+    cyclicLoanAccountCount1: undefined,
+    cyclicLoanCreditTotal1: undefined,
+    cyclicLoanBalance1: undefined,
+    cyclicLoanAvgRepayment1: undefined,
+    cyclicLoanManagementCount2: undefined,
+    cyclicLoanAccountCount2: undefined,
+    cyclicLoanCreditTotal2: undefined,
+    cyclicLoanBalance2: undefined,
+    cyclicLoanAvgRepayment2: undefined,
+    creditCardIssuerCount: undefined,
+    creditCardAccountCount: undefined,
+    creditCardCreditTotal: undefined,
+    creditCardMaxCredit: undefined,
+    creditCardMinCredit: undefined,
+    creditCardUsedLimit: undefined,
+    creditCardAvgUsage: undefined,
+    queryOrganizationCountLastMonth: undefined,
+    queryCountLastMonth: undefined,
+    queryCountLastTwoYears: undefined,
+    loanApprovalCount: undefined,
+    creditCardApprovalCount: undefined,
+    postLoanManagementCount: undefined,
+    guaranteeQualificationCount: undefined,
+    specialMerchantCount: undefined,
+    infoImages: undefined,
+    infoStatus: undefined
+  }
+  formRef.value?.resetFields()
+}
+</script>

+ 791 - 0
src/views/member/userpersonalcredit/index.vue

@@ -0,0 +1,791 @@
+<template>
+  <ContentWrap>
+    <!-- 搜索工作栏 -->
+    <el-form
+      class="-mb-15px"
+      :model="queryParams"
+      ref="queryFormRef"
+      :inline="true"
+      label-width="68px"
+    >
+      <el-form-item label="用户编号" prop="userId">
+        <el-input
+          v-model="queryParams.userId"
+          placeholder="请输入用户编号"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="报告编号" prop="reportNumber">
+        <el-input
+          v-model="queryParams.reportNumber"
+          placeholder="请输入报告编号"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="报告时间" prop="reportTime">
+        <el-date-picker
+          v-model="queryParams.reportTime"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-220px"
+        />
+      </el-form-item>
+      <el-form-item label="被查询者姓名" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入被查询者姓名"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="被查询者证件类型" prop="idCardType">
+        <el-input
+          v-model="queryParams.idCardType"
+          placeholder="请输入被查询者证件类型"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="被查询者证件号码" prop="idCardNumber">
+        <el-input
+          v-model="queryParams.idCardNumber"
+          placeholder="请输入被查询者证件号码"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="查询机构" prop="queryOrganization">
+        <el-input
+          v-model="queryParams.queryOrganization"
+          placeholder="请输入查询机构"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="查询原因" prop="queryReason">
+        <el-input
+          v-model="queryParams.queryReason"
+          placeholder="请输入查询原因"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="异议信息提示" prop="disputeInfo">
+        <el-input
+          v-model="queryParams.disputeInfo"
+          placeholder="请输入异议信息提示"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="性别" prop="gender">
+        <el-input
+          v-model="queryParams.gender"
+          placeholder="请输入性别"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="出生日期" prop="birthDate">
+        <el-date-picker
+          v-model="queryParams.birthDate"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-220px"
+        />
+      </el-form-item>
+      <el-form-item label="婚姻状况" prop="maritalStatus">
+        <el-input
+          v-model="queryParams.maritalStatus"
+          placeholder="请输入婚姻状况"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="就业状况" prop="employmentStatus">
+        <el-input
+          v-model="queryParams.employmentStatus"
+          placeholder="请输入就业状况"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="学历" prop="education">
+        <el-input
+          v-model="queryParams.education"
+          placeholder="请输入学历"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="学位" prop="degree">
+        <el-input
+          v-model="queryParams.degree"
+          placeholder="请输入学位"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="国籍" prop="nationality">
+        <el-input
+          v-model="queryParams.nationality"
+          placeholder="请输入国籍"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="电子邮箱" prop="email">
+        <el-input
+          v-model="queryParams.email"
+          placeholder="请输入电子邮箱"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="通讯地址" prop="communicationAddress">
+        <el-input
+          v-model="queryParams.communicationAddress"
+          placeholder="请输入通讯地址"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="户籍地址" prop="householdAddress">
+        <el-input
+          v-model="queryParams.householdAddress"
+          placeholder="请输入户籍地址"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="信贷交易业务类型" prop="loanType">
+        <el-input
+          v-model="queryParams.loanType"
+          placeholder="请输入信贷交易业务类型"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="信贷交易账户数" prop="loanAccountCount">
+        <el-input
+          v-model="queryParams.loanAccountCount"
+          placeholder="请输入信贷交易账户数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="首笔业务发放月份" prop="firstLoanMonth">
+        <el-input
+          v-model="queryParams.firstLoanMonth"
+          placeholder="请输入首笔业务发放月份"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="非循环贷管理机构数" prop="nonCyclicLoanManagementCount">
+        <el-input
+          v-model="queryParams.nonCyclicLoanManagementCount"
+          placeholder="请输入非循环贷管理机构数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="非循环贷账户数" prop="nonCyclicLoanAccountCount">
+        <el-input
+          v-model="queryParams.nonCyclicLoanAccountCount"
+          placeholder="请输入非循环贷账户数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="非循环贷授信总额" prop="nonCyclicLoanCreditTotal">
+        <el-input
+          v-model="queryParams.nonCyclicLoanCreditTotal"
+          placeholder="请输入非循环贷授信总额"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="非循环贷余额" prop="nonCyclicLoanBalance">
+        <el-input
+          v-model="queryParams.nonCyclicLoanBalance"
+          placeholder="请输入非循环贷余额"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="非循环贷近6个月平均应还款" prop="nonCyclicLoanAvgRepayment">
+        <el-input
+          v-model="queryParams.nonCyclicLoanAvgRepayment"
+          placeholder="请输入非循环贷近6个月平均应还款"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="循环贷账户一管理机构数" prop="cyclicLoanManagementCount1">
+        <el-input
+          v-model="queryParams.cyclicLoanManagementCount1"
+          placeholder="请输入循环贷账户一管理机构数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="循环贷账户一账户数" prop="cyclicLoanAccountCount1">
+        <el-input
+          v-model="queryParams.cyclicLoanAccountCount1"
+          placeholder="请输入循环贷账户一账户数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="循环贷账户一授信总额" prop="cyclicLoanCreditTotal1">
+        <el-input
+          v-model="queryParams.cyclicLoanCreditTotal1"
+          placeholder="请输入循环贷账户一授信总额"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="循环贷账户一余额" prop="cyclicLoanBalance1">
+        <el-input
+          v-model="queryParams.cyclicLoanBalance1"
+          placeholder="请输入循环贷账户一余额"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="循环贷账户一近6个月平均应还款" prop="cyclicLoanAvgRepayment1">
+        <el-input
+          v-model="queryParams.cyclicLoanAvgRepayment1"
+          placeholder="请输入循环贷账户一近6个月平均应还款"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="循环贷账户二管理机构数" prop="cyclicLoanManagementCount2">
+        <el-input
+          v-model="queryParams.cyclicLoanManagementCount2"
+          placeholder="请输入循环贷账户二管理机构数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="循环贷账户二账户数" prop="cyclicLoanAccountCount2">
+        <el-input
+          v-model="queryParams.cyclicLoanAccountCount2"
+          placeholder="请输入循环贷账户二账户数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="循环贷账户二授信总额" prop="cyclicLoanCreditTotal2">
+        <el-input
+          v-model="queryParams.cyclicLoanCreditTotal2"
+          placeholder="请输入循环贷账户二授信总额"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="循环贷账户二余额" prop="cyclicLoanBalance2">
+        <el-input
+          v-model="queryParams.cyclicLoanBalance2"
+          placeholder="请输入循环贷账户二余额"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="循环贷账户二近6个月平均应还款" prop="cyclicLoanAvgRepayment2">
+        <el-input
+          v-model="queryParams.cyclicLoanAvgRepayment2"
+          placeholder="请输入循环贷账户二近6个月平均应还款"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="贷记卡发卡机构数" prop="creditCardIssuerCount">
+        <el-input
+          v-model="queryParams.creditCardIssuerCount"
+          placeholder="请输入贷记卡发卡机构数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="贷记卡账户数" prop="creditCardAccountCount">
+        <el-input
+          v-model="queryParams.creditCardAccountCount"
+          placeholder="请输入贷记卡账户数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="贷记卡授信总额" prop="creditCardCreditTotal">
+        <el-input
+          v-model="queryParams.creditCardCreditTotal"
+          placeholder="请输入贷记卡授信总额"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="贷记卡单家机构最高授信额" prop="creditCardMaxCredit">
+        <el-input
+          v-model="queryParams.creditCardMaxCredit"
+          placeholder="请输入贷记卡单家机构最高授信额"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="贷记卡单家机构最低授信额" prop="creditCardMinCredit">
+        <el-input
+          v-model="queryParams.creditCardMinCredit"
+          placeholder="请输入贷记卡单家机构最低授信额"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="贷记卡已用额度" prop="creditCardUsedLimit">
+        <el-input
+          v-model="queryParams.creditCardUsedLimit"
+          placeholder="请输入贷记卡已用额度"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="贷记卡近6个月平均使用额度" prop="creditCardAvgUsage">
+        <el-input
+          v-model="queryParams.creditCardAvgUsage"
+          placeholder="请输入贷记卡近6个月平均使用额度"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="最近1个月内的查询机构数" prop="queryOrganizationCountLastMonth">
+        <el-input
+          v-model="queryParams.queryOrganizationCountLastMonth"
+          placeholder="请输入最近1个月内的查询机构数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="最近1个月内的查询次数" prop="queryCountLastMonth">
+        <el-input
+          v-model="queryParams.queryCountLastMonth"
+          placeholder="请输入最近1个月内的查询次数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="最近2年内的查询次数" prop="queryCountLastTwoYears">
+        <el-input
+          v-model="queryParams.queryCountLastTwoYears"
+          placeholder="请输入最近2年内的查询次数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="贷款审批次数" prop="loanApprovalCount">
+        <el-input
+          v-model="queryParams.loanApprovalCount"
+          placeholder="请输入贷款审批次数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="信用卡审批次数" prop="creditCardApprovalCount">
+        <el-input
+          v-model="queryParams.creditCardApprovalCount"
+          placeholder="请输入信用卡审批次数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="贷后管理次数" prop="postLoanManagementCount">
+        <el-input
+          v-model="queryParams.postLoanManagementCount"
+          placeholder="请输入贷后管理次数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="担保资格审查次数" prop="guaranteeQualificationCount">
+        <el-input
+          v-model="queryParams.guaranteeQualificationCount"
+          placeholder="请输入担保资格审查次数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="特约商户实名审查次数" prop="specialMerchantCount">
+        <el-input
+          v-model="queryParams.specialMerchantCount"
+          placeholder="请输入特约商户实名审查次数"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker
+          v-model="queryParams.createTime"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          type="daterange"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
+          class="!w-220px"
+        />
+      </el-form-item>
+      <el-form-item label="相关照片" prop="infoImages">
+        <el-input
+          v-model="queryParams.infoImages"
+          placeholder="请输入相关照片"
+          clearable
+          @keyup.enter="handleQuery"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="数据使用状态 0 使用 1 作废  2 异常" prop="infoStatus">
+        <el-select
+          v-model="queryParams.infoStatus"
+          placeholder="请选择数据使用状态 0 使用 1 作废  2 异常"
+          clearable
+          class="!w-240px"
+        >
+          <el-option
+            v-for="dict in getStrDictOptions(DICT_TYPE.INFO_STATUS)"
+            :key="dict.value"
+            :label="dict.label"
+            :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
+        <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
+        <el-button
+          type="primary"
+          plain
+          @click="openForm('create')"
+          v-hasPermi="['member:user-personal-credit:create']"
+        >
+          <Icon icon="ep:plus" class="mr-5px" /> 新增
+        </el-button>
+        <el-button
+          type="success"
+          plain
+          @click="handleExport"
+          :loading="exportLoading"
+          v-hasPermi="['member:user-personal-credit:export']"
+        >
+          <Icon icon="ep:download" class="mr-5px" /> 导出
+        </el-button>
+      </el-form-item>
+    </el-form>
+  </ContentWrap>
+
+  <!-- 列表 -->
+  <ContentWrap>
+    <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
+      <el-table-column label="自增主键" align="center" prop="id" />
+      <el-table-column label="用户编号" align="center" prop="userId" />
+      <el-table-column label="报告编号" align="center" prop="reportNumber" />
+      <el-table-column
+        label="报告时间"
+        align="center"
+        prop="reportTime"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+      <el-table-column label="被查询者姓名" align="center" prop="name" />
+      <el-table-column label="被查询者证件类型" align="center" prop="idCardType" />
+      <el-table-column label="被查询者证件号码" align="center" prop="idCardNumber" />
+      <el-table-column label="查询机构" align="center" prop="queryOrganization" />
+      <el-table-column label="查询原因" align="center" prop="queryReason" />
+      <el-table-column label="异议信息提示" align="center" prop="disputeInfo" />
+      <el-table-column label="性别" align="center" prop="gender" />
+      <el-table-column label="出生日期" align="center" prop="birthDate" />
+      <el-table-column label="婚姻状况" align="center" prop="maritalStatus" />
+      <el-table-column label="就业状况" align="center" prop="employmentStatus" />
+      <el-table-column label="学历" align="center" prop="education" />
+      <el-table-column label="学位" align="center" prop="degree" />
+      <el-table-column label="国籍" align="center" prop="nationality" />
+      <el-table-column label="电子邮箱" align="center" prop="email" />
+      <el-table-column label="通讯地址" align="center" prop="communicationAddress" />
+      <el-table-column label="户籍地址" align="center" prop="householdAddress" />
+      <el-table-column label="信贷交易业务类型" align="center" prop="loanType" />
+      <el-table-column label="信贷交易账户数" align="center" prop="loanAccountCount" />
+      <el-table-column label="首笔业务发放月份" align="center" prop="firstLoanMonth" />
+      <el-table-column label="非循环贷管理机构数" align="center" prop="nonCyclicLoanManagementCount" />
+      <el-table-column label="非循环贷账户数" align="center" prop="nonCyclicLoanAccountCount" />
+      <el-table-column label="非循环贷授信总额" align="center" prop="nonCyclicLoanCreditTotal" />
+      <el-table-column label="非循环贷余额" align="center" prop="nonCyclicLoanBalance" />
+      <el-table-column label="非循环贷近6个月平均应还款" align="center" prop="nonCyclicLoanAvgRepayment" />
+      <el-table-column label="循环贷账户一管理机构数" align="center" prop="cyclicLoanManagementCount1" />
+      <el-table-column label="循环贷账户一账户数" align="center" prop="cyclicLoanAccountCount1" />
+      <el-table-column label="循环贷账户一授信总额" align="center" prop="cyclicLoanCreditTotal1" />
+      <el-table-column label="循环贷账户一余额" align="center" prop="cyclicLoanBalance1" />
+      <el-table-column label="循环贷账户一近6个月平均应还款" align="center" prop="cyclicLoanAvgRepayment1" />
+      <el-table-column label="循环贷账户二管理机构数" align="center" prop="cyclicLoanManagementCount2" />
+      <el-table-column label="循环贷账户二账户数" align="center" prop="cyclicLoanAccountCount2" />
+      <el-table-column label="循环贷账户二授信总额" align="center" prop="cyclicLoanCreditTotal2" />
+      <el-table-column label="循环贷账户二余额" align="center" prop="cyclicLoanBalance2" />
+      <el-table-column label="循环贷账户二近6个月平均应还款" align="center" prop="cyclicLoanAvgRepayment2" />
+      <el-table-column label="贷记卡发卡机构数" align="center" prop="creditCardIssuerCount" />
+      <el-table-column label="贷记卡账户数" align="center" prop="creditCardAccountCount" />
+      <el-table-column label="贷记卡授信总额" align="center" prop="creditCardCreditTotal" />
+      <el-table-column label="贷记卡单家机构最高授信额" align="center" prop="creditCardMaxCredit" />
+      <el-table-column label="贷记卡单家机构最低授信额" align="center" prop="creditCardMinCredit" />
+      <el-table-column label="贷记卡已用额度" align="center" prop="creditCardUsedLimit" />
+      <el-table-column label="贷记卡近6个月平均使用额度" align="center" prop="creditCardAvgUsage" />
+      <el-table-column label="最近1个月内的查询机构数" align="center" prop="queryOrganizationCountLastMonth" />
+      <el-table-column label="最近1个月内的查询次数" align="center" prop="queryCountLastMonth" />
+      <el-table-column label="最近2年内的查询次数" align="center" prop="queryCountLastTwoYears" />
+      <el-table-column label="贷款审批次数" align="center" prop="loanApprovalCount" />
+      <el-table-column label="信用卡审批次数" align="center" prop="creditCardApprovalCount" />
+      <el-table-column label="贷后管理次数" align="center" prop="postLoanManagementCount" />
+      <el-table-column label="担保资格审查次数" align="center" prop="guaranteeQualificationCount" />
+      <el-table-column label="特约商户实名审查次数" align="center" prop="specialMerchantCount" />
+      <el-table-column
+        label="创建时间"
+        align="center"
+        prop="createTime"
+        :formatter="dateFormatter"
+        width="180px"
+      />
+      <el-table-column label="相关照片" align="center" prop="infoImages" />
+      <el-table-column label="数据使用状态 0 使用 1 作废  2 异常" align="center" prop="infoStatus">
+        <template #default="scope">
+          <dict-tag :type="DICT_TYPE.INFO_STATUS" :value="scope.row.infoStatus" />
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" min-width="120px">
+        <template #default="scope">
+          <el-button
+            link
+            type="primary"
+            @click="openForm('update', scope.row.id)"
+            v-hasPermi="['member:user-personal-credit:update']"
+          >
+            编辑
+          </el-button>
+          <el-button
+            link
+            type="danger"
+            @click="handleDelete(scope.row.id)"
+            v-hasPermi="['member:user-personal-credit:delete']"
+          >
+            删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页 -->
+    <Pagination
+      :total="total"
+      v-model:page="queryParams.pageNo"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </ContentWrap>
+
+  <!-- 表单弹窗:添加/修改 -->
+  <UserPersonalCreditForm ref="formRef" @success="getList" />
+</template>
+
+<script setup lang="ts">
+import { getStrDictOptions, DICT_TYPE } from '@/utils/dict'
+import { dateFormatter } from '@/utils/formatTime'
+import download from '@/utils/download'
+import { UserPersonalCreditApi, UserPersonalCreditVO } from '@/api/member/userpersonalcredit'
+import UserPersonalCreditForm from './UserPersonalCreditForm.vue'
+
+/** 个人信用报告 列表 */
+defineOptions({ name: 'UserPersonalCredit' })
+
+const message = useMessage() // 消息弹窗
+const { t } = useI18n() // 国际化
+
+const loading = ref(true) // 列表的加载中
+const list = ref<UserPersonalCreditVO[]>([]) // 列表的数据
+const total = ref(0) // 列表的总页数
+const queryParams = reactive({
+  pageNo: 1,
+  pageSize: 10,
+  userId: undefined,
+  reportNumber: undefined,
+  reportTime: [],
+  name: undefined,
+  idCardType: undefined,
+  idCardNumber: undefined,
+  queryOrganization: undefined,
+  queryReason: undefined,
+  disputeInfo: undefined,
+  gender: undefined,
+  birthDate: [],
+  maritalStatus: undefined,
+  employmentStatus: undefined,
+  education: undefined,
+  degree: undefined,
+  nationality: undefined,
+  email: undefined,
+  communicationAddress: undefined,
+  householdAddress: undefined,
+  loanType: undefined,
+  loanAccountCount: undefined,
+  firstLoanMonth: undefined,
+  nonCyclicLoanManagementCount: undefined,
+  nonCyclicLoanAccountCount: undefined,
+  nonCyclicLoanCreditTotal: undefined,
+  nonCyclicLoanBalance: undefined,
+  nonCyclicLoanAvgRepayment: undefined,
+  cyclicLoanManagementCount1: undefined,
+  cyclicLoanAccountCount1: undefined,
+  cyclicLoanCreditTotal1: undefined,
+  cyclicLoanBalance1: undefined,
+  cyclicLoanAvgRepayment1: undefined,
+  cyclicLoanManagementCount2: undefined,
+  cyclicLoanAccountCount2: undefined,
+  cyclicLoanCreditTotal2: undefined,
+  cyclicLoanBalance2: undefined,
+  cyclicLoanAvgRepayment2: undefined,
+  creditCardIssuerCount: undefined,
+  creditCardAccountCount: undefined,
+  creditCardCreditTotal: undefined,
+  creditCardMaxCredit: undefined,
+  creditCardMinCredit: undefined,
+  creditCardUsedLimit: undefined,
+  creditCardAvgUsage: undefined,
+  queryOrganizationCountLastMonth: undefined,
+  queryCountLastMonth: undefined,
+  queryCountLastTwoYears: undefined,
+  loanApprovalCount: undefined,
+  creditCardApprovalCount: undefined,
+  postLoanManagementCount: undefined,
+  guaranteeQualificationCount: undefined,
+  specialMerchantCount: undefined,
+  createTime: [],
+  infoImages: undefined,
+  infoStatus: undefined
+})
+const queryFormRef = ref() // 搜索的表单
+const exportLoading = ref(false) // 导出的加载中
+
+/** 查询列表 */
+const getList = async () => {
+  loading.value = true
+  try {
+    const data = await UserPersonalCreditApi.getUserPersonalCreditPage(queryParams)
+    list.value = data.list
+    total.value = data.total
+  } finally {
+    loading.value = false
+  }
+}
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.pageNo = 1
+  getList()
+}
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value.resetFields()
+  handleQuery()
+}
+
+/** 添加/修改操作 */
+const formRef = ref()
+const openForm = (type: string, id?: number) => {
+  formRef.value.open(type, id)
+}
+
+/** 删除按钮操作 */
+const handleDelete = async (id: number) => {
+  try {
+    // 删除的二次确认
+    await message.delConfirm()
+    // 发起删除
+    await UserPersonalCreditApi.deleteUserPersonalCredit(id)
+    message.success(t('common.delSuccess'))
+    // 刷新列表
+    await getList()
+  } catch {}
+}
+
+/** 导出按钮操作 */
+const handleExport = async () => {
+  try {
+    // 导出的二次确认
+    await message.exportConfirm()
+    // 发起导出
+    exportLoading.value = true
+    const data = await UserPersonalCreditApi.exportUserPersonalCredit(queryParams)
+    download.excel(data, '个人信用报告.xls')
+  } catch {
+  } finally {
+    exportLoading.value = false
+  }
+}
+
+/** 初始化 **/
+onMounted(() => {
+  getList()
+})
+</script>