Files
Environment-Monitoring-System/Report/系统设计_第三部分.md
ChuXun 02a830145e 1
2025-10-25 19:18:43 +08:00

14 KiB

2.2 类和对象的设计

本节定义了系统核心业务对象的静态结构,即类图。这些类图展示了系统中的主要实体、它们的属性和方法,以及它们之间的关系。

2.2.1 UserAccount 类图

UserAccount类是系统中用户账户的核心模型,包含用户的基本信息、认证信息和角色信息。

classDiagram
    class UserAccount {
        -Long id
        -String name
        -String phone
        -String email
        -String password
        -Gender gender
        -UserRole role
        -UserStatus status
        -Integer gridX
        -Integer gridY
        -String region
        -String level
        -List~String~ skills
        -Boolean enabled
        -Double currentLatitude
        -Double currentLongitude
        -Integer failedLoginAttempts
        -LocalDateTime lockoutEndTime
        -LocalDateTime createdAt
        -LocalDateTime updatedAt
        +getId() Long
        +getName() String
        +getPhone() String
        +getEmail() String
        +getPassword() String
        +getRole() UserRole
        +getStatus() UserStatus
        +isEnabled() Boolean
        +setPassword(String) void
        +updateProfile(UserUpdateRequest) void
        +isAccountNonLocked() Boolean
    }
    
    class UserRole {
        <<enumeration>>
        ADMIN
        SUPERVISOR
        GRID_WORKER
        DECISION_MAKER
        PUBLIC_USER
    }
    
    class UserStatus {
        <<enumeration>>
        ACTIVE
        INACTIVE
        SUSPENDED
    }
    
    class Gender {
        <<enumeration>>
        MALE
        FEMALE
        OTHER
    }
    
    UserAccount --> UserRole
    UserAccount --> UserStatus
    UserAccount --> Gender

2.2.2 Feedback 类图

Feedback类表示用户提交的环境问题反馈,是系统的核心业务对象之一。

classDiagram
    class Feedback {
        -Long id
        -String eventId
        -String title
        -String description
        -PollutionType pollutionType
        -SeverityLevel severityLevel
        -FeedbackStatus status
        -String textAddress
        -Integer gridX
        -Integer gridY
        -Double latitude
        -Double longitude
        -UserAccount submitter
        -LocalDateTime createdAt
        -LocalDateTime updatedAt
        -List~Attachment~ attachments
        -Task relatedTask
        +getId() Long
        +getEventId() String
        +getTitle() String
        +getDescription() String
        +getPollutionType() PollutionType
        +getSeverityLevel() SeverityLevel
        +getStatus() FeedbackStatus
        +updateStatus(FeedbackStatus) void
        +addAttachment(Attachment) void
    }
    
    class PollutionType {
        <<enumeration>>
        AIR
        WATER
        SOIL
        NOISE
        LIGHT
        OTHER
    }
    
    class SeverityLevel {
        <<enumeration>>
        LOW
        MEDIUM
        HIGH
        CRITICAL
    }
    
    class FeedbackStatus {
        <<enumeration>>
        SUBMITTED
        AI_REVIEWED
        PENDING_REVIEW
        APPROVED
        REJECTED
        PROCESSED
        CLOSED
    }
    
    class Attachment {
        -Long id
        -String fileName
        -String filePath
        -String fileType
        -Long fileSize
        -LocalDateTime uploadedAt
        +getId() Long
        +getFileName() String
        +getFilePath() String
    }
    
    Feedback --> PollutionType
    Feedback --> SeverityLevel
    Feedback --> FeedbackStatus
    Feedback --> UserAccount : submitter
    Feedback "1" --> "*" Attachment
    Feedback "1" --> "0..1" Task

2.2.3 Task 类图

Task类表示网格员需要执行的工作任务,通常由反馈生成。

