营销管理 - 销售计划(销售目标)前端联调方案
涉及页面
- 营销管理 → 销售计划(菜单 1065000,组件
crm/salesTarget/index)
- 营销管理 → 达成分析(菜单 1065100,组件
crm/salesTarget/analysis/index)
业务流程与数据带入
- 设定目标:管理员在「销售计划」页按周期(年/季/月)+ 维度(个人/部门/产品)设定销售目标。目标对象(用户/部门/物料)从系统下拉选择,目标指标(合同金额、回款金额、商机金额、新增客户数、新增合同数)手工录入。
- 周期自动换算:前端只提交
periodType(1年/2季度/3月)与 periodValue(如 2026、2026-Q1、2026-07),后台自动换算周期起止时间并落库;列表/详情展示换算后的起止时间。
- 状态自动判定:后台保存时按当前时间与周期自动判定状态(未生效/已生效/已结束),前端展示即可;仅「作废/恢复」由用户手动触发。
- 达成统计自动带入:列表、详情、达成分析均返回实际达成(合同金额、回款金额、商机金额、新增客户数、新增合同数)与达成率,前端直接展示,无需另行调用统计接口。
- 达成分析:用户在「达成分析」页选择周期(必选)+ 维度(可选)+ 状态(可选),后台按周期过滤返回目标列表(含实际达成与达成率)。
API
| 方法 |
路径 |
说明 |
| POST |
/crm/sales-target/create |
创建销售目标 |
| PUT |
/crm/sales-target/update |
更新销售目标 |
| PUT |
/crm/sales-target/change-status |
变更目标状态(作废/恢复/生效) |
| DELETE |
/crm/sales-target/delete?id= |
删除销售目标 |
| GET |
/crm/sales-target/get?id= |
目标详情(含实际达成+达成率) |
| GET |
/crm/sales-target/page |
目标分页(含实际达成+达成率) |
| GET |
/crm/sales-target/export-excel |
导出 Excel |
| GET |
/crm/sales-target/get-achievement-analysis |
达成分析 |
创建/更新请求参数(CrmSalesTargetSaveReqVO)
| 参数 |
类型 |
必填 |
说明 |
| id |
Long |
更新时必填 |
目标编号 |
| name |
String |
是 |
目标名称 |
| periodType |
Integer |
是 |
周期类型(字典 crm_sales_target_period_type:1年/2季度/3月) |
| periodValue |
String |
是 |
周期值,如 2026 / 2026-Q1 / 2026-07 |
| targetDimension |
Integer |
是 |
目标维度(字典 crm_sales_target_dimension:1个人/2部门/3产品) |
| targetUserId |
Long |
维度=个人时必填 |
目标用户编号 |
| targetDeptId |
Long |
维度=部门时必填 |
目标部门编号 |
| targetItemId |
Long |
维度=产品时必填 |
目标物料编号(关联 MDM) |
| contractTarget |
BigDecimal |
否 |
合同金额目标(元) |
| receivableTarget |
BigDecimal |
否 |
回款金额目标(元) |
| businessTarget |
BigDecimal |
否 |
商机金额目标(元) |
| customerTarget |
Integer |
否 |
新增客户数目标 |
| contractCountTarget |
Integer |
否 |
新增合同数目标 |
| remark |
String |
否 |
备注 |
状态变更请求参数(CrmSalesTargetChangeStatusReqVO)
| 参数 |
类型 |
必填 |
说明 |
| id |
Long |
是 |
目标编号 |
| status |
Integer |
是 |
目标状态(字典 crm_sales_target_status:0未生效/1已生效/2已结束/3已作废) |
达成分析请求参数(CrmSalesTargetAnalysisReqVO)
| 参数 |
类型 |
必填 |
说明 |
| periodType |
Integer |
是 |
周期类型 |
| periodValue |
String |
是 |
周期值 |
| targetDimension |
Integer |
否 |
目标维度,为空查全部 |
| status |
Integer |
否 |
状态,为空查全部 |
响应字段(CrmSalesTargetRespVO)
目标基础字段(name/periodType/periodValue/startTime/endTime/targetDimension/status/remark/createTime/creator)之上,新增以下字段:
| 字段 |
类型 |
说明 |
| targetUserName |
String |
目标对象名称(维度=个人时为昵称) |
| targetDeptName |
String |
目标部门名称(维度=部门) |
| targetItemName |
String |
目标物料名称(维度=产品) |
| actualContractPrice |
BigDecimal |
实际合同金额(元) |
| actualReceivablePrice |
BigDecimal |
实际回款金额(元) |
| actualBusinessPrice |
BigDecimal |
实际商机金额(元) |
| actualCustomerCount |
Long |
实际新增客户数 |
| actualContractCount |
Long |
实际新增合同数 |
| contractRate |
BigDecimal |
合同金额达成率(%) |
| receivableRate |
BigDecimal |
回款金额达成率(%) |
| businessRate |
BigDecimal |
商机金额达成率(%) |
| customerRate |
BigDecimal |
新增客户数达成率(%) |
| contractCountRate |
BigDecimal |
新增合同数达成率(%) |
| creatorName |
String |
创建人名称 |
响应示例:
{
"code": 0,
"data": {
"id": 1,
"name": "2026年度销售目标-张三",
"periodType": 1,
"periodValue": "2026",
"startTime": "2026-01-01 00:00:00",
"endTime": "2027-01-01 00:00:00",
"targetDimension": 1,
"targetUserId": 1,
"targetUserName": "张三",
"contractTarget": 500000.00,
"actualContractPrice": 32377.00,
"contractRate": 6.48,
"status": 1
}
}
字段展示规则
| 字段 |
展示位置 |
说明 |
| 目标名称 |
列表、详情 |
主标题 |
| 周期 |
列表、详情 |
周期类型字典转文本 + 周期值,如「年度 2026」 |
| 目标对象 |
列表、详情 |
按维度展示目标用户/部门/物料名称(targetUserName/targetDeptName/targetItemName) |
| 目标指标 |
列表、详情、分析 |
合同金额/回款金额/商机金额/新增客户数/新增合同数目标 |
| 实际达成 |
列表、详情、分析 |
与目标指标一一对应的实际值 |
| 达成率 |
列表、详情、分析 |
百分比,保留两位小数;目标为 0 或空时达成率为空(展示为 -) |
| 状态 |
列表、详情 |
字典转文本,已作废需置灰/禁止编辑 |
| 创建人 |
列表、详情 |
创建人昵称 |
业务规则说明
| 场景 |
规则 |
| 达成率计算 |
实际值 ÷ 目标值 × 100,保留 2 位小数;目标为空或 ≤0 时达成率返回 null |
| 周期换算 |
前端无需计算起止时间,后台按 periodValue 换算;年 2026、季 2026-Q1、月 2026-07 |
| 状态判定 |
后台按当前时间自动判定 未生效/已生效/已结束;前端新增编辑时无需手动选状态 |
| 作废/恢复 |
已作废的目标被编辑后仍保持作废状态,需先「恢复」再编辑生效 |
| 统计口径 |
合同金额/数量只统计审核通过(audit_status=20)的合同;回款只统计审核通过的回款;商机只统计赢单(end_status=1);客户按创建时间统计 |
| 产品维度 |
仅统计合同金额与合同数,回款/商机/客户数为 0 |
| 部门维度 |
含子部门下所有用户的数据 |
| 数据权限 |
目标为管理配置,不接入 CRM 数据权限,列表展示全部(可按需按创建人过滤) |
注意事项
- 达成率字段可能为 null,前端展示需兜底为
-,避免显示 0。
- 周期值格式严格:年
YYYY、季 YYYY-Q1~YYYY-Q4、月 YYYY-MM,前端表单校验需按此约束。
- 目标维度与目标对象互斥:维度=个人填 userId,部门填 deptId,产品填 itemId,其余留空;前端按维度切换表单项。
- 达成分析接口的 periodType + periodValue 为必填,未选周期时不应发起请求。
- 达成统计查询为逐条目标计算(约 5 条小 SQL),目标数量级几十~几百时性能可接受;若后续目标量级增大需改造为聚合统计,需提前知会后端。
- 「销售计划」页排序建议按创建时间倒序,与后台返回顺序一致(按 id 倒序)。