diff --git a/docs/developer/modules/auth.md b/docs/developer/modules/auth.md new file mode 100644 index 0000000..1782daa --- /dev/null +++ b/docs/developer/modules/auth.md @@ -0,0 +1,119 @@ +# Auth 模块 + +`Auth` 模块负责桌面端用户认证、silent login、管理员代切用户,以及把用户上下文同步给更新等后续模块。 + +## 1. 模块职责 + +- 获取机器名 +- 执行 silent login +- 用户名密码登录 +- 管理员查看用户列表并切换用户 +- 登出并清理会话 +- 同步当前用户类型到更新模块 + +## 2. 模块结构 + +```mermaid +graph TD + App[useAppBootstrap] + Preload[preload.auth] + Handler[auth-handler] + AppSvc[auth-application-service] + Session[session-manager] + Update[update-service] + + App --> Preload + Preload --> Handler + Handler --> AppSvc + AppSvc --> Session + AppSvc --> Update +``` + +## 3. 关键入口文件 + +- `src/renderer/src/hooks/useAppBootstrap.ts` +- `src/renderer/src/components/app/UnauthenticatedApp.tsx` +- `src/main/ipc/auth-handler.ts` +- `src/main/services/auth/auth-application-service.ts` +- `src/main/services/user/session-manager.ts` + +## 4. 认证主流程 + +```mermaid +sequenceDiagram + participant App as useAppBootstrap + participant Preload as preload.auth + participant Handler as auth-handler + participant AppSvc as auth-application-service + participant Session as session-manager + + App->>Preload: getComputerName() + App->>Preload: silentLogin() + Preload->>Handler: invoke + Handler->>AppSvc: silentLogin() + AppSvc->>Session: loginByComputerName() + Session-->>AppSvc: userInfo + AppSvc-->>Handler: login result + Handler-->>Preload: IpcResult + Preload-->>App: auth state +``` + +## 5. 管理员分支 + +如果 silent login 或显式登录得到的是管理员账号,认证流程不会直接结束,而是进入“代切用户”分支。 + +```mermaid +flowchart TD + Login[登录成功] + Admin{是否 Admin} + Select[getAllUsers] + Switch[switchUser] + Authenticated[进入已认证态] + + Login --> Admin + Admin -- 否 --> Authenticated + Admin -- 是 --> Select + Select --> Switch + Switch --> Authenticated +``` + +## 6. 与更新模块的关系 + +Auth 模块和 Update 模块之间有明确联动: + +```mermaid +graph LR + Auth[AuthApplicationService] + UserType[UserType] + Update[UpdateService] + + Auth --> UserType + UserType --> Update +``` + +在以下时机会同步用户上下文: + +- silent login 成功 +- 显式登录成功 +- 用户切换成功 +- logout + +## 7. 最近的结构优化 + +Auth 相关逻辑最近做过两项关键收敛: + +- 把编排逻辑从 `auth-handler` 下沉到 `auth-application-service` +- 在 `silentLogin()` 中加入并发去重,避免重复 silent login 触发连接风暴 + +## 8. 常见改动点 + +- 改前端启动认证:`useAppBootstrap.ts` +- 改登录与切换流程:`auth-application-service.ts` +- 改会话层:`session-manager.ts` +- 改 IPC 契约:`auth-handler.ts` + +## 9. 修改建议 + +- 页面不要直接堆认证细节,优先继续收敛到 bootstrap hook +- 用户上下文变化时,记得考虑 update 状态是否需要同步 +- silent login 流程不要破坏当前的防重入保护 diff --git a/docs/developer/modules/cleaner.md b/docs/developer/modules/cleaner.md new file mode 100644 index 0000000..4e9c324 --- /dev/null +++ b/docs/developer/modules/cleaner.md @@ -0,0 +1,197 @@ +# Cleaner 模块 + +`Cleaner` 模块负责物料校验结果的展示、筛选、负责人分配、删除计划保存,以及最终 ERP 清理执行与报告展示。 + +## 1. 模块职责 + +- 展示校验后的物料列表 +- 负责人筛选与内联编辑 +- 勾选待处理物料 +- 保存删除计划到数据库 +- 执行 ERP 清理 +- 展示执行进度和执行报告 + +## 2. 模块结构 + +```mermaid +graph TD + Page[CleanerPage] + Hook[useCleaner] + Sidebar[CleanerSidebar] + Toolbar[CleanerToolbar] + Table[CleanerResultsTable] + Bar[CleanerExecutionBar] + Helpers[hooks/cleaner/helpers.ts] + API[hooks/cleaner/api.ts] + Preload[preload.cleaner / validation / materials] + Handler[cleaner-handler / validation-handler] + MainSvc[cleaner-application-service] + + Page --> Hook + Page --> Sidebar + Page --> Toolbar + Page --> Table + Page --> Bar + Hook --> Helpers + Hook --> API + API --> Preload + Preload --> Handler + Handler --> MainSvc +``` + +## 3. 关键入口文件 + +- `src/renderer/src/pages/CleanerPage.tsx` +- `src/renderer/src/hooks/useCleaner.ts` +- `src/renderer/src/hooks/cleaner/api.ts` +- `src/renderer/src/hooks/cleaner/helpers.ts` +- `src/renderer/src/components/cleaner/CleanerSidebar.tsx` +- `src/renderer/src/components/cleaner/CleanerToolbar.tsx` +- `src/renderer/src/components/cleaner/CleanerResultsTable.tsx` +- `src/renderer/src/components/cleaner/CleanerExecutionBar.tsx` +- `src/main/ipc/cleaner-handler.ts` +- `src/main/services/cleaner/cleaner-application-service.ts` + +## 4. 页面主流程 + +```mermaid +flowchart TD + Load[页面初始化] + Validate[获取并校验物料] + Results[validationResults] + Filter[筛选与隐藏] + Select[勾选与负责人编辑] + Plan[保存删除计划] + Execute[执行 ERP 清理] + Report[执行报告 / 查看报告] + + Load --> Validate + Validate --> Results + Results --> Filter + Results --> Select + Select --> Plan + Plan --> Execute + Execute --> Report +``` + +## 5. 前端状态组织 + +当前 `useCleaner` 管理的主要状态包括: + +- 页面初始化与权限 +- 校验结果与筛选结果 +- 勾选状态与隐藏状态 +- 负责人编辑状态 +- 执行设置 +- 进度状态 +- 报告弹窗状态 +- 确认弹窗状态 + +可以理解成: + +```mermaid +mindmap + root((useCleaner)) + 权限与初始化 + isAdmin + currentUsername + managers + 校验结果 + validationResults + filteredResults + selectedItems + hiddenItems + 执行状态 + isRunning + isExecuting + progress + reportData + 设置 + dryRun + headless + processConcurrency + 交互 + editingCell + confirmDialog + dialogs +``` + +## 6. 主进程执行链路 + +Cleaner 真正执行 ERP 清理时,主进程调用链大致如下: + +```mermaid +sequenceDiagram + participant UI as useCleaner + participant Preload as preload.cleaner + participant Handler as cleaner-handler + participant AppSvc as cleaner-application-service + participant ERP as CleanerService / ErpAuthService + participant Report as report / rustfs + + UI->>Preload: runCleaner(input) + Preload->>Handler: invoke + Handler->>AppSvc: runCleaner(...) + AppSvc->>ERP: 登录并执行清理 + ERP-->>AppSvc: cleaner result + AppSvc->>Report: 生成并上传报告 + AppSvc-->>Handler: result + Handler-->>Preload: IpcResult + Preload-->>UI: 执行结果 +``` + +## 7. 模块边界 + +Cleaner 依赖多个模块: + +```mermaid +graph LR + Cleaner[Cleaner] + Validation[Validation] + Materials[Materials / MaterialType] + Report[Report] + Config[Config] + ERP[ERP Services] + + Cleaner --> Validation + Cleaner --> Materials + Cleaner --> Report + Cleaner --> Config + Cleaner --> ERP +``` + +其中: + +- `validation` + 提供校验结果和 Cleaner 可消费数据 +- `materials` + 提供负责人和删除计划相关能力 +- `report` + 提供报告查看与生成 +- `config` + 提供执行配置 + +## 8. 最近的结构优化 + +这一块近期做过两轮收敛: + +- `CleanerPage` 拆成 `Sidebar / Toolbar / ResultsTable / ExecutionBar` +- `useCleaner` 内部 API / helpers 已经第一轮抽离 + +同时页面中的重型弹窗也已经改成按需加载。 + +## 9. 常见改动点 + +- 改筛选或展示:`CleanerPage.tsx` 与 `components/cleaner/*` +- 改前端执行逻辑:`useCleaner.ts` +- 改校验请求与导出:`hooks/cleaner/api.ts` +- 改纯逻辑:`hooks/cleaner/helpers.ts` +- 改主进程执行:`cleaner-application-service.ts` +- 改 ERP 清理细节:`src/main/services/erp/cleaner.ts` + +## 10. 修改建议 + +- 优先保持页面组件继续做“组装层” +- 如果新增复杂交互,优先下沉到 hook 或 helper +- 执行链路的真实业务逻辑放在主进程 service +- 报告、导出、上传等后处理不要塞回 UI 层 diff --git a/docs/developer/modules/extractor.md b/docs/developer/modules/extractor.md new file mode 100644 index 0000000..60e0b16 --- /dev/null +++ b/docs/developer/modules/extractor.md @@ -0,0 +1,133 @@ +# Extractor 模块 + +`Extractor` 模块负责接收订单号输入、触发提取流程、同步共享订单号,并把提取结果导入后续链路可消费的数据形态。 + +## 1. 模块职责 + +- 接收和持久化订单号输入 +- 将订单号同步为共享 `Production IDs` +- 触发批量提取流程 +- 展示提取进度和日志 +- 为 `Cleaner` 等后续模块提供共享订单号基础 + +## 2. 模块结构 + +```mermaid +graph TD + Page[ExtractorPage] + Input[OrderNumberInput] + Persist[usePersistentTextState] + Shared[useSharedProductionIds] + Hook[useExtractor] + Preload[preload.extractor / validation] + Handler[extractor-handler] + Service[ERP Extractor Service] + + Page --> Input + Page --> Persist + Page --> Shared + Page --> Hook + Hook --> Preload + Preload --> Handler + Handler --> Service +``` + +## 3. 关键入口文件 + +- `src/renderer/src/pages/ExtractorPage.tsx` +- `src/renderer/src/hooks/useExtractor.ts` +- `src/renderer/src/hooks/usePersistentTextState.ts` +- `src/renderer/src/hooks/useSharedProductionIds.ts` +- `src/renderer/src/components/OrderNumberInput.tsx` +- `src/main/ipc/extractor-handler.ts` +- `src/main/services/erp/extractor.ts` + +## 4. 主要流程 + +```mermaid +sequenceDiagram + participant UI as ExtractorPage + participant Persist as usePersistentTextState + participant Shared as useSharedProductionIds + participant Hook as useExtractor + participant Preload as preload.extractor + participant Main as extractor-handler / extractor service + + UI->>Persist: 保存输入 + UI->>Shared: debounce 同步共享 IDs + UI->>Hook: startExtraction(orderNumbers) + Hook->>Preload: setSharedProductionIds() + Hook->>Preload: runExtractor() + Preload->>Main: invoke + Main-->>Preload: 提取结果 + Preload-->>Hook: success / error / progress + Hook-->>UI: 更新日志与状态 +``` + +## 5. 关键状态 + +当前前端侧最重要的状态包括: + +- `orderNumbers` + 用户输入的订单号文本 +- `isRunning` + 是否正在提取 +- `progress` + 当前提取进度 +- `logs` + 提取过程日志 +- `error` + 当前错误 +- `isComplete` + 提取是否结束 + +## 6. 与其他模块的关系 + +Extractor 与其他模块的关系如下: + +```mermaid +graph LR + Extractor[Extractor] + SharedIds[shared Production IDs] + Validation[Validation] + Cleaner[Cleaner] + + Extractor --> SharedIds + SharedIds --> Validation + Validation --> Cleaner +``` + +它最重要的跨模块输出不是页面本身,而是: + +- 共享 `Production IDs` +- 导入数据库的数据 + +## 7. 最近的结构优化 + +最近这一块做过两类收敛: + +- 把订单号持久化抽到 `usePersistentTextState` +- 把共享订单号同步抽到 `useSharedProductionIds` + +这样页面不再自己同时处理: + +- 输入状态 +- `sessionStorage` +- bridge 副作用 + +## 8. 常见改动点 + +如果你要改 Extractor,通常会落在这些位置: + +- 改输入与格式统计:`OrderNumberInput.tsx` +- 改页面交互:`ExtractorPage.tsx` +- 改前端提取编排:`useExtractor.ts` +- 改共享订单号同步:`useSharedProductionIds.ts` +- 改主进程执行:`extractor-handler.ts` / `erp/extractor.ts` + +## 9. 修改建议 + +- 输入变化不要直接叠加更多高频副作用 +- 共享订单号写入尽量维持单一入口 +- 提取日志和进度流优先保持事件推送式结构 +- 如果新增提取后处理,优先放在主进程 service,而不是塞回页面 diff --git a/docs/developer/modules/settings.md b/docs/developer/modules/settings.md new file mode 100644 index 0000000..500adf5 --- /dev/null +++ b/docs/developer/modules/settings.md @@ -0,0 +1,103 @@ +# Settings 模块 + +`Settings` 模块当前主要负责 ERP 登录凭据的查看、编辑和保存,并通过当前用户上下文对配置进行按用户管理。 + +## 1. 模块职责 + +- 加载当前用户的 ERP 配置 +- 编辑 ERP 用户名和密码 +- 保存配置到后端持久化存储 +- 提示保存结果 + +## 2. 模块结构 + +```mermaid +graph TD + Page[SettingsPage] + Preload[preload.settings] + Handler[settings-handler] + Config[Config / User ERP Config Service] + Storage[数据库中的用户配置] + + Page --> Preload + Preload --> Handler + Handler --> Config + Config --> Storage +``` + +## 3. 关键入口文件 + +- `src/renderer/src/pages/SettingsPage.tsx` +- `src/main/ipc/settings-handler.ts` +- `src/main/services/config/config-manager.ts` +- `src/main/services/user/user-erp-config-service.ts` + +## 4. 主流程 + +```mermaid +sequenceDiagram + participant Page as SettingsPage + participant Preload as preload.settings + participant Handler as settings-handler + participant Service as config / user-erp-config-service + + Page->>Preload: getSettings() + Preload->>Handler: invoke + Handler->>Service: load current user config + Service-->>Handler: settings payload + Handler-->>Preload: IpcResult + Preload-->>Page: ERP credentials + + Page->>Preload: saveSettings(payload) + Preload->>Handler: invoke + Handler->>Service: persist config + Service-->>Handler: save result + Handler-->>Preload: IpcResult + Preload-->>Page: success / error +``` + +## 5. 页面状态 + +当前设置页非常轻量,主要状态包括: + +- `credentials` +- `isModified` +- `isLoading` + +```mermaid +flowchart LR + Load[加载配置] + Edit[编辑账号密码] + Dirty[isModified = true] + Save[保存配置] + Success[提示成功] + + Load --> Edit + Edit --> Dirty + Dirty --> Save + Save --> Success +``` + +## 6. 与其他模块的关系 + +Settings 模块与这些模块关系较强: + +- `auth` + 当前用户决定读取和保存哪份 ERP 配置 +- `cleaner` + Cleaner 执行时会读取 ERP 账号密码 +- `extractor` + 提取链路也依赖 ERP 登录能力 + +## 7. 常见改动点 + +- 改页面交互:`SettingsPage.tsx` +- 改 IPC 契约:`settings-handler.ts` +- 改配置存储逻辑:`user-erp-config-service.ts` +- 改全局配置:`config-manager.ts` + +## 8. 修改建议 + +- 保持“页面只编辑当前用户配置”的边界清晰 +- 不要把 ERP 凭据保存逻辑重新分散到多个模块 +- 如果后续扩展更多设置项,建议引入更清晰的分组和局部表单结构 diff --git a/docs/developer/modules/update.md b/docs/developer/modules/update.md new file mode 100644 index 0000000..bb5936f --- /dev/null +++ b/docs/developer/modules/update.md @@ -0,0 +1,153 @@ +# Update 模块 + +`Update` 模块负责应用版本目录拉取、状态广播、更新包下载、安装器启动,以及为不同用户类型生成不同的更新视图。 + +## 1. 模块职责 + +- 检查更新是否可用 +- 拉取更新目录 +- 为 `User` / `Admin` 生成不同的更新决策 +- 下载更新包并校验 +- 启动安装流程 +- 广播更新状态给 renderer + +## 2. 模块结构 + +```mermaid +graph TD + Hook[useAppBootstrap] + Dialog[UpdateDialog / useUpdateDialogState] + Preload[preload.update] + Handler[update-handler] + Service[UpdateService] + Catalog[UpdateCatalogService] + Installer[UpdateInstaller] + Storage[UpdateStorageClient] + Publisher[UpdateStatusPublisher] + + Hook --> Preload + Dialog --> Preload + Preload --> Handler + Handler --> Service + Service --> Catalog + Service --> Installer + Service --> Storage + Service --> Publisher +``` + +## 3. 关键入口文件 + +- `src/renderer/src/hooks/useAppBootstrap.ts` +- `src/renderer/src/components/UpdateDialog.tsx` +- `src/renderer/src/hooks/useUpdateDialogState.ts` +- `src/main/ipc/update-handler.ts` +- `src/main/services/update/update-service.ts` +- `src/main/services/update/update-catalog-service.ts` +- `src/main/services/update/update-installer.ts` +- `src/main/services/update/update-storage-client.ts` +- `src/main/services/update/update-status-publisher.ts` + +## 4. 更新数据流 + +```mermaid +sequenceDiagram + participant Hook as useAppBootstrap + participant Dialog as useUpdateDialogState + participant Preload as preload.update + participant Handler as update-handler + participant Service as UpdateService + participant Catalog as UpdateCatalogService + + Hook->>Preload: getStatus() + Hook->>Preload: getCatalog() + Dialog->>Preload: getChangelog(release) + Preload->>Handler: invoke + Handler->>Service: getStatus / getCatalog / getChangelog + Service->>Catalog: resolve dialog catalog + Catalog-->>Service: release decisions + Service-->>Handler: update data + Handler-->>Preload: IpcResult + Preload-->>Hook: status / catalog + Preload-->>Dialog: changelog +``` + +## 5. 状态模型 + +更新模块当前最核心的是 `UpdateStatus`: + +```mermaid +stateDiagram-v2 + [*] --> idle + idle --> checking + checking --> available + checking --> downloaded + checking --> error + available --> downloading + downloading --> downloaded + downloading --> error + downloaded --> installing + installing --> [*] +``` + +同时 `UpdateDialogCatalog` 会根据用户角色形成不同视图: + +- `user` +- `admin` +- `disabled` + +## 6. 用户与管理员差异 + +```mermaid +flowchart TD + Context[当前用户类型] + User[User] + Admin[Admin] + UserCatalog[推荐稳定版] + AdminCatalog[Stable + Preview 目录] + + Context --> User + Context --> Admin + User --> UserCatalog + Admin --> AdminCatalog +``` + +普通用户主要消费: + +- 推荐版本 +- 已下载版本 +- 安装动作 + +管理员主要消费: + +- 完整版本目录 +- Stable / Preview 版本切换 +- 手动下载并安装 + +## 7. 最近的结构优化 + +Update 模块已经做过多轮职责拆分: + +- 版本目录决策拆到 `update-catalog-service` +- 下载与安装拆到 `update-installer` +- 状态广播拆到 `update-status-publisher` +- 对象存储访问拆到 `update-storage-client` + +同时前端侧: + +- `useUpdateDialogState` 收敛了选中版本和 changelog 状态 +- `UpdateDialog` 已改成按需加载 + +## 8. 常见改动点 + +- 改 renderer 状态流:`useAppBootstrap.ts` / `useUpdateDialogState.ts` +- 改弹窗展示:`UpdateDialog.tsx` +- 改更新检查与轮询:`update-service.ts` +- 改版本决策:`update-catalog-service.ts` +- 改安装流程:`update-installer.ts` + +## 9. 修改建议 + +- 更新决策逻辑优先放在 main service,不要回流到 renderer +- changelog、catalog、status 要保持边界清晰 +- 用户类型变化时要考虑 status/catalog 的复位逻辑 +- 如果新增发布通道,优先扩展 catalog service diff --git a/docs/developer/modules/validation.md b/docs/developer/modules/validation.md new file mode 100644 index 0000000..d48bea3 --- /dev/null +++ b/docs/developer/modules/validation.md @@ -0,0 +1,147 @@ +# Validation 模块 + +`Validation` 模块负责共享订单号管理、输入识别、数据库校验查询、物料结果富化,以及为 Cleaner 提供可消费的数据。 + +## 1. 模块职责 + +- 存储与读取共享 `Production IDs` +- 将输入转换为可校验的 source numbers +- 查询数据库中的物料记录 +- 结合类型关键词和已标记物料生成校验结果 +- 为 Cleaner 提供订单号与物料代码 + +## 2. 模块结构 + +```mermaid +graph TD + Handler[validation-handler] + AppSvc[validation-application-service] + Store[shared-production-ids-store] + Input[production-input-service] + DB[validation-database] + DAO[DAO / database services] + + Handler --> Store + Handler --> AppSvc + AppSvc --> Input + AppSvc --> DB + DB --> DAO +``` + +## 3. 关键入口文件 + +- `src/main/ipc/validation-handler.ts` +- `src/main/services/validation/validation-application-service.ts` +- `src/main/services/validation/shared-production-ids-store.ts` +- `src/main/services/validation/production-input-service.ts` +- `src/main/services/validation/validation-database.ts` +- `src/renderer/src/hooks/useValidation.ts` + +## 4. 主流程 + +```mermaid +sequenceDiagram + participant UI as Renderer / useValidation / useCleaner + participant Handler as validation-handler + participant Store as shared-production-ids-store + participant AppSvc as validation-application-service + participant Input as production-input-service + participant DB as validation-database + + UI->>Handler: set/get shared Production IDs + Handler->>Store: read/write sender scoped IDs + + UI->>Handler: validate(request) + Handler->>AppSvc: validate(...) + AppSvc->>Input: resolve source numbers + AppSvc->>DB: query material records + DB-->>AppSvc: rows + AppSvc-->>Handler: validation results + stats + Handler-->>UI: response +``` + +## 5. 共享 Production IDs + +共享订单号是 Validation 模块最重要的跨页面状态之一。 + +```mermaid +graph LR + Extractor[Extractor] + Store[shared-production-ids-store] + Validation[Validation] + Cleaner[Cleaner] + + Extractor --> Store + Store --> Validation + Validation --> Cleaner +``` + +这个状态当前按 `senderId` 维度存储,主要被: + +- `Extractor` + 写入 +- `Validation` + 读取和解析 +- `Cleaner` + 间接消费 + +## 6. 结果生成逻辑 + +校验结果不仅是数据库原始数据,还会叠加: + +- 已标记删除状态 +- 负责人关键词匹配 +- 用户权限作用域 + +```mermaid +flowchart TD + DBRows[数据库物料记录] + Marked[已标记物料] + Keywords[类型关键词] + Scope[用户作用域] + Result[ValidationResult] + + DBRows --> Result + Marked --> Result + Keywords --> Result + Scope --> Result +``` + +## 7. 模块输出 + +Validation 主要对外输出两类数据: + +- `ValidationResponse` + 提供给校验页和 Cleaner 页 +- `CleanerData` + 提供给 Cleaner 执行前的数据准备 + +## 8. 最近的结构优化 + +这一块已经从早期的大 `validation-handler` 中拆分出来: + +- `shared-production-ids-store` +- `validation-database` +- `production-input-service` +- `validation-application-service` + +这样之后: + +- handler 只做 IPC 壳 +- 共享状态有独立归属 +- 数据库方言差异有独立封装 + +## 9. 常见改动点 + +- 改共享订单号逻辑:`shared-production-ids-store.ts` +- 改输入识别:`production-input-service.ts` +- 改数据库差异:`validation-database.ts` +- 改校验结果富化:`validation-application-service.ts` +- 改 renderer 侧调用:`useValidation.ts` + +## 10. 修改建议 + +- 不要再把共享状态放回 handler +- 数据库分支优先收敛在 `validation-database` +- 校验结果组装逻辑尽量集中在 application service +- 跨模块共享数据要保持单向来源清晰