123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- package gm_services
- import (
- "bytes"
- "encoding/json"
- "fmt"
- "gadmin/config"
- )
- type ChapterInfo struct {
- UserId int64 `json:"user_id" gorm:"column:user_id"` //用户id
- ChapterId int32 `json:"chapter_id" gorm:"column:chapter_id"`
- Difficulty int32 `json:"difficulty" gorm:"column:difficulty"` //困难度
- Pass bool `json:"pass"` //是否通关
- MaxRoomId int32 `json:"maxRoomId" gorm:"column:room_id"` //最大探索度
- EventAt int32 `json:"event_at" gorm:"column:event_at;not null" ` //埋点事件触发的时间
- Extra string `json:"-" gorm:"column:extra" ` //相关参数
- PassCount int32 `json:"pass_count"` //通关次数
- FailCount int32 `json:"fail_count"` //失败次数
- }
- //
- // QueryPlayerChapter
- // @Description: 获取普通关卡进度信息
- // @param playerId 用户Id
- // @return []ChapterInfo 进度信息
- // @return int
- //
- func QueryPlayerChapter(playerId int64) ([]*ChapterInfo, int) {
- var playerRoomInfos []*ChapterInfo
- var sqlInfo bytes.Buffer
- sqlTemp := `(SELECT
- t.user_id,
- t.chapter_id,
- max( t.room_id ) AS 'room_id',
- ANY_VALUE ( t.difficulty ) AS difficulty,
- ANY_VALUE ( event_at ) AS event_at,
- ANY_VALUE ( extra ) AS extra
- FROM
- chapter_logs_%d t
- WHERE
- t.event_id = 11
- AND t.extra LIKE '%%\"type\":%%'
- AND t.user_id = %d)`
- for i := 0; i < 18; i++ {
- info := fmt.Sprintf(sqlTemp, i, playerId)
- sqlInfo.WriteString(info)
- if i != 17 {
- sqlInfo.WriteString(" UNION ")
- }
- }
- sqlInfo.WriteString(" ORDER BY user_id")
- sqlTemp = sqlInfo.String()
- config.DB.Raw(sqlTemp).Scan(&playerRoomInfos)
- if len(playerRoomInfos) > 0 && playerRoomInfos[0].UserId != playerId {
- playerRoomInfos = append(playerRoomInfos[:0], playerRoomInfos[1:]...)
- }
- for i := range playerRoomInfos {
- if playerRoomInfos[i].UserId != playerId {
- continue
- }
- dataTemp := playerRoomInfos[i]
- isPass := playerPass(dataTemp.Extra)
- playerRoomInfos[i].Pass = isPass
- }
- activeInfo := queryActiveChapterInfo(playerId)
- playerRoomInfos = append(playerRoomInfos, activeInfo...)
- return playerRoomInfos, len(playerRoomInfos)
- }
- //
- // QueryActiveChapterInfo
- // @Description: 获取活动关卡进度信息(101,102,103)
- // @param chapterId 关卡Id
- // @param startDate 开始时间(时间戳)
- // @param endDate 结束时间(时间戳)
- // @return []*ChapterInfo 进度信息
- // @return int
- //
- func queryActiveChapterInfo(playerId int64) []*ChapterInfo {
- var playerRoomInfos []ChapterInfo
- sqlTemp := `(SELECT
- t.chapter_id,
- ANY_VALUE ( t.difficulty ) AS difficulty,
- ANY_VALUE ( event_at ) AS event_at,
- ANY_VALUE ( extra ) AS extra,
- ANY_VALUE ( user_id ) AS user_id
- FROM
- chapter_logs_%d t
- WHERE
- t.event_id = 11
- AND t.extra LIKE '%%"type":%%'
- AND t.user_id = %d
- AND LENGTH( t.user_id ) >= 1
- )`
- var sqlInfo bytes.Buffer
- for i := 101; i < 104; i++ {
- infoTemp := fmt.Sprintf(sqlTemp, i, playerId)
- sqlInfo.WriteString(infoTemp)
- if i != 103 {
- sqlInfo.WriteString(" UNION ALL ")
- }
- }
- sqlInfo.WriteString("ORDER BY chapter_id")
- sqlTemp = sqlInfo.String()
- config.DB.Raw(sqlTemp).Scan(&playerRoomInfos)
- var result []*ChapterInfo
- lastChapterId := int32(-1)
- for _, info := range playerRoomInfos {
- if info.ChapterId == 0 {
- continue
- }
- if lastChapterId != info.ChapterId {
- infoTemp := &ChapterInfo{ChapterId: info.ChapterId,
- Difficulty: info.Difficulty}
- result = append(result, infoTemp)
- }
- passChapter := playerPass(info.Extra)
- if passChapter {
- result[len(result)-1].PassCount++
- } else {
- result[len(result)-1].FailCount++
- }
- lastChapterId = info.ChapterId
- }
- return result
- }
- //
- // playerPass
- // @Description: 玩家是否通过关卡
- // @param extraInfo 相关参数
- // @return bool 是否通关
- //
- func playerPass(extraInfo string) bool {
- type passType struct {
- Type int `json:"type"` //-1死亡结算;主动退出结算 1通关结算
- }
- var passTypeTemp passType
- json.Unmarshal([]byte(extraInfo), &passTypeTemp)
- return passTypeTemp.Type == 1
- }
|