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 }