# 自动评价流程图 ```mermaid flowchart TD A[开始] --> B[查找正在运行的课程] B --> C{找到正在运行的课程?} C -->|否| D[返回错误: 没有找到正在运行的课程] C -->|是| E[获取评价数据] E --> F{是否有评价数据?} F -->|否| G[返回提示: 当前课程没有评价数据] F -->|是| H[查找第一个未操作的记录] H --> I{是否有未操作的记录?} I -->|否| J[返回提示: 所有评价项已完成] I -->|是| K[比较参数1和参数2] K --> L{参数是否匹配?} L -->|否| M[返回错误: 操作参数不匹配] L -->|是| N[计算操作时间和得分] N --> O[更新CourseEvaLog表] O --> P[重新计算课程总得分] P --> Q[更新CourseRunLog表] Q --> R[创建SSE通知数据] R --> S[通过SSE广播评价更新] S --> T[返回评价结果] D --> U[结束] G --> U J --> U M --> U T --> U ``` ## 详细流程说明 1. **查找正在运行的课程** - 查询CourseTime=0的课程记录 - 按RunLogID降序排列获取最新记录 2. **获取评价数据** - 使用自定义SQL查询获取自动评价所需数据 - 关联CourseEvaLog和CourseOperationNode表 - 筛选评价类型为1(客观评价)的记录 - 按序号排序 3. **查找第一个未操作的记录** - 遍历评价数据,找到IsOperated=0的第一个记录 - 确保按序号顺序处理 4. **参数匹配检查** - 比较请求参数Param1和TextParam1 - 比较请求参数Param2和TextParam2 - 只有当两个参数都匹配时才继续 5. **计算操作时间和得分** - 计算从课程开始到现在的操作时间(扣除暂停时间) - 计算操作得分:得分 = 评价赋分 - 评价失分 6. **更新评价记录** - 更新CourseEvaLog表中的是否操作字段为1 - 更新操作得分和操作时间 7. **重新计算课程总得分** - 汇总所有已操作项的得分 - 计算整个课程的总得分 8. **更新课程总分** - 更新CourseRunLog表中的课程得分 9. **创建SSE通知数据** - 构造包含评价更新信息的通知数据 - 包括运行记录ID、序号、评价名称、操作状态、得分等信息 10. **通过SSE广播评价更新** - 使用GlobalSSEManager向所有连接的客户端广播消息 - 事件类型为"evaluation_update" 11. **返回评价结果** - 返回包含操作状态、得分等信息的评价结果 ## SSE通知数据结构 ```json { "type": "evaluation_update", "runLogID": 运行记录ID, "seqNo": 序号, "evaName": "评价名称", "isOperated": 1, "operScore": 操作得分, "courseScore": 课程总分, "timestamp": "时间戳" } ```