采购订单审批-WorkFlow
作者: 老周曰天曰地 来源: 老周曰天曰地
1.开发 WorkFlow
开发 SCP WorkFlow需要在Webide full-stack中。
需要将Portal服务和SAP Web IDE full-stack服务开启。
打开workflow编辑器
打开WebIDE服务,设置页面的Features栏中开启 Workflow Editor。
1.1.Workflow Models
整体SAP Workflow界面如图,依次为项目目录窗口、设计要素实现窗口、设计要素属性窗口。
SCP WorkFlow中要素分Tasks,Events,Gateways三大类。
2.1.1 Tasks
① User Task(用户待办):内嵌UI5 App集成,主要与用户做交互。可以对Workflow上下文信息进行基于RESTful接口的交互操作。
User Task设置参数
Priority:用户待办优先级
Subject :待办大标题, 可以使用表达式 eg: ${context.subject}
Users :待办用户。可以使用表达式 eg: ${context.user}
Groups :待办用户组。可以使用表达式 eg: ${context.userGroup}
注意:Users 和 Groups可以同时设置,两者范围不相互影响,待办会同时存在以上的用户中。
HTML5 App Name : 待办Ui5界面App名称
SAPUI5 Component : UI5 Component名称
注意 : 表达式即指向Workflow下以JSON格式存储的上下文内容中某个属性或对象。
② Service Task(消费HTTP服务) : Workflow消费服务的要素。
Service Task设置参数:
Destination: 服务的目标地址。在SAP cloud platform cockpit中定义,即上文中添加的Destination。
Choose a Service from: 服务类型,一般选择Others。
Path: 服务的路径,Workflow访问到服务资源的相对路径。
HTTP Method: 通用的HTTP方法,POST、GET、PUT、DELETE、PATCH。
Path to XSRF Token(POST、PUT、DELETE、PATCH): 获取服务Token的相对路径,避免跨域访问服务资源的问题。
Request Variable(POST、PUT、PATCH): 传入Service服务的参数。可以使用表达式。
Response Variable : Service获取数据后写入Workflow上下文内容的属性名称。可以使用表达式。
③ Scrpit Task(操作工作流属性): 读写工作流上下文内容,获取工作流状态信息等。Script中会指向一个Script文件,在文件中可以对工作流的属性进行访问和操作。
④Mail Task(发送邮件):通过预先在CP中设置好的邮件服务器发送邮件,可以发送HTML格式 和纯文本格式的邮件。
注意:发送HTML格式内容邮件,需要新建HTML页面。
邮件服务器配置:
在Workflow服务配置页,找到Destination页签
配置参考
注意:SAP CP Workflow支持的邮件服务器:①SMTP 587或465端口 ②支持STARTTLS协议 ③不验证授权码
2.1.2 GateWays
① Exclusive Gateway:排他选择。
注意:必须指定一个默认分支。
② Parallel Gateway:并行选择 。
用作分支工作流和合并工作流分支。
2.1.3 Events
①End Event:结束事件
工作流的分支结束节点,所有的End Event结束后,工作流才终止。
②Terminal Event:终止事件
工作流的终止节点,结束整个工作流,不管工作流的其余分支流程。
③Time Event:时间事件
设置的时间后触发的事件
1.2.WorkFlow Example
2.2.1 设置审批用户组和授权审批角色
本例中设置两级审批,需要新建两个用于审批的用户组。并将用户组分配至工作流审批角色中。
①设置审批用户组。
转到SAP Cloud Platform Cockpit 中“连接性”页签下“权限”页签。
“权限管理”Block转置“组”页签。
分别创建用户组 FirstGroup , SecondGroup。同时在右下角“单个用户”分配中,将所属审批节点的账号分配至相应用户组。
注意:用户分配中填写的账号是S或P账号,非子账号
②为用户/用户组设置审批角色
转到Workflow服务,点击“配置服务”。转到“角色”页签。
目前有四种权限:
WorkflowDeveloper : 开发工作流
WorkflowAdmin : 管理工作流
WorkflowParticipant : 工作流参与者
WorkflowInitiator : 工作流发起者
本例中:
①分配WorkflowAdmin给管理员账号,便于日志查看,操作工作流;
②分配WorkflowInitiator角色给一位单独账号;
③分配WorkflowParticipant角色给一二级审批节点用户组。
注意:用户分配中填写的账号是S或P账号,非子账号
至此,Workflow审批账号权限分配完毕。
2.2.3 新建Workflow项目
WebIDE 中新建一个Workflow项目,在选择界面Category栏选择Business Process Management创建一个新的Workflow。
出现StartEvent至EndEvent1的默认流程。
2.2.2 使用Service Task消耗OData服务 Get方法
①在StartEvent图标中选择添加ServiceTask。
②修改Service Task属性。修改Service Task的名称,在Detail 页签下,配置Service Task 消耗的Odata服务路径。
Destination:输入在SAP CP Cockpit 中配置的访问到SAP Cloud Connector的目标。
Choose a Service from: 选择“Others”。
Path: 选择OData服务路径。
注意:由于调用OData Get_Entity方法,需要传入参数订单抬头,使用表达式获取Workflow上下文的订单号属性 ‘${context.purOrdId}’。
例:/sap/opu/odata/sap/ZODATA_WORKFLOW2_SRV/purHeadSet(’${context.purOrdId}’)?$format=json
HTTP Method: 选择GET方法。
Response Variable:以表达式形式输入一个上下文节点属性,Workflow会将Odata服务返回数据Modify式写入上下文节点属性下。
我们将获取的OData集存放至Workflow上下文purHead属性中。表达式:${context.purHead}
后续在Workflow日志中,获取数据保存形式如图所示:
2.2.3 使用Parallel Gateway并发处理Service Task
实际过程中,如果多个Service Task之间没有逻辑关系,可以使用Parallel GateWay进行合并,同时进行几个Service Task。达到并行效果。
本例中将获取采购订单Head,和与之有Association联系的Item进行并行操作。
①在StartEvent图标选择后续Parallel Gateway。名称为Split Purchase Order Service
②在设计界面左边导航栏,拖动一个新的Service Task。命名为“Get Purchase Order Item”。
还是用到 Head的get_entity方法获取一个采购订单,通过OData的Navigate Property方式指向采购订单的Item明细。Path参数:/sap/opu/odata/sap/ZODATA_WORKFLOW_SRV/purHeadSet(’${context.purOrdId}’)/head_np_item?$format=json
将获取的OData集存放至Workflow上下文purItem属性中。表达式:${context.purItem}
后续在Workflow日志中,获取数据保存形式如图所示:
③ 将Parallel Gateway流程同时连接至 “Get Purchase Order Item” 的Service Task。
如图选中箭头图标,将流程画线连接至另一个Service Task中
④ 创建一个Parallel Gateway 将分支流程合并。
Parallel Gateway也可以将两个分支流程合并,然后进行后续流程。
在Get Purchase Order Head 节点添加一个Parallel Gateway名称为Merge Purchase Order Info,并将Get Purchase Order Item 节点连接至新建的Parallel Gateway中。
2.2.4 使用User Task创建待办
使用User Task承接上级节点,工作流会暂存至待办中。在待办App 界面我们可以内嵌自开发的Ui5 App。Ui5App可以对工作流上下文内容进行显示,也可以与工作流交互,更改工作流状态。
2.2.4.1 新建User Task
承接上文设计节点,在 Merge Purchase Order Info节点后新建User Task。名称First Level Approval
填写User Task 属性:
Priority : 设置待办优先级。
Subject : 待办条目的标题,设置为 “采购订单${context.purOrdId}审批”。
Users : 设置表达式 ${context.approveUserId} 这里可以单独设置审批用户,与用户组互不影响。
Groups : 设置用户组FirstGroup。这里也可以设置表达式,使之变成可配置形式。
Due Date : 设置到期日。
2.2.4.2 创建Custom Ui5程序
①WebIDE新建一个SAPUI5 Application。这里UI5程序数据来源为Workflow的上下文内容,Ui5 App不消费OData。
新建的Ui5程序在左侧项目窗口。
②Component.js中,使用RESTful接口获取WorkFlow上下文内容。
将上下文内容绑定到Component的jsonmodel中,以便后面XML页面数据绑定。
Path路径"/bpmworkflowruntime/rest/v1/task-instances/" + taskId + “/context”。
TaskId为工作流实例号,区分每个启动的工作流实例。context为工作流上下文最上层节点。
在init()方法添加代码如下:
1)获取待办的startupParamerters参数(可以获取到待办ID,工作流上下文数据),并绑定至“paramModel”JSONModel中。
2)获取Context数据,绑定至Component的默认JSONModel中。
3)在paramModel模型中新建一个属性为note,存储界面上用户填写的审批意见。
③在View的xml文件中添加表头ObjectHeader控件。绑定数据集purHead,路径为/purHead/d/…
④在View的xml文件中添加表控件Table,命名控件sap.m。绑定数据集purItem,路径为/purItem/d/result/…
绑定数据后的实际效果如下:
注意:Ui5 App内嵌在收件箱中,需要调整页面比例,避免被收件箱Overflow Footbar遮挡。
在Layout Editor界面设置UI5页面高度。
右击该页面,选择Open with Layout Editor.
设置合适的高度比例,使页面适合收件箱大小。
⑤添加审批记录Tab签
在Ui5待办程序的View中添加一个Tab用来显示每次待办记录下的审批记录。在View.xml文件中添加Tab控件。
审批记录通过时间顺序依次排开,形成一条时间线。这里添加 TimeLine控件用来显示审批记录。
将TimeLine和Table控件分别放在不同Tab签下。
⑥添加审批意见Tab签
在Ui5程序界面添加审批意见填写的控件。这里使用TextArea控件,并放在单独页签下。
为其绑定JsonModel。
⑤添加审批通过,拒绝按钮。
有两种方式可以添加按钮,一种在收件箱APP上集成,即调用inboxAPI方法添加按钮和事件。
另一种在Ui5 App上添加,在按钮事件调用工作流Restful接口即可。
这里在在收件箱APP上集成,在Component.js文件中添加代码Approve和Reject按钮。
⑥给按钮添加事件操作工作流
审批操作包含两部分:
1)给工作流上下文添加审批结果文本。
2)记录当前审批记录,存至JSON数组
2)结束当前待办状态,将工作流当前节点状态设置为Completed。
主要通过三个方法:_fetchToken , _completeTask , _refreshTask。
_fetchToken: 获取XSRF token,用于Workflow API 的post方法认证。
_completeTask: 调用Workflow API方法完成当前待办任务,将审批结果传递至Workflow上下文中。
_refreshTask: 清空收件箱中当前待办。
_completeTask方法:
1)获取token。
2)重新获取context上下文。使用this.getModel().getData();就能获取到Component绑定的默认JSONModel,即工作流上下文context。
3)添加审批记录
设计回传erp的context.post结构与CREATE_DEEP_ENTITY中方法用到的复杂结构一致。
4)调用工作流API,将当前待办设置为COMPLETE,并返写Context。
注意oContext不是sap.ui.model.json.JSONModel实例,而是一般json实例,才可以使用JSON.stringfy方法。
5)调用_refreshTask,刷新收件箱。
代码截图:
⑦将Ui5程序发布至SAP Cloud Platform中
⑧程序代码
不免费提供?公众号联系?
2.2.4.3 Custom Ui5 App嵌入User Task
返回至First Level Approval待办,在USER INTERFACE 页签设置Ui5 APP名称和路径。
点击Select按钮,弹出对话框,选择Ui5项目和SAPUI5 Component路径。
注意:Application Name 需要与 SAP Cloud Platform Cockpit中刚发布的UI5程序名称一致。
设置完成后,User Interface界面如下。
2.2.5 使用Mail Task 发送待办邮件
使用Mail Task可以设置邮件。邮件服务器Destination配置见上文2.1.1④。
①在UserTask后续分支可以选择一个Time Event。在Time Event上可以新建一个分支承载Mail Task。
②在Time Event 属性界面把Due Date打勾。Due Date为等待时间。
设置等待时间为1分钟。并把Cancel Task取消勾选。
③在User Task 上的Time Event新建一个Mail Task。
选中Time Event。新建一个Mail task。
④设置Mail Task
1)设置收件人
2)设置主题(Subject)
3)设置Body
在Configure Mail Body出选择HTML。新建一个HTML文件。
注意:在邮件Body中可以设置超链接直接跳转至待办页面中。
HTML文件示例:
④添加End Event。
Mail Task添加后即对工作流增加了一条分支,需要在Mail Task节点后添加End Event以结束当前分支。
邮件示例:
测试Workflow
至此,Workflow一级节点审批已经完成。
①将Workflow发布至SAP Cloud Platform。
②返回SAP Cloud Platform Cockpit 界面中,转至Workflow服务。
点击打开Firoi快速启动板(转至Portal默认站点)。
③打开Workflow Definitions APP,定位至PurchaseOrderWorkFlow。
④点击启动新实例。
输入上下文{“purOrdId”: ”4500000017”}。“purOrdId”参数即上文Service Task 中作为参数传入 Odata Path的上下文节点。“approveUserId”即一级审批待办处设置的用户参数。
⑤回到主界面,打开Workflow Instances App,查看新实例的日志情况。
⑥切换FirstGroup用户组下的账号,查看待办信息。
注意:只切换账号,不要从切换账号的launchpad中进去Workflow app。因为创建的Workflow待办只在Workflow开发者发布的Portal默认站点。即仍从开发工作流账号的Fiori Launchpad网站进入。
点击审批后,切换回带有WorkflowAdmin角色的账号查看完成日志。
2.2.6 使用Exclusive Gateway区分审批结果
Exclusive Gateway 为排他处理分支,与Parallel Gateway不同的是,Exclsive Gateway的分支不能同时处理,且必须要有一个默认分支。
本例中一二级待办的审批结果分为True 和false。需要用Exclusive Gateway将两种不同的审批结果流转至各自的节点。
2.2.6.1 新建Exclusive Gate和另一User Task
①First level Approval 的 User Task 后面新建Exclusive Gateway节点名为Check Approved。添加完之后,Check Approved 节点只有一条默认流程流转下去。
②在Check Approved默认流程后添加二级审批待办界面。添加一个User Task 在Check Approved 后面。
设置名称 Second Level Approval。
③设置 Second Level Approval 待办属性。
Subject: 设置为 二级审批采购订单${context.purOrdId}。
Groups : SecondGroup。
USER INTERFACFE : 待办审批界面与一级审批一致,设置相同的Ui5 App即可,也可以设计一个新的待办审批界面。
④添加另一分支待办界面。
审批拒绝后,需要将审批流程转至审批流程发起人的待办中。这里需要新建一个User Task节点承接此分支流程。
新建一个User Task 名为 Rejected Box。将 Check Approved 的Exclusive Gateway 同时连接至 Rejected Inbox。设置参数:
Subject:被拒绝采购订单 ${context.purHead.d.Ebeln}
Users : 填写流程发起人,这里需要获取Workflow信息 ,表达式为${info.startedBy}
注意:工作流信息,API接口内容等查阅https://help.sap.com/doc/72317aec52144df8bc04798fd232a585/Cloud/en-US/wfs-core-api-docu.html#api-UserTaskInstances-v1TaskInstancesTaskInstanceIdPatch
⑤将Check Approved 新分支连接至Rejected Inbox。
设置默认分支。点击Check Approved 到 SecondLevelApproval 的流程分支线,设为默认分支,并命名为Approved。
点击 Check Approved 到 Rejected Inbox流程分支线,命名为Rejected。Condition设置:表达式为${context.approved == false}
注意:Condition设置参阅https://help.sap.com/viewer/f85276c5069a429fa37d1cd352785c25/Cloud/en-US/9f91b1c0fac3414d9cba1015dea381f1.html
注意:Exclusive Gateway 当出现多个分支时,必须设置一个默认分支流程。这是因为Condition 不一定全部满足,需要一个默认节点来解决Condition都不满足情况下确定Workflow的流转方向。
2.2.6.2 从Workflow Project创建Basic Ui5 App
Workflow 为User Task节点提供了基本UI Interface,创建基本UI Interface可以自动创建一个待办界面。
①右击Workflow项目,选择New ->Workflow Task UI。
②定制新建的Basic Ui5 App。
1)自动生成的Ui5APP,在Init()方法中将拒绝按钮去掉。
2)添加Item节点。
App.xml文件中添加以下代码。
Component.js文件中增加将context绑定至App的JSONModel操作,代码如下:
③发布RejectUIScreen 项目。
注意:不能单独发布RejectUIScreen,需要将Workflow整个项目发布至SAP Cloud Platform。
右击Workflow项目,点击Deploy to SAP Cloud Platform。
2.2.6.3 形成退回待办与重新审批流程
①Rejected Inbox 设置Ui5 App。
因为上文将整个Workflow项目发布至SAP Cloud Platform。
这里在路径选择上需要选择新建的子文件夹 RejectUIScreen。
②连接Rejected Inbox至First level Approve
退回待办之后,流程发起人需要点击继续审批,这时候应该流转至一级审批节点,发送至一级审批人待办中。
2.2.7 添加二级审批节点拒绝流程
同一级审批节点一直,添加一个Exclusive Gate。
然后Condition: &{context.approved} false状态连接至上文建好的 退回待办界面 Rejected Inbox。
2.2.8 使用Script Task操作工作流上下文
我们已经把审批记录传至context.post中。
二级审批节点审批通过后。需要把抬头数据返写到上文中context.post中。
第二个Check Approved 节点在Approved分支添加 Write Stop Info 名称 Script Task。
选择Create File 。
添加如下代码,将head信息传入。
这样post属性的结构已经跟OData Post的复杂结构一致了。
上下文数据和定义的复杂结构:
2.2.9 使用Service Task消耗OData服务 Post方法
二级审批节点审批通过后。需要返写状态到ERP系统。
第二个Check Approved节点在Approved分支添加setOrderStatus的Service Task
设置Destination为HANDS4H
路径为/sap/opu/odata/sap/ZODATA_WORKFLOW2_SRV/purHeadSet
注意:POST方法需要加Token路径。Token路径跟POST方法的路径一致。
Request Variable中填写工作流上下文的属性${context.post}
(post属性已在UserTask中为其填充了head_np_appr的属性节点,在ScriptTask中为其填充了其余抬头属性)。
Response Variable 为Odata Post方法返回的数据。选填。同理填写至上下文属性中${context.XXX.XXX}
2.2.X 使用Terminal End Event结束整个工作流
在SetOrderStatus的Service Task节点后添加Terminal End Event结束整个工作流。
2.2.XI 创建UI5应用程序作为Workflow启动UI
上文已经建立了一个完整的Workflow流程,并发布至SAP Cloud Platform。如果从Workflow Definition App启动一个Workflow实例发起审批非常不方便,需要自己编写JSON格式数据作为Workflow启动参数。
可以通过外部应用程序或者SAP Cloud Platform 上发布的程序启动工作流。如图:
SAP Cloud Platform 上发布的Ui5程序,可以通过Route形式访问工作流,通过子账号Subaccount目标映射Path访问bpmworkflowruntime服务。
外部应用程序需要通过SAP CPI与Workflow集成。(待续)
2.2.X.1 新建Ui5项目
新建UI5项目PurchaseOrderList,选择Master-Detail报表。
基本信息设置参数如下:
设置OData数据源
2.2.X.2 为Ui5App添加Route
使UI5 App 能够访问到workflow API,
在项目文件夹下neo-app.js文件中routes属性添加如下代码:
{
“path”: “bpmworkflowruntime”,
“target”: {
“type”: “destination”,
“name”: “bpmworkflowruntime”,
“entryPath”: “/workflow-service”
},
“description”: “Workflow Service Runtime”
}
2.2.X.3 添加发送按钮和操作
Detail.view.xml中添加按钮,发送审批:
效果如下:
onInit方法中初始化一个对话框实例,代码如下:
启动Workflow API 代码
2.2.X.4 添加发送对话框
添加sendApprove.fragment.xml和Dialog.js文件
①sendApprove.fragment.xml
添加两个输入框,送审人输入框绑定{approveModel>/approveUserId} 送审采购单绑定{approveModel>/purOrdId}
添加两个按钮,确认 事件onConfirmDialog ,取消 事件 onCancelDialog
②Dialog.js
1)承接上文点击Start Workflow按钮的事件OpenDialog。在Dialog.js中新建方法OpenDialog。具体逻辑为将dialog实例附加到Detail视图上。
2)onConfirmDialog事件方法中启动workflow实例。
获取token,然后启动实例
3)_fetchToken方法。token路径:/bpmworkflowruntime/rest/v1/xsrf-token
4)_startInstance方法。
需要传入参数:url路径/bpmworkflowruntime/rest/v1/workflow-instances ;method为POST;在headers中传入token
Data将工作流定义ID(工作流名称)和上下文传入。上下文传入审批人approveUserId和采购订单号purOrdId
2.2.X.5 发布Ui5程序至SAP Cloud Platform Cockpit
右击UI5程序项目,发布至SAP Cloud Platform。
第一次发布状态下为Deploy a new application。点击发布即可。
发布操作会对代码进行Check和Build。确保代码语法正确,否则发布失败。
我是老周,如果你喜欢我的文字,请记得点击⬇️关注我。
码字不易,文章下拉,右边点个【赞】和【在看】吧!!
猜您还喜欢合集:
猜您还喜欢文章:
更多AI工具,参考Github-AiBard123,国内AiBard123