🍶 销售目标管理系统
把年度预算从董事会拆到每个销售桌面,再用合同签约的数据把进度自动回写上来。一杯酒,看到整条飞轮转得多快。
BOTTLE CHART
FY2026 · Larry · 年度进度 62%
↑ 同款 SVG 出自 frontend-src/components/BottleChart.tsx
年度完成
31/50
62% · 同期超进度 +4%
本月进度
5/10
含滚入 +2,剩余 5 单
本周进度
2/3
W3 · 还差 1
滚入预警
+2
上月未达,已自动滚入
设计要点
🎯 自上而下拆解
业务负责人录入年度总量 → 销售负责人 → 销售主管 → 业务 → 个人,4 级审批链确认。每级可退回带"反提案对照表",上级看到差异自己决定。
🌊 月度自动滚动
每月 1 日凌晨 00:05 跑 Scheduler:上月未达数自动 carry_over 到下月,无需审批。总量守恒,年初锁定后不可加码。
🔒 快照锁定
当月审批确认后,plan_sign_count 写入 locked_snapshot,字段变只读。要改必须走月度调整流,留全链路对照表 + 原因。
📊 SABC 价值映射
不只看签约数,要看价值。客户 level 自动映射年化:S=500万 / A=200万 / B=100万 / C=50万。瓶子图按级别分层堆叠。
⚡ 合同签约自动回写
ContractService 在状态变 signed 时触发 TargetProgressUpdater:当月 actual+1、单位数累加、客户分级计入 actual_by_level、当周 actual+1,全在一个事务里。
🤝 空节点处理
某级无审批人时自动跳过(skipped_no_actor 向上收拢);上级也可主动赋能下级(delegated),赋能链路留痕。
审批链(4 级,自上而下下发)
退回必须提交反提案对照表(指标对比 + 必填原因),上级看到差异后选择"接受建议"或"坚持原案"。 退回不会越级 —— 只回到上一节点,避免决策权下放失控。
月度滚动机制
日报联动
DailyReportService 在创建或获取日报时注入 target_snapshot,
日报详情页顶部自动嵌入只读卡片 —— 销售每天打开日报就看见目标进度,不用切换页面。
数据模型(4 张表)
sales_targets
年度总目标。一人一财年一条,含 target_by_level (JSONB) 和 status 状态机(drafting → pending_L3 → ... → confirmed)。
target_months
月度分解。每个 sales_target 12 行(财月 1 = 12 月)。含 plan / carry_over / actual / actual_by_level,以及 locked_snapshot 保存确认时的对照基线。
target_weeks
周度计划。个人自拆,4~5 行/月。各周 plan_sign_count 之和必须 ≥ 月度任务才能提交。
target_confirmations
审批流水。每次 confirm / reject_with_proposal / skipped_no_actor / delegated 一条,含 original_values + proposed_values + reason,完整审计链。
部署位置
👤 个人视图
销售首页顶部全幅瓶子图 + 右侧 KPI 面板。
👥 团队视图
销售主管 / 销售负责人页面:多瓶并排,点击任一瓶下钻到团队成员。
📈 跨团队
项目负责人页面:汇总大瓶(按整个业务线累加)或多瓶并排(按团队拆)。