Files
huangguo_server/models/s/statrecordmod/statRecord.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

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
}