BTP 使用SPA开发工作流

news2025/1/18 21:03:47

1、前言

目前SAP ABAP 工作流比较难用,BTP上的工作流比较简单便捷。

BTP上面有两款服务可以执行工作流,一种是workflow management 配合Business Rules Services简称BRS,还有一种是接下来会介绍的SP Bulide Process Automation 简称SBPA。

SBPA是从SAP iRPA发展来的,然后再2021年发展为了SPA,除了保留原有的传统的可以自动化处理企业的重复性流程,降低企业成本。SPA增添了workflow的的功能,可以进行审批页面。2023年开始发展为SBPA,在原有的功能上,添加了api触发的手段。

我做的例子是物料主数据的审批,下面介绍整个流程。

2、SPA 创建workflow

 2.1、创建一个流程Process

 

2.2、创建一个API Trigger

 

2.3、创建一个审批通知邮件

 2.3.1、编辑mail process ( 这里首先必须要保证SPA要具备 Outlook的SDK )

 send email 步骤

 2.4、添加一个Approval Form

 

2.5、审批成功的记录调用API写入结果到对应的后台服务器

 2.5.1、获取token

由于我消费的API是需要token验证的odata接口,所以这里需要调用两次 Call Web Service

 

2.5.2、消费API

这里注意,我们取的token是返回参数的header数据,这里如果我们再call web service后面添加一个log message的话,会发现并没有headers参数数据。但是其实是存在的,获取header数据的步骤是:

Step2.obj.headers['x-csrf-token']

 2.6、在完成开发和测试之后,需要点击release和deploy。

然后再Monitor页签的Tri 

 点击view,可以看到调用服务的API,但是注意BTP的上面你的API服务一般都是需要用到oauth 2.0的。

 3、消费SPA的API

3.1、查找spa的token以及相关clientId 或者密码等。

再BTP Cockpit控制台处,点击实例和订阅

找到SPA服务的key,点击

 下图分别展示着SPA服务对应的url , clientid,clientsecret

 3.2、postman测试API

如下图所示,在相应的位置填入相应的内容 

 然后点击get new access token

在弹出框点击use token,然后

在body里面填入相应的报文,点击send

 说明spa没有问题。

3.3、配置spa服务对应的destination

点击Service Instance

选择SPA Instance

 创建之后效果如下

 3.4、Bas开发触发app的功能

3.4.1、在xs-app.json里面配置好destination

 source中就是之前在destinations中添加的配置

3.4.2、ajax调用API

