Skip to content

生产记工:工序、工种与工人

本文说明 TaskFlow 记账域中 成品生产工序工种(JobType)工人 之间的关系,以及 一次过账生产在制生产(WIP)报工 在管理端与接口层的行为,便于实施、培训与二次开发。


1. 业务背景

典型场景:某成品(如鞋帮)有多道 工序,每道工序由具备相应 工种工人 完成。需要满足:

  • 商品档案 中按成品维护 生产工序(工序码、名称、排序),并可把每道工序 绑定到某一工种
  • 工人档案 中维护每人 可从事的工种(多对多)。
  • 新建生产记录(一次过账):记工明细里 先选工序,再选工人;若工序绑了工种,则 工人列表只显示已绑定该工种的工人
  • 在制生产单:在详情中 新增报工 时,同样按产成品的 工序/工种 限制可选工人,并与 stepCode 一并提交。

原则AccGoodsProcessStepcode 是跨模块统一的 工序码;在制报工、记工行、商品工序均用同一套码对齐。


2. 核心数据模型(概念)

概念模型 / 表说明
工种JobType / acc_job_types站点内工种名称、编码、默认计时/计件单价等。管理端「工种单价」页维护。
工人AccWorker / acc_workers每站点一条工人主数据,可关联系统用户。
工人—工种AccWorkerJobType / acc_worker_job_types多对多:某工人能做哪些工种
成品AccGoodsgoodsType = finished 表示成品。
单位配方(BOM)AccGoodsBomItem每 1 单位成品消耗多少原料。
成品生产工序AccGoodsProcessStep / acc_goods_process_steps归属某成品;code 全站唯一范围是 同站点 + 同成品jobTypeId 可选,绑定工种。
生产单AccProduction一次过账为 orderStatus: closed;在制为 open
产出行AccProductionOutput绑定某次生产的成品行与数量。
在制报工AccWorkOperationReport在制时逐条报工;stepCode 对应工序码。
记工行AccLaborRecord计时/计件工资行;一次过账写入时可带 stepCodejobTypeId 便于对账。

关系摘要

成品 (AccGoods)
  └─ 多条 AccGoodsProcessStep
        code(工序码)
        jobTypeId? → JobType(工种,可选)
        
工人 (AccWorker) ←→ JobType  (多对多:AccWorkerJobType)

若某 工序 未绑定 jobTypeId,则选该工序时 不限制 工人(展示全部在职工人);若已绑定,则只展示 工种关联 中含有该工种的工人。


3. 管理端配置顺序(建议)

  1. 维护工种
    路径:财务/记账工种单价AccWorkTypesView
    为每个站点配置工种名称、编码及默认单价等。

  2. 维护工人与工种
    路径:工人AccWorkersView
    在保存工人时,勾选其可从事的 工种(对应写入 AccWorkerJobType)。

  3. 维护成品与生产工序
    路径:商品档案 → 编辑/新建 成品GoodsSaveDialog

    • 单位配方:原料行(BOM)。
    • 生产工序:多行,每行包含 工序码、名称、排序、可选工种
      保存时调用 POST /acc/goods/process-steps-save(经网关为 POST /api/acc/goods/process-steps-save)。
  4. 之后即可在 新建生产记录在制生产单报工 中按本文第 4、5 节使用。


4. 新建生产记录(一次过账)

页面ProductionPostDialog.vue(标题:新建生产记录)

4.1 与「首行成品」的关系

  • 成品产出第一行 决定:
    • 从 BOM 自动带原料accGoodsBomList
    • 首行成品的 finishedGoodsId 加载 生产工序列表accGoodsProcessStepsList

若首行成品在档案中「生产工序」一行都没有:记工明细 不出现「工序」列,行为与旧版一致,不要求 stepCode

若首行成品在档案中至少有一条生产工序

  • 记工表增加 「工序」列(在 工人 列之前)。
  • 每行有工人时 必须先选工序stepCode 对应 AccGoodsProcessStep.code),再选工人。
  • 当所选工序在商品档案中 绑定了 jobTypeId工人 下拉仅展示已绑定该 工种 的工人。

