跳转至

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 内捕获 Exceptione.printStackTrace() 后返回 errcode=500errmsg=e.getMessage()data=null(HTTP 状态码 200)。
  • 响应码怪癖clearDatas / clearCache / SynUsersToHx 的异常分支误用 success("error", "...失败"),实际产生 errcode=0errmsg="error"data="<...失败>"不是 errcode=500),调用方需按 errmsgdata 判错。
  • 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:系统管理模块

请求参数

无。

请求示例

GET /api/authtime/config HTTP/1.1

响应

结构:统一 Resource(见 ../index.md「统一响应结构」)。 dataJSONObject,字段:

字段 类型 说明
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
}
失败示例
HTTP 200,响应体为 null(异常被吞掉,方法 return null,不返回统一 Resource)


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

响应

结构:统一 Resourcedata:字符串 "保存成功"

成功示例

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


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

请求示例

GET /api/authtime/config/ai-config-test HTTP/1.1

响应

结构:统一 Resourcedata:探测结果 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
}
失败示例
{ "errcode": 500, "errmsg": "认证失败(HTTP 401),请检查 API 密钥", "data": null, "errors": null }


4. 导出系统配置

把当前持久化的系统配置导出为 XML 文件(文件名 sysConfig.xml),通过响应输出流下发二进制。

  • 接口类型:REST 资源(二进制流)
  • 请求方式GET
  • 请求路径/config/export(完整:{manager-context}/api/authtime/config/export
  • 鉴权:是
  • Tag:系统管理模块

请求参数

无。

请求示例

GET /api/authtime/config/export HTTP/1.1

响应

  • Content-Typeapplication/octet-stream;charset=ISO-8859-1
  • Content-Dispositionattachment;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" }

响应

结构:统一 Resourcedata:字符串 "导入成功"

条件 errcode errmsg data
文件非 .xml 4001 {*[cn.myapps.core.sysconfig.xmlimport.cannotimport]*} null
成功 0 ok 导入成功
抛异常 500 <异常信息> null

成功示例

{ "errcode": 0, "errmsg": "ok", "data": "导入成功", "errors": null }
失败示例
{ "errcode": 4001, "errmsg": "{*[cn.myapps.core.sysconfig.xmlimport.cannotimport]*}", "data": null, "errors": null }


6. 清除冗余数据

清除软件下的冗余运行数据(DocumentProcess.doClearRedundancyData)。applicationid 缺省时遍历所有软件(自动跳过 KMfc 流程中心)逐一清除。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/config/cleardatas(完整:{manager-context}/api/authtime/config/cleardatas
  • 鉴权:是
  • Tag:系统管理模块

请求参数

参数名 位置 类型 必填 说明
applicationid query string 软件 id;为空时遍历所有软件(跳过 KMfc

请求示例

POST /api/authtime/config/cleardatas?applicationid=__APP01 HTTP/1.1

响应

结构:统一 Resourcedata:字符串 "清除成功"(成功);或字符串 "清除失败"(异常,注意 errcode 仍为 0)。

条件 errcode errmsg data
成功 0 ok 清除成功
抛异常(误用 success 0 error 清除失败

注:异常分支调用 success("error", "清除失败"),产生 errcode=0 / errmsg="error" / data="清除失败",调用方须按 errmsgdata 判错。

成功示例

{ "errcode": 0, "errmsg": "ok", "data": "清除成功", "errors": null }
失败示例
{ "errcode": 0, "errmsg": "error", "data": "清除失败", "errors": null }


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(触发集群广播)

请求示例

POST /api/authtime/config/clearcache HTTP/1.1

响应

结构:统一 Resourcedata:字符串 "清除成功"(成功);或字符串 "清除失败"(异常,注意 errcode 仍为 0)。

条件 errcode errmsg data
成功 0 ok 清除成功
抛异常(误用 success 0 error 清除失败

注:异常分支调用 success("error", "清除失败"),产生 errcode=0 / errmsg="error" / data="清除失败"

成功示例

{ "errcode": 0, "errmsg": "ok", "data": "清除成功", "errors": null }
失败示例
{ "errcode": 0, "errmsg": "error", "data": "清除失败", "errors": null }


8. 获取清除缓存数据状态

按线程名 clearCacheThread 探测后台清缓存线程是否仍在运行,用于前端轮询。线程不存在视为已完成。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/config/clearcache/status(完整:{manager-context}/api/authtime/config/clearcache/status
  • 鉴权:是
  • Tag:系统管理模块

注:当前实现下 clearCache 为同步执行(未显式开线程),该状态接口实际返回值恒为 清除成功,仅在未来引入异步清缓存后才有「正在清除中」态。

请求参数

无。

请求示例

GET /api/authtime/config/clearcache/status HTTP/1.1

响应

结构:统一 Resourcedata:字符串 清除成功(线程不存在)或 正在清除中(线程仍存活)。

成功示例

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


9. 同步数据到环信

遍历所有企业域的全部用户(queryByDomain(null)),对状态启用(status=1)且 permissionType=public 的用户,若环信 IM 端尚无对应账号,则用用户 id 作为用户名、固定密码 123456 注册到环信。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/config/userstohx(完整:{manager-context}/api/authtime/config/userstohx
  • 鉴权:是
  • Tag:系统管理模块

请求参数

无。

请求示例

POST /api/authtime/config/userstohx HTTP/1.1

响应

结构:统一 Resourcedata:字符串 "同步成功"(成功);或字符串 "同步失败"(异常,注意 errcode 仍为 0)。

条件 errcode errmsg data
成功 0 ok 同步成功
抛异常(误用 success 0 error 同步失败

注:异常分支调用 success("error", "同步失败"),产生 errcode=0 / errmsg="error" / data="同步失败"

成功示例

{ "errcode": 0, "errmsg": "ok", "data": "同步成功", "errors": null }
失败示例
{ "errcode": 0, "errmsg": "error", "data": "同步失败", "errors": null }


10. 获取注册服务 IP

通过 Spring Cloud DiscoveryClient 列出 obpm-usercenterobpm-runtime 两个服务的注册实例(host、port、contextPath、protocol、serviceId);若两类服务均未注册(lite 统一部署),返回一条 localhost 兜底记录。

  • 接口类型:REST 资源
  • 请求方式GET
  • 请求路径/system/services(完整:{manager-context}/api/authtime/system/services
  • 鉴权:是
  • Tag:系统管理模块

请求参数

无。

请求示例

GET /api/authtime/system/services HTTP/1.1

响应

结构:统一 ResourcedataList<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:系统管理模块

请求参数

无。

请求示例

GET /api/authtime/synchronization/forms/status HTTP/1.1

响应

结构:统一 Resourcedata:字符串 同步成功(线程不存在)或 正在同步中(线程仍存活)。

成功示例

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


12. 同步数据表单

按软件 id 列表(逗号分隔)异步同步动态表单结构到软件库:先创建软件库的系统表,再为每个表单调用 FormTableProcess.createOrUpdateDynaTable 生成 / 更新 tlk_* 物理表。applicationId=allcustomAppsId(不区分大小写)时遍历所有自定义软件。

  • 接口类型:REST 资源
  • 请求方式POST
  • 请求路径/synchronization/forms(完整:{manager-context}/api/authtime/synchronization/forms
  • 鉴权:是
  • Tag:系统管理模块

请求参数

参数名 位置 类型 必填 说明
applicationId query string 软件 id,逗号分隔多值;特殊值 allcustomAppsId 表示全部自定义软件

请求示例

POST /api/authtime/synchronization/forms?applicationId=__APP01,__APP02 HTTP/1.1

响应

结构:统一 Resourcedatanull

条件 errcode errmsg data
成功(线程已派发) 0 ok null
同步过程中累计出错(见下注) 500 <同步表单错误信息> null
启动线程前抛异常 500 <异常信息> null

注:实际同步逻辑在新建的 syncDataFormThread 线程内异步执行;线程内单条表单出错会追加到 synFormError 但不影响其他表单。控制器在 start() 之后立即检查 synFormError.length()——由于线程刚启动,错误尚未写入,主流程几乎总是返回 success("ok", null);累计错误实际需通过另一接口或日志查看。该接口的 500 分支基本不会在响应中体现。

成功示例

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