Refactor project pages and update related docs

This commit is contained in:
wkc
2026-05-28 16:37:51 +08:00
parent 000e8698a5
commit 7ce721ef93
40 changed files with 730 additions and 785 deletions

View File

@@ -0,0 +1,29 @@
# 账号库列表排除信贷客户后端实施计划
## 1. 目标
账号库管理列表不展示 `ccdi_account_info.owner_type = 'CREDIT_CUSTOMER'` 的信贷客户账号,避免信贷客户账号批量导入后进入页面列表并影响查询性能。
## 2. 实施范围
- 后端账号库列表查询 SQL
- 账号库导出查询复用同一筛选条件
- 本次不调整前端筛选项、接口参数、返回结构、新增编辑导入校验
## 3. 实施步骤
1.`CcdiAccountInfoMapper.xml``AccountInfoWhereClause` 增加固定条件:
`AND ai.owner_type <> 'CREDIT_CUSTOMER'`
2. 保持现有 `ownerType` 动态筛选逻辑不变,使 `ownerType=CREDIT_CUSTOMER` 查询自然返回空结果。
3. 不新增前端“信贷客户”筛选项,不扩展账号库维护端归属类型。
## 4. 验证要点
- 无筛选条件时列表不返回 `CREDIT_CUSTOMER` 数据。
- `ownerType=EMPLOYEE``RELATION``INTERMEDIARY``EXTERNAL` 时仍按原逻辑查询。
- `ownerType=CREDIT_CUSTOMER` 时返回空结果。
- 账号库导出与列表使用同一排除口径。
## 5. 前提
信贷客户账号导入 `ccdi_account_info` 时,`owner_type` 必须固定写入 `CREDIT_CUSTOMER`

View File

@@ -0,0 +1,24 @@
# 项目打标失败状态后端实施计划
## 保存路径确认
- 后端计划:`docs/plans/backend/2026-05-27-project-tag-failed-status-backend-implementation.md`
- 实施记录:`docs/reports/implementation/2026-05-27-project-tag-failed-status-implementation.md`
## 目标
新增正式项目状态 `4-打标失败`,打标任务失败后项目状态停留在失败态;项目详情接口在失败态下返回最近失败任务错误信息,列表接口不返回完整错误。
## 实施步骤
1. 扩展项目状态常量、实体注释、状态文案和状态统计 VO新增 `TAG_FAILED = "4"``status4`
2. 修改打标失败流转:`CcdiBankTagServiceImpl.rebuildProject` 捕获异常后保留任务失败信息,并将项目状态更新为 `4`
3. 新增 `CcdiBankTagTaskMapper.selectLatestFailedTaskByProjectId`,按 `id desc limit 1` 查询项目最近失败任务。
4. 扩展 `CcdiProjectVO`,只新增 `latestTagTaskErrorMessage``latestTagTaskEndTime``getProjectById` 仅在状态为 `4` 时组装失败任务信息。
5. 补充 SQL 初始化与迁移脚本,新增 `ccdi_project_status` 字典值 `4-打标失败`,并回填未归档且最新打标任务失败的 `0/3` 项目。
6. 补充后端单测覆盖失败状态流转、详情失败信息、`status4` 统计、`4` 状态可写和 SQL/Mapper 契约。
## 验证
- 执行本次相关后端测试类。
- 执行 `mvn -pl ccdi-project -am test` 观察全量状态并记录非本次问题。

View File

