Files
data-engine/syncdata/account_report_sync.go

116 lines
3.0 KiB
Go
Raw Normal View History

2026-04-09 10:48:30 +08:00
package syncdata
2026-04-07 09:51:32 +08:00
import (
"context"
2026-04-30 13:45:41 +08:00
dto "dataengine/model/dto/copydata"
"dataengine/service/copydata"
2026-04-07 09:51:32 +08:00
"encoding/json"
"fmt"
"github.com/sirupsen/logrus"
)
2026-04-08 09:03:20 +08:00
type AccountReportSync struct {
2026-04-07 09:51:32 +08:00
*BaseReportSync
converter *DataConverter
mockGen *MockDataGenerator
}
2026-04-08 09:03:20 +08:00
func NewAccountReportSync() *AccountReportSync {
return &AccountReportSync{
2026-04-07 09:51:32 +08:00
BaseReportSync: NewBaseReportSync(),
converter: NewDataConverter(),
mockGen: NewMockDataGenerator(),
}
}
2026-04-08 09:03:20 +08:00
func (c *AccountReportSync) FetchReport(ctx context.Context, params interface{}) (interface{}, error) {
req, ok := params.(*AccountReportRequest)
2026-04-07 09:51:32 +08:00
if !ok {
2026-04-08 09:03:20 +08:00
return nil, fmt.Errorf("参数类型错误,期望 AccountReportRequest 类型")
2026-04-07 09:51:32 +08:00
}
useMock := false
if useMock {
logrus.Info("使用 Mock 数据")
2026-04-08 09:03:20 +08:00
return c.mockGen.GenerateAccountReportResponse(), nil
2026-04-07 09:51:32 +08:00
}
2026-04-08 09:03:20 +08:00
respBytes, err := NewHttpClient("https://ad.e.kuaishou.com", 0).Post(ctx, "/rest/openapi/gw/esp/report/accountReport", req)
2026-04-07 09:51:32 +08:00
if err != nil {
return nil, fmt.Errorf("调用 API 失败:%w", err)
}
2026-04-08 09:03:20 +08:00
var response AccountReportResponse
2026-04-07 09:51:32 +08:00
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
}
2026-04-08 09:03:20 +08:00
func (c *AccountReportSync) ConvertToSum(apiData interface{}, dataType string) interface{} {
response, ok := apiData.(*AccountReportResponse)
2026-04-07 09:51:32 +08:00
if !ok || response.Data == nil || response.Data.Sum == nil {
return nil
}
2026-04-08 09:03:20 +08:00
return c.converter.ConvertToSumItem(response.Data.Sum, dataType, 0)
2026-04-07 09:51:32 +08:00
}
2026-04-08 09:03:20 +08:00
func (c *AccountReportSync) ConvertToDetails(apiData interface{}, dataType string) []interface{} {
response, ok := apiData.(*AccountReportResponse)
2026-04-07 09:51:32 +08:00
if !ok || response.Data == nil || len(response.Data.Detail) == 0 {
return nil
}
2026-04-08 09:03:20 +08:00
detailItems := c.converter.ConvertToDetailItems(response.Data.Detail, dataType, 0)
2026-04-07 09:51:32 +08:00
result := make([]interface{}, len(detailItems))
for i, item := range detailItems {
result[i] = item
}
return result
}
2026-04-08 09:03:20 +08:00
func (c *AccountReportSync) SaveSum(ctx context.Context, data interface{}) (int64, error) {
2026-04-07 09:51:32 +08:00
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
}
2026-04-08 09:03:20 +08:00
func (c *AccountReportSync) SaveDetails(ctx context.Context, data []interface{}) (int64, int64, error) {
2026-04-07 09:51:32 +08:00
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
}