gongxiangp2/docs/organization-implementation-assessment.md
chenpei ea9076df45 feat: 实现统一的下载错误处理系统并修复产品全案数据库Schema
- 创建统一的下载错误处理模块 (lib/download-errors.ts)
- 实现13种错误类型分类和中文错误消息
- 后端统一使用 createDownloadError 创建标准化错误响应
- 前端统一使用 parseDownloadError 解析错误并显示
- 修复正式系统数据库Schema,添加产品全案相关字段和表
- 执行数据库迁移:添加 task_no, task_status, task_fetched_at 字段
- 创建 material_assets, api_keys, api_call_logs 表
2026-01-05 17:52:42 +08:00

13 KiB
Raw Blame History

组织架构与用户管理 - 实现情况评估报告

评估日期: 2025-12-27
评估范围: 对比设计方案与实际代码实现


📊 总体评估

模块 设计方案 当前实现 完成度 优先级
用户状态管理 ✅ 完整设计 ⚠️ 部分实现(文档有,代码未应用) 30% 🔴 高
用户表结构 ✅ 完整设计 ⚠️ 基础实现(缺少外键) 40% 🔴 高
部门层级结构 ✅ 完整设计 ❌ 未实现 0% 🟡 中
角色权限体系 ✅ 完整设计 ⚠️ 基础实现(只有2种角色) 30% 🟡 中
权限继承机制 ✅ 完整设计 ⚠️ 部分实现(关联部门) 50% 🟡 中
用户操作日志 ✅ 完整设计 ❌ 未实现 0% 🟢 低
用户搜索功能 ✅ 完整设计 ⚠️ 基础实现 40% 🟡 中

🔍 详细对比分析

一、用户表结构 (User Model)

设计方案要求

model User {
  // 组织架构
  departmentId      String?     // 所属部门ID(外键关联)
  department        Department? @relation(...)
  
  // 角色权限
  role              Role        @default(USER)  // USER/DEPT_ADMIN/SYSTEM_ADMIN/SUPER_ADMIN
  isSuperAdmin      Boolean     @default(false)
  
  // 用户状态
  status            String      @default("pending")  // pending/active/suspended/archived
  isActive          Boolean     @default(false)  // 向后兼容
  canDownload       Boolean     @default(true)
  
  // 审计字段
  lastLoginAt       DateTime?
  lastLoginIp       String?
  loginCount        Int         @default(0)
  archivedAt        DateTime?
  
  // 关联
  operationLogs     UserOperationLog[]
}

当前实现

model User {
  department        String      @default("")  // ❌ 字符串,非外键
  managedDepartment String?                    // ✅ 管理员负责的部门
  role              Role        @default(USER)  // ❌ 只有 USER/ADMIN
  isActive          Boolean     @default(false)  // ✅ 已实现
  canDownload       Boolean     @default(true)  // ✅ 已实现
  isSuperAdmin      Boolean     @default(false) // ✅ 已实现
  
  // ❌ 缺少 status 字段
  // ❌ 缺少审计字段(lastLoginAt, lastLoginIp, loginCount, archivedAt)
  // ❌ 缺少 operationLogs 关联
}

差距分析

  • ❌ 部门关联: 使用字符串 department 而非外键 departmentId
  • ❌ 用户状态: 缺少 status 字段(虽然有文档,但代码未应用)
  • ❌ 审计字段: 缺少登录审计和归档时间字段
  • ❌ 角色枚举: 只有 USER 和 ADMIN,缺少 DEPT_ADMIN 和 SYSTEM_ADMIN
  • ⚠️ 向后兼容: isActive 字段存在,但需要与 status 字段配合使用

二、部门表结构 (Department Model)

设计方案要求

model Department {
  id          String   @id @default(uuid())
  code        String   @unique  // 部门编码
  name        String
  parentId    String?  // 父部门ID(层级结构)
  parent      Department? @relation("DepartmentHierarchy", ...)
  children    Department[] @relation("DepartmentHierarchy")
  
  level       Int      @default(1)  // 层级:1/2/3
  managerId   String?  // 部门负责人ID
  manager     User?    @relation("DepartmentManager", ...)
  
  status      String   @default("active")  // active/disabled/archived
  description String?
  sortOrder   Int      @default(0)
  
  users       User[]
  permissions DepartmentMaterialPermission[]
}

当前实现

model Department {
  id        String   @id @default(uuid())
  name      String   @unique
  createdAt DateTime @default(now())
  
  // ❌ 缺少所有层级结构字段
  // ❌ 缺少部门编码
  // ❌ 缺少状态管理
  // ❌ 缺少部门负责人
}

