diff --git a/src/components/BaseReport.vue b/src/components/BaseReport.vue index 862505e..b00c328 100644 --- a/src/components/BaseReport.vue +++ b/src/components/BaseReport.vue @@ -644,87 +644,88 @@ const maskValue = computed(() => { // ==================== 新评分系统 ==================== // Feature 风险等级配置(权重越高表示风险越大,最终分数越高越安全) const featureRiskLevels = { - // 🔴 高风险类 - 权重 10 - 'FLXG0V4B': 20, // 司法涉诉 - 'FLXG7E8F': 20, // 个人涉诉 - 'FLXG3D56': 10, // 违约失信 - 'FLXGDEA9': 18, // 本人不良 - 'JRZQ4AA8': 10, // 还款压力 + // 🔴 极高风险类 - 权重 60(有高风险直接扣约70-80分) + 'FLXG0V4B': 60, // 司法涉诉 + 'FLXG3D56': 60, // 违约失信 + 'JRZQ8A2D': 60, // 特殊名单验证 + 'FLXG7E8F': 55, // 个人涉诉 + 'FLXGDEA9': 55, // 本人不良 - // 🟠 中高风险类 - 权重 7 - 'JRZQ0A03': 7, // 借贷申请记录 - 'JRZQ6F2A': 7, // 借贷申请 - 'JRZQ8203': 7, // 借贷行为记录 - 'JRZQ4B6C': 7, // 信贷表现 - 'BehaviorRiskScan': 7, // 风险行为扫描 - 'IVYZ8I9J': 7, // 网络社交异常 - 'JRZQ8A2D': 9, // 特殊名单验证 - 'JRZQ7F1A': 8, // 全景雷达 - 'JRZQ7F1A_ApplyReport': 3, - 'JRZQ7F1A_BehaviorReport': 3, - 'JRZQ7F1A_BigDataReport': 2, - 'YYSY7D3E': 5, // 手机携号转网 - 'YYSY8B1C': 5, // 手机在网时长 - 'DWBG7F3A': 8, // 多头借贷 + // 🟡 中高风险类 - 权重 20-30 + 'JRZQ4AA8': 25, // 还款压力 + 'JRZQ0A03': 25, // 借贷申请记录 + 'JRZQ8203': 25, // 借贷行为记录 + 'JRZQ4B6C': 25, // 信贷表现 + 'JRZQ6F2A': 25, // 借贷申请 + 'BehaviorRiskScan': 60, // 风险行为扫描 + 'IVYZ8I9J': 45, // 网络社交异常 + 'JRZQ7F1A': 20, // 全景雷达 + 'JRZQ7F1A_ApplyReport': 8, + 'JRZQ7F1A_BehaviorReport': 8, + 'JRZQ7F1A_BigDataReport': 4, + 'DWBG7F3A': 25, // 多头借贷 + 'YYSY7D3E': 15, // 手机携号转网 + 'YYSY8B1C': 15, // 手机在网时长 - // 🟡 中风险类 - 权重 5 - 'QYGL3F8E': 5, // 人企关系加强版 - 'QCXG7A2B': 5, // 名下车辆 - 'JRZQ09J8': 5, // 收入评估 - 'JRZQ3C9R': 5, // 支付行为指数 - // 🔵 低风险类 - 权重 3 - 'IVYZ5733': 3, // 婚姻状态 - 'IVYZ9A2B': 3, // 学历信息 - 'IVYZ3P9M': 3, // 学历信息查询(实时版) + // 🟢 中风险类 - 权重 8-12 + 'QYGL3F8E': 10, // 人企关系加强版 + 'QCXG7A2B': 10, // 名下车辆 + 'JRZQ09J8': 10, // 收入评估 + 'JRZQ3C9R': 10, // 支付行为指数 + + // 🔵 低风险类 - 权重 3-5 + 'IVYZ5733': 4, // 婚姻状态 + 'IVYZ9A2B': 4, // 学历信息 + 'IVYZ3P9M': 4, // 学历信息查询(实时版) // 📊 复合报告类 - 按子模块动态计算 'DWBG8B4D': 0, // 谛听多维报告(由子模块计算) 'DWBG6A2C': 0, // 司南报告(由子模块计算) 'JRZQ5E9F': 0, // 贷款风险评估(由子模块计算) // 谛听多维报告子模块 - 'DWBG8B4D_Overview': 10, - 'DWBG8B4D_ElementVerification': 4, - 'DWBG8B4D_Identity': 4, - 'DWBG8B4D_RiskWarning': 10, - 'DWBG8B4D_OverdueRisk': 9, - 'DWBG8B4D_LoanEvaluation': 7, - 'DWBG8B4D_LeasingRisk': 6, - 'DWBG8B4D_RiskSupervision': 8, - 'DWBG8B4D_RiskWarningTab': 9, + 'DWBG8B4D_Overview': 30, + 'DWBG8B4D_ElementVerification': 10, + 'DWBG8B4D_Identity': 10, + 'DWBG8B4D_RiskWarning': 35, + 'DWBG8B4D_OverdueRisk': 30, + 'DWBG8B4D_LoanEvaluation': 20, + 'DWBG8B4D_LeasingRisk': 18, + 'DWBG8B4D_RiskSupervision': 25, + 'DWBG8B4D_RiskWarningTab': 30, // 司南报告子模块 - 'DWBG6A2C_StandLiveInfo': 4, - 'DWBG6A2C_RiskPoint': 9, - 'DWBG6A2C_SecurityInfo': 15, - 'DWBG6A2C_AntiFraudInfo': 15, - 'DWBG6A2C_RiskList': 12, - 'DWBG6A2C_ApplicationStatistics': 7, - 'DWBG6A2C_LendingStatistics': 6, - 'DWBG6A2C_PerformanceStatistics': 7, - 'DWBG6A2C_OverdueRecord': 9, - 'DWBG6A2C_CreditDetail': 5, - 'DWBG6A2C_RentalBehavior': 5, - 'DWBG6A2C_RiskSupervision': 8, + 'DWBG6A2C_StandLiveInfo': 10, + 'DWBG6A2C_RiskPoint': 28, + 'DWBG6A2C_SecurityInfo': 45, + 'DWBG6A2C_AntiFraudInfo': 45, + 'DWBG6A2C_RiskList': 38, + 'DWBG6A2C_ApplicationStatistics': 22, + 'DWBG6A2C_LendingStatistics': 18, + 'DWBG6A2C_PerformanceStatistics': 22, + 'DWBG6A2C_OverdueRecord': 28, + 'DWBG6A2C_CreditDetail': 15, + 'DWBG6A2C_RentalBehavior': 15, + 'DWBG6A2C_RiskSupervision': 25, // 贷款风险评估子模块 - 'CJRZQ5E9F_RiskOverview': 8, - 'CJRZQ5E9F_CreditScores': 7, - 'CJRZQ5E9F_LoanBehaviorAnalysis': 7, - 'CJRZQ5E9F_InstitutionAnalysis': 5, - 'CJRZQ5E9F_TimeTrendAnalysis': 6, - 'CJRZQ5E9F_RiskIndicators': 8, - 'CJRZQ5E9F_RiskAdvice': 2, + 'CJRZQ5E9F_RiskOverview': 25, + 'CJRZQ5E9F_CreditScores': 22, + 'CJRZQ5E9F_LoanBehaviorAnalysis': 22, + 'CJRZQ5E9F_InstitutionAnalysis': 15, + 'CJRZQ5E9F_TimeTrendAnalysis': 18, + 'CJRZQ5E9F_RiskIndicators': 25, + 'CJRZQ5E9F_RiskAdvice': 6, // 人企关系加强版子模块 - 'CQYGL3F8E_Investment': 4, - 'CQYGL3F8E_SeniorExecutive': 4, - 'CQYGL3F8E_Lawsuit': 8, - 'CQYGL3F8E_InvestHistory': 3, - 'CQYGL3F8E_FinancingHistory': 3, - 'CQYGL3F8E_Punishment': 7, - 'CQYGL3F8E_Abnormal': 6, - 'CQYGL3F8E_TaxRisk': 7, + 'CQYGL3F8E_Investment': 12, + 'CQYGL3F8E_SeniorExecutive': 12, + 'CQYGL3F8E_Lawsuit': 25, + 'CQYGL3F8E_InvestHistory': 8, + 'CQYGL3F8E_FinancingHistory': 8, + 'CQYGL3F8E_Punishment': 22, + 'CQYGL3F8E_Abnormal': 18, + 'CQYGL3F8E_TaxRisk': 22, }; // 存储每个组件的 ref 引用 diff --git a/src/ui/CFLXG0V4B/utils/lawsuitUtils.js b/src/ui/CFLXG0V4B/utils/lawsuitUtils.js index 8b225f0..d9e217f 100644 --- a/src/ui/CFLXG0V4B/utils/lawsuitUtils.js +++ b/src/ui/CFLXG0V4B/utils/lawsuitUtils.js @@ -1,302 +1,303 @@ // 案件类型映射表 export const lawsuitTypeMap = { - sxbzxr: { - text: '失信被执行', - color: 'text-red-600 bg-red-50', - darkColor: 'bg-red-500', - riskLevel: 'high', // 高风险 - }, - xgbzxr: { - text: '限高被执行', - color: 'text-orange-600 bg-orange-50', - darkColor: 'bg-orange-500', - riskLevel: 'high', // 高风险 - }, - criminal: { - text: '刑事案件', - color: 'text-red-600 bg-red-50', - darkColor: 'bg-red-500', - riskLevel: 'high', // 高风险 - }, - civil: { - text: '民事案件', - color: 'text-blue-600 bg-blue-50', - darkColor: 'bg-blue-500', - riskLevel: 'medium', // 中风险 - }, - administrative: { - text: '行政案件', - color: 'text-purple-600 bg-purple-50', - darkColor: 'bg-purple-500', - riskLevel: 'medium', // 中风险 - }, - implement: { - text: '执行案件', - color: 'text-orange-600 bg-orange-50', - darkColor: 'bg-orange-500', - riskLevel: 'medium', // 中风险 - }, - bankrupt: { - text: '强制清算与破产案件', - color: 'text-rose-600 bg-rose-50', - darkColor: 'bg-rose-500', - riskLevel: 'high', // 高风险 - }, - preservation: { - text: '非诉保全审查', - color: 'text-amber-600 bg-amber-50', - darkColor: 'bg-amber-500', - riskLevel: 'low', // 低风险 - }, -} + sxbzxr: { + text: "失信被执行", + color: "text-red-600 bg-red-50", + darkColor: "bg-red-500", + riskLevel: "high", // 高风险 + }, + xgbzxr: { + text: "限高被执行", + color: "text-orange-600 bg-orange-50", + darkColor: "bg-orange-500", + riskLevel: "high", // 高风险 + }, + criminal: { + text: "刑事案件", + color: "text-red-600 bg-red-50", + darkColor: "bg-red-500", + riskLevel: "high", // 高风险 + }, + civil: { + text: "民事案件", + color: "text-blue-600 bg-blue-50", + darkColor: "bg-blue-500", + riskLevel: "medium", // 中风险 + }, + administrative: { + text: "行政案件", + color: "text-purple-600 bg-purple-50", + darkColor: "bg-purple-500", + riskLevel: "medium", // 中风险 + }, + implement: { + text: "执行案件", + color: "text-orange-600 bg-orange-50", + darkColor: "bg-orange-500", + riskLevel: "medium", // 中风险 + }, + bankrupt: { + text: "强制清算与破产案件", + color: "text-rose-600 bg-rose-50", + darkColor: "bg-rose-500", + riskLevel: "high", // 高风险 + }, + preservation: { + text: "非诉保全审查", + color: "text-amber-600 bg-amber-50", + darkColor: "bg-amber-500", + riskLevel: "low", // 低风险 + }, +}; // 案件类型文本 -export const getCaseTypeText = type => { - return lawsuitTypeMap[type]?.text || '其他案件' -} +export const getCaseTypeText = (type) => { + return lawsuitTypeMap[type]?.text || "其他案件"; +}; // 案件类型颜色 -export const getCaseTypeColor = type => { - return lawsuitTypeMap[type]?.color || 'text-gray-600 bg-gray-50' -} +export const getCaseTypeColor = (type) => { + return lawsuitTypeMap[type]?.color || "text-gray-600 bg-gray-50"; +}; // 案件类型深色 -export const getCaseTypeDarkColor = type => { - return lawsuitTypeMap[type]?.darkColor || 'bg-gray-500' -} +export const getCaseTypeDarkColor = (type) => { + return lawsuitTypeMap[type]?.darkColor || "bg-gray-500"; +}; // 格式化日期显示 -export const formatDate = dateStr => { - if (!dateStr) return '—' - // 转换YYYY-MM-DD为年月日格式 - if (dateStr.includes('-')) { - const parts = dateStr.split('-') - if (parts.length === 3) { - return `${parts[0]}年${parts[1]}月${parts[2]}日` +export const formatDate = (dateStr) => { + if (!dateStr) return "—"; + // 转换YYYY-MM-DD为年月日格式 + if (dateStr.includes("-")) { + const parts = dateStr.split("-"); + if (parts.length === 3) { + return `${parts[0]}年${parts[1]}月${parts[2]}日`; + } } - } - return dateStr // 如果不是标准格式则返回原始字符串 -} + return dateStr; // 如果不是标准格式则返回原始字符串 +}; +// 格式化金额显示(单位:元) +export const formatLawsuitMoney = (money) => { + if (!money) return "—"; -// 格式化金额显示(单位:万元) -export const formatLawsuitMoney = money => { - if (!money) return '—' + const value = parseFloat(money); + if (isNaN(value)) return "—"; - const value = parseFloat(money) - if (isNaN(value)) return '—' - - // 超过1亿显示亿元 - if (value >= 10000) { + // 直接显示原始金额(元) return ( - (value / 10000).toLocaleString('zh-CN', { - minimumFractionDigits: 0, - maximumFractionDigits: 2, - }) + ' 亿元' - ) - } - - // 否则显示万元 - return ( - value.toLocaleString('zh-CN', { - minimumFractionDigits: 0, - maximumFractionDigits: 2, - }) + ' 万元' - ) -} - + value.toLocaleString("zh-CN", { + minimumFractionDigits: 0, + maximumFractionDigits: 2, + }) + " 元" + ); +}; // 获取案件状态样式 -export const getCaseStatusClass = status => { - if (!status) return 'bg-gray-100 text-gray-500' +export const getCaseStatusClass = (status) => { + if (!status) return "bg-gray-100 text-gray-500"; - 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 if (status.includes('未执行')) { - return 'bg-amber-50 text-amber-600' - } else { - return 'bg-gray-100 text-gray-500' - } -} + 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 if (status.includes("未执行")) { + return "bg-amber-50 text-amber-600"; + } else { + return "bg-gray-100 text-gray-500"; + } +}; // 获取企业状态对应的样式 -export const getStatusClass = status => { - if (!status) return 'bg-gray-100 text-gray-500' +export const 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' - } -} + 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"; + } +}; // 格式化资本金额显示 export const formatCapital = (capital, currency) => { - if (!capital) return '—' + if (!capital) return "—"; - // 检查是否包含"万"字或需要显示为万元 - let unit = '' - let value = parseFloat(capital) + // 检查是否包含"万"字或需要显示为万元 + 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 = '万' - } + // 处理原始数据中可能带有的单位 + 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, - }) + // 格式化数字,保留两位小数(如果有小数部分) + const formattedValue = value.toLocaleString("zh-CN", { + minimumFractionDigits: 0, + maximumFractionDigits: 2, + }); - return `${formattedValue}${unit} ${currency || '人民币'}` -} + return `${formattedValue}${unit} ${currency || "人民币"}`; +}; // 获取涉诉风险等级 -export const getRiskLevel = lawsuitInfo => { - if (!lawsuitInfo) { +export const getRiskLevel = (lawsuitInfo) => { + if (!lawsuitInfo) { + return { + level: "low", + text: "低风险", + color: "text-green-600 bg-green-50", + }; + } + + // 失信被执行人是最高风险 + if (lawsuitInfo.sxbzxr && lawsuitInfo.sxbzxr.length > 0) { + return { + level: "high", + text: "高风险", + color: "text-red-600 bg-red-50", + }; + } + + // 限高被执行人是最高风险 + if (lawsuitInfo.xgbzxr && lawsuitInfo.xgbzxr.length > 0) { + return { + level: "high", + text: "高风险", + color: "text-red-600 bg-red-50", + }; + } + + // 有涉诉数据的风险级别 + if (lawsuitInfo.data && Object.keys(lawsuitInfo.data).length > 0) { + // 检查是否有未结案的案件 + const data = lawsuitInfo.data; + if (data.count && data.count_wei_total && data.count_wei_total > 0) { + return { + level: "medium", + text: "中风险", + color: "text-amber-600 bg-amber-50", + }; + } + + // 只有已结案的为低中风险 + return { + level: "low-medium", + text: "低中风险", + color: "text-yellow-600 bg-yellow-50", + }; + } + return { - level: 'low', - text: '低风险', - color: 'text-green-600 bg-green-50', - } - } - - // 失信被执行人是最高风险 - if (lawsuitInfo.sxbzxr && lawsuitInfo.sxbzxr.length > 0) { - return { - level: 'high', - text: '高风险', - color: 'text-red-600 bg-red-50', - } - } - - // 限高被执行人是最高风险 - if (lawsuitInfo.xgbzxr && lawsuitInfo.xgbzxr.length > 0) { - return { - level: 'high', - text: '高风险', - color: 'text-red-600 bg-red-50', - } - } - - // 有涉诉数据的风险级别 - if (lawsuitInfo.data && Object.keys(lawsuitInfo.data).length > 0) { - // 检查是否有未结案的案件 - const data = lawsuitInfo.data - if (data.count && data.count_wei_total && data.count_wei_total > 0) { - return { - level: 'medium', - text: '中风险', - color: 'text-amber-600 bg-amber-50', - } - } - - // 只有已结案的为低中风险 - return { - level: 'low-medium', - text: '低中风险', - color: 'text-yellow-600 bg-yellow-50', - } - } - - return { - level: 'low', - text: '低风险', - color: 'text-green-600 bg-green-50', - } -} + level: "low", + text: "低风险", + color: "text-green-600 bg-green-50", + }; +}; // 获取涉诉案件统计 -export const getLawsuitStats = lawsuitInfo => { - if (!lawsuitInfo) return null +export const getLawsuitStats = (lawsuitInfo) => { + if (!lawsuitInfo) return null; - const stats = { - total: 0, - types: [], - } + const stats = { + total: 0, + types: [], + }; - // 统计各类型案件数量 - Object.keys(lawsuitTypeMap).forEach(type => { - let count = 0 + // 统计各类型案件数量 + Object.keys(lawsuitTypeMap).forEach((type) => { + let count = 0; - if (type === 'sxbzxr') { - count = lawsuitInfo.sxbzxr && lawsuitInfo.sxbzxr.length > 0 ? lawsuitInfo.sxbzxr.length : 0 - } else if (type === 'xgbzxr') { - count = lawsuitInfo.xgbzxr && lawsuitInfo.xgbzxr.length > 0 ? lawsuitInfo.xgbzxr.length : 0 - } else if (lawsuitInfo.data && lawsuitInfo.data[type] && Object.keys(lawsuitInfo.data[type]).length > 0) { - const typeData = lawsuitInfo.data[type] - count = typeData.cases && typeData.cases.length ? typeData.cases.length : 0 - } + if (type === "sxbzxr") { + count = + lawsuitInfo.sxbzxr && lawsuitInfo.sxbzxr.length > 0 + ? lawsuitInfo.sxbzxr.length + : 0; + } else if (type === "xgbzxr") { + count = + lawsuitInfo.xgbzxr && lawsuitInfo.xgbzxr.length > 0 + ? lawsuitInfo.xgbzxr.length + : 0; + } else if ( + lawsuitInfo.data && + lawsuitInfo.data[type] && + Object.keys(lawsuitInfo.data[type]).length > 0 + ) { + const typeData = lawsuitInfo.data[type]; + count = + typeData.cases && typeData.cases.length + ? typeData.cases.length + : 0; + } - if (count > 0) { - stats.total += count - stats.types.push({ - type, - count, - name: getCaseTypeText(type), - color: getCaseTypeColor(type), - darkColor: getCaseTypeDarkColor(type), - }) - } - }) + if (count > 0) { + stats.total += count; + stats.types.push({ + type, + count, + name: getCaseTypeText(type), + color: getCaseTypeColor(type), + darkColor: getCaseTypeDarkColor(type), + }); + } + }); - return stats -} + return stats; +}; // 获取案件类型优先级顺序 export const getCaseTypePriority = () => { - return [ - 'sxbzxr', // 失信被执行人(最高风险) - 'xgbzxr', // 限高被执行人 - 'criminal', // 刑事案件 - 'civil', // 民事案件 - 'administrative', // 行政案件 - 'implement', // 执行案件 - 'bankrupt', // 强制清算与破产案件 - 'preservation', // 非诉保全审查 - ] -} + return [ + "sxbzxr", // 失信被执行人(最高风险) + "xgbzxr", // 限高被执行人 + "criminal", // 刑事案件 + "civil", // 民事案件 + "administrative", // 行政案件 + "implement", // 执行案件 + "bankrupt", // 强制清算与破产案件 + "preservation", // 非诉保全审查 + ]; +}; // 根据案件类型获取风险等级 -export const getCaseTypeRiskLevel = caseType => { - const typeInfo = lawsuitTypeMap[caseType] - if (!typeInfo) { - return { - level: 'low', - text: '低风险', - color: 'text-green-600 bg-green-50', +export const getCaseTypeRiskLevel = (caseType) => { + const typeInfo = lawsuitTypeMap[caseType]; + if (!typeInfo) { + return { + level: "low", + text: "低风险", + color: "text-green-600 bg-green-50", + }; } - } - const riskLevelMap = { - high: { - text: '高风险', - color: 'text-red-600 bg-red-50', - }, - medium: { - text: '中风险', - color: 'text-amber-600 bg-amber-50', - }, - low: { - text: '低风险', - color: 'text-green-600 bg-green-50', - }, - } + const riskLevelMap = { + high: { + text: "高风险", + color: "text-red-600 bg-red-50", + }, + medium: { + text: "中风险", + color: "text-amber-600 bg-amber-50", + }, + low: { + text: "低风险", + color: "text-green-600 bg-green-50", + }, + }; - return { - level: typeInfo.riskLevel, - ...riskLevelMap[typeInfo.riskLevel], - } -} + return { + level: typeInfo.riskLevel, + ...riskLevelMap[typeInfo.riskLevel], + }; +}; diff --git a/src/ui/CFLXG3D56.vue b/src/ui/CFLXG3D56.vue index 2fd337e..ad2aa2a 100644 --- a/src/ui/CFLXG3D56.vue +++ b/src/ui/CFLXG3D56.vue @@ -465,12 +465,12 @@ const riskScore = computed(() => { const lowRiskCount = summaryData.value.byRiskLevel.find(item => item.id === 'low')?.triggered || 0; // 计算风险分数 - // 高风险项:每个扣 30 分 - // 中风险项:每个扣 15 分 - // 低风险项:每个扣 5 分 + // 高风险项(无法收回):每个扣 40 分 + // 中风险项(严重逾期):每个扣 20 分 + // 低风险项(短期逾期):每个扣 5 分 let score = 100; - score -= highRiskCount * 30; - score -= mediumRiskCount * 15; + score -= highRiskCount * 40; + score -= mediumRiskCount * 20; score -= lowRiskCount * 5; return Math.max(0, Math.min(100, score)); @@ -544,11 +544,11 @@ onMounted(() => {

{{ - riskSeverity.level === 'critical' - ? '存在无法收回风险,请立即处理' - : riskSeverity.level === 'warning' - ? '存在严重逾期风险,建议尽快处理' - : '存在短期逾期风险,请注意处理' + riskSeverity.level === 'critical' + ? '存在无法收回风险,请立即处理' + : riskSeverity.level === 'warning' + ? '存在严重逾期风险,建议尽快处理' + : '存在短期逾期风险,请注意处理' }}

diff --git a/src/ui/CFLXGDEA9.vue b/src/ui/CFLXGDEA9.vue index a78da63..a9cc63e 100644 --- a/src/ui/CFLXGDEA9.vue +++ b/src/ui/CFLXGDEA9.vue @@ -57,7 +57,7 @@
- +
@@ -65,13 +65,15 @@
- 正常人员 +
- {{ getRiskTypeInfo('0').text }} + {{ isNormalPerson ? '正常人员' : '人员状态' }}
-
{{ getRiskTypeInfo('0').description }}
+
{{ isNormalPerson ? '无不良记录,属于正常人员' : '存在不良记录风险' + }}
@@ -460,12 +462,12 @@ const isHit = (code) => { // 如果level是'0',则正常人员命中 return hitRiskCodes.value.includes('0') } - + // 如果直接包含该代码,则命中 if (hitRiskCodes.value.includes(code)) { return true } - + // 对于父级类型(A、B、C、D),如果子类型命中,父类型也算命中 if (code === 'A') { // 如果 A1、A2、A3、A4、A5 任何一个命中,A 也算命中 @@ -483,7 +485,7 @@ const isHit = (code) => { // 如果 D1、D2、D3、D4、D5 任何一个命中,D 也算命中 return ['D1', 'D2', 'D3', 'D4', 'D5'].some(subCode => hitRiskCodes.value.includes(subCode)) } - + return false } diff --git a/src/ui/CQYGL3F8E/components/Lawsuit.vue b/src/ui/CQYGL3F8E/components/Lawsuit.vue index 31fc876..0d0a244 100644 --- a/src/ui/CQYGL3F8E/components/Lawsuit.vue +++ b/src/ui/CQYGL3F8E/components/Lawsuit.vue @@ -221,7 +221,7 @@ {{ getLawsuitStats(company).total || 0 - }} + }}
{{ company.basicInfo.regStatus || '-' - }} + }} 统一社会信用代码: {{ company.basicInfo.creditCode || '-' - }} + }} 注册资本: {{ @@ -1162,29 +1162,18 @@ const getLawsuitStats = (company) => { return stats; }; -// 格式化金额显示(单位:万元) const formatLawsuitMoney = (money) => { if (!money) return "—"; const value = parseFloat(money); if (isNaN(value)) return "—"; - // 超过1亿显示亿元 - if (value >= 10000) { - return ( - (value / 10000).toLocaleString("zh-CN", { - minimumFractionDigits: 0, - maximumFractionDigits: 2, - }) + " 亿元" - ); - } - - // 否则显示万元 + // 直接显示原始金额(元) return ( value.toLocaleString("zh-CN", { minimumFractionDigits: 0, maximumFractionDigits: 2, - }) + " 万元" + }) + " 元" ); }; diff --git a/src/ui/FLXG7E8F/utils/lawsuitUtils.js b/src/ui/FLXG7E8F/utils/lawsuitUtils.js index 7f1ff3d..8ee1142 100644 --- a/src/ui/FLXG7E8F/utils/lawsuitUtils.js +++ b/src/ui/FLXG7E8F/utils/lawsuitUtils.js @@ -1,303 +1,316 @@ // 案件类型映射表 export const lawsuitTypeMap = { - breachCase: { - text: '失信被执行', - color: 'text-red-600 bg-red-50', - darkColor: 'bg-red-500', - riskLevel: 'high', // 高风险 - }, - consumptionRestriction: { - text: '限高被执行', - color: 'text-orange-600 bg-orange-50', - darkColor: 'bg-orange-500', - riskLevel: 'high', // 高风险 - }, - criminal: { - text: '刑事案件', - color: 'text-red-600 bg-red-50', - darkColor: 'bg-red-500', - riskLevel: 'high', // 高风险 - }, - civil: { - text: '民事案件', - color: 'text-blue-600 bg-blue-50', - darkColor: 'bg-blue-500', - riskLevel: 'medium', // 中风险 - }, - administrative: { - text: '行政案件', - color: 'text-purple-600 bg-purple-50', - darkColor: 'bg-purple-500', - riskLevel: 'medium', // 中风险 - }, - implement: { - text: '执行案件', - color: 'text-orange-600 bg-orange-50', - darkColor: 'bg-orange-500', - riskLevel: 'medium', // 中风险 - }, - bankrupt: { - text: '强制清算与破产案件', - color: 'text-rose-600 bg-rose-50', - darkColor: 'bg-rose-500', - riskLevel: 'high', // 高风险 - }, - preservation: { - text: '非诉保全审查', - color: 'text-amber-600 bg-amber-50', - darkColor: 'bg-amber-500', - riskLevel: 'low', // 低风险 - }, -} + breachCase: { + text: "失信被执行", + color: "text-red-600 bg-red-50", + darkColor: "bg-red-500", + riskLevel: "high", // 高风险 + }, + consumptionRestriction: { + text: "限高被执行", + color: "text-orange-600 bg-orange-50", + darkColor: "bg-orange-500", + riskLevel: "high", // 高风险 + }, + criminal: { + text: "刑事案件", + color: "text-red-600 bg-red-50", + darkColor: "bg-red-500", + riskLevel: "high", // 高风险 + }, + civil: { + text: "民事案件", + color: "text-blue-600 bg-blue-50", + darkColor: "bg-blue-500", + riskLevel: "medium", // 中风险 + }, + administrative: { + text: "行政案件", + color: "text-purple-600 bg-purple-50", + darkColor: "bg-purple-500", + riskLevel: "medium", // 中风险 + }, + implement: { + text: "执行案件", + color: "text-orange-600 bg-orange-50", + darkColor: "bg-orange-500", + riskLevel: "medium", // 中风险 + }, + bankrupt: { + text: "强制清算与破产案件", + color: "text-rose-600 bg-rose-50", + darkColor: "bg-rose-500", + riskLevel: "high", // 高风险 + }, + preservation: { + text: "非诉保全审查", + color: "text-amber-600 bg-amber-50", + darkColor: "bg-amber-500", + riskLevel: "low", // 低风险 + }, +}; // 案件类型文本 -export const getCaseTypeText = type => { - return lawsuitTypeMap[type]?.text || '其他案件' -} +export const getCaseTypeText = (type) => { + return lawsuitTypeMap[type]?.text || "其他案件"; +}; // 案件类型颜色 -export const getCaseTypeColor = type => { - return lawsuitTypeMap[type]?.color || 'text-gray-600 bg-gray-50' -} +export const getCaseTypeColor = (type) => { + return lawsuitTypeMap[type]?.color || "text-gray-600 bg-gray-50"; +}; // 案件类型深色 -export const getCaseTypeDarkColor = type => { - return lawsuitTypeMap[type]?.darkColor || 'bg-gray-500' -} +export const getCaseTypeDarkColor = (type) => { + return lawsuitTypeMap[type]?.darkColor || "bg-gray-500"; +}; // 格式化日期显示 -export const formatDate = dateStr => { - if (!dateStr) return '—' - // 转换YYYY-MM-DD为年月日格式 - if (dateStr.includes('-')) { - const parts = dateStr.split('-') - if (parts.length === 3) { - return `${parts[0]}年${parts[1]}月${parts[2]}日` +export const formatDate = (dateStr) => { + if (!dateStr) return "—"; + // 转换YYYY-MM-DD为年月日格式 + if (dateStr.includes("-")) { + const parts = dateStr.split("-"); + if (parts.length === 3) { + return `${parts[0]}年${parts[1]}月${parts[2]}日`; + } } - } - return dateStr // 如果不是标准格式则返回原始字符串 -} + return dateStr; // 如果不是标准格式则返回原始字符串 +}; -// 格式化金额显示(单位:万元) -export const formatLawsuitMoney = money => { - if (!money) return '—' +export const formatLawsuitMoney = (money) => { + if (!money) return "—"; - const value = parseFloat(money) - if (isNaN(value)) return '—' + const value = parseFloat(money); + if (isNaN(value)) return "—"; - // 超过1亿显示亿元 - if (value >= 10000) { + // 直接显示原始金额(元) return ( - (value / 10000).toLocaleString('zh-CN', { - minimumFractionDigits: 0, - maximumFractionDigits: 2, - }) + ' 亿元' - ) - } - - // 否则显示万元 - return ( - value.toLocaleString('zh-CN', { - minimumFractionDigits: 0, - maximumFractionDigits: 2, - }) + ' 万元' - ) -} + value.toLocaleString("zh-CN", { + minimumFractionDigits: 0, + maximumFractionDigits: 2, + }) + " 元" + ); +}; // 获取案件状态样式 -export const getCaseStatusClass = status => { - if (!status) return 'bg-gray-100 text-gray-500' +export const getCaseStatusClass = (status) => { + if (!status) return "bg-gray-100 text-gray-500"; - 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 if (status.includes('未执行')) { - return 'bg-amber-50 text-amber-600' - } else { - return 'bg-gray-100 text-gray-500' - } -} + 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 if (status.includes("未执行")) { + return "bg-amber-50 text-amber-600"; + } else { + return "bg-gray-100 text-gray-500"; + } +}; // 获取企业状态对应的样式 -export const getStatusClass = status => { - if (!status) return 'bg-gray-100 text-gray-500' +export const 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' - } -} + 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"; + } +}; // 格式化资本金额显示 export const formatCapital = (capital, currency) => { - if (!capital) return '—' + if (!capital) return "—"; - // 检查是否包含"万"字或需要显示为万元 - let unit = '' - let value = parseFloat(capital) + // 检查是否包含"万"字或需要显示为万元 + 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 = '万' - } + // 处理原始数据中可能带有的单位 + 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, - }) + // 格式化数字,保留两位小数(如果有小数部分) + const formattedValue = value.toLocaleString("zh-CN", { + minimumFractionDigits: 0, + maximumFractionDigits: 2, + }); - return `${formattedValue}${unit} ${currency || '人民币'}` -} + return `${formattedValue}${unit} ${currency || "人民币"}`; +}; // 获取涉诉风险等级 -export const getRiskLevel = lawsuitInfo => { - if (!lawsuitInfo) { +export const getRiskLevel = (lawsuitInfo) => { + if (!lawsuitInfo) { + return { + level: "low", + text: "低风险", + color: "text-green-600 bg-green-50", + }; + } + + // 失信被执行人是最高风险 + if (lawsuitInfo.breachCaseList && lawsuitInfo.breachCaseList.length > 0) { + return { + level: "high", + text: "高风险", + color: "text-red-600 bg-red-50", + }; + } + + // 限高被执行人是最高风险 + if ( + lawsuitInfo.consumptionRestrictionList && + lawsuitInfo.consumptionRestrictionList.length > 0 + ) { + return { + level: "high", + text: "高风险", + color: "text-red-600 bg-red-50", + }; + } + + // 有涉诉数据的风险级别 + if ( + lawsuitInfo.lawsuitStat && + Object.keys(lawsuitInfo.lawsuitStat).length > 0 + ) { + // 检查是否有未结案的案件 + const data = lawsuitInfo.lawsuitStat; + if ( + data.count && + data.count.count_wei_total && + data.count.count_wei_total > 0 + ) { + return { + level: "medium", + text: "中风险", + color: "text-amber-600 bg-amber-50", + }; + } + + // 只有已结案的为低中风险 + return { + level: "low-medium", + text: "低中风险", + color: "text-yellow-600 bg-yellow-50", + }; + } + return { - level: 'low', - text: '低风险', - color: 'text-green-600 bg-green-50', - } - } - - // 失信被执行人是最高风险 - if (lawsuitInfo.breachCaseList && lawsuitInfo.breachCaseList.length > 0) { - return { - level: 'high', - text: '高风险', - color: 'text-red-600 bg-red-50', - } - } - - // 限高被执行人是最高风险 - if (lawsuitInfo.consumptionRestrictionList && lawsuitInfo.consumptionRestrictionList.length > 0) { - return { - level: 'high', - text: '高风险', - color: 'text-red-600 bg-red-50', - } - } - - // 有涉诉数据的风险级别 - if (lawsuitInfo.lawsuitStat && Object.keys(lawsuitInfo.lawsuitStat).length > 0) { - // 检查是否有未结案的案件 - const data = lawsuitInfo.lawsuitStat - if (data.count && data.count.count_wei_total && data.count.count_wei_total > 0) { - return { - level: 'medium', - text: '中风险', - color: 'text-amber-600 bg-amber-50', - } - } - - // 只有已结案的为低中风险 - return { - level: 'low-medium', - text: '低中风险', - color: 'text-yellow-600 bg-yellow-50', - } - } - - return { - level: 'low', - text: '低风险', - color: 'text-green-600 bg-green-50', - } -} + level: "low", + text: "低风险", + color: "text-green-600 bg-green-50", + }; +}; // 获取涉诉案件统计 -export const getLawsuitStats = lawsuitInfo => { - if (!lawsuitInfo) return null +export const getLawsuitStats = (lawsuitInfo) => { + if (!lawsuitInfo) return null; - const stats = { - total: 0, - types: [], - } + const stats = { + total: 0, + types: [], + }; - // 统计各类型案件数量 - Object.keys(lawsuitTypeMap).forEach(type => { - let count = 0 + // 统计各类型案件数量 + Object.keys(lawsuitTypeMap).forEach((type) => { + let count = 0; - if (type === 'breachCase') { - count = lawsuitInfo.breachCaseList && lawsuitInfo.breachCaseList.length > 0 ? lawsuitInfo.breachCaseList.length : 0 - } else if (type === 'consumptionRestriction') { - count = lawsuitInfo.consumptionRestrictionList && lawsuitInfo.consumptionRestrictionList.length > 0 ? lawsuitInfo.consumptionRestrictionList.length : 0 - } else if (lawsuitInfo.lawsuitStat && lawsuitInfo.lawsuitStat[type] && Object.keys(lawsuitInfo.lawsuitStat[type]).length > 0) { - const typeData = lawsuitInfo.lawsuitStat[type] - count = typeData.cases && typeData.cases.length ? typeData.cases.length : 0 - } + if (type === "breachCase") { + count = + lawsuitInfo.breachCaseList && + lawsuitInfo.breachCaseList.length > 0 + ? lawsuitInfo.breachCaseList.length + : 0; + } else if (type === "consumptionRestriction") { + count = + lawsuitInfo.consumptionRestrictionList && + lawsuitInfo.consumptionRestrictionList.length > 0 + ? lawsuitInfo.consumptionRestrictionList.length + : 0; + } else if ( + lawsuitInfo.lawsuitStat && + lawsuitInfo.lawsuitStat[type] && + Object.keys(lawsuitInfo.lawsuitStat[type]).length > 0 + ) { + const typeData = lawsuitInfo.lawsuitStat[type]; + count = + typeData.cases && typeData.cases.length + ? typeData.cases.length + : 0; + } - if (count > 0) { - stats.total += count - stats.types.push({ - type, - count, - name: getCaseTypeText(type), - color: getCaseTypeColor(type), - darkColor: getCaseTypeDarkColor(type), - }) - } - }) + if (count > 0) { + stats.total += count; + stats.types.push({ + type, + count, + name: getCaseTypeText(type), + color: getCaseTypeColor(type), + darkColor: getCaseTypeDarkColor(type), + }); + } + }); - return stats -} + return stats; +}; // 获取案件类型优先级顺序 export const getCaseTypePriority = () => { - return [ - 'breachCase', // 失信被执行人(最高风险) - 'consumptionRestriction', // 限高被执行人 - 'criminal', // 刑事案件 - 'civil', // 民事案件 - 'administrative', // 行政案件 - 'implement', // 执行案件 - 'bankrupt', // 强制清算与破产案件 - 'preservation', // 非诉保全审查 - ] -} + return [ + "breachCase", // 失信被执行人(最高风险) + "consumptionRestriction", // 限高被执行人 + "criminal", // 刑事案件 + "civil", // 民事案件 + "administrative", // 行政案件 + "implement", // 执行案件 + "bankrupt", // 强制清算与破产案件 + "preservation", // 非诉保全审查 + ]; +}; // 根据案件类型获取风险等级 -export const getCaseTypeRiskLevel = caseType => { - const typeInfo = lawsuitTypeMap[caseType] - if (!typeInfo) { - return { - level: 'low', - text: '低风险', - color: 'text-green-600 bg-green-50', +export const getCaseTypeRiskLevel = (caseType) => { + const typeInfo = lawsuitTypeMap[caseType]; + if (!typeInfo) { + return { + level: "low", + text: "低风险", + color: "text-green-600 bg-green-50", + }; } - } - const riskLevelMap = { - high: { - text: '高风险', - color: 'text-red-600 bg-red-50', - }, - medium: { - text: '中风险', - color: 'text-amber-600 bg-amber-50', - }, - low: { - text: '低风险', - color: 'text-green-600 bg-green-50', - }, - } - - return { - level: typeInfo.riskLevel, - ...riskLevelMap[typeInfo.riskLevel], - } -} + const riskLevelMap = { + high: { + text: "高风险", + color: "text-red-600 bg-red-50", + }, + medium: { + text: "中风险", + color: "text-amber-600 bg-amber-50", + }, + low: { + text: "低风险", + color: "text-green-600 bg-green-50", + }, + }; + return { + level: typeInfo.riskLevel, + ...riskLevelMap[typeInfo.riskLevel], + }; +}; diff --git a/vite.config.js b/vite.config.js index 8c7e2d8..22a70fd 100644 --- a/vite.config.js +++ b/vite.config.js @@ -18,6 +18,7 @@ export default defineConfig({ target: "http://127.0.0.1:8888", // 本地接口地址 // target: "https://quannengcha.com", // 本地接口地址 changeOrigin: true, + rewrite: (path) => path, // 可选:确保路径不被修改 }, }, },