# 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。
