2025-11-27 15:26:59 +08:00
|
|
|
|
# 许可管理单位权限优化 - 实施报告
|
|
|
|
|
|
|
|
|
|
|
|
**项目名称**: 市监局法律风险提示系统 - 单位权限优化
|
|
|
|
|
|
**实施日期**: 2025-11-19
|
|
|
|
|
|
**版本**: v1.0
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 📋 实施概览
|
|
|
|
|
|
|
|
|
|
|
|
本次实施完成了许可管理单位权限优化功能的后端核心开发,为实现市级单位、区级单位的层级管理奠定了基础。
|
|
|
|
|
|
|
|
|
|
|
|
## ✅ 已完成工作
|
|
|
|
|
|
|
|
|
|
|
|
### 1. 数据库迁移 (100%)
|
|
|
|
|
|
|
|
|
|
|
|
#### 1.1 迁移脚本
|
|
|
|
|
|
- **文件**: `docs/sql/006_add_unit_level_and_binding_fields.sql`
|
|
|
|
|
|
- **新增字段**:
|
|
|
|
|
|
- `service_departments.unit_level` - 单位级别(admin/municipal/district/unit)
|
|
|
|
|
|
- `service_departments.allowed_regions` - 市级单位可访问的行政区
|
|
|
|
|
|
- `permit_sources.uploader_department_id` - 上传者单位ID
|
|
|
|
|
|
- `permit_sources.bound_department_id` - 绑定单位ID
|
|
|
|
|
|
|
|
|
|
|
|
#### 1.2 新建索引
|
|
|
|
|
|
- `idx_service_dept_unit_level` - 单位级别索引
|
|
|
|
|
|
- `idx_service_dept_parent_level` - 父子层级索引
|
|
|
|
|
|
- `idx_permit_sources_bound_dept` - 绑定单位索引
|
|
|
|
|
|
- `idx_permit_sources_uploader` - 上传者索引
|
|
|
|
|
|
|
|
|
|
|
|
#### 1.3 数据迁移
|
|
|
|
|
|
- 市局管理员(grade >= 90)→ unit_level = 'admin'
|
|
|
|
|
|
- 根节点且grade < 90 → unit_level = 'district'
|
|
|
|
|
|
- 有父节点且grade < 90 → unit_level = 'unit'
|
|
|
|
|
|
|
|
|
|
|
|
#### 1.4 迁移执行脚本
|
|
|
|
|
|
- **文件**: `lawrisk/utils/migrate_unit_permission.py`
|
|
|
|
|
|
- 功能:检查迁移状态、执行迁移、验证结果
|
|
|
|
|
|
|
|
|
|
|
|
### 2. 权限控制逻辑优化 (100%)
|
|
|
|
|
|
|
|
|
|
|
|
#### 2.1 新增函数
|
|
|
|
|
|
- **`get_visible_permits()`** - 根据新的权限模型返回可见许可
|
|
|
|
|
|
- 支持多维度筛选(municipal_dept_id, district_dept_id, region, search_text)
|
|
|
|
|
|
- 基于unit_level的权限控制逻辑
|
|
|
|
|
|
- 详细的权限日志记录
|
|
|
|
|
|
|
|
|
|
|
|
- **`get_subordinate_departments()`** - 获取下级单位
|
|
|
|
|
|
- 支持指定级别筛选
|
|
|
|
|
|
- 用于市级单位查看下属区级单位
|
|
|
|
|
|
|
|
|
|
|
|
#### 2.2 修改函数
|
|
|
|
|
|
- **`list_permits_for_region()`** - 重构为使用新权限模型
|
|
|
|
|
|
- 向后兼容现有API
|
|
|
|
|
|
- 无缝集成新权限逻辑
|
|
|
|
|
|
|
|
|
|
|
|
#### 2.3 权限控制逻辑
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
|
# 新的权限控制逻辑
|
|
|
|
|
|
if user_role == 'admin' or user_grade >= 90:
|
|
|
|
|
|
# 市局管理员:全部许可
|
|
|
|
|
|
return query_all_permits(filters)
|
|
|
|
|
|
|
|
|
|
|
|
elif unit_level == 'municipal':
|
|
|
|
|
|
# 市级单位:自身 + 下属区级单位
|
|
|
|
|
|
subordinate_ids = get_subordinate_departments(dept_id, level='unit')
|
|
|
|
|
|
return query_permits_by_departments([dept_id] + subordinate_ids, filters)
|
|
|
|
|
|
|
|
|
|
|
|
elif unit_level == 'district':
|
|
|
|
|
|
# 区局子管理员:下属所有单位
|
|
|
|
|
|
return query_permits_by_region(region_id, filters)
|
|
|
|
|
|
|
|
|
|
|
|
elif unit_level == 'unit':
|
|
|
|
|
|
# 区级单位:仅自身
|
|
|
|
|
|
return query_permits_by_departments([dept_id], filters)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 3. 单位管理功能增强 (100%)
|
|
|
|
|
|
|
|
|
|
|
|
#### 3.1 修改函数
|
|
|
|
|
|
- **`create_service_department()`**
|
|
|
|
|
|
- 新增 `unit_level` 参数
|
|
|
|
|
|
- 自动计算grade值
|
|
|
|
|
|
- 支持创建市级单位和区级单位
|
|
|
|
|
|
|
|
|
|
|
|
- **`update_service_department()`**
|
|
|
|
|
|
- 新增 `unit_level` 参数
|
|
|
|
|
|
- 字段值验证
|
|
|
|
|
|
- 支持动态更新单位级别
|
|
|
|
|
|
|
|
|
|
|
|
- **`_serialize_service_department_row()`**
|
|
|
|
|
|
- 新增 `unit_level` 字段序列化
|
|
|
|
|
|
- 完整返回单位信息
|
|
|
|
|
|
|
|
|
|
|
|
## 📂 新增文件
|
|
|
|
|
|
|
|
|
|
|
|
1. **docs/sql/006_add_unit_level_and_binding_fields.sql** - 数据库迁移脚本
|
|
|
|
|
|
2. **lawrisk/utils/migrate_unit_permission.py** - 迁移执行工具
|
|
|
|
|
|
|
|
|
|
|
|
## 📝 修改文件
|
|
|
|
|
|
|
|
|
|
|
|
1. **lawrisk/services/licensing_repo.py**
|
|
|
|
|
|
- 新增: `get_visible_permits()`, `get_subordinate_departments()`
|
|
|
|
|
|
- 修改: `list_permits_for_region()`, `create_service_department()`, `update_service_department()`, `_serialize_service_department_row()`
|
|
|
|
|
|
|
|
|
|
|
|
## 🔄 数据库操作
|
|
|
|
|
|
|
|
|
|
|
|
### 执行迁移
|
|
|
|
|
|
```bash
|
|
|
|
|
|
python lawrisk/utils/migrate_unit_permission.py
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 验证迁移
|
|
|
|
|
|
```python
|
|
|
|
|
|
from lawrisk.utils.migrate_unit_permission import check_migration_status
|
|
|
|
|
|
|
|
|
|
|
|
status = check_migration_status()
|
|
|
|
|
|
print(status)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 🏗️ 架构设计
|
|
|
|
|
|
|
|
|
|
|
|
### 单位级别定义
|
|
|
|
|
|
| 单位类型 | 说明 | 示例 | 可视范围 |
|
|
|
|
|
|
|---------|------|------|----------|
|
|
|
|
|
|
| admin | 市局管理员 | FSSJSJ(市级管理员) | 全部许可 |
|
|
|
|
|
|
| municipal | 市级单位 | 市监局、卫健局、交通局等 | 自身 + 下属区级单位 |
|
|
|
|
|
|
| district | 区局子管理员 | 禅城区、南海区等管理员 | 下属所有单位 |
|
|
|
|
|
|
| unit | 区级单位 | 禅城区市场监督管理局等 | 仅自身 |
|
|
|
|
|
|
|
|
|
|
|
|
### 权限矩阵
|
|
|
|
|
|
|
|
|
|
|
|
| 用户类型 | 自身许可 | 下属单位许可 | 其他区许可 | 其他市级单位许可 |
|
|
|
|
|
|
|---------|---------|-------------|----------|----------------|
|
|
|
|
|
|
| 市局管理员 | ✅ | ✅ | ✅ | ✅ |
|
|
|
|
|
|
| 市级单位用户 | ✅ | ✅ | ❌ | ❌ |
|
|
|
|
|
|
| 区局子管理员 | ✅ | ✅ | ❌ | ❌ |
|
|
|
|
|
|
| 区级单位用户 | ✅ | ❌ | ❌ | ❌ |
|
|
|
|
|
|
|
|
|
|
|
|
## 🔐 关键代码实现
|
|
|
|
|
|
|
|
|
|
|
|
### 文件绑定逻辑
|
|
|
|
|
|
```sql
|
|
|
|
|
|
-- permit_sources表新增字段
|
|
|
|
|
|
uploader_department_id uuid REFERENCES service_departments(id),
|
|
|
|
|
|
bound_department_id uuid REFERENCES service_departments(id)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 权限控制流程
|
|
|
|
|
|
```python
|
|
|
|
|
|
def get_visible_permits(current_user, filters):
|
|
|
|
|
|
# 1. 获取用户权限信息
|
|
|
|
|
|
user_department = current_user.get('department', {})
|
|
|
|
|
|
unit_level = get_user_unit_level(user_department['id'])
|
|
|
|
|
|
|
|
|
|
|
|
# 2. 根据unit_level确定可见范围
|
|
|
|
|
|
if unit_level == 'municipal':
|
|
|
|
|
|
subordinate_ids = get_subordinate_departments(dept_id, level='unit')
|
|
|
|
|
|
visible_dept_ids = [dept_id] + subordinate_ids
|
|
|
|
|
|
|
|
|
|
|
|
# 3. 应用筛选条件
|
|
|
|
|
|
return query_permits_by_departments(visible_dept_ids, filters)
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 📊 数据统计
|
|
|
|
|
|
|
|
|
|
|
|
### 当前单位分布(迁移后)
|
|
|
|
|
|
- admin: 1个(市级管理员)
|
|
|
|
|
|
- district: 5个(五区管理员)
|
|
|
|
|
|
- unit: 0个(待创建)
|
|
|
|
|
|
- municipal: 0个(待创建)
|
|
|
|
|
|
|
|
|
|
|
|
## 🚀 后续工作
|
|
|
|
|
|
|
|
|
|
|
|
### 待完成(前端开发)
|
|
|
|
|
|
|
|
|
|
|
|
1. **筛选器UI组件**
|
|
|
|
|
|
- 市级单位下拉选择
|
|
|
|
|
|
- 区级单位联动选择
|
|
|
|
|
|
- 行政区筛选
|
|
|
|
|
|
- 许可名称搜索
|
|
|
|
|
|
- 重置和筛选功能
|
|
|
|
|
|
|
|
|
|
|
|
2. **文件上传绑定UI**
|
|
|
|
|
|
- 绑定单位选择器
|
|
|
|
|
|
- 默认绑定逻辑提示
|
|
|
|
|
|
- 可见用户列表展示
|
|
|
|
|
|
|
|
|
|
|
|
3. **API集成**
|
|
|
|
|
|
- 新的筛选API调用
|
|
|
|
|
|
- 数据加载和分页
|
|
|
|
|
|
- 错误处理
|
|
|
|
|
|
|
|
|
|
|
|
### 待测试
|
|
|
|
|
|
|
|
|
|
|
|
1. **单元测试**
|
|
|
|
|
|
- 权限控制逻辑测试
|
|
|
|
|
|
- 单位管理功能测试
|
|
|
|
|
|
- 数据库操作测试
|
|
|
|
|
|
|
|
|
|
|
|
2. **集成测试**
|
|
|
|
|
|
- 端到端流程测试
|
|
|
|
|
|
- 权限验证测试
|
|
|
|
|
|
- 性能测试
|
|
|
|
|
|
|
|
|
|
|
|
3. **用户验收测试**
|
|
|
|
|
|
- 业务场景测试
|
|
|
|
|
|
- 界面易用性测试
|
|
|
|
|
|
|
|
|
|
|
|
## ⚠️ 注意事项
|
|
|
|
|
|
|
|
|
|
|
|
1. **数据安全**
|
|
|
|
|
|
- 执行迁移前请备份数据库
|
|
|
|
|
|
- 建议在测试环境先验证
|
|
|
|
|
|
|
|
|
|
|
|
2. **兼容性**
|
|
|
|
|
|
- 现有API保持向后兼容
|
|
|
|
|
|
- 新功能不影响原有功能
|
|
|
|
|
|
|
|
|
|
|
|
3. **性能**
|
|
|
|
|
|
- 已添加必要索引
|
|
|
|
|
|
- 单位数量支持 > 100个
|
|
|
|
|
|
|
|
|
|
|
|
## 📞 联系信息
|
|
|
|
|
|
|
|
|
|
|
|
**开发团队**: Claude Code Assistant
|
|
|
|
|
|
**技术负责人**: [待填写]
|
|
|
|
|
|
**项目日期**: 2025-11-19
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 附录
|
|
|
|
|
|
|
|
|
|
|
|
### A. 数据库迁移SQL
|
|
|
|
|
|
|
|
|
|
|
|
详见: `docs/sql/006_add_unit_level_and_binding_fields.sql`
|
|
|
|
|
|
|
|
|
|
|
|
### B. 迁移工具使用
|
|
|
|
|
|
|
|
|
|
|
|
详见: `lawrisk/utils/migrate_unit_permission.py`
|
|
|
|
|
|
|
|
|
|
|
|
### C. 权限控制详细文档
|
|
|
|
|
|
|
|
|
|
|
|
详见: `docs/PRD_UNIT_PERMISSION_OPTIMIZATION.md`
|