Files
cid/service/report_service.go
2025-12-06 15:24:30 +08:00

184 lines
4.1 KiB
Go

package service
import (
"context"
"time"
"github.com/gogf/gf/v2/errors/gerror"
"cidservice/dao"
"cidservice/model/dto"
"cidservice/model/entity"
)
// Report Service 单例
var Report = new(report)
type report struct{}
// Create 创建报表
func (s *report) Create(ctx context.Context, req *dto.CreateReportReq) (res *dto.CreateReportRes, err error) {
data := &entity.AdReport{
ReportName: req.ReportName,
ReportType: req.ReportType,
ReportPeriod: req.ReportPeriod,
StartDate: req.StartDate,
EndDate: req.EndDate,
Status: "生成中",
GenerateTime: time.Now().Unix(),
FileFormat: req.FileFormat,
EmailRecipients: req.EmailRecipients,
Schedule: req.Schedule,
}
// 存储报表配置
if req.ReportConfig != nil {
data.ReportData = []entity.ReportItem{
{
Dimension: "config",
Data: req.ReportConfig,
},
}
}
if err = dao.Report.Insert(ctx, data); err != nil {
return nil, err
}
// 异步生成报表
go s.generateReport(data.Id.Hex(), req)
res = &dto.CreateReportRes{Id: data.Id.Hex()}
return
}
// generateReport 生成报表
func (s *report) generateReport(reportId string, req *dto.CreateReportReq) {
// 模拟生成报表
time.Sleep(5 * time.Second)
// 更新报表状态
ctx := context.Background()
updateReq := &dto.UpdateReportReq{
Id: reportId,
FileFormat: req.FileFormat,
EmailRecipients: req.EmailRecipients,
}
err := dao.Report.Update(ctx, updateReq)
if err != nil {
// 记录错误日志,这里简化处理
// 实际项目中应该使用日志框架
}
// 发送邮件通知(如果配置了邮件接收人)
if len(req.EmailRecipients) > 0 {
// 发送邮件
// 这里简化处理,实际项目中应该使用邮件服务
}
}
// GetOne 获取报表详情
func (s *report) GetOne(ctx context.Context, req *dto.GetReportReq) (res *dto.GetReportRes, err error) {
data, err := dao.Report.GetOne(ctx, req.Id)
if err != nil {
return nil, err
}
res = &dto.GetReportRes{
AdReport: data,
}
return
}
// List 获取报表列表
func (s *report) List(ctx context.Context, req *dto.ListReportReq) (res *dto.ListReportRes, err error) {
list, total, err := dao.Report.List(ctx, req)
if err != nil {
return nil, err
}
res = &dto.ListReportRes{
List: list,
Total: int(total),
}
return
}
// Update 更新报表
func (s *report) Update(ctx context.Context, req *dto.UpdateReportReq) (err error) {
return dao.Report.Update(ctx, req)
}
// Delete 删除报表
func (s *report) Delete(ctx context.Context, req *dto.DeleteReportReq) (err error) {
return dao.Report.Delete(ctx, req.Id)
}
// Download 下载报表
func (s *report) Download(ctx context.Context, req *dto.DownloadReportReq) (res *dto.DownloadReportRes, err error) {
data, err := dao.Report.GetOne(ctx, req.Id)
if err != nil {
return nil, err
}
// 检查报表状态
if data.Status != "已完成" {
return nil, gerror.New("报表尚未生成完成")
}
// 检查报表是否过期
if data.ExpiredTime > 0 && data.ExpiredTime < time.Now().Unix() {
return nil, gerror.New("报表已过期")
}
res = &dto.DownloadReportRes{
DownloadUrl: data.DownloadUrl,
FileSize: data.FileSize,
FileFormat: data.FileFormat,
}
return
}
// Generate 生成报表
func (s *report) Generate(ctx context.Context, req *dto.GenerateReportReq) (err error) {
data, err := dao.Report.GetOne(ctx, req.Id)
if err != nil {
return err
}
// 构建创建报表请求
createReq := &dto.CreateReportReq{
ReportName: data.ReportName,
ReportType: data.ReportType,
ReportPeriod: data.ReportPeriod,
StartDate: data.StartDate,
EndDate: data.EndDate,
FileFormat: data.FileFormat,
EmailRecipients: data.EmailRecipients,
Schedule: data.Schedule,
}
// 从ReportData中获取报表配置
if len(data.ReportData) > 0 {
for _, item := range data.ReportData {
if item.Dimension == "config" {
createReq.ReportConfig = item.Data
break
}
}
}
// 异步生成报表
go s.generateReport(req.Id, createReq)
// 更新状态
updateReq := &dto.UpdateReportReq{
Id: req.Id,
}
err = dao.Report.Update(ctx, updateReq)
return
}