# SzDistribute 分发方案组件 使用说明
## 组件概述
SzDistribute 是一个公文分发方案组件,支持按部门(主办/协办/阅文)和人员(办文/阅文)进行分发配置,并提供方案保存/加载功能。
基于 JeecgBoot 3.8.0 + Vue 3 + TypeScript 开发。
---
## 文件结构
```
distributeComponent/
├── SzDistribute.vue # 主入口组件(分发方案弹窗)
├── SzSelectDepart.vue # 部门选择组件(树形多选 + 办/协/阅标记)
├── SzSelectUser.vue # 人员选择组件(部门树 + 人员表格)
├── SzSelectedDepartsAndUsers.vue # 已选部门和人员展示组件
├── SzDistribute.api.ts # 方案增删改查 API
├── types.ts # TypeScript 类型定义
├── utils.ts # 工具函数
└── USAGE.md # 本文件
```
---
## 快速开始
### 基础用法
```vue
```
---
## SzDistribute 主组件 API
### Props(输入)
| 属性 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `secLevel` | `Number` | 是 | - | 文件密级。1=非密, 2=内部, 3=秘密, 4=机密 |
| `role` | `Number \| String` | 是 | `1` | 当前用户角色。1=领导, 2=部门负责人 |
| `departId` | `String` | 是 | `''` | 当前用户部门ID。支持 orgCode(如 `"A01"`)或 UUID 格式,组件内部自动转换 |
| `docId` | `String` | 否 | `''` | 公文ID。传入后自动排除该公文已分发的部门 |
| `isSpecial` | `Number` | 否 | `0` | 是否特殊分发。0=否, 1=是 |
| `title` | `String` | 否 | `'分发方案'` | 弹窗标题(会自动追加密级文字) |
| `width` | `Number \| String` | 否 | `1500` | 弹窗宽度(px) |
| `showButton` | `Boolean` | 否 | `true` | 是否显示"分发对象"触发按钮。设为 `false` 时需通过 ref 调用 `showModal()` |
### v-model(双向绑定)
| 属性 | 类型 | 说明 |
|------|------|------|
| `checkedMainDepartIds` | `String` | 主办部门ID列表,逗号分隔,如 `"id1,id2,id3"` |
| `checkedAssistDepartIds` | `String` | 协办部门ID列表,逗号分隔 |
| `checkedReadDepartIds` | `String` | 阅文部门ID列表,逗号分隔 |
| `checkedUsernames` | `String` | 办文人员用户名列表,逗号分隔,如 `"zhangsan,lisi"` |
| `checkedReadUsernames` | `String` | 阅文人员用户名列表,逗号分隔 |
| `reasons` | `String` | 分发意见/备注文本 |
| `modelValue` | `String` | 完整分发数据字符串(内部格式) |
### Events(事件)
| 事件 | 参数 | 说明 |
|------|------|------|
| `change` | `distributeStr: string` | 分发方案确认时触发 |
| `update:checkedDepartIds` | `ids: string` | 所有已选部门ID(逗号分隔) |
| `update:checkedDeparts` | `DepartTreeNode[]` | 所有已选部门节点对象数组 |
### Methods(通过 ref 调用)
```typescript
const distributeRef = ref();
// 手动打开分发弹窗
distributeRef.value.showModal();
```
---
## 角色权限说明
### 领导(role=1)
- 部门选择 Tab:显示全部部门树,可自由选择主办/协办/阅文
- 办文人员 Tab:显示全部部门树,选择部门后加载该部门人员
- 阅文人员 Tab:同办文人员
- 默认激活 Tab:选择部门
### 部门负责人(role=2)
- 部门选择 Tab:根据当前部门的类型(职能/业务/科室)显示可见部门
- 办文人员 Tab:只显示本部门及下级部门的人员
- 阅文人员 Tab:同办文人员
- 默认激活 Tab:选择阅文人员(因部门负责人通常负责阅文分发)
---
## 子组件说明
### SzSelectDepart — 部门选择
树形结构展示部门,每个选中的部门可标记为「办」「协」「阅」三种类型。
**Props:**
| 属性 | 类型 | 说明 |
|------|------|------|
| `selectedMainDeparts` | `DepartTreeNode[]` | 当前主办部门列表 |
| `selectedAssistDeparts` | `DepartTreeNode[]` | 当前协办部门列表 |
| `selectedReadDeparts` | `DepartTreeNode[]` | 当前阅文部门列表 |
| `excludeDeparts` | `string[]` | 需排除的部门ID列表 |
| `departId` | `string` | 当前用户部门ID |
| `role` | `string \| number` | 用户角色 |
**Events:** `update:selectedMainDeparts`, `update:selectedAssistDeparts`, `update:selectedReadDeparts`
**快捷操作:**
- 全选部门 / 全选职能部门 / 全选业务部门 / 全选本部门科室
- 每种全选可指定办/协/阅类型
- 右键节点文字可快速切换选中状态
### SzSelectUser — 人员选择
左侧部门树 + 右侧人员表格,支持搜索、分页、全选。
**Props:**
| 属性 | 类型 | 说明 |
|------|------|------|
| `secLevel` | `any` | 文件密级,用于过滤人员(只显示密级 > 文件密级的人员) |
| `checkedUser` | `UserItem[]` | 已选中的人员列表 |
| `selectedDepId` | `string` | 当前选中的部门ID |
| `departId` | `string` | 当前用户部门ID(支持 orgCode 或 UUID) |
| `role` | `string \| number` | 用户角色 |
| `isSpecial` | `number` | 是否特殊分发 |
| `multi` | `boolean` | 是否多选(默认 `true`) |
**v-model:** `selectedDepId` — 当前选中部门
**Events:** `update:checkedUser`, `update:selectedDepId`
**密级过滤规则:** 只显示 `人员密级 > 文件密级` 的人员。例如文件密级为 3(秘密),则只显示密级为 4(机密)的人员。
### SzSelectedDepartsAndUsers — 已选展示
以标签形式展示已选择的部门和人员,支持删除和办/协/阅类型切换。
**Props:**
| 属性 | 类型 | 说明 |
|------|------|------|
| `disabled` | `boolean` | 是否禁用操作(默认 `false`) |
| `selectedMainDeparts` | `DepartTreeNode[]` | 主办部门 |
| `selectedAssistDeparts` | `DepartTreeNode[]` | 协办部门 |
| `selectedReadDeparts` | `DepartTreeNode[]` | 阅文部门 |
| `selectedUsers` | `UserItem[]` | 办文人员 |
| `selectedReadUsers` | `UserItem[]` | 阅文人员 |
**Events:** `update:selectedMainDeparts`, `update:selectedAssistDeparts`, `update:selectedReadDeparts`, `update:selectedUsers`, `update:selectedReadUsers`
---
## 类型定义
### DepartTreeNode
```typescript
interface DepartTreeNode {
id: string; // 部门 UUID
key: string; // 树节点 key(等于 id)
value: string; // 树节点 value(等于 id)
title: string; // 部门名称
isLeaf?: boolean; // 是否叶子节点
departType?: string | number; // 部门类型:0=根, 1=职能, 2=业务, 3=科室
distributable?: number; // 是否可分发:1=是
disableCheckbox?: boolean; // 是否禁用选择
assignType?: number; // 分配类型:1=办, 2=协, 3=阅
children?: DepartTreeNode[]; // 子部门
description?: string; // 部门描述
parentId?: string; // 父部门ID
orgCode?: string; // 部门编码(如 "A01", "A03A02")
}
```
### UserItem
```typescript
interface UserItem {
id: string;
username: string;
realname: string;
orgCodeTxt?: string; // 所属部门名称
userSecurityLevel?: number; // 人员密级数值
userSecurityLevel_dictText?: string; // 人员密级文字
sex_dictText?: string; // 性别
sortno?: number; // 排序号
departId?: string;
departName?: string;
assignType?: number; // 分配类型:1=办, 3=阅
}
```
---
## departId 说明
`departId` 属性支持两种格式,组件内部会自动识别并转换:
| 格式 | 示例 | 说明 |
|------|------|------|
| orgCode | `"A01"`, `"A03A02"` | 部门编码,通常来自 `userInfo.orgCode` |
| UUID | `"f4d5979edc1d4785ba2322f0b8200a21"` | 部门唯一标识 |
推荐从 `useUserStore().getUserInfo.orgCode` 获取:
```typescript
import { useUserStore } from '/@/store/modules/user';
const userStore = useUserStore();
const departId = userStore.getUserInfo?.orgCode || '';
```
---
## 方案管理
组件内置方案保存/加载功能,数据存储在后端 `djOfficialdocDistribute` 表中。
- **保存方案**:输入方案名 → 点击"保存为方案"
- **加载方案**:在弹窗左侧已存方案列表中点击方案名
- **快速应用**:在弹窗外部的方案按钮直接点击即可应用并提交
- **删除方案**:点击方案旁的关闭按钮
加载方案时会自动校验人员状态(密级变更、部门变动、离职冻结),异常人员会弹出提示并自动移除。
---
## 依赖的后端接口
| 接口 | 用途 |
|------|------|
| `GET /sys/sysDepart/queryTreeList` | 获取部门树 |
| `GET /sys/user/queryUserComponentData` | 查询部门下的人员 |
| `GET /officialdocDistribute/djOfficialdocDistribute/list` | 方案列表 |
| `POST /officialdocDistribute/djOfficialdocDistribute/add` | 新增方案 |
| `POST /officialdocDistribute/djOfficialdocDistribute/edit` | 编辑方案 |
| `DELETE /officialdocDistribute/djOfficialdocDistribute/delete` | 删除方案 |
| `GET /distributionProcessinfo/officialdocDistributionProcessinfo/queryDeptIds` | 查询公文已分发部门ID |
---
## 测试页面
访问 `/semri/test/SzDistributeTest` 可查看组件演示和所有输入输出字段。