企业域绑定软件(写系统库 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:
- 软件
.application绝对路径(用来读根属性id,并给clear_cache用) - 企业域(名称或 id)。仅 1 个域时可默认该域;0 行 / 多行 → 问用户
- 系统库连接:按「定位系统库」;无法唯一确定时必须问用户(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 相同):
- 用户已给出 JDBC / host+port+库名+账号
- 正在使用的服务配置:
obpm-lite→obpm-lite/src/main/resources/application.properties的spring.datasource.url;微服务则看 usercenter(或 runtime)对应application.properties - 环境变量:
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。
企业域(系统库)¶
0 行 / 多行 → 问用户。不要自动建域。
未给域时:SELECT ID, NAME FROM T_DOMAIN —— 仅 1 行可用;否则列出让用户选。
BIND_APPLICATIONS 格式¶
列类型 MEDIUMTEXT,存 JSON 数组字符串(管理端排序接口原样写入):
| 规则 | 说明 |
|---|---|
| 元素 | 软件根属性 id,不是 name |
| 编码 | json.dumps(ids, ensure_ascii=True, separators=(',', ':'))(无空格,与库内存量一致) |
| 空 | NULL / '' / '[]' 都视为空列表 |
| 兼容读 | 若不是 JSON 数组(历史逗号分隔),按逗号拆成 id 列表再写回 JSON 数组 |
| 去重 | 同一 id 只保留第一次出现的位置 |
| 顺序 | 已有顺序不变;新 id 追加到末尾(前台按此顺序展示) |
写库约定¶
绑定(默认,事务内)¶
SELECT ID, NAME, BIND_APPLICATIONS FROM T_DOMAIN WHERE ID = '{domainId}' FOR UPDATE- 解析现有列表 → 追加业务 appId(已在则跳过)→ 追加工作台 appId(已在则跳过)
- 写回:
解绑(仅 --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 |