act_rank.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616
  1. package service
  2. import (
  3. "fmt"
  4. "sort"
  5. "strconv"
  6. "crazy-fox-backend-api/utils"
  7. "crazy-fox-backend-api/config"
  8. "crazy-fox-backend-api/model"
  9. "crazy-fox-backend-api/utils/uniqid"
  10. "github.com/dablelv/go-huge-util/conv"
  11. "github.com/jmoiron/sqlx/types"
  12. jsoniter "github.com/json-iterator/go"
  13. "github.com/pkg/errors"
  14. )
  15. type actRank struct{}
  16. // 展示数据处理
  17. func (This *actRank) handleActShow(confInfo *model.ActConfInfo) (types.JSONText, error) {
  18. rewardPro, err := This.formatRankRewardProShow(confInfo.RewardPro)
  19. if err != nil {
  20. return nil, errors.WithStack(err)
  21. }
  22. extraData, err := This.formatRankExtraDataShow(confInfo)
  23. if err != nil {
  24. return nil, errors.WithStack(err)
  25. }
  26. ExtraConf := model.ExtraConf{
  27. Reward: confInfo.Reward,
  28. ExtraReward: confInfo.ExtraReward,
  29. RewardConf: confInfo.RewardConf,
  30. RewardPro: rewardPro,
  31. ExtraData: extraData,
  32. }
  33. return jsoniter.Marshal(ExtraConf)
  34. }
  35. // 保存数据处理
  36. func (This *actRank) handleActSave(confInfo *model.ActConfInfo) error {
  37. var rewardMap model.ExtraConf
  38. var err error
  39. if err = jsoniter.Unmarshal(confInfo.ActShowConf, &rewardMap); err != nil {
  40. return errors.Wrap(err, "锦标赛Json解析失败")
  41. }
  42. // 格式化奖励数据
  43. if confInfo.RewardPro, err = This.formatRankRewardPro(rewardMap.RewardPro); err != nil {
  44. return errors.Wrap(err, "格式化奖励数据")
  45. }
  46. // 格式化收集积分配置
  47. if confInfo.RewardConf, err = This.formatRankRewardConf(confInfo.Type, rewardMap.RewardConf); err != nil {
  48. return errors.Wrap(err, "格式化收集积分配置")
  49. }
  50. // 格式化分房与机器人配置
  51. if confInfo.ExtraData, err = This.formatRankExtraData(confInfo.Type, rewardMap.ExtraData); err != nil {
  52. return errors.Wrap(err, "格式化分房与机器人配置")
  53. }
  54. return nil
  55. }
  56. // 分层数据处理
  57. func (This *actRank) handleActRewardSection(confInfo *model.ActConfInfo, maps ...map[string]any) error {
  58. var repoConfMap map[int64]model.RankRewardRepoConf
  59. if err := jsoniter.Unmarshal(confInfo.RewardPro, &repoConfMap); err != nil {
  60. return errors.Wrap(err, "锦标赛 rewardPro 解析失败")
  61. }
  62. conditionMap, rewardMap := maps[0], maps[1]
  63. for idx1, item1 := range repoConfMap {
  64. for idx2, item2 := range item1.Stages {
  65. for idx3, item3 := range item2.Stages {
  66. stageKey := fmt.Sprintf("%d_%d_%d", idx1, idx2, idx3)
  67. conditionMap[stageKey] = Activity.buildStageCondition(
  68. model.LvRange{LvStart: item1.Start, LvEnd: item1.End},
  69. model.SpinsRange{SpinsStart: item2.Start, SpinsEnd: item2.End},
  70. item3.SsGroup,
  71. )
  72. rewardMap[stageKey] = item3.Stages
  73. }
  74. }
  75. }
  76. return nil
  77. }
  78. // 导入数据处理
  79. func (This *actRank) handleActImport(detailInfo *model.ActDetailInfo, excelInfo [][][]string) (json types.JSONText, err error) {
  80. isProgress := false // 是否为有进度活动
  81. if utils.InSlice(detailInfo.Type, []string{config.ActRank, config.ActBuildRank}) {
  82. isProgress = true
  83. }
  84. sheetLen := utils.Ternary(isProgress, 8, 7)
  85. if len(excelInfo) != sheetLen {
  86. return json, errors.New("奖励配置异常")
  87. }
  88. isBuildRank := true // 是否为建筑锦标赛
  89. if utils.InSlice(detailInfo.Type, []string{config.ActRank, config.ActRank2}) {
  90. isBuildRank = false
  91. }
  92. sheet2Array := excelInfo[1]
  93. sheet3Array := excelInfo[2]
  94. sheet4Array := excelInfo[3]
  95. sheet5Array := excelInfo[4]
  96. sheet6Array := excelInfo[5]
  97. sheet7Array := excelInfo[6]
  98. extraConf := model.ExtraConf{}
  99. if isBuildRank {
  100. // 建筑锦标赛积分配置
  101. if extraConf.RewardConf, err = This.parseBuildRankScoreSheet(sheet2Array); err != nil {
  102. return json, errors.WithStack(err)
  103. }
  104. } else {
  105. // 锦标赛积分配置
  106. if extraConf.RewardConf, err = This.parseRankScoreSheet(sheet2Array); err != nil {
  107. return json, errors.WithStack(err)
  108. }
  109. }
  110. // 锦标赛房间配置
  111. if extraConf.ExtraData, err = This.parseRankExtraDataSheet(isBuildRank, sheet3Array, sheet4Array, sheet5Array); err != nil {
  112. return json, errors.WithStack(err)
  113. }
  114. // 锦标赛奖励配置
  115. rewardSheetArr := [][][]string{sheet6Array, sheet7Array}
  116. if isProgress {
  117. rewardSheetArr = append(rewardSheetArr, excelInfo[7])
  118. }
  119. if extraConf.RewardPro, err = This.parseRankRewardProSheet(rewardSheetArr); err != nil {
  120. return json, errors.WithStack(err)
  121. }
  122. if json, err = jsoniter.Marshal(extraConf); err != nil {
  123. return json, errors.Wrap(err, "锦标赛配置序列化失败")
  124. }
  125. return
  126. }
  127. func (This *actRank) formatRankRewardProShow(rewardPro types.JSONText) (types.JSONText, error) {
  128. var confMap map[int64]model.RankRewardRepoConf
  129. if err := jsoniter.Unmarshal(rewardPro, &confMap); err != nil {
  130. return nil, errors.Wrap(err, "锦标赛 rewardPro解析失败")
  131. }
  132. var rewardProArray []model.RankRewardShowConf
  133. for lvIdx, lvStages := range confMap {
  134. for spinIdx, spinsStages := range lvStages.Stages {
  135. for ssGroupIdx, ssGroupStages := range spinsStages.Stages {
  136. rewardProArray = append(rewardProArray, model.RankRewardShowConf{
  137. Idx: Activity.buildLayerOrderId(lvIdx, spinIdx, ssGroupIdx),
  138. LvRange: model.LvRange{LvStart: lvStages.Start, LvEnd: lvStages.End},
  139. SpinsRange: model.SpinsRange{SpinsStart: spinsStages.Start, SpinsEnd: spinsStages.End},
  140. SsGroup: ssGroupStages.SsGroup,
  141. RankRewardShow: model.RankRewardShow{
  142. Ranks: utils.MapValues(ssGroupStages.Stages.Ranks, true),
  143. Stages: utils.MapValues(ssGroupStages.Stages.Stages, true),
  144. },
  145. })
  146. }
  147. }
  148. }
  149. sort.SliceStable(rewardProArray, func(i, j int) bool { return rewardProArray[i].Idx < rewardProArray[j].Idx })
  150. return jsoniter.Marshal(rewardProArray)
  151. }
  152. func (This *actRank) formatRankExtraDataShow(confInfo *model.ActConfInfo) (types.JSONText, error) {
  153. var dataRepo model.RankExtraDataRepo
  154. if err := jsoniter.Unmarshal(confInfo.ExtraData, &dataRepo); err != nil {
  155. return nil, errors.Wrap(err, "锦标赛 extraData 解析失败")
  156. }
  157. dataShow := model.RankExtraDataShow{
  158. RankExtraData: dataRepo.RankExtraData,
  159. Robot: utils.MapValues(dataRepo.Robot, true),
  160. }
  161. // 锦标赛版本兼容
  162. if utils.InSlice(confInfo.Type, []string{config.ActRank, config.ActRank2}) {
  163. dataShow.RoomAllotConf = This.formatRankRoomAllotConf(dataRepo)
  164. }
  165. return jsoniter.Marshal(dataShow)
  166. }
  167. func (This *actRank) formatRankRoomAllotConf(dataRepo model.RankExtraDataRepo) (showConfArr []model.RankRoomAllotShowConf) {
  168. if utils.IsEmpty(dataRepo.RoomAllotConf) {
  169. allotStage := make([]model.RankRoomAllotStage, 0, len(dataRepo.SpinsSet))
  170. for i := 0; i < len(dataRepo.SpinsSet)-1; i++ {
  171. allotStage = append(allotStage, model.RankRoomAllotStage{
  172. SpinsRange: model.SpinsRange{
  173. SpinsStart: dataRepo.SpinsSet[i],
  174. SpinsEnd: dataRepo.SpinsSet[i+1] - 1,
  175. },
  176. RobotStop: dataRepo.SpinsSetSpins[i],
  177. })
  178. }
  179. dataRepo.RoomAllotConf = []model.RankRoomAllotRepoConf{
  180. {
  181. LvRange: model.LvRange{
  182. LvStart: 0,
  183. LvEnd: 999999999,
  184. },
  185. Stages: allotStage,
  186. },
  187. }
  188. }
  189. for _, item1 := range dataRepo.RoomAllotConf {
  190. for _, item2 := range item1.Stages {
  191. showConfArr = append(showConfArr, model.RankRoomAllotShowConf{
  192. LvRange: item1.LvRange,
  193. SpinsRange: item2.SpinsRange,
  194. RobotStop: item2.RobotStop,
  195. })
  196. }
  197. }
  198. return
  199. }
  200. // 格式化奖励数据
  201. func (This *actRank) formatRankRewardPro(rewardProJson types.JSONText) (types.JSONText, error) {
  202. var (
  203. err error
  204. rankRwdPro []model.RankRewardShowConf
  205. rankRwdProRepo = map[int64]model.RankRewardRepoConf{}
  206. unique = uniqid.GetUniqId()
  207. )
  208. defer uniqid.DelMapByUniqId(unique)
  209. if err = jsoniter.Unmarshal(rewardProJson, &rankRwdPro); err != nil {
  210. return nil, errors.Wrap(err, "锦标赛Json解析失败")
  211. }
  212. for _, one := range rankRwdPro {
  213. idxes := uniqid.GetStageIdx(unique, one.LvRange, one.SpinsRange, one.SsGroup)
  214. lvIdx, spinIdx, ssIdx := idxes[0], idxes[1], idxes[2]
  215. if _, Ok := rankRwdProRepo[lvIdx]; !Ok {
  216. rankRwdProRepo[lvIdx] = model.RankRewardRepoConf{
  217. StartEnd: model.StartEnd{Start: one.LvStart, End: one.LvEnd},
  218. Stages: map[int64]model.RankRewardSpinsStage{},
  219. }
  220. }
  221. if _, Ok := rankRwdProRepo[lvIdx].Stages[spinIdx]; !Ok {
  222. rankRwdProRepo[lvIdx].Stages[spinIdx] = model.RankRewardSpinsStage{
  223. StartEnd: model.StartEnd{Start: one.SpinsStart, End: one.SpinsEnd},
  224. Stages: map[int64]model.RankRewardSsGroupStage{},
  225. }
  226. }
  227. if _, Ok := rankRwdProRepo[lvIdx].Stages[spinIdx].Stages[ssIdx]; !Ok {
  228. rankRwdProRepo[lvIdx].Stages[spinIdx].Stages[ssIdx] = model.RankRewardSsGroupStage{
  229. SsGroup: one.SsGroup,
  230. Stages: model.RankRewardStage{
  231. Ranks: utils.Slice2Map(one.Ranks),
  232. Stages: utils.Slice2Map(one.Stages),
  233. },
  234. }
  235. }
  236. }
  237. return jsoniter.Marshal(rankRwdProRepo)
  238. }
  239. // 格式化收集积分配置
  240. func (This *actRank) formatRankRewardConf(actType string, rewardConfJson types.JSONText) (types.JSONText, error) {
  241. var rankRewardConf any
  242. switch actType {
  243. case config.ActRank, config.ActRank2:
  244. rankRewardConf = model.RankCollectConf{}
  245. case config.ActBuildRank, config.ActBuildRank2:
  246. rankRewardConf = model.BuildRankScoreConf{}
  247. default:
  248. return nil, errors.Wrap(nil, "活动类型异常:"+actType)
  249. }
  250. var err error
  251. if err = jsoniter.Unmarshal(rewardConfJson, &rankRewardConf); err != nil {
  252. return nil, errors.Wrap(err, "锦标赛Json解析失败")
  253. }
  254. return jsoniter.Marshal(rankRewardConf)
  255. }
  256. // 格式化分房与机器人配置
  257. func (This *actRank) formatRankExtraData(actType string, extraDataJson types.JSONText) (types.JSONText, error) {
  258. var dataShow model.RankExtraDataShow
  259. if err := jsoniter.Unmarshal(extraDataJson, &dataShow); err != nil {
  260. return nil, errors.Wrap(err, "锦标赛Json解析失败")
  261. }
  262. extraDataRepo := model.RankExtraDataRepo{
  263. RankExtraData: dataShow.RankExtraData,
  264. Robot: utils.Slice2Map(dataShow.Robot),
  265. RoomAllotConf: This.mapParseRankRoomAllotConf(dataShow.RoomAllotConf),
  266. }
  267. extraDataRepo.SetType = 2
  268. if utils.InSlice(actType, []string{config.ActRank, config.ActRank2}) {
  269. extraDataRepo.SetType = 10
  270. }
  271. return jsoniter.Marshal(extraDataRepo)
  272. }
  273. // 排名奖励
  274. func (This *actRank) parseRanksReward(sheet [][]string) (map[int64][]model.RankRanksReward, error) {
  275. var (
  276. err error
  277. rewardsMap = map[int64][]model.RankRanksReward{}
  278. )
  279. for i := 1; i < len(sheet); i++ {
  280. var (
  281. one = model.RankRanksReward{}
  282. id int64
  283. reward = make([]model.ExcelPrize, 6)
  284. )
  285. if err = utils.DestructAssign(sheet[i], &id, &one.RankPos, &reward); err != nil {
  286. return nil, errors.Wrap(err, fmt.Sprintf("第%d行 解析出错", i+1))
  287. }
  288. if one.Prize, err = Props.MultiParseActPrize(reward); err != nil {
  289. return nil, errors.WithStack(err)
  290. }
  291. rewardsMap[id] = append(rewardsMap[id], one)
  292. }
  293. return rewardsMap, nil
  294. }
  295. // 阶段奖励
  296. func (This *actRank) parseStagesReward(sheetInfo [][]string) (map[int64][]model.RankStageReward, error) {
  297. var (
  298. reward = model.RankStageReward{}
  299. err error
  300. mapIdx int64
  301. rewardsMap = map[int64][]model.RankStageReward{}
  302. )
  303. excelPrizes := make([]model.ExcelPrize, 6, 6)
  304. for i := 1; i < len(sheetInfo); i++ {
  305. if err := utils.DestructAssign(sheetInfo[i], &mapIdx, &reward.Stage, &reward.ProgressBarId, &reward.StepNum, &excelPrizes); err != nil {
  306. return nil, errors.Wrap(err, fmt.Sprintf("第%d行", i+1))
  307. }
  308. if reward.Prize, err = Props.MultiParseActPrize(excelPrizes); err != nil {
  309. return nil, err
  310. }
  311. rewardsMap[mapIdx] = append(rewardsMap[mapIdx], reward)
  312. }
  313. return rewardsMap, nil
  314. }
  315. // 锦标赛积分配置
  316. func (This *actRank) parseRankScoreSheet(sheet [][]string) (types.JSONText, error) {
  317. rewardConf := model.RankCollectConf{}
  318. for _, line := range sheet {
  319. var (
  320. tag string
  321. val int64
  322. )
  323. if err := utils.DestructAssign(line, &tag, &val); err != nil {
  324. return nil, errors.WithStack(err)
  325. }
  326. switch tag {
  327. case config.CollectTypeAttackSuccessImportText:
  328. rewardConf.AttackSuccess = val
  329. case config.CollectTypeAttackBreakImportText:
  330. rewardConf.AttackBreak = val
  331. case config.CollectTypeStealSuccessImportText:
  332. rewardConf.StealSuccess = val
  333. case config.CollectTypeStealBreakImportText:
  334. rewardConf.StealBreak = val
  335. case config.CollectTypeThreeHitImportText:
  336. rewardConf.ThreeHit = val
  337. }
  338. }
  339. return jsoniter.Marshal(rewardConf)
  340. }
  341. // 建筑锦标赛积分配置
  342. func (This *actRank) parseBuildRankScoreSheet(sheet [][]string) (types.JSONText, error) {
  343. rewardConf := model.BuildRankRewardConf{}
  344. if sheet[0][0] == config.BuildRankMinScoreImportText {
  345. rewardConf.MinScore = conv.ToAny[int64](sheet[0][1])
  346. }
  347. rewardConf.ActionConfig = make([]model.BuildRankScoreConf, 0, len(sheet))
  348. for i := 2; i < len(sheet); i++ {
  349. one := model.BuildRankScoreConf{}
  350. if err := utils.DestructAssign(sheet[i], &one.MinLv, &one.MaxLv, &one.SingleGet[0], &one.SingleGet[1]); err != nil {
  351. return nil, errors.WithStack(err)
  352. }
  353. rewardConf.ActionConfig = append(rewardConf.ActionConfig, one)
  354. }
  355. return jsoniter.Marshal(rewardConf)
  356. }
  357. // 锦标赛分房间配置
  358. func (This *actRank) parseRankExtraDataSheet(isBuildRank bool, allotSheet, robotSheet, limitSheet [][]string) (types.JSONText, error) {
  359. var err error
  360. extraData := model.RankExtraDataShow{}
  361. // 配置版本
  362. extraData.SetType = int64(utils.Ternary(isBuildRank, 2, 10))
  363. // 房间分配配置
  364. if isBuildRank {
  365. if extraData.UserLvSet, extraData.UserLvSetRobotStop, err = This.parseBuildRankRoomAllotSheet(allotSheet); err != nil {
  366. return nil, errors.WithStack(err)
  367. }
  368. } else {
  369. if extraData.RoomAllotConf, err = This.parseRankRoomAllotSheet(allotSheet); err != nil {
  370. return nil, errors.WithStack(err)
  371. }
  372. }
  373. // 机器人配置
  374. if extraData.Robot, err = This.parseRankRobotSheet(robotSheet); err != nil {
  375. return nil, errors.WithStack(err)
  376. }
  377. // 人数限制配置
  378. if extraData.RankLimit, err = This.parseRankLimitSheet(limitSheet); err != nil {
  379. return nil, errors.WithStack(err)
  380. }
  381. return jsoniter.Marshal(extraData)
  382. }
  383. // 房间分配配置
  384. func (This *actRank) parseRankRoomAllotSheet(sheet [][]string) ([]model.RankRoomAllotShowConf, error) {
  385. allotConfArr := make([]model.RankRoomAllotShowConf, 0, len(sheet))
  386. for i := 1; i < len(sheet); i++ {
  387. var one model.RankRoomAllotShowConf
  388. if err := utils.DestructAssign(sheet[i], &one.LvRange, &one.SpinsRange, &one.RobotStop); err != nil {
  389. return nil, errors.WithStack(err)
  390. }
  391. allotConfArr = append(allotConfArr, one)
  392. }
  393. return allotConfArr, nil
  394. }
  395. // 房间分配配置
  396. func (This *actRank) parseBuildRankRoomAllotSheet(sheet [][]string) ([]int64, []int64, error) {
  397. userArr := make([]int64, 0, len(sheet))
  398. robotArr := make([]int64, 0, len(sheet))
  399. for i := 1; i < len(sheet); i++ {
  400. var user, robot int64
  401. if err := utils.DestructAssign(sheet[i], &user, &robot); err != nil {
  402. return nil, nil, errors.WithStack(err)
  403. }
  404. userArr = append(userArr, user)
  405. robotArr = append(robotArr, robot)
  406. }
  407. return userArr, robotArr, nil
  408. }
  409. // 机器人配置
  410. func (This *actRank) parseRankRobotSheet(sheet [][]string) ([]model.RankRobot, error) {
  411. robotArr := make([]model.RankRobot, 0, len(sheet))
  412. for i := 1; i < len(sheet); i++ {
  413. var one model.RankRobot
  414. if err := utils.DestructAssign(sheet[i], &one.Id, &one.Pro, &one.Num, &one.Co1, &one.Co2); err != nil {
  415. return nil, errors.WithStack(err)
  416. }
  417. robotArr = append(robotArr, one)
  418. }
  419. return robotArr, nil
  420. }
  421. // 人数限制配置
  422. func (This *actRank) parseRankLimitSheet(sheet [][]string) ([]model.RankLimit, error) {
  423. limitArr := make([]model.RankLimit, 0, len(sheet))
  424. for i := 1; i < len(sheet); i++ {
  425. var one model.RankLimit
  426. if err := utils.DestructAssign(sheet[i], &one.Time, &one.Limit); err != nil {
  427. return nil, err
  428. }
  429. limitArr = append(limitArr, one)
  430. }
  431. return limitArr, nil
  432. }
  433. // 奖励配置
  434. func (This *actRank) parseRankRewardProSheet(sheetArr [][][]string) (types.JSONText, error) {
  435. if !utils.InSlice(len(sheetArr), []int{2, 3}) {
  436. return nil, errors.New("奖励配置异常")
  437. }
  438. var (
  439. rankRwdPro []model.RankRewardShowConf
  440. stagesMap []model.ThreeLayer
  441. rankRewards map[int64][]model.RankRanksReward
  442. stageRewards map[int64][]model.RankStageReward
  443. err error
  444. )
  445. if stagesMap, err = Activity.parseThreeLayerConf(sheetArr[0]); err != nil {
  446. return nil, errors.WithStack(err)
  447. }
  448. if rankRewards, err = This.parseRanksReward(sheetArr[1]); err != nil {
  449. return nil, errors.WithStack(err)
  450. }
  451. if len(sheetArr) == 3 {
  452. if stageRewards, err = This.parseStagesReward(sheetArr[2]); err != nil {
  453. return nil, errors.WithStack(err)
  454. }
  455. if len(stageRewards) == 0 {
  456. return nil, errors.New("未配置阶段奖励")
  457. }
  458. }
  459. rankRwdPro = make([]model.RankRewardShowConf, 0, len(stagesMap))
  460. for _, layer := range stagesMap {
  461. rankReward, Ok := rankRewards[layer.Id]
  462. if !Ok {
  463. return nil, errors.New(strconv.Itoa(int(layer.Id)) + ":未配置排行奖励")
  464. }
  465. rankRwdProItem := model.RankRewardShowConf{
  466. Idx: layer.Id,
  467. LvRange: layer.LvRange,
  468. SpinsRange: layer.SpinsRange,
  469. SsGroup: layer.SsGroup,
  470. RankRewardShow: model.RankRewardShow{Ranks: rankReward},
  471. }
  472. if len(stageRewards) > 0 {
  473. stageReward, Ok := stageRewards[layer.Id]
  474. if !Ok {
  475. return nil, errors.New(strconv.Itoa(int(layer.Id)) + ":未配置阶段奖励")
  476. }
  477. rankRwdProItem.Stages = stageReward
  478. }
  479. rankRwdPro = append(rankRwdPro, rankRwdProItem)
  480. }
  481. return jsoniter.Marshal(rankRwdPro)
  482. }
  483. // 房间分区配置解析
  484. func (This *actRank) mapParseRankRoomAllotConf(conf []model.RankRoomAllotShowConf) []model.RankRoomAllotRepoConf {
  485. var repoConfArr []model.RankRoomAllotRepoConf
  486. for _, one := range conf {
  487. sameLvRange := false
  488. for i, repoConf := range repoConfArr {
  489. if repoConf.LvRange == one.LvRange {
  490. repoConfArr[i].Stages = append(repoConfArr[i].Stages, model.RankRoomAllotStage{
  491. SpinsRange: one.SpinsRange,
  492. RobotStop: one.RobotStop,
  493. })
  494. sameLvRange = true
  495. break
  496. }
  497. }
  498. if !sameLvRange {
  499. repoConfArr = append(repoConfArr, model.RankRoomAllotRepoConf{
  500. LvRange: one.LvRange,
  501. Stages: []model.RankRoomAllotStage{
  502. {
  503. SpinsRange: one.SpinsRange,
  504. RobotStop: one.RobotStop,
  505. },
  506. },
  507. })
  508. }
  509. }
  510. return repoConfArr
  511. }