act_super_collect.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. package service
  2. import (
  3. "fmt"
  4. "sort"
  5. "strconv"
  6. "strings"
  7. "crazy-fox-backend-api/config"
  8. "crazy-fox-backend-api/model"
  9. "crazy-fox-backend-api/utils"
  10. "crazy-fox-backend-api/utils/uniqid"
  11. "github.com/jmoiron/sqlx/types"
  12. jsoniter "github.com/json-iterator/go"
  13. "github.com/pkg/errors"
  14. )
  15. type actSuperCollect struct{}
  16. func (This *actSuperCollect) handleActShow(actInfo *model.ActConfInfo) (types.JSONText, error) {
  17. //TODO implement me
  18. var (
  19. rewardRepoConfMap map[int64]model.SuperCollectRepoConf
  20. )
  21. if err := jsoniter.Unmarshal(actInfo.Reward, &rewardRepoConfMap); err != nil {
  22. return nil, errors.Wrap(err, actInfo.Type+"的奖励Json解析失败")
  23. }
  24. // dept 深层遍历map 转换为切片
  25. var showConf model.SuperCollectShowConf
  26. for lvId, rewardRepoConf := range rewardRepoConfMap {
  27. for spinsId, spinsStage := range rewardRepoConf.Stages {
  28. for ssGroupId, ssGroupStage := range spinsStage.Stages {
  29. showConf.RewardInfo = append(showConf.RewardInfo, model.SuperCollectRewardShowConf{
  30. Id: Activity.buildLayerOrderId(lvId, spinsId, ssGroupId),
  31. LvRange: rewardRepoConf.LvRange,
  32. SpinsRange: spinsStage.SpinsRange,
  33. SsGroup: ssGroupStage.SsGroup,
  34. SlotWeightGroup: ssGroupStage.SlotWeightGroup,
  35. Reward: utils.MapValues(ssGroupStage.List, true),
  36. })
  37. }
  38. }
  39. }
  40. sort.SliceStable(showConf.RewardInfo, func(i, j int) bool { return showConf.RewardInfo[i].Id < showConf.RewardInfo[j].Id })
  41. if err := jsoniter.Unmarshal(actInfo.ExtraData, &showConf.ExtraData); err != nil {
  42. return nil, errors.Wrap(err, actInfo.Type+"的奖励Json解析失败")
  43. }
  44. if err := jsoniter.Unmarshal(actInfo.RewardConf, &showConf.CollectConf); err != nil {
  45. return nil, errors.Wrap(err, actInfo.Type+"的奖励Json解析失败")
  46. }
  47. return jsoniter.Marshal(showConf)
  48. }
  49. func (This *actSuperCollect) handleActSave(actInfo *model.ActConfInfo) error {
  50. //TODO implement me
  51. var (
  52. actShowConf model.SuperCollectShowConf
  53. err error
  54. )
  55. if err = jsoniter.Unmarshal(actInfo.ActShowConf, &actShowConf); err != nil {
  56. return errors.Wrap(err, "保存失败!")
  57. }
  58. if actInfo.ExtraData, err = jsoniter.Marshal(actShowConf.ExtraData); err != nil {
  59. return errors.Wrap(err, "保存失败!")
  60. }
  61. if actInfo.RewardConf, err = jsoniter.Marshal(actShowConf.CollectConf); err != nil {
  62. return errors.Wrap(err, "保存失败!")
  63. }
  64. actInfo.Reward, err = This.formatSaveData(actShowConf)
  65. return err
  66. }
  67. func (This *actSuperCollect) handleActRewardSection(actInfo *model.ActConfInfo, maps ...map[string]any) error {
  68. //TODO implement me
  69. var (
  70. rewardRepoConf map[int64]model.SuperCollectRepoConf
  71. err error
  72. stageKey string
  73. )
  74. if err = jsoniter.Unmarshal(actInfo.Reward, &rewardRepoConf); err != nil {
  75. return errors.Wrap(err, "保存失败!")
  76. }
  77. conditionMap, rewardMap := maps[0], maps[1]
  78. for lvIdx, lvStage := range rewardRepoConf {
  79. for spinsIdx, spinsStage := range lvStage.Stages {
  80. for ssIdx, ssStage := range spinsStage.Stages {
  81. stageKey = fmt.Sprintf("%v_%v_%v", lvIdx, spinsIdx, ssIdx)
  82. conditionMap[stageKey] = Activity.buildStageCondition(lvStage.LvRange, spinsStage.SpinsRange, ssStage.SsGroup)
  83. rewardMap[stageKey] = ssStage.List
  84. }
  85. }
  86. }
  87. return nil
  88. }
  89. func (This *actSuperCollect) formatSaveData(actShowConf model.SuperCollectShowConf) (types.JSONText, error) {
  90. var (
  91. lvIdx int64
  92. spinsIdx int64
  93. ssIdx int64
  94. unique = uniqid.GetUniqId()
  95. repoConfMap = map[int64]model.SuperCollectRepoConf{}
  96. rewardList map[int64]model.SuperCollectStageReward
  97. )
  98. defer uniqid.DelMapByUniqId(unique)
  99. for _, oneRowInfo := range actShowConf.RewardInfo {
  100. idxes := uniqid.GetStageIdx(unique, oneRowInfo.LvRange, oneRowInfo.SpinsRange, oneRowInfo.SsGroup)
  101. lvIdx, spinsIdx, ssIdx = idxes[0], idxes[1], idxes[2]
  102. rewardList = map[int64]model.SuperCollectStageReward{}
  103. for stageIdx, rewardRow := range oneRowInfo.Reward {
  104. rewardList[int64(stageIdx+1)] = rewardRow
  105. }
  106. if _, Ok := repoConfMap[lvIdx]; !Ok {
  107. repoConfMap[lvIdx] = model.SuperCollectRepoConf{
  108. oneRowInfo.LvRange, map[int64]model.SuperCollectSpinsStage{},
  109. }
  110. }
  111. if _, Ok := repoConfMap[lvIdx].Stages[spinsIdx]; !Ok {
  112. repoConfMap[lvIdx].Stages[spinsIdx] = model.SuperCollectSpinsStage{
  113. oneRowInfo.SpinsRange, map[int64]model.SuperCollectSSGroupStage{},
  114. }
  115. }
  116. if _, Ok := repoConfMap[lvIdx].Stages[spinsIdx].Stages[ssIdx]; !Ok {
  117. repoConfMap[lvIdx].Stages[spinsIdx].Stages[ssIdx] = model.SuperCollectSSGroupStage{
  118. oneRowInfo.SsGroup, oneRowInfo.SlotWeightGroup, rewardList,
  119. }
  120. }
  121. }
  122. return jsoniter.Marshal(repoConfMap)
  123. }
  124. func (This *actSuperCollect) handleActImport(_ *model.ActDetailInfo, excelInfo [][][]string) (types.JSONText, error) {
  125. //TODO implement me
  126. var (
  127. sheetIdx int64 = 0
  128. err error
  129. stagesMap []model.ThreeLayer
  130. slotWeightMap map[int64]int64
  131. rewardsMap map[int64][]model.SuperCollectStageReward
  132. actShowConf model.SuperCollectShowConf
  133. )
  134. if len(excelInfo) < 3 {
  135. return nil, errors.New("导入文件异常")
  136. }
  137. basicConfSheet := excelInfo[sheetIdx]
  138. sheetIdx++
  139. stageMappingSheet := excelInfo[sheetIdx]
  140. sheetIdx++
  141. stageRewardSheet := excelInfo[sheetIdx]
  142. sheetIdx++
  143. if actShowConf.CollectConf, err = This.formatCollectConfSheet(basicConfSheet); err != nil {
  144. return nil, err
  145. }
  146. if actShowConf.ExtraData, err = This.formatExtraDataSheet(basicConfSheet); err != nil {
  147. return nil, err
  148. }
  149. if stagesMap, err = Activity.parseThreeLayerConf(stageMappingSheet); err != nil {
  150. return nil, errors.WithStack(err)
  151. }
  152. if slotWeightMap, err = Activity.parseSlotWeightConf(stageMappingSheet); err != nil {
  153. return nil, errors.WithStack(err)
  154. }
  155. if rewardsMap, err = This.parseRewardInfo(stageRewardSheet); err != nil {
  156. return nil, errors.WithStack(err)
  157. }
  158. if actShowConf.RewardInfo, err = This.matchStageRewardsConf(stagesMap, rewardsMap, slotWeightMap); err != nil {
  159. return nil, errors.WithStack(err)
  160. }
  161. return jsoniter.Marshal(actShowConf)
  162. }
  163. func (This *actSuperCollect) formatCollectConfSheet(collectConfSheet [][]string) (model.SuperCollectCollectConf, error) {
  164. //TODO implement me
  165. var (
  166. err error
  167. rewardConf = model.SuperCollectCollectConf{}
  168. )
  169. for _, lineItem := range collectConfSheet {
  170. if len(lineItem) < 2 {
  171. continue
  172. }
  173. switch lineItem[0] {
  174. case config.CollectTypeOptionImportText:
  175. rewardConf.GroupId, err = This.getCollectGroupIdByImportText(lineItem[1])
  176. case config.CollectTypeAttackSuccessImportText:
  177. rewardConf.AttackSuccess, err = This.getCollectNum(lineItem[1])
  178. case config.CollectTypeAttackBreakImportText:
  179. rewardConf.AttackBreak, err = This.getCollectNum(lineItem[1])
  180. case config.CollectTypeStealSuccessImportText:
  181. rewardConf.StealSuccess, err = This.getCollectNum(lineItem[1])
  182. case config.CollectTypeStealBreakImportText:
  183. rewardConf.StealBreak, err = This.getCollectNum(lineItem[1])
  184. case config.CollectTypeOneCollectImportText:
  185. rewardConf.OneHit, err = This.getCollectNum(lineItem[1])
  186. case config.CollectTypeTwoCollectImportText:
  187. rewardConf.TwoHit, err = This.getCollectNum(lineItem[1])
  188. case config.CollectTypeThreeCollectImportText:
  189. rewardConf.ThreeHit, err = This.getCollectNum(lineItem[1])
  190. case config.CollectTypeThreeHitImportText:
  191. rewardConf.ThreeHit, err = This.getCollectNum(lineItem[1])
  192. }
  193. if err != nil {
  194. return rewardConf, err
  195. }
  196. }
  197. return rewardConf, nil
  198. }
  199. func (This *actSuperCollect) getCollectGroupIdByImportText(collectTypeText string) (int64, error) {
  200. switch collectTypeText {
  201. case config.CollectTypeOptionNormalImportText:
  202. return config.CollectTypeOptionNormal, nil
  203. case config.CollectTypeOptionSpecialImportText:
  204. return config.CollectTypeOptionSpecial, nil
  205. case config.CollectTypeOptionSpecialStealImportText:
  206. return config.CollectTypeOptionSpecialSteal, nil
  207. case config.CollectTypeOptionSpecialAttackImportText:
  208. return config.CollectTypeOptionSpecialAttack, nil
  209. case config.CollectTypeOptionStealImportText:
  210. return config.CollectTypeOptionSteal, nil
  211. case config.CollectTypeOptionAttackImportText:
  212. return config.CollectTypeOptionAttack, nil
  213. }
  214. return 0, errors.New("不支持的收集类型:" + collectTypeText)
  215. }
  216. func (This *actSuperCollect) getCollectNum(collectNumText string) (int64, error) {
  217. collectNum, err := strconv.Atoi(collectNumText)
  218. return int64(collectNum), err
  219. }
  220. func (This *actSuperCollect) formatExtraDataSheet(extraConfSheet [][]string) (model.SuperCollectExtraData, error) {
  221. //TODO implement me
  222. var (
  223. extraData = model.SuperCollectExtraData{}
  224. )
  225. for _, lineItem := range extraConfSheet {
  226. if len(lineItem) < 2 {
  227. continue
  228. }
  229. switch lineItem[0] {
  230. case config.SuperCollectShowSpineSwitchImportText:
  231. extraData.IsShowSpine = This.parseYesOrNo(lineItem[1])
  232. case config.SuperCollectTimeLimitedSwitchImportText:
  233. extraData.Open = This.parseYesOrNo(lineItem[1])
  234. case config.SuperCollectTimeLimitedImportText:
  235. extraData.Ts = This.parseTimeLimtedList(lineItem)
  236. }
  237. }
  238. return extraData, nil
  239. }
  240. func (This *actSuperCollect) parseYesOrNo(text string) int64 {
  241. switch text {
  242. case config.YesImportText:
  243. return 1
  244. case config.NoImportText:
  245. return 0
  246. }
  247. return 0
  248. }
  249. func (This *actSuperCollect) parseTimeLimtedList(textList []string) []model.SuperCollectCollectTimeLimitConf {
  250. var time []string
  251. var tsList = []model.SuperCollectCollectTimeLimitConf{}
  252. for i := 1; i < len(textList); i++ {
  253. time = strings.Split(textList[i], " ~ ")
  254. tsList = append(tsList, model.SuperCollectCollectTimeLimitConf{
  255. S: time[0],
  256. E: time[1],
  257. })
  258. }
  259. return tsList
  260. }
  261. func (This *actSuperCollect) parseSlotWeightConf(stageMapSheet [][]string) (map[int64]int64, error) {
  262. var (
  263. slotWeightMap = map[int64]int64{}
  264. slotWeightGroupText string
  265. slotWeightGroupId int64
  266. idx int64
  267. err error
  268. )
  269. for i := 1; i < len(stageMapSheet); i++ {
  270. if len(stageMapSheet[i]) < 7 {
  271. return nil, errors.New("索引配置异常")
  272. }
  273. idx, _ = strconv.ParseInt(stageMapSheet[i][0], 10, 64)
  274. slotWeightGroupText = stageMapSheet[i][6]
  275. if slotWeightGroupId, err = Props.ParseSlotWeightGroup(slotWeightGroupText); err != nil {
  276. return nil, err
  277. }
  278. slotWeightMap[idx] = slotWeightGroupId
  279. }
  280. return slotWeightMap, nil
  281. }
  282. func (This *actSuperCollect) parseRewardInfo(rewardSheet [][]string) (map[int64][]model.SuperCollectStageReward, error) {
  283. var (
  284. rewardsMap = map[int64][]model.SuperCollectStageReward{}
  285. rewards model.SuperCollectStageReward
  286. err error
  287. rewardSheetLength = len(rewardSheet)
  288. idx int64
  289. prize = make([]model.ExcelPrize, 2)
  290. prizeTs = make([]model.ExcelPrize, 2)
  291. prizeTsFormatter []model.ActPrize
  292. )
  293. for i := 1; i < rewardSheetLength; i++ {
  294. rewards = model.SuperCollectStageReward{}
  295. err = utils.DestructAssign(rewardSheet[i], &idx, &rewards.StepNum, &rewards.StageSpins, &prize, &prizeTs)
  296. if err != nil {
  297. return nil, errors.Wrap(err, rewardSheet[i][0])
  298. }
  299. // 转换奖励格式
  300. if rewards.Prize, err = Props.MultiParseActPrize(prize); err != nil {
  301. return nil, errors.WithStack(err)
  302. }
  303. if prizeTsFormatter, err = Props.MultiParseActPrize(prizeTs); err != nil {
  304. return nil, errors.WithStack(err)
  305. }
  306. for _, prizeTmp := range prizeTsFormatter {
  307. prizeTmp.IsTs = 1
  308. rewards.Prize = append(rewards.Prize, prizeTmp)
  309. }
  310. rewardsMap[idx] = append(rewardsMap[idx], rewards)
  311. }
  312. return rewardsMap, nil
  313. }
  314. func (This *actSuperCollect) matchStageRewardsConf(stagesMap []model.ThreeLayer, rewardsMap map[int64][]model.SuperCollectStageReward, slotWeightMap map[int64]int64) ([]model.SuperCollectRewardShowConf, error) {
  315. var (
  316. rewardsShowConf = make([]model.SuperCollectRewardShowConf, 0, len(stagesMap))
  317. )
  318. for _, oneLayer := range stagesMap {
  319. idx := oneLayer.Id
  320. rewards, ok := rewardsMap[idx]
  321. if !ok {
  322. return nil, errors.New("未配置奖励项")
  323. }
  324. slotWeight, ok := slotWeightMap[idx]
  325. if !ok {
  326. return nil, errors.New("未配置老虎机权重分组")
  327. }
  328. rewardsShowConf = append(rewardsShowConf, model.SuperCollectRewardShowConf{
  329. Id: oneLayer.Id,
  330. LvRange: oneLayer.LvRange,
  331. SpinsRange: oneLayer.SpinsRange,
  332. SsGroup: oneLayer.SsGroup,
  333. SlotWeightGroup: model.SlotWeightGroup{SlotWeightGroup: slotWeight},
  334. Reward: rewards,
  335. })
  336. }
  337. return rewardsShowConf, nil
  338. }