客户生命周期 · 阶段判定逻辑规范
生命周期阶段
计算逻辑与取值规范
本文档面向开发团队,为模塑一体(6阶段)和商品模(6阶段)提供完整的 SAP/CRM 取数字段、判定公式、时间窗口定义及自动化触发机制。
SAP 自动取数
CRM 查询
需计算/推断
SAP + CRM 联合
00
判定逻辑概览
12 个阶段(两套业务各 6 个)的数据来源分类汇总
SAP 自动取数 — 直接查询 SAP 订单/账款/项目表
CRM 查询 — 直接查询 CRM 商机/RFQ/报价记录
需计算 — 基于 SAP 数据做时间窗口/增长率等衍生计算
SAP + CRM 联合 — 两系统数据同时参与判定(AND/OR 逻辑)
| 业务 | 阶段 | 名称 | 数据来源 | 核心判定逻辑类型 |
| INT |
P1 |
潜在客户 |
联合 |
CRM 活跃商机 AND SAP 无成交(负向核验) |
| INT |
P2 |
新客户导入 |
SAP |
项目号计数 = 1 AND 存在模具 SO |
| INT |
P3 |
成长阶段 |
计算 |
近6月新项目号 ≥ 2 OR 采购额环比增长 > 15% |
| INT |
P4 |
成熟阶段 |
计算 |
连续12月有 PO AND 项目总数 ≥ 3 |
| INT |
P5 |
衰退阶段 |
联合 |
CRM 6月无新 RFQ AND SAP 采购额同比下降 > 15% |
| INT |
P6 |
流失/赢回 |
联合 |
SAP 6月无发货 AND CRM 无活跃 RFQ |
| COM |
P1 |
潜在客户 |
联合 |
CRM 活跃商机 AND SAP 无成交(同 INT-P1) |
| COM |
P2 |
新客户导入 |
SAP |
项目号计数 = 1 AND 已转 PO |
| COM |
P3 |
成长阶段 |
计算 |
近12月项目号 > 2 |
| COM |
P4 |
成熟阶段 |
计算 |
连续 2 个自然年均有成交记录 |
| COM |
P6 |
衰退阶段 |
联合 |
SAP 12月无新成交 AND CRM 6月无新 RFQ |
| COM |
P7 |
流失/赢回 |
SAP |
SAP 连续18月无新成交 |
01
模塑一体业务(INT)· 阶段判定详细规范
6 个生命周期阶段,覆盖从潜在到流失的完整客户旅程
SAP + CRM
INT
P1 · 潜在客户
商务接洽期
CRM 取数
商机模块:状态为活跃(Open/In-Progress)的商机记录,按客户编号过滤
SAP 负向核验
SD 销售订单 / CO 项目:查询该客户是否存在任何已确认订单或项目号,结果为空才满足
判定逻辑
-- INT-P1: 潜在客户判定
-- 条件:CRM 有活跃商机 AND SAP 无任何成交记录
CRM_ACTIVE_OPP = COUNT(*)
FROM crm.opportunities
WHERE customer_id = :cust_id
AND stage NOT IN ('Closed Won', 'Closed Lost')
SAP_HAS_RECORD = COUNT(*)
FROM sap.sales_orders -- VBAK/VBAP
WHERE KUNNR = :cust_id
AND order_status NOT IN ('Cancelled')
IS_P1 = (CRM_ACTIVE_OPP > 0) AND (SAP_HAS_RECORD = 0)
ℹ
SAP 负向核验范围:应包含销售订单(VBAK)、模具合同(CO 内部订单 AUFNR)、项目号(WBS/PRSNR)三类,任意一类存在均视为"有成交记录",P1 条件不满足。
SAP AUTO
INT
P2 · 新客户导入
准量产启动期
SAP 模块
CO / PS:项目号(AUFNR/PRSNR)+ SD:模具销售订单类型过滤
关键过滤条件
订单类型须为模具类(SO_TYPE = 'MOLD'),注塑量产 PO 不计入
判定逻辑
-- INT-P2: 新客户导入判定
-- 条件:SAP 项目号总数 = 1 AND 该项目已产生模具 SO
PROJ_COUNT = COUNT(DISTINCT project_id)
FROM sap.projects -- CO/PS 项目主数据
WHERE KUNNR = :cust_id
AND project_status NOT IN ('Cancelled', 'Rejected')
HAS_MOLD_SO = COUNT(*)
FROM sap.sales_orders -- VBAK/VBAP
WHERE KUNNR = :cust_id
AND order_type = 'MOLD' -- 模具类订单类型
AND order_status = 'Confirmed'
IS_P2 = (PROJ_COUNT = 1) AND (HAS_MOLD_SO > 0)
需计算
INT
P3 · 成长阶段
业务爆发期
SAP 模块
CO/PS 项目(项目启动日期)+ SD/FI(采购金额统计)
时间窗口
滚动 6 个月(TODAY − 180 天至 TODAY)
判定逻辑(OR 关系,满足其一即进入P3)
-- INT-P3: 成长阶段判定(双条件 OR)
-- 条件A:近6个月新启动项目号 ≥ 2
NEW_PROJ_6M = COUNT(DISTINCT project_id)
FROM sap.projects
WHERE KUNNR = :cust_id
AND start_date >= (TODAY - 180)
AND project_status NOT IN ('Cancelled')
-- 条件B:采购金额环比增长 > 15%
-- 定义:当前6个月采购额 vs 前6个月采购额
AMT_CURR_6M = SUM(net_value) -- VBAP.NETWR,已确认订单
FROM sap.sales_orders
WHERE KUNNR = :cust_id
AND confirm_date BETWEEN (TODAY-180) AND TODAY
AMT_PREV_6M = SUM(net_value)
FROM sap.sales_orders
WHERE KUNNR = :cust_id
AND confirm_date BETWEEN (TODAY-360) AND (TODAY-181)
MOM_GROWTH = (AMT_CURR_6M - AMT_PREV_6M) / NULLIF(AMT_PREV_6M, 0) × 100
-- NULLIF 防止除零;前期无数据时 MOM_GROWTH = NULL,该条件不满足
IS_P3 = (NEW_PROJ_6M >= 2) OR (MOM_GROWTH > 15)
⚠
注意:前6个月(AMT_PREV_6M)为零时,增长率计算结果为 NULL(不满足增长条件),不应视为"无穷大增长"触发 P3。建议在业务文档中明确此边界,避免新客第一期数据被误判为成长期。
需计算
INT
P4 · 成熟阶段
高效收益期
SAP 模块
SD 采购订单 EKKO/EKPO(PO 按月分组)+ CO/PS(项目号总数)
时间窗口
滚动 12 个月,按自然月分组(12 个 bucket)
判定逻辑(AND 关系,两条件同时满足)
-- INT-P4: 成熟阶段判定
-- 条件A:连续12个月均有滚动PO(每月至少1张)
PO_MONTHS = COUNT(DISTINCT DATE_FORMAT(po_date, 'YYYY-MM'))
FROM sap.purchase_orders -- EKKO/EKPO
WHERE KUNNR = :cust_id
AND po_date >= DATE_SUB(TODAY, INTERVAL 12 MONTH)
AND po_status = 'Active'
-- 连续性判断:需验证 12 个月内无断月,而非仅统计总月数
-- 建议实现:生成 12 个月日历,LEFT JOIN PO 数据,检查无空月
HAS_CONTINUOUS_PO= (MISSING_MONTHS_COUNT = 0) -- 见注释
-- 条件B:项目总数 ≥ 3
TOTAL_PROJ_COUNT = COUNT(DISTINCT project_id)
FROM sap.projects
WHERE KUNNR = :cust_id
AND project_status NOT IN ('Cancelled', 'Rejected')
IS_P4 = HAS_CONTINUOUS_PO AND (TOTAL_PROJ_COUNT >= 3)
ℹ
连续性判断实现建议:使用日历表(dim_date)生成近12个月的月份列表,LEFT JOIN 到 PO 数据,统计 po_count = 0 的月份数(MISSING_MONTHS_COUNT)。若 = 0 则视为"连续",存在任何断月则 HAS_CONTINUOUS_PO = FALSE。
SAP + CRM
INT
P5 · 衰退阶段
产能萎缩预警
CRM 取数
RFQ / 商机模块:近6个月是否有新建 RFQ 记录
SAP 取数
SD 销售订单:采购金额同比(当年 vs 上年同期)
判定逻辑(AND 关系,两条件同时满足)
-- INT-P5: 衰退阶段判定(双系统 AND)
-- 条件A(CRM):连续6个月无新 RFQ
NEW_RFQ_6M = COUNT(*)
FROM crm.rfq_records
WHERE customer_id = :cust_id
AND created_date >= (TODAY - 180)
AND rfq_status != 'Cancelled'
-- 条件B(SAP):采购金额同比下降 > 15%
-- 定义:当前12个月 vs 上一个12个月(同比,非环比)
AMT_CY = SUM(net_value) -- 当年滚动12月
FROM sap.sales_orders
WHERE KUNNR = :cust_id
AND confirm_date BETWEEN (TODAY-365) AND TODAY
AMT_PY = SUM(net_value) -- 上年同期12月
FROM sap.sales_orders
WHERE KUNNR = :cust_id
AND confirm_date BETWEEN (TODAY-730) AND (TODAY-366)
YOY_DECLINE = (AMT_PY - AMT_CY) / NULLIF(AMT_PY, 0) × 100
-- 正值表示下降,即 AMT_CY < AMT_PY
IS_P5 = (NEW_RFQ_6M = 0) AND (YOY_DECLINE > 15)
⚠
预警前置建议:当 NEW_RFQ_6M = 0 但 YOY_DECLINE 尚未达到 15% 时,建议触发"衰退预警"(非正式阶段判定),推送给客户经理提前干预,而不是等到两条件同时满足才报警。
SAP + CRM
INT
P6 · 流失/赢回
供应脱钩期
SAP 取数
WM 发货通知 LIKP 或 FI 收款凭证:近6个月是否有发货/入账记录
CRM 取数
RFQ / 商机模块:近6个月是否有任何活跃 RFQ
判定逻辑(AND 关系)
-- INT-P6: 流失/赢回判定
-- 注:原始规则"无发货(或无入账)"为OR关系,建议优先用发货记录,入账作为兜底
-- 条件A(SAP):连续6个月无发货记录
SHIP_6M = COUNT(*)
FROM sap.deliveries -- LIKP,出库类型过滤
WHERE KUNNR = :cust_id
AND actual_gi_date >= (TODAY - 180)
AND delivery_status = 'Completed'
-- 兜底方案(发货数据不可用时):查 FI 收款
PAYMENT_6M = COUNT(*)
FROM sap.fi_payments -- BSID/BSAD 已清凭证
WHERE KUNNR = :cust_id
AND clearing_date >= (TODAY - 180)
-- 条件B(CRM):无活跃 RFQ
ACTIVE_RFQ_6M = COUNT(*)
FROM crm.rfq_records
WHERE customer_id = :cust_id
AND created_date >= (TODAY - 180)
AND rfq_status NOT IN ('Cancelled', 'Closed Lost')
IS_P6 = ((SHIP_6M = 0) OR (PAYMENT_6M = 0)) AND (ACTIVE_RFQ_6M = 0)
02
商品模业务(COM)· 阶段判定详细规范
6 个生命周期阶段,以模具项目为核心指标
SAP + CRM
COM
P1 · 潜在客户
准入与寻源期
与 INT-P1 的差异
逻辑完全相同,区别在于 CRM 商机类型须过滤为商品模类(OPP_TYPE = 'MOLD')
SAP 无成交定义
商品模无 SAP 注塑项目,仅查模具合同订单(AUFNR)是否存在
判定逻辑
-- COM-P1: 潜在客户(逻辑同 INT-P1,类型过滤不同)
CRM_ACTIVE_OPP = COUNT(*)
FROM crm.opportunities
WHERE customer_id = :cust_id
AND opp_type = 'MOLD' -- 商品模类型过滤
AND stage NOT IN ('Closed Won', 'Closed Lost')
SAP_MOLD_ORDERS = COUNT(*)
FROM sap.internal_orders -- CO AUFNR,模具合同
WHERE KUNNR = :cust_id
AND order_status NOT IN ('Cancelled')
IS_P1 = (CRM_ACTIVE_OPP > 0) AND (SAP_MOLD_ORDERS = 0)
SAP AUTO
COM
P2 · 新客户导入
破冰交付期
与 INT-P2 的差异
商品模不看"模具 SO",而是看是否已转 PO(Purchase Order)
SAP 模块
CO 内部订单 AUFNR(模具项目)+ MM/SD 采购订单 EKKO
判定逻辑
-- COM-P2: 新客户导入判定
-- 条件:SAP 模具项目号 = 1 AND 该项目已产生采购订单(PO)
MOLD_PROJ_COUNT = COUNT(DISTINCT order_id)
FROM sap.internal_orders -- CO AUFNR
WHERE KUNNR = :cust_id
AND order_type = 'MOLD'
AND order_status NOT IN ('Cancelled')
HAS_PO = COUNT(*)
FROM sap.purchase_orders -- EKKO/EKPO
WHERE KUNNR = :cust_id
AND po_status = 'Released' -- 已转PO(已下单,非草稿)
AND po_type = 'MOLD'
IS_P2 = (MOLD_PROJ_COUNT = 1) AND (HAS_PO > 0)
需计算
COM
P3 · 成长阶段
份额渗透期
与 INT-P3 的差异
时间窗口为12 个月(INT 为 6 个月),阈值为> 2 个(INT 为 ≥ 2),且无环比增长条件
SAP 模块
CO 内部订单:以项目启动日期在近12月内为统计口径
判定逻辑
-- COM-P3: 成长阶段判定(单一条件)
-- 条件:近12个月内模具项目号数量 > 2
MOLD_PROJ_12M = COUNT(DISTINCT order_id)
FROM sap.internal_orders -- CO AUFNR,模具项目
WHERE KUNNR = :cust_id
AND start_date >= (TODAY - 365)
AND order_status NOT IN ('Cancelled')
IS_P3 = (MOLD_PROJ_12M > 2)
-- 注:> 2 即 ≥ 3,与模塑一体 ≥ 2 的阈值不同,请注意区分
需计算
COM
P4 · 成熟阶段
战略绑定期
与 INT-P4 的差异
商品模用自然年而非滚动月;判定逻辑为"2 个自然年均有成交",而非 PO 连续性
SAP 模块
CO 内部订单 / SD 销售订单:按自然年分组统计成交记录
判定逻辑
-- COM-P4: 成熟阶段判定
-- 条件:连续2个自然年均有模具项目成交记录
-- 当前自然年 = YEAR(TODAY),上一自然年 = YEAR(TODAY) - 1
ORDERS_CY = COUNT(DISTINCT order_id)
FROM sap.internal_orders -- 模具合同/内部订单
WHERE KUNNR = :cust_id
AND YEAR(confirmed_date) = YEAR(TODAY)
AND order_status = 'Confirmed'
ORDERS_PY = COUNT(DISTINCT order_id)
FROM sap.internal_orders
WHERE KUNNR = :cust_id
AND YEAR(confirmed_date) = YEAR(TODAY) - 1
AND order_status = 'Confirmed'
IS_P4 = (ORDERS_CY > 0) AND (ORDERS_PY > 0)
-- ⚠ 边界情况:年初(如1月)时 ORDERS_CY 极可能为0
-- 建议:1-2月期间采用"最近24个月内跨自然年"替代方案
-- 替代方案:分别检查 [TODAY-730, TODAY-365] 和 [TODAY-365, TODAY] 两个区间
⚠
年初边界问题:每年 1–2 月期间,ORDERS_CY 极大概率为 0,导致几乎所有客户无法被判定为 P4(成熟),产生大规模误降级。建议采用"近24个月内跨越两个自然年"替代方案,或在 1–2 月期间使用滚动24个月的判定逻辑。
SAP + CRM
COM
P6 · 衰退阶段
份额流失预警期
SAP 时间窗口
连续 12 个月无新成交(比 INT-P5 的6个月更长)
CRM 时间窗口
近 6 个月内无新报价(RFQ),两条件均满足才触发
判定逻辑(AND 关系)
-- COM-P6: 衰退阶段判定
-- 条件A(SAP):连续12个月无新模具成交
NEW_ORDERS_12M = COUNT(*)
FROM sap.internal_orders
WHERE KUNNR = :cust_id
AND confirmed_date >= (TODAY - 365)
AND order_status = 'Confirmed'
-- 条件B(CRM):近6个月内无新报价/RFQ
NEW_RFQ_6M = COUNT(*)
FROM crm.rfq_records
WHERE customer_id = :cust_id
AND created_date >= (TODAY - 180)
AND rfq_status != 'Cancelled'
IS_P6 = (NEW_ORDERS_12M = 0) AND (NEW_RFQ_6M = 0)
SAP AUTO
COM
P7 · 流失/赢回
业务静默期
与 COM-P6 的差异
时间窗口延长至 18 个月,仅看 SAP 成交,不再要求 CRM 无 RFQ
与 INT-P6 的差异
INT-P6 看发货记录(物流),COM-P7 看成交记录(合同),口径不同
判定逻辑
-- COM-P7: 流失/赢回判定(最终阶段)
-- 条件:连续18个月无新模具成交记录
NEW_ORDERS_18M = COUNT(*)
FROM sap.internal_orders
WHERE KUNNR = :cust_id
AND confirmed_date >= (TODAY - 548) -- 18个月 ≈ 548天
AND order_status = 'Confirmed'
IS_P7 = (NEW_ORDERS_18M = 0)
-- 注:P7 是在 P6 条件持续满足12个月后自然演进而来
-- 系统应优先判定 P7,若 IS_P7=TRUE 则不再判定 P6(避免同时触发)
03
共用 SAP / CRM 字段清单
两套业务复用的基础数据字段,建议统一封装为中台数据服务
SAP 核心字段
| 字段/表 | 含义 | 用于阶段 |
| VBAK.KUNNR | 客户编号(销售订单) | 全部 |
| VBAP.NETWR | 订单净额(金额统计) | INT-P3/P5 |
| VBAK.AUDAT | 订单日期(时间窗口过滤) | INT-P3/P5 |
| AUFNR(CO) | 内部订单号 = 模具项目号 | 全部 |
| EKKO/EKPO | 采购订单(PO),按月统计 | INT-P4/P2,COM-P2 |
| LIKP.WADAT_IST | 实际发货日期 | INT-P6 |
| BSAD.AUGDT | 收款清账日期(兜底) | INT-P6 |
CRM 核心字段
| 字段 | 含义 | 用于阶段 |
| customer_id | 客户编号(与 SAP KUNNR 映射) | 全部 |
| opportunities.stage | 商机阶段(活跃/关闭) | INT/COM-P1 |
| opportunities.opp_type | 商机类型(MOLD/INJECTION) | COM-P1 |
| rfq_records.created_date | RFQ 创建日期 | INT-P5/P6,COM-P6 |
| rfq_records.rfq_status | RFQ 状态(排除已取消) | INT-P5/P6,COM-P6 |
🔗
客户ID映射是关键前提:SAP 的 KUNNR 与 CRM 的 customer_id 必须建立统一映射表(Customer Master Key)。所有联合判定(P1/P5/P6/COM-P6)都依赖此映射,若映射缺失或错误,将导致跨系统条件判定失败。建议在数据中台维护专用的客户主数据映射服务。
04
阶段判定执行流程与优先级
阶段之间存在包含关系,需按优先级顺序执行,命中即停止
推荐判定顺序(优先级从高到低)
-- 阶段判定主流程(每客户每次刷新时执行)
-- 规则:按顺序判定,命中第一个满足的阶段即返回,不继续往下
FUNCTION detectStage(customer_id, biz_type):
-- 0. 数据就绪检查
IF SAP_CRM_MAPPING_EXISTS(customer_id) = FALSE:
RETURN 'DATA_ERROR' -- 映射缺失,无法判定
-- 1. 最终阶段优先(P6/P7 需最先判定,避免被更宽松的条件覆盖)
IF biz_type = 'INT' AND IS_P6(customer_id): RETURN 'INT-P6'
ELIF biz_type = 'COM' AND IS_P7(customer_id): RETURN 'COM-P7'
ELIF biz_type = 'COM' AND IS_P6(customer_id): RETURN 'COM-P6'
-- 2. 衰退阶段
ELIF biz_type = 'INT' AND IS_P5(customer_id): RETURN 'INT-P5'
-- 3. 成熟阶段(条件最严格,需最先在正向阶段中判定)
ELIF biz_type = 'INT' AND IS_P4(customer_id): RETURN 'INT-P4'
ELIF biz_type = 'COM' AND IS_P4(customer_id): RETURN 'COM-P4'
-- 4. 成长阶段
ELIF biz_type = 'INT' AND IS_P3(customer_id): RETURN 'INT-P3'
ELIF biz_type = 'COM' AND IS_P3(customer_id): RETURN 'COM-P3'
-- 5. 新客户导入
ELIF biz_type = 'INT' AND IS_P2(customer_id): RETURN 'INT-P2'
ELIF biz_type = 'COM' AND IS_P2(customer_id): RETURN 'COM-P2'
-- 6. 潜在客户(最宽松,排在最后)
ELIF IS_P1(customer_id, biz_type): RETURN 'P1'
-- 7. 无法归类
ELSE: RETURN 'UNCLASSIFIED' -- 如:历史档案客户,已离场但不满足P6/P7
-- 刷新触发机制:
-- T1: 每月月结后 T+1 工作日批量刷新所有活跃客户
-- T2: CRM 新建 RFQ / 商机状态变更 → 即时触发单客户重判
-- T3: SAP 新建订单 / 发货完成 → 即时触发单客户重判
LC-STAGE · 客户生命周期阶段判定逻辑规范
优先落地:客户ID映射表 → SAP字段封装 → CRM RFQ统计接口 · 2026-04-20