Browse Source

提交自动化评价

yaojianjun 9 months ago
parent
commit
d14194e665

BIN
Tech/__debug_bin.exe


+ 3 - 8
Tech/controllers/sse.go

@@ -22,12 +22,7 @@ func (c *SSEController) Register() {
 	c.Ctx.Output.Header("Connection", "keep-alive")
 	c.Ctx.Output.Header("Connection", "keep-alive")
 	c.Ctx.Output.Header("Access-Control-Allow-Origin", "*")
 	c.Ctx.Output.Header("Access-Control-Allow-Origin", "*")
 
 
-	// 生成客户端ID
-	clientID := c.Ctx.Input.Param(":clientid")
-	if clientID == "" {
-		// 如果没有提供客户端ID,生成一个
-		clientID = fmt.Sprintf("client_%d", time.Now().UnixNano())
-	}
+	clientID := fmt.Sprintf("client_%d", time.Now().UnixNano())
 
 
 	// 创建消息通道
 	// 创建消息通道
 	messageChan := make(chan common.SSEMessage, 10)
 	messageChan := make(chan common.SSEMessage, 10)
@@ -79,10 +74,10 @@ func (c *SSEController) sendSSEMessage(message common.SSEMessage) {
 	if err != nil {
 	if err != nil {
 		return
 		return
 	}
 	}
-	
+
 	// 格式化SSE消息
 	// 格式化SSE消息
 	sseData := fmt.Sprintf("event: %s\ndata: %s\n\n", message.Event, string(data))
 	sseData := fmt.Sprintf("event: %s\ndata: %s\n\n", message.Event, string(data))
-	
+
 	// 在Beego v2中,使用ResponseController来写入响应
 	// 在Beego v2中,使用ResponseController来写入响应
 	c.Ctx.ResponseWriter.Write([]byte(sseData))
 	c.Ctx.ResponseWriter.Write([]byte(sseData))
 	c.Ctx.ResponseWriter.Flush()
 	c.Ctx.ResponseWriter.Flush()

+ 2 - 2
Tech/routers/router.go

@@ -114,7 +114,7 @@ func init() {
 
 
 	// /evalog/setscore
 	// /evalog/setscore
 	beego.Router("/evalog/setscore", &controllers.EvaLogController{}, "post:SetScore")
 	beego.Router("/evalog/setscore", &controllers.EvaLogController{}, "post:SetScore")
-	
+
 	// SSE路由
 	// SSE路由
-	beego.Router("/sse/register/:clientid", &controllers.SSEController{}, "get:Register")
+	beego.Router("/sse/register", &controllers.SSEController{}, "post:Register")
 }
 }

+ 1 - 1
Tech/sse_client_example.html

@@ -117,7 +117,7 @@
         
         
         // 连接SSE
         // 连接SSE
         function connectSSE() {
         function connectSSE() {
-            eventSource = new EventSource(`/sse/register/${clientID}`);
+            eventSource = new EventSource(`/sse/register`);
             
             
             eventSource.onopen = function(event) {
             eventSource.onopen = function(event) {
                 updateStatus('已连接', 'connected');
                 updateStatus('已连接', 'connected');

+ 8 - 0
Tech/自动化评价说明.docx

@@ -0,0 +1,8 @@
+ 流程图2. 查询到电子考评表,评价最近应该需要的自动评价点
+
+3.添加操作日志接口
+
+ 4.sse通知前端评分更新
+
+
+

+ 67 - 23
Tech/自动评价流程图.md

@@ -1,47 +1,91 @@
-# 自动评价流程图(简化版)
+# 自动评价流程图
 
 
 ```mermaid
 ```mermaid
 flowchart TD
 flowchart TD
     A[开始] --> B[查找正在运行的课程]
     A[开始] --> B[查找正在运行的课程]
-    B --> C[获取评价数据]
-    C --> D[查找第一个未操作的记录]
-    D --> E{参数是否匹配?}
-    E -->|否| F[返回参数不匹配]
-    E -->|是| G[计算操作时间和得分]
-    G --> H[更新评价记录]
-    H --> I[更新课程总分]
-    I --> J[返回评价结果]
-    F --> K[结束]
-    J --> K
+    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. **查找正在运行的课程**
 1. **查找正在运行的课程**
-   - 获取当前CourseTime=0的课程
+   - 查询CourseTime=0的课程记录
+   - 按RunLogID降序排列获取最新记录
 
 
 2. **获取评价数据**
 2. **获取评价数据**
-   - 查询该课程的客观评价数据(EvaType=1)
+   - 使用自定义SQL查询获取自动评价所需数据
+   - 关联CourseEvaLog和CourseOperationNode表
+   - 筛选评价类型为1(客观评价)的记录
    - 按序号排序
    - 按序号排序
 
 
 3. **查找第一个未操作的记录**
 3. **查找第一个未操作的记录**
-   - 找到IsOperated=0的第一个记录
+   - 遍历评价数据,找到IsOperated=0的第一个记录
+   - 确保按序号顺序处理
 
 
 4. **参数匹配检查**
 4. **参数匹配检查**
    - 比较请求参数Param1和TextParam1
    - 比较请求参数Param1和TextParam1
    - 比较请求参数Param2和TextParam2
    - 比较请求参数Param2和TextParam2
+   - 只有当两个参数都匹配时才继续
 
 
 5. **计算操作时间和得分**
 5. **计算操作时间和得分**
-   - 计算从课程开始到现在的操作时间
+   - 计算从课程开始到现在的操作时间(扣除暂停时间)
    - 计算操作得分:得分 = 评价赋分 - 评价失分
    - 计算操作得分:得分 = 评价赋分 - 评价失分
 
 
 6. **更新评价记录**
 6. **更新评价记录**
-   - 标记为已操作(IsOperated=1)
-   - 更新操作得分和时间
+   - 更新CourseEvaLog表中的是否操作字段为1
+   - 更新操作得分和操作时间
 
 
-7. **更新课程总分**
-   - 重新计算所有已操作项的总分
-   - 更新课程的总得分
+7. **重新计算课程总得分**
+   - 汇总所有已操作项的得分
+   - 计算整个课程的总得分
 
 
-8. **返回评价结果**
-   - 包含操作状态、得分等信息
+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": "时间戳"
+}
+```