@ -2,6 +2,7 @@ package handler
import (
import (
"fmt"
"fmt"
"gorm.io/gorm/clause"
"math/rand"
"math/rand"
"server/call"
"server/call"
"server/common"
"server/common"
@ -22,74 +23,112 @@ import (
// GetUserTaskStatus 获取任务状态
// GetUserTaskStatus 获取任务状态
func GetUserTaskStatus ( a * app . Gin ) ( ret [ ] * values . OneTask ) {
func GetUserTaskStatus ( a * app . Gin ) ( ret [ ] * values . OneTask ) {
tasks := call . GetConfigTask ( )
userTask := call . GetUserTaskData ( a . UID )
for _ , v := range tasks {
taskCfgs := call . GetConfigTask ( )
one := & values . OneTask {
taskMap := make ( map [ int ] * common . ConfigTaskStr ) // 任务列表
ID : v . ID ,
userTaskMap := make ( map [ int ] * common . TaskData )
TaskID : v . TaskID ,
preTask := make ( map [ int ] struct { } )
Target : v . Target ,
var update bool
Reward : v . Reward ,
for _ , v := range taskCfgs {
Kind : v . Kind ,
taskMap [ v . TaskID ] = & common . ConfigTaskStr {
Type : int ( v . Type ) ,
ConfigTask : v ,
Icon : v . Icon ,
}
Title : common . GetTaskTitle ( v ) ,
if v . PreTaskId > 0 {
Action : v . Action ,
preTask [ v . PreTaskId ] = struct { } { }
}
}
// 非次数任务,需转换目标数值
// if !common.IsNumTaskType(v.Type) {
// one.Target /= common.DecimalDigits
// }
ret = append ( ret , one )
}
}
if a . UID <= 0 {
for _ , v := range userTask {
return
if _ , ok := taskMap [ v . TaskID ] ; ! ok { // 不存在则删除
db . Mysql ( ) . C ( ) . Model ( & common . TaskData { } ) . Where ( "id = ?" , v . ID ) . Delete ( & common . TaskData { } )
update = true
continue
} else {
taskMap [ v . TaskID ] . Exist = true
}
}
}
now := time . Now ( )
for _ , v := range taskMap {
task := call . GetUserTaskData ( a . UID )
if ! v . Exist { // 不存在/失效的 则创建/更新
for _ , v := range ret {
update = true
for _ , k := range task {
task := & common . TaskData {
if v . TaskID == k . TaskID {
UID : a . UID ,
v . Progess = k . Progress
TaskID : v . TaskID ,
taskTime := time . Unix ( k . Time , 0 )
TaskType : int ( v . Type ) ,
// 跨天清空数据
TargetValue : int ( v . Target ) ,
if ! util . IsSameDay ( now , taskTime ) && v . Kind == common . TaskKindDayOne {
TaskValue : 0 ,
v . Status = 0
TaskStatus : 0 ,
v . Progess = 0
EndAt : 0 ,
err := db . Mysql ( ) . Update ( & k , map [ string ] interface { } {
CreatedAt : time . Now ( ) ,
"progress" : 0 ,
UpdatedAt : time . Now ( ) ,
"time" : now . Unix ( ) ,
} )
if err != nil {
log . Error ( "GetUserTaskStatus err:%v" , err )
}
}
break
}
}
}
switch v . Cycle {
if v . Type == int ( common . TaskTypeDownload ) && v . Progess != - 1 { // 已下载直接标记为完成
case 1 :
if a . DeviceType == common . DeviceTypeWebview || a . DeviceType == common . DeviceTypePWA {
task . EndAt = util . GetZeroTime ( time . Now ( ) . AddDate ( 0 , 0 , 1 ) ) . Unix ( )
// 直接领取下载奖励
case 2 :
taskId := call . CheckTask ( call . Task { Uid : a . UID , Value : 0 , Types : [ ] common . TaskType { common . TaskTypeDownload } } )
task . EndAt = util . GetWeekZeroTime ( time . Now ( ) . AddDate ( 0 , 0 , 7 ) ) . Unix ( )
TaskComplete ( a , & DrawTaskReq { TaskID : taskId } )
case 3 :
a . Code = values . CodeOK
task . EndAt = util . GetFirstDateOfMonth ( time . Now ( ) . AddDate ( 0 , 1 , 0 ) ) . Unix ( )
a . Msg = ""
case 4 :
task . EndAt = - 1
}
}
err := db . Mysql ( ) . C ( ) . Model ( & common . TaskData { } ) . Clauses ( clause . OnConflict {
Columns : [ ] clause . Column { { Name : "uid" } , { Name : "task_id" } } ,
DoUpdates : clause . Assignments ( map [ string ] interface { } {
"task_type" : task . TaskType ,
"task_value" : task . TaskValue ,
"target_value" : task . TargetValue ,
"task_status" : task . TaskStatus ,
"end_at" : task . EndAt ,
"updated_at" : task . UpdatedAt ,
} ) ,
} ) . Create ( task ) . Error
if err != nil {
log . Error ( "create task err, %s" , err . Error ( ) )
continue
}
}
}
if update {
userTask = call . GetUserTaskData ( a . UID )
}
for _ , v := range userTask {
userTaskMap [ v . TaskID ] = v
}
ret = make ( [ ] * values . OneTask , 0 , len ( userTask ) )
for _ , v := range userTask {
if taskMap [ v . TaskID ] . PreTaskId > 0 && userTaskMap [ taskMap [ v . TaskID ] . PreTaskId ] . TaskStatus != 2 {
continue
}
if _ , ok := preTask [ v . TaskID ] ; ok && v . TaskStatus == 2 {
continue
}
if v . TaskStatus == 2 {
continue
}
}
// 非次数任务,需转换目标数值
oneTask := & values . OneTask {
// if !common.IsNumTaskType(v.Type) && v.Progess > 0 {
TaskID : v . TaskID ,
// v.Progess /= common.DecimalDigits
Progress : int64 ( v . TaskValue ) ,
// }
Target : taskMap [ v . TaskID ] . Target ,
if v . Progess < 0 {
Reward : taskMap [ v . TaskID ] . Reward ,
v . Progess = v . Target
Cycle : taskMap [ v . TaskID ] . Cycle ,
v . Status = 2
TaskType : int ( taskMap [ v . TaskID ] . Type ) ,
} else if v . Progess >= v . Target {
Status : v . TaskStatus ,
v . Progess = v . Target
Title : taskMap [ v . TaskID ] . Title ,
v . Status = 1
Url : taskMap [ v . TaskID ] . Url ,
Sort : taskMap [ v . TaskID ] . Sort ,
Expand : taskMap [ v . TaskID ] . Expand ,
}
}
if oneTask . Progress >= oneTask . Target && oneTask . Status != 2 {
oneTask . Status = 1
}
ret = append ( ret , oneTask )
}
}
sort . SliceStable ( ret , func ( i , j int ) bool {
sort . SliceStable ( ret , func ( i , j int ) bool {
return ret [ i ] . Status > ret [ j ] . Status
return ret [ i ] . Sort > ret [ j ] . Sort
} )
} )
return
return
}
}
@ -104,15 +143,6 @@ func GetPromotions(c *gin.Context) {
a . GetUID ( )
a . GetUID ( )
ret . ActivityList = call . GetConfigActivityActiveAll ( a . UID )
ret . ActivityList = call . GetConfigActivityActiveAll ( a . UID )
ret . TaskList = GetUserTaskStatus ( a )
ret . TaskList = GetUserTaskStatus ( a )
num := 0
for _ , task := range ret . TaskList {
if task . Status == 1 {
num ++
}
}
if num > 0 {
//call.PushRed(a.UID, pb.RedPointModule_RedPointTask, uint32(num))
}
}
}
func UploadActivityData ( c * gin . Context ) {
func UploadActivityData ( c * gin . Context ) {