act_maya_wheel.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. package service
  2. import (
  3. "fmt"
  4. "sort"
  5. config2 "crazy-fox-backend-api/config"
  6. "crazy-fox-backend-api/model"
  7. "crazy-fox-backend-api/utils"
  8. "crazy-fox-backend-api/utils/uniqid"
  9. "github.com/jmoiron/sqlx/types"
  10. jsoniter "github.com/json-iterator/go"
  11. "github.com/pkg/errors"
  12. )
  13. type actMayaWheel struct{}
  14. // 展示数据处理
  15. func (This *actMayaWheel) handleActShow(confInfo *model.ActConfInfo) (json types.JSONText, err error) {
  16. // 奖励配置
  17. var rewardMap map[int64]model.MayaWheelRewardRepoConf
  18. if err = jsoniter.Unmarshal(confInfo.RewardConf, &rewardMap); err != nil {
  19. return nil, errors.Wrap(err, "玛雅转盘 奖励Json解析失败")
  20. }
  21. // 转盘基础配置
  22. var wheelConf model.MayaWheelBaseConf
  23. if err = jsoniter.Unmarshal(confInfo.ExtraData, &wheelConf); err != nil {
  24. return nil, errors.Wrap(err, "玛雅转盘 基础配置Json解析失败")
  25. }
  26. // 代币商品
  27. var tokenGoodsRepoConf map[string]model.TokenGoods
  28. if err = jsoniter.Unmarshal(confInfo.ExtraReward, &tokenGoodsRepoConf); err != nil {
  29. return nil, errors.Wrap(err, "玛雅转盘 代币商品Json解析失败")
  30. }
  31. // 数据转换
  32. showConf := This.convertIntoShowConf(rewardMap, wheelConf, tokenGoodsRepoConf)
  33. if json, err = jsoniter.Marshal(showConf); err != nil {
  34. return nil, errors.Wrap(err, "玛雅转盘 奖励序列化失败")
  35. }
  36. return
  37. }
  38. // 保存数据处理
  39. func (This *actMayaWheel) handleActSave(confInfo *model.ActConfInfo) (err error) {
  40. var showConf model.MayaWheelShowConf
  41. if err = jsoniter.Unmarshal(confInfo.ActShowConf, &showConf); err != nil {
  42. return errors.Wrap(err, "玛雅转盘 奖励Json解析失败")
  43. }
  44. // 数据转换
  45. repoConf := This.convertIntoRepoConf(showConf.RewardConf)
  46. if confInfo.RewardConf, err = jsoniter.Marshal(repoConf); err != nil {
  47. return errors.Wrap(err, "玛雅转盘 奖励数据序列化失败")
  48. }
  49. showConf.WheelConf.MayaWheelTotalCnt = 12 // 固定为12
  50. if confInfo.ExtraData, err = jsoniter.Marshal(showConf.WheelConf); err != nil {
  51. return errors.Wrap(err, "玛雅转盘 基础配置数据序列化失败")
  52. }
  53. if confInfo.RewardConf, err = jsoniter.Marshal(repoConf); err != nil {
  54. return errors.Wrap(err, "玛雅转盘 奖励数据序列化失败")
  55. }
  56. // 数据转换
  57. if confInfo.ExtraReward, err = This.convertIntoTokenGoodsRepoConf(showConf.RewardConf); err != nil {
  58. return errors.Wrap(err, "玛雅转盘 代币商品序列化失败")
  59. }
  60. return
  61. }
  62. // 分层数据处理
  63. func (This *actMayaWheel) handleActRewardSection(confInfo *model.ActConfInfo, maps ...map[string]any) error {
  64. var repoConfMap map[int64]model.MayaWheelRewardRepoConf
  65. if err := jsoniter.Unmarshal(confInfo.RewardConf, &repoConfMap); err != nil {
  66. return errors.Wrap(err, "玛雅转盘 奖励解析失败")
  67. }
  68. var baseConf model.MayaWheelBaseConf
  69. if err := jsoniter.Unmarshal(confInfo.ExtraData, &baseConf); err != nil {
  70. return errors.Wrap(err, "玛雅转盘 基础配置解析失败")
  71. }
  72. var extraReward map[string]model.TokenGoods
  73. if err := jsoniter.Unmarshal(confInfo.ExtraReward, &extraReward); err != nil {
  74. return errors.Wrap(err, "玛雅转盘 基础配置解析失败")
  75. }
  76. conditionMap, rewardMap, extraRewardMap := maps[0], maps[1], maps[2]
  77. for idx1, item1 := range repoConfMap {
  78. for idx2, item2 := range item1.Stages {
  79. for idx3, item3 := range item2.Stages {
  80. stageKey := fmt.Sprintf("%d_%d_%d", idx1, idx2, idx3)
  81. conditionMap[stageKey] = Activity.buildStageCondition(item1.LvRange, item2.SpinsRange, item3.SsGroup)
  82. rewardMap[stageKey] = model.MayaWheelStageCache{
  83. DiceConf: This.buildDiceCacheMap(item3.Rewards.DiceConf, baseConf),
  84. ProgressConf: utils.MapValues(item3.Rewards.ProgressConf, true),
  85. }
  86. extraRewardMap[stageKey] = model.StageExtraRepoConf{
  87. TokenGoods: extraReward[stageKey],
  88. }
  89. }
  90. }
  91. }
  92. return nil
  93. }
  94. // 导入数据处理
  95. func (This *actMayaWheel) handleActImport(_ *model.ActDetailInfo, excelInfo [][][]string) (json types.JSONText, err error) {
  96. if len(excelInfo) < 5 {
  97. return json, errors.New("工作表数量不匹配")
  98. }
  99. showConf, err := This.sheetResolver(excelInfo)
  100. if err != nil {
  101. return json, errors.Wrap(err, "玛雅转盘 工作表解析失败")
  102. }
  103. if json, err = jsoniter.Marshal(showConf); err != nil {
  104. return json, errors.Wrap(err, "玛雅转盘 配置序列化失败")
  105. }
  106. return
  107. }
  108. func (This *actMayaWheel) convertIntoShowConf(repoConfMap map[int64]model.MayaWheelRewardRepoConf, wheelConf model.MayaWheelBaseConf, tokenGoodsInfo map[string]model.TokenGoods) (showConf model.MayaWheelShowConf) {
  109. var rewardArr []model.MayaWheelRewardShowConf
  110. for lvId, lvStageReward := range repoConfMap {
  111. for spinsId, spinsStageReward := range lvStageReward.Stages {
  112. for ssId, ssStageReward := range spinsStageReward.Stages {
  113. multiIdx := fmt.Sprintf("%d_%d_%d", lvId, spinsId, ssId)
  114. tokenGoods, ok := tokenGoodsInfo[multiIdx]
  115. if !ok {
  116. tokenGoods = model.TokenGoods{}
  117. }
  118. rewardArr = append(rewardArr, model.MayaWheelRewardShowConf{
  119. ThreeLayer: model.ThreeLayer{
  120. Id: Activity.buildLayerOrderId(lvId, spinsId, ssId),
  121. LvRange: lvStageReward.LvRange,
  122. SpinsRange: spinsStageReward.SpinsRange,
  123. SsGroup: ssStageReward.SsGroup,
  124. },
  125. Reward: model.MayaWheelReward{
  126. StageConf: This.buildStageShowConf(ssStageReward.Rewards.DiceConf),
  127. ProgressConf: utils.MapValues(ssStageReward.Rewards.ProgressConf, true),
  128. },
  129. TokenGoods: tokenGoods,
  130. })
  131. }
  132. }
  133. }
  134. sort.SliceStable(rewardArr, func(i, j int) bool { return rewardArr[i].Id < rewardArr[j].Id })
  135. return model.MayaWheelShowConf{RewardConf: rewardArr, WheelConf: wheelConf}
  136. }
  137. func (This *actMayaWheel) buildStageShowConf(diceConfMap map[int64]model.MayaWheelDiceConf) []model.MayaWheelStageShowReward {
  138. rewardArr := make([]model.MayaWheelStageShowReward, 0, len(diceConfMap)*12)
  139. for layer, diceConf := range diceConfMap {
  140. for seq, oneReward := range diceConf.List {
  141. rewardArr = append(rewardArr, model.MayaWheelStageShowReward{
  142. Layer: layer,
  143. Seq: seq,
  144. MayaWheelDiceRewardConf: oneReward,
  145. })
  146. }
  147. }
  148. sort.SliceStable(rewardArr, func(i, j int) bool {
  149. if rewardArr[i].Layer == rewardArr[j].Layer {
  150. return rewardArr[i].Seq < rewardArr[j].Seq
  151. }
  152. return rewardArr[i].Layer < rewardArr[j].Layer
  153. })
  154. return rewardArr
  155. }
  156. func (This *actMayaWheel) convertIntoRepoConf(rewardInfo []model.MayaWheelRewardShowConf) map[int64]model.MayaWheelRewardRepoConf {
  157. var (
  158. repoConfMap = map[int64]model.MayaWheelRewardRepoConf{}
  159. unique = uniqid.GetUniqId()
  160. )
  161. defer uniqid.DelMapByUniqId(unique)
  162. for _, oneRowInfo := range rewardInfo {
  163. idxes := uniqid.GetStageIdx(unique, oneRowInfo.LvRange, oneRowInfo.SpinsRange, oneRowInfo.SsGroup)
  164. lvIdx, spinIdx, ssIdx := idxes[0], idxes[1], idxes[2]
  165. if _, Ok := repoConfMap[lvIdx]; !Ok {
  166. repoConfMap[lvIdx] = model.MayaWheelRewardRepoConf{
  167. LvRange: oneRowInfo.LvRange,
  168. Stages: map[int64]model.MayaWheelSpinsStage{},
  169. }
  170. }
  171. if _, Ok := repoConfMap[lvIdx].Stages[spinIdx]; !Ok {
  172. repoConfMap[lvIdx].Stages[spinIdx] = model.MayaWheelSpinsStage{
  173. SpinsRange: oneRowInfo.SpinsRange,
  174. Stages: map[int64]model.MayaWheelSsStage{},
  175. }
  176. }
  177. // 构建阶段奖励二维数组
  178. stageRewardList := func() map[int64]model.MayaWheelDiceConf {
  179. stageRewardMap := map[int64]model.MayaWheelDiceConf{}
  180. for _, reward := range oneRowInfo.Reward.StageConf {
  181. if _, Ok := stageRewardMap[reward.Layer]; !Ok {
  182. stageRewardMap[reward.Layer] = model.MayaWheelDiceConf{
  183. List: map[int64]model.MayaWheelDiceRewardConf{},
  184. }
  185. }
  186. stageRewardMap[reward.Layer].List[reward.Seq] = reward.MayaWheelDiceRewardConf
  187. }
  188. return stageRewardMap
  189. }()
  190. // 构建进度奖励Map
  191. progressReward := func() map[int64]model.MayaWheelProgressConf {
  192. rewardMap := make(map[int64]model.MayaWheelProgressConf, len(oneRowInfo.Reward.ProgressConf))
  193. for idx, reward := range oneRowInfo.Reward.ProgressConf {
  194. reward.Stage = int64(idx + 1)
  195. rewardMap[reward.Stage] = reward
  196. }
  197. return rewardMap
  198. }()
  199. repoConfMap[lvIdx].Stages[spinIdx].Stages[ssIdx] = model.MayaWheelSsStage{
  200. SsGroup: oneRowInfo.SsGroup,
  201. Rewards: model.MayaWheelStageReward{
  202. DiceConf: stageRewardList,
  203. ProgressConf: progressReward,
  204. },
  205. }
  206. }
  207. return repoConfMap
  208. }
  209. func (This *actMayaWheel) convertIntoTokenGoodsRepoConf(rewardInfo []model.MayaWheelRewardShowConf) (types.JSONText, error) {
  210. var (
  211. repoConfMap = map[string]model.TokenGoods{}
  212. unique = uniqid.GetUniqId()
  213. )
  214. defer uniqid.DelMapByUniqId(unique)
  215. for _, oneRowInfo := range rewardInfo {
  216. idxes := uniqid.GetStageIdx(unique, oneRowInfo.LvRange, oneRowInfo.SpinsRange, oneRowInfo.SsGroup)
  217. stageKey := fmt.Sprintf("%d_%d_%d", idxes[0], idxes[1], idxes[2])
  218. repoConfMap[stageKey] = oneRowInfo.TokenGoods
  219. }
  220. return jsoniter.Marshal(repoConfMap)
  221. }
  222. func (This *actMayaWheel) buildDiceCacheMap(diceConf map[int64]model.MayaWheelDiceConf, baseConf model.MayaWheelBaseConf) map[int64]model.MayaWheelDiceConfCache {
  223. confCache := make(map[int64]model.MayaWheelDiceConfCache, len(diceConf))
  224. for i, conf := range diceConf {
  225. confCache[i] = model.MayaWheelDiceConfCache{
  226. TotalCnt: baseConf.MayaWheelTotalCnt,
  227. SpendConfig: baseConf.MayaWheelSpend,
  228. RewardConfig: utils.MapValues(conf.List, true),
  229. }
  230. }
  231. return confCache
  232. }
  233. func (This *actMayaWheel) sheetResolver(excelInfo [][][]string) (model.MayaWheelShowConf, error) {
  234. sheet2Array, sheet3Array, sheet4Array, sheet5Array, sheet6Array := excelInfo[1], excelInfo[2], excelInfo[3], excelInfo[4], excelInfo[5]
  235. // 解析转盘基础配置
  236. showConf, err := This.parseBaseConf(sheet2Array)
  237. // 解析分组ID配置项
  238. stageConfArr, err := Activity.parseThreeLayerConf(sheet3Array)
  239. if err != nil {
  240. return showConf, errors.WithStack(err)
  241. }
  242. // 解析奖励配置项
  243. stageRewardMap, err := This.parseRewardSheet(sheet4Array)
  244. if err != nil {
  245. return showConf, errors.WithStack(err)
  246. }
  247. // 解析进度奖励配置项
  248. progressRewardMap, err := This.parseProgressRewardSheet(sheet5Array)
  249. if err != nil {
  250. return showConf, errors.WithStack(err)
  251. }
  252. // 解析进度奖励配置项
  253. tokenGoodsMap, err := Activity.ParseTokenGoodsSheet(sheet6Array, config2.ActMayaWheel)
  254. if err != nil {
  255. return showConf, errors.WithStack(err)
  256. }
  257. if err = This.packageShowConf(&showConf, stageConfArr, stageRewardMap, progressRewardMap, tokenGoodsMap); err != nil {
  258. return showConf, errors.WithStack(err)
  259. }
  260. return showConf, nil
  261. }
  262. func (This *actMayaWheel) parseBaseConf(sheet [][]string) (showConf model.MayaWheelShowConf, err error) {
  263. spends := make([]int64, 0, len(sheet))
  264. for i := 1; i < len(sheet); i++ {
  265. var ignore string
  266. var spendNum int64
  267. if err = utils.DestructAssign(sheet[i], &ignore, &spendNum); err != nil {
  268. return showConf, errors.WithStack(err)
  269. }
  270. spends = append(spends, spendNum)
  271. }
  272. if len(spends) != 12 {
  273. return showConf, errors.WithMessage(err, "转盘转动次数固定为12")
  274. }
  275. showConf.WheelConf = model.MayaWheelBaseConf{
  276. MayaWheelTotalCnt: int64(len(spends)),
  277. MayaWheelSpend: spends,
  278. }
  279. return showConf, err
  280. }
  281. func (This *actMayaWheel) parseRewardSheet(rewardsSheet [][]string) (map[int64][]model.MayaWheelStageShowReward, error) {
  282. var err error
  283. stageRewardArrMap := map[int64][]model.MayaWheelStageShowReward{}
  284. for rowIdx := 1; rowIdx < len(rewardsSheet); rowIdx++ {
  285. var (
  286. id int64
  287. one model.MayaWheelStageShowReward
  288. rewards = make([]model.ExcelPrize, 1)
  289. )
  290. // 解析行配置
  291. if err = utils.DestructAssign(rewardsSheet[rowIdx], &id, &one.Layer, &one.Seq, &one.Weight, &one.LastCnt, &rewards); err != nil {
  292. return nil, errors.WithStack(err)
  293. }
  294. // 转换奖励格式
  295. if one.Prize, err = Props.MultiParseActPrize(rewards); err != nil {
  296. return nil, errors.WithStack(err)
  297. }
  298. stageRewardArrMap[id] = append(stageRewardArrMap[id], one)
  299. }
  300. return stageRewardArrMap, nil
  301. }
  302. func (This *actMayaWheel) parseProgressRewardSheet(sheet [][]string) (map[int64][]model.MayaWheelProgressConf, error) {
  303. var err error
  304. progressRewardArrMap := make(map[int64][]model.MayaWheelProgressConf, len(sheet))
  305. for rowIdx := 1; rowIdx < len(sheet); rowIdx++ {
  306. var (
  307. id int64
  308. one model.MayaWheelProgressConf
  309. rewards = make([]model.ExcelPrize, 1)
  310. )
  311. // 解析行配置
  312. if err = utils.DestructAssign(sheet[rowIdx], &id, &one.Stage, &one.Target, &rewards); err != nil {
  313. return nil, errors.WithStack(err)
  314. }
  315. // 转换奖励格式
  316. if one.Prize, err = Props.MultiParseActPrize(rewards); err != nil {
  317. return nil, errors.WithStack(err)
  318. }
  319. progressRewardArrMap[id] = append(progressRewardArrMap[id], one)
  320. }
  321. return progressRewardArrMap, nil
  322. }
  323. func (This *actMayaWheel) packageShowConf(showConf *model.MayaWheelShowConf, layers []model.ThreeLayer, stageRewardMap map[int64][]model.MayaWheelStageShowReward, progressRewardMap map[int64][]model.MayaWheelProgressConf, TokenGoodsMap map[int64]model.TokenGoods) error {
  324. rewardArr := make([]model.MayaWheelRewardShowConf, 0, len(layers))
  325. for _, layer := range layers {
  326. stageReward, Ok := stageRewardMap[layer.Id]
  327. if !Ok {
  328. return errors.New("未配置阶段奖励项")
  329. }
  330. progressReward, Ok := progressRewardMap[layer.Id]
  331. if !Ok {
  332. return errors.New("未配置进度奖励项")
  333. }
  334. tokenGoods, Ok := TokenGoodsMap[layer.Id]
  335. if !Ok {
  336. return errors.New("未配置代币商品奖励项")
  337. }
  338. rewardArr = append(rewardArr, model.MayaWheelRewardShowConf{
  339. ThreeLayer: layer,
  340. Reward: model.MayaWheelReward{
  341. StageConf: stageReward,
  342. ProgressConf: progressReward,
  343. },
  344. TokenGoods: tokenGoods,
  345. })
  346. }
  347. showConf.RewardConf = rewardArr
  348. return nil
  349. }