日期: 2026-06-13
状态: 已评审,可实施
范围: web-admin + backend(生产工单派发、任务执行、我的生产任务)
| 项 | 现状 |
|---|---|
| 派发入口 | 生产工单 → DispatchTaskDialog.vue(任务名称、工艺路线、描述、备注) |
| 任务模型 | biz_production_task 无负责人字段 |
| 任务可见性 | 工单展开行 WorkOrderTaskSubList 对持有 production:work-order:list 的用户展示全部任务 |
| 任务执行 | TaskExecutionDialog.vue:开始执行 / 工序步骤 / 完成任务 |
| 独立任务入口 | 旧菜单 生产任务 已重定向至 生产工单,无「我的任务」视角 |
| 类似实现 | 已实现「我的质检任务」(2026-06-12-qc-task-assignee-my-tasks-design.md) |
| 维度 | 质检任务(已实现) | 生产任务(本需求) |
|---|---|---|
| 负责人数量 | 多人并行(任一可完成) | 单人当前负责人(串行协作) |
| 协作方式 | 同时多人负责 | 转发给下一位负责人 |
| 我的任务列表 | 单列表 | 双 Tab(当前 / 历史) |
| 历史视角 | 无独立历史 Tab | 曾负责但已转出的任务 |
| 存储 | biz_qc_task_assignee 多行 |
建议 current_assignee_user_id + 转发表 |
┌─────────────────────────────────────────────────────────────────────────┐
│ 生产工单 · 派发任务 │
│ 填写任务信息 + 【必选】负责人 ──► 创建任务 (dpz) + 设置 current_assignee │
└─────────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 我的生产任务 · Tab「当前任务」 │
│ 过滤: current_assignee = 当前用户 │
│ 操作: 配置工艺(dpz) / 开始执行 / 执行工序 / 完成任务 / 【转发】 │
└─────────────────────────────────────────────────────────────────────────┘
│
负责人 A 点击「转发」
选择负责人 B + 备注
│
▼
┌──────────────────────────┐ ┌──────────────────────────────────────────┐
│ A · 当前任务 Tab │ │ B · 当前任务 Tab │
│ 任务消失 │ │ 任务出现,可继续执行 │
└──────────────────────────┘ └──────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 我的生产任务 · Tab「历史执行」 │
│ 过滤: 当前用户曾出现在 biz_production_task_handover.from_user_id │
│ 且 current_assignee ≠ 当前用户 │
│ 操作: 仅「查看」TaskExecutionDialog readonly │
└─────────────────────────────────────────────────────────────────────────┘
| 任务状态 | 含义 | 当前 Tab 可用操作 |
|---|---|---|
dpz 待配置 |
已创建,工艺可编辑 | 进入执行(配置步骤)、转发、查看 |
jxz 进行中 |
已开始执行 | 继续执行、转发、查看 |
ywc 已完成 |
整单任务结束 | 查看、转发(接收方继承已完成状态,通常仅查看/归档交接) |
D3 已确认:任何任务状态(
dpz/jxz/ywc)均可转发;转发不改变任务状态与已填写的执行数据,仅变更current_assignee。
| # | 问题 | 决策 | 状态 |
|---|---|---|---|
| D1 | 派发时负责人是否必填? | 是 | ✅ 已确认 |
| D2 | 负责人是单人还是多人? | 单人当前负责人(转发串行协作) | ✅ 已确认 |
| D3 | 转发时机? | 任何状态均可转发(dpz / jxz / ywc) |
✅ 已确认 |
| D4 | 转发后 A 的执行数据? | 保留(B 在 A 进度上继续;ywc 转发后仍为 ywc) |
✅ 已确认 |
| D5 | 任务完成后是否还允许转发? | 是(与 D3 一致,ywc 可转发) |
✅ 已确认 |
| D6 | 生产工单页是否仍展示全部任务? | 管理覆盖 — 持有 production:work-order:list 可查看全部任务 |
✅ 已确认 |
| D7 | 工单页非负责人能否执行任务? | 能(operateScope=manage);「我的生产任务」页 不能(operateScope=mine) |
✅ 已确认 |
| D8 | 派发后能否改负责人? | 可以 — 工单页管理员「改派」+ 负责人「转发」 | ✅ 已确认 |
| D9 | 历史 Tab 是否包含「我创建但未转发就完成的」? | 否 — 历史仅 曾转出/被改派离开 的任务 | ✅ 已确认 |
| D10 | 用户选项范围? | 本租户有效用户 | ✅ 已确认 |
DispatchTaskDialog.vue)el-select,filterable,必选)。nickName(userNo)。assigneeUserId。WorkOrderTaskSubList.vue)operateScope=manage):保持现有操作 + 改派(管理员,见 §6.4)。TaskExecutionDialog.vue)operateScope=mine:仅 current_assignee 可写;否则只读。operateScope=history:强制 readonly,无转发/完成按钮。| 项 | 说明 |
|---|---|
| 路由 | /#/production-group/production/my-production-task |
| 组件 | web-admin/src/views/production/my-production-task/index.vue |
| 菜单 | 生产管理 → 我的生产任务 |
| menuCode | production:my-task:list(建议,与 production:task:list 区分) |
| UI 模式 | P02 + P21 任务卡片;参考 my-qc-task/index.vue + WorkOrderTaskSubList 卡片样式 |
Tab 结构
| Tab | API | 说明 |
|---|---|---|
| 当前任务 | GET /production-tasks/mine?scope=current |
current_assignee_user_id = 我 |
| 历史执行 | GET /production-tasks/mine?scope=history |
我曾转出且当前负责人不是我 |
筛选区(两 Tab 共用,可选字段略减):
| 字段 | 类型 |
|---|---|
| 关键词 | 任务号 / 任务名称 / 工单号 / 样本编码 |
| 任务状态 | dpz / jxz / ywc |
| 工单类型 | inbound / outbound / temporary |
列表 / 卡片信息
三处对齐(参照 QC my-qc-task):
web-admin/src/router/modules/sqxp.tsbackend/app/api/menu.pydocs/sql/migrations/2026-06-13-my-production-task-menu.sql + docs/sql/zkxw.sql| 菜单 | path | perms | order_num(建议) |
|---|---|---|---|
| 我的生产任务 | my-production-task |
production:my-task:list |
生产工单之后(如 4) |
| 方案 | 描述 | 优点 | 缺点 |
|---|---|---|---|
| A(推荐) | biz_production_task.current_assignee_user_id + 转发表 |
查询简单;语义清晰 | 任务表增字段 |
| B | 纯 biz_production_task_assignee 多行 + is_current |
与 QC 表结构类似 | 单人场景略重;历史需额外逻辑 |
| C | 仅转发表推导当前负责人 | 无任务表字段 | 查询复杂、易错 |
推荐方案 A。
biz_production_task 新增:
ALTER TABLE `biz_production_task`
ADD COLUMN `current_assignee_user_id` varchar(64) DEFAULT NULL COMMENT '当前负责人用户ID' AFTER `task_status`;
响应字段(_task_to_dict):
| 字段 | 类型 | 说明 |
|---|---|---|
currentAssigneeUserId |
string |
当前负责人 ID |
currentAssigneeUserName |
string |
当前负责人姓名 |
CREATE TABLE `biz_production_task_handover` (
`id` varchar(64) NOT NULL COMMENT '主键',
`task_id` varchar(64) NOT NULL COMMENT '生产任务ID',
`from_user_id` varchar(64) NOT NULL COMMENT '转出用户ID',
`to_user_id` varchar(64) NOT NULL COMMENT '接收用户ID',
`handover_time` datetime NOT NULL COMMENT '转发时间',
`remark` varchar(512) DEFAULT NULL COMMENT '转发说明',
`tenant_no` varchar(64) NOT NULL COMMENT '租户编号',
`order_num` int DEFAULT 0,
`create_by` varchar(64) DEFAULT NULL,
`create_dept_id` varchar(64) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`update_by` varchar(64) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`del_flag` tinyint DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_prod_task_handover_task` (`task_id`, `del_flag`),
KEY `idx_prod_task_handover_from` (`from_user_id`, `tenant_no`, `del_flag`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='生产任务转发记录';
创建任务 POST /production-tasks:
assignee_user_id: str = Field(..., alias="assigneeUserId") # 必填
转发任务 POST /production-tasks/{id}/forward:
to_user_id: str = Field(..., alias="toUserId")
remark: Optional[str] = None
校验:
to_user_id ≠ 当前用户;dpz / jxz / ywc 均可);current_assignee 可转发(operateScope=mine);工单页 operateScope=manage 下持有 production:work-order:list 的管理员也可代为转发;current_assignee_user_id 为 NULL:不出现在「我的生产任务」;GET /web/admin/production-tasks/mine
production:my-task:listpage, pageSize, keyword, taskStatus, workOrderType, scope=current|historycurrent_assignee_user_id = 当前用户EXISTS handover WHERE from_user_id = 当前用户 AND current_assignee_user_id <> 当前用户create_time DESC(current)/ handover_time DESC(history,取最近一条转出记录时间展示)GET /production-tasks 列表项一致 + 工单摘要 + handoverTime(history Tab)POST /web/admin/production-tasks/{id}/forward
production:my-task:list + assignee 校验current_assignee_user_idoperateScope)复用 QC 模式,Query 或 Header:operateScope=mine|manage
| 端点 | mine | manage |
|---|---|---|
| 步骤 CRUD、状态变更、完成任务 | 须 current_assignee | production:work-order:list 或 task list |
| 转发 | 须 current_assignee | 持有 production:work-order:list 可代为转发 |
前端:
my-production-task 写请求带 operateScope=mineWorkOrderTaskSubList / TaskExecutionDialog 从工单打开时 operateScope=managePUT /web/admin/production-tasks/{id}/assignee
production:work-order:listassigneeUserId(新负责人,必填)current_assignee_user_id;biz_production_task_handover(from_user_id = 原负责人或操作人,to_user_id = 新负责人,remark 标注「管理员改派」),便于历史 Tab 与审计;| 组件 | 改造 |
|---|---|
WorkOrderTaskSubList.vue |
增加 listMode: 'workOrder' \| 'mine-current' \| 'mine-history';mine 模式调 /mine API |
TaskExecutionDialog.vue |
增加 operateScope、转发按钮与 ForwardTaskDialog |
DispatchTaskDialog.vue |
负责人选择 + 校验 |
避免复制 500+ 行执行逻辑;优先 props 驱动 而非新建平行页面。
fetchUserList 或现有 admin API)。useTenantUserOptions)。filter-block、任务卡片 Tag 语义色;@element-plus/icons-vue 图标;label-position="top"、dialog-form-layout;App.vue → panelTitleBarTextRules 注册「我的生产任务」。| 场景 | 预期 |
|---|---|
| 派发未选负责人 | 前端 + 后端 400 |
| 派发选 A | A 的「当前任务」可见;B 不可见 |
| A 转发给 B(jxz) | B 当前可见;A 仅历史可见;任务进度保留 |
| A 在 dpz 阶段转发给 B | B 成为负责人,可继续配置工艺 |
| A 在 ywc 阶段转发给 B | B 当前 Tab 可见;任务仍为 ywc;B 仅查看(不可再执行) |
| A 历史 Tab 打开任务 | 只读,无完成/转发 |
| B 完成任务 | B 当前 Tab 显示 ywc,只读 |
| 非 assignee 调 mine API 写操作 | 403 |
| 工单页管理员非 assignee 执行 | 成功(manage) |
| 历史无 assignee 的旧任务 | 不出现在我的任务;工单页仍可操作 |
| 转发给自己 | 拒绝 |
| 层级 | 文件 |
|---|---|
| SQL | docs/sql/migrations/2026-06-13-production-task-assignee.sql, 2026-06-13-my-production-task-menu.sql, docs/sql/zkxw.sql |
| Backend | models.py, production_task.py, production.py (API), schemas/production_task.py, menu.py |
| Frontend | sqxp.ts, DispatchTaskDialog.vue, WorkOrderTaskSubList.vue, TaskExecutionDialog.vue, my-production-task/index.vue, production-task.ts, 类型定义 |
| 图谱 | ./scripts/update-graph.sh backend frontend |
api-conventions:生产任务 current_assignee、operateScope、转发 APIui-conventions:「我的生产任务」参考页登记(P02 + P21)请评审本文档。 全部产品决策(D1–D10)已确认。实现计划见 docs/superpowers/plans/2026-06-13-production-task-assignee-my-tasks.md。