116 lines
3.0 KiB
Go
116 lines
3.0 KiB
Go
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
|
||
}
|