LingxinMeng 1 yıl önce
ebeveyn
işleme
4056b483fa

+ 9 - 6
aarch64/pjisuv/master/service/for_competition.go

@@ -16,7 +16,8 @@ var (
 	dir                    = "/home/root/competition/"
 	commandArgs            = []string{"record", "--split", "--duration=1", "/pji_gps", "/data_read"}
 	topic                  = "/cicv_competition"
-	examBeginUrl           = "3"
+	urlExamBegin           = "36.110.106.142/exam/begin"
+	urlExamEnd             = "36.110.106.142/exam/end"
 	cacheMutex             sync.Mutex
 	cacheTeamName          map[string]time.Time
 	heartBeatTimeThreshold = 5 * time.Second // 心跳时间
@@ -26,6 +27,8 @@ var (
 // history record命令无法录制()
 func ForCompetition() {
 	go dataCollection()
+	go examBegin()
+	go examEnd()
 }
 
 // 全量数据采集
@@ -72,7 +75,7 @@ func examBegin() {
 			{
 				if !util.ContainsKey(cacheTeamName, teamName) { // 1 如果缓存数组中没有此队名,代表考试开始,缓存此队名,和当前时间戳
 					cacheTeamName[teamName] = time.Now()
-					// todo 发送http请求到begin接口
+					_, _ = util.PostJsonResponseString(urlExamBegin, map[string]string{"teamName": teamName})
 				} else { // 2 如果缓存数组中有此队名,代表考试进行中,刷新时间戳
 					cacheTeamName[teamName] = time.Now()
 				}
@@ -87,15 +90,15 @@ func examEnd() {
 		time.Sleep(time.Duration(1) * time.Second)
 		cacheMutex.Lock()
 		{
-			keysToDelete := []string{}
+			var keysToDelete []string
 			for teamName, heartBeatTime := range cacheTeamName {
 				if time.Since(heartBeatTime) > heartBeatTimeThreshold { // 检查缓存中的队名,如果超过心跳时间,则代表考试结束,删除缓存中的队名
 					keysToDelete = append(keysToDelete, teamName)
 				}
 			}
-			for _, key := range keysToDelete { // 检查缓存中的队名,如果超过心跳时间,则代表考试结束,删除缓存中的队名
-				delete(cacheTeamName, key)
-				// todo 发送http请求到end接口
+			for _, teamName := range keysToDelete { // 检查缓存中的队名,如果超过心跳时间,则代表考试结束,删除缓存中的队名
+				delete(cacheTeamName, teamName)
+				_, _ = util.PostJsonResponseString(urlExamEnd, map[string]string{"teamName": teamName})
 			}
 		}
 		cacheMutex.Unlock()

+ 1 - 0
amd64/web_server/entity/e_exam.go

@@ -11,4 +11,5 @@ type ExamPO struct {
 	BeginTime       time.Time `db:"begin_time"`
 	EndTime         time.Time `db:"end_time"`
 	ScoreReportPath time.Time `db:"score_report_path"`
+	TeamName        time.Time `db:"team_name"`
 }

+ 31 - 3
amd64/web_server/handler/h_exam.go

@@ -24,7 +24,7 @@ func Begin(c *gin.Context) {
 		return
 	}
 	// 插入到数据库
-	sqlTemplate, _ := util.ReadFile(c_db.SqlFilesMap["insert_exam.sql"])
+	sqlTemplate, _ := util.ReadFile(c_db.SqlFilesMap["exam-insert-begin_time-by-team_name.sql"])
 	if err := c_db.DoTx(sqlTemplate, []any{
 		param.TeamName,
 		time.Now(),
@@ -55,8 +55,36 @@ func End(c *gin.Context) {
 		return
 	}
 	// 1 查询指定队伍的开始时间最新的考试是否有结束时间,如果有则不在处理,如果没有则更新
-	// 插入到数据库
-	sqlTemplate, _ := util.ReadFile(c_db.SqlFilesMap["update.sql"])
+	var result entity.ExamPO
+	selectSql, err := util.ReadFile(c_db.SqlFilesMap["exam-select-latest-by-team_name.sql"])
+	if err != nil {
+		c_log.GlobalLogger.Error("读取sql文件报错:", err)
+		c.JSON(http.StatusBadRequest, commonEntity.Response{
+			Code: 500,
+			Msg:  "读取sql文件报错。",
+		})
+		return
+	}
+	// 可以传参数
+	if err = c_db.MysqlDb.Select(&result, selectSql, param.TeamName); err != nil {
+		c_log.GlobalLogger.Error("数据库查询报错:", err)
+		c.JSON(http.StatusBadRequest, commonEntity.Response{
+			Code: 500,
+			Msg:  "数据库查询报错。",
+		})
+		return
+	}
+	c_log.GlobalLogger.Info("数据库查询成功:", result)
+	if !result.EndTime.IsZero() {
+		c_log.GlobalLogger.Error("赛队", param.TeamName, "重复请求考试结束接口!")
+		c.JSON(http.StatusBadRequest, commonEntity.Response{
+			Code: 500,
+			Msg:  "重复请求。",
+		})
+		return
+	}
+	// 更新到数据库
+	sqlTemplate, _ := util.ReadFile(c_db.SqlFilesMap["exam-update-end_time-by-team_name.sql"])
 	if err := c_db.DoTx(sqlTemplate, []any{
 		time.Now(),
 		param.TeamName,

+ 2 - 2
amd64/web_server/main.go

@@ -69,8 +69,8 @@ func main() {
 	// 通过路由组设置全局前缀
 	projectPrefix := router.Group(ApplicationYaml.Web.RoutePrefix)
 	examPrefix := projectPrefix.Group("/exam")
-	examPrefix.POST("/begin", handler.Page) // 考试开始
-	examPrefix.POST("/end", handler.Page)   // 考试结束
+	examPrefix.POST("/begin", handler.Begin) // 考试开始
+	examPrefix.POST("/end", handler.End)     // 考试结束
 	reportPrefix := projectPrefix.Group("/report")
 	reportPrefix.POST("/page", handler.Page) // 分页查询
 	//reportPrefix.POST("/pdf", handler.Hello)  // pdf下载

+ 2 - 0
amd64/web_server/sql/exam-insert-begin_time-by-team_name.sql.sql

@@ -0,0 +1,2 @@
+insert into exam(team_name, begin_time)
+values (?, ?)

+ 4 - 0
amd64/web_server/sql/exam-select-latest-by-team_name.sql

@@ -0,0 +1,4 @@
+select id, begin_time, end_time, score_report_path_team, team_name
+from exam
+where team_name = ?
+order by begin_time desc limit 1

+ 0 - 0
amd64/web_server/sql/update_exam.sql → amd64/web_server/sql/exam-update-end_time-by-team_name.sql.sql


+ 0 - 2
amd64/web_server/sql/insert_exam.sql

@@ -1,2 +0,0 @@
-insert into device_monitor(team_name, begin_time)
-values (?, ?)

+ 21 - 0
common/util/u_http.go

@@ -135,3 +135,24 @@ func HttpGetStringAddHeadersResponseString(baseUrl string, headers map[string]st
 	//log.GlobalLogger.Info("发送http请求,请求路径=", baseUrl, ",请求头=", headers, "请求参数=", params, "请求结果=", result)
 	return result, nil
 }
+
+func PostJsonResponseString(url string, params map[string]string) (string, error) {
+	jsonData, err := json.Marshal(params)
+	if err != nil {
+		return "", err
+	}
+	resp, err := http.Post(url, "application/json", bytes.NewBuffer(jsonData))
+	if err != nil {
+		return "", err
+	}
+	defer func(Body io.ReadCloser) {
+		err := Body.Close()
+		if err != nil {
+		}
+	}(resp.Body)
+	body, err := io.ReadAll(resp.Body)
+	if err != nil {
+		return "", err
+	}
+	return string(body), nil
+}