h_exam.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. package handler
  2. import (
  3. webServerEntity "cicv-data-closedloop/amd64/web_server/entity"
  4. "cicv-data-closedloop/common/config/c_db"
  5. "cicv-data-closedloop/common/config/c_log"
  6. commonEntity "cicv-data-closedloop/common/entity"
  7. "cicv-data-closedloop/common/util"
  8. "github.com/gin-gonic/gin"
  9. "github.com/signintech/gopdf"
  10. "io"
  11. "log"
  12. "net/http"
  13. "os"
  14. "time"
  15. )
  16. var defaultTime = time.Date(2006, time.January, 2, 15, 4, 5, 0, time.Local)
  17. // 考试开始时间
  18. func Begin(c *gin.Context) {
  19. param := new(webServerEntity.ExamPao)
  20. // 映射到结构体
  21. if err := c.ShouldBindJSON(&param); err != nil {
  22. c_log.GlobalLogger.Error("项目启动接收请求参数报错:", err)
  23. c.JSON(http.StatusBadRequest, commonEntity.Response{
  24. Code: 500,
  25. Msg: "请求体解析失败。",
  26. })
  27. return
  28. }
  29. // 插入到数据库
  30. sqlTemplate, _ := util.ReadFile(c_db.SqlFilesMap["exam-insert-begin_time-by-team_name.sql"])
  31. c_log.GlobalLogger.Info("插入比赛开始时间", sqlTemplate)
  32. if err := c_db.DoTx(sqlTemplate, []any{
  33. param.TeamName,
  34. time.Now(),
  35. }); err != nil {
  36. c_log.GlobalLogger.Error("插入数据报错:", err)
  37. c.JSON(http.StatusBadRequest, commonEntity.Response{
  38. Code: 500,
  39. Msg: "插入数据报错。",
  40. })
  41. return
  42. }
  43. c.JSON(http.StatusOK, commonEntity.Response{
  44. Code: 200,
  45. Msg: "插入数据成功。",
  46. })
  47. }
  48. // 考试结束时间
  49. func End(c *gin.Context) {
  50. param := new(webServerEntity.ExamPao)
  51. // 映射到结构体
  52. if err := c.ShouldBindJSON(&param); err != nil {
  53. c_log.GlobalLogger.Error("项目启动接收请求参数报错:", err)
  54. c.JSON(http.StatusBadRequest, commonEntity.Response{
  55. Code: 500,
  56. Msg: "请求体解析失败。",
  57. })
  58. return
  59. }
  60. // 1 查询指定队伍的开始时间最新的考试是否有结束时间,如果有则不在处理,如果没有则更新
  61. var result []webServerEntity.ExamPo
  62. selectSql, err := util.ReadFile(c_db.SqlFilesMap["exam-select-latest-by-team_name.sql"])
  63. if err != nil {
  64. c_log.GlobalLogger.Error("读取sql文件报错:", err)
  65. c.JSON(http.StatusBadRequest, commonEntity.Response{
  66. Code: 500,
  67. Msg: "读取sql文件报错。",
  68. })
  69. return
  70. }
  71. // 可以传参数
  72. if err = c_db.MysqlDb.Select(&result, selectSql, param.TeamName); err != nil {
  73. c_log.GlobalLogger.Error("数据库查询报错:", err)
  74. c.JSON(http.StatusBadRequest, commonEntity.Response{
  75. Code: 500,
  76. Msg: "数据库查询报错。",
  77. })
  78. return
  79. }
  80. c_log.GlobalLogger.Info("数据库查询成功:", result)
  81. if !result[0].EndTime.Equal(defaultTime) {
  82. c_log.GlobalLogger.Error("赛队", param.TeamName, "重复请求考试结束接口!")
  83. c.JSON(http.StatusBadRequest, commonEntity.Response{
  84. Code: 500,
  85. Msg: "重复请求。",
  86. })
  87. return
  88. }
  89. // 更新到数据库
  90. sqlTemplate, _ := util.ReadFile(c_db.SqlFilesMap["exam-update-end_time-by-team_name.sql"])
  91. if err := c_db.DoTx(sqlTemplate, []any{
  92. time.Now(),
  93. param.TeamName,
  94. }); err != nil {
  95. c_log.GlobalLogger.Error("插入数据报错:", err)
  96. c.JSON(http.StatusBadRequest, commonEntity.Response{
  97. Code: 500,
  98. Msg: "插入数据报错。",
  99. })
  100. return
  101. }
  102. c.JSON(http.StatusOK, commonEntity.Response{
  103. Code: 200,
  104. Msg: "插入数据成功。",
  105. })
  106. }
  107. // 分页查询
  108. // todo 如果日期为默认值,则返回空""
  109. func Page(c *gin.Context) {
  110. param := new(webServerEntity.ExamPagePao)
  111. _ = c.ShouldBindJSON(&param)
  112. var resultPos []webServerEntity.ExamPo
  113. var resultPosTotal []int
  114. var pageSql string
  115. var totalSql string
  116. offset := (param.CurrentPage - 1) * param.PageSize
  117. size := param.PageSize
  118. if param.TeamName == "" && param.Topic == "" {
  119. pageSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-page.sql"])
  120. totalSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-total.sql"])
  121. err := c_db.MysqlDb.Select(&resultPos, pageSql, offset, size)
  122. if err != nil {
  123. c_log.GlobalLogger.Error(err)
  124. }
  125. err = c_db.MysqlDb.Select(&resultPosTotal, totalSql)
  126. if err != nil {
  127. c_log.GlobalLogger.Error(err)
  128. }
  129. }
  130. if param.TeamName != "" && param.Topic == "" {
  131. pageSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-page-by-team_name.sql"])
  132. totalSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-total-by-team_name.sql"])
  133. _ = c_db.MysqlDb.Select(&resultPos, pageSql, "%"+param.TeamName+"%", offset, size)
  134. _ = c_db.MysqlDb.Select(&resultPosTotal, totalSql, "%"+param.TeamName+"%")
  135. }
  136. if param.TeamName == "" && param.Topic != "" {
  137. pageSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-page-by-topic.sql"])
  138. totalSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-total-by-topic.sql"])
  139. _ = c_db.MysqlDb.Select(&resultPos, pageSql, "%"+param.Topic+"%", offset, size)
  140. _ = c_db.MysqlDb.Select(&resultPosTotal, totalSql, "%"+param.Topic+"%")
  141. }
  142. if param.TeamName != "" && param.Topic != "" {
  143. pageSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-page-by-team_name-and-topic.sql"])
  144. totalSql, _ = util.ReadFile(c_db.SqlFilesMap["exam-select-total-by-team_name-and-topic.sql"])
  145. _ = c_db.MysqlDb.Select(&resultPos, pageSql, "%"+param.TeamName+"%", "%"+param.Topic+"%", offset, size)
  146. _ = c_db.MysqlDb.Select(&resultPosTotal, totalSql, "%"+param.TeamName+"%", "%"+param.Topic+"%")
  147. }
  148. var resultVos []webServerEntity.ExamVo
  149. for _, po := range resultPos {
  150. resultVos = append(resultVos, webServerEntity.ExamVo{
  151. Id: po.Id,
  152. TeamName: po.TeamName,
  153. Topic: po.Topic,
  154. BeginTime: util.GetTimeString(po.BeginTime),
  155. EndTime: util.GetTimeString(po.EndTime),
  156. ScoreOnline: po.ScoreOnline,
  157. ScoreOffline: po.ScoreOffline,
  158. ScoreFinal: po.ScoreFinal,
  159. Details: po.Details,
  160. ScoreReportPath: po.ScoreReportPath,
  161. })
  162. }
  163. c.JSON(http.StatusOK, commonEntity.Response{
  164. Code: 200,
  165. Msg: "分页查询成功!",
  166. Data: resultVos,
  167. Total: resultPosTotal[0],
  168. })
  169. }
  170. // 评分报告pdf下载
  171. func Report(c *gin.Context) {
  172. //param := new(webServerEntity.ExamReportPao)
  173. //// 映射到结构体
  174. //if err := c.ShouldBindJSON(&param); err != nil {
  175. // c_log.GlobalLogger.Error("项目启动接收请求参数报错:", err)
  176. // c.JSON(http.StatusBadRequest, commonEntity.Response{
  177. // Code: 500,
  178. // Msg: "请求体解析失败。",
  179. // })
  180. // return
  181. //}
  182. // 1 根据ID查询数据
  183. // 2 根据数据生成pdf
  184. // 3 创建pdf文件
  185. {
  186. // 1 初始化 pdf 对象
  187. pdf := gopdf.GoPdf{}
  188. pdf.Start(gopdf.Config{PageSize: *gopdf.PageSizeA4})
  189. // 2 添加一页
  190. pdf.AddPage()
  191. // 3
  192. err := pdf.AddTTFFont("simfang", "D:\\code\\cicv-data-closedloop\\test\\pdf\\ttf\\simfang.ttf")
  193. if err != nil {
  194. log.Print(err.Error())
  195. return
  196. }
  197. err = pdf.SetFont("simfang", "", 14)
  198. if err != nil {
  199. log.Print(err.Error())
  200. return
  201. }
  202. err = pdf.Cell(nil, "您好")
  203. if err != nil {
  204. return
  205. }
  206. err = pdf.WritePdf("D:\\hello.pdf")
  207. if err != nil {
  208. return
  209. }
  210. }
  211. // 打开要发送的文件
  212. file, err := os.Open("D:\\hello.pdf")
  213. if err != nil {
  214. c.String(http.StatusNotFound, "文件未找到")
  215. return
  216. }
  217. defer file.Close()
  218. // 将文件复制到响应主体
  219. _, err = io.Copy(c.Writer, file)
  220. if err != nil {
  221. c.String(http.StatusInternalServerError, "无法复制文件到响应体")
  222. return
  223. }
  224. }