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