Files
zszq-trs/项目文档/多租户死代码清理执行计划.md
hjhan 9d91134789 docs(cleanup): 新增多租户死代码清理执行计划
- 量化衡泰对接/保证金其他家分支/其他家BizLogic/浙商定制/前端公司分支的死代码规模与门控方式
- 明确零风险清理 vs 需确认 GLMS 部署开关的中风险项(衡泰 HedgingSource/接回执开关、监管报表 DataSource 门控)
- 给出分阶段执行顺序与删除前编译验证 checklist
2026-08-15 10:49:40 +08:00

10 KiB
Raw Permalink Blame History

多租户死代码清理执行计划(国联民生独家分支 · 校正版)

分支: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 生产 appconfigCompany 实际值; (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 不含国联→defaultUniversal 生产无调用
其他家 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/SwapEodPositionService0 个 Is{券商} 分支;全仓 66 个券商分支点泄漏在 RealtimePnlCalc/QuotaMonitorService 等 EOD/风控文件。→ 删死代码几乎不缩减上帝类的领域密度,只降"仓库表面积/误接风险"。上帝类治理见阶段 5(领域 seam 抽取),与本案正交。

2. 删除前通用检查清单(每文件必做)

  1. grep -rn "<TypeName>" --include=*.cs 全仓(含 Tools/UnitTestProject/YLErpUnitTest/Plugins/),确认除自身定义 + 派发 switch/工厂外无第二引用。
  2. 若在 .csproj<Compile Include=...> 显式引用(非 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.csdefault 分支对国联是否真的走 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.csZhaoZheng/GuoTou 用例;并移除 YLErpUnitTest.csproj 对应 <Compile Include> 行。
  • 体量:生产 ≈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/134TradeMarketReport_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 子类。与阶段 04 解耦、可并行。

4. 风险与回滚

  • 编译验证硬门槛:本机无 SDK,每阶段交 CI 编译通过;错误几乎都来自漏删引用或误删共享基础设施(MarginCalculationBase/MarginCalcHelper/MarginCalcRequests/MarginCalcException 务必保留)。
  • 业务决策风险:删非国联代码 = 永久丧失该部署切换/回退能力。必须业务/架构负责人拍板,不可技术单方面决定。
  • 报表 DataSource 误判:阶段 3C 须运行时确认。
  • 每阶段独立 commitgit 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 值与衡泰/浙商开关。