4.2 提交与后端校验

  • 请求:POST /acc/production/post(body 内 laborLines[] 可含 stepCode
  • 该首行成品 存在已维护的工序时:
    • 每个 有效记工行 必须带合法 stepCode
    • 若该工序在档案中 绑了工种,后端校验该 工人AccWorkerJobType拥有该 jobTypeId
  • 落库时,AccLaborRecord 写入 stepCodejobTypeId(其中 jobTypeId 来自工序行,与请求中的工人校验一致)。

5. 在制生产与报工(WIP)

开单POST /acc/production/wip/open(在制、计划产出行等,此处不展开)。

在制报工

  • 管理端:生产记录列表 → 详情在制 时显示 「新增报工」ProductionWipAddDialog)。
  • 选择 产出行工序(有工序主数据时必选)、工人 等。
  • 当工序在商品档案中绑定了工种时,工人 同样按 工种 过滤,逻辑与第 4 节一致。
  • 请求:POST /acc/production/wip/op/add
  • body 中 stepCode成品已维护工序 时,后端要求 非空 且属于该 产出行成品 的工序主数据;并校验 工人—工种(若工序含 jobTypeId)。

在制报工写入 AccWorkOperationReportstepCode 与商品工序对齐。

5.1 关账、冲红、删除

  • 在制 关账冲红/删除 等仍以现有生产模块与权限为准(如 PROD_WIP_LEAD),本文不重复权限矩阵。

6. 主要 API 一览

网关前缀为 /api/acc/(以项目实际 ACC_API_PREFIX 与网关配置为准)。

用途方法路径说明
分页商品POSTgoods/page选成品。
生产工序列表POSTgoods/process-steps-listbody: siteId, finishedGoodsId。返回含 code, name, sortOrder, jobTypeId, jobTypeName…
保存生产工序POSTgoods/process-steps-save覆盖式保存;items 含 code, name, sortOrder, 可选 jobTypeId
分页工人POSTpartners/workers/pagejobTypeLinks,供前端筛人。
分页工种POSTwork-types/page商品编辑里工序行绑定工种。
一次过账生产POSTproduction/postlaborLines[] 可含 stepCode
在制报工POSTproduction/wip/op/add同域 stepCode 校验与工人—工种校验。
生产详情POSTproduction/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.tsaccGoodsProcessStepsList / accGoodsProcessStepsSave
frontend/src/shared/api/acc/work-types-and-production.tsProductionPostLaborLinestepCode 等。

8. 数据库与迁移

  • acc_goods_process_steps 含字段 job_type_id(关联 acc_job_types),用于工序绑定工种。
  • acc_labor_recordsstep_code, labor_job_type_id,用于一次过账记工留痕。

在开发环境通过 ZenStack/Prisma 工作流执行 pnpm zen:generatepnpm zen:push 同步库结构。若 zen:push历史外键重名、已有库手改等原因失败,需在目标库手工补列/补外键后再部署应用。

以仓库内 ZenStack 生成的 ~schema.prisma 或迁移脚本为最终字段来源。


9. 常见问题与排查

  1. 记工里选不到某工人
    检查:该 工序 在商品档案是否指定了 工种;该工人是否在 工人档案 中勾选了 同一工种

  2. 没有「工序」列
    首行成品的 商品档案 里是否未维护 生产工序 或维护后被清空。只要 至少一条 工序,列会出现。

  3. 保存生产提示工序必填 / 报工失败
    成品已维护工序时,每条记工/报工 需选 合法工序码;并与后端错误信息中的「未绑定工种」等提示对照。

  4. 小程序/第三方调用
    在制报工与一次过账使用同一套 stepCode + 工人—工种 规则;需携带与网关认证一致的 siteId 与 body 字段,详见第 6 节接口。


10. 与「工种单价」的说明

「工种」在系统中用于 计件/计时 default 价记工人员筛选商品工序上绑定工种额外一层:把 某成品的某道工序一个工种 固定下来,使 UI 上「选工序即隐含工种,再只显示能做该工种的工人」。若工序 不选工种,则不按工种限制工人,但仍可按工序码做统计与报工对齐。


文档随代码迭代可能变更;若与代码不一致,以 backend/zenstack/schema.zmodel 与实现为准。

TaskFlow 内部文档 Released under the MIT License.