# StaffSelector 组件分公司用户加载功能说明 ## 📋 功能概述 优化 `StaffSelector` 组件,支持通过外部传入分公司ID列表来加载指定分公司的用户,提供更灵活的人员选择功能。 --- ## 🔄 修改内容 ### 1. 后端接口新增 #### **文件**: `SysUserController.java` **新增接口**: `GET /system/user/branch/users/by-dept-ids` ```java /** * 根据分公司ID列表获取用户(小程序端专用) * 支持外部传入分公司ID数组,查询这些分公司及其所有子部门的用户 */ @GetMapping("/branch/users/by-dept-ids") public AjaxResult listUsersByBranchDeptIds(Long[] branchDeptIds) ``` **参数**: - `branchDeptIds`: 分公司ID数组,例如 `[101, 102]` **返回数据**: ```json { "code": 200, "msg": "操作成功", "data": [ { "userId": 1, "nickName": "张三", "phonenumber": "13800138000", "dept": { "deptId": 201, "deptName": "广州分公司-车队A" }, "posts": [...], "roles": [...] } ] } ``` --- ### 2. 前端API扩展 #### **文件**: `app/api/system/user.js` **新增方法**: ```javascript // 根据分公司ID列表查询用户(小程序端专用) export function listUsersByBranchDeptIds(branchDeptIds) { return request({ url: '/system/user/branch/users/by-dept-ids', method: 'get', params: { branchDeptIds: branchDeptIds } }) } ``` --- ### 3. StaffSelector 组件升级 #### **文件**: `app/pagesTask/components/StaffSelector.vue` **新增 Props**: ```javascript props: { // ... 其他 props // 分公司ID列表(外部传入,用于指定加载哪些分公司的用户) branchDeptIds: { type: Array, default: null } } ``` **核心逻辑**: ```javascript loadStaffList() { // 如果传入了分公司ID,使用指定的分公司 if (this.branchDeptIds && this.branchDeptIds.length > 0) { this.loadStaffByBranchDeptIds(this.branchDeptIds) } else { // 否则使用当前用户的分公司 this.loadStaffByCurrentUser() } } ``` **监听变化**: ```javascript watch: { branchDeptIds: { handler(newVal, oldVal) { if (JSON.stringify(newVal) !== JSON.stringify(oldVal)) { this.loadStaffList() } }, deep: true } } ``` --- ## 📖 使用方式 ### 方式一: 默认加载(使用当前用户的分公司) ```vue ``` **行为**: - 自动调用 `/system/user/branch/users` 接口 - 加载当前登录用户所属分公司及其子部门的所有用户 --- ### 方式二: 指定分公司ID(外部传入) ```vue ``` **行为**: - 用户选择分公司后,`selectedBranchIds` 更新 - `StaffSelector` 监听到 `branchDeptIds` 变化 - 自动调用 `/system/user/branch/users/by-dept-ids?branchDeptIds=101,102` - 加载指定分公司及其子部门的所有用户 --- ### 方式三: 动态切换分公司 ```vue ``` --- ## 🔑 Props 说明 | Props | 类型 | 默认值 | 说明 | |-------|------|--------|------| | `value` | Array | `[]` | 已选择的人员列表(v-model) | | `label` | String | `'执行任务人员'` | 标签文本 | | `required` | Boolean | `false` | 是否必填 | | `autoAddCurrentUser` | Boolean | `true` | 是否自动添加当前用户 | | `currentUserRemovable` | Boolean | `false` | 当前用户是否可移除 | | **`branchDeptIds`** | Array | `null` | **分公司ID列表(新增)** | --- ## 📊 数据流程 ### 默认模式(不传 branchDeptIds) ``` 1. 组件 mounted ↓ 2. loadStaffList() ↓ 3. 判断 branchDeptIds 为空 ↓ 4. 调用 listBranchUsers() ↓ 5. 后端根据当前用户的 oaOrderClass 或 deptId 查询分公司 ↓ 6. 返回该分公司及其子部门的所有用户 ↓ 7. processUserList() 处理数据 ↓ 8. 展示用户列表 ``` ### 指定模式(传入 branchDeptIds) ``` 1. 组件 mounted ↓ 2. loadStaffList() ↓ 3. 判断 branchDeptIds 有值 ↓ 4. 调用 listUsersByBranchDeptIds(branchDeptIds) ↓ 5. 后端根据传入的分公司ID列表查询 ↓ 6. 返回指定分公司及其子部门的所有用户 ↓ 7. processUserList() 处理数据 ↓ 8. 展示用户列表 ``` ### 动态切换 ``` 1. 父组件修改 branchDeptIds ↓ 2. StaffSelector 监听到变化(watch) ↓ 3. 重新执行 loadStaffList() ↓ 4. 根据新的 branchDeptIds 加载用户 ↓ 5. 更新用户列表 ``` --- ## ⚡ 性能优化 ### 1. 避免重复加载 ```javascript watch: { branchDeptIds: { handler(newVal, oldVal) { // 只有真正变化时才重新加载 if (JSON.stringify(newVal) !== JSON.stringify(oldVal)) { this.loadStaffList() } }, deep: true } } ``` ### 2. 前端缓存 可以在父组件层面缓存用户列表: ```javascript data() { return { userCache: {} // { '101': [...users], '102': [...users] } } } ``` --- ## ✅ 测试用例 ### 测试1: 默认加载 **输入**: 不传 `branchDeptIds` **预期**: 加载当前用户的分公司用户 **验证**: 检查用户列表是否符合预期 ### 测试2: 单个分公司 **输入**: `branchDeptIds: [101]` **预期**: 只加载 ID=101 的分公司及其子部门用户 **验证**: 检查用户部门是否都属于该分公司 ### 测试3: 多个分公司 **输入**: `branchDeptIds: [101, 102]` **预期**: 加载两个分公司及其子部门的用户 **验证**: 检查用户部门是否都属于这两个分公司 ### 测试4: 动态切换 **操作**: 先传 `[101]`,再改为 `[102]` **预期**: 用户列表实时更新 **验证**: 检查两次加载的用户是否不同 ### 测试5: 空数组 **输入**: `branchDeptIds: []` **预期**: 返回空列表 **验证**: 用户列表为空 --- ## 💡 使用建议 ### 场景1: 跨分公司协作任务 当任务需要多个分公司的人员协作时: ```vue ``` ### 场景2: 区域筛选 提供区域选择器,用户自选分公司: ```vue ``` ### 场景3: 权限控制 根据用户权限动态限制可选分公司: ```javascript computed: { allowedBranchIds() { // 根据用户角色返回允许的分公司ID return this.currentUser.allowedBranches.map(b => b.deptId) } } ``` --- ## 📌 注意事项 1. **数组传递**: `branchDeptIds` 必须是数组类型,即使只有一个ID也要用数组 `[101]` 2. **动态更新**: 修改 `branchDeptIds` 会自动触发重新加载,无需手动调用 3. **空值处理**: 传入 `null` 或不传时,使用默认的当前用户分公司 4. **权限校验**: 后端会根据用户权限过滤数据,前端无需额外处理 --- ## 🔗 相关文件 ### 后端 - `SysUserController.java` - 用户控制器 - `SysUserService.java` - 用户服务接口 - `SysUserServiceImpl.java` - 用户服务实现 - `SysUserMapper.xml` - SQL映射文件 ### 前端 - `app/api/system/user.js` - 用户API - `app/pagesTask/components/StaffSelector.vue` - 人员选择器组件 - `app/api/system/dept.js` - 部门API --- ## 📝 版本历史 | 版本 | 日期 | 说明 | |------|------|------| | 1.0 | 2025-12-04 | 初始版本,新增按分公司ID加载用户功能 |