act_crazy_build.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. package service
  2. import (
  3. "fmt"
  4. "sort"
  5. "crazy-fox-backend-api/model"
  6. "crazy-fox-backend-api/utils"
  7. "crazy-fox-backend-api/utils/uniqid"
  8. "github.com/jmoiron/sqlx/types"
  9. jsoniter "github.com/json-iterator/go"
  10. "github.com/pkg/errors"
  11. )
  12. type actCrazyBuild struct{}
  13. // 展示数据处理
  14. func (This *actCrazyBuild) handleActShow(confInfo *model.ActConfInfo) (json types.JSONText, err error) {
  15. var rewardConf map[int64]model.CrazyBuildRewardConf
  16. if err = jsoniter.Unmarshal(confInfo.Reward, &rewardConf); err != nil {
  17. return json, errors.Wrap(err, "疯狂建造 奖励Json解析失败")
  18. }
  19. // 基础配置
  20. var baseConf model.CrazyBuildBasicConf
  21. if err = jsoniter.Unmarshal(confInfo.ExtraData, &baseConf); err != nil {
  22. return nil, errors.Wrap(err, "疯狂建造 基础配置Json解析失败")
  23. }
  24. // 数据转换
  25. showConf := This.convertIntoShowConf(rewardConf, baseConf)
  26. if json, err = jsoniter.Marshal(showConf); err != nil {
  27. return json, errors.Wrap(err, "疯狂建造 奖励序列化失败")
  28. }
  29. return
  30. }
  31. // 保存数据处理
  32. func (This *actCrazyBuild) handleActSave(confInfo *model.ActConfInfo) (err error) {
  33. var showConf model.CrazyBuildShowConf
  34. if err = jsoniter.Unmarshal(confInfo.ActShowConf, &showConf); err != nil {
  35. return errors.Wrap(err, "疯狂建造 奖励Json解析失败")
  36. }
  37. // 数据转换
  38. var rewardMap map[int64]model.CrazyBuildRewardConf
  39. if rewardMap, err = This.convertIntoRewardConf(showConf.RewardInfo); err != nil {
  40. return errors.Wrap(err, "疯狂建造 奖励数据转换失败")
  41. }
  42. if confInfo.Reward, err = jsoniter.Marshal(rewardMap); err != nil {
  43. return errors.Wrap(err, "疯狂建造 奖励数据序列化失败")
  44. }
  45. // 收集配置
  46. if confInfo.ExtraData, err = jsoniter.Marshal(showConf.BasicConf); err != nil {
  47. return errors.Wrap(err, "疯狂建造 收集配置数据序列化失败")
  48. }
  49. return
  50. }
  51. // 分层数据处理
  52. func (This *actCrazyBuild) handleActRewardSection(confInfo *model.ActConfInfo, maps ...map[string]any) error {
  53. var rewardRepoConfMap map[int64]model.CrazyBuildRewardConf
  54. if err := jsoniter.Unmarshal(confInfo.Reward, &rewardRepoConfMap); err != nil {
  55. return errors.Wrap(err, "疯狂建造奖励解析失败")
  56. }
  57. conditionMap, rewardMap := maps[0], maps[1]
  58. for idx1, item1 := range rewardRepoConfMap {
  59. stageKey := fmt.Sprintf("%d", idx1)
  60. conditionMap[stageKey] = Activity.buildStageCondition(item1.SsGroup)
  61. rewardMap[stageKey] = item1.Reward
  62. }
  63. return nil
  64. }
  65. // 导入数据处理
  66. func (This *actCrazyBuild) handleActImport(_ *model.ActDetailInfo, excelInfo [][][]string) (json types.JSONText, err error) {
  67. if len(excelInfo) < 3 {
  68. return json, errors.New("工作表数量不匹配")
  69. }
  70. var showConf model.CrazyBuildShowConf
  71. if showConf, err = This.sheetResolver(excelInfo); err != nil {
  72. return json, errors.Wrap(err, "疯狂建造 工作表解析失败")
  73. }
  74. if json, err = jsoniter.Marshal(showConf); err != nil {
  75. return json, errors.Wrap(err, "疯狂建造 配置序列化失败")
  76. }
  77. return
  78. }
  79. func (This *actCrazyBuild) convertIntoShowConf(rewardConf map[int64]model.CrazyBuildRewardConf, baseConf model.CrazyBuildBasicConf) (showConf model.CrazyBuildShowConf) {
  80. for ssGroupId, ssGroupStage := range rewardConf {
  81. showRewards := make([]model.CrazyBuildShowReward, 0, len(ssGroupStage.Reward.BasicReward))
  82. for lv, oneReward := range ssGroupStage.Reward.BasicReward {
  83. showRewards = append(showRewards, model.CrazyBuildShowReward{
  84. UserLevel: lv,
  85. BasicPrize: oneReward.Prize,
  86. FinalPrize: ssGroupStage.Reward.FinalReward[lv].Prize,
  87. })
  88. }
  89. sort.SliceStable(showRewards, func(i, j int) bool { return showRewards[i].UserLevel < showRewards[j].UserLevel })
  90. showConf.RewardInfo = append(showConf.RewardInfo, model.CrazyBuildRewardShowConf{
  91. OneLayerSsGroup: model.OneLayerSsGroup{
  92. Id: Activity.buildLayerOrderId(ssGroupId),
  93. SsGroup: ssGroupStage.SsGroup,
  94. },
  95. Reward: This.makeShowRangeRewardArr(showRewards),
  96. })
  97. }
  98. sort.SliceStable(showConf.RewardInfo, func(i, j int) bool { return showConf.RewardInfo[i].Id < showConf.RewardInfo[j].Id })
  99. showConf.BasicConf = baseConf
  100. return
  101. }
  102. func (This *actCrazyBuild) convertIntoRewardConf(rewardShowConfArr []model.CrazyBuildRewardShowConf) (map[int64]model.CrazyBuildRewardConf, error) {
  103. var (
  104. rewardRepoConfMap = map[int64]model.CrazyBuildRewardConf{}
  105. unique = uniqid.GetUniqId()
  106. )
  107. defer uniqid.DelMapByUniqId(unique)
  108. for i := 0; i < len(rewardShowConfArr); i++ {
  109. oneRowInfo := rewardShowConfArr[i]
  110. oneRowRewardLen := len(oneRowInfo.Reward)
  111. ssIdx := uniqid.GetStageIdx(unique, oneRowInfo.SsGroup)[0]
  112. rewardStage := model.CrazyBuildReward{
  113. BasicReward: map[int64]model.CrazyBuildStageReward{},
  114. FinalReward: map[int64]model.CrazyBuildStageReward{},
  115. }
  116. // 构建奖励Map
  117. rewardStage.BasicReward = make(map[int64]model.CrazyBuildStageReward, oneRowInfo.Reward[oneRowRewardLen-1].LvEnd)
  118. rewardStage.FinalReward = make(map[int64]model.CrazyBuildStageReward, oneRowInfo.Reward[oneRowRewardLen-1].LvEnd)
  119. for j := 0; j < oneRowRewardLen; j++ {
  120. oneReward := oneRowInfo.Reward[j]
  121. for lv := oneReward.LvStart; lv <= oneReward.LvEnd; lv++ {
  122. rewardStage.BasicReward[lv] = model.CrazyBuildStageReward{
  123. UserLevel: lv,
  124. Prize: oneReward.BasicPrize,
  125. }
  126. rewardStage.FinalReward[lv] = model.CrazyBuildStageReward{
  127. UserLevel: lv,
  128. Prize: oneReward.FinalPrize,
  129. }
  130. }
  131. }
  132. // 数数分组
  133. if _, Ok := rewardRepoConfMap[ssIdx]; !Ok {
  134. rewardRepoConfMap[ssIdx] = model.CrazyBuildRewardConf{
  135. SsGroup: oneRowInfo.SsGroup,
  136. Reward: rewardStage,
  137. }
  138. }
  139. }
  140. return rewardRepoConfMap, nil
  141. }
  142. func (This *actCrazyBuild) sheetResolver(excelInfo [][][]string) (showConf model.CrazyBuildShowConf, err error) {
  143. sheet1Array, sheet2Array, sheet3Array := excelInfo[0], excelInfo[1], excelInfo[2]
  144. // 解析基础配置
  145. showConf, err = This.parseBaseSheet(sheet1Array)
  146. // 解析分组ID配置项
  147. var stageConf []model.OneLayerSsGroup
  148. if stageConf, err = Activity.parseOneLayerSsGroupConf(sheet2Array); err != nil {
  149. return showConf, errors.WithStack(err)
  150. }
  151. // 解析奖励配置项
  152. var rewardMap map[int64][]model.CrazyBuildShowRangeReward
  153. if rewardMap, err = This.parseRewardSheet(sheet3Array); err != nil {
  154. return showConf, errors.WithStack(err)
  155. }
  156. if err = This.packageShowConf(&showConf, stageConf, rewardMap); err != nil {
  157. return showConf, errors.WithStack(err)
  158. }
  159. return
  160. }
  161. func (This *actCrazyBuild) parseRewardSheet(rewardsSheet [][]string) (map[int64][]model.CrazyBuildShowRangeReward, error) {
  162. var err error
  163. stageRewardMap := map[int64][]model.CrazyBuildShowRangeReward{}
  164. for rowIdx := 1; rowIdx < len(rewardsSheet); rowIdx++ {
  165. var (
  166. id int64
  167. one model.CrazyBuildShowRangeReward
  168. basicRewardArr = make([]model.ExcelPrize, 3)
  169. finalRewardArr = make([]model.ExcelPrize, 3)
  170. )
  171. // 解析行配置
  172. if err = utils.DestructAssign(rewardsSheet[rowIdx], &id, &one.LvRange, &basicRewardArr, &finalRewardArr); err != nil {
  173. return nil, errors.WithStack(err)
  174. }
  175. // 转换奖励格式
  176. if one.BasicPrize, err = Props.MultiParseActPrize(basicRewardArr); err != nil {
  177. return nil, errors.WithStack(err)
  178. }
  179. // 转换奖励格式
  180. if one.FinalPrize, err = Props.MultiParseActPrize(finalRewardArr); err != nil {
  181. return nil, errors.WithStack(err)
  182. }
  183. stageRewardMap[id] = append(stageRewardMap[id], one)
  184. }
  185. return stageRewardMap, nil
  186. }
  187. func (This *actCrazyBuild) packageShowConf(showConf *model.CrazyBuildShowConf, layers []model.OneLayerSsGroup, rewardMap map[int64][]model.CrazyBuildShowRangeReward) (err error) {
  188. rewardConfArr := make([]model.CrazyBuildRewardShowConf, 0, len(layers))
  189. for _, layer := range layers {
  190. reward, Ok := rewardMap[layer.Id]
  191. if !Ok {
  192. return errors.New("未配置奖励项")
  193. }
  194. rewardConfArr = append(rewardConfArr, model.CrazyBuildRewardShowConf{
  195. OneLayerSsGroup: layer,
  196. Reward: reward,
  197. })
  198. }
  199. showConf.RewardInfo = rewardConfArr
  200. return
  201. }
  202. func (This *actCrazyBuild) makeShowRangeRewardArr(rewards []model.CrazyBuildShowReward) []model.CrazyBuildShowRangeReward {
  203. lens := len(rewards)
  204. if lens == 0 {
  205. return []model.CrazyBuildShowRangeReward{}
  206. }
  207. showRangeRewards := make([]model.CrazyBuildShowRangeReward, 0, lens/2)
  208. // 初始化
  209. lvRange := model.LvRange{
  210. LvStart: rewards[0].UserLevel,
  211. LvEnd: rewards[0].UserLevel,
  212. }
  213. for i := 1; i < lens; i++ {
  214. if Props.PropsStrictEqual(rewards[i].FinalPrize, rewards[i-1].FinalPrize) && Props.PropsStrictEqual(rewards[i].BasicPrize, rewards[i-1].BasicPrize) {
  215. lvRange.LvEnd = rewards[i].UserLevel
  216. } else {
  217. showRangeRewards = append(showRangeRewards, model.CrazyBuildShowRangeReward{
  218. LvRange: lvRange,
  219. BasicPrize: rewards[i-1].BasicPrize,
  220. FinalPrize: rewards[i-1].FinalPrize,
  221. })
  222. lvRange = model.LvRange{
  223. LvStart: rewards[i].UserLevel,
  224. LvEnd: rewards[i].UserLevel,
  225. }
  226. }
  227. }
  228. showRangeRewards = append(showRangeRewards, model.CrazyBuildShowRangeReward{
  229. LvRange: lvRange,
  230. BasicPrize: rewards[lens-1].BasicPrize,
  231. FinalPrize: rewards[lens-1].FinalPrize,
  232. })
  233. return showRangeRewards
  234. }
  235. func (This *actCrazyBuild) parseBaseSheet(sheet [][]string) (showConf model.CrazyBuildShowConf, err error) {
  236. for i := 0; i < len(sheet); i++ {
  237. if len(sheet[i]) == 0 || sheet[i][0] != "活动层数" {
  238. continue
  239. }
  240. var ignore string
  241. if err = utils.DestructAssign(sheet[i], &ignore, &showConf.BasicConf.Layer); err != nil {
  242. return showConf, errors.WithStack(err)
  243. }
  244. }
  245. return
  246. }