@@ -0,0 +1,28 @@
# 项目打标失败状态前端实施计划
## 保存路径确认
- 前端计划:`docs/plans/frontend/2026-05-27-project-tag-failed-status-frontend-implementation.md`
- 实施记录:`docs/reports/implementation/2026-05-27-project-tag-failed-status-implementation.md`
## 目标
前端支持 `4-打标失败` 状态展示;项目列表只展示失败状态和进入项目入口;项目详情页展示失败提示,并通过详情接口字段查看完整错误。
## 实施步骤
1. 在项目列表、项目详情、历史导入状态映射中增加 `4-打标失败`,使用失败红色样式。
2.`SearchBar` 和项目首页状态统计中增加 `4` 筛选与 `status4` 计数。
3. 在项目详情页头部下方增加打标失败提示,仅当 `projectInfo.projectStatus === "4"` 且存在 `latestTagTaskErrorMessage` 时展示。
4. 详情失败提示提供完整错误弹窗,内容只使用详情接口返回的 `latestTagTaskErrorMessage``latestTagTaskEndTime`
5. 项目状态轮询在状态脱离 `3-打标中` 后停止,因此遇到 `4` 自动停止并展示失败信息。
6. `UploadData.vue``4``0-进行中` 处理:允许上传、拉取、征信导入,禁用查看报告入口。
7. `ParamConfig.vue` 维持只锁定 `3-打标中``2-已归档`,因此 `4` 状态允许保存参数并触发重新打标。
8. 补充静态单测覆盖状态映射、详情失败提示、列表不展示完整错误、筛选计数和失败态操作口径。
## 验证
- 前端命令执行前先通过 `nvm use` 切换到项目 Node 版本。
- 执行相关静态单测。
- 执行 `npm run build:prod`
- 在真实业务页面路由中验证列表和详情页显示效果,不打开 prototype 页面。

View File

@@ -0,0 +1,48 @@
# 2026-05-22 生产安全组网络访问清单
## 保存路径确认
- 目标目录:`docs/reports/implementation/`
- 文档用途:根据 `ruoyi-admin/src/main/resources/application-pro.yml` 生成生产运行所需网络 IP 与端口清单,供服务器安全组配置使用。
- 路径检查结果:符合仓库实施记录归档规范。
## 配置来源
- 后端监听端口:`server.port=62318`
- 生产文件公开访问基址:`credit-parse.api.file-public-base-url=http://64.116.19.153`
- 生产 MySQL`64.116.19.156:3306`
- 生产 Redis`64.116.19.155:6379`
- 流水分析平台:`http://64.202.32.176/c4c3`
- 征信解析平台:`http://64.202.32.40:8083`
说明:本文只记录网络地址和端口,不记录生产账号、密码、密钥等敏感配置。
## 生产运行安全组放行清单
### 入站规则
| 目标服务器 | 来源 | 协议/端口 | 用途 | 配置依据 |
| --- | --- | --- | --- | --- |
| `64.116.19.153/32` | 业务访问源 IP 段或前置代理/SLB | TCP `62318` | 访问后端服务 | `server.port=62318` |
| `64.116.19.153/32` | `64.202.32.40/32` | TCP `80` | 征信解析平台读取已上传 HTML 文件 | `file-public-base-url=http://64.116.19.153`HTTP 默认端口为 `80` |
### 出站规则
| 源服务器 | 目标 | 协议/端口 | 用途 | 配置依据 |
| --- | --- | --- | --- | --- |
| `64.116.19.153/32` | `64.116.19.156/32` | TCP `3306` | 后端连接生产 MySQL | `spring.datasource.druid.master.url` |
| `64.116.19.153/32` | `64.116.19.155/32` | TCP `6379` | 后端连接生产 Redis | `spring.data.redis.host` / `port` |
| `64.116.19.153/32` | `64.202.32.176/32` | TCP `80` | 后端调用流水分析平台接口 | `lsfx.api.base-url=http://64.202.32.176/c4c3` |
| `64.116.19.153/32` | `64.202.32.40/32` | TCP `8083` | 后端调用征信解析发起与结果查询接口 | `credit-parse.api.url` / `result-url` |
## 配置校验点
1. 生产服务若按 `pro` 配置运行,启动参数需要使用 `--spring.profiles.active=pro`
2. `file-public-base-url` 当前未带端口,因此征信解析平台回读文件时访问的是 `64.116.19.153:80`;如果服务器只开放 `62318`,外部平台无法按当前 `pro` 配置读取 `/profile/credit-html/**` 文件。
3. `/profile/**` 在后端资源映射和安全配置中允许匿名 GET 访问,因此安全组应确保征信解析平台到文件公开入口的网络链路可达。
## 本次验证
- 已检查 `ruoyi-admin/src/main/resources/application-pro.yml` 中生产端口、MySQL、Redis、流水分析平台、征信解析平台和文件公开访问基址。
- 已检查 `ccdi-info-collection/src/main/java/com/ruoyi/info/collection/service/support/CreditHtmlStorageService.java`,确认远程文件地址由 `file-public-base-url` 拼接 `/profile/credit-html/**` 生成。
- 已检查 `ruoyi-framework/src/main/java/com/ruoyi/framework/config/ResourcesConfig.java``SecurityConfig.java`,确认 `/profile/**` 对应本地上传目录并允许匿名 GET 访问。

