go-common/app/admin/main/creative/service/task.go

925 lines
24 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
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
}