package syncdata 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: int64Ptr(23), CampaignName: "测试计划", UnitId: int64Ptr(10), UnitName: "测试单元", CreativeId: int64Ptr(13), 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 int64Ptr(v int64) *int64 { return &v } 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 }