image_record.go 14 KB

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