218 lines
5.6 KiB
Markdown
218 lines
5.6 KiB
Markdown
# validation-handler 重构说明
|
||
|
||
本文档记录 `src/main/ipc/validation-handler.ts` 的第一阶段重构工作,目标是把“超大 IPC Handler”拆回到更清晰的职责边界中,同时保持对外 IPC 协议和业务行为不变。
|
||
|
||
## 1. 重构背景
|
||
|
||
重构前,`validation-handler.ts` 同时承担了以下职责:
|
||
|
||
- IPC 通道注册
|
||
- 跨页面共享 `Production ID` 状态
|
||
- 数据库连接创建与释放
|
||
- MySQL / SQL Server 方言分支
|
||
- 输入识别与订单号解析
|
||
- 物料校验结果组装
|
||
- Cleaner 执行前数据准备
|
||
- 物料查询与富化
|
||
|
||
这种结构的主要问题是:
|
||
|
||
- 文件过大,理解成本高
|
||
- 数据库和业务规则直接堆叠在 IPC 层
|
||
- 复用困难,后续其他模块无法直接复用这些逻辑
|
||
- 单元测试难以细粒度编写
|
||
|
||
## 2. 重构目标
|
||
|
||
本次重构聚焦在“职责下沉、行为不变”:
|
||
|
||
- 保留原有 IPC channel 和返回结构
|
||
- 将共享状态、数据库工厂、输入解析、验证业务流程拆出
|
||
- 让 `validation-handler.ts` 回归为薄 IPC 壳层
|
||
- 为后续继续拆 `cleaner-handler`、前端校验流程提供复用基础
|
||
|
||
## 3. 重构后结构
|
||
|
||
```mermaid
|
||
graph TD
|
||
Renderer[Renderer / Preload]
|
||
Handler[validation-handler.ts]
|
||
|
||
subgraph ValidationServices[Validation Services]
|
||
Store[shared-production-ids-store.ts]
|
||
DbFactory[validation-database.ts]
|
||
InputSvc[production-input-service.ts]
|
||
AppSvc[validation-application-service.ts]
|
||
end
|
||
|
||
subgraph ExistingServices[Existing Services]
|
||
MaterialsDAO[MaterialsToBeDeletedDAO]
|
||
PlanDAO[DiscreteMaterialPlanDAO]
|
||
Session[SessionManager]
|
||
end
|
||
|
||
Renderer --> Handler
|
||
Handler --> Session
|
||
Handler --> Store
|
||
Handler --> AppSvc
|
||
Handler --> MaterialsDAO
|
||
|
||
AppSvc --> Store
|
||
AppSvc --> DbFactory
|
||
AppSvc --> InputSvc
|
||
AppSvc --> MaterialsDAO
|
||
AppSvc --> PlanDAO
|
||
```
|
||
|
||
## 4. 新增与调整的文件
|
||
|
||
### 4.1 IPC 薄壳
|
||
|
||
- `src/main/ipc/validation-handler.ts`
|
||
|
||
职责收敛为:
|
||
|
||
- 注册 IPC handler
|
||
- 从 `SessionManager` 读取当前用户
|
||
- 调用应用服务
|
||
- 对简单 DAO 操作做最轻量转发
|
||
|
||
### 4.2 共享状态模块
|
||
|
||
- `src/main/services/validation/shared-production-ids-store.ts`
|
||
|
||
职责:
|
||
|
||
- 管理按 `senderId` 隔离的共享 `Production IDs`
|
||
- 提供 `set/get/clear`
|
||
|
||
价值:
|
||
|
||
- 将原本散落在 handler 文件顶部的状态提升为独立服务
|
||
- 后续如果要迁移到更持久的 session store,只需替换这一层
|
||
|
||
### 4.3 数据库创建与表名适配
|
||
|
||
- `src/main/services/validation/validation-database.ts`
|
||
|
||
职责:
|
||
|
||
- 创建用于 validation 相关流程的数据库服务
|
||
- 提供 `getValidationTableName()` 做表名方言转换
|
||
|
||
价值:
|
||
|
||
- 收敛 MySQL / SQL Server 的连接逻辑
|
||
- 避免 IPC 文件里反复出现数据库构造代码
|
||
|
||
### 4.4 输入解析服务
|
||
|
||
- `src/main/services/validation/production-input-service.ts`
|
||
|
||
职责:
|
||
|
||
- 读取 Production ID 文件
|
||
- 识别输入是 `production_id`、`order_number` 还是 `unknown`
|
||
- 从输入解析出订单号列表
|
||
|
||
价值:
|
||
|
||
- 把“输入解析规则”变成可复用、可测试的纯业务模块
|
||
|
||
### 4.5 应用服务
|
||
|
||
- `src/main/services/validation/validation-application-service.ts`
|
||
|
||
职责:
|
||
|
||
- 校验流程编排
|
||
- Cleaner 数据准备
|
||
- 物料按负责人查询 / 全量查询的富化逻辑
|
||
- 统一管理数据库生命周期
|
||
|
||
价值:
|
||
|
||
- 形成明确的 application service 层
|
||
- 让后续业务扩展不再从 IPC 文件开刀
|
||
|
||
## 5. 重构前后职责对比
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
subgraph Before[重构前]
|
||
A1[validation-handler.ts]
|
||
A1 --> A2[IPC 注册]
|
||
A1 --> A3[共享状态]
|
||
A1 --> A4[数据库连接]
|
||
A1 --> A5[输入解析]
|
||
A1 --> A6[校验编排]
|
||
A1 --> A7[物料富化]
|
||
A1 --> A8[Cleaner 数据准备]
|
||
end
|
||
|
||
subgraph After[重构后]
|
||
B1[validation-handler.ts]
|
||
B2[shared-production-ids-store.ts]
|
||
B3[validation-database.ts]
|
||
B4[production-input-service.ts]
|
||
B5[validation-application-service.ts]
|
||
|
||
B1 --> B5
|
||
B1 --> B2
|
||
B5 --> B3
|
||
B5 --> B4
|
||
end
|
||
```
|
||
|
||
## 6. 本次保留不变的部分
|
||
|
||
为了控制风险,这次没有修改以下内容:
|
||
|
||
- IPC channel 名称
|
||
- Preload / Renderer 调用方式
|
||
- 物料匹配规则
|
||
- Cleaner 数据准备规则
|
||
- DAO 层的既有 SQL 结构
|
||
|
||
也就是说,这次更像是一次“结构性搬迁”,不是业务规则改造。
|
||
|
||
## 7. 验证方式
|
||
|
||
本次重构完成后,做了以下验证:
|
||
|
||
- `npm run typecheck:node`
|
||
- `tests/unit/shared-production-ids-store.test.ts`
|
||
- `tests/unit/production-input-service.test.ts`
|
||
- 既有 `tests/unit/ipc-index.test.ts`
|
||
|
||
## 8. 新增测试
|
||
|
||
新增测试文件:
|
||
|
||
- `tests/unit/shared-production-ids-store.test.ts`
|
||
- `tests/unit/production-input-service.test.ts`
|
||
|
||
覆盖内容:
|
||
|
||
- sender 隔离存储
|
||
- 去重行为
|
||
- 清空逻辑
|
||
- 输入类型识别
|
||
|
||
## 9. 收益总结
|
||
|
||
这次重构带来的直接收益:
|
||
|
||
- `validation-handler.ts` 不再承担过多业务职责
|
||
- validation 相关逻辑形成了可复用服务层
|
||
- 输入解析与共享状态有了独立测试入口
|
||
- 后续继续拆 `cleaner-handler` 时,可以直接复用订单号解析和 cleaner 数据准备逻辑
|
||
|
||
## 10. 后续建议
|
||
|
||
建议在这个基础上继续推进:
|
||
|
||
1. 将 `validation-application-service.ts` 中的 SQL Server / MySQL 分支继续下沉到 repository 或 dialect adapter。
|
||
2. 逐步给 `getCleanerData()`、`getMaterialsByManager()` 这类编排逻辑补更多单测。
|
||
3. 把和 validation 强耦合的 renderer 逻辑改成显式依赖 application contract,而不是隐式依赖 payload shape。
|