image_record.go 15 KB

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