Files
ycc-proxy-webview/src/ui/JRZQ6F2A/utils/dataParser.js
2026-02-08 16:56:41 +08:00

519 lines
18 KiB
JavaScript
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.

/**
* 数据解析工具函数
* 用于解析借贷意向验证A的返回数据
*/
/**
* 获取字段值,处理空值
*/
export function getValue(value) {
if (
value === undefined ||
value === null ||
value === "" ||
value === "空"
) {
return 0;
}
// 如果是字符串数字,转换为数字
if (typeof value === "string" && /^\d+(\.\d+)?$/.test(value)) {
return parseFloat(value);
}
return value;
}
/**
* 从原始数据中提取 variableValue
*/
export function extractVariableValue(data) {
try {
return (
data?.risk_screen_v2?.variables?.find(
(v) => v.variableName === "bairong_applyloan_extend"
)?.variableValue || {}
);
} catch (error) {
console.error("提取数据失败:", error);
return {};
}
}
/**
* 时间段映射
*/
export const PERIOD_MAP = {
d7: { label: "7天", prefix: "als_d7" },
d15: { label: "15天", prefix: "als_d15" },
m1: { label: "1个月", prefix: "als_m1" },
m3: { label: "3个月", prefix: "als_m3" },
m6: { label: "6个月", prefix: "als_m6" },
m12: { label: "12个月", prefix: "als_m12" },
};
/**
* 获取申请次数(按时间段)
*/
export function getApplicationCounts(variableValue, period, dimension = "id") {
const { prefix } = PERIOD_MAP[period];
const dimKey = dimension === "cell" ? "cell" : "id";
// 计算总申请次数(所有类型的申请次数之和)
const types = [
`${dimKey}_pdl_allnum`, // 线上小额现金贷
`${dimKey}_caon_allnum`, // 线上现金分期
`${dimKey}_rel_allnum`, // 信用卡(类信用卡)
`${dimKey}_caoff_allnum`, // 线下现金分期
`${dimKey}_cooff_allnum`, // 线下消费分期
`${dimKey}_af_allnum`, // 汽车金融
`${dimKey}_coon_allnum`, // 线上消费分期
`${dimKey}_oth_allnum`, // 其他
];
let total = 0;
types.forEach((type) => {
const value = getValue(variableValue[`${prefix}_${type}`]);
total += value;
});
// 银行机构申请次数
const bankTotal =
getValue(variableValue[`${prefix}_${dimKey}_bank_allnum`]) || 0;
// 非银机构申请次数
const nbankTotal =
getValue(variableValue[`${prefix}_${dimKey}_nbank_allnum`]) || 0;
// 如果计算出的total为0则使用银行+非银的总和
const finalTotal = total > 0 ? total : bankTotal + nbankTotal;
return {
total: finalTotal,
bank: bankTotal,
nbank: nbankTotal,
};
}
/**
* 获取特殊时段(周末/夜间)申请次数(按时间段,银行+非银)
*/
export function getSpecialPeriodCounts(
variableValue,
period,
dimension = "id"
) {
const { prefix } = PERIOD_MAP[period];
const dimKey = dimension === "cell" ? "cell" : "id";
const weekendBank =
getValue(variableValue[`${prefix}_${dimKey}_bank_week_allnum`]) || 0;
const weekendNbank =
getValue(variableValue[`${prefix}_${dimKey}_nbank_week_allnum`]) || 0;
const nightBank =
getValue(variableValue[`${prefix}_${dimKey}_bank_night_allnum`]) || 0;
const nightNbank =
getValue(variableValue[`${prefix}_${dimKey}_nbank_night_allnum`]) || 0;
return {
weekend: weekendBank + weekendNbank,
night: nightBank + nightNbank,
};
}
/**
* 获取银行机构申请次数详情
*/
export function getBankApplicationDetails(
variableValue,
period,
dimension = "id"
) {
const { prefix } = PERIOD_MAP[period];
const dimKey = dimension === "cell" ? "cell" : "id";
return {
pdl: getValue(variableValue[`${prefix}_${dimKey}_pdl_allnum`]), // 线上小额现金贷
caon: getValue(variableValue[`${prefix}_${dimKey}_caon_allnum`]), // 线上现金分期
rel: getValue(variableValue[`${prefix}_${dimKey}_rel_allnum`]), // 信用卡(类信用卡)
caoff: getValue(variableValue[`${prefix}_${dimKey}_caoff_allnum`]), // 线下现金分期
cooff: getValue(variableValue[`${prefix}_${dimKey}_cooff_allnum`]), // 线下消费分期
af: getValue(variableValue[`${prefix}_${dimKey}_af_allnum`]), // 汽车金融
coon: getValue(variableValue[`${prefix}_${dimKey}_coon_allnum`]), // 线上消费分期
oth: getValue(variableValue[`${prefix}_${dimKey}_oth_allnum`]), // 其他
bank: getValue(variableValue[`${prefix}_${dimKey}_bank_allnum`]), // 银行机构申请
tra: getValue(variableValue[`${prefix}_${dimKey}_bank_tra_allnum`]), // 传统银行申请
ret: getValue(variableValue[`${prefix}_${dimKey}_bank_ret_allnum`]), // 网络零售银行申请
};
}
/**
* 获取非银机构申请次数详情
*/
export function getNBankApplicationDetails(
variableValue,
period,
dimension = "id"
) {
const { prefix } = PERIOD_MAP[period];
const dimKey = dimension === "cell" ? "cell" : "id";
return {
nbank: getValue(variableValue[`${prefix}_${dimKey}_nbank_allnum`]), // 非银机构
p2p: getValue(variableValue[`${prefix}_${dimKey}_nbank_p2p_allnum`]), // 改制机构
mc: getValue(variableValue[`${prefix}_${dimKey}_nbank_mc_allnum`]), // 小贷机构
ca: getValue(variableValue[`${prefix}_${dimKey}_nbank_ca_allnum`]), // 现金类分期机构
cf: getValue(variableValue[`${prefix}_${dimKey}_nbank_cf_allnum`]), // 消费类分期机构
com: getValue(variableValue[`${prefix}_${dimKey}_nbank_com_allnum`]), // 代偿类分期机构
oth: getValue(variableValue[`${prefix}_${dimKey}_nbank_oth_allnum`]), // 其他申请
nsloan: getValue(
variableValue[`${prefix}_${dimKey}_nbank_nsloan_allnum`]
), // 持牌网络小贷机构
autofin: getValue(
variableValue[`${prefix}_${dimKey}_nbank_autofin_allnum`]
), // 持牌汽车金融机构
sloan: getValue(
variableValue[`${prefix}_${dimKey}_nbank_sloan_allnum`]
), // 持牌小贷机构
cons: getValue(variableValue[`${prefix}_${dimKey}_nbank_cons_allnum`]), // 持牌消费金融机构
finlea: getValue(
variableValue[`${prefix}_${dimKey}_nbank_finlea_allnum`]
), // 持牌融资租赁机构
else: getValue(variableValue[`${prefix}_${dimKey}_nbank_else_allnum`]), // 其他申请
};
}
/**
* 获取银行机构申请机构数详情
*/
export function getBankOrgDetails(variableValue, period, dimension = "id") {
const { prefix } = PERIOD_MAP[period];
const dimKey = dimension === "cell" ? "cell" : "id";
return {
pdl: getValue(variableValue[`${prefix}_${dimKey}_pdl_orgnum`]),
caon: getValue(variableValue[`${prefix}_${dimKey}_caon_orgnum`]),
rel: getValue(variableValue[`${prefix}_${dimKey}_rel_orgnum`]),
caoff: getValue(variableValue[`${prefix}_${dimKey}_caoff_orgnum`]),
cooff: getValue(variableValue[`${prefix}_${dimKey}_cooff_orgnum`]),
af: getValue(variableValue[`${prefix}_${dimKey}_af_orgnum`]),
coon: getValue(variableValue[`${prefix}_${dimKey}_coon_orgnum`]),
oth: getValue(variableValue[`${prefix}_${dimKey}_oth_orgnum`]),
bank: getValue(variableValue[`${prefix}_${dimKey}_bank_orgnum`]),
tra: getValue(variableValue[`${prefix}_${dimKey}_bank_tra_orgnum`]),
ret: getValue(variableValue[`${prefix}_${dimKey}_bank_ret_orgnum`]),
};
}
/**
* 获取非银机构申请机构数详情
*/
export function getNBankOrgDetails(variableValue, period, dimension = "id") {
const { prefix } = PERIOD_MAP[period];
const dimKey = dimension === "cell" ? "cell" : "id";
return {
nbank: getValue(variableValue[`${prefix}_${dimKey}_nbank_orgnum`]),
p2p: getValue(variableValue[`${prefix}_${dimKey}_nbank_p2p_orgnum`]),
mc: getValue(variableValue[`${prefix}_${dimKey}_nbank_mc_orgnum`]),
ca: getValue(variableValue[`${prefix}_${dimKey}_nbank_ca_orgnum`]),
cf: getValue(variableValue[`${prefix}_${dimKey}_nbank_cf_orgnum`]),
com: getValue(variableValue[`${prefix}_${dimKey}_nbank_com_orgnum`]),
oth: getValue(variableValue[`${prefix}_${dimKey}_nbank_oth_orgnum`]),
nsloan: getValue(
variableValue[`${prefix}_${dimKey}_nbank_nsloan_orgnum`]
),
autofin: getValue(
variableValue[`${prefix}_${dimKey}_nbank_autofin_orgnum`]
),
sloan: getValue(
variableValue[`${prefix}_${dimKey}_nbank_sloan_orgnum`]
),
cons: getValue(variableValue[`${prefix}_${dimKey}_nbank_cons_orgnum`]),
finlea: getValue(
variableValue[`${prefix}_${dimKey}_nbank_finlea_orgnum`]
),
else: getValue(variableValue[`${prefix}_${dimKey}_nbank_else_orgnum`]),
};
}
/**
* 字段名称映射
*/
export const FIELD_LABELS = {
// 银行机构申请类型
bank: {
pdl: "申请线上小额现金贷",
caon: "申请线上现金分期",
rel: "申请信用卡(类信用卡)",
caoff: "申请线下现金分期",
cooff: "申请线下消费分期",
af: "申请汽车金融",
coon: "申请线上消费分期",
oth: "申请其他",
bank: "银行机构申请",
tra: "银行机构-传统银行申请",
ret: "银行机构-网络零售银行申请",
},
// 非银机构申请类型
nbank: {
nbank: "非银机构",
p2p: "改制机构",
mc: "小贷机构",
ca: "现金类分期机构",
cf: "消费类分期机构",
com: "代偿类分期机构",
oth: "其他申请",
nsloan: "持牌网络小贷机构",
autofin: "汽车金融",
sloan: "持牌小贷机构",
cons: "持牌消费金融机构",
finlea: "持牌融资租赁机构",
else: "其他申请",
},
};
/**
* 根据申请次数计算风险等级
* @param {number} count 申请次数
* @returns {string} 风险等级:无风险、低风险、中风险、高风险
*/
export function calculateRiskLevel(count) {
const num = Number(count) || 0;
if (num === 0) {
return "无风险";
} else if (num >= 1 && num <= 3) {
return "低风险";
} else if (num >= 4 && num <= 8) {
return "中风险";
} else {
return "高风险";
}
}
/**
* 获取各机构类型的风险汇总近12个月
* @param {Object} variableValue 数据对象
* @param {string} dimension 维度id身份证 / cell手机号
* @returns {Array} 风险汇总列表,格式:[{label: '机构类型风险等级', value: '风险等级'}]
*/
export function getRiskSummary(variableValue, dimension = "id") {
const dimKey = dimension === "cell" ? "cell" : "id";
const prefix = "als_m12"; // 近12个月
// 银行类机构申请次数
const bankCount =
getValue(variableValue[`${prefix}_${dimKey}_bank_allnum`]) || 0;
// 非银行类机构申请次数
const nbankCount =
getValue(variableValue[`${prefix}_${dimKey}_nbank_allnum`]) || 0;
// 持牌网络小贷机构申请次数
const nsloanCount =
getValue(variableValue[`${prefix}_${dimKey}_nbank_nsloan_allnum`]) || 0;
// 持牌小贷机构申请次数
const sloanCount =
getValue(variableValue[`${prefix}_${dimKey}_nbank_sloan_allnum`]) || 0;
// 持牌消费金融机构申请次数
const consCount =
getValue(variableValue[`${prefix}_${dimKey}_nbank_cons_allnum`]) || 0;
// 持牌融资租赁机构申请次数
const finleaCount =
getValue(variableValue[`${prefix}_${dimKey}_nbank_finlea_allnum`]) || 0;
// 持牌汽车金融机构申请次数
const autofinCount =
getValue(variableValue[`${prefix}_${dimKey}_nbank_autofin_allnum`]) ||
0;
// 其他非银机构申请次数(包括 p2p, mc, ca, cf, com, oth, else
const p2pCount =
getValue(variableValue[`${prefix}_${dimKey}_nbank_p2p_allnum`]) || 0;
const mcCount =
getValue(variableValue[`${prefix}_${dimKey}_nbank_mc_allnum`]) || 0;
const caCount =
getValue(variableValue[`${prefix}_${dimKey}_nbank_ca_allnum`]) || 0;
const cfCount =
getValue(variableValue[`${prefix}_${dimKey}_nbank_cf_allnum`]) || 0;
const comCount =
getValue(variableValue[`${prefix}_${dimKey}_nbank_com_allnum`]) || 0;
const othCount =
getValue(variableValue[`${prefix}_${dimKey}_nbank_oth_allnum`]) || 0;
const elseCount =
getValue(variableValue[`${prefix}_${dimKey}_nbank_else_allnum`]) || 0;
const otherNbankCount =
p2pCount +
mcCount +
caCount +
cfCount +
comCount +
othCount +
elseCount;
return [
{
label: "银行类机构风险等级",
value: calculateRiskLevel(bankCount),
count: bankCount,
},
{
label: "非银行类机构风险等级",
value: calculateRiskLevel(nbankCount),
count: nbankCount,
},
{
label: "持牌网络小贷机构风险等级",
value: calculateRiskLevel(nsloanCount),
count: nsloanCount,
},
{
label: "持牌小贷机构风险等级",
value: calculateRiskLevel(sloanCount),
count: sloanCount,
},
{
label: "持牌消费金融机构风险等级",
value: calculateRiskLevel(consCount),
count: consCount,
},
{
label: "持牌融资租赁机构风险等级",
value: calculateRiskLevel(finleaCount),
count: finleaCount,
},
{
label: "持牌汽车金融机构风险等级",
value: calculateRiskLevel(autofinCount),
count: autofinCount,
},
{
label: "其他非银机构风险等级",
value: calculateRiskLevel(otherNbankCount),
count: otherNbankCount,
},
];
}
/**
* 生成风险汇总解读文本
* @param {Array} riskSummary 风险汇总列表
* @returns {string} 解读文本
*/
export function generateRiskRemark(riskSummary) {
if (!riskSummary || riskSummary.length === 0) {
return "暂无风险数据。";
}
// 按风险等级优先级排序:高风险 > 中风险 > 低风险 > 无风险
const riskPriority = { 高风险: 4, 中风险: 3, 低风险: 2, 无风险: 1 };
const sortedRisks = riskSummary
.filter((r) => r.value !== "无风险")
.sort(
(a, b) =>
(riskPriority[b.value] || 0) - (riskPriority[a.value] || 0)
);
if (sortedRisks.length === 0) {
return "经大数据分析,您在各机构类型的风险等级均为无风险,信用状况良好。请您继续保持良好的借还款履约行为,维护个人风险。";
}
// 取最高风险的机构类型
const highestRisk = sortedRisks[0];
const orgType = highestRisk.label.replace("风险等级", ""); // 去掉"风险等级"后缀
const riskLevel = highestRisk.value;
const count = highestRisk.count || 0;
// 生成解读文本
let remark = `经大数据分析,您命中${orgType}风险等级的${riskLevel}名单`;
if (count > 0) {
remark += `,历史命中 ${count}`;
}
remark += `,最近一次进入${orgType}风险等级的${riskLevel}名单在近 1 年内。请您注意对应机构的正常借还款履约行为,提高信用评价。`;
return remark;
}
/**
* 将风险等级映射为“贷款申请需求”文本
*/
function mapRiskToDemandText(level) {
switch (level) {
case "高风险":
return "贷款申请需求较高";
case "中风险":
return "贷款申请需求适中";
case "低风险":
case "无风险":
default:
return "贷款申请需求较低";
}
}
/**
* 将风险等级映射为“贷款申请频率”文本
*/
function mapRiskToFrequencyText(level) {
switch (level) {
case "高风险":
return "贷款申请频率较高";
case "中风险":
return "贷款申请频率适中";
case "低风险":
case "无风险":
default:
return "贷款申请频率较低";
}
}
/**
* 生成银行 / 非银申请情况解读近1年 / 近3个月
* @param {Object} variableValue
* @param {string} dimension
* @returns {{ bankSituation: string, bankAdvice: string, nbankSituation: string, nbankAdvice: string }}
*/
export function getApplyRemarks(variableValue, dimension = "id") {
const v = variableValue || {};
// 近12个月 & 近3个月 申请次数
const m12 = getApplicationCounts(v, "m12", dimension);
const m3 = getApplicationCounts(v, "m3", dimension);
const bankYearCount = m12.bank || 0;
const bank3mCount = m3.bank || 0;
const nbankYearCount = m12.nbank || 0;
const nbank3mCount = m3.nbank || 0;
// 使用风险等级来映射需求 / 频率文本
const bankYearRisk = calculateRiskLevel(bankYearCount);
const bank3mRisk = calculateRiskLevel(bank3mCount);
const nbankYearRisk = calculateRiskLevel(nbankYearCount);
const nbank3mRisk = calculateRiskLevel(nbank3mCount);
const bankDemandText = mapRiskToDemandText(bankYearRisk);
const bankFreqText = mapRiskToFrequencyText(bank3mRisk);
const nbankDemandText = mapRiskToDemandText(nbankYearRisk);
const nbankFreqText = mapRiskToFrequencyText(nbank3mRisk);
const advice =
"报告检测的是近12个月内的申请数据含同一机构。如果申请过于频繁会对评审有影响请保持良好的借贷习惯切勿频繁申请拒绝不明平台的审核邀请。";
const bankSituation =
`近一年申请次数:${bankYearCount}次,${bankDemandText}\n` +
`近3个月申请次数${bank3mCount}次,${bankFreqText}`;
const nbankSituation =
`近一年申请次数:${nbankYearCount}次,${nbankDemandText}\n` +
`近3个月申请次数${nbank3mCount}次,${nbankFreqText}`;
return {
bankSituation,
bankAdvice: advice,
nbankSituation,
nbankAdvice: advice,
};
}