差距分析

  • ❌ 层级结构: 完全未实现,无法支持多级部门
  • ❌ 部门编码: 缺少唯一编码系统
  • ❌ 状态管理: 无法禁用或归档部门
  • ❌ 部门负责人: 无法设置部门管理员
  • ❌ 排序: 缺少排序字段

三、角色权限体系 (Role Enum)

设计方案要求

enum Role {
  USER           // 普通用户
  DEPT_ADMIN     // 部门管理员
  SYSTEM_ADMIN   // 系统管理员
  SUPER_ADMIN    // 超级管理员(保留 isSuperAdmin 字段作为额外标识)
}

当前实现

enum Role {
  USER
  ADMIN  // ❌ 只有一个管理员角色,无法区分部门管理员和系统管理员
}

差距分析

  • ❌ 角色细分: 只有2种角色,无法实现权限矩阵
  • ⚠️ 超级管理员: 通过 isSuperAdmin 字段实现,但角色枚举不完整
  • ❌ 权限控制: 无法区分部门管理员和系统管理员的权限范围

四、权限管理 (DepartmentMaterialPermission)

设计方案要求

model DepartmentMaterialPermission {
  departmentId       String    // 部门ID(外键)
  department         Department @relation(...)
  
  canView            Boolean   @default(false)
  canDownload        Boolean   @default(false)
  canShare           Boolean   @default(true)
  canUpload          Boolean   @default(true)  // 新增:是否允许上传
  
  // 权限继承
  inheritFromParent  Boolean   @default(true)
  parentPermissionId String?
  isOverride         Boolean   @default(false)
}

当前实现

model DepartmentMaterialPermission {
  department         String  // ❌ 字符串,非外键
  materialType       String
  canView            Boolean @default(false)  // ✅
  canDownload        Boolean @default(false)  // ✅
  canShare           Boolean @default(true)   // ✅
  linkedToDepartment String? // ⚠️ 关联部门(类似继承,但实现方式不同)
  
  // ❌ 缺少 canUpload 字段
  // ❌ 缺少权限继承机制(inheritFromParent, parentPermissionId, isOverride)
}

差距分析

  • ❌ 外键关联: 使用字符串 department 而非外键
  • ❌ 上传权限: 缺少 canUpload 字段
  • ⚠️ 权限继承: 通过 linkedToDepartment 实现类似功能,但不够灵活
  • ❌ 权限覆盖: 无法实现子部门覆盖父部门权限

五、用户操作日志 (UserOperationLog)

设计方案要求

model UserOperationLog {
  id          String   @id @default(uuid())
  userId      String
  user        User     @relation(...)
  
  action      String   // LOGIN/LOGOUT/CREATE_USER/UPDATE_USER/...
  targetType  String?  // USER/MATERIAL/DEPARTMENT/...
  targetId    String?
  
  details     Json?    // 操作详情(变更前后数据)
  ipAddress   String?
  userAgent   String?
  
  createdAt   DateTime @default(now())
}

当前实现

// ❌ 完全未实现
// 只有 MaterialLog(素材操作日志),没有用户操作日志

差距分析

  • ❌ 审计能力: 无法记录用户管理、部门管理、权限变更等操作
  • ⚠️ 素材日志: 已有 MaterialLog,但缺少用户操作日志
  • ❌ 安全审计: 无法追踪敏感操作(如删除用户、修改权限)

六、用户搜索与查询

设计方案要求

  • 多字段搜索:用户名、真实姓名、邮箱、手机号、部门名称、钉钉用户ID
  • 多维度筛选:角色、状态、是否激活、部门、注册时间范围、最后登录时间范围
  • 树形结构展示:按部门分组,显示管理员和普通用户

当前实现

// app/api/admin/users/route.ts
const users = await prisma.user.findMany({
  select: {
    id: true,
    email: true,
    username: true,
    realName: true,  // ✅ 有真实姓名
    role: true,
    isActive: true,
    canDownload: true,
    department: true,  // ⚠️ 字符串部门
    managedDepartment: true,
    createdAt: true,
  },
  orderBy: { createdAt: 'desc' },
});

差距分析

  • ⚠️ 搜索功能: 基础实现,但缺少多字段搜索和多维度筛选
  • ❌ 状态筛选: 无法按 status 筛选(因为字段不存在)
  • ❌ 登录时间筛选: 无法按最后登录时间筛选(字段不存在)
  • ⚠️ 树形展示: 前端可能有实现,但后端数据不支持层级结构

🎯 实施优先级建议

