@@ -0,0 +1,182 @@
|
||||
package statrecordmod
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"91porn-server/common/db"
|
||||
"91porn-server/common/log"
|
||||
"91porn-server/models"
|
||||
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
)
|
||||
|
||||
var mdb *db.MongoDB
|
||||
|
||||
const table = models.StatRecord
|
||||
|
||||
func coll(t *db.MongoTool) *db.MongoTool {
|
||||
if t == nil {
|
||||
return mdb.Coll(table)
|
||||
}
|
||||
return t.Coll(table)
|
||||
}
|
||||
|
||||
// initIndex 初始化索引
|
||||
func initIndex() {
|
||||
many := []mongo.IndexModel{
|
||||
{
|
||||
Keys: bson.D{{Key: "name", Value: 1}},
|
||||
Options: options.Index().SetUnique(true),
|
||||
},
|
||||
{
|
||||
Keys: bson.D{{Key: "job", Value: 1}, {Key: "item", Value: 1}},
|
||||
Options: options.Index().SetSparse(true).SetUnique(true),
|
||||
},
|
||||
{
|
||||
Keys: bson.D{{Key: "createdAt", Value: -1}},
|
||||
},
|
||||
{
|
||||
Keys: bson.D{{Key: "updatedAt", Value: -1}},
|
||||
},
|
||||
}
|
||||
if _, err := coll(nil).CreateIndex(many); err != nil {
|
||||
panic(fmt.Sprintf("%s model set index err ==>[%+v]", table, err))
|
||||
}
|
||||
}
|
||||
|
||||
// ChangeStatTrans ChangeStatTrans
|
||||
func UpsertOneTrans(trans *db.MongoTool, name string, recordTime time.Time) error {
|
||||
filter := bson.M{
|
||||
"name": name,
|
||||
}
|
||||
update := bson.M{
|
||||
"$set": bson.M{
|
||||
"recordTime": recordTime,
|
||||
"updatedAt": time.Now(),
|
||||
},
|
||||
"$setOnInsert": bson.M{
|
||||
"name": name,
|
||||
"fristRecordTime": recordTime,
|
||||
"createdAt": time.Now(),
|
||||
},
|
||||
}
|
||||
if _, err := coll(trans).UpsertOne(filter, update); err != nil {
|
||||
log.Error("statrecordmod UpsertOneTrans error:%v\n", log.E(err))
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type ItemRecordAt struct {
|
||||
Job string
|
||||
Item string
|
||||
RecordTime time.Time
|
||||
}
|
||||
|
||||
func MergeName(job string, item string) string {
|
||||
return fmt.Sprintf("%s.%s", job, item)
|
||||
}
|
||||
|
||||
func UpsertOneItemTrans(trans *db.MongoTool, job string, item string, recordTime time.Time) error {
|
||||
filter := bson.M{
|
||||
"job": job,
|
||||
"item": item,
|
||||
}
|
||||
update := bson.M{
|
||||
"$set": bson.M{
|
||||
"recordTime": recordTime,
|
||||
"updatedAt": time.Now(),
|
||||
},
|
||||
"$setOnInsert": bson.M{
|
||||
"name": MergeName(job, item),
|
||||
"job": job,
|
||||
"item": item,
|
||||
"fristRecordTime": recordTime,
|
||||
"createdAt": time.Now(),
|
||||
},
|
||||
}
|
||||
if _, err := coll(trans).UpsertOne(filter, update); err != nil {
|
||||
log.Error("statrecordmod UpsertOneItemTrans error:%v\n", log.E(err))
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// FindOne FindOne
|
||||
func findOneByName(Name string) (Record, error) {
|
||||
filter := bson.M{
|
||||
"name": Name,
|
||||
}
|
||||
doc := Record{}
|
||||
return doc, coll(nil).FindOne(&doc, filter)
|
||||
}
|
||||
|
||||
// LastRecordTime 最后的记录时间,服务器的时区
|
||||
func LastRecordTime(name string, defaultTime time.Time) (time.Time, error) {
|
||||
//获取上次记录时间
|
||||
doc, err := findOneByName(name)
|
||||
if err != nil {
|
||||
return time.Time{}, fmt.Errorf("LastRecordTime err:%+v\n", err)
|
||||
}
|
||||
//设定为服务器的时区
|
||||
var tim = defaultTime
|
||||
if !doc.RecordTime.IsZero() {
|
||||
tim = doc.RecordTime
|
||||
}
|
||||
//不依赖数据库 保证时间是服务器时间
|
||||
localTime := tim.In(time.Local)
|
||||
log.Debug("LastRecordTime local Info", log.Any("Local", time.Local), log.Any("time", tim), log.Any("returnTime", localTime))
|
||||
return localTime, nil
|
||||
}
|
||||
|
||||
func FristRecordTimeByName(name string) (time.Time, error) {
|
||||
doc, err := findOneByName(name)
|
||||
if err != nil {
|
||||
return time.Time{}, fmt.Errorf("FristRecordTimeByName err:%+v\n", err)
|
||||
}
|
||||
return doc.FristRecordTime, nil
|
||||
}
|
||||
|
||||
func findOneByJob(job string, item string) (Record, error) {
|
||||
filter := bson.M{
|
||||
"job": job,
|
||||
"item": item,
|
||||
}
|
||||
doc := Record{}
|
||||
return doc, coll(nil).FindOne(&doc, filter)
|
||||
}
|
||||
|
||||
func FristRecordTimeByJob(job string, item string) (time.Time, error) {
|
||||
doc, err := findOneByJob(job, item)
|
||||
if err != nil {
|
||||
return time.Time{}, fmt.Errorf("FristRecordTimeByName err:%+v\n", err)
|
||||
}
|
||||
return doc.FristRecordTime, nil
|
||||
}
|
||||
|
||||
func findManyByJob(job string) ([]Record, error) {
|
||||
filter := bson.M{
|
||||
"job": job,
|
||||
}
|
||||
list := []Record{}
|
||||
return list, coll(nil).Find(&list, filter)
|
||||
}
|
||||
|
||||
func LastRecordTimeMap(job string, defaultTimeMap map[string]time.Time) (map[string]time.Time, error) {
|
||||
list, err := findManyByJob(job)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, v := range list {
|
||||
defaultTimeMap[v.Item] = v.RecordTime
|
||||
}
|
||||
return defaultTimeMap, nil
|
||||
}
|
||||
|
||||
func DeleteStatRecordByName(name string) error {
|
||||
_, err := coll(nil).DeleteOne(bson.M{"name": name})
|
||||
return err
|
||||
}
|
||||
Reference in New Issue
Block a user