# 报表取数范围控制与权限配置

金蝶云星空报表"发布后看不见数据"或"看到不该看的数据"，90% 是权限/取数范围问题。本文件覆盖直接SQL账表的权限体系。

## 三层权限模型

| 层级 | 控制内容 | 配置位置 |
|---|---|---|
| 功能权限 | 用户能否看到报表功能、打开报表 | 系统管理 → 角色/用户 → 功能授权 |
| 数据权限 | 用户能看到哪些组织/范围的数据 | 数据权限规则（按组织、按角色） |
| 字段权限 | 用户能否看到某些列 | 字段授权 |

## 一、功能权限（看不到报表的元凶）

**症状**：报表已发布，但用户登录后在报表列表中找不到，或打开提示无权限。

**解决**：
1. 系统管理 → 角色管理（或用户管理）→ 找到目标用户/角色
2. 功能权限 → 定位到账表所在的功能树节点
3. 勾选该账表功能（含查询、导出等子功能）
4. 保存并重新登录生效

**要点**：
- 账表发布后必须分配功能权限，这是最常见遗漏
- 超级管理员/系统管理员默认可见，普通用户需显式授权
- 分配了"查询"权限但没分配"导出"权限时，导出按钮不可见

## 二、数据权限（取数范围控制）

直接SQL账表的取数范围控制有三种实现方式：

### 方式 1：账表参数按组织过滤（推荐）
在账表设计中增加"组织"过滤参数，SQL 中引用：

```
-- 账表过滤参数：@FCreateOrgId（组织参数，多选）
SELECT ...
FROM T_SAL_SALEORDER o
WHERE o.FCreateOrgId IN (@FCreateOrgId)
```

用户查询时选择组织范围，未选组织则需在参数默认值中处理（如默认当前组织）。

### 方式 2：SQL 中按组织字段过滤
报表 SQL 本身带上组织条件：

```
WHERE o.FCreateOrgId = (当前用户业务组织)
```

注意：直接SQL账表的 SQL 是静态的，若需动态取当前用户组织，通常通过参数传递或插件实现。

### 方式 3：数据权限规则（平台级）
金蝶云星空支持数据权限规则（按组织授权）：
1. 系统管理 → 数据权限规则 → 新建规则
2. 选择业务对象（账表）、授权维度（组织）、授权方式（允许/拒绝）
3. 指定角色/用户与可见组织范围

数据权限规则对直接SQL账表的作用受限于实现：**直接SQL账表的取数范围主要靠账表参数与 SQL 自身控制**，平台数据权限规则对直接SQL账表不一定完全生效（动态视图、直接SQL场景需单独处理），务必实测验证。

## 三、字段授权（列可见性）

**场景**：某些列（如成本、毛利）只允许部分用户查看。

**实现**：
1. 账表设计器 → 字段授权设置
2. 配置字段级授权规则：哪些角色可见哪些列
3. 或在数据集/字段层面设置"授权字段"

**替代方案**：同一报表做两版（含敏感字段/不含），按角色分配不同功能。

## 四、权限相关常用表与字段

| 表/字段 | 用途 |
|---|---|
| FCreateOrgId | 创建组织（单据归属组织） |
| FUseOrgId | 使用组织（业务发生组织） |
| FDocumentStatus | 单据状态：A=审核通过、B=暂存、C=已关闭等 |
| FForbidStatus | 禁用状态（基础资料） |
| T_SEC_USER / T_SEC_USERROLE | 用户/用户角色关系 |
| T_SEC_ROLE / T_SEC_PERMISSION | 角色/权限 |
| T_ORG_ORGANIZATIONS | 组织表（FID、FNUMBER、FNAME） |

组织过滤 SQL 参考：

```
-- 按创建组织过滤（含组织层级需递归，见下文）
WHERE o.FCreateOrgId = @OrgId
```

## 五、组织层级与父子组织取数

金蝶组织是多层级树（集团 → 公司 → 部门），需要"含下级组织"取数时：

```
-- 方式：使用组织视图/递归
-- 简单场景：查组织表获取下级组织集合
SELECT FID FROM T_ORG_ORGANIZATIONS WHERE FPARENTID = @OrgId
```

更稳妥的做法：
- 通过账表参数"组织"（支持多选 + 含下级）由平台自动处理
- 或使用金蝶提供的组织查询函数/视图（具体以版本为准，需实测）

## 六、排查清单（数据范围问题）

- [ ] 用户有功能权限吗？（看不到报表）
- [ ] 过滤参数选了组织吗？（空数据显示）
- [ ] SQL 有组织过滤吗？（跨组织串数据）
- [ ] 单据状态过滤对吗？（未审核数据也显示）
- [ ] 参数默认值合理吗？（默认空 = 查不到）
- [ ] 是否误用 SELECT * 导致大表全扫？（性能）
