初始化项目
This commit is contained in:
183
service/report_service.go
Normal file
183
service/report_service.go
Normal file
@@ -0,0 +1,183 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user