Files
MrleeAdmin/backend/plugin/produce/produce-replication-plan.md
T

1045 lines
21 KiB
Markdown
Raw Normal View History

2026-08-31 13:16:46 +08:00
# Produce 插件六模块复刻方案
## 1. 文档目的
本文档用于梳理 `backend/plugin/produce` 插件需要优先复刻的 6 个模块,并结合旧项目的前端、后端、SQL 安装脚本,整理出一份可以直接执行的开发方案。
目标模块:
1. 工序管理 `process`
2. 工序步骤 `process-step`
3. 步骤状态 `step-status`
4. 步骤关系 `step-relation`
5. 状态转换 `status-transition`
6. 转换日志 `transition-log`
本文档基于以下真实参考:
- 旧前端目录:`old/web/src/views/produce/*`
- 旧后端路由:`old/server/app/admin/route/produce.php`
- 旧后端控制器:`old/server/app/admin/controller/produce/*`
- 旧后端 Validate:`old/server/app/admin/validate/produce/*`
- 旧后端 DAO / Model / Service:`old/server/app/common/{dao,model,services}/produce/*`
- 旧库 SQL:`old/server/scripts/sql/install.sql`
- 当前插件骨架:`backend/plugin/produce/*`
## 2. 当前 produce 插件现状
### 2.1 已存在结构
当前插件目录:`backend/plugin/produce`
已有基础骨架:
- `app/adminapi/controller/ProduceController.php`
- `config/app.php`
- `config/info.php`
- `config/route.php`
- `resource/menu/admin.php`
- `resource/template/admin/api`
- `resource/template/admin/views/produce/index`
- `resource/template/admin/lang`
### 2.2 缺失结构
以下目录当前基本为空,尚不足以承载 6 个业务模块:
- `app/model`
- `app/dao`
- `app/service`
- `app/validate`
- `app/schema`
- `resource/database/migrations`
结论:当前 `produce` 插件仍是示例骨架,复刻这 6 个模块时需要按插件标准完整补齐后端数据层、控制器、菜单、模板源前端。
## 3. 旧项目总体结构结论
### 3.1 旧前端页面模式
旧前端每个模块基本采用如下模式:
- `index.vue`
- `data.ts`
- `modules/form.vue`
技术模式为:
- `VXE Grid`
- 手写查询表单
- Drawer Form
- 手写列表请求与弹窗逻辑
不适合直接复制到当前项目。当前插件应改造为:
- `BasicCrud`
- `schemas/index.tsx`
- `api/index.ts`
- 插件模板源目录开发
### 3.2 旧后端路由模式
旧后端集中在:`old/server/app/admin/route/produce.php`
6 个目标模块在旧项目均有独立路由分组,说明旧项目对这 6 个模块是完整拆分的,不是页面层虚拟模块。
### 3.3 旧数据库来源
旧项目这 6 张核心表的建表信息没有体现在 `old/server/scripts/migrations` 目录的独立 PHP migration 中,核心定义主要在 SQL 安装脚本中:
- `old/server/scripts/sql/install.sql`
因此本次字段与索引参考,优先以:
1. SQL 安装脚本
2. Model fillable / casts / relation
3. DAO / Service 业务逻辑
4. 旧前端页面字段
作为综合依据。
## 4. 六模块真实表与后端入口对照
| 模块 | 表名(Model) | 旧控制器 | 旧服务/DAO | 旧前端目录 |
|---|---|---|---|---|
| 工序管理 | `produce_process` | `ProduceProcessController` | `ProduceProcessService` / `ProduceProcessDao` | `old/web/src/views/produce/process` |
| 工序步骤 | `produce_process_step` | `ProduceProcessStepController` | `ProduceProcessStepService` / `ProduceProcessStepDao` | `old/web/src/views/produce/process-step` |
| 步骤状态 | `produce_step_status` | `ProduceStepStatusController` | `ProduceStepStatusService` / `ProduceStepStatusDao` | `old/web/src/views/produce/step-status` |
| 步骤关系 | `produce_step_relation` | `ProduceStepRelationController` | `ProduceStepRelationService` / `ProduceStepRelationDao` | `old/web/src/views/produce/step-relation` |
| 状态转换 | `produce_status_transition` | `ProduceStatusTransitionController` | `ProduceStatusTransitionService` / `ProduceStatusTransitionDao` | `old/web/src/views/produce/status-transition` |
| 转换日志 | `produce_transition_log` | `ProduceTransitionLogController` | `ProduceTransitionLogService` / `ProduceTransitionLogDao` | `old/web/src/views/produce/transition-log` |
## 5. 模块依赖关系
这 6 个模块存在清晰的业务依赖链:
1. `process`
2. `process-step` 依赖 `process`
3. `step-status` 依赖 `process-step`
4. `step-relation` 依赖 `process-step`
5. `status-transition` 依赖:
- `process-step`
- `step-status`
6. `transition-log` 依赖:
- `process-step`
- `step-status`
- `status-transition`
- 生产执行侧产生的数据
推荐开发顺序必须遵循该依赖链。
## 6. 六模块详细分析
### 6.1 工序管理 `process`
#### 6.1.1 旧前端参考
目录:`old/web/src/views/produce/process`
查询字段:
- `LIKE_process_code`
- `LIKE_process_name`
- `status`
列表字段:
- `process_code`
- `process_name`
- `description`
- `step_count`
- `sort`
- `status`
- `created_date`
表单字段:
- `process_code`
- `process_name`
- `sort`
- `status`
- `description`
#### 6.1.2 旧后端模型字段
模型:`old/server/app/common/model/produce/ProduceProcess.php`
真实字段:
- `id`
- `tenant_id`
- `process_code`
- `process_name`
- `description`
- `sort`
- `status`
- `step_count`
- `created_by`
- `updated_by`
- `created_at`
- `updated_at`
- `deleted_at`
关系:
- `steps()` -> `hasMany(ProduceProcessStep::class)`
特殊点:
- `step_count` 在模型中带有自动统计能力,不只是纯存储字段。
#### 6.1.3 SQL 参考
来源:`old/server/scripts/sql/install.sql`
表:`ma_produce_process`
关键约束:
- 唯一索引:`uk_process_code(process_code, tenant_id, deleted_at)`
- 常规索引:`tenant_id`、`status`、`sort`
#### 6.1.4 复杂度评估
- 复杂度:低
- 适合作为第一个落地模块
#### 6.1.5 新插件建议
模块名建议:`process`
后端应提供:
- 标准 CRUD
- 下拉接口 `select/options`
前端建议:
- 标准 `BasicCrud`
- 保留查询项与排序、状态字段
---
### 6.2 工序步骤 `process-step`
#### 6.2.1 旧前端参考
目录:`old/web/src/views/produce/process-step`
查询字段:
- `process_id`
- `LIKE_step_code`
- `LIKE_step_name`
- `status`
列表字段:
- `process_id`(实际显示工序名称)
- `step_code`
- `step_name`
- `description`
- `sort`
- `status`
- `created_date`
表单字段:
- `process_id`
- `step_code`
- `step_name`
- `sort`
- `status`
- `description`
#### 6.2.2 旧后端模型字段
模型:`old/server/app/common/model/produce/ProduceProcessStep.php`
真实字段:
- `id`
- `tenant_id`
- `process_id`
- `step_code`
- `step_name`
- `description`
- `sort`
- `status`
- `prerequisite_steps`
- `prerequisite_mode`
- `prerequisite_require_final`
- `allow_repeat_scan`
- `repeat_scan_statuses`
- `created_by`
- `updated_by`
- `created_at`
- `updated_at`
- `deleted_at`
casts:
- `prerequisite_steps` => `array`
- `repeat_scan_statuses` => `array`
- `allow_repeat_scan` => `integer`
- `prerequisite_require_final` => `integer`
关系:
- `process()` -> `belongsTo(ProduceProcess::class)`
#### 6.2.3 旧前端与真实后端差异
旧前端页面只展示了基础字段,但后端模型里还有生产执行相关能力字段:
- 前置必要步骤
- 前置步骤验证模式
- 是否要求前置终态
- 是否允许重复扫码
- 哪些状态允许重复扫码
这说明:
- 如果只按旧页面复刻,会丢失隐藏业务能力
- 新插件应优先保留这些字段,只是可以分阶段决定首版是否全部开放 UI
#### 6.2.4 SQL 参考
来源:`old/server/scripts/sql/install.sql`
表:`ma_produce_process_step`
关键约束:
- 唯一索引:`uk_step_code(step_code, process_id, tenant_id, deleted_at)`
- 常规索引通常包括:`tenant_id`、`process_id`、`status`、`sort`
#### 6.2.5 复杂度评估
- 复杂度:中
- 依赖 `process`
- 基础 CRUD 不复杂,但完整业务字段不应忽略
#### 6.2.6 新插件建议
模块名建议:`process-step`
建议分两阶段:
第一阶段:
- 工序下拉
- 步骤编码/名称
- 排序/状态/描述
第二阶段:
- 前置步骤配置
- 重复扫码控制
---
### 6.3 步骤状态 `step-status`
#### 6.3.1 旧前端参考
目录:`old/web/src/views/produce/step-status`
查询字段:
- `step_id`
- `LIKE_status_code`
- `LIKE_status_name`
- `status`
列表字段:
- `step_id`(显示步骤名称)
- `status_code`
- `status_name`
- `is_initial`
- `is_final`
- `description`
- `sort`
- `status`
- `created_date`
表单字段:
- `step_id`
- `status_code`
- `status_name`
- `is_initial`
- `is_final`
- `sort`
- `status`
- `description`
#### 6.3.2 旧后端模型字段
模型:`old/server/app/common/model/produce/ProduceStepStatus.php`
真实字段:
- `id`
- `tenant_id`
- `step_id`
- `status_code`
- `status_name`
- `is_initial`
- `is_final`
- `description`
- `sort`
- `status`
- `created_by`
- `updated_by`
- `created_at`
- `updated_at`
- `deleted_at`
关系:
- `step()` -> `belongsTo(ProduceProcessStep::class)`
#### 6.3.3 SQL 参考
来源:`old/server/scripts/sql/install.sql`
表:`ma_produce_step_status`
典型业务含义:
- `is_initial`:步骤初始状态
- `is_final`:步骤终态
这是状态机基础数据,不应简化掉。
#### 6.3.4 复杂度评估
- 复杂度:中
- 依赖 `process-step`
- 是状态转换模块的基础配置表
#### 6.3.5 新插件建议
模块名建议:`step-status`
建议保留:
- 所属步骤联动下拉
- 初始/终态布尔字段
- 基础启停状态
---
### 6.4 步骤关系 `step-relation`
#### 6.4.1 旧前端参考
目录:`old/web/src/views/produce/step-relation`
查询字段:
- `from_step_id`
- `to_step_id`
- `relation_type`
- `status`
列表字段:
- `from_step_id`(显示源步骤名称)
- `to_step_id`(显示目标步骤名称)
- `relation_type`
- `priority`
- `flow_condition`
- `description`
- `sort`
- `status`
- `created_date`
表单字段:
- `from_step_id`
- `to_step_id`
- `relation_type`
- `priority`
- `flow_condition`
- `sort`
- `status`
- `description`
关系类型枚举:
- `normal` 正常流转
- `exception` 异常流转
#### 6.4.2 旧后端模型 / DAO 参考
模型:`ProduceStepRelation`
真实表:`produce_step_relation`
DAO:`ProduceStepRelationDao`
体现出的真实业务能力:
- 支持按 `from_step_id` / `to_step_id` / `relation_type` 搜索
- 支持按 `priority asc, sort asc` 排序
- 提供 `getPreviousSteps(int $currentStepId)` 能力
这说明该模块不仅是配置关系,还直接用于生产流转路径判断。
#### 6.4.3 SQL 参考
来源:`old/server/scripts/sql/install.sql`
表:`ma_produce_step_relation`
真实字段:
- `from_step_id`
- `to_step_id`
- `relation_type`
- `flow_condition`(JSON 文本)
- `priority`
- `description`
- `sort`
- `status`
#### 6.4.4 复杂度评估
- 复杂度:中偏高
- 核心复杂点在 `flow_condition`
- 仍可标准 CRUD 化
#### 6.4.5 新插件建议
模块名建议:`step-relation`
前端首版可先:
- 使用多行文本录入 JSON
- 列表中直接字符串展示
后续增强:
- JSON 校验
- 条件构造器 UI
---
### 6.5 状态转换 `status-transition`
#### 6.5.1 旧前端参考
目录:`old/web/src/views/produce/status-transition`
查询字段:
- `step_id`
- `trigger_event`
- `status`
列表字段:
- `step_id`
- `from_status_id`
- `to_status_id`
- `trigger_event`
- `transition_type`
- `auto_trigger`
- `priority`
- `description`
- `sort`
- `status`
- `created_date`
表单字段:
- `step_id`
- `from_status_id`
- `to_status_id`
- `trigger_event`
- `transition_type`
- `side_effect_type`
- `side_effect_config`
- `auto_trigger`
- `priority`
- `event_config`
- `sort`
- `status`
- `description`
触发事件枚举:
- `next_step_scan`
- `scan_trigger`
- `exception_trigger`
- `manual_trigger`
- `timer_trigger`
- `complete_trigger`
转换类型枚举:
- `primary`
- `side_effect`
副作用类型枚举:
- `log`
- `notify`
- `update_field`
- `trigger_event`
#### 6.5.2 旧后端模型 / DAO 参考
模型:`ProduceStatusTransition`
真实字段:
- `step_id`
- `from_status_id`
- `to_status_id`
- `trigger_event`
- `event_config`
- `auto_trigger`
- `priority`
- `transition_type`
- `side_effect_type`
- `side_effect_config`
- `description`
- `sort`
- `status`
关系:
- `step()`
- `fromStatus()`
- `toStatus()`
JSON 处理:
- `event_config` 自动 JSON 编解码
- `side_effect_config` 自动 JSON 编解码
DAO 体现出的业务能力:
- `getAutoTransitionsByStep(stepId, fromStatusId)`
- `getAutoTransitions(stepId, fromStatusId, triggerEvent)`
排序规则:
- `priority desc` / `sort asc`
说明:
- 该模块不只是配置表,而是生产执行流程中的规则引擎核心
#### 6.5.3 SQL 参考
来源:`old/server/scripts/sql/install.sql`
表:`ma_produce_status_transition`
真实字段里已经明确包含:
- `transition_type`
- `side_effect_type`
- `side_effect_config`
- `event_config`
#### 6.5.4 复杂度评估
- 复杂度:高
- 是 6 个模块里最复杂的配置模块
复杂来源:
- 依赖步骤与步骤状态双层联动
- 表单中有条件显示字段
- 存在 JSON 配置字段
- 影响实际状态机执行逻辑
#### 6.5.5 新插件建议
模块名建议:`status-transition`
建议实现分两层:
第一层:
- 完整字段 CRUD
- 文本方式维护 JSON
- 步骤切换后刷新状态选项
第二层:
- JSON 结构校验
- 副作用配置器
- 事件配置器
---
### 6.6 转换日志 `transition-log`
#### 6.6.1 旧前端参考
目录:`old/web/src/views/produce/transition-log`
查询字段:
- `LIKE_work_order_no`
- `step_id`
- `trigger_event`
- `LIKE_trigger_user`
- `is_success`
列表字段:
- `work_order_no`
- `step_id`
- `from_status_id`
- `to_status_id`
- `trigger_event`
- `trigger_user`
- `is_auto`
- `is_success`
- `duration`
- `error_message`
- `created_date`
操作:
- 只有 `detail`
#### 6.6.2 旧后端模型 / Service 参考
模型:`ProduceTransitionLog`
真实字段:
- `work_order_id`
- `work_order_no`
- `step_id`
- `transition_id`
- `from_status_id`
- `to_status_id`
- `trigger_event`
- `trigger_data`
- `trigger_user`
- `trigger_ip`
- `is_auto`
- `is_success`
- `error_message`
- `duration`
- `remark`
- `created_by`
- `created_at`
特征:
- `UPDATED_AT = null`
- `trigger_data` 自动 JSON 解码
- 服务 `read()` 会加载:
- `step`
- `transition`
- `fromStatus`
- `toStatus`
旧路由里还存在额外查询接口:
- `work-order-history`
- `step-statistics`
说明:
- 该模块是典型只读日志模块
- 不适合做标准新增/编辑/删除页面
#### 6.6.3 SQL 参考
来源:`old/server/scripts/sql/install.sql`
表:`ma_produce_transition_log`
关键字段:
- `trigger_data` JSON
- `trigger_ip`
- `duration`
- `error_message`
- `remark`
#### 6.6.4 复杂度评估
- 复杂度:中
- 不是 CRUD 复杂,而是业务只读特征与统计扩展
#### 6.6.5 新插件建议
模块名建议:`transition-log`
实现建议:
- 列表页 + 详情页
- 默认只读
- 不开放新增/编辑/删除
- 后续可补:
- 工单历史
- 步骤统计
## 7. 推荐复刻顺序
必须按依赖顺序推进:
1. `process`
2. `process-step`
3. `step-status`
4. `step-relation`
5. `status-transition`
6. `transition-log`
推荐分阶段:
### 第一阶段:基础主数据
- `process`
- `process-step`
- `step-status`
### 第二阶段:流程规则
- `step-relation`
- `status-transition`
### 第三阶段:只读日志
- `transition-log`
## 8. 新插件目录落点建议
### 8.1 后端
建议新增如下结构:
- `backend/plugin/produce/app/model/Process.php` 等
- `backend/plugin/produce/app/dao/*`
- `backend/plugin/produce/app/service/admin/*`
- `backend/plugin/produce/app/validate/*`
- `backend/plugin/produce/app/schema/request/*`
- `backend/plugin/produce/app/schema/response/*`
- `backend/plugin/produce/app/adminapi/controller/*`
- `backend/plugin/produce/resource/database/migrations/*`
建议 6 模块一一对应生成:
- `Process`
- `ProcessStep`
- `StepStatus`
- `StepRelation`
- `StatusTransition`
- `TransitionLog`
### 8.2 前端模板源
正式维护目录必须放在:
- `backend/plugin/produce/resource/template/admin/api/index.ts`
- `backend/plugin/produce/resource/template/admin/views/produce/process/index.vue`
- `backend/plugin/produce/resource/template/admin/views/produce/process/schemas/index.tsx`
- `backend/plugin/produce/resource/template/admin/views/produce/process-step/index.vue`
- `backend/plugin/produce/resource/template/admin/views/produce/process-step/schemas/index.tsx`
- `backend/plugin/produce/resource/template/admin/views/produce/step-status/index.vue`
- `backend/plugin/produce/resource/template/admin/views/produce/step-status/schemas/index.tsx`
- `backend/plugin/produce/resource/template/admin/views/produce/step-relation/index.vue`
- `backend/plugin/produce/resource/template/admin/views/produce/step-relation/schemas/index.tsx`
- `backend/plugin/produce/resource/template/admin/views/produce/status-transition/index.vue`
- `backend/plugin/produce/resource/template/admin/views/produce/status-transition/schemas/index.tsx`
- `backend/plugin/produce/resource/template/admin/views/produce/transition-log/index.vue`
- `backend/plugin/produce/resource/template/admin/views/produce/transition-log/schemas/index.tsx`
- `backend/plugin/produce/resource/template/admin/lang/zh-cn/zh.json`
- `backend/plugin/produce/resource/template/admin/lang/en/en.json`
安装后再复制到:
- `frontend/admin/src/apps/produce/*`
## 9. 菜单与权限建议
当前插件菜单 `backend/plugin/produce/resource/menu/admin.php` 只有一个示例菜单项,不能满足这 6 个模块。
建议调整为:
- 根菜单:`生产管理`
- 子菜单:
- `工序管理`
- `工序步骤`
- `步骤状态`
- `步骤关系`
- `状态转换`
- `转换日志`
权限码建议统一前缀:
- `produce:process:*`
- `produce:process-step:*`
- `produce:step-status:*`
- `produce:step-relation:*`
- `produce:status-transition:*`
- `produce:transition-log:*`
注意:
- 日志模块建议只保留 `list/detail` 等只读权限
- 不建议给 `create/edit/delete`
## 10. 接口风格迁移建议
旧项目接口风格:
- `/admin/produce/process/list`
- `/admin/produce/process/get/{id}`
- `/admin/produce/process/create`
- `/admin/produce/process/update/{id}`
- `/admin/produce/process/delete/{id}`
新插件建议按当前项目标准 CRUD 控制器收敛,避免继续沿用旧式 `list/get/create/update/delete` 命名。
建议资源路径:
- `/adminapi/produce/process`
- `/adminapi/produce/process-step`
- `/adminapi/produce/step-status`
- `/adminapi/produce/step-relation`
- `/adminapi/produce/status-transition`
- `/adminapi/produce/transition-log`
附加只读接口可补:
- 下拉选项接口
- 状态联动接口
- 日志统计接口
## 11. 风险与注意事项
### 11.1 旧前端不等于真实后端能力
最典型的是 `process-step`:
旧页面未暴露:
- 前置步骤数组
- 前置验证模式
- 重复扫码控制
但后端模型与 SQL 已经存在这些字段。
结论:
- 不能只按旧页面抄字段
- 应优先以 SQL + Model 为准
### 11.2 `status-transition` 是规则引擎核心
该模块不是普通配置表,DAO 已体现真实执行用途:
- 获取自动转换规则
- 按优先级执行
- 依赖事件与状态
因此该模块开发时应把:
- 数据正确性
- JSON 配置合法性
- 联动逻辑
放在比页面美化更高的优先级。
### 11.3 `transition-log` 是只读模块
不要把它误做成标准增删改查。
推荐:
- 列表
- 详情
- 历史/统计扩展
### 11.4 迁移来源差异
旧项目这几张表的核心定义主要在 SQL 安装脚本,不在当前已检索到的 PHP migration 单文件中。
因此新插件开发时:
- 迁移文件需要重新按当前项目规范补建
- 不能直接依赖旧 `scripts/migrations` 目录复用
- 但可以严格参考 `install.sql` 的字段与索引
## 12. 推荐实施计划
### 12.1 第一批落地
先完成:
1. `process`
2. `process-step`
3. `step-status`
交付标准:
- 后端 CRUD 可运行
- 菜单可访问
- 模板源前端完成
- 运行目录联调通过
### 12.2 第二批落地
再完成:
4. `step-relation`
5. `status-transition`
重点:
- 规则字段
- JSON 输入
- 状态联动
### 12.3 第三批落地
最后完成:
6. `transition-log`
重点:
- 列表
- 详情
- 历史/统计接口是否保留
## 13. 待确认事项
正式开始开发前,建议你确认以下内容:
1. 插件显示名称是否确定为“生产管理”
2. 这 6 个模块是否全部进入一期
3. `process-step` 的隐藏字段是否一期就开放 UI
4. `status-transition` 的 JSON 字段是否先用文本方式维护
5. `transition-log` 是否确认只读
6. 是否要把旧路由里的 `select`、`statistics`、`work-order-history` 一并纳入一期
7. 数据库主键是否统一按当前项目雪花 ID 规范重建,而不是继续使用旧 AUTO_INCREMENT 风格
## 14. 结论
结论如下:
1. `produce` 插件当前只是骨架,无法直接承接旧功能。
2. 旧项目这 6 个模块具备完整前后端参考,可复刻。
3. 复刻时应以 `install.sql + Model + DAO/Service` 为准,不能只照搬旧页面字段。
4. 最推荐的首批实现是:
- `process`
- `process-step`
- `step-status`
5. `status-transition` 是业务核心,复杂度最高,应在基础模块稳定后实现。
6. `transition-log` 应按只读日志模块实现,而不是标准 CRUD。