image_record.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. package levelMonitor
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "go.uber.org/zap"
  8. "gorm.io/gorm"
  9. "io/ioutil"
  10. "log-server/global"
  11. "log-server/model/common/request"
  12. "log-server/model/levelMonitor"
  13. levelRequest "log-server/model/levelMonitor/request"
  14. "log-server/model/log"
  15. "log-server/service/cache"
  16. "net/http"
  17. "net/url"
  18. "strconv"
  19. "strings"
  20. "time"
  21. )
  22. type ImageRecordService struct {
  23. cache cache.Cache
  24. }
  25. //创建图片记录
  26. func (s *ImageRecordService) CreateImageRecord(record levelMonitor.ImageRecord) (err error) {
  27. //获取今日日期
  28. date := time.Now().Format("2006-01-02")
  29. key := fmt.Sprintf(cache.UploadImageNum, date, record.TaskId)
  30. ctx := context.Background()
  31. num, _ := s.cache.GetCacheNum(ctx, key)
  32. if num > 50 {
  33. return errors.New("数据上传已到上限")
  34. }
  35. var entity levelMonitor.ImageRecord
  36. //创建日期赋值
  37. record.CreateDate = date
  38. record.Status = 2
  39. //查找数据库是否存在此账号此游戏今日记录
  40. err = global.GVA_DB.Model(&levelMonitor.ImageRecord{}).Where("task_id = ? and account = ? and create_date = ?", record.TaskId, record.Account, date).First(&entity).Error
  41. if !errors.Is(err, gorm.ErrRecordNotFound) {
  42. return errors.New("此记录已存在,请勿重复添加")
  43. }
  44. err = global.GVA_DB.Model(&levelMonitor.ImageRecord{}).Omit("create_time", "update_time").Create(&record).Error
  45. if err != nil {
  46. return err
  47. }
  48. go s.ImageIdentify(record, key)
  49. return
  50. }
  51. func (s *ImageRecordService) UploadOrNot(record levelMonitor.ImageRecord) (err error) {
  52. date := time.Now().Format("2006-01-02")
  53. key := fmt.Sprintf(cache.UploadImageNum, date, record.TaskId)
  54. ctx := context.Background()
  55. num, _ := s.cache.GetCacheNum(ctx, key)
  56. if num > 50 {
  57. return errors.New("数据上传已到上限")
  58. }
  59. return nil
  60. }
  61. //删除三日前的图片记录
  62. func (s *ImageRecordService) DeleteExpireImageRecord() {
  63. markTime := time.Now().Add(-time.Hour * 48).Format("2006-01-02")
  64. err := global.GVA_DB.Where("create_date < ?", markTime).Delete(&levelMonitor.ImageRecord{}).Error
  65. if err != nil {
  66. global.GVA_LOG.Info("删除图片信息失败:" + err.Error() + time.Now().Format("2006-01-02 15:04:05"))
  67. }
  68. return
  69. }
  70. //获取图片记录列表
  71. func (s *ImageRecordService) GetImageRecordList(record levelRequest.ImageRecordRequest, info request.PageInfo, order string, desc bool) (recordList []levelMonitor.ImageRecord, total int64, err error) {
  72. limit := info.PageSize
  73. offset := info.PageSize * (info.Page - 1)
  74. db := global.GVA_DB.Model(&levelMonitor.ImageRecord{})
  75. startDate := time.Now().Format("2006-01-02")
  76. endDate := time.Now().Format("2006-01-02")
  77. if len(record.Date) == 2 {
  78. startDate = record.Date[0]
  79. endDate = record.Date[1]
  80. }
  81. //筛选日期
  82. db = db.Where("create_date >= ? and create_date <= ?", startDate, endDate)
  83. if record.TaskId != 0 {
  84. db = db.Where("task_id = ?", record.TaskId)
  85. }
  86. err = db.Count(&total).Error
  87. if err != nil {
  88. return recordList, total, err
  89. } else {
  90. db = db.Limit(limit).Offset(offset)
  91. if order != "" {
  92. var OrderStr string
  93. // 设置有效排序key 防止sql注入
  94. // 感谢 Tom4t0 提交漏洞信息
  95. orderMap := make(map[string]bool, 6)
  96. orderMap["task_id"] = true
  97. orderMap["use_num"] = true
  98. orderMap["identify"] = true
  99. orderMap["create_date"] = true
  100. orderMap["create_time"] = true
  101. orderMap["update_time"] = true
  102. if orderMap[order] {
  103. if desc {
  104. OrderStr = order + " desc"
  105. } else {
  106. OrderStr = order
  107. }
  108. } else { // didn't matched any order key in `orderMap`
  109. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  110. return recordList, total, err
  111. }
  112. err = db.Order(OrderStr).Find(&recordList).Error
  113. } else {
  114. err = db.Order("id desc").Find(&recordList).Error
  115. }
  116. }
  117. //遍历更改日期格式
  118. for i, _ := range recordList {
  119. recordList[i].CreateDate = recordList[i].CreateDate[:10]
  120. }
  121. return recordList, total, err
  122. }
  123. const API_KEY = "z9GNcyrC7VeV3g1xXEj3YL1s"
  124. const SECRET_KEY = "VASRBsEzeVsyKduSkkflfL87r5yqoqvj"
  125. const BAIDU_IDENTIFY = "baiduIdentifyToken"
  126. func (s *ImageRecordService) ImageIdentify(record levelMonitor.ImageRecord, key string) {
  127. token, err := GetAccessToken()
  128. if err != nil {
  129. global.GVA_LOG.Error("get token fail", zap.Error(err))
  130. s.UpdateImageRecordStatus(record.Id, "get token fail", -1, 0, 0)
  131. return
  132. }
  133. body, err := Request(token, record.ImageBase64)
  134. if err != nil {
  135. global.GVA_LOG.Error("Read Body Fail", zap.Error(err))
  136. s.UpdateImageRecordStatus(record.Id, err.Error(), -1, 0, 0)
  137. return
  138. }
  139. type Data struct {
  140. WordsResult []struct {
  141. Words string `json:"words"`
  142. } `json:"words_result"`
  143. WordsResultNum int `json:"words_result_num"`
  144. LogId int `json:"log_id"`
  145. }
  146. var data Data
  147. err = json.Unmarshal(body, &data)
  148. if err != nil {
  149. global.GVA_LOG.Error("Read Body Fail", zap.Error(err))
  150. s.UpdateImageRecordStatus(record.Id, "Read Body Fail", -1, 0, 0)
  151. return
  152. }
  153. identify := 0
  154. if data.WordsResultNum == 0 {
  155. s.UpdateImageRecordStatus(record.Id, string(body), -1, 0, 0)
  156. return
  157. }
  158. if len(data.WordsResult) > 1 {
  159. for _, words := range data.WordsResult {
  160. i, err := strconv.Atoi(words.Words)
  161. if err == nil {
  162. identify = i
  163. break
  164. }
  165. }
  166. } else {
  167. i, _ := strconv.Atoi(data.WordsResult[0].Words)
  168. identify = i
  169. }
  170. if identify == 0 {
  171. s.UpdateImageRecordStatus(record.Id, string(body), -1, 0, 0)
  172. return
  173. }
  174. var gameAccount log.GameAccount
  175. global.GVA_DB.Where("game_id", record.TaskId).Where("account", record.Account).First(&gameAccount)
  176. s.UpdateImageRecordStatus(record.Id, string(body), 1, gameAccount.UseNum, identify)
  177. UpdateGameAccountIdentify(record.Account, record.TaskId, identify)
  178. ctx := context.Background()
  179. s.cache.SetCacheNum(ctx, key)
  180. return
  181. }
  182. func (s *ImageRecordService) UpdateImageRecordStatus(id int, result string, status int, useNum, identify int) {
  183. update := map[string]interface{}{
  184. "result": result,
  185. "status": status,
  186. "use_num": useNum,
  187. "identify": identify,
  188. }
  189. global.GVA_DB.Model(&levelMonitor.ImageRecord{}).Where("id", id).Updates(update)
  190. }
  191. func Request(baiduToken, content string) (body []byte, err error) {
  192. reqUrl := "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=" + baiduToken
  193. var (
  194. params = url.Values{}
  195. )
  196. params.Set("image", content)
  197. requestData := params.Encode()
  198. payload := strings.NewReader(requestData)
  199. client := &http.Client{}
  200. req, err := http.NewRequest("POST", reqUrl, payload)
  201. if err != nil {
  202. fmt.Println(err)
  203. return
  204. }
  205. req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  206. req.Header.Add("Accept", "application/json")
  207. res, err := client.Do(req)
  208. if err != nil {
  209. global.GVA_LOG.Error("request Identify fail", zap.Error(err))
  210. return
  211. }
  212. defer res.Body.Close()
  213. body, err = ioutil.ReadAll(res.Body)
  214. if err != nil {
  215. global.GVA_LOG.Error("Read Body Fail", zap.Error(err))
  216. return
  217. }
  218. fmt.Println(string(body))
  219. return
  220. }
  221. // 更新game_acount
  222. func UpdateGameAccountIdentify(account string, gameId int, identify int) {
  223. global.GVA_DB.Table("game_account").Where("game_id", gameId).Where("account", account).Update("identify", identify)
  224. }
  225. /**
  226. * 使用 AK,SK 生成鉴权签名(Access Token)
  227. * @return string 鉴权签名信息(Access Token)
  228. */
  229. func GetAccessToken() (string, error) {
  230. ctx := context.Background()
  231. token, err := global.GVA_REDIS.Get(ctx, BAIDU_IDENTIFY).Result()
  232. if err != nil || token == "" {
  233. reqUrl := "https://aip.baidubce.com/oauth/2.0/token"
  234. postData := fmt.Sprintf("grant_type=client_credentials&client_id=%s&client_secret=%s", API_KEY, SECRET_KEY)
  235. resp, err := http.Post(reqUrl, "application/x-www-form-urlencoded", strings.NewReader(postData))
  236. if err != nil {
  237. fmt.Println(err)
  238. return "", err
  239. }
  240. defer resp.Body.Close()
  241. body, err := ioutil.ReadAll(resp.Body)
  242. if err != nil {
  243. fmt.Println(err)
  244. return "", err
  245. }
  246. accessTokenObj := map[string]string{}
  247. json.Unmarshal(body, &accessTokenObj)
  248. global.GVA_REDIS.Set(ctx, BAIDU_IDENTIFY, accessTokenObj["access_token"], time.Hour*24*29)
  249. return accessTokenObj["access_token"], err
  250. }
  251. return token, err
  252. }
  253. func (s *ImageRecordService) YesterdayStatistics() {
  254. date := time.Now().Add(-time.Hour * 24).Format("2006-01-02")
  255. s.ImageRecordStatistics(date)
  256. }
  257. func (s *ImageRecordService) TodayStatistics() {
  258. date := time.Now().Format("2006-01-02")
  259. s.ImageRecordStatistics(date)
  260. }
  261. func (s *ImageRecordService) ImageRecordStatistics(date string) {
  262. type Data struct {
  263. TaskId int `json:"task_id"`
  264. }
  265. var taskIds []Data
  266. global.GVA_DB.Model(&levelMonitor.ImageRecord{}).Where("create_date = ?", date).Distinct("task_id").Find(&taskIds)
  267. if len(taskIds) == 0 {
  268. global.GVA_LOG.Warn("没有等级上报的数据")
  269. return
  270. }
  271. type StatisticsData struct {
  272. UseNum int `json:"use_num"`
  273. AccountNum int `json:"account_num"`
  274. LevelNum int `json:"level_num"`
  275. }
  276. for _, taskId := range taskIds {
  277. var statisticsData []StatisticsData
  278. global.GVA_DB.Model(&levelMonitor.ImageRecord{}).
  279. Select("use_num,COUNT(*) as account_num,SUM(identify) as level_num").
  280. Where("create_date = ?", date).
  281. Where("task_id = ?", taskId.TaskId).
  282. Where("status = ?", 1).
  283. Group("use_num").
  284. Order("use_num").
  285. Find(&statisticsData)
  286. if len(statisticsData) == 0 {
  287. continue
  288. }
  289. var imageRecordStatistics = make(map[string]interface{})
  290. b := false
  291. for _, data := range statisticsData {
  292. if _, ok := levelMonitor.R[data.UseNum]; ok {
  293. imageRecordStatistics[levelMonitor.R[data.UseNum]] = float64(data.LevelNum) / float64(data.AccountNum)
  294. b = true
  295. }
  296. }
  297. if b {
  298. s.CreateImageRecordStatistics(taskId.TaskId, imageRecordStatistics, date)
  299. }
  300. }
  301. }
  302. func (s *ImageRecordService) CreateImageRecordStatistics(taskId int, imageRecordStatistics map[string]interface{}, date string) {
  303. err := global.GVA_DB.Where("create_date = ?", date).Where("task_id = ?", taskId).First(&levelMonitor.ImageRecordStatistics{}).Error
  304. if errors.Is(err, gorm.ErrRecordNotFound) {
  305. imageRecordStatistics["task_id"] = taskId
  306. imageRecordStatistics["create_date"] = time.Now().Format("2006-01-02")
  307. global.GVA_DB.Model(&levelMonitor.ImageRecordStatistics{}).Create(imageRecordStatistics)
  308. return
  309. }
  310. global.GVA_DB.Model(&levelMonitor.ImageRecordStatistics{}).
  311. Where("create_date = ?", date).
  312. Where("task_id = ?", taskId).
  313. Updates(imageRecordStatistics)
  314. }
  315. //获取图片统计列表
  316. func (s *ImageRecordService) GetImageRecordStatisticsList(record levelRequest.ImageRecordStatisticsRequest, info request.PageInfo, order string, desc bool) (dataList []levelMonitor.ImageRecordStatisticsResponse, total int64, err error) {
  317. limit := info.PageSize
  318. offset := info.PageSize * (info.Page - 1)
  319. db := global.GVA_DB.Model(&levelMonitor.ImageRecordStatistics{})
  320. startDate := time.Now().Format("2006-01-02")
  321. endDate := time.Now().Format("2006-01-02")
  322. if len(record.Date) == 2 {
  323. startDate = record.Date[0]
  324. endDate = record.Date[1]
  325. }
  326. db = db.Select("image_record_statistics.*, game_task.user, game_task.task_name")
  327. db = db.Joins("left join game_task on image_record_statistics.task_id = game_task.task_id")
  328. if record.User != "" {
  329. db = db.Where("user", record.User)
  330. }
  331. //筛选日期
  332. db = db.Where("create_date >= ? and create_date <= ?", startDate, endDate)
  333. if record.TaskId != 0 {
  334. db = db.Where("image_record_statistics.task_id = ?", record.TaskId)
  335. }
  336. err = db.Count(&total).Error
  337. if err != nil {
  338. return dataList, total, err
  339. } else {
  340. db = db.Limit(limit).Offset(offset)
  341. if order != "" {
  342. var OrderStr string
  343. // 设置有效排序key 防止sql注入
  344. // 感谢 Tom4t0 提交漏洞信息
  345. orderMap := make(map[string]bool, 3)
  346. orderMap["task_id"] = true
  347. orderMap["create_date"] = true
  348. orderMap["user"] = true
  349. if orderMap[order] {
  350. if desc {
  351. OrderStr = order + " desc"
  352. } else {
  353. OrderStr = order
  354. }
  355. } else { // didn't matched any order key in `orderMap`
  356. global.GVA_LOG.Error("获取失败!", zap.Error(err))
  357. return dataList, total, err
  358. }
  359. err = db.Order(OrderStr).Find(&dataList).Error
  360. } else {
  361. err = db.Order("id desc").Find(&dataList).Error
  362. }
  363. }
  364. //遍历更改日期格式
  365. for i, _ := range dataList {
  366. dataList[i].CreateDate = dataList[i].CreateDate[:10]
  367. }
  368. return dataList, total, err
  369. }