go-common/app/admin/main/creative/service/task.go
2019-04-22 18:49:16 +08:00

925 lines
24 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}