game_task.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. package task
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "go.uber.org/zap"
  7. "gorm.io/gorm"
  8. "log-server/global"
  9. "log-server/model/task"
  10. "log-server/model/task/control"
  11. "log-server/model/task/request"
  12. "log-server/model/task/response"
  13. "log-server/utils"
  14. "math"
  15. "math/rand"
  16. "strconv"
  17. "time"
  18. )
  19. var AccountType = map[int]string{
  20. 1: "小绵羊账号",
  21. 2: "QQ账号",
  22. 3: "魅族账号",
  23. 4: "华为账号",
  24. 5: "测试类型",
  25. 6: "微信",
  26. 7: "微信+QQ",
  27. }
  28. var LoginMethod = map[int]string{
  29. 1: "小绵羊登录",
  30. 2: "魅族账号登录",
  31. 3: "QQ账号登录",
  32. 4: "网易账号登录",
  33. 5: "微信授权登录",
  34. 6: "微信+QQ授权登录",
  35. }
  36. var GamePort = map[int]string{
  37. 1: "腾讯游戏",
  38. 2: "360游戏",
  39. 3: "网易游戏",
  40. 4: "酷派游戏",
  41. 5: "魅族游戏",
  42. }
  43. var (
  44. CreateTaskUrl = "/v1/task_statistics"
  45. GetControlTaskIdUrl = "/v1/task_statistics/get_data_id"
  46. UpdateGameTaskStatusUrl = "/v1/install_info/updateinstallstatus"
  47. )
  48. type GameTask struct {
  49. }
  50. // 创建游戏任务
  51. func (s *GameTask) CreateGameTask(requestData request.GameTaskRequest) (err error) {
  52. if !errors.Is(global.GVA_DB.Where("task_id = ?", requestData.TaskId).First(&task.GameTask{}).Error, gorm.ErrRecordNotFound) {
  53. return errors.New("存在相同任务ID")
  54. }
  55. gameTask := new(task.GameTask)
  56. gameTask.TaskId = requestData.TaskId
  57. gameTask.TaskName = requestData.TaskName
  58. gameTask.User = requestData.User
  59. gameTask.NewRetained = requestData.NewRetained
  60. gameTask.GameName = requestData.GameName
  61. gameTask.GameId = requestData.GameId
  62. gameTask.Date = time.Now()
  63. gameTask.GamePortId = requestData.GamePortId
  64. gameTask.AccountType = requestData.AccountType
  65. gameTask.LoginMethod = requestData.LoginMethod
  66. gameTask.TxChannel = requestData.TxChannel
  67. gameTask.TxGameId = requestData.TxGameId
  68. gameTask.MzChannel = requestData.MzChannel
  69. gameTask.MzGameId = requestData.MzGameId
  70. gameTask.GameIdXmy = requestData.GameIdXmy
  71. gameTask.NewTarget = requestData.NewTarget
  72. gameTask.PayTarget = requestData.PayTarget
  73. gameTask.RetainedTarget = requestData.RetainedTarget
  74. gameTask.PayPrice = requestData.PayPrice
  75. //gameTask.CreateTime = requestData.CreateTime
  76. //gameTask.UpdateTime = requestData.UpdateTime
  77. //gameTask.Status = requestData.Status
  78. //gameTask.IsDel = requestData.IsDel
  79. //gameTask.DeleteTime = requestData.DeleteTime
  80. taskRequestData := s.CreateGameTaskRequestData(requestData)
  81. err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  82. err = tx.Omit("create_time", "update_time", "status", "is_del", "delete_time", "control_task_id").Create(&gameTask).Error
  83. if err != nil {
  84. global.GVA_LOG.Error("添加任务数据失败: ", zap.Error(err))
  85. return err
  86. }
  87. _, err := s.CreateTaskRequestControl(taskRequestData)
  88. if err != nil {
  89. global.GVA_LOG.Error("添加任务数据请求群控失败: ", zap.Error(err))
  90. }
  91. return err
  92. })
  93. if err != nil {
  94. return err
  95. }
  96. // 同步群控任务id
  97. d, err := s.GetControlTaskId(taskRequestData.GameId)
  98. if err != nil {
  99. global.GVA_LOG.Error("获取群控的任务id失败")
  100. return err
  101. }
  102. err = global.GVA_DB.Model(&task.GameTask{}).Where("task_id = ?", taskRequestData.GameId).Update("control_task_id", d.IdDong).Error
  103. return
  104. }
  105. // 创建游戏任务完成model
  106. func (s *GameTask) CreateGameTargetCompleteModel(oldA task.GameTask, date time.Time) *task.GameTargetComplete {
  107. var newTarget int
  108. rand.Seed(time.Now().UnixNano())
  109. newTargetRate := rand.Float64()
  110. if oldA.NewTarget <= 10 {
  111. newTarget = 10
  112. } else {
  113. newTarget = int(math.Ceil(float64(oldA.NewTarget) * 0.5))
  114. }
  115. var retainedTarget int
  116. rand.Seed(time.Now().UnixNano())
  117. retainedTargetRate := rand.Float64()
  118. if oldA.NewTarget < 100 {
  119. newTarget = oldA.NewTarget
  120. } else {
  121. newTarget = 200
  122. }
  123. targetComplete := new(task.GameTargetComplete)
  124. targetComplete.TaskId = oldA.TaskId
  125. targetComplete.NewTarget = oldA.NewTarget + int(math.Ceil(newTargetRate*float64(newTarget)))
  126. targetComplete.RetainedTarget = oldA.RetainedTarget + int(math.Ceil(retainedTargetRate*float64(retainedTarget)))
  127. targetComplete.PayTarget = 0
  128. targetComplete.CreateDate = date
  129. targetComplete.RetainedComplete = 0
  130. targetComplete.PayComplete = 0
  131. targetComplete.NewComplete = 0
  132. return targetComplete
  133. }
  134. // 创建任务群控请求数据
  135. func (s *GameTask) CreateGameTaskRequestData(requestData request.GameTaskRequest) control.CreateGameTaskRequest {
  136. gameTask := control.CreateGameTaskRequest{}
  137. gameTask.GameId = requestData.TaskId
  138. gameTask.GameName = requestData.TaskName
  139. gameTask.Remark = requestData.User
  140. gameTask.NewRetained = requestData.NewRetained
  141. gameTask.Date = time.Now().Format("2006-01-02")
  142. gameTask.GamePort = GamePort[requestData.GamePortId]
  143. gameTask.GameIdXmy = requestData.GameIdXmy
  144. gameTask.NewTarget = requestData.NewTarget
  145. gameTask.PayTarget = requestData.PayTarget
  146. gameTask.RetainedTarget = requestData.RetainedTarget
  147. gameTask.PayPrice = requestData.PayPrice
  148. gameTask.SyDataId = requestData.TaskId
  149. gameTask.SpiritPackageName = "0"
  150. gameTask.GamePackageName = "0"
  151. return gameTask
  152. }
  153. // http请求群控创建任务
  154. func (s *GameTask) CreateTaskRequestControl(requestData control.CreateGameTaskRequest) (d string, err error) {
  155. url := global.GVA_CONFIG.ExtranetDomain.Control + CreateTaskUrl
  156. data, code, err := utils.HttpPostReplyCode(url, requestData)
  157. fmt.Println(code)
  158. if code != 200 {
  159. return string(data), errors.New(string(data))
  160. }
  161. d = string(data)
  162. return
  163. }
  164. // http请求群控更新任务
  165. func (s *GameTask) UpdateTaskRequestControl(requestData control.CreateGameTaskRequest, controlTaskId int) (d string, err error) {
  166. url := global.GVA_CONFIG.ExtranetDomain.Control + CreateTaskUrl + "/" + strconv.Itoa(controlTaskId)
  167. data, code, err := utils.HttpPutReplyCode(url, requestData)
  168. fmt.Println(code)
  169. if code != 200 {
  170. return string(data), errors.New(string(data))
  171. }
  172. d = string(data)
  173. return
  174. }
  175. type ControlTaskId struct {
  176. IdDong int
  177. IdYang int
  178. }
  179. // http请求获取群控创建任务id
  180. func (s *GameTask) GetControlTaskId(gameId int) (d *ControlTaskId, err error) {
  181. url := global.GVA_CONFIG.ExtranetDomain.Control + GetControlTaskIdUrl
  182. requestData := map[string]string{
  183. "game_id": strconv.Itoa(gameId),
  184. }
  185. data, code, err := utils.HttpGetReplyCode(url, requestData)
  186. fmt.Println(code)
  187. if code != 200 {
  188. return d, errors.New(string(data))
  189. }
  190. msg := new(ControlTaskId)
  191. _ = json.Unmarshal(data, &msg)
  192. d = msg
  193. return
  194. }
  195. //@author: [piexlmax](https://github.com/piexlmax)
  196. //@function: GetGameTaskInfoList
  197. //@description: 分页获取数据,
  198. //@param: card card.Card, info request.PageInfo, order string, desc bool
  199. //@return: list interface{}, total int64, err error
  200. func (apiService *GameTask) GetGameTaskInfoList(api task.GameTask, info request.PageInfo, order string, desc bool) (list interface{}, options interface{}, total int64, err error) {
  201. limit := info.PageSize
  202. offset := info.PageSize * (info.Page - 1)
  203. db := global.GVA_DB.Model(&task.GameTask{})
  204. var apiList []task.GameTask
  205. db = db.Where("is_del = ?", -1)
  206. if api.TaskName != "" {
  207. db = db.Where("task_name LIKE ?", "%"+api.TaskName+"%")
  208. }
  209. if api.User != "" {
  210. db = db.Where("user LIKE ?", "%"+api.User+"%")
  211. }
  212. if api.Status != 0 {
  213. db = db.Where("status = ?", api.Status)
  214. }
  215. err = db.Count(&total).Error
  216. option := task.Option{}
  217. gamePortOption := GamePortOptionQuery()
  218. loginTypeOption := LoginTypeOptionQuery()
  219. accountTypeOption := AccountTypeOptionQuery()
  220. responsiblePersonOption := ResponsiblePersonOptionQuery()
  221. gameListOption := GameListOptionQuery()
  222. if gamePortOption == nil || loginTypeOption == nil || accountTypeOption == nil || responsiblePersonOption == nil || gameListOption == nil{
  223. //redis未找到
  224. //通过数据库查找厂商名称,登录类型名称、账号类型名称
  225. global.GVA_DB.Table("game_channel").Select("id","channel_name").Find(&option.GamePortOptions)
  226. global.GVA_DB.Table("login_type").Select("id", "login_name").Find(&option.LoginTypeOptions)
  227. global.GVA_DB.Table("account_type").Select("id", "type_name").Find(&option.AccountTypeOptions)
  228. global.GVA_DB.Table("game_list").Select("game_name").Find(&option.GameListOptions)
  229. global.GVA_DB.Table("responsible_person").Select("name").Where("state = 1").Find(&option.ResponsiblePersonOptions)
  230. } else {
  231. option.GamePortOptions = gamePortOption
  232. option.LoginTypeOptions = loginTypeOption
  233. option.AccountTypeOptions = accountTypeOption
  234. option.ResponsiblePersonOptions = responsiblePersonOption
  235. option.GameListOptions = gameListOption
  236. }
  237. if err != nil {
  238. return apiList, option , total, err
  239. } else {
  240. db = db.Limit(limit).Offset(offset)
  241. if order != "" {
  242. var OrderStr string
  243. // 设置有效排序key 防止sql注入
  244. // 感谢 Tom4t0 提交漏洞信息
  245. orderMap := make(map[string]bool, 4)
  246. orderMap["id"] = true
  247. orderMap["task_name"] = true
  248. orderMap["user"] = true
  249. if orderMap[order] {
  250. if desc {
  251. OrderStr = order + " desc"
  252. } else {
  253. OrderStr = order
  254. }
  255. } else { // didn't matched any order key in `orderMap`
  256. err = fmt.Errorf("非法的排序字段: %v", order)
  257. return apiList, option, total, err
  258. }
  259. err = db.Order(OrderStr).Find(&apiList).Error
  260. } else {
  261. err = db.Order("id desc").Find(&apiList).Error
  262. }
  263. }
  264. var apisReply []*response.GetGameTaskListReply
  265. if len(apiList) != 0 {
  266. for _, apiInfo := range apiList {
  267. var apiReply = new(response.GetGameTaskListReply)
  268. apiReply.Status = apiInfo.Status
  269. apiReply.TaskId = apiInfo.TaskId
  270. apiReply.TaskName = apiInfo.TaskName
  271. apiReply.GamePort = GamePort[apiInfo.GamePortId]
  272. apiReply.AccountType = AccountType[apiInfo.AccountType]
  273. apiReply.LoginMethod = LoginMethod[apiInfo.LoginMethod]
  274. apiReply.CreateTime = apiInfo.CreateTime.Format("2006-01-02 15:04:05")
  275. apiReply.User = apiInfo.User
  276. apiReply.Date = apiInfo.Date.Format("2006-01-02")
  277. apiReply.GameName = apiInfo.GameName
  278. apiReply.UpdateTime = apiInfo.UpdateTime.Format("2006-01-02 15:04:05")
  279. apiReply.NewTarget = apiInfo.NewTarget
  280. apiReply.PayTarget = apiInfo.PayTarget
  281. apiReply.RetainedTarget = apiInfo.RetainedTarget
  282. apiReply.PayPrice = apiInfo.PayPrice
  283. apiReply.StopTime = apiInfo.StopTime.Format("2006-01-02 15:04:05")
  284. if apiInfo.Status == 1 {
  285. apiReply.StopTime = ""
  286. }
  287. apisReply = append(apisReply, apiReply)
  288. }
  289. }
  290. return apisReply, option, total, err
  291. }
  292. //@author: [piexlmax](https://github.com/piexlmax)
  293. //@function: GetGameTaskById
  294. //@description: 根据id获取GameTask
  295. //@param: id uint
  296. //@return: apiReply response.GetPcListReply, err error
  297. func (c *GameTask) GetGameTaskById(id int) (gameTask request.GameTaskRequest, err error) {
  298. var requestData task.GameTask
  299. err = global.GVA_DB.Where("task_id = ?", id).First(&requestData).Error
  300. if err != nil {
  301. return
  302. }
  303. gameTask.TaskId = requestData.TaskId
  304. gameTask.TaskName = requestData.TaskName
  305. gameTask.User = requestData.User
  306. gameTask.NewRetained = requestData.NewRetained
  307. gameTask.GameName = requestData.GameName
  308. gameTask.GamePortId = requestData.GamePortId
  309. gameTask.AccountType = requestData.AccountType
  310. gameTask.LoginMethod = requestData.LoginMethod
  311. gameTask.TxChannel = requestData.TxChannel
  312. gameTask.TxGameId = requestData.TxGameId
  313. gameTask.MzChannel = requestData.MzChannel
  314. gameTask.MzGameId = requestData.MzGameId
  315. gameTask.GameIdXmy = requestData.GameIdXmy
  316. gameTask.NewTarget = requestData.NewTarget
  317. gameTask.PayTarget = requestData.PayTarget
  318. gameTask.RetainedTarget = requestData.RetainedTarget
  319. gameTask.PayPrice = requestData.PayPrice
  320. return
  321. }
  322. // http请求群控更新任务装
  323. func (s *GameTask) UpdateControlStatus(gameId int, status int) (err error) {
  324. url := global.GVA_CONFIG.ExtranetDomain.Control + UpdateGameTaskStatusUrl
  325. requestData := map[string]string{
  326. "status": strconv.Itoa(status),
  327. "game_id": strconv.Itoa(gameId),
  328. }
  329. data, code, err := utils.HttpGetReplyCode(url, requestData)
  330. if err != nil {
  331. return err
  332. }
  333. fmt.Println(code)
  334. if code != 200 {
  335. return errors.New(string(data))
  336. }
  337. return
  338. }
  339. //@author: [piexlmax](https://github.com/piexlmax)
  340. //@function: UpdateGameTaskStatus
  341. //@description: 根据id更新GameTask状态
  342. //@param: GameTask request.UpdateGameTaskRequest
  343. //@return: err error
  344. func (s *GameTask) UpdateGameTaskStatus(c request.UpdateGameTaskStatusRequest) (err error) {
  345. var oldA task.GameTask
  346. err = global.GVA_DB.Where("task_id = ?", c.TaskId).First(&oldA).Error
  347. if err != nil {
  348. return err
  349. }
  350. err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  351. update := map[string]interface{}{
  352. "status": c.Status,
  353. }
  354. status := c.Status
  355. if c.Status == -1 {
  356. status = 0
  357. update["stop_time"] = time.Now().Format("2006-01-02 15:04:05")
  358. } else {
  359. date := time.Now()
  360. if !errors.Is(tx.Where("task_id = ?", c.TaskId).Where("create_date = ?", date.Format("2006-01-02")).First(&task.GameTargetComplete{}).Error, gorm.ErrRecordNotFound) {
  361. global.GVA_LOG.Info("当天的任务目标已存在")
  362. } else {
  363. targetComplete := s.CreateGameTargetCompleteModel(oldA, date)
  364. err := tx.Omit("update_time").Create(&targetComplete).Error
  365. if err != nil {
  366. global.GVA_LOG.Error("创建任务目标数据失败", zap.Error(err))
  367. return err
  368. }
  369. }
  370. }
  371. err := tx.Table("game_task").Where("task_id", c.TaskId).Updates(update).Error
  372. if err != nil {
  373. return err
  374. }
  375. err = s.UpdateControlStatus(c.TaskId, status)
  376. return err
  377. })
  378. return err
  379. }
  380. // 更新GameTask
  381. func (s *GameTask) UpdateGameTask(requestData request.GameTaskRequest) (err error) {
  382. if errors.Is(global.GVA_DB.Where("task_id = ?", requestData.TaskId).First(&task.GameTask{}).Error, gorm.ErrRecordNotFound) {
  383. return errors.New("不存在的任务")
  384. }
  385. gameTask := new(task.GameTask)
  386. global.GVA_DB.Where("task_id = ?", requestData.TaskId).First(&gameTask)
  387. gameTask.TaskId = requestData.TaskId
  388. gameTask.TaskName = requestData.TaskName
  389. gameTask.User = requestData.User
  390. gameTask.NewRetained = requestData.NewRetained
  391. gameTask.GameName = requestData.GameName
  392. gameTask.GameId = requestData.GameId
  393. gameTask.GamePortId = requestData.GamePortId
  394. gameTask.AccountType = requestData.AccountType
  395. gameTask.LoginMethod = requestData.LoginMethod
  396. gameTask.TxChannel = requestData.TxChannel
  397. gameTask.TxGameId = requestData.TxGameId
  398. gameTask.MzChannel = requestData.MzChannel
  399. gameTask.MzGameId = requestData.MzGameId
  400. gameTask.GameIdXmy = requestData.GameIdXmy
  401. gameTask.NewTarget = requestData.NewTarget
  402. gameTask.PayTarget = requestData.PayTarget
  403. gameTask.RetainedTarget = requestData.RetainedTarget
  404. gameTask.PayPrice = requestData.PayPrice
  405. taskRequestData := s.CreateGameTaskRequestData(requestData)
  406. err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  407. err = tx.Where("task_id = ?", requestData.TaskId).Omit("create_time", "update_time", "status", "is_del", "delete_time", "control_task_id", "date", "task_id").Updates(&gameTask).Error
  408. if err != nil {
  409. global.GVA_LOG.Error("更新任务数据失败: ", zap.Error(err))
  410. return err
  411. }
  412. _, err := s.UpdateTaskRequestControl(taskRequestData, gameTask.ControlTaskId)
  413. if err != nil {
  414. global.GVA_LOG.Error("更新任务数据请求群控失败: ", zap.Error(err))
  415. }
  416. return err
  417. })
  418. return
  419. }
  420. // http请求群控刪除任务
  421. func (s *GameTask) DelTaskRequestControl(controlTaskId int) (d string, err error) {
  422. url := global.GVA_CONFIG.ExtranetDomain.Control + CreateTaskUrl + "/" + strconv.Itoa(controlTaskId)
  423. data, code, err := utils.HttpDeleteReplyCode(url, nil)
  424. fmt.Println(code)
  425. if code != 200 {
  426. return string(data), errors.New(string(data))
  427. }
  428. d = string(data)
  429. return
  430. }
  431. //@author: [piexlmax](https://github.com/piexlmax)
  432. //@function: DeleteGameTask
  433. //@description: 删除GameTask
  434. //@param: api task.GameTask
  435. //@return: err error
  436. func (s *GameTask) DeleteGameTask(api request.GameTaskRequest) (err error) {
  437. var entity task.GameTask
  438. err = global.GVA_DB.Where("task_id = ?", api.TaskId).First(&entity).Error
  439. if errors.Is(err, gorm.ErrRecordNotFound) {
  440. return err
  441. }
  442. gameTask := new(task.GameTask)
  443. global.GVA_DB.Where("task_id = ?", api.TaskId).First(&gameTask)
  444. controlTaskId := gameTask.ControlTaskId
  445. update := map[string]interface{}{
  446. "is_del": 1,
  447. "status": -1,
  448. "stop_time": time.Now(),
  449. "delete_time": time.Now(),
  450. }
  451. err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  452. err := tx.Table("game_task").Where("task_id", api.TaskId).Updates(update).Error
  453. if err != nil {
  454. return err
  455. }
  456. _, err = s.DelTaskRequestControl(controlTaskId)
  457. return err
  458. })
  459. return
  460. }