act_choose_you_want.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  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/dablelv/go-huge-util/conv"
  9. "github.com/jmoiron/sqlx/types"
  10. jsoniter "github.com/json-iterator/go"
  11. "github.com/pkg/errors"
  12. )
  13. type actChooseYouWant struct{}
  14. // 展示数据处理
  15. func (This *actChooseYouWant) handleActShow(confInfo *model.ActConfInfo) (json types.JSONText, err error) {
  16. var stageConf []model.ChooseYouWantStageConf
  17. if err = jsoniter.Unmarshal(confInfo.Reward, &stageConf); err != nil {
  18. return nil, errors.Wrap(err, "随心配 奖励Json解析失败")
  19. }
  20. var baseConf model.ChooseYouWantBaseConf
  21. if err = jsoniter.Unmarshal(confInfo.ExtraReward, &baseConf); err != nil {
  22. return nil, errors.Wrap(err, "随心配 基础配置Json解析失败")
  23. }
  24. showConf := This.convertIntoShowConf(stageConf, baseConf)
  25. if json, err = jsoniter.Marshal(showConf); err != nil {
  26. return nil, errors.Wrap(err, "随心配 奖励序列化失败")
  27. }
  28. return
  29. }
  30. // 保存数据处理
  31. func (This *actChooseYouWant) handleActSave(confInfo *model.ActConfInfo) (err error) {
  32. var showConf model.ChooseYouWantShowConf
  33. if err = jsoniter.Unmarshal(confInfo.ActShowConf, &showConf); err != nil {
  34. return errors.Wrap(err, "随心配 奖励Json解析失败")
  35. }
  36. // 数据转换
  37. var stageConf []model.ChooseYouWantStageConf
  38. if stageConf, err = This.convertIntoStageConf(showConf.RewardConf); err != nil {
  39. return errors.Wrap(err, "随心配 奖励数据转换失败")
  40. }
  41. // 奖励配置
  42. if confInfo.Reward, err = jsoniter.Marshal(stageConf); err != nil {
  43. return errors.Wrap(err, "随心配 奖励数据序列化失败")
  44. }
  45. // 奖励配置
  46. if confInfo.ExtraReward, err = jsoniter.Marshal(showConf.BaseConf); err != nil {
  47. return errors.Wrap(err, "随心配 基础配置数据序列化失败")
  48. }
  49. return
  50. }
  51. // 分层数据处理
  52. func (This *actChooseYouWant) handleActRewardSection(confInfo *model.ActConfInfo, maps ...map[string]any) error {
  53. var repoConfArr []model.ChooseYouWantStageConf
  54. if err := jsoniter.Unmarshal(confInfo.Reward, &repoConfArr); err != nil {
  55. return errors.Wrap(err, "随心配奖励解析失败")
  56. }
  57. conditionMap, rewardMap := maps[0], maps[1]
  58. for idx1, item1 := range repoConfArr {
  59. for idx2, item2 := range item1.Data {
  60. stageKey := fmt.Sprintf("%d_%d", idx1, idx2)
  61. conditionMap[stageKey] = Activity.buildStageConditionOld(item1.StartEnd, item2.SsGroup)
  62. rewardMap[stageKey] = item2.Data
  63. }
  64. }
  65. return nil
  66. }
  67. // 导入数据处理
  68. func (This *actChooseYouWant) handleActImport(_ *model.ActDetailInfo, excelInfo [][][]string) (json types.JSONText, err error) {
  69. if len(excelInfo) < 3 {
  70. return json, errors.New("工作表数量不匹配")
  71. }
  72. var showConf model.ChooseYouWantShowConf
  73. if showConf, err = This.sheetResolver(excelInfo); err != nil {
  74. return json, errors.Wrap(err, "随心配 工作表解析失败")
  75. }
  76. if json, err = jsoniter.Marshal(showConf); err != nil {
  77. return json, errors.Wrap(err, "随心配 配置序列化失败")
  78. }
  79. return
  80. }
  81. func (This *actChooseYouWant) convertIntoShowConf(stageConf []model.ChooseYouWantStageConf, baseConf model.ChooseYouWantBaseConf) (showConf model.ChooseYouWantShowConf) {
  82. for lvId, lvStage := range stageConf {
  83. for ssId, ssGroupStage := range lvStage.Data {
  84. showConf.RewardConf = append(showConf.RewardConf, model.ChooseYouWantShowStageConf{
  85. TwoLayerLvSsGroup: model.TwoLayerLvSsGroup{
  86. Id: Activity.buildLayerOrderId(int64(lvId), int64(ssId)),
  87. LvRange: model.LvRange{LvStart: lvStage.Start, LvEnd: lvStage.End},
  88. SsGroup: ssGroupStage.SsGroup,
  89. },
  90. Data: ssGroupStage.Data,
  91. })
  92. }
  93. }
  94. showConf.BaseConf = baseConf
  95. return
  96. }
  97. func (This *actChooseYouWant) convertIntoStageConf(confArr []model.ChooseYouWantShowStageConf) (repoConfArr []model.ChooseYouWantStageConf, err error) {
  98. ssStageArrMap := This.buildSsStageArrMap(confArr)
  99. repoConfArr = make([]model.ChooseYouWantStageConf, 0, len(confArr))
  100. for _, stages := range ssStageArrMap {
  101. for i := 0; i < len(stages.Data); i++ {
  102. stage := &stages.Data[i]
  103. stage.Data.Gid = 1845
  104. }
  105. repoConfArr = append(repoConfArr, model.ChooseYouWantStageConf{
  106. StartEnd: model.StartEnd{Start: stages.LvRange.LvStart, End: stages.LvRange.LvEnd},
  107. Data: stages.Data,
  108. })
  109. }
  110. return
  111. }
  112. func (This *actChooseYouWant) sheetResolver(sheets [][][]string) (showConf model.ChooseYouWantShowConf, err error) {
  113. sheet1Array, sheet2Array, sheet3Array := sheets[0], sheets[1], sheets[2]
  114. // 解析分组ID配置项
  115. if showConf, err = This.parseBaseSheet(sheet1Array); err != nil {
  116. return showConf, errors.WithStack(err)
  117. }
  118. // 解析分组ID配置项
  119. var stageConf []model.TwoLayerLvSsGroup
  120. if stageConf, err = Activity.parseTwoLayerLvSsGroupConf(sheet2Array); err != nil {
  121. return showConf, errors.WithStack(err)
  122. }
  123. // 解析阶段配置项
  124. var stageMap map[int64]model.ChooseYouWantStageReward
  125. if stageMap, err = This.parseStageSheet(sheet3Array); err != nil {
  126. return showConf, errors.WithStack(err)
  127. }
  128. if err = This.packageShowConf(&showConf, stageConf, stageMap); err != nil {
  129. return showConf, errors.WithStack(err)
  130. }
  131. return
  132. }
  133. func (This *actChooseYouWant) buildSsStageArrMap(confArr []model.ChooseYouWantShowStageConf) []model.ChooseYouWantTmpSsConf {
  134. ssStageArrMap := make(map[model.LvRange][]model.ChooseYouWantSSGroupStage, 0)
  135. for i := 0; i < len(confArr); i++ {
  136. oneRowInfo := confArr[i]
  137. ssStageArrMap[oneRowInfo.LvRange] = append(ssStageArrMap[oneRowInfo.LvRange], model.ChooseYouWantSSGroupStage{
  138. SsGroup: oneRowInfo.SsGroup,
  139. Data: oneRowInfo.Data,
  140. })
  141. }
  142. tmpSsConf := make([]model.ChooseYouWantTmpSsConf, 0, len(ssStageArrMap))
  143. for idx, stages := range ssStageArrMap {
  144. tmpSsConf = append(tmpSsConf, model.ChooseYouWantTmpSsConf{
  145. LvRange: idx,
  146. Data: stages,
  147. })
  148. }
  149. sort.SliceStable(tmpSsConf, func(i, j int) bool {
  150. if tmpSsConf[i].LvRange.LvStart != tmpSsConf[j].LvRange.LvStart {
  151. return tmpSsConf[i].LvRange.LvStart < tmpSsConf[j].LvRange.LvStart
  152. }
  153. return tmpSsConf[i].LvRange.LvEnd < tmpSsConf[j].LvRange.LvEnd
  154. })
  155. return tmpSsConf
  156. }
  157. func (This *actChooseYouWant) parseBaseSheet(sheet [][]string) (showConf model.ChooseYouWantShowConf, err error) {
  158. for i := 0; i < len(sheet); i++ {
  159. if len(sheet[i]) == 0 {
  160. continue
  161. }
  162. switch sheet[i][0] {
  163. case "购买次数":
  164. if showConf.BaseConf.BuyTimes, err = conv.ToAnyE[int64](sheet[i][1]); err != nil {
  165. return showConf, errors.WithStack(err)
  166. }
  167. }
  168. }
  169. return
  170. }
  171. func (This *actChooseYouWant) parseStageSheet(sheet [][]string) (stageMap map[int64]model.ChooseYouWantStageReward, err error) {
  172. stageMap = make(map[int64]model.ChooseYouWantStageReward, len(sheet))
  173. for rowIdx := 1; rowIdx < len(sheet); rowIdx++ {
  174. var (
  175. id int64
  176. one model.ChooseYouWantStageReward
  177. leftRewardArr = make([]model.ExcelPrize, 5)
  178. rightRewardArr = make([]model.ExcelPrize, 5)
  179. )
  180. // 解析行配置
  181. if err = utils.DestructAssign(sheet[rowIdx], &id, &one.Price, &one.Discount, &leftRewardArr, &rightRewardArr); err != nil {
  182. return nil, errors.WithStack(err)
  183. }
  184. if one.Sku = config.PriceSkuMap[one.Price]; utils.IsEmpty(one.Sku) {
  185. return nil, errors.New(fmt.Sprintf("第%d行,购买价格:%.2f 无对应sku", rowIdx, one.Price))
  186. }
  187. if one.Rewards.Left.Prizes, err = Props.MultiParseActPrize(leftRewardArr); err != nil {
  188. return nil, errors.WithStack(err)
  189. }
  190. if one.Rewards.Right.Prizes, err = Props.MultiParseActPrize(rightRewardArr); err != nil {
  191. return nil, errors.WithStack(err)
  192. }
  193. stageMap[id] = one
  194. }
  195. return
  196. }
  197. func (This *actChooseYouWant) packageShowConf(showConf *model.ChooseYouWantShowConf, stageConf []model.TwoLayerLvSsGroup, stageMap map[int64]model.ChooseYouWantStageReward) (err error) {
  198. var Ok bool
  199. var reward model.ChooseYouWantStageReward
  200. showConf.RewardConf = make([]model.ChooseYouWantShowStageConf, 0, len(stageConf))
  201. for _, layer := range stageConf {
  202. if reward, Ok = stageMap[layer.Id]; !Ok {
  203. return errors.New(fmt.Sprintf("阶段唯一ID: %d 未配置", layer.Id))
  204. }
  205. showConf.RewardConf = append(showConf.RewardConf, model.ChooseYouWantShowStageConf{
  206. TwoLayerLvSsGroup: layer,
  207. Data: reward,
  208. })
  209. }
  210. return
  211. }