123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- package service
- import (
- "fmt"
- "sort"
- "crazy-fox-backend-api/model"
- "crazy-fox-backend-api/utils"
- "crazy-fox-backend-api/utils/uniqid"
- "github.com/jmoiron/sqlx/types"
- jsoniter "github.com/json-iterator/go"
- "github.com/pkg/errors"
- )
- type actCrazyBuild struct{}
- // 展示数据处理
- func (This *actCrazyBuild) handleActShow(confInfo *model.ActConfInfo) (json types.JSONText, err error) {
- var rewardConf map[int64]model.CrazyBuildRewardConf
- if err = jsoniter.Unmarshal(confInfo.Reward, &rewardConf); err != nil {
- return json, errors.Wrap(err, "疯狂建造 奖励Json解析失败")
- }
- // 基础配置
- var baseConf model.CrazyBuildBasicConf
- if err = jsoniter.Unmarshal(confInfo.ExtraData, &baseConf); err != nil {
- return nil, errors.Wrap(err, "疯狂建造 基础配置Json解析失败")
- }
- // 数据转换
- showConf := This.convertIntoShowConf(rewardConf, baseConf)
- if json, err = jsoniter.Marshal(showConf); err != nil {
- return json, errors.Wrap(err, "疯狂建造 奖励序列化失败")
- }
- return
- }
- // 保存数据处理
- func (This *actCrazyBuild) handleActSave(confInfo *model.ActConfInfo) (err error) {
- var showConf model.CrazyBuildShowConf
- if err = jsoniter.Unmarshal(confInfo.ActShowConf, &showConf); err != nil {
- return errors.Wrap(err, "疯狂建造 奖励Json解析失败")
- }
- // 数据转换
- var rewardMap map[int64]model.CrazyBuildRewardConf
- if rewardMap, err = This.convertIntoRewardConf(showConf.RewardInfo); err != nil {
- return errors.Wrap(err, "疯狂建造 奖励数据转换失败")
- }
- if confInfo.Reward, err = jsoniter.Marshal(rewardMap); err != nil {
- return errors.Wrap(err, "疯狂建造 奖励数据序列化失败")
- }
- // 收集配置
- if confInfo.ExtraData, err = jsoniter.Marshal(showConf.BasicConf); err != nil {
- return errors.Wrap(err, "疯狂建造 收集配置数据序列化失败")
- }
- return
- }
- // 分层数据处理
- func (This *actCrazyBuild) handleActRewardSection(confInfo *model.ActConfInfo, maps ...map[string]any) error {
- var rewardRepoConfMap map[int64]model.CrazyBuildRewardConf
- if err := jsoniter.Unmarshal(confInfo.Reward, &rewardRepoConfMap); err != nil {
- return errors.Wrap(err, "疯狂建造奖励解析失败")
- }
- conditionMap, rewardMap := maps[0], maps[1]
- for idx1, item1 := range rewardRepoConfMap {
- stageKey := fmt.Sprintf("%d", idx1)
- conditionMap[stageKey] = Activity.buildStageCondition(item1.SsGroup)
- rewardMap[stageKey] = item1.Reward
- }
- return nil
- }
- // 导入数据处理
- func (This *actCrazyBuild) handleActImport(_ *model.ActDetailInfo, excelInfo [][][]string) (json types.JSONText, err error) {
- if len(excelInfo) < 3 {
- return json, errors.New("工作表数量不匹配")
- }
- var showConf model.CrazyBuildShowConf
- if showConf, err = This.sheetResolver(excelInfo); err != nil {
- return json, errors.Wrap(err, "疯狂建造 工作表解析失败")
- }
- if json, err = jsoniter.Marshal(showConf); err != nil {
- return json, errors.Wrap(err, "疯狂建造 配置序列化失败")
- }
- return
- }
- func (This *actCrazyBuild) convertIntoShowConf(rewardConf map[int64]model.CrazyBuildRewardConf, baseConf model.CrazyBuildBasicConf) (showConf model.CrazyBuildShowConf) {
- for ssGroupId, ssGroupStage := range rewardConf {
- showRewards := make([]model.CrazyBuildShowReward, 0, len(ssGroupStage.Reward.BasicReward))
- for lv, oneReward := range ssGroupStage.Reward.BasicReward {
- showRewards = append(showRewards, model.CrazyBuildShowReward{
- UserLevel: lv,
- BasicPrize: oneReward.Prize,
- FinalPrize: ssGroupStage.Reward.FinalReward[lv].Prize,
- })
- }
- sort.SliceStable(showRewards, func(i, j int) bool { return showRewards[i].UserLevel < showRewards[j].UserLevel })
- showConf.RewardInfo = append(showConf.RewardInfo, model.CrazyBuildRewardShowConf{
- OneLayerSsGroup: model.OneLayerSsGroup{
- Id: Activity.buildLayerOrderId(ssGroupId),
- SsGroup: ssGroupStage.SsGroup,
- },
- Reward: This.makeShowRangeRewardArr(showRewards),
- })
- }
- sort.SliceStable(showConf.RewardInfo, func(i, j int) bool { return showConf.RewardInfo[i].Id < showConf.RewardInfo[j].Id })
- showConf.BasicConf = baseConf
- return
- }
- func (This *actCrazyBuild) convertIntoRewardConf(rewardShowConfArr []model.CrazyBuildRewardShowConf) (map[int64]model.CrazyBuildRewardConf, error) {
- var (
- rewardRepoConfMap = map[int64]model.CrazyBuildRewardConf{}
- unique = uniqid.GetUniqId()
- )
- defer uniqid.DelMapByUniqId(unique)
- for i := 0; i < len(rewardShowConfArr); i++ {
- oneRowInfo := rewardShowConfArr[i]
- oneRowRewardLen := len(oneRowInfo.Reward)
- ssIdx := uniqid.GetStageIdx(unique, oneRowInfo.SsGroup)[0]
- rewardStage := model.CrazyBuildReward{
- BasicReward: map[int64]model.CrazyBuildStageReward{},
- FinalReward: map[int64]model.CrazyBuildStageReward{},
- }
- // 构建奖励Map
- rewardStage.BasicReward = make(map[int64]model.CrazyBuildStageReward, oneRowInfo.Reward[oneRowRewardLen-1].LvEnd)
- rewardStage.FinalReward = make(map[int64]model.CrazyBuildStageReward, oneRowInfo.Reward[oneRowRewardLen-1].LvEnd)
- for j := 0; j < oneRowRewardLen; j++ {
- oneReward := oneRowInfo.Reward[j]
- for lv := oneReward.LvStart; lv <= oneReward.LvEnd; lv++ {
- rewardStage.BasicReward[lv] = model.CrazyBuildStageReward{
- UserLevel: lv,
- Prize: oneReward.BasicPrize,
- }
- rewardStage.FinalReward[lv] = model.CrazyBuildStageReward{
- UserLevel: lv,
- Prize: oneReward.FinalPrize,
- }
- }
- }
- // 数数分组
- if _, Ok := rewardRepoConfMap[ssIdx]; !Ok {
- rewardRepoConfMap[ssIdx] = model.CrazyBuildRewardConf{
- SsGroup: oneRowInfo.SsGroup,
- Reward: rewardStage,
- }
- }
- }
- return rewardRepoConfMap, nil
- }
- func (This *actCrazyBuild) sheetResolver(excelInfo [][][]string) (showConf model.CrazyBuildShowConf, err error) {
- sheet1Array, sheet2Array, sheet3Array := excelInfo[0], excelInfo[1], excelInfo[2]
- // 解析基础配置
- showConf, err = This.parseBaseSheet(sheet1Array)
- // 解析分组ID配置项
- var stageConf []model.OneLayerSsGroup
- if stageConf, err = Activity.parseOneLayerSsGroupConf(sheet2Array); err != nil {
- return showConf, errors.WithStack(err)
- }
- // 解析奖励配置项
- var rewardMap map[int64][]model.CrazyBuildShowRangeReward
- if rewardMap, err = This.parseRewardSheet(sheet3Array); err != nil {
- return showConf, errors.WithStack(err)
- }
- if err = This.packageShowConf(&showConf, stageConf, rewardMap); err != nil {
- return showConf, errors.WithStack(err)
- }
- return
- }
- func (This *actCrazyBuild) parseRewardSheet(rewardsSheet [][]string) (map[int64][]model.CrazyBuildShowRangeReward, error) {
- var err error
- stageRewardMap := map[int64][]model.CrazyBuildShowRangeReward{}
- for rowIdx := 1; rowIdx < len(rewardsSheet); rowIdx++ {
- var (
- id int64
- one model.CrazyBuildShowRangeReward
- basicRewardArr = make([]model.ExcelPrize, 3)
- finalRewardArr = make([]model.ExcelPrize, 3)
- )
- // 解析行配置
- if err = utils.DestructAssign(rewardsSheet[rowIdx], &id, &one.LvRange, &basicRewardArr, &finalRewardArr); err != nil {
- return nil, errors.WithStack(err)
- }
- // 转换奖励格式
- if one.BasicPrize, err = Props.MultiParseActPrize(basicRewardArr); err != nil {
- return nil, errors.WithStack(err)
- }
- // 转换奖励格式
- if one.FinalPrize, err = Props.MultiParseActPrize(finalRewardArr); err != nil {
- return nil, errors.WithStack(err)
- }
- stageRewardMap[id] = append(stageRewardMap[id], one)
- }
- return stageRewardMap, nil
- }
- func (This *actCrazyBuild) packageShowConf(showConf *model.CrazyBuildShowConf, layers []model.OneLayerSsGroup, rewardMap map[int64][]model.CrazyBuildShowRangeReward) (err error) {
- rewardConfArr := make([]model.CrazyBuildRewardShowConf, 0, len(layers))
- for _, layer := range layers {
- reward, Ok := rewardMap[layer.Id]
- if !Ok {
- return errors.New("未配置奖励项")
- }
- rewardConfArr = append(rewardConfArr, model.CrazyBuildRewardShowConf{
- OneLayerSsGroup: layer,
- Reward: reward,
- })
- }
- showConf.RewardInfo = rewardConfArr
- return
- }
- func (This *actCrazyBuild) makeShowRangeRewardArr(rewards []model.CrazyBuildShowReward) []model.CrazyBuildShowRangeReward {
- lens := len(rewards)
- if lens == 0 {
- return []model.CrazyBuildShowRangeReward{}
- }
- showRangeRewards := make([]model.CrazyBuildShowRangeReward, 0, lens/2)
- // 初始化
- lvRange := model.LvRange{
- LvStart: rewards[0].UserLevel,
- LvEnd: rewards[0].UserLevel,
- }
- for i := 1; i < lens; i++ {
- if Props.PropsStrictEqual(rewards[i].FinalPrize, rewards[i-1].FinalPrize) && Props.PropsStrictEqual(rewards[i].BasicPrize, rewards[i-1].BasicPrize) {
- lvRange.LvEnd = rewards[i].UserLevel
- } else {
- showRangeRewards = append(showRangeRewards, model.CrazyBuildShowRangeReward{
- LvRange: lvRange,
- BasicPrize: rewards[i-1].BasicPrize,
- FinalPrize: rewards[i-1].FinalPrize,
- })
- lvRange = model.LvRange{
- LvStart: rewards[i].UserLevel,
- LvEnd: rewards[i].UserLevel,
- }
- }
- }
- showRangeRewards = append(showRangeRewards, model.CrazyBuildShowRangeReward{
- LvRange: lvRange,
- BasicPrize: rewards[lens-1].BasicPrize,
- FinalPrize: rewards[lens-1].FinalPrize,
- })
- return showRangeRewards
- }
- func (This *actCrazyBuild) parseBaseSheet(sheet [][]string) (showConf model.CrazyBuildShowConf, err error) {
- for i := 0; i < len(sheet); i++ {
- if len(sheet[i]) == 0 || sheet[i][0] != "活动层数" {
- continue
- }
- var ignore string
- if err = utils.DestructAssign(sheet[i], &ignore, &showConf.BasicConf.Layer); err != nil {
- return showConf, errors.WithStack(err)
- }
- }
- return
- }
|