From 467e7f74d54d5a01f34bc8fc062b2e86d67dfbd5 Mon Sep 17 00:00:00 2001 From: kangwenjing <1138819403@qq.com> Date: Wed, 9 Sep 2026 12:22:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=E9=87=91=E9=A2=9D?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=B8=8E=E4=BA=A7=E5=93=81=E9=A2=84?= =?UTF-8?q?=E8=A3=85=E7=B3=BB=E7=BB=9F=E7=B1=BB=E5=9E=8B=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 新增并统一全链路金额格式化逻辑,添加千分位显示与固定两位小数 2. 为Excel导出添加decimalFormat配置与样式缓存,优化导出展示效果 3. 为产品表新增预装系统类型字段并完善前后端映射 4. 优化产品配置组件,新增税率锁定功能 5. 修复多处金额显示不规范问题,统一金额展示样式 6. 优化批量更新SQL语句语法,修复日志路径配置 7. 忽略.DS_Store文件并清理已跟踪的垃圾文件 --- .DS_Store | Bin 10244 -> 10244 bytes .gitignore | 1 + .workbuddy/memory/2026-09-08.md | 52 +++++++ .workbuddy/memory/2026-09-09.md | 35 +++++ .../approve/finance/invoiceExcelUtils.js | 6 +- .../components/PaymentRefundDetail.vue | 4 +- .../components/ReceiptDetail.vue | 4 +- .../components/ReceivableInvoiceDetail.vue | 4 +- .../views/approve/purchaase/approve/index.vue | 2 +- .../approve/purchaase/approved/index.vue | 2 +- .../views/base/quotation/selectQuotation.vue | 2 +- .../src/views/dataProcess/projectTransfer.vue | 2 +- .../invoice/components/ApplyInvoice.vue | 4 +- .../invoice/components/InvoiceInfoView.vue | 4 +- .../finance/payable/components/EditForm.vue | 2 +- .../finance/payment/components/AddForm.vue | 12 +- .../src/views/finance/receipt/index.vue | 2 +- .../receivable/components/EditForm.vue | 4 +- .../views/finance/writeoff/payment/index.vue | 8 +- .../writeoff/payment/writeoffRecord.vue | 6 +- .../writeoff/receipt/WriteOffDetailDrawer.vue | 4 +- .../views/finance/writeoff/receipt/index.vue | 33 ++-- .../writeoff/receipt/writeoffRecord.vue | 6 +- .../writeoff/ticket/WriteOffDetailDrawer.vue | 4 +- .../writeoff/ticket/writeoffRecord.vue | 6 +- .../src/views/inventory/inner/index.vue | 2 +- .../src/views/project/info/ProductConfig.vue | 37 ++++- .../src/views/project/info/ProjectForm.vue | 2 +- .../oms_vue/src/views/project/info/index.vue | 2 +- .../src/views/project/order/OrderDetail.vue | 2 +- .../components/PurchaseOrderDetail.vue | 8 +- .../components/PurchaseOrderDetailView.vue | 12 +- .../components/PurchaseOrderSelectDialog.vue | 4 +- .../src/views/purchaseorder/vendorConfirm.vue | 2 +- .../src/views/system/product/index.vue | 55 ++++++- ruoyi-admin/.DS_Store | Bin 6148 -> 10244 bytes .../com/ruoyi/common/annotation/Excel.java | 6 + .../com/ruoyi/common/utils/poi/ExcelUtil.java | 18 +++ .../com/ruoyi/sip/domain/InventoryInfo.java | 4 +- .../ruoyi/sip/domain/OmsFinanceCharge.java | 28 ++-- .../sip/domain/OmsFinanceOperateReport.java | 84 +++++------ .../com/ruoyi/sip/domain/OmsInvoiceBill.java | 4 +- .../com/ruoyi/sip/domain/OmsPayableBill.java | 14 +- .../sip/domain/OmsPayableTicketWriteOff.java | 6 +- .../ruoyi/sip/domain/OmsPayableWriteOff.java | 6 +- .../sip/domain/OmsPayableWriteOffDetail.java | 6 +- .../com/ruoyi/sip/domain/OmsPaymentBill.java | 6 +- .../ruoyi/sip/domain/OmsPurchaseOrder.java | 2 +- .../ruoyi/sip/domain/OmsReceivableBill.java | 14 +- .../domain/OmsReceivableInvoiceDetail.java | 2 +- .../sip/domain/OmsReceivableInvoicePlan.java | 2 +- .../domain/OmsReceivableInvoiceWriteOff.java | 6 +- .../domain/OmsReceivableReceiptDetail.java | 2 +- .../sip/domain/OmsReceivableReceiptPlan.java | 2 +- .../sip/domain/OmsReceivableWriteOff.java | 6 +- .../domain/OmsReceivableWriteOffDetail.java | 6 +- .../com/ruoyi/sip/domain/OmsTicketBill.java | 6 +- .../java/com/ruoyi/sip/domain/OrderList.java | 142 +++++++++--------- .../com/ruoyi/sip/domain/ProductInfo.java | 6 +- .../com/ruoyi/sip/domain/ProjectInfo.java | 2 +- .../sip/domain/ProjectOrderConfigInfo.java | 8 +- .../ruoyi/sip/domain/ProjectOrderInfo.java | 2 +- .../ruoyi/sip/domain/ProjectProductInfo.java | 2 +- .../dto/inventory/InventoryInfoExcelDto.java | 2 +- .../dto/warehouse/WarehouseInnerExcelDto.java | 2 +- .../impl/OmsInventoryInnerServiceImpl.java | 53 +++++-- .../sip/OmsPayableTicketDetailMapper.xml | 2 +- .../mapper/system/ProductInfoMapper.xml | 9 +- sql/20260904update.sql | 11 ++ 69 files changed, 524 insertions(+), 282 deletions(-) create mode 100644 .workbuddy/memory/2026-09-08.md create mode 100644 .workbuddy/memory/2026-09-09.md create mode 100644 sql/20260904update.sql diff --git a/.DS_Store b/.DS_Store index b026af948db22fcf16e907f56dc85dfe4034c1b8..3e708b8b8f9674b22fc793a2e51685250de52364 100644 GIT binary patch delta 69 zcmV-L0J{H#P=rvBPXRcwP`eKSII|28>j4-C0B-Ke<`e@1?Hd*1 delta 47 zcmZn(XbG6$&uG3eU^hRb`DPx0*Nl^egyu6cPVN_y+I&XHns;J>^k#O2Uo4wtM46cZ DdlnAc diff --git a/.gitignore b/.gitignore index 0cb3ee60..a5fc2335 100644 --- a/.gitignore +++ b/.gitignore @@ -35,6 +35,7 @@ nbbuild/ dist/ nbdist/ .nb-gradle/ +.DS_Store ###################################################################### # Others diff --git a/.workbuddy/memory/2026-09-08.md b/.workbuddy/memory/2026-09-08.md new file mode 100644 index 00000000..3dccf8c4 --- /dev/null +++ b/.workbuddy/memory/2026-09-08.md @@ -0,0 +1,52 @@ +# 2026-09-08 + +## 代码 review(两轮) + +用户要求只 review 不改代码。范围:工作区 53 个改动文件(Java 后端 + Vue 前端)。 + +### 改动主体 +- Excel 注解新增 `decimalFormat` 字段(Excel.java + ExcelUtil.java),21 个 domain 的 BigDecimal 字段加 `@Excel(scale=2, decimalFormat="#,##0.00")`,仅影响导出显示,安全。 +- 前端多处 `toFixed(2)` → 全局 `formatCurrency`(main.js 已注册 Vue.prototype),安全。 +- ProductInfo/Mapper/前端新增 `pre_system_type`(预装系统类型)字段,前后端配套完整,配套 SQL:`sql/20290904update.sql`(文件名年份疑为笔误,写的是 2029)。 +- `OmsInventoryInnerServiceImpl.insertOmsInventoryInner` 应付单生成逻辑重构(核心风险点)。 + +### 第一轮发现的问题 → 用户修复后第二轮复核结果 +1. NPE(quantity/price 为 null 时直接 multiply)→ 已修:`usePurchaseOrder` 条件含 null 检查,null 时回退原公式 ✓ +2. 重复 setTaxAmount(新旧两行并存)→ 已清理,只留正确行(含税-未税)✓ +3. vendorInfo 为 null 时 getPayConfigDay() NPE → 已修,传 0 ✓ +4. 遗留:`vendorInfo != null ? vendorInfo.getPayConfigDay() : 0` 三元混合 Integer/int,payConfigDay 为 null 时仍会拆箱 NPE(原代码同样会炸,非回归) +5. 遗留:ExcelUtil 每单元格 createCellStyle,POI 上限 64000 样式,大数据量导出会失败 +6. 遗留:OrderList.java 文件末尾无换行;oms_web/.DS_Store 未跟踪垃圾文件 + +### 业务逻辑一致性结论(H3C 判定) +- 新华三(isH3C=true,startsWith("新华三")):条件退化为原条件,金额公式走原逻辑,与原 100% 一致 +- 非新华三无采购单:innerComplete 默认 true,与原一致 +### 第三轮复核(用户又修复了一批) +1. 三元拆箱 NPE → 已修:`vendorInfo != null && vendorInfo.getPayConfigDay() != null ? ... : 0` ✓ +2. ExcelUtil CellStyle → 已修:新增 `moneyStyles` Map 缓存(按 decimalFormat 键),HashMap 已导入,ExcelUtil 每次 export 新建实例,缓存作用域正确 ✓ +3. OrderList.java 末尾换行 → 已补 ✓ +仍遗留(非代码 bug,提交时注意):isH3C 口径需业务确认(startsWith("新华三"),基于 ProductInfo.vendorName);sql/20290904update.sql 文件名年份笔误(2029);oms_web/.DS_Store 与 ruoyi-admin/.DS_Store 垃圾文件。 +至此所有代码级问题均已修复,H3C/无采购单场景与原逻辑一致,非新华三+有采购单为有意业务变更。 + +### 金额格式统一专项检查(第四轮,只查不改) +**统一现状**:全局 formatCurrency(utils/index.js:17,main.js:46 注册,null→'0.00',toLocaleString en-US 2位小数);本次 diff 新增 72 处 formatCurrency(27 个文件);后端 21 个 domain 106 个 @Excel 字段加 decimalFormat。 + +**后端 Excel 遗漏**:OmsTicketBill.java:70 taxAmount(税额,活动注解,其余单据均已加)。比率类(taxRate×4、planRate×2、invoiceRate、receiptRate)未加属合理;折扣类(OrderList.discount、ProjectOrderConfigInfo.guidanceDiscount/discount)需确认语义。 + +**前端遗漏**:ApplyInvoice.vue:122/129/143 v-else 分支裸显示 unitPrice/amount/taxAmount;writeoff 两 index 的 $modal 提示文案 5 处无千分位(轻微);formatCurrency(x.toFixed(2)) 双重格式化 ~12 处(冗余无害)。 + +**体系性发现**:项目存在 7+ 处组件局部 formatAmount/formatAmountNumber 副本(均为存量,非本次新增):purchaseorder/index.vue:589、orderFinance.vue:377(filters)、base/quotation/index.vue:535、ProductConfig.vue:497、approve/all/index.vue:1295(用zh-CN)、projectTransfer.vue:293、project/info/index.vue:491 等。差异:局部版 null→'',全局版 null→'0.00'。后续统一建议收敛到全局 formatCurrency,先定 null 显示口径。 + +**formatCurrency 边界**:非数字字符串入参会显示 "NaN"(Number('abc').toLocaleString → "NaN"),建议加 Number.isNaN 保护。convertCurrency(大写金额)依赖 toFixed 字符串,InvoiceInfoView:115 / ApplyInvoice:278 / invoiceExcelUtils.js:147 的 toFixed(2) 必须保留,不是遗漏。 + +### 第五轮:全量改动集成测试(mvn 编译 + vue 解析) +**Maven 全量编译**(JAVA_HOME=Corretto 8):7 模块 SUCCESS,0 ERROR。Lombok、@Excel 注解、mapper SQL、Service 实现全部对齐。 +**前端 31 文件 SFC/JS 解析**:用 @vue/compiler-sfc 批量 parse,0 失败(PaymentRefundDetail、ReceiptDetail、ReceivableInvoiceDetail、ApplyInvoice、InvoiceInfoView、EditForm×2、AddForm、receipt/index、writeoff 6 个文件、inventory/inner、ProductConfig、ProjectForm、project/info/index、OrderDetail、PurchaseOrderDetail、PurchaseOrderDetailView、PurchaseOrderSelectDialog、vendorConfirm、system/product、approve/purchaase×2、selectQuotation、projectTransfer、invoiceExcelUtils.js)。 + +**本轮新增发现的位置**(前几轮未深查): +- ruoyi-admin/logback.xml:把 jiliu 路径换成 kangwenjing 个人本地路径,纯个人配置切换,不影响代码(提交前建议恢复或加 .gitignore 排除)。 +- dto/InventoryInfoExcelDto.java、dto/warehouse/WarehouseInnerExcelDto.java:innerPrice 加 decimalFormat,已正确 ✓ +- approve/purchaase/{approve,approved}/index.vue:含税总金额列加 formatter ✓ +- base/quotation/selectQuotation.vue:discountAmount 加 formatter,字段名语义为"报价金额"(QuotationInfo 表的折扣后金额),没问题 ✓ +- system/product/index.vue:queryParams 已在 data() 初始声明 preSystemType: null ✓;resetForm 依赖表单模板自动重置 ✓;handleTypeChange 在切换非硬件时清空 preSystemType ✓ +- OmsTicketBill.java:70 税额仍**漏** decimalFormat(连续两轮没修)。 diff --git a/.workbuddy/memory/2026-09-09.md b/.workbuddy/memory/2026-09-09.md new file mode 100644 index 00000000..4e9a4156 --- /dev/null +++ b/.workbuddy/memory/2026-09-09.md @@ -0,0 +1,35 @@ +# 2026-09-09 工作日志 + +## 全量改动复核 + 集成测试(不动代码) + +**改动规模**:65 文件、+427 / -283 行 + +**集成测试结果**: +- 后端:`mvn compile -DskipTests`(JAVA_HOME=Corretto 1.8.0_442) → **BUILD SUCCESS**,7 模块 0 ERROR +- 前端:31 个 Vue/JS 文件用 `@vue/compiler-sfc` 解析 → **31 ok, 0 fail** + +**本轮发现**: +1. `OmsTicketBill.java:70` 税额已加 `decimalFormat = "#,##0.00"`(用户修复) +2. SQL 文件名 `20290904` → `20260904`(已改),但文件内注释仍写 `2029-09-04` +3. `.gitignore` 已加 `.DS_Store`(用户修复) +4. `ruoyi-admin/.DS_Store` 仍被 `git ls-files` 跟踪,需 `git rm --cached` 才能彻底忽略 + +**确认正确的覆盖**: +- `inventory/inner/index.vue`、`vendorConfirm.vue` — 本次新加 formatter 没问题 +- `InventoryInfoExcelDto.java`、`WarehouseInnerExcelDto.java` — 入库价已加 decimalFormat +- `ProductInfo.java` + `ProductInfoMapper.xml` — preSystemType 字段前后端完整配套 +- `OmsInventoryInnerServiceImpl.java` — 三处修复(NPE、payConfigDay 拆箱、税金额)均正确 + +**仍未修的小遗留**: +- `ApplyInvoice.vue:122/129/143` v-else 裸显示(用户上一轮已知,影响小) +- 14 处 `formatCurrency(x.toFixed(2))` 双重格式化(冗余但正确) +- 7+ 处局部 `formatAmount/formatAmountNumber` 副本(存量代码,本次未改) + +**体系性问题(与本次改动范围无关)**: +- 项目里 7+ 处组件局部的 `formatAmount` 副本,行为与全局 `formatCurrency` 略有差异(null 显示空 vs '0.00'),建议后续收敛 +- `formatCurrency('abc')` 会显示 "NaN",建议加 `Number.isNaN` 保护 + +**提交前清单**: +- [ ] 修 `sql/20260904update.sql` 注释里的 `2029-09-04` → `2026-09-04` +- [ ] `git rm --cached ruoyi-admin/.DS_Store`(.gitignore 已加,但已跟踪文件需手动移除) +- [ ] 可选:`git checkout ruoyi-admin/src/main/resources/logback.xml` 恢复个人本地路径 \ No newline at end of file diff --git a/oms_web/oms_vue/src/views/approve/finance/invoiceExcelUtils.js b/oms_web/oms_vue/src/views/approve/finance/invoiceExcelUtils.js index 0bded91f..72b13eb2 100644 --- a/oms_web/oms_vue/src/views/approve/finance/invoiceExcelUtils.js +++ b/oms_web/oms_vue/src/views/approve/finance/invoiceExcelUtils.js @@ -12,7 +12,7 @@ function formatCurrency(value) { if (Number.isNaN(num)) { return "0.00"; } - return num.toFixed(2); + return num.toLocaleString("en-US", { minimumFractionDigits: 2, maximumFractionDigits: 2 }); } function getProductTypeLabel(value) { @@ -135,9 +135,9 @@ function buildSummaryRow(items) { return ` 合计 - ¥${allPriceTotal.toFixed(2)} + ¥${formatCurrency(allPriceTotal)} - - ¥${taxTotal.toFixed(2)} + ¥${formatCurrency(taxTotal)} `; } diff --git a/oms_web/oms_vue/src/views/approve/finance/paymentRefund/components/PaymentRefundDetail.vue b/oms_web/oms_vue/src/views/approve/finance/paymentRefund/components/PaymentRefundDetail.vue index 4c63fb72..7b6f1a17 100644 --- a/oms_web/oms_vue/src/views/approve/finance/paymentRefund/components/PaymentRefundDetail.vue +++ b/oms_web/oms_vue/src/views/approve/finance/paymentRefund/components/PaymentRefundDetail.vue @@ -36,8 +36,8 @@ - - + + diff --git a/oms_web/oms_vue/src/views/approve/finance/receiptRefound/components/ReceiptDetail.vue b/oms_web/oms_vue/src/views/approve/finance/receiptRefound/components/ReceiptDetail.vue index f02c01d5..040a1650 100644 --- a/oms_web/oms_vue/src/views/approve/finance/receiptRefound/components/ReceiptDetail.vue +++ b/oms_web/oms_vue/src/views/approve/finance/receiptRefound/components/ReceiptDetail.vue @@ -31,8 +31,8 @@ - - + + diff --git a/oms_web/oms_vue/src/views/approve/finance/receivableInvoiceRefund/components/ReceivableInvoiceDetail.vue b/oms_web/oms_vue/src/views/approve/finance/receivableInvoiceRefund/components/ReceivableInvoiceDetail.vue index 80ce4ef4..cf6bfa1a 100644 --- a/oms_web/oms_vue/src/views/approve/finance/receivableInvoiceRefund/components/ReceivableInvoiceDetail.vue +++ b/oms_web/oms_vue/src/views/approve/finance/receivableInvoiceRefund/components/ReceivableInvoiceDetail.vue @@ -37,12 +37,12 @@ diff --git a/oms_web/oms_vue/src/views/approve/purchaase/approve/index.vue b/oms_web/oms_vue/src/views/approve/purchaase/approve/index.vue index 6cae9160..49731152 100644 --- a/oms_web/oms_vue/src/views/approve/purchaase/approve/index.vue +++ b/oms_web/oms_vue/src/views/approve/purchaase/approve/index.vue @@ -62,7 +62,7 @@ - + - - - + + + - - - + + + diff --git a/oms_web/oms_vue/src/views/project/info/ProductConfig.vue b/oms_web/oms_vue/src/views/project/info/ProductConfig.vue index 73d545e0..db5fa792 100644 --- a/oms_web/oms_vue/src/views/project/info/ProductConfig.vue +++ b/oms_web/oms_vue/src/views/project/info/ProductConfig.vue @@ -67,7 +67,10 @@ @@ -148,7 +151,10 @@ @@ -227,7 +233,10 @@ @@ -277,6 +286,11 @@ export default { readonly: { type: Boolean, default: false + }, + // 锁定税率,不允许编辑(用于订单新增等场景) + lockTaxRate: { + type: Boolean, + default: false } }, data() { @@ -585,5 +599,22 @@ export default { width: 100%; } } + + // 税率遮盖层 + .tax-rate-wrap { + position: relative; + + .tax-rate-mask { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 2; + cursor: not-allowed; + // 轻微底色区分,提示该字段不可编辑 + background: rgba(200, 200, 200, 0.35); + } + } } diff --git a/oms_web/oms_vue/src/views/project/info/ProjectForm.vue b/oms_web/oms_vue/src/views/project/info/ProjectForm.vue index f30c569e..ba3fc5eb 100644 --- a/oms_web/oms_vue/src/views/project/info/ProjectForm.vue +++ b/oms_web/oms_vue/src/views/project/info/ProjectForm.vue @@ -296,7 +296,7 @@
报价单导入 - +
diff --git a/oms_web/oms_vue/src/views/project/info/index.vue b/oms_web/oms_vue/src/views/project/info/index.vue index e9b7d226..e678bb96 100644 --- a/oms_web/oms_vue/src/views/project/info/index.vue +++ b/oms_web/oms_vue/src/views/project/info/index.vue @@ -490,7 +490,7 @@ export default { /** 格式化金额 */ formatAmountNumber(value) { if (value) { - return Number(value).toLocaleString('en-US'); + return Number(value).toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); } return ''; }, diff --git a/oms_web/oms_vue/src/views/project/order/OrderDetail.vue b/oms_web/oms_vue/src/views/project/order/OrderDetail.vue index d9714669..480dfd03 100644 --- a/oms_web/oms_vue/src/views/project/order/OrderDetail.vue +++ b/oms_web/oms_vue/src/views/project/order/OrderDetail.vue @@ -18,7 +18,7 @@
- +
diff --git a/oms_web/oms_vue/src/views/purchaseorder/components/PurchaseOrderDetail.vue b/oms_web/oms_vue/src/views/purchaseorder/components/PurchaseOrderDetail.vue index 9c012c94..bba875f0 100644 --- a/oms_web/oms_vue/src/views/purchaseorder/components/PurchaseOrderDetail.vue +++ b/oms_web/oms_vue/src/views/purchaseorder/components/PurchaseOrderDetail.vue @@ -162,7 +162,7 @@
- + - +