SNAPSHOT W7 已部署稳定态 — 凯迪ERP+OA一体化平台 (MET 73.3%)

恢复点(restore point)。别人改崩后可 git reset --hard 回到此提交。

== 此快照内容 ==
- 后端 oa-backend: 734 控制器 / 711 实体 (Spring Boot 3.2.5 + SQLite, 端口8091)
- 前端 modern-ui/app: Vue3+Vite, 约700页 (构建产物已在 oa-backend/src/main/resources/static)
- 数据库 oa-backend/data/oa.db: 含全部演示数据 (强制入库, 6.6MB)
- 交接文档 go.md + go-code-reference/endpoints/entities/database.md
- 多代理建设脚本 .claude/wf-*.js

== 状态 ==
- 对 凯迪科技ERP_20260507.xlsx 合规 MET ~73.3% (PARTIAL 75: 34可建+6种子/bug+35外部硬天花板)
- 安全: 5轮红队+5轮复检, default-deny分级鉴权, 连续零可利用
- W3~W7 累计补完436缺口; W8末轮(40缺口)为半成品(源码树可编译但未集成)
- 运行: cd oa-backend; java -jar build/libs/oa-backend-0.1.0.jar --server.port=8091; admin/123456

== 排除(gitignore, 可再生) ==
node_modules / oa-backend/build / .jdks / *.log / Backup-ERP-* / 弃用的OFBiz核心(只保留modern-ui)
完整文件夹备份见同目录 Backup-ERP-20260615-191517/ (含上述全部, 仅缺 node_modules)

时间戳: 20260615-191517

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Qiufeng
2026-06-15 19:19:15 +08:00
co-authored by Claude Opus 4.8
commit 5e51dc3f56
10584 changed files with 2501339 additions and 0 deletions
@@ -0,0 +1,148 @@
package com.kaidi.oa.domain;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.math.BigDecimal;
import java.time.Instant;
/**
* 融资方案比选(金融办·融资申请与审批流程)。
* 支持对同一融资需求录入多家金融机构的报价,系统自动计算简化 IRR(综合成本率),
* 辅助财务人员择优决策。
*
* 状态:待比选 → 已推荐 → 已选定 → 已驳回。
* status=已选定 时,系统自动用 selectedSchemeId 回写 Financing 台账的 lender/rate/repayMethod。
*/
@Entity
@Table(name = "pmt_loan_scheme")
public class PmtLoanScheme {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/** 关联融资台账 idpmt_loan_scheme 属于某次融资需求下的比选方案之一)。 */
private Long financingId;
/** 融资台账编号(冗余)。 */
private String financingCode;
/** 报价机构名称(银行/租赁公司名)。 */
private String institution;
/** 融资品种:银行贷款 / 融资租赁 / 债券 / 票据 / 其他。 */
private String loanType;
/** 拟融资金额(元)。 */
private BigDecimal amount = BigDecimal.ZERO;
/** 年化利率(百分比,如 4.35 表示 4.35%)。 */
private Double annualRate;
/** 期限(月)。 */
private Integer termMonths;
/** 还款方式:等额本息 / 等额本金 / 到期一次还本付息 / 按期付息到期还本。 */
private String repayMethod;
/** 手续费(一次性)。 */
private BigDecimal handlingFee = BigDecimal.ZERO;
/** 担保方式:信用贷 / 抵押 / 质押 / 保证 / 组合担保。 */
private String guaranteeType;
/** 担保费率(年化,百分比)。 */
private Double guaranteeRate;
/** 提款条件(文字描述)。 */
private String drawdownConditions;
/**
* 系统自动计算的综合成本率(利息+费用+担保成本之和/本金,IRR 简化口径,百分比)。
* 创建/更新时服务端根据 rate+费用+担保自动回填。
*/
private Double effectiveCostRate;
/** 综合排名(越小越优,由 /rank 端点服务端按综合成本排序后写入)。 */
private Integer rank;
/** 是否已推荐(比选后 owner 标注的首选方案)。 */
private Boolean recommended = false;
/** 经办人。 */
private String owner;
/** 状态:待比选 / 已推荐 / 已选定 / 已驳回。 */
private String status;
/** 备注(机构具体条款说明)。 */
private String remark;
private Instant createdAt;
// ---------- getters/setters ----------
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public Long getFinancingId() { return financingId; }
public void setFinancingId(Long financingId) { this.financingId = financingId; }
public String getFinancingCode() { return financingCode; }
public void setFinancingCode(String financingCode) { this.financingCode = financingCode; }
public String getInstitution() { return institution; }
public void setInstitution(String institution) { this.institution = institution; }
public String getLoanType() { return loanType; }
public void setLoanType(String loanType) { this.loanType = loanType; }
public BigDecimal getAmount() { return amount; }
public void setAmount(BigDecimal amount) { this.amount = amount; }
public Double getAnnualRate() { return annualRate; }
public void setAnnualRate(Double annualRate) { this.annualRate = annualRate; }
public Integer getTermMonths() { return termMonths; }
public void setTermMonths(Integer termMonths) { this.termMonths = termMonths; }
public String getRepayMethod() { return repayMethod; }
public void setRepayMethod(String repayMethod) { this.repayMethod = repayMethod; }
public BigDecimal getHandlingFee() { return handlingFee; }
public void setHandlingFee(BigDecimal handlingFee) { this.handlingFee = handlingFee; }
public String getGuaranteeType() { return guaranteeType; }
public void setGuaranteeType(String guaranteeType) { this.guaranteeType = guaranteeType; }
public Double getGuaranteeRate() { return guaranteeRate; }
public void setGuaranteeRate(Double guaranteeRate) { this.guaranteeRate = guaranteeRate; }
public String getDrawdownConditions() { return drawdownConditions; }
public void setDrawdownConditions(String drawdownConditions) { this.drawdownConditions = drawdownConditions; }
public Double getEffectiveCostRate() { return effectiveCostRate; }
public void setEffectiveCostRate(Double effectiveCostRate) { this.effectiveCostRate = effectiveCostRate; }
public Integer getRank() { return rank; }
public void setRank(Integer rank) { this.rank = rank; }
public Boolean getRecommended() { return recommended; }
public void setRecommended(Boolean recommended) { this.recommended = recommended; }
public String getOwner() { return owner; }
public void setOwner(String owner) { this.owner = owner; }
public String getStatus() { return status; }
public void setStatus(String status) { this.status = status; }
public String getRemark() { return remark; }
public void setRemark(String remark) { this.remark = remark; }
public Instant getCreatedAt() { return createdAt; }
public void setCreatedAt(Instant createdAt) { this.createdAt = createdAt; }
}