View File

@@ -0,0 +1,26 @@
# 账号库列表排除信贷客户实施记录
## 1. 本次实施内容
-`CcdiAccountInfoMapper.xml` 的公共查询条件 `AccountInfoWhereClause` 中增加 `AND ai.owner_type <> 'CREDIT_CUSTOMER'`
- 账号库列表分页与导出查询共用该条件,因此两处均不再返回信贷客户账号。
-`CcdiAccountInfoMapperTest` 中补充 SQL 渲染断言,覆盖信贷客户排除条件。
- 前端页面、筛选项、接口参数和账号库新增编辑导入校验未调整。
## 2. 影响范围
- 影响接口:`/ccdi/accountInfo/list`
- 影响查询:`selectAccountInfoPage``selectAccountInfoListForExport`
- 不影响账号详情、新增、编辑、删除、导入模板和导入处理。
## 3. 验证记录
- 已确认 Mapper XML 包含固定排除条件。
- 已确认 `ownerType=CREDIT_CUSTOMER` 会与固定排除条件组合为空结果。
- 已执行 `git diff --check -- ccdi-info-collection/src/main/resources/mapper/info/collection/CcdiAccountInfoMapper.xml docs/plans/backend/2026-05-27-account-info-exclude-credit-customer-backend-implementation.md docs/reports/implementation/2026-05-27-account-info-exclude-credit-customer-implementation.md`,无空白问题。
- 已执行 `mvn -pl ccdi-info-collection -am -DskipTests compile`,结果 `BUILD SUCCESS`
- 已执行 `mvn -pl ccdi-info-collection -am test`,结果 `BUILD SUCCESS`,共运行 171 个测试,失败 0、错误 0。
## 4. 前提说明
信贷客户账号需要以 `owner_type = 'CREDIT_CUSTOMER'` 写入 `ccdi_account_info`,否则本次列表排除条件无法识别。

View File

@@ -0,0 +1,39 @@
# 生产打包技能命名优化实施记录
## 基本信息
- 实施日期2026-05-27
- 实施对象:`/Users/wkc/.codex/skills/fullstack-prod-package`
- 实施内容:优化生产打包技能,使最终发布压缩包文件名包含项目英文代码
## 修改内容
1. 更新打包脚本 `scripts/package_fullstack_prod.py`
- 新增 `--project-code` 参数,用作最终 zip 文件名前缀
- 未传入 `--project-code` 时,默认使用后端项目目录名作为项目英文代码
- 对项目英文代码进行规范化处理,仅保留英文、数字、点、下划线和连字符
- 最终压缩包命名从 `YYYYMMDD-HHMMSS.zip` 调整为 `projectcode-YYYYMMDD-HHMMSS.zip`
- 打包完成输出增加 `PROJECT_CODE`
2. 更新技能说明 `SKILL.md`
- 调整技能描述,保持触发条件清晰
- 标准命令增加 `--project-code projectcode`
- 说明默认推断规则和验证要求
## 影响范围
- 后续使用 `fullstack-prod-package` 生成生产包时,最终 zip 文件名会包含项目英文代码。
- 生产包内部内容不变,仍仅包含:
- `dist.zip`
- 后端运行 Jar
## 验证结果
- `python3 -m py_compile` 通过
- `--help` 输出已包含 `--project-code`
- 使用现有 `ruoyi-ui/dist``ruoyi-admin.jar` 在临时目录执行轻量打包验证成功
- 验证生成文件名:`ccdi-20260527-152829.zip`
- 验证 zip 内容仍仅包含:
- `dist.zip`
- `ruoyi-admin.jar`
- 临时验证目录已删除

