Skip to content
bitzorcas
中EN

Concept

Industry Extensions 行业计算类库

源码与官方法源双重校验的 Industry Extensions 总览,讲清 Finance、HR、Auction 三个纯计算程序集、运行时缺席、硬编码政策、舍入与日期边界,以及商业 GA 所需的规则版本治理。

Last updated

Industry Extensions 由 Finance、HR、Auction 三个可选 .NET 类库组成。它们提供无 I/O 的静态计算方法与稳定 Error,却不是已接入 API Host 的业务模块:没有 Endpoint、DI、权限、Feature、持久化、租户上下文、配置中心或自动化测试。

1. 三个程序集

程序集公开能力依赖
Finance分档引擎、个税、房贷、民间借贷、违约金Domain
HR年假/婚假/产假/陪产假/丧假/医疗期、LeavePolicyScheduleDomain
Auction默认/自定义分档佣金、固定比例佣金Domain + Finance

Finance 还被 LegalCalculators 引用,用于复用 TaxBracket 和分档计算。这意味着 Finance 并非只由行业 Profile 显式选择;它已经是 LegalCalculators 的编译时传递依赖。

2. 真实运行边界

无 ProjectReference /无端点

消费程序集

Finance
纯静态计算器

HR
纯静态计算器

Auction
佣金计算

Domain
Result · Error · ValueObject

LegalCalculators
复用 TaxBracket

API Host

三个项目在 Solution 中,但 API Host 没有引用。治理 marker 被寄宿在 BitzOrcas.Platform.Application,因此 Registry 可显示 IndustryExtensions 模块身份,即使 Finance/HR/Auction 程序集并未加载。运营页必须区分“目录声明存在”和“计算能力可调用”。

3. 公开计算器

计算器当前场景
BracketTaxCalculator速算公式、超额累进
IncomeTaxCalculator综合所得、劳务报酬预扣、全年一次性奖金
MortgageCalculator等额本息/等额本金金额、利息、计划
LoanDetailCalculatorLPR 四倍、单期/分段利息、还款抵扣、复利上限
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. 法源核对摘要

外链用于说明为什么规则必须版本化;运行时不能联网抓法条替代经过审核的规则发布流程。

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. 章节路线

12. 商业 GA 红线

  1. 每次结果绑定 Jurisdiction、PolicyId/Version、EffectiveFrom/To 与 SourceHash;
  2. 所有法源、地区和时间条件由审核后的规则仓提供,不再由静态类隐式决定;
  3. 计算返回逐步 breakdown、输入快照、舍入与日期约定;
  4. 修正 Auction 5% 过宽限制、Penalty 130% 机械建议和 HR 月份折算;
  5. 修正 InterestSegment 包含性合同并验证顺序、重叠、缺口;
  6. 为 Bracket、Mortgage、LeavePolicy 增加严格输入/容量上限;
  7. API wrapper 负责权限、租户、隐私、审计、幂等和用途限制;
  8. 法规变化触发 ingest-review-approve-publish-supersede 工作流;
  9. 黄金用例、属性测试、边界测试、交叉实现与专家签署齐备;
  10. 当前零自动化测试状态必须在任何生产消费前归零。

13. 源码导航

Terminal window
# 公开计算器、记录与错误目录。
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'

返回模块目录 · Legal Calculators · I18n

100%

滚轮或按钮缩放 · 放大后拖动画面 · 双击切换 100% / 200%