Files
mp-10579/src/views/credit/creditCompany/components/creditCompanyInfo.vue
赵忠林 8fd96fb05c refactor(credit): 优化企业信用模块数据结构和界面展示
- 将模型中的 companyName 字段统一重命名为 name
- 更新编辑页面标题为更准确的描述
- 调整多个表格列的宽度配置
- 移除冗余的表格滚动设置
- 为主企业名称字段添加空值显示处理
- 统一表格列配置中的样式属性
- 优化表格列的数据索引和键值配置
- 移除过多的表格列宽度和省略号设置
2026-01-19 21:07:53 +08:00

1177 lines
34 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- 编辑弹窗 -->
<template>
<a-drawer
width="98%"
:visible="visible"
:maskClosable="false"
:maxable="maxable"
:title="data?.name"
:body-style="{ paddingBottom: '28px' }"
@update:visible="updateVisible"
>
<a-descriptions
:column="descriptionColumns"
size="small"
bordered
class="credit-company-descriptions"
>
<a-descriptions-item label="企业名称">
{{ formatValue(form.matchName) }}
</a-descriptions-item>
<a-descriptions-item label="法定代表人">
{{ formatValue(form.legalPerson) }}
</a-descriptions-item>
<a-descriptions-item label="统一社会信用代码">
{{ formatValue(form.code) }}
</a-descriptions-item>
<a-descriptions-item label="企业地址">
{{ formatValue(form.address) }}
</a-descriptions-item>
<a-descriptions-item label="电话">
{{ formatValue(form.tel) }}
</a-descriptions-item>
<a-descriptions-item label="更多电话">
{{ formatValue(form.moreTel) }}
</a-descriptions-item>
</a-descriptions>
<a-divider style="margin: 16px 0" />
<a-tabs
v-model:activeKey="activeTab"
:tabBarGutter="9"
class="credit-company-tabs"
>
<a-tab-pane v-for="tab in tabList" :key="tab.key" :tab="tab.label">
<a-space style="margin-bottom: 12px">
<a-button
type="primary"
:disabled="!form.id"
@click="openRelatedImport(tab.key)"
>
导入()
</a-button>
<a-button
:loading="tabState[tab.key].loading"
@click="reloadTab(tab.key)"
>
刷新
</a-button>
</a-space>
<a-table
v-if="tabState[tab.key].columns.length"
size="small"
:columns="tabState[tab.key].columns"
:data-source="tabState[tab.key].data"
:loading="tabState[tab.key].loading"
:row-key="getRowKey"
:scroll="{ x: 'max-content' }"
:pagination="getTabPagination(tab.key)"
/>
<a-empty
v-else-if="!tabState[tab.key].loading"
description="暂无数据"
/>
</a-tab-pane>
</a-tabs>
<!-- 企业详情子表导入 -->
<CreditCompanyRelatedImport
v-model:visible="showRelatedImport"
:title="relatedImportTitle"
:templatePath="relatedImportTemplatePath"
:companyId="form.id"
:importFn="relatedImportFn"
@done="handleRelatedImportDone"
/>
</a-drawer>
</template>
<script lang="ts" setup>
import { computed, h, reactive, ref, watch } from 'vue';
import { message } from 'ant-design-vue';
import { assignObject } from 'ele-admin-pro';
import { CreditCompany } from '@/api/credit/creditCompany/model';
import { useThemeStore } from '@/store/modules/theme';
import { storeToRefs } from 'pinia';
import CreditCompanyRelatedImport from './credit-company-related-import.vue';
import {
pageCreditAdministrativeLicense,
importCreditAdministrativeLicense
} from '@/api/credit/creditAdministrativeLicense';
import {
pageCreditBankruptcy,
importCreditBankruptcy
} from '@/api/credit/creditBankruptcy';
import {
pageCreditBranch,
importCreditBranch
} from '@/api/credit/creditBranch';
import {
pageCreditHistoricalLegalPerson,
importCreditHistoricalLegalPerson
} from '@/api/credit/creditHistoricalLegalPerson';
import {
pageCreditNearbyCompany,
importCreditNearbyCompany
} from '@/api/credit/creditNearbyCompany';
import {
pageCreditPatent,
importCreditPatent
} from '@/api/credit/creditPatent';
import {
pageCreditSuspectedRelationship,
importCreditSuspectedRelationship
} from '@/api/credit/creditSuspectedRelationship';
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';
const props = defineProps<{
// 弹窗是否打开
visible: boolean;
// 修改回显的数据
data?: CreditCompany | null;
}>();
const emit = defineEmits<{
(e: 'done'): void;
(e: 'update:visible', visible: boolean): void;
}>();
// 是否显示最大化切换按钮
const maxable = ref(true);
// 是否开启响应式布局
const themeStore = useThemeStore();
const { styleResponsive } = storeToRefs(themeStore);
const descriptionColumns = computed(() => (styleResponsive.value ? 3 : 2));
const tabList = [
{ key: '招投标', label: '招投标' },
{ key: '对外投资', label: '对外投资' },
{ key: '风险关系', label: '风险关系' },
{ key: '竞争对手', label: '竞争对手' },
{ key: '供应商', label: '供应商' },
{ key: '客户', label: '客户' },
{ key: '司法案件', label: '司法案件' },
{ key: '被执行人', label: '被执行人' },
{ key: '限制高消费', label: '限制高消费' },
{ key: '终本案件', label: '终本案件' },
{ key: '开庭公告', label: '开庭公告' },
{ key: '法院公告', label: '法院公告' },
{ key: '失信被执行人', label: '失信被执行人' },
{ key: '裁判文书', label: '裁判文书' },
{ key: '立案信息', label: '立案信息' },
{ key: '诉前调解', label: '诉前调解' },
{ key: '送达公告', label: '送达公告' },
{ key: '股权冻结', label: '股权冻结' },
{ key: '附近企业', label: '附近企业' },
{ key: '分支机构', label: '分支机构' },
{ key: '破产重整', label: '破产重整' },
{ key: '行政许可', label: '行政许可' },
{ key: '疑似关系', label: '疑似关系' },
{ key: '专利', label: '专利' },
{ key: '历史法定代表人', label: '历史法定代表人' }
];
type TabApiConfig = {
page: (
params: any
) => Promise<{ list: Record<string, any>[]; count?: number } | undefined>;
importFn: (file: File, companyId?: number) => Promise<string>;
templatePath: string;
};
const tabApiMap: Record<string, TabApiConfig> = {
招投标: {
page: pageCreditUser as any,
importFn: importCreditUsers as any,
templatePath: '/credit/credit-user/import/template'
},
对外投资: {
page: pageCreditExternal as any,
importFn: importCreditExternal as any,
templatePath: '/credit/credit-external/import/template'
},
风险关系: {
page: pageCreditRiskRelation as any,
importFn: importCreditRiskRelation as any,
templatePath: '/credit/credit-risk-relation/import/template'
},
竞争对手: {
page: pageCreditCompetitor as any,
importFn: importCreditCompetitor as any,
templatePath: '/credit/credit-competitor/import/template'
},
供应商: {
page: pageCreditSupplier as any,
importFn: importCreditSupplier as any,
templatePath: '/credit/credit-supplier/import/template'
},
客户: {
page: pageCreditCustomer as any,
importFn: importCreditCustomer as any,
templatePath: '/credit/credit-customer/import/template'
},
立案信息: {
page: pageCreditCaseFiling as any,
importFn: importCreditCaseFiling as any,
templatePath: '/credit/credit-case-filing/import/template'
},
诉前调解: {
page: pageCreditMediation as any,
importFn: importCreditMediation as any,
templatePath: '/credit/credit-mediation/import/template'
},
开庭公告: {
page: pageCreditCourtSession as any,
importFn: importCreditCourtSession as any,
templatePath: '/credit/credit-court-session/import/template'
},
法院公告: {
page: pageCreditCourtAnnouncement as any,
importFn: importCreditCourtAnnouncement as any,
templatePath: '/credit/credit-court-announcement/import/template'
},
送达公告: {
page: pageCreditDeliveryNotice as any,
importFn: importCreditDeliveryNotice as any,
templatePath: '/credit/credit-delivery-notice/import/template'
},
裁判文书: {
page: pageCreditJudicialDocument as any,
importFn: importCreditJudicialDocument as any,
templatePath: '/credit/credit-judicial-document/import/template'
},
被执行人: {
page: pageCreditJudgmentDebtor as any,
importFn: importCreditJudgmentDebtor as any,
templatePath: '/credit/credit-judgment-debtor/import/template'
},
失信被执行人: {
page: pageCreditBreachOfTrust as any,
importFn: importCreditBreachOfTrust as any,
templatePath: '/credit/credit-breach-of-trust/import/template'
},
终本案件: {
page: pageCreditFinalVersion as any,
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'
},
股权冻结: {
page: pageCreditGqdj as any,
importFn: importCreditGqdj as any,
templatePath: '/credit/credit-gqdj/import/template'
},
司法案件: {
page: pageCreditJudiciary as any,
importFn: importCreditJudiciaries as any,
templatePath: '/credit/credit-judiciary/import/template'
},
附近企业: {
page: pageCreditNearbyCompany as any,
importFn: importCreditNearbyCompany as any,
templatePath: '/credit/credit-nearby-company/import/template'
},
分支机构: {
page: pageCreditBranch as any,
importFn: importCreditBranch as any,
templatePath: '/credit/credit-branch/import/template'
},
破产重整: {
page: pageCreditBankruptcy as any,
importFn: importCreditBankruptcy as any,
templatePath: '/credit/credit-bankruptcy/import/template'
},
行政许可: {
page: pageCreditAdministrativeLicense as any,
importFn: importCreditAdministrativeLicense as any,
templatePath: '/credit/credit-administrative-license/import/template'
},
疑似关系: {
page: pageCreditSuspectedRelationship as any,
importFn: importCreditSuspectedRelationship as any,
templatePath: '/credit/credit-suspected-relationship/import/template'
},
专利: {
page: pageCreditPatent as any,
importFn: importCreditPatent as any,
templatePath: '/credit/credit-patent/import/template'
},
历史法定代表人: {
page: pageCreditHistoricalLegalPerson as any,
importFn: importCreditHistoricalLegalPerson as any,
templatePath: '/credit/credit-historical-legal-person/import/template'
}
};
type TableColumn = {
title: string;
dataIndex: string;
key: string;
ellipsis?: boolean;
customRender?: (opt: { text: any; record: Record<string, any> }) => any;
};
type TabColumnConfig = {
order?: string[];
hidden?: string[];
titleMap?: Record<string, string>;
};
const commonHiddenColumnKeys = new Set<string>([
'deleted',
'tenantId',
'userId',
'name1',
'sortNumber',
'recommend',
'url',
'status',
'comments',
'companyId',
'updateTime',
'companyName'
]);
const commonTitleMap: Record<string, string> = {
id: 'ID',
name: '客户',
name1: '被执行人',
code: '税号',
price: '销售金额(万元)',
url: '链接地址',
caseNumber: '案号',
courtName: '法院',
occurrenceTime: '发生时间',
amount: '执行标的',
status: '状态',
publicDate: '公开日期',
dataSource: '数据来源',
statusTxt: '状态',
dataStatus: '数据状态',
comments: '备注',
createTime: '创建时间',
updateTime: '修改时间'
};
// 每个tab的“字段顺序/隐藏字段/中文表头”在这里配置
const tabColumnConfigMap: Record<string, TabColumnConfig> = {
'招投标': {
order: [
'name',
'releaseDate',
'role',
'infoType',
'region',
'caseNumber',
'procurementName',
'winningName',
'winningPrice',
'url',
'createTime',
'updateTime'
],
hidden: [
'type',
'parentId',
'sortNumber',
'recommend',
'expirationTime',
'updateTime',
'createTime'
],
titleMap: {
name: '项目名称',
role: '企业角色',
infoType: '信息类型',
region: '省份地区',
caseNumber: '案号',
procurementName: '招采单位',
winningName: '中标单位',
winningPrice: '中标金额',
releaseDate: '发布日期',
url: '链接地址',
createTime: '创建时间',
updateTime: '修改时间'
}
},
'对外投资': {
titleMap: {
name: '被投资企业名称',
statusTxt: '状态',
legalRepresentative: '法定代表人',
registeredCapital: '注册资本',
establishmentDate: '成立日期',
shareholdingRatio: '持股比例',
subscribedInvestmentAmount: '认缴出资额',
subscribedInvestmentDate: '认缴出资日期',
indirectShareholdingRatio: '间接持股比例',
investmentDate: '投资日期',
region: '所属地区',
industry: '所属行业',
investmentCount: '投资数量',
relatedProductsInstitutions: '关联产品/机构'
},
hidden: [
'id',
'createTime'
],
},
'风险关系': {
titleMap: {
mainBodyName: '主体名称',
registrationStatus: '登记状态',
registeredCapital: '注册资本',
provinceRegion: '省份地区',
associatedRelation: '关联关系',
riskRelation: '风险关系'
},
hidden: [
'id',
'createTime'
]
},
'竞争对手': {
titleMap: {
name: '企业名称',
legalRepresentative: '法定代表人',
registeredCapital: '注册资本',
establishmentDate: '成立日期',
registrationStatus: '登记状态',
industry: '所属行业',
province: '所属省份'
},
hidden: ['id','mainCompanyName','createTime']
},
'供应商': {
titleMap: {
supplier: '供应商',
purchaseAmount: '采购金额(万元)'
},
hidden: ['id','createTime']
},
'客户': {
titleMap: {
},
hidden: ['id','createTime']
},
'司法案件': {
titleMap: {
name: '案件名称',
infoType: '案件类型',
reason: '案由',
processDate: '进程日期',
caseProgress: '案件进程',
caseIdentity: '案件身份',
code: '案号',
court: '法院',
caseAmount: '案件金额(元)',
// country: '国家',
// province: '省份',
// city: '城市',
// region: '地区',
// address: '地址',
},
hidden: [
'id',
'parentId',
'type',
'country',
'province',
'city',
'region',
'address',
'expirationTime',
'createTime'
]
},
'被执行人': {
titleMap: {
caseNumber: '案号',
name: '被执行人',
amount: '执行标的(元)',
courtName: '执行法院',
occurrenceTime: '立案日期',
},
hidden: ['id','historyId','code', 'dataStatus','historyName','createTime']
},
'限制高消费': {
titleMap: {
caseNumber: '案号',
dataType: '限消令对象',
plaintiffAppellant: '限制法定代表人',
appellee: '申请人',
involvedAmount: '涉案金额(元)',
occurrenceTime: '立案日期',
courtName: '执行法院',
releaseDate: '发布日期'
},
hidden: ['id','dataStatus','otherPartiesThirdParty','causeOfAction','createTime']
},
'终本案件': {
titleMap: {
caseNumber: '案号',
appellee: '被执行人',
plaintiffAppellant: '疑似申请执行人',
unfulfilledAmount: '未履行金额(元)',
involvedAmount: '执行标的(元)',
courtName: '执行法院',
occurrenceTime: '立案日期',
finalDate: '终本日期'
},
hidden: ['id','dataStatus','createTime']
},
'开庭公告': {
titleMap: {
caseNumber: '案号',
causeOfAction: '案由',
otherPartiesThirdParty: '当事人',
courtName: '法院',
occurrenceTime: '开庭时间',
},
hidden: ['id','dataStatus','dataType','appellee','involvedAmount','plaintiffAppellant','createTime']
},
'立案信息': {
titleMap: {
dataType: '数据状态',
appellee: '被告/被上诉人',
otherPartiesThirdParty: '其他当事人/第三人',
plaintiffAppellant: '原告/上诉人',
causeOfAction: '案由',
involvedAmount: '涉案金额'
},
hidden: ['id','dataStatus']
},
诉前调解: {
titleMap: {
dataType: '数据状态',
plaintiffAppellant: '原告/上诉人',
appellee: '被告/被上诉人',
otherPartiesThirdParty: '其他当事人/第三人',
causeOfAction: '案由',
involvedAmount: '涉案金额'
},
hidden: ['dataStatus']
},
法院公告: {
titleMap: {
dataType: '数据状态',
plaintiffAppellant: '原告/上诉人',
appellee: '被告/被上诉人',
otherPartiesThirdParty: '其他当事人/第三人',
causeOfAction: '案由',
involvedAmount: '涉案金额'
}
},
送达公告: {
titleMap: {
dataType: '数据状态',
plaintiffAppellant: '原告/上诉人',
appellee: '被告/被上诉人',
otherPartiesThirdParty: '其他当事人/第三人',
causeOfAction: '案由',
involvedAmount: '涉案金额'
}
},
裁判文书: {
titleMap: {
dataType: '数据状态',
plaintiffAppellant: '原告/上诉人',
appellee: '被告/被上诉人',
otherPartiesThirdParty: '其他当事人/第三人',
causeOfAction: '案由',
involvedAmount: '涉案金额'
}
},
失信被执行人: {
titleMap: {
dataType: '数据状态',
plaintiffAppellant: '原告/上诉人',
appellee: '被告/被上诉人',
otherPartiesThirdParty: '其他当事人/第三人',
causeOfAction: '案由',
involvedAmount: '涉案金额'
},
hidden: ['dataStatus']
},
股权冻结: {
titleMap: {
dataType: '数据状态',
plaintiffAppellant: '原告/上诉人',
appellee: '被告/被上诉人',
otherPartiesThirdParty: '其他当事人/第三人',
causeOfAction: '案由',
involvedAmount: '涉案金额'
},
hidden: ['dataStatus']
},
附近企业: {
order: [
'name',
'registrationStatus',
'legalPerson',
'registeredCapital',
'establishDate',
'code',
'address',
'phone',
'email',
'domain',
'createTime'
],
titleMap: {
name: '企业名称',
registrationStatus: '登记状态',
legalPerson: '法定代表人',
registeredCapital: '注册资本',
establishDate: '成立日期',
code: '统一社会信用代码',
address: '注册地址',
phone: '有效手机号',
email: '邮箱',
domain: '官网网址',
createTime: '创建时间'
}
},
分支机构: {
order: [
'name',
'curator',
'region',
'establishDate',
'statusText',
'createTime'
],
titleMap: {
name: '分支机构名称',
curator: '负责人',
region: '地区',
establishDate: '成立日期',
statusText: '状态',
createTime: '创建时间'
}
},
破产重整: {
order: ['code', 'type', 'party', 'court', 'publicDate', 'createTime'],
titleMap: {
code: '案号',
type: '案件类型',
party: '当事人',
court: '经办法院',
publicDate: '公开日期',
createTime: '创建时间'
}
},
行政许可: {
order: [
'code',
'name',
'statusText',
'type',
'validityStart',
'validityEnd',
'licensingAuthority',
'createTime'
],
titleMap: {
code: '许可编号',
name: '许可证名称',
statusText: '许可状态',
type: '许可类型',
validityStart: '有效期自',
validityEnd: '有效期至',
licensingAuthority: '许可机关',
createTime: '创建时间'
}
},
疑似关系: {
order: [
'name',
'statusText',
'legalPerson',
'registeredCapital',
'createDate',
'relatedParty',
'type',
'detail',
'createTime'
],
titleMap: {
name: '企业名称',
statusText: '状态',
legalPerson: '法定代表人',
registeredCapital: '注册资本',
createDate: '成立日期',
relatedParty: '关联方',
type: '疑似关系类型',
detail: '疑似关系详情',
createTime: '创建时间'
}
},
专利: {
order: [
'name',
'type',
'statusText',
'registerNo',
'registerDate',
'publicNo',
'publicDate',
'inventor',
'patentApplicant',
'createTime'
],
titleMap: {
name: '发明名称',
type: '专利类型',
statusText: '法律状态',
registerNo: '申请号',
registerDate: '申请日',
publicNo: '公开(公告)号',
publicDate: '公开(公告)日期',
inventor: '发明人',
patentApplicant: '申请(专利权)人',
createTime: '创建时间'
}
},
历史法定代表人: {
order: ['name', 'registerDate', 'publicDate', 'createTime'],
titleMap: {
name: '名称',
registerDate: '任职日期',
publicDate: '卸任日期',
createTime: '创建时间'
}
}
};
type TabState = {
loading: boolean;
data: Record<string, any>[];
columns: TableColumn[];
pagination: {
current: number;
pageSize: number;
total: number;
};
loadedSignature?: string;
};
const tabState = reactive<Record<string, TabState>>({});
tabList.forEach((tab) => {
tabState[tab.key] = {
loading: false,
data: [],
columns: [],
pagination: {
current: 1,
pageSize: 20,
total: 0
},
loadedSignature: undefined
};
});
const activeTab = ref(tabList[0].key);
const resetTabPagination = (key: string) => {
tabState[key].pagination.current = 1;
tabState[key].pagination.pageSize = 20;
tabState[key].pagination.total = 0;
};
const setTabPagination = (
key: string,
next: Partial<TabState['pagination']>
) => {
Object.assign(tabState[key].pagination, next);
};
const handleTabPageChange = (key: string, page: number, pageSize: number) => {
const prevPageSize = tabState[key].pagination.pageSize;
setTabPagination(key, {
current: pageSize !== prevPageSize ? 1 : page,
pageSize
});
loadTabData(key);
};
const getTabPagination = (key: string) => {
const state = tabState[key];
return {
current: state.pagination.current,
pageSize: state.pagination.pageSize,
total: state.pagination.total,
showQuickJumper: true,
showSizeChanger: true,
pageSizeOptions: ['10', '20', '50', '100', '200'],
showTotal: (total: number) => `${total}`,
onChange: (page: number, pageSize: number) =>
handleTabPageChange(key, page, pageSize),
onShowSizeChange: (page: number, pageSize: number) =>
handleTabPageChange(key, page, pageSize)
};
};
// 子表导入弹窗
const showRelatedImport = ref(false);
const relatedImportTabKey = ref(tabList[0].key);
const relatedImportConfig = computed(
() => tabApiMap[relatedImportTabKey.value]
);
const relatedImportTitle = computed(() => {
const tab = tabList.find((t) => t.key === relatedImportTabKey.value);
return `${tab?.label ?? relatedImportTabKey.value}批量导入`;
});
const relatedImportTemplatePath = computed(
() => relatedImportConfig.value?.templatePath ?? ''
);
const relatedImportFn = (file: File, companyId?: number) => {
const fn = relatedImportConfig.value?.importFn;
if (!fn) {
return Promise.reject(new Error('未配置导入接口'));
}
return fn(file, companyId);
};
const openRelatedImport = (key: string) => {
if (!form.id) {
message.error('缺少企业ID无法导入');
return;
}
if (!tabApiMap[key]) {
message.error('未配置该Tab的导入功能');
return;
}
relatedImportTabKey.value = key;
showRelatedImport.value = true;
};
const handleRelatedImportDone = () => {
resetTabPagination(activeTab.value);
reloadTab(activeTab.value);
};
const defaultForm: CreditCompany = {
id: undefined,
name: undefined,
matchName: undefined,
code: undefined,
type: undefined,
parentId: undefined,
registrationStatus: undefined,
legalPerson: undefined,
registeredCapital: undefined,
paidinCapital: undefined,
establishDate: undefined,
address: undefined,
tel: undefined,
moreTel: undefined,
email: undefined,
moreEmail: undefined,
country: undefined,
province: undefined,
city: undefined,
region: undefined,
institutionType: undefined,
taxpayerCode: undefined,
registrationNumber: undefined,
organizationalCode: undefined,
numberOfInsuredPersons: undefined,
annualReport: undefined,
businessTerm: undefined,
nationalStandardIndustryCategories: undefined,
nationalStandardIndustryCategories2: undefined,
nationalStandardIndustryCategories3: undefined,
nationalStandardIndustryCategories4: undefined,
nationalStandardIndustryCategories5: undefined,
nationalStandardIndustryCategories6: undefined,
nationalStandardIndustryCategories7: undefined,
nationalStandardIndustryCategories8: undefined,
companySize: undefined,
formerName: undefined,
englishName: undefined,
domain: undefined,
mailingAddress: undefined,
companyProfile: undefined,
natureOfBusiness: undefined,
registrationAuthority: undefined,
taxpayerQualification: undefined,
latestAnnualReportYear: undefined,
latestAnnualReportOnOperatingRevenue: undefined,
enterpriseScoreCheck: undefined,
creditRating: undefined,
cechnologyScore: undefined,
cechnologyLevel: undefined,
smallEnterprise: undefined,
recommend: undefined,
deleted: undefined,
userId: undefined,
tenantId: undefined,
createTime: undefined,
updateTime: undefined,
status: 0,
comments: ''
};
// 用户信息
const form = reactive<CreditCompany>({ ...defaultForm });
/* 更新visible */
const updateVisible = (value: boolean) => {
emit('update:visible', value);
};
const formatValue = (value: unknown) => {
if (value === undefined || value === null || value === '') {
return '-';
}
return value;
};
// const formatStatus = (status?: number) => {
// if (status === 0) {
// return '显示';
// }
// if (status === 1) {
// return '隐藏';
// }
// return '-';
// };
const getRowKey = (record: Record<string, any>, index: number) => {
return record.id ?? record.code ?? record.key ?? index;
};
const buildColumns = (
tabKey: string,
rows: Record<string, any>[]
): TableColumn[] => {
if (!rows.length) {
return [];
}
const config = tabColumnConfigMap[tabKey];
const hidden = new Set<string>([
...commonHiddenColumnKeys,
...(config?.hidden ?? [])
]);
const titleMap = { ...commonTitleMap, ...(config?.titleMap ?? {}) };
const keysFromData = Object.keys(rows[0]);
const keysSet = new Set(keysFromData);
const keys = config?.order?.length ? config.order : keysFromData;
const finalKeys = keys.filter((k) => keysSet.has(k) && !hidden.has(k));
const linkTextKeys = new Set(['name', 'code', 'caseNumber', 'registerNo']);
return finalKeys.map((key) => {
const column: TableColumn = {
title: titleMap[key] ?? key,
dataIndex: key,
key,
ellipsis: true
};
if (linkTextKeys.has(key)) {
column.customRender = ({ text, record }) => {
if (record?.url && text) {
return h('a', { href: record.url, target: '_blank' }, text);
}
return text;
};
}
return column;
});
};
const resetForm = () => {
Object.assign(form, defaultForm);
};
const clearTabData = () => {
tabList.forEach((tab) => {
tabState[tab.key].data = [];
tabState[tab.key].columns = [];
tabState[tab.key].loading = false;
tabState[tab.key].loadedSignature = undefined;
resetTabPagination(tab.key);
});
};
const loadTabData = async (key: string, force = false) => {
const taxpayerCode = form.code ?? props.data?.code;
const companyId = form.id ?? props.data?.id;
const identity = taxpayerCode
? `tax:${taxpayerCode}`
: companyId
? `id:${companyId}`
: undefined;
const state = tabState[key];
const api = tabApiMap[key]?.page;
if (!api) {
state.data = [];
state.columns = [];
state.pagination.total = 0;
state.loadedSignature = undefined;
return;
}
if (!identity) {
state.data = [];
state.columns = [];
state.pagination.total = 0;
state.loadedSignature = undefined;
return;
}
const signature = `${identity}|p:${state.pagination.current}|l:${state.pagination.pageSize}`;
if (!force && state.loadedSignature === signature) {
return;
}
state.loading = true;
try {
const fetchPage = async (page: number) => {
return api({
taxpayerCode,
companyId,
page,
limit: state.pagination.pageSize
});
};
const requestedPage = state.pagination.current;
let res = await fetchPage(requestedPage);
const total = res?.count ?? 0;
let list = res?.list || [];
if (total > 0 && list.length === 0 && requestedPage > 1) {
setTabPagination(key, { current: 1 });
res = await fetchPage(1);
list = res?.list || [];
}
state.pagination.total = res?.count ?? 0;
state.data = list;
if (!state.columns.length) {
state.columns = buildColumns(key, state.data);
}
state.loadedSignature = `${identity}|p:${state.pagination.current}|l:${state.pagination.pageSize}`;
} catch (e: any) {
state.data = [];
state.columns = [];
state.pagination.total = 0;
state.loadedSignature = undefined;
message.error(e?.message ?? '查询失败');
} finally {
state.loading = false;
}
};
const reloadTab = (key: string) => {
loadTabData(key, true);
};
watch(
() => activeTab.value,
(key) => {
loadTabData(key);
}
);
watch(
() => props.visible,
(visible) => {
if (visible) {
showRelatedImport.value = false;
resetForm();
clearTabData();
if (props.data) {
assignObject(form, props.data);
}
activeTab.value = tabList[0].key;
loadTabData(activeTab.value, true);
} else {
showRelatedImport.value = false;
resetForm();
clearTabData();
}
},
{ immediate: true }
);
watch(
() => props.data,
(data) => {
if (!props.visible || !data) {
return;
}
showRelatedImport.value = false;
resetForm();
clearTabData();
assignObject(form, data);
loadTabData(activeTab.value, true);
}
);
</script>