View File

@@ -0,0 +1,50 @@
# 全栈生产包生成实施记录
## 基本信息
- 实施日期2026-05-27
- 实施内容:生成前端 `dist.zip` 与后端可运行 Jar 的生产发布压缩包
- 最终产物:`/Users/wkc/Downloads/20260527-150234.zip`
## 执行内容
1. 核对项目构建配置:
- 前端目录:`ruoyi-ui`
- 前端 Node 版本:通过 `.nvmrc` 使用 `v14.21.3`
- 前端生产构建命令:`npm run build:prod`
- 后端构建命令:`mvn clean package -DskipTests`
- 后端运行 Jar`ruoyi-admin/target/ruoyi-admin.jar`
2. 执行后端生产构建:
- 在仓库根目录执行 `mvn clean package -DskipTests`
- Maven Reactor 全模块构建成功
- 生成后端运行包 `ruoyi-admin.jar`
3. 执行前端生产构建与发布包生成:
- 通过 `nvm use` 切换至 Node `v14.21.3`
- 执行 `npm run build:prod`
- 生成 `ruoyi-ui/dist`
-`dist` 压缩为 `dist.zip`
-`dist.zip``ruoyi-admin.jar` 合并为最终发布包
## 影响范围
- 更新构建产物目录:
- `ruoyi-ui/dist`
- 各后端模块 `target`
- 新增本地发布产物:
- `/Users/wkc/Downloads/20260527-150234.zip`
## 验证结果
- Node 版本已确认:`v14.21.3`
- Java 版本已确认:`21.0.9`
- Maven 版本已确认:`3.9.14`
- 后端构建结果:成功
- 前端构建结果:成功,存在前端资源体积 warning不影响构建完成
- `ruoyi-ui/dist` 文件数377
- 后端 Jar`ruoyi-admin.jar`,约 100 MB
- 最终压缩包:`20260527-150234.zip`,约 94 MB
- 最终压缩包内容已通过 `unzip -l` 验证,仅包含:
- `dist.zip`
- `ruoyi-admin.jar`

View File

