定时任务抽取数据

This commit is contained in:
2026-04-07 09:51:32 +08:00
parent 41089cca2d
commit 4f3ad39eeb
12 changed files with 1684 additions and 2 deletions

View File

@@ -0,0 +1,115 @@
package sync
import (
dto "cid/model/dto/copydata"
"cid/service/copydata"
"context"
"encoding/json"
"fmt"
"github.com/sirupsen/logrus"
)
type CampaignReportSync struct {
*BaseReportSync
converter *DataConverter
mockGen *MockDataGenerator
}
func NewCampaignReportSync() *CampaignReportSync {
return &CampaignReportSync{
BaseReportSync: NewBaseReportSync(),
converter: NewDataConverter(),
mockGen: NewMockDataGenerator(),
}
}
func (c *CampaignReportSync) FetchReport(ctx context.Context, params interface{}) (interface{}, error) {
req, ok := params.(*CampaignReportRequest)
if !ok {
return nil, fmt.Errorf("参数类型错误,期望 CampaignReportRequest 类型")
}
useMock := false
if useMock {
logrus.Info("使用 Mock 数据")
return c.mockGen.GenerateCampaignReportResponse(), nil
}
respBytes, err := NewHttpClient("https://ad.e.kuaishou.com", 0).Post(ctx, "/rest/openapi/gw/esp/report/campaignReport", req)
if err != nil {
return nil, fmt.Errorf("调用 API 失败:%w", err)
}
var response CampaignReportResponse
if err := json.Unmarshal(respBytes, &response); err != nil {
return nil, fmt.Errorf("解析响应失败:%w", err)
}
if response.Code != 0 {
return nil, fmt.Errorf("API 返回错误code=%d, message=%s", response.Code, response.Message)
}
return &response, nil
}
func (c *CampaignReportSync) ConvertToSum(apiData interface{}, dataType string) interface{} {
response, ok := apiData.(*CampaignReportResponse)
if !ok || response.Data == nil || response.Data.Sum == nil {
return nil
}
return c.converter.ConvertToSumItem(response.Data.Sum, dataType)
}
func (c *CampaignReportSync) ConvertToDetails(apiData interface{}, dataType string) []interface{} {
response, ok := apiData.(*CampaignReportResponse)
if !ok || response.Data == nil || len(response.Data.Detail) == 0 {
return nil
}
detailItems := c.converter.ConvertToDetailItems(response.Data.Detail, dataType)
result := make([]interface{}, len(detailItems))
for i, item := range detailItems {
result[i] = item
}
return result
}
func (c *CampaignReportSync) SaveSum(ctx context.Context, data interface{}) (int64, error) {
sumItem, ok := data.(*dto.CidAccountReportSumItem)
if !ok {
return 0, fmt.Errorf("数据类型错误,期望 CidAccountReportSumItem 类型")
}
res, err := copydata.CidAccountReportDetail.CreateSum(ctx, sumItem)
if err != nil {
return 0, err
}
return res.Id, nil
}
func (c *CampaignReportSync) SaveDetails(ctx context.Context, data []interface{}) (int64, int64, error) {
detailItems := make([]*dto.CidAccountReportDetailItem, len(data))
for i, item := range data {
detailItem, ok := item.(*dto.CidAccountReportDetailItem)
if !ok {
return 0, 0, fmt.Errorf("第 %d 条数据类型错误", i)
}
detailItems[i] = detailItem
}
req := &dto.BatchCreateCidAccountReportDetailReq{
Items: detailItems,
}
res, err := copydata.CidAccountReportDetail.BatchCreate(ctx, req)
if err != nil {
return 0, 0, err
}
return res.SuccessCount, res.FailCount, nil
}