From a6e7ef6105aa56391a819f3bcf3b734315236778 Mon Sep 17 00:00:00 2001 From: wkc <978997012@qq.com> Date: Mon, 18 May 2026 10:56:25 +0800 Subject: [PATCH] Show final calculate rate in workflow list --- ...2026-05-13-loan-pricing-function-script.md | 32 ++++++++++++++++ ...t-2026-05-15-browser-title-loan-pricing.md | 22 +++++++++++ ...rt-2026-05-15-rate-display-two-decimals.md | 32 ++++++++++++++++ ...eport-2026-05-18-workflow-list-cust-isn.md | 19 ++++++++++ ...5-18-workflow-list-final-calculate-rate.md | 22 +++++++++++ ruoyi-admin/.DS_Store | Bin 10244 -> 10244 bytes .../domain/vo/LoanPricingWorkflowListVO.java | 2 + .../loanpricing/LoanPricingWorkflowMapper.xml | 3 +- .../vo/LoanPricingWorkflowListVOTest.java | 2 + .../LoanPricingWorkflowMapperXmlTest.java | 2 +- ruoyi-ui/.env.development | 2 +- ruoyi-ui/.env.production | 2 +- ruoyi-ui/.env.staging | 2 +- ruoyi-ui/src/utils/rate.js | 14 +++++++ .../components/CorporateCreateDialog.vue | 4 +- .../components/CorporateWorkflowDetail.vue | 10 +++-- .../components/HistoryContractSelector.vue | 9 ++++- .../components/ModelOutputDisplay.vue | 35 ++++++++++-------- .../components/PersonalCreateDialog.vue | 4 +- .../components/PersonalWorkflowDetail.vue | 10 +++-- .../src/views/loanPricing/workflow/index.vue | 15 +++++++- 21 files changed, 209 insertions(+), 34 deletions(-) create mode 100644 doc/implementation-report-2026-05-13-loan-pricing-function-script.md create mode 100644 doc/implementation-report-2026-05-15-browser-title-loan-pricing.md create mode 100644 doc/implementation-report-2026-05-15-rate-display-two-decimals.md create mode 100644 doc/implementation-report-2026-05-18-workflow-list-cust-isn.md create mode 100644 doc/implementation-report-2026-05-18-workflow-list-final-calculate-rate.md create mode 100644 ruoyi-ui/src/utils/rate.js diff --git a/doc/implementation-report-2026-05-13-loan-pricing-function-script.md b/doc/implementation-report-2026-05-13-loan-pricing-function-script.md new file mode 100644 index 0000000..b215a0d --- /dev/null +++ b/doc/implementation-report-2026-05-13-loan-pricing-function-script.md @@ -0,0 +1,32 @@ +# 贷款定价单脚本部署改造实施记录 + +## 保存路径检查 +- 参考脚本:`/Users/wkc/Desktop/ccdi/ccdi/deploy/ccdi_function.sh` +- 新增脚本保存路径:`bin/prod/loan_pricing_function.sh` +- 实施记录保存路径:`doc/implementation-report-2026-05-13-loan-pricing-function-script.md` + +## 修改内容 +- 新增 `loan_pricing_function.sh`,按 `ccdi_function.sh` 的 `deploy`、`restart`、`stop` 三命令结构改造为贷款定价可用脚本。 +- 按贷款定价现有生产目录约定调整: + - 后端 Jar:`backend/ruoyi-admin.jar` + - 前端静态目录:`frontend/dist/` + - 日志目录:`logs/backend-console.log` + - PID 文件:`run/backend.pid` + - 临时目录:`tmp/loan-pricing-function/` + - 备份目录:`backup/YYYYMMDDHHMMSS/` +- 按贷款定价运行参数调整: + - Java 默认目录:`/home/webapp/env/java` + - 后端进程标记:`-Dloan.pricing.home=<脚本目录>` + - Spring Profile:`uat` + - 后端端口:`63310` +- 上线包结构固定为根层包含: + - `ruoyi-admin.jar` + - `dist.zip` +- 前端 `dist.zip` 解压后必须包含 `dist/index.html`,部署时写入 `frontend/dist/`。 +- 默认保持参考脚本的启动后持续输出日志行为,并支持 `FOLLOW_LOGS=0` 供自动化验证跳过持续日志输出。 + +## 验证结果 +- 已执行 `sh -n bin/prod/loan_pricing_function.sh`,语法校验通过。 +- 已在临时目录构造 `backend/`、`frontend/dist/`、根层发布 zip 和假 Java 进程,验证 `deploy` 可完成备份、替换、启动和日志落盘。 +- 已验证 `stop` 可停止脚本标记的后端进程并清理 PID 文件。 +- 验证过程中产生的临时测试目录已删除,未新增仓库内测试文件。 diff --git a/doc/implementation-report-2026-05-15-browser-title-loan-pricing.md b/doc/implementation-report-2026-05-15-browser-title-loan-pricing.md new file mode 100644 index 0000000..6b8b2fd --- /dev/null +++ b/doc/implementation-report-2026-05-15-browser-title-loan-pricing.md @@ -0,0 +1,22 @@ +# 浏览器页签标题调整实施记录 + +## 修改时间 + +2026-05-15 + +## 修改内容 + +- 将前端浏览器页签标题从“上虞利率定价系统”调整为“贷款利率定价系统”。 +- 同步更新开发、测试、生产环境的 `VUE_APP_TITLE` 配置,确保本地运行和打包产物标题一致。 + +## 涉及文件 + +- `ruoyi-ui/.env.development` +- `ruoyi-ui/.env.staging` +- `ruoyi-ui/.env.production` + +## 验证情况 + +- 已通过源码检索确认 `ruoyi-ui` 中页面标题配置已统一为“贷款利率定价系统”。 +- 已使用 browser-use 打开 `http://localhost:9527/login` 进行真实页面验证,浏览器标签页标题与 `document.title` 均为“贷款利率定价系统”。 +- 验证时仅启动前端服务;因本地后端 `localhost:63310` 未启动,验证码接口代理返回 `ECONNREFUSED`,不影响本次页签标题验证。 diff --git a/doc/implementation-report-2026-05-15-rate-display-two-decimals.md b/doc/implementation-report-2026-05-15-rate-display-two-decimals.md new file mode 100644 index 0000000..d55503d --- /dev/null +++ b/doc/implementation-report-2026-05-15-rate-display-two-decimals.md @@ -0,0 +1,32 @@ +# 利率前端两位小数展示实施记录 + +## 修改时间 +- 2026-05-15 + +## 修改范围 +- `ruoyi-ui/src/utils/rate.js` +- `ruoyi-ui/src/views/loanPricing/workflow/index.vue` +- `ruoyi-ui/src/views/loanPricing/workflow/components/ModelOutputDisplay.vue` +- `ruoyi-ui/src/views/loanPricing/workflow/components/PersonalWorkflowDetail.vue` +- `ruoyi-ui/src/views/loanPricing/workflow/components/CorporateWorkflowDetail.vue` +- `ruoyi-ui/src/views/loanPricing/workflow/components/HistoryContractSelector.vue` +- `ruoyi-ui/src/views/loanPricing/workflow/components/PersonalCreateDialog.vue` +- `ruoyi-ui/src/views/loanPricing/workflow/components/CorporateCreateDialog.vue` + +## 修改内容 +- 新增 `formatRate` 前端格式化方法,统一将可解析的利率数值展示为小数点后两位。 +- 利率定价流程列表的测算利率、执行利率改为通过 `formatRate` 展示。 +- 个人/企业流程详情的基准利率、最终测算利率、执行利率初始展示值、历史贷款利率改为两位小数展示。 +- 模型输出中的基准利率、测算利率、历史利率、产品最低利率下限、平滑幅度、参考利率、最终测算利率、派生率改为两位小数展示。 +- 历史贷款合同选择弹窗和新增流程弹窗中的历史贷款利率展示改为两位小数。 + +## 影响说明 +- 本次仅调整前端展示格式,不改后端接口、数据库字段和模型调用逻辑。 +- 历史贷款利率在新增弹窗中仅格式化展示,表单内部仍保留接口返回的原始值。 + +## 验证 +- 已执行 `source ~/.nvm/nvm.sh && nvm use 14.21.3 && npm run build:prod`,构建通过,仅存在资源体积 warning。 +- 已启动后端 `http://localhost:63310` 和前端 `http://localhost:9527/`,通过 browser-use 打开真实页面验证。 +- 流程列表接口原始返回中存在 `calculateRate = 3.932` 的数据,流程列表页面 `测算利率(%)` 展示为 `3.93`。 +- 流程列表页面 `执行利率(%)` 展示为 `3.88`、`6.18` 或 `-`,已确认非空利率均为小数点后两位。 +- 流程详情页模型输出中,`finalCalculateRate = 3.732` 对应页面展示为 `3.73`,其他利率字段也按两位小数展示。 diff --git a/doc/implementation-report-2026-05-18-workflow-list-cust-isn.md b/doc/implementation-report-2026-05-18-workflow-list-cust-isn.md new file mode 100644 index 0000000..69b7f26 --- /dev/null +++ b/doc/implementation-report-2026-05-18-workflow-list-cust-isn.md @@ -0,0 +1,19 @@ +# 流程列表客户内码字段实施记录 + +## 修改内容 + +- 后端流程列表查询 `selectWorkflowPageWithRates` 增加 `lpw.cust_isn AS custIsn`,确保列表接口返回客户内码。 +- 流程列表返回对象 `LoanPricingWorkflowListVO` 增加 `custIsn` 字段,承接接口返回值。 +- 前端流程列表页新增“客户内码”表格列,字段绑定 `custIsn`,支持超长内容 tooltip 展示。 + +## 影响范围 + +- 仅影响利率定价流程列表 `/loanPricing/workflow/list` 的返回字段和页面展示。 +- 不修改新增流程、详情页、筛选条件和数据库结构。 + +## 验证记录 + +- `mvn -pl ruoyi-loan-pricing -am -Dtest=LoanPricingWorkflowListVOTest -Dsurefire.failIfNoSpecifiedTests=false test` 通过。 +- `source ~/.nvm/nvm.sh && nvm use 14.21.3 && node tests/customer-map-selection.test.js` 通过。 +- 使用真实后端接口 `/loanPricing/workflow/list?pageNum=1&pageSize=3` 验证返回 `custIsn`,前三条返回值为 `81000529053`、`81000791269`、`81000769824`。 +- 使用 browser-use 打开真实流程列表页 `http://localhost:1024/index`,确认表头包含“客户内码”,前三条列表行客户内码展示为 `81000529053`、`81000791269`、`81000769824`。 diff --git a/doc/implementation-report-2026-05-18-workflow-list-final-calculate-rate.md b/doc/implementation-report-2026-05-18-workflow-list-final-calculate-rate.md new file mode 100644 index 0000000..588747d --- /dev/null +++ b/doc/implementation-report-2026-05-18-workflow-list-final-calculate-rate.md @@ -0,0 +1,22 @@ +# 流程列表最终测算利率展示实施记录 + +## 修改内容 + +- 流程列表联表查询中,企业客户分支由 `model_corp_output_fields.calculate_rate` 改为 `model_corp_output_fields.final_calculate_rate`。 +- 个人客户分支保持读取 `model_retail_output_fields.final_calculate_rate`。 +- 前端流程列表列名由“测算利率(%)”调整为“最终测算利率(%)”,继续复用列表接口字段 `calculateRate` 展示,避免扩大接口字段变更范围。 + +## 影响范围 + +- 仅影响利率定价流程列表 `/loanPricing/workflow/list` 的利率来源和列名展示。 +- 不修改详情页、新增流程、执行利率和数据库结构。 + +## 验证记录 + +- 已更新 `LoanPricingWorkflowMapperXmlTest`,约束个人、企业流程列表均取 `final_calculate_rate`。 +- `mvn -pl ruoyi-loan-pricing -am -Dtest=LoanPricingWorkflowMapperXmlTest,LoanPricingWorkflowListVOTest -Dsurefire.failIfNoSpecifiedTests=false test` 通过。 +- `source ~/.nvm/nvm.sh && nvm use 14.21.3 && node tests/customer-map-selection.test.js` 通过。 +- 使用 Node 静态断言确认流程列表列名为“最终测算利率(%)”,并且不再展示旧列名“测算利率(%)”。 +- `mvn -pl ruoyi-admin -am clean package -DskipTests` 打包通过,并重启本地 63310 后端。 +- 使用真实后端接口 `/loanPricing/workflow/list?pageNum=1&pageSize=3` 验证返回值,前三条 `calculateRate` 分别为 `3.732`、`6.05`、`3.732`。 +- 使用 browser-use 打开真实流程列表页 `http://localhost:1024/index`,确认列名为“最终测算利率(%)”,前三条页面展示值为 `3.73`、`6.05`、`3.73`,旧列名未出现。 diff --git a/ruoyi-admin/.DS_Store b/ruoyi-admin/.DS_Store index c51f8854b7a1c094b2fcc92747e99b97dcca01ec..18930649834558066c82e469c3b9b6a2d1fd6506 100644 GIT binary patch delta 522 zcmbW!O-R!L7{~GF`y9#{Na1u-8?JT;q{CEDrw}`MND5u9a3PrH3wqep`EpQ05lbUW z^nZz7*0E>=^Mw>UYKFatAR&f`s6j78T|5YZ{tYjAik{<--{tdr`h0!9m|;7b=RWJq z@?;xNj(d$ywj5*lM3ND-))|XwiK&5x>c)`2p`+F+e;?y9`z^Zb*Z;(qLsh|Ai_7ai zD8-3GvZPQhN~MIQQ|`)riOPh$mO1$-Yw}fo$_{V@3-KJoii32VoFaoYI4UhXi+J%-2}HsudZ`@Z}c&x!JamrOFnG&9UH#~bF& YEtXj2GvD}byi0bCZ#yEELod(R1C3IBF#rGn delta 472 zcma*k&r6eW9Ki9<`y-SOu27tNrYjUBi7>Yr%pE+;OFxuoV3=mNaJW);DU^YjG!}&y z{Z_{oMo=C~Tn9m27!^oF2+?5~SRi!`lG;Ul=Fv;O|AQCrR5TTxGxovOP*YuNC}=X} z5tFw=R!{tDVz?`w>^DR1m|6E#nyHE^t05AQ-LebbH0ETb3(M4bJmZZLmWW)Gm?UIE zCM6@UWLa|ZQNGA``6<7pAlraaf{Q9_yi`+ SELECT lpw.serial_num AS serialNum, + lpw.cust_isn AS custIsn, lpw.cust_name AS custName, lpw.cust_type AS custType, lpw.guar_type AS guarType, lpw.apply_amt AS applyAmt, CASE WHEN lpw.cust_type = '个人' THEN mr.final_calculate_rate - WHEN lpw.cust_type = '企业' THEN mc.calculate_rate + WHEN lpw.cust_type = '企业' THEN mc.final_calculate_rate ELSE NULL END AS calculateRate, lpw.execute_rate AS executeRate, diff --git a/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/domain/vo/LoanPricingWorkflowListVOTest.java b/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/domain/vo/LoanPricingWorkflowListVOTest.java index cff31db..be1271c 100644 --- a/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/domain/vo/LoanPricingWorkflowListVOTest.java +++ b/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/domain/vo/LoanPricingWorkflowListVOTest.java @@ -10,9 +10,11 @@ class LoanPricingWorkflowListVOTest void shouldExposeCalculateRateAndExecuteRateFields() { LoanPricingWorkflowListVO vo = new LoanPricingWorkflowListVO(); + vo.setCustIsn("CUST001"); vo.setCalculateRate("6.15"); vo.setExecuteRate("5.80"); + assertEquals("CUST001", vo.getCustIsn()); assertEquals("6.15", vo.getCalculateRate()); assertEquals("5.80", vo.getExecuteRate()); } diff --git a/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/mapper/LoanPricingWorkflowMapperXmlTest.java b/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/mapper/LoanPricingWorkflowMapperXmlTest.java index fb0f86d..9f6aa7f 100644 --- a/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/mapper/LoanPricingWorkflowMapperXmlTest.java +++ b/ruoyi-loan-pricing/src/test/java/com/ruoyi/loanpricing/mapper/LoanPricingWorkflowMapperXmlTest.java @@ -17,7 +17,7 @@ class LoanPricingWorkflowMapperXmlTest String xml = StreamUtils.copyToString(resource.getInputStream(), StandardCharsets.UTF_8); assertTrue(xml.contains("WHEN lpw.cust_type = '个人' THEN mr.final_calculate_rate")); - assertTrue(xml.contains("WHEN lpw.cust_type = '企业' THEN mc.calculate_rate")); + assertTrue(xml.contains("WHEN lpw.cust_type = '企业' THEN mc.final_calculate_rate")); assertTrue(xml.contains("lpw.create_by = #{query.dataScopeCreateBy}")); assertTrue(xml.contains("SUBSTRING_INDEX(lpw.create_by, '-', -1) LIKE CONCAT('%', #{query.createBy}, '%')")); } diff --git a/ruoyi-ui/.env.development b/ruoyi-ui/.env.development index 606dba5..156634a 100644 --- a/ruoyi-ui/.env.development +++ b/ruoyi-ui/.env.development @@ -1,5 +1,5 @@ # 页面标题 -VUE_APP_TITLE = 上虞利率定价系统 +VUE_APP_TITLE = 贷款利率定价系统 # 开发环境配置 ENV = 'development' diff --git a/ruoyi-ui/.env.production b/ruoyi-ui/.env.production index 73fcfc4..dd27f73 100644 --- a/ruoyi-ui/.env.production +++ b/ruoyi-ui/.env.production @@ -1,5 +1,5 @@ # 页面标题 -VUE_APP_TITLE = 上虞利率定价系统 +VUE_APP_TITLE = 贷款利率定价系统 # 生产环境配置 ENV = 'production' diff --git a/ruoyi-ui/.env.staging b/ruoyi-ui/.env.staging index 62b7f38..929dd72 100644 --- a/ruoyi-ui/.env.staging +++ b/ruoyi-ui/.env.staging @@ -1,5 +1,5 @@ # 页面标题 -VUE_APP_TITLE = 上虞利率定价系统 +VUE_APP_TITLE = 贷款利率定价系统 BABEL_ENV = production diff --git a/ruoyi-ui/src/utils/rate.js b/ruoyi-ui/src/utils/rate.js new file mode 100644 index 0000000..c892b1b --- /dev/null +++ b/ruoyi-ui/src/utils/rate.js @@ -0,0 +1,14 @@ +export function formatRate(value, emptyText = '-') { + if (value === null || value === undefined || value === '') { + return emptyText + } + const stringValue = String(value).trim() + if (stringValue === '') { + return emptyText + } + const numberValue = Number(stringValue) + if (Number.isNaN(numberValue)) { + return stringValue + } + return numberValue.toFixed(2) +} diff --git a/ruoyi-ui/src/views/loanPricing/workflow/components/CorporateCreateDialog.vue b/ruoyi-ui/src/views/loanPricing/workflow/components/CorporateCreateDialog.vue index 02f04d3..9911a83 100644 --- a/ruoyi-ui/src/views/loanPricing/workflow/components/CorporateCreateDialog.vue +++ b/ruoyi-ui/src/views/loanPricing/workflow/components/CorporateCreateDialog.vue @@ -72,7 +72,7 @@ - + @@ -130,6 +130,7 @@