Industry Extensions 由 Finance、HR、Auction 三个可选 .NET 类库组成。它们提供无 I/O 的静态计算方法与稳定 Error,却不是已接入 API Host 的业务模块:没有 Endpoint、DI、权限、Feature、持久化、租户上下文、配置中心或自动化测试。
1. 三个程序集
| 程序集 | 公开能力 | 依赖 |
|---|---|---|
| Finance | 分档引擎、个税、房贷、民间借贷、违约金 | Domain |
| HR | 年假/婚假/产假/陪产假/丧假/医疗期、LeavePolicySchedule | Domain |
| Auction | 默认/自定义分档佣金、固定比例佣金 | Domain + Finance |
Finance 还被 LegalCalculators 引用,用于复用 TaxBracket 和分档计算。这意味着 Finance 并非只由行业 Profile 显式选择;它已经是 LegalCalculators 的编译时传递依赖。
2. 真实运行边界
三个项目在 Solution 中,但 API Host 没有引用。治理 marker 被寄宿在 BitzOrcas.Platform.Application,因此 Registry 可显示 IndustryExtensions 模块身份,即使 Finance/HR/Auction 程序集并未加载。运营页必须区分“目录声明存在”和“计算能力可调用”。
3. 公开计算器
| 计算器 | 当前场景 |
|---|---|
BracketTaxCalculator | 速算公式、超额累进 |
IncomeTaxCalculator | 综合所得、劳务报酬预扣、全年一次性奖金 |
MortgageCalculator | 等额本息/等额本金金额、利息、计划 |
LoanDetailCalculator | LPR 四倍、单期/分段利息、还款抵扣、复利上限 |
PenaltyCalculator | 约定/按日/LPR 参考、130% 调整建议 |
LeaveCalculator | 年假、折算、婚产陪产丧假、医疗期 |
AuctionCommissionCalculator | 默认分档、自定义分档、固定比例 |
它们是类型级 API,不是 CQRS Use Case。旧页提到“请求契约、Handler、提交后事件、缓存和审计”均不适用于当前实现。
4. Finance 最小用法
// 调用方先确认纳税年度、居民身份、适用管辖区和政策版本。var taxableIncome = annualIncome - basicDeduction - socialInsuranceDeduction - specialAdditionalDeduction;
// 当前方法只接收 decimal,不记录上述证据,也不返回分档明细。var tax = IncomeTaxCalculator.CalcIndividualIncomeTax(taxableIncome);
// Error 含稳定 code;成功值按 AwayFromZero 保留两位。if (tax.IsFailure) return tax.Error;return tax.Value;综合所得七档与官方税率表一致,但类库没有 TaxYear。全年一次性奖金单独计税政策按现行公告延续到 2027-12-31;未来继续、调整或终止时,硬编码方法不会自动失效。
5. HR 最小用法
// 预置政策只是参考快照;生产系统应从已审核版本仓读取。var policy = LeavePolicies.Guangdong;
// 当前算法统一把难产增加 15 天;地方规则若不同,Schedule 无字段表达。var days = LeaveCalculator.CalcMaternityDays( schedule: policy, isDifficultLabor: true, multipleBirthCount: 1);
// 保存结果时必须同时保存 policy version/source,而不是只保存天数。if (days.IsFailure) return days.Error;return days.Value;截至 2026 年可查的广东实施办法对难产增加天数已有不同规则,说明仅用 MaternityDays + 固定15 无法完整表达地方政策。预置 EffectiveFrom 又默认取进程当天,不是法源真实生效日。
6. Auction 最小用法
// 合同约定、拍卖类型和佣金承担方必须由上层业务先确认。var result = AuctionCommissionCalculator.CalcCommissionByRate( hammerPrice: 2_500_000m, commissionRate: 0.03m);
// 当前方法对任何超过 5% 的约定都返回 Validation,未区分《拍卖法》场景。if (result.IsFailure) return result.Error;
// 返回值只是单方佣金金额,不含委托人/买受人、税费或合同明细。return result.Value;《拍卖法》第五十六条允许当事人与拍卖人约定佣金;未约定时双方各不超过成交价 5%,第五十七条另管第九条物品。当前固定比例 API 把 5% 当统一硬上限,语义过宽。
7. 法源核对摘要
- 国家税务总局:全年一次性奖金公告 明确政策执行至 2027-12-31;
- 最高人民法院:民间借贷司法解释 使用合同成立时一年期 LPR 四倍并区分历史合同;
- 最高人民法院:民法典合同编通则解释 将 30% 作为“一般可以认定”,并要求综合多因素衡量;
- 人社部:企业职工带薪年休假实施办法 使用剩余/已过日历天数,不是月份÷12;
- 国家行政法规库:女职工劳动保护特别规定 规定国家基础产假与难产/多胞胎;
- 商务部:拍卖法 区分约定、未约定和特定物品佣金。
外链用于说明为什么规则必须版本化;运行时不能联网抓法条替代经过审核的规则发布流程。
8. 确定性并不等于可复现
给定同一输入,大多数方法是纯函数。但“同一业务事实”无法重放,因为输入没有 PolicyId/Version、TaxYear、ContractDate、Jurisdiction、DayCountConvention 或 RoundingPolicy。LeavePolicies 的 EffectiveFrom 还取 DateTime.Today,跨日期进程生成不同值对象。
商业结果至少要保存:规范化事实、规则版本与 hash、法源引用、生效区间、计算时间、舍入策略、逐步明细和操作者/审批证据。
9. 数值与日期边界
所有金额使用 decimal,大部分终值按 MidpointRounding.AwayFromZero 保留两位,这是良好基础。但 BracketTaxCalculator 返回未舍入 decimal,Schedule 又逐月舍入;不同 API 的总利息可能因中间舍入不同而不完全相等。
InterestSegment XML 称起止日都“含”,实现却用 EndDate.Date - StartDate.Date,实际上不含结束日。分段不校验排序、重叠或缺口;反向/同日段被静默跳过。
10. 当前验证不足
通用 Bracket 引擎不验证上限升序、最后一档、费率、速算扣除数或重复区间。LeavePolicy 只验证 tier 下限严格升序和假期天数非负,不验证 tier 的 MinWorkYears/Days 非负。Mortgage 的 years×12、decimal 幂和巨大 Schedule 没有上界。
所有 Error 描述硬编码中文,没有 I18n key 映射示例。部分辅助 API 直接返回 decimal,如 PenaltyToLossRatio,对负输入也不返回 Result。
11. 章节路线
- 打包、治理与运行时边界:可选程序集、依赖方向、Registry 幻象、消费集成和安全 wrapper;
- Finance 计算器:税、房贷、民间借贷、违约金、分档与数值合同;
- HR 休假政策:预置地区、法定基线、折算、日期、政策版本和变更;
- Auction、测试、运维与 GA:佣金法源、验证、黄金用例、影子计算、审计和发布门禁。
12. 商业 GA 红线
- 每次结果绑定 Jurisdiction、PolicyId/Version、EffectiveFrom/To 与 SourceHash;
- 所有法源、地区和时间条件由审核后的规则仓提供,不再由静态类隐式决定;
- 计算返回逐步 breakdown、输入快照、舍入与日期约定;
- 修正 Auction 5% 过宽限制、Penalty 130% 机械建议和 HR 月份折算;
- 修正 InterestSegment 包含性合同并验证顺序、重叠、缺口;
- 为 Bracket、Mortgage、LeavePolicy 增加严格输入/容量上限;
- API wrapper 负责权限、租户、隐私、审计、幂等和用途限制;
- 法规变化触发 ingest-review-approve-publish-supersede 工作流;
- 黄金用例、属性测试、边界测试、交叉实现与专家签署齐备;
- 当前零自动化测试状态必须在任何生产消费前归零。
13. 源码导航
# 公开计算器、记录与错误目录。rg -n "^public (static |sealed )?(class|record)|public static (Result|decimal|int)" \ src/Platform/IndustryExtensions -g '*.cs'
# 证明三个包未由 API Host 引用,Finance 只被 Auction 与 LegalCalculators 复用。rg -n "IndustryExtensions" src/Hosts src/Platform -g '*.csproj' -g '*.cs'
# Policy 版本、法源 hash、测试和端点当前预期无完整实现。rg -n "PolicyVersion|SourceHash|EffectiveTo|GenerateEndpoint|\[Fact\]" \ src/Platform/IndustryExtensions tests -g '*.cs'