跳转至

设计时软件管理(ApplicationDesignTimeController)

软件(应用)设计时资源管理:软件的增删改查、启用/禁用、概览 PDF 导出、平台模式回调日志与 git 操作日志查询、索引重建,以及软件数据源的连通性测试与初始化。

  • 接口类型:REST 资源
  • 基址${myapps.context-path.designer:}/api/designtime(类级 @RequestMapping@Component 继承 AbstractDesignTimeController
  • Tag:设计时-软件模块

公共说明

  • 鉴权:是(需 designerToken)。所有端点继承自 AbstractDesignTimeController,通过 Security.getDesignerIdFromToken(request) 从 designerToken JWT 中解析设计器用户;getUser() 返回基于 JWT claim username 加载的 SuperUserVO。鉴权机制详见 index.md「鉴权说明」。
  • 路径变量{applicationId}{datasourceId}{id} 均为**明文设计时 ID**(与 designer 其他控制器一致,非 runtime 的 DES 加密密文)。
  • 路径前缀差异(据源码):本控制器同时存在 /applications/...(复数)与 /application/...(单数)两套前缀,调用时须严格按各端点写明的小写形式(源码历史遗留,未做统一)。
  • 响应:统一 Resource(见 ../index.md「统一响应结构」)。成功 errcode=0;异常默认 errcode=500errmsg 为异常信息;保存类接口校验失败(如重名、名称为空)返回 errcode=40001;数据源连通失败返回 errcode=502
  • HTTP 方法:受 CommonSecurityFilter 限制,仅允许 GET/POST/HEAD/OPTIONS
  • 请求体约定:多数 POST/PUT/DELETE 接收原始 JSON 字符串(@RequestBody String content),由服务端用 JSONObject.fromObject/JSONArray.fromObject 解析。
  • 权限模型:列表查询时,超级管理员(SuperUserVO.isSuperAdmin())可看全部;其他用户仅可见其 applicationList 中授权的软件。新建/更新软件后,若当前用户为开发者(isDeveloper()),会自动把该软件 Id 追加到该用户的授权列表。

1. 获取软件列表

分页获取当前用户可见的软件列表(超级管理员看全部;其他用户仅看授权列表)。可按 searchword 关键字过滤。注意:源码形参 searchword 仅在超级管理员分支通过 appService.queryByName(searchword) 生效;非超级管理员分支不过滤。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/applications(完整:{designer-context}/api/designtime/applications
  • 鉴权:是(需 designerToken)
  • Tag:设计时-软件模块

请求参数

参数名 位置 类型 必填 说明
searchword query string 按名称查询关键字(仅超级管理员生效)
type query integer 类型(@Parameter 声明但实现未使用,缺省 0
pageNo query integer 当前页数(缺省 1
linesPerPage query integer 每页行数(缺省 10

说明:源码 @Parameter 还声明了 category,但方法签名未声明该 @RequestParam,实际不会被读取。

请求示例

GET /api/designtime/applications?searchword=&pageNo=1&linesPerPage=10 HTTP/1.1

响应

结构:统一 Resource(见 ../index.md「统一响应结构」)。 dataDataPackage<Application>(含分页字段 rowCount/linesPerPage/pageNodatas)。

成功示例

{
  "errcode": 0,
  "errmsg": "ok",
  "data": {
    "rowCount": 2,
    "linesPerPage": 10,
    "pageNo": 1,
    "datas": [
      { "id": "...", "name": "OA", "description": "办公自动化", "type": 1, "...": "..." }
    ]
  },
  "errors": null
}
失败示例
{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }


2. 获取软件详情

applicationId 查询单个软件,返回精简后的字段集(id、name、description、type、activated、orderNo、uri、url/token/encodingAESkey(仅 BPM 平台型)、datasourceName、category、brief、ico)。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/applications/{applicationId}
  • 鉴权:是(需 designerToken)
  • Tag:设计时-软件模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 软件Id

响应

dataJSONObject,结构如上字段集;找不到时 datanullerrcode=500errmsg 为异常信息)。

{
  "errcode": 0,
  "errmsg": "ok",
  "data": {
    "id": "...",
    "name": "OA",
    "description": "办公自动化",
    "type": 1,
    "activated": true,
    "orderNo": 1,
    "uri": "",
    "url": "",
    "token": "",
    "encodingAESkey": "",
    "datasourceName": "默认数据源",
    "category": "OA",
    "brief": "...",
    "ico": "..."
  },
  "errors": null
}

3. 获取软件 README 文档

applicationId 返回该软件工作目录下 README.md 的文本内容。文件不存在时返回空字符串。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/application/{applicationId}/readme(注意:单数 application
  • 鉴权:是(需 designerToken)
  • Tag:设计时-软件模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 软件Id

请求示例

GET /api/designtime/application/{applicationId}/readme HTTP/1.1

响应

dataString,README.md 文本(UTF-8)。失败时 errcode=40001(该端点异常包为 40001,与其他端点不同)。

{ "errcode": 0, "errmsg": "ok", "data": "# 应用说明\n......", "errors": null }
失败示例
{ "errcode": 40001, "errmsg": "<异常信息>", "data": null, "errors": null }


4. 新建软件

创建软件。请求体反序列化为 Application 后做重名/名称为空校验,通过则分配设计时序列号并保存;若当前用户为开发者,将软件 Id 追加到该用户授权列表;并创建该软件工作目录的 pidurl 索引占位文件。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/applications
  • 鉴权:是(需 designerToken)
  • Tag:设计时-软件模块

请求参数

参数名 位置 类型 必填 说明
content body string(JSON) 软件对象 JSON

请求体

对应 Application 对象 JSON(name 必填,typecategorybriefico、数据源列表等可选)。

{ "name": "OA", "description": "办公自动化", "type": 1, "category": "OA", "brief": "...", "ico": "..." }

响应

dataJSONObject,仅含 id(新建软件Id)。校验失败时 errcode=40001errmsg 为「软件名称不能为空!」或「该软件名称已存在!」。

{ "errcode": 0, "errmsg": "ok", "data": { "id": "<新软件Id>" }, "errors": null }
失败示例
{ "errcode": 40001, "errmsg": "该软件名称已存在!", "data": null, "errors": null }


5. 更新软件

applicationId 更新软件基本字段(克隆后修改,避免脏字段写回)。当原软件为 BPM 平台型(Application.BPM_PLATFORM_TYPE)时一并更新 url/token/encodingAESkey。保存成功后通过 Feign 调用 RuntimeFeignService.clearDataSourceCache 清理数据源缓存(失败被吞掉)。

  • 接口类型:REST 资源
  • 请求方式PUT
  • 请求路径/applications/{applicationId}
  • 鉴权:是(需 designerToken)
  • Tag:设计时-软件模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 软件Id
content body string(JSON) 软件对象 JSON(须含 name/description/type/activated/orderNo/category/brief/ico;BPM 平台型另须 url/token/encodingAESkey)

请求体

{
  "name": "OA",
  "description": "...",
  "type": 1,
  "activated": true,
  "orderNo": 1,
  "category": "OA",
  "brief": "...",
  "ico": "...",
  "url": "", "token": "", "encodingAESkey": ""
}

响应

datanull(成功)。校验失败时 errcode=40001

{ "errcode": 0, "errmsg": "ok", "data": null, "errors": null }
失败示例
{ "errcode": 40001, "errmsg": "该软件名称已存在!", "data": null, "errors": null }


6. 删除软件(可批量)

按软件 Id 数组批量删除软件(含工作目录),并清理所有超级用户对该软件 Id 的授权引用。

  • 接口类型:REST 资源
  • 请求方式DELETE
  • 请求路径/applications
  • 鉴权:是(需 designerToken)
  • Tag:设计时-软件模块

请求参数

参数名 位置 类型 必填 说明
content body string(JSON) 软件 Id 数组(JSON 数组字符串,由 JSONArray.fromObject 解析为 List<String>

请求体

["<applicationId1>", "<applicationId2>"]

响应

datanull(成功)。

{ "errcode": 0, "errmsg": "ok", "data": null, "errors": null }
失败示例
{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }


7. 生成应用概览 PDF

applicationId 调用 ApplicationUtil.createOverview 生成 PDF 概览文件,并返回二进制流。

  • 接口类型:REST 资源(二进制响应)
  • 请求方式GET
  • 请求路径/applications/{applicationId}/overview
  • 鉴权:是(需 designerToken)
  • Tag:设计时-软件模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 软件Id

请求示例

GET /api/designtime/applications/{applicationId}/overview HTTP/1.1

响应

结构非统一 Resource,直接返回二进制 PDF 流。 - Content-Typeapplication/octet-stream - Content-Dispositionform-data; name="attachment"; filename="appOverview<时间戳>.pdf" - 状态码:201 Created(成功或失败均为 201;失败时 body 为空)

说明:该端点异常时返回 ResponseEntity body 为 null,仍带 201 状态码,调用方需按 body 是否为空判断。


8. 获取平台模式回调日志

applicationId 返回该软件的所有平台模式回调日志(CallBackLogStorage.getAll)。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/applications/{applicationId}/getCallBackLogs
  • 鉴权:是(需 designerToken)
  • Tag:设计时-软件模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 软件Id

请求示例

GET /api/designtime/applications/{applicationId}/getCallBackLogs HTTP/1.1

响应

dataCollection<CallBackLog>

{
  "errcode": 0,
  "errmsg": "ok",
  "data": [ { "id": "...", "...": "..." } ],
  "errors": null
}
失败示例
{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }


9. 获取 git 操作记录日志

按资源 Id(表单/视图/模块等任意设计时资源 Id)定位其所属软件的 git 目录,遍历 commit 历史中 message 头部包含该 Id 的提交,返回操作记录列表。每条 commit message 约定为 <resourceId>--<操作描述> 格式(按 -- 拆分)。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/applications/records/{id}
  • 鉴权:是(需 designerToken)
  • Tag:设计时-软件模块

请求参数

参数名 位置 类型 必填 说明
id path string 资源Id(用于定位所属软件并过滤 commit)

请求示例

GET /api/designtime/applications/records/{id} HTTP/1.1

响应

dataList<Map>,每项 {id, username, message, time}。未定位到软件目录时为空数组。

{
  "errcode": 0,
  "errmsg": "ok",
  "data": [
    { "id": "<commit hash>", "username": "<作者>", "message": "<操作描述>", "time": "2026-08-04 12:34:56" }
  ],
  "errors": null
}
失败示例
{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }


10. 重构索引文件

重建软件的设计时索引(urlpid 文件与 DesignTimeIndexCacheManager.initCache)。applicationName 缺省时遍历工作目录下所有 <name>.application 目录并逐个重建;指定时仅重建该软件。

  • 接口类型:REST 资源
  • 请求方式PUT
  • 请求路径/indexs/rebuild
  • 鉴权:是(需 designerToken)
  • Tag:设计时-软件模块

请求参数

参数名 位置 类型 必填 说明
applicationName query string 软件名称(缺省时全量重建)

请求示例

PUT /api/designtime/indexs/rebuild?applicationName=OA HTTP/1.1

响应

datanull(成功)。HTTP 状态码固定 200 OK@ResponseStatus(HttpStatus.OK))。

{ "errcode": 0, "errmsg": "ok", "data": null, "errors": null }
失败示例
{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }


11. 获取工作空间软件列表(按文件系统)

直接扫描工作空间根目录下所有 <name>.application 子目录,解析其内的 <name>.application 文件,返回软件清单(与数据库无关,用于索引重建前的探测)。id 字段恒为空字符串。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/indexs/applications
  • 鉴权:是(需 designerToken)
  • Tag:设计时-软件模块

请求参数

无。

请求示例

GET /api/designtime/indexs/applications HTTP/1.1

响应

dataJSONArray,每项 {id, name, description}id 恒为 ""description 缺省时回退为软件名)。HTTP 状态码固定 200 OK

{
  "errcode": 0,
  "errmsg": "ok",
  "data": [ { "id": "", "name": "OA", "description": "办公自动化" } ],
  "errors": null
}
失败示例
{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }


12. 禁用软件

applicationId 将软件 activated 置为 false 并保存。

  • 接口类型:REST 资源
  • 请求方式PUT
  • 请求路径/application/{applicationId}/inactivate(注意:单数 application
  • 鉴权:是(需 designerToken)
  • Tag:设计时-软件模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 软件Id

请求示例

PUT /api/designtime/application/{applicationId}/inactivate HTTP/1.1

响应

dataString,成功时为 "success"

{ "errcode": 0, "errmsg": "ok", "data": "success", "errors": null }
失败示例
{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }


13. 启用软件

applicationId 将软件 activated 置为 true 并保存。启用前会对该软件的所有数据源逐个执行 testDB();任一失败返回 errcode=502

  • 接口类型:REST 资源
  • 请求方式PUT
  • 请求路径/application/{applicationId}/activate(注意:单数 application
  • 鉴权:是(需 designerToken)
  • Tag:设计时-软件模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 软件Id

请求示例

PUT /api/designtime/application/{applicationId}/activate HTTP/1.1

响应

dataString,成功时为 "success"。数据源连通失败时 errcode=502errmsg 形如 [<数据源名>]datasource connected failed!

{ "errcode": 0, "errmsg": "ok", "data": "success", "errors": null }
失败示例(数据源连通失败):
{ "errcode": 502, "errmsg": "[<数据源名>]datasource connected failed!", "data": null, "errors": null }


14. 测试软件数据源连通性

applicationId + datasourceId 加载数据源并执行 testDB()

  • 接口类型:REST 资源
  • 请求方式PUT
  • 请求路径/application/{applicationId}/datasource/{datasourceId}/test(注意:单数 application
  • 鉴权:是(需 designerToken)
  • Tag:设计时-软件模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 软件Id
datasourceId path string 数据源Id

请求示例

PUT /api/designtime/application/{applicationId}/datasource/{datasourceId}/test HTTP/1.1

响应

dataString。连通成功:errcode=0errmsg="ok"data="success";连通失败:仍返回 errcode=0,但 errmsg="error"data="bad connection:<数据源 url>"。异常时 errcode=500

{ "errcode": 0, "errmsg": "ok", "data": "success", "errors": null }
失败示例(连通失败,errcode 仍为 0):
{ "errcode": 0, "errmsg": "error", "data": "bad connection:jdbc:mysql://...", "errors": null }
失败示例(异常):
{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }


15. 初始化软件数据源

applicationId + datasourceId 初始化数据源:仅支持 MySQL(DataSource.DB_MYSQL)。若连通失败先建库(createDB());若库为空则从软件工作目录的 database/<数据源名>.sql 还原。非 MySQL 类型返回 errcode=502errmsg 为数据源 url。

  • 接口类型:REST 资源
  • 请求方式PUT
  • 请求路径/application/{applicationId}/datasource/{datasourceId}/init(注意:单数 application
  • 鉴权:是(需 designerToken)
  • Tag:设计时-软件模块

请求参数

参数名 位置 类型 必填 说明
applicationId path string 软件Id
datasourceId path string 数据源Id

请求示例

PUT /api/designtime/application/{applicationId}/datasource/{datasourceId}/init HTTP/1.1

响应

datanull(成功)。非 MySQL 返回 errcode=502

{ "errcode": 0, "errmsg": "ok", "data": null, "errors": null }
失败示例(非 MySQL):
{ "errcode": 502, "errmsg": "jdbc:oracle:...", "data": null, "errors": null }
失败示例(异常):
{ "errcode": 500, "errmsg": "<异常信息>", "data": null, "errors": null }