# 车辆管理部门过滤功能说明 ## 修改概述 在车辆管理功能中,车辆归属部门应该只能选择分公司,因此需要过滤部门列表,只显示分公司(`parent_id = 100`的部门)。 ## 业务规则 ### 部门层级结构 ``` 100 (根部门) ├── 101 (分公司1) ← 只显示这一层 ├── 102 (分公司2) ← 只显示这一层 │ ├── 103 (子部门) ← 不显示 │ └── 104 (子部门) ← 不显示 └── 105 (分公司3) ← 只显示这一层 ``` ### 过滤规则 - ✅ **显示**:`parent_id = 100` 的部门(分公司) - ❌ **不显示**:其他层级的部门 ## 技术实现 ### 修改文件 **文件路径**:`ruoyi-ui/src/views/system/vehicle/index.vue` ### 修改内容 #### 原代码 ```javascript /** 获取部门列表 */ getDeptList() { listDept().then(response => { this.deptList = response.data; }); } ``` #### 修改后 ```javascript /** 获取部门列表(只显示分公司:parent_id=100) */ getDeptList() { listDept({ parentId: 100 }).then(response => { // 过滤出分公司(parent_id=100的部门) if (response.data) { this.deptList = response.data.filter(dept => dept.parentId === 100); } else { this.deptList = []; } }); } ``` ### 实现方式 采用了**双重过滤**的安全策略: 1. **API参数过滤**: ```javascript listDept({ parentId: 100 }) ``` - 在请求时就传递 `parentId: 100` 参数 - 如果后端支持此参数,可以减少数据传输 2. **前端二次过滤**: ```javascript this.deptList = response.data.filter(dept => dept.parentId === 100); ``` - 确保即使后端返回所有数据,前端也会过滤 - 提高数据准确性和安全性 3. **空值保护**: ```javascript if (response.data) { // 处理数据 } else { this.deptList = []; } ``` - 防止数据为空时出现错误 ## 影响范围 ### 前端页面影响 #### 1. 查询条件区域 ```vue ``` **影响**:下拉选项只显示分公司 #### 2. 新增/编辑对话框 ```vue ``` **影响**:新增或修改车辆时,只能选择分公司作为归属部门 ## 数据库结构 ### sys_dept 表结构(参考) ```sql CREATE TABLE sys_dept ( dept_id BIGINT(20) NOT NULL COMMENT '部门id', parent_id BIGINT(20) DEFAULT '0' COMMENT '父部门id', dept_name VARCHAR(30) DEFAULT '' COMMENT '部门名称', order_num INT(4) DEFAULT '0' COMMENT '显示顺序', leader VARCHAR(20) DEFAULT NULL COMMENT '负责人', phone VARCHAR(11) DEFAULT NULL COMMENT '联系电话', email VARCHAR(50) DEFAULT NULL COMMENT '邮箱', status CHAR(1) DEFAULT '0' COMMENT '部门状态(0正常 1停用)', del_flag CHAR(1) DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', create_by VARCHAR(64) DEFAULT '' COMMENT '创建者', create_time DATETIME COMMENT '创建时间', update_by VARCHAR(64) DEFAULT '' COMMENT '更新者', update_time DATETIME COMMENT '更新时间', PRIMARY KEY (dept_id) ) COMMENT='部门表'; ``` ### 分公司数据示例 ```sql -- 根部门 INSERT INTO sys_dept VALUES (100, 0, '总公司', 0, '管理员', '15888888888', 'admin@qq.com', '0', '0', 'admin', NOW(), '', NULL); -- 分公司(parent_id = 100) INSERT INTO sys_dept VALUES (101, 100, '深圳分公司', 1, '张三', '15888888881', 'sz@qq.com', '0', '0', 'admin', NOW(), '', NULL); INSERT INTO sys_dept VALUES (102, 100, '广州分公司', 2, '李四', '15888888882', 'gz@qq.com', '0', '0', 'admin', NOW(), '', NULL); INSERT INTO sys_dept VALUES (103, 100, '北京分公司', 3, '王五', '15888888883', 'bj@qq.com', '0', '0', 'admin', NOW(), '', NULL); -- 子部门(parent_id != 100,不应该显示) INSERT INTO sys_dept VALUES (201, 101, '深圳技术部', 1, '赵六', '15888888884', 'szjs@qq.com', '0', '0', 'admin', NOW(), '', NULL); INSERT INTO sys_dept VALUES (202, 101, '深圳业务部', 2, '钱七', '15888888885', 'szyw@qq.com', '0', '0', 'admin', NOW(), '', NULL); ``` ## 使用场景 ### 场景1:新增车辆 1. 点击"新增"按钮 2. 填写车辆信息 3. 选择"归属部门"时,下拉列表只显示: - 深圳分公司 - 广州分公司 - 北京分公司 4. 不会显示各分公司下的子部门(如技术部、业务部等) ### 场景2:查询车辆 1. 在查询条件中选择"归属部门" 2. 下拉列表只显示分公司 3. 可以快速筛选某个分公司的车辆 ### 场景3:修改车辆 1. 点击"修改"按钮 2. 编辑车辆信息 3. 修改"归属部门"时,只能选择分公司 ## 测试要点 ### 功能测试 - ✅ 查询条件中的部门下拉列表只显示分公司 - ✅ 新增车辆时的部门下拉列表只显示分公司 - ✅ 编辑车辆时的部门下拉列表只显示分公司 - ✅ 已选择的分公司能正确保存到数据库 - ✅ 车辆列表中的"归属部门"列正确显示分公司名称 ### 数据验证 - ✅ 验证 `deptList` 中所有部门的 `parentId` 都等于 100 - ✅ 验证没有子部门出现在下拉列表中 - ✅ 验证部门数据为空时不会报错 ### 边界测试 - ✅ 数据库中没有分公司时的处理(显示空列表) - ✅ 数据库中只有一个分公司时的处理 - ✅ 网络请求失败时的处理 ## 注意事项 ### 1. 数据一致性 - 确保数据库中已有 `parent_id = 100` 的分公司数据 - 如果需要添加新的分公司,必须设置 `parent_id = 100` ### 2. 权限控制 - 此修改不影响现有的权限控制 - 仍然遵循系统的数据权限规则 ### 3. 兼容性 - 修改采用前端过滤,不依赖后端接口修改 - 即使后端接口不支持 `parentId` 参数,前端也能正确过滤 - 确保向后兼容 ### 4. 性能考虑 - 由于分公司数量通常不会很多(一般不超过100个),前端过滤性能影响可忽略 - 如果分公司数量很大,建议后端提供专门的接口 ## 后续优化建议 ### 1. 后端接口优化 建议后端提供专门的分公司查询接口: ```javascript // 新增API export function listBranchCompany() { return request({ url: '/system/dept/branch', method: 'get' }) } ``` 后端实现: ```java /** * 查询分公司列表 */ @GetMapping("/branch") public AjaxResult listBranchCompany() { SysDept query = new SysDept(); query.setParentId(100L); List list = deptService.selectDeptList(query); return success(list); } ``` ### 2. 配置化管理 将 `parent_id = 100` 这个值配置化: ```javascript // 在配置文件中定义 const BRANCH_COMPANY_PARENT_ID = 100; // 使用时引用 getDeptList() { listDept({ parentId: BRANCH_COMPANY_PARENT_ID }).then(response => { if (response.data) { this.deptList = response.data.filter( dept => dept.parentId === BRANCH_COMPANY_PARENT_ID ); } }); } ``` ### 3. 缓存优化 如果分公司数据变化不频繁,可以考虑缓存: ```javascript // 使用Vuex缓存分公司列表 computed: { ...mapState({ cachedDeptList: state => state.dept.branchCompanyList }) }, mounted() { if (!this.cachedDeptList || this.cachedDeptList.length === 0) { this.getDeptList(); } else { this.deptList = this.cachedDeptList; } } ``` ## 相关文档 - [车辆绑定解绑功能说明.md](./车辆绑定解绑功能说明.md) - [用户绑定车辆功能说明.md](./用户绑定车辆功能说明.md) ## 版本历史 | 版本 | 日期 | 修改内容 | 修改人 | |------|------|---------|--------| | 1.0 | 2025-10-15 | 初始版本,实现部门过滤功能 | - | ## 总结 通过此次修改,车辆管理功能中的部门选择更加规范,确保车辆只能归属于分公司,避免了数据层级混乱的问题。同时采用了双重过滤的安全策略,保证了数据的准确性和系统的稳定性。