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) GenerateCampaignReportRequest() *CampaignReportRequest { return &CampaignReportRequest{ 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: &CampaignSelectParam{ CampaignIDs: []int64{1, 2, 3}, }, PageInfo: &PageInfo{ CurrentPage: 1, PageSize: 20, }, } } func (m *MockDataGenerator) GenerateCampaignReportResponse() *CampaignReportResponse { sumData := m.generateSumData() detailData := m.generateDetailData(5) return &CampaignReportResponse{ Code: 0, Message: "success", Data: &CampaignReportData{ Sum: sumData, Detail: detailData, TotalCount: len(detailData), }, } } func (m *MockDataGenerator) generateSumData() *CampaignReportSum { cost := m.randomFloat(1000, 10000) impression := m.randomInt64(10000, 100000) click := m.randomInt64(100, 1000) return &CampaignReportSum{ 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) []*CampaignReportItem { items := make([]*CampaignReportItem, count) for i := 0; i < count; i++ { items[i] = (*CampaignReportItem)(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 }