# 表单流程集成
# 接口调用方式
本接口为主OA Http Rest,允许被异构系统远程调用,调用前需要调用Rest接口文档 (opens new window)获取Restful token身份凭证。
# 概述
# 关于模板编号
无论是发起Html正文流程,还是表单流程,模板编号至关重要,它决定了发起的流程。
# Html正文流程模板编号
单位管理员登录。
进入功能应用设置 → 协同应用设置 → 新建
点击高级,在模板编号中设置。
# 表单正文流程模板编号
表单管理员登录。
进入表单应用 → 流程表单制作 → 新建
点击应用绑定,在模板编号中设置。
# 获取activityId
- 找到流程图页面,F12打开开发者工具,切换到Elements页签,定位到节点对应的dom元素上(如下图),node_id即为activityId
# ctp_affair表STATE字段含义
参数 | 说明 |
---|---|
col_waitSend(1) | 协同-待发 |
col_sent(2) | 协同-已发 |
mcol_pending(3) | 协同-待办 |
col_pending_repeat_auto_deal(30) | 待办-重复处理自动跳过 |
col_done(4) | 协同-已办 |
col_cancel(5) | 协同-取消 |
col_stepBack(6) | 协同-回退 |
col_takeBack(7) | 协同-取回 |
col_competeOver(8) | 协同-竞争执行结束 |
col_stepStop(15) | 协同-终止 |
mt_attend(9) | 会议-参与 |
mt_unAttend(10) | 会议-不参与 |
edoc_exchange_send(3) | 公文交换-待发送 |
edoc_exchange_sent(4) | 公文交换-已发送 |
edoc_exchange_receive(3) | 公文交换-待签收 |
edoc_exchange_received(4) | 公文交换-已签收 |
edoc_exchange_register(3) | 公文交换--待登记 |
edoc_exchange_registered(4) | 公文交换--已登记 |
edoc_exchange_withdraw(18) | 公文交换--被撤销 |
inquiry_no_audit(20) | 调查--待审核 |
bul_toaudit(21) | 公告--待审核 |
news_toaudit(22) | 新闻--待审核 |
info_failure(23) | 信息报送-失效 |
info_stepBack(24) | 信息报送-退件 |
# 发起表单(Html正文)流程
可发起指定模板的Html正文流程或表单流程。
# 推荐使用接口(Since:V80sp1)
接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/bpm/process/start
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
示例:
Map<String, Object> map = new HashMap<String, Object>();
map.put("appName", "collaboration");
Map<String, Object> data1 = new HashMap<String, Object>();
data1.put("templateCode", "asss_001");
data1.put("draft", "0");
data1.put("attachments", new ArrayList<Long>() {
add(3128081619541315193l);
add(-1686961755437117824l);
});
data1.put("relateDoc", "col|-2871660587841141706,-1609894079662438907");
data1.put("subject", "aaa1");
Map<String, Object> data2 = new HashMap<String, Object>();
data2.put("formmain_0018", new HashMap<String, Object>(){put("申请人", "saa"); put("车牌号", "ddd");});
data1.put("data", data2);
map.put("data", data1);
Map result = client.post("bpm/process/start" ,map);
传入参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
appName | 是 | 应用类型 |
data | 是 | data参数 |
data参数
参数 | 是否必须 | 说明 |
---|---|---|
templateCode | 是 | 模板编号,参见表单正文流程模板编号 |
draft | 是 | 是否为待发:0:新建-发送;1:新建-保存待发 |
attachments | 否 | 协同标题区附件,Long型List,值为附件的Id。Id是附件接口响应结果中fileUrl字段的值。 |
relateDoc | 否 | 协同公文的id |
subject | 否 | 未设置取模板设置的标题 |
data | 否 | 表单data参数 |
表单data参数
参数 | 是否必须 | 说明 |
---|---|---|
formmainxxx | 是 | 表单字段数据,json格式:key字段显示名称,value字段值(如果是cap4的附件控件,则value为附件的相关信息) |
formsonxx1 | 是 | 数组结构,参考主表 |
thirdAttachments | 否 | CAP4附件参数 |
thirdAttachments参数说明
参数 | 是否必须 | 说明 |
---|---|---|
subReference | 是 | 对应的附件字段的value值 |
fileUrl | 是 | 上传的附件ID |
sort | 是 | 附件排序 |
请求参数示例:
{
appName : "collaboration",
data : {
data :{
"formmainxxx":{
"申请人":"人员Id",
"部门Id":"研发中心",
"申请日期":"2018-06-13"
},
"formsonxx1":[
{
"商品名称":"键盘",
"单价":23,
"期望到货时间":"2018-06-20"
},
{
"商品名称":"鼠标",
"单价":33,
"期望到货时间":"2018-06-20"
}],
"formsonxx2":[
{
"商品名称":"键盘",
"实际单价":21,
"到货时间":"2018-06-19",
"groupsort": 1 //二级明细表分组号
},
{
"商品名称":"键盘",
"实际单价":30,
"到货时间":"2018-06-19",
"groupsort": 2 //二级明细表分组号
}],
"thirdAttachments" : [
{
"subReference":8451540374587001174,
"fileUrl":-7390855572027915259,
"sort":1
},
{
"subReference":8451540374587001174,
"fileUrl":-7390855572027915268,
"sort":2
}
]
},
templateCode : "001",
draft : "0",
attachments : [
123456,
123457],
relateDoc : "col|123,456;doc|321,654",
subject : ""
}
}
返回数据:
{
"code" : 0,
"data" : {
"workitems" : [ {
"nodeName" : "节点姓名",
"userLoginName" : "loginName",
"id" : "6063271658185834554",
"userName" : "用户姓名",
"nodeId" : "15940211100644",
"userId" : "5647565013925644425"
} ],
"app_bussiness_data" : "{\"affairId\":\"-7826004588359563757\",\"summaryId\":\"2076716881761815485\"}",
"processId" : "5724125432261003059",
"subject" : "aaa1",
"errorMsg" : ""
},
"message" : ""
}
返回参数说明:
参数 | 说明 |
---|---|
code | 返回码 |
nodeName | 节点名称 |
userLoginName | 登录名 |
id | wf_workitem_run.id |
userName | 用户名 |
nodeId | 节点ID(ctp_affair.activity_id) |
userId | 人员ID |
affairId | 事项ID |
summaryId | 协同ID |
processId | 流程ID(ctp_affair.process_id) |
subject | 标题 |
# 过时接口(V61update)
注意V6.1此接口支持直接传入JSON数据格式。
接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/flow/{templateCode}
例如:
http://127.0.0.1/seeyon/rest/flow/A0001
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
发起表单流程所需要参数,可以参考文档【BPM集成】中的【public ServiceResponse launchFormCollaboration(String token, String senderLoginName, String templateCode, String subject, String data, Long[] attachments, String param) throws ServiceException;】;
参数 | 是否必须 | 说明 |
---|---|---|
templateCode | 是 | 模板编号,参见表单正文流程模板编号 |
token | 是 | 为登录验证后获取的身份令牌 |
senderLoginName | 是 | 发起者的登录名(登录协同的登录名) |
subject | 是 | 协同的标题 |
data | 是 | HTML正文流程为html内容;取得流程正文数据支持传入json格式数据 |
attachments | 否 | 附件,Long型List,值为附件的Id。Id是附件接口响应结果中fileUrl字段的值。 |
param | 否 | 为控制是否流程发送。0:缺省值,发送,进入下一节点的待办(如果需要选人则保存到待发)1:不发送,保存到待发。 |
transfertype | 否 | (V6.1增加)data格式,xml:表示data为XML格式;json:表示data为json格式 |
formContentAtt | 否 | (V6.1增加) 表单附件 组件传入ID参数 |
accountCode | 否 | (V6.1增加)发起人单位编码(用于发起人兼职多单位情况,用不同单位角色发起流程) |
参数获取说明:
发起表单是多参数,建议组装为MAP传参。 token身份令牌:token在CTPRestClient中已经封装好的,如果要单独获取可如下方式:
private CTPRestClient client = null;
CTPServiceClientManager clientManager = CTPServiceClientManager.getInstance("http://127.0.0.1");
client = clientManager.getRestClient();
...
String token = client.get("token/" + userName + "/" + password+"?loginName="+loginName, String.class,"text/plain");
senderLoginName发起者的登录名:发起者登录OA的登录名,如下:
String senderLoginName ="lsm";
templateCode模板编号:对应创建模板时填写的模板编号(即ctp_template表TEMPLETE_NUMBER字段)
String templateCode ="100";
subject协同的标题:发出表单模板对应的标题,如下:
String subject ="申请流程标题";
data表单数据:表单数据信息,REST接口提供了获取已经发送的表单流程XML新方法,请参考取得流程正文数据
注意在获取表单数据XML 需要转换成String
提供已发表单转String示例:
private CTPRestClient client = null;
...
String data = client.get("flow/data/-6074085048046957774", String.class);//-6074085048046957774为已发流程ID
V6.1表单流程正文数据支持JSON格式,示例如下:
string data ="{"字段1":"主表数据1","字段2":"主表数据2",sub:[{"字段3":"从表数据3","字段4":"从表数据4","字段5":"从表数据5"},{"字段":"从表数据6"},{"字段7":"从表数据7","字段8":"从表数据8"}]}";
注意:这里sub代表从表数据,而字段1等字段信息是对应【流程表单制作】-【基础设置】中控件的【名称】字段
表单流水号场景:
现在发起流程接口只支持【计算流水号】
1.新建流水号:创建流水号:表单应用-流水号管理;
2.模板设置流水号:表单应用-流程表单设置-流程表单制作-选择控件-计算公式设置-系统数据域中选择流水号
表单附件组件场景:
1.获取附件ID:通过文档上传接口 获得【注意:如果2个表单附件控件都是同一个附件,也需要上传2次,获取不同的ID,而不能2个表单附件控件共用一个附件ID】
2.发起接口XML/json数据中设置附件ID;
3.需要formContentAtt重设置附件ID;
List<Long> formcontentatt=new ArrayList();//表单正文组件ID,这里需要注意,就算三个正文组件上传的同一个文件,这个文件也需要通过上传接口上传三次,而给予表单控件三个不同的附件ID,不能一个ID给多个表单组件
res.put("formContentAtt",formcontentatt);//表单附件组件
CAP4表单附件组件场景更正(Since V8.0,仅支持CAP4表单)
更正说明:由于原有结构不支持控件多个附件或者附件无法添加到表单中的场景,因此接口请求增加formContentAtt参数,参数为数组格式,说明如下:
参数名 | 说明 |
---|---|
subReference | 表单内字段value值,如“上传附件1”的value值 |
fileUrl | 附件ID 文档上传接口 |
sort | 附件排序 |
CAP4表单附件组件更正调用示例
{
"data": {
"文本1": "示例",
"上传附件1": "8451540374587001174"
},
"subject": "示例",
"senderLoginName": "seeyon",
"transfertype": "json",
"formContentAtt":[
{
"subReference":8451540374587001174,
"fileUrl":-7390855572027915259,
"sort":1
},
{
"subReference":8451540374587001174,
"fileUrl":-7390855572027915268,
"sort":2
}
]
}
param为控制流程发送
String param="0";
表单流程通过REST POST创建示例:
private CTPRestClient client = null;
MAP info =new HashMap();//存放上述参数
String checkUrl ="flow/"+模板ID;
...
client.post(url, info, String.class);
发起HTML正文流程示例1:
Map data = new HashMap() {
{
put("senderLoginName", "s1");
put("subject", "这个是用Map方式发的");
put("data", "正文内容");
put("attachments",new Long[] {-1l,-5199818657160149985l});
put("formContentAtt",formcontentatt);//表单附件控件
}
};
Long flowId1 = client.post("flow/H0001" ,data, Long.class);
发起HTML正文流程示例2:
Long flowId2 = client .post("flow/H0001",
"{"senderLoginName":"s1","subject":"这是用JSON发的","data":"HTML正文","attachments":[-1,1]}",
Long.class);
返回说明
正常情况下,返回创建成功以后对应的流程Id。
返回异常说明:
异常编码 | 异常说明 |
---|---|
12005 | 无效的token,请再次验证 |
21011 | 单位名称不能为空或不存在 |
25001 | 职务级别不存在 |
25002 | 职务级别名称为空 |
25003 | 职务级别已存在 |
23023 | 部门名称为空 |
23024 | 父部门名称为空 |
23025 | 部门已存在 |
24001 | 岗位不存在 |
24002 | 岗位名称为空 |
24003 | 岗位已存在 |
22129 | 设置人员的所属部门出错 |
22011 | 人员登录名为空 |
50126 | 按登录名查找发起人出错 |
50121 | 表单不存在 |
50122 | 无表单权限 |
50123 | 无流程表单导入出错 |
50124 | XML解析失败 |
50125 | 模板不存在 |
50126 | 无模板访问权限 |
50127 | 非表单正文内容 |
50128 | 不是无流程表单,请检查模板编号是否正确 |
50129 | 模板为非流程模板,请检查模板编号是否正确 |
31013 | 指定流程不存在 |
50130 | 此表单已经停用 |
50131 | 无输入字段 |
50132 | 日期格式错误 |
50133 | 没有主表记录错误 |
** 注:V9.0如果发现没有传递affairId参数导致接口出现类型转换异常报错,请上报客户BUG解决。**
# 取得流程正文数据
获取流程(协同)的正文数据,不包括标题等信息。 本接口主要用于帮助开发人员获取发起表单流程所需的data格式。
接口请求说明:
http请求方式:GET
http://ip:port/seeyon/rest/flow/data/{flowId}?exportType=0&exportFormat=json
例如:
http://127.0.0.1/seeyon/rest/flow/data/-5199818657160149985
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
flowId | 是 | 流程的summaryId |
exportType | 否 | 不填写返回的是枚举的enumvalue, 0返回枚举Showvalue,1返回枚举ID |
exportFormat | 否 | 导出格式:xml,导出XML格式;json,导出JSON格式。since 7.0 |
返回说明
表单流程返回XML格式的表单数据,HTML正文流程返回正文内容。 如果流程ID错误或者为空时,返回信息为空。 返回的表单数据示例:
<formExport version="2.0">
<summary id="-3291075926708173666" name="formmain_0001"/>
<definitions/>
<values>
<column name="部门">
<value><![CDATA[A]]></value>
</column>
<column name="百万">
<value/>
</column>
<column name="十万">
<value/>
</column>
<column name="万">
<value/>
</column>
<column name="千">
<value/>
</column>
<column name="百">
<value/>
</column>
<column name="十">
<value/>
</column>
<column name="元">
<value/>
</column>
<column name="角">
<value/>
</column>
<column name="分">
<value/>
</column>
<column name="用途说明">
<value><![CDATA[测试]]></value>
</column>
<column name="财务总监">
<value/>
</column>
<column name="总裁">
<value/>
</column>
<column name="财务审核">
<value/>
</column>
<column name="部门总监">
<value/>
</column>
<column name="部门经理">
<value/>
</column>
<column name="大写分">
<value><![CDATA[9]]></value>
</column>
<column name="单据号">
<value/>
</column>
<column name="结算方式">
<value/>
</column>
<column name="日期">
<value/>
</column>
<column name="经手人">
<value/>
</column>
<column name="大写">
<value/>
</column>
<column name="小写">
<value/>
</column>
</values>
<subForms>
<values>
<column name="field5">
<value/>
</column>
</values>
</subForms>
</formExport>
# 取得流程状态
开发者可以通过流程ID(即col_summary表ID)获取流程状态。
接口请求说明:
http请求方式:GET
http://ip:port/seeyon/rest/flow/state/{flowId}
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
flowId | 是 | 流程的summaryId |
返回说明
正常情况下,会返回的是Integer类型的数值。 如果录入的流程ID错误或者为空时,返回信息为空。 如果返回值有问题,请联系客服上报bug处理
流程状态说明如下图:
分类 | 状态名称 | 状态值 | 说明 |
---|---|---|---|
未发出 | 待发 | 1 | 流程未发出 |
处理中 | 待处理 | 3 | 流程发出,无任何人处理/发出后回到待发 |
处理中 | 处理中 | 4 | 流程发出,已部分处理 |
处理中 | 回退 | 6 | 被退回到上一节点 |
处理中 | 取回 | 7 | 被上一节点取回 |
非正常结束 | 撤销 | 5 | 被发起者撤销 |
非正常结束 | 终止 | 15 | 被终止 |
正常结束 | 结束 | 0 | 正常结束 |
# 取得指定表单模板已结束的流程ID
开发者可以通过指定模板编号,TOKEN,开始时间以及结束时间,来获取已经结束的模板流程ID【col_summary表ID】。
接口请求说明:
http请求方式:GET
http://ip:port/seeyon/rest/flow/FromFinish/{templateCode}/{startTime}/{endTime}
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
templateCode | 是 | 表单模板编号【如果有多个请以逗号隔开,如String templateCode="789,777";】 |
startTime | 是 | 查询开始时间 如2012-01-02 |
endTime | 是 | 查询结束时间 如2012-01-02 |
代码示例
String templateCode="789,777";
token=AuthorityServiceTest.authenticate();
String result = client.get("flow/FromFinish/" + templateCode+"/2012-01-02/2015-12-08?token=" + token, String.class);
返回说明
正常情况下,会返回的是模板流程对应col_summary表ID,否则为空。
# 取得表单模板XML信息(V61update)
开发者可以通过指定模板编号获取表单模板XML信息。
V6.1 增加获取表单XML2.0格式接口
接口请求说明:
http请求方式:GET
http://ip:port/seeyon/rest/flow/FromTemplate/{templateCode}
http请求方式:GET(V6.1增加获取表单XML2.0接口)
http://ip:port/seeyon/rest/flow/fromtemplatexml/{templateCode}
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
templateCode | 是 | 表单模板编号 |
返回说明
正常情况下,会返回的表单模板XML信息。
# 取得指定表单HTML信息
开发者可以通过表单流程affairId和人员ID获取表单HTML信息。
注意: affairId不能用发起状态对应的ID,也就是affairId表STATE为2的ID,同时,当表单流程做了预归档后,doc_resources表存的SOURCE_ID也是发起节点affairId,也是不能用于此接口的。仅支持CAP3表单
接口请求说明:
http请求方式:GET
http://ip:port/seeyon/rest/form/export/{affairId}/{memId}
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
affairId | 是 | 表单affairId |
memId | 是 | 人员ID |
返回说明
DEMO:
CTPRestClient client = RestResource.getInstance().resouresClent();
String result[] = client.get("form/export/{affairId}/{memId}", String[].class);
System.out.println(result[0]);//只是表单数据
System.out.println(result[1]);//完整的HTML信息(包括数据信息)
正常情况下,会返回的表单HTML信息。
# 根据人员编码获取待办事项(Since:V8.2SP1)
开发者可以通过人员信息的code关键字,基于左匹配原则,先模糊匹配出符合条件的code值(如:查询code为“futao”会查询出futao1,futao2),再根据code值来获取对应人员未被删除的待办信息。
接口请求说明:
http请求方式:GET
http://ip:port/seeyon/rest/affairData/pending/code/{memberCode}
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
memberCode | 是 | 数据表org_member的code值 |
返回说明
正常情况下,会返回所有满足code关键字的人员的未被删除的待办事项。
# 取得指定表单流程当前待办人员信息(Since:V61)
开发者可以通过表单流程summaryId获取表单当前待办人员信息。
接口请求说明:
http请求方式:GET
http://ip:port/seeyon/rest/flow/dostaff/{summaryId}
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
summaryId | 是 | 表单summaryId |
返回说明
正常情况下,会返回的表单流程待办节点人员信息。
# 根据SummaryID或AffairID获取表单数据(Since:V61)
根据SummaryID或者AffairID获取表单数据
接口请求说明:
http请求方式:GET
http://ip:port/seeyon/rest/form/getformdata/{SummaryID或者AffairID}
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
summaryId | 否 | 表单summaryId |
AffairID | 否 | 表单AffairID |
注意:表单summaryId 或者 表单AffairID 必须填一个
返回说明
请求成功,返回的表单数据信息。
# 获取指定协同附件列表(Since:V61)
根据SummaryID或者AffairID获取指定协同附件列表.
接口请求说明:
http请求方式:GET
http://ip:port/seeyon/rest/coll/attachments/{SummaryID}/{AffairID}/{attType}
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
summaryId | 是 | 表单summaryId |
attType | 是 | 0代表附件,2代表关联文档,“0,2”代表附件和关联文档 |
示例:
Long summaryId=6469925997427117213L;
Long affairId=0L;
client.get("coll/attachments/"+summaryId+"/2", String.class);
返回说明
请求成功,返回的附件列表信息。
# 获取人员有权限模板ID列表(Since:V61)
根据人员登录名,获取该人员所有权限调用的协同及表单模板ID列表.
接口请求说明:
http请求方式:GET
http://ip:port/seeyon/rest/template/templateidlist/{loginName}/{moduleType}
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
loginName | 是 | 登录名 |
moduleType | 是 | 1-协同模板;2-表单模板,4-公文模板 |
示例:
client.get("template/templateidlist/lsm/1,2,4", String.class);
返回说明
请求成功,返回的模板ID列表信息。
# 协同处理接口
# 推荐使用接口(Since:V80sp1)
接口请求说明
http请求方式:POST
http://ip:port/seeyon/rest/bpm/workitem/finish
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
示例:
Map<String, Object> map = new HashMap<String, Object>();
map.put("appName", "collaboration");
map.put("workitemId", "6063271658185834554");
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("attitude", "1");
map1.put("content", "意见内容");
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("comment_deal", map1);
map2.put("submitType", "1");
map2.put("baseProcessXML", "");
map2.put("baseReadyObjectJSON", "");
map2.put("messageDataList", "");
map2.put("changeMessageJSON", "");
map.put("data", map2);
Map result = client.post("bpm/workitem/finish" ,map);
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
appName | 是 | 应用类型 |
workitemId | 是 | 事项ID(wf_workitem_run.id) |
attitude | 是 | 态度(1 已阅, 2 同意, 3 不同意) |
content | 否 | 意见内容 |
submitType | 否 | 是否需要提交协同 (1:提交协同,2:暂存待办 默认1) |
baseProcessXML | 否 | 工作流XML。工作流有加签和减签时传入processXML。 |
baseReadyObjectJSON | 否 | 当前会签信息, 由后台生成, 加签/知会不传值,该参数可以为null,此时表示没有针对当前流程的Ready状态的节点 如果不为空,并且格式符合BPMProcess的话,在该xml的基础上执行流程修改操作 |
messageDataList | 否 | 发送消息用的json格式字符串, 由后台生成 |
changeMessageJSON | 否 | 加签/减签等操作数据, 后台生成 |
返回说明 请求成功: 返回信息中"code" : 0 非0表示异常。
# 过时接口(Since:V60)
处理自由协同操作接口(暂时只支持协同与表单流程)。
接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/affair/finishaffair
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
affairId | 是 | 流程ID |
memberid | 是 | 当前处理人ID |
comment | 是 | 处理意见 |
attitude | 是 | 态度:1同意,2不同意,0已阅 |
示例:
Map res = new HashMap();
res.put("affairId", 4649147029372880118L);
res.put("memberid", "5225821413792960362");//当前处理人ID
res.put("comment", "可以我看到了!");//处理意见
res.put("attitude", "0");//态度:1同意,2不同意,0已阅
client.post("affair/finishaffair", res, String.class);
返回说明
请求成功,返回的true。
# 协同终止接口(Since:V60)
终止协同流程操作(暂时只支持协同与表单流程)。
接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/affair/stop
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
affairId | 是 | 流程ID |
repealComment | 否 | |
member | 是 | 当前处理人登录名 |
示例:
Map res = new HashMap();
res.put("affairId", -3163744027596143175L);
res.put("repealComment", "");
res.put("member", "lsm");//当前处理人登录名
client.post("affair/stop", res, String.class);
返回说明
请求成功,返回的true。
# 协同撤销接口(Since:V60)
撤销协同流程操作(暂时只支持协同与表单流程)。
接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/affair/cancel
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
affairId | 是 | affairId ID |
summaryId | 是 | summaryId ID |
member | 是 | 当前处理人登录名 |
示例:
Map res = new HashMap();
res.put("summaryId", 8846764470742567536L);
res.put("affairId", -2108792029172252434l);
res.put("member", "lsm");//当前处理人登录名
client.post("affair/cancel", res, String.class);
# 协同撤销接口(Since:6.1SP1)
撤销协同流程操作(暂时只支持协同与表单流程)。
接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/bpm/process/repeal
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
appName | 是 | 应用类型(协同:collaboration、公文:edoc) |
workitemId | 是 | workitemId ID |
data | 否 | 撤销意见 |
示例:
Map res = new HashMap();
res.put("appName", "collaboration");
res.put("workitemId", 2108792029172252434l);
Map cancelMsg = new HashMap();
cancelMsg.put("stopOpinion", "撤销意见");
res.put("data", cancelMsg);
client.post("process/repeal", res, String.class);
返回说明
请求成功,返回内容为空。
# 协同取回接口(Since:V61sp1)
取回协同流程操作(暂时只支持协同与表单流程)。
接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/bpm/workitem/takeback
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
appName(String) | 是 | 应用类型,协同,表单设置为:collaboration |
workitemId(String) | 是 | 待办事项Id,对应ctp_affair表SUB_OBJECT_ID字段 |
dataMap(Map) | 是 | Key有这些isSaveOpinion:是否在原意见上修改.true:保留原意见。 |
示例:
Map datares = new HashMap();
datares.put("isSaveOpinion", "true");//是否在原意见上修改。 "true", 保留原意见
Map res = new HashMap();
res.put("appName", "collaboration");//应用类型,协同表单设置为:collaboration
res.put("workitemId", "");//对应事项接口返回对象中的subObjectId
res.put("data",datares);//当前处理人登录名
client.post("bpm/workitem/takeback" ,res, String.class);
返回说明 请求成功: 返回信息中"code" : 0 非0表示异常。
# 协同回退接口(Since:V61sp1)
回退协同流程操作(暂时只支持协同与表单流程)。 接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/bpm/workitem/stepBack
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
appName(String) | 是 | 应用类型,协同,表单设置为:collaboration |
workitemId(String) | 是 | 待办事项Id,对应ctp_affair表SUB_OBJECT_ID字段 |
dataMap(Map) | 是 | Key有:isWFTrace:0 流程追溯 |
- | 是 | comment_deal:attitude:1 已阅,2 同意,3 不同意 |
- | 是 | comment_deal:content: 回退意见 |
示例:
Map commentres = new HashMap();
commentres.put("attitude", "1");//"1", //1 已阅, 2 同意, 3 不同意
commentres.put("content", "回退意见");//意见
Map datares = new HashMap();
datares.put("isWFTrace", "0");//,// 流程追溯
datares.put("comment_deal",commentres);
Map res = new HashMap();
res.put("appName", "collaboration");//应用类型,协同表单设置为:collaboration
res.put("workitemId", "");//对应事项接口返回对象中的subObjectId
res.put("data",datares);//当前处理人登录名
client.post("bpm/workitem/stepBack" ,res, String.class);
返回说明 请求成功: 返回信息中"code" : 0 非0表示异常。
# 协同指定回退接口(Since:V61sp1)
指定回退协同流程操作(暂时只支持协同与表单流程)。 接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/bpm/workitem/specifyback
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
appName(String) | 是 | 应用类型,协同,表单设置为:collaboration |
workitemId(String) | 是 | 待办事项Id,对应ctp_affair表SUB_OBJECT_ID字段 |
targetNodeId(String) | 是 | 被指定回退的节点ID,对应ctp_affair表ACTIVITY_ID字段,参见获取activityId |
stepbackStyle(String) | 是 | 0:表示回退流程会一个个通过中间节点回退到指定节点,1:表示直接跳过中间的节点,直接到指定节点 |
dataMap(Map) | 是 | Key有:isWFTrace:0 流程追溯 |
- | 是 | comment_deal:attitude:1 已阅,2 同意,3 不同意 |
- | 是 | comment_deal:content: 回退意见 |
示例:
Map commentres = new HashMap();
commentres.put("attitude", "1");//"1", //1 已阅, 2 同意, 3 不同意
commentres.put("content", "指定回退意见");//意见
Map datares = new HashMap();
datares.put("isWFTrace", "0");//,// 流程追溯
datares.put("comment_deal",commentres);
Map res = new HashMap();
res.put("appName", "collaboration");//应用类型,协同表单设置为:collaboration
res.put("workitemId", "");//对应事项接口返回对象中的subObjectId
res.put("targetNodeId", "");//可以通过指定回退到节点人员的已办事项接口来获取,对应已办事项接口返回对象的activityId
res.put("data",datares);//当前处理人登录名
client.post("bpm/workitem/specifyback" ,res, String.class);
返回说明 请求成功: 返回信息中"code" : 0 非0表示异常。
# 流程加签/当前会签/知会/多级会签接口(Since:V7.0)
流程加签/当前会签/知会/多级会签 操作。 接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/bpm/process/addNode
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
appName(String) | 是 | 模块ID:("collaboration")(公文暂不支持) |
workitemId(String) | 是 | 业务ID,对应ctp_affair表sub_object_id字段(非CASE_ID)字段 |
changeType(String) | 是 | 流程修改类型(1加签、2知会、3当前会签、5多级会签、6传阅) |
submitType(String) | 是 | 是否需要提交协同 (0:不需要,1:提交协同,2:暂存待办 默认1) |
data(String) | 是 | 流程修改信息 |
示例:
CTPRestClient client = RestResource.getInstance().resouresClent();
String jsonData ="{'add_node_info': {"
+ "'userId': ['-5497257474554312519|true', '4867812283561102527']," //加签的组织机构id(人员,部门,岗位,组,外部单位和单位id), 如果传入的是部门(部门id|是否包含子部门(不包含true,包含false,不传默认为false))
其他只传入id即可
+ "'node_process_mode': 'all'," //有多人节点时的执行模式(全体执行:all,竞争执行:competition。默认全体执行)
+ "'policyId': '-1615966327731106420'," //节点权限id(当前会签才传入,知会和当前会签都不传入)
+ "'formOperationPolicy': '1'," // 表单节点权限(0:同当前节点权限,1:只读。普通协同默认为0,表单协同默认为1)
+ "'backToMe': '1'," //加签处理后流程是否回到我(0:否,1:是)
+ "'dealTerm': '2017-11-10 11:12'," //节点期限(节点期限到期的时间。时间格式 "yyyy-MM-dd HH:mm")
+ "'remindTime': '4320'," //提前提醒时间传入分钟数,只能传入下面的数字(0:无,5:5分钟,10:10分钟,15:15分钟,30:30分钟,60:1小时,120:2小时,180:3小时,240:4小时,480:8小时,720:0.5天,1440:1天,2880:2天,4320:3天,10080:1周)
+ "'flowType': '2'" //加签类型(并发:2,串发:1,与下一节点并发:5)
+ "},"
+ "'comment_deal': {"
+ "'attitude': '1'," //// 1 已阅, 2 同意, 3 不同意
+ "'content': '接口指定回退'"
+ "}"
+ "}";
Map map = new HashMap() {
{
put("appName", "collaboration"); //必填|模块id(eg:"collaboration","edoc")
put("workitemId", "5593664130991175609");//业务ID
put("changeType", "1");//流程修改类型(1加签、2知会、3当前会签)
put("submitType", "-8808053010255165035");// 是否需要提交协同 (0:不需要,1:提交协同,2:暂存待办 默认1)
put("data", jsonData);//流程修改信息
}
};
client.post("bpm/process/addNode", map, String.class);
返回说明
请求成功: 返回信息中"code" : 0 非0表示异常。
# 流程减签接口(Since:V7.0)
流程减签 操作。
接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/bpm/process/deleteNode
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
appName(String) | 是 | 模块ID:("collaboration","edoc") |
activityIdList(String) | 是 | 减签的节点,参见获取activityId |
submitType(String) | 是 | 是否需要提交协同 (0:不需要,1:提交协同,2:暂存待办 默认1) |
data(String) | 是 | 流程修改信息 |
示例:
CTPRestClient client = RestResource.getInstance().resouresClent();
String jsonData ="{"
+ "'appName' : 'collaboration',"
+ "'workitemId' : '-5593664130991175609'," //模块id
+ "'activityIdList' : '4867812283561102527'," //减签的节点
+ "'submitType' : '1', " //是否需要提交协同 (0:不需要,1:提交协同,2:暂存待办 默认1)
+ "'data':{"
+ "'comment_deal' : {"
+ "'attitude': '1'," // 1 已阅, 2 同意, 3 不同意
+ "'content' : '接口指定回退'"
+ "}"
+ "}"
+ "}";
Map map = new HashMap() {
{
put("appName", "collaboration"); //必填|模块id(eg:"collaboration","edoc")
put("activityIdList", "5593664130991175609");//减签的节点
put("submitType", "1");//是否需要提交协同 (0:不需要,1:提交协同,2:暂存待办 默认1)
put("data", jsonData);//流程修改信息
}
};
client.post("bpm/process/deleteNode", map, String.class);
返回说明
请求成功: 返回信息中"code" : 0 非0表示异常。
# 节点替换接口(Since:V7.0)
替换流程节点, 新建自由协同和处理流程时的流程编辑都调用这个方法(立即生效) 接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/bpm/process/freeReplaceNode
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
appName(String) | 是 | 模块ID:("collaboration","edoc") |
activityId(String) | 是 | 数字类型的字符串, 需要替换的节点ID,参见获取activityId |
processId(String) | 是 | 当前的流程id |
caseId(String) | 是 | 数字类型的字符串, 流程的实例ID, 没有时传-1 |
data(Map) | 是 | 将节点替换成这个信息 |
{
appName : "collaboration",
activityId : "-5593664130991175609",
processId : "8492409909120645741", 当前的流程id
caseId : "327612323971118692", 数字类型的字符串, 流程的实例ID, 没有时传-1
"data":{
"userId":"-5497257474554312519|true" 替换成的组织机构id(人员,部门,岗位,组,外部单位和 单位id),如果传入的是部门(部门id|是否包含子部门(不包含true,包含false,不传默认为false))其他只传入id即可
}
}
示例:
CTPRestClient client = RestResource.getInstance().resouresClent();
Map dataMap = new HashMap(){
put("userId", "-5497257474554312519|true");
}
Map map = new HashMap() {
{
put("appName", "collaboration"); //必填|模块id(eg:"collaboration","edoc")
put("activityIdList", "5593664130991175609");//数字类型的字符串, 需要替换的节点ID
put("processId", "1");//当前的流程id
put("caseId", "1");//数字类型的字符串, 流程的实例ID, 没有时传-1
put("data", dataMap);//将节点替换成这个信息
}
};
client.post("bpm/process/freeReplaceNode", map, String.class);
返回说明
请求成功: 返回信息中"code" : 0 非0表示异常。
# 转办接口(Since:V7.0)
转办,(立即生效)
接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/bpm/process/replaceItem
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
appName(String) | 是 | 模块ID:("collaboration","edoc") |
workitemId(String) | 是 | 当前流程工作事项id |
nextMemberId(String) | 是 | 替换后的人员id |
{
"appName" : "collaboration",
"workitemId" : "-5593664130991175609",
"nextMemberId" : "8492409909120645741", 替换后的人员id
}
示例:
CTPRestClient client = RestResource.getInstance().resouresClent();
Map map = new HashMap() {
{
put("appName", "collaboration"); //必填|模块id(eg:"collaboration","edoc")
put("activityIdList", "5593664130991175609");//当前流程工作事项id
put("nextMemberId", "1");//替换后的人员id
}
};
client.post("bpm/process/replaceItem", map, String.class);
}
返回说明
请求成功: 返回信息中"code" : 0 非0表示异常。
# 获取流程图生成图片接口(Since:V7.0)
流程图生成图片
接口请求说明:
http请求方式:GET
:http://ip:port/seeyon/rest/bpm/process/diagramImg?isRunning=true&processId=xxx&workitemId=xxx&caseId=xxx
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明:
参数 | 是否必须 | 说明 |
---|---|---|
isRunning(String) | 是 | 是否是正在运行的流程(true:正在运行,false:模板流程) |
processId(String) | 是 | 流程Id |
workitemId(String) | 否 | 当前事项id |
caseId(String) | 是 | 流程实例Id (isRunning 为true是必填,没有时传-1) |
返回说明
请求成功: 返回信息中"code" : 0 非0表示异常。
# 获取表单完整数据函数(Since:V61)
前台本地API:获取当前表单完整数据.
函数位置:common/content/form.js中
函数名称:getFormData()
示例:在commono/content/content.jsp中调用getFormData()
getFormData();
var content = {};
content.contentType = "${contentList[0].contentType}";
content.moduleType = "${contentList[0].moduleType}";
...
# 按表单字段获取字段信息(Since:V61)
前台本地API:通过指定表单字段(如:field0001)获取指定字段的表单信息.
函数位置:common/content/form.js中
函数名称:getCurrentFormMasterRS({表单字段})
示例:在commono/content/content.jsp中调用getCurrentFormMasterRS({表单字段})
getCurrentFormMasterRS('field0001');
var content = {};
content.contentType = "${contentList[0].contentType}";
content.moduleType = "${contentList[0].moduleType}";
...
# 通过SummaryId或AffairId获取表单数据(Since:V61)
后台方法API:可以配合后台监听方法,获取表单FormDataMasterBean
函数位置:FormManager
函数名称:selectDataBySummaryIdOrAffairId
示例:配合后台处理事件监听中调用
@ListenEvent(event = CollaborationProcessEvent.class, async = true)
public void onProcess(CollaborationProcessEvent event) {
if (formManager == null) {
formManager=(FormManager)AppContext.getBean("formManager");
}
FormDataMasterBean formManager.selectDataBySummaryIdOrAffairId(event.getSummaryId().toString());
# 流程事件接口
# 使用场景
流程事件接口:基于工作流的节点的不同的处理事件(如:发起,处理,终止,流程结束等),调用外部第三方系统。
例如:某律师事务所,采用协同对案件是否承接进行审批,审批后,以该案件作为项目单元进行管理,包括文档、人员、协同、会议等等。
此场景可以抽象为以下协同功能:
- 表单管理员:在表单《案件承接审批单》设置-触发设置中,选择 核定/其它通过后动作为:创建项目。
- 普通用户:表单流程《案件承接审批单》审批,审批通过后,自动创建项目。
“创建项目”动作,非系统自带,采取“接口+客开”模式完成。
类似的场景还有很多,例如:写入HR、写入财务、写入某某系统等等。
# 流程事件概述
抽象成协同功能:
- 表单/模板/公文管理员,流程设置,选择动作
- 普通用户
事件基于工作流(Workflow)来实现,需要监听的事件包括:
- 发起(Start)
- 处理(FinishWorkitem)
- 终止(Stop)
- 回退(StepBack)
- 撤销(Cancel)
- 取回(TakeBack)
- 流程结束(ProcessFinished)
事件触发点,包括:
- 正常流转:发起、处理
- 督办、管理员:终止
- 自动发起:子流程、新流程
每个动作提供一组接口,分别是:
- 动作前事件(后台)——Ajax到后台处理,通过返回值控制是否阻塞当前行为
- 动作后——流程动作已经完成,事件行为不对流程起任何控制作用
- 特别说明:“流程结束”只有动作后事件
# 实现方式
1平台提供一个抽象类AbstractWorkflowEvent,具体实现由客开来完成。
2.插件注册:在实现了抽象类AbstractWorkflowEvent(比如,实现类为MyWorkflowEvent),需要在spring的配置文件中注册(具体的插件注册)。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName">
<bean id="myWorkflowEvent" class="com.test.MyWorkflowEvent" />
</beans>
public abstract class AbstractWorkflowEvent {
/**
* 唯一标示,一旦生成,不可变更
* @return
*/
public abstract String getId();
/**
* 事件显示名称
* @return
*/
public abstract String getLabel();
/**
* 返回指定的模版编号
* @return
*/
public String getTemplateCode(){return "";};
//发起前事件
public WorkflowEventResult onBeforeStart(WorkflowEventData data){return null;}
//发起事件
public void onStart(WorkflowEventData data){}
//处理前事件
public WorkflowEventResult onBeforeFinishWorkitem(WorkflowEventData data){return null;}
//处理事件
public void onFinishWorkitem(WorkflowEventData data){}
//终止前事件
public WorkflowEventResult onBeforeStop(WorkflowEventData data){return null;}
//终止事件
public void onStop(WorkflowEventData data){}
//回退前事件
public WorkflowEventResult onBeforeStepBack(WorkflowEventData data){return null;}
//回退事件
public void onStepBack(WorkflowEventData data){}
//撤销前事件
public WorkflowEventResult onBeforeCancel(WorkflowEventData data){return null;}
//撤销事件
public void onCancel(WorkflowEventData data){}
//取回前事件
public WorkflowEventResult onBeforeTakeBack(WorkflowEventData data){return null;}
//取回事件
public void onTakeBack(WorkflowEventData data){}
//结束事件
public void onProcessFinished(WorkflowEventData data){}
}
WorkflowEventData类如下:
public class WorkflowEventData {
private long summaryId;//事件前获取不到
private long affairId;//事件前获取不到
/**
* 节点绑定的表单ID
*/
private String form= null;
/**
* 节点绑定的表单应用ID
*/
private String formApp= null;
/**
* 节点绑定的表单操作视图ID
*/
private String operationName= null;
/**
* 业务数据集合(包括跨表)
*/
private Map businessData= new HashMap();
//setting and getting
}
WorkflowEventResult类如下:
public class WorkflowEventResult {
public WorkflowEventResult(){}
/**
* @param alertMessage
*/
public WorkflowEventResult(String alertMessage) {
this.alertMessage = alertMessage;
}
/**
* 提示信息
*/
private String alertMessage = "";
/**
* @return the alertMessage
*/
public String getAlertMessage() {
return alertMessage;
}
/**
* @param alertMessage the alertMessage to set
*/
public void setAlertMessage(String alertMessage) {
this.alertMessage = alertMessage;
}
}
# 功能说明
功能点一:表单/模板/公文管理员,流程设置,选择动作
发起节点和中间处理节点事件
# 场景:通过流程事件改变表单数据
通过流程事件改变表单数据,从而可以达到影响表单分支流程的目的。 1.在表单开发高级中的“事前事件”中修改字段(如:处理前事件,回退前事件),不要在“处理事件”(如:处理事件,回退事件,撤销事件)中进行分支条件判断所用字段的修改。 2.“事前事件”中修改字段前读取数据调用:FormService.findDataById(masterId, formId),不能调用该方法的其它的重载方法! 3.“事前事件”中修改字段内容:addFieldValue("...","..."),后面无需调用saveOrUpdateFormData方法
发起节点对应事件如下:
中间处理节点对应事件如下:
全局事件
动作:撤销、终止、流程结束
无论是发起者、中间处理节点、督办者都走相同的接口,不做区分,如果业务上要做区分,代码由客开通过当前登录者和当前节点来区分。
功能点二:流程流转(普通用户登录)
如果是动作前事件,可以依据事件返回值来控制是否阻塞当前行为。
例如:事件返回对象WorkflowEventResult中的alertMessage如果为空则原流程继续执行,如果不为空则会弹出提示框,阻塞当前行为。
# 配置方式(高版本)
1、CIP集成平台中进行第三方应用产品登记以及应用注册 (opens new window)
2、创建业务分类
3、新建集成业务
4、关联应用
5、节点事件绑定
6、添加节点事件
# 流程监听接口
# 使用场景
流程事件接口:是在触发OA中某个操作动作(如发起流程,创建人员,或是发起公告等)时,可调用外部第三方系统,注意监听事件中的工作流事件(如:发起,处理,终止,流程结束等),是全局性的监听,而非上面流程事件中针对某个流程。
底层组件(或一个模块)发生动作,需要让上层应用(或其它模块)做出响应动作。
比如:组织模型创建单位,上层公文需要给这个新单位创建一套预置公文元素、公告需要预置一套板块等等。
# 开发步骤
事件监听(注解驱动):
其它任意模块都可以监听上述事件,只需要在方法上面使用@listenEvent(event={param}Event.class),方法参数即为Event对象。 监听类必须定义为spring bean.
# 实现方式
监听事件:
import com.seeyon.apps.collaboration.event.CollaborationStartEvent;
import com.seeyon.ctp.event.EventTriggerMode;
import com.seeyon.ctp.util.annotation.ListenEvent;
...
public MyCollaborationEventListener{
// 监听协同发起事件,同步执行
@listenEvent(event= CollaborationStartEvent.class)//协同发起时立刻执行,同步模式,如果监听代码出了异常,会导致整个事务回滚,协同发起失败。
public void onCollaborationStart1(CollaborationStartEvent event){
//event.getSummartId()
}
// 监听协同发起事件,异步执行 Since V5.1
@listenEvent(event= CollaborationStartEvent.class,async=true)//协同发起时立刻执行,异步模式,监听代码出异常不影响协同发起。但如果协同发起自身事务回滚,监听代码仍然会执行。
public void onCollaborationStart2(CollaborationStartEvent event){
//event.getSummartId()
} // 监听协同发起事件,事务提交成功后执行 Since V5.1
@listenEvent(event= CollaborationStartEvent.class,mode=EventTriggerMode.afterCommit)//协同发起成功提交事务后执行,异步模式。
public void onCollaborationStart3(CollaborationStartEvent event){
//event.getSummartId()
}}
如非特定的需求,建议采用第三种模式;
否则以协同发起后发短信为例,第一种模式如果短信网关出错,会导致整个系统的协同都无法发起;
第二种模式,协同发起出错,但短信已经发出,无发追回。
第三种模式,只有协同发起成功了才发出短信。
<bean id="" class="com.seeyon.apps.form.MyCollaborationEventListener">
……
</bean>
# 监听事件列表
流程事件监听列表:
事件名称 | 事件类 | 备注 |
---|---|---|
流程发起事件 | com.seeyon.apps.collaboration.event.CollaborationStartEvent | 发起协同、直接发送、转发、移动应用发送、平台接口发起协同均触发此事件 |
流程处理事件 | com.seeyon.apps.collaboration.event.CollaborationProcessEvent | (Since:V61)可以获取到协同的处理意见对象Comment |
流程结束事件 | com.seeyon.apps.collaboration.event.CollaborationFinishEvent | - |
流程撤销事件 | com.seeyon.apps.collaboration.event.CollaborationCancelEvent | - |
流程回退事件 | com.seeyon.apps.collaboration.event.CollaborationStepBackEvent | - |
流程终止事件 | com.seeyon.apps.collaboration.event.CollaborationStopEvent | - |
(Since:V61)流程处理回复监听事件 | com.seeyon.apps.collaboration.event.CollaborationAddCommentEvent | - |
(Since:V61)流程指定回退事件 | com.seeyon.apps.collaboration.event.CollaborationAppointStepBackEvent | - |
(Since:V61)流程自动跳过事件 | com.seeyon.apps.collaboration.event.CollaborationAutoSkipEvent | - |
(Since:V61)流程删除事件 | com.seeyon.apps.collaboration.event.CollaborationDelEvent | - |
(Since:V61)流程取回事件 | com.seeyon.apps.collaboration.event.CollaborationTakeBackEvent | - |
公文签收事件监听:
com.seeyon.v3x.edoc.EdocSignEvent 签收第三方公文时触发
公告与新闻事件监听(Since:V61)
事件名称 | 事件类 | 备注 |
---|---|---|
公告发起监听事件 | com.seeyon.apps.bulletin.event.BulletinAddEvent | - |
新闻发起监听事件 | com.seeyon.apps.news.event.NewsAddEvent | - |
# 前端事件拦截接口
# 使用场景
前端事件拦截接口:可以给予OA流程中的前端事件(如:协同发送,协同处理等)操作时,调用外部第三方的系统。
这里所说的事件有别于JS中对象的事件。二次开发可通过编写事件监听器控制协同中某些操作是否继续或直接取代原来的操作逻辑。
例如:发送协同前想加入一些处理逻辑来满足不同的需求。
# 开发步骤
在JS文件中需要添加事件响应函数$.ctp.bind(eventName,function(){})。
eventName为事件名称,function为绑定事件函数,此函数必须返回一个boolean值,返回值为true则原逻辑继续执行,返回值为false则中断执行原逻辑。
同一事件可以定义多个监听,无序执行(如要求有序请合并到一个监听),任一监听返回false即停止后续的处理。
# 实现方式
【V6.1之前示例】以发送协同为例:
$.ctp.bind('beforSendColl'function(){
//逻辑处理
//TODO
returntrue;
});
V6.1示例】以处理协同为例:
$.ctp.bind('beforeDealSubmit'function(){
//在协同处理监听增加了获取summaryID与affairID
//TODO
alert(arguments[0].summaryID);
alert(arguments[0].affairID);
return true;
});
把上述JS引入相应文件中就可以拦截协同发送事件,在发送前先执行绑定了'beforSendColl'事件的响应函数,根据函数返回值来判断是否继续执行原逻辑。
# 拦截事件列表
目前已经开放的前端事件如下:
事件名称 | 事件说明 |
---|---|
beforSendColl | 协同发送前事件名称 |
beforeSaveDraftColl | 协同保存待发前事件名称 |
dealRepeatChange | 表单重复行增加、删除事件名称-V6.1监听增加获取(formId,dataId) |
fieldValueChange | 表单字段值改变-V6.1监听增加获取(formId,dataId) |
beforeDealSubmit | 协同处理界面:提交方法-V6.1监听增加获取(summaryID,affairId) |
beforeDealSaveWait | 协同处理界面:暂存待办-V6.1监听增加获取(summaryID,affairId) |
beforeDealCancel | 协同处理界面:流程撤销-V6.1监听增加获取(summaryID,affairId) |
beforeDealstepback | 协同处理界面:回退-V6.1监听增加获取(summaryID,affairId) |
beforeDealstepstop | 协同处理界面:终止-V6.1监听增加获取(summaryID,affairId) |
beforeDealaddnode | 协同处理界面:加签-V6.1监听增加获取(summaryID,affairId) |
beforeDealdeletenode | 协同处理界面:减签-V6.1监听增加获取(summaryID,affairId) |
beforeDealspecifiesReturn | 协同处理界面:指定回退-V6.1监听增加获取(summaryID,affairId) |
beforeDoneTakeBack | 协同已办列表取回-V6.1监听增加获取(summaryID,affairId) |
beforeWaitSendDelete | 协同待发列表删除-V6.1监听增加获取(summaryID,affairId) |
beforeSentCancel | 协同已发列表撤销-V6.1监听增加获取(summaryID,affairId) |
businessFormInit | 无流程表单修改监听事件-V6.1监听增加获取(formId,dataId) |
businessFormDel | 无流程表单删除监听事件-V6.1监听增加获取(formId,dataId) |
businessFormSave | 无流程表单保存监听事件 |
快速跳转
- 表单流程集成
- 接口调用方式
- 概述
- 发起表单(Html正文)流程
- 取得流程正文数据
- 取得流程状态
- 取得指定表单模板已结束的流程ID
- 取得表单模板XML信息(V61update)
- 取得指定表单HTML信息
- 根据人员编码获取待办事项(Since:V8.2SP1)
- 取得指定表单流程当前待办人员信息(Since:V61)
- 根据SummaryID或AffairID获取表单数据(Since:V61)
- 获取指定协同附件列表(Since:V61)
- 获取人员有权限模板ID列表(Since:V61)
- 协同处理接口
- 协同终止接口(Since:V60)
- 协同撤销接口(Since:V60)
- 协同撤销接口(Since:6.1SP1)
- 协同取回接口(Since:V61sp1)
- 协同回退接口(Since:V61sp1)
- 协同指定回退接口(Since:V61sp1)
- 流程加签/当前会签/知会/多级会签接口(Since:V7.0)
- 流程减签接口(Since:V7.0)
- 节点替换接口(Since:V7.0)
- 转办接口(Since:V7.0)
- 获取流程图生成图片接口(Since:V7.0)
- 获取表单完整数据函数(Since:V61)
- 按表单字段获取字段信息(Since:V61)
- 通过SummaryId或AffairId获取表单数据(Since:V61)
- 流程事件接口
- 流程监听接口
- 前端事件拦截接口