@@ -0,0 +1,452 @@
|
||||
package taskrecordmod
|
||||
|
||||
import (
|
||||
"91porn-server/common/db"
|
||||
"91porn-server/common/log"
|
||||
"91porn-server/common/timeutil"
|
||||
"91porn-server/models"
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/bson/primitive"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
)
|
||||
|
||||
const table = models.Task
|
||||
|
||||
func coll(t *db.MongoTool) *db.MongoTool {
|
||||
if t == nil {
|
||||
return mdb.Coll(table)
|
||||
}
|
||||
return t.Coll(table)
|
||||
}
|
||||
|
||||
// initIndex 索引设置
|
||||
func initIndex() {
|
||||
many := []mongo.IndexModel{ //batch set indexes //value is the type 1 or -1
|
||||
{
|
||||
Keys: bson.D{{"createdAt", -1}},
|
||||
},
|
||||
{
|
||||
Keys: bson.D{{Key: "uid", Value: -1}, {Key: "taskId", Value: -1}, {Key: "recordTime", Value: -1}},
|
||||
},
|
||||
}
|
||||
_, err := coll(nil).CreateIndex(many)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("user model set index err ==>[%+v]", err))
|
||||
}
|
||||
}
|
||||
|
||||
func Init() {
|
||||
mdb = db.Init(table)
|
||||
initIndex()
|
||||
}
|
||||
|
||||
func InsertOne(cfg Task) error {
|
||||
if _, err := coll(nil).InsertOne(cfg); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 添加任务记录
|
||||
func AddTaskRecord(uid uint64) (taskRecord *Task, err error) {
|
||||
now := time.Now()
|
||||
receiveTime := timeutil.BeginningOfDay(now)
|
||||
taskRecord = &Task{
|
||||
UID: uid,
|
||||
SignRecord: []primitive.ObjectID{},
|
||||
SignTime: receiveTime,
|
||||
JewelBoxRecord: []primitive.ObjectID{},
|
||||
JewelBoxReceiveTime: receiveTime,
|
||||
ConsumerFeedbackRecord: []primitive.ObjectID{},
|
||||
ConsumerFeedbackReceiveTime: receiveTime,
|
||||
CreateTime: now,
|
||||
}
|
||||
if _, err = coll(nil).InsertOne(&taskRecord); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func InsertTask(t *db.MongoTool, filter bson.M, update bson.M) error {
|
||||
var item *Task
|
||||
if err := coll(t).FindOneAndUpsert(&item, filter, bson.M{"$set": update}); err != nil {
|
||||
log.Error(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "InsertTask", table, "FindOneAndUpsert", err),
|
||||
log.Any("filter", filter),
|
||||
log.Any("update", update),
|
||||
)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// CurrentCountUpdate 评论值更新
|
||||
func CurrentCountUpdate(t *db.MongoTool, filter bson.M) error {
|
||||
_, err := coll(t).UpdateOne(filter, bson.M{"$inc": bson.M{"count": 1}})
|
||||
if err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CurrentCountUpdate", models.Task, "UpdateOne", err),
|
||||
log.Any("filter", filter),
|
||||
)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func GetByUID(uid uint64) (*Task, error) {
|
||||
var out Task
|
||||
if err := coll(nil).FindOne(&out, bson.M{"uid": uid}); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "GetByUID", models.Task, "FindOne", err),
|
||||
log.Any("uid", uid),
|
||||
)
|
||||
return nil, err
|
||||
}
|
||||
if out.ID.IsZero() {
|
||||
return nil, nil
|
||||
}
|
||||
return &out, nil
|
||||
}
|
||||
|
||||
// SignUpdate 签到更新
|
||||
func SignUpdate(t *db.MongoTool, uid uint64, taskID primitive.ObjectID) error {
|
||||
update := bson.M{
|
||||
"$set": bson.M{"signTime": time.Now()},
|
||||
"$addToSet": bson.M{"signRecord": taskID},
|
||||
}
|
||||
result, err := coll(t).UpdateOne(bson.M{"uid": uid}, update)
|
||||
if err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "SignUpdate", models.Task, "UpdateOne", err),
|
||||
log.Any("uid", uid),
|
||||
)
|
||||
return err
|
||||
}
|
||||
if result.ModifiedCount == 0 {
|
||||
err = errors.New("task UpdateOne ModifiedCount err")
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "SignUpdate", models.Task, "result.ModifiedCount == 0", err),
|
||||
log.Any("uid", uid),
|
||||
log.Any("addToSet", taskID),
|
||||
)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 活跃值更新
|
||||
func CurrentValueUpdate(t *db.MongoTool, uid uint64, currentValue int64) error {
|
||||
result, err := coll(t).UpdateOne(bson.M{"uid": uid}, bson.M{"$inc": bson.M{"currentValue": currentValue}})
|
||||
if err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CurrentValueUpdate", models.Task, "UpdateOne", err),
|
||||
log.Any("uid", uid),
|
||||
log.Any("currentValue", currentValue),
|
||||
)
|
||||
return err
|
||||
}
|
||||
if result.ModifiedCount == 0 {
|
||||
err = errors.New("task UpdateOne ModifiedCount err")
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "CurrentValueUpdate", models.Task, "result.ModifiedCount == 0", err),
|
||||
log.Any("uid", uid),
|
||||
log.Any("currentValue", currentValue),
|
||||
)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 签到重置
|
||||
func SignReset(uid uint64) (out *Task, err error) {
|
||||
now := timeutil.BeginningOfDay(time.Now())
|
||||
if err = coll(nil).FindOneAndUpdate(&out, bson.M{"uid": uid}, bson.M{
|
||||
"$set": bson.M{
|
||||
"currentValue": 0,
|
||||
"signTime": now,
|
||||
"jewelBoxRecord": []primitive.ObjectID{},
|
||||
"jewelBoxReceiveTime": now,
|
||||
"signRecord": []primitive.ObjectID{},
|
||||
},
|
||||
}); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "SignReset", models.Task, "FindOneAndUpdate", err),
|
||||
log.Any("uid", uid),
|
||||
)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 消费返利重置
|
||||
func ConsumerFeedbackReset(uid uint64) (out *Task, err error) {
|
||||
now := timeutil.BeginningOfDay(time.Now())
|
||||
err = coll(nil).FindOneAndUpdate(&out, bson.M{"uid": uid}, bson.M{
|
||||
"$set": bson.M{
|
||||
"consumerFeedbackRecord": []primitive.ObjectID{},
|
||||
"consumerFeedbackReceiveTime": now,
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "ConsumerFeedbackReset", models.Task, "FindOneAndUpdate", err),
|
||||
log.Any("uid", uid),
|
||||
)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 充值有礼重置
|
||||
func ChessRechargePoliteReset(uid uint64) (out *Task, err error) {
|
||||
now := timeutil.BeginningOfDay(time.Now())
|
||||
if err = coll(nil).FindOneAndUpdate(&out, bson.M{"uid": uid}, bson.M{
|
||||
"$set": bson.M{
|
||||
"chessRechargePoliteRecord": []primitive.ObjectID{},
|
||||
"chessRechargePoliteReceiveTime": now,
|
||||
},
|
||||
}); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "ConsumerFeedbackReset", models.Task, "FindOneAndUpdate", err),
|
||||
log.Any("uid", uid),
|
||||
)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// 福利记录更新
|
||||
func BoonRecordUpdate(t *db.MongoTool, uid uint64, taskID primitive.ObjectID, configType ConfigType) error {
|
||||
update := bson.M{
|
||||
"$set": bson.M{"signTime": time.Now()},
|
||||
}
|
||||
switch configType {
|
||||
case Sign:
|
||||
update["$addToSet"] = bson.M{"signRecord": taskID}
|
||||
update["$set"] = bson.M{"signTime": time.Now()}
|
||||
case JewelBox:
|
||||
update["$addToSet"] = bson.M{"jewelBoxRecord": taskID}
|
||||
update["$set"] = bson.M{"jewelBoxReceiveTime": time.Now()}
|
||||
case ConsumerFeedback:
|
||||
update["$addToSet"] = bson.M{"consumerFeedbackRecord": taskID}
|
||||
update["$set"] = bson.M{"consumerFeedbackReceiveTime": time.Now()}
|
||||
}
|
||||
result, err := coll(t).UpdateOne(bson.M{"uid": uid}, update)
|
||||
if err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "SignUpdate", models.Task, "UpdateOne", err),
|
||||
log.Any("uid", uid),
|
||||
)
|
||||
return err
|
||||
}
|
||||
if result.ModifiedCount == 0 {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail", "SignUpdate", models.Task, "result.ModifiedCount == 0"),
|
||||
log.Any("uid", uid),
|
||||
log.Any("addToSet", taskID),
|
||||
)
|
||||
return errors.New("task UpdateOne ModifiedCount err")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// 是否完成一次性任务
|
||||
func IsOnceTaskComplete(t *db.MongoTool, uid uint64, taskId primitive.ObjectID) (bool, error) {
|
||||
var tsk Task
|
||||
if err := coll(t).FindOne(&tsk, bson.M{"uid": uid, "type": OnceTask}); err != nil {
|
||||
return false, err
|
||||
}
|
||||
if tsk.ID.IsZero() {
|
||||
return false, nil
|
||||
}
|
||||
for _, v := range tsk.OnceTask {
|
||||
if taskId == v {
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
return false, nil
|
||||
}
|
||||
|
||||
// IsDownloadTaskComplete 是否完成一次性任务 - 下载任务
|
||||
func IsDownloadTaskComplete(t *db.MongoTool, uid uint64, taskId primitive.ObjectID) (int, error) {
|
||||
var tsk Task
|
||||
if err := coll(t).FindOne(&tsk, bson.M{"uid": uid, "taskId": taskId}); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if tsk.ID.IsZero() {
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
return tsk.Status, nil
|
||||
}
|
||||
|
||||
func CompleteOnceTask(t *db.MongoTool, uid uint64, taskId primitive.ObjectID) error {
|
||||
var tsk Task
|
||||
if err := coll(t).FindOne(&tsk, bson.M{"uid": uid, "type": OnceTask}); err != nil {
|
||||
return err
|
||||
}
|
||||
now := time.Now()
|
||||
if tsk.ID.IsZero() {
|
||||
receiveTime := timeutil.BeginningOfDay(now)
|
||||
_, err := coll(t).InsertOne(&Task{
|
||||
UID: uid,
|
||||
Type: OnceTask,
|
||||
SignRecord: []primitive.ObjectID{},
|
||||
SignTime: receiveTime,
|
||||
JewelBoxRecord: []primitive.ObjectID{},
|
||||
JewelBoxReceiveTime: receiveTime,
|
||||
ConsumerFeedbackRecord: []primitive.ObjectID{},
|
||||
ConsumerFeedbackReceiveTime: receiveTime,
|
||||
OnceTask: []primitive.ObjectID{taskId},
|
||||
CreateTime: now,
|
||||
})
|
||||
return err
|
||||
}
|
||||
for _, v := range tsk.OnceTask {
|
||||
if v == taskId { // 已经完成了
|
||||
return nil
|
||||
}
|
||||
}
|
||||
if len(tsk.OnceTask) == 0 {
|
||||
_, err := coll(t).UpdateOne(bson.M{"_id": tsk.ID}, bson.M{"$set": bson.M{"onceTask": []primitive.ObjectID{taskId}}})
|
||||
return err
|
||||
}
|
||||
_, err := coll(t).UpdateOne(bson.M{"_id": tsk.ID}, bson.M{"$addToSet": bson.M{"onceTask": taskId}})
|
||||
return err
|
||||
}
|
||||
|
||||
func GetUserRecordByTime(uid uint64, taskId primitive.ObjectID, record time.Time) (*Task, error) {
|
||||
var out *Task
|
||||
if err := coll(nil).FindOne(&out, bson.M{"uid": uid, "taskId": taskId, "recordTime": record}); err != nil {
|
||||
log.Error(
|
||||
fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "GetUserRecordByTime", models.Task, "FindOne", err),
|
||||
log.Any("uid", uid),
|
||||
)
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// GetUserTaskRecordByUid 查询用户任务记录
|
||||
func GetUserTaskRecordByUid(uid uint64, t ConfigType, taskId primitive.ObjectID) (*Task, error) {
|
||||
var out *Task
|
||||
if err := coll(nil).FindOne(&out, bson.M{"uid": uid, "type": t, "taskId": taskId}); err != nil {
|
||||
log.Error(
|
||||
fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "GetUserTaskRecordByUid", models.Task, "FindOne", err),
|
||||
log.Any("uid", uid),
|
||||
)
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// GetUserTask 查询用户任务记录
|
||||
func GetUserTask(uid uint64, taskId primitive.ObjectID) (Task, error) {
|
||||
var out Task
|
||||
if err := coll(nil).FindOne(&out, bson.M{"uid": uid, "taskId": taskId}); err != nil {
|
||||
log.Error(
|
||||
fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "GetUserTaskRecordByUid", models.Task, "FindOne", err),
|
||||
log.Any("uid", uid),
|
||||
)
|
||||
return out, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func UpdateStatusById(t *db.MongoTool, id primitive.ObjectID, status int) (out *Task, err error) {
|
||||
update := bson.M{"$set": bson.M{"updateTime": time.Now(), "status": status}, "$inc": bson.M{"stage": 1}}
|
||||
if err = coll(t).FindOneAndUpdate(&out, bson.M{"_id": id}, update); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "UpdateStatusById", models.Task, "UpdateStatusById", err),
|
||||
log.Any("id", id.Hex()),
|
||||
)
|
||||
return
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func UpsertOne(filter, updateDate bson.M) (err error) {
|
||||
if _, err = coll(nil).UpsertOne(filter, updateDate); err != nil {
|
||||
log.Error("UpsertOne error",
|
||||
log.Any("filter", filter),
|
||||
log.Any("updateDate", updateDate),
|
||||
log.E(err))
|
||||
return err
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// GetSignRecord 取用户签到任务记录
|
||||
func GetSignRecord(uid uint64) (*Task, error) {
|
||||
var out *Task
|
||||
if err := coll(nil).FindOne(&out, bson.M{"uid": uid, "type": Sign}); err != nil {
|
||||
log.Error(
|
||||
fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "GetUserRecordByType", models.Task, "FindOne", err),
|
||||
log.Any("uid", uid),
|
||||
)
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// TaskSignUpdate 更新用户签到记录
|
||||
func TaskSignUpdate(t *db.MongoTool, uid uint64, taskID primitive.ObjectID) error {
|
||||
filter := bson.M{
|
||||
"uid": uid,
|
||||
"type": Sign,
|
||||
}
|
||||
update := bson.M{"$addToSet": bson.M{"signRecord": taskID}}
|
||||
result, err := coll(t).UpdateOne(filter, update)
|
||||
if err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "RecordUpdate", models.Task, "UpdateOne", err),
|
||||
log.Any("uid", uid),
|
||||
)
|
||||
return err
|
||||
}
|
||||
if result.ModifiedCount == 0 {
|
||||
err = errors.New("task sign UpdateOne ModifiedCount err")
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "RecordUpdate", models.Task, "result.ModifiedCount == 0", err),
|
||||
log.Any("uid", uid),
|
||||
log.Any("taskID", taskID),
|
||||
log.Any("configType:sign", Sign),
|
||||
)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// TaskSignInit 任务记录初始化
|
||||
func TaskSignInit(uid uint64) (*Task, error) {
|
||||
now := time.Now()
|
||||
receiveTime := timeutil.BeginningOfDay(now)
|
||||
taskRecord := &Task{
|
||||
UID: uid,
|
||||
SignRecord: []primitive.ObjectID{},
|
||||
SignTime: receiveTime,
|
||||
JewelBoxRecord: []primitive.ObjectID{},
|
||||
JewelBoxReceiveTime: receiveTime,
|
||||
ConsumerFeedbackRecord: []primitive.ObjectID{},
|
||||
ConsumerFeedbackReceiveTime: receiveTime,
|
||||
TaskType: 0,
|
||||
Type: Sign,
|
||||
CreateTime: now,
|
||||
}
|
||||
if _, err := coll(nil).InsertOne(&taskRecord); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return taskRecord, nil
|
||||
}
|
||||
|
||||
// TaskSignReset 任务重置
|
||||
func TaskSignReset(uid uint64) (*Task, error) {
|
||||
var (
|
||||
out *Task
|
||||
now = timeutil.BeginningOfDay(time.Now())
|
||||
)
|
||||
if err := coll(nil).FindOneAndUpdate(&out, bson.M{"uid": uid, "type": Sign}, bson.M{
|
||||
"$set": bson.M{
|
||||
"signRecord": []primitive.ObjectID{},
|
||||
"signTime": now,
|
||||
},
|
||||
}, options.FindOneAndUpdate().SetReturnDocument(options.After)); err != nil {
|
||||
log.Warn(fmt.Sprintf("[METHOD-%s]==> Model %s %s fail error:%+v:", "TaskReset", models.Task, "FindOneAndUpdate", err),
|
||||
log.Any("uid", uid),
|
||||
log.Any("configType:sign", Sign),
|
||||
)
|
||||
return nil, err
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
Reference in New Issue
Block a user