303 lines
9.8 KiB
JavaScript
303 lines
9.8 KiB
JavaScript
|
|
/**
|
||
|
|
* CQYGL3F8E企业关联数据拆分工具
|
||
|
|
* 将企业关联数据拆分为投资企业记录、高管任职记录和涉诉风险三个独立模块
|
||
|
|
*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 拆分CQYGL3F8E数据为多个独立的tab模块
|
||
|
|
* @param {Array} reportData - 报告数据数组
|
||
|
|
* @returns {Array} 拆分后的数据数组
|
||
|
|
*/
|
||
|
|
export function splitCQYGL3F8EForTabs(reportData) {
|
||
|
|
const result = []
|
||
|
|
|
||
|
|
reportData.forEach(item => {
|
||
|
|
if (item.data?.apiID === 'QYGL3F8E') {
|
||
|
|
// 将QYGL3F8E拆分成多个独立的tab
|
||
|
|
const qyglData = item.data.data
|
||
|
|
const baseTimestamp = item.data.timestamp
|
||
|
|
|
||
|
|
// 投资类关系
|
||
|
|
const investRelations = ["sh", "his_sh", "lp", "his_lp"]
|
||
|
|
|
||
|
|
// 高管类关系
|
||
|
|
const managerRelations = ["tm", "his_tm"]
|
||
|
|
|
||
|
|
// 获取投资企业记录(股东、历史股东、法人、历史法人)
|
||
|
|
const investCompanies = (qyglData?.items || []).filter((item) => {
|
||
|
|
const relationships = item?.relationship || []
|
||
|
|
return relationships.some((r) => investRelations.includes(r))
|
||
|
|
})
|
||
|
|
|
||
|
|
// 获取高管任职记录(高管、历史高管)
|
||
|
|
const managerPositions = (qyglData?.items || []).filter((item) => {
|
||
|
|
const relationships = item?.relationship || []
|
||
|
|
return relationships.some((r) => managerRelations.includes(r))
|
||
|
|
})
|
||
|
|
|
||
|
|
// 获取有涉诉风险的企业
|
||
|
|
const lawsuitCompanies = (qyglData?.items || []).filter((item) => {
|
||
|
|
const lawsuit = item?.lawsuitInfo || {}
|
||
|
|
return (
|
||
|
|
(lawsuit.entout && lawsuit.entout.data && Object.keys(lawsuit.entout.data).length > 0) ||
|
||
|
|
(lawsuit.sxbzxr && lawsuit.sxbzxr.data && lawsuit.sxbzxr.data.sxbzxr && lawsuit.sxbzxr.data.sxbzxr.length > 0) ||
|
||
|
|
(lawsuit.xgbzxr && lawsuit.xgbzxr.data && lawsuit.xgbzxr.data.xgbzxr && lawsuit.xgbzxr.data.xgbzxr.length > 0)
|
||
|
|
)
|
||
|
|
})
|
||
|
|
|
||
|
|
// 1. 投资企业记录模块
|
||
|
|
result.push({
|
||
|
|
data: {
|
||
|
|
apiID: 'CQYGL3F8E_Investment',
|
||
|
|
data: investCompanies,
|
||
|
|
success: true,
|
||
|
|
timestamp: baseTimestamp
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
// 2. 高管任职记录模块
|
||
|
|
result.push({
|
||
|
|
data: {
|
||
|
|
apiID: 'CQYGL3F8E_SeniorExecutive',
|
||
|
|
data: managerPositions,
|
||
|
|
success: true,
|
||
|
|
timestamp: baseTimestamp
|
||
|
|
}
|
||
|
|
})
|
||
|
|
// 3. 涉诉风险模块
|
||
|
|
result.push({
|
||
|
|
data: {
|
||
|
|
apiID: 'CQYGL3F8E_Lawsuit',
|
||
|
|
data: {
|
||
|
|
lawsuitCompanies: lawsuitCompanies,
|
||
|
|
totalCompanies: qyglData?.items?.length || 0
|
||
|
|
},
|
||
|
|
success: true,
|
||
|
|
timestamp: baseTimestamp
|
||
|
|
}
|
||
|
|
})
|
||
|
|
// 4. 对外投资历史模块 - 从所有企业中收集投资历史
|
||
|
|
const allInvestHistory = []
|
||
|
|
qyglData?.items?.forEach(company => {
|
||
|
|
if (company.invest_history?.items) {
|
||
|
|
company.invest_history.items.forEach(investment => {
|
||
|
|
allInvestHistory.push({
|
||
|
|
...investment,
|
||
|
|
companyName: company.orgName, // 添加企业名称
|
||
|
|
companyInfo: {
|
||
|
|
orgName: company.orgName,
|
||
|
|
relationship: company.relationship,
|
||
|
|
basicInfo: company.basicInfo
|
||
|
|
}
|
||
|
|
})
|
||
|
|
})
|
||
|
|
}
|
||
|
|
})
|
||
|
|
result.push({
|
||
|
|
data: {
|
||
|
|
apiID: 'CQYGL3F8E_InvestHistory',
|
||
|
|
data: { items: allInvestHistory, total: allInvestHistory.length },
|
||
|
|
success: true,
|
||
|
|
timestamp: baseTimestamp
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
// 5. 融资历史模块 - 从所有企业中收集融资历史
|
||
|
|
const allFinancingHistory = []
|
||
|
|
qyglData?.items?.forEach(company => {
|
||
|
|
if (company.financing_history?.items) {
|
||
|
|
company.financing_history.items.forEach(financing => {
|
||
|
|
allFinancingHistory.push({
|
||
|
|
...financing,
|
||
|
|
companyName: company.orgName, // 添加企业名称
|
||
|
|
companyInfo: {
|
||
|
|
orgName: company.orgName,
|
||
|
|
relationship: company.relationship,
|
||
|
|
basicInfo: company.basicInfo
|
||
|
|
}
|
||
|
|
})
|
||
|
|
})
|
||
|
|
}
|
||
|
|
})
|
||
|
|
result.push({
|
||
|
|
data: {
|
||
|
|
apiID: 'CQYGL3F8E_FinancingHistory',
|
||
|
|
data: { items: allFinancingHistory, total: allFinancingHistory.length },
|
||
|
|
success: true,
|
||
|
|
timestamp: baseTimestamp
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
// 6. 行政处罚模块 - 从所有企业中收集行政处罚
|
||
|
|
const allPunishmentInfo = []
|
||
|
|
qyglData?.items?.forEach(company => {
|
||
|
|
if (company.punishment_info?.items) {
|
||
|
|
company.punishment_info.items.forEach(punishment => {
|
||
|
|
allPunishmentInfo.push({
|
||
|
|
...punishment,
|
||
|
|
companyName: company.orgName, // 添加企业名称
|
||
|
|
companyInfo: {
|
||
|
|
orgName: company.orgName,
|
||
|
|
relationship: company.relationship,
|
||
|
|
basicInfo: company.basicInfo
|
||
|
|
}
|
||
|
|
})
|
||
|
|
})
|
||
|
|
}
|
||
|
|
})
|
||
|
|
result.push({
|
||
|
|
data: {
|
||
|
|
apiID: 'CQYGL3F8E_Punishment',
|
||
|
|
data: { items: allPunishmentInfo, total: allPunishmentInfo.length },
|
||
|
|
success: true,
|
||
|
|
timestamp: baseTimestamp
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
// 7. 经营异常模块 - 从所有企业中收集经营异常
|
||
|
|
const allAbnormalInfo = []
|
||
|
|
qyglData?.items?.forEach(company => {
|
||
|
|
if (company.abnormal_info?.items) {
|
||
|
|
company.abnormal_info.items.forEach(abnormal => {
|
||
|
|
allAbnormalInfo.push({
|
||
|
|
...abnormal,
|
||
|
|
companyName: company.orgName, // 添加企业名称
|
||
|
|
companyInfo: {
|
||
|
|
orgName: company.orgName,
|
||
|
|
relationship: company.relationship,
|
||
|
|
basicInfo: company.basicInfo
|
||
|
|
}
|
||
|
|
})
|
||
|
|
})
|
||
|
|
}
|
||
|
|
})
|
||
|
|
result.push({
|
||
|
|
data: {
|
||
|
|
apiID: 'CQYGL3F8E_Abnormal',
|
||
|
|
data: { items: allAbnormalInfo, total: allAbnormalInfo.length },
|
||
|
|
success: true,
|
||
|
|
timestamp: baseTimestamp
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
// 8. 税务风险模块 - 包含欠税公告和税收违法
|
||
|
|
const taxRiskCompanies = (qyglData?.items || []).filter((item) => {
|
||
|
|
const ownTax = item?.own_tax || {};
|
||
|
|
const taxContravention = item?.tax_contravention || {};
|
||
|
|
return (ownTax.total > 0 && ownTax.items && ownTax.items.length > 0) ||
|
||
|
|
(taxContravention.total > 0 && taxContravention.items && taxContravention.items.length > 0);
|
||
|
|
});
|
||
|
|
|
||
|
|
result.push({
|
||
|
|
data: {
|
||
|
|
apiID: 'CQYGL3F8E_TaxRisk',
|
||
|
|
data: { items: taxRiskCompanies },
|
||
|
|
success: true,
|
||
|
|
timestamp: baseTimestamp
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
} else {
|
||
|
|
// 其他数据直接添加
|
||
|
|
result.push(item)
|
||
|
|
}
|
||
|
|
})
|
||
|
|
|
||
|
|
return result
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取关系文本描述
|
||
|
|
* @param {string} relation - 关系代码
|
||
|
|
* @returns {string} 关系文本
|
||
|
|
*/
|
||
|
|
export function getRelationshipText(relation) {
|
||
|
|
const relationshipMap = {
|
||
|
|
sh: '股东',
|
||
|
|
his_sh: '曾任股东',
|
||
|
|
lp: '法人',
|
||
|
|
his_lp: '曾任法人',
|
||
|
|
tm: '高管',
|
||
|
|
his_tm: '曾任高管'
|
||
|
|
}
|
||
|
|
return relationshipMap[relation] || relation
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取关系样式类
|
||
|
|
* @param {string} relation - 关系代码
|
||
|
|
* @returns {string} 样式类名
|
||
|
|
*/
|
||
|
|
export function getRelationshipClass(relation) {
|
||
|
|
const relationshipMap = {
|
||
|
|
sh: 'bg-blue-100 text-blue-700',
|
||
|
|
his_sh: 'bg-blue-50 text-blue-600',
|
||
|
|
lp: 'bg-green-100 text-green-700',
|
||
|
|
his_lp: 'bg-green-50 text-green-600',
|
||
|
|
tm: 'bg-purple-100 text-purple-700',
|
||
|
|
his_tm: 'bg-purple-50 text-purple-600'
|
||
|
|
}
|
||
|
|
return relationshipMap[relation] || 'bg-gray-100 text-gray-600'
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 获取企业状态对应的样式类
|
||
|
|
* @param {string} status - 企业状态
|
||
|
|
* @returns {string} 样式类名
|
||
|
|
*/
|
||
|
|
export function getStatusClass(status) {
|
||
|
|
if (!status) return 'bg-gray-100 text-gray-500'
|
||
|
|
|
||
|
|
if (status.includes('注销') || status.includes('吊销')) {
|
||
|
|
return 'bg-red-50 text-red-600'
|
||
|
|
} else if (status.includes('存续') || status.includes('在营')) {
|
||
|
|
return 'bg-green-50 text-green-600'
|
||
|
|
} else if (status.includes('筹建') || status.includes('新设')) {
|
||
|
|
return 'bg-blue-50 text-blue-600'
|
||
|
|
} else {
|
||
|
|
return 'bg-yellow-50 text-yellow-600'
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 格式化资本金额显示
|
||
|
|
* @param {string|number} capital - 资本金额
|
||
|
|
* @param {string} currency - 货币类型
|
||
|
|
* @returns {string} 格式化后的金额
|
||
|
|
*/
|
||
|
|
export function formatCapital(capital, currency) {
|
||
|
|
if (!capital) return '—'
|
||
|
|
|
||
|
|
let unit = ''
|
||
|
|
let value = parseFloat(capital)
|
||
|
|
|
||
|
|
// 处理原始数据中可能带有的单位
|
||
|
|
if (typeof capital === 'string' && capital.includes('万')) {
|
||
|
|
unit = '万'
|
||
|
|
const numMatch = capital.match(/[\d.]+/)
|
||
|
|
value = numMatch ? parseFloat(numMatch[0]) : 0
|
||
|
|
} else if (value >= 10000) {
|
||
|
|
// 大额数字转换为万元显示
|
||
|
|
value = value / 10000
|
||
|
|
unit = '万'
|
||
|
|
}
|
||
|
|
|
||
|
|
// 格式化数字,保留两位小数(如果有小数部分)
|
||
|
|
const formattedValue = value.toLocaleString('zh-CN', {
|
||
|
|
minimumFractionDigits: 0,
|
||
|
|
maximumFractionDigits: 2,
|
||
|
|
})
|
||
|
|
|
||
|
|
return `${formattedValue}${unit} ${currency || '人民币'}`
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 格式化日期显示
|
||
|
|
* @param {string} dateStr - 日期字符串
|
||
|
|
* @returns {string} 格式化后的日期
|
||
|
|
*/
|
||
|
|
export function formatDate(dateStr) {
|
||
|
|
if (!dateStr) return '—'
|
||
|
|
return dateStr
|
||
|
|
}
|