game_task.go 15 KB

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