classDiagram
    class Task {
        -Long id
        -Feedback feedback
        -UserAccount assignee
        -UserAccount createdBy
        -TaskStatus status
        -LocalDateTime assignedAt
        -LocalDateTime completedAt
        -LocalDateTime createdAt
        -LocalDateTime updatedAt
        -String title
        -String description
        -PollutionType pollutionType
        -SeverityLevel severityLevel
        -String textAddress
        -Integer gridX
        -Integer gridY
        -Double latitude
        -Double longitude
        -List~TaskHistory~ history
        -Assignment assignment
        -List~TaskSubmission~ submissions
        +getId() Long
        +getStatus() TaskStatus
        +getAssignee() UserAccount
        +updateStatus(TaskStatus) void
        +assign(UserAccount) void
        +addSubmission(TaskSubmission) void
    }
    
    class TaskStatus {
        <<enumeration>>
        CREATED
        ASSIGNED
        ACCEPTED
        IN_PROGRESS
        SUBMITTED
        APPROVED
        REJECTED
        COMPLETED
    }
    
    class TaskHistory {
        -Long id
        -Task task
        -UserAccount actor
        -TaskStatus oldStatus
        -TaskStatus newStatus
        -String remarks
        -LocalDateTime timestamp
        +getId() Long
        +getTask() Task
        +getOldStatus() TaskStatus
        +getNewStatus() TaskStatus
    }
    
    class TaskSubmission {
        -Long id
        -Task task
        -UserAccount submitter
        -String description
        -LocalDateTime submittedAt
        -List~Attachment~ attachments
        +getId() Long
        +getTask() Task
        +getSubmitter() UserAccount
        +addAttachment(Attachment) void
    }
    
    Task --> TaskStatus
    Task --> UserAccount : assignee
    Task --> UserAccount : createdBy
    Task "1" --> "*" TaskHistory
    Task "1" --> "0..1" Assignment
    Task "1" --> "*" TaskSubmission
    Task "0..1" --> "1" Feedback
    TaskHistory --> Task
    TaskHistory --> UserAccount : actor
    TaskSubmission --> Task
    TaskSubmission --> UserAccount : submitter
    TaskSubmission "1" --> "*" Attachment

2.2.4 GridAssignment 类图

Grid类表示地理空间的网格单元,Assignment类表示任务分配记录。

classDiagram
    class Grid {
        -Long id
        -Integer gridX
        -Integer gridY
        -String cityName
        -String districtName
        -String description
        -Boolean isObstacle
        +getId() Long
        +getGridX() Integer
        +getGridY() Integer
        +isObstacle() Boolean
    }
    
    class Assignment {
        -Long id
        -Task task
        -UserAccount assigner
        -LocalDateTime assignmentTime
        -LocalDateTime deadline
        -AssignmentStatus status
        -String remarks
        +getId() Long
        +getTask() Task
        +getAssigner() UserAccount
        +getStatus() AssignmentStatus
        +updateStatus(AssignmentStatus) void
    }
    
    class AssignmentStatus {
        <<enumeration>>
        PENDING
        ACCEPTED
        REJECTED
        COMPLETED
    }
    
    Assignment --> Task
    Assignment --> UserAccount : assigner
    Assignment --> AssignmentStatus

2.3 动态模型设计

本节描述了系统在运行时,对象之间的交互行为。通过时序图和状态图,展示了系统的动态行为和状态转换。

2.3.1 核心时序图

时序图展示了系统中对象之间的交互序列,清晰地表达了业务流程的执行顺序和对象间的消息传递。

用户登录认证时序图

sequenceDiagram
    participant User as 用户
    participant AuthController as 认证控制器
    participant AuthService as 认证服务
    participant JwtUtil as JWT工具

    User->>AuthController: POST /api/auth/login (email, password)
    AuthController->>AuthService: signIn(LoginRequest)
    AuthService->>AuthService: 验证凭证
    alt 验证成功
        AuthService->>JwtUtil: generateToken(user)
        JwtUtil-->>AuthService: 返回JWT令牌
        AuthService-->>AuthController: 返回JwtAuthenticationResponse
        AuthController-->>User: 200 OK (token)
    else 验证失败
        AuthService-->>AuthController: 抛出AuthenticationException
        AuthController-->>User: 401 Unauthorized
    end

反馈提交与处理时序图

sequenceDiagram
    participant User as 用户
    participant FeedbackController as 反馈控制器
    participant FeedbackService as 反馈服务
    participant EventPublisher as 事件发布器
    participant FeedbackAiReviewService as AI审核服务
    participant TaskService as 任务服务

    User->>FeedbackController: POST /api/feedback/submit
    FeedbackController->>FeedbackService: submitFeedback(request, files)
    FeedbackService->>FeedbackService: 生成事件ID
    FeedbackService->>FeedbackService: 保存反馈和附件
    FeedbackService->>EventPublisher: publishEvent(FeedbackSubmittedEvent)
    FeedbackService-->>FeedbackController: 返回反馈信息
    FeedbackController-->>User: 201 Created

    EventPublisher-->>FeedbackAiReviewService: 异步触发AI审核
    FeedbackAiReviewService->>FeedbackAiReviewService: 分析反馈内容
    FeedbackAiReviewService->>FeedbackService: updateFeedbackStatus(AI_REVIEWED)
    
    Note over User,TaskService: 主管审核流程
    
    alt 主管批准反馈
        FeedbackService->>TaskService: createTaskFromFeedback(feedback)
        TaskService->>TaskService: 创建任务
        TaskService-->>FeedbackService: 返回创建的任务
        FeedbackService->>FeedbackService: updateFeedbackStatus(PROCESSED)
    else 主管拒绝反馈
        FeedbackService->>FeedbackService: updateFeedbackStatus(REJECTED)
    end

