123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924 |
- package service
- import (
- "fmt"
- "sort"
- "strings"
- "time"
- "go-common/app/admin/main/creative/model/task"
- "go-common/library/ecode"
- "go-common/library/log"
- )
- //TaskGroupRewards for task group & rewards.
- func (s *Service) TaskGroupRewards(ids []int64) (res map[int64][]*task.TaskGroupReward, err error) {
- tgrs := []*task.TaskGroupReward{}
- if err = s.DB.Model(&task.TaskGroupReward{}).Where("task_group_id IN (?)", ids).Where("state>=0").Find(&tgrs).Error; err != nil {
- log.Error("s.TaskGroupRewards ids(%+v) error(%v)", ids, err)
- }
- if len(tgrs) == 0 {
- return
- }
- res = make(map[int64][]*task.TaskGroupReward)
- for _, v := range tgrs {
- if v != nil {
- res[v.TaskGroupID] = append(res[v.TaskGroupID], v)
- }
- }
- return
- }
- func (s *Service) getRewards(rids []int64) (res []*task.RewardResult) {
- _, rewardMap := s.loadRewards()
- if len(rids) == 0 || len(rewardMap) == 0 {
- return
- }
- sort.Slice(rids, func(i, j int) bool {
- return rids[i] < rids[j]
- })
- res = make([]*task.RewardResult, 0, len(rids))
- for _, rid := range rids {
- if v, ok := rewardMap[rid]; ok {
- res = append(res, &task.RewardResult{
- RewardID: v.ID,
- RewardName: v.Name,
- })
- }
- }
- return
- }
- //AddTaskGroup for add task group.
- func (s *Service) AddTaskGroup(v *task.TaskGroup, rewardsIDs []int64) (id int64, err error) {
- now := time.Now().Format("2006-01-02 15:04:05")
- v.CTime = now
- tx := s.DB.Begin()
- v.State = task.StateHide
- if err = tx.Create(v).Error; err != nil {
- log.Error("addGroup error(%v)", err)
- tx.Rollback()
- return
- }
- if err = tx.Model(&task.TaskGroup{}).Where("id=?", v.ID).Updates(map[string]interface{}{
- "rank": v.ID,
- }).Error; err != nil {
- log.Error("addGroup error(%v)", err)
- tx.Rollback()
- return
- }
- if len(rewardsIDs) > 0 {
- valReward := make([]string, 0, len(rewardsIDs))
- valRewardArgs := make([]interface{}, 0)
- for _, rid := range rewardsIDs {
- valReward = append(valReward, "(?, ?, ?, ?, ?, ?)")
- valRewardArgs = append(valRewardArgs, v.ID, rid, task.StateNormal, v.Comment, now, now)
- }
- sqlRewardStr := fmt.Sprintf("INSERT INTO newcomers_grouptask_reward (task_group_id, reward_id, state, comment, ctime, mtime) VALUES %s", strings.Join(valReward, ","))
- if err = tx.Exec(sqlRewardStr, valRewardArgs...).Error; err != nil {
- log.Error("addGroup link reward error(%v)", err)
- tx.Rollback()
- return
- }
- }
- tx.Commit()
- return v.ID, nil
- }
- //EditTaskGroup for edit task group.
- func (s *Service) EditTaskGroup(v *task.TaskGroup, rewardsIDs []int64) (id int64, err error) {
- now := time.Now().Format("2006-01-02 15:04:05")
- tg := &task.TaskGroup{}
- if err = s.DB.Model(&task.TaskGroup{}).Where("id=?", v.ID).Find(tg).Error; err != nil {
- log.Error("EditTaskGroup link reward error(%v)", err)
- return
- }
- if tg == nil {
- return
- }
- tx := s.DB.Begin()
- if err = tx.Model(&task.TaskGroup{}).Where("id=?", v.ID).Updates(map[string]interface{}{
- "root_type": v.RootType,
- "type": v.Type,
- }).Error; err != nil {
- log.Error("editGroup error(%v)", err)
- tx.Rollback()
- return
- }
- if len(rewardsIDs) > 0 {
- var tgr task.TaskGroupReward
- if err = tx.Where("task_group_id =?", v.ID).Delete(&tgr).Error; err != nil {
- log.Error("editGroup delete old group id(%d)|error(%v)", v.ID, err)
- tx.Rollback()
- return
- }
- valReward := make([]string, 0, len(rewardsIDs))
- valRewardArgs := make([]interface{}, 0)
- for _, rid := range rewardsIDs {
- valReward = append(valReward, "(?, ?, ?, ?, ?, ?)")
- valRewardArgs = append(valRewardArgs, v.ID, rid, task.StateNormal, v.Comment, now, now)
- }
- sqlRewardStr := fmt.Sprintf("INSERT INTO newcomers_grouptask_reward (task_group_id, reward_id, state, comment, ctime, mtime) VALUES %s ON DUPLICATE KEY UPDATE task_group_id=VALUES(task_group_id), reward_id=VALUES(reward_id)", strings.Join(valReward, ","))
- if err = tx.Exec(sqlRewardStr, valRewardArgs...).Error; err != nil {
- log.Error("editGroup link reward error(%v)", err)
- tx.Rollback()
- return
- }
- }
- tx.Commit()
- return v.ID, nil
- }
- //OrderTaskGroup for order task group.
- func (s *Service) OrderTaskGroup(v *task.OrderTask) (err error) {
- tg := &task.TaskGroup{}
- if err = s.DB.Find(tg, v.ID).Error; err != nil {
- log.Error("orderGroup error(%v)", err)
- return
- }
- stg := &task.TaskGroup{}
- if err = s.DB.Find(stg, v.SwitchID).Error; err != nil {
- log.Error("orderGroup error(%v)", err)
- return
- }
- tx := s.DB.Begin()
- if err = tx.Model(&task.TaskGroup{}).Where("id=?", v.ID).Updates(
- map[string]interface{}{
- "rank": v.SwitchRank,
- },
- ).Error; err != nil {
- log.Error("orderGroup error(%v)", err)
- tx.Rollback()
- return
- }
- if err = tx.Model(&task.TaskGroup{}).Where("id=?", v.SwitchID).Updates(
- map[string]interface{}{
- "rank": v.Rank,
- },
- ).Error; err != nil {
- log.Error("orderGroup error(%v)", err)
- tx.Rollback()
- return
- }
- tx.Commit()
- return
- }
- //UpStateGroup for update task group.
- func (s *Service) UpStateGroup(id int64, state int8) (err error) {
- tg := &task.TaskGroup{}
- if err = s.DB.Find(tg, id).Error; err != nil {
- log.Error("UpStateGroup id(%d) error(%v)", id, err)
- return
- }
- if tg.ID == 0 {
- err = ecode.NothingFound
- return
- }
- if err = s.DB.Model(&task.TaskGroup{}).Where("id=?", id).Updates(map[string]interface{}{
- "state": state,
- }).Error; err != nil {
- log.Error("UpStateGroup id(%d) state(%d) error(%v)", id, state, err)
- return
- }
- return
- }
- //TaskGroup for task group.
- func (s *Service) TaskGroup(id int64) (res *task.TaskGroup, err error) {
- var tg task.TaskGroup
- if err = s.DB.Model(&task.TaskGroup{}).Where("id=?", id).Find(&tg).Error; err != nil {
- log.Error("s.TaskGroup id (%d) error(%v)", id, err)
- return
- }
- if tg.ID == 0 {
- return
- }
- tgrsMap, _ := s.TaskGroupRewards([]int64{id})
- if rs, ok := tgrsMap[id]; ok {
- rids := make([]int64, 0, len(rs))
- for _, r := range rs {
- if r != nil {
- rids = append(rids, r.RewardID)
- }
- }
- tg.Reward = s.getRewards(rids)
- }
- res = &tg
- return
- }
- //AddSubtask for add sub task.
- func (s *Service) AddSubtask(v *task.Task, rewardsIDs []int64) (id int64, err error) {
- now := time.Now().Format("2006-01-02 15:04:05")
- v.CTime = now
- v.MTime = now
- v.State = task.StateHide
- tx := s.DB.Begin()
- if err = tx.Create(v).Error; err != nil {
- log.Error("AddSubtask error(%v)", err)
- tx.Rollback()
- return
- }
- if v.ID == 0 {
- log.Error("AddSubtask v.ID(%d)", v.ID)
- tx.Rollback()
- return
- }
- if err = tx.Model(&task.Task{}).Where("id=?", v.ID).Updates(map[string]interface{}{
- "rank": v.ID,
- }).Error; err != nil {
- log.Error("AddSubtask error(%v)", err)
- tx.Rollback()
- return
- }
- if len(rewardsIDs) > 0 {
- valReward := make([]string, 0, len(rewardsIDs))
- valRewardArgs := make([]interface{}, 0)
- for _, rid := range rewardsIDs {
- valReward = append(valReward, "(?, ?, ?, ?, ?, ?)")
- valRewardArgs = append(valRewardArgs, v.ID, rid, task.StateNormal, v.Comment, now, now)
- }
- sqlRewardStr := fmt.Sprintf("INSERT INTO newcomers_task_reward (task_id, reward_id, state, comment, ctime, mtime) VALUES %s", strings.Join(valReward, ","))
- if err = tx.Exec(sqlRewardStr, valRewardArgs...).Error; err != nil {
- log.Error("AddSubtask link reward error(%v)", err)
- tx.Rollback()
- return
- }
- }
- tx.Commit()
- return v.ID, nil
- }
- //EditSubtask for edit sub task.
- func (s *Service) EditSubtask(v *task.Task, rewardsIDs []int64) (id int64, err error) {
- tk := &task.Task{}
- if err = s.DB.Model(&task.TaskGroup{}).Where("id=?", v.ID).Find(tk).Error; err != nil {
- return
- }
- if tk == nil {
- err = ecode.NothingFound
- return
- }
- now := time.Now().Format("2006-01-02 15:04:05")
- v.CTime = tk.CTime
- v.MTime = now
- v.State = tk.State //编辑不更新状态
- tx := s.DB.Begin()
- if err = tx.Save(v).Error; err != nil { //Save将包括执行更新SQL时的所有字段,即使它没有更改
- log.Error("editSubtask error(%v)", err)
- tx.Rollback()
- return
- }
- if len(rewardsIDs) > 0 {
- var tr task.TaskReward
- if err = tx.Where("task_id =?", v.ID).Delete(&tr).Error; err != nil {
- log.Error("editSubtask delete old task id(%d)|error(%v)", v.ID, err)
- tx.Rollback()
- return
- }
- valReward := make([]string, 0, len(rewardsIDs))
- valRewardArgs := make([]interface{}, 0)
- for _, rid := range rewardsIDs {
- valReward = append(valReward, "(?, ?, ?, ?, ?, ?)")
- valRewardArgs = append(valRewardArgs, v.ID, rid, task.StateNormal, v.Comment, now, now)
- }
- sqlRewardStr := fmt.Sprintf("INSERT INTO newcomers_task_reward (task_id, reward_id, state, comment, ctime, mtime) VALUES %s ON DUPLICATE KEY UPDATE task_id=VALUES(task_id), reward_id=VALUES(reward_id)", strings.Join(valReward, ","))
- if err = tx.Exec(sqlRewardStr, valRewardArgs...).Error; err != nil {
- log.Error("editSubtask link reward error(%v)", err)
- tx.Rollback()
- return
- }
- }
- tx.Commit()
- return v.ID, nil
- }
- //OrderSubTask for order sub task.
- func (s *Service) OrderSubTask(v *task.OrderTask) (err error) {
- tg := &task.Task{}
- if err = s.DB.Find(tg, v.ID).Error; err != nil {
- log.Error("OrderSubTask error(%v)", err)
- return
- }
- stg := &task.Task{}
- if err = s.DB.Find(stg, v.SwitchID).Error; err != nil {
- log.Error("OrderSubTask error(%v)", err)
- return
- }
- tx := s.DB.Begin()
- if err = tx.Model(&task.Task{}).Where("id=?", v.ID).Updates(
- map[string]interface{}{
- "rank": v.SwitchRank,
- },
- ).Error; err != nil {
- log.Error("OrderSubTask error(%v)", err)
- tx.Rollback()
- return
- }
- if err = tx.Model(&task.Task{}).Where("id=?", v.SwitchID).Updates(
- map[string]interface{}{
- "rank": v.Rank,
- },
- ).Error; err != nil {
- log.Error("OrderSubTask error(%v)", err)
- tx.Rollback()
- return
- }
- tx.Commit()
- return
- }
- //UpStateSubTask for update sub task state.
- func (s *Service) UpStateSubTask(id int64, state int8) (err error) {
- tg := &task.Task{}
- if err = s.DB.Find(tg, id).Error; err != nil {
- return
- }
- if tg.ID == 0 {
- err = ecode.NothingFound
- return
- }
- if err = s.DB.Model(&task.Task{}).Where("id=?", id).Updates(map[string]interface{}{
- "state": state,
- }).Error; err != nil {
- log.Error("UpStateSubTask id(%d) state(%d) error(%v)", id, state, err)
- return
- }
- return
- }
- //TransferSubtask for transfer one sub task from some one group to another one.
- func (s *Service) TransferSubtask(id, gid int64) (err error) {
- tg := &task.TaskGroup{}
- if err = s.DB.Find(tg, gid).Error; err != nil {
- return
- }
- if tg.ID == 0 {
- err = ecode.CreativeNewcomerGroupIDErr
- return
- }
- tk := &task.Task{}
- if err = s.DB.Find(tk, id).Error; err != nil {
- return
- }
- if tk.ID == 0 {
- err = ecode.NothingFound
- return
- }
- if err = s.DB.Model(&task.Task{}).Where("id=?", id).Updates(map[string]interface{}{
- "group_id": gid,
- }).Error; err != nil {
- log.Error("transferSubtask id(%+v) gid(%d) error(%v)", id, gid, err)
- return
- }
- return
- }
- //Task for task.
- func (s *Service) Task(id int64) (res *task.Task, err error) {
- var t task.Task
- if err = s.DB.Model(&task.Task{}).Where("id=?", id).Find(&t).Error; err != nil {
- log.Error("s.Task id (%d) error(%v)", id, err)
- return
- }
- if t.ID == 0 {
- return
- }
- trsMap, _ := s.TaskRewards([]int64{id})
- if rs, ok := trsMap[id]; ok {
- rids := make([]int64, 0, len(rs))
- for _, r := range rs {
- if r != nil {
- rids = append(rids, r.RewardID)
- }
- }
- t.Reward = s.getRewards(rids)
- }
- res = &t
- return
- }
- //TaskRewards for task & rewards.
- func (s *Service) TaskRewards(ids []int64) (res map[int64][]*task.TaskReward, err error) {
- trs := []*task.TaskReward{}
- if err = s.DB.Model(&task.TaskReward{}).Where("state>=0 AND task_id IN (?)", ids).Find(&trs).Error; err != nil {
- log.Error("s.TaskRewards ids(%+v) error(%v)", ids, err)
- return
- }
- if len(trs) == 0 {
- return
- }
- res = make(map[int64][]*task.TaskReward)
- for _, v := range trs {
- if v != nil {
- res[v.TaskID] = append(res[v.TaskID], v)
- }
- }
- return
- }
- //TasksByGroupIDsMap for task map
- func (s *Service) TasksByGroupIDsMap(gids []int64) (res map[int64][]*task.Task, err error) {
- tks := []*task.Task{}
- if err = s.DB.Model(&task.Task{}).Where("state>=0 AND type>0 AND group_id IN (?)", gids).Find(&tks).Error; err != nil {
- log.Error("s.TasksByGroupIDsMap id (%+v) error(%v)", gids, err)
- return
- }
- if len(tks) == 0 {
- return
- }
- tkMap := make(map[int64]*task.Task)
- tgMap := make(map[int64][]*task.Task)
- ids := make([]int64, 0, len(tks))
- for _, v := range tks {
- if v == nil {
- continue
- }
- if v.Rank == 0 {
- v.Rank = v.ID
- }
- ids = append(ids, v.ID)
- tkMap[v.ID] = v
- tgMap[v.GroupID] = append(tgMap[v.GroupID], v)
- }
- trsMap, _ := s.TaskRewards(ids)
- for _, id := range ids {
- rs, ok := trsMap[id]
- if !ok || len(rs) == 0 {
- continue
- }
- rids := make([]int64, 0, len(rs))
- for _, r := range rs {
- if r != nil {
- rids = append(rids, r.RewardID)
- }
- }
- tkMap[id].Reward = s.getRewards(rids)
- }
- res = make(map[int64][]*task.Task)
- for _, gid := range gids {
- tks, ok := tgMap[gid]
- if !ok || len(tks) == 0 {
- continue
- }
- for _, tk := range tks {
- if v, ok := tkMap[tk.ID]; ok {
- res[gid] = append(res[gid], v)
- }
- }
- }
- for _, v := range res {
- sort.Slice(v, func(i, j int) bool {
- return v[i].Rank < v[j].Rank
- })
- }
- return
- }
- //TaskList for task list
- func (s *Service) TaskList(ty int8) (res []*task.TaskGroup, err error) {
- tgs := []*task.TaskGroup{}
- db := s.DB.Model(&task.TaskGroup{}).Where("state>=0 AND root_type>0 AND type>0")
- if ty > 0 {
- db = db.Where("type=?", ty)
- }
- if err = db.Find(&tgs).Error; err != nil {
- log.Error("TaskList %v\n", err)
- return
- }
- if len(tgs) == 0 {
- return
- }
- gids := make([]int64, 0, len(tgs))
- tgMap := make(map[int64]*task.TaskGroup)
- for _, v := range tgs {
- if v == nil {
- continue
- }
- gids = append(gids, v.ID)
- tgMap[v.ID] = v
- }
- tgrsMap, _ := s.TaskGroupRewards(gids)
- for _, id := range gids {
- if rs, ok := tgrsMap[id]; ok {
- if len(rs) == 0 {
- continue
- }
- rids := make([]int64, 0, len(rs))
- for _, r := range rs {
- if r != nil {
- rids = append(rids, r.RewardID)
- }
- }
- tgMap[id].Reward = s.getRewards(rids)
- }
- }
- tkMap, _ := s.TasksByGroupIDsMap(gids)
- res = tgs
- for _, v := range res {
- if v == nil {
- continue
- }
- if g, ok := tgMap[v.ID]; ok {
- v.Reward = g.Reward
- }
- if tks, ok := tkMap[v.ID]; ok {
- v.Tasks = tks
- }
- }
- sort.Slice(res, func(i, j int) bool {
- return res[i].Rank < res[j].Rank
- })
- return
- }
- //loadRewards for task reward.
- func (s *Service) loadRewards() (res []*task.Reward, rwMap map[int64]*task.Reward) {
- var (
- rds = []*task.Reward{}
- err error
- )
- if err = s.DB.Order("id ASC").Find(&rds).Error; err != nil {
- log.Error("loadRewards error(%v)", err)
- return
- }
- res = make([]*task.Reward, 0, len(rds))
- rwMap = make(map[int64]*task.Reward)
- top := make(map[int64]*task.Reward)
- for _, v := range rds {
- if v == nil {
- continue
- }
- rwMap[v.ID] = v
- if v.ParentID == 0 {
- top[v.ID] = v //映射一级对象
- res = append(res, v) //追加一级对象
- }
- }
- for _, ch := range rds {
- if ch == nil {
- continue
- }
- if p, ok := top[ch.ParentID]; ok && p != nil && p.Type == ch.Type { //为一级对象增加子对象,注:要append满足条件的ch,若append p 则会造成递归导致stack overflow
- p.Children = append(p.Children, ch)
- }
- }
- return
- }
- //RewardTree for reward tree.
- func (s *Service) RewardTree() (res []*task.Reward) {
- res, _ = s.loadRewards()
- return
- }
- //ViewReward for view one reward.
- func (s *Service) ViewReward(id int64) (res *task.Reward, err error) {
- rd := task.Reward{}
- if err = s.DB.Model(&task.Reward{}).Where("id=?", id).Find(&rd).Error; err != nil {
- return
- }
- res = &rd
- return
- }
- //AddReward for add one reward.
- func (s *Service) AddReward(v *task.Reward) (id int64, err error) {
- now := time.Now().Format("2006-01-02 15:04:05")
- v.CTime = now
- v.MTime = now
- if err = s.DB.Create(v).Error; err != nil {
- log.Error("AddReward v(%+v) error(%v)", v, err)
- return
- }
- return v.ID, nil
- }
- //EditReward for edit one reward.
- func (s *Service) EditReward(v *task.Reward) (id int64, err error) {
- rd := &task.Reward{}
- if err = s.DB.Model(&task.Reward{}).Where("id=?", v.ID).Find(rd).Error; err != nil {
- return
- }
- if rd == nil {
- err = ecode.NothingFound
- return
- }
- v.CTime = rd.CTime
- v.MTime = time.Now().Format("2006-01-02 15:04:05")
- v.State = rd.State //编辑不更新状态
- if err = s.DB.Save(v).Error; err != nil {
- log.Error("EditReward v(%+v) error(%v)", v, err)
- return
- }
- return v.ID, nil
- }
- //UpStateReward for update reward state.
- func (s *Service) UpStateReward(id int64, state int8) (err error) {
- rd := &task.Reward{}
- if err = s.DB.Find(rd, id).Error; err != nil {
- return
- }
- if rd.ID == 0 {
- err = ecode.NothingFound
- return
- }
- if rd.ParentID != 0 { //如果是子分类直接更新并返回
- if err = s.DB.Model(&task.Reward{}).Where("id=?", id).Updates(map[string]interface{}{
- "state": state,
- }).Error; err != nil {
- log.Error("UpStateReward parent id(%d) state(%d) error(%v)", id, state, err)
- }
- return
- }
- rds := []*task.Reward{}
- if err = s.DB.Model(&task.Reward{}).Where("parent_id=?", id).Find(&rds).Error; err != nil {
- log.Error("UpStateReward get childen by parent id(%d) error(%v)", rd.ParentID, err)
- return
- }
- ids := make([]int64, 0, len(rds)+1)
- for _, v := range rds {
- if v != nil {
- ids = append(ids, v.ID) //追加子分类id
- }
- }
- ids = append(ids, id) //追加父分类id
- if err = s.DB.Model(&task.Reward{}).Where("id IN (?)", ids).Updates(map[string]interface{}{
- "state": state,
- }).Error; err != nil {
- log.Error("UpStateReward childen ids(%+v) error(%v)", ids, err)
- }
- return
- }
- //ViewGiftReward for view gift.
- func (s *Service) ViewGiftReward(v *task.GiftReward) (res *task.GiftReward, err error) {
- var gfs []*task.GiftReward
- if err = s.DB.Model(&task.GiftReward{}).Where("root_type=? AND task_type=?", v.RootType, v.TaskType).Find(&gfs).Error; err != nil {
- log.Error("ViewGiftReward v(%+v) error(%v)", v, err)
- return
- }
- if len(gfs) == 0 {
- return
- }
- res = &task.GiftReward{
- RootType: v.RootType,
- TaskType: v.TaskType,
- }
- var (
- state int8
- comment string
- )
- rids := make([]int64, 0, len(gfs))
- for _, gf := range gfs {
- if gf != nil {
- state = gf.State
- comment = gf.Comment
- rids = append(rids, gf.RewardID)
- }
- }
- res.State = state
- res.Comment = comment
- res.Reward = s.getRewards(rids)
- return
- }
- //ListGiftReward for get gift list.
- func (s *Service) ListGiftReward() (res []*task.GiftReward, err error) {
- gfs := []*task.GiftReward{}
- if err = s.DB.Model(&task.GiftReward{}).Where("root_type>0 AND task_type>0").Find(&gfs).Error; err != nil {
- log.Error("ListGiftReward error(%v)", err)
- return
- }
- if len(gfs) == 0 {
- return
- }
- gfMap := make(map[int64][]*task.GiftReward)
- for _, v := range gfs {
- if v != nil {
- gfMap[v.TaskType] = append(gfMap[v.TaskType], v)
- }
- }
- tys := make([]int64, 0, len(gfMap))
- for k := range gfMap {
- tys = append(tys, k)
- }
- sort.Slice(tys, func(i, j int) bool {
- return tys[i] < tys[j]
- })
- res = make([]*task.GiftReward, 0, len(tys))
- for _, ty := range tys {
- gfs, ok := gfMap[ty]
- if !ok && len(gfs) == 0 {
- continue
- }
- var rt uint8
- if task.CheckRootType(uint8(ty)) {
- rt = task.TaskManagement
- } else {
- rt = task.AchievementManagement
- }
- re := &task.GiftReward{
- RootType: rt,
- TaskType: ty,
- }
- var (
- state int8
- comment string
- )
- rids := make([]int64, 0, len(gfs))
- for _, gf := range gfs {
- if gf != nil {
- state = gf.State
- comment = gf.Comment
- rids = append(rids, gf.RewardID)
- }
- }
- re.State = state
- re.Comment = comment
- re.Reward = s.getRewards(rids)
- res = append(res, re)
- }
- return
- }
- //AddGiftReward for add gift rewards.
- func (s *Service) AddGiftReward(v *task.GiftReward, rewardsIDs []int64) (rows int64, err error) {
- var gfs []*task.GiftReward
- if err = s.DB.Model(&task.GiftReward{}).Where("root_type=? AND task_type=? AND reward_id IN (?)", v.RootType, v.TaskType, rewardsIDs).Find(&gfs).Error; err != nil {
- log.Error("UpGiftReward v(%+v) error(%v)", v, err)
- return
- }
- if len(gfs) != 0 {
- hitMap := make(map[int64]struct{})
- for _, gf := range gfs {
- hitMap[gf.RewardID] = struct{}{}
- }
- for _, rid := range rewardsIDs {
- if _, ok := hitMap[rid]; ok {
- err = ecode.CreativeNewcomerDuplicateGiftRewardIDErr
- log.Error("AddGiftReward rid(%d) error(%v)", rid, err)
- return
- }
- }
- }
- valReward := make([]string, 0, len(rewardsIDs))
- valRewardArgs := make([]interface{}, 0)
- now := time.Now().Format("2006-01-02 15:04:05")
- for _, rid := range rewardsIDs {
- valReward = append(valReward, "(?, ?, ?, ?, ?, ?, ?)")
- valRewardArgs = append(valRewardArgs, v.RootType, v.TaskType, rid, task.StateNormal, v.Comment, now, now)
- }
- sqlRewardStr := fmt.Sprintf("INSERT INTO newcomers_gift_reward (root_type, task_type, reward_id, state, comment, ctime, mtime) VALUES %s", strings.Join(valReward, ","))
- if err = s.DB.Exec(sqlRewardStr, valRewardArgs...).Error; err != nil {
- log.Error("AddGiftReward error(%v)", err)
- return
- }
- return s.DB.RowsAffected, nil
- }
- //EditGiftReward for edit gift rewards.
- func (s *Service) EditGiftReward(v *task.GiftReward, rewardsIDs []int64) (rows int64, err error) {
- var (
- gfs []*task.GiftReward
- state int8
- )
- if err = s.DB.Model(&task.GiftReward{}).Where("root_type=? AND task_type=?", v.RootType, v.TaskType).Find(&gfs).Error; err != nil {
- log.Error("EditGiftReward v(%+v) error(%v)", v, err)
- return
- }
- if len(gfs) == 0 {
- err = ecode.NothingFound
- return
- }
- for _, gf := range gfs { //获取原来的状态
- state = gf.State
- break
- }
- var gf task.GiftReward
- if err = s.DB.Model(&task.GiftReward{}).Where("root_type =?", v.RootType).Where("task_type =?", v.TaskType).Delete(&gf).Error; err != nil {
- log.Error("EditGiftReward delete old id(%d)|error(%v)", v.ID, err)
- return
- }
- valReward := make([]string, 0, len(rewardsIDs))
- valRewardArgs := make([]interface{}, 0)
- now := time.Now().Format("2006-01-02 15:04:05")
- for _, rid := range rewardsIDs {
- valReward = append(valReward, "(?, ?, ?, ?, ?, ?, ?)")
- valRewardArgs = append(valRewardArgs, v.RootType, v.TaskType, rid, state, v.Comment, now, now)
- }
- sqlRewardStr := fmt.Sprintf("INSERT INTO newcomers_gift_reward (root_type, task_type, reward_id, state, comment, ctime, mtime) VALUES %s", strings.Join(valReward, ","))
- if err = s.DB.Exec(sqlRewardStr, valRewardArgs...).Error; err != nil {
- log.Error("EditGiftReward error(%v)", err)
- return
- }
- return s.DB.RowsAffected, nil
- }
- //UpGiftReward for update gift reward.
- func (s *Service) UpGiftReward(v *task.GiftReward) (rows int64, err error) {
- var gfs []*task.GiftReward
- if err = s.DB.Model(&task.GiftReward{}).Where("root_type=? AND task_type=?", v.RootType, v.TaskType).Find(&gfs).Error; err != nil {
- log.Error("UpGiftReward v(%+v) error(%v)", v, err)
- return
- }
- if len(gfs) == 0 {
- return
- }
- if err = s.DB.Model(&task.GiftReward{}).Where("root_type=? AND task_type=?", v.RootType, v.TaskType).Updates(map[string]interface{}{
- "state": v.State,
- }).Error; err != nil {
- log.Error("UpGiftReward v(%+v) error(%v)", v, err)
- return
- }
- return s.DB.RowsAffected, nil
- }
- //BatchOnline for subtask & grouptask with state,rank and so on.
- func (s *Service) BatchOnline(tgs []*task.TaskGroup) (err error) {
- tasks := make([]*task.Task, 0)
- groups := make([]*task.TaskGroup, 0, len(tgs))
- for _, v := range tgs {
- groups = append(groups, &task.TaskGroup{
- ID: v.ID,
- Rank: v.Rank,
- State: v.State,
- RootType: v.RootType,
- Type: v.Type,
- })
- tasks = append(tasks, v.Tasks...)
- }
- valGroups := make([]string, 0, len(groups))
- valGroupArgs := make([]interface{}, 0)
- for _, v := range groups {
- valGroups = append(valGroups, "(?, ?, ?)")
- valGroupArgs = append(valGroupArgs, v.ID, v.State, v.Rank)
- }
- sqlGroupStr := fmt.Sprintf("INSERT INTO newcomers_task_group (id, state, rank) VALUES %s ON DUPLICATE KEY UPDATE state=VALUES(state), rank=VALUES(rank)", strings.Join(valGroups, ","))
- if err = s.DB.Exec(sqlGroupStr, valGroupArgs...).Error; err != nil {
- log.Error("BatchOnline update groups error(%v)", err)
- return
- }
- valTasks := make([]string, 0, len(tasks))
- valTaskArgs := make([]interface{}, 0)
- for _, v := range tasks {
- valTasks = append(valTasks, "(?, ?, ?, ?)")
- valTaskArgs = append(valTaskArgs, v.ID, v.State, v.Rank, v.GroupID)
- }
- sqlTaskStr := fmt.Sprintf("INSERT INTO newcomers_task (id, state, rank, group_id) VALUES %s ON DUPLICATE KEY UPDATE state=VALUES(state), rank=VALUES(rank), group_id=VALUES(group_id)", strings.Join(valTasks, ","))
- if err = s.DB.Exec(sqlTaskStr, valTaskArgs...).Error; err != nil {
- log.Error("BatchOnline update tasks error(%v)", err)
- }
- return
- }
|