2026-03-19 10:35:40 +08:00
|
|
|
export const mockOverviewData = {
|
2026-03-19 10:36:45 +08:00
|
|
|
summary: {
|
2026-03-19 11:02:16 +08:00
|
|
|
title: "风险仪表盘",
|
|
|
|
|
subtitle: "风险仪表盘数据概览",
|
2026-03-19 11:09:14 +08:00
|
|
|
actions: [],
|
2026-03-19 10:36:45 +08:00
|
|
|
stats: [
|
|
|
|
|
{ key: "people", label: "总人数", value: 500, icon: "el-icon-user", tone: "blue" },
|
2026-03-19 11:12:39 +08:00
|
|
|
{ key: "riskPeople", label: "高风险", value: 10, icon: "el-icon-warning-outline", tone: "red" },
|
2026-03-19 10:36:45 +08:00
|
|
|
{ key: "medium", label: "中风险", value: 20, icon: "el-icon-s-opportunity", tone: "amber" },
|
|
|
|
|
{ key: "low", label: "低风险", value: 38, icon: "el-icon-data-line", tone: "green" },
|
2026-03-19 11:02:16 +08:00
|
|
|
{ key: "count", label: "无风险人员", value: 432, icon: "el-icon-document", tone: "blue" },
|
2026-03-19 10:36:45 +08:00
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
riskPeople: {
|
|
|
|
|
overviewList: [
|
|
|
|
|
{
|
|
|
|
|
name: "李四",
|
|
|
|
|
idNo: "331081199003230321",
|
|
|
|
|
department: "信息二部",
|
|
|
|
|
riskCount: 5,
|
2026-03-20 09:31:33 +08:00
|
|
|
riskLevel: "高风险",
|
|
|
|
|
riskLevelType: "danger",
|
|
|
|
|
modelCount: 3,
|
2026-03-19 10:36:45 +08:00
|
|
|
riskPoint: "跨地域转账频繁交易",
|
2026-03-20 14:31:22 +08:00
|
|
|
riskPointTagList: [
|
2026-03-23 14:07:33 +08:00
|
|
|
{ modelCode: "LARGE_TRANSACTION", modelName: "大额交易", ruleName: "跨地域转账", riskLevel: "HIGH" },
|
|
|
|
|
{ modelCode: "ABNORMAL_TRANSACTION", modelName: "异常交易", ruleName: "频繁交易", riskLevel: "HIGH" },
|
2026-03-20 14:31:22 +08:00
|
|
|
],
|
2026-03-19 10:36:45 +08:00
|
|
|
actionLabel: "查看详情",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "王五",
|
|
|
|
|
idNo: "331081199003231077",
|
|
|
|
|
department: "办公室",
|
|
|
|
|
riskCount: 2,
|
2026-03-20 09:31:33 +08:00
|
|
|
riskLevel: "中风险",
|
|
|
|
|
riskLevelType: "warning",
|
|
|
|
|
modelCount: 2,
|
2026-03-19 10:36:45 +08:00
|
|
|
riskPoint: "多工资转入频繁交易",
|
2026-03-20 14:31:22 +08:00
|
|
|
riskPointTagList: [
|
2026-03-23 14:07:33 +08:00
|
|
|
{ modelCode: "SUSPICIOUS_PART_TIME", modelName: "可疑兼职", ruleName: "多工资转入", riskLevel: "MEDIUM" },
|
|
|
|
|
{ modelCode: "ABNORMAL_BEHAVIOR", modelName: "异常行为", ruleName: "频繁交易", riskLevel: "MEDIUM" },
|
2026-03-20 14:31:22 +08:00
|
|
|
],
|
2026-03-19 10:36:45 +08:00
|
|
|
actionLabel: "查看详情",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "赵六",
|
|
|
|
|
idNo: "331081199003231099",
|
|
|
|
|
department: "信息五部",
|
|
|
|
|
riskCount: 2,
|
2026-03-20 09:31:33 +08:00
|
|
|
riskLevel: "低风险",
|
|
|
|
|
riskLevelType: "info",
|
|
|
|
|
modelCount: 1,
|
2026-03-19 10:36:45 +08:00
|
|
|
riskPoint: "频繁小额转账",
|
2026-03-20 14:31:22 +08:00
|
|
|
riskPointTagList: [
|
2026-03-23 14:07:33 +08:00
|
|
|
{ modelCode: "SUSPICIOUS_GAMBLING", modelName: "疑似赌博", ruleName: "频繁小额转账", riskLevel: "LOW" },
|
2026-03-20 14:31:22 +08:00
|
|
|
],
|
2026-03-19 10:36:45 +08:00
|
|
|
actionLabel: "查看详情",
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
2026-03-19 10:37:53 +08:00
|
|
|
riskModels: {
|
|
|
|
|
cardList: [
|
|
|
|
|
{ key: "large", title: "大额交易频繁", count: 45, peopleCount: 9 },
|
|
|
|
|
{ key: "salary", title: "可疑部门产薪异常", count: 32, peopleCount: 6 },
|
|
|
|
|
{ key: "transfer", title: "频繁转账交易", count: 28, peopleCount: 5 },
|
|
|
|
|
],
|
2026-03-20 11:24:32 +08:00
|
|
|
filterOptions: {},
|
|
|
|
|
filterValues: {},
|
2026-03-19 10:37:53 +08:00
|
|
|
peopleList: [
|
|
|
|
|
{
|
|
|
|
|
name: "黄明",
|
|
|
|
|
idNo: "331081199403150329",
|
|
|
|
|
department: "风险管理部",
|
|
|
|
|
warningType: "高风险",
|
|
|
|
|
modelName: "大额交易频繁",
|
|
|
|
|
actionLabel: "查看详情",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "王江",
|
|
|
|
|
idNo: "331081199102031209",
|
|
|
|
|
department: "运营管理部",
|
|
|
|
|
warningType: "中风险",
|
|
|
|
|
modelName: "频繁转账交易",
|
|
|
|
|
actionLabel: "查看详情",
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
riskDetails: {
|
|
|
|
|
transactionList: [
|
|
|
|
|
{
|
|
|
|
|
tradeDate: "2024-01-15",
|
|
|
|
|
counterparty: "李七",
|
|
|
|
|
direction: "转出",
|
|
|
|
|
accountNo: "李七(08901)",
|
|
|
|
|
summary: "转账",
|
|
|
|
|
amount: 500000,
|
|
|
|
|
actionLabel: "查看详情",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
tradeDate: "2024-01-16",
|
|
|
|
|
counterparty: "王五",
|
|
|
|
|
direction: "转出",
|
|
|
|
|
accountNo: "王五(08901)",
|
|
|
|
|
summary: "转账",
|
|
|
|
|
amount: -200000,
|
|
|
|
|
actionLabel: "查看详情",
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
abnormalAccountList: [
|
|
|
|
|
{
|
|
|
|
|
accountNo: "62209****1234",
|
|
|
|
|
accountName: "李四",
|
|
|
|
|
bankName: "中国农业银行",
|
|
|
|
|
lastTradeDate: "2024-01-15",
|
|
|
|
|
handler: "正常",
|
|
|
|
|
actionLabel: "查看详情",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
accountNo: "62209****5678",
|
|
|
|
|
accountName: "王五",
|
|
|
|
|
bankName: "中国工商银行",
|
|
|
|
|
lastTradeDate: "2024-01-10",
|
|
|
|
|
handler: "正常",
|
|
|
|
|
actionLabel: "查看详情",
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
2026-03-19 10:35:40 +08:00
|
|
|
};
|
2026-03-19 10:39:24 +08:00
|
|
|
|
2026-03-25 14:05:30 +08:00
|
|
|
export const projectAnalysisTabs = [
|
|
|
|
|
{
|
|
|
|
|
key: "abnormalDetail",
|
|
|
|
|
label: "异常明细",
|
|
|
|
|
description: "展示异常交易、频繁转账账户与关联交易的分析摘要。",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
key: "assetAnalysis",
|
|
|
|
|
label: "资产分析",
|
|
|
|
|
description: "静态承载资产分析页签内容,本轮不接入新接口。",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
key: "creditSummary",
|
|
|
|
|
label: "征信摘要",
|
|
|
|
|
description: "静态承载征信摘要页签内容,本轮不接入新接口。",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
key: "relationshipGraph",
|
|
|
|
|
label: "关系图谱",
|
|
|
|
|
description: "静态承载关系图谱页签内容,本轮不接入新接口。",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
key: "fundFlow",
|
|
|
|
|
label: "资金流向",
|
|
|
|
|
description: "静态承载资金流向页签内容,本轮不接入新接口。",
|
|
|
|
|
},
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
function normalizeProjectAnalysisTags(person) {
|
|
|
|
|
const sourceTags = Array.isArray(person && person.riskPointTagList)
|
|
|
|
|
? person.riskPointTagList
|
|
|
|
|
: Array.isArray(person && person.hitTagList)
|
|
|
|
|
? person.hitTagList
|
|
|
|
|
: [];
|
|
|
|
|
|
|
|
|
|
return sourceTags
|
|
|
|
|
.map((item) => {
|
|
|
|
|
if (typeof item === "string") {
|
|
|
|
|
return item;
|
|
|
|
|
}
|
|
|
|
|
if (item && typeof item === "object") {
|
|
|
|
|
return item.ruleName || item.label || item.name || "";
|
|
|
|
|
}
|
|
|
|
|
return "";
|
|
|
|
|
})
|
|
|
|
|
.filter(Boolean);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function resolveCurrentModel(person, source) {
|
|
|
|
|
if (source === "riskModelPeople") {
|
|
|
|
|
if (Array.isArray(person && person.modelNames) && person.modelNames.length) {
|
|
|
|
|
return person.modelNames.join("、");
|
|
|
|
|
}
|
|
|
|
|
return person && person.modelName ? person.modelName : "-";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const firstTag = Array.isArray(person && person.riskPointTagList) ? person.riskPointTagList[0] : null;
|
|
|
|
|
if (firstTag && firstTag.modelName) {
|
|
|
|
|
return firstTag.modelName;
|
|
|
|
|
}
|
|
|
|
|
return "-";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function buildProjectAnalysisDialogData({ person, source = "riskPeople", projectName = "" } = {}) {
|
|
|
|
|
const safePerson = person || {};
|
|
|
|
|
const riskTags = normalizeProjectAnalysisTags(safePerson);
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
tabs: projectAnalysisTabs,
|
|
|
|
|
sidebar: {
|
|
|
|
|
basicInfo: {
|
|
|
|
|
name: safePerson.name || safePerson.staffName || "-",
|
|
|
|
|
staffCode: safePerson.staffCode || "-",
|
|
|
|
|
department: safePerson.department || "-",
|
|
|
|
|
riskLevel: safePerson.riskLevel || safePerson.warningType || "-",
|
|
|
|
|
projectName: projectName || safePerson.projectName || "-",
|
|
|
|
|
},
|
|
|
|
|
modelSummary: {
|
|
|
|
|
modelCount: safePerson.modelCount || (Array.isArray(safePerson.modelNames) ? safePerson.modelNames.length : "-"),
|
|
|
|
|
currentModel: resolveCurrentModel(safePerson, source),
|
|
|
|
|
riskTags,
|
|
|
|
|
},
|
|
|
|
|
recordSummary: "排查记录摘要为静态承载内容,本轮用于展示统一工作台侧栏结构。",
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-19 15:40:43 +08:00
|
|
|
const summaryStatMetaMap = mockOverviewData.summary.stats.reduce((acc, item) => {
|
|
|
|
|
acc[item.key] = {
|
|
|
|
|
icon: item.icon,
|
|
|
|
|
tone: item.tone,
|
|
|
|
|
};
|
|
|
|
|
return acc;
|
|
|
|
|
}, {});
|
|
|
|
|
|
|
|
|
|
function normalizeSummaryStats(stats) {
|
|
|
|
|
if (!Array.isArray(stats)) {
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
return stats.map((item) => ({
|
|
|
|
|
...summaryStatMetaMap[item.key],
|
|
|
|
|
...item,
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-20 11:24:32 +08:00
|
|
|
function normalizeRiskModelCards(cardList) {
|
|
|
|
|
if (!Array.isArray(cardList)) {
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
return cardList.map((item) => ({
|
|
|
|
|
key: item.modelCode,
|
|
|
|
|
title: item.modelName,
|
|
|
|
|
count: item.warningCount,
|
|
|
|
|
peopleCount: item.peopleCount,
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function createOverviewLoadedData({ projectId, dashboardData, riskPeopleData, riskModelCardsData } = {}) {
|
2026-03-19 15:40:43 +08:00
|
|
|
return {
|
|
|
|
|
...mockOverviewData,
|
|
|
|
|
summary: {
|
|
|
|
|
...mockOverviewData.summary,
|
|
|
|
|
...(dashboardData || {}),
|
|
|
|
|
actions: mockOverviewData.summary.actions,
|
|
|
|
|
stats: normalizeSummaryStats(dashboardData && dashboardData.stats),
|
|
|
|
|
},
|
|
|
|
|
riskPeople: {
|
|
|
|
|
...mockOverviewData.riskPeople,
|
|
|
|
|
overviewList: Array.isArray(riskPeopleData && riskPeopleData.overviewList)
|
|
|
|
|
? riskPeopleData.overviewList
|
|
|
|
|
: [],
|
|
|
|
|
},
|
2026-03-20 11:24:32 +08:00
|
|
|
riskModels: {
|
|
|
|
|
...mockOverviewData.riskModels,
|
|
|
|
|
projectId,
|
|
|
|
|
cardList: normalizeRiskModelCards(riskModelCardsData && riskModelCardsData.cardList),
|
|
|
|
|
peopleList: [],
|
|
|
|
|
total: 0,
|
|
|
|
|
},
|
2026-03-19 15:40:43 +08:00
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-19 10:39:24 +08:00
|
|
|
export const mockOverviewStateData = {
|
|
|
|
|
loaded: mockOverviewData,
|
|
|
|
|
empty: {
|
|
|
|
|
summary: {
|
|
|
|
|
...mockOverviewData.summary,
|
|
|
|
|
stats: mockOverviewData.summary.stats.map((item) => ({
|
|
|
|
|
...item,
|
|
|
|
|
value: 0,
|
|
|
|
|
})),
|
|
|
|
|
},
|
|
|
|
|
riskPeople: {
|
|
|
|
|
overviewList: [],
|
|
|
|
|
},
|
|
|
|
|
riskModels: {
|
|
|
|
|
...mockOverviewData.riskModels,
|
|
|
|
|
cardList: [],
|
|
|
|
|
peopleList: [],
|
|
|
|
|
},
|
|
|
|
|
riskDetails: {
|
|
|
|
|
transactionList: [],
|
|
|
|
|
abnormalAccountList: [],
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
loading: mockOverviewData,
|
|
|
|
|
};
|