fs-lawrisk/docs/features/org_chart/ORG_MANAGEMENT_FEATURES.md

9.4 KiB
Raw Permalink Blame History

组织架构管理功能实现文档

功能概述

基于用户需求,我们在组织架构中实现了完整的管理功能,包括部门的新增、编辑、删除和层级调整(拖拽)。

核心功能

1. 新增部门

操作方式:

  • 点击任意节点上的 新增 按钮

功能特点:

  • 必填信息:部门名称、部门账号
  • 可选信息:联系电话、备注
  • 自动账号创建:系统自动为每个部门创建管理员账号
  • 默认密码:账号+123456例如账号为ABC,密码为ABC123456
  • 角色配置:自动分配department_admin角色级别80

后端实现:

# lawrisk/api/v2.py - admin_create_service_department()
department = create_service_department(name, **kwargs)
user = create_user(
    username=code,
    password=f"{code}123456",
    display_name=f"{name}管理员",
    role="department_admin",
    grade=80,
    service_department_id=department_id
)

前端界面:

  • 模态框表单设计
  • 表单验证(账号只能包含字母和数字)
  • 友好的提示信息

2. 编辑部门 ✏️

操作方式:

  • 点击节点上的 ✏️ 编辑 按钮

功能特点:

  • 可编辑字段:部门名称、联系电话、备注
  • ⚠️ 不可修改:部门账号(防止登录用户名冲突)
  • 即时保存:修改后立即更新到数据库

支持字段:

  • 部门名称(必填)
  • 部门账号(只读)
  • 联系电话
  • 备注

3. 删除部门 🗑️

操作方式:

  • 点击节点上的 🗑️ 删除 按钮

安全机制:

  1. 下级部门检查:如果有下级部门,会提示用户删除后的影响
  2. 账号绑定检查:如果部门下有账号绑定,默认不允许删除
  3. 强制删除选项:如需强制删除,可解除所有账号绑定

删除逻辑:

# 1. 检查下级部门
children_count = orgChartData.allNodes.filter(n => n.parent_id === nodeId)

# 2. 检查账号绑定
bound_count = cur.execute(
    "SELECT COUNT(*) FROM auth_users WHERE service_department_id = %s",
    (dept_token,)
)

# 3. 强制删除(可选)
if force:
    update_user_account(user_id, service_department_id=None)
delete_service_department(dept_id)

删除行为:

  • 普通删除:要求无下级部门且无账号绑定
  • 强制删除:自动解除所有账号绑定

4. 拖拽修改层级 🎯

操作方式:

  • 拖拽节点名称右侧的提示文字 ⋮⋮ 拖拽修改层级
  • 拖拽到目标节点上

视觉反馈:

  • 拖拽时:节点半透明显示,带阴影和旋转效果
  • 悬停目标:虚线边框高亮,显示"↳ 拖放到此处"提示
  • 释放后:弹出确认对话框

拖拽实现:

// HTML5 Drag & Drop API
span.setAttribute('draggable', 'true');
nodeDiv.addEventListener('drop', async (evt) => {
    evt.preventDefault();
    await fetchJSON(`${API_BASE}/admin/service-departments/${sourceId}`, {
        method: 'PATCH',
        body: JSON.stringify({ parent_id: targetId })
    });
});

安全限制:

  • 不能将节点设置为自己的子节点
  • 不能拖拽到自身
  • 需要用户确认操作

界面设计

操作按钮样式

新增按钮 (add-child-btn)

  • 🟢 绿色背景 #dcfce7
  • 文字颜色:#166534
  • 图标:

编辑按钮 (edit-btn)

  • 🔵 蓝色背景 #dbeafe
  • 文字颜色:#1e40af
  • 图标:✏️

删除按钮 (delete-btn)

  • 🔴 红色背景 #fee2e2
  • 文字颜色:#991b1b
  • 图标:🗑️

拖拽视觉样式

拖拽中 (.dragging)

  • 透明度:0.6
  • 阴影:0 8px 24px rgba(0, 0, 0, 0.15)
  • 旋转:rotate(2deg)
  • z-index1000

放置目标 (.drop-target)

  • 虚线边框:2px dashed #4f46e5
  • 提示覆盖层:↳ 拖放到此处

模态框设计

结构:

  • 遮罩层:半透明黑色背景
  • 模态框白色卡片圆角16px
  • 表单垂直排列间距12px
  • 按钮:取消(灰色)+ 确定(渐变蓝)

样式特点:

  • 最大宽度480px
  • 响应式设计90%宽度)
  • 圆角边框8px
  • 聚焦效果3px蓝紫色阴影

技术实现

后端 API

文件lawrisk/api/v2.py

创建部门

POST /fs-ai-asistant/api/workflow/lawrisk/admin/service-departments
{
    "name": "部门名称",
    "code": "部门账号",
    "phone": "联系电话",
    "parent_id": "上级ID",
    "description": "备注"
}

