act_fox_hammer.go 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. package service
  2. import (
  3. "fmt"
  4. "sort"
  5. "crazy-fox-backend-api/config"
  6. "crazy-fox-backend-api/model"
  7. "crazy-fox-backend-api/utils"
  8. "github.com/jmoiron/sqlx/types"
  9. jsoniter "github.com/json-iterator/go"
  10. "github.com/pkg/errors"
  11. )
  12. type actFoxHammer struct{}
  13. // 展示数据处理
  14. func (This *actFoxHammer) handleActShow(confInfo *model.ActConfInfo) (json types.JSONText, err error) {
  15. var repoConf []model.FoxHammerRepoConf
  16. if err := jsoniter.Unmarshal(confInfo.Reward, &repoConf); err != nil {
  17. return nil, errors.Wrap(err, "狐狸之锤 奖励Json解析失败")
  18. }
  19. // 数据转换
  20. showConf := This.convertIntoShowConf(repoConf)
  21. if json, err = jsoniter.Marshal(showConf); err != nil {
  22. return json, errors.Wrap(err, "狐狸之锤 奖励序列化失败")
  23. }
  24. return
  25. }
  26. // 保存数据处理
  27. func (This *actFoxHammer) handleActSave(confInfo *model.ActConfInfo) (err error) {
  28. var showConfArr []model.FoxHammerShowConf
  29. if err = jsoniter.Unmarshal(confInfo.ActShowConf, &showConfArr); err != nil {
  30. return errors.Wrap(err, "狐狸之锤 奖励Json解析失败")
  31. }
  32. repoConfArr := This.convertIntoRepoConf(showConfArr)
  33. if confInfo.Reward, err = jsoniter.Marshal(repoConfArr); err != nil {
  34. return errors.Wrap(err, "狐狸之锤 奖励数据序列化失败")
  35. }
  36. return
  37. }
  38. // 分层数据处理
  39. func (This *actFoxHammer) handleActRewardSection(confInfo *model.ActConfInfo, maps ...map[string]any) error {
  40. var repoConfArr []model.FoxHammerRepoConf
  41. if err := jsoniter.Unmarshal(confInfo.Reward, &repoConfArr); err != nil {
  42. return errors.Wrap(err, "狐狸之锤 奖励解析失败")
  43. }
  44. conditionMap, rewardMap := maps[0], maps[1]
  45. for idx1, item1 := range repoConfArr {
  46. for idx2, item2 := range item1.Data {
  47. stageKey := fmt.Sprintf("%d_%d", idx1, idx2)
  48. conditionMap[stageKey] = Activity.buildStageConditionOld(item1.StartEnd, item2.SsGroup)
  49. rewardMap[stageKey] = item2.Data
  50. }
  51. }
  52. return nil
  53. }
  54. // 导入数据处理
  55. func (This *actFoxHammer) handleActImport(_ *model.ActDetailInfo, excelInfo [][][]string) (json types.JSONText, err error) {
  56. if len(excelInfo) < 3 {
  57. return json, errors.New("工作表数量不匹配")
  58. }
  59. var showConfArr []model.FoxHammerShowConf
  60. if showConfArr, err = This.sheetResolver(excelInfo); err != nil {
  61. return json, errors.Wrap(err, "狐狸之锤 工作表解析失败")
  62. }
  63. if json, err = jsoniter.Marshal(showConfArr); err != nil {
  64. return json, errors.Wrap(err, "狐狸之锤 配置序列化失败")
  65. }
  66. return
  67. }
  68. func (This *actFoxHammer) convertIntoShowConf(repoConfArr []model.FoxHammerRepoConf) (showConfArr []model.FoxHammerShowConf) {
  69. for lvId, lvStage := range repoConfArr {
  70. for ssId, ssGroupStage := range lvStage.Data {
  71. showConfArr = append(showConfArr, model.FoxHammerShowConf{
  72. TwoLayerLvSsGroup: model.TwoLayerLvSsGroup{
  73. Id: Activity.buildLayerOrderId(int64(lvId), int64(ssId)),
  74. LvRange: model.LvRange{LvStart: lvStage.Start, LvEnd: lvStage.End},
  75. SsGroup: ssGroupStage.SsGroup,
  76. },
  77. Stages: This.formatStageConf(ssGroupStage.Data),
  78. })
  79. }
  80. }
  81. return
  82. }
  83. func (This *actFoxHammer) convertIntoRepoConf(showConfArr []model.FoxHammerShowConf) (repoConfArr []model.FoxHammerRepoConf) {
  84. ssStageArrMap := This.buildSsStageArrMap(showConfArr)
  85. repoConfArr = make([]model.FoxHammerRepoConf, 0, len(showConfArr))
  86. for _, stages := range ssStageArrMap {
  87. repoConfArr = append(repoConfArr, model.FoxHammerRepoConf{
  88. StartEnd: model.StartEnd{Start: stages.LvRange.LvStart, End: stages.LvRange.LvEnd},
  89. Data: stages.Data,
  90. })
  91. }
  92. return
  93. }
  94. func (This *actFoxHammer) sheetResolver(excelInfo [][][]string) (showConf []model.FoxHammerShowConf, err error) {
  95. sheet2Array, sheet3Array, sheet4Array := excelInfo[1], excelInfo[2], excelInfo[3]
  96. // 解析分组ID配置项
  97. var stageConf []model.TwoLayerLvSsGroup
  98. if stageConf, err = Activity.parseTwoLayerLvSsGroupConf(sheet2Array); err != nil {
  99. return showConf, errors.WithStack(err)
  100. }
  101. // 解析阶段配置项
  102. var stageArrMap map[int64][]model.FoxHammerTmpStageReward
  103. if stageArrMap, err = This.parseStageSheet(sheet3Array); err != nil {
  104. return showConf, errors.WithStack(err)
  105. }
  106. // 解析概率配置项
  107. var probArrMap map[int64][]model.FoxHammerProb
  108. if probArrMap, err = This.parseProbSheet(sheet4Array); err != nil {
  109. return showConf, errors.WithStack(err)
  110. }
  111. if showConf, err = This.packageShowConf(stageConf, stageArrMap, probArrMap); err != nil {
  112. return showConf, errors.WithStack(err)
  113. }
  114. return
  115. }
  116. func (This *actFoxHammer) parseStageSheet(sheet [][]string) (stageArrMap map[int64][]model.FoxHammerTmpStageReward, err error) {
  117. stageArrMap = map[int64][]model.FoxHammerTmpStageReward{}
  118. for rowIdx := 1; rowIdx < len(sheet); rowIdx++ {
  119. var (
  120. id int64
  121. ignore string
  122. one model.FoxHammerTmpStageReward
  123. )
  124. // 解析行配置
  125. if err = utils.DestructAssign(sheet[rowIdx], &id, &ignore, &one.Ton, &one.Price, &one.ProbId); err != nil {
  126. return nil, errors.WithStack(err)
  127. }
  128. if one.Sku = config.PriceSkuMap[one.Price]; utils.IsEmpty(one.Sku) {
  129. return nil, errors.New(fmt.Sprintf("第%d行,购买价格:%.2f 无对应sku", rowIdx, one.Price))
  130. }
  131. stageArrMap[id] = append(stageArrMap[id], one)
  132. }
  133. return
  134. }
  135. func (This *actFoxHammer) parseProbSheet(sheet [][]string) (probArrMap map[int64][]model.FoxHammerProb, err error) {
  136. probArrMap = map[int64][]model.FoxHammerProb{}
  137. for rowIdx := 1; rowIdx < len(sheet); rowIdx++ {
  138. var (
  139. id int64
  140. ignore string
  141. one model.FoxHammerProb
  142. )
  143. // 解析行配置
  144. if err = utils.DestructAssign(sheet[rowIdx], &id, &ignore, &one.Spins, &one.Weight); err != nil {
  145. return nil, errors.WithStack(err)
  146. }
  147. probArrMap[id] = append(probArrMap[id], one)
  148. }
  149. return
  150. }
  151. func (This *actFoxHammer) packageShowConf(layers []model.TwoLayerLvSsGroup, stageArrMap map[int64][]model.FoxHammerTmpStageReward, probArrMap map[int64][]model.FoxHammerProb) (showConfArr []model.FoxHammerShowConf, err error) {
  152. var Ok bool
  153. var stageArr []model.FoxHammerTmpStageReward
  154. var stageReward []model.FoxHammerStageShowReward
  155. showConfArr = make([]model.FoxHammerShowConf, 0, len(layers))
  156. for _, layer := range layers {
  157. if stageArr, Ok = stageArrMap[layer.Id]; !Ok {
  158. return nil, errors.New(fmt.Sprintf("阶段唯一ID: %d 未配置", layer.Id))
  159. }
  160. if stageReward, err = This.buildStageReward(stageArr, probArrMap); err != nil {
  161. return nil, errors.WithStack(err)
  162. }
  163. showConfArr = append(showConfArr, model.FoxHammerShowConf{
  164. TwoLayerLvSsGroup: layer,
  165. Stages: stageReward,
  166. })
  167. }
  168. return
  169. }
  170. func (This *actFoxHammer) formatStageConf(stageRewardArr []model.FoxHammerStageReward) []model.FoxHammerStageShowReward {
  171. stageShowArr := make([]model.FoxHammerStageShowReward, 0, len(stageRewardArr))
  172. for _, datum := range stageRewardArr {
  173. probArr := make([]model.FoxHammerProb, 0, len(datum.Prizes))
  174. for _, prize := range datum.Prizes {
  175. probArr = append(probArr, model.FoxHammerProb{
  176. Weight: prize.Weight,
  177. Spins: prize.Reward.Num,
  178. })
  179. }
  180. stageShowArr = append(stageShowArr, model.FoxHammerStageShowReward{
  181. FoxHammerBaseConf: datum.FoxHammerBaseConf,
  182. Prob: probArr,
  183. })
  184. }
  185. return stageShowArr
  186. }
  187. func (This *actFoxHammer) buildSsStageConf(stages []model.FoxHammerStageShowReward) []model.FoxHammerStageReward {
  188. ssStageConf := make([]model.FoxHammerStageReward, 0, len(stages))
  189. for idx, stage := range stages {
  190. var prizes []model.FoxHammerPrize
  191. stage.Gid = 1846
  192. stage.Stage = int64(idx + 1)
  193. stage.IsFree = utils.Ternary(utils.IsEmpty(stage.Price), int64(1), 0)
  194. stage.SpinsMin, stage.SpinsMax, prizes = This.findSpinsExtremum(stage.Prob)
  195. ssStageConf = append(ssStageConf, model.FoxHammerStageReward{
  196. FoxHammerBaseConf: stage.FoxHammerBaseConf,
  197. Prizes: prizes,
  198. })
  199. }
  200. return ssStageConf
  201. }
  202. func (This *actFoxHammer) buildSsStageArrMap(showConfArr []model.FoxHammerShowConf) []model.FoxHammerTmpSsConf {
  203. ssStageArrMap := make(map[model.LvRange][]model.FoxHammerSSGroupStage, 0)
  204. for i := 0; i < len(showConfArr); i++ {
  205. oneRowInfo := showConfArr[i]
  206. ssStageArrMap[oneRowInfo.LvRange] = append(ssStageArrMap[oneRowInfo.LvRange], model.FoxHammerSSGroupStage{
  207. SsGroup: oneRowInfo.SsGroup,
  208. Data: This.buildSsStageConf(oneRowInfo.Stages),
  209. })
  210. }
  211. tmpSsConf := make([]model.FoxHammerTmpSsConf, 0, len(ssStageArrMap))
  212. for idx, stages := range ssStageArrMap {
  213. tmpSsConf = append(tmpSsConf, model.FoxHammerTmpSsConf{
  214. LvRange: idx,
  215. Data: stages,
  216. })
  217. }
  218. sort.SliceStable(tmpSsConf, func(i, j int) bool {
  219. if tmpSsConf[i].LvRange.LvStart != tmpSsConf[j].LvRange.LvStart {
  220. return tmpSsConf[i].LvRange.LvStart < tmpSsConf[j].LvRange.LvStart
  221. }
  222. return tmpSsConf[i].LvRange.LvEnd < tmpSsConf[j].LvRange.LvEnd
  223. })
  224. return tmpSsConf
  225. }
  226. func (This *actFoxHammer) findSpinsExtremum(probArr []model.FoxHammerProb) (min int64, max int64, prizes []model.FoxHammerPrize) {
  227. min = probArr[0].Spins
  228. prizes = make([]model.FoxHammerPrize, 0, len(probArr))
  229. for _, prob := range probArr {
  230. prizes = append(prizes, model.FoxHammerPrize{
  231. Weight: prob.Weight,
  232. Reward: model.ActPrize{Type: config.PropSpin, Num: prob.Spins, Rtype: 1, Skin: 0},
  233. })
  234. min = utils.Min(min, prob.Spins)
  235. max = utils.Max(max, prob.Spins)
  236. }
  237. return
  238. }
  239. func (This *actFoxHammer) buildStageReward(stageArr []model.FoxHammerTmpStageReward, probArrMap map[int64][]model.FoxHammerProb) ([]model.FoxHammerStageShowReward, error) {
  240. var Ok bool
  241. var probArr []model.FoxHammerProb
  242. stagesReward := make([]model.FoxHammerStageShowReward, 0, len(stageArr))
  243. for _, reward := range stageArr {
  244. if probArr, Ok = probArrMap[reward.ProbId]; !Ok {
  245. return nil, errors.New(fmt.Sprintf("概率唯一ID: %d 未配置", reward.ProbId))
  246. }
  247. reward.Prob = probArr
  248. stagesReward = append(stagesReward, reward.FoxHammerStageShowReward)
  249. }
  250. return stagesReward, nil
  251. }