# CAP4表单应用接口
# 修订记录
时间 | 内容 |
---|---|
2024年7月11日 | 增加获取参数rightId的方法 |
2024年7月22日 | 新增低版本获取参数rightId的方法 |
# 获取参数rightId步骤
rightId组成是viewId和authId
格式是:viewId.authId
1、先找到表单id
2、查询数据库获取到viewId
select * from cap_form_view_info where FORM_ID=:formId
一条表示pc端,一条表示移动端,选pc的view_id
获取到VIEW_ID为7382243805636937862
3、查询数据库获取到authId
1)高版本方式:
select * from cap_form_auth_info where FORM_ID=:formId;
根据想要的权限选择,比如用填写权限
获取到RESOURCE_ID为739077934791477512
2)低版本方式:
如果低版本,没有cap_form_auth_info表,则查询cap_form_definition,获取view_info字段:
select view_info from cap_form_definition where id=:formId;
进行json格式转换
获取pc(type为seeyonform)的json对象,根据想要的权限选择id
4、将2,3步结果合并得到rightId
rightId:"7382243805636937862.739077934791477512";
# 更新表单数据缓存
- 根据传入从参数,可以更新后端表单的数据缓存,在保存表单时会将缓存中的值存入数据库中持久化
- 此接口需传入JSON数据格式
# 接口请求说明:
http请求方式:POST
<http://ip:port/seeyon/rest/cap4/form/api/updateCacheFormData>
例如:
<http://127.0.0.1/seeyon/rest/cap4/form/api/updateCacheFormData>
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数 | 是否必须 | 参数说明 |
---|---|---|
formMasterDataId | 是 | 主表数据ID |
formId | 是 | 表单ID |
fieldName | 是 | 需要更新的字段名 |
fromRecordId | 否 | 重复表数据ID |
formSonTableName | 否 | 重复表名 |
mergeData | 是 | 主从表的值(类型为Map,key为主从表的表名,value为所有字段值的Map,第二层Map的key为字段名,value为字段值) |
# 返回说明:
请求结果:
参数 | 是否必须 | 参数说明 |
---|---|---|
code | 是 | http请求code |
data | 是 | 请求返回数据JSON,参考下述data |
message | 是 | 提示信息 |
请求结果data:
参数 | 是否必须 | 参数说明 |
---|---|---|
code | 是 | 状态码 |
message | 是 | 提示信息 |
# 发起表单(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参数 |
useNewDataStructure | 否 | 是否使用新的表单数据格式 |
doTrigger | 否 | 是否执行触发 |
表单data参数
参数 | 是否必须 | 说明 |
---|---|---|
formmainxxx | 是 | 表单字段数据,json格式:key字段显示名称,value字段值(如果是cap4的附件控件,则value为附件的相关信息) |
formsonxx1 | 是 | 数组结构,参考主表 |
thirdAttachments | 否 | CAP4附件参数 |
changedFields | 否 | 参与计算的字段 |
thirdAttachments参数说明
参数 | 是否必须 | 说明 |
---|---|---|
subReference | 是 | 对应的附件字段的value值 |
fileUrl | 是 | 上传的附件ID |
sort | 是 | 附件排序 |
请求参数示例:
{
"appName": "collaboration",
"data": {
"data": {
"formmain_0177": {
"文本1": "测试文本1-111",
"上传附件1": "3091996204880318295",
"图片下拉1": "-2767075386175501632"
},
"formson_0185": [
{
"图片下拉2": "-2767075386175501632",
"上传附件2": "-6092561120937621142"
}
],
"thirdAttachments": [
{
"subReference": "3091996204880318295",
"fileUrl": "432641077895385013",
"sort": 1
},
{
"subReference": "-6092561120937621142",
"fileUrl": "355134930180197101",
"sort": 1
}
],
"changedFields":{
"formmain_0177":["选人1","文本1"],
"formson_0185":["选人2"]
}
},
"templateCode": "ABC1111",
"draft": "0",
"attachments": [
123456,
123457
],
"relateDoc": "col|123,456;doc|321,654",
"subject": "",
"useNewDataStructure": false,
"doTrigger": true
}
}
# 请求表单参数说明(@Since v8.0sp2)
masterTable的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | String | 是 | 数据库表名称 |
record | Object | 是 | 记录的数据 |
changedFields | String[] | 否 | 需要计算的字段 |
masterTable—record的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
id | long | 是 | 数据id |
fields | Object[] | 是 | 包含字段 |
masterTable—record—fields的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | String | 是 | 数据域名称 |
value | String | 是 | 数据值(优先) |
showValue | String | 是 | 显示值 |
subTables的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | String | 是 | 数据库表名称 |
records | Object[] | 是 | 包含的所有数据 |
changedFields | String[] | 否 | 需要计算的字段 |
subTables—records的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
id | long | 是 | 数据id |
fields | Object[] | 是 | 包含字段 |
subTables—records—fields的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | String | 是 | 数据域名称 |
value | String | 是 | 数据值(优先) |
showValue | String | 是 | 显示值 |
请求参数示例(@Since v8.0sp2):
{
"appName": "collaboration",
"data": {
"data": {
"masterTable":{
"name":"formmain_0019",
"record":{
"id":123456789101,
"fields":[
{
"name":"field0001",
"value":"",
"showValue":"create"
},
{
"name":"field0002",
"value":"",
"showValue":"one"
}
]
},
"changedFields": ["field0001","field0002"]
},
"subTables": [
{
"name":"formson_0021",
"records": [
{
"id": 123456789101,
"fields": [
{
"name":"field0005",
"value":"",
"showValue":"cap"
}
]
}
],
"changedFields": ["field0005"]
}
]
},
"templateCode": "SOAP01",
"draft": "0",
"subject": "又试1下",
"useNewDataStructure": true,
"doTrigger": true
}
}
返回数据:
{
"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, 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 ="{"field1":"主表数据1","field2":"主表数据2",sub:[{"field3":"从表数据3","field4":"从表数据4","field5":"从表数据5"},{"field6":"从表数据6"},{"field10":"从表数据10","field11":"从表数据11"}]}";
注意:这里sub代表从表数据,而field1等字段信息是对应【流程表单制作】-【基础设置】中控件的【名称】字段
表单流水号场景:
现在发起流程接口只支持【计算流水号】
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
}
]
}
{
"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 | 没有主表记录错误 |
# 表单截图
版本:Since V8.0
对外接口调用:
**类路径:**com.seeyon.cap4.form.api.FormApi4Cap4
**方法名:**String doFormCapture(FormCaptureParamBean bean) throws BusinessException
说明:非rest接口,为seeyon 后端 api接口
参数说明
FormCaptureParamBean的结构:
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
rightId | String | 是 | 权限id 获取参数rightId步骤 |
moduleId | Long | 是 | 对应流程表中的summaryId |
moduleType | Ineteger | 是 | cap无流程表单:42;协同表单:1 |
renderType | String | 是 | 渲染类型,两种选项:base64,pdf |
requestParams | Map<String, Object> | 是 | map中需要4个参数,serverName(如:127.0.0.1),serverPort(如:8080),scheme(如:http、https),contextPath(如:seeyon) |
返回参数说明
如果renderType=base64,返回的是一个字符串,图片的base64编码,可以通过![[xxx|xxx]] img src="xxx" 的方式在页面显示这张图片
如果renderType=pdf,返回的是一个url下载路径,该路径返回的是一个pdf文件,截图的内容包含在pdf文件中
备注说明
- 只支持cap4;
- 使用的截图工具是phantomjs
- 支持的服务器:windows/linux x86/arm
- (国产化)信创环境兼容问题,会出现截图程序崩溃,原因:Lib包版本不对。
# 无流程的批量添加
版本:Since V8.0
备注 若V8.0 buldId: B200613.2565.CTP203851版本存在调用BUG,如调用不可用,请上报BUG获取补丁。参考BUG号 BUG2024042904577
接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/cap4/form/soap/batch-add
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
uniqueFiled | String[] | 否 | 更新用的唯一标识 |
rightId | String | 是 | 使用的操作权限id 获取参数rightId步骤 |
dataList | Object[] | 是 | 导入的数据 |
formCode | String | 是 | 表名 |
loginName | String | 是 | 用于登陆的登录名(登录名对应的人员必须有底表操作权限才可以,并不是普通用户) |
doTrigger | boolean | 否 | 是否执行触发(Since V8.0sp2) |
dataList的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
masterTable | Object | 是 | 主表数据 |
subTables | Object[] | 是 | 明细表数据 |
attachmentInfos | Object[] | 否 | 表单附件 |
masterTable的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | String | 是 | 数据库表名称 |
record | Object | 是 | 记录的数据 |
changedFields | String[] | 否 | 需要计算的字段 |
masterTable—record的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
id | long | 是 | 数据id |
fields | Object[] | 是 | 包含字段 |
masterTable—record—fields的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | String | 是 | 数据域名称 |
value | String | 是 | 数据值(优先) |
showValue | String | 是 | 显示值 |
subTables的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | String | 是 | 数据库表名称 |
records | Object[] | 是 | 包含的所有数据 |
changedFields | String[] | 否 | 需要计算的字段 |
subTables—records的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
id | long | 是 | 数据id |
fields | Object[] | 是 | 包含字段 |
subTables—records—fields的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | String | 是 | 数据域名称 |
value | String | 是 | 数据值(优先) |
showValue | String | 是 | 显示值 |
attachmentInfos的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
subReference | long | 是 | 对应附件字段id值 |
fileUrl | long | 是 | 已上传文件的fileURL |
sort | int | 是 | 排序 |
调用模版
{
"formCode": "aaa1",
"loginName": "zhai",
"rightId":"56195256829429332.-470190193844795028",
"doTrigger": true,
"dataList": [
{
"masterTable":{
"name":"formmain_0019",
"record":{
"id":123456789101,
"fields":[
{
"name":"field0001",
"value":"",
"showValue":"create"
},
{
"name":"field0002",
"value":"",
"showValue":"one"
},
{
"name":"field0003",
"value":"198747588475848444",
"showValue":""
}
]
},
"changedFields": ["field0001","field0002"]
},
"subTables": [
{
"name":"formson_0021",
"records": [
{
"id": 123456789101,
"fields": [
{
"name":"field0005",
"value":"",
"showValue":"cap"
}
]
}
],
"changedFields": ["field0005"]
}
],
"attachmentInfos" : [
{
"subReference" : "198747588475848444",
"fileUrl" : "7897958946781246",
"sort" : "0"
}
]
}
]
}
响应模版
{
"code": 0,
"data": {
"successIdList": [
4035394180072293997
],
"failedData": {
},
"successCount": 1,
"failedCount": 0
},
"message": ""
}
响应参数说明
参数 | 类型 | 说明 |
---|---|---|
code | String | http请求code |
data | Object | 表单数据 |
message | String | 提示内容 |
data的结构
参数 | 类型 | 说明 |
---|---|---|
successIdList | Long[] | 成功的数据id (目前只返回id是主表行id) |
failedData | Map<Long,String> | 失败的数据id(目前只返回id是主表行id)及失败原因 |
successCount | int | 成功数量 |
failedCount | int | 失败数量 |
# 无流程的批量删除
版本:Since V8.0
接口请求说明:
http请求方式:DELETE
http://ip:port/seeyon/rest/cap4/form/soap/batch-delete
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
formCode | String | 是 | 表单编号 |
loginName | String | 是 | 用于登陆的登录名 (登录名对应的人员必须有底表操作权限才可以,并不是普通用户) |
idList | Long[] | 是 | 要删除的数据id |
调用模版
{
"formCode": "aaa1",
"loginName": "zhai",
"idList":[
4035394180072293997
]
}
响应模版
{
"code": 0,
"data": {
"successIdList": [
4035394180072293997
],
"failedData": {
},
"successCount": 1,
"failedCount": 0
},
"message": ""
}
响应参数说明
参数 | 类型 | 说明 |
---|---|---|
code | String | http请求code |
data | Object | 表单数据 |
message | String | 提示内容 |
data的结构
参数 | 类型 | 说明 |
---|---|---|
successIdList | Long[] | 成功的数据id |
failedData | Map<Long,String> | 失败的数据id及失败原因 |
successCount | int | 成功数量 |
failedCount | int | 失败数量 |
# 无流程的批量更新
版本:Since V8.0
接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/cap4/form/soap/batch-update
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
uniqueFiled | String[] | 否 | 更新用的唯一标识 |
rightId | String | 是 | 使用的操作权限id 获取参数rightId步骤 |
dataList | Object[] | 是 | 导入的数据 |
formCode | String | 是 | 表名 |
loginName | String | 是 | 用于登陆的登录名 (登录名对应的人员必须有底表操作权限才可以,并不是普通用户) |
doTrigger | boolean | 否 | 是否执行触发(Since V8.0sp2) |
dataList的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
masterTable | Object | 是 | 主表数据 |
subTables | Object[] | 是 | 明细表数据 |
masterTable的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | String | 是 | 数据库表名称 |
record | Object | 是 | 记录的数据 |
changedFields | String[] | 否 | 需要计算的字段 |
masterTable—record的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
id | long | 是 | 数据id |
fields | Object[] | 是 | 包含字段 |
masterTable—record—fields的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | String | 是 | 数据域名称 |
value | String | 是 | 数据值(优先) |
showValue | String | 是 | 显示值 |
subTables的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | String | 是 | 数据库表名称 |
records | Object[] | 是 | 包含的所有数据 |
changedFields | String[] | 否 | 需要计算的字段 |
subTables—records的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
id | long | 是 | 数据id |
fields | Object[] | 是 | 包含字段 |
subTables—records—fields的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
name | String | 是 | 数据域名称 |
value | String | 是 | 数据值(优先) |
showValue | String | 是 | 显示值 |
attachmentInfos的结构
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
subReference | long | 是 | 对应附件字段id值 |
fileUrl | long | 是 | 已上传文件的fileURL |
sort | int | 是 | 排序 |
调用模版
{
"formCode": "aaa1",
"loginName": "zhai",
"rightId":"56195256829429332.-470190193844795028",
"doTrigger": true,
"dataList": [
{
"masterTable":{
"name":"formmain_0019",
"record":{
"id":4035394180072293997,
"fields":[
{
"name":"field0001",
"value":"",
"showValue":"create"
},
{
"name":"field0002",
"value":"",
"showValue":"one"
},
{
"name":"field0003",
"value":"198747588475848444",
"showValue":""
}
]
},
"changedFields": ["field0001","field0002"]
},
"subTables": [
{
"name":"formson_0021",
"records": [
{
"id": 123456789102,
"fields": [
{
"name":"field0005",
"value":"",
"showValue":"cap"
}
]
}
],
"changedFields": ["field0005"]
}
],
"attachmentInfos" : [
{
"subReference" : "198747588475848444",
"fileUrl" : "7897958946781246",
"sort" : "0"
}
]
}
]
}
响应模版
{
"code": 0,
"data": {
"successIdList": [
4035394180072293997
],
"failedData": {
},
"successCount": 1,
"failedCount": 0
},
"message": ""
}
响应参数说明
参数 | 类型 | 说明 |
---|---|---|
code | String | http请求code |
data | Object | 表单数据 |
message | String | 提示内容 |
data的结构
参数 | 类型 | 说明 |
---|---|---|
successIdList | Long[] | 成功的数据id |
failedData | Map<Long,String> | 失败的数据id及失败原因 |
successCount | int | 成功数量 |
failedCount | int | 失败数量 |
# 无流程批量导出数据
版本:Since V8.0 SP1
接口请求说明:
http请求方式:POST
http://ip:port/seeyon/rest/cap4/form/soap/export
注:请求需要携带token,否则无法使用,获取并传递token方法参考:https://open.seeyoncloud.com/seeyonapi/781/
参数说明
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
templateCode | String | 是 | 表单模版code(与应用绑定中保持一致) |
beginDateTime | String | 是 | 导出数据的起始时间 |
endDateTime | String | 是 | 导出数据的截止创建时间 |
rightId | String | 是 | 权限id 获取参数rightId步骤 |
dataId | Long | 否 | 数据id |
page | Integer | 否 | 分页信息,第几页,不传默认第1页 |
pageSize | Integer | 否 | 分页大小,不传默认500条 |
调用模版
{
"templateCode":"ABC123",
"beginDateTime":"2020-06-30",
"endDateTime":"2020-07-02",
"rightId":"6009669017095982620.-8527979346162529315"
}
响应模版
{
"code": 0,
"data": {
"success": 1,
"code": "200",
"message": "操作成功!",
"data": {
"definition": {
"form": {
"formId": "1856567583696046383",
"formName": "表单名称"
},
"fields": [
{
"name": "field0001",
"display": "数字1",
"fieldType": "DECIMAL",
"inputType": "text",
"formatType": "",
"fieldLength": "20",
"digitNum": "0",
"enumId": "0",
"isNotNull": "0",
"auth": "browse"
},
{
"name": "field0002",
"display": "数字2",
"fieldType": "DECIMAL",
"inputType": "text",
"formatType": "",
"fieldLength": "20",
"digitNum": "0",
"enumId": "0",
"isNotNull": "0",
"auth": "browse"
}
]
},
"data": [
{
"masterData": {
"field0001": {
"value": "11",
"showValue": "11"
},
"field0002": {
"value": "22",
"showValue": "22"
}
},
"subData": {
}
}
]
}
},
"message": ""
}
返回参数说明
参数 | 类型 | 说明 |
---|---|---|
code | String | http请求code |
data | Object | 表单数据 |
message | String | 提示内容 |
data的结构
参数 | 类型 | 说明 |
---|---|---|
success | int | 是否成功 |
code | String | 请求code |
message | String | 提示内容 |
data | Object | 表单数据 |
data的结构
参数 | 类型 | 说明 |
---|---|---|
definition | Object | 定义信息 |
data | Object[] | 数据列表 |
definition的结构
参数 | 类型 | 说明 |
---|---|---|
form | Object | 表单定义 |
fields | Object[] | 字段定义 |
form的结构
参数 | 类型 | 说明 |
---|---|---|
formId | String | 表单id |
formName | String | 表单名称 |
fields的结构
参数 | 类型 | 说明 |
---|---|---|
Name | String | 字段名称 |
display | String | 字段显示名称 |
fieldType | String | 字段类型 |
inputType | String | 输入框类型 |
formatType | String | 格式化信息 |
fieldLength | String | 字段长度 |
digitNum | String | 小数位长度 |
enumId | String | 枚举id(仅当该字段为枚举类型) |
isNotNull | String | 是否必填,1为必填0为否 |
auth | String | 权限 |
data—data—data的结构
参数 | 类型 | 说明 |
---|---|---|
masterData | Map<String, Object> | 主表数据 |
subData | Map<String, List<Map<String, Object>>> | 明细表数据 |
masterData中Object的结构
参数 | 类型 | 说明 |
---|---|---|
value | String | 数据库值 |
showValue | String | 显示值 |
subData中Object的结构
参数 | 类型 | 说明 |
---|---|---|
value | String | 数据库值 |
showValue | String | 显示值 |
# 附件没法直接下载问题解决方案
- 存在问题: 底表导出数据接口,附件控件导出的是attachmentid,用户没法直接下载附件,需要直接返回fileid,如果有需要,需自行修改代码支持
- 修改点: 1、修改代码com.seeyon.cap4.soap.service.SOAPExportDataService 差异代码如下
...
import com.seeyon.ctp.common.filemanager.manager.AttachmentManager;
...
@Inject
protected AttachmentManager attachmentManager;
...
for (FormFieldBean formFieldBean : formBean.getMasterTableBean().getFields()) {
FormAuthViewFieldBean formAuthViewFieldBean = authFieldMap.get(formFieldBean.getName());
Object value = formDataMasterBean.getFieldValue(formFieldBean.getName());
FormFieldValueVO valueVO = CAPCommonUtil.getFormFieldValueVO(value, formFieldBean, formAuthViewFieldBean.getAccess());
if (formFieldBean.isAttachment() && valueVO.getValue() != null) {
// String url = SystemEnvironment.getContextPath() + "/rest/commonImage/showImage?id=" + ctpEnumItem.getImageId() + "&size=source&type=image&createDate=" + createDate + Functions.csrfSuffix();
masterData.put(formFieldBean.getName(),new SOAPExportFieldValueVO(valueVO.getValue(),valueVO.getShowValue(),attachmentManager.getBySubReference(Long.parseLong(valueVO.getValue()))));
}else {
masterData.put(formFieldBean.getName(), new SOAPExportFieldValueVO(valueVO));
}
}
...
for (FormDataSubBean formDataSubBean : subBeans) {
Map<String, SOAPExportFieldValueVO> subVO = new HashMap<>();
for (FormFieldBean formFieldBean : formTableBean.getFields()) {
FormAuthViewFieldBean formAuthViewFieldBean = authFieldMap.get(formFieldBean.getName());
Object value = formDataSubBean.getFieldValue(formFieldBean.getName());
FormFieldValueVO valueVO = CAPCommonUtil.getFormFieldValueVO(value, formFieldBean, formAuthViewFieldBean.getAccess());
if (formFieldBean.isAttachment() && valueVO.getValue() != null) {
// String url = SystemEnvironment.getContextPath() + "/rest/commonImage/showImage?id=" + ctpEnumItem.getImageId() + "&size=source&type=image&createDate=" + createDate + Functions.csrfSuffix();
subVO.put(formFieldBean.getName(),new SOAPExportFieldValueVO(valueVO.getValue(),valueVO.getShowValue(),attachmentManager.getBySubReference(Long.parseLong(valueVO.getValue()))));
}else {
subVO.put(formFieldBean.getName(), new SOAPExportFieldValueVO(valueVO));
}
}
subVOS.add(subVO);
}
...
2、修改代码com.seeyon.cap4.soap.vo.SOAPExportFieldValueVO