Appearance
生产记工:工序、工种与工人
本文说明 TaskFlow 记账域中 成品生产工序、工种(JobType)、工人 之间的关系,以及 一次过账生产、在制生产(WIP)报工 在管理端与接口层的行为,便于实施、培训与二次开发。
1. 业务背景
典型场景:某成品(如鞋帮)有多道 工序,每道工序由具备相应 工种 的 工人 完成。需要满足:
- 在 商品档案 中按成品维护 生产工序(工序码、名称、排序),并可把每道工序 绑定到某一工种。
- 在 工人档案 中维护每人 可从事的工种(多对多)。
- 新建生产记录(一次过账):记工明细里 先选工序,再选工人;若工序绑了工种,则 工人列表只显示已绑定该工种的工人。
- 在制生产单:在详情中 新增报工 时,同样按产成品的 工序/工种 限制可选工人,并与
stepCode一并提交。
原则:AccGoodsProcessStep 的 code 是跨模块统一的 工序码;在制报工、记工行、商品工序均用同一套码对齐。
2. 核心数据模型(概念)
| 概念 | 模型 / 表 | 说明 |
|---|---|---|
| 工种 | JobType / acc_job_types | 站点内工种名称、编码、默认计时/计件单价等。管理端「工种单价」页维护。 |
| 工人 | AccWorker / acc_workers | 每站点一条工人主数据,可关联系统用户。 |
| 工人—工种 | AccWorkerJobType / acc_worker_job_types | 多对多:某工人能做哪些工种。 |
| 成品 | AccGoods | goodsType = finished 表示成品。 |
| 单位配方(BOM) | AccGoodsBomItem | 每 1 单位成品消耗多少原料。 |
| 成品生产工序 | AccGoodsProcessStep / acc_goods_process_steps | 归属某成品;code 全站唯一范围是 同站点 + 同成品;jobTypeId 可选,绑定工种。 |
| 生产单 | AccProduction | 一次过账为 orderStatus: closed;在制为 open。 |
| 产出行 | AccProductionOutput | 绑定某次生产的成品行与数量。 |
| 在制报工 | AccWorkOperationReport | 在制时逐条报工;stepCode 对应工序码。 |
| 记工行 | AccLaborRecord | 计时/计件工资行;一次过账写入时可带 stepCode、jobTypeId 便于对账。 |
关系摘要:
成品 (AccGoods)
└─ 多条 AccGoodsProcessStep
code(工序码)
jobTypeId? → JobType(工种,可选)
工人 (AccWorker) ←→ JobType (多对多:AccWorkerJobType)若某 工序 未绑定 jobTypeId,则选该工序时 不限制 工人(展示全部在职工人);若已绑定,则只展示 工种关联 中含有该工种的工人。
3. 管理端配置顺序(建议)
维护工种
路径:财务/记账 → 工种单价(AccWorkTypesView)
为每个站点配置工种名称、编码及默认单价等。维护工人与工种
路径:工人(AccWorkersView)
在保存工人时,勾选其可从事的 工种(对应写入AccWorkerJobType)。维护成品与生产工序
路径:商品档案 → 编辑/新建 成品(GoodsSaveDialog)- 单位配方:原料行(BOM)。
- 生产工序:多行,每行包含 工序码、名称、排序、可选工种。
保存时调用POST /acc/goods/process-steps-save(经网关为POST /api/acc/goods/process-steps-save)。
之后即可在 新建生产记录、在制生产单报工 中按本文第 4、5 节使用。
4. 新建生产记录(一次过账)
页面:ProductionPostDialog.vue(标题:新建生产记录)
4.1 与「首行成品」的关系
- 成品产出 的 第一行 决定:
- 从 BOM 自动带原料(
accGoodsBomList) - 从 首行成品的
finishedGoodsId加载 生产工序列表(accGoodsProcessStepsList)
- 从 BOM 自动带原料(
若首行成品在档案中「生产工序」一行都没有:记工明细 不出现「工序」列,行为与旧版一致,不要求 stepCode。
若首行成品在档案中至少有一条生产工序:
- 记工表增加 「工序」列(在 工人 列之前)。
- 每行有工人时 必须先选工序(
stepCode对应AccGoodsProcessStep.code),再选工人。 - 当所选工序在商品档案中 绑定了
jobTypeId:工人下拉仅展示已绑定该 工种 的工人。
4.2 提交与后端校验
- 请求:
POST /acc/production/post(body 内laborLines[]可含stepCode) - 当 该首行成品 存在已维护的工序时:
- 每个 有效记工行 必须带合法
stepCode。 - 若该工序在档案中 绑了工种,后端校验该 工人 在
AccWorkerJobType中 拥有该jobTypeId。
- 每个 有效记工行 必须带合法
- 落库时,
AccLaborRecord写入stepCode、jobTypeId(其中jobTypeId来自工序行,与请求中的工人校验一致)。
5. 在制生产与报工(WIP)
开单:POST /acc/production/wip/open(在制、计划产出行等,此处不展开)。
在制报工:
- 管理端:生产记录列表 → 详情 → 在制 时显示 「新增报工」(
ProductionWipAddDialog)。 - 选择 产出行、工序(有工序主数据时必选)、工人 等。
- 当工序在商品档案中绑定了工种时,工人 同样按 工种 过滤,逻辑与第 4 节一致。
- 请求:
POST /acc/production/wip/op/add - body 中
stepCode在 成品已维护工序 时,后端要求 非空 且属于该 产出行成品 的工序主数据;并校验 工人—工种(若工序含jobTypeId)。
在制报工写入 AccWorkOperationReport,stepCode 与商品工序对齐。
5.1 关账、冲红、删除
- 在制 关账、冲红/删除 等仍以现有生产模块与权限为准(如
PROD_WIP_LEAD),本文不重复权限矩阵。
6. 主要 API 一览
网关前缀为 /api/acc/(以项目实际 ACC_API_PREFIX 与网关配置为准)。
| 用途 | 方法 | 路径 | 说明 |
|---|---|---|---|
| 分页商品 | POST | goods/page | 选成品。 |
| 生产工序列表 | POST | goods/process-steps-list | body: siteId, finishedGoodsId。返回含 code, name, sortOrder, jobTypeId, jobTypeName…。 |
| 保存生产工序 | POST | goods/process-steps-save | 覆盖式保存;items 含 code, name, sortOrder, 可选 jobTypeId。 |
| 分页工人 | POST | partners/workers/page | 含 jobTypeLinks,供前端筛人。 |
| 分页工种 | POST | work-types/page | 商品编辑里工序行绑定工种。 |
| 一次过账生产 | POST | production/post | laborLines[] 可含 stepCode。 |
| 在制报工 | POST | production/wip/op/add | 同域 stepCode 校验与工人—工种校验。 |
| 生产详情 | POST | production/detail | 在制报工子表、记工行等。 |
7. 前端相关文件
| 文件 | 说明 |
|---|---|
frontend/src/views/acc/goods/dialogs/GoodsSaveDialog.vue | 成品:单位配方 + 生产工序 + 工序绑定工种。 |
frontend/src/views/acc/production/dialogs/ProductionPostDialog.vue | 新建生产记录:记工先工序后工人。 |
frontend/src/views/acc/production/dialogs/ProductionDetailDialog.vue | 生产详情、报工表列(含工序码等)。 |
frontend/src/views/acc/production/dialogs/ProductionWipAddDialog.vue | 在制报工。 |
frontend/src/shared/api/acc/goods.ts | accGoodsProcessStepsList / accGoodsProcessStepsSave |
frontend/src/shared/api/acc/work-types-and-production.ts | ProductionPostLaborLine 含 stepCode 等。 |
8. 数据库与迁移
- 表
acc_goods_process_steps含字段job_type_id(关联acc_job_types),用于工序绑定工种。 - 表
acc_labor_records含step_code,labor_job_type_id,用于一次过账记工留痕。
在开发环境通过 ZenStack/Prisma 工作流执行 pnpm zen:generate 与 pnpm zen:push 同步库结构。若 zen:push 因历史外键重名、已有库手改等原因失败,需在目标库手工补列/补外键后再部署应用。
以仓库内 ZenStack 生成的
~schema.prisma或迁移脚本为最终字段来源。
9. 常见问题与排查
记工里选不到某工人
检查:该 工序 在商品档案是否指定了 工种;该工人是否在 工人档案 中勾选了 同一工种。没有「工序」列
首行成品的 商品档案 里是否未维护 生产工序 或维护后被清空。只要 至少一条 工序,列会出现。保存生产提示工序必填 / 报工失败
成品已维护工序时,每条记工/报工 需选 合法工序码;并与后端错误信息中的「未绑定工种」等提示对照。小程序/第三方调用
在制报工与一次过账使用同一套stepCode+ 工人—工种 规则;需携带与网关认证一致的siteId与 body 字段,详见第 6 节接口。
10. 与「工种单价」的说明
「工种」在系统中用于 计件/计时 default 价 与 记工人员筛选;商品工序上绑定工种 是 额外一层:把 某成品的某道工序 与 一个工种 固定下来,使 UI 上「选工序即隐含工种,再只显示能做该工种的工人」。若工序 不选工种,则不按工种限制工人,但仍可按工序码做统计与报工对齐。
文档随代码迭代可能变更;若与代码不一致,以 backend/zenstack/schema.zmodel 与实现为准。