183 lines
4.2 KiB
Go
183 lines
4.2 KiB
Go
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
|
|
}
|