WuYongJie 5821d73291 初始提交:3D家具安装展示系统
包含:
- furniture-3d-system:Next.js 16 全栈应用(资产中心、产品管理、3D装配动画)
- autocad-plugin:AutoCAD 家具导出插件源码
- 资产中心改造:编辑弹窗化、删除功能、Toast反馈、自定义Select组件

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-02 14:00:19 +08:00

8.8 KiB
Raw Blame History

Phase 4: 组织架构实现 - 完成文档

📋 概述

Phase 4 已完成,实现了完整的部门和小组管理功能,以及用户的部门/小组分配功能。

完成时间:2025-12-12
状态:✅ 已完成


✅ 已完成功能

1. 部门管理 API ✅

文件:src/app/api/departments/

  • ✅ GET /api/departments - 获取部门列表(树形结构)
  • ✅ POST /api/departments - 创建部门
  • ✅ PUT /api/departments/[id] - 更新部门
  • ✅ DELETE /api/departments/[id] - 删除部门

功能特点:

  • 支持部门层级结构(父子关系)
  • 自动构建完整路径(如:设计部 > 3D组 > 建模小组)
  • 部门负责人分配
  • 同级部门名称唯一性验证
  • 删除前检查(子部门、成员、小组)

2. 小组管理 API ✅

文件:src/app/api/teams/

  • ✅ GET /api/teams - 获取小组列表
  • ✅ POST /api/teams - 创建小组
  • ✅ PUT /api/teams/[id] - 更新小组
  • ✅ DELETE /api/teams/[id] - 删除小组

功能特点:

  • 小组归属部门
  • 组长分配
  • 同部门下小组名称唯一性验证
  • 删除前检查(成员)

3. 成员分配功能 ✅

文件:src/components/users/CreateUserModal.tsx, EditUserModal.tsx

  • ✅ 创建用户时分配部门和小组
  • ✅ 编辑用户时修改部门和小组
  • ✅ 部门和小组级联选择(选择部门后自动加载该部门的小组)
  • ✅ 树形部门列表展示(带缩进)

📁 文件结构

furniture-3d-system/
├── src/
│   ├── app/
│   │   └── api/
│   │       ├── departments/
│   │       │   ├── route.ts                # 部门列表和创建 API
│   │       │   └── [id]/
│   │       │       └── route.ts            # 单个部门操作 API
│   │       ├── teams/
│   │       │   ├── route.ts                # 小组列表和创建 API
│   │       │   └── [id]/
│   │       │       └── route.ts            # 单个小组操作 API
│   │       └── users/
│   │           ├── route.ts                # 更新:支持部门/小组分配
│   │           └── [id]/
│   │               └── route.ts            # 更新:支持部门/小组修改
│   └── components/
│       └── users/
│           ├── CreateUserModal.tsx         # 更新:添加部门/小组选择
│           └── EditUserModal.tsx           # 更新:添加部门/小组选择
└── docs/
    └── PHASE4_COMPLETE.md                  # 本文档

🔐 权限控制

部门管理权限

  • 创建部门:超级管理员、管理员
  • 编辑部门:超级管理员、管理员
  • 删除部门:超级管理员、管理员
  • 查看部门:所有已登录用户

小组管理权限

  • 创建小组:超级管理员、管理员、部门管理员
  • 编辑小组:超级管理员、管理员、部门管理员
  • 删除小组:超级管理员、管理员、部门管理员
  • 查看小组:所有已登录用户

📊 数据模型

部门模型(Department)

{
  id: string
  name: string                    // 部门名称
  fullPath: string                // 完整路径(如:设计部 > 3D组)
  parentId: string | null         // 父部门ID
  managerId: string | null        // 部门负责人ID
  orderIndex: number              // 排序索引
  createdAt: DateTime
  updatedAt: DateTime
}

小组模型(Team)

{
  id: string
  name: string                    // 小组名称
  description: string | null      // 小组描述
  departmentId: string            // 所属部门ID
  leaderId: string | null         // 组长ID
  orderIndex: number              // 排序索引
  createdAt: DateTime
  updatedAt: DateTime
}

📝 API 使用示例

获取部门列表(树形结构)

const response = await fetch('/api/departments', {
  headers: {
    Authorization: `Bearer ${token}`,
  },
});

