Files
data-engine/sync/mock_generator.go
2026-04-08 16:00:54 +08:00

326 lines
15 KiB
Go

package sync
import (
"math/rand"
"time"
)
type MockDataGenerator struct {
rand *rand.Rand
}
func NewMockDataGenerator() *MockDataGenerator {
return &MockDataGenerator{
rand: rand.New(rand.NewSource(time.Now().UnixNano())),
}
}
func (m *MockDataGenerator) GenerateAccountReportRequest() *AccountReportRequest {
return &AccountReportRequest{
AdvertiserID: 10001,
StartTime: time.Now().AddDate(0, 0, -30).UnixNano() / 1e6,
EndTime: time.Now().UnixNano() / 1e6,
SelectColumns: []string{"impression", "click", "cost", "t0GMV"},
GroupType: 1,
QueryVersion: 1,
SelectParam: &AccountSelectParam{
CampaignIDs: []int64{1, 2, 3},
},
PageInfo: &PageInfo{
CurrentPage: 1,
PageSize: 10,
},
}
}
func (m *MockDataGenerator) GenerateAccountReportResponse() *AccountReportResponse {
return m.GenerateAccountReportResponseWithPage(1, 10)
}
func (m *MockDataGenerator) GenerateAccountReportResponseWithPage(page int, pageSize int) *AccountReportResponse {
sumData := m.generateSumData()
detailData := m.generateDetailDataByPage(page, pageSize)
totalCount := 23
return &AccountReportResponse{
Code: 0,
Message: "success",
Data: &AccountReportData{
Sum: sumData,
Detail: detailData,
TotalCount: totalCount,
},
}
}
func (m *MockDataGenerator) generateDetailDataByPage(page int, pageSize int) []*AccountReportItem {
totalCount := 23
if page < 1 || pageSize <= 0 {
return []*AccountReportItem{}
}
startIndex := (page - 1) * pageSize
if startIndex >= totalCount {
return []*AccountReportItem{}
}
endIndex := startIndex + pageSize
if endIndex > totalCount {
endIndex = totalCount
}
actualCount := endIndex - startIndex
items := make([]*AccountReportItem, actualCount)
for i := 0; i < actualCount; i++ {
itemIndex := startIndex + i + 1
campaignId := int64(itemIndex)
unitId := int64(itemIndex * 10)
creativeId := int64(itemIndex * 100)
campaignName := "测试计划_" + string(rune('A'+itemIndex-1))
unitName := "测试单元_" + string(rune('A'+itemIndex-1))
creativeName := "测试创意_" + string(rune('A'+itemIndex-1))
item := m.generateSumData()
item.CampaignId = &campaignId
item.UnitId = &unitId
item.CreativeId = &creativeId
item.CampaignName = campaignName
item.UnitName = unitName
item.CreativeName = creativeName
items[i] = (*AccountReportItem)(item)
}
return items
}
func (m *MockDataGenerator) generateSumData() *AccountReportSum {
cost := m.randomFloat(1000, 10000)
impression := m.randomInt64(10000, 100000)
click := m.randomInt64(100, 1000)
return &AccountReportSum{
T0OrderPaymentAmt: "888.99",
CreativeMaterialType: "视频素材类型",
LiveName: "测试直播间",
AuthorId: "123456",
PicUrl: "http://example.com/pic.jpg",
PicName: "图片名称",
PicId: "pic_123",
CoverUrl: "http://example.com/cover.jpg",
CoverId: 4551122,
ItemOrderConversionRatio: m.randomFloatPtr(0.01, 0.5),
ItemCardClickRatio: m.randomFloatPtr(0.02, 0.3),
ItemCardClkCnt: m.randomIntPtr(10, 100),
LivePlayCntCost: m.randomFloatPtr(0.5, 5.0),
AdMerchantFollowCost: m.randomFloatPtr(1.0, 10.0),
AdMerchantFollow: m.randomIntPtr(50, 500),
NetT0OrderCnt: m.randomIntPtr(10, 100),
NetT0Roi: m.randomFloatPtr(1.5, 5.0),
NetT0Gmv: m.randomFloatPtr(5000, 50000),
PhotoName: "测试视频",
PhotoIdStr: "video_123",
PhotoId: "video_123",
ModPriceSegment: "1000-2000",
AgeSegment: "24-30",
Province: "广东",
Gender: "男",
AdPhotoPlayedFiveRatio: m.randomFloatPtr(0.3, 0.8),
AdPhotoPlayedThreeRatio: m.randomFloatPtr(0.5, 0.9),
OrderSubmitRoi: m.randomFloatPtr(1.0, 3.0),
OrderSubmitAmt: m.randomIntPtr(10, 100),
EventOrderSubmitCost: m.randomFloatPtr(5.0, 20.0),
EventOrderSubmit: m.randomIntPtr(5, 50),
EventOrderPaidRoi: m.randomFloatPtr(0.5, 2.0),
EventAppInvoked: m.randomIntPtr(100, 1000),
EventAddShoppingCart: m.randomIntPtr(50, 500),
ConversionNumCost: m.randomFloatPtr(10.0, 50.0),
AdEffectivePlayNum: m.randomIntPtr(1000, 10000),
AdItemClick: m.randomIntPtr(100, 1000),
MerchantProductId: "product_123",
CostTotal: &cost,
AdShow: m.randomIntPtr(10000, 100000),
AdShow1kCost: m.randomFloatPtr(5.0, 50.0),
Impression: &impression,
PhotoClick: m.randomIntPtr(100, 5000),
PhotoClickRatio: m.randomFloatPtr(0.01, 0.1),
Click: &click,
ActionbarClick: m.randomIntPtr(50, 500),
ActionbarClickCost: m.randomFloatPtr(1.0, 10.0),
EspClickRatio: m.randomFloatPtr(0.01, 0.1),
ActionRatio: m.randomFloatPtr(0.02, 0.2),
AdItemClickCount: m.randomIntPtr(10, 100),
EspLivePlayedSeconds: m.randomIntPtr(30, 300),
PlayedThreeSeconds: m.randomIntPtr(5000, 50000),
Play3sRatio: m.randomFloatPtr(0.3, 0.8),
PlayedFiveSeconds: m.randomIntPtr(3000, 30000),
Play5sRatio: m.randomFloatPtr(0.2, 0.6),
PlayedEnd: m.randomIntPtr(1000, 10000),
PlayEndRatio: m.randomFloatPtr(0.1, 0.4),
Share: m.randomIntPtr(10, 100),
Comment: m.randomIntPtr(20, 200),
Likes: m.randomIntPtr(100, 1000),
Report: m.randomIntPtr(1, 10),
Block: m.randomIntPtr(1, 10),
ItemNegative: m.randomIntPtr(5, 50),
LiveShare: m.randomIntPtr(5, 50),
LiveComment: m.randomIntPtr(10, 100),
LiveReward: m.randomIntPtr(20, 200),
EffectivePlayCount: m.randomIntPtr(1000, 10000),
EffectivePlayRatio: m.randomFloatPtr(0.1, 0.5),
ConversionNum: m.randomIntPtr(5, 50),
ConversionCostEsp: m.randomFloatPtr(10.0, 50.0),
Roi: m.randomFloatPtr(1.0, 3.0),
Gmv: m.randomFloatPtr(1000, 10000),
T0Gmv: m.randomFloatPtr(500, 5000),
T1Gmv: m.randomFloatPtr(800, 8000),
T3Gmv: m.randomFloatPtr(1200, 12000),
T7Gmv: m.randomFloatPtr(2000, 20000),
T15Gmv: m.randomFloatPtr(3000, 30000),
T30Gmv: m.randomFloatPtr(5000, 50000),
T0Roi: m.randomFloatPtr(0.5, 2.0),
T1Roi: m.randomFloatPtr(0.8, 2.5),
T3Roi: m.randomFloatPtr(1.0, 3.0),
T7Roi: m.randomFloatPtr(1.5, 4.0),
T15Roi: m.randomFloatPtr(2.0, 5.0),
T30Roi: m.randomFloatPtr(2.5, 6.0),
PaiedOrder: m.randomIntPtr(5, 50),
OrderRatio: m.randomFloatPtr(0.01, 0.1),
T0OrderCnt: m.randomIntPtr(5, 50),
T0OrderCntCost: m.randomFloatPtr(10.0, 100.0),
T0OrderCntRatio: m.randomFloatPtr(0.5, 0.9),
T1OrderCnt: m.randomIntPtr(10, 100),
T3OrderCnt: m.randomIntPtr(20, 200),
T7OrderCnt: m.randomIntPtr(30, 300),
T15OrderCnt: m.randomIntPtr(40, 400),
T30OrderCnt: m.randomIntPtr(50, 500),
MerchantRecoFans: m.randomIntPtr(100, 1000),
T1Retention: m.randomFloatPtr(0.3, 0.8),
T7Retention: m.randomFloatPtr(0.2, 0.6),
T15Retention: m.randomFloatPtr(0.15, 0.5),
T30Retention: m.randomFloatPtr(0.1, 0.4),
T1RetentionRatio: m.randomFloatPtr(0.3, 0.8),
T7RetentionRatio: m.randomFloatPtr(0.2, 0.6),
T15RetentionRatio: m.randomFloatPtr(0.15, 0.5),
T30RetentionRatio: m.randomFloatPtr(0.1, 0.4),
ReservationSuccess: m.randomIntPtr(10, 100),
ReservationCost: m.randomFloatPtr(5.0, 50.0),
StandardLivePlayedStarted: m.randomIntPtr(100, 1000),
AdLivePlayCnt: m.randomIntPtr(50, 500),
AdLivePlayCntCost: m.randomFloatPtr(1.0, 10.0),
LiveAudienceCost: m.randomFloatPtr(0.5, 5.0),
LiveEventGoodsView: m.randomIntPtr(100, 1000),
GoodsClickRatio: m.randomFloatPtr(0.05, 0.3),
DirectAttrPlatNewBuyerCnt: m.randomIntPtr(10, 100),
T30AttrPlatTotalBuyerCnt: m.randomIntPtr(50, 500),
DirectAttrSellerNewBuyerCnt: m.randomIntPtr(5, 50),
T30AttrSellerTotalBuyerCnt: m.randomIntPtr(20, 200),
T7IndirectOrderAmt: m.randomFloatPtr(500, 5000),
T7IndirectOrderCnt: m.randomIntPtr(5, 50),
FansT0GmvPerFans: m.randomFloatPtr(10.0, 100.0),
FansT3GmvPerFans: m.randomFloatPtr(20.0, 200.0),
FansT7GmvPerFans: m.randomFloatPtr(30.0, 300.0),
FansT15GmvPerFans: m.randomFloatPtr(40.0, 400.0),
FansT30GmvPerFans: m.randomFloatPtr(50.0, 500.0),
RecoFansCost: m.randomFloatPtr(5.0, 50.0),
QcpxWhiteboxDirectOrderPaymentAmt: m.randomFloatPtr(100, 1000),
QcpxWhiteboxDirectOrderCnt: m.randomIntPtr(1, 10),
FansT0Gmv: m.randomFloatPtr(100, 1000),
FansT1Gmv: m.randomFloatPtr(200, 2000),
FansT7Gmv: m.randomFloatPtr(300, 3000),
FansT15Gmv: m.randomFloatPtr(400, 4000),
FansT30Gmv: m.randomFloatPtr(500, 5000),
FansT0Roi: m.randomFloatPtr(0.5, 2.0),
FansT1Roi: m.randomFloatPtr(0.8, 2.5),
FansT7Roi: m.randomFloatPtr(1.0, 3.0),
FansT15Roi: m.randomFloatPtr(1.5, 4.0),
FansT30Roi: m.randomFloatPtr(2.0, 5.0),
T0ShopNewBuyerOrderPaymentAmt: m.randomFloatPtr(100, 1000),
T1ShopNewBuyerOrderPaymentAmt: m.randomFloatPtr(200, 2000),
T3ShopNewBuyerOrderPaymentAmt: m.randomFloatPtr(300, 3000),
T7ShopNewBuyerOrderPaymentAmt: m.randomFloatPtr(400, 4000),
T15ShopNewBuyerOrderPaymentAmt: m.randomFloatPtr(500, 5000),
T30ShopNewBuyerOrderPaymentAmt: m.randomFloatPtr(600, 6000),
T0ShopNewBuyerOrderCnt: m.randomIntPtr(1, 10),
T1ShopNewBuyerOrderCnt: m.randomIntPtr(2, 20),
T3ShopNewBuyerOrderCnt: m.randomIntPtr(3, 30),
T7ShopNewBuyerOrderCnt: m.randomIntPtr(4, 40),
T15ShopNewBuyerOrderCnt: m.randomIntPtr(5, 50),
T30ShopNewBuyerOrderCnt: m.randomIntPtr(6, 60),
T1NewBuyerRepurchaseRatio: m.randomFloatPtr(0.1, 0.5),
T3NewBuyerRepurchaseRatio: m.randomFloatPtr(0.15, 0.55),
T7NewBuyerRepurchaseRatio: m.randomFloatPtr(0.2, 0.6),
T15NewBuyerRepurchaseRatio: m.randomFloatPtr(0.25, 0.65),
T30NewBuyerRepurchaseRatio: m.randomFloatPtr(0.3, 0.7),
T0ShopNewBuyerRoi: m.randomFloatPtr(0.5, 2.0),
T1ShopNewBuyerRoi: m.randomFloatPtr(0.8, 2.5),
T3ShopNewBuyerRoi: m.randomFloatPtr(1.0, 3.0),
T7ShopNewBuyerRoi: m.randomFloatPtr(1.5, 4.0),
T15ShopNewBuyerRoi: m.randomFloatPtr(2.0, 5.0),
T30ShopNewBuyerRoi: m.randomFloatPtr(2.5, 6.0),
CreateCardOrderCnt: m.randomIntPtr(1, 10),
ForwardTsCreateCardOrderCnt: m.randomIntPtr(1, 10),
CreateCardOrderCost: m.randomFloatPtr(10.0, 100.0),
ForwardTsCreateCardOrderCost: m.randomFloatPtr(10.0, 100.0),
ActivateCardOrderCnt: m.randomIntPtr(1, 10),
ForwardTsActivateCardOrderCnt: m.randomIntPtr(1, 10),
ActivateCardOrderCost: m.randomFloatPtr(10.0, 100.0),
ForwardTsActivateCardOrderCost: m.randomFloatPtr(10.0, 100.0),
CreateCardOrderRatio: m.randomFloatPtr(0.01, 0.1),
ForwardTsCreateCardOrderRatio: m.randomFloatPtr(0.01, 0.1),
ActivateCardOrderCntRatio: m.randomFloatPtr(0.01, 0.1),
ForwardTsActivateCardOrderRatio: m.randomFloatPtr(0.01, 0.1),
LivePlayCnt: m.randomIntPtr(100, 1000),
ItemEntranceClkCnt: m.randomIntPtr(50, 500),
ShowCnt: m.randomIntPtr(1000, 10000),
ReportDateStr: time.Now().Format("2006-01-02"),
CampaignId: m.randomIntPtr(1, 100),
CampaignName: "测试计划",
UnitId: m.randomIntPtr(1, 50),
UnitName: "测试单元",
CreativeId: m.randomIntPtr(1, 20),
CreativeName: "测试创意",
CidActualRoiAfterSubsidy: m.randomFloatPtr(1.0, 3.0),
CidCouponAmount: m.randomIntPtr(100, 1000),
CidCouponCallbackPaidRefundAmount: m.randomIntPtr(50, 500),
CidVoucherCost: m.randomFloatPtr(5.0, 50.0),
}
}
func (m *MockDataGenerator) generateDetailData(count int) []*AccountReportItem {
items := make([]*AccountReportItem, count)
for i := 0; i < count; i++ {
items[i] = (*AccountReportItem)(m.generateSumData())
}
return items
}
func (m *MockDataGenerator) randomInt(min, max int) int {
return m.rand.Intn(max-min) + min
}
func (m *MockDataGenerator) randomInt64(min, max int64) int64 {
return m.rand.Int63n(max-min) + min
}
func (m *MockDataGenerator) randomFloat(min, max float64) float64 {
return m.rand.Float64()*(max-min) + min
}
func (m *MockDataGenerator) randomIntPtr(min, max int) *int64 {
v := int64(m.randomInt(min, max))
return &v
}
func (m *MockDataGenerator) randomFloatPtr(min, max float64) *float64 {
v := m.randomFloat(min, max)
return &v
}