1. 项目概述:为什么我们需要“灵活工作流场景模板”
在SAP的日常运维和项目实施中,审批流是绕不开的核心环节。无论是采购订单的创建、财务凭证的过账,还是人事变动的申请,背后都有一套或多套工作流在默默运转。传统的SAP工作流(如使用SWB2、SWDD等事务码配置的经典工作流)功能强大,但配置过程往往较为复杂,牵一发而动全身,尤其是在需要为不同业务场景定制差异化审批路径时,配置和维护的工作量会急剧增加。
这就引出了“灵活工作流”(Flexible Workflow)的概念。它不是要取代经典工作流,而是作为一种更敏捷、更易用的补充方案,尤其适用于那些审批规则相对简单、但场景多变、需要快速部署的业务需求。而“场景模板”(Scenario Template)则是灵活工作流的核心构件。你可以把它理解为一个预定义的、可复用的审批流程“蓝图”。当业务用户在前台触发某个操作(比如创建一张采购申请),系统会根据预设的规则,自动选择匹配的场景模板,并实例化出一个具体的工作流实例,推送给相应的审批人。
想象一下,你们公司有十几种采购类型,每种类型的金额审批权限都不同。如果没有场景模板,你可能需要在后台为每一种组合都单独配置一条工作流,繁琐且容易出错。而有了场景模板,你只需要定义好“采购类型”和“金额区间”这两个条件,以及对应的审批层级,系统就能自动判断该走哪条路。这大大提升了流程的灵活性和可维护性。本次要深入探讨的,就是如何从零开始,在SAP中创建这样一个强大的灵活工作流场景模板,核心事务码是SWDD_SCENARIO。
2. 核心概念与架构拆解:理解灵活工作流的“五脏六腑”
在动手配置之前,我们必须先理清几个关键概念及其相互关系,这是避免后续配置混乱的基础。
2.1 灵活工作流的核心组件
一个完整的灵活工作流体系主要由以下几部分构成:
业务对象(Business Object)与业务上下文(Business Context):这是工作流的源头。任何需要审批的事情,都必须对应一个SAP业务对象,比如采购申请(Bus. Object:
BUS2105)、采购订单(BUS2012)等。业务上下文则定义了更具体的场景,例如“采购申请-创建”或“采购订单-金额变更”。系统通过标准增强点(如WORKFLOW_START)或BAdI(如WORKFLOW_BUSINESS_OBJECT_EC)来捕获业务对象的事件,并将其传递给灵活工作流引擎。条件(Condition):这是决策的大脑。条件用于判断当前业务实例(比如一张具体的采购申请单)应该适用哪个场景模板。条件通常基于业务对象的字段值,例如
PurchaseRequisition.NetAmount > 10000 AND PurchaseRequisition.PurchaseGroup = '001'。条件在事务码SWF_COND中定义和维护。场景(Scenario)与场景模板(Scenario Template):这是我们要创建的核心。一个场景代表一类完整的审批流程需求。而一个场景模板则是这个场景的一个具体实现版本,它绑定了一组具体的条件、审批步骤和代理规则。一个场景下可以有多个模板,系统会按优先级评估条件,选择第一个符合条件的模板来执行。SWDD_SCENARIO就是创建和管理它们的入口。
步骤(Step)与审批者(Approver):步骤定义了审批流程中的环节,如“直接主管审批”、“部门经理审批”、“财务审批”。每个步骤需要指定审批者是谁,这里就涉及到代理规则(Agent Assignment)。审批者可以是具体的用户ID、职位、工作中心,或者通过动态规则(如“申请人的直接上级”)来确定。
工作流定义(Workflow Definition):当场景模板被触发后,系统在后台会自动生成一个经典工作流定义(以
WS开头)。这个定义是系统级的,通常我们不需要直接修改它。灵活工作流配置的本质,就是在定义一个能自动生成这些工作流定义的规则集。
2.2 SWDD_SCENARIO:你的核心操作台
SWDD_SCENARIO是一个集成的配置界面。在这里,你可以:
- 创建和管理场景:定义场景的编号、描述和所属业务对象。
- 创建和管理场景模板:为场景添加具体的模板,设定其有效期、优先级,并关联条件。
- 设计审批步骤:以图形化或表格形式,拖拽添加审批步骤,并设置步骤间的顺序(串行、并行、会签)。
- 分配代理(审批人):为每一个步骤指定审批者确定规则。
- 模拟和测试:在不影响生产数据的情况下,测试模板的条件匹配和流程走向是否正确。
注意:灵活工作流的配置通常需要一定的后台权限,并且对业务对象的字段结构要有清晰了解。建议在开发或测试系统先行演练。
3. 实战演练:一步步创建你的第一个采购申请审批模板
现在,我们假设一个最常见的业务需求:为采购申请(PR)创建审批流程。规则是:金额 ≤ 5000元,只需申请人直接主管审批;金额 > 5000元且 ≤ 20000元,需要部门经理审批;金额 > 20000元,需要部门经理和财务总监两级审批。
3.1 前期准备:定义条件(SWF_COND)
条件是我们流程的“决策器”,必须先定义好。
- 事务码:打开SWF_COND。
- 创建条件:
- 条件1:低额审批
- 条件ID:
ZPR_LOW_VALUE - 描述:采购申请金额小于等于5000
- 条件表达式:
PurchaseRequisition.NetAmount LE 5000
- 条件ID:
- 条件2:中额审批
- 条件ID:
ZPR_MEDIUM_VALUE - 描述:采购申请金额大于5000且小于等于20000
- 条件表达式:
PurchaseRequisition.NetAmount GT 5000 AND PurchaseRequisition.NetAmount LE 20000
- 条件ID:
- 条件3:高额审批
- 条件ID:
ZPR_HIGH_VALUE - 描述:采购申请金额大于20000
- 条件表达式:
PurchaseRequisition.NetAmount GT 20000
- 条件ID:
- 条件1:低额审批
实操心得:在SWF_COND中编写条件时,务必使用业务对象的技术名称(如
PurchaseRequisition)和字段的技术名称(如NetAmount)。如果不确定字段名,可以到事务码SWO1中查看业务对象BUS2105的组件结构。另外,条件表达式支持AND、OR等逻辑运算符,但要注意括号的使用以确保逻辑正确。
3.2 核心配置:创建场景与模板(SWDD_SCENARIO)
进入事务码:打开SWDD_SCENARIO。
创建新场景:
- 点击“创建”按钮。
- 输入场景ID(如
ZPR_APPROVAL)和描述(如“采购申请分级审批”)。 - 在“业务对象”字段中输入
BUS2105(采购申请的业务对象),系统会自动带出描述。 - 保存。此时,你创建了一个空的场景。
为场景添加第一个模板(低额审批):
- 在左侧导航树中,右键点击你的场景
ZPR_APPROVAL,选择“创建模板”。 - 输入模板ID(如
TPL_LOW)和描述。 - 关键设置:
- 优先级:设为
10(数字越小,优先级越高。系统会从高优先级开始评估条件)。 - 条件:点击“条件”页签,将之前创建的条件
ZPR_LOW_VALUE分配给它。 - 有效期:通常留空,表示长期有效。如果需要设置临时流程,可以在这里指定起止日期。
- 优先级:设为
- 设计步骤:切换到“步骤”页签。这里通常使用“表格视图”更直观。
- 点击“创建步骤”,输入步骤ID(如
STEP10),描述“直接主管审批”。 - 代理分配:这是核心。点击该步骤的“代理”列。在弹出的对话框中,选择“规则”。常用的规则有:
WF_ORG_UNIT_MANAGER:根据组织架构找经理。你需要指定“组织单位”的来源,例如“申请人的默认职位所属的组织单元”。- 更常用的方法是使用“表达式”:点击“表达式”按钮,可以编写ABAP表达式来动态决定审批人。例如,要找到申请人的直接上级,表达式可能是:
@{PurchaseRequisition.Requester}.Supervisor。这需要你的HR组织架构已维护完整。 - 对于本例,我们假设通过一个自定义的BAdI或用户出口,能根据申请人工号找到其直接主管的用户ID。这里我们先简化为选择“规则”并指定一个测试用户。
- 步骤类型:默认为“审批”,表示需要审批人执行动作(批准、拒绝、重定向)。还有“通知”、“任务”等类型。
- 点击“创建步骤”,输入步骤ID(如
- 保存这个模板。
- 在左侧导航树中,右键点击你的场景
创建第二个模板(中额审批):
- 同样右键场景,创建新模板
TPL_MEDIUM,描述“部门经理审批”,优先级设为20。 - 分配条件
ZPR_MEDIUM_VALUE。 - 在步骤中,创建一步
STEP20,描述“部门经理审批”。代理分配可以选择规则WF_ORG_UNIT_MANAGER,并指向部门级别的组织单元。
- 同样右键场景,创建新模板
创建第三个模板(高额审批):
- 创建模板
TPL_HIGH,优先级30,条件ZPR_HIGH_VALUE。 - 这里需要串行两步:
STEP30_A:“部门经理审批”,代理同模板二。STEP30_B:“财务总监审批”。点击“创建后续步骤”,系统会自动将两个步骤用箭头连接,表示串行。为第二步分配代理,例如指定固定的财务总监用户ID,或通过规则找到财务部门的负责人。
- 创建模板
你的场景结构现在应该类似下表:
| 场景 | 模板ID | 优先级 | 条件 | 步骤(串行) | 目标审批人 |
|---|---|---|---|---|---|
| ZPR_APPROVAL | TPL_LOW | 10 | 金额 ≤ 5000 | STEP10: 直接主管审批 | 申请人的直接主管 |
| ZPR_APPROVAL | TPL_MEDIUM | 20 | 5000 < 金额 ≤ 20000 | STEP20: 部门经理审批 | 部门经理 |
| ZPR_APPROVAL | TPL_HIGH | 30 | 金额 > 20000 | STEP30_A: 部门经理审批 | 部门经理 |
| STEP30_B: 财务总监审批 | 财务总监 |
3.3 激活与传输
配置完成后,模板状态通常是“已修改”。需要激活才能生效。
- 在SWDD_SCENARIO中,选中你的场景,点击工具栏上的“激活”按钮。系统会激活该场景下的所有模板。
- 激活过程会生成后台的工作流定义(
WS*开头的任务)。你可以通过事务码SWIA查看已生成的工作流模板。 - 所有配置都存储在特定的传输请求中。记得将其分配到正确的传输请求,以便后续传输到测试和生产系统。
重要提示:激活后,务必进行模拟测试!SWDD_SCENARIO界面通常提供“模拟”或“测试”功能。你可以输入一个采购申请号,系统会展示根据该申请数据,会触发哪个模板、流程如何走。这是验证条件逻辑和代理分配是否正确的最关键一步,避免配置错误直接影响生产业务流程。
4. 高级技巧与深度优化配置
基础流程搭建起来后,我们会遇到更复杂的需求。以下是一些进阶配置点和技巧。
4.1 复杂条件与多条件组合
现实中的审批规则远不止金额。可能还需要考虑采购组、工厂、物料组、成本中心等多个维度。
- 在SWF_COND中,你可以创建包含多个字段的复杂条件。例如:
PurchaseRequisition.NetAmount GT 10000 AND (PurchaseRequisition.PurchaseGroup EQ '001' OR PurchaseRequisition.Plant EQ '1000') - 在SWDD_SCENARIO中,一个模板可以分配多个条件。这些条件之间是“与(AND)”的关系。也就是说,必须所有分配的条件都满足,该模板才会被选中。这为你提供了极大的灵活性来精确控制模板的触发范围。
4.2 动态代理分配的精髓
静态指定用户ID是最不推荐的方式,因为人员会变动。动态分配才是灵活工作流的灵魂。
- 使用标准规则:SAP预置了许多规则(以
WF_或FLEXWF_开头),如WF_ORG_UNIT_MANAGER(找组织单元负责人)、WF_RESPS_FOR_ORG_UNIT(找负责某组织单元的所有人)。在代理分配界面选择“规则”,然后选择合适的规则并配置其参数来源(通常来自业务对象的字段)。 - 使用ABAP表达式:这是最强大的方式。点击“表达式”按钮,进入表达式编辑器。你可以引用业务对象的属性,使用ABAP语法和函数进行复杂逻辑判断。
- 示例1:找申请人的二级上级。
@{PurchaseRequisition.Requester}.Supervisor.Supervisor - 示例2:根据成本中心找负责人。可能需要调用函数
HR_GET_ORGA_FOR_OBJECT来获取成本中心对应的负责人职位,再找到该职位上的用户。 - 表达式调试:表达式编辑器通常有“测试”功能,输入一个业务对象实例(如采购申请号),可以预览表达式计算出的结果,这对调试非常有用。
- 示例1:找申请人的二级上级。
4.3 并行审批与会签
有些步骤需要多人同时审批(并行),且可能需要所有人或一定比例的人同意(会签)。
- 创建并行步骤:在“步骤”表格视图中,创建两个步骤(如
STEP_A,STEP_B),它们没有前后的箭头连接,且属于同一个“容器步骤”或直接并列,系统即视其为并行。 - 设置会签规则:选中代表这一组并行步骤的“容器步骤”(如果没有,可以先创建一个类型为“并行处理”的容器步骤,再把具体步骤放进去)。在容器步骤的属性中,找到“完成规则”:
All:所有人必须同意(一票否决)。Percentage:达到指定百分比的人同意即可。At least one:至少一人同意即可。Majority:多数人同意。 根据业务风险控制要求选择合适的规则。
4.4 集成自定义审批逻辑与通知
- 自定义审批UI:标准的工作流任务可能信息不全。你可以通过开发Web Dynpro或Fiori应用作为“定制任务”,在SWDD_SCENARIO的步骤属性中,将“任务类型”指向你自定义的应用,从而为审批人提供更丰富的操作界面和业务数据。
- 邮件与消息通知:除了审批任务本身,你还可以在步骤前后添加“通知”类型的步骤。通知步骤可以触发发送邮件、发送SAP Office消息、或创建通知到用户的统一收件箱(如SAP Fiori Launchpad的Notifications)。这用于知会相关方流程进度,而不需要他们执行审批动作。
5. 常见问题排查与运维心得
即使配置再仔细,上线后也可能遇到各种问题。以下是一些典型问题的排查思路。
5.1 工作流没有触发
这是最常见的问题。请按以下顺序排查:
- 检查业务对象事件是否触发:在创建采购申请时,系统是否真的调用了工作流启动的增强点?可以在标准增强点
WORKFLOW_START或 BAdIWORKFLOW_BUSINESS_OBJECT_EC的实现中设置断点或添加日志,确认事件是否被捕获,以及传递的业务对象实例ID是否正确。 - 检查场景模板是否激活:在SWDD_SCENARIO中,确认你的场景和模板状态是“已激活”,而不是“已修改”或“已锁定”。
- 检查条件是否匹配:使用SWDD_SCENARIO的模拟测试功能,输入有问题的业务单据号,看系统模拟执行后选择了哪个模板。如果显示“未找到场景”,说明所有模板的条件都不满足。仔细检查业务单据的字段值是否真的符合你设定的条件。特别注意:金额、日期等字段的格式和单位(如金额是否包含税)必须与条件表达式中的预期完全一致。
- 检查代理是否分配成功:在模拟测试中,查看具体步骤的“代理”列。如果显示“未找到代理”,则说明代理分配规则或表达式执行失败,未能解析出任何有效的审批人。需要检查代理分配配置,并用表达式测试功能进行调试。
- 检查用户是否有工作流收件箱:审批任务最终会发到用户的SAP Business Workplace(事务码SBWP)或Fiori通知中心。确保目标用户已分配SAP_USER参数,并且工作流系统用户(WF-BATCH)已正确配置且运行正常。
5.2 审批任务找不到或显示错误
- 任务消失在SBWP中:检查用户的“已完成工作”文件夹。可能任务已被其他用户(如秘书)代审批,或者被系统自动处理(如果配置了缺省代理或替代规则)。
- 任务链接点不开:这通常与工作流容器中绑定的业务对象实例有关。可能是对象实例已被删除或锁定。可以通过事务码SWI1(工作流日志)或**SWI2*(工作流实例)查询具体的工作流实例,查看其错误信息。
- “循环检测”错误:如果在代理分配规则中,A的上级是B,B的上级又是A,或者最终指向了自己,系统会检测到代理分配循环并报错。需要检查组织架构数据的完整性。
5.3 性能优化建议
当流程非常复杂或单据量巨大时,需关注性能。
- 条件优化:避免在条件中使用过于复杂或需要访问多张数据库表的函数。尽量使用业务对象上直接可用的字段。
- 代理规则优化:动态表达式虽然灵活,但执行成本可能较高。对于相对固定的映射(如特定工厂对应固定审批组),可以考虑在自定义表中维护映射关系,然后在表达式中通过简单的表读取来获取审批人,这比复杂的组织架构遍历更高效。
- 定期归档:使用事务码SWIA或SWI6定期归档已完成的工作流实例,可以保持工作流运行时表(如SWWUSERWI)的清爽,提升系统整体性能。
5.4 配置变更管理
业务流程不是一成不变的。当审批规则需要调整时:
- 修改而非直接覆盖:尽量不要删除旧的激活模板,而是创建一个新的模板版本或新的模板,并调整其优先级。先将新模板激活并测试,确认无误后,再停用旧模板。这可以实现平滑过渡,避免流程中断。
- 影响分析:在SWDD_SCENARIO中,通常有“使用位置清单”或“影响分析”功能,可以查看一个条件或规则被哪些模板引用。在修改前先做分析,避免 unintended consequences。
- 完整测试:任何配置变更,都必须经过完整的单元测试(模拟测试)和集成测试(在测试系统创建真实业务单据触发流程)。