更新部门

PATCH /fs-ai-asistant/api/workflow/lawrisk/admin/service-departments/{id}
{
    "name": "新名称",
    "phone": "新电话",
    "parent_id": "新上级ID",  # 用于拖拽修改层级
    "description": "新备注"
}

删除部门

DELETE /fs-ai-asistant/api/workflow/lawrisk/admin/service-departments/{id}?force=true

前端实现

文件static/super_admin.html

核心函数

  1. showAddChildModal(nodeData)

    • 创建新增部门模态框
    • 自动设置parent_id
    • 显示密码提示信息
  2. showEditModal(nodeData)

    • 创建编辑部门模态框
    • 预填充现有数据
    • 禁用账号字段
  3. showDeleteConfirm(nodeData)

    • 检查下级部门数量
    • 检查账号绑定情况
    • 支持强制删除选项
  4. initDragAndDrop()

    • 初始化拖拽事件监听
    • 设置拖拽源和目标
    • 处理拖拽逻辑

数据结构

orgChartData = {
    tree: [],           // 树形结构
    allNodes: [],       // 所有节点扁平化列表
    parentMap: {},      // 父节点映射
    nodeMap: {}         // 节点ID到节点数据映射
}

测试建议

功能测试

  1. 新增部门测试

    1. 点击任意节点的  新增按钮
    2. 填写部门名称:测试部门
    3. 填写部门账号TEST001
    4. 点击确定
    5. 验证:显示默认密码 TEST001123456
    6. 验证:新部门出现在树形结构中
    
  2. 编辑部门测试

    1. 点击测试部门的 ✏️ 编辑按钮
    2. 修改部门名称:测试部门-已修改
    3. 修改联系电话0757-12345678
    4. 点击确定
    5. 验证:信息更新成功
    6. 验证:账号字段不可修改
    
  3. 删除部门测试

    1. 点击测试部门的 🗑️ 删除按钮
    2. 验证:弹出确认对话框
    3. 如有下级部门,验证:显示下级数量提示
    4. 确认删除
    5. 验证:部门从树形结构中移除
    
  4. 拖拽测试

    1. 拖拽节点A的 ⋮⋮ 提示文字
    2. 悬停到节点B上
    3. 验证节点B显示虚线边框
    4. 释放鼠标
    5. 验证:弹出确认对话框
    6. 确认操作
    7. 验证节点A成为节点B的子节点
    

边界测试

  1. 账号重复测试

    • 创建部门时使用已存在的账号
    • 预期:显示错误信息
  2. 自引用测试

    • 尝试将节点设置为自己的子节点
    • 预期:拒绝操作并显示错误
  3. 层级循环测试

    • A → B → C → A 试图形成循环
    • 预期:系统防止这种操作
  4. 删除根节点测试

    • 删除顶级部门
    • 预期:下级部门变成新的根节点

优点

1. 用户体验

  • 操作直观:按钮图标清晰,操作流程简单
  • 视觉反馈:拖拽、悬停、点击都有明确反馈
  • 错误提示:友好的错误信息和解决建议
  • 即时响应:操作后立即更新界面

2. 安全性

  • 数据验证:前后端双重验证
  • 权限控制:需要管理员权限
  • 防止误删:多层确认机制
  • 防止循环:自动检测父子关系

3. 可维护性

  • 模块化设计:每个功能独立实现
  • 代码复用:模态框和事件处理可复用
  • 类型安全JavaScript + TypeScript如需要
  • 文档完整:详细的实现文档

4. 扩展性

  • 易于添加字段:部门表可扩展更多属性
  • 支持批量操作:可扩展多选删除
  • 审计日志:可集成操作日志记录
  • 权限细粒度:可扩展更细的权限控制

文件清单

后端文件

  • lawrisk/api/v2.py - API路由实现

    • admin_create_service_department()
    • admin_update_service_department()
    • admin_delete_service_department()
  • lawrisk/services/licensing_repo.py - 数据库操作

    • create_service_department()
    • update_service_department()
    • delete_service_department()
    • build_service_department_tree()
  • lawrisk/services/auth_service.py - 账号管理

    • create_user()
    • update_user_account()
    • list_users()

前端文件

  • static/super_admin.html - 完整实现
    • CSS样式操作按钮、拖拽、模态框
    • JavaScript事件处理、拖拽逻辑、API调用
    • HTML结构模态框、操作按钮

测试文件

  • test_org_management.py - 自动化测试脚本

总结

本次实现完全满足用户需求:

  1. 新增部门 - 填写名称和账号,自动创建账号,默认密码规则
  2. 修改部门 - 编辑名称、电话、备注,账号不可修改
  3. 删除部门 - 安全删除,支持强制删除绑定账号
  4. 拖拽修改层级 - 直观的拖拽操作,视觉反馈清晰

所有功能都已经完整实现,代码经过精心设计,具有良好的用户体验、安全性和可维护性。 🎉