🔴 高优先级(第一阶段:基础优化)

  1. 用户状态管理 ⚠️

    • 添加 status 字段(pending/active/suspended/archived)
    • 添加审计字段(lastLoginAt, lastLoginIp, loginCount, archivedAt)
    • 更新登录和用户管理API
    • 状态: 文档已写好,需要应用到代码
  2. 用户表外键关联 🔴

    • 将 User.department(字符串)改为 User.departmentId(外键)
    • 数据迁移:将现有部门名称转换为部门ID
    • 更新所有相关代码(权限检查、用户查询等)
  3. 用户搜索增强 🟡

    • 实现多字段搜索(用户名、真实姓名、邮箱、手机号)
    • 实现多维度筛选(角色、状态、部门、时间范围)
    • 优化查询性能(添加索引)

🟡 中优先级(第二阶段:组织架构升级)

  1. 部门层级结构 🔴

    • 添加 parentId、level、code、status 字段
    • 实现部门树形查询
    • 更新部门管理UI
  2. 角色枚举扩展 🟡

    • 添加 DEPT_ADMIN 和 SYSTEM_ADMIN 角色
    • 更新权限检查逻辑
    • 更新管理员界面
  3. 权限继承机制 🟡

    • 实现父子部门权限继承
    • 添加 inheritFromParent、isOverride 字段
    • 更新权限查询逻辑

🟢 低优先级(第三阶段:完善功能)

  1. 用户操作日志 🟢

    • 创建 UserOperationLog 表
    • 实现日志记录功能
    • 添加日志查询API
  2. 部门负责人 🟢

    • 添加 managerId 字段
    • 实现部门管理员自动权限分配

📝 实施建议

阶段一:基础优化(1-2周)

目标: 完善用户状态管理和外键关联

  1. 应用用户状态字段

    • 更新 prisma/schema.prisma,添加 status 和审计字段
    • 运行数据库迁移
    • 运行数据迁移脚本(scripts/migrate-user-status.ts)
    • 更新所有API和前端代码
  2. 用户表外键关联

    • 更新 prisma/schema.prisma,将 department 改为 departmentId
    • 创建数据迁移脚本,将部门名称转换为部门ID
    • 更新所有使用 department 字段的代码
    • 更新权限检查逻辑(lib/department-permission.ts)
  3. 用户搜索增强

    • 更新用户列表API,支持多字段搜索和多维度筛选
    • 添加必要的数据库索引
    • 更新前端搜索UI

阶段二:组织架构升级(2-3周)

目标: 实现部门层级结构和权限继承

  1. 部门层级结构

    • 更新 prisma/schema.prisma,添加层级字段
    • 创建数据迁移脚本,为现有部门设置层级
    • 实现部门树形查询API
    • 更新部门管理UI
  2. 角色枚举扩展

    • 更新 Role 枚举,添加新角色
    • 更新权限检查逻辑
    • 更新管理员界面,支持角色选择
  3. 权限继承机制

    • 更新权限表结构,添加继承字段
    • 实现权限继承查询逻辑
    • 更新权限管理UI

阶段三:完善功能(1-2周)

目标: 添加操作日志和部门负责人功能

  1. 用户操作日志

    • 创建 UserOperationLog 表
    • 实现日志记录功能
    • 添加日志查询API和UI
  2. 部门负责人

    • 添加 managerId 字段
    • 实现部门管理员自动权限分配
    • 更新部门管理UI

⚠️ 注意事项

数据迁移风险

  1. 部门字符串转外键

    • 风险:如果部门名称不一致,可能导致数据丢失
    • 建议:先创建部门数据,再迁移用户数据
    • 验证:迁移后检查所有用户都有有效的 departmentId
  2. 用户状态迁移

    • 风险:如果 isActive 和 status 不一致,可能导致用户无法登录
    • 建议:迁移脚本要同时更新两个字段
    • 验证:检查所有用户的 status 字段都已设置

向后兼容性

  1. 过渡期支持

    • 保留 isActive 字段,同时支持 status 字段
    • 保留 department 字符串字段,同时支持 departmentId 外键
    • 逐步迁移,不要一次性删除旧字段
  2. API兼容

    • 新旧API并存,逐步切换
    • 前端代码逐步迁移到新字段

性能考虑

  1. 索引优化

    • 为 departmentId、status、lastLoginAt 等字段添加索引
    • 为权限查询添加复合索引
  2. 查询优化

    • 部门树形查询使用递归CTE或应用层构建
    • 权限继承查询使用缓存机制

📊 完成度统计

模块 完成度 预计工作量
用户状态管理 30% 3天
用户表外键关联 40% 5天
部门层级结构 0% 7天
角色权限体系 30% 5天
权限继承机制 50% 5天
用户操作日志 0% 3天
用户搜索功能 40% 3天
总计 约30% 约31天(6周)

报告生成时间: 2025-12-27
下一步: 与开发团队讨论实施优先级和时间安排