完成项目详情风险人员分页改造

This commit is contained in:
wkc
2026-03-29 18:44:07 +08:00
parent dd3aa5bbae
commit 0a3c03dcf9
25 changed files with 609 additions and 58 deletions

View File

@@ -8,11 +8,15 @@ export function getOverviewDashboard(projectId) {
})
}
export function getOverviewRiskPeople(projectId) {
export function getOverviewRiskPeople(params) {
return request({
url: '/ccdi/project/overview/risk-people',
method: 'get',
params: { projectId }
params: {
projectId: params.projectId,
pageNum: params.pageNum,
pageSize: params.pageSize
}
})
}

View File

@@ -22,6 +22,7 @@
</div>
<overview-stats :summary="currentData.summary" />
<risk-people-section
:project-id="projectId"
:section-data="currentData.riskPeople"
:selected-model-codes="selectedModelCodes"
@view-project-analysis="handleRiskPeopleProjectAnalysis"
@@ -201,7 +202,11 @@ export default {
try {
const [dashboardRes, riskPeopleRes, riskModelCardsRes, suspiciousRes, creditNegativeRes] = await Promise.all([
getOverviewDashboard(this.projectId),
getOverviewRiskPeople(this.projectId),
getOverviewRiskPeople({
projectId: this.projectId,
pageNum: 1,
pageSize: 5,
}),
getOverviewRiskModelCards(this.projectId),
getOverviewSuspiciousTransactions({
projectId: this.projectId,
@@ -232,7 +237,7 @@ export default {
const hasOverviewData = Boolean(
(Array.isArray(dashboardData.stats) && dashboardData.stats.length) ||
(Array.isArray(riskPeopleData.overviewList) && riskPeopleData.overviewList.length) ||
(Array.isArray(riskPeopleData.rows) && riskPeopleData.rows.length) ||
(Array.isArray(riskModelCardsData.cardList) && riskModelCardsData.cardList.length)
);

View File

@@ -4,7 +4,7 @@
<el-button size="mini" type="text">导出</el-button>
</div>
<el-table :data="overviewList" class="people-table">
<el-table v-loading="tableLoading" :data="overviewList" class="people-table">
<el-table-column type="index" label="序号" width="60" />
<el-table-column prop="name" label="姓名" min-width="100" />
<el-table-column prop="idNo" label="身份证号" min-width="180" />
@@ -46,10 +46,21 @@
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="pageNum"
:limit.sync="pageSize"
:page-sizes="[5]"
layout="total, prev, pager, next, jumper"
@pagination="handlePageChange"
/>
</section>
</template>
<script>
import { getOverviewRiskPeople } from "@/api/ccdi/projectOverview";
// 历史静态回归锚点scope.row.actionLabel || "查看详情"
const CORE_TAG_PALETTE = {
LARGE_TRANSACTION: {
@@ -155,14 +166,39 @@ function normalizeOverviewRows(rows) {
export default {
name: "RiskPeopleSection",
props: {
projectId: {
type: [String, Number],
default: null,
},
sectionData: {
type: Object,
default: () => ({}),
},
},
data() {
return {
pageNum: 1,
pageSize: 5,
total: 0,
tableLoading: false,
localRows: [],
};
},
computed: {
overviewList() {
return normalizeOverviewRows(this.sectionData.overviewList);
return this.localRows;
},
},
watch: {
sectionData: {
immediate: true,
deep: true,
handler() {
this.localRows = normalizeOverviewRows(this.sectionData && this.sectionData.rows);
this.total = (this.sectionData && this.sectionData.total) || 0;
this.pageNum = (this.sectionData && this.sectionData.pageNum) || 1;
this.pageSize = (this.sectionData && this.sectionData.pageSize) || 5;
},
},
},
methods: {
@@ -172,6 +208,29 @@ export default {
handleViewProject(row) {
this.$emit("view-project-analysis", row);
},
handlePageChange({ page }) {
this.loadRiskPeoplePage(page);
},
async loadRiskPeoplePage(pageNum) {
if (!this.projectId) {
return;
}
this.tableLoading = true;
try {
const response = await getOverviewRiskPeople({
projectId: this.projectId,
pageNum,
pageSize: 5,
});
const data = (response && response.data) || {};
this.localRows = normalizeOverviewRows(data.rows);
this.total = data.total || 0;
this.pageNum = data.pageNum || pageNum;
this.pageSize = data.pageSize || 5;
} finally {
this.tableLoading = false;
}
},
},
};
</script>

View File

@@ -12,7 +12,7 @@ export const mockOverviewData = {
],
},
riskPeople: {
overviewList: [
rows: [
{
name: "李四",
idNo: "331081199003230321",
@@ -444,9 +444,12 @@ export function createOverviewLoadedData({
},
riskPeople: {
...mockOverviewData.riskPeople,
overviewList: Array.isArray(riskPeopleData && riskPeopleData.overviewList)
? riskPeopleData.overviewList
rows: Array.isArray(riskPeopleData && riskPeopleData.rows)
? riskPeopleData.rows
: [],
total: riskPeopleData && riskPeopleData.total ? riskPeopleData.total : 0,
pageNum: riskPeopleData && riskPeopleData.pageNum ? riskPeopleData.pageNum : 1,
pageSize: riskPeopleData && riskPeopleData.pageSize ? riskPeopleData.pageSize : 5,
},
riskModels: {
...mockOverviewData.riskModels,
@@ -480,7 +483,10 @@ export const mockOverviewStateData = {
})),
},
riskPeople: {
overviewList: [],
rows: [],
total: 0,
pageNum: 1,
pageSize: 5,
},
riskModels: {
...mockOverviewData.riskModels,

View File

@@ -31,7 +31,10 @@ const loadOverviewDataBlock = source.match(
assert(loadOverviewDataBlock, "入口页应继续并发请求仪表盘、风险人员、模型卡片、涉疑交易和员工负面征信");
[
"getOverviewDashboard(this.projectId)",
"getOverviewRiskPeople(this.projectId)",
"getOverviewRiskPeople({",
"projectId: this.projectId",
"pageNum: 1",
"pageSize: 5",
"getOverviewRiskModelCards(this.projectId)",
"getOverviewSuspiciousTransactions({",
"getOverviewEmployeeCreditNegative({",
@@ -41,6 +44,7 @@ assert(loadOverviewDataBlock, "入口页应继续并发请求仪表盘、风险
"createOverviewLoadedData",
"dashboardData",
"riskPeopleData",
"riskPeopleData.rows",
"riskModelCardsData",
"creditNegativeData",
].forEach((token) => assert(source.includes(token), token));

View File

@@ -8,16 +8,20 @@ const source = fs.readFileSync(
);
[
"sectionData.overviewList",
"sectionData.rows",
"normalizeOverviewRows",
"normalizeRiskPointTags",
"riskCount",
"riskPoint",
"modelCount",
"pageNum",
"pageSize",
"total",
"riskLevelType",
].forEach((token) => assert(source.includes(token), token));
assert(!source.includes("sectionData.topRiskList"), "不应再绑定TOP10列表");
assert(!source.includes("sectionData.overviewList"), "风险人员列表不应再绑定 overviewList");
assert(!source.includes("scope.row.riskLevelType || 'danger'"), "riskLevelType fallback");
assert(source.includes('scope.row.actionLabel || "查看详情"'), "actionLabel fallback");

View File

@@ -0,0 +1,27 @@
const assert = require("assert");
const fs = require("fs");
const path = require("path");
const source = fs.readFileSync(
path.resolve(__dirname, "../../src/views/ccdiProject/components/detail/PreliminaryCheck.vue"),
"utf8"
);
const mockSource = fs.readFileSync(
path.resolve(__dirname, "../../src/views/ccdiProject/components/detail/preliminaryCheck.mock.js"),
"utf8"
);
[
"getOverviewRiskPeople({",
"projectId: this.projectId",
"pageNum: 1",
"pageSize: 5",
"riskPeopleData.rows",
].forEach((token) => assert(source.includes(token), token));
[
"rows",
"total",
"pageNum",
"pageSize",
].forEach((token) => assert(mockSource.includes(token), `riskPeople 应保存 ${token}`));

View File

@@ -0,0 +1,32 @@
const assert = require("assert");
const fs = require("fs");
const path = require("path");
const entrySource = fs.readFileSync(
path.resolve(__dirname, "../../src/views/ccdiProject/components/detail/PreliminaryCheck.vue"),
"utf8"
);
const sectionSource = fs.readFileSync(
path.resolve(__dirname, "../../src/views/ccdiProject/components/detail/RiskPeopleSection.vue"),
"utf8"
);
[
':project-id="projectId"',
':section-data="currentData.riskPeople"',
].forEach((token) => assert(entrySource.includes(token), token));
[
"sectionData.rows",
"pageNum",
"pageSize",
"total",
"<pagination",
':page-sizes="[5]"',
"handlePageChange",
"loadRiskPeoplePage",
"getOverviewRiskPeople",
"tableLoading",
].forEach((token) => assert(sectionSource.includes(token), token));
assert(!sectionSource.includes("if (page === this.pageNum)"), "分页切换不应被同步后的 pageNum 提前拦截");

View File

@@ -27,6 +27,14 @@ const source = fs.readFileSync(
"/ccdi/project/overview/top-risk-people",
].forEach((token) => assert(!source.includes(token), token));
[
"getOverviewRiskPeople(params)",
"/ccdi/project/overview/risk-people",
"projectId: params.projectId",
"pageNum: params.pageNum",
"pageSize: params.pageSize",
].forEach((token) => assert(source.includes(token), token));
const riskModelPeopleFn = source.match(
/export function getOverviewRiskModelPeople\(params\) \{[\s\S]*?params:\s*\{([\s\S]*?)\}\s*\}\s*\)/m
);