diff --git a/项目文档/多租户死代码清理执行计划.md b/项目文档/多租户死代码清理执行计划.md new file mode 100644 index 00000000..74645370 --- /dev/null +++ b/项目文档/多租户死代码清理执行计划.md @@ -0,0 +1,103 @@ +# 多租户死代码清理执行计划(国联民生独家分支 · 校正版) + +> 分支:`glms/feature/1.4.2` +> 编制:2026-08-15 +> 状态:**计划已查明边界,多处需"部署配置确认"后方可执行删除**。本文件是执行清单,不是批准书。 + +## 0. 最关键的两条纠偏(决定本计划能否落地) + +1. **本分支的"公司"不是编译期硬编码,而是运行期配置。** + `BizLogicSingleton` / `MarginCalculation` 的派发依据是 `PS.Config.Company`,其值来自 **DB `appconfig` 表的 `IErpConfig.ErpElement.Company`**,不是 git 分支。所以"国联独家分支"只表示**当前 GLMS 部署把 Company 配成国联**;理论上同一份代码换 Company 配置即可服务别家。 + → 删除任何"非国联"代码,等于**永久剥夺该部署切换/回退到其它家的能力**。这是业务逻辑决策,不是纯技术清理。 + +2. **真实死活取决于独立开关,不止 Company。** + - **衡泰对接**:不受 Company 门控,由 `HedgingSource`(对冲数据源,衡泰=1)与"接收衡泰修改回执"两个独立开关控制。衡泰模型层 26 文件是否死,取决于 GLMS 部署是否开启这两个开关——**不能一律当死代码删**。 + - **保证金 per-company 计算器**:是否死,取决于 GLMS 把 Company 配成哪家 + 是否走 `UniversalMarginCalculation`(见阶段 1 待确认项)。 + +> ⚠️ 因此本计划所有删除动作前,必须先确认两件事: +> (a) GLMS 生产 `appconfig` 的 `Company` 实际值; +> (b) GLMS 生产是否开启衡泰 `HedgingSource` / 接收回执开关、是否配置浙商等 DataSource。 +> 这两点只能问部署负责人或查生产配置,**grep 代码无法判定**。 + +## 1. 死代码总览(按"确定性"分级) + +| 区域 | 规模 | 确定性 | 死因 | +|---|---|---|---| +| 衡泰模型层 `HengTaiModel/` | 26 文件(实测 1712 行) | **中**——取决于衡泰开关 | `HedgingSource`/回执开关未开则死 | +| 衡泰 DataCompare DTO | 4 文件 | 中 | 同上 | +| 6 处 `using HengTaiModel` 未用 | 6 文件各 1 行 | **高** | 确认未引用任何 HengTai 类型 | +| 保证金 per-company 计算器 | 35 生产文件 ≈17,600 行 + 测试副本 ≈7,000 行 | **中**——取决于 Company 配置 + 是否走 Universal | switch 不含国联→default;Universal 生产无调用 | +| 其他家 BizLogic | 34 文件(含 BizLogicZheShang 等) | 中 | Company 非国联则不可达 | +| 浙商空插件 `Plugins/YLErp.Plugins.ZheShang/` | 目录仅 obj/ | **高**(目录已空) | 无源码/无 csproj/无 sln 引用 | +| 前端"衡泰"JS 引用 | 2 处(etradingRule/etradeAccountList、tradeConfirmBook) | 高 | 衡泰相关 | +| 前端 `Is{券商}` 分支 | 少量(**待核实**,见阶段 3) | 中 | 公司/开关门控 | +| 浙商监管报表 `ExtendReport/ZheShang/` | 2 文件 197 行 | **低**——按 DataSource 派发 | 国联是否配置该 DataSource 未知 | + +> 与"上帝类"的关系:实测 `SwapDealService`/`SwapEodPositionService` 内 **0 个 `Is{券商}` 分支**;全仓 66 个券商分支点泄漏在 `RealtimePnlCalc`/`QuotaMonitorService` 等 EOD/风控文件。→ 删死代码**几乎不缩减上帝类的领域密度**,只降"仓库表面积/误接风险"。上帝类治理见阶段 5(领域 seam 抽取),与本案正交。 + +## 2. 删除前通用检查清单(每文件必做) + +1. `grep -rn "" --include=*.cs` 全仓(含 `Tools/`、`UnitTestProject/`、`YLErpUnitTest/`、`Plugins/`),确认除自身定义 + 派发 switch/工厂外无第二引用。 +2. 若在 `.csproj` 有 `` 显式引用(非 SDK 通配),删文件同步移除该行。 +3. 若被其它**待删死文件**引用,可一并删并在 commit 说明。 +4. 删除后必须编译验证(**本机无 dotnet SDK**,交 CI 或你本地 `dotnet build`)。编译器比 grep 可靠。 + +## 3. 分阶段执行计划 + +### 阶段 0 — 清 6 处衡泰死 import【零风险,可立即做】 +仅删 `using YLErp.Model.HengTaiModel;` 行(已确认未引用任何类型): +- `YLErpWeb/Controllers/riskController.cs:5` +- `YLErpWeb/App/KafkaTask/ClientReskCheckKafkaTask.cs:5` +- `YLErpDAL/Modules/SwapModule/TRSHedgingOrderService.cs:16` +- `YLErpDAL/Modules/SwapModule/SwapConsumerService.cs:12` +- `YLErpDAL/Modules/RiskModule/QuotaMonitorService.cs:37` +- `YLErpDAL/BLL/EodSettlement/RealtimePnlCalc.cs:26` + +### 阶段 1 — 保证金 per-company 计算器【最高体量,但需先确认】 +**待确认(执行前必答):** +- GLMS `appconfig.Company` 实际值是否为 `国联`? +- `MarginCalculation.cs` 的 `default` 分支对国联是否真的走 `DefaultMarginCalculation`?还是团队意图走 `UniversalMarginCalculation`(当前生产无调用,疑似未接线)? +- 若国联本应走 `Universal`,则 `UniversalMarginCalculation` 是**活代码、须保留并接线**,而非死代码。 + +**确认后,若国联走 Default:** +- **保留**:`DefaultMarginCalculation.cs`(19) `MarginCalculation.cs`(803,调度器) `MarginCalculationBase.cs`(374) `MarginCalcHelper.cs`(662,partial base) `MarginCalcRequests.cs`(182) `MarginCalcException.cs`(13) +- **删除**(生产 `YLErpDAL/BLL/MarginCalculation/`): + GTJAMarginCalculation(2718) ChangJiangMarginCalculation(1369) GFSMMarginCalculation(905) GuoXinJinYangMarginCalculation(800) HuaAnMarginCalculation(749) DongZhengRunHeMarginCalculation(697) FDMarginCalculation(674) BHRSMarginCalculation(550) XiangCaiMarginCalculation(545) RDMarginCalculation(541) GDGZMarginCalculation(513) GLDHMarginCalculation(513,`#if DEBUG` 才可达) DongWuMarginCalculation(507)+`DongWu/`子目录(115+258+95+42) HongYuanMarginCalculation(500) GuoTouMarginCalculation(501) XingZhengMarginCalculation(494) HaiTongMarginCalculation(479) XMXYMarginCalculation(422) ZhaoZhengMarginCalculation(389) ZheQiMarginCalculation(409) HongYeMarginCalculation(327) GQMarginCalculation(333) ZhongLiangMarginCalculation(338) BXMarginCalculation(320) MaoChuanMarginCalculation(318) ZhongJinMarginCalculation(294) SYWGMarginCalculation(254) XingYeMarginCalculation(226) ALQHMarginCalculation(191) GuoHaiMarginCalculation(82) SQMarginCalculation(20) ZhongCaiMarginCalculation(20) **UniversalMarginCalculation(139,待确认)** +- **测试副本同步删**:`YLErpUnitTest/Modules/MarginModule/MarginCalculation/` 下所有 per-company 副本 + `UnitTestProject/Modules/CalcModules/MarginCalculationTest.cs` 中 `ZhaoZheng`/`GuoTou` 用例;并移除 `YLErpUnitTest.csproj` 对应 `` 行。 +- 体量:生产 ≈17,600 行 + 测试 ≈7,000 行。**这是唯一同时降死代码 + 类蔓延的动作。** + +### 阶段 2 — 其他家 BizLogic【需 Company 确认】 +- **保留**:`BizLogicDefault.cs`(基类) `BizLogicSingleton.cs`(派发器) `BizLogicException.cs` `IBizLogic.cs` `BizLogicGuoLian.cs`(活) +- **删除 34 个公司类**:`BizLogicALQH BHRS BX DX DZ FD GDGZ GFSM GT Gldh Gtja GXJY GuangQi GuoMao HaiTong HongYe HongYuan HuaAn HuaXi RD ShanXiGuShou SQ Sywg WCZD XiangYu XingYe XingZheng ZJ ZhaoZheng ZL ZheQi ZhongJiShiHua MaoChuan ZheShang` +- 收口:`BizLogicSingleton.cs` switch 精简为仅 `国联`(+default→GuoLian),消除多租户 dispatch 异味。 + +### 阶段 3 — 前端 + 浙商插件/报表【中风险,需核实】 +- **前端衡泰(高确定)**:`wwwroot/Scripts/app/etradingRule/etradeAccountList.js` + `tradeConfirmBook.js` 中"衡泰"引用删除;`Views/EtradeAccount/Index.cshtml`「衡泰簿记账户」整块删(确认无其它活内容)。 +- **前端 `Is{券商}` 分支(待核实)**:计划初稿列的 `eodExecV2.cshtml:14/67/134`、`TradeMarketReport_Collateral.cshtml:413` 等,**需先 grep 确认是 `CompanyEnum` 还是 `Is浙商`/`Is国元固收` 等开关**,再决定删法。前端实际券商分支极少。 +- **浙商空插件(高确定)**:`Plugins/YLErp.Plugins.ZheShang/` 整目录删(已空,无 sln/csproj 引用;删前 grep 确认)。 +- **浙商报表(低确定)**:`ExtendReport/ZheShang/` 按 **DataSource** 派发,国联是否配置该 DataSource 未知 → **先查生产菜单/配置确认不可达再删**。同类 `DongWu/GeLin/ZheQi` 报表同理。 + +### 阶段 4 — 衡泰模型层【中风险,需开关确认】 +- 仅当确认 GLMS **未开启** `HedgingSource=衡泰` 与"接收衡泰修改回执"开关时,才删 `HengTaiModel/`(26 文件) + `DataCompare/Dto/`(4 文件)。否则保留。 +- 删除前先确认 `DataCompare` 模块整体是否还有非衡泰调用方。 + +### 阶段 5(独立轨道,不在本计划执行)— 上帝类 seam 抽取 +`SwapDealService`/`SwapEodPositionService` 瘦身**不靠删文件**,按 `互换模块独立化最终方案.md` + `互换模块可测性改造Seam实践指南.md` 做领域 seam 抽取;并优先把泄漏在 `RealtimePnlCalc`/`QuotaMonitorService` 的 66 个 `Is{券商}` 分支收回 `BizLogic` 子类。与阶段 0–4 解耦、可并行。 + +## 4. 风险与回滚 +- **编译验证硬门槛**:本机无 SDK,每阶段交 CI 编译通过;错误几乎都来自漏删引用或误删共享基础设施(`MarginCalculationBase`/`MarginCalcHelper`/`MarginCalcRequests`/`MarginCalcException` 务必保留)。 +- **业务决策风险**:删非国联代码 = 永久丧失该部署切换/回退能力。必须业务/架构负责人拍板,不可技术单方面决定。 +- **报表 DataSource 误判**:阶段 3C 须运行时确认。 +- 每阶段独立 commit(`git rm`),便于单阶段回退。 + +## 5. 预估收益(删除全部确认项后) +| 阶段 | 删除行数(估) | 风险 | 类型 | +|---|---|---|---| +| 0 衡泰死 import | 6 行 | 零 | 纯死代码 | +| 1 保证金 | ≈17,600 生产 +7,000 测试 | 低(确认后) | 死代码 + 类蔓延 | +| 2 BizLogic | 34 文件 ≈3,000+ 行 | 低(确认后) | 多租户残留 | +| 3 前端/插件/报表 | 数百行 + 空目录 | 中 | 公司/开关门控 | +| 4 衡泰模型 | 26+4 文件 ≈1,700 行 | 中(开关确认后) | 供应商集成 | +| **合计** | **≈ 29,000+ 行** | — | — | + +> 结论给用户:清死代码是 hygiene 末道工序,能显著降表面积与误接风险,但**不是**上帝类的最佳方向;上帝类最佳方向仍是领域 seam 抽取 + 收回泄漏的券商分支。删前须先确认 GLMS 部署的 Company 值与衡泰/浙商开关。