补充异常对象原因快照展示
This commit is contained in:
@@ -16,6 +16,8 @@ public class CcdiProjectPersonAnalysisObjectRecordVO {
|
||||
|
||||
private List<String> riskTags;
|
||||
|
||||
private String reasonDetail;
|
||||
|
||||
private String summary;
|
||||
|
||||
private List<CcdiProjectPersonAnalysisObjectFieldVO> extraFields = new ArrayList<>();
|
||||
|
||||
@@ -440,6 +440,7 @@
|
||||
when tr.object_type = 'STAFF_ID_CARD' then '员工对象'
|
||||
else tr.object_type
|
||||
end) as subtitle,
|
||||
group_concat(distinct tr.reason_detail order by tr.rule_code asc separator ';') as reasonDetail,
|
||||
group_concat(distinct tr.rule_name order by tr.rule_code asc separator '、') as summary
|
||||
from ccdi_bank_statement_tag_result tr
|
||||
left join ccdi_base_staff staff
|
||||
|
||||
@@ -62,6 +62,8 @@ class CcdiProjectOverviewMapperSqlTest {
|
||||
|
||||
assertTrue(objectRowsSql.contains("from ccdi_bank_statement_tag_result"), objectRowsSql);
|
||||
assertTrue(objectRowsSql.contains("tr.object_type"), objectRowsSql);
|
||||
assertTrue(objectRowsSql.contains("tr.reason_detail"), objectRowsSql);
|
||||
assertTrue(objectRowsSql.contains("as reasonDetail"), objectRowsSql);
|
||||
assertTrue(objectRowsSql.contains("tr.staff_id_card = #{staffIdCard}") || objectRowsSql.contains("#{staffIdCard}"), objectRowsSql);
|
||||
}
|
||||
|
||||
|
||||
@@ -190,6 +190,7 @@ class CcdiProjectOverviewServiceImplTest {
|
||||
objectRow.setTitle("张三");
|
||||
objectRow.setSubtitle("关联人员");
|
||||
objectRow.setRiskTags(List.of("频繁往来"));
|
||||
objectRow.setReasonDetail("命中近30日高频往来规则,存在多笔短周期回流");
|
||||
objectRow.setSummary("与项目关键人员存在异常资金往来");
|
||||
when(overviewMapper.selectPersonAnalysisObjectRows(40L, "330000000000000001"))
|
||||
.thenReturn(List.of(objectRow));
|
||||
@@ -207,6 +208,10 @@ class CcdiProjectOverviewServiceImplTest {
|
||||
List<?> statementRecords = result.getAbnormalDetail().getGroups().get(0).getRecords();
|
||||
assertEquals(1, ((CcdiBankStatementListVO) statementRecords.getFirst()).getHitTags().size());
|
||||
List<?> objectRecords = result.getAbnormalDetail().getGroups().get(1).getRecords();
|
||||
assertEquals(
|
||||
"命中近30日高频往来规则,存在多笔短周期回流",
|
||||
((CcdiProjectPersonAnalysisObjectRecordVO) objectRecords.getFirst()).getReasonDetail()
|
||||
);
|
||||
assertNotNull(((CcdiProjectPersonAnalysisObjectRecordVO) objectRecords.getFirst()).getExtraFields());
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
# 结果总览查看详情弹窗异常对象原因快照实施记录
|
||||
|
||||
## 变更日期
|
||||
|
||||
- 2026-03-25
|
||||
|
||||
## 变更范围
|
||||
|
||||
- 后端:`ccdi-project`
|
||||
- 前端:`ruoyi-ui`
|
||||
|
||||
## 实施内容
|
||||
|
||||
### 1. 后端对象异常记录补充原因快照
|
||||
|
||||
- 在 `CcdiProjectPersonAnalysisObjectRecordVO` 中新增 `reasonDetail` 字段。
|
||||
- 在 `CcdiProjectOverviewMapper.xml` 的 `selectPersonAnalysisObjectRows` 查询中,将 `ccdi_bank_statement_tag_result.reason_detail` 聚合为 `reasonDetail` 返回。
|
||||
- 保持现有 `summary` 和 `extraFields` 结构不变。
|
||||
|
||||
### 2. 前端对象卡片展示异常原因快照
|
||||
|
||||
- 在 `ProjectAnalysisAbnormalTab.vue` 的 `OBJECT` 卡片中新增“异常原因快照”展示块。
|
||||
- 展示内容直接取接口返回的 `reasonDetail` 字段;为空时显示 `-`。
|
||||
- 展示位置放在异常标签下方、摘要说明上方。
|
||||
|
||||
### 3. Mock 与测试同步
|
||||
|
||||
- `preliminaryCheck.mock.js` 中为对象卡片补充 `reasonDetail` 示例数据。
|
||||
- 更新前端单测,校验对象卡片包含“异常原因快照”和 `reasonDetail` 字段。
|
||||
- 更新后端 SQL 测试,校验对象查询包含 `tr.reason_detail as reasonDetail`。
|
||||
|
||||
## 结果
|
||||
|
||||
- 异常对象摘要卡片已支持展示真实接口返回的异常原因快照。
|
||||
- 原有对象摘要、补充字段和流水异常展示逻辑未改变。
|
||||
@@ -0,0 +1,32 @@
|
||||
# 结果总览查看详情弹窗异常对象原因快照验证记录
|
||||
|
||||
## 验证日期
|
||||
|
||||
- 2026-03-25
|
||||
|
||||
## 验证命令
|
||||
|
||||
```bash
|
||||
cd ruoyi-ui
|
||||
node tests/unit/project-analysis-dialog-abnormal-tab.test.js
|
||||
node tests/unit/project-analysis-dialog-source-highlight.test.js
|
||||
npm run build:prod
|
||||
|
||||
cd /Users/wkc/Desktop/ccdi/ccdi
|
||||
mvn test -pl ccdi-project -Dtest=CcdiProjectOverviewMapperSqlTest
|
||||
```
|
||||
|
||||
## 验证结果
|
||||
|
||||
- 前端对象卡片相关单测通过。
|
||||
- 前端生产构建成功。
|
||||
- 后端 `CcdiProjectOverviewMapperSqlTest` 通过,确认对象异常查询已返回 `reasonDetail`。
|
||||
|
||||
## 附加说明
|
||||
|
||||
- 尝试执行 `mvn test -pl ccdi-project -Dtest=CcdiProjectOverviewServiceImplTest,CcdiProjectOverviewMapperSqlTest` 时,`CcdiProjectOverviewServiceImplTest` 受到当前环境下 Mockito Inline MockMaker 自附着限制影响失败,失败原因是 Byte Buddy agent 无法附着到当前 JVM,并非本次 `reasonDetail` 逻辑断言失败。
|
||||
- 同一轮执行中,`ccdi-project` 模块源码与测试代码已完成重新编译,说明本次新增字段与 SQL 映射能够通过编译阶段。
|
||||
|
||||
## 结论
|
||||
|
||||
- 本次“异常对象摘要展示异常原因快照”改动已完成,前端展示和后端查询映射均已验证。
|
||||
@@ -89,6 +89,10 @@
|
||||
{{ tag }}
|
||||
</el-tag>
|
||||
</div>
|
||||
<div class="object-card__snapshot">
|
||||
<div class="object-card__snapshot-label">异常原因快照</div>
|
||||
<p class="object-card__snapshot-value">{{ item.reasonDetail || "-" }}</p>
|
||||
</div>
|
||||
<p class="object-card__summary">{{ item.summary || "-" }}</p>
|
||||
<div
|
||||
v-for="(field, fieldIndex) in item.extraFields || []"
|
||||
@@ -260,6 +264,25 @@ export default {
|
||||
color: #1e293b;
|
||||
}
|
||||
|
||||
.object-card__snapshot {
|
||||
margin-top: 12px;
|
||||
padding: 12px;
|
||||
border: 1px solid #dbeafe;
|
||||
background: #eff6ff;
|
||||
}
|
||||
|
||||
.object-card__snapshot-label {
|
||||
font-size: 12px;
|
||||
color: #475569;
|
||||
}
|
||||
|
||||
.object-card__snapshot-value {
|
||||
margin: 8px 0 0;
|
||||
font-size: 13px;
|
||||
line-height: 1.7;
|
||||
color: #1e293b;
|
||||
}
|
||||
|
||||
.summary-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
@@ -289,6 +289,7 @@ export function buildProjectAnalysisDialogData({ person, source = "riskPeople",
|
||||
? projectAnalysisFrequentTransferTemplate[index].accountNo
|
||||
: "异常对象",
|
||||
riskTags: [],
|
||||
reasonDetail: "命中对象型异常规则,系统已截取对应原因快照用于辅助研判。",
|
||||
summary: item.description,
|
||||
extraFields: [],
|
||||
})),
|
||||
|
||||
@@ -42,6 +42,8 @@ const abnormalTab = fs.readFileSync(
|
||||
"交易金额",
|
||||
"title",
|
||||
"subtitle",
|
||||
"异常原因快照",
|
||||
"reasonDetail",
|
||||
"summary",
|
||||
"extraFields",
|
||||
].forEach((token) => assert(abnormalTab.includes(token), token));
|
||||
|
||||
Reference in New Issue
Block a user