image_record.go 18 KB

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