sap.ui.define([
	"sap/ui/model/json/JSONModel"
], function(JSONModel) {
	return {

        fetchToken: function (oController,oData) {
			var that = this;
            var oThisController = oController;
            oThisController.getView().setBusy(true);
            $.ajax({
                url: this._getWorkflowRuntimeBaseURL(oController)+ "/xsrf-token",
                //"/comsapbpmDocumentCentricStartUI/workflowruntime/v1/xsrf-token",
                method: "GET",
                headers: {
                    "X-CSRF-Token": "Fetch"
                },
                success: function (result, xhr, data) {

                    // After retrieving the xsrf token successfully
                    var workflowtoken = data.getResponseHeader("X-CSRF-Token");

                    // Values entered by the user stored in the payload and push to the server.
                    that.startInstance(workflowtoken,oController,oData);

                },
                error: function (jqXHR, textStatus, errorThrown) {

                    //MessageBox.error("Error occurred while fetching work-flow access token.");
                    var sErrorText = oThisController.getMessage("WORKFLOW_ACCESS_TOKEN_ERROR");
                    MessageBox.error(sErrorText + "\n Error:" + errorThrown + ".");
                    oThisController.oBusyDialog.close();
                    return;

                }
            });
        },
		_getWorkflowRuntimeBaseURL: function (oController) {
            var appId = oController.getOwnerComponent().getManifestEntry("/sap.app/id");
            var appPath = appId.replaceAll(".", "/");
            var appModulePath = jQuery.sap.getModulePath(appPath);

            return appModulePath + "/spaWorkflowMaterial/v1";
        },

		startInstance:function(workflowtoken,oController,oData){
            var oThisController = oController;
                // oMdlCommon = oThisController.getParentModel("mCommon");
            var sUrl = this._getWorkflowRuntimeBaseURL(oController) + "/workflow-instances";
            //"/comsapbpmDocumentCentricStartUI/workflowruntime/v1/workflow-instances";
			var sDefinitionId2 = "cn40.syntax.workflowapply.applyPropcess";
			var sPayload = {
                "definitionId": sDefinitionId2,
                "context": {
                    "materialline": {
						"Mateiral": oData.Matnr,
						"MatGrp": oData.Matkl,
						"Unit": oData.Meins,
						"Receipter": "user039@sap-hackathon.io",
						"MateiralDesc": oData.Maktx,
						"ProductId": oData.Spart,
						"OldMaterial":oData.Bismt,
						"RejectReason":""
					}
                    }
                };
				$.ajax({
					url: sUrl,
					method: "POST",
					dataType: "json",
					crossDomain: false,
					contentType: "application/json",
					data: JSON.stringify(sPayload),
					cache: true,
					headers: { // pass the xsrf token retrieved earlier
						"X-CSRF-Token": workflowtoken
	
					},
					success: function (data) {
						MessageBox.success("Request '" +  "' is submitted.");
	
					},
					error: function (jqXHR, textStatus, errorThrown) {
						oThisController.getView().setBusy(false);
						var sErrorText = oThisController.getMessage("WORKFLOW_SERVICE_ERROR");
						MessageBox.error(sErrorText + "\n Error: " + errorThrown + ".");
						return;
					}
				});
		},

		createWorkflowInstance:function(oController, oJsonModel){
			var oData = oJsonModel.getData();
            this.fetchToken(oController,oData);
	}
});

 3.5、失败

这时候如果报错http 403,就需要看看是不是fetch token那里是不是有问题,去network那里看看request header那里是不是有问题

如果是httlp 500 错误,这时候应该是没有根据xs-app.json那里的source和ajax的路径拼接上正确的url。

这时候首先检查xs-app,然后检查ajax的url是不是和destination的名字一样

如果都没有问题的话,点击控制台,进去这个服务看看里面是不是有spa 的detination。

如果没有的话,从控制台cockpit那里导出一份,然后着服务里面impot。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【linux】Ubuntu aarch64编译安装RXTX进行串口通信

目录1.下载RXTX2.源码下载方式一:方式二:3. 编译源码4.编译源码时遇到的问题问题1:./configure command not found问题2:error: UTS_RELEASE undeclared问题3:libtool: install: armv6l-unknown-linux-gnu/librxtxRS48…

Manjaro安装及配置

官方镜像 官方镜像地址:https://manjaro.org/download/ 镜像选择 镜像选择:PLASMA、XFCE、GNOME 按电脑性能:PLASMA>GNOME>XFCE(老旧电脑可以运行) 启动U盘刻录 推荐使用rufus(win10平台,dd模式&#xff09…

C++ [图论算法详解] 欧拉路欧拉回路

蒟蒻还在上课,所以文章更新的实在慢了点 那今天就来写一篇这周刚学的欧拉路和欧拉回路吧 讲故事环节: 在 一个风雪交加的夜晚 18世纪初普鲁士的哥尼斯堡,有一条河穿过,河上有两个小岛,有七座桥把两个岛与河岸联系…

万字长文:C语言实践小练习汇总指南!

万字长文:C语言实践小练习汇总指南!0.说在前面1.i与i总结1.1 i与i1.2 区别总结:2.大小写转化3.交换字符串3.1 使用传字符串地址3.2 使用strcpy函数3.3 自写字符串交换函数3.4 同3.3自写函数4.字符串中单词4.1 统计字符串中单词个数4.2 最长单词及位置5.字…

注册页面小案例

运行截图&#xff1a; 知识点&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Compatible" content"IEedge"> <meta name&…

SwinTrack: A Simple and Strong Baseline for Transformer Tracking(NIPS2022)

SwinTrack摘要介绍相关工作方法实验摘要 近期&#xff0c;Transformer在视觉跟踪方面进行了深入探索&#xff0c;并展示了显著的潜力。然而&#xff0c;现有的基于Transformer的跟踪器主要将Transformer用于融合和增强由卷积神经网络提取的特征&#xff0c;Transformer在表征学…

另一种迁移xxl-job任务的方法,适合不满足数据迁移条件

以为多个项目组同时使用一个xxl-job&#xff0c;同时涉及到版本提升&#xff0c;由此不太满足数据库数据迁移&#xff0c;所以这里提供另一种解决办法 使用工具&#xff1a;postman,json转excel&#xff0c;excel 核心&#xff1a;excel拼接&#xff1a; 1.使用f12抓取xxl任务访…

什么是 SMART 并如何使用这个方法取得新的成就

SMART原则也许大家并不陌生&#xff0c;很多企业常常采用以激励员工更加高效的工作&#xff0c;或是被一些企业广泛采用&#xff0c;制定并实施绩效考核方案&#xff0c;SMART原则属于目标管理的范畴&#xff0c;最早是管理大师彼得德鲁克在著作中提出的。 ONLYOFFICE ONLYOFFI…

Nginx快速上手

Nginx快速上手 OVERVIEWNginx快速上手一、基本概念1.Nginx初步认识2.正向/反向代理&#xff08;1&#xff09;正向代理&#xff08;2&#xff09;反向代理二、Nginx 安装和配置1.安装2.Nginx指令3.Nginx配置三、Nginx的使用1.Web服务器&#xff08;1&#xff09;静态网页存储目…

Java对日开发成趋势?网友:找工作打开了新思路

近两年行业环境起起伏伏&#xff0c;企业降本增效&#xff0c;提高人才招聘的门槛&#xff0c;导致大家找工作时觉得越来越难&#xff0c;尤其是Java开发&#xff0c;主打的就是一个“卷”&#xff01; 不过行业变革&#xff0c;挑战与机遇并存。Java作为编程语言排行榜的常年第…

Java8 判空新写法(Optional方式)

1 引言 在文章的开头&#xff0c;先说下NPE问题&#xff0c;NPE问题就是&#xff0c;我们在开发中经常碰到的NullPointerException.假设我们有两个类&#xff0c;他们的UML类图如下图所示 在这种情况下&#xff0c;有如下代码 user.getAddress().getProvince();这种写法&…

计算机网络 实验四

⭐计网实验专栏&#xff0c;欢迎订阅与关注&#xff01; ★观前提示&#xff1a;本篇内容为计算机网络实验。内容可能会不符合每个人实验的要求&#xff0c;因此以下内容建议仅做思路参考。 一、实验目的 理解ARP协议的工作原理掌握ARP、ICMP 处理过程 二、实验内容 利用网络…

BearPi环境搭建及基本使用

这是一篇总结&#xff0c;一些坑的记录 具体教程请访问&#xff1a; BearPi-HM_Nano: 小熊派BearPi-HM Nano开发板基于HarmonyOS的源码 - Gitee.com 第一步&#xff1a;安装虚拟机 不做赘述 第二步&#xff1a;下载资源 这里要用到ubuntu的一些基础知识&#xff0c;不会的…

HTTP Flood攻击与防御原理

一.引言HTTP Flood攻击DDoS的一种,别称叫做CC攻击(CC是Challenge Collapsar的缩写&#xff0c;而Collapsar是国内一家著名安全公司的DDoS防御设备)&#xff0c;是针对Web服务在第七层协议发起的攻击&#xff0c;重点在于突破前端的cache,通过HTTP头中的字段设置直接到达Web Ser…

精通线程池,看这一篇就够了

一&#xff1a;什么是线程池 当我们运用多线程技术处理任务时&#xff0c;需要不断通过new的方式创建线程,这样频繁创建和销毁线程&#xff0c;会造成cpu消耗过多。那么有没有什么办法避免频繁创建线程呢&#xff1f; 当然有&#xff0c;和我们以前学习过多连接池技术类似&…

安全头响应头(一)Content-Security-Policy

一 Content Security Policy CSP 中文翻译 ① 背景引入 "重点提炼" 1) CSP最初被设计用来减少XSS跨站点脚本攻击,该规范后续版本还可防止其他如点击劫持形式的攻击2) CSP 的实质就是白名单制度[1]、网站开发者明确告诉客户端,哪些外部资源可以加载和执行,等同…

