grandmaster.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. package service
  2. import (
  3. "fmt"
  4. "gadmin/config"
  5. "gadmin/internal/admin/consts"
  6. "gadmin/internal/admin/forms"
  7. "gadmin/internal/gorm/model"
  8. "gadmin/internal/gorm/query"
  9. "gadmin/package/gmdata"
  10. "gadmin/utility/player"
  11. "gadmin/utility/serializer"
  12. "github.com/gin-gonic/gin"
  13. "github.com/jinzhu/now"
  14. "github.com/spf13/cast"
  15. "sort"
  16. "strings"
  17. "time"
  18. )
  19. // GrandMaster 最强王者
  20. var GrandMaster = new(sGrandMaster)
  21. type sGrandMaster struct{}
  22. func (s *sGrandMaster) Get(ctx *gin.Context, req forms.GetGrandmasterReq) serializer.Response {
  23. DB, err := player.GetDBByUserId(req.Playerid)
  24. if err != nil {
  25. return serializer.Err(consts.CodeParamErr, "GetDBByUserId err", err)
  26. }
  27. var (
  28. q = query.Use(config.GDBGroup[DB]).Grandmaster
  29. m = q.WithContext(ctx).Where(q.Playerid.Eq(req.Playerid))
  30. models *model.Grandmaster
  31. )
  32. if err = m.Scan(&models); err != nil {
  33. return serializer.Err(consts.CodeParamErr, "查询出错 ", err)
  34. }
  35. return serializer.Suc(models)
  36. }
  37. func (s *sGrandMaster) SetDanScore(ctx *gin.Context, req forms.SetGrandmasterDanScoreReq) serializer.Response {
  38. /* var err error
  39. DB, err := player.GetDBByUserId(req.Playerid)
  40. if err != nil {
  41. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  42. }
  43. msg := msg2.GmSetDanScore{
  44. MsgId: character.GenerateMsgId(),
  45. PlayerID: req.Playerid,
  46. DanScore: req.DanScore,
  47. OperatorId: token.GetUID(ctx),
  48. }
  49. rpc_share.MsgMap[msg.MsgId] = fmt.Sprintf("GM为修改段位积分 PlayerID: %d, DanScore: %v", req.Playerid, req.DanScore)
  50. var resp *msg2.ResponseGmSetDanScore
  51. res, err := config.GmNats.GmRequest(DB, "GmSetDanScore", msg)
  52. if err != nil {
  53. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  54. }
  55. if err = json.Unmarshal(res, &resp); err != nil {
  56. return serializer.Err(consts.CodeParamErr, err.Error(), err)
  57. }
  58. rpc_share.LogChan <- rpc_share.LogMsg{
  59. MsgID: msg.MsgId,
  60. Data: resp,
  61. }*/
  62. return serializer.Suc(req)
  63. }
  64. type GrandMasterReportInfo struct {
  65. Days []string `json:"days"`
  66. Players []int64 `json:"players"`
  67. }
  68. type GrandMasterLogItem struct {
  69. Day string `json:"days"`
  70. Players int64 `json:"players"`
  71. }
  72. type GrandMasterInfo struct {
  73. Info GrandMasterReportInfo `json:"info"`
  74. Rows []GrandMasterLogItem `json:"rows"`
  75. }
  76. type ReportDayGrandMaster struct {
  77. model.ReportDayGrandmaster
  78. }
  79. // QueryLog 统计报表
  80. func (s *sGrandMaster) QueryLog(params forms.GrandmasterReportReq) (result []*ReportDayGrandMaster, err error) {
  81. rdb := query.Use(config.DB).ReportDayGrandmaster
  82. m := rdb.Where(rdb.Date.Gte(params.Day), rdb.Date.Lt(params.EndDay)).Order(rdb.Date.Desc())
  83. switch params.ChannelId {
  84. case consts.ChannelIdNone:
  85. // 不选择渠道
  86. case consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
  87. // 所有的广告渠道
  88. m = m.Where(rdb.ChannelID.In(Channel.GetIdsByType(params.ChannelId)...))
  89. default:
  90. // 指定渠道
  91. m = m.Where(rdb.ChannelID.Eq(params.ChannelId))
  92. }
  93. if params.ServerId > 0 {
  94. m = m.Where(rdb.ServerID.Eq(int32(params.ServerId)))
  95. }
  96. distributes, err := m.Find()
  97. if err != nil {
  98. return
  99. }
  100. add := func(row *model.ReportDayGrandmaster) {
  101. var exist bool
  102. for _, v := range result {
  103. if v.Date == row.Date {
  104. exist = true
  105. v.PlayerCount += row.PlayerCount
  106. v.OpenPlayerCount += row.OpenPlayerCount
  107. v.PartCount += row.PartCount
  108. v.AllMatchSeconds += row.AllMatchSeconds
  109. v.BattleWavesCount += row.BattleWavesCount
  110. v.AllBattleSeconds += row.AllBattleSeconds
  111. v.LeaveUsers += row.LeaveUsers
  112. }
  113. }
  114. if exist == false {
  115. v := new(ReportDayGrandMaster)
  116. v.Date = row.Date
  117. v.ChannelID = row.ChannelID
  118. v.PlayerCount += row.PlayerCount
  119. v.OpenPlayerCount += row.OpenPlayerCount
  120. v.PartCount += row.PartCount
  121. v.AllMatchSeconds += row.AllMatchSeconds
  122. v.BattleWavesCount += row.BattleWavesCount
  123. v.AllBattleSeconds += row.AllBattleSeconds
  124. v.LeaveUsers += row.LeaveUsers
  125. result = append(result, v)
  126. }
  127. }
  128. for _, distribute := range distributes {
  129. add(distribute)
  130. }
  131. for _, v := range result {
  132. v.Date = strings.ReplaceAll(v.Date, "T00:00:00+08:00", "")
  133. }
  134. return
  135. }
  136. type GrandmasterWaves struct {
  137. Waves int `json:"waves"`
  138. Total int64 `json:"total"`
  139. }
  140. func (s *sGrandMaster) Waves(params forms.GrandmasterWavesReq) (results []GrandmasterWaves, err error) {
  141. key := config.UKey("GrandmasterWaves", params)
  142. if err = config.GetCacheScan(key, &results); err != nil {
  143. return
  144. }
  145. if len(results) != 0 {
  146. return
  147. }
  148. var (
  149. grandMasterModel = &model.GrandmasterLog{}
  150. m = config.DB.Model(&model.GrandmasterLog{}).Scopes(model.TableOfYearMonth(grandMasterModel.TableName(), time.Now())).
  151. Select("battle_waves as waves, COUNT(*) AS total").
  152. Where("event_id in(4,5) and date = ? and `battle_waves` BETWEEN ? AND ?",
  153. time.Unix(params.Date/1000, 0).Format("2006-01-02"), params.StartWaves, params.EndWaves)
  154. )
  155. if params.ServerId > 0 {
  156. m = m.Where("server_id = ?", params.ServerId)
  157. }
  158. m.Group("battle_waves").Scan(&results)
  159. results = s.completeMissingLevels(params, results)
  160. if len(results) > 0 {
  161. config.SetCache(key, results, now.BeginningOfDay().Unix()+86400)
  162. }
  163. return
  164. }
  165. func (s *sGrandMaster) completeMissingLevels(params forms.GrandmasterWavesReq, results []GrandmasterWaves) []GrandmasterWaves {
  166. var completedResults []GrandmasterWaves
  167. levels := make(map[int]bool)
  168. for _, result := range results {
  169. levels[result.Waves] = true
  170. completedResults = append(completedResults, result)
  171. }
  172. for i := params.StartWaves; i <= params.EndWaves; i++ {
  173. if !levels[int(i)] {
  174. completedResults = append(completedResults, GrandmasterWaves{Waves: int(i), Total: 0})
  175. }
  176. }
  177. sort.Slice(completedResults, func(i, j int) bool {
  178. return completedResults[i].Waves < completedResults[j].Waves // 根据等级从小到大排序
  179. })
  180. return completedResults
  181. }
  182. type GrandmasterSeconds struct {
  183. Seconds int `json:"seconds"`
  184. Total int64 `json:"total"`
  185. }
  186. func (s *sGrandMaster) Seconds(params forms.GrandmasterSecondsReq) (results []GrandmasterSeconds, err error) {
  187. key := config.UKey("GrandmasterSeconds", params)
  188. if err = config.GetCacheScan(key, &results); err != nil {
  189. return
  190. }
  191. if len(results) != 0 {
  192. return
  193. }
  194. var (
  195. grandMasterModel = &model.GrandmasterLog{}
  196. m = config.DB.Model(&model.GrandmasterLog{}).Scopes(model.TableOfYearMonth(grandMasterModel.TableName(), time.Now())).
  197. Select("battle_seconds as seconds, COUNT(*) AS total").
  198. Where("event_id in(4,5) and date = ? and `battle_seconds` BETWEEN ? AND ?",
  199. time.Unix(params.Date/1000, 0).Format("2006-01-02"), params.StartSeconds, params.EndSeconds)
  200. )
  201. if params.ServerId > 0 {
  202. m = m.Where("server_id = ?", params.ServerId)
  203. }
  204. m.Group("battle_seconds").Scan(&results)
  205. results = s.completeMissingSeconds(params, results)
  206. if len(results) > 0 {
  207. config.SetCache(key, results, now.BeginningOfDay().Unix()+86400)
  208. }
  209. return
  210. }
  211. func (s *sGrandMaster) completeMissingSeconds(params forms.GrandmasterSecondsReq, results []GrandmasterSeconds) []GrandmasterSeconds {
  212. var completedResults []GrandmasterSeconds
  213. levels := make(map[int]bool)
  214. for _, result := range results {
  215. levels[result.Seconds] = true
  216. completedResults = append(completedResults, result)
  217. }
  218. for i := params.StartSeconds; i <= params.EndSeconds; i++ {
  219. if !levels[int(i)] {
  220. completedResults = append(completedResults, GrandmasterSeconds{Seconds: int(i), Total: 0})
  221. }
  222. }
  223. sort.Slice(completedResults, func(i, j int) bool {
  224. return completedResults[i].Seconds < completedResults[j].Seconds // 根据等级从小到大排序
  225. })
  226. return completedResults
  227. }
  228. type GrandmasterDan struct {
  229. DanID int `json:"id"`
  230. DanName string `json:"danName"`
  231. Total int64 `json:"total"`
  232. }
  233. type ByDanID []*GrandmasterDan
  234. func (a ByDanID) Len() int { return len(a) }
  235. func (a ByDanID) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
  236. func (a ByDanID) Less(i, j int) bool { return a[i].DanID < a[j].DanID }
  237. func (s *sGrandMaster) Dan(params forms.GrandmasterDanReq) (results []*GrandmasterDan, err error) {
  238. key := config.UKey("GrandmasterDan", params)
  239. if err = config.GetCacheScan(key, &results); err != nil {
  240. return
  241. }
  242. if len(results) != 0 {
  243. return
  244. }
  245. type Log struct {
  246. UserID int
  247. Score int64
  248. }
  249. var logs []*Log
  250. grandMasterModel := &model.GrandmasterLog{}
  251. tableName := fmt.Sprintf("%s_%s", grandMasterModel.TableName(), time.Now().Format("200601"))
  252. if !config.DB.Migrator().HasTable(tableName) {
  253. tableName = grandMasterModel.TableName()
  254. }
  255. subQuery := `(SELECT user_id, MAX(event_at) AS last_event_at FROM %s where date = '%v' and event_id = 5`
  256. subQuery = fmt.Sprintf(subQuery, tableName, time.Unix(params.Date/1000, 0).Format("2006-01-02"))
  257. if params.ServerId > 0 {
  258. subQuery += " and server_id = " + cast.ToString(params.ServerId)
  259. }
  260. subQuery += ` GROUP BY user_id) AS B`
  261. joins := "INNER JOIN " + subQuery + " ON A.user_id = B.user_id AND A.event_at = B.last_event_at and A.date = '%v' and A.event_id = 5"
  262. joins = fmt.Sprintf(joins, time.Unix(params.Date/1000, 0).Format("2006-01-02"))
  263. if params.ServerId > 0 {
  264. joins += " and A.server_id = " + cast.ToString(params.ServerId)
  265. }
  266. joins += ` GROUP BY user_id, dan_score`
  267. query1 := config.DB.Table(fmt.Sprintf("%s as A", tableName)).Select("A.user_id, A.dan_score as score").Joins(joins).Scan(&logs)
  268. if query1.Error != nil {
  269. return nil, query1.Error
  270. }
  271. if len(logs) == 0 {
  272. results = make([]*GrandmasterDan, 0)
  273. return
  274. }
  275. addResult := func(dan *gmdata.KingSeasonDan) {
  276. for i, v := range results {
  277. if v.DanID == dan.Id {
  278. results[i].Total++
  279. return
  280. }
  281. }
  282. results = append(results, &GrandmasterDan{
  283. DanID: dan.Id,
  284. DanName: dan.DanName,
  285. Total: 1,
  286. })
  287. }
  288. for _, v := range logs {
  289. dan := gmdata.GetDanByScore(v.Score)
  290. if dan == nil {
  291. continue
  292. }
  293. addResult(dan)
  294. }
  295. sort.Sort(ByDanID(results))
  296. if len(results) > 0 {
  297. config.SetCache(key, results, now.BeginningOfDay().Unix()+86400)
  298. }
  299. return
  300. }
  301. type GrandmasterMatch struct {
  302. Seconds int64 `json:"seconds"`
  303. Total int64 `json:"total"`
  304. }
  305. func (s *sGrandMaster) Match(params forms.GrandmasterMatchReq) (results []*GrandmasterMatch, err error) {
  306. //key := config.UKey("GrandmasterMatch", params)
  307. //if err = config.GetCacheScan(key, &results); err != nil {
  308. // return
  309. //}
  310. //
  311. //if len(results) != 0 {
  312. // return
  313. //}
  314. var (
  315. m = config.DB.Model(&model.GrandmasterMatch{}).
  316. Select("seconds, times AS total").
  317. Where("type = ?", params.Type).
  318. Where("`seconds` BETWEEN ? AND ?", params.StartSeconds, params.EndSeconds)
  319. )
  320. m.Scan(&results)
  321. results = s.completeMissingMatch(params, results)
  322. //if len(results) > 0 {
  323. // config.SetCache(key, results, now.BeginningOfDay().Unix()+86400)
  324. //}
  325. return
  326. }
  327. func (s *sGrandMaster) completeMissingMatch(params forms.GrandmasterMatchReq, results []*GrandmasterMatch) []*GrandmasterMatch {
  328. var completedResults []*GrandmasterMatch
  329. levels := make(map[int]bool)
  330. for _, result := range results {
  331. levels[int(result.Seconds)] = true
  332. completedResults = append(completedResults, result)
  333. }
  334. for i := params.StartSeconds; i <= params.EndSeconds; i++ {
  335. if !levels[int(i)] {
  336. completedResults = append(completedResults, &GrandmasterMatch{Seconds: int64(i), Total: 0})
  337. }
  338. }
  339. sort.Slice(completedResults, func(i, j int) bool {
  340. return completedResults[i].Seconds < completedResults[j].Seconds // 根据等级从小到大排序
  341. })
  342. return completedResults
  343. }