act_traffic_permit.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. package service
  2. import (
  3. "fmt"
  4. "strings"
  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 actTrafficPermit struct{}
  13. // 展示数据处理
  14. func (This *actTrafficPermit) handleActShow(confInfo *model.ActConfInfo) (json types.JSONText, err error) {
  15. var repoConf map[int64]model.TrafficPermitRepoConf
  16. // 基础配置解析
  17. if err = jsoniter.Unmarshal(confInfo.RewardPro, &repoConf); err != nil {
  18. return json, errors.Wrap(err, "通行证 Json解析失败")
  19. }
  20. // 数据转换
  21. showConf := utils.MapValues(repoConf, true)
  22. if json, err = jsoniter.Marshal(showConf); err != nil {
  23. return json, errors.Wrap(err, "通行证 奖励序列化失败")
  24. }
  25. return
  26. }
  27. // 保存数据处理
  28. func (This *actTrafficPermit) handleActSave(confInfo *model.ActConfInfo) (err error) {
  29. var showConf []model.TrafficPermitRepoConf
  30. if err = jsoniter.Unmarshal(confInfo.ActShowConf, &showConf); err != nil {
  31. return errors.Wrap(err, "通行证 奖励Json解析失败")
  32. }
  33. repoConf := This.convertIntoRepoConf(showConf)
  34. // 配置解析
  35. if confInfo.RewardPro, err = jsoniter.Marshal(repoConf); err != nil {
  36. return errors.Wrap(err, "通行证 配置序列化失败")
  37. }
  38. return
  39. }
  40. // 分层数据处理
  41. func (This *actTrafficPermit) handleActRewardSection(confInfo *model.ActConfInfo, maps ...map[string]any) error {
  42. var repoConfMap map[int64]model.TrafficPermitRepoConf
  43. if err := jsoniter.Unmarshal(confInfo.RewardPro, &repoConfMap); err != nil {
  44. return errors.Wrap(err, "通行证奖励解析失败")
  45. }
  46. conditionMap, rewardMap := maps[0], maps[1]
  47. for idx1, item1 := range repoConfMap {
  48. stageKey := fmt.Sprintf("%d", idx1)
  49. conditionMap[stageKey] = Activity.buildStageCondition(item1.LvRange)
  50. rewardMap[stageKey] = item1
  51. }
  52. return nil
  53. }
  54. // 导入数据处理
  55. func (This *actTrafficPermit) handleActImport(_ *model.ActDetailInfo, excelInfo [][][]string) (json types.JSONText, err error) {
  56. if len(excelInfo) < 7 {
  57. return json, errors.New("工作表数量不匹配")
  58. }
  59. var showConf []model.TrafficPermitShowConf
  60. if showConf, err = This.sheetResolver(excelInfo); err != nil {
  61. return json, errors.Wrap(err, "通行证 工作表解析失败")
  62. }
  63. if json, err = jsoniter.Marshal(showConf); err != nil {
  64. return json, errors.Wrap(err, "通行证 配置序列化失败")
  65. }
  66. return
  67. }
  68. func (This *actTrafficPermit) convertIntoRepoConf(confArr []model.TrafficPermitRepoConf) map[int64]model.TrafficPermitRepoConf {
  69. maps := make(map[int64]model.TrafficPermitRepoConf, len(confArr))
  70. for i := range confArr {
  71. This.formatTaskConf(confArr[i].Task1)
  72. This.formatTaskConf(confArr[i].Task2)
  73. maps[int64(i+1)] = confArr[i]
  74. }
  75. return maps
  76. }
  77. func (This *actTrafficPermit) formatTaskConf(taskArr []model.TrafficPermitTaskConf) {
  78. for i := 0; i < len(taskArr); i++ {
  79. taskArr[i].Id = int64(i + 1)
  80. }
  81. }
  82. func (This *actTrafficPermit) sheetResolver(excelInfo [][][]string) (showConf []model.TrafficPermitShowConf, err error) {
  83. sheet2Array, sheet3Array, sheet4Array, sheet5Array, sheet6Array, sheet7Array :=
  84. excelInfo[1], excelInfo[2], excelInfo[3], excelInfo[4], excelInfo[5], excelInfo[6]
  85. // 层级关系映射
  86. layConfMap, err := This.parseRewardLayerSheet(sheet2Array)
  87. if err != nil {
  88. return showConf, errors.WithStack(err)
  89. }
  90. // 弹窗配置
  91. alertConfMap, err := This.parseAlertConfSheet(sheet3Array)
  92. if err != nil {
  93. return showConf, errors.WithStack(err)
  94. }
  95. // 礼包配置
  96. giftRewardsMap, err := This.parsePermitRewardSheet(sheet4Array)
  97. if err != nil {
  98. return showConf, errors.WithStack(err)
  99. }
  100. // 任务配置
  101. task1ConfMap, task2ConfMap, err := This.parseTaskConfSheet(sheet5Array)
  102. if err != nil {
  103. return showConf, errors.WithStack(err)
  104. }
  105. // 等级奖励配置
  106. rewardConfMap, err := This.parseRewardSheet(sheet6Array)
  107. if err != nil {
  108. return showConf, errors.WithStack(err)
  109. }
  110. // 额外奖励配置
  111. extraReward, err := This.parseExtraRewardSheet(sheet7Array)
  112. if err != nil {
  113. return showConf, errors.WithStack(err)
  114. }
  115. showConf, err = This.packageShowConf(layConfMap, alertConfMap, giftRewardsMap, task1ConfMap, task2ConfMap, rewardConfMap, extraReward)
  116. if err != nil {
  117. return showConf, errors.WithStack(err)
  118. }
  119. return
  120. }
  121. func (This *actTrafficPermit) parseRewardLayerSheet(sheet [][]string) ([]model.TrafficPermitShowConf, error) {
  122. var err error
  123. stageConf := make([]model.TrafficPermitShowConf, 0, len(sheet))
  124. for i := 1; i < len(sheet); i++ {
  125. var one model.TrafficPermitShowConf
  126. if err = utils.DestructAssign(sheet[i], &one.Id, &one.LvRange, &one.Basic); err != nil {
  127. return nil, errors.Wrap(err, fmt.Sprintf("第%d行", i+1))
  128. }
  129. stageConf = append(stageConf, one)
  130. }
  131. return stageConf, nil
  132. }
  133. func (This *actTrafficPermit) parseAlertConfSheet(sheet [][]string) (map[int64]model.TrafficPermitAlertConfig, error) {
  134. var err error
  135. conf := make(map[int64]model.TrafficPermitAlertConfig, len(sheet))
  136. for i := 1; i < len(sheet); i++ {
  137. var id int64
  138. var one model.TrafficPermitAlertConfig
  139. // 解析行配置
  140. if err = utils.DestructAssign(sheet[i], &id, &one); err != nil {
  141. return conf, errors.WithStack(err)
  142. }
  143. conf[id] = one
  144. }
  145. return conf, err
  146. }
  147. func (This *actTrafficPermit) parsePermitRewardSheet(sheet [][]string) (map[int64]model.TrafficPermitOpenConf, error) {
  148. typStrMap := map[string]string{"普通": "normal", "精英": "special"}
  149. var err error
  150. confMap := make(map[int64]map[string]model.TrafficPermitGiftPackConf, len(sheet))
  151. for i := 1; i < len(sheet); i++ {
  152. var (
  153. id int64
  154. prizes = make([]model.TrafficPermitExcelPrize, 4)
  155. typStr string
  156. one model.TrafficPermitGiftPackConf
  157. )
  158. // 解析行配置
  159. if err = utils.DestructAssign(sheet[i], &id, &typStr, &one.Price, &prizes); err != nil {
  160. return nil, errors.WithStack(err)
  161. }
  162. if one.Sku = config.PriceSkuMap[one.Price]; utils.IsEmpty(one.Sku) {
  163. return nil, errors.New(fmt.Sprintf("第%d行,购买价格:%.2f 无对应sku", i+1, one.Price))
  164. }
  165. if one.Rewards, err = This.multiParseExcelPrize(prizes); err != nil {
  166. return nil, err
  167. }
  168. typ := typStrMap[typStr]
  169. switch typ {
  170. case "normal":
  171. one.Gid = 1770
  172. if _, Ok := confMap[id]; !Ok {
  173. confMap[id] = map[string]model.TrafficPermitGiftPackConf{}
  174. }
  175. confMap[id]["normal"] = one
  176. case "special":
  177. one.Gid = 1814
  178. if _, Ok := confMap[id]; !Ok {
  179. confMap[id] = map[string]model.TrafficPermitGiftPackConf{}
  180. }
  181. confMap[id]["special"] = one
  182. default:
  183. return nil, errors.New("礼包类型错误: " + typStr)
  184. }
  185. }
  186. rewards := make(map[int64]model.TrafficPermitOpenConf, len(confMap))
  187. for i, conf := range confMap {
  188. rewards[i] = model.TrafficPermitOpenConf{
  189. Normal: conf["normal"],
  190. Special: conf["special"],
  191. }
  192. }
  193. return rewards, err
  194. }
  195. func (This *actTrafficPermit) parseTaskConfSheet(sheet [][]string) (map[int64][]model.TrafficPermitTaskConf, map[int64][]model.TrafficPermitTaskConf, error) {
  196. typStrMap := map[string]string{"单日": "single", "双日": "pair"}
  197. taskTypMap := map[string]int64{
  198. "邀请好友": 1,
  199. "完成世界": 2,
  200. "偷": 3,
  201. "打": 4,
  202. "和大盗莫里一起偷袭": 5,
  203. "和拳手莫里一起进攻": 6,
  204. "转一次黄金转盘": 7,
  205. "夺宝一次": 8,
  206. "玩一次黄金矿工": 9,
  207. "分享游戏": 10,
  208. "召回好友": 11,
  209. "消耗体力200": 12,
  210. "消耗体力800": 13,
  211. "消耗体力2000": 14,
  212. "消耗体力8000": 15,
  213. }
  214. var Ok bool
  215. var err error
  216. task1 := make(map[int64][]model.TrafficPermitTaskConf, len(sheet)/2)
  217. task2 := make(map[int64][]model.TrafficPermitTaskConf, len(sheet)/2)
  218. for i := 1; i < len(sheet); i++ {
  219. var id int64
  220. var typStr, taskTyp string
  221. var one model.TrafficPermitTaskConf
  222. // 解析行配置
  223. if err = utils.DestructAssign(sheet[i], &id, &typStr, &taskTyp, &one.Num, &one.GetNum); err != nil {
  224. return task1, task2, errors.WithStack(err)
  225. }
  226. one.Type, Ok = taskTypMap[strings.TrimSpace(taskTyp)]
  227. if !Ok {
  228. return nil, nil, errors.New("任务类型错误: " + taskTyp)
  229. }
  230. typ := typStrMap[typStr]
  231. switch typ {
  232. case "single":
  233. one.Id = int64(len(task1[id])) + 1
  234. task1[id] = append(task1[id], one)
  235. case "pair":
  236. one.Id = int64(len(task2[id])) + 1
  237. task2[id] = append(task2[id], one)
  238. default:
  239. return nil, nil, errors.New("任务单/双类型错误: " + typStr)
  240. }
  241. }
  242. return task1, task2, err
  243. }
  244. func (This *actTrafficPermit) parseRewardSheet(sheet [][]string) (map[int64][]model.TrafficPermitRewardConf, error) {
  245. yesOrNoMap := map[string]int64{"是": 1, "否": 0}
  246. var err error
  247. rewardArrMap := map[int64][]model.TrafficPermitRewardConf{}
  248. for i := 1; i < len(sheet); i++ {
  249. var (
  250. id int64
  251. isGrandPrize string
  252. freePrizes = make([]model.ExcelPrize, 4)
  253. prizes = make([]model.ExcelPrize, 4)
  254. one model.TrafficPermitRewardConf
  255. )
  256. // 解析行配置
  257. if err = utils.DestructAssign(sheet[i], &id, &one.LevelId, &one.Max, &isGrandPrize, &freePrizes, &prizes); err != nil {
  258. return nil, errors.WithStack(err)
  259. }
  260. one.IsGrandPrize = yesOrNoMap[strings.TrimSpace(isGrandPrize)]
  261. if one.Prize, err = Props.MultiParseActPrize(freePrizes); err != nil {
  262. return nil, errors.WithStack(err)
  263. }
  264. if one.SpecialPrize, err = Props.MultiParseActPrize(prizes); err != nil {
  265. return nil, errors.WithStack(err)
  266. }
  267. rewardArrMap[id] = append(rewardArrMap[id], one)
  268. }
  269. return rewardArrMap, nil
  270. }
  271. func (This *actTrafficPermit) parseExtraRewardSheet(sheet [][]string) (map[int64]model.TrafficPermitReward, error) {
  272. var err error
  273. rewardArrMap := map[int64]model.TrafficPermitReward{}
  274. for i := 1; i < len(sheet); i++ {
  275. var (
  276. id int64
  277. freePrizes = make([]model.ExcelPrize, 4)
  278. prizes = make([]model.ExcelPrize, 4)
  279. one model.TrafficPermitReward
  280. )
  281. // 解析行配置
  282. if err = utils.DestructAssign(sheet[i], &id, &freePrizes, &prizes); err != nil {
  283. return nil, errors.WithStack(err)
  284. }
  285. if one.Prize, err = Props.MultiParseActPrize(freePrizes); err != nil {
  286. return nil, errors.WithStack(err)
  287. }
  288. if one.SpecialPrize, err = Props.MultiParseActPrize(prizes); err != nil {
  289. return nil, errors.WithStack(err)
  290. }
  291. rewardArrMap[id] = one
  292. }
  293. return rewardArrMap, nil
  294. }
  295. func (This *actTrafficPermit) multiParseExcelPrize(rewards []model.TrafficPermitExcelPrize) ([]model.TrafficPermitPrize, error) {
  296. rewardStrMap := map[string]int64{"通行证专属头像框": 2, "赠送N个通行证等级": 3}
  297. prizes := make([]model.TrafficPermitPrize, 0, len(rewards))
  298. for _, prize := range rewards {
  299. name := strings.TrimSpace(prize.Name)
  300. if name == "" {
  301. continue
  302. }
  303. var one model.TrafficPermitPrize
  304. one.Type = rewardStrMap[name]
  305. if one.Type == 0 {
  306. return prizes, errors.New("礼包配置 奖励类型错误:" + name)
  307. }
  308. one.Value = prize.Num
  309. prizes = append(prizes, one)
  310. }
  311. return prizes, nil
  312. }
  313. func (This *actTrafficPermit) packageShowConf(layConfMap []model.TrafficPermitShowConf, alertConfMap map[int64]model.TrafficPermitAlertConfig, giftRewardsMap map[int64]model.TrafficPermitOpenConf, task1ConfMap map[int64][]model.TrafficPermitTaskConf, task2ConfMap map[int64][]model.TrafficPermitTaskConf, rewardConfMap map[int64][]model.TrafficPermitRewardConf, extraReward map[int64]model.TrafficPermitReward) (showConf []model.TrafficPermitShowConf, err error) {
  314. var Ok bool
  315. for id, layer := range layConfMap {
  316. one := &layConfMap[id]
  317. if one.AlertConfig, Ok = alertConfMap[layer.Id]; !Ok {
  318. return showConf, errors.New(fmt.Sprintf("唯一ID:%d,未配置弹窗配置", layer.Id))
  319. }
  320. if one.PermitRewards, Ok = giftRewardsMap[layer.Id]; !Ok {
  321. return showConf, errors.New(fmt.Sprintf("唯一ID:%d,未配置礼包配置", layer.Id))
  322. }
  323. if one.Task1, Ok = task1ConfMap[layer.Id]; !Ok {
  324. return showConf, errors.New(fmt.Sprintf("唯一ID:%d,未配置单日任务配置", layer.Id))
  325. }
  326. if one.Task2, Ok = task2ConfMap[layer.Id]; !Ok {
  327. return showConf, errors.New(fmt.Sprintf("唯一ID:%d,未配置双日任务配置", layer.Id))
  328. }
  329. if one.Levels, Ok = rewardConfMap[layer.Id]; !Ok {
  330. return showConf, errors.New(fmt.Sprintf("唯一ID:%d,未配置等级奖励配置", layer.Id))
  331. }
  332. if one.MaxRewards, Ok = extraReward[layer.Id]; !Ok {
  333. return showConf, errors.New(fmt.Sprintf("唯一ID:%d,未配置额外奖励配置", layer.Id))
  334. }
  335. }
  336. return layConfMap, nil
  337. }