SysConfigController(系统配置管理)¶
管理平台系统级配置:获取 / 更新系统配置(认证、LDAP、华为 IM、AI、登录五大配置块)、AI 配置连通性测试、系统配置 XML 导出 / 导入、冗余数据清除、缓存清除(含集群广播)、清除缓存线程状态查询、用户同步到环信 IM、注册服务 IP 查询(含 lite 模式回退)、表单同步线程状态查询、按软件同步动态表单结构。
- 类级基址:
${myapps.context-path.manager:}/api/authtime(完整路径:{manager-context}/api/authtime<相对路径>) - Tag:系统管理模块
- 控制器源码:
obpm-manager/src/main/java/cn/myapps/manager/authtime/controller/sysconfig/SysConfigController.java - 公共说明:
- 类继承
BaseAuthTimeController,通过其success(errmsg, data)/error(errcode, errmsg, errors)返回统一Resource(字段errcode/errmsg/data/errors,结构见 ../index.md「统一响应结构」)。 - 多数端点在
try/catch内捕获Exception并e.printStackTrace()后返回errcode=500、errmsg=e.getMessage()、data=null(HTTP 状态码 200)。 - 响应码怪癖:
clearDatas/clearCache/SynUsersToHx的异常分支误用success("error", "...失败"),实际产生errcode=0、errmsg="error"、data="<...失败>"(不是errcode=500),调用方需按errmsg或data判错。 getConfig的异常分支仅printStackTrace后**不返回Resource**,方法继续走到末尾的return null,由 Spring 默认序列化为空响应体(HTTP 200,body 为null)。exportSysConfig返回void,直接写二进制流到响应输出流(非统一Resource)。- 鉴权说明见 index.md「鉴权说明」(adminToken JWT)。
- 路径变量 / 查询参数:
applicationId(query)为软件 id;isFromClient(query)为集群内部回调标记。
1. 获取配置信息¶
读取并返回当前持久化的五大系统配置:认证(AuthConfig)、LDAP(LdapConfig)、华为 IM(HxImConfig)、AI(AiConfig)、登录(LoginConfig)。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/config(完整:{manager-context}/api/authtime/config) - 鉴权:是(需管理员 adminToken,详见 index.md「鉴权说明」)
- Tag:系统管理模块
请求参数¶
无。
请求示例¶
响应¶
结构:统一 Resource(见 ../index.md「统一响应结构」)。
data:JSONObject,字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| authConfig | AuthConfig | 认证配置(含是否启用 LDAP 登录、外网验证等) |
| ldapConfig | LdapConfig | LDAP 配置(URL、baseDN、目录结构、管理员账号/密码等) |
| hxImConfig | HxImConfig | 华为 IM 配置 |
| aiConfig | AiConfig | AI 服务配置(基址、API Key 等) |
| loginConfig | LoginConfig | 登录配置(密码加密模式、token 有效期等) |
注:源码内
checkoutConfig已被注释,不在返回字段中。
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": {
"authConfig": { "ldapLogin": false },
"ldapConfig": { "url": "", "baseDN": "" },
"hxImConfig": { "enable": false },
"aiConfig": { "baseUrl": "", "apiKey": "" },
"loginConfig": { "loginPasswordEncryptionMode": "0" }
},
"errors": null
}
2. 更新系统配置¶
接收前端系统配置包体,按五大配置块(authConfig / ldapConfig / hxImConfig / aiConfig / loginConfig)分别反序列化后整体保存,并通过 SysConfigTopicPublisher.publishChanged() 向集群广播配置变更。
- 接口类型:REST 资源
- 请求方式:
PUT - 请求路径:
/config(完整:{manager-context}/api/authtime/config) - 鉴权:是
- Tag:系统管理模块
注:源码兼容两种前端包体形态——根对象直接含 5 个配置块字段;或根对象下
data字段包裹 5 个配置块(旧 vue2 包体)。控制器会自动判定回退。
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| content | body | JSON 文本 | 是 | 系统配置包体(字段见下) |
请求体¶
JSON 对象(application/json,控制器以字符串接收后解析)。两种形态:
形态一(推荐,根对象直接含配置块):
{
"authConfig": { "ldapLogin": false },
"ldapConfig": { "url": "ldap://...", "baseDN": "..." },
"hxImConfig": { "enable": false },
"aiConfig": { "baseUrl": "https://...", "apiKey": "..." },
"loginConfig": { "loginPasswordEncryptionMode": "0" }
}
形态二(兼容旧前端,包裹在 data 下):
{
"data": {
"authConfig": { /* ... */ },
"ldapConfig": { /* ... */ },
"hxImConfig": { /* ... */ },
"aiConfig": { /* ... */ },
"loginConfig": { /* ... */ }
}
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| authConfig | object | 否 | 认证配置 |
| ldapConfig | object | 否 | LDAP 配置 |
| hxImConfig | object | 否 | 华为 IM 配置 |
| aiConfig | object | 否 | AI 配置 |
| loginConfig | object | 否 | 登录配置 |
| data | object | 否 | 旧前端兼容包裹;存在时从其下读取上述 5 字段 |
请求示例¶
PUT /api/authtime/config HTTP/1.1
Content-Type: application/json
{
"authConfig": { "ldapLogin": false },
"ldapConfig": { "url": "" },
"hxImConfig": { "enable": false },
"aiConfig": { "baseUrl": "https://ai.example.com/v1", "apiKey": "sk-***" },
"loginConfig": { "loginPasswordEncryptionMode": "0" }
}
响应¶
结构:统一 Resource。
data:字符串 "保存成功"。
成功示例:
失败示例:3. AI 配置连通性测试¶
读取已持久化的 AiConfig,对上游 OpenAI 兼容接口 GET {baseUrl}/models 发起连通性探测(连接超时 15s,读超时 45s,带 Authorization: Bearer <apiKey>),按 HTTP 状态码归一化返回成功 / 认证失败 / 404 / 其他错误。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/config/ai-config-test(完整:{manager-context}/api/authtime/config/ai-config-test) - 鉴权:是
- Tag:系统管理模块
请求参数¶
无(直接读取后端已保存的 AiConfig)。
请求示例¶
响应¶
结构:统一 Resource。
data:探测结果 JSONObject(已转为 Jackson 友好结构),字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| success | boolean | 是否探测成功 |
| message | string | 结果描述 |
| httpStatus | int | 上游 HTTP 状态码(请求发出时才有) |
| probeUrl | string | 实际请求的 URL(请求发出时才有) |
| bodyPreview | string | 上游响应体前若干字符(截断) |
| 条件 | errcode | errmsg | data |
|---|---|---|---|
| 基址未配置 | 500 | AI 基址未配置 |
null |
| 基址 URL 非法 | 500 | AI 基址 URL 非法 |
null |
| HTTP 2xx | 0 | ok | {success:true, message:"连接成功", httpStatus:200, ...} |
| HTTP 401/403 | 500 | 认证失败(HTTP <code>),请检查 API 密钥 |
null |
| HTTP 404 | 500 | 未找到 /models(HTTP 404),请确认上游为 OpenAI 兼容 API 且基址含 /v1 |
null |
| 其他 HTTP 错误 | 500 | 上游返回 HTTP <code> |
null |
| 连接异常 | 500 | 请求失败:<异常类>:<异常信息> |
null |
注:探测结果归一化逻辑写在控制器内,控制器把非成功分支以
errcode=500+errmsg=<归一化文案>返回(不把success:false放进data);成功分支才把完整JSONObject放进data。
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": {
"success": true,
"message": "连接成功",
"httpStatus": 200,
"probeUrl": "https://ai.example.com/v1/models",
"bodyPreview": "{\"object\":\"list\",...}"
},
"errors": null
}
4. 导出系统配置¶
把当前持久化的系统配置导出为 XML 文件(文件名 sysConfig.xml),通过响应输出流下发二进制。
- 接口类型:REST 资源(二进制流)
- 请求方式:
GET - 请求路径:
/config/export(完整:{manager-context}/api/authtime/config/export) - 鉴权:是
- Tag:系统管理模块
请求参数¶
无。
请求示例¶
响应¶
- Content-Type:
application/octet-stream;charset=ISO-8859-1 - Content-Disposition:
attachment;filename="sysConfig.xml"(按USER-AGENT走 Firefox / IE / 通用三种编码分支) - 状态码:200(成功)
- 响应体:XML 二进制流(无统一
Resource)
| 条件 | 行为 |
|---|---|
| 导出文件不存在 | 响应体写入纯文本 找不到指定文件 |
抛 OBPMValidateException |
静默吞掉(无响应体输出) |
| 抛其他异常 | printStackTrace,无响应体输出 |
注:本端点返回
void,所有异常被catch吞掉,不在响应体返回统一Resource。
5. 系统配置导入¶
按上传的 XML 文件相对路径,把系统配置导入并覆盖本地(ImportUtil.load),导入完成后通过 sysConfigTopicPublisher.publishChanged() 向集群广播配置变更。文件扩展名必须为 .xml。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/config/import(完整:{manager-context}/api/authtime/config/import) - 鉴权:是
- Tag:系统管理模块
注:源码
@Operation(summary)文案为「系统配置导出」(方法名excelImportUserAndDept),实际行为是**导入**,按语义描述。
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| jsonObject | body | JSON | 是 | 导入参数包体(字段见下) |
请求体¶
JSON 对象(application/json):
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| path | string | 是 | 上传 XML 文件的相对路径(相对于 web 根) |
请求示例¶
POST /api/authtime/config/import HTTP/1.1
Content-Type: application/json
{ "path": "/uploads/import/sysConfig.xml" }
响应¶
结构:统一 Resource。
data:字符串 "导入成功"。
| 条件 | errcode | errmsg | data |
|---|---|---|---|
文件非 .xml |
4001 | {*[cn.myapps.core.sysconfig.xmlimport.cannotimport]*} |
null |
| 成功 | 0 | ok | 导入成功 |
| 抛异常 | 500 | <异常信息> |
null |
成功示例:
失败示例:{ "errcode": 4001, "errmsg": "{*[cn.myapps.core.sysconfig.xmlimport.cannotimport]*}", "data": null, "errors": null }
6. 清除冗余数据¶
清除软件下的冗余运行数据(DocumentProcess.doClearRedundancyData)。applicationid 缺省时遍历所有软件(自动跳过 KM 与 fc 流程中心)逐一清除。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/config/cleardatas(完整:{manager-context}/api/authtime/config/cleardatas) - 鉴权:是
- Tag:系统管理模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationid | query | string | 否 | 软件 id;为空时遍历所有软件(跳过 KM、fc) |
请求示例¶
响应¶
结构:统一 Resource。
data:字符串 "清除成功"(成功);或字符串 "清除失败"(异常,注意 errcode 仍为 0)。
| 条件 | errcode | errmsg | data |
|---|---|---|---|
| 成功 | 0 | ok | 清除成功 |
抛异常(误用 success) |
0 | error |
清除失败 |
注:异常分支调用
success("error", "清除失败"),产生errcode=0/errmsg="error"/data="清除失败",调用方须按errmsg或data判错。
成功示例:
失败示例:7. 清除缓存数据¶
清除多级缓存(host-only / host-shared 缓存、脚本缓存、流程票据缓存、菜单缓存、设计时序列化缓存、权限缓存)并按需重初始化各软件的数据源。isFromClient=false(默认)时,通过 DiscoveryClient 找到所有非本端口的集群实例,向其 /api/authtime/config/clearcache?isFromClient=true 发起 POST 回调,实现集群级缓存清除。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/config/clearcache(完整:{manager-context}/api/authtime/config/clearcache) - 鉴权:是
- Tag:系统管理模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| isFromClient | query | boolean | 否 | 是否由集群内其他实例回调而来,缺省 false(触发集群广播) |
请求示例¶
响应¶
结构:统一 Resource。
data:字符串 "清除成功"(成功);或字符串 "清除失败"(异常,注意 errcode 仍为 0)。
| 条件 | errcode | errmsg | data |
|---|---|---|---|
| 成功 | 0 | ok | 清除成功 |
抛异常(误用 success) |
0 | error |
清除失败 |
注:异常分支调用
success("error", "清除失败"),产生errcode=0/errmsg="error"/data="清除失败"。
成功示例:
失败示例:8. 获取清除缓存数据状态¶
按线程名 clearCacheThread 探测后台清缓存线程是否仍在运行,用于前端轮询。线程不存在视为已完成。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/config/clearcache/status(完整:{manager-context}/api/authtime/config/clearcache/status) - 鉴权:是
- Tag:系统管理模块
注:当前实现下
clearCache为同步执行(未显式开线程),该状态接口实际返回值恒为清除成功,仅在未来引入异步清缓存后才有「正在清除中」态。
请求参数¶
无。
请求示例¶
响应¶
结构:统一 Resource。
data:字符串 清除成功(线程不存在)或 正在清除中(线程仍存活)。
成功示例:
失败示例:9. 同步数据到环信¶
遍历所有企业域的全部用户(queryByDomain(null)),对状态启用(status=1)且 permissionType=public 的用户,若环信 IM 端尚无对应账号,则用用户 id 作为用户名、固定密码 123456 注册到环信。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/config/userstohx(完整:{manager-context}/api/authtime/config/userstohx) - 鉴权:是
- Tag:系统管理模块
请求参数¶
无。
请求示例¶
响应¶
结构:统一 Resource。
data:字符串 "同步成功"(成功);或字符串 "同步失败"(异常,注意 errcode 仍为 0)。
| 条件 | errcode | errmsg | data |
|---|---|---|---|
| 成功 | 0 | ok | 同步成功 |
抛异常(误用 success) |
0 | error |
同步失败 |
注:异常分支调用
success("error", "同步失败"),产生errcode=0/errmsg="error"/data="同步失败"。
成功示例:
失败示例:10. 获取注册服务 IP¶
通过 Spring Cloud DiscoveryClient 列出 obpm-usercenter 与 obpm-runtime 两个服务的注册实例(host、port、contextPath、protocol、serviceId);若两类服务均未注册(lite 统一部署),返回一条 localhost 兜底记录。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/system/services(完整:{manager-context}/api/authtime/system/services) - 鉴权:是
- Tag:系统管理模块
请求参数¶
无。
请求示例¶
响应¶
结构:统一 Resource。
data:List<JSONObject>,元素字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| protocol | string | 协议(如 http),由 ServiceInstance.getScheme() 返回 |
| host | string | 主机地址 |
| contextPath | string | 上下文路径,取自实例 metadata 的 contextPath |
| port | int | 端口 |
| serviceId | string | 服务 id(obpm-usercenter / obpm-runtime) |
lite 模式回退项字段名与上表不同:
scheme/host="localhost"/contextPath="/"/port=Environment.getServerPort()/serviceId="obpm"。
成功示例:
{
"errcode": 0,
"errmsg": "ok",
"data": [
{ "protocol": "http", "host": "192.168.1.10", "contextPath": "/", "port": 8083, "serviceId": "obpm-runtime" },
{ "protocol": "http", "host": "192.168.1.10", "contextPath": "/", "port": 8085, "serviceId": "obpm-usercenter" }
],
"errors": null
}
try/catch,异常时由 Spring 默认异常处理(HTTP 500,无统一 Resource 体)。
11. 获取同步表单状态¶
按线程名 syncDataFormThread 探测后台表单同步线程是否仍在运行,用于前端轮询。线程不存在视为已完成。
- 接口类型:REST 资源
- 请求方式:
GET - 请求路径:
/synchronization/forms/status(完整:{manager-context}/api/authtime/synchronization/forms/status) - 鉴权:是
- Tag:系统管理模块
请求参数¶
无。
请求示例¶
响应¶
结构:统一 Resource。
data:字符串 同步成功(线程不存在)或 正在同步中(线程仍存活)。
成功示例:
失败示例:12. 同步数据表单¶
按软件 id 列表(逗号分隔)异步同步动态表单结构到软件库:先创建软件库的系统表,再为每个表单调用 FormTableProcess.createOrUpdateDynaTable 生成 / 更新 tlk_* 物理表。applicationId=allcustomAppsId(不区分大小写)时遍历所有自定义软件。
- 接口类型:REST 资源
- 请求方式:
POST - 请求路径:
/synchronization/forms(完整:{manager-context}/api/authtime/synchronization/forms) - 鉴权:是
- Tag:系统管理模块
请求参数¶
| 参数名 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| applicationId | query | string | 是 | 软件 id,逗号分隔多值;特殊值 allcustomAppsId 表示全部自定义软件 |
请求示例¶
响应¶
结构:统一 Resource。
data:null。
| 条件 | errcode | errmsg | data |
|---|---|---|---|
| 成功(线程已派发) | 0 | ok | null |
| 同步过程中累计出错(见下注) | 500 | <同步表单错误信息> |
null |
| 启动线程前抛异常 | 500 | <异常信息> |
null |
注:实际同步逻辑在新建的
syncDataFormThread线程内异步执行;线程内单条表单出错会追加到synFormError但不影响其他表单。控制器在start()之后立即检查synFormError.length()——由于线程刚启动,错误尚未写入,主流程几乎总是返回success("ok", null);累计错误实际需通过另一接口或日志查看。该接口的 500 分支基本不会在响应中体现。
成功示例:
失败示例: