当前位置: 首页 > news >正文

Teaamcenter Home Tree 版本对象展开下级 — 技术方案 - 张永全

# Home Tree 版本对象展开下级 — 技术方案

## 问题描述

在 Active Workspace Client (AWC) 的 Home Tree(左侧对象导航树)中,当树节点为**版本对象**(如 `ItemRevision`、`Item` 等 `WorkspaceObject` 子类型)时,节点显示为叶子节点,无法展开加载下级数据。

## 根因分析

### 数据流

```
用户展开树节点
    ↓
_buildTreeTableStructure()     [objectNavigationTreeService.js]
    ↓
getTableSummary()              [objectNavigationTreeService.js]
    ↓
performSearchViewModel5        [SOA 调用, 携带 policyIOverride]
    ↓ 返回结果
createVMNodeUsingObjectInfo()  [objectNavigationTreeService.js]
    ↓
containChildren(obj.props)     [判断是否有子节点]
    ↓
vmNode.isLeaf = !hasChildren   [决定是否可展开]
```

### 关键代码位置

| 文件 | 行号 | 职责 |
|---|---|---|
| `src/repo/tc-aw-framework/src/assets/js/objectNavigationTreeService.js` | 31–44 | `policyIOverride` — SOA 查询策略定义 |
| same file | 560–583 | `createVMNodeUsingObjectInfo` — 创建树节点对象 |
| same file | 614–629 | `containChildren` — 判断节点是否有子节点 |
| same file | 675–694 | `_buildTreeTableStructure` — 构建树结构(发起 SOA 调用) |

### 根因

**SOA 查询策略 `policyIOverride` 只对 `Folder` 类型请求了 `awp0HasChildren` 属性**,导致版本对象(`ItemRevision` 等非 Folder 类型)的响应中不含 `awp0HasChildren`。

`containChildren()` 检查 `props.awp0HasChildren.dbValues[0] === '1'`,由于该属性不存在,返回 `false`,节点被标记为 `isLeaf: true`,无法展开。

```javascript
// BUG: policyIOverride 只对 Folder 请求 awp0HasChildren
var policyIOverride = {
    types: [ {
        name: 'WorkspaceObject',
        properties: [ {
            name: 'object_name'           // ← 只请求了名称
        } ]
    }, {
        name: 'Folder',
        properties: [ {
            name: 'awp0HasChildren'       // ← 只有文件夹才请求
        } ]
    } ]
};
```

## 解决方案

### 方案一:Policy 修正(核心修复)✅ 已实施

在 `WorkspaceObject` 类型的属性列表中添加 `awp0HasChildren`。所有版本类型(`ItemRevision`、`Item` 等)均继承自 `WorkspaceObject`,SOA 策略引擎会根据类型层级下发该属性。

**修改文件**:`src/repo/tc-aw-framework/src/assets/js/objectNavigationTreeService.js`

**修改内容**(第 31–44 行):

```diff
 var policyIOverride = {
     types: [ {
         name: 'WorkspaceObject',
         properties: [ {
             name: 'object_name'
+        }, {
+            name: 'awp0HasChildren'
         } ]
     }, {
         name: 'Folder',
         properties: [ {
             name: 'awp0HasChildren'
         } ]
     } ]
 };
```

### 方案二:代码级别增强(已在代码中存在,无需额外操作)

当前 `containChildren` 函数已经包含了基于类型层级的回退判断逻辑:

```javascript
function containChildren( props, modelType ) {
    // 首选:通过 awp0HasChildren 属性判断
    if( props && props.awp0HasChildren && props.awp0HasChildren.dbValues[ 0 ] === '1' ) {
        return true;
    }
    // 回退方案:通过类型层级判断(版本对象也可展开)
    if( modelType && modelType.typeHierarchyArray ) {
        var typeHierarchy = modelType.typeHierarchyArray;
        if( typeHierarchy.indexOf( 'Folder' ) === -1 &&
            ( typeHierarchy.indexOf( 'ItemRevision' ) > -1 || typeHierarchy.indexOf( 'Item' ) > -1 ) ) {
            return true;
        }
    }
    return false;
}
```

调用处也已更新(第 564 行):
```javascript
var hasChildren = containChildren( obj.props, obj.modelType );
// 之前:containChildren( obj.props )
```

此回退逻辑作为 Policy 方案的补充,在服务器端未正确返回 `awp0HasChildren` 时仍能基于类型信息判断。

## 涉及的修改汇总

| 修改类型 | 文件 | 行号 | 状态 |
|---|---|---|---|
| 🔧 Policy 修正 | `src/repo/tc-aw-framework/src/assets/js/objectNavigationTreeService.js` | 35–36 插入 | ✅ 已实施 |
| ✅ 代码增强(已有) | 同上 | 614–629 `containChildren` | 已存在 |
| ✅ 调用处更新(已有) | 同上 | 564 `containChildren(obj.props, obj.modelType)` | 已存在 |

## 影响范围

| 范围 | 说明 |
|---|---|
| Home Tree(对象导航树) | 所有 `WorkspaceObject` 子类型的节点均可正常展开/折叠 |
| Folder 类型节点 | 不受影响,`awp0HasChildren` 策略仍然存在且优先 |
| 其他树组件 | Schedule 树、Plan 树、Organization 树各有自己的 `policyIOverride`,不在此次修改范围内(如需类似修复需单独评估) |
| VMAX 自定义模块 | 未覆盖此逻辑,直接复用框架层策略 |

## 验证方式

1. 部署修改后的代码
2. 打开 AWC Home 页面
3. 在左侧导航树中导航到版本对象(`ItemRevision`)节点
4. 确认节点旁出现展开/折叠图标
5. 点击展开,确认下级数据正常加载
6. 确认 Folder 类型节点的展开行为无异常

## 相关文件索引

| 文件 | 说明 |
|---|---|
| `src/repo/tc-aw-framework/src/assets/js/objectNavigationTreeService.js` | **核心修改文件** — Home Tree 的树服务,包含 Policy、节点创建、子节点判断 |
| `src/repo/tc-aw-framework/src/assets/js/objectNavigationService.js` | 对象导航服务 — 搜索上下文管理、选择跟踪、状态管理 |
| `src/repo/tc-aw-framework/src/assets/viewmodel/AwStandardObjectNavigationTreeViewModel.json` | Home Tree ViewModel — 数据提供器、事件处理、生命周期 |
| `src/repo/tc-aw-framework/src/assets/html/AwStandardObjectNavigationTreeView.html` | Home Tree 视图模板 |
| `src/repo/tc-aw-framework/src/assets/js/AwGatewayLocationService.js` | Gateway(Home 页)初始化服务 |
| `src/repo/tc-aw-framework/states.json` | 状态定义 — `showHome` 等路由配置 |
| `src/repo/tc-aw-framework/hosting.json` | Hosting 配置 — 组件位置等 |
http://www.zskr.cn/news/1456383.html

相关文章:

  • MATLAB 2022a实战:用A*和DWA算法给你的机器人做个“全局导航+实时避障”系统
  • 深入解析h2o-danube2-1.8b-sft架构:基于Mistral的1.8B参数模型设计终极指南 [特殊字符]
  • 实践应用:Spring Boot项目集成Mybatis-Plus
  • 2026年天津离婚律师怎么挑选?关键5个要点避免踩雷 - 本地品牌推荐
  • 性价比优先!盘点平价好用的国产 AI 写作网站,应届学生党收藏
  • 北京沙发翻新换皮换布2026年本地靠谱推荐——匠阁、御匠、锦修三大品牌详解,服务区域覆盖北京各区,专业沙发翻新换皮换布一站式解决方案 - 我叫一
  • HS2-HF_Patch:Honey Select 2汉化优化补丁的终极解决方案
  • WSL2图形化桌面避坑实录:解决Gnome仅Root可用、VcXsrv连接失败与CUDA驱动冲突
  • 2026广州GEO优化公司怎么选?实测五家服务商,这份选型指南帮你避坑 - GEO优化
  • 终极解决方案:3分钟搞定Windows热键冲突检测
  • 自动点赞成功
  • ThinkPad风扇控制终极指南:用TPFanCtrl2释放你的笔记本潜能
  • 解锁免疫失衡核心密码,Luminex检测多因子全面解析Th细胞亚群调控,武汉云克隆多因子助力免疫疾病研究攻坚
  • 塔机障碍物远距离超声测距方法与识别机理解析方案【附仿真】
  • 如何将手机摄像头变成专业直播设备:DroidCam OBS插件完整教程
  • semi-utils:重构摄影工作流的智能批量水印终极指南
  • 如何快速上手Hy-MT2-1.8B:5分钟部署你的第一个翻译AI
  • RAG技术方案选型:向量索引的数据结构与量化压缩
  • 2026年实测10款降AI率软件推荐:免费与付费全对比,顺利通过AI率检测必看 - 降AI小能手
  • 免疫炎症因子组合(BLC1,CXCL2,IFNg,IL12,IL18,IL6,MIP3b,RANTES,SLC,TNFa),武汉云克隆Luminex多因子方案引领高通量检测新时代
  • Hermes WebUI边缘计算:在边缘设备上部署的完整方案
  • 毕业定稿撞枪口,Turnitin大面积标蓝怎么办?实测5款英文降AIGC神器
  • LLaVA多模态模型完全解析:从视觉语言理解到革命性聊天能力
  • 【绝密架构图解】:头部元宇宙公司正在封存的AI-VR双闭环系统(含ROS2+Unreal Engine 5.3双向语义桥接层源码片段)
  • 每日一个开源项目(第120篇):SkillLens - 微软出品,照亮 AI Agent 技能生命周期的“显微镜”
  • imFile下载管理器:终极架构解析与高效工作流优化指南
  • Agent 系列(11):A2A 协议——Agent 与 Agent 如何协作
  • 2026年6月干线物流自动驾驶「车·路·运·能」一体化综合实力测评
  • 基于LattePanda的DIY Windows 10平板:从硬件选型到3D打印外壳全流程
  • 终极指南:如何快速解锁Cursor AI编程工具试用限制