1、 前言
之前写了一篇通过webservices 创建流程的文章。详见 WebServices创建流程。今天的这个 主要是为了方便第三方系统调用泛微得E9API接口(REST)创建流程。
2、调用方式
2.1 配置准备工作
2.1.1 配置ecology系统白名单(泛微方)
在ecology系统中找到: 【 ecology/WEB-INF/prop/weaver_session_filter.properties 】
在unchecksessionurl=后面添加/api/ec/dev/auth/regist;/api/ec/dev/auth/applytoken;
注:如果存在,可跳过此步骤。
2.1.2 ecology系统发放许可证(泛微方)
在ecology系统得数据库中添加许可证(appid),插入如下代码(红色标注部分必须修改)
INSERT INTO ECOLOGY_BIZ_EC(ID,APPID,NAME) VALUES('保证唯一的ID','EEAA5436-7577-4BE0-8C6C-89E9D88805EA','上海泛微网络科技股份有限公司');
字段描述:
• ID:数据库主键。保证与其它系统发放的许可证在数据库中的主键标识不冲突即可
• APPID:许可码,可通过 http://www.uuid.online/ 随机生成即可【保证唯一】
• NAME:许可证名称,能够快速辩识即可,可根据需求修改
2.1.3 获取token
变量声明
public static final String HOST = "http://ip:port";
APPID为2.1.2中生成得APPID
2.1.3.1 向ecology系统注册许可证,获取spk,secret(第三方)
//httpclient的使用请自己封装,可参考ECOLOGY中HttpManager类
HttpManager http = new HttpManager();
//请求头信息封装集合
Map<String, String> heads = new HashMap<String, String>();
//获取当前异构系统RSA加密的公钥
String cpk = new RSA().getRSA_PUB();
//当前异构系统用于向ECOLOGY注册时使用的账号密码通过DES加密后密文进行传输
//kb1906及以上版本 已废弃账号密码校验
//封装参数到请求头
System.out.println("cpk:::" + cpk);
heads.put("appid", APPID);
heads.put("cpk", cpk);
//调用ECOLOGY系统接口进行注册
try {
String data = http.postDataSSL(HOST + "/api/ec/dev/auth/regist", new HashMap<>(), heads);
//返回的数据格式为json,具体格式参数格式请参考文末API介绍。
//注意此时如果注册成功会返回秘钥信息,请根据业务需要进行保存。
if (data != null) {
JSONObject result = JSON.parseObject(data);
if ("true".equals(result.getString("status"))) {
this.SPK = result.getString("spk");
this.SECRET = result.getString("secrit");
}
}
} catch (Exception e) {
e.printStackTrace();
}
2.1.3.2 获取token(第三方)
根据2.1.3.1得到的secret和spk,加密后获取token信息
public String getToken() {
//httpclient的使用请自己封装,可参考ECOLOGY中HttpManager类
HttpManager http = new HttpManager();
//请求头信息封装集合
Map<String, String> heads = new HashMap<String, String>();
RSA rsa = new RSA();
//对秘钥进行加密传输,防止篡改数据
String secret = rsa.encrypt(null, SECRET, null, "utf-8", SPK, false);
//封装参数到请求头
heads.put("appid", APPID);
heads.put("secret", secret);
//调用ECOLOGY系统接口进行申请
try {
String data = http.postDataSSL(HOST + "/api/ec/dev/auth/applytoken", new HashMap<>(), heads);
if (data != null) {
JSONObject res = JSON.parseObject(data);
if ("true".equals(res.getString("status"))) {
return res.getString("token");
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
3. 接口列表
3.1 接口及参数说明
3.1.1 流程实例:新建
3.1.2 待办流程列表
3.1.3 待阅流程列表
3.1.4 已办流程列表
3.1.5 流程实例:提交
3.1.6 流程实例:退回
3.1.7 流程实例:转发、意见征询、转办
3.1.8 流程实例:删除流程
3.1.9 流程实例:强制收回
3.1.10 流程实例:强制归档
3.1.11 流程实例:获取流程意见
3.1.12 流程实例:获取流程信息
3.2 主要参数示例
3.2.1 Detaildata
detailData:
[
{
"tableDBName": "formtable_main_1356_dt1",
"workflowRequestTableRecords": [
{
"recordOrder": 0,
"workflowRequestTableFields": [
{
"fieldName": "dhwb",
"fieldValue": "第一行"
},
{
"fieldName": "drl",
"fieldValue": "2978"
},
{
"fieldName": "xlk",
"fieldValue": "0"
}
]
},
{
"recordOrder": 0,
"workflowRequestTableFields": [
{
"fieldName": "dhwb",
"fieldValue": "第2行"
},
{
"fieldName": "drl",
"fieldValue": "2978"
},
{
"fieldName": "xlk",
"fieldValue": "1"
}
]
}
]
}
]
3.2.2 mainData
mainData:
[
{
"fieldName": "dhwb",
"fieldValue": {
"value": "1212",
"name": "aaaa.html"
}
},
{
"fieldName": "drlzy",
"fieldValue": "2978"
},
{
"fieldName": "drlzy1",
"fieldValue": "2978,2979"
},
{
"fieldName": "fjsc",
"fieldValue": [
{
"filePath": "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1577426926378&di=0084fc19f5cb90fc2286aab5ca8c343e&imgtype=0&src=http%3A%2F%2Fpic.51yuansu.com%2Fpic2%2Fcover%2F00%2F41%2F80%2F581369c715701_610.jpg",
"fileName": "timg.jpg"
},
{
"filePath": "http://192.168.7.216:8080/weaver/weaver.file.FileDownload?download=1&fileid=3819049&authStr=dmlld0NoYWluPTIyNTkzOTA1fG1haW5pZD0yMjU5MzkwNXw=&authSignatureStr=81b08f6e0b8ee06dcc1b43fda8204bdf&requestid=22593905&f_weaver_belongto_userid=4548&f_weaver_belongto_usertype=0",
"fileName": "自由节点视图mysql.txt"
}
]
}
]
3.2.3 FieldName字段可参考泛微流程引擎表单字段
3.3 返回值示例
{"code":"SUCCESS","data":{"requestid":289303},"errMsg":{}}
3.3.1 返回参数说明
3.4 注意事项
1、如果新建流程参数不符合规则、比如mainData 格式错误多个“}、]”则会提示参数错误,一般会提示workflowId为0
2、必填字段不允许为空
3、 参数workflowId对应的流程要有该流程创建权限
4、主表、明细表中如果参数不正确(和路径表单字段 字段名称不一致,参数中多了都不允许正常新建流程,并且会提示异常参数)
5、附件上传说明,字段值格式如下: 格式为 [{“fieldName”:“字段数据库名称”,“fieldValue”:字段值}] 例如:附件上传字段的值为 fieldValue:[{“filePath”:“上传的附件地址或者base64”,“fileName”:“附件名称(包含附件类型)”}] 除了附件上传,其余字段类型的字段值都为字段内容
6、otherParams参数为map,扩展参数暂时支持如下参数: isnextflow :新建流程是否默认提交到第二节点,可选值为[0 :不流转 1:流转 (默认)] delReqFlowFaild:新建流程失败是否默认删除流程,可选值为[0 :不删除 1:删除 (默认)] requestSecLevel: “流程密级, 开启密级后生效,默认公开”。
4. 调用示例
以【3.6 流程实例:退回】为例:
1)接口入参:requestId、userId
2)请求头部需要加入得信息: Token、APPID、spk
3)代码示例
// 请求头部需要得参数
Map<String, String> heads = new HashMap<>();
heads.put("token", token);
heads.put("appid", APPID);
RSA rsa = new RSA();
String secretUserid = rsa.encrypt(null, userid, null, "utf-8", spk, false);
heads.put("userid", secretUserid);
// 添加参数
String url = HOST + "/api/workflow/paService/rejectRequest";
HttpManager http = new HttpManager();
Map<String, String> params = new HashMap<>();
params.put("requestId", requestid);
params.put("remark", "restful接口退回流程测试");
//默认是按出口退回
//自由退回参数设置
Map<String, String> otherParams = new HashMap<>();
otherParams.put("RejectToType", "0");
otherParams.put("RejectToNodeid", "3974");
params.put("otherParams", JSONObject.toJSONString(otherParams));
// 发送请求
try {
String res = http.postDataSSL(url, params, heads);
System.out.println(res);
} catch (Exception e) {
e.printStackTrace();
}
完整Demo 地址:
workflow-restful-demo