@@ -0,0 +1,26 @@
# 项目打标失败状态实施记录
## 修改内容
- 后端新增项目状态 `4-打标失败`,扩展状态统计 `status4` 和状态文案。
- 打标失败后项目状态由原先回退 `0-进行中` 改为写入 `4-打标失败`,任务表仍记录 `FAILED/error_message`
- 项目详情接口在失败态下返回最近失败任务的 `latestTagTaskErrorMessage``latestTagTaskEndTime`;项目列表不返回完整错误。
- SQL 初始化和迁移脚本新增 `ccdi_project_status` 字典值 `4-打标失败`,并提供生产数据回填 SQL。
- 前端列表、筛选、计数和详情页支持 `4-打标失败`;详情页提供失败提示和完整错误弹窗。
- `UploadData.vue``ParamConfig.vue``4` 按进行中口径处理,允许重新上传、拉取、修改参数和重新分析,不开放报告查看/归档入口。
## 影响范围
- 后端:项目状态模型、打标任务失败流转、项目详情接口、状态统计接口、打标任务 Mapper、SQL 初始化和迁移。
- 前端:项目首页列表与筛选、项目详情头部提示、上传数据页报告入口权限、状态映射。
- 数据:迁移脚本会将未归档、当前状态为 `0/3`、最新打标任务为 `FAILED` 的项目更新为 `4`
## 验证结果
- 通过:`mvn -pl ccdi-project -am -Dtest=CcdiBankTagServiceImplTest,CcdiBankTagServiceRiskCountRefreshTest,CcdiProjectServiceImplTest,CcdiProjectStatusSqlTest,CcdiBankTagTaskMapperXmlTest -Dsurefire.failIfNoSpecifiedTests=false test`
- 全量后端:`mvn -pl ccdi-project -am test` 未通过,剩余失败为既有问题:
- 多个测试使用 static mock但当前 `SubclassByteBuddyMockMaker` 不支持 static mocks。
- `CcdiProjectOverviewControllerContractTest.shouldExposeOverviewReportExportEndpointContract` 期望摘要为“一键导出结果总览报告”,实际为“导出结果总览报告”。
- 通过:`cd ruoyi-ui && nvm use && node tests/unit/project-tag-failed-status.test.js && node tests/unit/project-detail-tagging-polling.test.js && node tests/unit/project-archive-readonly-guard.test.js && node tests/unit/upload-data-disabled-cards.test.js`
- 通过:`cd ruoyi-ui && nvm use && npm run build:prod`,仅有既有资源体积 warning。
- 真实页面验证:`browser-use` 工具不可用;已使用 Playwright 打开真实业务页面路由,并通过本地 mock 后端构造失败项目数据,验证列表只显示“打标失败”且不泄露完整错误,详情页可查看完整错误,失败状态下上传/拉取入口可见。

View File

@@ -0,0 +1,32 @@
# 拉取本行信息近一年日期范围实施记录
## 修改内容
- 将“拉取本行信息”弹窗的时间跨度最早可选日期由固定 `2025-01-01` 调整为动态近一年窗口。
- 日期可选范围按当前日期滚动计算:
- 最晚可选日期:昨天。
- 最早可选日期:最晚可选日期往前一年。
- 提交前校验同步使用同一套最早、最晚日期边界。
- 校验提示调整为“时间跨度仅支持近一年内日期,且最晚只能选择到昨天”。
- 补充前端单测断言,防止日期范围再次退回固定日期。
## 影响范围
- 前端页面:
- `ruoyi-ui/src/views/ccdiProject/components/detail/UploadData.vue`
- 前端测试:
- `ruoyi-ui/tests/unit/upload-data-pull-bank-info-date-limit.test.js`
- 不涉及后端接口、不改数据库。
## 验证情况
- 已执行 `source ~/.nvm/nvm.sh && nvm use && node tests/unit/upload-data-pull-bank-info-date-limit.test.js`,通过。
- 已执行 `source ~/.nvm/nvm.sh && nvm use && npm run build:prod`,通过;仅存在项目既有资源体积告警。
- 已在真实项目详情页验证“拉取本行信息”弹窗:
- 验证页面:`http://localhost:8090/ccdiProject/detail/90336`
- 当前系统日期:`2026-05-27`
- 默认开始日期:`2025-05-26`
- 默认结束日期:`2026-05-26`
- 日期面板中 `2025-05-25` 禁用,`2025-05-26` 可选。
- 日期面板中 `2026-05-26` 可选,`2026-05-27` 及之后日期禁用。
- 浏览器验证截图已保存到 `output/browser-use/2026-05-27-pull-bank-info-date-range.png`,该文件为本地验证产物,不提交 Git。

View File

