game_task.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  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{}, 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. if err != nil {
  217. return apiList, total, err
  218. } else {
  219. db = db.Limit(limit).Offset(offset)
  220. if order != "" {
  221. var OrderStr string
  222. // 设置有效排序key 防止sql注入
  223. // 感谢 Tom4t0 提交漏洞信息
  224. orderMap := make(map[string]bool, 4)
  225. orderMap["id"] = true
  226. orderMap["task_name"] = true
  227. orderMap["user"] = true
  228. if orderMap[order] {
  229. if desc {
  230. OrderStr = order + " desc"
  231. } else {
  232. OrderStr = order
  233. }
  234. } else { // didn't matched any order key in `orderMap`
  235. err = fmt.Errorf("非法的排序字段: %v", order)
  236. return apiList, total, err
  237. }
  238. err = db.Order(OrderStr).Find(&apiList).Error
  239. } else {
  240. err = db.Order("id desc").Find(&apiList).Error
  241. }
  242. }
  243. var apisReply []*response.GetGameTaskListReply
  244. if len(apiList) != 0 {
  245. for _, apiInfo := range apiList {
  246. var apiReply = new(response.GetGameTaskListReply)
  247. apiReply.Status = apiInfo.Status
  248. apiReply.TaskId = apiInfo.TaskId
  249. apiReply.TaskName = apiInfo.TaskName
  250. apiReply.GamePort = GamePort[apiInfo.GamePortId]
  251. apiReply.AccountType = AccountType[apiInfo.AccountType]
  252. apiReply.LoginMethod = LoginMethod[apiInfo.LoginMethod]
  253. apiReply.CreateTime = apiInfo.CreateTime.Format("2006-01-02 15:04:05")
  254. apiReply.User = apiInfo.User
  255. apiReply.Date = apiInfo.Date.Format("2006-01-02")
  256. apiReply.GameName = apiInfo.GameName
  257. apiReply.UpdateTime = apiInfo.UpdateTime.Format("2006-01-02 15:04:05")
  258. apiReply.NewTarget = apiInfo.NewTarget
  259. apiReply.PayTarget = apiInfo.PayTarget
  260. apiReply.RetainedTarget = apiInfo.RetainedTarget
  261. apiReply.PayPrice = apiInfo.PayPrice
  262. apiReply.StopTime = apiInfo.StopTime.Format("2006-01-02 15:04:05")
  263. if apiInfo.Status == 1 {
  264. apiReply.StopTime = ""
  265. }
  266. apisReply = append(apisReply, apiReply)
  267. }
  268. }
  269. return apisReply, total, err
  270. }
  271. //@author: [piexlmax](https://github.com/piexlmax)
  272. //@function: GetGameTaskById
  273. //@description: 根据id获取GameTask
  274. //@param: id uint
  275. //@return: apiReply response.GetPcListReply, err error
  276. func (c *GameTask) GetGameTaskById(id int) (gameTask request.GameTaskRequest, err error) {
  277. var requestData task.GameTask
  278. err = global.GVA_DB.Where("task_id = ?", id).First(&requestData).Error
  279. if err != nil {
  280. return
  281. }
  282. gameTask.TaskId = requestData.TaskId
  283. gameTask.TaskName = requestData.TaskName
  284. gameTask.User = requestData.User
  285. gameTask.NewRetained = requestData.NewRetained
  286. gameTask.GameName = requestData.GameName
  287. gameTask.GamePortId = requestData.GamePortId
  288. gameTask.AccountType = requestData.AccountType
  289. gameTask.LoginMethod = requestData.LoginMethod
  290. gameTask.TxChannel = requestData.TxChannel
  291. gameTask.TxGameId = requestData.TxGameId
  292. gameTask.MzChannel = requestData.MzChannel
  293. gameTask.MzGameId = requestData.MzGameId
  294. gameTask.GameIdXmy = requestData.GameIdXmy
  295. gameTask.NewTarget = requestData.NewTarget
  296. gameTask.PayTarget = requestData.PayTarget
  297. gameTask.RetainedTarget = requestData.RetainedTarget
  298. gameTask.PayPrice = requestData.PayPrice
  299. return
  300. }
  301. // http请求群控更新任务装
  302. func (s *GameTask) UpdateControlStatus(gameId int, status int) (err error) {
  303. url := global.GVA_CONFIG.ExtranetDomain.Control + UpdateGameTaskStatusUrl
  304. requestData := map[string]string{
  305. "status": strconv.Itoa(status),
  306. "game_id": strconv.Itoa(gameId),
  307. }
  308. data, code, err := utils.HttpGetReplyCode(url, requestData)
  309. if err != nil {
  310. return err
  311. }
  312. fmt.Println(code)
  313. if code != 200 {
  314. return errors.New(string(data))
  315. }
  316. return
  317. }
  318. //@author: [piexlmax](https://github.com/piexlmax)
  319. //@function: UpdateGameTaskStatus
  320. //@description: 根据id更新GameTask状态
  321. //@param: GameTask request.UpdateGameTaskRequest
  322. //@return: err error
  323. func (s *GameTask) UpdateGameTaskStatus(c request.UpdateGameTaskStatusRequest) (err error) {
  324. var oldA task.GameTask
  325. err = global.GVA_DB.Where("task_id = ?", c.TaskId).First(&oldA).Error
  326. if err != nil {
  327. return err
  328. }
  329. err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  330. update := map[string]interface{}{
  331. "status": c.Status,
  332. }
  333. status := c.Status
  334. if c.Status == -1 {
  335. status = 0
  336. update["stop_time"] = time.Now().Format("2006-01-02 15:04:05")
  337. } else {
  338. date := time.Now()
  339. if !errors.Is(tx.Where("task_id = ?", c.TaskId).Where("create_date = ?", date.Format("2006-01-02")).First(&task.GameTargetComplete{}).Error, gorm.ErrRecordNotFound) {
  340. global.GVA_LOG.Info("当天的任务目标已存在")
  341. } else {
  342. targetComplete := s.CreateGameTargetCompleteModel(oldA, date)
  343. err := tx.Omit("update_time").Create(&targetComplete).Error
  344. if err != nil {
  345. global.GVA_LOG.Error("创建任务目标数据失败", zap.Error(err))
  346. return err
  347. }
  348. }
  349. }
  350. err := tx.Table("game_task").Where("task_id", c.TaskId).Updates(update).Error
  351. if err != nil {
  352. return err
  353. }
  354. err = s.UpdateControlStatus(c.TaskId, status)
  355. return err
  356. })
  357. return err
  358. }
  359. // 更新GameTask
  360. func (s *GameTask) UpdateGameTask(requestData request.GameTaskRequest) (err error) {
  361. if errors.Is(global.GVA_DB.Where("task_id = ?", requestData.TaskId).First(&task.GameTask{}).Error, gorm.ErrRecordNotFound) {
  362. return errors.New("不存在的任务")
  363. }
  364. gameTask := new(task.GameTask)
  365. global.GVA_DB.Where("task_id = ?", requestData.TaskId).First(&gameTask)
  366. gameTask.TaskId = requestData.TaskId
  367. gameTask.TaskName = requestData.TaskName
  368. gameTask.User = requestData.User
  369. gameTask.NewRetained = requestData.NewRetained
  370. gameTask.GameName = requestData.GameName
  371. gameTask.GameId = requestData.GameId
  372. gameTask.GamePortId = requestData.GamePortId
  373. gameTask.AccountType = requestData.AccountType
  374. gameTask.LoginMethod = requestData.LoginMethod
  375. gameTask.TxChannel = requestData.TxChannel
  376. gameTask.TxGameId = requestData.TxGameId
  377. gameTask.MzChannel = requestData.MzChannel
  378. gameTask.MzGameId = requestData.MzGameId
  379. gameTask.GameIdXmy = requestData.GameIdXmy
  380. gameTask.NewTarget = requestData.NewTarget
  381. gameTask.PayTarget = requestData.PayTarget
  382. gameTask.RetainedTarget = requestData.RetainedTarget
  383. gameTask.PayPrice = requestData.PayPrice
  384. taskRequestData := s.CreateGameTaskRequestData(requestData)
  385. err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  386. 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
  387. if err != nil {
  388. global.GVA_LOG.Error("更新任务数据失败: ", zap.Error(err))
  389. return err
  390. }
  391. _, err := s.UpdateTaskRequestControl(taskRequestData, gameTask.ControlTaskId)
  392. if err != nil {
  393. global.GVA_LOG.Error("更新任务数据请求群控失败: ", zap.Error(err))
  394. }
  395. return err
  396. })
  397. return
  398. }
  399. // http请求群控刪除任务
  400. func (s *GameTask) DelTaskRequestControl(controlTaskId int) (d string, err error) {
  401. url := global.GVA_CONFIG.ExtranetDomain.Control + CreateTaskUrl + "/" + strconv.Itoa(controlTaskId)
  402. data, code, err := utils.HttpDeleteReplyCode(url, nil)
  403. fmt.Println(code)
  404. if code != 200 {
  405. return string(data), errors.New(string(data))
  406. }
  407. d = string(data)
  408. return
  409. }
  410. //@author: [piexlmax](https://github.com/piexlmax)
  411. //@function: DeleteGameTask
  412. //@description: 删除GameTask
  413. //@param: api task.GameTask
  414. //@return: err error
  415. func (s *GameTask) DeleteGameTask(api request.GameTaskRequest) (err error) {
  416. var entity task.GameTask
  417. err = global.GVA_DB.Where("task_id = ?", api.TaskId).First(&entity).Error
  418. if errors.Is(err, gorm.ErrRecordNotFound) {
  419. return err
  420. }
  421. gameTask := new(task.GameTask)
  422. global.GVA_DB.Where("task_id = ?", api.TaskId).First(&gameTask)
  423. controlTaskId := gameTask.ControlTaskId
  424. update := map[string]interface{}{
  425. "is_del": 1,
  426. "status": -1,
  427. "stop_time": time.Now(),
  428. "delete_time": time.Now(),
  429. }
  430. err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  431. err := tx.Table("game_task").Where("task_id", api.TaskId).Updates(update).Error
  432. if err != nil {
  433. return err
  434. }
  435. _, err = s.DelTaskRequestControl(controlTaskId)
  436. return err
  437. })
  438. return
  439. }