许多制造团队算人工成本时,习惯用一个最省事的公式:工单做了多久 × 工作中心小时费率。
企业版 mrp_workorder_hr_account 明确不是这样。它先扩展 mrp.workcenter.productivity._prepare_analytic_line_values(),把每段员工作业写成带 employee_id 的 analytic line,名称里还会标记 [EMPL] 工单 - 员工。这意味着系统记录的不是“某工位今天开了多久”,而是“具体哪位员工在这张工单上贡献了多少时间和成本”。
更关键的是 mrp.workorder._compute_duration()。它在父类计算完工时后,会立即触发 _create_or_update_analytic_entry()。也就是说,人工成本不是等月末手工摊,而是随着工单时长变化实时维护 analytic 事实。取消工单时,action_cancel() 又会主动 unlink() 掉 employee_analytic_account_line_ids,避免留下已失效的人工成本轨迹。
测试 test_cost_calculation_multiple_employees_same_workcenter() 很能说明问题:同一工作中心允许两位员工有重叠时段,工位成本按工作中心真实占用区间算,员工成本则分别按各自小时成本累加。最后工单成本是员工成本总和加上工位成本,而不是从总时长里挑一个费率统一乘一下。
这就是为什么制造成本经常和现场直觉不同。现场觉得“工位开了 3 小时”,财务却看到人工比预想高,是因为两位员工可能同时在这 3 小时内工作,人工成本本来就会比单人时段更高。企业版把这种重叠视为真实业务,而不是异常。
实施时最容易忽略的地方有两个:一是员工小时成本没有维护,导致 analytic line 虽然生成了,金额却失真;二是工单被取消或重做后,没有回头确认旧 analytic line 是否已清空。前者会让成本偏低,后者会让报表残留幽灵成本。
所以企业版制造人工成本真正强调的,是员工级时间事实 + 工位级占用事实 同时存在,而不是拿一个统一费率去近似一切。
DISCUSSION
评论区