重构家庭资产负债详情展示

This commit is contained in:
wkc
2026-03-25 19:28:54 +08:00
parent 17a6c389d1
commit 60f935da27
20 changed files with 691 additions and 565 deletions

View File

@@ -16,27 +16,18 @@ const abnormalTab = fs.readFileSync(
),
"utf8"
);
const placeholderTab = fs.readFileSync(
path.resolve(
__dirname,
"../../src/views/ccdiProject/components/detail/ProjectAnalysisPlaceholderTab.vue"
),
"utf8"
);
[
"<project-analysis-abnormal-tab",
':detail-data="dialogData.abnormalDetail"',
"project-analysis-overview",
"source-summary",
].forEach((token) => assert(dialog.includes(token), token));
[
"analysis-panel",
"detailData.groups",
'group.groupType === "BANK_STATEMENT"',
'group.groupType === "OBJECT"',
"group.groupName",
"abnormal-card__summary",
"statementPageSize: 5",
"statementPageMap",
"slice(startIndex, startIndex + this.statementPageSize)",
@@ -57,13 +48,3 @@ const placeholderTab = fs.readFileSync(
"extraFields",
"grid-template-columns: minmax(0, 1fr)",
].forEach((token) => assert(abnormalTab.includes(token), token));
[
"analysis-panel",
"analysis-panel--placeholder",
].forEach((token) => assert(placeholderTab.includes(token), token));
assert(
!placeholderTab.includes("background: linear-gradient(180deg, #ffffff 0%, #f8fafc 100%)"),
"占位页签不应继续单独使用旧渐变底"
);

View File

@@ -12,8 +12,6 @@ const dialog = fs.readFileSync(
[
'activeTab: "abnormalDetail"',
"project-analysis-header",
"project-analysis-overview",
"if (value) {",
"resetDialogState()",
'this.activeTab = "abnormalDetail"',
@@ -21,5 +19,3 @@ const dialog = fs.readFileSync(
"this.fetchDetailData()",
"this.resetDialogState()",
].forEach((token) => assert(dialog.includes(token), token));
assert(!dialog.includes("project-analysis-shell"), "关闭重开后默认页签保持,但内部套娃外壳应已移除");

View File

@@ -25,14 +25,9 @@ const dialog = fs.readFileSync(
);
[
'sidebarData.basicInfo.name || "-"',
'sidebarData.basicInfo.staffCode || "-"',
'sidebarData.basicInfo.department || "-"',
'sidebarData.basicInfo.projectName || "-"',
'sidebarData.basicInfo.riskLevel || "-"',
"暂无异常标签",
"sidebar-profile",
"sidebar-risk-badge",
].forEach((token) => assert(sidebar.includes(token), token));
[

View File

@@ -16,24 +16,12 @@ const mockSource = fs.readFileSync(
),
"utf8"
);
const placeholderTab = fs.readFileSync(
path.resolve(
__dirname,
"../../src/views/ccdiProject/components/detail/ProjectAnalysisPlaceholderTab.vue"
),
"utf8"
);
[
'title="项目分析"',
'width="80%"',
'top="5vh"',
"project-analysis-header",
"project-analysis-overview",
"analysis-panel",
"project-analysis-header__title",
"project-analysis-header__risk",
"project-analysis-header__meta",
"project-analysis-shell",
"<project-analysis-sidebar",
'<el-tabs v-model="activeTab"',
'name="abnormalDetail"',
@@ -49,19 +37,10 @@ const placeholderTab = fs.readFileSync(
"project-analysis-layout__main-scroll",
"overflow-y: auto",
"max-height: calc(90vh - 120px)",
"工号",
"部门",
"所属项目",
"border: 1px solid #e2e8f0",
"border-radius: 20px",
].forEach((token) => assert(dialog.includes(token), token));
assert(!dialog.includes("project-analysis-shell"), "不应继续保留内部大白卡外壳");
assert(!dialog.includes('class="source-summary"'), "当前命中模型不应停留在主区顶部");
assert(placeholderTab.includes("analysis-panel--placeholder"), "占位页签应与主区面板统一样式基线");
assert(
!placeholderTab.includes("background: linear-gradient(180deg, #ffffff 0%, #f8fafc 100%)"),
"占位页签不应继续保留旧渐变底"
);
[
"projectAnalysisTabs",
'key: "abnormalDetail"',

View File

@@ -25,13 +25,13 @@ const entry = fs.readFileSync(
);
[
"sidebar-profile",
"sidebar-summary",
"sidebar-hint",
"sidebar-risk-badge",
"人物档案",
"模型摘要",
"辅助提示",
"人员基础信息",
"命中模型摘要",
"姓名",
"工号",
"部门",
"风险等级",
"所属项目",
"命中模型数",
"核心异常标签",
"暂无异常标签",
@@ -39,16 +39,15 @@ const entry = fs.readFileSync(
"tag.ruleName",
"justify-content: flex-start",
"width: 100%",
"sidebar-profile__meta",
"sidebar-section__title",
".sidebar-field--column .sidebar-field__label",
"margin-bottom: 8px",
].forEach((token) => assert(sidebar.includes(token), token));
assert(!sidebar.includes("当前命中模型"), "命中模型摘要应移除当前命中模型字段");
assert(!sidebar.includes("排查记录摘要"), "侧栏应移除排查记录摘要");
assert(!sidebar.includes("人员基础信息"), "侧栏主视觉不应继续停留在字段平铺式表单");
assert(!sidebar.includes("sidebar-summary"), "侧栏不应再渲染排查记录摘要文案");
assert(!sidebar.includes("position: sticky"), "左侧整卡不应保持固定");
assert(!sidebar.includes("border: 1px solid #e2e8f0"), "左右区域合并后左侧不应保留独立卡片边框");
assert(!sidebar.includes("justify-content: space-between"), "不应继续以表单式左右对齐作为主体布局");
assert(!sidebar.includes("关系人画像"), "侧栏不应扩展到额外区块");
assert(!sidebar.includes("资产分布"), "侧栏不应扩展到额外区块");

View File

@@ -21,13 +21,10 @@ const mockSource = fs.readFileSync(
'source === "riskModelPeople"',
"当前命中模型",
"dialogData.sourceSummary",
"project-analysis-header__context",
"project-analysis-header__context-label",
"project-analysis-header__context-value",
"source-summary__label",
"source-summary__value",
].forEach((token) => assert(dialog.includes(token), token));
assert(!dialog.includes('class="source-summary"'), "当前命中模型应并入头带上下文区域");
[
"sourceSummary",
"showCurrentModel: source === \"riskModelPeople\"",

View File

@@ -11,8 +11,6 @@ const source = fs.readFileSync(componentPath, "utf8");
[
"formatDetailDateTime(value)",
'return parseTime(value, hasTime ? "{y}-{m}-{d} {h}:{i}:{s}" : "{y}-{m}-{d}") || "-";',
"{{ formatDetailDateTime(scope.row.valuationDate) }}",
"{{ formatDetailDateTime(scope.row.queryDate) }}",
].forEach((token) => {
assert(source.includes(token), `专项核查详情日期展示缺少关键实现: ${token}`);
});
@@ -21,5 +19,6 @@ assert(
source.includes("const hasTime = !formatted.endsWith(\" 00:00:00\");"),
"专项核查详情应隐藏无意义的零点时间"
);
assert(!source.includes("el-table"), "专项核查详情去表格化后不应继续依赖表格日期列");
console.log("special-check-detail-date-display test passed");

View File

@@ -8,35 +8,47 @@ const source = fs.readFileSync(
);
[
"收入明细",
"负债明细",
"资产明细",
"收入",
"负债",
"资产",
"关键指标",
"详查结果",
"本人收入",
"配偶收入",
"本人资产小计",
"配偶资产小计",
"本人负债小计",
"配偶负债小计",
"el-table",
"el-empty",
"净资产",
"资产负债率",
"资产/收入比",
"负债/收入比",
"section-summary-value",
"summary-group-list",
"summary-group-item",
"summary-group-share",
].forEach((token) => assert(source.includes(token), token));
assert(source.includes("missingSelfAssetInfo"), "资产卡片应支持缺少信息判断");
assert(source.includes("missingSelfDebtInfo"), "负债卡片应支持缺少信息判断");
assert(source.includes('v-if="!assetDetail.missingSelfAssetInfo"'), "资产小计应可隐藏");
assert(source.includes('v-if="!debtDetail.missingSelfDebtInfo"'), "负债小计应可隐藏");
assert(!source.includes("el-table"), "资产与负债来源项不应继续使用表格");
assert(!source.includes("detail-grid"), "详情区不应继续保留三列网格结构");
assert(!source.includes("detail-table"), "详情区不应继续保留旧表格样式");
const incomeIndex = source.indexOf("收入明细");
const debtIndex = source.indexOf("负债明细");
const assetIndex = source.indexOf("资产明细");
const incomeIndex = source.indexOf("收入");
const debtIndex = source.indexOf("负债");
const assetIndex = source.indexOf("资产");
const metricIndex = source.indexOf("关键指标");
const resultIndex = source.indexOf("详查结果");
assert(incomeIndex > -1, "缺少收入明细卡片");
assert(debtIndex > -1, "缺少负债明细卡片");
assert(assetIndex > -1, "缺少资产明细卡片");
assert(incomeIndex < debtIndex && debtIndex < assetIndex, "详情卡片顺序应为收入、负债、资产");
assert(incomeIndex > -1, "缺少收入卡片");
assert(debtIndex > -1, "缺少负债卡片");
assert(assetIndex > -1, "缺少资产卡片");
assert(metricIndex > -1, "缺少关键指标卡片");
assert(resultIndex > -1, "缺少详查结果卡片");
assert(
incomeIndex < debtIndex && debtIndex < assetIndex && assetIndex < metricIndex && metricIndex < resultIndex,
"详情卡片顺序应为总收入、总负债、总资产、关键指标、详查结果"
);
assert(
source.includes("grid-template-columns: repeat(3, minmax(0, 1fr));"),
"三个详情卡片应横向均分"
source.includes("detail-stack"),
"详情区应改为纵向卡片容器"
);
assert(source.includes("@media (max-width: 1200px)"), "中小屏应保留响应式回落");
console.log("special-check-detail-layout test passed");

View File

@@ -0,0 +1,45 @@
const assert = require("assert");
const fs = require("fs");
const path = require("path");
const source = fs.readFileSync(
path.resolve(__dirname, "../../src/views/ccdiProject/components/detail/FamilyAssetLiabilityDetail.vue"),
"utf8"
);
[
"assetGroups",
"debtGroups",
"buildAmountGroups",
"resolveAssetGroupLabel",
"resolveDebtGroupLabel",
"item.assetName",
"item.debtName",
"summary.totalAsset",
"summary.totalDebt",
"summary.riskLevelCode",
"summary.riskLevelName",
"NORMAL",
"RISK",
"HIGH",
"MISSING_INFO",
"结构基本合理",
"负债与收入压力偏高",
"资产负债结构明显异常",
"当前信息不完整",
"summary-group-name",
"summary-group-amount",
"summary-group-share",
].forEach((token) => {
assert(source.includes(token), `缺少新版详情聚合或风险结果实现: ${token}`);
});
assert(source.includes("totalDebt / totalAsset"), "缺少资产负债率计算");
assert(source.includes("totalAsset / totalIncome"), "缺少资产收入比计算");
assert(source.includes("totalDebt / totalIncome"), "缺少负债收入比计算");
assert(source.includes("分母为 0"), "比率计算应处理分母为 0 的场景");
assert(source.includes("占比"), "来源项应展示占比语义");
assert(source.includes("return item.assetName ||"), "总资产细项应优先展示 assetName");
assert(source.includes("return item.debtName ||"), "总负债细项应优先展示 debtName");
console.log("special-check-detail-summary-groups test passed");

View File

@@ -23,3 +23,7 @@ assert(sectionSource.includes("block-subtitle"), "列表区块缺少副标题样
assert(sectionSource.includes(":deep(.family-table th)"), "表格头样式应与结果总览统一");
assert(sectionSource.includes("el-tag"), "风险标签应保留标签形态");
assert(detailSource.includes("block-title"), "详情区块标题应与结果总览标题层级统一");
assert(detailSource.includes("section-summary-value"), "详情区标题应展示汇总值");
assert(detailSource.includes("detail-stack"), "详情区应改为纵向汇总卡片");
assert(detailSource.includes("summary-group-list"), "资产与负债应改为来源项摘要列表");
assert(detailSource.includes("metric-grid"), "关键指标区应保留紧凑指标排布");