Files
cid/dao/report_dao.go
2025-12-06 09:10:24 +08:00

172 lines
4.1 KiB
Go

package dao
import (
"context"
"cidService/model/dto"
"cidService/model/entity"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/util/gconv"
"go.mongodb.org/mongo-driver/v2/bson"
"go.mongodb.org/mongo-driver/v2/mongo/options"
"gitee.com/red-future---jilin-g/common/http"
"gitee.com/red-future---jilin-g/common/mongo"
)
// Report DAO 单例
var Report = &report{}
type report struct{}
// Insert 插入报表
func (d *report) Insert(ctx context.Context, report *entity.AdReport) (err error) {
// 如果 ID 为空,生成一个新的 ObjectID
if report.Id.IsZero() {
report.Id = bson.NewObjectID()
}
_, err = mongo.Insert(ctx, []interface{}{report}, entity.AdReportCollection)
return
}
// Update 更新报表
func (d *report) Update(ctx context.Context, req *dto.UpdateReportReq) (err error) {
objectId, err := bson.ObjectIDFromHex(req.Id)
if err != nil {
return
}
filter := bson.M{"_id": objectId}
// 构建动态更新字段
updateFields := bson.M{}
if !g.IsEmpty(req.ReportName) {
updateFields["reportName"] = req.ReportName
}
if !g.IsEmpty(req.ReportType) {
updateFields["reportType"] = req.ReportType
}
if !g.IsEmpty(req.ReportPeriod) {
updateFields["reportPeriod"] = req.ReportPeriod
}
if req.StartDate != nil {
updateFields["startDate"] = *req.StartDate
}
if req.EndDate != nil {
updateFields["endDate"] = *req.EndDate
}
if req.ReportConfig != nil {
updateFields["reportConfig"] = req.ReportConfig
}
if !g.IsEmpty(req.FileFormat) {
updateFields["fileFormat"] = req.FileFormat
}
if req.EmailRecipients != nil {
updateFields["emailRecipients"] = req.EmailRecipients
}
if !g.IsEmpty(req.Schedule) {
updateFields["schedule"] = req.Schedule
}
if len(updateFields) > 0 {
update := bson.M{"$set": updateFields}
_, err = mongo.Update(ctx, filter, update, entity.AdReportCollection)
}
return
}
// Delete 删除报表
func (d *report) Delete(ctx context.Context, id string) (err error) {
objectId, err := bson.ObjectIDFromHex(id)
if err != nil {
return
}
filter := bson.M{"_id": objectId}
_, err = mongo.Delete(ctx, filter, entity.AdReportCollection)
return
}
// GetOne 获取单个报表
func (d *report) GetOne(ctx context.Context, id string) (result *entity.AdReport, err error) {
objectId, err := bson.ObjectIDFromHex(id)
if err != nil {
return
}
filter := bson.M{"_id": objectId}
result = &entity.AdReport{}
err = mongo.FindOne(ctx, filter, result, entity.AdReportCollection)
return
}
// buildReportListFilter 构建报表列表查询的过滤条件
func (d *report) buildReportListFilter(req *dto.ListReportReq) bson.M {
filter := bson.M{}
if !g.IsEmpty(req.ReportName) {
filter["reportName"] = bson.M{"$regex": req.ReportName, "$options": "i"}
}
if !g.IsEmpty(req.ReportType) {
filter["reportType"] = req.ReportType
}
if !g.IsEmpty(req.Status) {
filter["status"] = req.Status
}
if !g.IsEmpty(req.Operator) {
filter["operator"] = req.Operator
}
// 处理日期范围
if len(req.DateRange) == 2 {
startTime := gconv.Int64(req.DateRange[0])
endTime := gconv.Int64(req.DateRange[1])
filter["createdAt"] = bson.M{
"$gte": startTime,
"$lte": endTime,
}
}
return filter
}
// checkReportTotalCount 检查报表总数
func (d *report) checkReportTotalCount(ctx context.Context, filter bson.M) (total int64, err error) {
total, err = mongo.Count(ctx, filter, entity.AdReportCollection)
return
}
// List 获取报表列表
func (d *report) List(ctx context.Context, req *dto.ListReportReq) (list []*entity.AdReport, total int64, err error) {
// 构建查询过滤条件
filter := d.buildReportListFilter(req)
// 检查总数
total, err = d.checkReportTotalCount(ctx, filter)
if err != nil {
return
}
// 分页参数处理
pageNum := req.PageNum
if pageNum <= 0 {
pageNum = 1
}
pageSize := req.PageSize
if pageSize <= 0 {
pageSize = http.PageSize
}
limit := int64(pageSize)
skip := int64((pageNum - 1) * pageSize)
// 排序处理
sort := bson.M{"createdAt": -1}
opts := options.Find().SetLimit(limit).SetSkip(skip).SetSort(sort)
err = mongo.Find(ctx, filter, &list, entity.AdReportCollection, opts)
return
}