跳转至

企业域绑定软件(写系统库 t_domain.bind_applications)

目标:Agent 直接写数据库,把 workspace 软件 id 写入企业域的绑定列表,使该域用户前台能看到该软件。知识以本文为准。不走管理端 UI、不调 REST。

REQUIRED SUB-SKILL: 写库成功后必须用 rebuild-index 的 clear_cache.py 刷新缓存。禁止只 UPDATE 就声称完成。

与 create-user 同一套系统库、同一套连接与验库方式。create-user 解决「用户有角色」;本技能解决「域已绑定该软件」。两者都齐,前台才可见非系统软件。

术语:

说法 落点
企业域 / 域 系统库 t_domain(Hibernate 表名 T_DOMAIN)一行
绑定软件 t_domain.bind_applications(列名 BIND_APPLICATIONS,MEDIUMTEXT)
软件 id {软件}.application/{软件}.application 根属性 id(禁止用目录名/软件 name)
系统库 / 系统数据源 Java Spring Boot spring.datasource,库名常见 obpm_lite(obpm-lite / usercenter / runtime 连的那套库)
应用库 软件 .datasource 指向的业务库(TLK_ 等)。**禁止**当作域绑定库

Java 实体字段名为 bindApplicatons(历史拼写缺 i),映射列仍是 BIND_APPLICATIONS。SQL 一律用列名 BIND_APPLICATIONS / bind_applications。


硬性规则:默认同时绑定「工作台」

绑定业务软件时,必须同时把「工作台」软件 id 写入同一域的 bind_applications。 无例外(工作台已在列表中则不再追加)。

项 值
软件 desk.application(<name>desk</name>,<description>工作台</description>)
id 读 desk.application/desk.application 根属性 id
原因 create-user 默认授予工作台员工角色;域未绑定工作台则前台仍无「发起新建 / 我的待办」等入口

定位 desk.application:优先 --app-dir 的**同级目录** desk.application;再沿父目录查找 storage/workspace/desk.application。用 <description>工作台</description> 或 <name>desk</name> 确认。

找不到工作台仍声称绑定完成 → 停手问用户。

写库成功后 clear_cache.py 须对 业务 --app-dir 与 desk.application 都执行。


产出物

部分 落库 说明
域绑定列表 t_domain.BIND_APPLICATIONS JSON 数组文本,元素为软件 id,如 ["__abc…","__def…"]。顺序即前台软件排序

默认动作是追加(merge):已有 id 保持原顺序,新 id 接到末尾。禁止无故整列覆盖成只含本次软件(会丢掉域上其它软件)。

推荐脚本(本目录):

python "<skill-dir>/scripts/bind_domain_application.py" --app-dir "<某个.application绝对路径>"
# 多域时加 --domain 域名或域 id
# 解绑:加 --unbind(只移除业务软件 id,不移除工作台)
# 预览不写库:加 --dry-run(仍会连库读取现有 BIND_APPLICATIONS 再打印 merge 结果)

连接参数未给齐时脚本会按下文「定位系统库」尝试读取;仍不确定则**停止并问用户**。


何时用 / 不用

用:新建软件后要在某企业域前台可见;用户说「把 XX 软件绑到企业域」;前台看不到软件且角色/activated 已齐。

不用:生成 .application / .role(用对应 generate-*);创建用户(用 create-user);改业务表 TLK_*;走管理端/REST 绑定(本技能只写库)。


门禁(写库前必须齐)

缺一则询问,禁止猜测后直接 UPDATE:

  1. 软件 .application 绝对路径(用来读根属性 id,并给 clear_cache 用)
  2. 企业域(名称或 id)。仅 1 个域时可默认该域;0 行 / 多行 → 问用户
  3. 系统库连接:按「定位系统库」;无法唯一确定时必须问用户(JDBC URL 或 host/port/库名/账号/密码)

可选:--unbind 从列表移除该软件 id;--no-desk 仅当用户明确要求不要绑工作台时才用(默认必须绑)。


定位系统库(禁止用应用 .datasource)

