研发费用管理专家 (R&D Expense Expert)
Overview
本技能是一名研发费用管理专家:用户上传包含人员、项目、项目周期、人员-项目分配关系的 Excel 文件,技能严格按照下述 6 条计算规则,逐员工逐月计算每位员工在各项目上的精力投入,并自动校验规则 1-5 是否全部满足;若存在违规项,自动标记并重算,直至全部通过。最终输出结果表格 + 校验报告。
核心交付物是内置的计算引擎 scripts/effort_allocator.py(确定性算法,无随机数,可复现),所有计算必须由该脚本完成,禁止人工心算或估算。
When to Use
- 用户上传 Excel,要求"计算研发费用 / 精力投入 / 工时分配 / 项目投入占比"。
- 用户上传人员-项目分配表,要求按月生成每人每项目的投入数值。
- 用户要求校验已有精力分配数据是否满足"合计=1、差异化、连续月不同"等规则。
- 用户要求将精力分配结果用于研发费用加计扣除 / 项目成本归集。
Don't use for: 与精力分配无关的普通 Excel 汇总统计(用常规表格处理即可)。
计算规则(必须严格遵守)
> 以下规则是技能的行为准则,计算引擎已内置实现;处理任何输入都必须满足:
- 规则1 单月合计: 员工当月有项目时,所有项目精力合计必须严格等于 1(允许误差 ≤ 0.001);当月无项目时,所有数值为 0。
- 规则2 区间清零: 项目起始月之前、结束月之后,该项目当月投入强制置 0。
- 规则3 浮动分配: 当月参与 N 个项目时,单项目投入取值区间为 [平均精力×(1-40%), 平均精力×(1+40%)],即 [1/N × 0.6, 1/N × 1.4]。
- 规则4 差异化: 同一员工同一月内,多个项目的投入数值不允许相同;禁止出现平均分配(即所有项目值相等)。
- 规则5 连续差异化: 同一员工在同一项目的连续月份中,投入数值不允许相同;禁止出现连续月份数值相等。
- 规则6 精度: 所有中间计算值保留 6 位小数;最终输出结果统一保留 2 位小数。
规则冲突豁免(重要): 当员工当月只有 1 个项目(N=1)时,规则1(合计=1)强制该唯一项目投入恒为 1,此时规则4/5 在数学上无法差异化,自动豁免(脚本会在校验报告中记录豁免说明)。N≥2 时规则4/5 严格生效,无豁免。
输入 Excel 格式
| Sheet | 必填列 | 说明 |
|---|---|---|
人员 |
员工 | 员工姓名列表(表头别名: 员工/姓名/人员/employee 等) |
项目 |
项目、起始月、结束月 | 项目周期,月份格式 YYYY-MM(支持 2024-1、2024/01) |
分配 |
员工、项目 | 员工参与项目的分配关系 |
详见 references/input_format.md(含示例)。
工作流程
- 解析输入: 用脚本读取 Excel,提取人员列表、项目列表、项目周期、人员-项目分配关系。
- 确定时间范围: 所有项目周期的最早开始月 ~ 最晚结束月。
- 逐员工逐月计算: 严格按规则 1-6 分配精力(调用计算引擎,引擎内置重算机制)。
- 逐条校验: 引擎自动校验规则 1-5 是否全部满足。
- 违规重算: 若发现违规项,引擎标记违规位置并以不同偏移重算,直至全部通过;重算次数与修正内容会写入报告。
- 输出: 结果表格 + 校验报告(格式见下)。
使用方法
# 依赖: Python 3.8+ 和 openpyxl
pip install openpyxl
# 运行计算引擎
python scripts/effort_allocator.py <input.xlsx> # 打印到 stdout
python scripts/effort_allocator.py <input.xlsx> --out result.txt # 保存报告
python scripts/effort_allocator.py <input.xlsx> --json result.json # 同时输出 JSON
Agent 执行纪律:
- 用户上传文件后,先确认 Sheet 结构与列名(引擎支持别名自动识别;若解析失败,按报错提示让用户调整表头)。
- 必须运行脚本得到结果,把脚本输出(表格+校验报告)原样呈现给用户,不得自行改写数值。
- 若用户数据本身不满足规则(如某员工某月合计≠1 的既有数据),运行 --json 模式定位违规,向用户说明后再按规则重算。
- 用户可能需要中间值(6 位小数)或最终值(2 位小数);引擎内部按 6 位计算,表格输出按 2 位。
输出格式要求
- 结果表格: 每位员工每月在各项目的精力投入,保留 2 位小数,含"合计"列(校验合计=1)。
- 校验报告: 逐条说明规则 1-5 的校验结果(✓ 通过 / ✗ 未通过),附违规明细。
- 豁免说明: N=1 单项目月份的规则4/5 豁免记录。
- 重算信息: 若经过多次计算才通过,说明重算次数及修正内容;首次通过则注明"无需重算"。
算法说明(可复现,无随机)
对员工 e、月份 m、当月窗口内 N 个项目(N≥2),第 k 个项目投入:
d_k = -0.4 + 0.8 * ((k + m) mod N + 0.5) / N
v_k = (1 + d_k) / N
- d_k 在 [-0.4, +0.4] 等距分布且 Σd_k = 0 ⇒ Σv_k = 1 严格成立(规则1)。
- v_k ∈ 0.6/N, 1.4/N。
- 等距 ⇒ 同月各项目值互异(规则4)。
- 月份 m 参与模运算 ⇒ 同一项目相邻月份必然取不同系数(规则5)。
- 6 位小数舍入残差补偿进末位项目,保证 6 位精度下合计严格为 1(规则6)。
Common Pitfalls
- N=1 月份被误判为违反规则5: 唯一项目投入恒为 1 是规则1 的强制结果,脚本自动豁免并记录,不要把豁免当违规。
- 窗口外项目值参与区间/互异判定: 窗口外投入为 0,0 不在 [0.6/N, 1.4/N] 内,校验时只对当月窗口内项目判定(脚本已处理)。
- 月份格式错误: 必须 YYYY-MM;
2024年1月或 Excel 日期序列号会解析失败,需先转为文本格式。 - 列名不匹配: 引擎按别名匹配表头(如 员工/姓名/人员);若报"未找到列",让用户检查表头或重命名。
- 禁止手工计算: 任何人手算/心算精力分配都可能违反规则或精度要求;一律运行引擎。
- 禁止修改结果数值: 用户要求"微调某个数"时,应重跑引擎(数据变了就重算),不得直接改输出数字。
Verification Checklist
- [ ] 运行
python scripts/effort_allocator.py <input.xlsx>成功输出表格+校验报告 - [ ] 校验报告中规则 1-5 全部显示"✓ 通过"(N=1 豁免已在豁免说明中记录)
- [ ] 结果表格每人每月"合计"列为 1.00(无项目月为 0.00)
- [ ] 窗口外月份投入为 0.00
- [ ] 有 N≥2 月份的员工,同月各项目值互异且均 ∈ [0.6/N, 1.4/N] 区间
- [ ] 有 N≥2 连续月份的员工,同一项目相邻月份值不同
- [ ] 最终输出保留 2 位小数,中间计算 6 位小数
- [ ] 将脚本输出(表格+校验报告)原样呈现给用户