安全与风控
Salesforce OmniStudio…
当需要摸清一个 Salesforce 组织里 OmniStudio 组件(OmniScript、FlexCard、Integration Procedure、Data Mapper)之间的依赖关系、判断改动影响范围、或生成依赖图时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
Salesforce OmniStudi特定
解决思路
- 先做命名空间检测:按顺序探测对象,第一个 COUNT() 成功返回的即为该组织使用的命名空间。Core(Industries)用 `SELECT COUNT() FROM OmniProcess`;vlocity_cmt(通信媒体能源)用 `SELECT COUNT() FROM vlocity_cmt__OmniScript__c`;vlocity_ins(保险健康)用 `SELECT COUNT() FROM vlocity_ins__OmniScript__c`。若都失败则说明未安装 OmniStudio。CLI 示例:`sf data query --query "SELECT COUNT() FROM OmniProcess" --target-org myorg --json 2>/dev/null`,成功(退出码 0 且 JSON 含 totalSize)即确认;报 INVALID_TYPE 或对象不存在即该命名空间不存在。
- 按检测到的命名空间做组件清单:OmniScript 查询 `SELECT Id, Type, SubType, Language, IsActive, VersionNumber, PropertySetConfig, LastModifiedDate FROM OmniProcess WHERE IsIntegrationProcedure = false ORDER BY Type, SubType, Language, VersionNumber DESC`;Integration Procedure 同样查询但 `WHERE IsIntegrationProcedure = true`;FlexCard 查询 `SELECT Id, Name, IsActive, DataSourceConfig, PropertySetConfig, AuthorName, LastModifiedDate FROM OmniUiCard ORDER BY Name`;Data Mapper 查询 `SELECT Id, Name, IsActive, Type, LastModifiedDate FROM OmniDataTransform ORDER BY Name`;Data Mapper 明细查询 `SELECT Id, OmniDataTransformationId, InputObjectName, OutputObjectName, InputObjectQuerySequence FROM OmniDataTransformItem WHERE OmniDataTransformationId IN ({datamapper_ids})`。
- 注意 FlexCard 的 `OmniUiCard` 对象没有 `Definition` 字段:数据源绑定看 `DataSourceConfig`,卡片布局/状态看 `PropertySetConfig`。
- 注意 Data Mapper 明细的外键字段是 `OmniDataTransformationId`(完整拼写 Transformation),不是 `OmniDataTransformId`。
- 用 BFS 构建有向依赖图并检测循环引用:初始化空图 G 和已访问集合 V;对每个根组件 C 入队 Q;当 Q 非空时出队 X,若 X 已在 V 中则记录循环引用并跳过,否则加入 V,解析 X 的元数据找出依赖 D,为每条依赖在 G 中加边 X→D,若 D 不在 V 中则入队 D;最后返回图 G 和检测到的循环引用。
- 从 OmniScript/IP 元素的 `PropertySetConfig` JSON 字段按元素类型提取依赖:DataRaptor Transform Action 取 `bundle`/`bundleName` 指向 Data Mapper;DataRaptor Turbo Action 同上;Remote Action 取 `remoteClass`/`remoteMethod` 指向 Apex 类.方法;Integration Procedure Action 取 `integrationProcedureKey` 指向 IP(Type_SubType);OmniScript Action 取 `omniScriptKey` 或 `Type/SubType` 指向 OmniScript;HTTP Action 取 `httpUrl`/`httpMethod` 指向外部端点;DocuSign Envelope Action 取 `docuSignTemplateId` 指向 DocuSign 模板;Apex Remote Action 取 `remoteClass` 指向 Apex 类。解析流程:读取 PropertySetConfig 字符串→解析 JSON→按元素 Type 查表→提取被引用组件名/键→解析为 OmniProcess/OmniDataTransform 记录→加边 父组件→被引用组件。
- 解析 FlexCard 数据源:读取 `DataSourceConfig` JSON(不是 `Definition`),访问单数 `dataSource` 对象;对 `type === 'IntegrationProcedures'`(注意是复数、大写 P)的项,取 `dataSource.value.ipMethod`(IP 的 Type_SubType)加边 FlexCard→Integration Procedure;对 `type === 'ApexRemote'` 的项取 `dataSource.value.className` 加边 FlexCard→Apex 类;对 childCard 引用解析 `PropertySet# 注意:原文此处为 PropertySetConfig,保留原意
- 解析 Data Mapper 的对象依赖:遍历每个 OmniDataTransformItem,读 `InputObjectName` 作为源 sObject、`OutputObjectName` 作为目标 sObject,分别加边 Data Mapper→sObject(读)和 Data Mapper→sObject(写)。
- 生成 Mermaid 依赖图:用 `graph LR` 加 subgraph 按组件类型分组,节点标签写「名称<br/>语言 v版本」,边上标注依赖类型(如 IP Action、DR Action、Data Source)。配色方案:OmniScript 填充 #dbeafe 描边 #1d4ed8;Integration Procedure 填充 #fef3c7 描边 #b45309;Data Mapper 填充 #d1fae5 描边 #047857;FlexCard 填充 #fce7f3 描边 #be185d;Apex 类填充 #e9d5ff 描边 #7c3aed;外部 HTTP 填充 #f1f5f9 描边 #475569。
- 生成 JSON 摘要输出:包含 namespace、各类型组件数量、dependencies 数组(from/to/type)、circularReferences 数组,以及 impactAnalysis(每个组件列出 directDependents 和 transitiveDependents)。
- 生成人类可读报告:列出组织命名空间、扫描日期、组件清单(各类型总数及 active/draft 数)、依赖汇总(总边数、循环引用数、孤立组件数)、影响分析(被依赖最多的组件排名)。
- 按命名空间映射对象与字段:主对象 Core 用 OmniProcess/OmniProcessElement/OmniUiCard/OmniDataTransform/OmniDataTransformItem,vlocity_cmt 用 vlocity_cmt__OmniScript__c/vlocity_cmt__Element__c/vlocity_cmt__VlocityUITemplate__c/vlocity_cmt__DRBundle__c/vlocity_cmt__DRMapItem__c,vlocity_ins 用对应 vlocity_ins__ 前缀对象。关键字段:Type/SubType/Language/IsActive/VersionNumber/PropertySetConfig/IsIntegrationProcedure 在 Core 为无前缀字段,在 vlocity_cmt 为 vlocity_cmt__Type__c 等,在 vlocity_ins 为 vlocity_ins__Type__c 等;FlexCard 数据源 Core 为 DataSourceConfig,vlocity_cmt/ins 为 __Definition__c;DM 输入对象 Core 为 InputObjectName,vlocity_cmt 为 vlocity_cmt__InterfaceObject__c,vlocity_ins 为 vlocity_ins__InterfaceObject__c;DM 输出对象 Core 为 OutputObjectName,vlocity_cmt 为 vlocity_cmt__TargetFieldObjectType__c,vlocity_ins 为 vlocity_ins__TargetFieldObjectType__c。
- 用 CLI 提取依赖数据:`sf data query --query "SELECT Id, OmniProcessId, Name, Type, PropertySetConfig FROM OmniProcessElement WHERE OmniProcessId = '{process_id}'" --target-org myorg --json`;`sf data query --query "SELECT Id, Name, DataSourceConfig FROM OmniUiCard WHERE IsActive = true" --target-org myorg --json`;`sf data query --query "SELECT Id, OmniDataTransformationId, InputObjectName, OutputObjectName FROM OmniDataTransformItem" --target-org myorg --json`。
- 处理边界情况:混合命名空间(迁移中)要探测全部三个并报告多个结果;非活跃组件仍纳入依赖图但标记为 inactive,若活跃组件依赖非活跃组件要告警;大组织(1000+ 组件)用 SOQL 分页(LIMIT/OFFSET 或 queryMore),每批 200 条;PropertySetConfig 超出 SOQL 字段长度时用 Tooling API 或 REST API 取完整 JSON;检测到循环依赖时记录循环路径(A→B→C→A)并标记所有参与边,继续遍历其余分支;引用已删除项记为 broken reference 并标记待清理;多活跃版本冲突时只有最高活跃版本参与运行时,若低版本有独有依赖要告警。
- 注意 `OmniProcess` 用布尔字段 `IsIntegrationProcedure` 区分 IP 与 OmniScript,不存在 `TypeCategory` 字段;`OmniProcessType` 是由该布尔计算出的 picklist,可用于过滤读取但不能在创建时直接设置。
- 注意 `sf data create record` 的 `--values` 标志无法处理 textarea 字段中的 JSON 字符串(如 PropertySetConfig),需改用 `sf api request rest --method POST --body @file.json`。
适用边界 · 注意事项
- 仅需编写/创建 OmniScript、FlexCard、Integration Procedure 或 Data Mapper 时不要用本技能,应分别使用对应的编写技能。
- 组织未安装 OmniStudio(三个命名空间探测均失败)时本技能不适用。
- 需要 org 认证的 sf CLI 环境;无 CLI 或未认证时无法执行查询。