## 时序图
```plantuml
@startuml
title AI问诊服务时序图

actor User as U
participant AIDoctor as AD
participant Department as D
participant Consultation as C
participant Prescription as P

U -> U: 决定选择或创建AI医生
alt 选择已有医生
    U -> AD: 选择现有AI医生
else 创建新医生
    U -> AD: 输入医生属性信息创建新AI医生
end
U -> AD: 发起问诊，提供信息
AD -> AD: 接收用户信息
AD -> AD: 与用户对话
AD -> P: 生成处方
AD -> U: 返回对话结果及处方
U -> C: 创建问诊记录实例，关联相关对象（自身、医生、科室等）
C -> D: 获取科室信息（若需要完整记录科室情况）
D -> C: 返回科室信息
C -> C: 整合问诊信息（包含处方等）
C -> C: 保存到数据库
U -> C: 查询问诊记录（可按需指定查询条件）
C -> U: 返回相应问诊记录
@enduml
```

## 类图
```plantuml
@startuml
class User {
    - userId : int
    + selectExistingDoctor() : AIDoctor
    + createCustomDoctor(doctorInfo : Map<String, String>) : AIDoctor
    + startConsultation(doctor : AIDoctor) : void
    + viewConsultationRecords() : List<Consultation>
}

class AIDoctor {
    - objectid : int
    - avator : String
    - name : String
    - gender : String
    - age : int
    - title : String
    - qualications : String
    - desc : String
    - depart : String
    - specialty : String
    - scrid : int
    + haveConversation(userInfo : String) : String
    + generatePrescription() : Prescription
}

class Department {
    - objectid : int
    - desc : String
    - name : String
    - srcid : int
}

class Consultation {
    - objectid : int
    - user : User
    - content : String
    - doctor : AIDoctor
    - department : Department
    - title : String
    + saveToDatabase() : void
    + queryFromDatabase(queryParams : Map<String, String>) : Consultation
}

class Prescription {
    - prescriptionId : int
    - medicineList : List<String>
    - usageInstructions : String
}

User "1" --> "0..*" AIDoctor : selects/ creates
User "1" --> "0..*" Consultation : initiates/ views
AIDoctor "1" --> "1" Prescription : generates
Consultation "1" --> "1" Prescription : contains
Consultation "1" --> "1" Department : belongs to
@enduml
```

# 状态图
```plantuml
@startuml
[*] --> Initiated
state Initiated {
    [*] --> SelectingDoctor
    SelectingDoctor : 用户决定选择已有或创建新AI医生
    SelectingDoctor --> DoctorSelected : 完成医生选择
}
state DoctorSelected {
    [*] --> ProvidingInfo
    ProvidingInfo : 用户向选定医生提供问诊信息
    ProvidingInfo --> ConversationInProgress : 医生开始对话交流
}
state ConversationInProgress {
    [*] --> PrescriptionGenerated
    PrescriptionGenerated : AI医生生成处方
    PrescriptionGenerated --> ConversationFinished : 对话结束
}
state ConversationFinished {
    [*] --> CreatingRecord
    CreatingRecord : 创建问诊记录实例
    CreatingRecord --> SavingRecord : 整合记录信息
    SavingRecord --> RecordSaved : 保存到数据库
    RecordSaved --> [*]
}
@enduml
```
- 在这个状态图中：
[*] 表示初始状态和最终状态（即整个流程开始前的状态和流程完整结束后的状态）。
从 Initiated 开始，代表问诊流程启动，首先进入 SelectingDoctor 状态，意味着用户要进行选择 AI 医生的操作，完成选择后进入 DoctorSelected 状态。
在 DoctorSelected 状态下，用户接着要提供问诊信息，进入 ProvidingInfo 状态，随后 AI 医生开始与之对话，进入 ConversationInProgress 状态。
当 AI 医生生成处方后，进入 PrescriptionGenerated 状态，对话结束后到达 ConversationFinished 状态。
最后在 ConversationFinished 状态下依次进行创建问诊记录、整合信息并保存记录的操作，最终达到 RecordSaved 状态，表示整个问诊记录成功保存到数据库，流程结束返回初始的结束状态 [*] 。


## 活动图
```plantuml
@startuml
start
:用户发起问诊;
if (选择已有AI医生?) then (是)
    :选择已有的AI医生;
else (否)
    :输入信息创建新的AI医生;
endif
:用户提供问诊信息;
:AI医生接收信息并对话;
:AI医生生成处方;
:结束对话;
:创建问诊记录实例;
:关联用户、医生、科室等信息;
:整合问诊记录内容（包含处方）;
:保存问诊记录到数据库;
:用户查询问诊记录;
stop
@enduml
```
在这个活动图中：
首先通过 “用户发起问诊” 活动开始整个流程。
接着通过一个条件判断分支来决定是选择已有 AI 医生还是创建新的 AI 医生，根据用户的选择执行相应的活动。
然后用户提供问诊信息后，AI 医生依次进行接收信息并对话、生成处方以及结束对话等活动。
后续开展创建问诊记录实例，并关联相关的用户、医生、科室等重要信息，再整合包含处方在内的问诊记录内容，接着将其保存到数据库中。
最后用户可以进行查询问诊记录的活动，整个流程结束。
此活动图从比较宏观的角度展示了 AI 问诊服务中主要的活动以及它们之间的先后顺序和逻辑关系，

```plantuml
@startuml
class "病人" {
  - patientId: int
  - name: string
  - age: int
  - contactInfo: string
  + register()
  + login()
  + updateProfile()
}

class "问答记录" {
  - qnaId: int
  - patientId: int
  - question: string
  - answer: string
  - timestamp: Date
  + addQuestion()
  + addAnswer()
  + getQnAHistory()
}

class "诊断记录" {
  - diagnosisId: int
  - patientId: int
  - diagnosisResult: string
  - diagnosisDate: Date
  + generateDiagnosis()
  + compareDiagnosis()
}

class "智能诊断" {
  - algorithmVersion: string
  - accuracyRate: float
  + performSmartDiagnosis()
}

class "普通AI诊断" {
  - algorithmVersion: string
  + performStandardDiagnosis()
}

class "管理员" {
  - adminId: int
  - username: string
  - password: string
  + manageUsers()
  + manageDiagnoses()
}

"病人" -- "问答记录" : 1..*
"病人" -- "诊断记录" : 1..*
"诊断记录" <|-- "智能诊断"
"诊断记录" <|-- "普通AI诊断"
"管理员" -- "病人" : 管理
"管理员" -- "诊断记录" : 管理
@enduml
```