主管分配任务时序图

sequenceDiagram
    participant Supervisor as 主管
    participant TaskMgmtController as 任务管理控制器
    participant TaskService as 任务服务
    participant AssignmentService as 分配服务
    participant NotificationService as 通知服务
    participant GridWorker as 网格员

    Supervisor->>TaskMgmtController: POST /tasks/{taskId}/assign (workerId)
    TaskMgmtController->>TaskService: assignTask(taskId, workerId)
    TaskService->>TaskService: 验证任务状态
    TaskService->>AssignmentService: createAssignment(task, worker)
    AssignmentService->>AssignmentService: 创建分配记录
    AssignmentService-->>TaskService: 返回Assignment
    TaskService->>TaskService: 更新任务状态为ASSIGNED
    TaskService->>NotificationService: notifyWorker(workerId, taskId)
    NotificationService->>NotificationService: 创建通知
    TaskService-->>TaskMgmtController: 分配成功
    TaskMgmtController-->>Supervisor: 200 OK
    
    NotificationService-->>GridWorker: 发送任务通知

网格员处理任务时序图

sequenceDiagram
    participant GridWorker as 网格员
    participant WorkerTaskController as 网格员任务控制器
    participant TaskService as 任务服务
    participant PathfindingService as 寻路服务
    participant Supervisor as 主管

    GridWorker->>WorkerTaskController: POST /api/worker/tasks/{taskId}/accept
    WorkerTaskController->>TaskService: acceptTask(taskId, workerId)
    TaskService->>TaskService: 更新任务状态为ACCEPTED
    TaskService-->>WorkerTaskController: 返回更新后的任务
    WorkerTaskController-->>GridWorker: 200 OK
    
    GridWorker->>WorkerTaskController: GET /api/pathfinding/find?start=x,y&end=a,b
    WorkerTaskController->>PathfindingService: findPath(start, end)
    PathfindingService->>PathfindingService: 执行A*算法
    PathfindingService-->>WorkerTaskController: 返回路径点列表
    WorkerTaskController-->>GridWorker: 200 OK (路径数据)
    
    GridWorker->>WorkerTaskController: POST /api/worker/tasks/{taskId}/submit
    WorkerTaskController->>TaskService: submitTaskCompletion(taskId, workerId, request, files)
    TaskService->>TaskService: 验证并更新任务状态为SUBMITTED
    TaskService->>TaskService: 保存处理结果和附件
    TaskService-->>WorkerTaskController: 返回更新后的任务
    WorkerTaskController-->>GridWorker: 200 OK
    
    Note over GridWorker,Supervisor: 主管审核流程
    
    alt 主管批准任务完成
        TaskService->>TaskService: 更新任务状态为COMPLETED
    else 主管拒绝任务完成
        TaskService->>TaskService: 更新任务状态为REJECTED
        TaskService->>NotificationService: 通知网格员重新处理
    end

2.3.2 核心状态图

状态图展示了系统中关键对象的状态变化和转换条件,帮助理解对象的生命周期。

反馈状态机 (Feedback Status)

stateDiagram-v2
    [*] --> SUBMITTED: 用户提交反馈
    SUBMITTED --> AI_REVIEWED: AI自动审核
    AI_REVIEWED --> PENDING_REVIEW: 进入人工审核队列
    PENDING_REVIEW --> APPROVED: 主管批准
    PENDING_REVIEW --> REJECTED: 主管拒绝
    APPROVED --> PROCESSED: 创建关联任务
    PROCESSED --> CLOSED: 任务完成
    REJECTED --> [*]
    CLOSED --> [*]

任务状态机 (Task Status)

stateDiagram-v2
    [*] --> CREATED: 创建任务
    CREATED --> ASSIGNED: 分配给网格员
    ASSIGNED --> ACCEPTED: 网格员接受
    ASSIGNED --> CREATED: 网格员拒绝
    ACCEPTED --> IN_PROGRESS: 开始处理
    IN_PROGRESS --> SUBMITTED: 提交处理结果
    SUBMITTED --> APPROVED: 主管批准
    SUBMITTED --> REJECTED: 主管拒绝
    REJECTED --> IN_PROGRESS: 重新处理
    APPROVED --> COMPLETED: 完成归档
    COMPLETED --> [*]

用户状态机 (User Status)

stateDiagram-v2
    [*] --> ACTIVE: 创建账户
    ACTIVE --> SUSPENDED: 管理员暂停
    SUSPENDED --> ACTIVE: 管理员重新激活
    ACTIVE --> INACTIVE: 长期未使用
    INACTIVE --> ACTIVE: 用户登录
    INACTIVE --> [*]: 账户删除
    SUSPENDED --> [*]: 账户删除