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

376 lines
9.4 KiB
Markdown
Raw Normal View History

# 组织架构管理功能实现文档
## 功能概述
基于用户需求,我们在组织架构中实现了完整的管理功能,包括部门的新增、编辑、删除和层级调整(拖拽)。
## 核心功能
### 1. 新增部门 ✨
**操作方式:**
- 点击任意节点上的 ` 新增` 按钮
**功能特点:**
-**必填信息**:部门名称、部门账号
-**可选信息**:联系电话、备注
-**自动账号创建**:系统自动为每个部门创建管理员账号
-**默认密码**:账号+123456例如账号为`ABC`,密码为`ABC123456`
-**角色配置**:自动分配`department_admin`角色级别80
**后端实现:**
```python
# 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. **强制删除选项**:如需强制删除,可解除所有账号绑定
**删除逻辑:**
```python
# 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. 拖拽修改层级 🎯
**操作方式:**
- 拖拽节点名称右侧的提示文字 `⋮⋮ 拖拽修改层级`
- 拖拽到目标节点上
**视觉反馈:**
- 拖拽时:节点半透明显示,带阴影和旋转效果
- 悬停目标:虚线边框高亮,显示"↳ 拖放到此处"提示
- 释放后:弹出确认对话框
**拖拽实现:**
```javascript
// 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-index`1000`
**放置目标** (`.drop-target`)
- 虚线边框:`2px dashed #4f46e5`
- 提示覆盖层:`↳ 拖放到此处`
### 模态框设计
**结构:**
- 遮罩层:半透明黑色背景
- 模态框白色卡片圆角16px
- 表单垂直排列间距12px
- 按钮:取消(灰色)+ 确定(渐变蓝)
**样式特点:**
- 最大宽度480px
- 响应式设计90%宽度)
- 圆角边框8px
- 聚焦效果3px蓝紫色阴影
---
## 技术实现
### 后端 API
**文件**`lawrisk/api/v2.py`
#### 创建部门
```python
POST /fs-ai-asistant/api/workflow/lawrisk/admin/service-departments
{
"name": "部门名称",
"code": "部门账号",
"phone": "联系电话",
"parent_id": "上级ID",
"description": "备注"
}
```
#### 更新部门
```python
PATCH /fs-ai-asistant/api/workflow/lawrisk/admin/service-departments/{id}
{
"name": "新名称",
"phone": "新电话",
"parent_id": "新上级ID", # 用于拖拽修改层级
"description": "新备注"
}
```
#### 删除部门
```python
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()`**
- 初始化拖拽事件监听
- 设置拖拽源和目标
- 处理拖拽逻辑
#### 数据结构
```javascript
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.**拖拽修改层级** - 直观的拖拽操作,视觉反馈清晰
所有功能都已经完整实现,代码经过精心设计,具有良好的用户体验、安全性和可维护性。 🎉