@@ -0,0 +1,32 @@
# 银行流水打标 UNION 排序规则冲突修复记录
## 问题现象
- 生产执行银行流水打标规则 `ABNORMAL_CUSTOMER_TRANSACTION` 时失败。
- 异常为 `Illegal mix of collations for operation 'UNION'`
- 报错位置为 `CcdiBankTagAnalysisMapper.xml``selectAbnormalCustomerTransactionStatements` 查询。
## 根因
- 该规则会将 `ccdi_base_staff``ccdi_staff_fmy_relation` 组装为同一个人员主体派生表,并继续与银行流水、账户库、中介库、企业库做多分支 `UNION ALL`
- 生产表字段排序规则确认无异常后,问题收敛到应用数据库连接会话。
- 生产 JDBC URL 只设置了 `characterEncoding=UTF-8`,未固定 `connectionCollation`。现场查询显示生产 MySQL 8.0.36 的 `@@character_set_connection``utf8mb3``@@collation_connection``@@collation_server` 均为 `utf8mb3_general_ci`SQL 字符串字面量与 `CAST(... AS CHAR)` 也解析为 `utf8mb3_general_ci`,与项目字段统一使用的 `utf8mb4_general_ci` 不一致,容易在 `UNION` 合并字符串列时触发排序规则冲突。
## 修改内容
- 生产数据源 JDBC URL 增加 `connectionCollation=utf8mb4_general_ci`,固定应用连接会话排序规则。
## 影响范围
- 数据库结构:无变更。
- 后端配置:仅影响生产 profile 的 MySQL 连接会话排序规则。
- 后端代码:未修改 Java 和 MyBatis SQL 业务逻辑。
- 前端:无影响。
## 验证情况
- 已确认异常 SQL 对应规则为 `ABNORMAL_CUSTOMER_TRANSACTION`
- 已确认生产 JDBC URL 未固定 `connectionCollation`
- 现场查询 `@@character_set_connection` 返回 `utf8mb3``@@collation_connection``@@collation_server` 返回 `utf8mb3_general_ci`
- 现场查询 `COLLATION('本人')``COLLATION(CAST(1 AS CHAR))` 返回 `utf8mb3_general_ci`
- 未连接生产数据库执行验证;生产发布并重启后需确认应用连接中的 `@@collation_connection``utf8mb4_general_ci`,再重新触发失败项目的银行流水打标任务验证。

View File

@@ -0,0 +1,40 @@
# 2026-05-28 全栈生产包实施记录
## 保存路径确认
- 文档目录:`docs/reports/implementation/`
- 本文档:`docs/reports/implementation/2026-05-28-fullstack-prod-package-095235.md`
## 实施内容
-`fullstack-prod-package` 技能执行全栈生产打包。
- 前端目录:`ruoyi-ui`
- 后端目录:`ruoyi-admin`,构建命令在仓库根目录执行。
- 项目英文编码:`ccdi`
- 最终生产包:`/Users/wkc/Downloads/ccdi-20260528-095235.zip`
## 构建命令
```bash
python3 /Users/wkc/.codex/skills/fullstack-prod-package/scripts/package_fullstack_prod.py \
--frontend-dir /Users/wkc/Desktop/ccdi/ccdi/ruoyi-ui \
--backend-dir /Users/wkc/Desktop/ccdi/ccdi/ruoyi-admin \
--backend-build-command 'cd /Users/wkc/Desktop/ccdi/ccdi && mvn clean package -DskipTests' \
--project-code ccdi
```
## 验证结果
- 前端 `npm run build:prod` 执行成功,使用 `.nvmrc` 指定的 Node `14.21.3`
- 前端 `ruoyi-ui/dist` 已生成,目录大小约 `8.7M`
- 后端 `mvn clean package -DskipTests` 执行成功,生成 `ruoyi-admin/target/ruoyi-admin.jar`,大小约 `100M`
- 最终压缩包已生成,大小约 `94M`
- `unzip -l /Users/wkc/Downloads/ccdi-20260528-095235.zip` 验证通过,根目录仅包含:
- `dist.zip`
- `ruoyi-admin.jar`
## 注意事项
- 前端构建存在 Vue CLI 默认资源体积告警,未导致构建失败。
- Maven 构建跳过测试,符合生产打包命令参数 `-DskipTests`
- 本次打包基于执行时当前工作区内容,执行前工作区已存在未提交变更。