客户生命周期 · 阶段判定逻辑规范
生命周期阶段
计算逻辑与取值规范
本文档面向开发团队,为模塑一体(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(12个月内至少有一单) 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 个自然年均有成交记录(滚动24个月,前后各12个月) |
| COM |
P6 |
衰退阶段 |
联合 |
SAP 12月无新成交(12个月内至少有一单) AND CRM 6月无新 RFQ |
| COM |
P7 |
流失/赢回 |
SAP |
SAP 连续18月无新成交(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个月采购额 - 前一个6个月采购额) ÷ 前一个6个月采购额 × 100%
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)为零时(如新客户或很久没采购),增长率会变成"无穷大",实际处理时直接判为"不满足",防止误判。NULLIF 处理后 MOM_GROWTH = NULL,该条件自动不满足。
需计算
INT
P4 · 成熟阶段
高效收益期
SAP 模块
SD 采购订单 EKKO/EKPO(PO 按月分组)+ CO/PS(项目号总数)
时间窗口
滚动 12 个月,12个月内至少有一单 PO 即满足
判定逻辑(AND 关系,两条件同时满足)
-- INT-P4: 成熟阶段判定
-- 条件A:近12个月内至少有一张PO(非连续每月)
PO_IN_12M = COUNT(*)
FROM sap.purchase_orders -- EKKO/EKPO
WHERE KUNNR = :cust_id
AND po_date >= DATE_SUB(TODAY, INTERVAL 12 MONTH)
AND po_status = 'Active'
HAS_PO_12M = (PO_IN_12M > 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_PO_12M AND (TOTAL_PROJ_COUNT >= 3)
ℹ
判定标准说明:"连续12个月有PO"按业务规则定义为"过去12个月内至少存在一张有效PO",而非要求每个月都有PO。这简化了实现逻辑,只需统计近12个月内PO数量是否 > 0 即可。
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 的差异
商品模用滚动24个月拆分为前后两个12个月区间;判定逻辑为"两个区间均有成交"
SAP 模块
CO 内部订单 / SD 销售订单:按滚动24个月的前后两个12个月区间分组统计成交记录
判定逻辑
-- COM-P4: 成熟阶段判定
-- 条件:连续2个自然年均有成交记录
-- 实现方式:滚动24个月,拆分为前12个月 和 后12个月 两段
-- 时间轴示例(TODAY = 2026.4.22):
-- 2024.4.22 ◄── 前12个月(必须有订单) ──► 2025.4.22 ◄── 后12个月(必须有订单) ──► 2026.4.22
-- ◄──────────────── 过去24个月 ────────────────►
ORDERS_PREV_12M = COUNT(DISTINCT order_id)
FROM sap.internal_orders -- 模具合同/内部订单
WHERE KUNNR = :cust_id
AND confirmed_date BETWEEN (TODAY - 730) AND (TODAY - 366)
AND order_status = 'Confirmed'
ORDERS_CURR_12M = COUNT(DISTINCT order_id)
FROM sap.internal_orders
WHERE KUNNR = :cust_id
AND confirmed_date BETWEEN (TODAY - 365) AND TODAY
AND order_status = 'Confirmed'
IS_P4 = (ORDERS_PREV_12M > 0) AND (ORDERS_CURR_12M > 0)
-- 此方案使用滚动窗口替代自然年,避免年初边界问题
ℹ
滚动窗口说明:采用滚动24个月拆分为前后两个12个月区间的方式,替代原自然年方案,彻底消除年初(1-2月)边界导致的大规模误降级问题。两个12个月区间内各至少有一笔已确认成交即满足条件。
SAP + CRM
COM
P6 · 衰退阶段
份额流失预警期
SAP 时间窗口
连续 12 个月无新成交(12个月内至少有一单即不满足)
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 个月(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