STM32H750ZBT6核心板设计

成品图 注意事项 1、主频无法设置480Mhz,只能最高设置为400Mhz 设置版本号为V版本&#xff0c;即稳定版本即可以设置主频为480Mhz了&#xff0c;不清楚自己的STM32H750是什么版本&#xff0c;可以查看芯片上丝印&#xff0c;ST公司LOGO旁边有个Y/V&#xff0c;即是版本号。 2…

零碎Java

1. 1995年Sun公司开发了java 2009年Oracle收购了Sun公司 其中2004年的java5.0和2014年的java8.0更新力度最大 java特性&#xff1a;第一至今已有20多年了 第二编程语言 第三应用广泛 2. 二进制中逢二进一 11 10 111100 0000万 0000&#xff0c;0000亿 …

RK3568平台开发系列讲解(设备驱动篇)V4L2程序实现流程

🚀返回专栏总目录 文章目录 一、V4L2 进行视频采集二、命令标识符三、V4L2程序实例3.1、打开设备3.2、查询设备属性3.3、显示所有支持的格式3.4、设置图像帧格式3.5、申请缓冲区3.6、将申请的缓冲帧从内核空间映射到用户空间3.7、将申请的缓冲帧放入队列,并启动数据流3.8、启…

配置mpls vpn MCE组网

实验三&#xff1a;配置mpls vpn MCE组网 1、实验环境&#xff1a; 某公司需要通过mpls vpn实现总部和分部的互访&#xff0c;并且要实现不同部门之间的业务隔离&#xff0c;为了节省开支&#xff0c;总公司使用MCE设备接入不同的部门。要求分公司A只能访问总公司的部门A&…