export const mockOverviewData = { summary: { title: "风险总览", subtitle: "集中展示项目风险统计与命中人员总览", actions: [], stats: [ { key: "people", label: "总人数", value: 500, icon: "el-icon-user", tone: "blue" }, { key: "riskPeople", label: "高风险", value: 10, icon: "el-icon-warning-outline", tone: "red" }, { key: "medium", label: "中风险", value: 20, icon: "el-icon-s-opportunity", tone: "amber" }, { key: "low", label: "低风险", value: 38, icon: "el-icon-data-line", tone: "green" }, { key: "count", label: "无预警人数", value: 432, icon: "el-icon-document", tone: "blue" }, ], }, riskPeople: { overviewList: [ { name: "李四", idNo: "331081199003230321", department: "信息二部", riskCount: 5, riskLevel: "高风险", riskLevelType: "danger", modelCount: 3, riskPoint: "跨地域转账频繁交易", riskPointTagList: [ { modelCode: "LARGE_TRANSACTION", modelName: "大额交易", ruleName: "跨地域转账", riskLevel: "HIGH" }, { modelCode: "ABNORMAL_TRANSACTION", modelName: "异常交易", ruleName: "频繁交易", riskLevel: "HIGH" }, ], actionLabel: "查看详情", }, { name: "王五", idNo: "331081199003231077", department: "办公室", riskCount: 2, riskLevel: "中风险", riskLevelType: "warning", modelCount: 2, riskPoint: "多工资转入频繁交易", riskPointTagList: [ { modelCode: "SUSPICIOUS_PART_TIME", modelName: "可疑兼职", ruleName: "多工资转入", riskLevel: "MEDIUM" }, { modelCode: "ABNORMAL_BEHAVIOR", modelName: "异常行为", ruleName: "频繁交易", riskLevel: "MEDIUM" }, ], actionLabel: "查看详情", }, { name: "赵六", idNo: "331081199003231099", department: "信息五部", riskCount: 2, riskLevel: "低风险", riskLevelType: "info", modelCount: 1, riskPoint: "频繁小额转账", riskPointTagList: [ { modelCode: "SUSPICIOUS_GAMBLING", modelName: "疑似赌博", ruleName: "频繁小额转账", riskLevel: "LOW" }, ], actionLabel: "查看详情", }, ], }, riskModels: { cardList: [ { key: "large", title: "大额交易频繁", count: 45, peopleCount: 9 }, { key: "salary", title: "可疑部门产薪异常", count: 32, peopleCount: 6 }, { key: "transfer", title: "频繁转账交易", count: 28, peopleCount: 5 }, ], filterOptions: {}, filterValues: {}, peopleList: [ { name: "黄明", idNo: "331081199403150329", department: "风险管理部", warningType: "高风险", modelName: "大额交易频繁", actionLabel: "查看详情", }, { name: "王江", idNo: "331081199102031209", department: "运营管理部", warningType: "中风险", modelName: "频繁转账交易", actionLabel: "查看详情", }, ], }, riskDetails: { projectId: 1, suspiciousType: "ALL", total: 2, suspiciousTransactionList: [ { bankStatementId: 1, trxDate: "2024-01-15 10:00:00", suspiciousPersonName: "孙七", relatedPersonName: "孙七", relatedStaffName: "孙七", relatedStaffCode: "809901", relationType: "本人", userMemo: "", cashType: "转账", displayAmount: 500000, actionLabel: "查看详情", }, { bankStatementId: 2, trxDate: "2024-01-10 09:20:00", suspiciousPersonName: "王五", relatedPersonName: "孙七", relatedStaffName: "孙七", relatedStaffCode: "809901", relationType: "配偶", userMemo: "零钱商户消费", cashType: "", displayAmount: -200000, actionLabel: "查看详情", }, ], employeeCreditNegativeTotal: 2, employeeCreditNegativeList: [ { personName: "李四", personId: "331081199003230321", queryDate: "2026-03-20", civilCnt: 1, civilLmt: 120000, enforceCnt: 0, enforceLmt: 0, admCnt: 0, admLmt: 0, }, { personName: "王五", personId: "331081199003231077", queryDate: "2026-03-18", civilCnt: 0, civilLmt: 0, enforceCnt: 2, enforceLmt: 50000, admCnt: 1, admLmt: 2000, }, ], 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: "查看详情", }, ], }, }; export const projectAnalysisTabs = [ { key: "abnormalDetail", label: "异常明细", description: "展示异常交易、频繁转账账户与关联交易的分析摘要。", }, { key: "assetAnalysis", label: "资产分析", description: "静态承载资产分析页签内容,本轮不接入新接口。", }, { key: "creditSummary", label: "征信摘要", description: "静态承载征信摘要页签内容,本轮不接入新接口。", }, { key: "relationshipGraph", label: "关系图谱", description: "静态承载关系图谱页签内容,本轮不接入新接口。", }, { key: "fundFlow", label: "资金流向", description: "静态承载资金流向页签内容,本轮不接入新接口。", }, ]; const projectAnalysisTransactionTemplate = [ { tradeTime: "2024-02-18 10:24:11", ownAccountName: "本人尾号 6222 / 工资卡", counterpartyName: "张某某 / 6222****9087", tradeType: "转账汇款", tradeAmount: "128,000.00", markStatus: "已标记关注", }, { tradeTime: "2024-02-20 16:40:32", ownAccountName: "本人尾号 6217 / 二类户", counterpartyName: "某贸易公司 / 对公账户", tradeType: "往来款", tradeAmount: "86,500.00", markStatus: "待复核", }, ]; const projectAnalysisFrequentTransferTemplate = [ { accountNo: "6222****1234", description: "近 30 日出现多次短周期往返转账,交易对象集中于关联人员与外部中介账户。", }, { accountNo: "6217****2288", description: "同日多笔拆分入账后快速转出,摘要模式高度相似。", }, ]; const projectAnalysisRelatedTradeTemplate = [ { title: "关联人员往来", description: "存在与同部门人员、历史共同项目人员的高频资金往来记录。", }, { title: "项目相关交易", 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); const currentModelValue = resolveCurrentModel(safePerson, source); const displayName = safePerson.name || safePerson.staffName || "-"; 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 : "-"), hasRiskTags: riskTags.length > 0, riskTags, }, recordSummary: "排查记录摘要为静态承载内容,本轮用于展示统一工作台侧栏结构。", }, sourceSummary: { showCurrentModel: source === "riskModelPeople", currentModelLabel: "当前命中模型", currentModelValue, }, abnormalDetail: { groups: [ { groupCode: "BANK_STATEMENT", groupName: "流水异常明细", groupType: "BANK_STATEMENT", records: projectAnalysisTransactionTemplate.map((item, index) => ({ bankStatementId: index + 1, trxDate: item.tradeTime, leAccountNo: item.ownAccountName, leAccountName: index === 0 ? displayName : "关联账户", customerAccountName: item.counterpartyName, customerAccountNo: item.counterpartyName, userMemo: item.tradeType, cashType: item.tradeType, hitTags: [], displayAmount: item.tradeAmount, })), }, { groupCode: "RELATED_OBJECT", groupName: "异常对象摘要", groupType: "OBJECT", records: [ { title: projectAnalysisRelatedTradeTemplate[0].title, subtitle: projectAnalysisFrequentTransferTemplate[0] ? projectAnalysisFrequentTransferTemplate[0].accountNo : "异常对象", riskTags: [], reasonDetail: "命中高频往来异常规则,系统已截取对象型异常原因快照用于辅助研判。", summary: "高频往来", extraFields: [], }, { title: projectAnalysisRelatedTradeTemplate[0].title, subtitle: projectAnalysisFrequentTransferTemplate[0] ? projectAnalysisFrequentTransferTemplate[0].accountNo : "异常对象", riskTags: [], reasonDetail: "命中关键时间点异常关联规则,系统已截取对象型异常原因快照用于辅助研判。", summary: "关键时间点异常关联", extraFields: [], }, { title: projectAnalysisRelatedTradeTemplate[1].title, subtitle: projectAnalysisFrequentTransferTemplate[1] ? projectAnalysisFrequentTransferTemplate[1].accountNo : "异常对象", riskTags: [], reasonDetail: "命中项目相关交易异常规则,系统已截取对象型异常原因快照用于辅助研判。", summary: "项目相关交易", extraFields: [], }, ], }, ], }, }; } 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, })); } function normalizeRiskModelCards(cardList) { if (!Array.isArray(cardList)) { return []; } return cardList.map((item) => ({ key: item.modelCode, title: item.modelName, count: item.warningCount, peopleCount: item.peopleCount, })); } function normalizeSuspiciousTransactions(rows) { if (!Array.isArray(rows)) { return []; } return rows.map((item) => ({ ...item, actionLabel: item.actionLabel || "查看详情", })); } function normalizeEmployeeCreditNegativeRows(rows) { if (!Array.isArray(rows)) { return []; } return rows.map((item) => ({ ...item, })); } export function createOverviewLoadedData({ projectId, dashboardData, riskPeopleData, riskModelCardsData, suspiciousData, creditNegativeData, } = {}) { 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 : [], }, riskModels: { ...mockOverviewData.riskModels, projectId, cardList: normalizeRiskModelCards(riskModelCardsData && riskModelCardsData.cardList), peopleList: [], total: 0, }, riskDetails: { ...mockOverviewData.riskDetails, projectId, suspiciousTransactionList: normalizeSuspiciousTransactions(suspiciousData && suspiciousData.rows), suspiciousType: "ALL", total: suspiciousData && suspiciousData.total ? suspiciousData.total : 0, employeeCreditNegativeList: normalizeEmployeeCreditNegativeRows(creditNegativeData && creditNegativeData.rows), employeeCreditNegativeTotal: creditNegativeData && creditNegativeData.total ? creditNegativeData.total : 0, transactionList: normalizeSuspiciousTransactions(suspiciousData && suspiciousData.rows), abnormalAccountList: [], }, }; } 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: { suspiciousTransactionList: [], suspiciousType: "ALL", total: 0, employeeCreditNegativeList: [], employeeCreditNegativeTotal: 0, transactionList: [], abnormalAccountList: [], }, }, loading: mockOverviewData, };