From b494a7d95141bcb9a31861dc7f2f494f2192e716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Mon, 5 Jan 2026 12:44:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(credit):=20=E4=BC=81=E4=B8=9A=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E9=A1=B5=E9=9D=A2=E5=A2=9E=E5=8A=A0=E5=AD=90=E8=A1=A8?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为18个信用相关API的导入方法添加companyId参数支持 - 在企业详情页面的各个子表tab中添加导入和刷新按钮 - 创建credit-company-related-import组件实现统一的导入弹窗 - 新增taxpayerCode字段到用户信息模型中 - 移除企业详情页面中冗余的描述项注释代码 - 实现基于企业ID或纳税人识别号的数据加载缓存机制 - 添加导入模板下载功能和文件类型验证 --- .env.development | 2 +- src/api/credit/creditUser/index.ts | 5 +- .../components/creditCompanyInfo.vue | 178 +++++++++++++++--- 3 files changed, 156 insertions(+), 29 deletions(-) diff --git a/.env.development b/.env.development index b8ccd8b..fbcc74b 100644 --- a/.env.development +++ b/.env.development @@ -1,5 +1,5 @@ VITE_APP_NAME=后台管理(开发环境) -#VITE_API_URL=http://127.0.0.1:9200/api +VITE_API_URL=http://127.0.0.1:9200/api #VITE_SERVER_API_URL=http://127.0.0.1:8000/api diff --git a/src/api/credit/creditUser/index.ts b/src/api/credit/creditUser/index.ts index 581d78b..49cb17a 100644 --- a/src/api/credit/creditUser/index.ts +++ b/src/api/credit/creditUser/index.ts @@ -107,9 +107,12 @@ export async function getCreditUser(id: number) { /** * 导入招投标 */ -export async function importCreditUsers(file: File) { +export async function importCreditUsers(file: File, companyId?: number) { const formData = new FormData(); formData.append('file', file); + if (companyId != null) { + formData.append('companyId', String(companyId)); + } const res = await request.post>( '/credit/credit-user/import', formData, diff --git a/src/views/credit/creditCompany/components/creditCompanyInfo.vue b/src/views/credit/creditCompany/components/creditCompanyInfo.vue index 0220ddf..63e60bf 100644 --- a/src/views/credit/creditCompany/components/creditCompanyInfo.vue +++ b/src/views/credit/creditCompany/components/creditCompanyInfo.vue @@ -93,24 +93,69 @@ import { useThemeStore } from '@/store/modules/theme'; import { storeToRefs } from 'pinia'; import CreditCompanyRelatedImport from './credit-company-related-import.vue'; - import { pageCreditProject, importCreditProject } from '@/api/credit/creditProject'; - import { pageCreditExternal, importCreditExternal } from '@/api/credit/creditExternal'; - import { pageCreditRiskRelation, importCreditRiskRelation } from '@/api/credit/creditRiskRelation'; - import { pageCreditCompetitor, importCreditCompetitor } from '@/api/credit/creditCompetitor'; - import { pageCreditSupplier, importCreditSupplier } from '@/api/credit/creditSupplier'; - import { pageCreditCustomer, importCreditCustomer } from '@/api/credit/creditCustomer'; - import { pageCreditCaseFiling, importCreditCaseFiling } from '@/api/credit/creditCaseFiling'; - import { pageCreditMediation, importCreditMediation } from '@/api/credit/creditMediation'; - import { pageCreditCourtSession, importCreditCourtSession } from '@/api/credit/creditCourtSession'; - import { pageCreditCourtAnnouncement, importCreditCourtAnnouncement } from '@/api/credit/creditCourtAnnouncement'; - import { pageCreditDeliveryNotice, importCreditDeliveryNotice } from '@/api/credit/creditDeliveryNotice'; - import { pageCreditJudicialDocument, importCreditJudicialDocument } from '@/api/credit/creditJudicialDocument'; - import { pageCreditJudgmentDebtor, importCreditJudgmentDebtor } from '@/api/credit/creditJudgmentDebtor'; - import { pageCreditBreachOfTrust, importCreditBreachOfTrust } from '@/api/credit/creditBreachOfTrust'; - import { pageCreditFinalVersion, importCreditFinalVersion } from '@/api/credit/creditFinalVersion'; + import { pageCreditUser, importCreditUsers } from '@/api/credit/creditUser'; + import { + pageCreditExternal, + importCreditExternal + } from '@/api/credit/creditExternal'; + import { + pageCreditRiskRelation, + importCreditRiskRelation + } from '@/api/credit/creditRiskRelation'; + import { + pageCreditCompetitor, + importCreditCompetitor + } from '@/api/credit/creditCompetitor'; + import { + pageCreditSupplier, + importCreditSupplier + } from '@/api/credit/creditSupplier'; + import { + pageCreditCustomer, + importCreditCustomer + } from '@/api/credit/creditCustomer'; + import { + pageCreditCaseFiling, + importCreditCaseFiling + } from '@/api/credit/creditCaseFiling'; + import { + pageCreditMediation, + importCreditMediation + } from '@/api/credit/creditMediation'; + import { + pageCreditCourtSession, + importCreditCourtSession + } from '@/api/credit/creditCourtSession'; + import { + pageCreditCourtAnnouncement, + importCreditCourtAnnouncement + } from '@/api/credit/creditCourtAnnouncement'; + import { + pageCreditDeliveryNotice, + importCreditDeliveryNotice + } from '@/api/credit/creditDeliveryNotice'; + import { + pageCreditJudicialDocument, + importCreditJudicialDocument + } from '@/api/credit/creditJudicialDocument'; + import { + pageCreditJudgmentDebtor, + importCreditJudgmentDebtor + } from '@/api/credit/creditJudgmentDebtor'; + import { + pageCreditBreachOfTrust, + importCreditBreachOfTrust + } from '@/api/credit/creditBreachOfTrust'; + import { + pageCreditFinalVersion, + importCreditFinalVersion + } from '@/api/credit/creditFinalVersion'; import { pageCreditXgxf, importCreditXgxf } from '@/api/credit/creditXgxf'; import { pageCreditGqdj, importCreditGqdj } from '@/api/credit/creditGqdj'; - import { pageCreditJudiciary, importCreditJudiciaries } from '@/api/credit/creditJudiciary'; + import { + pageCreditJudiciary, + importCreditJudiciaries + } from '@/api/credit/creditJudiciary'; const props = defineProps<{ // 弹窗是否打开 @@ -161,9 +206,9 @@ const tabApiMap: Record = { 招投标: { - page: pageCreditProject as any, - importFn: importCreditProject as any, - templatePath: '/credit/credit-project/import/template' + page: pageCreditUser as any, + importFn: importCreditUsers as any, + templatePath: '/credit/credit-user/import/template' }, 对外投资: { page: pageCreditExternal as any, @@ -235,7 +280,7 @@ importFn: importCreditFinalVersion as any, templatePath: '/credit/credit-final-version/import/template' }, - '限制高消费': { + 限制高消费: { page: pageCreditXgxf as any, importFn: importCreditXgxf as any, templatePath: '/credit/credit-xgxf/import/template' @@ -259,6 +304,69 @@ ellipsis?: boolean; }; + type TabColumnConfig = { + order?: string[]; + hidden?: string[]; + titleMap?: Record; + }; + + const commonHiddenColumnKeys = new Set([ + 'deleted', + 'tenantId', + 'userId', + 'companyId' + ]); + + const commonTitleMap: Record = { + id: 'ID', + name: '被执行人名称', + name1: '被执行人', + code: '税号', + url: '链接地址', + status: '状态', + comments: '备注', + createTime: '创建时间', + updateTime: '修改时间' + }; + + // 每个tab的“字段顺序/隐藏字段/中文表头”在这里配置 + const tabColumnConfigMap: Record = { + 招投标: { + order: [ + 'name', + 'role', + 'caseNumber', + 'procurementName', + 'winningName', + 'winningPrice', + 'releaseDate', + 'url', + 'createTime', + 'updateTime' + ], + hidden: [ + 'type', + 'parentId', + 'sortNumber', + 'recommend', + 'expirationTime', + 'updateTime' + ], + titleMap: { + name: '项目名称', + role: '企业角色', + caseNumber: '案号', + procurementName: '招采单位名称', + winningName: '中标单位名称', + winningPrice: '中标金额', + releaseDate: '发布日期', + url: '链接地址', + createTime: '创建时间', + updateTime: '修改时间' + } + } + }; + type TabState = { loading: boolean; data: Record[]; @@ -280,7 +388,9 @@ // 子表导入弹窗 const showRelatedImport = ref(false); const relatedImportTabKey = ref(tabList[0].key); - const relatedImportConfig = computed(() => tabApiMap[relatedImportTabKey.value]); + const relatedImportConfig = computed( + () => tabApiMap[relatedImportTabKey.value] + ); const relatedImportTitle = computed(() => { const tab = tabList.find((t) => t.key === relatedImportTabKey.value); return `${tab?.label ?? relatedImportTabKey.value}批量导入`; @@ -405,12 +515,26 @@ return record.id ?? record.code ?? record.key ?? index; }; - const buildColumns = (rows: Record[]): TableColumn[] => { + const buildColumns = ( + tabKey: string, + rows: Record[] + ): TableColumn[] => { if (!rows.length) { return []; } - return Object.keys(rows[0]).map((key) => ({ - title: key, + const config = tabColumnConfigMap[tabKey]; + const hidden = new Set([ + ...commonHiddenColumnKeys, + ...(config?.hidden ?? []) + ]); + const titleMap = { ...commonTitleMap, ...(config?.titleMap ?? {}) }; + + const keysFromData = Object.keys(rows[0]); + const keys = config?.order?.length ? config.order : keysFromData; + const finalKeys = keys.filter((k) => !hidden.has(k)); + + return finalKeys.map((key) => ({ + title: titleMap[key] ?? key, dataIndex: key, key, ellipsis: true @@ -436,8 +560,8 @@ const identity = taxpayerCode ? `tax:${taxpayerCode}` : companyId - ? `id:${companyId}` - : undefined; + ? `id:${companyId}` + : undefined; const state = tabState[key]; const api = tabApiMap[key]?.page; if (!api) { @@ -464,7 +588,7 @@ limit: 500 }); state.data = res?.list || []; - state.columns = buildColumns(state.data); + state.columns = buildColumns(key, state.data); state.loadedIdentity = identity; } catch (e: any) { state.data = [];