fs-lawrisk/docs/IMPLEMENTATION_REPORT.md

6.8 KiB
Raw Permalink Blame History

许可管理单位权限优化 - 实施报告

项目名称: 市监局法律风险提示系统 - 单位权限优化 实施日期: 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 权限控制逻辑

# 新的权限控制逻辑
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()

🔄 数据库操作

执行迁移

python lawrisk/utils/migrate_unit_permission.py

验证迁移

from lawrisk.utils.migrate_unit_permission import check_migration_status

status = check_migration_status()
print(status)

🏗️ 架构设计

单位级别定义

单位类型 说明 示例 可视范围
admin 市局管理员 FSSJSJ市级管理员 全部许可
municipal 市级单位 市监局、卫健局、交通局等 自身 + 下属区级单位
district 区局子管理员 禅城区、南海区等管理员 下属所有单位
unit 区级单位 禅城区市场监督管理局等 仅自身

权限矩阵

用户类型 自身许可 下属单位许可 其他区许可 其他市级单位许可
市局管理员
市级单位用户
区局子管理员
区级单位用户

🔐 关键代码实现

文件绑定逻辑

-- permit_sources表新增字段
uploader_department_id uuid REFERENCES service_departments(id),
bound_department_id uuid REFERENCES service_departments(id)

权限控制流程

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