#!/usr/bin/env python3 """把指定实体的真·金额字段从 double 改为 BigDecimal(字段声明+getter+setter+import)。 科学量/数量字段不传入,保持 double。""" import re, sys, os BASE = "/Users/qiu/Desktop/ERP/oa-backend/src/main/java/com/kaidi/oa/domain" # 文件 -> 该文件里需要转成 BigDecimal 的金额字段 TARGETS = { "Contract.java": ["amount", "paidAmount", "invoicedAmount"], "RdProject.java": ["budget"], "ContractMilestone.java": ["amount"], "PolicyApplication.java": ["appliedAmount", "grantedAmount"], "Bid.java": ["controlPrice", "bidAmount", "deposit"], "Payment.java": ["amount"], "Invoice.java": ["amount", "taxAmount", "total"], "Patent.java": ["annualFee"], "Budget.java": ["budgetAmount", "actualAmount"], "Account.java": ["balance"], "ContractChange.java": ["amountBefore", "amountAfter"], "Declaration.java": ["amount"], "Opportunity.java": ["amount"], "CostCenter.java": ["budgetTotal", "actualTotal"], "StandardCost.java": ["materialCost", "laborCost", "overheadCost", "totalStandard", "actualCost", "variance"], "BomItem.java": ["unitPrice"], # bidQty/actualQty 保持 double "PriceItem.java": ["unitPrice"], "RdExpense.java": ["amount"], "Policy.java": ["fundAmount"], "Voucher.java": ["amount"], } def cap(s): return s[0].upper() + s[1:] def ensure_import(src): if "import java.math.BigDecimal;" in src: return src # 插在 package 行之后第一处空行/或第一条 import 前 lines = src.split("\n") out, inserted = [], False for i, ln in enumerate(lines): out.append(ln) if not inserted and ln.startswith("package "): out.append("") out.append("import java.math.BigDecimal;") inserted = True # 若下一行本就是空行,跳过避免双空行 if i + 1 < len(lines) and lines[i + 1].strip() == "": continue return "\n".join(out) def xform(path, fields): src = open(path, encoding="utf-8").read() orig = src changed = [] for f in fields: c = cap(f) # 字段声明:private double -> private BigDecimal s1 = re.sub(rf"(\bprivate\s+)double(\s+{re.escape(f)}\b)", r"\1BigDecimal\2", src) # getter:public double get( -> public BigDecimal get( s2 = re.sub(rf"(\bpublic\s+)double(\s+get{re.escape(c)}\s*\()", r"\1BigDecimal\2", s1) # setter 形参:set(double -> set(BigDecimal s3 = re.sub(rf"(\bset{re.escape(c)}\s*\(\s*)double(\s+)", r"\1BigDecimal\2", s2) if s3 != src: changed.append(f) src = s3 else: print(f" !! {os.path.basename(path)}: 字段 {f} 未命中任何模式(需手查)") if changed: src = ensure_import(src) if src != orig: open(path, "w", encoding="utf-8").write(src) return changed def main(): total = 0 for fn, fields in TARGETS.items(): p = os.path.join(BASE, fn) if not os.path.exists(p): print(f" !! 缺文件 {fn}") continue ch = xform(p, fields) total += len(ch) print(f"{fn}: 改 {len(ch)}/{len(fields)} 字段 {ch}") print(f"\n合计改 {total} 个金额字段") if __name__ == "__main__": main()