|
@@ -25,7 +25,6 @@ import (
|
|
|
|
|
|
var (
|
|
|
defaultTime = time.Date(2006, time.January, 2, 15, 4, 5, 0, time.Local)
|
|
|
- cacheMutex sync.Mutex
|
|
|
cacheTeamName sync.Map // = make(map[string]time.Time)
|
|
|
heartBeatTimeThreshold = 5 * time.Second // 心跳时间
|
|
|
InitialPositionX = 565266.0482367771 // todo 需要比赛确认起点
|
|
@@ -169,85 +168,79 @@ func ExamEndTicker() {
|
|
|
select {
|
|
|
// 定时器触发时执行的代码
|
|
|
case <-ticker.C:
|
|
|
- cacheMutex.Lock()
|
|
|
- defer cacheMutex.Unlock()
|
|
|
- {
|
|
|
- var keysToDelete []string
|
|
|
- cacheTeamName.Range(func(teamName, heartBeatTimeAny interface{}) bool {
|
|
|
- heartBeatTime, _ := util.AnyToTime(heartBeatTimeAny)
|
|
|
- if time.Since(heartBeatTime) > heartBeatTimeThreshold { // 检查缓存中的队名,如果超过心跳时间,则代表考试结束,删除缓存中的队名
|
|
|
- c_log.GlobalLogger.Infof("队伍 %v 心跳超时,比赛结束。", teamName)
|
|
|
- keysToDelete = append(keysToDelete, fmt.Sprintf("%v", teamName))
|
|
|
- }
|
|
|
- return true // 如果要终止遍历,返回 false
|
|
|
- })
|
|
|
+ var keysToDelete []string
|
|
|
+ cacheTeamName.Range(func(teamName, heartBeatTimeAny interface{}) bool {
|
|
|
+ heartBeatTime, _ := util.AnyToTime(heartBeatTimeAny)
|
|
|
+ if time.Since(heartBeatTime) > heartBeatTimeThreshold { // 检查缓存中的队名,如果超过心跳时间,则代表考试结束,删除缓存中的队名
|
|
|
+ c_log.GlobalLogger.Infof("队伍 %v 心跳超时,比赛结束。", teamName)
|
|
|
+ keysToDelete = append(keysToDelete, fmt.Sprintf("%v", teamName))
|
|
|
+ }
|
|
|
+ return true // 如果要终止遍历,返回 false
|
|
|
+ })
|
|
|
|
|
|
- //for teamName, heartBeatTime := range cacheTeamName {
|
|
|
- // if time.Since(heartBeatTime) > heartBeatTimeThreshold { // 检查缓存中的队名,如果超过心跳时间,则代表考试结束,删除缓存中的队名
|
|
|
- // c_log.GlobalLogger.Infof("队伍 %v 心跳超时,比赛结束。", teamName)
|
|
|
- //
|
|
|
- // keysToDelete = append(keysToDelete, teamName)
|
|
|
- // }
|
|
|
- //}
|
|
|
- for _, teamName := range keysToDelete { // 检查缓存中的队名,如果超过心跳时间,则代表考试结束,删除缓存中的队名
|
|
|
- cacheTeamName.Delete(teamName)
|
|
|
- //delete(cacheTeamName, teamName)
|
|
|
- // 1 查询指定队伍的开始时间最新的考试是否有结束时间,如果有则不在处理,如果没有则更新
|
|
|
- var result []webServerEntity.ExamPo
|
|
|
- selectSql, err := util.ReadFile(c_db.SqlFilesMap["exam-select-latest-by-team_name.sql"])
|
|
|
- if err != nil {
|
|
|
- c_log.GlobalLogger.Error("读取sql文件报错:", err)
|
|
|
- return
|
|
|
- }
|
|
|
- // 可以传参数
|
|
|
- if err = c_db.MysqlDb.Select(&result, selectSql, teamName); err != nil {
|
|
|
- c_log.GlobalLogger.Error("数据库查询报错:", err)
|
|
|
- return
|
|
|
- }
|
|
|
- if !result[0].EndTime.Equal(defaultTime) {
|
|
|
- c_log.GlobalLogger.Error("赛队", teamName, "考试已结束!")
|
|
|
- return
|
|
|
- }
|
|
|
- // 更新到数据库(只更新最新一条)
|
|
|
- stage := ""
|
|
|
- if time.Now().Before(trialBegin) {
|
|
|
- stage = "表演赛"
|
|
|
- } else if time.Now().After(trialBegin) && time.Now().Before(trialEnd) {
|
|
|
- stage = "预赛"
|
|
|
- } else {
|
|
|
- stage = "决赛"
|
|
|
- }
|
|
|
- // 查询最新一条的id
|
|
|
- selectSql, err = util.ReadFile(c_db.SqlFilesMap["exam-select-max-id-by-team_name-and-topic.sql"])
|
|
|
- if err != nil {
|
|
|
- c_log.GlobalLogger.Error("读取sql文件报错:", err)
|
|
|
- return
|
|
|
- }
|
|
|
- // 可以传参数
|
|
|
- var resultId []int
|
|
|
- if err = c_db.MysqlDb.Select(&resultId, selectSql, teamName, stage); err != nil {
|
|
|
- c_log.GlobalLogger.Error("数据库查询报错:", err)
|
|
|
- return
|
|
|
- }
|
|
|
- if len(resultId) == 1 {
|
|
|
- c_log.GlobalLogger.Info("更新数据结束时间,id为:", resultId)
|
|
|
+ //for teamName, heartBeatTime := range cacheTeamName {
|
|
|
+ // if time.Since(heartBeatTime) > heartBeatTimeThreshold { // 检查缓存中的队名,如果超过心跳时间,则代表考试结束,删除缓存中的队名
|
|
|
+ // c_log.GlobalLogger.Infof("队伍 %v 心跳超时,比赛结束。", teamName)
|
|
|
+ //
|
|
|
+ // keysToDelete = append(keysToDelete, teamName)
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+ for _, teamName := range keysToDelete { // 检查缓存中的队名,如果超过心跳时间,则代表考试结束,删除缓存中的队名
|
|
|
+ cacheTeamName.Delete(teamName)
|
|
|
+ //delete(cacheTeamName, teamName)
|
|
|
+ // 1 查询指定队伍的开始时间最新的考试是否有结束时间,如果有则不在处理,如果没有则更新
|
|
|
+ var result []webServerEntity.ExamPo
|
|
|
+ selectSql, err := util.ReadFile(c_db.SqlFilesMap["exam-select-latest-by-team_name.sql"])
|
|
|
+ if err != nil {
|
|
|
+ c_log.GlobalLogger.Error("读取sql文件报错:", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 可以传参数
|
|
|
+ if err = c_db.MysqlDb.Select(&result, selectSql, teamName); err != nil {
|
|
|
+ c_log.GlobalLogger.Error("数据库查询报错:", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if !result[0].EndTime.Equal(defaultTime) {
|
|
|
+ c_log.GlobalLogger.Error("赛队", teamName, "考试已结束!")
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 更新到数据库(只更新最新一条)
|
|
|
+ stage := ""
|
|
|
+ if time.Now().Before(trialBegin) {
|
|
|
+ stage = "表演赛"
|
|
|
+ } else if time.Now().After(trialBegin) && time.Now().Before(trialEnd) {
|
|
|
+ stage = "预赛"
|
|
|
+ } else {
|
|
|
+ stage = "决赛"
|
|
|
+ }
|
|
|
+ // 查询最新一条的id
|
|
|
+ selectSql, err = util.ReadFile(c_db.SqlFilesMap["exam-select-max-id-by-team_name-and-topic.sql"])
|
|
|
+ if err != nil {
|
|
|
+ c_log.GlobalLogger.Error("读取sql文件报错:", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 可以传参数
|
|
|
+ var resultId []int
|
|
|
+ if err = c_db.MysqlDb.Select(&resultId, selectSql, teamName, stage); err != nil {
|
|
|
+ c_log.GlobalLogger.Error("数据库查询报错:", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if len(resultId) == 1 {
|
|
|
+ c_log.GlobalLogger.Info("更新数据结束时间,id为:", resultId)
|
|
|
|
|
|
- sqlTemplate, _ := util.ReadFile(c_db.SqlFilesMap["exam-update-end_time-by-id.sql"])
|
|
|
- if err := c_db.DoTx(sqlTemplate, []any{
|
|
|
- time.Now(),
|
|
|
- resultId[0],
|
|
|
- }); err != nil {
|
|
|
- c_log.GlobalLogger.Error("插入数据报错:", err)
|
|
|
- return
|
|
|
- }
|
|
|
- } else {
|
|
|
- c_log.GlobalLogger.Error("查询id失败:", resultId)
|
|
|
+ sqlTemplate, _ := util.ReadFile(c_db.SqlFilesMap["exam-update-end_time-by-id.sql"])
|
|
|
+ if err := c_db.DoTx(sqlTemplate, []any{
|
|
|
+ time.Now(),
|
|
|
+ resultId[0],
|
|
|
+ }); err != nil {
|
|
|
+ c_log.GlobalLogger.Error("插入数据报错:", err)
|
|
|
+ return
|
|
|
}
|
|
|
- c_log.GlobalLogger.Infof("队伍 %v 的考试结束。", teamName)
|
|
|
-
|
|
|
+ } else {
|
|
|
+ c_log.GlobalLogger.Error("查询id失败:", resultId)
|
|
|
}
|
|
|
+ c_log.GlobalLogger.Infof("队伍 %v 的考试结束。", teamName)
|
|
|
}
|
|
|
- cacheMutex.Unlock()
|
|
|
}
|
|
|
}
|
|
|
}
|