域表由 平台全局库 管理,对应正在跑的 Java Spring Boot 服务(常见 obpm-lite 8888)。系统数据源即 obpm_lite 库(spring.datasource.url 里的库名)。**不要**打开 {软件}.application/datasource/*.datasource 当作域库——那是业务库。

按序尝试(与 create-user 相同):

  1. 用户已给出 JDBC / host+port+库名+账号
  2. 正在使用的服务配置:obpm-lite → obpm-lite/src/main/resources/application.properties 的 spring.datasource.url;微服务则看 usercenter(或 runtime)对应 application.properties
  3. 环境变量:DB_HOST、DB_PORT、DB_USERNAME、DB_PASSWORD(缺省常见 localhost / 3307 / root / Teemlink2010,仅作候选,须能连上并验表)

Lite 样例(仓库默认,部署可能不同):

jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3307}/obpm_lite?...
spring.datasource.username=${DB_USERNAME:root}
spring.datasource.password=${DB_PASSWORD:Teemlink2010}

验库(必须先跑,失败即连错库):

SHOW TABLES LIKE 'T_DOMAIN';
SHOW COLUMNS FROM T_DOMAIN LIKE 'BIND_APPLICATIONS';
SHOW TABLES LIKE 'T_USER';
SHOW TABLES LIKE 'T_ACCOUNT';

T_DOMAIN + BIND_APPLICATIONS 都在 → 系统库。只有 TLK_* / 没有 T_DOMAIN → 应用库,停手。候选连接 ≥2 条且验库都过、或一条都不过 → 问用户。


解析软件 id / 域

软件 id(workspace,不是库表)

读 {软件}.application/{软件名}.application 根属性 id。禁止把目录名、<name> 写入 bind_applications。

企业域(系统库)

SELECT ID, NAME, BIND_APPLICATIONS
FROM T_DOMAIN
WHERE NAME = '{域名}' OR ID = '{域名或id}';

0 行 / 多行 → 问用户。不要自动建域。

未给域时:SELECT ID, NAME FROM T_DOMAIN —— 仅 1 行可用;否则列出让用户选。


BIND_APPLICATIONS 格式

列类型 MEDIUMTEXT,存 JSON 数组字符串(管理端排序接口原样写入):

["__JVEhjq5aTh0000bPTzG","__TcboMScMPR4UuIbksem","KMAPPID"]
规则 说明
元素 软件根属性 id,不是 name
编码 json.dumps(ids, ensure_ascii=True, separators=(',', ':'))(无空格,与库内存量一致)
空 NULL / '' / '[]' 都视为空列表
兼容读 若不是 JSON 数组(历史逗号分隔),按逗号拆成 id 列表再写回 JSON 数组
去重 同一 id 只保留第一次出现的位置
顺序 已有顺序不变;新 id 追加到末尾(前台按此顺序展示)

写库约定

绑定(默认,事务内)

  1. SELECT ID, NAME, BIND_APPLICATIONS FROM T_DOMAIN WHERE ID = '{domainId}' FOR UPDATE
  2. 解析现有列表 → 追加业务 appId(已在则跳过)→ 追加工作台 appId(已在则跳过)
  3. 写回:
UPDATE T_DOMAIN
SET BIND_APPLICATIONS = '{jsonArray}'
WHERE ID = '{domainId}';

解绑(仅 --unbind)

只从列表去掉**业务** appId。工作台 id 默认保留(除非用户明确要求连工作台一起解绑)。

不要 UPDATE … SET BIND_APPLICATIONS = '["{仅本次id}"]' 覆盖整列。


Agent 步骤(按序)

1. 收齐门禁三项;缺则问
2. 定位并验系统库 obpm_lite;不确定则问(禁止用 .datasource)
3. 解析业务 appId;再解析 desk.application → deskAppId
4. 解析 domainId(名/id;唯一域可默认)
5. 事务读取 BIND_APPLICATIONS,merge 追加(或 --unbind 移除业务 id)后 UPDATE
6. 向用户摘要:域名/id、业务 appId、工作台 appId、绑定后完整 id 列表、追加还是本已存在
7. REQUIRED:对业务软件与 desk.application 都执行
   python "<rebuild-index>/scripts/clear_cache.py" "<软件.application绝对路径>"
   只清缓存即可(未改模板 XML,不必 rebuild pid.index)。按 .done/.failed 判定
8. 失败(.failed / 超时)必须警告;成功才可声称完成

clear_cache 会按 applicationId 清设计时对象缓存,并做附属全局清理(含 MyCache / 域绑定等)。监视进程须为 Runtime / Manager / Job;Designer 不处理 .sync/。


校验与常见错误

问题 处理
连的是应用库 验表失败;改用 Spring spring.datasource → obpm_lite,或问用户
写入软件 name 而非 id 前台仍不可见;必须用 .application 根属性 id
整列覆盖成单个 id 域上其它软件从列表消失;只 merge
未绑工作台 无「发起新建 / 我的待办」;补 desk.application 的 id
跳过 clear_cache 运行时仍用旧域绑定缓存
只绑域、不给用户角色 非系统软件仍不可见;再用 create-user
软件 activated=false 即使绑定也不进前台列表;改 .application
自动 INSERT 新域 禁止;先问用户

与其它技能边界

内容 本文 其它
系统库 t_domain.bind_applications ✓
系统库用户/部门角色 create-user
.application 文件、activated generate-application-file
.role 文件 generate-role-file
应用 .datasource / TLK_ 禁止当作域库 generate-datasource-file
写库后清缓存 必做,调用 clear_cache rebuild-index