const data = await response.json();
// {
//   departments: [
//     {
//       id: "dept1",
//       name: "设计部",
//       fullPath: "设计部",
//       children: [
//         {
//           id: "dept2",
//           name: "3D组",
//           fullPath: "设计部 > 3D组",
//           children: []
//         }
//       ]
//     }
//   ]
// }

创建部门

const response = await fetch('/api/departments', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${token}`,
  },
  body: JSON.stringify({
    name: '建模小组',
    parentId: 'dept2',  // 父部门ID(可选)
    managerId: 'user1', // 部门负责人ID(可选)
  }),
});

获取小组列表

// 获取所有小组
const response = await fetch('/api/teams', {
  headers: {
    Authorization: `Bearer ${token}`,
  },
});

// 获取指定部门的小组
const response = await fetch('/api/teams?departmentId=dept1', {
  headers: {
    Authorization: `Bearer ${token}`,
  },
});

创建小组

const response = await fetch('/api/teams', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${token}`,
  },
  body: JSON.stringify({
    name: '建模小组',
    description: '负责3D建模工作',
    departmentId: 'dept1',
    leaderId: 'user1',  // 组长ID(可选)
  }),
});

分配用户到部门和小组

// 创建用户时分配
const response = await fetch('/api/users', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${token}`,
  },
  body: JSON.stringify({
    email: 'user@example.com',
    name: '张三',
    password: 'Password@123',
    role: 'DESIGNER',
    departmentId: 'dept1',  // 部门ID
    teamId: 'team1',        // 小组ID
  }),
});

// 更新用户的部门和小组
const response = await fetch(`/api/users/${userId}`, {
  method: 'PUT',
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${token}`,
  },
  body: JSON.stringify({
    departmentId: 'dept2',
    teamId: 'team2',
  }),
});

🎨 UI 功能

用户创建/编辑界面增强

  1. 部门选择

    • 下拉列表展示所有部门
    • 树形结构显示(带缩进)
    • 支持"未分配部门"选项
  2. 小组选择

    • 根据选择的部门动态加载小组列表
    • 只显示所选部门下的小组
    • 支持"未分配小组"选项
  3. 级联选择

    • 选择部门后自动加载该部门的小组
    • 切换部门时自动清空小组选择

✅ 验收标准

  • 部门 CRUD API 正常工作
  • 小组 CRUD API 正常工作
  • 部门树形结构正确构建
  • 部门完整路径自动生成
  • 同级部门名称唯一性验证
  • 同部门下小组名称唯一性验证
  • 删除前检查(子部门、成员、小组)
  • 用户创建时可分配部门和小组
  • 用户编辑时可修改部门和小组
  • 部门和小组级联选择正常工作
  • 类型检查通过(组织架构相关代码)
  • 权限控制正确

📊 代码统计

  • 新增文件:4 个
  • 修改文件:4 个
  • 新增代码行数:约 800 行
  • API 端点:8 个

🔄 数据关系

Department (部门)
├── parentId → Department (父部门)
├── managerId → User (部门负责人)
├── children → Department[] (子部门)
├── members → User[] (部门成员)
└── teams → Team[] (部门下的小组)

Team (小组)
├── departmentId → Department (所属部门)
├── leaderId → User (组长)
└── members → User[] (小组成员)

User (用户)
├── departmentId → Department (所属部门)
├── teamId → Team (所属小组)
├── managedDepartmentId → Department (管理的部门)
└── managedTeamId → Team (管理的小组)

🚀 下一步

Phase 4 已完成,可以继续后续阶段:

Phase 5: 产品归属实现

  • 产品协作者管理
  • SKU 负责人分配
  • 权限过滤

Phase 6: 离职交接实现

  • 离职检测
  • SKU 交接界面
  • 交接历史记录

Phase 7: 问题反馈实现

  • 反馈提交界面
  • 反馈处理界面
  • 自动分配逻辑

📞 注意事项

  1. 部门层级:支持无限层级,但建议不超过 3-4 层
  2. 删除限制:有子部门、成员或小组的部门无法删除
  3. 名称唯一性:同级部门名称必须唯一,同部门下小组名称必须唯一
  4. 完整路径:部门完整路径自动生成和更新
  5. 级联选择:选择部门后自动加载该部门的小组列表

Phase 4 完成! ✅

组织架构管理功能已全部实现,用户可以被正确分配到部门和小组。