操作(Activity)执行(ActivityController)¶
提供表单/视图「操作按钮」(Activity)的运行时执行入口:按钮执行前/后脚本、按钮字段脚本、动作执行、归档、保存并启动流程、复制、清空数据、签章、文件下载、Excel 导入/导出/校验及其进度查询、邮件/短信分享、批量提交及其进度查询、PDF 导出、网页打印、执行地址脚本。是 runtime 模块「操作按钮执行域」的核心控制器。
- 接口类型:REST 资源(
@Component继承AbstractRuntimeController(@RestController),类级produces = APPLICATION_JSON_VALUE;例外:导出 Excel 端点直接写回HttpServletResponse输出流为二进制文件下载) - 基址:
${myapps.context-path.runtime:}/api/runtime - Tag:操作(Activity)执行模块
公共说明¶
- 鉴权(据源码):本控制器所有端点均位于
${myapps.context-path.runtime:}/api/runtime/**,处于RestSecurityHandlerInterceptor覆盖范围(/api/runtime/**),且不在豁免名单内(豁免仅覆盖/api/runtime/login.*、/api/runtime/dingding/authlogin、/api/runtime/synchronization.*等,详见 login.md「公共说明 · 鉴权」)。拦截器走Security.getUserIdFromToken(request),未取到再尝试Security.getDebugUserIdFromToken(request),两者皆无则拒绝。故需 accessToken(或 debugToken),可通过 Cookie / 请求头 / query 参数任一方式传递;执行用户从令牌还原,无userCode参数。 - 路径变量
{applicationId}:必填,经 DES 加密(按当前执行用户密钥),服务端在方法入口处DesUtil.decryptTextByUserId(applicationId, getUser().getId())解密。 - 其它加密 id:
{docId}、{viewId}、{formId}路径变量同样按当前用户密钥做 DES 加密后传输,服务端逐个解密;部分端点的docId经 query 参数(@RequestParam)传入时也按 DES 加密。请求体中的 id 类字段(如_selects、subSelects、docIds等)按业务约定均为 DES 加密密文,服务端按当前用户密钥解密。 - 请求体约定:脚本/动作/下载/分享/批量提交/导入/导出/地址脚本等端点统一使用
@RequestBody String content,请求体为 JSON 字符串,服务端用 JsonPath(com.jayway.jsonpath,开启DEFAULT_PATH_LEAF_TO_NULL)抽取所需字段;文档「请求体」小节列出 JsonPath 与字段含义。文档主体($.document)的解析复用AbstractRuntimeController.prepareDocument(),结构同 document.md「公共说明 · Document 请求体」。 - 响应结构:统一
Resource(见 ../index.md「统一响应结构」),字段为errcode/errmsg/data/errors。Resource.data的类型见各端点说明;多数端点的data为服务返回的JSONObject/String。例外端点: exportExcel(#11)直接写回HttpServletResponse输出流,返回 Excel 文件二进制流(Content-Type: application/x-download,附件下载),不返回 JSONResource。importExcel(#18)/validationExcel(#19)部分分支直接new Resource(...)构造响应,错误码包含4001(业务校验/导入出错)与5000(捕获异常,控制器内自有错误码)。- 进度查询端点(
exportExcel/readProcess、batchApprove/readProcess、importExcel/readProcess、validateExcel/readProcess)通过MemoryCacheUtil读取当前用户私有缓存中的进度数据,对应业务操作端点(exportExcel、batchApprove、importExcel、validationExcel)在执行前会重置计数、执行后写入结果。 - HTTP 状态码:所有端点继承自
AbstractRuntimeController,未显式标注@ResponseStatus(与 workflow-runtime.md 不同),成功默认 200。业务错误由响应体errcode体现。错误码表见 ../index.md。
1. 运行执行前脚本¶
执行指定按钮(Activity)的「执行前脚本」,可携带文档、字段值、选择集、下一节点、审批意见、签名、提交目标等上下文。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/{applicationId}/activities/{id}/runbeforeactionscript(完整:{runtime-context}/api/runtime/{applicationId}/activities/{id}/runbeforeactionscript) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| id | path | string | 是 | 操作(Activity)Id |
| content | body | string(JSON) | 是 | 请求包体(结构见下) |
请求体¶
服务端用 JsonPath 读取以下字段并合并入 ParamsTable:
| JsonPath | 类型 | 必填 | 说明 |
|---|---|---|---|
$.document |
object | 是 | Document 主体(结构同 document.md「公共说明 · Document 请求体」);服务端 prepareDocument() 解析后传入 |
$.document.items |
object | 否 | 字段名→字段值映射,逐项写入参数 |
$.documents |
array | 否 | 多文档列表;非空时 prepareDocuments() 解析后写入参数 documents |
$._selects |
array<string> | 否 | 选中文档Id集合(DES 加密密文,服务端按当前用户密钥解密) |
$.subSelects |
array<string> | 否 | 子表选中Id集合(DES 加密密文) |
$.nextNodeIds |
array<string> | 否 | 下一节点Id集合,合并为 _nextids |
$.attitude |
string | 否 | 审批意见 |
$.signatureJson |
string | 否 | 手写签名 JSON,写入 _signature |
$.submitTo |
array<object> | 否 | 指定下一节点审批人;每项 {nodeid, userids},序列化为字符串写入 submitTo |
{
"document": { "id": "__DOCID__", "formId": "__FORMID__", "items": { "金额": "1200.00" } },
"attitude": "同意",
"signatureJson": ""
}
请求示例¶
POST /api/runtime/__APPID__/activities/__ACTID__/runbeforeactionscript HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{
"document": { "id": "__DOCID__", "formId": "__FORMID__", "items": { "金额": "1200.00" } },
"attitude": "同意"
}
响应¶
结构:统一 Resource(见 ../index.md「统一响应结构」)。
data:JSONObject,执行前脚本运行结果(由 ActivityRunTimeService.runbeforeactionscript 返回)。
成功示例:
2. 执行后脚本¶
执行指定按钮(Activity)的「执行后脚本」,上下文同 #1(但不调用 prepareDocument(),仅按 JsonPath 抽取参数)。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/{applicationId}/activities/{id}/runafteractionscript(完整:{runtime-context}/api/runtime/{applicationId}/activities/{id}/runafteractionscript) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| id | path | string | 是 | 操作(Activity)Id |
| content | body | string(JSON) | 是 | 请求包体(结构同 #1) |
请求体¶
服务端用 JsonPath 读取的字段集合与 #1 相同($.document/$.document.items/$.documents/$._selects/$.subSelects/$.nextNodeIds/$.attitude/$.signatureJson/$.submitTo),逐项合并入 ParamsTable,再调用 ActivityRunTimeService.runafteractionscript。
{
"document": { "id": "__DOCID__", "formId": "__FORMID__", "items": { "金额": "1200.00" } },
"attitude": "同意"
}
请求示例¶
POST /api/runtime/__APPID__/activities/__ACTID__/runafteractionscript HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{
"document": { "id": "__DOCID__", "formId": "__FORMID__", "items": {} },
"attitude": "同意"
}
响应¶
结构:统一 Resource。
data:JSONObject,执行后脚本运行结果。
成功示例:
3. 执行按钮的某个字段脚本¶
按按钮Id、文档Id、字段名执行按钮上配置的「字段脚本」(方法名拼接为 get<Field> 调用)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/{applicationId}/activities/{id}/runScript(完整:{runtime-context}/api/runtime/{applicationId}/activities/{id}/runScript) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| id | path | string | 是 | 操作(Activity)Id |
| docId | query | string | 是 | 文档Id(DES 加密密文,服务端按当前用户密钥解密) |
| fieldName | query | string | 是 | 字段名;服务端首字母大写后拼接为 get<Field> 调用脚本 |
请求示例¶
GET /api/runtime/__APPID__/activities/__ACTID__/runScript?docId=__DOCID__&fieldName=amount HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:String,脚本运行结果(强转为 String)。
成功示例:
失败示例(字段名不存在或脚本报错):
说明:源码字面文案为「字段名不存或者脚本报错」(原文,未补「在」字);异常被捕获后返回
errcode=403。
4. 执行动作¶
按按钮Id执行该按钮配置的「动作」(Activity 动作执行),可携带文档字段值与子表选中集。
- 接口类型:REST 资源
- 请求方式:
PUT - 请求路径:
/{applicationId}/activities/{id}/execute(完整:{runtime-context}/api/runtime/{applicationId}/activities/{id}/execute) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| id | path | string | 是 | 操作(Activity)Id |
| content | body | string(JSON) | 是 | 请求包体(结构见下) |
请求体¶
服务端用 JsonPath 读取:
| JsonPath | 类型 | 必填 | 说明 |
|---|---|---|---|
$.document.items |
object | 否 | 字段名→字段值映射,逐项写入参数 |
$.subSelects |
array<string> | 否 | 子表选中Id集合(合并为字符串,注意:此处未做 DES 解密,与 #1/#2 不同,据源码) |
请求示例¶
PUT /api/runtime/__APPID__/activities/__ACTID__/execute HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "document": { "items": { "金额": "1200.00" } } }
响应¶
结构:统一 Resource。
data:JSONObject,动作执行结果(由 ActivityRunTimeService.execute 返回)。
成功示例:
5. 归档按钮¶
按文档Id执行归档动作。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/{applicationId}/documents/{docId}/activities/archive(完整:{runtime-context}/api/runtime/{applicationId}/documents/{docId}/activities/archive) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| docId | path | string | 是 | 文档Id(源码未对该 path 变量单独 DES 解密,原值传入服务层;据源码) |
请求示例¶
GET /api/runtime/__APPID__/documents/__DOCID__/activities/archive HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:String,归档结果字符串。
成功示例:
6. 保存文档并启动流程按钮¶
保存主表与子表文档(含校验、子表删除/编辑处理、主表重计算)后启动流程。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/{applicationId}/documents/activities/saveStartWorkFlow(完整:{runtime-context}/api/runtime/{applicationId}/documents/activities/saveStartWorkFlow) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| content | body | string(JSON) | 是 | 请求包体(结构见下) |
请求体¶
$.document 作为 Document 主体(结构同 document.md「公共说明 · Document 请求体」),经 prepareDocument() 解析;可携带子文档(doc.getFrontSubDocuments())。
{
"document": {
"id": "__DOCID__",
"formId": "__FORMID__",
"items": { "金额": "1200.00" },
"subDocuments": [ { "id": "__SUBDOCID__", "items": { "明细金额": "100.00" } } ]
}
}
请求示例¶
POST /api/runtime/__APPID__/documents/activities/saveStartWorkFlow HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{
"document": { "id": "__DOCID__", "formId": "__FORMID__", "items": { "金额": "1200.00" } }
}
响应¶
结构:统一 Resource。
data:Document,保存并启动流程后的文档对象(由 ActivityRunTimeService.saveStartWorkFlow 返回)。
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": { "id": "__DOCID__", "formId": "__FORMID__", "items": { "金额": "1200.00" } },
"errors": null
}
失败示例(主表单校验不通过):
{
"errcode": 4001,
"errmsg": "表单校验不通过",
"data": null,
"errors": [{ "errcode": 40001, "errmsg": "金额必须大于 0", "field": "金额" }]
}
失败示例(子表单校验不通过):
{
"errcode": 4001,
"errmsg": "子表单校验不通过",
"data": null,
"errors": [{ "errcode": 40001, "errmsg": "<校验错误>", "field": "<字段名>" }]
}
7. 复制文档按钮¶
复制指定文档:从私有缓存或数据库加载源文档,合并 $.document.items 中只读源文档已有字段,校验通过后调用服务层复制。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/{applicationId}/documents/{docId}/activities/copy(完整:{runtime-context}/api/runtime/{applicationId}/documents/{docId}/activities/copy) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| docId | path | string | 是 | 源文档Id(DES 加密密文,服务端按当前用户密钥解密) |
| content | body | string(JSON) | 是 | 请求包体(结构见下) |
请求体¶
服务端用 JsonPath 读取 $.document.items(仅当字段在源文档中存在时写入参数)以及 $.document(顶层字段映射),合并入 ParamsTable。
请求示例¶
POST /api/runtime/__APPID__/documents/__DOCID__/activities/copy HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "document": { "items": { "金额": "1500.00" } } }
响应¶
结构:统一 Resource。
data:Document,复制产生的新文档对象(由 ActivityRunTimeService.copy 返回)。
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": { "id": "__NEWDOCID__", "formId": "__FORMID__", "items": { "金额": "1500.00" } },
"errors": null
}
失败示例(复制表单校验不通过):
{
"errcode": 4001,
"errmsg": "复制表单校验不通过",
"data": null,
"errors": [{ "errcode": 40001, "errmsg": "复制表单校验不通过", "field": "" }]
}
说明:源码在 errors 列表头部追加了一条
errcode=40001、errmsg="复制表单校验不通过"的总错误项;error(4001, "复制表单校验不通过", errors)与errors集合承载明细。
8. 清除所有数据¶
按表单Id清除该表单下的所有文档数据。
- 接口类型:REST 资源
- 请求方式:
DELETE - 请求路径:
/{applicationId}/forms/{formId}/activities/clear(完整:{runtime-context}/api/runtime/{applicationId}/forms/{formId}/activities/clear) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
说明:拦截器豁免规则仅覆盖 URI 以
/clear结尾**且**前缀为/api/runtime/{module}/clear(如GET /api/runtime/{module}/clear,见 detail.md);本端点路径为/api/runtime/{applicationId}/forms/{formId}/activities/clear,URI 虽以/clear结尾但不在该豁免模板内,故仍需 accessToken(据源码)。
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| formId | path | string | 是 | 表单Id(源码未对该 path 变量单独 DES 解密,原值传入服务层;据源码) |
请求示例¶
DELETE /api/runtime/__APPID__/forms/__FORMID__/activities/clear HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:String,固定文案 "清除成功"。
成功示例:
9. 签章¶
对指定文档设置签章值(sign)并保存:从私有缓存或数据库加载文档,逐项更新 $.document.items 中的字段(字段不存在抛异常),再写入签章并 doCreateOrUpdate。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/{applicationId}/documents/{docId}/activities/sign(完整:{runtime-context}/api/runtime/{applicationId}/documents/{docId}/activities/sign) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| docId | path | string | 是 | 文档Id(源码未对该 path 变量单独 DES 解密,原值用于私有缓存/数据库查找;据源码) |
| content | body | string(JSON) | 是 | 请求包体(结构见下) |
请求体¶
服务端用 JsonPath 读取:$.document.sign(签章值)、$.document.items(字段名→字段值映射,字段必须在文档中已存在,否则抛 <字段名> 值不存在)。
请求示例¶
POST /api/runtime/__APPID__/documents/__DOCID__/activities/sign HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "document": { "sign": "<签章数据>", "items": { "金额": "1200.00" } } }
响应¶
结构:统一 Resource。
data:String,固定文案 "签章成功"。
成功示例:
10. 文件下载按钮¶
执行按钮上配置的「文件名脚本」得到下载路径,校验文件存在后返回(URL 直链或经 DES 加密的存储路径)。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/{applicationId}/activities/{id}/download(完整:{runtime-context}/api/runtime/{applicationId}/activities/{id}/download) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| id | path | string | 是 | 操作(Activity)Id |
| content | body | string(JSON) | 是 | 请求包体(结构见下) |
请求体¶
服务端用 prepareDocument() 解析 $.document,再用 JsonPath 抽取 $.document.items、$.document、$._selects 合并入 ParamsTable,运行按钮的「文件名脚本」(Activity.getFileNameScript())。
{ "document": { "id": "__DOCID__", "formId": "__FORMID__", "items": {} }, "_selects": ["__DOCID1__"] }
请求示例¶
POST /api/runtime/__APPID__/activities/__ACTID__/download HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "document": { "id": "__DOCID__", "formId": "__FORMID__", "items": {} } }
响应¶
结构:统一 Resource。
data:String,下载地址:
- 若脚本返回值含 https:// 或 http://,直接返回该 URL;
- 否则按存储相对路径解析、校验 SecurityFile.resolveFile(...).isFile() 通过后,返回经 DES 加密的路径(按当前用户密钥加密)。
成功示例:
失败示例(脚本结果为空或文件不存在):
11. 导出 Excel 操作¶
按视图Id、按钮Id执行 Excel 导出,直接写回 HttpServletResponse 输出流为 Excel 文件下载(不返回 JSON Resource);同时在当前用户私有缓存中记录进度。
- 接口类型:二进制响应(文件下载;控制器方法返回
void) - 请求方式:
POST - 请求路径:
/{applicationId}/views/{viewId}/activities/exportExcel(完整:{runtime-context}/api/runtime/{applicationId}/views/{viewId}/activities/exportExcel) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| viewId | path | string | 是 | 视图Id(DES 加密密文) |
| actId | query | string | 是 | 按钮(Activity)Id(无 @RequestParam 注解,Spring 默认必填 query 参数) |
| filename | query | string | 是 | 导出文件名(URL 编码;若视图 description 非空则被覆盖为 description) |
| content | body | string(JSON) | 是 | 请求包体(结构见下) |
请求体¶
服务端解析为 JSON,读取:selectColumns(选中的列定义,写入参数 selectColumns)、selectDocIds(要导出的文档Id数组,DES 加密密文,服务端按当前用户密钥解密)、items(字段名→字段值映射,逐项写入参数)。
{
"selectColumns": "<列定义>",
"selectDocIds": ["__ENC_DOCID1__", "__ENC_DOCID2__"],
"items": { "过滤字段": "值" }
}
请求示例¶
POST /api/runtime/__APPID__/views/__VIEWID__/activities/exportExcel?actId=__ACTID__&filename=%E6%8A%A5%E8%A1%A8 HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "selectColumns": "", "selectDocIds": ["__ENC_DOCID1__"], "items": {} }
响应¶
结构:二进制文件下载(无 JSON Resource)。
- Content-Type:application/x-download; charset=<encoding>
- Content-Disposition:attachment;filename=<filename>.xlsx(UTF-8 文件名按 iso-8859-1 编码字节序列)
- 响应体:Excel 文件二进制流(由 ActivityRunTimeService.exportExcel 写入 response.getOutputStream())
说明:导出进度通过 #12
GET /exportExcel/readProcess轮询;本端点在执行前重置EXCELEXPORTCOUNT/EXCELROWCOUNT/EXCELEXPORTRESULT缓存,执行后写入结果字符串到EXCELEXPORTRESULT。
12. 读取导出 Excel 进度¶
读取当前用户私有缓存中的 Excel 导出进度(已导出行数、总行数、结果状态)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/exportExcel/readProcess(完整:{runtime-context}/api/runtime/exportExcel/readProcess) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| excelExportTime | query | string | 是 | 导出会话时间戳(与 #11 入参 EXCELEXPORTTIME 对应,作为缓存键后缀) |
请求示例¶
GET /api/runtime/exportExcel/readProcess?excelExportTime=__TIMESTAMP__ HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:JSONObject,含以下键:
| 字段 | 类型 | 说明 |
|---|---|---|
exportExcelResult |
string/null | 导出结果(导出完成时为结果字符串,否则为 null) |
excelRowCount |
long | 总行数;为 0 时返回 1(避免除零) |
excelExportCount |
long | 已导出行数;当 exportExcelResult 非空时与 excelRowCount 一致,否则取缓存中的实时计数 |
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": { "exportExcelResult": null, "excelRowCount": 100, "excelExportCount": 35 },
"errors": null
}
说明:源码捕获所有内部异常后仅
e.printStackTrace()并返回success,故即便读取缓存异常,响应也是errcode=0。
13. 通过邮件或手机短信分享按钮¶
按文档Id通过邮件或手机短信分享处理链接给指定接收人。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/{applicationId}/documents/{docId}/activities/share(完整:{runtime-context}/api/runtime/{applicationId}/documents/{docId}/activities/share) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| docId | path | string | 是 | 文档Id(源码未对该 path 变量单独 DES 解密,原值传入服务层;据源码) |
| content | body | string(JSON) | 是 | 请求包体(结构见下) |
请求体¶
服务端用 JsonPath 读取:
| JsonPath | 类型 | 必填 | 说明 |
|---|---|---|---|
$.transpond |
string | 否 | 转发类型 |
$.handleUrl |
string | 否 | 处理链接 |
$.receiverid |
string | 否 | 接收人Id |
$.email |
boolean | 否 | 是否邮件分享 |
$.msm |
boolean | 否 | 是否短信分享(字段名源码原文为 msm) |
{ "transpond": "...", "handleUrl": "https://.../handle", "receiverid": "__UID__", "email": true, "msm": false }
请求示例¶
POST /api/runtime/__APPID__/documents/__DOCID__/activities/share HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "handleUrl": "https://.../handle", "receiverid": "__UID__", "email": true, "msm": false }
响应¶
结构:统一 Resource。
data:String,分享结果字符串。
成功示例:
14. 批量提交操作¶
按文档Id列表与按钮Id执行批量提交;执行前重置进度计数,执行后写入结果到私有缓存。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/{applicationId}/forms/activities/batchApprove(完整:{runtime-context}/api/runtime/{applicationId}/forms/activities/batchApprove) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| content | body | string(JSON) | 是 | 请求包体(结构见下) |
请求体¶
服务端用 JsonPath 读取:
| JsonPath | 类型 | 必填 | 说明 |
|---|---|---|---|
$.limistStrList |
string | 否 | 限制列表(原文变量名 limistStrList) |
$.docIds |
array<string> | 是 | 文档Id数组(DES 加密密文,服务端按当前用户密钥解密) |
$.actId |
string | 否 | 按钮(Activity)Id |
$.attitude |
string | 否 | 审批意见 |
$.remark |
string | 否 | 备注 |
{
"limistStrList": "",
"docIds": ["__ENC_DOCID1__", "__ENC_DOCID2__"],
"actId": "__ACTID__",
"attitude": "同意",
"remark": ""
}
请求示例¶
POST /api/runtime/__APPID__/forms/activities/batchApprove HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "docIds": ["__ENC_DOCID1__"], "actId": "__ACTID__", "attitude": "同意" }
响应¶
结构:统一 Resource。
data:net.sf.json.JSONObject,批量提交结果对象。
成功示例:
说明:进度通过 #15
GET /batchApprove/readProcess轮询。
15. 读取批量提交进度¶
读取当前用户私有缓存中的批量提交进度。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/batchApprove/readProcess(完整:{runtime-context}/api/runtime/batchApprove/readProcess) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
无。
请求示例¶
响应¶
结构:统一 Resource。
data:JSONObject,含以下键:
| 字段 | 类型 | 说明 |
|---|---|---|
handledCount |
object | 已处理数量(来自 DocumentProcessBean.HANDLEDCOUNT 缓存) |
batchApproveCount |
object | 总数量(来自 DocumentProcessBean.BATCHAPPROVECOUNT 缓存) |
batchApproveResult |
object/null | 批量提交结果;无结果时为 null,有结果时为 net.sf.json.JSONObject.fromObject(...) |
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": { "handledCount": 3, "batchApproveCount": 10, "batchApproveResult": null },
"errors": null
}
16. PDF 导出操作¶
按表单Id、文档Id执行 PDF 导出:加载文档,调用 ExportToPdf.doProcess 处理后返回结果数据。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/{applicationId}/forms/{formId}/documents/{docId}/activities/exportPdf(完整:{runtime-context}/api/runtime/{applicationId}/forms/{formId}/documents/{docId}/activities/exportPdf) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| formId | path | string | 是 | 表单Id(源码未对该 path 变量单独 DES 解密,原值写入 request.setAttribute("formId", ...);据源码) |
| docId | path | string | 是 | 文档Id(DES 加密密文,服务端按当前用户密钥解密后写入 request.setAttribute 与查找文档) |
| content | body | string(JSON) | 是 | 请求包体(结构见下) |
请求体¶
服务端解析为 JSON 后读取 htmlBody(待导出的 HTML 内容)。
请求示例¶
POST /api/runtime/__APPID__/forms/__FORMID__/documents/__DOCID__/activities/exportPdf HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "htmlBody": "<html><body>...</body></html>" }
响应¶
结构:统一 Resource。
data:ActivityResult.getResultData(),PDF 导出结果数据(由 ExportToPdf.doProcess 返回)。
成功示例:
17. 网页打印操作¶
按表单Id、文档Id生成网页打印所需的表单数据包。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/{applicationId}/forms/{formId}/documents/{docId}/activities/print(完整:{runtime-context}/api/runtime/{applicationId}/forms/{formId}/documents/{docId}/activities/print) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| formId | path | string | 是 | 表单Id(源码未对该 path 变量单独 DES 解密,原值传入服务层;据源码) |
| docId | path | string | 是 | 文档Id(DES 加密密文,服务端按当前用户密钥解密) |
请求示例¶
GET /api/runtime/__APPID__/forms/__FORMID__/documents/__DOCID__/activities/print HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:FormDataPacket,表单数据包对象(由 ActivityRunTimeService.print 返回)。
成功示例:
18. 导入 Excel 操作¶
按视图Id、按钮Id执行 Excel 导入;导入成功返回成功 Resource,导入出错返回 errcode=4001 + data=String[] 错误明细,异常返回 errcode=5000。同时维护当前用户私有缓存中的进度。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/{applicationId}/views/{viewId}/activities/importExcel(完整:{runtime-context}/api/runtime/{applicationId}/views/{viewId}/activities/importExcel) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| viewId | path | string | 是 | 视图Id(DES 加密密文) |
| content | body | string(JSON) | 是 | 请求包体(结构见下) |
请求体¶
服务端用 JsonPath 读取:
| JsonPath | 类型 | 必填 | 说明 |
|---|---|---|---|
$.impmappingconfigid |
string | 否 | 导入映射配置Id |
$.path |
string | 否 | 文件路径 |
$.actId |
string | 否 | 按钮(Activity)Id |
$.parentId |
string | 否 | 父文档Id(非空时写入参数 parentid) |
$.isRelate |
string | 否 | 是否关联(非空时写入参数 isRelate) |
$.exparams |
object | 否 | 扩展参数映射,逐项写入参数 |
{
"impmappingconfigid": "__MAPCFGID__",
"path": "<file path>",
"actId": "__ACTID__",
"parentId": "",
"isRelate": "",
"exparams": {}
}
请求示例¶
POST /api/runtime/__APPID__/views/__VIEWID__/activities/importExcel HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "impmappingconfigid": "__MAPCFGID__", "path": "<file path>", "actId": "__ACTID__" }
响应¶
结构:统一 Resource(成功 / 业务出错 / 异常三态)。
成功示例(结果含 cn.myapps.runtime.dynaform.dts.excelimport.success.total.imported):
业务出错示例(结果不含上述成功标记,按 $$ 切分错误明细):
说明:错误响应
new Resource(4001, "导入出错", msg, null),msg为String[]写入data字段(非errors字段),据源码如实记录。
异常示例(捕获 Exception):
说明:进度通过 #20
GET /importExcel/readProcess轮询;errcode=5000为本控制器在 catch 块中自有错误码,未列入顶层错误码表。
19. 校验 Excel 操作¶
按视图Id、按钮Id执行 Excel 校验(不真正落库);成功返回成功 Resource,校验出错返回 errcode=4001 + data=String[] 错误明细,异常返回 errcode=5000。同时维护当前用户私有缓存中的进度。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/{applicationId}/views/{viewId}/activities/validationExcel(完整:{runtime-context}/api/runtime/{applicationId}/views/{viewId}/activities/validationExcel) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
说明:源码
@Operation(summary)文案误写为「导入excel操作」,实际方法名为validationExcel、调用activityRuntimeService.validationExcel,为 Excel **校验**入口,据源码如实记录。
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| viewId | path | string | 是 | 视图Id(DES 加密密文) |
| content | body | string(JSON) | 是 | 请求包体(结构同 #18) |
请求体¶
请求体结构与字段集合同 #18($.impmappingconfigid/$.path/$.actId/$.parentId/$.isRelate/$.exparams)。
请求示例¶
POST /api/runtime/__APPID__/views/__VIEWID__/activities/validationExcel HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "impmappingconfigid": "__MAPCFGID__", "path": "<file path>", "actId": "__ACTID__" }
响应¶
结构:统一 Resource(成功 / 业务出错 / 异常三态,同 #18,但业务出错 errmsg 为「校验出错」)。
成功示例:
业务出错示例:
异常示例:
说明:进度通过 #21
GET /validateExcel/readProcess轮询。
20. 读取导入 Excel 进度¶
读取当前用户私有缓存中的 Excel 导入进度(已导入行数、总行数、结果 Resource)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/importExcel/readProcess(完整:{runtime-context}/api/runtime/importExcel/readProcess) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| excelImportTime | query | string | 是 | 导入会话时间戳(与 #18 入参 EXCELIMPORTTIME 对应,作为缓存键后缀) |
请求示例¶
GET /api/runtime/importExcel/readProcess?excelImportTime=__TIMESTAMP__ HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:JSONObject,含以下键:
| 字段 | 类型 | 说明 |
|---|---|---|
excelImportCount |
object | 已导入行数(来自 EXCELIMPORTCOUNT-<time> 缓存) |
excelRowCount |
object | 总行数(来自 EXCELIMPORTROWCOUNT-<time> 缓存) |
importExcelResult |
object | 导入结果 Resource(来自 EXCELIMPORTRESULT-<time> 缓存,结构同 #18 响应) |
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": {
"excelImportCount": 30,
"excelRowCount": 100,
"importExcelResult": { "errcode": 0, "errmsg": "ok", "data": "...", "errors": null }
},
"errors": null
}
21. 读取校验 Excel 进度¶
读取当前用户私有缓存中的 Excel 校验进度(已处理行数、总行数、结果 Resource)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/validateExcel/readProcess(完整:{runtime-context}/api/runtime/validateExcel/readProcess) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| excelValidateTime | query | string | 是 | 校验会话时间戳(与 #19 入参 EXCELVALIDATETIME 对应,作为缓存键后缀) |
请求示例¶
GET /api/runtime/validateExcel/readProcess?excelValidateTime=__TIMESTAMP__ HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
响应¶
结构:统一 Resource。
data:JSONObject,含以下键(源码字段名沿用 excelImportCount/excelRowCount/importExcelResult,与 #20 同名,但底层缓存键为 EXCELVALIDATE*):
| 字段 | 类型 | 说明 |
|---|---|---|
excelImportCount |
object | 已校验行数(来自 EXCELVALIDATECOUNT-<time> 缓存) |
excelRowCount |
object | 总行数(来自 EXCELVALIDATEROWCOUNT-<time> 缓存) |
importExcelResult |
object | 校验结果 Resource(来自 EXCELVALIDATERESULT-<time> 缓存,结构同 #19 响应) |
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": {
"excelImportCount": 30,
"excelRowCount": 100,
"importExcelResult": { "errcode": 0, "errmsg": "ok", "data": "...", "errors": null }
},
"errors": null
}
22. 执行地址脚本¶
按按钮Id执行「地址脚本」(按钮跳转地址计算):可携带文档Id(query 或 body)、视图Id、字段值与选中文档集。
- 接口类型:REST 资源
- 请求方式:
PUT - 请求路径:
/{applicationId}/activities/{actId}/executeAddress(完整:{runtime-context}/api/runtime/{applicationId}/activities/{actId}/executeAddress) - 鉴权:是(需 accessToken,据源码)
- Tag:操作(Activity)执行模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | path | string | 是 | 应用Id(DES 加密密文) |
| actId | path | string | 是 | 按钮(Activity)Id |
| docId | query | string | 否 | 文档Id(DES 加密密文);query 为空时从 $.docId 读取并按当前用户密钥解密,写入参数 docId |
| content | body | string(JSON) | 是 | 请求包体(结构见下) |
请求体¶
服务端用 JsonPath 读取:
| JsonPath | 类型 | 必填 | 说明 |
|---|---|---|---|
$.document |
object | 否 | 顶层字段映射(注意:此处读取的是 $.document 而非 $.document.items,逐项写入参数,且未做 DES 解密;据源码) |
$.docId |
string | 否 | 文档Id(DES 加密密文;当 query 参数 docId 为空时使用) |
$.viewId |
string | 否 | 视图Id,写入参数 viewId(未做 DES 解密) |
$._selects |
array<string> | 否 | 选中文档Id集合(DES 加密密文,服务端按当前用户密钥解密) |
{ "document": { "金额": "1200.00" }, "docId": "__ENC_DOCID__", "viewId": "__VIEWID__", "_selects": ["__ENC_DOCID1__"] }
请求示例¶
PUT /api/runtime/__APPID__/activities/__ACTID__/executeAddress HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...
{ "document": { "金额": "1200.00" }, "viewId": "__VIEWID__" }
响应¶
结构:统一 Resource。
data:JSONObject,地址脚本执行结果(由 ActivityRunTimeService.executeAddress 返回)。
成功示例: