跳转至

操作(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 类字段(如 _selectssubSelectsdocIds 等)按业务约定均为 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/errorsResource.data 的类型见各端点说明;多数端点的 data 为服务返回的 JSONObject/String。例外端点:
  • exportExcel(#11)直接写回 HttpServletResponse 输出流,返回 Excel 文件二进制流Content-Type: application/x-download,附件下载),不返回 JSON Resource
  • importExcel(#18)/validationExcel(#19)部分分支直接 new Resource(...) 构造响应,错误码包含 4001(业务校验/导入出错)与 5000(捕获异常,控制器内自有错误码)。
  • 进度查询端点exportExcel/readProcessbatchApprove/readProcessimportExcel/readProcessvalidateExcel/readProcess)通过 MemoryCacheUtil 读取当前用户私有缓存中的进度数据,对应业务操作端点(exportExcelbatchApproveimportExcelvalidationExcel)在执行前会重置计数、执行后写入结果。
  • 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「统一响应结构」)。 dataJSONObject,执行前脚本运行结果(由 ActivityRunTimeService.runbeforeactionscript 返回)。

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": { "result": "<脚本返回值>" },
  "errors": null
}


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": "同意"
}

响应

结构:统一 ResourcedataJSONObject,执行后脚本运行结果。

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": { "result": "<脚本返回值>" },
  "errors": null
}


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...

响应

结构:统一 ResourcedataString,脚本运行结果(强转为 String)。

成功示例

{ "errcode": 0, "errmsg": "ok", "data": "<脚本返回字符串>", "errors": null }

失败示例(字段名不存在或脚本报错)

{ "errcode": 403, "errmsg": "字段名不存或者脚本报错", "data": null, "errors": null }

说明:源码字面文案为「字段名不存或者脚本报错」(原文,未补「在」字);异常被捕获后返回 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 不同,据源码)
{ "document": { "items": { "金额": "1200.00" } }, "subSelects": ["__SUBID1__"] }

请求示例

PUT /api/runtime/__APPID__/activities/__ACTID__/execute HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

{ "document": { "items": { "金额": "1200.00" } } }

响应

结构:统一 ResourcedataJSONObject,动作执行结果(由 ActivityRunTimeService.execute 返回)。

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": { "result": "<动作执行结果>" },
  "errors": null
}


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...

响应

结构:统一 ResourcedataString,归档结果字符串。

成功示例

{ "errcode": 0, "errmsg": "ok", "data": "<归档结果字符串>", "errors": null }


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" } }
}

响应

结构:统一 ResourcedataDocument,保存并启动流程后的文档对象(由 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

{ "document": { "id": "__DOCID__", "items": { "金额": "1500.00" } } }

请求示例

POST /api/runtime/__APPID__/documents/__DOCID__/activities/copy HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

{ "document": { "items": { "金额": "1500.00" } } }

响应

结构:统一 ResourcedataDocument,复制产生的新文档对象(由 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=40001errmsg="复制表单校验不通过" 的总错误项;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/clearURI 虽以 /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...

响应

结构:统一 ResourcedataString,固定文案 "清除成功"

成功示例

{ "errcode": 0, "errmsg": "ok", "data": "清除成功", "errors": null }


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(字段名→字段值映射,字段必须在文档中已存在,否则抛 <字段名> 值不存在)。

{ "document": { "sign": "<签章数据>", "items": { "金额": "1200.00" } } }

请求示例

POST /api/runtime/__APPID__/documents/__DOCID__/activities/sign HTTP/1.1
Content-Type: application/json
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

{ "document": { "sign": "<签章数据>", "items": { "金额": "1200.00" } } }

响应

结构:统一 ResourcedataString,固定文案 "签章成功"

成功示例

{ "errcode": 0, "errmsg": "ok", "data": "签章成功", "errors": null }


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": {} } }

响应

结构:统一 ResourcedataString,下载地址: - 若脚本返回值含 https://http://,直接返回该 URL; - 否则按存储相对路径解析、校验 SecurityFile.resolveFile(...).isFile() 通过后,返回经 DES 加密的路径(按当前用户密钥加密)。

成功示例

{ "errcode": 0, "errmsg": "ok", "data": "<DES 加密路径或 URL>", "errors": null }

失败示例(脚本结果为空或文件不存在)

{ "errcode": 40001, "errmsg": "文件不存在", "data": null, "errors": null }


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-Typeapplication/x-download; charset=<encoding> - Content-Dispositionattachment;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...

响应

结构:统一 ResourcedataJSONObject,含以下键:

字段 类型 说明
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 }

响应

结构:统一 ResourcedataString,分享结果字符串。

成功示例

{ "errcode": 0, "errmsg": "ok", "data": "<分享结果字符串>", "errors": null }


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": "同意" }

响应

结构:统一 Resourcedatanet.sf.json.JSONObject,批量提交结果对象。

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": { "successCount": 5, "failCount": 0 },
  "errors": null
}

说明:进度通过 #15 GET /batchApprove/readProcess 轮询。


15. 读取批量提交进度

读取当前用户私有缓存中的批量提交进度。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/batchApprove/readProcess(完整:{runtime-context}/api/runtime/batchApprove/readProcess
  • 鉴权:是(需 accessToken,据源码)
  • Tag:操作(Activity)执行模块

请求参数

无。

请求示例

GET /api/runtime/batchApprove/readProcess HTTP/1.1
Cookie: accessToken=eyJhbGciOiJIUzI1NiJ9...

响应

结构:统一 ResourcedataJSONObject,含以下键:

字段 类型 说明
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 内容)。

{ "htmlBody": "<html>...</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>" }

响应

结构:统一 ResourcedataActivityResult.getResultData(),PDF 导出结果数据(由 ExportToPdf.doProcess 返回)。

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": { "<PDF 导出结果字段>": "<值>" },
  "errors": null
}


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...

响应

结构:统一 ResourcedataFormDataPacket,表单数据包对象(由 ActivityRunTimeService.print 返回)。

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": { "<FormDataPacket 字段>": "<值>" },
  "errors": null
}


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):

{ "errcode": 0, "errmsg": "ok", "data": "<导入成功提示字符串>", "errors": null }

业务出错示例(结果不含上述成功标记,按 $$ 切分错误明细):

{ "errcode": 4001, "errmsg": "导入出错", "data": ["<错误1>", "<错误2>"], "errors": null }

说明:错误响应 new Resource(4001, "导入出错", msg, null)msgString[] 写入 data 字段(非 errors 字段),据源码如实记录。

异常示例(捕获 Exception):

{ "errcode": 5000, "errmsg": "<异常信息>", "data": null, "errors": null }

说明:进度通过 #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)。

{ "impmappingconfigid": "__MAPCFGID__", "path": "<file path>", "actId": "__ACTID__" }

请求示例

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 为「校验出错」)。

成功示例

{ "errcode": 0, "errmsg": "ok", "data": "<校验成功提示字符串>", "errors": null }

业务出错示例

{ "errcode": 4001, "errmsg": "校验出错", "data": ["<错误1>"], "errors": null }

异常示例

{ "errcode": 5000, "errmsg": "<异常信息>", "data": null, "errors": null }

说明:进度通过 #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...

响应

结构:统一 ResourcedataJSONObject,含以下键:

字段 类型 说明
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...

响应

结构:统一 ResourcedataJSONObject,含以下键(源码字段名沿用 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__" }

响应

结构:统一 ResourcedataJSONObject,地址脚本执行结果(由 ActivityRunTimeService.executeAddress 返回)。

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": { "url": "<计算后的跳转地址>" },
  "errors": null
}