# 2026-04-29 客户号查询选择客户内码实施记录

## 修改内容

- 后端新增个人/企业客户号映射业务接口：
  - `GET /loanPricing/workflow/customer-map/personal?custId=...`
  - `GET /loanPricing/workflow/customer-map/corporate?custId=...`
- 后端新增个人/企业客户号映射 mock 接口：
  - `GET /rate/pricing/mock/customer-map/personal?cust_id=...`
  - `GET /rate/pricing/mock/customer-map/corporate?cust_id=...`
- 配置文件新增 `customer-map` 个人/企业地址，并在 `dev`、`uat`、`pro` profile 中统一指向本项目 mock。
- 前端新增客户号查询选择弹窗。
- 客户号查询选择弹窗宽度调整为窗口宽度的 `80%`。
- 客户号查询输入值在查询前去除前后空格；后端转发个人/企业客户号映射接口前同步去除前后空格，并对下游 `cust_id` 查询参数做 URI 编码，避免尾随空格进入 request target 触发 TongWeb `HTTP Status 400`。
- 选中客户号查询结果后，返回参数 `cust_id` 去除前三位后自动回填到新增弹窗基础信息的 `证件号码` 字段。
- 个人/企业新增流程改为先查询客户号、选择客户内码，再打开新增弹窗。
- 新增弹窗客户内码和客户名称由选中记录自动带入并只读。

## 验证结果

- 后端针对性测试：通过。
  - 命令：`mvn -pl ruoyi-loan-pricing -am -Dtest=CustomerMapRecordVOTest,LoanPricingCustomerMapServiceTest,LoanRatePricingMockControllerCustomerMapTest,LoanPricingWorkflowControllerCustomerMapTest -Dsurefire.failIfNoSpecifiedTests=false test`
  - 结果：`Tests run: 8, Failures: 0, Errors: 0, Skipped: 0`。
- 客户号空格 400 修复补充测试：通过。
  - 命令：`mvn -pl ruoyi-loan-pricing -am -Dtest=LoanPricingCustomerMapServiceTest,LoanRatePricingMockControllerCustomerMapTest -Dsurefire.failIfNoSpecifiedTests=false test`
  - 结果：`Tests run: 6, Failures: 0, Errors: 0, Skipped: 0`。
- 后端打包与启动验证：通过。
  - 命令：`mvn -pl ruoyi-admin -am -DskipTests package`
  - 命令：`java -jar ruoyi-admin/target/ruoyi-admin.jar --spring.profiles.active=dev`
  - 结果：后端以 `dev` profile 启动成功，端口 `63310` 可用。
- 接口验证：通过。
  - `GET /rate/pricing/mock/customer-map/personal?cust_id=P001` 返回随机个人客户映射列表，字段为 `cust_id`、`cust_isn`、`cust_name`、`faith_day`、`balance_avg`、`loan_count_his`、`last_loan_date`。
  - `GET /rate/pricing/mock/customer-map/corporate?cust_id=C001` 返回随机企业客户映射列表，字段同上。
  - `GET /rate/pricing/mock/customer-map/personal?cust_id=` 返回 `客户号不能为空`。
  - 登录后调用 `GET /loanPricing/workflow/customer-map/personal?custId=P001` 和 `GET /loanPricing/workflow/customer-map/corporate?custId=C001` 均返回对应映射列表。
  - 登录后调用 `GET /loanPricing/workflow/customer-map/personal?custId=` 返回 `客户号不能为空`。
  - 补充验证：以最新后端临时端口 `63311` 调用 `GET /loanPricing/workflow/customer-map/personal?custId=1w0xc20xb7%20` 返回 `code=200`，返回 `cust_id` 为 `1w0xc20xb7`；调用 `GET /loanPricing/workflow/customer-map/corporate?custId=C001%20` 返回 `code=200`，返回 `cust_id` 为 `C001`；调用 `GET /loanPricing/workflow/customer-map/personal?custId=%20` 返回 `客户号不能为空`。
- 前端针对性测试：通过。
  - 命令：`zsh -lic 'nvm use 14.21.3 >/dev/null && node ruoyi-ui/tests/customer-map-selection.test.js && npm --prefix ruoyi-ui run test:personal-create-input-params && npm --prefix ruoyi-ui run test:corporate-create-input-params && node ruoyi-ui/tests/workflow-index-refresh.test.js'`
  - 结果：`customer map selection assertions passed`、`personal create input params assertions passed`、`corporate create input params assertions passed`、`workflow-index-refresh test passed`。
  - 补充命令：`zsh -lic 'nvm use 14.21.3 >/dev/null && node ruoyi-ui/tests/customer-map-selection.test.js'`
  - 补充结果：`customer map selection assertions passed`，覆盖客户号去前三位回填证件号码断言。
  - 补充回归命令：`zsh -lic 'nvm use 14.21.3 >/dev/null && node ruoyi-ui/tests/customer-map-selection.test.js && npm --prefix ruoyi-ui run test:personal-create-input-params && npm --prefix ruoyi-ui run test:corporate-create-input-params && node ruoyi-ui/tests/id-number-validation-removal.test.js'`
  - 补充回归结果：`customer map selection assertions passed`、`personal create input params assertions passed`、`corporate create input params assertions passed`、`id number validation removal assertions passed`。
- 前端生产构建：通过。
  - 命令：`zsh -lic 'nvm use 14.21.3 >/dev/null && npm --prefix ruoyi-ui run build:prod'`
  - 结果：构建成功；输出 2 个既有体积 warning。
- 真实页面验证：通过。
  - 启动前端 `http://localhost:18080/`，登录后进入真实页面 `http://localhost:18080/loanPricing/workflow`。
  - 个人客户：点击 `新增` -> `个人客户` -> 客户号查询输入 `PTEST003` -> 返回多条客户映射 -> 选择首行 -> 打开 `新增个人利率定价流程`，客户内码自动带入 `81000450472`，客户名称自动带入 `个人客户1`，两个字段均为 `readonly`。
  - 企业客户：点击 `新增` -> `企业客户` -> 客户号查询输入 `CTEST001` -> 返回多条客户映射 -> 选择首行 -> 打开 `新增企业利率定价流程`，客户内码自动带入 `81000448819`，客户名称自动带入 `企业客户1`，两个字段均为 `readonly`。
  - 弹窗宽度补充验证：点击 `新增` -> `个人客户` 后，`客户号查询` 弹窗 DOM 样式为 `margin-top: 15vh; width: 80%;`。
  - 客户号空格补充验证：点击 `新增` -> `个人客户`，客户号输入 `1w0xc20xb7 ` 后查询，输入框显示为 `1w0xc20xb7`，列表正常返回客户映射，页面未出现 `400` 或 `Bad Request`。
  - 客户号到证件号码补充验证：点击 `新增` -> `个人客户`，客户号输入 `ABC123456789` 并选择返回行后，新增个人弹窗基础信息的 `证件号码` 自动填入 `123456789`。
  - 页面验证仅验证查询选择与自动回填链路，未提交新增表单，避免写入额外流程测试数据。
- 回归补充说明：
  - `LoanPricingModelServiceTest` 已通过。
  - 组合回归命令包含 `LoanPricingWorkflowServiceImplTest` 时，当前本机 Oracle JDK 21 环境下 Mockito inline/Byte Buddy self-attach 失败，属于既有测试环境限制，不是本次客户号映射功能断言失败。
- 进程清理：已关闭本次启动的后端和前端进程。
- 本次宽度与客户号空格补充验证结束后，`18080`、`63311` 无监听；`63310` 为验证前已存在的后端进程，未处理。
