fs-lawrisk/ORG_MANAGEMENT_FEATURES.md

376 lines
9.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 组织架构管理功能实现文档
## 功能概述
基于用户需求,我们在组织架构中实现了完整的管理功能,包括部门的新增、编辑、删除和层级调整(拖拽)。
## 核心功能
### 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.**拖拽修改层级** - 直观的拖拽操作,视觉反馈清晰
所有功能都已经完整实现,代码经过精心设计,具有良好的用户体验、安全性和可维护性。 🎉