From b87244638f4fc6f78111c921820d408407960252 Mon Sep 17 00:00:00 2001 From: lmk <1095689763@qq.com> Date: Thu, 2 Apr 2026 11:51:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + Dockerfile | 57 ++ config.yml | 49 ++ consts/api-feature/api_method.go | 18 + consts/api-feature/application_status.go | 13 + consts/api-feature/application_type.go | 17 + consts/api-feature/fetch_status.go | 16 + consts/api-feature/limit_type.go | 14 + consts/api-feature/mapping_status.go | 13 + consts/api-feature/platform_status.go | 13 + consts/api-feature/platform_type.go | 21 + consts/api-feature/transform_type.go | 16 + consts/dict/consts.go | 51 ++ consts/public/collections.go | 19 + .../copydata/api_account_report_controller.go | 32 + .../creative_report_sum_controller.go | 30 + .../copydata/material_report_controller.go | 27 + .../copydata/population_report_controller.go | 29 + .../storewide_report_sum_controller.go | 32 + controller/copydata/task_report_controller.go | 27 + controller/copydata/unit_report_controller.go | 35 + .../api_datasource_platform_controller.go | 71 ++ .../api_field_mapping_config_controller.go | 65 ++ controller/dict/api_interface_controller.go | 53 ++ dao/copydata/api_account_report_detail_dao.go | 86 +++ dao/copydata/api_account_report_sum_dao.go | 86 +++ dao/copydata/creative_report_detail_dao.go | 81 +++ dao/copydata/creative_report_sum_dao.go | 86 +++ dao/copydata/material_report_dao.go | 128 ++++ dao/copydata/population_report_dao.go | 124 ++++ dao/copydata/storewide_report_detail_dao.go | 86 +++ dao/copydata/storewide_report_sum_dao.go | 86 +++ dao/copydata/task_report_dao.go | 124 ++++ dao/copydata/unit_report_detail_dao.go | 83 +++ dao/copydata/unit_report_sum_dao.go | 83 +++ dao/dict/api_datasource_platform_dao.go | 239 ++++++ dao/dict/api_field_mapping_config_dao.go | 274 +++++++ dao/dict/api_interface_dao.go | 118 +++ entities/request.go | 70 ++ entities/response.go | 158 ++++ go.mod | 92 +++ main.go | 33 + .../copydata/api_account_report_detail_dto.go | 318 ++++++++ .../copydata/api_account_report_sum_dto.go | 318 ++++++++ .../copydata/creative_report_detail_dto.go | 230 ++++++ model/dto/copydata/creative_report_sum_dto.go | 342 +++++++++ model/dto/copydata/material_report_dto.go | 234 ++++++ model/dto/copydata/population_report_dto.go | 210 ++++++ .../copydata/storewide_report_detail_dto.go | 132 ++++ .../dto/copydata/storewide_report_sum_dto.go | 92 +++ model/dto/copydata/task_report_dto.go | 92 +++ model/dto/copydata/unit_report_detail_dto.go | 237 ++++++ model/dto/copydata/unit_report_sum_dto.go | 237 ++++++ model/dto/dict/api_datasource_platform_dto.go | 170 +++++ .../dto/dict/api_field_mapping_config_dto.go | 221 ++++++ model/dto/dict/api_interface_dto.go | 102 +++ .../copydata/api_account_report_detail.go | 664 +++++++++++++++++ .../entity/copydata/api_account_report_sum.go | 665 +++++++++++++++++ .../entity/copydata/creative_report_detail.go | 582 +++++++++++++++ model/entity/copydata/creative_report_sum.go | 687 ++++++++++++++++++ model/entity/copydata/material_report.go | 576 +++++++++++++++ model/entity/copydata/population_report.go | 578 +++++++++++++++ .../copydata/storewide_report_detail.go | 181 +++++ model/entity/copydata/storewide_report_sum.go | 141 ++++ model/entity/copydata/task_report.go | 133 ++++ model/entity/copydata/unit_report_detail.go | 198 +++++ model/entity/copydata/unit_report_sum.go | 199 +++++ model/entity/dict/api_datasource_platform.go | 94 +++ model/entity/dict/api_field_mapping_config.go | 98 +++ model/entity/dict/api_interface.go | 57 ++ service/api_service.go | 396 ++++++++++ .../copydata/api_account_report_service.go | 113 +++ .../copydata/creative_report_sum_service.go | 91 +++ service/copydata/material_report_service.go | 261 +++++++ service/copydata/population_report_service.go | 237 ++++++ .../copydata/storewide_report_sum_service.go | 97 +++ service/copydata/task_report_service.go | 113 +++ service/copydata/unit_report_service.go | 90 +++ .../dict/api_datasource_platform_service.go | 305 ++++++++ .../dict/api_field_mapping_config_service.go | 396 ++++++++++ service/dict/api_interface_service.go | 183 +++++ update.sql | 219 ++++++ utils/time_utils.go | 39 + 83 files changed, 13084 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 config.yml create mode 100644 consts/api-feature/api_method.go create mode 100644 consts/api-feature/application_status.go create mode 100644 consts/api-feature/application_type.go create mode 100644 consts/api-feature/fetch_status.go create mode 100644 consts/api-feature/limit_type.go create mode 100644 consts/api-feature/mapping_status.go create mode 100644 consts/api-feature/platform_status.go create mode 100644 consts/api-feature/platform_type.go create mode 100644 consts/api-feature/transform_type.go create mode 100644 consts/dict/consts.go create mode 100644 consts/public/collections.go create mode 100644 controller/copydata/api_account_report_controller.go create mode 100644 controller/copydata/creative_report_sum_controller.go create mode 100644 controller/copydata/material_report_controller.go create mode 100644 controller/copydata/population_report_controller.go create mode 100644 controller/copydata/storewide_report_sum_controller.go create mode 100644 controller/copydata/task_report_controller.go create mode 100644 controller/copydata/unit_report_controller.go create mode 100644 controller/dict/api_datasource_platform_controller.go create mode 100644 controller/dict/api_field_mapping_config_controller.go create mode 100644 controller/dict/api_interface_controller.go create mode 100644 dao/copydata/api_account_report_detail_dao.go create mode 100644 dao/copydata/api_account_report_sum_dao.go create mode 100644 dao/copydata/creative_report_detail_dao.go create mode 100644 dao/copydata/creative_report_sum_dao.go create mode 100644 dao/copydata/material_report_dao.go create mode 100644 dao/copydata/population_report_dao.go create mode 100644 dao/copydata/storewide_report_detail_dao.go create mode 100644 dao/copydata/storewide_report_sum_dao.go create mode 100644 dao/copydata/task_report_dao.go create mode 100644 dao/copydata/unit_report_detail_dao.go create mode 100644 dao/copydata/unit_report_sum_dao.go create mode 100644 dao/dict/api_datasource_platform_dao.go create mode 100644 dao/dict/api_field_mapping_config_dao.go create mode 100644 dao/dict/api_interface_dao.go create mode 100644 entities/request.go create mode 100644 entities/response.go create mode 100644 go.mod create mode 100644 main.go create mode 100644 model/dto/copydata/api_account_report_detail_dto.go create mode 100644 model/dto/copydata/api_account_report_sum_dto.go create mode 100644 model/dto/copydata/creative_report_detail_dto.go create mode 100644 model/dto/copydata/creative_report_sum_dto.go create mode 100644 model/dto/copydata/material_report_dto.go create mode 100644 model/dto/copydata/population_report_dto.go create mode 100644 model/dto/copydata/storewide_report_detail_dto.go create mode 100644 model/dto/copydata/storewide_report_sum_dto.go create mode 100644 model/dto/copydata/task_report_dto.go create mode 100644 model/dto/copydata/unit_report_detail_dto.go create mode 100644 model/dto/copydata/unit_report_sum_dto.go create mode 100644 model/dto/dict/api_datasource_platform_dto.go create mode 100644 model/dto/dict/api_field_mapping_config_dto.go create mode 100644 model/dto/dict/api_interface_dto.go create mode 100644 model/entity/copydata/api_account_report_detail.go create mode 100644 model/entity/copydata/api_account_report_sum.go create mode 100644 model/entity/copydata/creative_report_detail.go create mode 100644 model/entity/copydata/creative_report_sum.go create mode 100644 model/entity/copydata/material_report.go create mode 100644 model/entity/copydata/population_report.go create mode 100644 model/entity/copydata/storewide_report_detail.go create mode 100644 model/entity/copydata/storewide_report_sum.go create mode 100644 model/entity/copydata/task_report.go create mode 100644 model/entity/copydata/unit_report_detail.go create mode 100644 model/entity/copydata/unit_report_sum.go create mode 100644 model/entity/dict/api_datasource_platform.go create mode 100644 model/entity/dict/api_field_mapping_config.go create mode 100644 model/entity/dict/api_interface.go create mode 100644 service/api_service.go create mode 100644 service/copydata/api_account_report_service.go create mode 100644 service/copydata/creative_report_sum_service.go create mode 100644 service/copydata/material_report_service.go create mode 100644 service/copydata/population_report_service.go create mode 100644 service/copydata/storewide_report_sum_service.go create mode 100644 service/copydata/task_report_service.go create mode 100644 service/copydata/unit_report_service.go create mode 100644 service/dict/api_datasource_platform_service.go create mode 100644 service/dict/api_field_mapping_config_service.go create mode 100644 service/dict/api_interface_service.go create mode 100644 update.sql create mode 100644 utils/time_utils.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f1b7204 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/.idea/* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..073ffee --- /dev/null +++ b/Dockerfile @@ -0,0 +1,57 @@ +FROM golang:1.25.3 +RUN go env -w GO111MODULE=on +RUN go env -w GOPROXY=https://goproxy.cn,direct +ENV WORKDIR /usr/local/bin/app +WORKDIR $WORKDIR + +ENV TIME_ZONE=Asia/Seoul +RUN useradd -ms /bin/bash golang + + +RUN ln -sf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime \ + && chmod 0755 /usr/bin/wall \ + && chmod 0755 /usr/bin/passwd \ + && chmod 0755 /usr/bin/newgrp \ + && chmod 0755 /usr/bin/chfn \ + && chmod 0755 /usr/bin/chage \ + && chmod 0755 /usr/bin/gpasswd \ + && chmod 0755 /usr/bin/chsh \ + && chmod 0755 /usr/bin/expiry \ + && chmod 0755 /bin/umount \ + && chmod 0755 /bin/mount \ + && chmod 0755 /bin/su \ + && chmod 0755 /sbin/unix_chkpwd \ + && chmod 110 /usr/bin/chfn \ + && chmod 110 /usr/bin/passwd \ + && chmod 110 /usr/bin/newgrp \ + && chmod 110 /usr/bin/chsh \ + && chmod 110 /usr/bin/wall \ + && chmod 110 /usr/bin/gpasswd \ + && chmod 110 /usr/bin/expiry \ + && chmod 110 /usr/bin/chage \ + && chmod 110 /bin/mount \ + && chmod 110 /bin/umount \ + && chmod 110 /bin/su \ + && chmod 110 /sbin/unix_chkpwd \ + && chmod 110 /usr/lib/openssh/ssh-keysign \ + && chmod 110 /usr/bin/ssh-agent + +COPY go.mod go.sum ./ +# RUN chown -R golang:golang $WORKDIR +RUN go mod download && go mod verify +COPY ../../cid $WORKDIR +RUN chown -R golang:golang $WORKDIR +# Remove SetUID, SetGID +RUN chmod 0755 /usr/local/bin/app/api \ + && chmod 0755 /usr/local/bin/app/common \ + && chmod 0755 /usr/local/bin/app/middleware \ + && chmod 0755 /usr/local/bin/app/model \ + && rm -rf .git \ + && rm -rf .gitignore \ + && rm -rf .gitlab-ci.yml \ + && rm -rf Dockerfile.bak \ + && rm -rf config-local.yml +USER golang +RUN go build -v -o /usr/local/bin/app ./... +EXPOSE 3002 +CMD ./cid \ No newline at end of file diff --git a/config.yml b/config.yml new file mode 100644 index 0000000..6e14ca1 --- /dev/null +++ b/config.yml @@ -0,0 +1,49 @@ +server: + address : ":3001" + name: "data-engine" + workerId: 1 + logPath: "resource/log/server" + logStdout: true + errorStack: true +rate: + limit: 200 + burst: 300 + +# Database. +database: + default: + - type: "pgsql" + host: "localhost" + port: "5432" + user: "postgres" + pass: "root" + name: "cid" + role: "master" + maxIdle: "5" + maxOpen: "20" + maxLifetime: "60s" + charset: "utf8mb4" + debug: true + dryRun: false + createdAt: "created_at" + updatedAt: "updated_at" + deletedAt: "deleted_at" + timeMaintainDisabled: false + +redis: + # 集群模式配置方法 + default: + address: 192.168.3.30:6379 + db: 0 + idleTimeout: "60s" #连接最大空闲时间,使用时间字符串例如30s/1m/1d + maxConnLifetime: "90s" #连接最长存活时间,使用时间字符串例如30s/1m/1d + waitTimeout: "60s" #等待连接池连接的超时时间,使用时间字符串例如30s/1m/1d + dialTimeout: "30s" #TCP连接的超时时间,使用时间字符串例如30s/1m/1d + readTimeout: "30s" #TCP的Read操作超时时间,使用时间字符串例如30s/1m/1d + writeTimeout: "30s" #TCP的Write操作超时时间,使用时间字符串例如30s/1m/1d + maxActive: 100 +consul: + address: 116.204.74.41:8500 +# pass: jiahui8888 +jaeger: #链路追踪 + addr: 116.204.74.41:4318 \ No newline at end of file diff --git a/consts/api-feature/api_method.go b/consts/api-feature/api_method.go new file mode 100644 index 0000000..b13f586 --- /dev/null +++ b/consts/api-feature/api_method.go @@ -0,0 +1,18 @@ +package api_feature + +// ApiMethod 接口请求方法 +type ApiMethod string + +const ( + ApiMethodGet ApiMethod = "GET" // GET请求 + ApiMethodPost ApiMethod = "POST" // POST请求 + ApiMethodPut ApiMethod = "PUT" // PUT请求 + ApiMethodDelete ApiMethod = "DELETE" // DELETE请求 + ApiMethodPatch ApiMethod = "PATCH" // PATCH请求 + ApiMethodHead ApiMethod = "HEAD" // HEAD请求 + ApiMethodOptions ApiMethod = "OPTIONS" // OPTIONS请求 +) + +func (m ApiMethod) String() string { + return string(m) +} diff --git a/consts/api-feature/application_status.go b/consts/api-feature/application_status.go new file mode 100644 index 0000000..250449d --- /dev/null +++ b/consts/api-feature/application_status.go @@ -0,0 +1,13 @@ +package api_feature + +// AppStatus 应用状态 +type AppStatus string + +const ( + AppStatusActive AppStatus = "active" // 启用 + AppStatusInactive AppStatus = "inactive" // 停用 +) + +func (s AppStatus) String() string { + return string(s) +} diff --git a/consts/api-feature/application_type.go b/consts/api-feature/application_type.go new file mode 100644 index 0000000..0bbc471 --- /dev/null +++ b/consts/api-feature/application_type.go @@ -0,0 +1,17 @@ +package api_feature + +// AppType 应用类型 +type AppType string + +const ( + AppTypeWeb AppType = "web" // Web应用 + AppTypeMobile AppType = "mobile" // 移动应用 + AppTypeMiniApp AppType = "mini_app" // 小程序 + AppTypeH5 AppType = "h5" // H5应用 + AppTypeDesktop AppType = "desktop" // 桌面应用 + AppTypeThirdParty AppType = "third_party" // 第三方应用 +) + +func (s AppType) String() string { + return string(s) +} diff --git a/consts/api-feature/fetch_status.go b/consts/api-feature/fetch_status.go new file mode 100644 index 0000000..232db9f --- /dev/null +++ b/consts/api-feature/fetch_status.go @@ -0,0 +1,16 @@ +package api_feature + +// FetchStatus 数据获取状态 +type FetchStatus string + +const ( + FetchStatusPending FetchStatus = "pending" // 待执行 + FetchStatusRunning FetchStatus = "running" // 执行中 + FetchStatusSuccess FetchStatus = "success" // 成功 + FetchStatusFailed FetchStatus = "failed" // 失败 + FetchStatusRateLimit FetchStatus = "rate_limit" // 触发限流 +) + +func (f FetchStatus) String() string { + return string(f) +} diff --git a/consts/api-feature/limit_type.go b/consts/api-feature/limit_type.go new file mode 100644 index 0000000..5e93f69 --- /dev/null +++ b/consts/api-feature/limit_type.go @@ -0,0 +1,14 @@ +package api_feature + +// LimitType 限流类型 +type LimitType string + +const ( + LimitTypeApp LimitType = "app" // 应用维度限流 + LimitTypeTenant LimitType = "tenant" // 租户维度限流 + LimitTypeApi LimitType = "api" // 接口维度限流 +) + +func (l LimitType) String() string { + return string(l) +} diff --git a/consts/api-feature/mapping_status.go b/consts/api-feature/mapping_status.go new file mode 100644 index 0000000..41adf3d --- /dev/null +++ b/consts/api-feature/mapping_status.go @@ -0,0 +1,13 @@ +package api_feature + +// MappingStatus 映射状态 +type MappingStatus string + +const ( + MappingStatusActive MappingStatus = "active" // 启用 + MappingStatusInactive MappingStatus = "inactive" // 停用 +) + +func (s MappingStatus) String() string { + return string(s) +} diff --git a/consts/api-feature/platform_status.go b/consts/api-feature/platform_status.go new file mode 100644 index 0000000..0b7bb12 --- /dev/null +++ b/consts/api-feature/platform_status.go @@ -0,0 +1,13 @@ +package api_feature + +// PlatformStatus 平台状态 +type PlatformStatus string + +const ( + PlatformStatusActive PlatformStatus = "active" // 启用 + PlatformStatusInactive PlatformStatus = "inactive" // 停用 +) + +func (s PlatformStatus) String() string { + return string(s) +} diff --git a/consts/api-feature/platform_type.go b/consts/api-feature/platform_type.go new file mode 100644 index 0000000..d443fe4 --- /dev/null +++ b/consts/api-feature/platform_type.go @@ -0,0 +1,21 @@ +package api_feature + +// SyncPlatform 同步平台类型 +type SyncPlatform string + +const ( + PlatformTaobao SyncPlatform = "taobao" // 淘宝 + PlatformJD SyncPlatform = "jd" // 京东 + PlatformKuaishou SyncPlatform = "kuaishou" // 快手 + PlatformDouyin SyncPlatform = "douyin" // 抖音 + PlatformXhs SyncPlatform = "xhs" // 小红书 + PlatformPdd SyncPlatform = "pdd" // 拼多多 + PlatformXianyu SyncPlatform = "xianyu" // 闲鱼 + PlatformTmall SyncPlatform = "tmall" // 天猫 + PlatformWechat SyncPlatform = "wechat" // 微信 + PlatformCustom SyncPlatform = "custom" // 自定义平台 +) + +func (s SyncPlatform) String() string { + return string(s) +} diff --git a/consts/api-feature/transform_type.go b/consts/api-feature/transform_type.go new file mode 100644 index 0000000..3154e83 --- /dev/null +++ b/consts/api-feature/transform_type.go @@ -0,0 +1,16 @@ +package api_feature + +// TransformType 转换类型 +type TransformType string + +const ( + TransformTypeFixed TransformType = "fixed" // 固定值 + TransformTypeMapping TransformType = "mapping" // 值映射 + TransformTypeRegex TransformType = "regex" // 正则转换 + TransformTypeFunction TransformType = "function" // 函数转换 + TransformTypeScript TransformType = "script" // 脚本转换 +) + +func (t TransformType) String() string { + return string(t) +} diff --git a/consts/dict/consts.go b/consts/dict/consts.go new file mode 100644 index 0000000..1f34334 --- /dev/null +++ b/consts/dict/consts.go @@ -0,0 +1,51 @@ +package dict + +// 转换类型 +const ( + TransformTypeDirect = "direct" // 直接映射 + TransformTypeFormatDate = "formatDate" // 日期格式化 + TransformTypeMapValue = "mapValue" // 值映射 + TransformTypeConcat = "concat" // 拼接 + TransformTypeCalc = "calc" // 计算 + TransformTypeRegex = "regex" // 正则提取 +) + +// 业务域 +const ( + BusinessDomainUser = "user" // 用户 + BusinessDomainOrder = "order" // 订单 + BusinessDomainProduct = "product" // 商品 + BusinessDomainPayment = "payment" // 支付 +) + +// 字段类型 +const ( + FieldTypeString = "string" + FieldTypeNumber = "number" + FieldTypeInteger = "integer" + FieldTypeBoolean = "boolean" + FieldTypeArray = "array" + FieldTypeObject = "object" + FieldTypeDate = "date" + FieldTypeTime = "time" + FieldTypeDateTime = "datetime" +) + +// 平台状态 +type PlatformStatus string + +const ( + PlatformStatusActive PlatformStatus = "active" + PlatformStatusInactive PlatformStatus = "inactive" +) + +// 接口方法 +type ApiMethod string + +const ( + ApiMethodGET ApiMethod = "GET" + ApiMethodPOST ApiMethod = "POST" + ApiMethodPUT ApiMethod = "PUT" + ApiMethodDELETE ApiMethod = "DELETE" + ApiMethodPATCH ApiMethod = "PATCH" +) diff --git a/consts/public/collections.go b/consts/public/collections.go new file mode 100644 index 0000000..cdf1acd --- /dev/null +++ b/consts/public/collections.go @@ -0,0 +1,19 @@ +package public + +// PostgreSQL表名常量 +const ( + ApiInterfaceTable = "cid_api_interface" // 接口管理表 + CidAccountReportDetailTable = "cid_account_report_detail" // 广告账户数据明细表 + CidAccountReportSumTable = "cid_account_report_sum" // 广告账户数据汇总表 + FieldMappingConfigTable = "field_mapping_config" // 字段映射表 + DatasourcePlatformTable = "datasource_platform" // 数据源平台表 + TaskReportTable = "task_report" // 调控任务数据表 + PopulationReportTable = "population_report" // 人群报表表 + MaterialReportTable = "material_report" // 素材报表表 + StorewideReportSumTable = "storewide_report_sum" // 全站数据sum表 + StorewideReportDetailTable = "storewide_report_detail" // 全站数据detail表 + CreativeReportSumTable = "creative_report_sum" // 广告创意数据sum表 + CreativeReportDetailTable = "creative_report_detail" // 广告创意数据detail表 + UnitReportSumTable = "unit_report_sum" // 广告创意数据detail表 + UnitReportDetailTable = "unit_report_detail" // 广告创意数据detail表 +) diff --git a/controller/copydata/api_account_report_controller.go b/controller/copydata/api_account_report_controller.go new file mode 100644 index 0000000..3dc6ee2 --- /dev/null +++ b/controller/copydata/api_account_report_controller.go @@ -0,0 +1,32 @@ +package copydata + +import ( + dto "cid/model/dto/copydata" + service "cid/service/copydata" + "context" +) + +type AccountReport struct{} + +// AccountReportDetail CidAccountReportDetail 广告数据报表详情控制器 +var AccountReportDetail = new(AccountReport) + +// CreateCidAccountReportDetail 创建广告数据报表详情 +func (c *AccountReport) CreateCidAccountReportDetail(ctx context.Context, req *dto.CreateCidAccountReportDetailReq) (res *dto.CreateCidAccountReportDetailRes, err error) { + return service.CidAccountReportDetail.Create(ctx, req.CidAccountReportDetailItem) +} + +// BatchCreateCidAccountReportDetail 批量创建广告数据报表详情 +func (c *AccountReport) BatchCreateCidAccountReportDetail(ctx context.Context, req *dto.BatchCreateCidAccountReportDetailReq) (res *dto.BatchCreateCidAccountReportDetailRes, err error) { + return service.CidAccountReportDetail.BatchCreate(ctx, req) +} + +// CreateCidAccountReportSum 创建广告数据报表汇总 +func (c *AccountReport) CreateCidAccountReportSum(ctx context.Context, req *dto.CreateCidAccountReportSumReq) (res *dto.CreateCidAccountReportSumRes, err error) { + return service.CidAccountReportDetail.CreateSum(ctx, req.CidAccountReportSumItem) +} + +// BatchCreateCidAccountReportSum 批量创建广告数据报表汇总 +func (c *AccountReport) BatchCreateCidAccountReportSum(ctx context.Context, req *dto.BatchCreateCidAccountReportSumReq) (res *dto.BatchCreateCidAccountReportSumRes, err error) { + return service.CidAccountReportDetail.BatchCreateSum(ctx, req) +} diff --git a/controller/copydata/creative_report_sum_controller.go b/controller/copydata/creative_report_sum_controller.go new file mode 100644 index 0000000..8289b83 --- /dev/null +++ b/controller/copydata/creative_report_sum_controller.go @@ -0,0 +1,30 @@ +package copydata + +import ( + dto "cid/model/dto/copydata" + service "cid/service/copydata" + "context" +) + +type creativeReport struct{} + +// CreativeReport 广告效果指标表控制器 +var CreativeReport = new(creativeReport) + +// CreateCreativeReportSum 创建广告效果指标表 +func (c *creativeReport) CreateCreativeReportSum(ctx context.Context, req *dto.CreateCreativeReportSumReq) (res *dto.CreateCreativeReportSumRes, err error) { + return service.CreativeReportSum.Create(ctx, req.CreativeReportSumItem) +} + +// BatchCreateCreativeReportSum 批量创建广告效果指标表 +func (c *creativeReport) BatchCreateCreativeReportSum(ctx context.Context, req *dto.BatchCreateCreativeReportSumReq) (res *dto.BatchCreateCreativeReportSumRes, err error) { + return service.CreativeReportSum.BatchCreate(ctx, req) +} + +func (c *creativeReport) CreateCreativeReportDetail(ctx context.Context, req *dto.CreateCreativeReportDetailReq) (res *dto.CreateCreativeReportDetailRes, err error) { + return service.CreativeReportSum.CreateDetail(ctx, req.CreativeReportDetailItem) +} + +func (c *creativeReport) BatchCreateCreativeReportDetail(ctx context.Context, req *dto.BatchCreateCreativeReportDetailReq) (res *dto.BatchCreateCreativeReportDetailRes, err error) { + return service.CreativeReportSum.BatchCreateDetail(ctx, req) +} diff --git a/controller/copydata/material_report_controller.go b/controller/copydata/material_report_controller.go new file mode 100644 index 0000000..c44f9fa --- /dev/null +++ b/controller/copydata/material_report_controller.go @@ -0,0 +1,27 @@ +package copydata + +import ( + dto "cid/model/dto/copydata" + service "cid/service/copydata" + "context" +) + +type materialReport struct{} + +// MaterialReport 素材报表数据控制器 +var MaterialReport = new(materialReport) + +// CreateMaterialReport 创建素材报表数据 +func (c *materialReport) CreateMaterialReport(ctx context.Context, req *dto.CreateMaterialReportReq) (res *dto.CreateMaterialReportRes, err error) { + return service.MaterialReport.Create(ctx, req.MaterialReportItem) +} + +// BatchCreateMaterialReport 批量创建素材报表数据 +func (c *materialReport) BatchCreateMaterialReport(ctx context.Context, req *dto.BatchCreateMaterialReportReq) (res *dto.BatchCreateMaterialReportRes, err error) { + return service.MaterialReport.BatchCreate(ctx, req) +} + +// ListMaterialReport 获取素材报表数据列表 +func (c *materialReport) ListMaterialReport(ctx context.Context, req *dto.ListMaterialReportReq) (res *dto.ListMaterialReportRes, err error) { + return service.MaterialReport.List(ctx, req) +} diff --git a/controller/copydata/population_report_controller.go b/controller/copydata/population_report_controller.go new file mode 100644 index 0000000..8731a40 --- /dev/null +++ b/controller/copydata/population_report_controller.go @@ -0,0 +1,29 @@ +package copydata + +import ( + dto "cid/model/dto/copydata" + service "cid/service/copydata" + "context" + + "gitea.com/red-future/common/beans" +) + +var PopulationReport = new(populationReport) + +type populationReport struct{} + +// CreatePopulationReport 创建人群报表数据 +func (c *populationReport) CreatePopulationReport(ctx context.Context, req *dto.CreatePopulationReportReq) (*dto.CreatePopulationReportRes, error) { + return service.PopulationReportService.Create(ctx, req.PopulationReportItem) +} + +// BatchCreatePopulationReport 批量创建人群报表数据 +func (c *populationReport) BatchCreatePopulationReport(ctx context.Context, req *dto.BatchCreatePopulationReportReq) (*dto.BatchCreatePopulationReportRes, error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + return service.PopulationReportService.BatchCreate(ctx, req.Items) +} + +// ListPopulationReport 查询人群报表数据列表 +func (c *populationReport) ListPopulationReport(ctx context.Context, req *dto.ListPopulationReportReq) (*dto.ListPopulationReportRes, error) { + return service.PopulationReportService.List(ctx, req) +} diff --git a/controller/copydata/storewide_report_sum_controller.go b/controller/copydata/storewide_report_sum_controller.go new file mode 100644 index 0000000..c281f7e --- /dev/null +++ b/controller/copydata/storewide_report_sum_controller.go @@ -0,0 +1,32 @@ +package copydata + +import ( + dto "cid/model/dto/copydata" + service "cid/service/copydata" + "context" +) + +type storewideReport struct{} + +// StorewideReport 广告效果指标控制器 +var StorewideReport = new(storewideReport) + +// CreateStorewideReport 创建广告效果指标表 +func (c *storewideReport) CreateStorewideReport(ctx context.Context, req *dto.CreateStorewideReportSumReq) (res *dto.CreateStorewideReportSumRes, err error) { + return service.StorewideReportSum.Create(ctx, req.StorewideReportSumItem) +} + +// BatchCreateStorewideReport 批量创建广告效果指标表 +func (c *storewideReport) BatchCreateStorewideReport(ctx context.Context, req *dto.BatchCreateStorewideReportSumReq) (res *dto.BatchCreateStorewideReportSumRes, err error) { + return service.StorewideReportSum.BatchCreate(ctx, req) +} + +// CreateStorewideReportDetail 创建广告效果指标表 +func (c *storewideReport) CreateStorewideReportDetail(ctx context.Context, req *dto.CreateStorewideReportDetailReq) (res *dto.CreateStorewideReportDetailRes, err error) { + return service.StorewideReportSum.CreateDetail(ctx, req.StorewideReportDetailItem) +} + +// BatchCreateStorewideReportDetail 批量创建广告效果指标表 +func (c *storewideReport) BatchCreateStorewideReportDetail(ctx context.Context, req *dto.BatchCreateStorewideReportDetailReq) (res *dto.BatchCreateStorewideReportDetailRes, err error) { + return service.StorewideReportSum.BatchCreateDetail(ctx, req) +} diff --git a/controller/copydata/task_report_controller.go b/controller/copydata/task_report_controller.go new file mode 100644 index 0000000..52a8421 --- /dev/null +++ b/controller/copydata/task_report_controller.go @@ -0,0 +1,27 @@ +package copydata + +import ( + dto "cid/model/dto/copydata" + service "cid/service/copydata" + "context" +) + +type taskReport struct{} + +// TaskReport 调控任务数据控制器 +var TaskReport = new(taskReport) + +// CreateTaskReport 创建调控任务数据 +func (c *taskReport) CreateTaskReport(ctx context.Context, req *dto.CreateTaskReportReq) (res *dto.CreateTaskReportRes, err error) { + return service.TaskReport.Create(ctx, req.TaskReportItem) +} + +// BatchCreateTaskReport 批量创建调控任务数据 +func (c *taskReport) BatchCreateTaskReport(ctx context.Context, req *dto.BatchCreateTaskReportReq) (res *dto.BatchCreateTaskReportRes, err error) { + return service.TaskReport.BatchCreate(ctx, req) +} + +// ListTaskReport 获取调控任务数据列表 +func (c *taskReport) ListTaskReport(ctx context.Context, req *dto.ListTaskReportReq) (res *dto.ListTaskReportRes, err error) { + return service.TaskReport.List(ctx, req) +} diff --git a/controller/copydata/unit_report_controller.go b/controller/copydata/unit_report_controller.go new file mode 100644 index 0000000..0172102 --- /dev/null +++ b/controller/copydata/unit_report_controller.go @@ -0,0 +1,35 @@ +package copydata + +import ( + dto "cid/model/dto/copydata" + "cid/service/copydata" + "context" + + "gitea.com/red-future/common/beans" +) + +type unitReport struct{} + +// UnitReport 获取广告单元数据控制器 +var UnitReport = new(unitReport) + +// Create 创建广告效果指标 +func (c *unitReport) Create(ctx context.Context, req *dto.CreateUnitReportSumReq) (res *dto.CreateUnitReportSumRes, err error) { + return copydata.UnitReportSumService.Create(ctx, req.UnitReportSumItem) +} + +// BatchCreate 批量创建广告效果指标 +func (c *unitReport) BatchCreate(ctx context.Context, req *dto.BatchCreateUnitReportSumReq) (res *dto.BatchCreateUnitReportSumRes, err error) { + return copydata.UnitReportSumService.BatchCreate(ctx, req) +} + +// CreateDetail 创建广告效果指标详情 +func (c *unitReport) CreateDetail(ctx context.Context, req *dto.CreateUnitReportDetailReq) (res *dto.CreateUnitReportDetailRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + return copydata.UnitReportSumService.CreateDetail(ctx, req.UnitReportDetailItem) +} + +// BatchCreateDetail 批量创建广告效果指标详情 +func (c *unitReport) BatchCreateDetail(ctx context.Context, req *dto.BatchCreateUnitReportDetailReq) (res *dto.BatchCreateUnitReportDetailRes, err error) { + return copydata.UnitReportSumService.BatchCreateDetail(ctx, req) +} diff --git a/controller/dict/api_datasource_platform_controller.go b/controller/dict/api_datasource_platform_controller.go new file mode 100644 index 0000000..67c416f --- /dev/null +++ b/controller/dict/api_datasource_platform_controller.go @@ -0,0 +1,71 @@ +package dict + +import ( + dto "cid/model/dto/dict" + service "cid/service/dict" + "context" + + "gitea.com/red-future/common/beans" +) + +type datasourcePlatformController struct{} + +// DatasourcePlatform 数据源平台控制器 +var DatasourcePlatform = new(datasourcePlatformController) + +// CreateDatasourcePlatform 创建数据源平台 +func (c *datasourcePlatformController) CreateDatasourcePlatform(ctx context.Context, req *dto.CreateDatasourcePlatformReq) (res *dto.CreateDatasourcePlatformRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + return service.DatasourcePlatform.Create(ctx, req) +} + +// ListDatasourcePlatforms 获取数据源平台列表 +func (c *datasourcePlatformController) ListDatasourcePlatforms(ctx context.Context, req *dto.ListDatasourcePlatformReq) (res *dto.ListDatasourcePlatformRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + return service.DatasourcePlatform.List(ctx, req) +} + +// GetDatasourcePlatform 获取数据源平台详情 +func (c *datasourcePlatformController) GetDatasourcePlatform(ctx context.Context, req *dto.GetDatasourcePlatformReq) (res *dto.GetDatasourcePlatformRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + return service.DatasourcePlatform.GetOne(ctx, req) +} + +// GetPlatformByCode 根据平台编码获取平台信息 +func (c *datasourcePlatformController) GetPlatformByCode(ctx context.Context, req *dto.GetPlatformByCodeReq) (res *dto.GetPlatformByCodeRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + platform, err := service.DatasourcePlatform.GetByPlatformCode(ctx, req.PlatformCode) + if err != nil { + return nil, err + } + return &dto.GetPlatformByCodeRes{ + DatasourcePlatform: platform, + }, nil +} + +// UpdateDatasourcePlatform 更新数据源平台 +func (c *datasourcePlatformController) UpdateDatasourcePlatform(ctx context.Context, req *dto.UpdateDatasourcePlatformReq) (res *beans.ResponseEmpty, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + err = service.DatasourcePlatform.Update(ctx, req) + return +} + +// UpdateDatasourcePlatformStatus 更新数据源平台状态 +func (c *datasourcePlatformController) UpdateDatasourcePlatformStatus(ctx context.Context, req *dto.UpdateDatasourcePlatformStatusReq) (res *beans.ResponseEmpty, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + err = service.DatasourcePlatform.UpdateStatus(ctx, req) + return +} + +// DeleteDatasourcePlatform 删除数据源平台 +func (c *datasourcePlatformController) DeleteDatasourcePlatform(ctx context.Context, req *dto.DeleteDatasourcePlatformReq) (res *beans.ResponseEmpty, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + err = service.DatasourcePlatform.Delete(ctx, req) + return +} + +// GetPlatformStatistics 获取平台统计信息 +func (c *datasourcePlatformController) GetPlatformStatistics(ctx context.Context, req *dto.GetPlatformStatisticsReq) (res *dto.GetPlatformStatisticsRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + return service.DatasourcePlatform.GetStatistics(ctx) +} diff --git a/controller/dict/api_field_mapping_config_controller.go b/controller/dict/api_field_mapping_config_controller.go new file mode 100644 index 0000000..45af8e4 --- /dev/null +++ b/controller/dict/api_field_mapping_config_controller.go @@ -0,0 +1,65 @@ +package dict + +import ( + dto "cid/model/dto/dict" + service "cid/service/dict" + "context" + + "gitea.com/red-future/common/beans" +) + +type fieldMappingConfigController struct{} + +// FieldMappingConfig 字段映射配置控制器 +var FieldMappingConfig = new(fieldMappingConfigController) + +// CreateFieldMappingConfig 创建字段映射配置 +func (c *fieldMappingConfigController) CreateFieldMappingConfig(ctx context.Context, req *dto.CreateFieldMappingConfigReq) (res *dto.CreateFieldMappingConfigRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + return service.FieldMappingConfig.Create(ctx, req) +} + +// ListFieldMappingConfig 获取字段映射配置列表 +func (c *fieldMappingConfigController) ListFieldMappingConfig(ctx context.Context, req *dto.ListFieldMappingConfigReq) (res *dto.ListFieldMappingConfigRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + return service.FieldMappingConfig.List(ctx, req) +} + +// GetFieldMappingConfig 获取字段映射配置详情 +func (c *fieldMappingConfigController) GetFieldMappingConfig(ctx context.Context, req *dto.GetFieldMappingConfigReq) (res *dto.GetFieldMappingConfigRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + return service.FieldMappingConfig.GetOne(ctx, req) +} + +// UpdateFieldMappingConfig 更新字段映射配置 +func (c *fieldMappingConfigController) UpdateFieldMappingConfig(ctx context.Context, req *dto.UpdateFieldMappingConfigReq) (res *beans.ResponseEmpty, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + err = service.FieldMappingConfig.Update(ctx, req) + return +} + +// UpdateFieldMappingConfigStatus 更新字段映射配置状态 +func (c *fieldMappingConfigController) UpdateFieldMappingConfigStatus(ctx context.Context, req *dto.UpdateFieldMappingConfigStatusReq) (res *beans.ResponseEmpty, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + err = service.FieldMappingConfig.UpdateStatus(ctx, req) + return +} + +// DeleteFieldMappingConfig 删除字段映射配置 +func (c *fieldMappingConfigController) DeleteFieldMappingConfig(ctx context.Context, req *dto.DeleteFieldMappingConfigReq) (res *beans.ResponseEmpty, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + err = service.FieldMappingConfig.Delete(ctx, req) + return +} + +// QueryFieldMappingByVendorApi 根据厂商和接口查询字段映射 +func (c *fieldMappingConfigController) QueryFieldMappingByVendorApi(ctx context.Context, req *dto.QueryFieldMappingByVendorApiReq) (res *dto.QueryFieldMappingByVendorApiRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + return service.FieldMappingConfig.QueryByVendorApi(ctx, req) +} + +// ValidateFieldMapping 验证字段映射配置 +func (c *fieldMappingConfigController) ValidateFieldMapping(ctx context.Context, req *dto.ValidateFieldMappingReq) (res *dto.ValidateFieldMappingRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + return service.FieldMappingConfig.Validate(ctx, req) +} diff --git a/controller/dict/api_interface_controller.go b/controller/dict/api_interface_controller.go new file mode 100644 index 0000000..e4ffd83 --- /dev/null +++ b/controller/dict/api_interface_controller.go @@ -0,0 +1,53 @@ +package dict + +import ( + dto "cid/model/dto/dict" + service "cid/service/dict" + "context" + + "gitea.com/red-future/common/beans" +) + +type apiInterfaceController struct{} + +// ApiInterface 接口控制器 +var ApiInterface = new(apiInterfaceController) + +// CreateApiInterface 创建接口 +func (c *apiInterfaceController) CreateApiInterface(ctx context.Context, req *dto.CreateApiInterfaceReq) (res *dto.CreateApiInterfaceRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + return service.ApiInterface.Create(ctx, req) +} + +// ListApiInterface 获取接口列表 +func (c *apiInterfaceController) ListApiInterface(ctx context.Context, req *dto.ListApiInterfaceReq) (res *dto.ListApiInterfaceRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + return service.ApiInterface.List(ctx, req) +} + +// GetApiInterface 获取接口详情 +func (c *apiInterfaceController) GetApiInterface(ctx context.Context, req *dto.GetApiInterfaceReq) (res *dto.GetApiInterfaceRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + return service.ApiInterface.GetOne(ctx, req) +} + +// UpdateApiInterface 更新接口 +func (c *apiInterfaceController) UpdateApiInterface(ctx context.Context, req *dto.UpdateApiInterfaceReq) (res *beans.ResponseEmpty, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + err = service.ApiInterface.Update(ctx, req) + return +} + +// UpdateApiInterfaceStatus 更新接口状态 +func (c *apiInterfaceController) UpdateApiInterfaceStatus(ctx context.Context, req *dto.UpdateApiInterfaceStatusReq) (res *beans.ResponseEmpty, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + err = service.ApiInterface.UpdateStatus(ctx, req) + return +} + +// DeleteApiInterface 删除接口 +func (c *apiInterfaceController) DeleteApiInterface(ctx context.Context, req *dto.DeleteApiInterfaceReq) (res *beans.ResponseEmpty, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + err = service.ApiInterface.Delete(ctx, req) + return +} diff --git a/dao/copydata/api_account_report_detail_dao.go b/dao/copydata/api_account_report_detail_dao.go new file mode 100644 index 0000000..d4e3687 --- /dev/null +++ b/dao/copydata/api_account_report_detail_dao.go @@ -0,0 +1,86 @@ +package copydata + +import ( + consts "cid/consts/public" + dto "cid/model/dto/copydata" + entity "cid/model/entity/copydata" + "context" + "errors" + + "gitea.com/red-future/common/db/gfdb" + "github.com/gogf/gf/v2/util/gconv" +) + +var CidAccountReportDetail = new(cidAccountReportDetailDao) + +type cidAccountReportDetailDao struct{} + +// Insert 插入广告数据报表详情 +func (d *cidAccountReportDetailDao) Insert(ctx context.Context, req *dto.CidAccountReportDetailItem) (id int64, err error) { + var entityData *entity.CidAccountReportDetail + if err = gconv.Struct(req, &entityData); err != nil { + return + } + + r, err := gfdb.DB(ctx).Model(ctx, consts.CidAccountReportDetailTable).Data(&entityData).Insert() + if err != nil { + return + } + return r.LastInsertId() +} + +// BatchInsert 批量插入广告数据报表详情 +func (d *cidAccountReportDetailDao) BatchInsert(ctx context.Context, reqs []*dto.CidAccountReportDetailItem) (successCount int64, failCount int64, failedIndexes []int64, err error) { + if len(reqs) == 0 { + return 0, 0, nil, errors.New("批量插入数据不能为空") + } + + // 分批处理,每批100条 + batchSize := 100 + successCount = 0 + failCount = 0 + failedIndexes = make([]int64, 0) + + for i := 0; i < len(reqs); i += batchSize { + end := i + batchSize + if end > len(reqs) { + end = len(reqs) + } + + batch := reqs[i:end] + entityList := make([]*entity.CidAccountReportDetail, len(batch)) + + for j, req := range batch { + var entityData entity.CidAccountReportDetail + if err = gconv.Struct(req, &entityData); err != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+j)) + continue + } + entityList[j] = &entityData + } + + if len(entityList) == 0 { + continue + } + + // 执行批量插入 + _, err = gfdb.DB(ctx).Model(ctx, consts.CidAccountReportDetailTable).Data(entityList).Insert() + if err != nil { + // 批量插入失败,尝试逐条插入 + for k := range batch { + _, singleErr := d.Insert(ctx, batch[k]) + if singleErr != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+k)) + } else { + successCount++ + } + } + } else { + successCount += int64(len(entityList)) + } + } + + return successCount, failCount, failedIndexes, nil +} diff --git a/dao/copydata/api_account_report_sum_dao.go b/dao/copydata/api_account_report_sum_dao.go new file mode 100644 index 0000000..5cb0035 --- /dev/null +++ b/dao/copydata/api_account_report_sum_dao.go @@ -0,0 +1,86 @@ +package copydata + +import ( + consts "cid/consts/public" + dto "cid/model/dto/copydata" + entity "cid/model/entity/copydata" + "context" + "errors" + + "gitea.com/red-future/common/db/gfdb" + "github.com/gogf/gf/v2/util/gconv" +) + +var CidAccountReportSum = new(CidAccountReportSumDao) + +type CidAccountReportSumDao struct{} + +// Insert 插入广告数据报表详情 +func (d *CidAccountReportSumDao) Insert(ctx context.Context, req *dto.CidAccountReportSumItem) (id int64, err error) { + var entityData *entity.CidAccountReportSum + if err = gconv.Struct(req, &entityData); err != nil { + return + } + + r, err := gfdb.DB(ctx).Model(ctx, consts.CidAccountReportSumTable).Data(&entityData).Insert() + if err != nil { + return + } + return r.LastInsertId() +} + +// BatchInsert 批量插入广告数据报表详情 +func (d *CidAccountReportSumDao) BatchInsert(ctx context.Context, reqs []*dto.CidAccountReportSumItem) (successCount int64, failCount int64, failedIndexes []int64, err error) { + if len(reqs) == 0 { + return 0, 0, nil, errors.New("批量插入数据不能为空") + } + + // 分批处理,每批100条 + batchSize := 100 + successCount = 0 + failCount = 0 + failedIndexes = make([]int64, 0) + + for i := 0; i < len(reqs); i += batchSize { + end := i + batchSize + if end > len(reqs) { + end = len(reqs) + } + + batch := reqs[i:end] + entityList := make([]*entity.CidAccountReportSum, len(batch)) + + for j, req := range batch { + var entityData entity.CidAccountReportSum + if err = gconv.Struct(req, &entityData); err != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+j)) + continue + } + entityList[j] = &entityData + } + + if len(entityList) == 0 { + continue + } + + // 执行批量插入 + _, err = gfdb.DB(ctx).Model(ctx, consts.CidAccountReportSumTable).Data(entityList).Insert() + if err != nil { + // 批量插入失败,尝试逐条插入 + for k := range batch { + _, singleErr := d.Insert(ctx, batch[k]) + if singleErr != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+k)) + } else { + successCount++ + } + } + } else { + successCount += int64(len(entityList)) + } + } + + return successCount, failCount, failedIndexes, nil +} diff --git a/dao/copydata/creative_report_detail_dao.go b/dao/copydata/creative_report_detail_dao.go new file mode 100644 index 0000000..89c1e6f --- /dev/null +++ b/dao/copydata/creative_report_detail_dao.go @@ -0,0 +1,81 @@ +package copydata + +import ( + consts "cid/consts/public" + dto "cid/model/dto/copydata" + entity "cid/model/entity/copydata" + "context" + "errors" + + "gitea.com/red-future/common/db/gfdb" + "github.com/gogf/gf/v2/util/gconv" +) + +var CreativeReportDetail = new(CreativeReportDetailDao) + +type CreativeReportDetailDao struct{} + +func (d *CreativeReportDetailDao) Insert(ctx context.Context, req *dto.CreativeReportDetailItem) (id int64, err error) { + var entityData *entity.CreativeReportDetail + if err = gconv.Struct(req, &entityData); err != nil { + return + } + + r, err := gfdb.DB(ctx).Model(ctx, consts.CreativeReportDetailTable).Data(&entityData).Insert() + if err != nil { + return + } + return r.LastInsertId() +} + +func (d *CreativeReportDetailDao) BatchInsert(ctx context.Context, reqs []*dto.CreativeReportDetailItem) (successCount int64, failCount int64, failedIndexes []int64, err error) { + if len(reqs) == 0 { + return 0, 0, nil, errors.New("批量插入数据不能为空") + } + + batchSize := 100 + successCount = 0 + failCount = 0 + failedIndexes = make([]int64, 0) + + for i := 0; i < len(reqs); i += batchSize { + end := i + batchSize + if end > len(reqs) { + end = len(reqs) + } + + batch := reqs[i:end] + entityList := make([]*entity.CreativeReportDetail, len(batch)) + + for j, req := range batch { + var entityData entity.CreativeReportDetail + if err = gconv.Struct(req, &entityData); err != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+j)) + continue + } + entityList[j] = &entityData + } + + if len(entityList) == 0 { + continue + } + + _, err = gfdb.DB(ctx).Model(ctx, consts.CreativeReportDetailTable).Data(entityList).Insert() + if err != nil { + for k := range batch { + _, singleErr := d.Insert(ctx, batch[k]) + if singleErr != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+k)) + } else { + successCount++ + } + } + } else { + successCount += int64(len(entityList)) + } + } + + return successCount, failCount, failedIndexes, nil +} diff --git a/dao/copydata/creative_report_sum_dao.go b/dao/copydata/creative_report_sum_dao.go new file mode 100644 index 0000000..717601a --- /dev/null +++ b/dao/copydata/creative_report_sum_dao.go @@ -0,0 +1,86 @@ +package copydata + +import ( + consts "cid/consts/public" + dto "cid/model/dto/copydata" + entity "cid/model/entity/copydata" + "context" + "errors" + + "gitea.com/red-future/common/db/gfdb" + "github.com/gogf/gf/v2/util/gconv" +) + +var CreativeReportSum = new(CreativeReportSumDao) + +type CreativeReportSumDao struct{} + +// Insert 插入广告效果指标表 +func (d *CreativeReportSumDao) Insert(ctx context.Context, req *dto.CreativeReportSumItem) (id int64, err error) { + var entityData *entity.CreativeReportSum + if err = gconv.Struct(req, &entityData); err != nil { + return + } + + r, err := gfdb.DB(ctx).Model(ctx, consts.CreativeReportSumTable).Data(&entityData).Insert() + if err != nil { + return + } + return r.LastInsertId() +} + +// BatchInsert 批量插入广告效果指标表 +func (d *CreativeReportSumDao) BatchInsert(ctx context.Context, reqs []*dto.CreativeReportSumItem) (successCount int64, failCount int64, failedIndexes []int64, err error) { + if len(reqs) == 0 { + return 0, 0, nil, errors.New("批量插入数据不能为空") + } + + // 分批处理,每批 100 条 + batchSize := 100 + successCount = 0 + failCount = 0 + failedIndexes = make([]int64, 0) + + for i := 0; i < len(reqs); i += batchSize { + end := i + batchSize + if end > len(reqs) { + end = len(reqs) + } + + batch := reqs[i:end] + entityList := make([]*entity.CreativeReportSum, len(batch)) + + for j, req := range batch { + var entityData entity.CreativeReportSum + if err = gconv.Struct(req, &entityData); err != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+j)) + continue + } + entityList[j] = &entityData + } + + if len(entityList) == 0 { + continue + } + + // 执行批量插入 + _, err = gfdb.DB(ctx).Model(ctx, consts.CreativeReportSumTable).Data(entityList).Insert() + if err != nil { + // 批量插入失败,尝试逐条插入 + for k := range batch { + _, singleErr := d.Insert(ctx, batch[k]) + if singleErr != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+k)) + } else { + successCount++ + } + } + } else { + successCount += int64(len(entityList)) + } + } + + return successCount, failCount, failedIndexes, nil +} diff --git a/dao/copydata/material_report_dao.go b/dao/copydata/material_report_dao.go new file mode 100644 index 0000000..38cbf89 --- /dev/null +++ b/dao/copydata/material_report_dao.go @@ -0,0 +1,128 @@ +package copydata + +import ( + consts "cid/consts/public" + dto "cid/model/dto/copydata" + entity "cid/model/entity/copydata" + "context" + "errors" + + "gitea.com/red-future/common/db/gfdb" + "github.com/gogf/gf/v2/util/gconv" +) + +var MaterialReport = new(materialReportDao) + +type materialReportDao struct{} + +// Insert 插入素材报表数据 +func (d *materialReportDao) Insert(ctx context.Context, req *dto.MaterialReportItem) (id int64, err error) { + var entityData *entity.MaterialReport + if err = gconv.Struct(req, &entityData); err != nil { + return + } + + r, err := gfdb.DB(ctx).Model(ctx, consts.MaterialReportTable).Data(&entityData).Insert() + if err != nil { + return + } + return r.LastInsertId() +} + +// BatchInsert 批量插入素材报表数据 +func (d *materialReportDao) BatchInsert(ctx context.Context, reqs []*dto.MaterialReportItem) (successCount int64, failCount int64, failedIndexes []int64, err error) { + if len(reqs) == 0 { + return 0, 0, nil, errors.New("批量插入数据不能为空") + } + + batchSize := 100 + successCount = 0 + failCount = 0 + failedIndexes = make([]int64, 0) + + for i := 0; i < len(reqs); i += batchSize { + end := i + batchSize + if end > len(reqs) { + end = len(reqs) + } + + batch := reqs[i:end] + entityList := make([]*entity.MaterialReport, len(batch)) + + for j, req := range batch { + var entityData entity.MaterialReport + if err = gconv.Struct(req, &entityData); err != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+j)) + continue + } + entityList[j] = &entityData + } + + if len(entityList) == 0 { + continue + } + + _, err = gfdb.DB(ctx).Model(ctx, consts.MaterialReportTable).Data(entityList).Insert() + if err != nil { + for k := range batch { + _, singleErr := d.Insert(ctx, batch[k]) + if singleErr != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+k)) + } else { + successCount++ + } + } + } else { + successCount += int64(len(entityList)) + } + } + + return successCount, failCount, failedIndexes, nil +} + +// List 查询素材报表数据列表 +func (d *materialReportDao) List(ctx context.Context, req *dto.ListMaterialReportReq) ([]*entity.MaterialReport, int, error) { + model := gfdb.DB(ctx).Model(ctx, consts.MaterialReportTable).Model + + if req.ReportDateStr != "" { + model = model.Where("report_date_str", req.ReportDateStr) + } + if req.PhotoId != "" { + model = model.Where("photo_id", req.PhotoId) + } + if req.CampaignId != nil { + model = model.Where("campaign_id", req.CampaignId) + } + if req.UnitId != nil { + model = model.Where("unit_id", req.UnitId) + } + if req.CreativeId != nil { + model = model.Where("creative_id", req.CreativeId) + } + if req.Keyword != "" { + model = model.Where("(photo_name LIKE ? OR campaign_name LIKE ? OR unit_name LIKE ? OR creative_name LIKE ?)", + "%"+req.Keyword+"%", "%"+req.Keyword+"%", "%"+req.Keyword+"%", "%"+req.Keyword+"%") + } + + model = model.OrderDesc("created_at") + + total, err := model.Count() + if err != nil { + return nil, 0, err + } + + var list []*entity.MaterialReport + if req.Page != nil { + err = model.Page(int(req.Page.PageNum), int(req.Page.PageSize)).Scan(&list) + } else { + err = model.Scan(&list) + } + + if err != nil { + return nil, 0, err + } + + return list, total, nil +} diff --git a/dao/copydata/population_report_dao.go b/dao/copydata/population_report_dao.go new file mode 100644 index 0000000..80276f1 --- /dev/null +++ b/dao/copydata/population_report_dao.go @@ -0,0 +1,124 @@ +package copydata + +import ( + consts "cid/consts/public" + dto "cid/model/dto/copydata" + entity "cid/model/entity/copydata" + "context" + "errors" + + "gitea.com/red-future/common/db/gfdb" + "github.com/gogf/gf/v2/util/gconv" +) + +var PopulationReport = new(populationReportDao) + +type populationReportDao struct{} + +// Insert 插入人群报表数据 +func (d *populationReportDao) Insert(ctx context.Context, req *dto.PopulationReportItem) (id int64, err error) { + var entityData *entity.PopulationReport + if err = gconv.Struct(req, &entityData); err != nil { + return + } + + r, err := gfdb.DB(ctx).Model(ctx, consts.PopulationReportTable).Data(&entityData).Insert() + if err != nil { + return + } + return r.LastInsertId() +} + +// BatchInsert 批量插入人群报表数据 +func (d *populationReportDao) BatchInsert(ctx context.Context, reqs []*dto.PopulationReportItem) (successCount int64, failCount int64, failedIndexes []int64, err error) { + if len(reqs) == 0 { + return 0, 0, nil, errors.New("批量插入数据不能为空") + } + + // 分批处理,每批 100 条 + batchSize := 100 + successCount = 0 + failCount = 0 + failedIndexes = make([]int64, 0) + + for i := 0; i < len(reqs); i += batchSize { + end := i + batchSize + if end > len(reqs) { + end = len(reqs) + } + + batch := reqs[i:end] + entityList := make([]*entity.PopulationReport, len(batch)) + + for j, req := range batch { + var entityData entity.PopulationReport + if err = gconv.Struct(req, &entityData); err != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+j)) + continue + } + entityList[j] = &entityData + } + + if len(entityList) == 0 { + continue + } + + // 执行批量插入 + _, err = gfdb.DB(ctx).Model(ctx, consts.PopulationReportTable).Data(entityList).Insert() + if err != nil { + // 批量插入失败,尝试逐条插入 + for k := range batch { + _, singleErr := d.Insert(ctx, batch[k]) + if singleErr != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+k)) + } else { + successCount++ + } + } + } else { + successCount += int64(len(entityList)) + } + } + + return successCount, failCount, failedIndexes, nil +} + +// List 查询人群报表数据列表 +func (d *populationReportDao) List(ctx context.Context, req *dto.ListPopulationReportReq) ([]*entity.PopulationReport, int, error) { + model := gfdb.DB(ctx).Model(ctx, consts.PopulationReportTable).Model + + // 构建查询条件 + if req.ReportDateStr != "" { + model = model.Where("report_date_str", req.ReportDateStr) + } + if req.PhotoId != "" { + model = model.Where("photo_id", req.PhotoId) + } + if req.Keyword != "" { + model = model.Where("photo_name LIKE ?", "%"+req.Keyword+"%") + } + + // 设置排序 + model = model.OrderDesc("created_at") + + // 分页查询并获取总数 + total, err := model.Count() + if err != nil { + return nil, 0, err + } + + var list []*entity.PopulationReport + if req.Page != nil { + err = model.Page(int(req.Page.PageNum), int(req.Page.PageSize)).Scan(&list) + } else { + err = model.Scan(&list) + } + + if err != nil { + return nil, 0, err + } + + return list, total, nil +} diff --git a/dao/copydata/storewide_report_detail_dao.go b/dao/copydata/storewide_report_detail_dao.go new file mode 100644 index 0000000..6a3cdd1 --- /dev/null +++ b/dao/copydata/storewide_report_detail_dao.go @@ -0,0 +1,86 @@ +package copydata + +import ( + consts "cid/consts/public" + dto "cid/model/dto/copydata" + entity "cid/model/entity/copydata" + "context" + "errors" + + "gitea.com/red-future/common/db/gfdb" + "github.com/gogf/gf/v2/util/gconv" +) + +var StorewideReportDetail = new(StorewideReportDetailDao) + +type StorewideReportDetailDao struct{} + +// Insert 插入广告效果指标表 +func (d *StorewideReportDetailDao) Insert(ctx context.Context, req *dto.StorewideReportDetailItem) (id int64, err error) { + var entityData *entity.StorewideReportDetail + if err = gconv.Struct(req, &entityData); err != nil { + return + } + + r, err := gfdb.DB(ctx).Model(ctx, consts.StorewideReportDetailTable).Data(&entityData).Insert() + if err != nil { + return + } + return r.LastInsertId() +} + +// BatchInsert 批量插入广告效果指标表 +func (d *StorewideReportDetailDao) BatchInsert(ctx context.Context, reqs []*dto.StorewideReportDetailItem) (successCount int64, failCount int64, failedIndexes []int64, err error) { + if len(reqs) == 0 { + return 0, 0, nil, errors.New("批量插入数据不能为空") + } + + // 分批处理,每批 100 条 + batchSize := 100 + successCount = 0 + failCount = 0 + failedIndexes = make([]int64, 0) + + for i := 0; i < len(reqs); i += batchSize { + end := i + batchSize + if end > len(reqs) { + end = len(reqs) + } + + batch := reqs[i:end] + entityList := make([]*entity.StorewideReportDetail, len(batch)) + + for j, req := range batch { + var entityData entity.StorewideReportDetail + if err = gconv.Struct(req, &entityData); err != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+j)) + continue + } + entityList[j] = &entityData + } + + if len(entityList) == 0 { + continue + } + + // 执行批量插入 + _, err = gfdb.DB(ctx).Model(ctx, consts.StorewideReportDetailTable).Data(entityList).Insert() + if err != nil { + // 批量插入失败,尝试逐条插入 + for k := range batch { + _, singleErr := d.Insert(ctx, batch[k]) + if singleErr != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+k)) + } else { + successCount++ + } + } + } else { + successCount += int64(len(entityList)) + } + } + + return successCount, failCount, failedIndexes, nil +} diff --git a/dao/copydata/storewide_report_sum_dao.go b/dao/copydata/storewide_report_sum_dao.go new file mode 100644 index 0000000..730552e --- /dev/null +++ b/dao/copydata/storewide_report_sum_dao.go @@ -0,0 +1,86 @@ +package copydata + +import ( + consts "cid/consts/public" + dto "cid/model/dto/copydata" + entity "cid/model/entity/copydata" + "context" + "errors" + + "gitea.com/red-future/common/db/gfdb" + "github.com/gogf/gf/v2/util/gconv" +) + +var StorewideReportSum = new(StorewideReportSumDao) + +type StorewideReportSumDao struct{} + +// Insert 插入广告效果指标表 +func (d *StorewideReportSumDao) Insert(ctx context.Context, req *dto.StorewideReportSumItem) (id int64, err error) { + var entityData *entity.StorewideReportSum + if err = gconv.Struct(req, &entityData); err != nil { + return + } + + r, err := gfdb.DB(ctx).Model(ctx, consts.StorewideReportSumTable).Data(&entityData).Insert() + if err != nil { + return + } + return r.LastInsertId() +} + +// BatchInsert 批量插入广告效果指标表 +func (d *StorewideReportSumDao) BatchInsert(ctx context.Context, reqs []*dto.StorewideReportSumItem) (successCount int64, failCount int64, failedIndexes []int64, err error) { + if len(reqs) == 0 { + return 0, 0, nil, errors.New("批量插入数据不能为空") + } + + // 分批处理,每批 100 条 + batchSize := 100 + successCount = 0 + failCount = 0 + failedIndexes = make([]int64, 0) + + for i := 0; i < len(reqs); i += batchSize { + end := i + batchSize + if end > len(reqs) { + end = len(reqs) + } + + batch := reqs[i:end] + entityList := make([]*entity.StorewideReportSum, len(batch)) + + for j, req := range batch { + var entityData entity.StorewideReportSum + if err = gconv.Struct(req, &entityData); err != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+j)) + continue + } + entityList[j] = &entityData + } + + if len(entityList) == 0 { + continue + } + + // 执行批量插入 + _, err = gfdb.DB(ctx).Model(ctx, consts.StorewideReportSumTable).Data(entityList).Insert() + if err != nil { + // 批量插入失败,尝试逐条插入 + for k := range batch { + _, singleErr := d.Insert(ctx, batch[k]) + if singleErr != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+k)) + } else { + successCount++ + } + } + } else { + successCount += int64(len(entityList)) + } + } + + return successCount, failCount, failedIndexes, nil +} diff --git a/dao/copydata/task_report_dao.go b/dao/copydata/task_report_dao.go new file mode 100644 index 0000000..d052c4a --- /dev/null +++ b/dao/copydata/task_report_dao.go @@ -0,0 +1,124 @@ +package copydata + +import ( + consts "cid/consts/public" + dto "cid/model/dto/copydata" + entity "cid/model/entity/copydata" + "context" + "errors" + + "gitea.com/red-future/common/db/gfdb" + "github.com/gogf/gf/v2/util/gconv" +) + +var TaskReport = new(taskReportDao) + +type taskReportDao struct{} + +// Insert 插入调控任务数据 +func (d *taskReportDao) Insert(ctx context.Context, req *dto.TaskReportItem) (id int64, err error) { + var entityData *entity.TaskReport + if err = gconv.Struct(req, &entityData); err != nil { + return + } + + r, err := gfdb.DB(ctx).Model(ctx, consts.TaskReportTable).Data(&entityData).Insert() + if err != nil { + return + } + return r.LastInsertId() +} + +// BatchInsert 批量插入调控任务数据 +func (d *taskReportDao) BatchInsert(ctx context.Context, reqs []*dto.TaskReportItem) (successCount int64, failCount int64, failedIndexes []int64, err error) { + if len(reqs) == 0 { + return 0, 0, nil, errors.New("批量插入数据不能为空") + } + + // 分批处理,每批 100 条 + batchSize := 100 + successCount = 0 + failCount = 0 + failedIndexes = make([]int64, 0) + + for i := 0; i < len(reqs); i += batchSize { + end := i + batchSize + if end > len(reqs) { + end = len(reqs) + } + + batch := reqs[i:end] + entityList := make([]*entity.TaskReport, len(batch)) + + for j, req := range batch { + var entityData entity.TaskReport + if err = gconv.Struct(req, &entityData); err != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+j)) + continue + } + entityList[j] = &entityData + } + + if len(entityList) == 0 { + continue + } + + // 执行批量插入 + _, err = gfdb.DB(ctx).Model(ctx, consts.TaskReportTable).Data(entityList).Insert() + if err != nil { + // 批量插入失败,尝试逐条插入 + for k := range batch { + _, singleErr := d.Insert(ctx, batch[k]) + if singleErr != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+k)) + } else { + successCount++ + } + } + } else { + successCount += int64(len(entityList)) + } + } + + return successCount, failCount, failedIndexes, nil +} + +// List 查询调控任务数据列表 +func (d *taskReportDao) List(ctx context.Context, req *dto.ListTaskReportReq) ([]*entity.TaskReport, int, error) { + model := gfdb.DB(ctx).Model(ctx, consts.TaskReportTable).Model + + // 构建查询条件 + if req.ReportDateStr != "" { + model = model.Where("report_date_str", req.ReportDateStr) + } + if req.PhotoId != "" { + model = model.Where("photo_id", req.PhotoId) + } + if req.Keyword != "" { + model = model.Where("photo_name LIKE ?", "%"+req.Keyword+"%") + } + + // 设置排序 + model = model.OrderDesc("created_at") + + // 分页查询并获取总数 + total, err := model.Count() + if err != nil { + return nil, 0, err + } + + var list []*entity.TaskReport + if req.Page != nil { + err = model.Page(int(req.Page.PageNum), int(req.Page.PageSize)).Scan(&list) + } else { + err = model.Scan(&list) + } + + if err != nil { + return nil, 0, err + } + + return list, total, nil +} diff --git a/dao/copydata/unit_report_detail_dao.go b/dao/copydata/unit_report_detail_dao.go new file mode 100644 index 0000000..6382b0b --- /dev/null +++ b/dao/copydata/unit_report_detail_dao.go @@ -0,0 +1,83 @@ +package copydata + +import ( + consts "cid/consts/public" + dto "cid/model/dto/copydata" + entity "cid/model/entity/copydata" + "context" + "errors" + + "gitea.com/red-future/common/db/gfdb" + "github.com/gogf/gf/v2/util/gconv" +) + +var UnitReportDetail = new(UnitReportDetailDao) + +type UnitReportDetailDao struct{} + +// Insert 插入广告效果指标详情 +func (d *UnitReportDetailDao) Insert(ctx context.Context, req *dto.UnitReportDetailItem) (id int64, err error) { + var entityData *entity.UnitReportDetail + if err = gconv.Struct(req, &entityData); err != nil { + return + } + + r, err := gfdb.DB(ctx).Model(ctx, consts.UnitReportDetailTable).Data(&entityData).Insert() + if err != nil { + return + } + return r.LastInsertId() +} + +// BatchInsert 批量插入广告效果指标详情 +func (d *UnitReportDetailDao) BatchInsert(ctx context.Context, reqs []*dto.UnitReportDetailItem) (successCount int64, failCount int64, failedIndexes []int64, err error) { + if len(reqs) == 0 { + return 0, 0, nil, errors.New("批量插入数据不能为空") + } + + batchSize := 100 + successCount = 0 + failCount = 0 + failedIndexes = make([]int64, 0) + + for i := 0; i < len(reqs); i += batchSize { + end := i + batchSize + if end > len(reqs) { + end = len(reqs) + } + + batch := reqs[i:end] + entityList := make([]*entity.UnitReportDetail, len(batch)) + + for j, req := range batch { + var entityData entity.UnitReportDetail + if err = gconv.Struct(req, &entityData); err != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+j)) + continue + } + entityList[j] = &entityData + } + + if len(entityList) == 0 { + continue + } + + _, err = gfdb.DB(ctx).Model(ctx, consts.UnitReportDetailTable).Data(entityList).Insert() + if err != nil { + for k := range batch { + _, singleErr := d.Insert(ctx, batch[k]) + if singleErr != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+k)) + } else { + successCount++ + } + } + } else { + successCount += int64(len(entityList)) + } + } + + return successCount, failCount, failedIndexes, nil +} diff --git a/dao/copydata/unit_report_sum_dao.go b/dao/copydata/unit_report_sum_dao.go new file mode 100644 index 0000000..301bd8f --- /dev/null +++ b/dao/copydata/unit_report_sum_dao.go @@ -0,0 +1,83 @@ +package copydata + +import ( + consts "cid/consts/public" + dto "cid/model/dto/copydata" + entity "cid/model/entity/copydata" + "context" + "errors" + + "gitea.com/red-future/common/db/gfdb" + "github.com/gogf/gf/v2/util/gconv" +) + +var UnitReportSum = new(UnitReportSumDao) + +type UnitReportSumDao struct{} + +// Insert 插入广告效果指标 +func (d *UnitReportSumDao) Insert(ctx context.Context, req *dto.UnitReportSumItem) (id int64, err error) { + var entityData *entity.UnitReportSum + if err = gconv.Struct(req, &entityData); err != nil { + return + } + + r, err := gfdb.DB(ctx).Model(ctx, consts.UnitReportSumTable).Data(&entityData).Insert() + if err != nil { + return + } + return r.LastInsertId() +} + +// BatchInsert 批量插入广告效果指标 +func (d *UnitReportSumDao) BatchInsert(ctx context.Context, reqs []*dto.UnitReportSumItem) (successCount int64, failCount int64, failedIndexes []int64, err error) { + if len(reqs) == 0 { + return 0, 0, nil, errors.New("批量插入数据不能为空") + } + + batchSize := 100 + successCount = 0 + failCount = 0 + failedIndexes = make([]int64, 0) + + for i := 0; i < len(reqs); i += batchSize { + end := i + batchSize + if end > len(reqs) { + end = len(reqs) + } + + batch := reqs[i:end] + entityList := make([]*entity.UnitReportSum, len(batch)) + + for j, req := range batch { + var entityData entity.UnitReportSum + if err = gconv.Struct(req, &entityData); err != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+j)) + continue + } + entityList[j] = &entityData + } + + if len(entityList) == 0 { + continue + } + + _, err = gfdb.DB(ctx).Model(ctx, consts.UnitReportSumTable).Data(entityList).Insert() + if err != nil { + for k := range batch { + _, singleErr := d.Insert(ctx, batch[k]) + if singleErr != nil { + failCount++ + failedIndexes = append(failedIndexes, int64(i+k)) + } else { + successCount++ + } + } + } else { + successCount += int64(len(entityList)) + } + } + + return successCount, failCount, failedIndexes, nil +} diff --git a/dao/dict/api_datasource_platform_dao.go b/dao/dict/api_datasource_platform_dao.go new file mode 100644 index 0000000..9c3c82e --- /dev/null +++ b/dao/dict/api_datasource_platform_dao.go @@ -0,0 +1,239 @@ +package dict + +import ( + consts1 "cid/consts/api-feature" + consts "cid/consts/public" + dto "cid/model/dto/dict" + entity "cid/model/entity/dict" + "context" + "strconv" + "time" + + "gitea.com/red-future/common/db/gfdb" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" +) + +var DatasourcePlatform = new(datasourcePlatformDao) + +type datasourcePlatformDao struct{} + +// Insert 插入数据源平台 +func (d *datasourcePlatformDao) Insert(ctx context.Context, req *dto.CreateDatasourcePlatformReq) (ID int64, err error) { + var res *entity.DatasourcePlatform + if err = gconv.Struct(req, &res); err != nil { + return + } + // 设置创建时间 + // 设置创建时间和更新时间 + now := time.Now() + res.CreatedAt = &now + res.UpdatedAt = &now + + r, err := gfdb.DB(ctx).Model(ctx, consts.DatasourcePlatformTable).Data(&res).Insert() + if err != nil { + return + } + return r.LastInsertId() +} + +// Update 更新数据源平台 +func (d *datasourcePlatformDao) Update(ctx context.Context, req *dto.UpdateDatasourcePlatformReq) (rows int64, err error) { + // 设置更新时间 + data := gconv.Map(req) + data[entity.DatasourcePlatformCols.UpdatedAt] = time.Now() + + r, err := gfdb.DB(ctx).Model(ctx, consts.DatasourcePlatformTable). + Data(data). + OmitEmpty(). + Where(entity.DatasourcePlatformCols.ID, req.Id). + Update() + if err != nil { + return + } + return r.RowsAffected() +} + +// Delete 删除数据源平台 +func (d *datasourcePlatformDao) Delete(ctx context.Context, req *dto.DeleteDatasourcePlatformReq) (rows int64, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.DatasourcePlatformTable). + Where(entity.DatasourcePlatformCols.ID, req.Id). + Delete() + if err != nil { + return + } + return r.RowsAffected() +} + +// GetOne 获取单个数据源平台 +func (d *datasourcePlatformDao) GetOne(ctx context.Context, req *dto.GetDatasourcePlatformReq) (res *entity.DatasourcePlatform, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.DatasourcePlatformTable). + Where(entity.DatasourcePlatformCols.ID, req.Id). + One() + if err != nil { + return + } + err = r.Struct(&res) + return +} + +// GetByPlatformCode 根据平台编码获取数据源平台 +func (d *datasourcePlatformDao) GetByPlatformCode(ctx context.Context, platformCode string) (res *entity.DatasourcePlatform, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.DatasourcePlatformTable). + Where(entity.DatasourcePlatformCols.PlatformCode, platformCode). + One() + if err != nil { + return + } + err = r.Struct(&res) + return +} + +// Count 获取数据源平台数量 +func (d *datasourcePlatformDao) Count(ctx context.Context, req *dto.ListDatasourcePlatformReq) (count int, err error) { + return d.buildListFilter(ctx, req).Count() +} + +// List 获取数据源平台列表 +func (d *datasourcePlatformDao) List(ctx context.Context, req *dto.ListDatasourcePlatformReq) (res []entity.DatasourcePlatform, total int, err error) { + model := d.buildListFilter(ctx, req) + model.OrderDesc(entity.DatasourcePlatformCols.CreatedAt) + if req.Page != nil { + model.Page(int(req.Page.PageNum), int(req.Page.PageSize)) + } + r, total, err := model.AllAndCount(false) + if err != nil { + return + } + err = r.Structs(&res) + return +} + +// buildListFilter 构建列表查询的过滤条件 +func (d *datasourcePlatformDao) buildListFilter(ctx context.Context, req *dto.ListDatasourcePlatformReq) *gdb.Model { + model := gfdb.DB(ctx).Model(ctx, consts.DatasourcePlatformTable).Model + + // 关键字搜索(平台名称或编码) + if !g.IsEmpty(req.Keyword) { + model.WhereLike(entity.DatasourcePlatformCols.PlatformName, "%"+req.Keyword+"%") + model.WhereOrLike(entity.DatasourcePlatformCols.PlatformCode, "%"+req.Keyword+"%") + model.WhereOrLike(entity.DatasourcePlatformCols.Description, "%"+req.Keyword+"%") + } + + // 精确匹配条件 + if !g.IsEmpty(req.PlatformCode) { + model.Where(entity.DatasourcePlatformCols.PlatformCode, req.PlatformCode) + } + if !g.IsEmpty(req.PlatformName) { + model.Where(entity.DatasourcePlatformCols.PlatformName, req.PlatformName) + } + if !g.IsEmpty(req.Status) { + model.Where(entity.DatasourcePlatformCols.Status, req.Status) + } + if !g.IsEmpty(req.AuthType) { + model.Where(entity.DatasourcePlatformCols.AuthType, req.AuthType) + } + + model.OmitEmptyWhere() + return model +} + +// UpdateStatus 更新数据源平台状态 +func (d *datasourcePlatformDao) UpdateStatus(ctx context.Context, ID int64, status string, updatedBy string) (rows int64, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.DatasourcePlatformTable). + Data(map[string]interface{}{ + entity.DatasourcePlatformCols.Status: status, + entity.DatasourcePlatformCols.UpdatedBy: updatedBy, + entity.DatasourcePlatformCols.UpdatedAt: time.Now(), + }). + Where(entity.DatasourcePlatformCols.ID, ID). + Update() + if err != nil { + return + } + return r.RowsAffected() +} + +// ExistsByPlatformCode 检查平台编码是否存在 +func (d *datasourcePlatformDao) ExistsByPlatformCode(ctx context.Context, platformCode string, excludeId ...int64) (exists bool, err error) { + model := gfdb.DB(ctx).Model(ctx, consts.DatasourcePlatformTable). + Where(entity.DatasourcePlatformCols.PlatformCode, platformCode) + + if len(excludeId) > 0 && excludeId[0] > 0 { + model.WhereNot(entity.DatasourcePlatformCols.ID, excludeId[0]) + } + + count, err := model.Count() + if err != nil { + return false, err + } + return count > 0, nil +} + +// ListActivePlatforms 获取所有启用的平台 +func (d *datasourcePlatformDao) ListActivePlatforms(ctx context.Context) (res []entity.DatasourcePlatform, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.DatasourcePlatformTable). + Where(entity.DatasourcePlatformCols.Status, consts1.PlatformStatusActive). + OrderAsc(entity.DatasourcePlatformCols.PlatformName). + All() + if err != nil { + return + } + err = r.Structs(&res) + return +} + +// GetPlatformStatistics 获取平台统计信息 +func (d *datasourcePlatformDao) GetPlatformStatistics(ctx context.Context) (stats map[string]int64, err error) { + stats = make(map[string]int64) + + // 总平台数 + total, err := gfdb.DB(ctx).Model(ctx, consts.DatasourcePlatformTable).Count() + if err != nil { + return nil, err + } + stats["totalPlatforms"] = int64(total) + + // 启用平台数 + active, err := gfdb.DB(ctx).Model(ctx, consts.DatasourcePlatformTable). + Where(entity.DatasourcePlatformCols.Status, consts1.MappingStatusActive). + Count() + if err != nil { + return nil, err + } + stats["activePlatforms"] = int64(active) + + // 停用平台数 + stats["inactivePlatforms"] = int64(total - active) + + // 按认证类型统计 + authTypes := []string{"TOKEN", "API_KEY", "OAUTH2", "BASIC"} + for _, authType := range authTypes { + count, err := gfdb.DB(ctx).Model(ctx, consts.DatasourcePlatformTable). + Where(entity.DatasourcePlatformCols.AuthType, authType). + Count() + if err != nil { + return nil, err + } + stats[authType+"AuthPlatforms"] = int64(count) + } + + return stats, nil +} + +// BatchUpdateStatus 批量更新平台状态 +func (d *datasourcePlatformDao) BatchUpdateStatus(ctx context.Context, ids []int64, status string, updatedBy string) (rows int64, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.DatasourcePlatformTable). + Data(map[string]interface{}{ + entity.DatasourcePlatformCols.Status: status, + entity.DatasourcePlatformCols.UpdatedBy: updatedBy, + entity.DatasourcePlatformCols.UpdatedAt: strconv.FormatInt(time.Now().Unix(), 10), + }). + WhereIn(entity.DatasourcePlatformCols.ID, ids). + Update() + if err != nil { + return + } + return r.RowsAffected() +} diff --git a/dao/dict/api_field_mapping_config_dao.go b/dao/dict/api_field_mapping_config_dao.go new file mode 100644 index 0000000..e578124 --- /dev/null +++ b/dao/dict/api_field_mapping_config_dao.go @@ -0,0 +1,274 @@ +package dict + +import ( + consts "cid/consts/public" + dto "cid/model/dto/dict" + entity "cid/model/entity/dict" + "context" + "time" + + "gitea.com/red-future/common/beans" + "gitea.com/red-future/common/db/gfdb" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" +) + +var FieldMappingConfig = new(fieldMappingConfigDao) + +type fieldMappingConfigDao struct{} + +// Insert 插入字段映射配置 +func (d *fieldMappingConfigDao) Insert(ctx context.Context, req *dto.CreateFieldMappingConfigReq) (id int64, err error) { + var config entity.FieldMappingConfig + if err = gconv.Struct(req, &config); err != nil { + return + } + + now := time.Now() + config.CreatedTime = now + config.UpdatedTime = now + + r, err := gfdb.DB(ctx).Model(ctx, consts.FieldMappingConfigTable).Data(&config).Insert() + if err != nil { + return + } + return r.LastInsertId() +} + +// Update 更新字段映射配置 +func (d *fieldMappingConfigDao) Update(ctx context.Context, req *dto.UpdateFieldMappingConfigReq) (rows int64, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.FieldMappingConfigTable).Data(&req).OmitEmpty().Where(entity.FieldMappingConfigCol.Id, req.Id).Update() + if err != nil { + return + } + return r.RowsAffected() +} + +// Delete 删除字段映射配置 +func (d *fieldMappingConfigDao) Delete(ctx context.Context, req *dto.DeleteFieldMappingConfigReq) (rows int64, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.FieldMappingConfigTable). + Where(entity.FieldMappingConfigCol.Id, req.Id). + Delete() + if err != nil { + return + } + return r.RowsAffected() +} + +// GetOne 获取单个字段映射配置 +func (d *fieldMappingConfigDao) GetOne(ctx context.Context, req *dto.GetFieldMappingConfigReq) (res *entity.FieldMappingConfig, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.FieldMappingConfigTable). + Where(entity.FieldMappingConfigCol.Id, req.Id). + One() + if err != nil { + return + } + err = r.Struct(&res) + return +} + +// Count 获取字段映射配置数量 +func (d *fieldMappingConfigDao) Count(ctx context.Context, req *dto.ListFieldMappingConfigReq) (count int, err error) { + return d.buildListFilter(ctx, req).Count() +} + +// List 获取字段映射配置列表 +func (d *fieldMappingConfigDao) List(ctx context.Context, req *dto.ListFieldMappingConfigReq) (res []entity.FieldMappingConfig, total int, err error) { + model := d.buildListFilter(ctx, req) + model.OrderDesc(entity.FieldMappingConfigCol.CreatedTime) + + if req.Page != nil { + model.Page(int(req.Page.PageNum), int(req.Page.PageSize)) + } + + r, total, err := model.AllAndCount(false) + if err != nil { + return + } + err = r.Structs(&res) + return +} + +// buildListFilter 构建列表查询的过滤条件 +func (d *fieldMappingConfigDao) buildListFilter(ctx context.Context, req *dto.ListFieldMappingConfigReq) *gdb.Model { + model := gfdb.DB(ctx).Model(ctx, consts.FieldMappingConfigTable).Model + + if !g.IsEmpty(req.Keyword) { + model.WhereLike(entity.FieldMappingConfigCol.ConfigName, "%"+req.Keyword+"%"). + WhereOrLike(entity.FieldMappingConfigCol.SourceFieldDesc, "%"+req.Keyword+"%"). + WhereOrLike(entity.FieldMappingConfigCol.TargetFieldDesc, "%"+req.Keyword+"%") + } + + if !g.IsEmpty(req.ConfigName) { + model.Where(entity.FieldMappingConfigCol.ConfigName, req.ConfigName) + } + if !g.IsEmpty(req.VendorName) { + model.Where(entity.FieldMappingConfigCol.VendorName, req.VendorName) + } + if !g.IsEmpty(req.ApiName) { + model.Where(entity.FieldMappingConfigCol.ApiName, req.ApiName) + } + if !g.IsEmpty(req.ApiVersion) { + model.Where(entity.FieldMappingConfigCol.ApiVersion, req.ApiVersion) + } + if !g.IsEmpty(req.SourceField) { + model.Where(entity.FieldMappingConfigCol.SourceField, req.SourceField) + } + if !g.IsEmpty(req.TargetField) { + model.Where(entity.FieldMappingConfigCol.TargetField, req.TargetField) + } + if !g.IsEmpty(req.TransformType) { + model.Where(entity.FieldMappingConfigCol.TransformType, req.TransformType) + } + if !g.IsEmpty(req.BusinessDomain) { + model.Where(entity.FieldMappingConfigCol.BusinessDomain, req.BusinessDomain) + } + if !g.IsEmpty(req.FieldGroup) { + model.Where(entity.FieldMappingConfigCol.FieldGroup, req.FieldGroup) + } + if req.IsActive != nil { + model.Where(entity.FieldMappingConfigCol.IsActive, *req.IsActive) + } + + model.OmitEmptyWhere() + return model +} + +// UpdateStatus 更新配置状态 +func (d *fieldMappingConfigDao) UpdateStatus(ctx context.Context, id int64, isActive bool) (rows int64, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.FieldMappingConfigTable). + Data(g.Map{ + "is_active": isActive, + "updated_time": time.Now(), + }). + Where(entity.FieldMappingConfigCol.Id, id). + Update() + if err != nil { + return + } + return r.RowsAffected() +} + +// GetByIds 根据ID列表获取配置列表 +func (d *fieldMappingConfigDao) GetByIds(ctx context.Context, ids []int64) (res []entity.FieldMappingConfig, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.FieldMappingConfigTable). + WhereIn(entity.FieldMappingConfigCol.Id, ids). + All() + if err != nil { + return + } + err = r.Structs(&res) + return +} + +// GetByVendorAndApi 根据厂商和接口获取字段映射配置 +func (d *fieldMappingConfigDao) GetByVendorAndApi(ctx context.Context, vendorName, apiName, apiVersion string, isActive *bool) (res []*entity.FieldMappingConfig, err error) { + model := gfdb.DB(ctx).Model(ctx, consts.FieldMappingConfigTable). + Where(entity.FieldMappingConfigCol.VendorName, vendorName). + Where(entity.FieldMappingConfigCol.ApiName, apiName) + + if !g.IsEmpty(apiVersion) { + model.Where(entity.FieldMappingConfigCol.ApiVersion, apiVersion) + } + + if isActive != nil { + model.Where(entity.FieldMappingConfigCol.IsActive, *isActive) + } + + model.OrderDesc(entity.FieldMappingConfigCol.Priority). + OrderAsc(entity.FieldMappingConfigCol.Id) + + r, err := model.All() + if err != nil { + return + } + err = r.Structs(&res) + return +} + +// CheckDuplicate 检查重复配置 +func (d *fieldMappingConfigDao) CheckDuplicate(ctx context.Context, vendorName, apiName, sourceField, targetField string, excludeId int64) (exists bool, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + model := gfdb.DB(ctx).Model(ctx, consts.FieldMappingConfigTable). + Where(entity.FieldMappingConfigCol.VendorName, vendorName). + Where(entity.FieldMappingConfigCol.ApiName, apiName). + Where(entity.FieldMappingConfigCol.SourceField, sourceField). + Where(entity.FieldMappingConfigCol.TargetField, targetField) + + if excludeId > 0 { + model.WhereNot(entity.FieldMappingConfigCol.Id, excludeId) + } + + count, err := model.Count() + if err != nil { + return + } + exists = count > 0 + return +} + +// GetActiveConfigsByBusinessDomain 根据业务域获取启用的配置 +func (d *fieldMappingConfigDao) GetActiveConfigsByBusinessDomain(ctx context.Context, businessDomain string) (res []entity.FieldMappingConfig, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.FieldMappingConfigTable). + Where(entity.FieldMappingConfigCol.BusinessDomain, businessDomain). + Where(entity.FieldMappingConfigCol.IsActive, true). + OrderDesc(entity.FieldMappingConfigCol.Priority). + OrderAsc(entity.FieldMappingConfigCol.Id). + All() + if err != nil { + return + } + err = r.Structs(&res) + return +} + +// GetFieldGroupsByVendorApi 获取指定厂商接口的字段分组 +func (d *fieldMappingConfigDao) GetFieldGroupsByVendorApi(ctx context.Context, vendorName, apiName string) (groups []string, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.FieldMappingConfigTable). + Fields(entity.FieldMappingConfigCol.FieldGroup). + Where(entity.FieldMappingConfigCol.VendorName, vendorName). + Where(entity.FieldMappingConfigCol.ApiName, apiName). + Where(entity.FieldMappingConfigCol.IsActive, true). + Group(entity.FieldMappingConfigCol.FieldGroup). + All() + if err != nil { + return + } + + for _, record := range r { + group := record.Map()[entity.FieldMappingConfigCol.FieldGroup] + if groupStr, ok := group.(string); ok && groupStr != "" { + groups = append(groups, groupStr) + } + } + return +} + +// DeleteExpiredConfigs 删除已过期的配置 +func (d *fieldMappingConfigDao) DeleteExpiredConfigs(ctx context.Context) (rows int64, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.FieldMappingConfigTable). + Where("expiry_date IS NOT NULL AND expiry_date < ?", time.Now()). + Delete() + if err != nil { + return + } + return r.RowsAffected() +} + +// GetConfigsEffectiveNow 获取当前生效的配置 +func (d *fieldMappingConfigDao) GetConfigsEffectiveNow(ctx context.Context) (res []entity.FieldMappingConfig, err error) { + now := time.Now() + r, err := gfdb.DB(ctx).Model(ctx, consts.FieldMappingConfigTable). + Where(entity.FieldMappingConfigCol.IsActive, true). + Where("(effective_date IS NULL OR effective_date <= ?)", now). + Where("(expiry_date IS NULL OR expiry_date > ?)", now). + OrderDesc(entity.FieldMappingConfigCol.Priority). + OrderAsc(entity.FieldMappingConfigCol.Id). + All() + if err != nil { + return + } + err = r.Structs(&res) + return +} diff --git a/dao/dict/api_interface_dao.go b/dao/dict/api_interface_dao.go new file mode 100644 index 0000000..8bded40 --- /dev/null +++ b/dao/dict/api_interface_dao.go @@ -0,0 +1,118 @@ +package dict + +import ( + consts "cid/consts/public" + dto "cid/model/dto/dict" + entity "cid/model/entity/dict" + "context" + + "gitea.com/red-future/common/db/gfdb" + "github.com/gogf/gf/v2/database/gdb" + "github.com/gogf/gf/v2/frame/g" + "github.com/gogf/gf/v2/util/gconv" +) + +var ApiInterface = new(apiInterfaceDao) + +type apiInterfaceDao struct{} + +// Insert 插入接口 +func (d *apiInterfaceDao) Insert(ctx context.Context, req *dto.CreateApiInterfaceReq) (id int64, err error) { + var res *entity.ApiInterface + if err = gconv.Struct(req, &res); err != nil { + return + } + r, err := gfdb.DB(ctx).Model(ctx, consts.ApiInterfaceTable).Data(&res).Insert() + if err != nil { + return + } + return r.LastInsertId() +} + +// Update 更新接口 +func (d *apiInterfaceDao) Update(ctx context.Context, req *dto.UpdateApiInterfaceReq) (rows int64, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.ApiInterfaceTable).Data(&req).OmitEmpty().Where(entity.ApiInterfaceCols.Id, req.Id).Update() + if err != nil { + return + } + return r.RowsAffected() +} + +// Delete 删除接口 +func (d *apiInterfaceDao) Delete(ctx context.Context, req *dto.DeleteApiInterfaceReq) (rows int64, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.ApiInterfaceTable).Where(entity.ApiInterfaceCols.Id, req.Id).Delete() + if err != nil { + return + } + return r.RowsAffected() +} + +// GetOne 获取单个接口 +func (d *apiInterfaceDao) GetOne(ctx context.Context, req *dto.GetApiInterfaceReq) (res *entity.ApiInterface, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.ApiInterfaceTable).Where(entity.ApiInterfaceCols.Id, req.Id).One() + if err != nil { + return + } + err = r.Struct(&res) + return +} + +// Count 获取接口数量 +func (d *apiInterfaceDao) Count(ctx context.Context, req *dto.ListApiInterfaceReq) (count int, err error) { + return d.buildListFilter(ctx, req).Count() +} + +// List 获取接口列表 +func (d *apiInterfaceDao) List(ctx context.Context, req *dto.ListApiInterfaceReq) (res []entity.ApiInterface, total int, err error) { + model := d.buildListFilter(ctx, req) + model.OrderDesc(entity.ApiInterfaceCols.CreatedAt) + if req.Page != nil { + model.Page(int(req.Page.PageNum), int(req.Page.PageSize)) + } + r, total, err := model.AllAndCount(false) + if err != nil { + return + } + err = r.Structs(&res) + return +} + +// buildListFilter 构建列表查询的过滤条件 +func (d *apiInterfaceDao) buildListFilter(ctx context.Context, req *dto.ListApiInterfaceReq) *gdb.Model { + model := gfdb.DB(ctx).Model(ctx, consts.ApiInterfaceTable).Model + if !g.IsEmpty(req.Keyword) { + model.WhereLike(entity.ApiInterfaceCols.Name, "%"+req.Keyword+"%") + model.WhereOrLike(entity.ApiInterfaceCols.Code, "%"+req.Keyword+"%") + } + model.Where(entity.ApiInterfaceCols.PlatformId, req.PlatformId) + model.Where(entity.ApiInterfaceCols.Name, req.Name) + model.Where(entity.ApiInterfaceCols.Code, req.Code) + model.Where(entity.ApiInterfaceCols.Method, req.Method) + model.Where(entity.ApiInterfaceCols.Status, req.Status) + model.OmitEmptyWhere() + return model +} + +// UpdateStatus 更新接口状态 +func (d *apiInterfaceDao) UpdateStatus(ctx context.Context, id int64, status string) (rows int64, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.ApiInterfaceTable). + Data(map[string]interface{}{"status": status}). + Where(entity.ApiInterfaceCols.Id, id). + Update() + if err != nil { + return + } + return r.RowsAffected() +} + +// GetByIds 根据ID列表获取接口列表 +func (d *apiInterfaceDao) GetByIds(ctx context.Context, ids []int64) (res []entity.ApiInterface, err error) { + r, err := gfdb.DB(ctx).Model(ctx, consts.ApiInterfaceTable). + WhereIn(entity.ApiInterfaceCols.Id, ids). + All() + if err != nil { + return + } + err = r.Structs(&res) + return +} diff --git a/entities/request.go b/entities/request.go new file mode 100644 index 0000000..4e0acf8 --- /dev/null +++ b/entities/request.go @@ -0,0 +1,70 @@ +package entities + +// RequestParams 请求参数 +type RequestParams struct { + AdvertiserID int64 `json:"advertiser_id"` + StartTime int64 `json:"start_time"` + EndTime int64 `json:"end_time"` + SelectColumns []string `json:"select_columns"` + GroupType int `json:"group_type"` + QueryVersion int `json:"query_version"` + SelectParam *SelectParam `json:"select_param"` + PageInfo *PageInfo `json:"page_info"` +} + +// SelectParam 筛选参数 +type SelectParam struct { + CampaignIDs []int64 `json:"campaign_ids,omitempty"` + AuthorID int64 `json:"author_id,omitempty"` + AdTypeStr string `json:"ad_type_str,omitempty"` + MarketingObjective int `json:"marketing_objective,omitempty"` + DeliveryScenario int `json:"delivery_scenario,omitempty"` + DeliveryMethod int `json:"delivery_method,omitempty"` + SupportType string `json:"support_type,omitempty"` + OcpcActionType string `json:"ocpc_action_type,omitempty"` + SpeedType string `json:"speed_type,omitempty"` + ItemType string `json:"item_type,omitempty"` + CreativeBuildType string `json:"creative_build_type,omitempty"` + AdScene string `json:"ad_scene,omitempty"` + IncrementExploreType []int `json:"increment_explore_type,omitempty"` +} + +// PageInfo 分页信息 +type PageInfo struct { + CurrentPage int `json:"current_page"` + PageSize int `json:"page_size"` + TotalCount int `json:"total_count,omitempty"` +} + +// NewRequestParams 创建默认请求参数 +func NewRequestParams() *RequestParams { + return &RequestParams{ + SelectColumns: []string{"impression", "click", "cost", "t0GMV"}, + GroupType: 1, + QueryVersion: 1, + SelectParam: &SelectParam{}, + PageInfo: &PageInfo{ + CurrentPage: 1, + PageSize: 20, + }, + } +} + +// SetPage 设置页码 +func (p *RequestParams) SetPage(page int) *RequestParams { + p.PageInfo.CurrentPage = page + return p +} + +// SetPageSize 设置每页大小 +func (p *RequestParams) SetPageSize(pageSize int) *RequestParams { + p.PageInfo.PageSize = pageSize + return p +} + +// ResetPage 重置分页信息 +func (p *RequestParams) ResetPage() *RequestParams { + p.PageInfo.CurrentPage = 1 + p.PageInfo.TotalCount = 0 + return p +} diff --git a/entities/response.go b/entities/response.go new file mode 100644 index 0000000..babb6ff --- /dev/null +++ b/entities/response.go @@ -0,0 +1,158 @@ +package entities + +import ( + "encoding/json" + "fmt" +) + +// APIResponse API响应 +type APIResponse struct { + Code int `json:"code"` + Message string `json:"message"` + Data *ReportData `json:"data"` +} + +// ReportData 报表数据 +type ReportData struct { + Sum *ReportSum `json:"sum"` + Detail []*ReportDetail `json:"detail"` + TotalCount int `json:"total_count"` +} + +// ReportSum 汇总数据 +type ReportSum struct { + // 基础信息 + T0OrderPaymentAmt string `json:"t0_order_payment_amt"` + CreativeMaterialType string `json:"creative_material_type"` + LiveName string `json:"live_name"` + AuthorID string `json:"author_id"` + PicURL string `json:"pic_url"` + PicName string `json:"pic_name"` + PicID string `json:"pic_id"` + CoverURL string `json:"cover_url"` + CoverID int64 `json:"cover_id"` + PhotoName string `json:"photo_name"` + PhotoIDStr string `json:"photo_id_str"` + PhotoID string `json:"photo_id"` + ModPriceSegment string `json:"mod_price_segment"` + AgeSegment string `json:"age_segment"` + Province string `json:"province"` + Gender string `json:"gender"` + MerchantProductID string `json:"merchant_product_id"` + ReportDateStr string `json:"report_date_str"` + CampaignID int64 `json:"campaign_id"` + CampaignName string `json:"campaign_name"` + UnitID int64 `json:"unit_id"` + UnitName string `json:"unit_name"` + CreativeID int64 `json:"creative_id"` + CreativeName string `json:"creative_name"` + + // 核心指标 + Impression int64 `json:"impression"` + Click int64 `json:"click"` + CostTotal float64 `json:"cost_total"` + GMV float64 `json:"gmv"` + T0GMV float64 `json:"t0_gmv"` + ROI float64 `json:"roi"` + T0ROI float64 `json:"t0_roi"` + T0OrderCnt int64 `json:"t0_order_cnt"` + + // 其他指标(简化版) + PhotoClick int64 `json:"photo_click"` + ActionbarClick int64 `json:"actionbar_click"` + AdItemClick int64 `json:"ad_item_click"` + Share int64 `json:"share"` + Comment int64 `json:"comment"` + Likes int64 `json:"likes"` + PhotoClickRatio float64 `json:"photo_click_ratio"` + Play3sRatio float64 `json:"play3s_ratio"` + Play5sRatio float64 `json:"play5s_ratio"` + EffectivePlayRatio float64 `json:"effective_play_ratio"` + + // 自定义字段 + T0OrderPaymentAmtFloat float64 `json:"-"` +} + +// ReportDetail 明细数据 +type ReportDetail struct { + ReportSum +} + +// UnmarshalJSON 自定义JSON解析 +func (rs *ReportSum) UnmarshalJSON(data []byte) error { + temp := make(map[string]interface{}) + if err := json.Unmarshal(data, &temp); err != nil { + return err + } + + // 特殊处理t0_order_payment_amt字段 + if val, ok := temp["t0_order_payment_amt"]; ok { + switch v := val.(type) { + case string: + rs.T0OrderPaymentAmt = v + if v != "" && v != "0" { + if f, err := stringToFloat64(v); err == nil { + rs.T0OrderPaymentAmtFloat = f + } + } + case float64: + rs.T0OrderPaymentAmt = fmt.Sprintf("%.0f", v) + rs.T0OrderPaymentAmtFloat = v + case int64: + rs.T0OrderPaymentAmt = fmt.Sprintf("%d", v) + rs.T0OrderPaymentAmtFloat = float64(v) + } + delete(temp, "t0_order_payment_amt") + } + + jsonData, _ := json.Marshal(temp) + type Alias ReportSum + var alias Alias + if err := json.Unmarshal(jsonData, &alias); err != nil { + return err + } + + *rs = ReportSum(alias) + return nil +} + +// stringToFloat64 字符串转浮点数 +func stringToFloat64(s string) (float64, error) { + var f float64 + _, err := fmt.Sscanf(s, "%f", &f) + return f, err +} + +// MergeData 合并多个响应数据 +func MergeData(responses []*APIResponse) *APIResponse { + if len(responses) == 0 { + return &APIResponse{ + Code: 0, + Message: "无数据", + Data: &ReportData{ + Detail: []*ReportDetail{}, + TotalCount: 0, + }, + } + } + + // 以第一个响应为基础 + merged := &APIResponse{ + Code: responses[0].Code, + Message: responses[0].Message, + Data: &ReportData{ + Sum: responses[0].Data.Sum, // 汇总数据通常只取第一页的 + Detail: []*ReportDetail{}, + TotalCount: responses[0].Data.TotalCount, + }, + } + + // 合并所有明细数据 + for _, resp := range responses { + if resp != nil && resp.Data != nil && resp.Data.Detail != nil { + merged.Data.Detail = append(merged.Data.Detail, resp.Data.Detail...) + } + } + + return merged +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..4a05f03 --- /dev/null +++ b/go.mod @@ -0,0 +1,92 @@ +module cid + +go 1.25.5 + +require ( + gitea.com/red-future/common v0.0.4 + github.com/gogf/gf/contrib/drivers/pgsql/v2 v2.10.0 + github.com/gogf/gf/contrib/nosql/redis/v2 v2.9.5 + github.com/gogf/gf/v2 v2.10.0 + github.com/olekukonko/errors v1.1.0 + golang.org/x/net v0.47.0 +) + +//replace gitea.com/red-future/common => ../common + +require ( + github.com/BurntSushi/toml v1.5.0 // indirect + github.com/armon/go-metrics v0.4.1 // indirect + github.com/bwmarrin/snowflake v0.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/clbanning/mxj/v2 v2.7.0 // indirect + github.com/dgraph-io/badger/v4 v4.2.0 // indirect + github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect + github.com/dustin/go-humanize v1.0.1 // indirect + github.com/emirpasic/gods/v2 v2.0.0-alpha // indirect + github.com/fatih/color v1.18.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/gogf/gf/contrib/registry/consul/v2 v2.9.5 // indirect + github.com/gogf/gf/contrib/trace/otlphttp/v2 v2.9.5 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang-jwt/jwt/v5 v5.3.1 // indirect + github.com/golang/glog v1.2.5 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v1.0.0 // indirect + github.com/google/flatbuffers v1.12.1 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/grokify/html-strip-tags-go v0.1.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect + github.com/hashicorp/consul/api v1.26.1 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-hclog v1.5.0 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/hashicorp/serf v0.10.1 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/lib/pq v1.10.9 // indirect + github.com/magiconair/properties v1.8.10 // indirect + github.com/mattn/go-colorable v0.1.14 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/olekukonko/ll v0.0.9 // indirect + github.com/olekukonko/tablewriter v1.1.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/redis/go-redis/v9 v9.12.1 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/tiger1103/gfast-token v1.0.10 // indirect + github.com/xdg-go/pbkdf2 v1.0.0 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect + github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect + go.mongodb.org/mongo-driver/v2 v2.4.0 // indirect + go.opencensus.io v0.23.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/otel v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 // indirect + go.opentelemetry.io/otel/metric v1.38.0 // indirect + go.opentelemetry.io/otel/sdk v1.38.0 // indirect + go.opentelemetry.io/otel/trace v1.38.0 // indirect + go.opentelemetry.io/proto/otlp v1.7.1 // indirect + golang.org/x/crypto v0.44.0 // indirect + golang.org/x/exp v0.0.0-20250128144449-3edf0e91c1ae // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/sys v0.38.0 // indirect + golang.org/x/text v0.31.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect + google.golang.org/grpc v1.75.0 // indirect + google.golang.org/protobuf v1.36.8 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/main.go b/main.go new file mode 100644 index 0000000..75d2ffb --- /dev/null +++ b/main.go @@ -0,0 +1,33 @@ +package main + +import ( + "cid/controller/copydata" + "cid/controller/dict" + + "gitea.com/red-future/common/http" + "gitea.com/red-future/common/jaeger" + _ "gitea.com/red-future/common/ragflow" // RAGFlow 客户端自动初始化 + _ "github.com/gogf/gf/contrib/drivers/pgsql/v2" + _ "github.com/gogf/gf/contrib/nosql/redis/v2" + "golang.org/x/net/context" +) + +func main() { + ctx := context.Background() + defer jaeger.ShutDown(ctx) + + http.RouteRegister([]interface{}{ + // 接口管理 + dict.ApiInterface, + dict.FieldMappingConfig, + dict.DatasourcePlatform, + copydata.AccountReportDetail, + copydata.TaskReport, + copydata.PopulationReport, + copydata.MaterialReport, + copydata.StorewideReport, + copydata.CreativeReport, + copydata.UnitReport, + }) + select {} +} diff --git a/model/dto/copydata/api_account_report_detail_dto.go b/model/dto/copydata/api_account_report_detail_dto.go new file mode 100644 index 0000000..2e94bf9 --- /dev/null +++ b/model/dto/copydata/api_account_report_detail_dto.go @@ -0,0 +1,318 @@ +package copydata + +import ( + "gitea.com/red-future/common/beans" + "github.com/gogf/gf/v2/frame/g" +) + +// CreateCidAccountReportDetailReq 创建广告数据报表详情请求 +type CreateCidAccountReportDetailReq struct { + g.Meta `path:"/createCidAccountReportDetail" method:"post" tags:"广告数据报表" summary:"创建广告数据报表详情" dc:"创建新的广告数据报表详情"` + *CidAccountReportDetailItem +} + +// CreateCidAccountReportDetailRes 创建广告数据报表详情响应 +type CreateCidAccountReportDetailRes struct { + Id int64 `json:"id" dc:"广告数据ID"` +} + +// BatchCreateCidAccountReportDetailReq 批量创建广告数据报表详情请求 +type BatchCreateCidAccountReportDetailReq struct { + g.Meta `path:"/batchCreateCidAccountReportDetail" method:"post" tags:"广告数据报表" summary:"批量创建广告数据报表详情" dc:"批量创建广告数据报表详情"` + Items []*CidAccountReportDetailItem `json:"items" v:"required" dc:"广告数据列表"` +} + +// BatchCreateCidAccountReportDetailRes 批量创建广告数据报表详情响应 +type BatchCreateCidAccountReportDetailRes struct { + SuccessCount int64 `json:"successCount" dc:"成功数量"` + FailCount int64 `json:"failCount" dc:"失败数量"` + FailedItems []int64 `json:"failedItems" dc:"失败项索引"` +} + +// CidAccountReportDetailItem 广告数据报表详情项 +type CidAccountReportDetailItem struct { + // 基础信息字段 + DataType string `json:"dataType" v:"required" dc:"类型type"` + + // 核心指标字段 + T0OrderPaymentAmt string `json:"t0OrderPaymentAmt" dc:"当日总成交订单金额"` + CreativeMaterialType string `json:"creativeMaterialType" dc:"视频素材类型"` + LiveName string `json:"liveName" dc:"直播间名称"` + AuthorId string `json:"authorId" dc:"直播用户快手Id"` + PicUrl string `json:"picUrl" dc:"图片URL"` + PicName string `json:"picName" dc:"图片名称"` + PicId string `json:"picId" dc:"图片Id"` + CoverUrl string `json:"coverUrl" dc:"封面URL"` + CoverId int64 `json:"coverId" dc:"封面Id"` + + // 转化率相关字段 + ItemOrderConversionRatio *float64 `json:"itemOrderConversionRatio" dc:"转化率"` + ItemCardClickRatio *float64 `json:"itemCardClickRatio" dc:"点击率"` + ItemCardClkCnt *int64 `json:"itemCardClkCnt" dc:"商品卡点击数"` + LivePlayCntCost *float64 `json:"livePlayCntCost" dc:"直播间观看成本"` + AdMerchantFollowCost *float64 `json:"adMerchantFollowCost" dc:"涨粉成本"` + AdMerchantFollow *int64 `json:"adMerchantFollow" dc:"涨粉数"` + NetT0OrderCnt *int64 `json:"netT0OrderCnt" dc:"当日累计净成交订单数"` + NetT0Roi *float64 `json:"netT0Roi" dc:"净成交ROI"` + NetT0Gmv *float64 `json:"netT0Gmv" dc:"净成交GMV"` + + // 视频信息字段 + PhotoName string `json:"photoName" dc:"视频名称"` + PhotoIdStr string `json:"photoIdStr" dc:"视频id"` + PhotoId string `json:"photoId" dc:"视频id"` + + // 受众属性字段 + ModPriceSegment string `json:"modPriceSegment" dc:"设备价格区间"` + AgeSegment string `json:"ageSegment" dc:"年龄段"` + Province string `json:"province" dc:"省份名称"` + Gender string `json:"gender" dc:"性别"` + + // 播放率相关字段 + AdPhotoPlayedFiveRatio *float64 `json:"adPhotoPlayedFiveRatio" dc:"作品5秒播放率"` + AdPhotoPlayedThreeRatio *float64 `json:"adPhotoPlayedThreeRatio" dc:"作品3秒播放率"` + + // 订单相关字段 + OrderSubmitRoi *float64 `json:"orderSubmitRoi" dc:"订单提交ROI"` + OrderSubmitAmt *int64 `json:"orderSubmitAmt" dc:"外部订单金额"` + EventOrderSubmitCost *float64 `json:"eventOrderSubmitCost" dc:"订单提交成本"` + EventOrderSubmit *int64 `json:"eventOrderSubmit" dc:"订单提交数"` + EventOrderPaidRoi *float64 `json:"eventOrderPaidRoi" dc:"订单支付率"` + EventAppInvoked *int64 `json:"eventAppInvoked" dc:"唤起应用数"` + EventAddShoppingCart *int64 `json:"eventAddShoppingCart" dc:"添加购物车次数"` + ConversionNumCost *float64 `json:"conversionNumCost" dc:"转化成本"` + AdEffectivePlayNum *int64 `json:"adEffectivePlayNum" dc:"有效播放数"` + AdItemClick *int64 `json:"adItemClick" dc:"行为数"` + + // 商品信息字段 + MerchantProductId string `json:"merchantProductId" dc:"商品ID"` + + // 花费相关字段 + CostTotal *float64 `json:"costTotal" dc:"花费"` + AdShow *int64 `json:"adShow" dc:"曝光数"` + AdShow1kCost *float64 `json:"adShow1kCost" dc:"平均千次广告曝光花费"` + + // 封面相关字段 + Impression *int64 `json:"impression" dc:"封面曝光数"` + PhotoClick *int64 `json:"photoClick" dc:"封面点击数"` + PhotoClickRatio *float64 `json:"photoClickRatio" dc:"封面点击率"` + + // 点击相关字段 + Click *int64 `json:"click" dc:"素材曝光数"` + ActionbarClick *int64 `json:"actionbarClick" dc:"行为数"` + ActionbarClickCost *float64 `json:"actionbarClickCost" dc:"行为成本"` + EspClickRatio *float64 `json:"espClickRatio" dc:"行为率"` + ActionRatio *float64 `json:"actionRatio" dc:"素材点击率"` + AdItemClickCount *int64 `json:"adItemClickCount" dc:"预约组件点击数"` + + // 直播时长字段 + EspLivePlayedSeconds *int64 `json:"espLivePlayedSeconds" dc:"直播平均观看时长"` + + // 播放数据字段 + PlayedThreeSeconds *int64 `json:"playedThreeSeconds" dc:"作品3秒播放数"` + Play3sRatio *float64 `json:"play3sRatio" dc:"作品3秒播放率"` + PlayedFiveSeconds *int64 `json:"playedFiveSeconds" dc:"作品5秒播放数"` + Play5sRatio *float64 `json:"play5sRatio" dc:"作品5秒播放率"` + PlayedEnd *int64 `json:"playedEnd" dc:"作品完播数"` + PlayEndRatio *float64 `json:"playEndRatio" dc:"作品完播率"` + + // 互动数据字段 + Share *int64 `json:"share" dc:"作品分享数"` + Comment *int64 `json:"comment" dc:"作品评论数"` + Likes *int64 `json:"likes" dc:"作品点赞数"` + Report *int64 `json:"report" dc:"作品举报数"` + Block *int64 `json:"block" dc:"作品拉黑数"` + ItemNegative *int64 `json:"itemNegative" dc:"详情页减少此类作品数"` + + // 直播互动字段 + LiveShare *int64 `json:"liveShare" dc:"直播送礼数"` + LiveComment *int64 `json:"liveComment" dc:"直播评论数"` + LiveReward *int64 `json:"liveReward" dc:"直播送礼数"` + + // 播放效果字段 + EffectivePlayCount *int64 `json:"effectivePlayCount" dc:"有效播放数"` + EffectivePlayRatio *float64 `json:"effectivePlayRatio" dc:"有效播放率"` + + // 转化字段 + ConversionNum *int64 `json:"conversionNum" dc:"转化数"` + ConversionCostEsp *float64 `json:"conversionCostEsp" dc:"转化成本"` + Roi *float64 `json:"roi" dc:"直接ROI"` + Gmv *float64 `json:"gmv" dc:"直接GMV"` + + // GMV时间序列字段 + T0Gmv *float64 `json:"t0Gmv" dc:"当日累计GMV"` + T1Gmv *float64 `json:"t1Gmv" dc:"次日累计GMV"` + T3Gmv *float64 `json:"t3Gmv" dc:"3日累计GMV"` + T7Gmv *float64 `json:"t7Gmv" dc:"7日累计GMV"` + T15Gmv *float64 `json:"t15Gmv" dc:"15日累计GMV"` + T30Gmv *float64 `json:"t30Gmv" dc:"30日累计GMV"` + + // ROI时间序列字段 + T0Roi *float64 `json:"t0Roi" dc:"当日累计ROI"` + T1Roi *float64 `json:"t1Roi" dc:"次日累计ROI"` + T3Roi *float64 `json:"t3Roi" dc:"3日累计ROI"` + T7Roi *float64 `json:"t7Roi" dc:"7日累计ROI"` + T15Roi *float64 `json:"t15Roi" dc:"15日累计ROI"` + T30Roi *float64 `json:"t30Roi" dc:"30日累计ROI"` + + // 订单相关字段 + PaiedOrder *int64 `json:"paiedOrder" dc:"直接订单数"` + OrderRatio *float64 `json:"orderRatio" dc:"直接下单率"` + T0OrderCnt *int64 `json:"t0OrderCnt" dc:"当日累计订单数"` + T0OrderCntCost *float64 `json:"t0OrderCntCost" dc:"当日累计订单成本"` + T0OrderCntRatio *float64 `json:"t0OrderCntRatio" dc:"累计订单下单率"` + T1OrderCnt *int64 `json:"t1OrderCnt" dc:"次日累计订单数"` + T3OrderCnt *int64 `json:"t3OrderCnt" dc:"3日累计订单数"` + T7OrderCnt *int64 `json:"t7OrderCnt" dc:"7日累计订单数"` + T15OrderCnt *int64 `json:"t15OrderCnt" dc:"15日累计订单数"` + T30OrderCnt *int64 `json:"t30OrderCnt" dc:"30日累计订单数"` + + // 粉丝相关字段 + MerchantRecoFans *int64 `json:"merchantRecoFans" dc:"涨粉数"` + T1Retention *float64 `json:"t1Retention" dc:"次日涨粉留存数"` + T7Retention *float64 `json:"t7Retention" dc:"7日涨粉留存数"` + T15Retention *float64 `json:"t15Retention" dc:"15日涨粉留存数"` + T30Retention *float64 `json:"t30Retention" dc:"30日涨粉留存数"` + T1RetentionRatio *float64 `json:"t1RetentionRatio" dc:"次日涨粉留存率"` + T7RetentionRatio *float64 `json:"t7RetentionRatio" dc:"7日涨粉留存率"` + T15RetentionRatio *float64 `json:"t15RetentionRatio" dc:"15日涨粉留存率"` + T30RetentionRatio *float64 `json:"t30RetentionRatio" dc:"30日涨粉留存率"` + + // 直播预约字段 + ReservationSuccess *int64 `json:"reservationSuccess" dc:"直播预约成功数"` + ReservationCost *float64 `json:"reservationCost" dc:"直播预约成功成本"` + + // 直播观看字段 + StandardLivePlayedStarted *int64 `json:"standardLivePlayedStarted" dc:"直播观看数"` + AdLivePlayCnt *int64 `json:"adLivePlayCnt" dc:"直播间人气数"` + AdLivePlayCntCost *float64 `json:"adLivePlayCntCost" dc:"直播间人气成本"` + LiveAudienceCost *float64 `json:"liveAudienceCost" dc:"直播观看成本"` + + // 商品点击字段 + LiveEventGoodsView *int64 `json:"liveEventGoodsView" dc:"直播间商品点击数"` + GoodsClickRatio *float64 `json:"goodsClickRatio" dc:"直播间商品点击率"` + + // 新客相关字段 + DirectAttrPlatNewBuyerCnt *int64 `json:"directAttrPlatNewBuyerCnt" dc:"直接平台新客"` + T30AttrPlatTotalBuyerCnt *int64 `json:"t30AttrPlatTotalBuyerCnt" dc:"30日累计平台新客"` + DirectAttrSellerNewBuyerCnt *int64 `json:"directAttrSellerNewBuyerCnt" dc:"直接店铺新客"` + T30AttrSellerTotalBuyerCnt *int64 `json:"t30AttrSellerTotalBuyerCnt" dc:"30日累计店铺新客"` + + // 间接订单字段 + T7IndirectOrderAmt *float64 `json:"t7IndirectOrderAmt" dc:"7日间接订单金额"` + T7IndirectOrderCnt *int64 `json:"t7IndirectOrderCnt" dc:"7日间接订单数"` + + // 粉丝人均销售额字段 + FansT0GmvPerFans *float64 `json:"fansT0GmvPerFans" dc:"新增粉丝人均销售额"` + FansT3GmvPerFans *float64 `json:"fansT3GmvPerFans" dc:"3日新增粉丝人均销售额"` + FansT7GmvPerFans *float64 `json:"fansT7GmvPerFans" dc:"7日新增粉丝人均销售额"` + FansT15GmvPerFans *float64 `json:"fansT15GmvPerFans" dc:"15日新增粉丝人均销售额"` + FansT30GmvPerFans *float64 `json:"fansT30GmvPerFans" dc:"30日新增粉丝人均销售额"` + + // 涨粉成本字段 + RecoFansCost *float64 `json:"recoFansCost" dc:"涨粉成本"` + + // 智能优惠券字段 + QcpxWhiteboxDirectOrderPaymentAmt *float64 `json:"qcpxWhiteboxDirectOrderPaymentAmt" dc:"智能优惠券订单GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `json:"qcpxWhiteboxDirectOrderCnt" dc:"智能优惠券订单数"` + + // 粉丝GMV字段 + FansT0Gmv *float64 `json:"fansT0Gmv" dc:"涨粉当日GMV"` + FansT1Gmv *float64 `json:"fansT1Gmv" dc:"涨粉次日GMV"` + FansT7Gmv *float64 `json:"fansT7Gmv" dc:"涨粉7日GMV"` + FansT15Gmv *float64 `json:"fansT15Gmv" dc:"涨粉15日GMV"` + FansT30Gmv *float64 `json:"fansT30Gmv" dc:"涨粉30日GMV"` + + // 粉丝ROI字段 + FansT0Roi *float64 `json:"fansT0Roi" dc:"涨粉当日ROI"` + FansT1Roi *float64 `json:"fansT1Roi" dc:"涨粉次日ROI"` + FansT7Roi *float64 `json:"fansT7Roi" dc:"涨粉7日ROI"` + FansT15Roi *float64 `json:"fansT15Roi" dc:"涨粉15日ROI"` + FansT30Roi *float64 `json:"fansT30Roi" dc:"涨粉30日ROI"` + + // 新客GMV字段 + T0ShopNewBuyerOrderPaymentAmt *float64 `json:"t0ShopNewBuyerOrderPaymentAmt" dc:"当日新客GMV"` + T1ShopNewBuyerOrderPaymentAmt *float64 `json:"t1ShopNewBuyerOrderPaymentAmt" dc:"投后1日新客GMV"` + T3ShopNewBuyerOrderPaymentAmt *float64 `json:"t3ShopNewBuyerOrderPaymentAmt" dc:"投后3日新客GMV"` + T7ShopNewBuyerOrderPaymentAmt *float64 `json:"t7ShopNewBuyerOrderPaymentAmt" dc:"投后7日新客GMV"` + T15ShopNewBuyerOrderPaymentAmt *float64 `json:"t15ShopNewBuyerOrderPaymentAmt" dc:"投后15日新客GMV"` + T30ShopNewBuyerOrderPaymentAmt *float64 `json:"t30ShopNewBuyerOrderPaymentAmt" dc:"投后30日新客GMV"` + + // 新客订单量字段 + T0ShopNewBuyerOrderCnt *int64 `json:"t0ShopNewBuyerOrderCnt" dc:"当日新客成交订单量"` + T1ShopNewBuyerOrderCnt *int64 `json:"t1ShopNewBuyerOrderCnt" dc:"投后1日新客成交订单量"` + T3ShopNewBuyerOrderCnt *int64 `json:"t3ShopNewBuyerOrderCnt" dc:"投后3日新客成交订单量"` + T7ShopNewBuyerOrderCnt *int64 `json:"t7ShopNewBuyerOrderCnt" dc:"投后7日新客成交订单量"` + T15ShopNewBuyerOrderCnt *int64 `json:"t15ShopNewBuyerOrderCnt" dc:"投后15日新客成交订单量"` + T30ShopNewBuyerOrderCnt *int64 `json:"t30ShopNewBuyerOrderCnt" dc:"投后30日新客成交订单量"` + + // 新客复购率字段 + T1NewBuyerRepurchaseRatio *float64 `json:"t1NewBuyerRepurchaseRatio" dc:"投后1日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `json:"t3NewBuyerRepurchaseRatio" dc:"投后3日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `json:"t7NewBuyerRepurchaseRatio" dc:"投后7日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `json:"t15NewBuyerRepurchaseRatio" dc:"投后15日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `json:"t30NewBuyerRepurchaseRatio" dc:"投后30日新客复购率"` + + // 新客ROI字段 + T0ShopNewBuyerRoi *float64 `json:"t0ShopNewBuyerRoi" dc:"投后当日新客ROI"` + T1ShopNewBuyerRoi *float64 `json:"t1ShopNewBuyerRoi" dc:"投后1日新客ROI"` + T3ShopNewBuyerRoi *float64 `json:"t3ShopNewBuyerRoi" dc:"投后3日新客ROI"` + T7ShopNewBuyerRoi *float64 `json:"t7ShopNewBuyerRoi" dc:"投后7日新客ROI"` + T15ShopNewBuyerRoi *float64 `json:"t15ShopNewBuyerRoi" dc:"投后15日新客ROI"` + T30ShopNewBuyerRoi *float64 `json:"t30ShopNewBuyerRoi" dc:"投后30日新客ROI"` + + // 电话卡相关字段 + CreateCardOrderCnt *int64 `json:"createCardOrderCnt" dc:"有效制卡订单数(回传时间)"` + ForwardTsCreateCardOrderCnt *int64 `json:"forwardTsCreateCardOrderCnt" dc:"有效制卡订单数(计费时间)"` + CreateCardOrderCost *float64 `json:"createCardOrderCost" dc:"有效制卡订单成本(回传时间)"` + ForwardTsCreateCardOrderCost *float64 `json:"forwardTsCreateCardOrderCost" dc:"有效制卡订单成本(计费时间)"` + ActivateCardOrderCnt *int64 `json:"activateCardOrderCnt" dc:"电话卡激活订单数(回传时间)"` + ForwardTsActivateCardOrderCnt *int64 `json:"forwardTsActivateCardOrderCnt" dc:"电话卡激活订单数(计费时间)"` + ActivateCardOrderCost *float64 `json:"activateCardOrderCost" dc:"电话卡激活订单成本(回传时间)"` + ForwardTsActivateCardOrderCost *float64 `json:"forwardTsActivateCardOrderCost" dc:"电话卡激活订单成本(计费时间)"` + CreateCardOrderRatio *float64 `json:"createCardOrderRatio" dc:"有效制卡订单率(回传时间)"` + ForwardTsCreateCardOrderRatio *float64 `json:"forwardTsCreateCardOrderRatio" dc:"有效制卡订单率(计费时间)"` + ActivateCardOrderCntRatio *float64 `json:"activateCardOrderCntRatio" dc:"电话卡激活率(回传时间)"` + ForwardTsActivateCardOrderRatio *float64 `json:"forwardTsActivateCardOrderRatio" dc:"电话卡激活率(计费时间)"` + + // 全站数据字段 + LivePlayCnt *int64 `json:"livePlayCnt" dc:"全站直播观看数"` + ItemEntranceClkCnt *int64 `json:"itemEntranceClkCnt" dc:"小黄车点击数"` + ShowCnt *int64 `json:"showCnt" dc:"全站曝光"` + + // 时间字段 + ReportDateStr string `json:"reportDateStr" v:"required" dc:"时间"` + + // 广告结构字段 + CampaignId *int64 `json:"campaignId" dc:"计划ID"` + CampaignName string `json:"campaignName" dc:"计划名称"` + UnitId *int64 `json:"unitId" dc:"单元ID"` + UnitName string `json:"unitName" dc:"单元名称"` + CreativeId *int64 `json:"creativeId" dc:"创意ID"` + CreativeName string `json:"creativeName" dc:"创意名称"` + + // 补贴相关字段 + CidActualRoiAfterSubsidy *float64 `json:"cidActualRoiAfterSubsidy" dc:"补贴后实际ROI"` + CidCouponAmount *int64 `json:"cidCouponAmount" dc:"核销券金额"` + CidCouponCallbackPaidRefundAmount *int64 `json:"cidCouponCallbackPaidRefundAmount" dc:"退单有回传_核销券金额"` + CidVoucherCost *float64 `json:"cidVoucherCost" dc:"券成本"` +} + +// ListCidAccountReportDetailReq 获取广告数据报表详情列表请求 +type ListCidAccountReportDetailReq struct { + g.Meta `path:"/listCidAccountReportDetail" method:"get" tags:"广告数据报表" summary:"获取广告数据报表详情列表" dc:"分页查询广告数据报表详情列表"` + *beans.Page + DataType string `json:"dataType" dc:"类型type"` + ReportDateStr string `json:"reportDateStr" dc:"时间"` + CampaignId *int64 `json:"campaignId" dc:"计划ID"` + UnitId *int64 `json:"unitId" dc:"单元ID"` + CreativeId *int64 `json:"creativeId" dc:"创意ID"` + AuthorId string `json:"authorId" dc:"直播用户快手Id"` + MerchantProductId string `json:"merchantProductId" dc:"商品ID"` + Keyword string `json:"keyword" dc:"关键字(搜索直播间名称、视频名称等)"` +} + +// ListCidAccountReportDetailRes 获取广告数据报表详情列表响应 +type ListCidAccountReportDetailRes struct { + List []*CidAccountReportDetailItem `json:"list" dc:"广告数据列表"` + Total int `json:"total" dc:"总数"` +} diff --git a/model/dto/copydata/api_account_report_sum_dto.go b/model/dto/copydata/api_account_report_sum_dto.go new file mode 100644 index 0000000..8367f5a --- /dev/null +++ b/model/dto/copydata/api_account_report_sum_dto.go @@ -0,0 +1,318 @@ +package copydata + +import ( + "gitea.com/red-future/common/beans" + "github.com/gogf/gf/v2/frame/g" +) + +// CreateCidAccountReportSumReq 创建广告数据报表详情请求 +type CreateCidAccountReportSumReq struct { + g.Meta `path:"/createCidAccountReportSum" method:"post" tags:"广告数据报表" summary:"创建广告数据报表详情" dc:"创建新的广告数据报表详情"` + *CidAccountReportSumItem +} + +// CreateCidAccountReportSumRes 创建广告数据报表详情响应 +type CreateCidAccountReportSumRes struct { + Id int64 `json:"id" dc:"广告数据ID"` +} + +// BatchCreateCidAccountReportSumReq 批量创建广告数据报表详情请求 +type BatchCreateCidAccountReportSumReq struct { + g.Meta `path:"/batchCreateCidAccountReportSum" method:"post" tags:"广告数据报表" summary:"批量创建广告数据报表详情" dc:"批量创建广告数据报表详情"` + Items []*CidAccountReportSumItem `json:"items" v:"required" dc:"广告数据列表"` +} + +// BatchCreateCidAccountReportSumRes 批量创建广告数据报表详情响应 +type BatchCreateCidAccountReportSumRes struct { + SuccessCount int64 `json:"successCount" dc:"成功数量"` + FailCount int64 `json:"failCount" dc:"失败数量"` + FailedItems []int64 `json:"failedItems" dc:"失败项索引"` +} + +// CidAccountReportSumItem 广告数据报表详情项 +type CidAccountReportSumItem struct { + // 基础信息字段 + DataType string `json:"dataType" v:"required" dc:"类型type"` + + // 核心指标字段 + T0OrderPaymentAmt string `json:"t0OrderPaymentAmt" dc:"当日总成交订单金额"` + CreativeMaterialType string `json:"creativeMaterialType" dc:"视频素材类型"` + LiveName string `json:"liveName" dc:"直播间名称"` + AuthorId string `json:"authorId" dc:"直播用户快手Id"` + PicUrl string `json:"picUrl" dc:"图片URL"` + PicName string `json:"picName" dc:"图片名称"` + PicId string `json:"picId" dc:"图片Id"` + CoverUrl string `json:"coverUrl" dc:"封面URL"` + CoverId int64 `json:"coverId" dc:"封面Id"` + + // 转化率相关字段 + ItemOrderConversionRatio *float64 `json:"itemOrderConversionRatio" dc:"转化率"` + ItemCardClickRatio *float64 `json:"itemCardClickRatio" dc:"点击率"` + ItemCardClkCnt *int64 `json:"itemCardClkCnt" dc:"商品卡点击数"` + LivePlayCntCost *float64 `json:"livePlayCntCost" dc:"直播间观看成本"` + AdMerchantFollowCost *float64 `json:"adMerchantFollowCost" dc:"涨粉成本"` + AdMerchantFollow *int64 `json:"adMerchantFollow" dc:"涨粉数"` + NetT0OrderCnt *int64 `json:"netT0OrderCnt" dc:"当日累计净成交订单数"` + NetT0Roi *float64 `json:"netT0Roi" dc:"净成交ROI"` + NetT0Gmv *float64 `json:"netT0Gmv" dc:"净成交GMV"` + + // 视频信息字段 + PhotoName string `json:"photoName" dc:"视频名称"` + PhotoIdStr string `json:"photoIdStr" dc:"视频id"` + PhotoId string `json:"photoId" dc:"视频id"` + + // 受众属性字段 + ModPriceSegment string `json:"modPriceSegment" dc:"设备价格区间"` + AgeSegment string `json:"ageSegment" dc:"年龄段"` + Province string `json:"province" dc:"省份名称"` + Gender string `json:"gender" dc:"性别"` + + // 播放率相关字段 + AdPhotoPlayedFiveRatio *float64 `json:"adPhotoPlayedFiveRatio" dc:"作品5秒播放率"` + AdPhotoPlayedThreeRatio *float64 `json:"adPhotoPlayedThreeRatio" dc:"作品3秒播放率"` + + // 订单相关字段 + OrderSubmitRoi *float64 `json:"orderSubmitRoi" dc:"订单提交ROI"` + OrderSubmitAmt *int64 `json:"orderSubmitAmt" dc:"外部订单金额"` + EventOrderSubmitCost *float64 `json:"eventOrderSubmitCost" dc:"订单提交成本"` + EventOrderSubmit *int64 `json:"eventOrderSubmit" dc:"订单提交数"` + EventOrderPaidRoi *float64 `json:"eventOrderPaidRoi" dc:"订单支付率"` + EventAppInvoked *int64 `json:"eventAppInvoked" dc:"唤起应用数"` + EventAddShoppingCart *int64 `json:"eventAddShoppingCart" dc:"添加购物车次数"` + ConversionNumCost *float64 `json:"conversionNumCost" dc:"转化成本"` + AdEffectivePlayNum *int64 `json:"adEffectivePlayNum" dc:"有效播放数"` + AdItemClick *int64 `json:"adItemClick" dc:"行为数"` + + // 商品信息字段 + MerchantProductId string `json:"merchantProductId" dc:"商品ID"` + + // 花费相关字段 + CostTotal *float64 `json:"costTotal" dc:"花费"` + AdShow *int64 `json:"adShow" dc:"曝光数"` + AdShow1kCost *float64 `json:"adShow1kCost" dc:"平均千次广告曝光花费"` + + // 封面相关字段 + Impression *int64 `json:"impression" dc:"封面曝光数"` + PhotoClick *int64 `json:"photoClick" dc:"封面点击数"` + PhotoClickRatio *float64 `json:"photoClickRatio" dc:"封面点击率"` + + // 点击相关字段 + Click *int64 `json:"click" dc:"素材曝光数"` + ActionbarClick *int64 `json:"actionbarClick" dc:"行为数"` + ActionbarClickCost *float64 `json:"actionbarClickCost" dc:"行为成本"` + EspClickRatio *float64 `json:"espClickRatio" dc:"行为率"` + ActionRatio *float64 `json:"actionRatio" dc:"素材点击率"` + AdItemClickCount *int64 `json:"adItemClickCount" dc:"预约组件点击数"` + + // 直播时长字段 + EspLivePlayedSeconds *int64 `json:"espLivePlayedSeconds" dc:"直播平均观看时长"` + + // 播放数据字段 + PlayedThreeSeconds *int64 `json:"playedThreeSeconds" dc:"作品3秒播放数"` + Play3sRatio *float64 `json:"play3sRatio" dc:"作品3秒播放率"` + PlayedFiveSeconds *int64 `json:"playedFiveSeconds" dc:"作品5秒播放数"` + Play5sRatio *float64 `json:"play5sRatio" dc:"作品5秒播放率"` + PlayedEnd *int64 `json:"playedEnd" dc:"作品完播数"` + PlayEndRatio *float64 `json:"playEndRatio" dc:"作品完播率"` + + // 互动数据字段 + Share *int64 `json:"share" dc:"作品分享数"` + Comment *int64 `json:"comment" dc:"作品评论数"` + Likes *int64 `json:"likes" dc:"作品点赞数"` + Report *int64 `json:"report" dc:"作品举报数"` + Block *int64 `json:"block" dc:"作品拉黑数"` + ItemNegative *int64 `json:"itemNegative" dc:"详情页减少此类作品数"` + + // 直播互动字段 + LiveShare *int64 `json:"liveShare" dc:"直播送礼数"` + LiveComment *int64 `json:"liveComment" dc:"直播评论数"` + LiveReward *int64 `json:"liveReward" dc:"直播送礼数"` + + // 播放效果字段 + EffectivePlayCount *int64 `json:"effectivePlayCount" dc:"有效播放数"` + EffectivePlayRatio *float64 `json:"effectivePlayRatio" dc:"有效播放率"` + + // 转化字段 + ConversionNum *int64 `json:"conversionNum" dc:"转化数"` + ConversionCostEsp *float64 `json:"conversionCostEsp" dc:"转化成本"` + Roi *float64 `json:"roi" dc:"直接ROI"` + Gmv *float64 `json:"gmv" dc:"直接GMV"` + + // GMV时间序列字段 + T0Gmv *float64 `json:"t0Gmv" dc:"当日累计GMV"` + T1Gmv *float64 `json:"t1Gmv" dc:"次日累计GMV"` + T3Gmv *float64 `json:"t3Gmv" dc:"3日累计GMV"` + T7Gmv *float64 `json:"t7Gmv" dc:"7日累计GMV"` + T15Gmv *float64 `json:"t15Gmv" dc:"15日累计GMV"` + T30Gmv *float64 `json:"t30Gmv" dc:"30日累计GMV"` + + // ROI时间序列字段 + T0Roi *float64 `json:"t0Roi" dc:"当日累计ROI"` + T1Roi *float64 `json:"t1Roi" dc:"次日累计ROI"` + T3Roi *float64 `json:"t3Roi" dc:"3日累计ROI"` + T7Roi *float64 `json:"t7Roi" dc:"7日累计ROI"` + T15Roi *float64 `json:"t15Roi" dc:"15日累计ROI"` + T30Roi *float64 `json:"t30Roi" dc:"30日累计ROI"` + + // 订单相关字段 + PaiedOrder *int64 `json:"paiedOrder" dc:"直接订单数"` + OrderRatio *float64 `json:"orderRatio" dc:"直接下单率"` + T0OrderCnt *int64 `json:"t0OrderCnt" dc:"当日累计订单数"` + T0OrderCntCost *float64 `json:"t0OrderCntCost" dc:"当日累计订单成本"` + T0OrderCntRatio *float64 `json:"t0OrderCntRatio" dc:"累计订单下单率"` + T1OrderCnt *int64 `json:"t1OrderCnt" dc:"次日累计订单数"` + T3OrderCnt *int64 `json:"t3OrderCnt" dc:"3日累计订单数"` + T7OrderCnt *int64 `json:"t7OrderCnt" dc:"7日累计订单数"` + T15OrderCnt *int64 `json:"t15OrderCnt" dc:"15日累计订单数"` + T30OrderCnt *int64 `json:"t30OrderCnt" dc:"30日累计订单数"` + + // 粉丝相关字段 + MerchantRecoFans *int64 `json:"merchantRecoFans" dc:"涨粉数"` + T1Retention *float64 `json:"t1Retention" dc:"次日涨粉留存数"` + T7Retention *float64 `json:"t7Retention" dc:"7日涨粉留存数"` + T15Retention *float64 `json:"t15Retention" dc:"15日涨粉留存数"` + T30Retention *float64 `json:"t30Retention" dc:"30日涨粉留存数"` + T1RetentionRatio *float64 `json:"t1RetentionRatio" dc:"次日涨粉留存率"` + T7RetentionRatio *float64 `json:"t7RetentionRatio" dc:"7日涨粉留存率"` + T15RetentionRatio *float64 `json:"t15RetentionRatio" dc:"15日涨粉留存率"` + T30RetentionRatio *float64 `json:"t30RetentionRatio" dc:"30日涨粉留存率"` + + // 直播预约字段 + ReservationSuccess *int64 `json:"reservationSuccess" dc:"直播预约成功数"` + ReservationCost *float64 `json:"reservationCost" dc:"直播预约成功成本"` + + // 直播观看字段 + StandardLivePlayedStarted *int64 `json:"standardLivePlayedStarted" dc:"直播观看数"` + AdLivePlayCnt *int64 `json:"adLivePlayCnt" dc:"直播间人气数"` + AdLivePlayCntCost *float64 `json:"adLivePlayCntCost" dc:"直播间人气成本"` + LiveAudienceCost *float64 `json:"liveAudienceCost" dc:"直播观看成本"` + + // 商品点击字段 + LiveEventGoodsView *int64 `json:"liveEventGoodsView" dc:"直播间商品点击数"` + GoodsClickRatio *float64 `json:"goodsClickRatio" dc:"直播间商品点击率"` + + // 新客相关字段 + DirectAttrPlatNewBuyerCnt *int64 `json:"directAttrPlatNewBuyerCnt" dc:"直接平台新客"` + T30AttrPlatTotalBuyerCnt *int64 `json:"t30AttrPlatTotalBuyerCnt" dc:"30日累计平台新客"` + DirectAttrSellerNewBuyerCnt *int64 `json:"directAttrSellerNewBuyerCnt" dc:"直接店铺新客"` + T30AttrSellerTotalBuyerCnt *int64 `json:"t30AttrSellerTotalBuyerCnt" dc:"30日累计店铺新客"` + + // 间接订单字段 + T7IndirectOrderAmt *float64 `json:"t7IndirectOrderAmt" dc:"7日间接订单金额"` + T7IndirectOrderCnt *int64 `json:"t7IndirectOrderCnt" dc:"7日间接订单数"` + + // 粉丝人均销售额字段 + FansT0GmvPerFans *float64 `json:"fansT0GmvPerFans" dc:"新增粉丝人均销售额"` + FansT3GmvPerFans *float64 `json:"fansT3GmvPerFans" dc:"3日新增粉丝人均销售额"` + FansT7GmvPerFans *float64 `json:"fansT7GmvPerFans" dc:"7日新增粉丝人均销售额"` + FansT15GmvPerFans *float64 `json:"fansT15GmvPerFans" dc:"15日新增粉丝人均销售额"` + FansT30GmvPerFans *float64 `json:"fansT30GmvPerFans" dc:"30日新增粉丝人均销售额"` + + // 涨粉成本字段 + RecoFansCost *float64 `json:"recoFansCost" dc:"涨粉成本"` + + // 智能优惠券字段 + QcpxWhiteboxDirectOrderPaymentAmt *float64 `json:"qcpxWhiteboxDirectOrderPaymentAmt" dc:"智能优惠券订单GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `json:"qcpxWhiteboxDirectOrderCnt" dc:"智能优惠券订单数"` + + // 粉丝GMV字段 + FansT0Gmv *float64 `json:"fansT0Gmv" dc:"涨粉当日GMV"` + FansT1Gmv *float64 `json:"fansT1Gmv" dc:"涨粉次日GMV"` + FansT7Gmv *float64 `json:"fansT7Gmv" dc:"涨粉7日GMV"` + FansT15Gmv *float64 `json:"fansT15Gmv" dc:"涨粉15日GMV"` + FansT30Gmv *float64 `json:"fansT30Gmv" dc:"涨粉30日GMV"` + + // 粉丝ROI字段 + FansT0Roi *float64 `json:"fansT0Roi" dc:"涨粉当日ROI"` + FansT1Roi *float64 `json:"fansT1Roi" dc:"涨粉次日ROI"` + FansT7Roi *float64 `json:"fansT7Roi" dc:"涨粉7日ROI"` + FansT15Roi *float64 `json:"fansT15Roi" dc:"涨粉15日ROI"` + FansT30Roi *float64 `json:"fansT30Roi" dc:"涨粉30日ROI"` + + // 新客GMV字段 + T0ShopNewBuyerOrderPaymentAmt *float64 `json:"t0ShopNewBuyerOrderPaymentAmt" dc:"当日新客GMV"` + T1ShopNewBuyerOrderPaymentAmt *float64 `json:"t1ShopNewBuyerOrderPaymentAmt" dc:"投后1日新客GMV"` + T3ShopNewBuyerOrderPaymentAmt *float64 `json:"t3ShopNewBuyerOrderPaymentAmt" dc:"投后3日新客GMV"` + T7ShopNewBuyerOrderPaymentAmt *float64 `json:"t7ShopNewBuyerOrderPaymentAmt" dc:"投后7日新客GMV"` + T15ShopNewBuyerOrderPaymentAmt *float64 `json:"t15ShopNewBuyerOrderPaymentAmt" dc:"投后15日新客GMV"` + T30ShopNewBuyerOrderPaymentAmt *float64 `json:"t30ShopNewBuyerOrderPaymentAmt" dc:"投后30日新客GMV"` + + // 新客订单量字段 + T0ShopNewBuyerOrderCnt *int64 `json:"t0ShopNewBuyerOrderCnt" dc:"当日新客成交订单量"` + T1ShopNewBuyerOrderCnt *int64 `json:"t1ShopNewBuyerOrderCnt" dc:"投后1日新客成交订单量"` + T3ShopNewBuyerOrderCnt *int64 `json:"t3ShopNewBuyerOrderCnt" dc:"投后3日新客成交订单量"` + T7ShopNewBuyerOrderCnt *int64 `json:"t7ShopNewBuyerOrderCnt" dc:"投后7日新客成交订单量"` + T15ShopNewBuyerOrderCnt *int64 `json:"t15ShopNewBuyerOrderCnt" dc:"投后15日新客成交订单量"` + T30ShopNewBuyerOrderCnt *int64 `json:"t30ShopNewBuyerOrderCnt" dc:"投后30日新客成交订单量"` + + // 新客复购率字段 + T1NewBuyerRepurchaseRatio *float64 `json:"t1NewBuyerRepurchaseRatio" dc:"投后1日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `json:"t3NewBuyerRepurchaseRatio" dc:"投后3日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `json:"t7NewBuyerRepurchaseRatio" dc:"投后7日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `json:"t15NewBuyerRepurchaseRatio" dc:"投后15日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `json:"t30NewBuyerRepurchaseRatio" dc:"投后30日新客复购率"` + + // 新客ROI字段 + T0ShopNewBuyerRoi *float64 `json:"t0ShopNewBuyerRoi" dc:"投后当日新客ROI"` + T1ShopNewBuyerRoi *float64 `json:"t1ShopNewBuyerRoi" dc:"投后1日新客ROI"` + T3ShopNewBuyerRoi *float64 `json:"t3ShopNewBuyerRoi" dc:"投后3日新客ROI"` + T7ShopNewBuyerRoi *float64 `json:"t7ShopNewBuyerRoi" dc:"投后7日新客ROI"` + T15ShopNewBuyerRoi *float64 `json:"t15ShopNewBuyerRoi" dc:"投后15日新客ROI"` + T30ShopNewBuyerRoi *float64 `json:"t30ShopNewBuyerRoi" dc:"投后30日新客ROI"` + + // 电话卡相关字段 + CreateCardOrderCnt *int64 `json:"createCardOrderCnt" dc:"有效制卡订单数(回传时间)"` + ForwardTsCreateCardOrderCnt *int64 `json:"forwardTsCreateCardOrderCnt" dc:"有效制卡订单数(计费时间)"` + CreateCardOrderCost *float64 `json:"createCardOrderCost" dc:"有效制卡订单成本(回传时间)"` + ForwardTsCreateCardOrderCost *float64 `json:"forwardTsCreateCardOrderCost" dc:"有效制卡订单成本(计费时间)"` + ActivateCardOrderCnt *int64 `json:"activateCardOrderCnt" dc:"电话卡激活订单数(回传时间)"` + ForwardTsActivateCardOrderCnt *int64 `json:"forwardTsActivateCardOrderCnt" dc:"电话卡激活订单数(计费时间)"` + ActivateCardOrderCost *float64 `json:"activateCardOrderCost" dc:"电话卡激活订单成本(回传时间)"` + ForwardTsActivateCardOrderCost *float64 `json:"forwardTsActivateCardOrderCost" dc:"电话卡激活订单成本(计费时间)"` + CreateCardOrderRatio *float64 `json:"createCardOrderRatio" dc:"有效制卡订单率(回传时间)"` + ForwardTsCreateCardOrderRatio *float64 `json:"forwardTsCreateCardOrderRatio" dc:"有效制卡订单率(计费时间)"` + ActivateCardOrderCntRatio *float64 `json:"activateCardOrderCntRatio" dc:"电话卡激活率(回传时间)"` + ForwardTsActivateCardOrderRatio *float64 `json:"forwardTsActivateCardOrderRatio" dc:"电话卡激活率(计费时间)"` + + // 全站数据字段 + LivePlayCnt *int64 `json:"livePlayCnt" dc:"全站直播观看数"` + ItemEntranceClkCnt *int64 `json:"itemEntranceClkCnt" dc:"小黄车点击数"` + ShowCnt *int64 `json:"showCnt" dc:"全站曝光"` + + // 时间字段 + ReportDateStr string `json:"reportDateStr" v:"required" dc:"时间"` + + // 广告结构字段 + CampaignId *int64 `json:"campaignId" dc:"计划ID"` + CampaignName string `json:"campaignName" dc:"计划名称"` + UnitId *int64 `json:"unitId" dc:"单元ID"` + UnitName string `json:"unitName" dc:"单元名称"` + CreativeId *int64 `json:"creativeId" dc:"创意ID"` + CreativeName string `json:"creativeName" dc:"创意名称"` + + // 补贴相关字段 + CidActualRoiAfterSubsidy *float64 `json:"cidActualRoiAfterSubsidy" dc:"补贴后实际ROI"` + CidCouponAmount *int64 `json:"cidCouponAmount" dc:"核销券金额"` + CidCouponCallbackPaidRefundAmount *int64 `json:"cidCouponCallbackPaidRefundAmount" dc:"退单有回传_核销券金额"` + CidVoucherCost *float64 `json:"cidVoucherCost" dc:"券成本"` +} + +// ListCidAccountReportSumReq 获取广告数据报表详情列表请求 +type ListCidAccountReportSumReq struct { + g.Meta `path:"/listCidAccountReportSum" method:"get" tags:"广告数据报表" summary:"获取广告数据报表详情列表" dc:"分页查询广告数据报表详情列表"` + *beans.Page + DataType string `json:"dataType" dc:"类型type"` + ReportDateStr string `json:"reportDateStr" dc:"时间"` + CampaignId *int64 `json:"campaignId" dc:"计划ID"` + UnitId *int64 `json:"unitId" dc:"单元ID"` + CreativeId *int64 `json:"creativeId" dc:"创意ID"` + AuthorId string `json:"authorId" dc:"直播用户快手Id"` + MerchantProductId string `json:"merchantProductId" dc:"商品ID"` + Keyword string `json:"keyword" dc:"关键字(搜索直播间名称、视频名称等)"` +} + +// ListCidAccountReportSumRes 获取广告数据报表详情列表响应 +type ListCidAccountReportSumRes struct { + List []*CidAccountReportSumItem `json:"list" dc:"广告数据列表"` + Total int `json:"total" dc:"总数"` +} diff --git a/model/dto/copydata/creative_report_detail_dto.go b/model/dto/copydata/creative_report_detail_dto.go new file mode 100644 index 0000000..ef7d580 --- /dev/null +++ b/model/dto/copydata/creative_report_detail_dto.go @@ -0,0 +1,230 @@ +package copydata + +import ( + "gitea.com/red-future/common/beans" + "github.com/gogf/gf/v2/frame/g" +) + +type CreateCreativeReportDetailReq struct { + g.Meta `path:"/createCreativeReportDetail" method:"post" tags:"广告效果明细报表" summary:"创建广告效果指标明细表" dc:"创建新的广告效果指标明细表"` + *CreativeReportDetailItem +} + +type CreateCreativeReportDetailRes struct { + Id int64 `json:"id" dc:"广告效果明细 ID"` +} + +type BatchCreateCreativeReportDetailReq struct { + g.Meta `path:"/batchCreateCreativeReportDetail" method:"post" tags:"广告效果明细报表" summary:"批量创建广告效果指标明细表" dc:"批量创建广告效果指标明细表"` + Items []*CreativeReportDetailItem `json:"items" v:"required" dc:"广告效果明细列表"` +} + +type BatchCreateCreativeReportDetailRes struct { + SuccessCount int64 `json:"successCount" dc:"成功数量"` + FailCount int64 `json:"failCount" dc:"失败数量"` + FailedItems []int64 `json:"failedItems" dc:"失败项索引"` +} + +type CreativeReportDetailItem struct { + T0OrderPaymentAmt *float64 `json:"t0OrderPaymentAmt" dc:"当日总成交订单金额"` + CreativeMaterialType string `json:"creativeMaterialType" dc:"视频素材类型"` + LiveName string `json:"liveName" dc:"直播间名称"` + AuthorId string `json:"authorId" dc:"直播用户快手 Id"` + PicUrl string `json:"picUrl" dc:"图片 URL"` + PicName string `json:"picName" dc:"图片名称"` + PicId string `json:"picId" dc:"图片 Id"` + CoverUrl string `json:"coverUrl" dc:"封面 URL"` + CoverId *int64 `json:"coverId" dc:"封面 Id"` + ItemOrderConversionRatio *float64 `json:"itemOrderConversionRatio" dc:"转化率"` + ItemCardClickRatio *float64 `json:"itemCardClickRatio" dc:"点击率"` + ItemCardClkCnt *int64 `json:"itemCardClkCnt" dc:"商品卡点击数"` + LivePlayCntCost *float64 `json:"livePlayCntCost" dc:"直播间观看成本"` + AdMerchantFollowCost *float64 `json:"adMerchantFollowCost" dc:"涨粉成本"` + AdMerchantFollow *int64 `json:"adMerchantFollow" dc:"涨粉数"` + NetT0OrderCnt *int64 `json:"netT0OrderCnt" dc:"当日累计净成交订单数"` + NetT0Roi *float64 `json:"netT0Roi" dc:"净成交 ROI"` + NetT0Gmv *float64 `json:"netT0Gmv" dc:"净成交 GMV"` + PhotoName string `json:"photoName" dc:"视频名称"` + PhotoIdStr string `json:"photoIdStr" dc:"视频 id"` + PhotoId string `json:"photoId" dc:"视频 id"` + ModPriceSegment string `json:"modPriceSegment" dc:"设备价格区间"` + AgeSegment string `json:"ageSegment" dc:"年龄段"` + Province string `json:"province" dc:"省份名称"` + Gender string `json:"gender" dc:"性别"` + AdPhotoPlayedFiveRatio *float64 `json:"adPhotoPlayedFiveRatio" dc:"作品 5 秒播放率"` + AdPhotoPlayedThreeRatio *float64 `json:"adPhotoPlayedThreeRatio" dc:"作品 3 秒播放率"` + OrderSubmitRoi *float64 `json:"orderSubmitRoi" dc:"订单提交 ROI"` + OrderSubmitAmt *int64 `json:"orderSubmitAmt" dc:"外部订单金额"` + EventOrderSubmitCost *float64 `json:"eventOrderSubmitCost" dc:"订单提交成本"` + EventOrderSubmit *int64 `json:"eventOrderSubmit" dc:"订单提交数"` + EventOrderPaidRoi *float64 `json:"eventOrderPaidRoi" dc:"订单支付率"` + EventAppInvoked *int64 `json:"eventAppInvoked" dc:"唤起应用数"` + EventAddShoppingCart *int64 `json:"eventAddShoppingCart" dc:"添加购物车次数"` + ConversionNumCost *float64 `json:"conversionNumCost" dc:"转化成本(回传时间)"` + AdEffectivePlayNum *int64 `json:"adEffectivePlayNum" dc:"有效播放数"` + AdItemClick *int64 `json:"adItemClick" dc:"行为数"` + MerchantProductId string `json:"merchantProductId" dc:"商品 ID"` + CostTotal *float64 `json:"costTotal" dc:"花费"` + AdShow *int64 `json:"adShow" dc:"曝光数"` + AdShow1kCost *float64 `json:"adShow1kCost" dc:"平均千次广告曝光花费"` + Impression *int64 `json:"impression" dc:"封面曝光数"` + PhotoClick *int64 `json:"photoClick" dc:"封面点击数"` + PhotoClickRatio *float64 `json:"photoClickRatio" dc:"封面点击率"` + Click *int64 `json:"click" dc:"素材曝光数"` + ActionbarClick *int64 `json:"actionbarClick" dc:"行为数"` + ActionbarClickCost *float64 `json:"actionbarClickCost" dc:"行为成本"` + EspClickRatio *float64 `json:"espClickRatio" dc:"行为率"` + ActionRatio *float64 `json:"actionRatio" dc:"素材点击率"` + AdItemClickCount *int64 `json:"adItemClickCount" dc:"预约组件点击数"` + EspLivePlayedSeconds *int64 `json:"espLivePlayedSeconds" dc:"直播平均观看时长"` + PlayedThreeSeconds *int64 `json:"playedThreeSeconds" dc:"作品 3 秒播放数"` + Play3sRatio *float64 `json:"play3sRatio" dc:"作品 3 秒播放率"` + PlayedFiveSeconds *int64 `json:"playedFiveSeconds" dc:"作品 5 秒播放数"` + Play5sRatio *float64 `json:"play5sRatio" dc:"作品 5 秒播放率"` + PlayedEnd *int64 `json:"playedEnd" dc:"作品完播数"` + PlayEndRatio *float64 `json:"playEndRatio" dc:"作品完播率"` + Share *int64 `json:"share" dc:"作品分享数"` + Comment *int64 `json:"comment" dc:"作品评论数"` + Likes *int64 `json:"likes" dc:"作品点赞数"` + Report *int64 `json:"report" dc:"作品举报数"` + Block *int64 `json:"block" dc:"作品拉黑数"` + ItemNegative *int64 `json:"itemNegative" dc:"详情页减少此类作品数"` + LiveShare *int64 `json:"liveShare" dc:"直播送礼数"` + LiveComment *int64 `json:"liveComment" dc:"直播评论数"` + LiveReward *int64 `json:"liveReward" dc:"直播送礼数"` + EffectivePlayCount *int64 `json:"effectivePlayCount" dc:"有效播放数"` + EffectivePlayRatio *float64 `json:"effectivePlayRatio" dc:"有效播放率"` + ConversionNum *int64 `json:"conversionNum" dc:"转化数"` + ConversionCostEsp *float64 `json:"conversionCostEsp" dc:"转化成本"` + Roi *float64 `json:"roi" dc:"直接 ROI"` + Gmv *float64 `json:"gmv" dc:"直接 GMV"` + T0Gmv *float64 `json:"t0Gmv" dc:"当日累计 GMV"` + T1Gmv *float64 `json:"t1Gmv" dc:"次日累计 GMV"` + T7Gmv *float64 `json:"t7Gmv" dc:"7 日累计 GMV"` + T15Gmv *float64 `json:"t15Gmv" dc:"15 日累计 GMV"` + T30Gmv *float64 `json:"t30Gmv" dc:"30 日累计 GMV"` + T0Roi *float64 `json:"t0Roi" dc:"当日累计 ROI"` + T1Roi *float64 `json:"t1Roi" dc:"次日累计 ROI"` + T7Roi *float64 `json:"t7Roi" dc:"7 日累计 ROI"` + T15Roi *float64 `json:"t15Roi" dc:"15 日累计 ROI"` + T30Roi *float64 `json:"t30Roi" dc:"30 日累计 ROI"` + PaiedOrder *int64 `json:"paiedOrder" dc:"直接订单数"` + OrderRatio *float64 `json:"orderRatio" dc:"直接下单率"` + T0OrderCnt *int64 `json:"t0OrderCnt" dc:"当日累计订单数"` + T0OrderCntCost *float64 `json:"t0OrderCntCost" dc:"当日累计订单成本"` + T0OrderCntRatio *float64 `json:"t0OrderCntRatio" dc:"累计订单下单率"` + T1OrderCnt *int64 `json:"t1OrderCnt" dc:"次日累计订单数"` + T7OrderCnt *int64 `json:"t7OrderCnt" dc:"7 日累计订单数"` + T15OrderCnt *int64 `json:"t15OrderCnt" dc:"15 日累计订单数"` + T30OrderCnt *int64 `json:"t30OrderCnt" dc:"30 日累计订单数"` + MerchantRecoFans *int64 `json:"merchantRecoFans" dc:"涨粉数"` + T1Retention *float64 `json:"t1Retention" dc:"次日涨粉留存数"` + T7Retention *float64 `json:"t7Retention" dc:"7 日涨粉留存数"` + T15Retention *float64 `json:"t15Retention" dc:"15 日涨粉留存数"` + T30Retention *float64 `json:"t30Retention" dc:"30 日涨粉留存数"` + T1RetentionRatio *float64 `json:"t1RetentionRatio" dc:"次日涨粉留存率"` + T7RetentionRatio *float64 `json:"t7RetentionRatio" dc:"7 日涨粉留存率"` + T15RetentionRatio *float64 `json:"t15RetentionRatio" dc:"15 日涨粉留存率"` + T30RetentionRatio *float64 `json:"t30RetentionRatio" dc:"30 日涨粉留存率"` + ReservationSuccess *int64 `json:"reservationSuccess" dc:"直播预约成功数"` + ReservationCost *float64 `json:"reservationCost" dc:"直播预约成功成本"` + StandardLivePlayedStarted *int64 `json:"standardLivePlayedStarted" dc:"直播观看数"` + AdLivePlayCnt *int64 `json:"adLivePlayCnt" dc:"直播间人气数"` + AdLivePlayCntCost *float64 `json:"adLivePlayCntCost" dc:"直播间人气成本"` + LiveAudienceCost *float64 `json:"liveAudienceCost" dc:"直播观看成本"` + LiveEventGoodsView *int64 `json:"liveEventGoodsView" dc:"直播间商品点击数"` + GoodsClickRatio *float64 `json:"goodsClickRatio" dc:"直播间商品点击率"` + DirectAttrPlatNewBuyerCnt *int64 `json:"directAttrPlatNewBuyerCnt" dc:"直接平台新客"` + T30AttrPlatTotalBuyerCnt *int64 `json:"t30AttrPlatTotalBuyerCnt" dc:"30 日累计平台新客"` + DirectAttrSellerNewBuyerCnt *int64 `json:"directAttrSellerNewBuyerCnt" dc:"直接店铺新客"` + T30AttrSellerTotalBuyerCnt *int64 `json:"t30AttrSellerTotalBuyerCnt" dc:"30 日累计店铺新客"` + T3Gmv *float64 `json:"t3Gmv" dc:"3 日累计 GMV"` + T3OrderCnt *int64 `json:"t3OrderCnt" dc:"3 日累计订单数"` + T3Roi *float64 `json:"t3Roi" dc:"3 日累计 ROI"` + T7IndirectOrderAmt *float64 `json:"t7IndirectOrderAmt" dc:"7 日间接订单金额"` + T7IndirectOrderCnt *int64 `json:"t7IndirectOrderCnt" dc:"7 日间接订单数"` + FansT0GmvPerFans *float64 `json:"fansT0GmvPerFans" dc:"新增粉丝人均销售额"` + FansT3GmvPerFans *float64 `json:"fansT3GmvPerFans" dc:"3 日新增粉丝人均销售额"` + FansT7GmvPerFans *float64 `json:"fansT7GmvPerFans" dc:"7 日新增粉丝人均销售额"` + FansT15GmvPerFans *float64 `json:"fansT15GmvPerFans" dc:"15 日新增粉丝人均销售额"` + FansT30GmvPerFans *float64 `json:"fansT30GmvPerFans" dc:"30 日新增粉丝人均销售额"` + RecoFansCost *float64 `json:"recoFansCost" dc:"涨粉成本"` + QcpxWhiteboxDirectOrderPaymentAmt *float64 `json:"qcpxWhiteboxDirectOrderPaymentAmt" dc:"智能优惠券订单 GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `json:"qcpxWhiteboxDirectOrderCnt" dc:"智能优惠券订单数"` + FansT0Gmv *float64 `json:"fansT0Gmv" dc:"涨粉当日 GMV"` + FansT1Gmv *float64 `json:"fansT1Gmv" dc:"涨粉次日 GMV"` + FansT7Gmv *float64 `json:"fansT7Gmv" dc:"涨粉 7 日 GMV"` + FansT15Gmv *float64 `json:"fansT15Gmv" dc:"涨粉 15 日 GMV"` + FansT30Gmv *float64 `json:"fansT30Gmv" dc:"涨粉 30 日 GMV"` + FansT0Roi *float64 `json:"fansT0Roi" dc:"涨粉当日 ROI"` + FansT1Roi *float64 `json:"fansT1Roi" dc:"涨粉次日 ROI"` + FansT7Roi *float64 `json:"fansT7Roi" dc:"涨粉 7 日 ROI"` + FansT15Roi *float64 `json:"fansT15Roi" dc:"涨粉 15 日 ROI"` + FansT30Roi *float64 `json:"fansT30Roi" dc:"涨粉 30 日 ROI"` + T0ShopNewBuyerOrderPaymentAmt *float64 `json:"t0ShopNewBuyerOrderPaymentAmt" dc:"当日新客 GMV"` + T1ShopNewBuyerOrderPaymentAmt *float64 `json:"t1ShopNewBuyerOrderPaymentAmt" dc:"投后 1 日新客 GMV"` + T3ShopNewBuyerOrderPaymentAmt *float64 `json:"t3ShopNewBuyerOrderPaymentAmt" dc:"投后 3 日新客 GMV"` + T7ShopNewBuyerOrderPaymentAmt *float64 `json:"t7ShopNewBuyerOrderPaymentAmt" dc:"投后 7 日新客 GMV"` + T15ShopNewBuyerOrderPaymentAmt *float64 `json:"t15ShopNewBuyerOrderPaymentAmt" dc:"投后 15 日新客 GMV"` + T30ShopNewBuyerOrderPaymentAmt *float64 `json:"t30ShopNewBuyerOrderPaymentAmt" dc:"投后 30 日新客 GMV"` + T0ShopNewBuyerOrderCnt *int64 `json:"t0ShopNewBuyerOrderCnt" dc:"当日新客成交订单量"` + T1ShopNewBuyerOrderCnt *int64 `json:"t1ShopNewBuyerOrderCnt" dc:"投后 1 日新客成交订单量"` + T3ShopNewBuyerOrderCnt *int64 `json:"t3ShopNewBuyerOrderCnt" dc:"投后 3 日新客成交订单量"` + T7ShopNewBuyerOrderCnt *int64 `json:"t7ShopNewBuyerOrderCnt" dc:"投后 7 日新客成交订单量"` + T15ShopNewBuyerOrderCnt *int64 `json:"t15ShopNewBuyerOrderCnt" dc:"投后 15 日新客成交订单量"` + T30ShopNewBuyerOrderCnt *int64 `json:"t30ShopNewBuyerOrderCnt" dc:"投后 30 日新客成交订单量"` + T1NewBuyerRepurchaseRatio *float64 `json:"t1NewBuyerRepurchaseRatio" dc:"投后 1 日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `json:"t3NewBuyerRepurchaseRatio" dc:"投后 3 日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `json:"t7NewBuyerRepurchaseRatio" dc:"投后 7 日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `json:"t15NewBuyerRepurchaseRatio" dc:"投后 15 日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `json:"t30NewBuyerRepurchaseRatio" dc:"投后 30 日新客复购率"` + T0ShopNewBuyerRoi *float64 `json:"t0ShopNewBuyerRoi" dc:"投后当日新客 ROI"` + T1ShopNewBuyerRoi *float64 `json:"t1ShopNewBuyerRoi" dc:"投后 1 日新客 ROI"` + T3ShopNewBuyerRoi *float64 `json:"t3ShopNewBuyerRoi" dc:"投后 3 日新客 ROI"` + T7ShopNewBuyerRoi *float64 `json:"t7ShopNewBuyerRoi" dc:"投后 7 日新客 ROI"` + T15ShopNewBuyerRoi *float64 `json:"t15ShopNewBuyerRoi" dc:"投后 15 日新客 ROI"` + T30ShopNewBuyerRoi *float64 `json:"t30ShopNewBuyerRoi" dc:"投后 30 日新客 ROI"` + CreateCardOrderCnt *int64 `json:"createCardOrderCnt" dc:"有效制卡订单数(回传时间)"` + ForwardTsCreateCardOrderCnt *int64 `json:"forwardTsCreateCardOrderCnt" dc:"有效制卡订单数(计费时间)"` + CreateCardOrderCost *float64 `json:"createCardOrderCost" dc:"有效制卡订单成本(回传时间)"` + ForwardTsCreateCardOrderCost *float64 `json:"forwardTsCreateCardOrderCost" dc:"有效制卡订单成本(计费时间)"` + ActivateCardOrderCnt *int64 `json:"activateCardOrderCnt" dc:"电话卡激活订单数(回传时间)"` + ForwardTsActivateCardOrderCnt *int64 `json:"forwardTsActivateCardOrderCnt" dc:"电话卡激活订单数(计费时间)"` + ActivateCardOrderCost *float64 `json:"activateCardOrderCost" dc:"电话卡激活订单成本(回传时间)"` + ForwardTsActivateCardOrderCost *float64 `json:"forwardTsActivateCardOrderCost" dc:"电话卡激活订单成本(计费时间)"` + CreateCardOrderRatio *float64 `json:"createCardOrderRatio" dc:"有效制卡订单率(回传时间)"` + ForwardTsCreateCardOrderRatio *float64 `json:"forwardTsCreateCardOrderRatio" dc:"有效制卡订单率(计费时间)"` + ActivateCardOrderCntRatio *float64 `json:"activateCardOrderCntRatio" dc:"电话卡激活率(回传时间)"` + ForwardTsActivateCardOrderRatio *float64 `json:"forwardTsActivateCardOrderRatio" dc:"电话卡激活率(计费时间)"` + LivePlayCnt *int64 `json:"livePlayCnt" dc:"全站直播观看数"` + ItemEntranceClkCnt *int64 `json:"itemEntranceClkCnt" dc:"小黄车点击数"` + ShowCnt *int64 `json:"showCnt" dc:"全站曝光"` + ReportDateStr string `json:"reportDateStr" v:"required" dc:"时间"` + CampaignId *int64 `json:"campaignId" dc:"计划 ID"` + CampaignName string `json:"campaignName" dc:"计划名称"` + UnitId *int64 `json:"unitId" dc:"单元 ID"` + UnitName string `json:"unitName" dc:"单元名称"` + CreativeId *int64 `json:"creativeId" dc:"创意 ID"` + CreativeName string `json:"creativeName" dc:"创意名称"` + CidActualRoiAfterSubsidy *float64 `json:"cidActualRoiAfterSubsidy" dc:"补贴后实际 ROI"` + CidCouponAmount *int64 `json:"cidCouponAmount" dc:"核销券金额"` + CidCouponCallbackPaidRefundAmount *int64 `json:"cidCouponCallbackPaidRefundAmount" dc:"退单有回传_核销券金额"` + CidVoucherCost *float64 `json:"cidVoucherCost" dc:"券成本"` +} + +type ListCreativeReportDetailReq struct { + g.Meta `path:"/listCreativeReportDetail" method:"get" tags:"广告效果明细报表" summary:"获取广告效果指标明细表列表" dc:"分页查询广告效果指标明细表列表"` + *beans.Page + ReportDateStr string `json:"reportDateStr" dc:"时间"` + CampaignId *int64 `json:"campaignId" dc:"计划 ID"` + UnitId *int64 `json:"unitId" dc:"单元 ID"` + CreativeId *int64 `json:"creativeId" dc:"创意 ID"` + AuthorId string `json:"authorId" dc:"直播用户快手 Id"` + MerchantProductId string `json:"merchantProductId" dc:"商品 ID"` + Keyword string `json:"keyword" dc:"关键字"` +} + +type ListCreativeReportDetailRes struct { + List []*CreativeReportDetailItem `json:"list" dc:"广告效果明细列表"` + Total int `json:"total" dc:"总数"` +} diff --git a/model/dto/copydata/creative_report_sum_dto.go b/model/dto/copydata/creative_report_sum_dto.go new file mode 100644 index 0000000..1a2699e --- /dev/null +++ b/model/dto/copydata/creative_report_sum_dto.go @@ -0,0 +1,342 @@ +package copydata + +import ( + "gitea.com/red-future/common/beans" + "github.com/gogf/gf/v2/frame/g" +) + +// CreateCreativeReportSumReq 创建广告效果指标表请求 +type CreateCreativeReportSumReq struct { + g.Meta `path:"/createCreativeReportSum" method:"post" tags:"广告效果报表" summary:"创建广告效果指标表" dc:"创建新的广告效果指标表"` + *CreativeReportSumItem +} + +// CreateCreativeReportSumRes 创建广告效果指标表响应 +type CreateCreativeReportSumRes struct { + Id int64 `json:"id" dc:"广告效果 ID"` +} + +// BatchCreateCreativeReportSumReq 批量创建广告效果指标表请求 +type BatchCreateCreativeReportSumReq struct { + g.Meta `path:"/batchCreateCreativeReportSum" method:"post" tags:"广告效果报表" summary:"批量创建广告效果指标表" dc:"批量创建广告效果指标表"` + Items []*CreativeReportSumItem `json:"items" v:"required" dc:"广告效果列表"` +} + +// BatchCreateCreativeReportSumRes 批量创建广告效果指标表响应 +type BatchCreateCreativeReportSumRes struct { + SuccessCount int64 `json:"successCount" dc:"成功数量"` + FailCount int64 `json:"failCount" dc:"失败数量"` + FailedItems []int64 `json:"failedItems" dc:"失败项索引"` +} + +// CreativeReportSumItem 广告效果指标表项 +type CreativeReportSumItem struct { + // 订单金额相关字段 + T0OrderPaymentAmt *float64 `json:"t0OrderPaymentAmt" dc:"当日总成交订单金额"` + + // 素材类型字段 + CreativeMaterialType string `json:"creativeMaterialType" dc:"视频素材类型(视频:HORIZONTAL_SCREEN, VERTICAL_SCREEN, UNKNOWN_TYPE;图集:ATLAS;长图:ATLAS_VERTICAL)"` + + // 直播相关字段 + LiveName string `json:"liveName" dc:"直播间名称"` + AuthorId string `json:"authorId" dc:"直播用户快手 Id"` + + // 图片相关字段 + PicUrl string `json:"picUrl" dc:"图片 URL"` + PicName string `json:"picName" dc:"图片名称"` + PicId string `json:"picId" dc:"图片 Id"` + + // 封面相关字段 + CoverUrl string `json:"coverUrl" dc:"封面 URL"` + CoverId *int64 `json:"coverId" dc:"封面 Id"` + + // 转化率相关字段 + ItemOrderConversionRatio *float64 `json:"itemOrderConversionRatio" dc:"转化率"` + ItemCardClickRatio *float64 `json:"itemCardClickRatio" dc:"点击率"` + ItemCardClkCnt *int64 `json:"itemCardClkCnt" dc:"商品卡点击数"` + + // 成本相关字段 + LivePlayCntCost *float64 `json:"livePlayCntCost" dc:"直播间观看成本"` + AdMerchantFollowCost *float64 `json:"adMerchantFollowCost" dc:"涨粉成本"` + AdMerchantFollow *int64 `json:"adMerchantFollow" dc:"涨粉数"` + + // 净成交相关字段 + NetT0OrderCnt *int64 `json:"netT0OrderCnt" dc:"当日累计净成交订单数"` + NetT0Roi *float64 `json:"netT0Roi" dc:"净成交 ROI"` + NetT0Gmv *float64 `json:"netT0Gmv" dc:"净成交 GMV"` + + // 视频相关字段 + PhotoName string `json:"photoName" dc:"视频名称"` + PhotoIdStr string `json:"photoIdStr" dc:"视频 id"` + PhotoId string `json:"photoId" dc:"视频 id"` + + // 用户属性相关字段 + ModPriceSegment string `json:"modPriceSegment" dc:"设备价格区间"` + AgeSegment string `json:"ageSegment" dc:"年龄段"` + Province string `json:"province" dc:"省份名称"` + Gender string `json:"gender" dc:"性别"` + + // 播放率相关字段 + AdPhotoPlayedFiveRatio *float64 `json:"adPhotoPlayedFiveRatio" dc:"作品 5 秒播放率"` + AdPhotoPlayedThreeRatio *float64 `json:"adPhotoPlayedThreeRatio" dc:"作品 3 秒播放率"` + + // 订单提交相关字段 + OrderSubmitRoi *float64 `json:"orderSubmitRoi" dc:"订单提交 ROI"` + OrderSubmitAmt *int64 `json:"orderSubmitAmt" dc:"外部订单金额"` + EventOrderSubmitCost *float64 `json:"eventOrderSubmitCost" dc:"订单提交成本"` + EventOrderSubmit *int64 `json:"eventOrderSubmit" dc:"订单提交数"` + EventOrderPaidRoi *float64 `json:"eventOrderPaidRoi" dc:"订单支付率"` + + // 用户行为相关字段 + EventAppInvoked *int64 `json:"eventAppInvoked" dc:"唤起应用数"` + EventAddShoppingCart *int64 `json:"eventAddShoppingCart" dc:"添加购物车次数"` + + // 转化成本相关字段 + ConversionNumCost *float64 `json:"conversionNumCost" dc:"转化成本(回传时间)"` + AdEffectivePlayNum *int64 `json:"adEffectivePlayNum" dc:"有效播放数"` + AdItemClick *int64 `json:"adItemClick" dc:"行为数"` + + // 商品相关字段 + MerchantProductId string `json:"merchantProductId" dc:"商品 ID"` + + // 花费相关字段 + CostTotal *float64 `json:"costTotal" dc:"花费"` + + // 曝光相关字段 + AdShow *int64 `json:"adShow" dc:"曝光数"` + AdShow1kCost *float64 `json:"adShow1kCost" dc:"平均千次广告曝光花费"` + Impression *int64 `json:"impression" dc:"封面曝光数"` + PhotoClick *int64 `json:"photoClick" dc:"封面点击数"` + PhotoClickRatio *float64 `json:"photoClickRatio" dc:"封面点击率"` + Click *int64 `json:"click" dc:"素材曝光数"` + + // 行为相关字段 + ActionbarClick *int64 `json:"actionbarClick" dc:"行为数"` + ActionbarClickCost *float64 `json:"actionbarClickCost" dc:"行为成本"` + EspClickRatio *float64 `json:"espClickRatio" dc:"行为率"` + ActionRatio *float64 `json:"actionRatio" dc:"素材点击率"` + AdItemClickCount *int64 `json:"adItemClickCount" dc:"预约组件点击数"` + + // 直播时长相关字段 + EspLivePlayedSeconds *int64 `json:"espLivePlayedSeconds" dc:"直播平均观看时长"` + + // 作品播放相关字段 + PlayedThreeSeconds *int64 `json:"playedThreeSeconds" dc:"作品 3 秒播放数"` + Play3sRatio *float64 `json:"play3sRatio" dc:"作品 3 秒播放率"` + PlayedFiveSeconds *int64 `json:"playedFiveSeconds" dc:"作品 5 秒播放数"` + Play5sRatio *float64 `json:"play5sRatio" dc:"作品 5 秒播放率"` + PlayedEnd *int64 `json:"playedEnd" dc:"作品完播数"` + PlayEndRatio *float64 `json:"playEndRatio" dc:"作品完播率"` + + // 作品互动相关字段 + Share *int64 `json:"share" dc:"作品分享数"` + Comment *int64 `json:"comment" dc:"作品评论数"` + Likes *int64 `json:"likes" dc:"作品点赞数"` + Report *int64 `json:"report" dc:"作品举报数"` + Block *int64 `json:"block" dc:"作品拉黑数"` + ItemNegative *int64 `json:"itemNegative" dc:"详情页减少此类作品数"` + + // 直播互动相关字段 + LiveShare *int64 `json:"liveShare" dc:"直播送礼数"` + LiveComment *int64 `json:"liveComment" dc:"直播评论数"` + LiveReward *int64 `json:"liveReward" dc:"直播送礼数"` + + // 有效播放相关字段 + EffectivePlayCount *int64 `json:"effectivePlayCount" dc:"有效播放数"` + EffectivePlayRatio *float64 `json:"effectivePlayRatio" dc:"有效播放率"` + + // 转化相关字段 + ConversionNum *int64 `json:"conversionNum" dc:"转化数"` + ConversionCostEsp *float64 `json:"conversionCostEsp" dc:"转化成本"` + Roi *float64 `json:"roi" dc:"直接 ROI"` + Gmv *float64 `json:"gmv" dc:"直接 GMV"` + + // 累计 GMV 相关字段 + T0Gmv *float64 `json:"t0Gmv" dc:"当日累计 GMV"` + T1Gmv *float64 `json:"t1Gmv" dc:"次日累计 GMV"` + T7Gmv *float64 `json:"t7Gmv" dc:"7 日累计 GMV"` + T15Gmv *float64 `json:"t15Gmv" dc:"15 日累计 GMV"` + T30Gmv *float64 `json:"t30Gmv" dc:"30 日累计 GMV"` + + // 累计 ROI 相关字段 + T0Roi *float64 `json:"t0Roi" dc:"当日累计 ROI"` + T1Roi *float64 `json:"t1Roi" dc:"次日累计 ROI"` + T7Roi *float64 `json:"t7Roi" dc:"7 日累计 ROI"` + T15Roi *float64 `json:"t15Roi" dc:"15 日累计 ROI"` + T30Roi *float64 `json:"t30Roi" dc:"30 日累计 ROI"` + + // 订单相关字段 + PaiedOrder *int64 `json:"paiedOrder" dc:"直接订单数"` + OrderRatio *float64 `json:"orderRatio" dc:"直接下单率"` + T0OrderCnt *int64 `json:"t0OrderCnt" dc:"当日累计订单数"` + T0OrderCntCost *float64 `json:"t0OrderCntCost" dc:"当日累计订单成本"` + T0OrderCntRatio *float64 `json:"t0OrderCntRatio" dc:"累计订单下单率"` + T1OrderCnt *int64 `json:"t1OrderCnt" dc:"次日累计订单数"` + T7OrderCnt *int64 `json:"t7OrderCnt" dc:"7 日累计订单数"` + T15OrderCnt *int64 `json:"t15OrderCnt" dc:"15 日累计订单数"` + T30OrderCnt *int64 `json:"t30OrderCnt" dc:"30 日累计订单数"` + + // 涨粉相关字段 + MerchantRecoFans *int64 `json:"merchantRecoFans" dc:"涨粉数"` + T1Retention *float64 `json:"t1Retention" dc:"次日涨粉留存数"` + T7Retention *float64 `json:"t7Retention" dc:"7 日涨粉留存数"` + T15Retention *float64 `json:"t15Retention" dc:"15 日涨粉留存数"` + T30Retention *float64 `json:"t30Retention" dc:"30 日涨粉留存数"` + T1RetentionRatio *float64 `json:"t1RetentionRatio" dc:"次日涨粉留存率"` + T7RetentionRatio *float64 `json:"t7RetentionRatio" dc:"7 日涨粉留存率"` + T15RetentionRatio *float64 `json:"t15RetentionRatio" dc:"15 日涨粉留存率"` + T30RetentionRatio *float64 `json:"t30RetentionRatio" dc:"30 日涨粉留存率"` + + // 直播预约相关字段 + ReservationSuccess *int64 `json:"reservationSuccess" dc:"直播预约成功数"` + ReservationCost *float64 `json:"reservationCost" dc:"直播预约成功成本"` + + // 直播观看相关字段 + StandardLivePlayedStarted *int64 `json:"standardLivePlayedStarted" dc:"直播观看数"` + AdLivePlayCnt *int64 `json:"adLivePlayCnt" dc:"直播间人气数"` + AdLivePlayCntCost *float64 `json:"adLivePlayCntCost" dc:"直播间人气成本"` + LiveAudienceCost *float64 `json:"liveAudienceCost" dc:"直播观看成本"` + + // 直播间商品相关字段 + LiveEventGoodsView *int64 `json:"liveEventGoodsView" dc:"直播间商品点击数"` + GoodsClickRatio *float64 `json:"goodsClickRatio" dc:"直播间商品点击率"` + + // 新客相关字段 + DirectAttrPlatNewBuyerCnt *int64 `json:"directAttrPlatNewBuyerCnt" dc:"直接平台新客"` + T30AttrPlatTotalBuyerCnt *int64 `json:"t30AttrPlatTotalBuyerCnt" dc:"30 日累计平台新客"` + DirectAttrSellerNewBuyerCnt *int64 `json:"directAttrSellerNewBuyerCnt" dc:"直接店铺新客"` + T30AttrSellerTotalBuyerCnt *int64 `json:"t30AttrSellerTotalBuyerCnt" dc:"30 日累计店铺新客"` + + // 3 日累计相关字段 + T3Gmv *float64 `json:"t3Gmv" dc:"3 日累计 GMV"` + T3OrderCnt *int64 `json:"t3OrderCnt" dc:"3 日累计订单数"` + T3Roi *float64 `json:"t3Roi" dc:"3 日累计 ROI"` + + // 7 日间接订单相关字段 + T7IndirectOrderAmt *float64 `json:"t7IndirectOrderAmt" dc:"7 日间接订单金额"` + T7IndirectOrderCnt *int64 `json:"t7IndirectOrderCnt" dc:"7 日间接订单数"` + + // 粉丝人均销售额相关字段 + FansT0GmvPerFans *float64 `json:"fansT0GmvPerFans" dc:"新增粉丝人均销售额"` + FansT3GmvPerFans *float64 `json:"fansT3GmvPerFans" dc:"3 日新增粉丝人均销售额"` + FansT7GmvPerFans *float64 `json:"fansT7GmvPerFans" dc:"7 日新增粉丝人均销售额"` + FansT15GmvPerFans *float64 `json:"fansT15GmvPerFans" dc:"15 日新增粉丝人均销售额"` + FansT30GmvPerFans *float64 `json:"fansT30GmvPerFans" dc:"30 日新增粉丝人均销售额"` + + // 涨粉成本相关字段 + RecoFansCost *float64 `json:"recoFansCost" dc:"涨粉成本"` + + // 智能优惠券相关字段 + QcpxWhiteboxDirectOrderPaymentAmt *float64 `json:"qcpxWhiteboxDirectOrderPaymentAmt" dc:"智能优惠券订单 GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `json:"qcpxWhiteboxDirectOrderCnt" dc:"智能优惠券订单数"` + + // 粉丝 GMV 相关字段 + FansT0Gmv *float64 `json:"fansT0Gmv" dc:"涨粉当日 GMV"` + FansT1Gmv *float64 `json:"fansT1Gmv" dc:"涨粉次日 GMV"` + FansT7Gmv *float64 `json:"fansT7Gmv" dc:"涨粉 7 日 GMV"` + FansT15Gmv *float64 `json:"fansT15Gmv" dc:"涨粉 15 日 GMV"` + FansT30Gmv *float64 `json:"fansT30Gmv" dc:"涨粉 30 日 GMV"` + + // 粉丝 ROI 相关字段 + FansT0Roi *float64 `json:"fansT0Roi" dc:"涨粉当日 ROI"` + FansT1Roi *float64 `json:"fansT1Roi" dc:"涨粉次日 ROI"` + FansT7Roi *float64 `json:"fansT7Roi" dc:"涨粉 7 日 ROI"` + FansT15Roi *float64 `json:"fansT15Roi" dc:"涨粉 15 日 ROI"` + FansT30Roi *float64 `json:"fansT30Roi" dc:"涨粉 30 日 ROI"` + + // 新客 GMV 相关字段 + T0ShopNewBuyerOrderPaymentAmt *float64 `json:"t0ShopNewBuyerOrderPaymentAmt" dc:"当日新客 GMV"` + T1ShopNewBuyerOrderPaymentAmt *float64 `json:"t1ShopNewBuyerOrderPaymentAmt" dc:"投后 1 日新客 GMV"` + T3ShopNewBuyerOrderPaymentAmt *float64 `json:"t3ShopNewBuyerOrderPaymentAmt" dc:"投后 3 日新客 GMV"` + T7ShopNewBuyerOrderPaymentAmt *float64 `json:"t7ShopNewBuyerOrderPaymentAmt" dc:"投后 7 日新客 GMV"` + T15ShopNewBuyerOrderPaymentAmt *float64 `json:"t15ShopNewBuyerOrderPaymentAmt" dc:"投后 15 日新客 GMV"` + T30ShopNewBuyerOrderPaymentAmt *float64 `json:"t30ShopNewBuyerOrderPaymentAmt" dc:"投后 30 日新客 GMV"` + + // 新客订单数相关字段 + T0ShopNewBuyerOrderCnt *int64 `json:"t0ShopNewBuyerOrderCnt" dc:"当日新客成交订单量"` + T1ShopNewBuyerOrderCnt *int64 `json:"t1ShopNewBuyerOrderCnt" dc:"投后 1 日新客成交订单量"` + T3ShopNewBuyerOrderCnt *int64 `json:"t3ShopNewBuyerOrderCnt" dc:"投后 3 日新客成交订单量"` + T7ShopNewBuyerOrderCnt *int64 `json:"t7ShopNewBuyerOrderCnt" dc:"投后 7 日新客成交订单量"` + T15ShopNewBuyerOrderCnt *int64 `json:"t15ShopNewBuyerOrderCnt" dc:"投后 15 日新客成交订单量"` + T30ShopNewBuyerOrderCnt *int64 `json:"t30ShopNewBuyerOrderCnt" dc:"投后 30 日新客成交订单量"` + + // 新客复购率相关字段 + T1NewBuyerRepurchaseRatio *float64 `json:"t1NewBuyerRepurchaseRatio" dc:"投后 1 日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `json:"t3NewBuyerRepurchaseRatio" dc:"投后 3 日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `json:"t7NewBuyerRepurchaseRatio" dc:"投后 7 日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `json:"t15NewBuyerRepurchaseRatio" dc:"投后 15 日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `json:"t30NewBuyerRepurchaseRatio" dc:"投后 30 日新客复购率"` + + // 新客 ROI 相关字段 + T0ShopNewBuyerRoi *float64 `json:"t0ShopNewBuyerRoi" dc:"投后当日新客 ROI"` + T1ShopNewBuyerRoi *float64 `json:"t1ShopNewBuyerRoi" dc:"投后 1 日新客 ROI"` + T3ShopNewBuyerRoi *float64 `json:"t3ShopNewBuyerRoi" dc:"投后 3 日新客 ROI"` + T7ShopNewBuyerRoi *float64 `json:"t7ShopNewBuyerRoi" dc:"投后 7 日新客 ROI"` + T15ShopNewBuyerRoi *float64 `json:"t15ShopNewBuyerRoi" dc:"投后 15 日新客 ROI"` + T30ShopNewBuyerRoi *float64 `json:"t30ShopNewBuyerRoi" dc:"投后 30 日新客 ROI"` + + // 制卡订单相关字段 + CreateCardOrderCnt *int64 `json:"createCardOrderCnt" dc:"有效制卡订单数(回传时间)"` + ForwardTsCreateCardOrderCnt *int64 `json:"forwardTsCreateCardOrderCnt" dc:"有效制卡订单数(计费时间)"` + CreateCardOrderCost *float64 `json:"createCardOrderCost" dc:"有效制卡订单成本(回传时间)"` + ForwardTsCreateCardOrderCost *float64 `json:"forwardTsCreateCardOrderCost" dc:"有效制卡订单成本(计费时间)"` + + // 电话卡激活相关字段 + ActivateCardOrderCnt *int64 `json:"activateCardOrderCnt" dc:"电话卡激活订单数(回传时间)"` + ForwardTsActivateCardOrderCnt *int64 `json:"forwardTsActivateCardOrderCnt" dc:"电话卡激活订单数(计费时间)"` + ActivateCardOrderCost *float64 `json:"activateCardOrderCost" dc:"电话卡激活订单成本(回传时间)"` + ForwardTsActivateCardOrderCost *float64 `json:"forwardTsActivateCardOrderCost" dc:"电话卡激活订单成本(计费时间)"` + + // 制卡订单率相关字段 + CreateCardOrderRatio *float64 `json:"createCardOrderRatio" dc:"有效制卡订单率(回传时间)"` + ForwardTsCreateCardOrderRatio *float64 `json:"forwardTsCreateCardOrderRatio" dc:"有效制卡订单率(计费时间)"` + + // 电话卡激活率相关字段 + ActivateCardOrderCntRatio *float64 `json:"activateCardOrderCntRatio" dc:"电话卡激活率(回传时间)"` + ForwardTsActivateCardOrderRatio *float64 `json:"forwardTsActivateCardOrderRatio" dc:"电话卡激活率(计费时间)"` + + // 直播观看相关字段 + LivePlayCnt *int64 `json:"livePlayCnt" dc:"全站直播观看数"` + ItemEntranceClkCnt *int64 `json:"itemEntranceClkCnt" dc:"小黄车点击数"` + ShowCnt *int64 `json:"showCnt" dc:"全站曝光"` + + // 报告日期字段 + ReportDateStr string `json:"reportDateStr" v:"required" dc:"时间"` + + // 广告计划相关字段 + CampaignId *int64 `json:"campaignId" dc:"计划 ID"` + CampaignName string `json:"campaignName" dc:"计划名称"` + + // 广告单元相关字段 + UnitId *int64 `json:"unitId" dc:"单元 ID"` + UnitName string `json:"unitName" dc:"单元名称"` + + // 广告创意相关字段 + CreativeId *int64 `json:"creativeId" dc:"创意 ID"` + CreativeName string `json:"creativeName" dc:"创意名称"` + + // 新增字段 + CidActualRoiAfterSubsidy *float64 `json:"cidActualRoiAfterSubsidy" dc:"补贴后实际 ROI"` + CidCouponAmount *int64 `json:"cidCouponAmount" dc:"核销券金额"` + CidCouponCallbackPaidRefundAmount *int64 `json:"cidCouponCallbackPaidRefundAmount" dc:"退单有回传_核销券金额"` + CidVoucherCost *float64 `json:"cidVoucherCost" dc:"券成本"` +} + +// ListCreativeReportSumReq 获取广告效果指标表列表请求 +type ListCreativeReportSumReq struct { + g.Meta `path:"/listCreativeReportSum" method:"get" tags:"广告效果报表" summary:"获取广告效果指标表列表" dc:"分页查询广告效果指标表列表"` + *beans.Page + ReportDateStr string `json:"reportDateStr" dc:"时间"` + CampaignId *int64 `json:"campaignId" dc:"计划 ID"` + UnitId *int64 `json:"unitId" dc:"单元 ID"` + CreativeId *int64 `json:"creativeId" dc:"创意 ID"` + AuthorId string `json:"authorId" dc:"直播用户快手 Id"` + MerchantProductId string `json:"merchantProductId" dc:"商品 ID"` + Keyword string `json:"keyword" dc:"关键字(搜索直播间名称、视频名称等)"` +} + +// ListCreativeReportSumRes 获取广告效果指标表列表响应 +type ListCreativeReportSumRes struct { + List []*CreativeReportSumItem `json:"list" dc:"广告效果列表"` + Total int `json:"total" dc:"总数"` +} diff --git a/model/dto/copydata/material_report_dto.go b/model/dto/copydata/material_report_dto.go new file mode 100644 index 0000000..e074260 --- /dev/null +++ b/model/dto/copydata/material_report_dto.go @@ -0,0 +1,234 @@ +package copydata + +import ( + "gitea.com/red-future/common/beans" + "github.com/gogf/gf/v2/frame/g" +) + +// CreateMaterialReportReq 创建素材报表数据请求 +type CreateMaterialReportReq struct { + g.Meta `path:"/createMaterialReport" method:"post" tags:"素材报表" summary:"创建素材报表数据" dc:"创建新的素材报表数据"` + *MaterialReportItem +} + +// CreateMaterialReportRes 创建素材报表数据响应 +type CreateMaterialReportRes struct { + Id int64 `json:"id" dc:"素材报表数据 ID"` +} + +// BatchCreateMaterialReportReq 批量创建素材报表数据请求 +type BatchCreateMaterialReportReq struct { + g.Meta `path:"/batchCreateMaterialReport" method:"post" tags:"素材报表" summary:"批量创建素材报表数据" dc:"批量创建素材报表数据"` + Items []*MaterialReportItem `json:"items" v:"required" dc:"素材报表数据列表"` +} + +// BatchCreateMaterialReportRes 批量创建素材报表数据响应 +type BatchCreateMaterialReportRes struct { + SuccessCount int64 `json:"successCount" dc:"成功数量"` + FailCount int64 `json:"failCount" dc:"失败数量"` + FailedItems []int64 `json:"failedItems" dc:"失败项索引"` +} + +// MaterialReportItem 素材报表数据项 +type MaterialReportItem struct { + CreatedBy *string `json:"createdBy" dc:"创建人"` + UpdatedBy *string `json:"updatedBy" dc:"更新人"` + T0OrderPaymentAmt *float64 `json:"t0OrderPaymentAmt" dc:"当日订单支付金额"` + CreativeMaterialType *string `json:"creativeMaterialType" dc:"创意素材类型"` + LiveName *string `json:"liveName" dc:"直播间名称"` + AuthorId *string `json:"authorId" dc:"作者 ID"` + PicUrl *string `json:"picUrl" dc:"图片 URL"` + PicName *string `json:"picName" dc:"图片名称"` + PicId *string `json:"picId" dc:"图片 ID"` + CoverUrl *string `json:"coverUrl" dc:"封面 URL"` + CoverId *int64 `json:"coverId" dc:"封面 ID"` + ItemOrderConversionRatio *float64 `json:"itemOrderConversionRatio" dc:"商品订单转化率"` + ItemCardClickRatio *float64 `json:"itemCardClickRatio" dc:"商品卡点击率"` + ItemCardClkCnt *int64 `json:"itemCardClkCnt" dc:"商品卡点击数"` + LivePlayCntCost *float64 `json:"livePlayCntCost" dc:"直播间观看成本"` + AdMerchantFollowCost *float64 `json:"adMerchantFollowCost" dc:"商家涨粉成本"` + AdMerchantFollow *int64 `json:"adMerchantFollow" dc:"商家涨粉数"` + NetT0OrderCnt *int64 `json:"netT0OrderCnt" dc:"当日净成交订单数"` + NetT0Roi *float64 `json:"netT0Roi" dc:"当日净成交 ROI"` + NetT0Gmv *float64 `json:"netT0Gmv" dc:"当日净成交 GMV"` + PhotoName *string `json:"photoName" dc:"照片名称"` + PhotoIdStr *string `json:"photoIdStr" dc:"照片 ID 字符串"` + PhotoId *string `json:"photoId" dc:"照片 ID"` + ModPriceSegment *string `json:"modPriceSegment" dc:"价格区间"` + AgeSegment *string `json:"ageSegment" dc:"年龄段"` + Province *string `json:"province" dc:"省份"` + Gender *string `json:"gender" dc:"性别"` + AdPhotoPlayedFiveRatio *float64 `json:"adPhotoPlayedFiveRatio" dc:"广告照片播放 5 秒比率"` + AdPhotoPlayedThreeRatio *float64 `json:"adPhotoPlayedThreeRatio" dc:"广告照片播放 3 秒比率"` + OrderSubmitRoi *float64 `json:"orderSubmitRoi" dc:"提交订单 ROI"` + OrderSubmitAmt *int64 `json:"orderSubmitAmt" dc:"提交订单金额"` + EventOrderSubmitCost *float64 `json:"eventOrderSubmitCost" dc:"事件订单提交成本"` + EventOrderSubmit *int64 `json:"eventOrderSubmit" dc:"事件订单提交数"` + EventOrderPaidRoi *float64 `json:"eventOrderPaidRoi" dc:"事件订单支付 ROI"` + EventAppInvoked *int64 `json:"eventAppInvoked" dc:"事件 APP 调用数"` + EventAddShoppingCart *int64 `json:"eventAddShoppingCart" dc:"事件加购数"` + ConversionNumCost *float64 `json:"conversionNumCost" dc:"转化数量成本"` + AdEffectivePlayNum *int64 `json:"adEffectivePlayNum" dc:"广告有效播放数"` + AdItemClick *int64 `json:"adItemClick" dc:"广告商品点击数"` + MerchantProductId *string `json:"merchantProductId" dc:"商家商品 ID"` + CostTotal *float64 `json:"costTotal" dc:"总花费"` + AdShow *int64 `json:"adShow" dc:"广告展示数"` + AdShow1kCost *float64 `json:"adShow1kCost" dc:"千次展示成本"` + Impression *int64 `json:"impression" dc:"曝光数"` + PhotoClick *int64 `json:"photoClick" dc:"照片点击数"` + PhotoClickRatio *float64 `json:"photoClickRatio" dc:"照片点击率"` + Click *int64 `json:"click" dc:"点击数"` + ActionbarClick *int64 `json:"actionbarClick" dc:"操作栏点击数"` + ActionbarClickCost *float64 `json:"actionbarClickCost" dc:"操作栏点击成本"` + EspClickRatio *float64 `json:"espClickRatio" dc:"ESP 点击率"` + ActionRatio *float64 `json:"actionRatio" dc:"操作比率"` + AdItemCount *int64 `json:"adItemCount" dc:"广告商品点击次数"` + EspLivePlayedSeconds *int64 `json:"espLivePlayedSeconds" dc:"ESP 直播播放秒数"` + PlayedThreeSeconds *int64 `json:"playedThreeSeconds" dc:"播放 3 秒数"` + Play3sRatio *float64 `json:"play3sRatio" dc:"3 秒播放率"` + PlayedFiveSeconds *int64 `json:"playedFiveSeconds" dc:"播放 5 秒数"` + Play5sRatio *float64 `json:"play5sRatio" dc:"5 秒播放率"` + PlayedEnd *int64 `json:"playedEnd" dc:"播放结束数"` + PlayEndRatio *float64 `json:"playEndRatio" dc:"完播率"` + Share *int64 `json:"share" dc:"分享数"` + Comment *int64 `json:"comment" dc:"评论数"` + Likes *int64 `json:"likes" dc:"点赞数"` + Report *int64 `json:"report" dc:"举报数"` + Block *int64 `json:"block" dc:"拉黑数"` + ItemNegative *int64 `json:"itemNegative" dc:"商品负反馈数"` + LiveShare *int64 `json:"liveShare" dc:"直播分享数"` + LiveComment *int64 `json:"liveComment" dc:"直播评论数"` + LiveReward *int64 `json:"liveReward" dc:"直播打赏数"` + EffectivePlayCount *int64 `json:"effectivePlayCount" dc:"有效播放数"` + EffectivePlayRatio *float64 `json:"effectivePlayRatio" dc:"有效播放率"` + ConversionNum *int64 `json:"conversionNum" dc:"转化数"` + ConversionCostEsp *float64 `json:"conversionCostEsp" dc:"转化成本 ESP"` + Roi *float64 `json:"roi" dc:"ROI"` + Gmv *float64 `json:"gmv" dc:"GMV"` + T0Gmv *float64 `json:"t0Gmv" dc:"当日 GMV"` + T1Gmv *float64 `json:"t1Gmv" dc:"次日 GMV"` + T7Gmv *float64 `json:"t7Gmv" dc:"7 日 GMV"` + T15Gmv *float64 `json:"t15Gmv" dc:"15 日 GMV"` + T30Gmv *float64 `json:"t30Gmv" dc:"30 日 GMV"` + T0Roi *float64 `json:"t0Roi" dc:"当日 ROI"` + T1Roi *float64 `json:"t1Roi" dc:"次日 ROI"` + T7Roi *float64 `json:"t7Roi" dc:"7 日 ROI"` + T15Roi *float64 `json:"t15Roi" dc:"15 日 ROI"` + T30Roi *float64 `json:"t30Roi" dc:"30 日 ROI"` + PaiedOrder *int64 `json:"paiedOrder" dc:"支付订单数"` + OrderRatio *float64 `json:"orderRatio" dc:"订单比率"` + T0OrderCnt *int64 `json:"t0OrderCnt" dc:"当日订单数"` + T0OrderCntCost *float64 `json:"t0OrderCntCost" dc:"当日订单成本"` + T0OrderCntRatio *float64 `json:"t0OrderCntRatio" dc:"当日订单比率"` + T1OrderCnt *int64 `json:"t1OrderCnt" dc:"次日订单数"` + T7OrderCnt *int64 `json:"t7OrderCnt" dc:"7 日订单数"` + T15OrderCnt *int64 `json:"t15OrderCnt" dc:"15 日订单数"` + T30OrderCnt *int64 `json:"t30OrderCnt" dc:"30 日订单数"` + MerchantRecoFans *int64 `json:"merchantRecoFans" dc:"商家推荐粉丝数"` + T1Retention *float64 `json:"t1Retention" dc:"次日留存率"` + T7Retention *float64 `json:"t7Retention" dc:"7 日留存率"` + T15Retention *float64 `json:"t15Retention" dc:"15 日留存率"` + T30Retention *float64 `json:"t30Retention" dc:"30 日留存率"` + T1RetentionRatio *float64 `json:"t1RetentionRatio" dc:"次日留存比率"` + T7RetentionRatio *float64 `json:"t7RetentionRatio" dc:"7 日留存比率"` + T15RetentionRatio *float64 `json:"t15RetentionRatio" dc:"15 日留存比率"` + T30RetentionRatio *float64 `json:"t30RetentionRatio" dc:"30 日留存比率"` + ReservationSuccess *int64 `json:"reservationSuccess" dc:"预约成功数"` + ReservationCost *float64 `json:"reservationCost" dc:"预约成本"` + StandardLivePlayedStarted *int64 `json:"standardLivePlayedStarted" dc:"标准直播开始数"` + AdLivePlayCnt *int64 `json:"adLivePlayCnt" dc:"广告直播播放数"` + AdLivePlayCntCost *float64 `json:"adLivePlayCntCost" dc:"广告直播播放成本"` + LiveAudienceCost *float64 `json:"liveAudienceCost" dc:"直播观众成本"` + LiveEventGoodsView *int64 `json:"liveEventGoodsView" dc:"直播事件商品浏览数"` + GoodsClickRatio *float64 `json:"goodsClickRatio" dc:"商品点击率"` + DirectAttrPlatNewBuyerCnt *int64 `json:"directAttrPlatNewBuyerCnt" dc:"直接吸引平台新买家数"` + T30AttrPlatTotalBuyerCnt *int64 `json:"t30AttrPlatTotalBuyerCnt" dc:"30 日吸引平台总买家数"` + DirectAttrSellerNewBuyerCnt *int64 `json:"directAttrSellerNewBuyerCnt" dc:"直接吸引商家新买家数"` + T30AttrSellerTotalBuyerCnt *int64 `json:"t30AttrSellerTotalBuyerCnt" dc:"30 日吸引商家总买家数"` + T3Gmv *float64 `json:"t3Gmv" dc:"3 日 GMV"` + T3OrderCnt *int64 `json:"t3OrderCnt" dc:"3 日订单数"` + T3Roi *float64 `json:"t3Roi" dc:"3 日 ROI"` + T7IndirectOrderAmt *float64 `json:"t7IndirectOrderAmt" dc:"7 日间接订单金额"` + T7IndirectOrderCnt *int64 `json:"t7IndirectOrderCnt" dc:"7 日间接订单数"` + FansT0GmvPerFans *float64 `json:"fansT0GmvPerFans" dc:"粉丝当日人均 GMV"` + FansT3GmvPerFans *float64 `json:"fansT3GmvPerFans" dc:"粉丝 3 日人均 GMV"` + FansT7GmvPerFans *float64 `json:"fansT7GmvPerFans" dc:"粉丝 7 日人均 GMV"` + FansT15GmvPerFans *float64 `json:"fansT15GmvPerFans" dc:"粉丝 15 日人均 GMV"` + FansT30GmvPerFans *float64 `json:"fansT30GmvPerFans" dc:"粉丝 30 日人均 GMV"` + RecoFansCost *float64 `json:"recoFansCost" dc:"推荐粉丝成本"` + QcpxWhiteboxDirectOrderPaymentAmt *float64 `json:"qcpxWhiteboxDirectOrderPaymentAmt" dc:"白盒直接订单支付金额"` + QcpxWhiteboxDirectOrderCnt *int64 `json:"qcpxWhiteboxDirectOrderCnt" dc:"白盒直接订单数"` + FansT0Gmv *float64 `json:"fansT0Gmv" dc:"粉丝当日 GMV"` + FansT1Gmv *float64 `json:"fansT1Gmv" dc:"粉丝次日 GMV"` + FansT7Gmv *float64 `json:"fansT7Gmv" dc:"粉丝 7 日 GMV"` + FansT15Gmv *float64 `json:"fansT15Gmv" dc:"粉丝 15 日 GMV"` + FansT30Gmv *float64 `json:"fansT30Gmv" dc:"粉丝 30 日 GMV"` + FansT0Roi *float64 `json:"fansT0Roi" dc:"粉丝当日 ROI"` + FansT1Roi *float64 `json:"fansT1Roi" dc:"粉丝次日 ROI"` + FansT7Roi *float64 `json:"fansT7Roi" dc:"粉丝 7 日 ROI"` + FansT15Roi *float64 `json:"fansT15Roi" dc:"粉丝 15 日 ROI"` + FansT30Roi *float64 `json:"fansT30Roi" dc:"粉丝 30 日 ROI"` + T0ShopNewBuyerOrderPaymentAmt *float64 `json:"t0ShopNewBuyerOrderPaymentAmt" dc:"当日店铺新客订单支付金额"` + T1ShopNewBuyerOrderPaymentAmt *float64 `json:"t1ShopNewBuyerOrderPaymentAmt" dc:"次日店铺新客订单支付金额"` + T3ShopNewBuyerOrderPaymentAmt *float64 `json:"t3ShopNewBuyerOrderPaymentAmt" dc:"3 日店铺新客订单支付金额"` + T7ShopNewBuyerOrderPaymentAmt *float64 `json:"t7ShopNewBuyerOrderPaymentAmt" dc:"7 日店铺新客订单支付金额"` + T15ShopNewBuyerOrderPaymentAmt *float64 `json:"t15ShopNewBuyerOrderPaymentAmt" dc:"15 日店铺新客订单支付金额"` + T30ShopNewBuyerOrderPaymentAmt *float64 `json:"t30ShopNewBuyerOrderPaymentAmt" dc:"30 日店铺新客订单支付金额"` + T0ShopNewBuyerOrderCnt *int64 `json:"t0ShopNewBuyerOrderCnt" dc:"当日店铺新客订单数"` + T1ShopNewBuyerOrderCnt *int64 `json:"t1ShopNewBuyerOrderCnt" dc:"次日店铺新客订单数"` + T3ShopNewBuyerOrderCnt *int64 `json:"t3ShopNewBuyerOrderCnt" dc:"3 日店铺新客订单数"` + T7ShopNewBuyerOrderCnt *int64 `json:"t7ShopNewBuyerOrderCnt" dc:"7 日店铺新客订单数"` + T15ShopNewBuyerOrderCnt *int64 `json:"t15ShopNewBuyerOrderCnt" dc:"15 日店铺新客订单数"` + T30ShopNewBuyerOrderCnt *int64 `json:"t30ShopNewBuyerOrderCnt" dc:"30 日店铺新客订单数"` + T1NewBuyerRepurchaseRatio *float64 `json:"t1NewBuyerRepurchaseRatio" dc:"次日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `json:"t3NewBuyerRepurchaseRatio" dc:"3 日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `json:"t7NewBuyerRepurchaseRatio" dc:"7 日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `json:"t15NewBuyerRepurchaseRatio" dc:"15 日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `json:"t30NewBuyerRepurchaseRatio" dc:"30 日新客复购率"` + T0ShopNewBuyerRoi *float64 `json:"t0ShopNewBuyerRoi" dc:"当日店铺新客 ROI"` + T1ShopNewBuyerRoi *float64 `json:"t1ShopNewBuyerRoi" dc:"次日店铺新客 ROI"` + T3ShopNewBuyerRoi *float64 `json:"t3ShopNewBuyerRoi" dc:"3 日店铺新客 ROI"` + T7ShopNewBuyerRoi *float64 `json:"t7ShopNewBuyerRoi" dc:"7 日店铺新客 ROI"` + T15ShopNewBuyerRoi *float64 `json:"t15ShopNewBuyerRoi" dc:"15 日店铺新客 ROI"` + T30ShopNewBuyerRoi *float64 `json:"t30ShopNewBuyerRoi" dc:"30 日店铺新客 ROI"` + CreateCardOrderCnt *int64 `json:"createCardOrderCnt" dc:"创建卡片订单数"` + ForwardTsCreateCardOrderCnt *int64 `json:"forwardTsCreateCardOrderCnt" dc:"转发 TS 创建卡片订单数"` + CreateCardOrderCost *float64 `json:"createCardOrderCost" dc:"创建卡片订单成本"` + ForwardTsCreateCardOrderCost *float64 `json:"forwardTsCreateCardOrderCost" dc:"转发 TS 创建卡片订单成本"` + ActivateCardOrderCnt *int64 `json:"activateCardOrderCnt" dc:"激活卡片订单数"` + ForwardTsActivateCardOrderCnt *int64 `json:"forwardTsActivateCardOrderCnt" dc:"转发 TS 激活卡片订单数"` + ActivateCardOrderCost *float64 `json:"activateCardOrderCost" dc:"激活卡片订单成本"` + ForwardTsActivateCardOrderCost *float64 `json:"forwardTsActivateCardOrderCost" dc:"转发 TS 激活卡片订单成本"` + CreateCardOrderRatio *float64 `json:"createCardOrderRatio" dc:"创建卡片订单比率"` + ForwardTsCreateCardOrderRatio *float64 `json:"forwardTsCreateCardOrderRatio" dc:"转发 TS 创建卡片订单比率"` + ActivateCardOrderCntRatio *float64 `json:"activateCardOrderCntRatio" dc:"激活卡片订单比率"` + ForwardTsActivateCardOrderRatio *float64 `json:"forwardTsActivateCardOrderRatio" dc:"转发 TS 激活卡片订单比率"` + LivePlayCnt *int64 `json:"livePlayCnt" dc:"直播播放数"` + ItemEntranceClkCnt *int64 `json:"itemEntranceClkCnt" dc:"商品入口点击数"` + ShowCnt *int64 `json:"showCnt" dc:"展示数"` + ReportDateStr string `json:"reportDateStr" v:"required" dc:"报告日期(格式:YYYY-MM-DD)"` + CampaignId *int64 `json:"campaignId" dc:"计划 ID"` + CampaignName *string `json:"campaignName" dc:"计划名称"` + UnitId *int64 `json:"unitId" dc:"单元 ID"` + UnitName *string `json:"unitName" dc:"单元名称"` + CreativeId *int64 `json:"creativeId" dc:"创意 ID"` + CreativeName *string `json:"creativeName" dc:"创意名称"` +} + +// ListMaterialReportReq 获取素材报表数据列表请求 +type ListMaterialReportReq struct { + g.Meta `path:"/listMaterialReport" method:"get" tags:"素材报表" summary:"获取素材报表数据列表" dc:"分页查询素材报表数据列表"` + *beans.Page + ReportDateStr string `json:"reportDateStr" dc:"报告日期"` + PhotoId string `json:"photoId" dc:"照片 ID"` + CampaignId *int64 `json:"campaignId" dc:"计划 ID"` + UnitId *int64 `json:"unitId" dc:"单元 ID"` + CreativeId *int64 `json:"creativeId" dc:"创意 ID"` + Keyword string `json:"keyword" dc:"关键字(搜索照片名称、计划名称等)"` +} + +// ListMaterialReportRes 获取素材报表数据列表响应 +type ListMaterialReportRes struct { + List []*MaterialReportItem `json:"list" dc:"素材报表数据列表"` + Total int `json:"total" dc:"总数"` +} diff --git a/model/dto/copydata/population_report_dto.go b/model/dto/copydata/population_report_dto.go new file mode 100644 index 0000000..34338ae --- /dev/null +++ b/model/dto/copydata/population_report_dto.go @@ -0,0 +1,210 @@ +package copydata + +import ( + "gitea.com/red-future/common/beans" + "github.com/gogf/gf/v2/frame/g" +) + +// PopulationReportItem 调控任务数据项 +type PopulationReportItem struct { + PhotoName string `json:"photoName" description:"视频名称"` + PhotoIdStr string `json:"photoIdStr" description:"视频 id"` + PhotoId string `json:"photoId" description:"视频 id"` + ModPriceSegment string `json:"modPriceSegment" description:"设备价格区间"` + AgeSegment string `json:"ageSegment" description:"年龄段"` + Province string `json:"province" description:"省份名称"` + Gender string `json:"gender" description:"性别"` + MerchantProductId string `json:"merchantProductId" description:"商品 ID"` + ReportDateStr string `json:"reportDateStr" v:"required" description:"时间"` + CampaignId *int64 `json:"campaignId" description:"计划 ID"` + CampaignName string `json:"campaignName" description:"计划名称"` + UnitId *int64 `json:"unitId" description:"单元 ID"` + UnitName string `json:"unitName" description:"单元名称"` + CreativeId *int64 `json:"creativeId" description:"创意 ID"` + CreativeName string `json:"creativeName" description:"创意名称"` + AdPhotoPlayedFiveRatio *float64 `json:"adPhotoPlayedFiveRatio" description:"作品 5 秒播放率"` + AdPhotoPlayedThreeRatio *float64 `json:"adPhotoPlayedThreeRatio" description:"作品 3 秒播放率"` + OrderSubmitRoi *float64 `json:"orderSubmitRoi" description:"订单提交 ROI"` + OrderSubmitAmt *int64 `json:"orderSubmitAmt" description:"外部订单金额"` + EventOrderSubmitCost *float64 `json:"eventOrderSubmitCost" description:"订单提交成本"` + EventOrderSubmit *int64 `json:"eventOrderSubmit" description:"订单提交数"` + EventOrderPaidRoi *float64 `json:"eventOrderPaidRoi" description:"订单支付率"` + EventAppInvoked *int64 `json:"eventAppInvoked" description:"唤起应用数"` + EventAddShoppingCart *int64 `json:"eventAddShoppingCart" description:"添加购物车次数"` + ConversionNumCost *float64 `json:"conversionNumCost" description:"转化成本"` + AdEffectivePlayNum *int64 `json:"adEffectivePlayNum" description:"有效播放数"` + AdItemClick *int64 `json:"adItemClick" description:"行为数"` + CostTotal *float64 `json:"costTotal" description:"花费"` + AdShow *int64 `json:"adShow" description:"曝光数"` + AdShow1kCost *float64 `json:"adShow1kCost" description:"平均千次广告曝光花费"` + Impression *int64 `json:"impression" description:"封面曝光数"` + PhotoClick *int64 `json:"photoClick" description:"封面点击数"` + PhotoClickRatio *float64 `json:"photoClickRatio" description:"封面点击率"` + Click *int64 `json:"click" description:"素材曝光数"` + ActionbarClick *int64 `json:"actionbarClick" description:"行为数"` + ActionbarClickCost *float64 `json:"actionbarClickCost" description:"行为成本"` + EspClickRatio *float64 `json:"espClickRatio" description:"行为率"` + ActionRatio *float64 `json:"actionRatio" description:"素材点击率"` + AdItemClickCount *int64 `json:"adItemClickCount" description:"预约组件点击数"` + EspLivePlayedSeconds *int64 `json:"espLivePlayedSeconds" description:"直播平均观看时长"` + PlayedThreeSeconds *int64 `json:"playedThreeSeconds" description:"作品 3 秒播放数"` + Play3sRatio *float64 `json:"play3sRatio" description:"作品 3 秒播放率"` + PlayedFiveSeconds *int64 `json:"playedFiveSeconds" description:"作品 5 秒播放数"` + Play5sRatio *float64 `json:"play5sRatio" description:"作品 5 秒播放率"` + PlayedEnd *int64 `json:"playedEnd" description:"作品完播数"` + PlayEndRatio *float64 `json:"playEndRatio" description:"作品完播率"` + Share *int64 `json:"share" description:"作品分享数"` + Comment *int64 `json:"comment" description:"作品评论数"` + Likes *int64 `json:"likes" description:"作品点赞数"` + Report *int64 `json:"report" description:"作品举报数"` + Block *int64 `json:"block" description:"作品拉黑数"` + ItemNegative *int64 `json:"itemNegative" description:"详情页减少此类作品数"` + LiveShare *int64 `json:"liveShare" description:"直播送礼数"` + LiveComment *int64 `json:"liveComment" description:"直播评论数"` + LiveReward *int64 `json:"liveReward" description:"直播送礼数"` + EffectivePlayCount *int64 `json:"effectivePlayCount" description:"有效播放数"` + EffectivePlayRatio *float64 `json:"effectivePlayRatio" description:"有效播放率"` + ConversionNum *int64 `json:"conversionNum" description:"转化数"` + ConversionCostEsp *float64 `json:"conversionCostEsp" description:"转化成本"` + Roi *float64 `json:"roi" description:"直接 ROI"` + Gmv *float64 `json:"gmv" description:"直接 GMV"` + T0Gmv *float64 `json:"t0Gmv" description:"当日累计 GMV"` + T1Gmv *float64 `json:"t1Gmv" description:"次日累计 GMV"` + T3Gmv *float64 `json:"t3Gmv" description:"3 日累计 GMV"` + T7Gmv *float64 `json:"t7Gmv" description:"7 日累计 GMV"` + T15Gmv *float64 `json:"t15Gmv" description:"15 日累计 GMV"` + T30Gmv *float64 `json:"t30Gmv" description:"30 日累计 GMV"` + T0Roi *float64 `json:"t0Roi" description:"当日累计 ROI"` + T1Roi *float64 `json:"t1Roi" description:"次日累计 ROI"` + T3Roi *float64 `json:"t3Roi" description:"3 日累计 ROI"` + T7Roi *float64 `json:"t7Roi" description:"7 日累计 ROI"` + T15Roi *float64 `json:"t15Roi" description:"15 日累计 ROI"` + T30Roi *float64 `json:"t30Roi" description:"30 日累计 ROI"` + PaiedOrder *int64 `json:"paiedOrder" description:"直接订单数"` + OrderRatio *float64 `json:"orderRatio" description:"直接下单率"` + T0OrderCnt *int64 `json:"t0OrderCnt" description:"当日累计订单数"` + T0OrderCntCost *float64 `json:"t0OrderCntCost" description:"当日累计订单成本"` + T0OrderCntRatio *float64 `json:"t0OrderCntRatio" description:"累计订单下单率"` + T1OrderCnt *int64 `json:"t1OrderCnt" description:"次日累计订单数"` + T7OrderCnt *int64 `json:"t7OrderCnt" description:"7 日累计订单数"` + T15OrderCnt *int64 `json:"t15OrderCnt" description:"15 日累计订单数"` + T30OrderCnt *int64 `json:"t30OrderCnt" description:"30 日累计订单数"` + MerchantRecoFans *int64 `json:"merchantRecoFans" description:"涨粉数"` + T1Retention *float64 `json:"t1Retention" description:"次日涨粉留存数"` + T7Retention *float64 `json:"t7Retention" description:"7 日涨粉留存数"` + T15Retention *float64 `json:"t15Retention" description:"15 日涨粉留存数"` + T30Retention *float64 `json:"t30Retention" description:"30 日涨粉留存数"` + T1RetentionRatio *float64 `json:"t1RetentionRatio" description:"次日涨粉留存率"` + T7RetentionRatio *float64 `json:"t7RetentionRatio" description:"7 日涨粉留存率"` + T15RetentionRatio *float64 `json:"t15RetentionRatio" description:"15 日涨粉留存率"` + T30RetentionRatio *float64 `json:"t30RetentionRatio" description:"30 日涨粉留存率"` + ReservationSuccess *int64 `json:"reservationSuccess" description:"直播预约成功数"` + ReservationCost *float64 `json:"reservationCost" description:"直播预约成功成本"` + StandardLivePlayedStarted *int64 `json:"standardLivePlayedStarted" description:"直播观看数"` + AdLivePlayCnt *int64 `json:"adLivePlayCnt" description:"直播间人气数"` + AdLivePlayCntCost *float64 `json:"adLivePlayCntCost" description:"直播间人气成本"` + LiveAudienceCost *float64 `json:"liveAudienceCost" description:"直播观看成本"` + LiveEventGoodsView *int64 `json:"liveEventGoodsView" description:"直播间商品点击数"` + GoodsClickRatio *float64 `json:"goodsClickRatio" description:"直播间商品点击率"` + DirectAttrPlatNewBuyerCnt *int64 `json:"directAttrPlatNewBuyerCnt" description:"直接平台新客"` + T30AttrPlatTotalBuyerCnt *int64 `json:"t30AttrPlatTotalBuyerCnt" description:"30 日累计平台新客"` + DirectAttrSellerNewBuyerCnt *int64 `json:"directAttrSellerNewBuyerCnt" description:"直接店铺新客"` + T30AttrSellerTotalBuyerCnt *int64 `json:"t30AttrSellerTotalBuyerCnt" description:"30 日累计店铺新客"` + T7IndirectOrderAmt *float64 `json:"t7IndirectOrderAmt" description:"7 日间接订单金额"` + T7IndirectOrderCnt *int64 `json:"t7IndirectOrderCnt" description:"7 日间接订单数"` + FansT0GmvPerFans *float64 `json:"fansT0GmvPerFans" description:"新增粉丝人均销售额"` + FansT3GmvPerFans *float64 `json:"fansT3GmvPerFans" description:"3 日新增粉丝人均销售额"` + FansT7GmvPerFans *float64 `json:"fansT7GmvPerFans" description:"7 日新增粉丝人均销售额"` + FansT15GmvPerFans *float64 `json:"fansT15GmvPerFans" description:"15 日新增粉丝人均销售额"` + FansT30GmvPerFans *float64 `json:"fansT30GmvPerFans" description:"30 日新增粉丝人均销售额"` + RecoFansCost *float64 `json:"recoFansCost" description:"涨粉成本"` + QcpxWhiteboxDirectOrderPaymentAmt *float64 `json:"qcpxWhiteboxDirectOrderPaymentAmt" description:"智能优惠券订单 GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `json:"qcpxWhiteboxDirectOrderCnt" description:"智能优惠券订单数"` + FansT0Gmv *float64 `json:"fansT0Gmv" description:"涨粉当日 GMV"` + FansT1Gmv *float64 `json:"fansT1Gmv" description:"涨粉次日 GMV"` + FansT7Gmv *float64 `json:"fansT7Gmv" description:"涨粉 7 日 GMV"` + FansT15Gmv *float64 `json:"fansT15Gmv" description:"涨粉 15 日 GMV"` + FansT30Gmv *float64 `json:"fansT30Gmv" description:"涨粉 30 日 GMV"` + FansT0Roi *float64 `json:"fansT0Roi" description:"涨粉当日 ROI"` + FansT1Roi *float64 `json:"fansT1Roi" description:"涨粉次日 ROI"` + FansT7Roi *float64 `json:"fansT7Roi" description:"涨粉 7 日 ROI"` + FansT15Roi *float64 `json:"fansT15Roi" description:"涨粉 15 日 ROI"` + FansT30Roi *float64 `json:"fansT30Roi" description:"涨粉 30 日 ROI"` + T0ShopNewBuyerOrderPaymentAmt *float64 `json:"t0ShopNewBuyerOrderPaymentAmt" description:"当日新客 GMV"` + T1ShopNewBuyerOrderPaymentAmt *float64 `json:"t1ShopNewBuyerOrderPaymentAmt" description:"投后 1 日新客 GMV"` + T3ShopNewBuyerOrderPaymentAmt *float64 `json:"t3ShopNewBuyerOrderPaymentAmt" description:"投后 3 日新客 GMV"` + T7ShopNewBuyerOrderPaymentAmt *float64 `json:"t7ShopNewBuyerOrderPaymentAmt" description:"投后 7 日新客 GMV"` + T15ShopNewBuyerOrderPaymentAmt *float64 `json:"t15ShopNewBuyerOrderPaymentAmt" description:"投后 15 日新客 GMV"` + T30ShopNewBuyerOrderPaymentAmt *float64 `json:"t30ShopNewBuyerOrderPaymentAmt" description:"投后 30 日新客 GMV"` + T0ShopNewBuyerOrderCnt *int64 `json:"t0ShopNewBuyerOrderCnt" description:"当日新客成交订单量"` + T1ShopNewBuyerOrderCnt *int64 `json:"t1ShopNewBuyerOrderCnt" description:"投后 1 日新客成交订单量"` + T3ShopNewBuyerOrderCnt *int64 `json:"t3ShopNewBuyerOrderCnt" description:"投后 3 日新客成交订单量"` + T7ShopNewBuyerOrderCnt *int64 `json:"t7ShopNewBuyerOrderCnt" description:"投后 7 日新客成交订单量"` + T15ShopNewBuyerOrderCnt *int64 `json:"t15ShopNewBuyerOrderCnt" description:"投后 15 日新客成交订单量"` + T30ShopNewBuyerOrderCnt *int64 `json:"t30ShopNewBuyerOrderCnt" description:"投后 30 日新客成交订单量"` + T1NewBuyerRepurchaseRatio *float64 `json:"t1NewBuyerRepurchaseRatio" description:"投后 1 日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `json:"t3NewBuyerRepurchaseRatio" description:"投后 3 日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `json:"t7NewBuyerRepurchaseRatio" description:"投后 7 日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `json:"t15NewBuyerRepurchaseRatio" description:"投后 15 日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `json:"t30NewBuyerRepurchaseRatio" description:"投后 30 日新客复购率"` + T0ShopNewBuyerRoi *float64 `json:"t0ShopNewBuyerRoi" description:"投后当日新客 ROI"` + T1ShopNewBuyerRoi *float64 `json:"t1ShopNewBuyerRoi" description:"投后 1 日新客 ROI"` + T3ShopNewBuyerRoi *float64 `json:"t3ShopNewBuyerRoi" description:"投后 3 日新客 ROI"` + T7ShopNewBuyerRoi *float64 `json:"t7ShopNewBuyerRoi" description:"投后 7 日新客 ROI"` + T15ShopNewBuyerRoi *float64 `json:"t15ShopNewBuyerRoi" description:"投后 15 日新客 ROI"` + T30ShopNewBuyerRoi *float64 `json:"t30ShopNewBuyerRoi" description:"投后 30 日新客 ROI"` + CreateCardOrderCnt *int64 `json:"createCardOrderCnt" description:"有效制卡订单数(回传时间)"` + ForwardTsCreateCardOrderCnt *int64 `json:"forwardTsCreateCardOrderCnt" description:"有效制卡订单数(计费时间)"` + CreateCardOrderCost *float64 `json:"createCardOrderCost" description:"有效制卡订单成本(回传时间)"` + ForwardTsCreateCardOrderCost *float64 `json:"forwardTsCreateCardOrderCost" description:"有效制卡订单成本(计费时间)"` + ActivateCardOrderCnt *int64 `json:"activateCardOrderCnt" description:"电话卡激活订单数(回传时间)"` + ForwardTsActivateCardOrderCnt *int64 `json:"forwardTsActivateCardOrderCnt" description:"电话卡激活订单数(计费时间)"` + ActivateCardOrderCost *float64 `json:"activateCardOrderCost" description:"电话卡激活订单成本(回传时间)"` + ForwardTsActivateCardOrderCost *float64 `json:"forwardTsActivateCardOrderCost" description:"电话卡激活订单成本(计费时间)"` + CreateCardOrderRatio *float64 `json:"createCardOrderRatio" description:"有效制卡订单率(回传时间)"` + ForwardTsCreateCardOrderRatio *float64 `json:"forwardTsCreateCardOrderRatio" description:"有效制卡订单率(计费时间)"` + ActivateCardOrderCntRatio *float64 `json:"activateCardOrderCntRatio" description:"电话卡激活率(回传时间)"` + ForwardTsActivateCardOrderRatio *float64 `json:"forwardTsActivateCardOrderRatio" description:"电话卡激活率(计费时间)"` + LivePlayCnt *int64 `json:"livePlayCnt" description:"全站直播观看数"` + ItemEntranceClkCnt *int64 `json:"itemEntranceClkCnt" description:"小黄车点击数"` + ShowCnt *int64 `json:"showCnt" description:"全站曝光"` +} + +// CreatePopulationReportReq 创建调控任务数据请求参数 +type CreatePopulationReportReq struct { + g.Meta `path:"/createPopulationReport" method:"post"` + *PopulationReportItem +} + +// CreatePopulationReportRes 创建调控任务数据响应参数 +type CreatePopulationReportRes struct { + Id int64 `json:"id"` +} + +// BatchCreatePopulationReportReq 批量创建调控任务数据请求参数 +type BatchCreatePopulationReportReq struct { + g.Meta `path:"/batchCreatePopulationReport" method:"post"` + Items []*PopulationReportItem `json:"items" v:"required"` +} + +// BatchCreatePopulationReportRes 批量创建调控任务数据响应参数 +type BatchCreatePopulationReportRes struct { + SuccessCount int64 `json:"successCount"` + FailCount int64 `json:"failCount"` + FailedItems []int64 `json:"failedItems"` +} + +// ListPopulationReportReq 查询调控任务数据列表请求参数 +type ListPopulationReportReq struct { + g.Meta `path:"/listPopulationReport" method:"post"` + *beans.Page + ReportDateStr string `json:"reportDateStr" description:"时间"` + PhotoId string `json:"photoId" description:"视频 id"` + Keyword string `json:"keyword" description:"关键词"` +} + +// ListPopulationReportRes 查询调控任务数据列表响应参数 +type ListPopulationReportRes struct { + List []*PopulationReportItem `json:"list"` + Total int `json:"total"` +} diff --git a/model/dto/copydata/storewide_report_detail_dto.go b/model/dto/copydata/storewide_report_detail_dto.go new file mode 100644 index 0000000..dc6f352 --- /dev/null +++ b/model/dto/copydata/storewide_report_detail_dto.go @@ -0,0 +1,132 @@ +package copydata + +import ( + "gitea.com/red-future/common/beans" + "github.com/gogf/gf/v2/frame/g" +) + +// CreateStorewideReportDetailReq 创建广告效果指标表请求 +type CreateStorewideReportDetailReq struct { + g.Meta `path:"/createStorewideReportDetail" method:"post" tags:"广告效果指标" summary:"创建广告效果指标表" dc:"创建新的广告效果指标表"` + *StorewideReportDetailItem +} + +// CreateStorewideReportDetailRes 创建广告效果指标表响应 +type CreateStorewideReportDetailRes struct { + Id int64 `json:"id" dc:"广告效果指标 ID"` +} + +// BatchCreateStorewideReportDetailReq 批量创建广告效果指标表请求 +type BatchCreateStorewideReportDetailReq struct { + g.Meta `path:"/batchCreateStorewideReportDetail" method:"post" tags:"广告效果指标" summary:"批量创建广告效果指标表" dc:"批量创建广告效果指标表"` + Items []*StorewideReportDetailItem `json:"items" v:"required" dc:"广告效果指标列表"` +} + +// BatchCreateStorewideReportDetailRes 批量创建广告效果指标表响应 +type BatchCreateStorewideReportDetailRes struct { + SuccessCount int64 `json:"successCount" dc:"成功数量"` + FailCount int64 `json:"failCount" dc:"失败数量"` + FailedItems []int64 `json:"failedItems" dc:"失败项索引"` +} + +// StorewideReportDetailItem 广告效果指标表项 +type StorewideReportDetailItem struct { + // 订单金额相关字段 + T0OrderPaymentAmt *float64 `json:"t0OrderPaymentAmt" dc:"当日总成交订单金额"` + + // 素材类型字段 + CreativeMaterialType string `json:"creativeMaterialType" dc:"视频素材类型(视频:HORIZONTAL_SCREEN, VERTICAL_SCREEN, UNKNOWN_TYPE;图集:ATLAS;长图:ATLAS_VERTICAL)"` + + // 直播相关字段 + LiveName string `json:"liveName" dc:"直播间名称"` + AuthorId string `json:"authorId" dc:"直播用户快手 Id"` + + // 图片相关字段 + PicUrl string `json:"picUrl" dc:"图片 URL"` + PicName string `json:"picName" dc:"图片名称"` + PicId string `json:"picId" dc:"图片 Id"` + + // 封面相关字段 + CoverUrl string `json:"coverUrl" dc:"封面 URL"` + CoverId *int64 `json:"coverId" dc:"封面 Id"` + + // 商品卡点击相关字段 + ItemCardClkCnt *int64 `json:"itemCardClkCnt" dc:"商品卡点击数"` + + // 净成交相关字段 + NetT0OrderCnt *int64 `json:"netT0OrderCnt" dc:"当日累计净成交订单数"` + NetT0Roi *float64 `json:"netT0Roi" dc:"净成交 ROI"` + NetT0Gmv *float64 `json:"netT0Gmv" dc:"净成交 GMV"` + + // 视频相关字段 + PhotoName string `json:"photoName" dc:"视频名称"` + PhotoIdStr string `json:"photoIdStr" dc:"视频 id"` + PhotoId string `json:"photoId" dc:"视频 id"` + + // 行为相关字段 + AdItemClick *int64 `json:"adItemClick" dc:"行为数"` + + // 商品相关字段 + MerchantProductId string `json:"merchantProductId" dc:"商品 ID"` + + // 花费相关字段 + CostTotal *float64 `json:"costTotal" dc:"花费"` + + // 行为率字段 + EspClickRatio *float64 `json:"espClickRatio" dc:"行为率"` + + // 当日 GMV 相关字段 + T0Gmv *float64 `json:"t0Gmv" dc:"当日累计 GMV"` + T0Roi *float64 `json:"t0Roi" dc:"当日累计 ROI"` + + // 当日订单相关字段 + T0OrderCnt *int64 `json:"t0OrderCnt" dc:"当日累计订单数"` + T0OrderCntCost *float64 `json:"t0OrderCntCost" dc:"当日累计订单成本"` + + // 智能优惠券相关字段 + QcpxWhiteboxDirectOrderPaymentAmt *float64 `json:"qcpxWhiteboxDirectOrderPaymentAmt" dc:"智能优惠券订单 GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `json:"qcpxWhiteboxDirectOrderCnt" dc:"智能优惠券订单数"` + + // 直播观看相关字段 + LivePlayCnt *int64 `json:"livePlayCnt" dc:"全站直播观看数"` + + // 商品入口点击相关字段 + ItemEntranceClkCnt *int64 `json:"itemEntranceClkCnt" dc:"小黄车点击数"` + + // 曝光相关字段 + ShowCnt *int64 `json:"showCnt" dc:"全站曝光"` + + // 报告日期字段 + ReportDateStr string `json:"reportDateStr" v:"required" dc:"时间"` + + // 广告计划相关字段 + CampaignId *int64 `json:"campaignId" dc:"计划 ID"` + CampaignName string `json:"campaignName" dc:"计划名称"` + + // 广告单元相关字段 + UnitId *int64 `json:"unitId" dc:"单元 ID"` + UnitName string `json:"unitName" dc:"单元名称"` + + // 广告创意相关字段 + CreativeId *int64 `json:"creativeId" dc:"创意 ID"` + CreativeName string `json:"creativeName" dc:"创意名称"` +} + +// ListStorewideReportDetailReq 获取广告效果指标表列表请求 +type ListStorewideReportDetailReq struct { + g.Meta `path:"/listStorewideReportDetail" method:"get" tags:"广告效果指标" summary:"获取广告效果指标表列表" dc:"分页查询广告效果指标表列表"` + *beans.Page + ReportDateStr string `json:"reportDateStr" dc:"时间"` + CampaignId *int64 `json:"campaignId" dc:"计划 ID"` + UnitId *int64 `json:"unitId" dc:"单元 ID"` + CreativeId *int64 `json:"creativeId" dc:"创意 ID"` + AuthorId string `json:"authorId" dc:"直播用户快手 Id"` + MerchantProductId string `json:"merchantProductId" dc:"商品 ID"` + Keyword string `json:"keyword" dc:"关键字(搜索直播间名称、视频名称等)"` +} + +// ListStorewideReportDetailRes 获取广告效果指标表列表响应 +type ListStorewideReportDetailRes struct { + List []*StorewideReportDetailItem `json:"list" dc:"广告效果指标列表"` + Total int `json:"total" dc:"总数"` +} diff --git a/model/dto/copydata/storewide_report_sum_dto.go b/model/dto/copydata/storewide_report_sum_dto.go new file mode 100644 index 0000000..cfdf030 --- /dev/null +++ b/model/dto/copydata/storewide_report_sum_dto.go @@ -0,0 +1,92 @@ +package copydata + +import ( + "gitea.com/red-future/common/beans" + "github.com/gogf/gf/v2/frame/g" +) + +// CreateStorewideReportSumReq 创建广告效果指标表请求 +type CreateStorewideReportSumReq struct { + g.Meta `path:"/createStorewideReportSum" method:"post" tags:"广告效果指标" summary:"创建广告效果指标表" dc:"创建新的广告效果指标表"` + *StorewideReportSumItem +} + +// CreateStorewideReportSumRes 创建广告效果指标表响应 +type CreateStorewideReportSumRes struct { + Id int64 `json:"id" dc:"广告效果指标 ID"` +} + +// BatchCreateStorewideReportSumReq 批量创建广告效果指标表请求 +type BatchCreateStorewideReportSumReq struct { + g.Meta `path:"/batchCreateStorewideReportSum" method:"post" tags:"广告效果指标" summary:"批量创建广告效果指标表" dc:"批量创建广告效果指标表"` + Items []*StorewideReportSumItem `json:"items" v:"required" dc:"广告效果指标列表"` +} + +// BatchCreateStorewideReportSumRes 批量创建广告效果指标表响应 +type BatchCreateStorewideReportSumRes struct { + SuccessCount int64 `json:"successCount" dc:"成功数量"` + FailCount int64 `json:"failCount" dc:"失败数量"` + FailedItems []int64 `json:"failedItems" dc:"失败项索引"` +} + +// StorewideReportSumItem 广告效果指标表项 +type StorewideReportSumItem struct { + // 新增字段 + T0OrderPaymentAmt *float64 `json:"t0OrderPaymentAmt" dc:"当日总成交订单金额"` + CreativeMaterialType string `json:"creativeMaterialType" dc:"视频素材类型"` + LiveName string `json:"liveName" dc:"直播间名称"` + AuthorId string `json:"authorId" dc:"直播用户快手 Id"` + PicUrl string `json:"picUrl" dc:"图片 URL"` + PicName string `json:"picName" dc:"图片名称"` + PicId string `json:"picId" dc:"图片 Id"` + CoverUrl string `json:"coverUrl" dc:"封面 URL"` + CoverId *int64 `json:"coverId" dc:"封面 Id"` + ItemCardClkCnt *int64 `json:"itemCardClkCnt" dc:"商品卡点击数"` + NetT0OrderCnt *int64 `json:"netT0OrderCnt" dc:"当日累计净成交订单数"` + NetT0Roi *float64 `json:"netT0Roi" dc:"净成交 ROI"` + NetT0Gmv *float64 `json:"netT0Gmv" dc:"净成交 GMV"` + + // 原有字段 + PhotoName string `json:"photoName" dc:"视频名称"` + PhotoIdStr string `json:"photoIdStr" dc:"视频 id"` + PhotoId string `json:"photoId" dc:"视频 id"` + AdItemClick *int64 `json:"adItemClick" dc:"行为数"` + MerchantProductId string `json:"merchantProductId" dc:"商品 ID"` + CostTotal *float64 `json:"costTotal" dc:"花费"` + EspClickRatio *float64 `json:"espClickRatio" dc:"行为率"` + T0Gmv *float64 `json:"t0Gmv" dc:"当日累计 GMV"` + T0Roi *float64 `json:"t0Roi" dc:"当日累计 ROI"` + T0OrderCnt *int64 `json:"t0OrderCnt" dc:"当日累计订单数"` + T0OrderCntCost *float64 `json:"t0OrderCntCost" dc:"当日累计订单成本"` + QcpxWhiteboxDirectOrderPaymentAmt *float64 `json:"qcpxWhiteboxDirectOrderPaymentAmt" dc:"智能优惠券订单 GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `json:"qcpxWhiteboxDirectOrderCnt" dc:"智能优惠券订单数"` + LivePlayCnt *int64 `json:"livePlayCnt" dc:"全站直播观看数"` + ItemEntranceClkCnt *int64 `json:"itemEntranceClkCnt" dc:"小黄车点击数"` + ShowCnt *int64 `json:"showCnt" dc:"全站曝光"` + ReportDateStr string `json:"reportDateStr" v:"required" dc:"时间"` + CampaignId *int64 `json:"campaignId" dc:"计划 ID"` + CampaignName string `json:"campaignName" dc:"计划名称"` + UnitId *int64 `json:"unitId" dc:"单元 ID"` + UnitName string `json:"unitName" dc:"单元名称"` + CreativeId *int64 `json:"creativeId" dc:"创意 ID"` + CreativeName string `json:"creativeName" dc:"创意名称"` +} + +// ListStorewideReportSumReq 获取广告效果指标表列表请求 +type ListStorewideReportSumReq struct { + g.Meta `path:"/listStorewideReportSum" method:"get" tags:"广告效果指标" summary:"获取广告效果指标表列表" dc:"分页查询广告效果指标表列表"` + *beans.Page + ReportDateStr string `json:"reportDateStr" dc:"时间"` + CampaignId *int64 `json:"campaignId" dc:"计划 ID"` + UnitId *int64 `json:"unitId" dc:"单元 ID"` + CreativeId *int64 `json:"creativeId" dc:"创意 ID"` + AuthorId string `json:"authorId" dc:"直播用户快手 Id"` + MerchantProductId string `json:"merchantProductId" dc:"商品 ID"` + Keyword string `json:"keyword" dc:"关键字(搜索直播间名称、视频名称等)"` +} + +// ListStorewideReportSumRes 获取广告效果指标表列表响应 +type ListStorewideReportSumRes struct { + List []*StorewideReportSumItem `json:"list" dc:"广告效果指标列表"` + Total int `json:"total" dc:"总数"` +} diff --git a/model/dto/copydata/task_report_dto.go b/model/dto/copydata/task_report_dto.go new file mode 100644 index 0000000..089bef7 --- /dev/null +++ b/model/dto/copydata/task_report_dto.go @@ -0,0 +1,92 @@ +package copydata + +import ( + "gitea.com/red-future/common/beans" + "github.com/gogf/gf/v2/frame/g" +) + +// CreateTaskReportReq 创建调控任务数据请求 +type CreateTaskReportReq struct { + g.Meta `path:"/createTaskReport" method:"post" tags:"调控任务" summary:"创建调控任务数据" dc:"创建新的调控任务数据"` + *TaskReportItem +} + +// CreateTaskReportRes 创建调控任务数据响应 +type CreateTaskReportRes struct { + Id int64 `json:"id" dc:"调控任务数据 ID"` +} + +// BatchCreateTaskReportReq 批量创建调控任务数据请求 +type BatchCreateTaskReportReq struct { + g.Meta `path:"/batchCreateTaskReport" method:"post" tags:"调控任务" summary:"批量创建调控任务数据" dc:"批量创建调控任务数据"` + Items []*TaskReportItem `json:"items" v:"required" dc:"调控任务数据列表"` +} + +// BatchCreateTaskReportRes 批量创建调控任务数据响应 +type BatchCreateTaskReportRes struct { + SuccessCount int64 `json:"successCount" dc:"成功数量"` + FailCount int64 `json:"failCount" dc:"失败数量"` + FailedItems []int64 `json:"failedItems" dc:"失败项索引"` +} + +// TaskReportItem 调控任务数据项 +type TaskReportItem struct { + // 转化率相关字段 + ItemOrderConversionRatio *float64 `json:"itemOrderConversionRatio" dc:"转化率"` + ItemCardClickRatio *float64 `json:"itemCardClickRatio" dc:"点击率"` + ItemCardClkCnt *int64 `json:"itemCardClkCnt" dc:"商品卡点击数"` + LivePlayCntCost *float64 `json:"livePlayCntCost" dc:"直播间观看成本"` + AdMerchantFollowCost *float64 `json:"adMerchantFollowCost" dc:"涨粉成本"` + AdMerchantFollow *int64 `json:"adMerchantFollow" dc:"涨粉数"` + NetT0OrderCnt *int64 `json:"netT0OrderCnt" dc:"当日累计净成交订单数"` + NetT0Roi *float64 `json:"netT0Roi" dc:"净成交 ROI"` + NetT0Gmv *float64 `json:"netT0Gmv" dc:"净成交 GMV"` + + // 视频信息字段 + PhotoName string `json:"photoName" dc:"视频名称"` + PhotoId string `json:"photoId" dc:"视频 id"` + + // 核心指标字段 + CostTotal *float64 `json:"costTotal" dc:"花费"` + T0Gmv *float64 `json:"t0Gmv" dc:"当日累计 GMV"` + T0Roi *float64 `json:"t0Roi" dc:"当日累计 ROI"` + T0OrderCnt *int64 `json:"t0OrderCnt" dc:"当日累计订单数"` + T0OrderCntCost *float64 `json:"t0OrderCntCost" dc:"当日累计订单成本"` + + // 粉丝 GMV 字段 + FansT0Gmv *float64 `json:"fansT0Gmv" dc:"涨粉当日 GMV"` + FansT1Gmv *float64 `json:"fansT1Gmv" dc:"涨粉次日 GMV"` + FansT7Gmv *float64 `json:"fansT7Gmv" dc:"涨粉 7 日 GMV"` + FansT15Gmv *float64 `json:"fansT15Gmv" dc:"涨粉 15 日 GMV"` + FansT30Gmv *float64 `json:"fansT30Gmv" dc:"涨粉 30 日 GMV"` + + // 粉丝 ROI 字段 + FansT0Roi *float64 `json:"fansT0Roi" dc:"涨粉当日 ROI"` + FansT1Roi *float64 `json:"fansT1Roi" dc:"涨粉次日 ROI"` + FansT7Roi *float64 `json:"fansT7Roi" dc:"涨粉 7 日 ROI"` + FansT15Roi *float64 `json:"fansT15Roi" dc:"涨粉 15 日 ROI"` + FansT30Roi *float64 `json:"fansT30Roi" dc:"涨粉 30 日 ROI"` + + // 全站数据字段 + LivePlayCnt *int64 `json:"livePlayCnt" dc:"全站直播观看数"` + ItemEntranceClkCnt *int64 `json:"itemEntranceClkCnt" dc:"小黄车点击数"` + ShowCnt *int64 `json:"showCnt" dc:"全站曝光"` + + // 时间字段 + ReportDateStr string `json:"reportDateStr" v:"required" dc:"时间(格式:YYYY-MM-DD)"` +} + +// ListTaskReportReq 获取调控任务数据列表请求 +type ListTaskReportReq struct { + g.Meta `path:"/listTaskReport" method:"get" tags:"调控任务" summary:"获取调控任务数据列表" dc:"分页查询调控任务数据列表"` + *beans.Page + ReportDateStr string `json:"reportDateStr" dc:"时间"` + PhotoId string `json:"photoId" dc:"视频 id"` + Keyword string `json:"keyword" dc:"关键字(搜索视频名称等)"` +} + +// ListTaskReportRes 获取调控任务数据列表响应 +type ListTaskReportRes struct { + List []*TaskReportItem `json:"list" dc:"调控任务数据列表"` + Total int `json:"total" dc:"总数"` +} diff --git a/model/dto/copydata/unit_report_detail_dto.go b/model/dto/copydata/unit_report_detail_dto.go new file mode 100644 index 0000000..2ae6da5 --- /dev/null +++ b/model/dto/copydata/unit_report_detail_dto.go @@ -0,0 +1,237 @@ +package copydata + +import ( + "gitea.com/red-future/common/beans" + "github.com/gogf/gf/v2/frame/g" +) + +// CreateUnitReportDetailReq 创建广告效果指标详情请求 +type CreateUnitReportDetailReq struct { + g.Meta `path:"/createUnitReportDetail" method:"post" tags:"广告效果指标详情" summary:"创建广告效果指标详情" dc:"创建新的广告效果指标详情"` + *UnitReportDetailItem +} + +// CreateUnitReportDetailRes 创建广告效果指标详情响应 +type CreateUnitReportDetailRes struct { + Id int64 `json:"id" dc:"广告数据 ID"` +} + +// BatchCreateUnitReportDetailReq 批量创建广告效果指标详情请求 +type BatchCreateUnitReportDetailReq struct { + g.Meta `path:"/batchCreateUnitReportDetail" method:"post" tags:"广告效果指标详情" summary:"批量创建广告效果指标详情" dc:"批量创建广告效果指标详情"` + Items []*UnitReportDetailItem `json:"items" v:"required" dc:"广告数据列表"` +} + +// BatchCreateUnitReportDetailRes 批量创建广告效果指标详情响应 +type BatchCreateUnitReportDetailRes struct { + SuccessCount int64 `json:"successCount" dc:"成功数量"` + FailCount int64 `json:"failCount" dc:"失败数量"` + FailedItems []int64 `json:"failedItems" dc:"失败项索引"` +} + +// UnitReportDetailItem 广告效果指标详情项 +type UnitReportDetailItem struct { + T0OrderPaymentAmt *float64 `json:"t0OrderPaymentAmt" dc:"当日总成交订单金额"` + CreativeMaterialType string `json:"creativeMaterialType" dc:"视频素材类型(视频:HORIZONTAL_SCREEN, VERTICAL_SCREEN, UNKNOWN_TYPE;图集:ATLAS;长图:ATLAS_VERTICAL)"` + LiveName string `json:"liveName" dc:"直播间名称"` + AuthorId string `json:"authorId" dc:"直播用户快手 Id"` + PicUrl string `json:"picUrl" dc:"图片 URL"` + PicName string `json:"picName" dc:"图片名称"` + PicId string `json:"picId" dc:"图片 Id"` + CoverUrl string `json:"coverUrl" dc:"封面 URL"` + CoverId *int64 `json:"coverId" dc:"封面 Id"` + ItemOrderConversionRatio *float64 `json:"itemOrderConversionRatio" dc:"转化率"` + ItemCardClickRatio *float64 `json:"itemCardClickRatio" dc:"点击率"` + ItemCardClkCnt *int64 `json:"itemCardClkCnt" dc:"商品卡点击数"` + LivePlayCntCost *float64 `json:"livePlayCntCost" dc:"直播间观看成本"` + AdMerchantFollowCost *float64 `json:"adMerchantFollowCost" dc:"涨粉成本"` + AdMerchantFollow *int64 `json:"adMerchantFollow" dc:"涨粉数"` + NetT0OrderCnt *int64 `json:"netT0OrderCnt" dc:"当日累计净成交订单数"` + NetT0Roi *float64 `json:"netT0Roi" dc:"净成交 ROI"` + NetT0Gmv *float64 `json:"netT0Gmv" dc:"净成交 GMV"` + PhotoName string `json:"photoName" dc:"视频名称"` + PhotoIdStr string `json:"photoIdStr" dc:"视频 id"` + PhotoId string `json:"photoId" dc:"视频 id"` + ModPriceSegment string `json:"modPriceSegment" dc:"设备价格区间,"0-500", "501-1000", "1001-1500", "1501-2000", "2001-2500", "2501-3000", "3001-3500", "3501-4000", "4001-4500", "4501-5000", "5001-5500", "5501+", "未知""` + AgeSegment string `json:"ageSegment" dc:"年龄段"0-17", "18-23", "24-30", "31-40", "41-49", "50+","未知""` + Province string `json:"province" dc:"省份名称"` + Gender string `json:"gender" dc:"男,女,未知三种类型"` + AdPhotoPlayedFiveRatio *float64 `json:"adPhotoPlayedFiveRatio" dc:"作品 5 秒播放率"` + AdPhotoPlayedThreeRatio *float64 `json:"adPhotoPlayedThreeRatio" dc:"作品 3 秒播放率"` + OrderSubmitRoi *float64 `json:"orderSubmitRoi" dc:"订单提交 ROI"` + OrderSubmitAmt *int64 `json:"orderSubmitAmt" dc:"外部订单金额"` + EventOrderSubmitCost *float64 `json:"eventOrderSubmitCost" dc:"订单提交成本"` + EventOrderSubmit *int64 `json:"eventOrderSubmit" dc:"订单提交数"` + EventOrderPaidRoi *float64 `json:"eventOrderPaidRoi" dc:"订单支付率"` + EventAppInvoked *int64 `json:"eventAppInvoked" dc:"唤起应用数"` + EventAddShoppingCart *int64 `json:"eventAddShoppingCart" dc:"添加购物车次数"` + ConversionNumCost *float64 `json:"conversionNumCost" dc:"转化成本(回传时间)"` + AdEffectivePlayNum *int64 `json:"adEffectivePlayNum" dc:"有效播放数"` + AdItemClick *int64 `json:"adItemClick" dc:"行为数"` + MerchantProductId string `json:"merchantProductId" dc:"商品 ID"` + CostTotal *float64 `json:"costTotal" dc:"花费"` + AdShow *int64 `json:"adShow" dc:"曝光数"` + AdShow1kCost *float64 `json:"adShow1kCost" dc:"平均千次广告曝光花费"` + Impression *int64 `json:"impression" dc:"封面曝光数"` + PhotoClick *int64 `json:"photoClick" dc:"封面点击数"` + PhotoClickRatio *float64 `json:"photoClickRatio" dc:"封面点击率"` + Click *int64 `json:"click" dc:"素材曝光数"` + ActionbarClick *int64 `json:"actionbarClick" dc:"行为数"` + ActionbarClickCost *float64 `json:"actionbarClickCost" dc:"行为成本"` + EspClickRatio *float64 `json:"espClickRatio" dc:"行为率"` + ActionRatio *float64 `json:"actionRatio" dc:"素材点击率"` + AdItemClickCount *int64 `json:"adItemClickCount" dc:"预约组件点击数"` + EspLivePlayedSeconds *int64 `json:"espLivePlayedSeconds" dc:"直播平均观看时长"` + PlayedThreeSeconds *int64 `json:"playedThreeSeconds" dc:"作品 3 秒播放数"` + Play3sRatio *float64 `json:"play3sRatio" dc:"作品 3 秒播放率"` + PlayedFiveSeconds *int64 `json:"playedFiveSeconds" dc:"作品 5 秒播放数"` + Play5sRatio *float64 `json:"play5sRatio" dc:"作品 5 秒播放率"` + PlayedEnd *int64 `json:"playedEnd" dc:"作品完播数"` + PlayEndRatio *float64 `json:"playEndRatio" dc:"作品完播率"` + Share *int64 `json:"share" dc:"作品分享数"` + Comment *int64 `json:"comment" dc:"作品评论数"` + Likes *int64 `json:"likes" dc:"作品点赞数"` + Report *int64 `json:"report" dc:"作品举报数"` + Block *int64 `json:"block" dc:"作品拉黑数"` + ItemNegative *int64 `json:"itemNegative" dc:"详情页减少此类作品数"` + LiveShare *int64 `json:"liveShare" dc:"直播送礼数"` + LiveComment *int64 `json:"liveComment" dc:"直播评论数"` + LiveReward *int64 `json:"liveReward" dc:"直播送礼数"` + EffectivePlayCount *int64 `json:"effectivePlayCount" dc:"有效播放数"` + EffectivePlayRatio *float64 `json:"effectivePlayRatio" dc:"有效播放率"` + ConversionNum *int64 `json:"conversionNum" dc:"转化数"` + ConversionCostEsp *float64 `json:"conversionCostEsp" dc:"转化成本"` + Roi *float64 `json:"roi" dc:"直接 ROI"` + Gmv *float64 `json:"gmv" dc:"直接 GMV"` + T0Gmv *float64 `json:"t0Gmv" dc:"当日累计 GMV"` + T1Gmv *float64 `json:"t1Gmv" dc:"次日累计 GMV"` + T7Gmv *float64 `json:"t7Gmv" dc:"7 日累计 GMV"` + T15Gmv *float64 `json:"t15Gmv" dc:"15 日累计 GMV"` + T30Gmv *float64 `json:"t30Gmv" dc:"30 日累计 GMV"` + T0Roi *float64 `json:"t0Roi" dc:"当日累计 ROI"` + T1Roi *float64 `json:"t1Roi" dc:"次日累计 ROI"` + T7Roi *float64 `json:"t7Roi" dc:"7 日累计 ROI"` + T15Roi *float64 `json:"t15Roi" dc:"15 日累计 ROI"` + T30Roi *float64 `json:"t30Roi" dc:"30 日累计 ROI"` + PaiedOrder *int64 `json:"paiedOrder" dc:"直接订单数"` + OrderRatio *float64 `json:"orderRatio" dc:"直接下单率"` + T0OrderCnt *int64 `json:"t0OrderCnt" dc:"当日累计订单数"` + T0OrderCntCost *float64 `json:"t0OrderCntCost" dc:"当日累计订单成本"` + T0OrderCntRatio *float64 `json:"t0OrderCntRatio" dc:"累计订单下单率"` + T1OrderCnt *int64 `json:"t1OrderCnt" dc:"次日累计订单数"` + T7OrderCnt *int64 `json:"t7OrderCnt" dc:"7 日累计订单数"` + T15OrderCnt *int64 `json:"t15OrderCnt" dc:"15 日累计订单数"` + T30OrderCnt *int64 `json:"t30OrderCnt" dc:"30 日累计订单数"` + MerchantRecoFans *int64 `json:"merchantRecoFans" dc:"涨粉数"` + T1Retention *float64 `json:"t1Retention" dc:"次日涨粉留存数"` + T7Retention *float64 `json:"t7Retention" dc:"7 日涨粉留存数"` + T15Retention *float64 `json:"t15Retention" dc:"15 日涨粉留存数"` + T30Retention *float64 `json:"t30Retention" dc:"30 日涨粉留存数"` + T1RetentionRatio *float64 `json:"t1RetentionRatio" dc:"次日涨粉留存率"` + T7RetentionRatio *float64 `json:"t7RetentionRatio" dc:"7 日涨粉留存率"` + T15RetentionRatio *float64 `json:"t15RetentionRatio" dc:"15 日涨粉留存率"` + T30RetentionRatio *float64 `json:"t30RetentionRatio" dc:"30 日涨粉留存率"` + ReservationSuccess *int64 `json:"reservationSuccess" dc:"直播预约成功数"` + ReservationCost *float64 `json:"reservationCost" dc:"直播预约成功成本"` + StandardLivePlayedStarted *int64 `json:"standardLivePlayedStarted" dc:"直播观看数"` + AdLivePlayCnt *int64 `json:"adLivePlayCnt" dc:"直播间人气数"` + AdLivePlayCntCost *float64 `json:"adLivePlayCntCost" dc:"直播间人气成本"` + LiveAudienceCost *float64 `json:"liveAudienceCost" dc:"直播观看成本"` + LiveEventGoodsView *int64 `json:"liveEventGoodsView" dc:"直播间商品点击数"` + GoodsClickRatio *float64 `json:"goodsClickRatio" dc:"直播间商品点击率"` + DirectAttrPlatNewBuyerCnt *int64 `json:"directAttrPlatNewBuyerCnt" dc:"直接平台新客"` + T30AttrPlatTotalBuyerCnt *int64 `json:"t30AttrPlatTotalBuyerCnt" dc:"30 日累计平台新客"` + DirectAttrSellerNewBuyerCnt *int64 `json:"directAttrSellerNewBuyerCnt" dc:"直接店铺新客"` + T30AttrSellerTotalBuyerCnt *int64 `json:"t30AttrSellerTotalBuyerCnt" dc:"30 日累计店铺新客"` + T3Gmv *float64 `json:"t3Gmv" dc:"3 日累计 GMV"` + T3OrderCnt *int64 `json:"t3OrderCnt" dc:"3 日累计订单数"` + T3Roi *float64 `json:"t3Roi" dc:"3 日累计 ROI"` + T7IndirectOrderAmt *float64 `json:"t7IndirectOrderAmt" dc:"7 日间接订单金额"` + T7IndirectOrderCnt *int64 `json:"t7IndirectOrderCnt" dc:"7 日间接订单数"` + FansT0GmvPerFans *float64 `json:"fansT0GmvPerFans" dc:"新增粉丝人均销售额"` + FansT3GmvPerFans *float64 `json:"fansT3GmvPerFans" dc:"3 日新增粉丝人均销售额"` + FansT7GmvPerFans *float64 `json:"fansT7GmvPerFans" dc:"7 日新增粉丝人均销售额"` + FansT15GmvPerFans *float64 `json:"fansT15GmvPerFans" dc:"15 日新增粉丝人均销售额"` + FansT30GmvPerFans *float64 `json:"fansT30GmvPerFans" dc:"30 日新增粉丝人均销售额"` + RecoFansCost *float64 `json:"recoFansCost" dc:"涨粉成本"` + QcpxWhiteboxDirectOrderPaymentAmt *float64 `json:"qcpxWhiteboxDirectOrderPaymentAmt" dc:"智能优惠券订单 GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `json:"qcpxWhiteboxDirectOrderCnt" dc:"智能优惠券订单数"` + FansT0Gmv *float64 `json:"fansT0Gmv" dc:"涨粉当日 GMV"` + FansT1Gmv *float64 `json:"fansT1Gmv" dc:"涨粉次日 GMV"` + FansT7Gmv *float64 `json:"fansT7Gmv" dc:"涨粉 7 日 GMV"` + FansT15Gmv *float64 `json:"fansT15Gmv" dc:"涨粉 15 日 GMV"` + FansT30Gmv *float64 `json:"fansT30Gmv" dc:"涨粉 30 日 GMV"` + FansT0Roi *float64 `json:"fansT0Roi" dc:"涨粉当日 ROI"` + FansT1Roi *float64 `json:"fansT1Roi" dc:"涨粉次日 ROI"` + FansT7Roi *float64 `json:"fansT7Roi" dc:"涨粉 7 日 ROI"` + FansT15Roi *float64 `json:"fansT15Roi" dc:"涨粉 15 日 ROI"` + FansT30Roi *float64 `json:"fansT30Roi" dc:"涨粉 30 日 ROI"` + T0ShopNewBuyerOrderPaymentAmt *float64 `json:"t0ShopNewBuyerOrderPaymentAmt" dc:"当日新客 GMV"` + T1ShopNewBuyerOrderPaymentAmt *float64 `json:"t1ShopNewBuyerOrderPaymentAmt" dc:"投后 1 日新客 GMV"` + T3ShopNewBuyerOrderPaymentAmt *float64 `json:"t3ShopNewBuyerOrderPaymentAmt" dc:"投后 3 日新客 GMV"` + T7ShopNewBuyerOrderPaymentAmt *float64 `json:"t7ShopNewBuyerOrderPaymentAmt" dc:"投后 7 日新客 GMV"` + T15ShopNewBuyerOrderPaymentAmt *float64 `json:"t15ShopNewBuyerOrderPaymentAmt" dc:"投后 15 日新客 GMV"` + T30ShopNewBuyerOrderPaymentAmt *float64 `json:"t30ShopNewBuyerOrderPaymentAmt" dc:"投后 30 日新客 GMV"` + T0ShopNewBuyerOrderCnt *int64 `json:"t0ShopNewBuyerOrderCnt" dc:"当日新客成交订单量"` + T1ShopNewBuyerOrderCnt *int64 `json:"t1ShopNewBuyerOrderCnt" dc:"投后 1 日新客成交订单量"` + T3ShopNewBuyerOrderCnt *int64 `json:"t3ShopNewBuyerOrderCnt" dc:"投后 3 日新客成交订单量"` + T7ShopNewBuyerOrderCnt *int64 `json:"t7ShopNewBuyerOrderCnt" dc:"投后 7 日新客成交订单量"` + T15ShopNewBuyerOrderCnt *int64 `json:"t15ShopNewBuyerOrderCnt" dc:"投后 15 日新客成交订单量"` + T30ShopNewBuyerOrderCnt *int64 `json:"t30ShopNewBuyerOrderCnt" dc:"投后 30 日新客成交订单量"` + T1NewBuyerRepurchaseRatio *float64 `json:"t1NewBuyerRepurchaseRatio" dc:"投后 1 日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `json:"t3NewBuyerRepurchaseRatio" dc:"投后 3 日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `json:"t7NewBuyerRepurchaseRatio" dc:"投后 7 日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `json:"t15NewBuyerRepurchaseRatio" dc:"投后 15 日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `json:"t30NewBuyerRepurchaseRatio" dc:"投后 30 日新客复购率"` + T0ShopNewBuyerRoi *float64 `json:"t0ShopNewBuyerRoi" dc:"投后当日新客 ROI"` + T1ShopNewBuyerRoi *float64 `json:"t1ShopNewBuyerRoi" dc:"投后 1 日新客 ROI"` + T3ShopNewBuyerRoi *float64 `json:"t3ShopNewBuyerRoi" dc:"投后 3 日新客 ROI"` + T7ShopNewBuyerRoi *float64 `json:"t7ShopNewBuyerRoi" dc:"投后 7 日新客 ROI"` + T15ShopNewBuyerRoi *float64 `json:"t15ShopNewBuyerRoi" dc:"投后 15 日新客 ROI"` + T30ShopNewBuyerRoi *float64 `json:"t30ShopNewBuyerRoi" dc:"投后 30 日新客 ROI"` + CreateCardOrderCnt *int64 `json:"createCardOrderCnt" dc:"有效制卡订单数(回传时间)"` + ForwardTsCreateCardOrderCnt *int64 `json:"forwardTsCreateCardOrderCnt" dc:"有效制卡订单数(计费时间)"` + CreateCardOrderCost *float64 `json:"createCardOrderCost" dc:"有效制卡订单成本(回传时间)"` + ForwardTsCreateCardOrderCost *float64 `json:"forwardTsCreateCardOrderCost" dc:"有效制卡订单成本(计费时间)"` + ActivateCardOrderCnt *int64 `json:"activateCardOrderCnt" dc:"电话卡激活订单数(回传时间)"` + ForwardTsActivateCardOrderCnt *int64 `json:"forwardTsActivateCardOrderCnt" dc:"电话卡激活订单数(计费时间)"` + ActivateCardOrderCost *float64 `json:"activateCardOrderCost" dc:"电话卡激活订单成本(回传时间)"` + ForwardTsActivateCardOrderCost *float64 `json:"forwardTsActivateCardOrderCost" dc:"电话卡激活订单成本(计费时间)"` + CreateCardOrderRatio *float64 `json:"createCardOrderRatio" dc:"有效制卡订单率(回传时间)"` + ForwardTsCreateCardOrderRatio *float64 `json:"forwardTsCreateCardOrderRatio" dc:"有效制卡订单率(计费时间)"` + ActivateCardOrderCntRatio *float64 `json:"activateCardOrderCntRatio" dc:"电话卡激活率(回传时间)"` + ForwardTsActivateCardOrderRatio *float64 `json:"forwardTsActivateCardOrderRatio" dc:"电话卡激活率(计费时间)"` + LivePlayCnt *int64 `json:"livePlayCnt" dc:"全站直播观看数"` + ItemEntranceClkCnt *int64 `json:"itemEntranceClkCnt" dc:"小黄车点击数"` + ShowCnt *int64 `json:"showCnt" dc:"全站曝光"` + ReportDateStr string `json:"reportDateStr" v:"required" dc:"时间"` + CampaignId *int64 `json:"campaignId" dc:"计划 ID"` + CampaignName string `json:"campaignName" dc:"计划名称"` + UnitId *int64 `json:"unitId" dc:"单元 ID"` + UnitName string `json:"unitName" dc:"单元名称"` + CreativeId *int64 `json:"creativeId" dc:"创意 ID"` + CreativeName string `json:"creativeName" dc:"创意名称"` + CidActualRoiAfterSubsidy *float64 `json:"cidActualRoiAfterSubsidy" dc:"补贴后实际 ROI"` + CidCouponAmount *int64 `json:"cidCouponAmount" dc:"核销券金额"` + CidCouponCallbackPaidRefundAmount *int64 `json:"cidCouponCallbackPaidRefundAmount" dc:"退单有回传_核销券金额"` + CidVoucherCost *float64 `json:"cidVoucherCost" dc:"券成本"` +} + +// ListUnitReportDetailReq 获取广告效果指标详情列表请求 +type ListUnitReportDetailReq struct { + g.Meta `path:"/listUnitReportDetail" method:"get" tags:"广告效果指标详情" summary:"获取广告效果指标详情列表" dc:"分页查询广告效果指标详情列表"` + *beans.Page + ReportDateStr string `json:"reportDateStr" dc:"时间"` + CampaignId *int64 `json:"campaignId" dc:"计划 ID"` + UnitId *int64 `json:"unitId" dc:"单元 ID"` + CreativeId *int64 `json:"creativeId" dc:"创意 ID"` + AuthorId string `json:"authorId" dc:"直播用户快手 Id"` + MerchantProductId string `json:"merchantProductId" dc:"商品 ID"` + Keyword string `json:"keyword" dc:"关键字(搜索直播间名称、视频名称等)"` +} + +// ListUnitReportDetailRes 获取广告效果指标详情列表响应 +type ListUnitReportDetailRes struct { + List []*UnitReportDetailItem `json:"list" dc:"广告数据列表"` + Total int `json:"total" dc:"总数"` +} diff --git a/model/dto/copydata/unit_report_sum_dto.go b/model/dto/copydata/unit_report_sum_dto.go new file mode 100644 index 0000000..34abb3c --- /dev/null +++ b/model/dto/copydata/unit_report_sum_dto.go @@ -0,0 +1,237 @@ +package copydata + +import ( + "gitea.com/red-future/common/beans" + "github.com/gogf/gf/v2/frame/g" +) + +// CreateUnitReportSumReq 创建广告效果指标请求 +type CreateUnitReportSumReq struct { + g.Meta `path:"/createUnitReportSum" method:"post" tags:"广告效果指标" summary:"创建广告效果指标" dc:"创建新的广告效果指标"` + *UnitReportSumItem +} + +// CreateUnitReportSumRes 创建广告效果指标响应 +type CreateUnitReportSumRes struct { + Id int64 `json:"id" dc:"广告数据 ID"` +} + +// BatchCreateUnitReportSumReq 批量创建广告效果指标请求 +type BatchCreateUnitReportSumReq struct { + g.Meta `path:"/batchCreateUnitReportSum" method:"post" tags:"广告效果指标" summary:"批量创建广告效果指标" dc:"批量创建广告效果指标"` + Items []*UnitReportSumItem `json:"items" v:"required" dc:"广告数据列表"` +} + +// BatchCreateUnitReportSumRes 批量创建广告效果指标响应 +type BatchCreateUnitReportSumRes struct { + SuccessCount int64 `json:"successCount" dc:"成功数量"` + FailCount int64 `json:"failCount" dc:"失败数量"` + FailedItems []int64 `json:"failedItems" dc:"失败项索引"` +} + +// UnitReportSumItem 广告效果指标项 +type UnitReportSumItem struct { + T0OrderPaymentAmt *float64 `json:"t0OrderPaymentAmt" dc:"当日总成交订单金额"` + CreativeMaterialType string `json:"creativeMaterialType" dc:"视频素材类型(视频:HORIZONTAL_SCREEN, VERTICAL_SCREEN, UNKNOWN_TYPE;图集:ATLAS;长图:ATLAS_VERTICAL)"` + LiveName string `json:"liveName" dc:"直播间名称"` + AuthorId string `json:"authorId" dc:"直播用户快手 Id"` + PicUrl string `json:"picUrl" dc:"图片 URL"` + PicName string `json:"picName" dc:"图片名称"` + PicId string `json:"picId" dc:"图片 Id"` + CoverUrl string `json:"coverUrl" dc:"封面 URL"` + CoverId *int64 `json:"coverId" dc:"封面 Id"` + ItemOrderConversionRatio *float64 `json:"itemOrderConversionRatio" dc:"转化率"` + ItemCardClickRatio *float64 `json:"itemCardClickRatio" dc:"点击率"` + ItemCardClkCnt *int64 `json:"itemCardClkCnt" dc:"商品卡点击数"` + LivePlayCntCost *float64 `json:"livePlayCntCost" dc:"直播间观看成本"` + AdMerchantFollowCost *float64 `json:"adMerchantFollowCost" dc:"涨粉成本"` + AdMerchantFollow *int64 `json:"adMerchantFollow" dc:"涨粉数"` + NetT0OrderCnt *int64 `json:"netT0OrderCnt" dc:"当日累计净成交订单数"` + NetT0Roi *float64 `json:"netT0Roi" dc:"净成交 ROI"` + NetT0Gmv *float64 `json:"netT0Gmv" dc:"净成交 GMV"` + PhotoName string `json:"photoName" dc:"视频名称"` + PhotoIdStr string `json:"photoIdStr" dc:"视频 id"` + PhotoId string `json:"photoId" dc:"视频 id"` + ModPriceSegment string `json:"modPriceSegment" dc:"设备价格区间,"0-500", "501-1000", "1001-1500", "1501-2000", "2001-2500", "2501-3000", "3001-3500", "3501-4000", "4001-4500", "4501-5000", "5001-5500", "5501+", "未知""` + AgeSegment string `json:"ageSegment" dc:"年龄段"0-17", "18-23", "24-30", "31-40", "41-49", "50+","未知""` + Province string `json:"province" dc:"省份名称"` + Gender string `json:"gender" dc:"男,女,未知三种类型"` + AdPhotoPlayedFiveRatio *float64 `json:"adPhotoPlayedFiveRatio" dc:"作品 5 秒播放率"` + AdPhotoPlayedThreeRatio *float64 `json:"adPhotoPlayedThreeRatio" dc:"作品 3 秒播放率"` + OrderSubmitRoi *float64 `json:"orderSubmitRoi" dc:"订单提交 ROI"` + OrderSubmitAmt *int64 `json:"orderSubmitAmt" dc:"外部订单金额"` + EventOrderSubmitCost *float64 `json:"eventOrderSubmitCost" dc:"订单提交成本"` + EventOrderSubmit *int64 `json:"eventOrderSubmit" dc:"订单提交数"` + EventOrderPaidRoi *float64 `json:"eventOrderPaidRoi" dc:"订单支付率"` + EventAppInvoked *int64 `json:"eventAppInvoked" dc:"唤起应用数"` + EventAddShoppingCart *int64 `json:"eventAddShoppingCart" dc:"添加购物车次数"` + ConversionNumCost *float64 `json:"conversionNumCost" dc:"转化成本(回传时间)"` + AdEffectivePlayNum *int64 `json:"adEffectivePlayNum" dc:"有效播放数"` + AdItemClick *int64 `json:"adItemClick" dc:"行为数"` + MerchantProductId string `json:"merchantProductId" dc:"商品 ID"` + CostTotal *float64 `json:"costTotal" dc:"花费"` + AdShow *int64 `json:"adShow" dc:"曝光数"` + AdShow1kCost *float64 `json:"adShow1kCost" dc:"平均千次广告曝光花费"` + Impression *int64 `json:"impression" dc:"封面曝光数"` + PhotoClick *int64 `json:"photoClick" dc:"封面点击数"` + PhotoClickRatio *float64 `json:"photoClickRatio" dc:"封面点击率"` + Click *int64 `json:"click" dc:"素材曝光数"` + ActionbarClick *int64 `json:"actionbarClick" dc:"行为数"` + ActionbarClickCost *float64 `json:"actionbarClickCost" dc:"行为成本"` + EspClickRatio *float64 `json:"espClickRatio" dc:"行为率"` + ActionRatio *float64 `json:"actionRatio" dc:"素材点击率"` + AdItemClickCount *int64 `json:"adItemClickCount" dc:"预约组件点击数"` + EspLivePlayedSeconds *int64 `json:"espLivePlayedSeconds" dc:"直播平均观看时长"` + PlayedThreeSeconds *int64 `json:"playedThreeSeconds" dc:"作品 3 秒播放数"` + Play3sRatio *float64 `json:"play3sRatio" dc:"作品 3 秒播放率"` + PlayedFiveSeconds *int64 `json:"playedFiveSeconds" dc:"作品 5 秒播放数"` + Play5sRatio *float64 `json:"play5sRatio" dc:"作品 5 秒播放率"` + PlayedEnd *int64 `json:"playedEnd" dc:"作品完播数"` + PlayEndRatio *float64 `json:"playEndRatio" dc:"作品完播率"` + Share *int64 `json:"share" dc:"作品分享数"` + Comment *int64 `json:"comment" dc:"作品评论数"` + Likes *int64 `json:"likes" dc:"作品点赞数"` + Report *int64 `json:"report" dc:"作品举报数"` + Block *int64 `json:"block" dc:"作品拉黑数"` + ItemNegative *int64 `json:"itemNegative" dc:"详情页减少此类作品数"` + LiveShare *int64 `json:"liveShare" dc:"直播送礼数"` + LiveComment *int64 `json:"liveComment" dc:"直播评论数"` + LiveReward *int64 `json:"liveReward" dc:"直播送礼数"` + EffectivePlayCount *int64 `json:"effectivePlayCount" dc:"有效播放数"` + EffectivePlayRatio *float64 `json:"effectivePlayRatio" dc:"有效播放率"` + ConversionNum *int64 `json:"conversionNum" dc:"转化数"` + ConversionCostEsp *float64 `json:"conversionCostEsp" dc:"转化成本"` + Roi *float64 `json:"roi" dc:"直接 ROI"` + Gmv *float64 `json:"gmv" dc:"直接 GMV"` + T0Gmv *float64 `json:"t0Gmv" dc:"当日累计 GMV"` + T1Gmv *float64 `json:"t1Gmv" dc:"次日累计 GMV"` + T7Gmv *float64 `json:"t7Gmv" dc:"7 日累计 GMV"` + T15Gmv *float64 `json:"t15Gmv" dc:"15 日累计 GMV"` + T30Gmv *float64 `json:"t30Gmv" dc:"30 日累计 GMV"` + T0Roi *float64 `json:"t0Roi" dc:"当日累计 ROI"` + T1Roi *float64 `json:"t1Roi" dc:"次日累计 ROI"` + T7Roi *float64 `json:"t7Roi" dc:"7 日累计 ROI"` + T15Roi *float64 `json:"t15Roi" dc:"15 日累计 ROI"` + T30Roi *float64 `json:"t30Roi" dc:"30 日累计 ROI"` + PaiedOrder *int64 `json:"paiedOrder" dc:"直接订单数"` + OrderRatio *float64 `json:"orderRatio" dc:"直接下单率"` + T0OrderCnt *int64 `json:"t0OrderCnt" dc:"当日累计订单数"` + T0OrderCntCost *float64 `json:"t0OrderCntCost" dc:"当日累计订单成本"` + T0OrderCntRatio *float64 `json:"t0OrderCntRatio" dc:"累计订单下单率"` + T1OrderCnt *int64 `json:"t1OrderCnt" dc:"次日累计订单数"` + T7OrderCnt *int64 `json:"t7OrderCnt" dc:"7 日累计订单数"` + T15OrderCnt *int64 `json:"t15OrderCnt" dc:"15 日累计订单数"` + T30OrderCnt *int64 `json:"t30OrderCnt" dc:"30 日累计订单数"` + MerchantRecoFans *int64 `json:"merchantRecoFans" dc:"涨粉数"` + T1Retention *float64 `json:"t1Retention" dc:"次日涨粉留存数"` + T7Retention *float64 `json:"t7Retention" dc:"7 日涨粉留存数"` + T15Retention *float64 `json:"t15Retention" dc:"15 日涨粉留存数"` + T30Retention *float64 `json:"t30Retention" dc:"30 日涨粉留存数"` + T1RetentionRatio *float64 `json:"t1RetentionRatio" dc:"次日涨粉留存率"` + T7RetentionRatio *float64 `json:"t7RetentionRatio" dc:"7 日涨粉留存率"` + T15RetentionRatio *float64 `json:"t15RetentionRatio" dc:"15 日涨粉留存率"` + T30RetentionRatio *float64 `json:"t30RetentionRatio" dc:"30 日涨粉留存率"` + ReservationSuccess *int64 `json:"reservationSuccess" dc:"直播预约成功数"` + ReservationCost *float64 `json:"reservationCost" dc:"直播预约成功成本"` + StandardLivePlayedStarted *int64 `json:"standardLivePlayedStarted" dc:"直播观看数"` + AdLivePlayCnt *int64 `json:"adLivePlayCnt" dc:"直播间人气数"` + AdLivePlayCntCost *float64 `json:"adLivePlayCntCost" dc:"直播间人气成本"` + LiveAudienceCost *float64 `json:"liveAudienceCost" dc:"直播观看成本"` + LiveEventGoodsView *int64 `json:"liveEventGoodsView" dc:"直播间商品点击数"` + GoodsClickRatio *float64 `json:"goodsClickRatio" dc:"直播间商品点击率"` + DirectAttrPlatNewBuyerCnt *int64 `json:"directAttrPlatNewBuyerCnt" dc:"直接平台新客"` + T30AttrPlatTotalBuyerCnt *int64 `json:"t30AttrPlatTotalBuyerCnt" dc:"30 日累计平台新客"` + DirectAttrSellerNewBuyerCnt *int64 `json:"directAttrSellerNewBuyerCnt" dc:"直接店铺新客"` + T30AttrSellerTotalBuyerCnt *int64 `json:"t30AttrSellerTotalBuyerCnt" dc:"30 日累计店铺新客"` + T3Gmv *float64 `json:"t3Gmv" dc:"3 日累计 GMV"` + T3OrderCnt *int64 `json:"t3OrderCnt" dc:"3 日累计订单数"` + T3Roi *float64 `json:"t3Roi" dc:"3 日累计 ROI"` + T7IndirectOrderAmt *float64 `json:"t7IndirectOrderAmt" dc:"7 日间接订单金额"` + T7IndirectOrderCnt *int64 `json:"t7IndirectOrderCnt" dc:"7 日间接订单数"` + FansT0GmvPerFans *float64 `json:"fansT0GmvPerFans" dc:"新增粉丝人均销售额"` + FansT3GmvPerFans *float64 `json:"fansT3GmvPerFans" dc:"3 日新增粉丝人均销售额"` + FansT7GmvPerFans *float64 `json:"fansT7GmvPerFans" dc:"7 日新增粉丝人均销售额"` + FansT15GmvPerFans *float64 `json:"fansT15GmvPerFans" dc:"15 日新增粉丝人均销售额"` + FansT30GmvPerFans *float64 `json:"fansT30GmvPerFans" dc:"30 日新增粉丝人均销售额"` + RecoFansCost *float64 `json:"recoFansCost" dc:"涨粉成本"` + QcpxWhiteboxDirectOrderPaymentAmt *float64 `json:"qcpxWhiteboxDirectOrderPaymentAmt" dc:"智能优惠券订单 GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `json:"qcpxWhiteboxDirectOrderCnt" dc:"智能优惠券订单数"` + FansT0Gmv *float64 `json:"fansT0Gmv" dc:"涨粉当日 GMV"` + FansT1Gmv *float64 `json:"fansT1Gmv" dc:"涨粉次日 GMV"` + FansT7Gmv *float64 `json:"fansT7Gmv" dc:"涨粉 7 日 GMV"` + FansT15Gmv *float64 `json:"fansT15Gmv" dc:"涨粉 15 日 GMV"` + FansT30Gmv *float64 `json:"fansT30Gmv" dc:"涨粉 30 日 GMV"` + FansT0Roi *float64 `json:"fansT0Roi" dc:"涨粉当日 ROI"` + FansT1Roi *float64 `json:"fansT1Roi" dc:"涨粉次日 ROI"` + FansT7Roi *float64 `json:"fansT7Roi" dc:"涨粉 7 日 ROI"` + FansT15Roi *float64 `json:"fansT15Roi" dc:"涨粉 15 日 ROI"` + FansT30Roi *float64 `json:"fansT30Roi" dc:"涨粉 30 日 ROI"` + T0ShopNewBuyerOrderPaymentAmt *float64 `json:"t0ShopNewBuyerOrderPaymentAmt" dc:"当日新客 GMV"` + T1ShopNewBuyerOrderPaymentAmt *float64 `json:"t1ShopNewBuyerOrderPaymentAmt" dc:"投后 1 日新客 GMV"` + T3ShopNewBuyerOrderPaymentAmt *float64 `json:"t3ShopNewBuyerOrderPaymentAmt" dc:"投后 3 日新客 GMV"` + T7ShopNewBuyerOrderPaymentAmt *float64 `json:"t7ShopNewBuyerOrderPaymentAmt" dc:"投后 7 日新客 GMV"` + T15ShopNewBuyerOrderPaymentAmt *float64 `json:"t15ShopNewBuyerOrderPaymentAmt" dc:"投后 15 日新客 GMV"` + T30ShopNewBuyerOrderPaymentAmt *float64 `json:"t30ShopNewBuyerOrderPaymentAmt" dc:"投后 30 日新客 GMV"` + T0ShopNewBuyerOrderCnt *int64 `json:"t0ShopNewBuyerOrderCnt" dc:"当日新客成交订单量"` + T1ShopNewBuyerOrderCnt *int64 `json:"t1ShopNewBuyerOrderCnt" dc:"投后 1 日新客成交订单量"` + T3ShopNewBuyerOrderCnt *int64 `json:"t3ShopNewBuyerOrderCnt" dc:"投后 3 日新客成交订单量"` + T7ShopNewBuyerOrderCnt *int64 `json:"t7ShopNewBuyerOrderCnt" dc:"投后 7 日新客成交订单量"` + T15ShopNewBuyerOrderCnt *int64 `json:"t15ShopNewBuyerOrderCnt" dc:"投后 15 日新客成交订单量"` + T30ShopNewBuyerOrderCnt *int64 `json:"t30ShopNewBuyerOrderCnt" dc:"投后 30 日新客成交订单量"` + T1NewBuyerRepurchaseRatio *float64 `json:"t1NewBuyerRepurchaseRatio" dc:"投后 1 日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `json:"t3NewBuyerRepurchaseRatio" dc:"投后 3 日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `json:"t7NewBuyerRepurchaseRatio" dc:"投后 7 日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `json:"t15NewBuyerRepurchaseRatio" dc:"投后 15 日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `json:"t30NewBuyerRepurchaseRatio" dc:"投后 30 日新客复购率"` + T0ShopNewBuyerRoi *float64 `json:"t0ShopNewBuyerRoi" dc:"投后当日新客 ROI"` + T1ShopNewBuyerRoi *float64 `json:"t1ShopNewBuyerRoi" dc:"投后 1 日新客 ROI"` + T3ShopNewBuyerRoi *float64 `json:"t3ShopNewBuyerRoi" dc:"投后 3 日新客 ROI"` + T7ShopNewBuyerRoi *float64 `json:"t7ShopNewBuyerRoi" dc:"投后 7 日新客 ROI"` + T15ShopNewBuyerRoi *float64 `json:"t15ShopNewBuyerRoi" dc:"投后 15 日新客 ROI"` + T30ShopNewBuyerRoi *float64 `json:"t30ShopNewBuyerRoi" dc:"投后 30 日新客 ROI"` + CreateCardOrderCnt *int64 `json:"createCardOrderCnt" dc:"有效制卡订单数(回传时间)"` + ForwardTsCreateCardOrderCnt *int64 `json:"forwardTsCreateCardOrderCnt" dc:"有效制卡订单数(计费时间)"` + CreateCardOrderCost *float64 `json:"createCardOrderCost" dc:"有效制卡订单成本(回传时间)"` + ForwardTsCreateCardOrderCost *float64 `json:"forwardTsCreateCardOrderCost" dc:"有效制卡订单成本(计费时间)"` + ActivateCardOrderCnt *int64 `json:"activateCardOrderCnt" dc:"电话卡激活订单数(回传时间)"` + ForwardTsActivateCardOrderCnt *int64 `json:"forwardTsActivateCardOrderCnt" dc:"电话卡激活订单数(计费时间)"` + ActivateCardOrderCost *float64 `json:"activateCardOrderCost" dc:"电话卡激活订单成本(回传时间)"` + ForwardTsActivateCardOrderCost *float64 `json:"forwardTsActivateCardOrderCost" dc:"电话卡激活订单成本(计费时间)"` + CreateCardOrderRatio *float64 `json:"createCardOrderRatio" dc:"有效制卡订单率(回传时间)"` + ForwardTsCreateCardOrderRatio *float64 `json:"forwardTsCreateCardOrderRatio" dc:"有效制卡订单率(计费时间)"` + ActivateCardOrderCntRatio *float64 `json:"activateCardOrderCntRatio" dc:"电话卡激活率(回传时间)"` + ForwardTsActivateCardOrderRatio *float64 `json:"forwardTsActivateCardOrderRatio" dc:"电话卡激活率(计费时间)"` + LivePlayCnt *int64 `json:"livePlayCnt" dc:"全站直播观看数"` + ItemEntranceClkCnt *int64 `json:"itemEntranceClkCnt" dc:"小黄车点击数"` + ShowCnt *int64 `json:"showCnt" dc:"全站曝光"` + ReportDateStr string `json:"reportDateStr" v:"required" dc:"时间"` + CampaignId *int64 `json:"campaignId" dc:"计划 ID"` + CampaignName string `json:"campaignName" dc:"计划名称"` + UnitId *int64 `json:"unitId" dc:"单元 ID"` + UnitName string `json:"unitName" dc:"单元名称"` + CreativeId *int64 `json:"creativeId" dc:"创意 ID"` + CreativeName string `json:"creativeName" dc:"创意名称"` + CidActualRoiAfterSubsidy *float64 `json:"cidActualRoiAfterSubsidy" dc:"补贴后实际 ROI"` + CidCouponAmount *int64 `json:"cidCouponAmount" dc:"核销券金额"` + CidCouponCallbackPaidRefundAmount *int64 `json:"cidCouponCallbackPaidRefundAmount" dc:"退单有回传_核销券金额"` + CidVoucherCost *float64 `json:"cidVoucherCost" dc:"券成本"` +} + +// ListUnitReportSumReq 获取广告效果指标列表请求 +type ListUnitReportSumReq struct { + g.Meta `path:"/listUnitReportSum" method:"get" tags:"广告效果指标" summary:"获取广告效果指标列表" dc:"分页查询广告效果指标列表"` + *beans.Page + ReportDateStr string `json:"reportDateStr" dc:"时间"` + CampaignId *int64 `json:"campaignId" dc:"计划 ID"` + UnitId *int64 `json:"unitId" dc:"单元 ID"` + CreativeId *int64 `json:"creativeId" dc:"创意 ID"` + AuthorId string `json:"authorId" dc:"直播用户快手 Id"` + MerchantProductId string `json:"merchantProductId" dc:"商品 ID"` + Keyword string `json:"keyword" dc:"关键字(搜索直播间名称、视频名称等)"` +} + +// ListUnitReportSumRes 获取广告效果指标列表响应 +type ListUnitReportSumRes struct { + List []*UnitReportSumItem `json:"list" dc:"广告数据列表"` + Total int `json:"total" dc:"总数"` +} diff --git a/model/dto/dict/api_datasource_platform_dto.go b/model/dto/dict/api_datasource_platform_dto.go new file mode 100644 index 0000000..c85e869 --- /dev/null +++ b/model/dto/dict/api_datasource_platform_dto.go @@ -0,0 +1,170 @@ +package api_feature + +import ( + "cid/consts/api-feature" + entity "cid/model/entity/dict" + + "gitea.com/red-future/common/beans" + "github.com/gogf/gf/v2/frame/g" +) + +// CreateDatasourcePlatformReq 创建数据源平台请求 +type CreateDatasourcePlatformReq struct { + g.Meta `path:"/createDatasourcePlatform" method:"post" tags:"数据源平台管理" summary:"创建数据源平台" dc:"创建新的数据源平台配置"` + PlatformCode string `json:"platformCode" v:"required" dc:"平台编码(唯一标识)"` + PlatformName string `json:"platformName" v:"required" dc:"平台名称"` + Description string `json:"description" dc:"平台描述"` + Status api_feature.PlatformStatus `json:"status" dc:"平台状态" d:"ACTIVE"` + ApiBaseUrl string `json:"apiBaseUrl" dc:"API基础地址"` + AuthType string `json:"authType" v:"required|in:TOKEN,API_KEY,OAUTH2,BASIC" dc:"认证类型: TOKEN/API_KEY/OAUTH2/BASIC"` + Token string `json:"token" dc:"认证token/密钥"` + ApiKey string `json:"apiKey" dc:"API Key"` + ClientId string `json:"clientId" dc:"OAuth2 Client ID"` + ClientSecret string `json:"clientSecret" dc:"OAuth2 Client Secret"` + RateLimitPerMinute int `json:"rateLimitPerMinute" dc:"每分钟请求限制" d:"60"` + RateLimitPerHour int `json:"rateLimitPerHour" dc:"每小时请求限制" d:"1000"` + ConcurrencyLimit int `json:"concurrencyLimit" dc:"并发连接限制" d:"10"` + RequestTimeoutMs int `json:"requestTimeoutMs" dc:"请求超时时间(毫秒)" d:"30000"` + MaxRetries int `json:"maxRetries" dc:"最大重试次数" d:"3"` + RetryDelayMs int `json:"retryDelayMs" dc:"重试延迟(毫秒)" d:"1000"` + CreatedBy string `json:"createdBy" v:"required" dc:"创建人"` + CreatedAt string `json:"createdAt" v:"required" dc:"创建时间"` + UpdatedBy string `json:"updatedBy" v:"required" dc:"修改人"` + UpdatedAt string `json:"updatedAt" v:"required" dc:"修改人"` +} + +// CreateDatasourcePlatformRes 创建数据源平台响应 +type CreateDatasourcePlatformRes struct { + Id int64 `json:"id" dc:"平台ID"` +} + +// ListDatasourcePlatformReq 获取数据源平台列表请求 +type ListDatasourcePlatformReq struct { + g.Meta `path:"/listDatasourcePlatforms" method:"get" tags:"数据源平台管理" summary:"获取数据源平台列表" dc:"分页查询数据源平台列表"` + *beans.Page + PlatformCode string `json:"platformCode" dc:"平台编码"` + PlatformName string `json:"platformName" dc:"平台名称"` + Status api_feature.PlatformStatus `json:"status" dc:"平台状态"` + AuthType string `json:"authType" dc:"认证类型"` + Keyword string `json:"keyword" dc:"关键字(搜索平台名称或编码)"` +} + +// ListDatasourcePlatformRes 获取数据源平台列表响应 +type ListDatasourcePlatformRes struct { + List []DatasourcePlatformItem `json:"list" dc:"平台列表"` + Total int `json:"total" dc:"总数"` +} + +type DatasourcePlatformItem struct { + Id int64 `json:"id,string"` + PlatformCode string `json:"platformCode"` + PlatformName string `json:"platformName"` + Description string `json:"description"` + Status api_feature.PlatformStatus `json:"status"` + StatusName string `json:"statusName"` + ApiBaseUrl string `json:"apiBaseUrl"` + AuthType string `json:"authType"` + AuthTypeName string `json:"authTypeName"` + RateLimitPerMinute int `json:"rateLimitPerMinute"` + RateLimitPerHour int `json:"rateLimitPerHour"` + ConcurrencyLimit int `json:"concurrencyLimit"` + RequestTimeoutMs int `json:"requestTimeoutMs"` + MaxRetries int `json:"maxRetries"` + RetryDelayMs int `json:"retryDelayMs"` + CreatedBy string `json:"createdBy"` + CreatedAt int64 `json:"createdAt"` + UpdatedBy string `json:"updatedBy"` + UpdatedAt int64 `json:"updatedAt"` +} + +// GetDatasourcePlatformReq 获取数据源平台详情请求 +type GetDatasourcePlatformReq struct { + g.Meta `path:"/getDatasourcePlatform" method:"get" tags:"数据源平台管理" summary:"获取数据源平台详情" dc:"获取数据源平台详情"` + Id int64 `json:"id" v:"required" dc:"平台ID"` +} + +// GetDatasourcePlatformRes 获取数据源平台详情响应 +type GetDatasourcePlatformRes struct { + *entity.DatasourcePlatform +} + +// UpdateDatasourcePlatformReq 更新数据源平台请求 +type UpdateDatasourcePlatformReq struct { + g.Meta `path:"/updateDatasourcePlatform" method:"put" tags:"数据源平台管理" summary:"更新数据源平台" dc:"更新数据源平台配置"` + Id int64 `json:"id" v:"required" dc:"平台ID"` + PlatformCode string `json:"platformCode" dc:"平台编码"` + PlatformName string `json:"platformName" dc:"平台名称"` + Description string `json:"description" dc:"平台描述"` + Status api_feature.PlatformStatus `json:"status,omitempty" dc:"平台状态"` + ApiBaseUrl string `json:"apiBaseUrl" dc:"API基础地址"` + AuthType string `json:"authType" dc:"认证类型"` + Token string `json:"token" dc:"认证token/密钥"` + ApiKey string `json:"apiKey" dc:"API Key"` + ClientId string `json:"clientId" dc:"OAuth2 Client ID"` + ClientSecret string `json:"clientSecret" dc:"OAuth2 Client Secret"` + RateLimitPerMinute int `json:"rateLimitPerMinute" dc:"每分钟请求限制"` + RateLimitPerHour int `json:"rateLimitPerHour" dc:"每小时请求限制"` + ConcurrencyLimit int `json:"concurrencyLimit" dc:"并发连接限制"` + RequestTimeoutMs int `json:"requestTimeoutMs" dc:"请求超时时间(毫秒)"` + MaxRetries int `json:"maxRetries" dc:"最大重试次数"` + RetryDelayMs int `json:"retryDelayMs" dc:"重试延迟(毫秒)"` + UpdatedBy string `json:"updatedBy" v:"required" dc:"更新人"` + UpdatedAt string `json:"updatedAt" v:"required" dc:"更新时间"` + Version string `json:"version" v:"required" dc:"版本"` +} + +// DeleteDatasourcePlatformReq 删除数据源平台请求 +type DeleteDatasourcePlatformReq struct { + g.Meta `path:"/deleteDatasourcePlatform" method:"delete" tags:"数据源平台管理" summary:"删除数据源平台" dc:"删除数据源平台"` + Id int64 `json:"id" v:"required" dc:"平台ID"` +} + +// UpdateDatasourcePlatformStatusReq 更新数据源平台状态请求 +type UpdateDatasourcePlatformStatusReq struct { + g.Meta `path:"/updateDatasourcePlatformStatus" method:"put" tags:"数据源平台管理" summary:"更新数据源平台状态" dc:"更新数据源平台状态"` + Id int64 `json:"id" v:"required" dc:"平台ID"` + Status api_feature.PlatformStatus `json:"status" v:"required|in:ACTIVE,INACTIVE" dc:"状态:ACTIVE启用/INACTIVE停用"` + UpdatedBy string `json:"updatedBy" v:"required" dc:"更新人"` +} + +// 以下是几个额外的实用API接口 + +// GetPlatformByCodeReq 根据平台编码获取平台信息请求 +type GetPlatformByCodeReq struct { + g.Meta `path:"/getPlatformByCode" method:"get" tags:"数据源平台管理" summary:"根据编码获取平台信息" dc:"根据平台编码获取平台配置信息"` + PlatformCode string `json:"platformCode" v:"required" dc:"平台编码"` +} + +// GetPlatformByCodeRes 根据平台编码获取平台信息响应 +type GetPlatformByCodeRes struct { + *entity.DatasourcePlatform +} + +// TestPlatformConnectionReq 测试平台连接请求 +type TestPlatformConnectionReq struct { + g.Meta `path:"/testPlatformConnection" method:"post" tags:"数据源平台管理" summary:"测试平台连接" dc:"测试数据源平台连接配置"` + Id int64 `json:"id" v:"required" dc:"平台ID"` +} + +// TestPlatformConnectionRes 测试平台连接响应 +type TestPlatformConnectionRes struct { + Success bool `json:"success" dc:"连接是否成功"` + Message string `json:"message" dc:"连接结果消息"` + LatencyMs int `json:"latencyMs" dc:"连接延迟(毫秒)"` +} + +// GetPlatformStatisticsReq 获取平台统计信息请求 +type GetPlatformStatisticsReq struct { + g.Meta `path:"/getPlatformStatistics" method:"get" tags:"数据源平台管理" summary:"获取平台统计信息" dc:"获取数据源平台统计信息"` +} + +// GetPlatformStatisticsRes 获取平台统计信息响应 +type GetPlatformStatisticsRes struct { + TotalPlatforms int `json:"totalPlatforms" dc:"总平台数"` + ActivePlatforms int `json:"activePlatforms" dc:"启用平台数"` + InactivePlatforms int `json:"inactivePlatforms" dc:"停用平台数"` + TokenAuthPlatforms int `json:"tokenAuthPlatforms" dc:"TOKEN认证平台数"` + ApiKeyAuthPlatforms int `json:"apiKeyAuthPlatforms" dc:"API_KEY认证平台数"` + OAuth2AuthPlatforms int `json:"oauth2AuthPlatforms" dc:"OAUTH2认证平台数"` + BasicAuthPlatforms int `json:"basicAuthPlatforms" dc:"BASIC认证平台数"` +} diff --git a/model/dto/dict/api_field_mapping_config_dto.go b/model/dto/dict/api_field_mapping_config_dto.go new file mode 100644 index 0000000..d51efda --- /dev/null +++ b/model/dto/dict/api_field_mapping_config_dto.go @@ -0,0 +1,221 @@ +package api_feature + +import ( + entity "cid/model/entity/dict" + "time" + + "gitea.com/red-future/common/beans" + "github.com/gogf/gf/v2/frame/g" +) + +// CreateFieldMappingConfigReq 创建字段映射配置请求 +type CreateFieldMappingConfigReq struct { + g.Meta `path:"/field-mapping-configs" method:"post" tags:"字段映射配置" summary:"创建字段映射配置" dc:"创建新的字段映射配置"` + ConfigName string `json:"configName" v:"required#配置名称不能为空" dc:"配置名称"` + VendorName string `json:"vendorName" v:"required#厂商名称不能为空" dc:"厂商名称"` + ApiName string `json:"apiName" v:"required#接口名称不能为空" dc:"接口名称"` + ApiVersion string `json:"apiVersion" dc:"接口版本"` + SourceField string `json:"sourceField" v:"required#源字段不能为空" dc:"源字段名"` + SourceFieldType string `json:"sourceFieldType" dc:"源字段数据类型"` + SourceFieldDesc string `json:"sourceFieldDesc" dc:"源字段描述"` + TargetField string `json:"targetField" v:"required#目标字段不能为空" dc:"目标字段名"` + TargetFieldType string `json:"targetFieldType" v:"required#目标字段类型不能为空" dc:"目标数据类型"` + TargetFieldDesc string `json:"targetFieldDesc" dc:"字段描述"` + TransformType string `json:"transformType" dc:"转换类型" d:"direct"` + TransformParams map[string]interface{} `json:"transformParams" dc:"转换参数"` + ValidationRules map[string]interface{} `json:"validationRules" dc:"验证规则"` + DefaultValue string `json:"defaultValue" dc:"默认值"` + IsRequired bool `json:"isRequired" dc:"是否必填" d:"false"` + IsActive bool `json:"isActive" dc:"是否启用" d:"true"` + Priority int `json:"priority" dc:"优先级" d:"0"` + BusinessDomain string `json:"businessDomain" dc:"业务域"` + FieldGroup string `json:"fieldGroup" dc:"字段分组"` + ConfigVersion int `json:"configVersion" dc:"配置版本号" d:"1"` + EffectiveDate *time.Time `json:"effectiveDate" dc:"生效时间"` + ExpiryDate *time.Time `json:"expiryDate" dc:"失效时间"` + CreatedBy string `json:"createdBy" dc:"创建人"` +} + +// CreateFieldMappingConfigRes 创建字段映射配置响应 +type CreateFieldMappingConfigRes struct { + Id int64 `json:"id" dc:"配置ID"` +} + +// ListFieldMappingConfigReq 获取字段映射配置列表请求 +type ListFieldMappingConfigReq struct { + g.Meta `path:"/field-mapping-configs" method:"get" tags:"字段映射配置" summary:"获取字段映射配置列表" dc:"分页查询字段映射配置列表"` + *beans.Page + ConfigName string `json:"configName" dc:"配置名称"` + VendorName string `json:"vendorName" dc:"厂商名称"` + ApiName string `json:"apiName" dc:"接口名称"` + ApiVersion string `json:"apiVersion" dc:"接口版本"` + SourceField string `json:"sourceField" dc:"源字段名"` + TargetField string `json:"targetField" dc:"目标字段名"` + TransformType string `json:"transformType" dc:"转换类型"` + IsActive *bool `json:"isActive" dc:"是否启用"` + BusinessDomain string `json:"businessDomain" dc:"业务域"` + FieldGroup string `json:"fieldGroup" dc:"字段分组"` + Keyword string `json:"keyword" dc:"关键字搜索"` +} + +// ListFieldMappingConfigRes 获取字段映射配置列表响应 +type ListFieldMappingConfigRes struct { + List []FieldMappingConfigItem `json:"list" dc:"配置列表"` + Total int `json:"total" dc:"总数"` +} + +// FieldMappingConfigItem 字段映射配置列表项 +type FieldMappingConfigItem struct { + Id int64 `json:"id,string" dc:"配置ID"` + ConfigName string `json:"configName" dc:"配置名称"` + VendorName string `json:"vendorName" dc:"厂商名称"` + ApiName string `json:"apiName" dc:"接口名称"` + ApiVersion string `json:"apiVersion" dc:"接口版本"` + SourceField string `json:"sourceField" dc:"源字段名"` + TargetField string `json:"targetField" dc:"目标字段名"` + TargetFieldType string `json:"targetFieldType" dc:"目标数据类型"` + TransformType string `json:"transformType" dc:"转换类型"` + TransformTypeName string `json:"transformTypeName" dc:"转换类型名称"` + IsActive bool `json:"isActive" dc:"是否启用"` + Priority int `json:"priority" dc:"优先级"` + BusinessDomain string `json:"businessDomain" dc:"业务域"` + BusinessDomainName string `json:"businessDomainName" dc:"业务域名称"` + FieldGroup string `json:"fieldGroup" dc:"字段分组"` + ConfigVersion int `json:"configVersion" dc:"配置版本号"` + CreatedBy string `json:"createdBy" dc:"创建人"` + CreatedTime time.Time `json:"createdTime" dc:"创建时间"` + UpdatedBy string `json:"updatedBy" dc:"更新人"` + UpdatedTime time.Time `json:"updatedTime" dc:"更新时间"` +} + +// GetFieldMappingConfigReq 获取字段映射配置详情请求 +type GetFieldMappingConfigReq struct { + g.Meta `path:"/field-mapping-configs/{id}" method:"get" tags:"字段映射配置" summary:"获取字段映射配置详情" dc:"获取字段映射配置详情"` + Id int64 `json:"id" v:"required#配置ID不能为空" dc:"配置ID"` +} + +// GetFieldMappingConfigRes 获取字段映射配置详情响应 +type GetFieldMappingConfigRes struct { + *entity.FieldMappingConfig + TransformTypeName string `json:"transformTypeName,omitempty" dc:"转换类型名称"` + BusinessDomainName string `json:"businessDomainName,omitempty" dc:"业务域名称"` +} + +// UpdateFieldMappingConfigReq 更新字段映射配置请求 +type UpdateFieldMappingConfigReq struct { + g.Meta `path:"/field-mapping-configs/{id}" method:"put" tags:"字段映射配置" summary:"更新字段映射配置" dc:"更新字段映射配置信息"` + Id int64 `json:"id" v:"required#配置ID不能为空" dc:"配置ID"` + ConfigName string `json:"configName" dc:"配置名称"` + VendorName string `json:"vendorName" dc:"厂商名称"` + ApiName string `json:"apiName" dc:"接口名称"` + ApiVersion string `json:"apiVersion" dc:"接口版本"` + SourceField string `json:"sourceField" dc:"源字段名"` + SourceFieldType string `json:"sourceFieldType" dc:"源字段数据类型"` + SourceFieldDesc string `json:"sourceFieldDesc" dc:"源字段描述"` + TargetField string `json:"targetField" dc:"目标字段名"` + TargetFieldType string `json:"targetFieldType" dc:"目标数据类型"` + TargetFieldDesc string `json:"targetFieldDesc" dc:"字段描述"` + TransformType string `json:"transformType" dc:"转换类型"` + TransformParams map[string]interface{} `json:"transformParams" dc:"转换参数"` + ValidationRules map[string]interface{} `json:"validationRules" dc:"验证规则"` + DefaultValue string `json:"defaultValue" dc:"默认值"` + IsRequired bool `json:"isRequired" dc:"是否必填"` + IsActive bool `json:"isActive" dc:"是否启用"` + Priority int `json:"priority" dc:"优先级"` + BusinessDomain string `json:"businessDomain" dc:"业务域"` + FieldGroup string `json:"fieldGroup" dc:"字段分组"` + ConfigVersion int `json:"configVersion" dc:"配置版本号"` + EffectiveDate *time.Time `json:"effectiveDate" dc:"生效时间"` + ExpiryDate *time.Time `json:"expiryDate" dc:"失效时间"` + UpdatedBy string `json:"updatedBy" dc:"更新人"` +} + +// DeleteFieldMappingConfigReq 删除字段映射配置请求 +type DeleteFieldMappingConfigReq struct { + g.Meta `path:"/field-mapping-configs/{id}" method:"delete" tags:"字段映射配置" summary:"删除字段映射配置" dc:"删除字段映射配置"` + Id int64 `json:"id" v:"required#配置ID不能为空" dc:"配置ID"` +} + +// UpdateFieldMappingConfigStatusReq 更新字段映射配置状态请求 +type UpdateFieldMappingConfigStatusReq struct { + g.Meta `path:"/field-mapping-configs/{id}/status" method:"put" tags:"字段映射配置" summary:"更新字段映射配置状态" dc:"更新字段映射配置状态"` + Id int64 `json:"id" v:"required#配置ID不能为空" dc:"配置ID"` + IsActive bool `json:"isActive" v:"required#状态不能为空" dc:"是否启用:true启用/false停用"` +} + +// BatchCreateFieldMappingConfigReq 批量创建字段映射配置请求 +type BatchCreateFieldMappingConfigReq struct { + g.Meta `path:"/field-mapping-configs/batch" method:"post" tags:"字段映射配置" summary:"批量创建字段映射配置" dc:"批量创建字段映射配置"` + Configs []BatchFieldMappingConfigItem `json:"configs" v:"required#配置列表不能为空" dc:"配置列表"` +} + +// BatchFieldMappingConfigItem 批量创建配置项 +type BatchFieldMappingConfigItem struct { + ConfigName string `json:"configName" v:"required#配置名称不能为空" dc:"配置名称"` + VendorName string `json:"vendorName" v:"required#厂商名称不能为空" dc:"厂商名称"` + ApiName string `json:"apiName" v:"required#接口名称不能为空" dc:"接口名称"` + ApiVersion string `json:"apiVersion" dc:"接口版本"` + SourceField string `json:"sourceField" v:"required#源字段不能为空" dc:"源字段名"` + SourceFieldType string `json:"sourceFieldType" dc:"源字段数据类型"` + SourceFieldDesc string `json:"sourceFieldDesc" dc:"源字段描述"` + TargetField string `json:"targetField" v:"required#目标字段不能为空" dc:"目标字段名"` + TargetFieldType string `json:"targetFieldType" v:"required#目标字段类型不能为空" dc:"目标数据类型"` + TargetFieldDesc string `json:"targetFieldDesc" dc:"字段描述"` + TransformType string `json:"transformType" dc:"转换类型" d:"direct"` + TransformParams map[string]interface{} `json:"transformParams" dc:"转换参数"` + ValidationRules map[string]interface{} `json:"validationRules" dc:"验证规则"` + DefaultValue string `json:"defaultValue" dc:"默认值"` + IsRequired bool `json:"isRequired" dc:"是否必填" d:"false"` + IsActive bool `json:"isActive" dc:"是否启用" d:"true"` + Priority int `json:"priority" dc:"优先级" d:"0"` + BusinessDomain string `json:"businessDomain" dc:"业务域"` + FieldGroup string `json:"fieldGroup" dc:"字段分组"` + ConfigVersion int `json:"configVersion" dc:"配置版本号" d:"1"` +} + +// BatchCreateFieldMappingConfigRes 批量创建字段映射配置响应 +type BatchCreateFieldMappingConfigRes struct { + SuccessCount int `json:"successCount" dc:"成功数量"` + FailedCount int `json:"failedCount" dc:"失败数量"` + FailedItems []BatchCreateFailedItem `json:"failedItems" dc:"失败项列表"` +} + +// BatchCreateFailedItem 批量创建失败项 +type BatchCreateFailedItem struct { + Index int `json:"index" dc:"项索引"` + ConfigName string `json:"configName" dc:"配置名称"` + Error string `json:"error" dc:"错误信息"` +} + +// QueryFieldMappingByVendorApiReq 根据厂商和接口查询字段映射请求 +type QueryFieldMappingByVendorApiReq struct { + g.Meta `path:"/field-mapping-configs/query" method:"get" tags:"字段映射配置" summary:"根据厂商和接口查询字段映射" dc:"根据厂商和接口查询字段映射配置"` + VendorName string `json:"vendorName" v:"required#厂商名称不能为空" dc:"厂商名称"` + ApiName string `json:"apiName" v:"required#接口名称不能为空" dc:"接口名称"` + ApiVersion string `json:"apiVersion" dc:"接口版本"` + IsActive *bool `json:"isActive" dc:"是否启用" d:"true"` +} + +// QueryFieldMappingByVendorApiRes 根据厂商和接口查询字段映射响应 +type QueryFieldMappingByVendorApiRes struct { + List []*entity.FieldMappingConfig `json:"list" dc:"字段映射配置列表"` +} + +// ValidateFieldMappingReq 验证字段映射配置请求 +type ValidateFieldMappingReq struct { + g.Meta `path:"/field-mapping-configs/validate" method:"post" tags:"字段映射配置" summary:"验证字段映射配置" dc:"验证字段映射配置的有效性"` + ConfigName string `json:"configName" v:"required#配置名称不能为空" dc:"配置名称"` + VendorName string `json:"vendorName" v:"required#厂商名称不能为空" dc:"厂商名称"` + ApiName string `json:"apiName" v:"required#接口名称不能为空" dc:"接口名称"` + SourceField string `json:"sourceField" v:"required#源字段不能为空" dc:"源字段名"` + TargetField string `json:"targetField" v:"required#目标字段不能为空" dc:"目标字段名"` + TestValue interface{} `json:"testValue" dc:"测试值"` +} + +// ValidateFieldMappingRes 验证字段映射配置响应 +type ValidateFieldMappingRes struct { + IsValid bool `json:"isValid" dc:"是否有效"` + TransformedValue interface{} `json:"transformedValue" dc:"转换后的值"` + Error string `json:"error" dc:"错误信息"` + Warnings []string `json:"warnings" dc:"警告信息"` +} diff --git a/model/dto/dict/api_interface_dto.go b/model/dto/dict/api_interface_dto.go new file mode 100644 index 0000000..c47798b --- /dev/null +++ b/model/dto/dict/api_interface_dto.go @@ -0,0 +1,102 @@ +package api_feature + +import ( + "cid/consts/api-feature" + entity "cid/model/entity/dict" + + "gitea.com/red-future/common/beans" + "github.com/gogf/gf/v2/frame/g" +) + +// CreateApiInterfaceReq 创建接口请求 +type CreateApiInterfaceReq struct { + g.Meta `path:"/createApiInterface" method:"post" tags:"接口管理" summary:"创建接口" dc:"创建新的数据接口"` + PlatformId int64 `json:"platformId" v:"required" dc:"所属平台ID"` + Name string `json:"name" v:"required" dc:"接口名称"` + Code string `json:"code" v:"required" dc:"接口编码"` + Url string `json:"url" v:"required" dc:"接口地址"` + Method api_feature.ApiMethod `json:"method" v:"required" dc:"请求方法"` + Status api_feature.PlatformStatus `json:"status" dc:"接口状态" d:"active"` + AuthType string `json:"authType" dc:"认证类型"` + RequestConfig map[string]interface{} `json:"requestConfig" dc:"请求配置"` + ResponseConfig map[string]interface{} `json:"responseConfig" dc:"响应配置"` + LimitConfig map[string]interface{} `json:"limitConfig" dc:"接口独立限流配置"` +} + +// CreateApiInterfaceRes 创建接口响应 +type CreateApiInterfaceRes struct { + Id int64 `json:"id" dc:"接口ID"` +} + +// ListApiInterfaceReq 获取接口列表请求 +type ListApiInterfaceReq struct { + g.Meta `path:"/listApiInterfaces" method:"get" tags:"接口管理" summary:"获取接口列表" dc:"分页查询接口列表"` + *beans.Page + PlatformId int64 `json:"platformId" dc:"平台ID"` + Name string `json:"name" dc:"接口名称"` + Code string `json:"code" dc:"接口编码"` + Method api_feature.ApiMethod `json:"method" dc:"请求方法"` + Status api_feature.PlatformStatus `json:"status" dc:"接口状态"` + Keyword string `json:"keyword" dc:"关键字(搜索名称或编码)"` +} + +// ListApiInterfaceRes 获取接口列表响应 +type ListApiInterfaceRes struct { + List []ApiInterfaceItem `json:"list" dc:"接口列表"` + Total int `json:"total" dc:"总数"` +} + +type ApiInterfaceItem struct { + Id int64 `json:"id,string"` + PlatformId int64 `json:"platformId"` + PlatformName string `json:"platformName"` + Name string `json:"name"` + Code string `json:"code"` + Url string `json:"url"` + Method api_feature.ApiMethod `json:"method"` + Status api_feature.PlatformStatus `json:"status"` + StatusName string `json:"statusName"` + CreatedAt int64 `json:"createdAt"` + UpdatedAt int64 `json:"updatedAt"` +} + +// GetApiInterfaceReq 获取接口详情请求 +type GetApiInterfaceReq struct { + g.Meta `path:"/getApiInterface" method:"get" tags:"接口管理" summary:"获取接口详情" dc:"获取接口详情"` + Id int64 `json:"id" v:"required" dc:"接口ID"` +} + +// GetApiInterfaceRes 获取接口详情响应 +type GetApiInterfaceRes struct { + *entity.ApiInterface + PlatformName string `json:"platformName,omitempty"` +} + +// UpdateApiInterfaceReq 更新接口请求 +type UpdateApiInterfaceReq struct { + g.Meta `path:"/updateApiInterface" method:"put" tags:"接口管理" summary:"更新接口" dc:"更新接口信息"` + Id int64 `json:"id" v:"required" dc:"接口ID"` + PlatformId int64 `json:"platformId" dc:"所属平台ID"` + Name string `json:"name" dc:"接口名称"` + Code string `json:"code" dc:"接口编码"` + Url string `json:"url" dc:"接口地址"` + Method api_feature.ApiMethod `json:"method" dc:"请求方法"` + Status api_feature.PlatformStatus `json:"status,omitempty" dc:"接口状态"` + AuthType string `json:"authType" dc:"认证类型"` + RequestConfig map[string]interface{} `json:"requestConfig" dc:"请求配置"` + ResponseConfig map[string]interface{} `json:"responseConfig" dc:"响应配置"` + LimitConfig map[string]interface{} `json:"limitConfig" dc:"接口独立限流配置"` +} + +// DeleteApiInterfaceReq 删除接口请求 +type DeleteApiInterfaceReq struct { + g.Meta `path:"/deleteApiInterface" method:"delete" tags:"接口管理" summary:"删除接口" dc:"删除接口"` + Id int64 `json:"id" v:"required" dc:"接口ID"` +} + +// UpdateApiInterfaceStatusReq 更新接口状态请求 +type UpdateApiInterfaceStatusReq struct { + g.Meta `path:"/updateApiInterfaceStatus" method:"put" tags:"接口管理" summary:"更新接口状态" dc:"更新接口状态"` + Id int64 `json:"id" v:"required" dc:"接口ID"` + Status api_feature.PlatformStatus `json:"status" v:"required|in:active,inactive" dc:"状态:active启用/inactive停用"` +} diff --git a/model/entity/copydata/api_account_report_detail.go b/model/entity/copydata/api_account_report_detail.go new file mode 100644 index 0000000..3ca016b --- /dev/null +++ b/model/entity/copydata/api_account_report_detail.go @@ -0,0 +1,664 @@ +package copydata + +import "gitea.com/red-future/common/beans" + +// CidAccountReportDetail 广告数据报表详情实体 +type CidAccountReportDetail struct { + beans.SQLBaseDO `orm:",inherit"` + + // 基础信息字段 + DataType string `orm:"data_type" json:"dataType" description:"类型type"` + + // 核心指标字段 + T0OrderPaymentAmt string `orm:"t0_order_payment_amt" json:"t0OrderPaymentAmt" description:"当日总成交订单金额"` + CreativeMaterialType string `orm:"creative_material_type" json:"creativeMaterialType" description:"视频素材类型"` + LiveName string `orm:"live_name" json:"liveName" description:"直播间名称"` + AuthorId string `orm:"author_id" json:"authorId" description:"直播用户快手Id"` + PicUrl string `orm:"pic_url" json:"picUrl" description:"图片URL"` + PicName string `orm:"pic_name" json:"picName" description:"图片名称"` + PicId string `orm:"pic_id" json:"picId" description:"图片Id"` + CoverUrl string `orm:"cover_url" json:"coverUrl" description:"封面URL"` + CoverId int64 `orm:"cover_id" json:"coverId" description:"封面Id"` + + // 转化率相关字段 + ItemOrderConversionRatio *float64 `orm:"item_order_conversion_ratio" json:"itemOrderConversionRatio" description:"转化率"` + ItemCardClickRatio *float64 `orm:"item_card_click_ratio" json:"itemCardClickRatio" description:"点击率"` + ItemCardClkCnt *int64 `orm:"item_card_clk_cnt" json:"itemCardClkCnt" description:"商品卡点击数"` + LivePlayCntCost *float64 `orm:"live_play_cnt_cost" json:"livePlayCntCost" description:"直播间观看成本"` + AdMerchantFollowCost *float64 `orm:"ad_merchant_follow_cost" json:"adMerchantFollowCost" description:"涨粉成本"` + AdMerchantFollow *int64 `orm:"ad_merchant_follow" json:"adMerchantFollow" description:"涨粉数"` + NetT0OrderCnt *int64 `orm:"net_t0_order_cnt" json:"netT0OrderCnt" description:"当日累计净成交订单数"` + NetT0Roi *float64 `orm:"net_t0_roi" json:"netT0Roi" description:"净成交ROI"` + NetT0Gmv *float64 `orm:"net_t0_gmv" json:"netT0Gmv" description:"净成交GMV"` + + // 视频信息字段 + PhotoName string `orm:"photo_name" json:"photoName" description:"视频名称"` + PhotoIdStr string `orm:"photo_id_str" json:"photoIdStr" description:"视频id"` + PhotoId string `orm:"photo_id" json:"photoId" description:"视频id"` + + // 受众属性字段 + ModPriceSegment string `orm:"mod_price_segment" json:"modPriceSegment" description:"设备价格区间"` + AgeSegment string `orm:"age_segment" json:"ageSegment" description:"年龄段"` + Province string `orm:"province" json:"province" description:"省份名称"` + Gender string `orm:"gender" json:"gender" description:"性别"` + + // 播放率相关字段 + AdPhotoPlayedFiveRatio *float64 `orm:"ad_photo_played_five_ratio" json:"adPhotoPlayedFiveRatio" description:"作品5秒播放率"` + AdPhotoPlayedThreeRatio *float64 `orm:"ad_photo_played_three_ratio" json:"adPhotoPlayedThreeRatio" description:"作品3秒播放率"` + + // 订单相关字段 + OrderSubmitRoi *float64 `orm:"order_submit_roi" json:"orderSubmitRoi" description:"订单提交ROI"` + OrderSubmitAmt *int64 `orm:"order_submit_amt" json:"orderSubmitAmt" description:"外部订单金额"` + EventOrderSubmitCost *float64 `orm:"event_order_submit_cost" json:"eventOrderSubmitCost" description:"订单提交成本"` + EventOrderSubmit *int64 `orm:"event_order_submit" json:"eventOrderSubmit" description:"订单提交数"` + EventOrderPaidRoi *float64 `orm:"event_order_paid_roi" json:"eventOrderPaidRoi" description:"订单支付率"` + EventAppInvoked *int64 `orm:"event_app_invoked" json:"eventAppInvoked" description:"唤起应用数"` + EventAddShoppingCart *int64 `orm:"event_add_shopping_cart" json:"eventAddShoppingCart" description:"添加购物车次数"` + ConversionNumCost *float64 `orm:"conversion_num_cost" json:"conversionNumCost" description:"转化成本"` + AdEffectivePlayNum *int64 `orm:"ad_effective_play_num" json:"adEffectivePlayNum" description:"有效播放数"` + AdItemClick *int64 `orm:"ad_item_click" json:"adItemClick" description:"行为数"` + + // 商品信息字段 + MerchantProductId string `orm:"merchant_product_id" json:"merchantProductId" description:"商品ID"` + + // 花费相关字段 + CostTotal *float64 `orm:"cost_total" json:"costTotal" description:"花费"` + AdShow *int64 `orm:"ad_show" json:"adShow" description:"曝光数"` + AdShow1kCost *float64 `orm:"ad_show1k_cost" json:"adShow1kCost" description:"平均千次广告曝光花费"` + + // 封面相关字段 + Impression *int64 `orm:"impression" json:"impression" description:"封面曝光数"` + PhotoClick *int64 `orm:"photo_click" json:"photoClick" description:"封面点击数"` + PhotoClickRatio *float64 `orm:"photo_click_ratio" json:"photoClickRatio" description:"封面点击率"` + + // 点击相关字段 + Click *int64 `orm:"click" json:"click" description:"素材曝光数"` + ActionbarClick *int64 `orm:"actionbar_click" json:"actionbarClick" description:"行为数"` + ActionbarClickCost *float64 `orm:"actionbar_click_cost" json:"actionbarClickCost" description:"行为成本"` + EspClickRatio *float64 `orm:"esp_click_ratio" json:"espClickRatio" description:"行为率"` + ActionRatio *float64 `orm:"action_ratio" json:"actionRatio" description:"素材点击率"` + AdItemClickCount *int64 `orm:"ad_item_click_count" json:"adItemClickCount" description:"预约组件点击数"` + + // 直播时长字段 + EspLivePlayedSeconds *int64 `orm:"esp_live_played_seconds" json:"espLivePlayedSeconds" description:"直播平均观看时长"` + + // 播放数据字段 + PlayedThreeSeconds *int64 `orm:"played_three_seconds" json:"playedThreeSeconds" description:"作品3秒播放数"` + Play3sRatio *float64 `orm:"play3s_ratio" json:"play3sRatio" description:"作品3秒播放率"` + PlayedFiveSeconds *int64 `orm:"played_five_seconds" json:"playedFiveSeconds" description:"作品5秒播放数"` + Play5sRatio *float64 `orm:"play5s_ratio" json:"play5sRatio" description:"作品5秒播放率"` + PlayedEnd *int64 `orm:"played_end" json:"playedEnd" description:"作品完播数"` + PlayEndRatio *float64 `orm:"play_end_ratio" json:"playEndRatio" description:"作品完播率"` + + // 互动数据字段 + Share *int64 `orm:"share" json:"share" description:"作品分享数"` + Comment *int64 `orm:"comment" json:"comment" description:"作品评论数"` + Likes *int64 `orm:"likes" json:"likes" description:"作品点赞数"` + Report *int64 `orm:"report" json:"report" description:"作品举报数"` + Block *int64 `orm:"block" json:"block" description:"作品拉黑数"` + ItemNegative *int64 `orm:"item_negative" json:"itemNegative" description:"详情页减少此类作品数"` + + // 直播互动字段 + LiveShare *int64 `orm:"live_share" json:"liveShare" description:"直播送礼数"` + LiveComment *int64 `orm:"live_comment" json:"liveComment" description:"直播评论数"` + LiveReward *int64 `orm:"live_reward" json:"liveReward" description:"直播送礼数"` + + // 播放效果字段 + EffectivePlayCount *int64 `orm:"effective_play_count" json:"effectivePlayCount" description:"有效播放数"` + EffectivePlayRatio *float64 `orm:"effective_play_ratio" json:"effectivePlayRatio" description:"有效播放率"` + + // 转化字段 + ConversionNum *int64 `orm:"conversion_num" json:"conversionNum" description:"转化数"` + ConversionCostEsp *float64 `orm:"conversion_cost_esp" json:"conversionCostEsp" description:"转化成本"` + Roi *float64 `orm:"roi" json:"roi" description:"直接ROI"` + Gmv *float64 `orm:"gmv" json:"gmv" description:"直接GMV"` + + // GMV时间序列字段 + T0Gmv *float64 `orm:"t0_gmv" json:"t0Gmv" description:"当日累计GMV"` + T1Gmv *float64 `orm:"t1_gmv" json:"t1Gmv" description:"次日累计GMV"` + T3Gmv *float64 `orm:"t3_gmv" json:"t3Gmv" description:"3日累计GMV"` + T7Gmv *float64 `orm:"t7_gmv" json:"t7Gmv" description:"7日累计GMV"` + T15Gmv *float64 `orm:"t15_gmv" json:"t15Gmv" description:"15日累计GMV"` + T30Gmv *float64 `orm:"t30_gmv" json:"t30Gmv" description:"30日累计GMV"` + + // ROI时间序列字段 + T0Roi *float64 `orm:"t0_roi" json:"t0Roi" description:"当日累计ROI"` + T1Roi *float64 `orm:"t1_roi" json:"t1Roi" description:"次日累计ROI"` + T3Roi *float64 `orm:"t3_roi" json:"t3Roi" description:"3日累计ROI"` + T7Roi *float64 `orm:"t7_roi" json:"t7Roi" description:"7日累计ROI"` + T15Roi *float64 `orm:"t15_roi" json:"t15Roi" description:"15日累计ROI"` + T30Roi *float64 `orm:"t30_roi" json:"t30Roi" description:"30日累计ROI"` + + // 订单相关字段 + PaiedOrder *int64 `orm:"paied_order" json:"paiedOrder" description:"直接订单数"` + OrderRatio *float64 `orm:"order_ratio" json:"orderRatio" description:"直接下单率"` + T0OrderCnt *int64 `orm:"t0_order_cnt" json:"t0OrderCnt" description:"当日累计订单数"` + T0OrderCntCost *float64 `orm:"t0_order_cnt_cost" json:"t0OrderCntCost" description:"当日累计订单成本"` + T0OrderCntRatio *float64 `orm:"t0_order_cnt_ratio" json:"t0OrderCntRatio" description:"累计订单下单率"` + T1OrderCnt *int64 `orm:"t1_order_cnt" json:"t1OrderCnt" description:"次日累计订单数"` + T3OrderCnt *int64 `orm:"t3_order_cnt" json:"t3OrderCnt" description:"3日累计订单数"` + T7OrderCnt *int64 `orm:"t7_order_cnt" json:"t7OrderCnt" description:"7日累计订单数"` + T15OrderCnt *int64 `orm:"t15_order_cnt" json:"t15OrderCnt" description:"15日累计订单数"` + T30OrderCnt *int64 `orm:"t30_order_cnt" json:"t30OrderCnt" description:"30日累计订单数"` + + // 粉丝相关字段 + MerchantRecoFans *int64 `orm:"merchant_reco_fans" json:"merchantRecoFans" description:"涨粉数"` + T1Retention *float64 `orm:"t1_retention" json:"t1Retention" description:"次日涨粉留存数"` + T7Retention *float64 `orm:"t7_retention" json:"t7Retention" description:"7日涨粉留存数"` + T15Retention *float64 `orm:"t15_retention" json:"t15Retention" description:"15日涨粉留存数"` + T30Retention *float64 `orm:"t30_retention" json:"t30Retention" description:"30日涨粉留存数"` + T1RetentionRatio *float64 `orm:"t1_retention_ratio" json:"t1RetentionRatio" description:"次日涨粉留存率"` + T7RetentionRatio *float64 `orm:"t7_retention_ratio" json:"t7RetentionRatio" description:"7日涨粉留存率"` + T15RetentionRatio *float64 `orm:"t15_retention_ratio" json:"t15RetentionRatio" description:"15日涨粉留存率"` + T30RetentionRatio *float64 `orm:"t30_retention_ratio" json:"t30RetentionRatio" description:"30日涨粉留存率"` + + // 直播预约字段 + ReservationSuccess *int64 `orm:"reservation_success" json:"reservationSuccess" description:"直播预约成功数"` + ReservationCost *float64 `orm:"reservation_cost" json:"reservationCost" description:"直播预约成功成本"` + + // 直播观看字段 + StandardLivePlayedStarted *int64 `orm:"standard_live_played_started" json:"standardLivePlayedStarted" description:"直播观看数"` + AdLivePlayCnt *int64 `orm:"ad_live_play_cnt" json:"adLivePlayCnt" description:"直播间人气数"` + AdLivePlayCntCost *float64 `orm:"ad_live_play_cnt_cost" json:"adLivePlayCntCost" description:"直播间人气成本"` + LiveAudienceCost *float64 `orm:"live_audience_cost" json:"liveAudienceCost" description:"直播观看成本"` + + // 商品点击字段 + LiveEventGoodsView *int64 `orm:"live_event_goods_view" json:"liveEventGoodsView" description:"直播间商品点击数"` + GoodsClickRatio *float64 `orm:"goods_click_ratio" json:"goodsClickRatio" description:"直播间商品点击率"` + + // 新客相关字段 + DirectAttrPlatNewBuyerCnt *int64 `orm:"direct_attr_plat_new_buyer_cnt" json:"directAttrPlatNewBuyerCnt" description:"直接平台新客"` + T30AttrPlatTotalBuyerCnt *int64 `orm:"t30_attr_plat_total_buyer_cnt" json:"t30AttrPlatTotalBuyerCnt" description:"30日累计平台新客"` + DirectAttrSellerNewBuyerCnt *int64 `orm:"direct_attr_seller_new_buyer_cnt" json:"directAttrSellerNewBuyerCnt" description:"直接店铺新客"` + T30AttrSellerTotalBuyerCnt *int64 `orm:"t30_attr_seller_total_buyer_cnt" json:"t30AttrSellerTotalBuyerCnt" description:"30日累计店铺新客"` + + // 间接订单字段 + T7IndirectOrderAmt *float64 `orm:"t7_indirect_order_amt" json:"t7IndirectOrderAmt" description:"7日间接订单金额"` + T7IndirectOrderCnt *int64 `orm:"t7_indirect_order_cnt" json:"t7IndirectOrderCnt" description:"7日间接订单数"` + + // 粉丝人均销售额字段 + FansT0GmvPerFans *float64 `orm:"fans_t0_gmv_per_fans" json:"fansT0GmvPerFans" description:"新增粉丝人均销售额"` + FansT3GmvPerFans *float64 `orm:"fans_t3_gmv_per_fans" json:"fansT3GmvPerFans" description:"3日新增粉丝人均销售额"` + FansT7GmvPerFans *float64 `orm:"fans_t7_gmv_per_fans" json:"fansT7GmvPerFans" description:"7日新增粉丝人均销售额"` + FansT15GmvPerFans *float64 `orm:"fans_t15_gmv_per_fans" json:"fansT15GmvPerFans" description:"15日新增粉丝人均销售额"` + FansT30GmvPerFans *float64 `orm:"fans_t30_gmv_per_fans" json:"fansT30GmvPerFans" description:"30日新增粉丝人均销售额"` + + // 涨粉成本字段 + RecoFansCost *float64 `orm:"reco_fans_cost" json:"recoFansCost" description:"涨粉成本"` + + // 智能优惠券字段 + QcpxWhiteboxDirectOrderPaymentAmt *float64 `orm:"qcpx_whitebox_direct_order_payment_amt" json:"qcpxWhiteboxDirectOrderPaymentAmt" description:"智能优惠券订单GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `orm:"qcpx_whitebox_direct_order_cnt" json:"qcpxWhiteboxDirectOrderCnt" description:"智能优惠券订单数"` + + // 粉丝GMV字段 + FansT0Gmv *float64 `orm:"fans_t0_gmv" json:"fansT0Gmv" description:"涨粉当日GMV"` + FansT1Gmv *float64 `orm:"fans_t1_gmv" json:"fansT1Gmv" description:"涨粉次日GMV"` + FansT7Gmv *float64 `orm:"fans_t7_gmv" json:"fansT7Gmv" description:"涨粉7日GMV"` + FansT15Gmv *float64 `orm:"fans_t15_gmv" json:"fansT15Gmv" description:"涨粉15日GMV"` + FansT30Gmv *float64 `orm:"fans_t30_gmv" json:"fansT30Gmv" description:"涨粉30日GMV"` + + // 粉丝ROI字段 + FansT0Roi *float64 `orm:"fans_t0_roi" json:"fansT0Roi" description:"涨粉当日ROI"` + FansT1Roi *float64 `orm:"fans_t1_roi" json:"fansT1Roi" description:"涨粉次日ROI"` + FansT7Roi *float64 `orm:"fans_t7_roi" json:"fansT7Roi" description:"涨粉7日ROI"` + FansT15Roi *float64 `orm:"fans_t15_roi" json:"fansT15Roi" description:"涨粉15日ROI"` + FansT30Roi *float64 `orm:"fans_t30_roi" json:"fansT30Roi" description:"涨粉30日ROI"` + + // 新客GMV字段 + T0ShopNewBuyerOrderPaymentAmt *float64 `orm:"t0_shop_new_buyer_order_payment_amt" json:"t0ShopNewBuyerOrderPaymentAmt" description:"当日新客GMV"` + T1ShopNewBuyerOrderPaymentAmt *float64 `orm:"t1_shop_new_buyer_order_payment_amt" json:"t1ShopNewBuyerOrderPaymentAmt" description:"投后1日新客GMV"` + T3ShopNewBuyerOrderPaymentAmt *float64 `orm:"t3_shop_new_buyer_order_payment_amt" json:"t3ShopNewBuyerOrderPaymentAmt" description:"投后3日新客GMV"` + T7ShopNewBuyerOrderPaymentAmt *float64 `orm:"t7_shop_new_buyer_order_payment_amt" json:"t7ShopNewBuyerOrderPaymentAmt" description:"投后7日新客GMV"` + T15ShopNewBuyerOrderPaymentAmt *float64 `orm:"t15_shop_new_buyer_order_payment_amt" json:"t15ShopNewBuyerOrderPaymentAmt" description:"投后15日新客GMV"` + T30ShopNewBuyerOrderPaymentAmt *float64 `orm:"t30_shop_new_buyer_order_payment_amt" json:"t30ShopNewBuyerOrderPaymentAmt" description:"投后30日新客GMV"` + + // 新客订单量字段 + T0ShopNewBuyerOrderCnt *int64 `orm:"t0_shop_new_buyer_order_cnt" json:"t0ShopNewBuyerOrderCnt" description:"当日新客成交订单量"` + T1ShopNewBuyerOrderCnt *int64 `orm:"t1_shop_new_buyer_order_cnt" json:"t1ShopNewBuyerOrderCnt" description:"投后1日新客成交订单量"` + T3ShopNewBuyerOrderCnt *int64 `orm:"t3_shop_new_buyer_order_cnt" json:"t3ShopNewBuyerOrderCnt" description:"投后3日新客成交订单量"` + T7ShopNewBuyerOrderCnt *int64 `orm:"t7_shop_new_buyer_order_cnt" json:"t7ShopNewBuyerOrderCnt" description:"投后7日新客成交订单量"` + T15ShopNewBuyerOrderCnt *int64 `orm:"t15_shop_new_buyer_order_cnt" json:"t15ShopNewBuyerOrderCnt" description:"投后15日新客成交订单量"` + T30ShopNewBuyerOrderCnt *int64 `orm:"t30_shop_new_buyer_order_cnt" json:"t30ShopNewBuyerOrderCnt" description:"投后30日新客成交订单量"` + + // 新客复购率字段 + T1NewBuyerRepurchaseRatio *float64 `orm:"t1_new_buyer_repurchase_ratio" json:"t1NewBuyerRepurchaseRatio" description:"投后1日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `orm:"t3_new_buyer_repurchase_ratio" json:"t3NewBuyerRepurchaseRatio" description:"投后3日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `orm:"t7_new_buyer_repurchase_ratio" json:"t7NewBuyerRepurchaseRatio" description:"投后7日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `orm:"t15_new_buyer_repurchase_ratio" json:"t15NewBuyerRepurchaseRatio" description:"投后15日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `orm:"t30_new_buyer_repurchase_ratio" json:"t30NewBuyerRepurchaseRatio" description:"投后30日新客复购率"` + + // 新客ROI字段 + T0ShopNewBuyerRoi *float64 `orm:"t0_shop_new_buyer_roi" json:"t0ShopNewBuyerRoi" description:"投后当日新客ROI"` + T1ShopNewBuyerRoi *float64 `orm:"t1_shop_new_buyer_roi" json:"t1ShopNewBuyerRoi" description:"投后1日新客ROI"` + T3ShopNewBuyerRoi *float64 `orm:"t3_shop_new_buyer_roi" json:"t3ShopNewBuyerRoi" description:"投后3日新客ROI"` + T7ShopNewBuyerRoi *float64 `orm:"t7_shop_new_buyer_roi" json:"t7ShopNewBuyerRoi" description:"投后7日新客ROI"` + T15ShopNewBuyerRoi *float64 `orm:"t15_shop_new_buyer_roi" json:"t15ShopNewBuyerRoi" description:"投后15日新客ROI"` + T30ShopNewBuyerRoi *float64 `orm:"t30_shop_new_buyer_roi" json:"t30ShopNewBuyerRoi" description:"投后30日新客ROI"` + + // 电话卡相关字段 + CreateCardOrderCnt *int64 `orm:"create_card_order_cnt" json:"createCardOrderCnt" description:"有效制卡订单数(回传时间)"` + ForwardTsCreateCardOrderCnt *int64 `orm:"forward_ts_create_card_order_cnt" json:"forwardTsCreateCardOrderCnt" description:"有效制卡订单数(计费时间)"` + CreateCardOrderCost *float64 `orm:"create_card_order_cost" json:"createCardOrderCost" description:"有效制卡订单成本(回传时间)"` + ForwardTsCreateCardOrderCost *float64 `orm:"forward_ts_create_card_order_cost" json:"forwardTsCreateCardOrderCost" description:"有效制卡订单成本(计费时间)"` + ActivateCardOrderCnt *int64 `orm:"activate_card_order_cnt" json:"activateCardOrderCnt" description:"电话卡激活订单数(回传时间)"` + ForwardTsActivateCardOrderCnt *int64 `orm:"forward_ts_activate_card_order_cnt" json:"forwardTsActivateCardOrderCnt" description:"电话卡激活订单数(计费时间)"` + ActivateCardOrderCost *float64 `orm:"activate_card_order_cost" json:"activateCardOrderCost" description:"电话卡激活订单成本(回传时间)"` + ForwardTsActivateCardOrderCost *float64 `orm:"forward_ts_activate_card_order_cost" json:"forwardTsActivateCardOrderCost" description:"电话卡激活订单成本(计费时间)"` + CreateCardOrderRatio *float64 `orm:"create_card_order_ratio" json:"createCardOrderRatio" description:"有效制卡订单率(回传时间)"` + ForwardTsCreateCardOrderRatio *float64 `orm:"forward_ts_create_card_order_ratio" json:"forwardTsCreateCardOrderRatio" description:"有效制卡订单率(计费时间)"` + ActivateCardOrderCntRatio *float64 `orm:"activate_card_order_cnt_ratio" json:"activateCardOrderCntRatio" description:"电话卡激活率(回传时间)"` + ForwardTsActivateCardOrderRatio *float64 `orm:"forward_ts_activate_card_order_ratio" json:"forwardTsActivateCardOrderRatio" description:"电话卡激活率(计费时间)"` + + // 全站数据字段 + LivePlayCnt *int64 `orm:"live_play_cnt" json:"livePlayCnt" description:"全站直播观看数"` + ItemEntranceClkCnt *int64 `orm:"item_entrance_clk_cnt" json:"itemEntranceClkCnt" description:"小黄车点击数"` + ShowCnt *int64 `orm:"show_cnt" json:"showCnt" description:"全站曝光"` + + // 时间字段 + ReportDateStr string `orm:"report_date_str" json:"reportDateStr" description:"时间"` + + // 广告结构字段 + CampaignId *int64 `orm:"campaign_id" json:"campaignId" description:"计划ID"` + CampaignName string `orm:"campaign_name" json:"campaignName" description:"计划名称"` + UnitId *int64 `orm:"unit_id" json:"unitId" description:"单元ID"` + UnitName string `orm:"unit_name" json:"unitName" description:"单元名称"` + CreativeId *int64 `orm:"creative_id" json:"creativeId" description:"创意ID"` + CreativeName string `orm:"creative_name" json:"creativeName" description:"创意名称"` + + // 补贴相关字段 + CidActualRoiAfterSubsidy *float64 `orm:"cid_actual_roi_after_subsidy" json:"cidActualRoiAfterSubsidy" description:"补贴后实际ROI"` + CidCouponAmount *int64 `orm:"cid_coupon_amount" json:"cidCouponAmount" description:"核销券金额"` + CidCouponCallbackPaidRefundAmount *int64 `orm:"cid_coupon_callback_paid_refund_amount" json:"cidCouponCallbackPaidRefundAmount" description:"退单有回传_核销券金额"` + CidVoucherCost *float64 `orm:"cid_voucher_cost" json:"cidVoucherCost" description:"券成本"` +} + +// CidAccountReportDetailCol 广告数据报表详情表字段定义 +type CidAccountReportDetailCol struct { + beans.SQLBaseCol + DataType string + T0OrderPaymentAmt string + CreativeMaterialType string + LiveName string + AuthorId string + PicUrl string + PicName string + PicId string + CoverUrl string + CoverId string + ItemOrderConversionRatio string + ItemCardClickRatio string + ItemCardClkCnt string + LivePlayCntCost string + AdMerchantFollowCost string + AdMerchantFollow string + NetT0OrderCnt string + NetT0Roi string + NetT0Gmv string + PhotoName string + PhotoIdStr string + PhotoId string + ModPriceSegment string + AgeSegment string + Province string + Gender string + AdPhotoPlayedFiveRatio string + AdPhotoPlayedThreeRatio string + OrderSubmitRoi string + OrderSubmitAmt string + EventOrderSubmitCost string + EventOrderSubmit string + EventOrderPaidRoi string + EventAppInvoked string + EventAddShoppingCart string + ConversionNumCost string + AdEffectivePlayNum string + AdItemClick string + MerchantProductId string + CostTotal string + AdShow string + AdShow1kCost string + Impression string + PhotoClick string + PhotoClickRatio string + Click string + ActionbarClick string + ActionbarClickCost string + EspClickRatio string + ActionRatio string + AdItemClickCount string + EspLivePlayedSeconds string + PlayedThreeSeconds string + Play3sRatio string + PlayedFiveSeconds string + Play5sRatio string + PlayedEnd string + PlayEndRatio string + Share string + Comment string + Likes string + Report string + Block string + ItemNegative string + LiveShare string + LiveComment string + LiveReward string + EffectivePlayCount string + EffectivePlayRatio string + ConversionNum string + ConversionCostEsp string + Roi string + Gmv string + T0Gmv string + T1Gmv string + T3Gmv string + T7Gmv string + T15Gmv string + T30Gmv string + T0Roi string + T1Roi string + T3Roi string + T7Roi string + T15Roi string + T30Roi string + PaiedOrder string + OrderRatio string + T0OrderCnt string + T0OrderCntCost string + T0OrderCntRatio string + T1OrderCnt string + T3OrderCnt string + T7OrderCnt string + T15OrderCnt string + T30OrderCnt string + MerchantRecoFans string + T1Retention string + T7Retention string + T15Retention string + T30Retention string + T1RetentionRatio string + T7RetentionRatio string + T15RetentionRatio string + T30RetentionRatio string + ReservationSuccess string + ReservationCost string + StandardLivePlayedStarted string + AdLivePlayCnt string + AdLivePlayCntCost string + LiveAudienceCost string + LiveEventGoodsView string + GoodsClickRatio string + DirectAttrPlatNewBuyerCnt string + T30AttrPlatTotalBuyerCnt string + DirectAttrSellerNewBuyerCnt string + T30AttrSellerTotalBuyerCnt string + T7IndirectOrderAmt string + T7IndirectOrderCnt string + FansT0GmvPerFans string + FansT3GmvPerFans string + FansT7GmvPerFans string + FansT15GmvPerFans string + FansT30GmvPerFans string + RecoFansCost string + QcpxWhiteboxDirectOrderPaymentAmt string + QcpxWhiteboxDirectOrderCnt string + FansT0Gmv string + FansT1Gmv string + FansT7Gmv string + FansT15Gmv string + FansT30Gmv string + FansT0Roi string + FansT1Roi string + FansT7Roi string + FansT15Roi string + FansT30Roi string + T0ShopNewBuyerOrderPaymentAmt string + T1ShopNewBuyerOrderPaymentAmt string + T3ShopNewBuyerOrderPaymentAmt string + T7ShopNewBuyerOrderPaymentAmt string + T15ShopNewBuyerOrderPaymentAmt string + T30ShopNewBuyerOrderPaymentAmt string + T0ShopNewBuyerOrderCnt string + T1ShopNewBuyerOrderCnt string + T3ShopNewBuyerOrderCnt string + T7ShopNewBuyerOrderCnt string + T15ShopNewBuyerOrderCnt string + T30ShopNewBuyerOrderCnt string + T1NewBuyerRepurchaseRatio string + T3NewBuyerRepurchaseRatio string + T7NewBuyerRepurchaseRatio string + T15NewBuyerRepurchaseRatio string + T30NewBuyerRepurchaseRatio string + T0ShopNewBuyerRoi string + T1ShopNewBuyerRoi string + T3ShopNewBuyerRoi string + T7ShopNewBuyerRoi string + T15ShopNewBuyerRoi string + T30ShopNewBuyerRoi string + CreateCardOrderCnt string + ForwardTsCreateCardOrderCnt string + CreateCardOrderCost string + ForwardTsCreateCardOrderCost string + ActivateCardOrderCnt string + ForwardTsActivateCardOrderCnt string + ActivateCardOrderCost string + ForwardTsActivateCardOrderCost string + CreateCardOrderRatio string + ForwardTsCreateCardOrderRatio string + ActivateCardOrderCntRatio string + ForwardTsActivateCardOrderRatio string + LivePlayCnt string + ItemEntranceClkCnt string + ShowCnt string + ReportDateStr string + CampaignId string + CampaignName string + UnitId string + UnitName string + CreativeId string + CreativeName string + CidActualRoiAfterSubsidy string + CidCouponAmount string + CidCouponCallbackPaidRefundAmount string + CidVoucherCost string +} + +// TableName 返回表名 +func (e *CidAccountReportDetail) TableName() string { + return "cid_account_report_detail" +} + +// GetCols 获取所有字段名 +func (e *CidAccountReportDetail) GetCols() *CidAccountReportDetailCol { + return &CidAccountReportDetailCol{ + SQLBaseCol: beans.SQLBaseCol{ + Id: "id", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + }, + DataType: "data_type", + T0OrderPaymentAmt: "t0_order_payment_amt", + CreativeMaterialType: "creative_material_type", + LiveName: "live_name", + AuthorId: "author_id", + PicUrl: "pic_url", + PicName: "pic_name", + PicId: "pic_id", + CoverUrl: "cover_url", + CoverId: "cover_id", + ItemOrderConversionRatio: "item_order_conversion_ratio", + ItemCardClickRatio: "item_card_click_ratio", + ItemCardClkCnt: "item_card_clk_cnt", + LivePlayCntCost: "live_play_cnt_cost", + AdMerchantFollowCost: "ad_merchant_follow_cost", + AdMerchantFollow: "ad_merchant_follow", + NetT0OrderCnt: "net_t0_order_cnt", + NetT0Roi: "net_t0_roi", + NetT0Gmv: "net_t0_gmv", + PhotoName: "photo_name", + PhotoIdStr: "photo_id_str", + PhotoId: "photo_id", + ModPriceSegment: "mod_price_segment", + AgeSegment: "age_segment", + Province: "province", + Gender: "gender", + AdPhotoPlayedFiveRatio: "ad_photo_played_five_ratio", + AdPhotoPlayedThreeRatio: "ad_photo_played_three_ratio", + OrderSubmitRoi: "order_submit_roi", + OrderSubmitAmt: "order_submit_amt", + EventOrderSubmitCost: "event_order_submit_cost", + EventOrderSubmit: "event_order_submit", + EventOrderPaidRoi: "event_order_paid_roi", + EventAppInvoked: "event_app_invoked", + EventAddShoppingCart: "event_add_shopping_cart", + ConversionNumCost: "conversion_num_cost", + AdEffectivePlayNum: "ad_effective_play_num", + AdItemClick: "ad_item_click", + MerchantProductId: "merchant_product_id", + CostTotal: "cost_total", + AdShow: "ad_show", + AdShow1kCost: "ad_show1k_cost", + Impression: "impression", + PhotoClick: "photo_click", + PhotoClickRatio: "photo_click_ratio", + Click: "click", + ActionbarClick: "actionbar_click", + ActionbarClickCost: "actionbar_click_cost", + EspClickRatio: "esp_click_ratio", + ActionRatio: "action_ratio", + AdItemClickCount: "ad_item_click_count", + EspLivePlayedSeconds: "esp_live_played_seconds", + PlayedThreeSeconds: "played_three_seconds", + Play3sRatio: "play3s_ratio", + PlayedFiveSeconds: "played_five_seconds", + Play5sRatio: "play5s_ratio", + PlayedEnd: "played_end", + PlayEndRatio: "play_end_ratio", + Share: "share", + Comment: "comment", + Likes: "likes", + Report: "report", + Block: "block", + ItemNegative: "item_negative", + LiveShare: "live_share", + LiveComment: "live_comment", + LiveReward: "live_reward", + EffectivePlayCount: "effective_play_count", + EffectivePlayRatio: "effective_play_ratio", + ConversionNum: "conversion_num", + ConversionCostEsp: "conversion_cost_esp", + Roi: "roi", + Gmv: "gmv", + T0Gmv: "t0_gmv", + T1Gmv: "t1_gmv", + T3Gmv: "t3_gmv", + T7Gmv: "t7_gmv", + T15Gmv: "t15_gmv", + T30Gmv: "t30_gmv", + T0Roi: "t0_roi", + T1Roi: "t1_roi", + T3Roi: "t3_roi", + T7Roi: "t7_roi", + T15Roi: "t15_roi", + T30Roi: "t30_roi", + PaiedOrder: "paied_order", + OrderRatio: "order_ratio", + T0OrderCnt: "t0_order_cnt", + T0OrderCntCost: "t0_order_cnt_cost", + T0OrderCntRatio: "t0_order_cnt_ratio", + T1OrderCnt: "t1_order_cnt", + T3OrderCnt: "t3_order_cnt", + T7OrderCnt: "t7_order_cnt", + T15OrderCnt: "t15_order_cnt", + T30OrderCnt: "t30_order_cnt", + MerchantRecoFans: "merchant_reco_fans", + T1Retention: "t1_retention", + T7Retention: "t7_retention", + T15Retention: "t15_retention", + T30Retention: "t30_retention", + T1RetentionRatio: "t1_retention_ratio", + T7RetentionRatio: "t7_retention_ratio", + T15RetentionRatio: "t15_retention_ratio", + T30RetentionRatio: "t30_retention_ratio", + ReservationSuccess: "reservation_success", + ReservationCost: "reservation_cost", + StandardLivePlayedStarted: "standard_live_played_started", + AdLivePlayCnt: "ad_live_play_cnt", + AdLivePlayCntCost: "ad_live_play_cnt_cost", + LiveAudienceCost: "live_audience_cost", + LiveEventGoodsView: "live_event_goods_view", + GoodsClickRatio: "goods_click_ratio", + DirectAttrPlatNewBuyerCnt: "direct_attr_plat_new_buyer_cnt", + T30AttrPlatTotalBuyerCnt: "t30_attr_plat_total_buyer_cnt", + DirectAttrSellerNewBuyerCnt: "direct_attr_seller_new_buyer_cnt", + T30AttrSellerTotalBuyerCnt: "t30_attr_seller_total_buyer_cnt", + T7IndirectOrderAmt: "t7_indirect_order_amt", + T7IndirectOrderCnt: "t7_indirect_order_cnt", + FansT0GmvPerFans: "fans_t0_gmv_per_fans", + FansT3GmvPerFans: "fans_t3_gmv_per_fans", + FansT7GmvPerFans: "fans_t7_gmv_per_fans", + FansT15GmvPerFans: "fans_t15_gmv_per_fans", + FansT30GmvPerFans: "fans_t30_gmv_per_fans", + RecoFansCost: "reco_fans_cost", + QcpxWhiteboxDirectOrderPaymentAmt: "qcpx_whitebox_direct_order_payment_amt", + QcpxWhiteboxDirectOrderCnt: "qcpx_whitebox_direct_order_cnt", + FansT0Gmv: "fans_t0_gmv", + FansT1Gmv: "fans_t1_gmv", + FansT7Gmv: "fans_t7_gmv", + FansT15Gmv: "fans_t15_gmv", + FansT30Gmv: "fans_t30_gmv", + FansT0Roi: "fans_t0_roi", + FansT1Roi: "fans_t1_roi", + FansT7Roi: "fans_t7_roi", + FansT15Roi: "fans_t15_roi", + FansT30Roi: "fans_t30_roi", + T0ShopNewBuyerOrderPaymentAmt: "t0_shop_new_buyer_order_payment_amt", + T1ShopNewBuyerOrderPaymentAmt: "t1_shop_new_buyer_order_payment_amt", + T3ShopNewBuyerOrderPaymentAmt: "t3_shop_new_buyer_order_payment_amt", + T7ShopNewBuyerOrderPaymentAmt: "t7_shop_new_buyer_order_payment_amt", + T15ShopNewBuyerOrderPaymentAmt: "t15_shop_new_buyer_order_payment_amt", + T30ShopNewBuyerOrderPaymentAmt: "t30_shop_new_buyer_order_payment_amt", + T0ShopNewBuyerOrderCnt: "t0_shop_new_buyer_order_cnt", + T1ShopNewBuyerOrderCnt: "t1_shop_new_buyer_order_cnt", + T3ShopNewBuyerOrderCnt: "t3_shop_new_buyer_order_cnt", + T7ShopNewBuyerOrderCnt: "t7_shop_new_buyer_order_cnt", + T15ShopNewBuyerOrderCnt: "t15_shop_new_buyer_order_cnt", + T30ShopNewBuyerOrderCnt: "t30_shop_new_buyer_order_cnt", + T1NewBuyerRepurchaseRatio: "t1_new_buyer_repurchase_ratio", + T3NewBuyerRepurchaseRatio: "t3_new_buyer_repurchase_ratio", + T7NewBuyerRepurchaseRatio: "t7_new_buyer_repurchase_ratio", + T15NewBuyerRepurchaseRatio: "t15_new_buyer_repurchase_ratio", + T30NewBuyerRepurchaseRatio: "t30_new_buyer_repurchase_ratio", + T0ShopNewBuyerRoi: "t0_shop_new_buyer_roi", + T1ShopNewBuyerRoi: "t1_shop_new_buyer_roi", + T3ShopNewBuyerRoi: "t3_shop_new_buyer_roi", + T7ShopNewBuyerRoi: "t7_shop_new_buyer_roi", + T15ShopNewBuyerRoi: "t15_shop_new_buyer_roi", + T30ShopNewBuyerRoi: "t30_shop_new_buyer_roi", + CreateCardOrderCnt: "create_card_order_cnt", + ForwardTsCreateCardOrderCnt: "forward_ts_create_card_order_cnt", + CreateCardOrderCost: "create_card_order_cost", + ForwardTsCreateCardOrderCost: "forward_ts_create_card_order_cost", + ActivateCardOrderCnt: "activate_card_order_cnt", + ForwardTsActivateCardOrderCnt: "forward_ts_activate_card_order_cnt", + ActivateCardOrderCost: "activate_card_order_cost", + ForwardTsActivateCardOrderCost: "forward_ts_activate_card_order_cost", + CreateCardOrderRatio: "create_card_order_ratio", + ForwardTsCreateCardOrderRatio: "forward_ts_create_card_order_ratio", + ActivateCardOrderCntRatio: "activate_card_order_cnt_ratio", + ForwardTsActivateCardOrderRatio: "forward_ts_activate_card_order_ratio", + LivePlayCnt: "live_play_cnt", + ItemEntranceClkCnt: "item_entrance_clk_cnt", + ShowCnt: "show_cnt", + ReportDateStr: "report_date_str", + CampaignId: "campaign_id", + CampaignName: "campaign_name", + UnitId: "unit_id", + UnitName: "unit_name", + CreativeId: "creative_id", + CreativeName: "creative_name", + CidActualRoiAfterSubsidy: "cid_actual_roi_after_subsidy", + CidCouponAmount: "cid_coupon_amount", + CidCouponCallbackPaidRefundAmount: "cid_coupon_callback_paid_refund_amount", + CidVoucherCost: "cid_voucher_cost", + } +} diff --git a/model/entity/copydata/api_account_report_sum.go b/model/entity/copydata/api_account_report_sum.go new file mode 100644 index 0000000..46a3efd --- /dev/null +++ b/model/entity/copydata/api_account_report_sum.go @@ -0,0 +1,665 @@ +package copydata + +import "gitea.com/red-future/common/beans" + +// CidAccountReportSum 广告数据报表详情实体 +type CidAccountReportSum struct { + beans.SQLBaseDO `orm:",inherit"` + + // 基础信息字段 + DataType string `orm:"data_type" json:"dataType" description:"类型type"` + + // 核心指标字段 + T0OrderPaymentAmt string `orm:"t0_order_payment_amt" json:"t0OrderPaymentAmt" description:"当日总成交订单金额"` + CreativeMaterialType string `orm:"creative_material_type" json:"creativeMaterialType" description:"视频素材类型"` + LiveName string `orm:"live_name" json:"liveName" description:"直播间名称"` + AuthorId string `orm:"author_id" json:"authorId" description:"直播用户快手Id"` + PicUrl string `orm:"pic_url" json:"picUrl" description:"图片URL"` + PicName string `orm:"pic_name" json:"picName" description:"图片名称"` + PicId string `orm:"pic_id" json:"picId" description:"图片Id"` + CoverUrl string `orm:"cover_url" json:"coverUrl" description:"封面URL"` + CoverId int64 `orm:"cover_id" json:"coverId" description:"封面Id"` + + // 转化率相关字段 + ItemOrderConversionRatio *float64 `orm:"item_order_conversion_ratio" json:"itemOrderConversionRatio" description:"转化率"` + ItemCardClickRatio *float64 `orm:"item_card_click_ratio" json:"itemCardClickRatio" description:"点击率"` + ItemCardClkCnt *int64 `orm:"item_card_clk_cnt" json:"itemCardClkCnt" description:"商品卡点击数"` + LivePlayCntCost *float64 `orm:"live_play_cnt_cost" json:"livePlayCntCost" description:"直播间观看成本"` + AdMerchantFollowCost *float64 `orm:"ad_merchant_follow_cost" json:"adMerchantFollowCost" description:"涨粉成本"` + AdMerchantFollow *int64 `orm:"ad_merchant_follow" json:"adMerchantFollow" description:"涨粉数"` + NetT0OrderCnt *int64 `orm:"net_t0_order_cnt" json:"netT0OrderCnt" description:"当日累计净成交订单数"` + NetT0Roi *float64 `orm:"net_t0_roi" json:"netT0Roi" description:"净成交ROI"` + NetT0Gmv *float64 `orm:"net_t0_gmv" json:"netT0Gmv" description:"净成交GMV"` + + // 视频信息字段 + PhotoName string `orm:"photo_name" json:"photoName" description:"视频名称"` + PhotoIdStr string `orm:"photo_id_str" json:"photoIdStr" description:"视频id"` + PhotoId string `orm:"photo_id" json:"photoId" description:"视频id"` + + // 受众属性字段 + ModPriceSegment string `orm:"mod_price_segment" json:"modPriceSegment" description:"设备价格区间"` + AgeSegment string `orm:"age_segment" json:"ageSegment" description:"年龄段"` + Province string `orm:"province" json:"province" description:"省份名称"` + Gender string `orm:"gender" json:"gender" description:"性别"` + + // 播放率相关字段 + AdPhotoPlayedFiveRatio *float64 `orm:"ad_photo_played_five_ratio" json:"adPhotoPlayedFiveRatio" description:"作品5秒播放率"` + AdPhotoPlayedThreeRatio *float64 `orm:"ad_photo_played_three_ratio" json:"adPhotoPlayedThreeRatio" description:"作品3秒播放率"` + + // 订单相关字段 + OrderSubmitRoi *float64 `orm:"order_submit_roi" json:"orderSubmitRoi" description:"订单提交ROI"` + OrderSubmitAmt *int64 `orm:"order_submit_amt" json:"orderSubmitAmt" description:"外部订单金额"` + EventOrderSubmitCost *float64 `orm:"event_order_submit_cost" json:"eventOrderSubmitCost" description:"订单提交成本"` + EventOrderSubmit *int64 `orm:"event_order_submit" json:"eventOrderSubmit" description:"订单提交数"` + EventOrderPaidRoi *float64 `orm:"event_order_paid_roi" json:"eventOrderPaidRoi" description:"订单支付率"` + EventAppInvoked *int64 `orm:"event_app_invoked" json:"eventAppInvoked" description:"唤起应用数"` + EventAddShoppingCart *int64 `orm:"event_add_shopping_cart" json:"eventAddShoppingCart" description:"添加购物车次数"` + ConversionNumCost *float64 `orm:"conversion_num_cost" json:"conversionNumCost" description:"转化成本"` + AdEffectivePlayNum *int64 `orm:"ad_effective_play_num" json:"adEffectivePlayNum" description:"有效播放数"` + AdItemClick *int64 `orm:"ad_item_click" json:"adItemClick" description:"行为数"` + + // 商品信息字段 + MerchantProductId string `orm:"merchant_product_id" json:"merchantProductId" description:"商品ID"` + + // 花费相关字段 + CostTotal *float64 `orm:"cost_total" json:"costTotal" description:"花费"` + AdShow *int64 `orm:"ad_show" json:"adShow" description:"曝光数"` + AdShow1kCost *float64 `orm:"ad_show1k_cost" json:"adShow1kCost" description:"平均千次广告曝光花费"` + + // 封面相关字段 + Impression *int64 `orm:"impression" json:"impression" description:"封面曝光数"` + PhotoClick *int64 `orm:"photo_click" json:"photoClick" description:"封面点击数"` + PhotoClickRatio *float64 `orm:"photo_click_ratio" json:"photoClickRatio" description:"封面点击率"` + + // 点击相关字段 + Click *int64 `orm:"click" json:"click" description:"素材曝光数"` + ActionbarClick *int64 `orm:"actionbar_click" json:"actionbarClick" description:"行为数"` + ActionbarClickCost *float64 `orm:"actionbar_click_cost" json:"actionbarClickCost" description:"行为成本"` + EspClickRatio *float64 `orm:"esp_click_ratio" json:"espClickRatio" description:"行为率"` + ActionRatio *float64 `orm:"action_ratio" json:"actionRatio" description:"素材点击率"` + AdItemClickCount *int64 `orm:"ad_item_click_count" json:"adItemClickCount" description:"预约组件点击数"` + + // 直播时长字段 + EspLivePlayedSeconds *int64 `orm:"esp_live_played_seconds" json:"espLivePlayedSeconds" description:"直播平均观看时长"` + + // 播放数据字段 + PlayedThreeSeconds *int64 `orm:"played_three_seconds" json:"playedThreeSeconds" description:"作品3秒播放数"` + Play3sRatio *float64 `orm:"play3s_ratio" json:"play3sRatio" description:"作品3秒播放率"` + PlayedFiveSeconds *int64 `orm:"played_five_seconds" json:"playedFiveSeconds" description:"作品5秒播放数"` + Play5sRatio *float64 `orm:"play5s_ratio" json:"play5sRatio" description:"作品5秒播放率"` + PlayedEnd *int64 `orm:"played_end" json:"playedEnd" description:"作品完播数"` + PlayEndRatio *float64 `orm:"play_end_ratio" json:"playEndRatio" description:"作品完播率"` + + // 互动数据字段 + Share *int64 `orm:"share" json:"share" description:"作品分享数"` + Comment *int64 `orm:"comment" json:"comment" description:"作品评论数"` + Likes *int64 `orm:"likes" json:"likes" description:"作品点赞数"` + Report *int64 `orm:"report" json:"report" description:"作品举报数"` + Block *int64 `orm:"block" json:"block" description:"作品拉黑数"` + ItemNegative *int64 `orm:"item_negative" json:"itemNegative" description:"详情页减少此类作品数"` + + // 直播互动字段 + LiveShare *int64 `orm:"live_share" json:"liveShare" description:"直播送礼数"` + LiveComment *int64 `orm:"live_comment" json:"liveComment" description:"直播评论数"` + LiveReward *int64 `orm:"live_reward" json:"liveReward" description:"直播送礼数"` + + // 播放效果字段 + EffectivePlayCount *int64 `orm:"effective_play_count" json:"effectivePlayCount" description:"有效播放数"` + EffectivePlayRatio *float64 `orm:"effective_play_ratio" json:"effectivePlayRatio" description:"有效播放率"` + + // 转化字段 + ConversionNum *int64 `orm:"conversion_num" json:"conversionNum" description:"转化数"` + ConversionCostEsp *float64 `orm:"conversion_cost_esp" json:"conversionCostEsp" description:"转化成本"` + Roi *float64 `orm:"roi" json:"roi" description:"直接ROI"` + Gmv *float64 `orm:"gmv" json:"gmv" description:"直接GMV"` + + // GMV时间序列字段 + T0Gmv *float64 `orm:"t0_gmv" json:"t0Gmv" description:"当日累计GMV"` + T1Gmv *float64 `orm:"t1_gmv" json:"t1Gmv" description:"次日累计GMV"` + T3Gmv *float64 `orm:"t3_gmv" json:"t3Gmv" description:"3日累计GMV"` + T7Gmv *float64 `orm:"t7_gmv" json:"t7Gmv" description:"7日累计GMV"` + T15Gmv *float64 `orm:"t15_gmv" json:"t15Gmv" description:"15日累计GMV"` + T30Gmv *float64 `orm:"t30_gmv" json:"t30Gmv" description:"30日累计GMV"` + + // ROI时间序列字段 + T0Roi *float64 `orm:"t0_roi" json:"t0Roi" description:"当日累计ROI"` + T1Roi *float64 `orm:"t1_roi" json:"t1Roi" description:"次日累计ROI"` + T3Roi *float64 `orm:"t3_roi" json:"t3Roi" description:"3日累计ROI"` + T7Roi *float64 `orm:"t7_roi" json:"t7Roi" description:"7日累计ROI"` + T15Roi *float64 `orm:"t15_roi" json:"t15Roi" description:"15日累计ROI"` + T30Roi *float64 `orm:"t30_roi" json:"t30Roi" description:"30日累计ROI"` + + // 订单相关字段 + PaiedOrder *int64 `orm:"paied_order" json:"paiedOrder" description:"直接订单数"` + OrderRatio *float64 `orm:"order_ratio" json:"orderRatio" description:"直接下单率"` + T0OrderCnt *int64 `orm:"t0_order_cnt" json:"t0OrderCnt" description:"当日累计订单数"` + T0OrderCntCost *float64 `orm:"t0_order_cnt_cost" json:"t0OrderCntCost" description:"当日累计订单成本"` + T0OrderCntRatio *float64 `orm:"t0_order_cnt_ratio" json:"t0OrderCntRatio" description:"累计订单下单率"` + T1OrderCnt *int64 `orm:"t1_order_cnt" json:"t1OrderCnt" description:"次日累计订单数"` + T3OrderCnt *int64 `orm:"t3_order_cnt" json:"t3OrderCnt" description:"3日累计订单数"` + T7OrderCnt *int64 `orm:"t7_order_cnt" json:"t7OrderCnt" description:"7日累计订单数"` + T15OrderCnt *int64 `orm:"t15_order_cnt" json:"t15OrderCnt" description:"15日累计订单数"` + T30OrderCnt *int64 `orm:"t30_order_cnt" json:"t30OrderCnt" description:"30日累计订单数"` + + // 粉丝相关字段 + MerchantRecoFans *int64 `orm:"merchant_reco_fans" json:"merchantRecoFans" description:"涨粉数"` + T1Retention *float64 `orm:"t1_retention" json:"t1Retention" description:"次日涨粉留存数"` + T7Retention *float64 `orm:"t7_retention" json:"t7Retention" description:"7日涨粉留存数"` + T15Retention *float64 `orm:"t15_retention" json:"t15Retention" description:"15日涨粉留存数"` + T30Retention *float64 `orm:"t30_retention" json:"t30Retention" description:"30日涨粉留存数"` + T1RetentionRatio *float64 `orm:"t1_retention_ratio" json:"t1RetentionRatio" description:"次日涨粉留存率"` + T7RetentionRatio *float64 `orm:"t7_retention_ratio" json:"t7RetentionRatio" description:"7日涨粉留存率"` + T15RetentionRatio *float64 `orm:"t15_retention_ratio" json:"t15RetentionRatio" description:"15日涨粉留存率"` + T30RetentionRatio *float64 `orm:"t30_retention_ratio" json:"t30RetentionRatio" description:"30日涨粉留存率"` + + // 直播预约字段 + ReservationSuccess *int64 `orm:"reservation_success" json:"reservationSuccess" description:"直播预约成功数"` + ReservationCost *float64 `orm:"reservation_cost" json:"reservationCost" description:"直播预约成功成本"` + + // 直播观看字段 + StandardLivePlayedStarted *int64 `orm:"standard_live_played_started" json:"standardLivePlayedStarted" description:"直播观看数"` + AdLivePlayCnt *int64 `orm:"ad_live_play_cnt" json:"adLivePlayCnt" description:"直播间人气数"` + AdLivePlayCntCost *float64 `orm:"ad_live_play_cnt_cost" json:"adLivePlayCntCost" description:"直播间人气成本"` + LiveAudienceCost *float64 `orm:"live_audience_cost" json:"liveAudienceCost" description:"直播观看成本"` + + // 商品点击字段 + LiveEventGoodsView *int64 `orm:"live_event_goods_view" json:"liveEventGoodsView" description:"直播间商品点击数"` + GoodsClickRatio *float64 `orm:"goods_click_ratio" json:"goodsClickRatio" description:"直播间商品点击率"` + + // 新客相关字段 + DirectAttrPlatNewBuyerCnt *int64 `orm:"direct_attr_plat_new_buyer_cnt" json:"directAttrPlatNewBuyerCnt" description:"直接平台新客"` + T30AttrPlatTotalBuyerCnt *int64 `orm:"t30_attr_plat_total_buyer_cnt" json:"t30AttrPlatTotalBuyerCnt" description:"30日累计平台新客"` + DirectAttrSellerNewBuyerCnt *int64 `orm:"direct_attr_seller_new_buyer_cnt" json:"directAttrSellerNewBuyerCnt" description:"直接店铺新客"` + T30AttrSellerTotalBuyerCnt *int64 `orm:"t30_attr_seller_total_buyer_cnt" json:"t30AttrSellerTotalBuyerCnt" description:"30日累计店铺新客"` + + // 间接订单字段 + T7IndirectOrderAmt *float64 `orm:"t7_indirect_order_amt" json:"t7IndirectOrderAmt" description:"7日间接订单金额"` + T7IndirectOrderCnt *int64 `orm:"t7_indirect_order_cnt" json:"t7IndirectOrderCnt" description:"7日间接订单数"` + + // 粉丝人均销售额字段 + FansT0GmvPerFans *float64 `orm:"fans_t0_gmv_per_fans" json:"fansT0GmvPerFans" description:"新增粉丝人均销售额"` + FansT3GmvPerFans *float64 `orm:"fans_t3_gmv_per_fans" json:"fansT3GmvPerFans" description:"3日新增粉丝人均销售额"` + FansT7GmvPerFans *float64 `orm:"fans_t7_gmv_per_fans" json:"fansT7GmvPerFans" description:"7日新增粉丝人均销售额"` + FansT15GmvPerFans *float64 `orm:"fans_t15_gmv_per_fans" json:"fansT15GmvPerFans" description:"15日新增粉丝人均销售额"` + FansT30GmvPerFans *float64 `orm:"fans_t30_gmv_per_fans" json:"fansT30GmvPerFans" description:"30日新增粉丝人均销售额"` + + // 涨粉成本字段 + RecoFansCost *float64 `orm:"reco_fans_cost" json:"recoFansCost" description:"涨粉成本"` + + // 智能优惠券字段 + QcpxWhiteboxDirectOrderPaymentAmt *float64 `orm:"qcpx_whitebox_direct_order_payment_amt" json:"qcpxWhiteboxDirectOrderPaymentAmt" description:"智能优惠券订单GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `orm:"qcpx_whitebox_direct_order_cnt" json:"qcpxWhiteboxDirectOrderCnt" description:"智能优惠券订单数"` + + // 粉丝GMV字段 + FansT0Gmv *float64 `orm:"fans_t0_gmv" json:"fansT0Gmv" description:"涨粉当日GMV"` + FansT1Gmv *float64 `orm:"fans_t1_gmv" json:"fansT1Gmv" description:"涨粉次日GMV"` + FansT7Gmv *float64 `orm:"fans_t7_gmv" json:"fansT7Gmv" description:"涨粉7日GMV"` + FansT15Gmv *float64 `orm:"fans_t15_gmv" json:"fansT15Gmv" description:"涨粉15日GMV"` + FansT30Gmv *float64 `orm:"fans_t30_gmv" json:"fansT30Gmv" description:"涨粉30日GMV"` + + // 粉丝ROI字段 + FansT0Roi *float64 `orm:"fans_t0_roi" json:"fansT0Roi" description:"涨粉当日ROI"` + FansT1Roi *float64 `orm:"fans_t1_roi" json:"fansT1Roi" description:"涨粉次日ROI"` + FansT7Roi *float64 `orm:"fans_t7_roi" json:"fansT7Roi" description:"涨粉7日ROI"` + FansT15Roi *float64 `orm:"fans_t15_roi" json:"fansT15Roi" description:"涨粉15日ROI"` + FansT30Roi *float64 `orm:"fans_t30_roi" json:"fansT30Roi" description:"涨粉30日ROI"` + + // 新客GMV字段 + T0ShopNewBuyerOrderPaymentAmt *float64 `orm:"t0_shop_new_buyer_order_payment_amt" json:"t0ShopNewBuyerOrderPaymentAmt" description:"当日新客GMV"` + T1ShopNewBuyerOrderPaymentAmt *float64 `orm:"t1_shop_new_buyer_order_payment_amt" json:"t1ShopNewBuyerOrderPaymentAmt" description:"投后1日新客GMV"` + T3ShopNewBuyerOrderPaymentAmt *float64 `orm:"t3_shop_new_buyer_order_payment_amt" json:"t3ShopNewBuyerOrderPaymentAmt" description:"投后3日新客GMV"` + T7ShopNewBuyerOrderPaymentAmt *float64 `orm:"t7_shop_new_buyer_order_payment_amt" json:"t7ShopNewBuyerOrderPaymentAmt" description:"投后7日新客GMV"` + T15ShopNewBuyerOrderPaymentAmt *float64 `orm:"t15_shop_new_buyer_order_payment_amt" json:"t15ShopNewBuyerOrderPaymentAmt" description:"投后15日新客GMV"` + T30ShopNewBuyerOrderPaymentAmt *float64 `orm:"t30_shop_new_buyer_order_payment_amt" json:"t30ShopNewBuyerOrderPaymentAmt" description:"投后30日新客GMV"` + + // 新客订单量字段 + T0ShopNewBuyerOrderCnt *int64 `orm:"t0_shop_new_buyer_order_cnt" json:"t0ShopNewBuyerOrderCnt" description:"当日新客成交订单量"` + T1ShopNewBuyerOrderCnt *int64 `orm:"t1_shop_new_buyer_order_cnt" json:"t1ShopNewBuyerOrderCnt" description:"投后1日新客成交订单量"` + T3ShopNewBuyerOrderCnt *int64 `orm:"t3_shop_new_buyer_order_cnt" json:"t3ShopNewBuyerOrderCnt" description:"投后3日新客成交订单量"` + T7ShopNewBuyerOrderCnt *int64 `orm:"t7_shop_new_buyer_order_cnt" json:"t7ShopNewBuyerOrderCnt" description:"投后7日新客成交订单量"` + T15ShopNewBuyerOrderCnt *int64 `orm:"t15_shop_new_buyer_order_cnt" json:"t15ShopNewBuyerOrderCnt" description:"投后15日新客成交订单量"` + T30ShopNewBuyerOrderCnt *int64 `orm:"t30_shop_new_buyer_order_cnt" json:"t30ShopNewBuyerOrderCnt" description:"投后30日新客成交订单量"` + + // 新客复购率字段 + T1NewBuyerRepurchaseRatio *float64 `orm:"t1_new_buyer_repurchase_ratio" json:"t1NewBuyerRepurchaseRatio" description:"投后1日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `orm:"t3_new_buyer_repurchase_ratio" json:"t3NewBuyerRepurchaseRatio" description:"投后3日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `orm:"t7_new_buyer_repurchase_ratio" json:"t7NewBuyerRepurchaseRatio" description:"投后7日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `orm:"t15_new_buyer_repurchase_ratio" json:"t15NewBuyerRepurchaseRatio" description:"投后15日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `orm:"t30_new_buyer_repurchase_ratio" json:"t30NewBuyerRepurchaseRatio" description:"投后30日新客复购率"` + + // 新客ROI字段 + T0ShopNewBuyerRoi *float64 `orm:"t0_shop_new_buyer_roi" json:"t0ShopNewBuyerRoi" description:"投后当日新客ROI"` + T1ShopNewBuyerRoi *float64 `orm:"t1_shop_new_buyer_roi" json:"t1ShopNewBuyerRoi" description:"投后1日新客ROI"` + T3ShopNewBuyerRoi *float64 `orm:"t3_shop_new_buyer_roi" json:"t3ShopNewBuyerRoi" description:"投后3日新客ROI"` + T7ShopNewBuyerRoi *float64 `orm:"t7_shop_new_buyer_roi" json:"t7ShopNewBuyerRoi" description:"投后7日新客ROI"` + T15ShopNewBuyerRoi *float64 `orm:"t15_shop_new_buyer_roi" json:"t15ShopNewBuyerRoi" description:"投后15日新客ROI"` + T30ShopNewBuyerRoi *float64 `orm:"t30_shop_new_buyer_roi" json:"t30ShopNewBuyerRoi" description:"投后30日新客ROI"` + + // 电话卡相关字段 + CreateCardOrderCnt *int64 `orm:"create_card_order_cnt" json:"createCardOrderCnt" description:"有效制卡订单数(回传时间)"` + ForwardTsCreateCardOrderCnt *int64 `orm:"forward_ts_create_card_order_cnt" json:"forwardTsCreateCardOrderCnt" description:"有效制卡订单数(计费时间)"` + CreateCardOrderCost *float64 `orm:"create_card_order_cost" json:"createCardOrderCost" description:"有效制卡订单成本(回传时间)"` + ForwardTsCreateCardOrderCost *float64 `orm:"forward_ts_create_card_order_cost" json:"forwardTsCreateCardOrderCost" description:"有效制卡订单成本(计费时间)"` + ActivateCardOrderCnt *int64 `orm:"activate_card_order_cnt" json:"activateCardOrderCnt" description:"电话卡激活订单数(回传时间)"` + ForwardTsActivateCardOrderCnt *int64 `orm:"forward_ts_activate_card_order_cnt" json:"forwardTsActivateCardOrderCnt" description:"电话卡激活订单数(计费时间)"` + ActivateCardOrderCost *float64 `orm:"activate_card_order_cost" json:"activateCardOrderCost" description:"电话卡激活订单成本(回传时间)"` + ForwardTsActivateCardOrderCost *float64 `orm:"forward_ts_activate_card_order_cost" json:"forwardTsActivateCardOrderCost" description:"电话卡激活订单成本(计费时间)"` + CreateCardOrderRatio *float64 `orm:"create_card_order_ratio" json:"createCardOrderRatio" description:"有效制卡订单率(回传时间)"` + ForwardTsCreateCardOrderRatio *float64 `orm:"forward_ts_create_card_order_ratio" json:"forwardTsCreateCardOrderRatio" description:"有效制卡订单率(计费时间)"` + ActivateCardOrderCntRatio *float64 `orm:"activate_card_order_cnt_ratio" json:"activateCardOrderCntRatio" description:"电话卡激活率(回传时间)"` + ForwardTsActivateCardOrderRatio *float64 `orm:"forward_ts_activate_card_order_ratio" json:"forwardTsActivateCardOrderRatio" description:"电话卡激活率(计费时间)"` + + // 全站数据字段 + LivePlayCnt *int64 `orm:"live_play_cnt" json:"livePlayCnt" description:"全站直播观看数"` + ItemEntranceClkCnt *int64 `orm:"item_entrance_clk_cnt" json:"itemEntranceClkCnt" description:"小黄车点击数"` + ShowCnt *int64 `orm:"show_cnt" json:"showCnt" description:"全站曝光"` + + // 时间字段 + ReportDateStr string `orm:"report_date_str" json:"reportDateStr" description:"时间"` + + // 广告结构字段 + CampaignId *int64 `orm:"campaign_id" json:"campaignId" description:"计划ID"` + CampaignName string `orm:"campaign_name" json:"campaignName" description:"计划名称"` + UnitId *int64 `orm:"unit_id" json:"unitId" description:"单元ID"` + UnitName string `orm:"unit_name" json:"unitName" description:"单元名称"` + CreativeId *int64 `orm:"creative_id" json:"creativeId" description:"创意ID"` + CreativeName string `orm:"creative_name" json:"creativeName" description:"创意名称"` + + // 补贴相关字段 + CidActualRoiAfterSubsidy *float64 `orm:"cid_actual_roi_after_subsidy" json:"cidActualRoiAfterSubsidy" description:"补贴后实际ROI"` + CidCouponAmount *int64 `orm:"cid_coupon_amount" json:"cidCouponAmount" description:"核销券金额"` + CidCouponCallbackPaidRefundAmount *int64 `orm:"cid_coupon_callback_paid_refund_amount" json:"cidCouponCallbackPaidRefundAmount" description:"退单有回传_核销券金额"` + CidVoucherCost *float64 `orm:"cid_voucher_cost" json:"cidVoucherCost" description:"券成本"` +} + +// CidAccountReportSumCol 广告数据报表详情表字段定义 +type CidAccountReportSumCol struct { + beans.SQLBaseCol + DataType string + T0OrderPaymentAmt string + CreativeMaterialType string + LiveName string + AuthorId string + PicUrl string + PicName string + PicId string + CoverUrl string + CoverId string + ItemOrderConversionRatio string + ItemCardClickRatio string + ItemCardClkCnt string + LivePlayCntCost string + AdMerchantFollowCost string + AdMerchantFollow string + NetT0OrderCnt string + NetT0Roi string + NetT0Gmv string + PhotoName string + PhotoIdStr string + PhotoId string + ModPriceSegment string + AgeSegment string + Province string + Gender string + AdPhotoPlayedFiveRatio string + AdPhotoPlayedThreeRatio string + OrderSubmitRoi string + OrderSubmitAmt string + EventOrderSubmitCost string + EventOrderSubmit string + EventOrderPaidRoi string + EventAppInvoked string + EventAddShoppingCart string + ConversionNumCost string + AdEffectivePlayNum string + AdItemClick string + MerchantProductId string + CostTotal string + AdShow string + AdShow1kCost string + Impression string + PhotoClick string + PhotoClickRatio string + Click string + ActionbarClick string + ActionbarClickCost string + EspClickRatio string + ActionRatio string + AdItemClickCount string + EspLivePlayedSeconds string + PlayedThreeSeconds string + Play3sRatio string + PlayedFiveSeconds string + Play5sRatio string + PlayedEnd string + PlayEndRatio string + Share string + Comment string + Likes string + Report string + Block string + ItemNegative string + LiveShare string + LiveComment string + LiveReward string + EffectivePlayCount string + EffectivePlayRatio string + ConversionNum string + ConversionCostEsp string + Roi string + Gmv string + T0Gmv string + T1Gmv string + T3Gmv string + T7Gmv string + T15Gmv string + T30Gmv string + T0Roi string + T1Roi string + T3Roi string + T7Roi string + T15Roi string + T30Roi string + PaiedOrder string + OrderRatio string + T0OrderCnt string + T0OrderCntCost string + T0OrderCntRatio string + T1OrderCnt string + T3OrderCnt string + T7OrderCnt string + T15OrderCnt string + T30OrderCnt string + MerchantRecoFans string + T1Retention string + T7Retention string + T15Retention string + T30Retention string + T1RetentionRatio string + T7RetentionRatio string + T15RetentionRatio string + T30RetentionRatio string + ReservationSuccess string + ReservationCost string + StandardLivePlayedStarted string + AdLivePlayCnt string + AdLivePlayCntCost string + LiveAudienceCost string + LiveEventGoodsView string + GoodsClickRatio string + DirectAttrPlatNewBuyerCnt string + T30AttrPlatTotalBuyerCnt string + DirectAttrSellerNewBuyerCnt string + T30AttrSellerTotalBuyerCnt string + T7IndirectOrderAmt string + T7IndirectOrderCnt string + FansT0GmvPerFans string + FansT3GmvPerFans string + FansT7GmvPerFans string + FansT15GmvPerFans string + FansT30GmvPerFans string + RecoFansCost string + QcpxWhiteboxDirectOrderPaymentAmt string + QcpxWhiteboxDirectOrderCnt string + FansT0Gmv string + FansT1Gmv string + FansT7Gmv string + FansT15Gmv string + FansT30Gmv string + FansT0Roi string + FansT1Roi string + FansT7Roi string + FansT15Roi string + FansT30Roi string + T0ShopNewBuyerOrderPaymentAmt string + T1ShopNewBuyerOrderPaymentAmt string + T3ShopNewBuyerOrderPaymentAmt string + T7ShopNewBuyerOrderPaymentAmt string + T15ShopNewBuyerOrderPaymentAmt string + T30ShopNewBuyerOrderPaymentAmt string + T0ShopNewBuyerOrderCnt string + T1ShopNewBuyerOrderCnt string + T3ShopNewBuyerOrderCnt string + T7ShopNewBuyerOrderCnt string + T15ShopNewBuyerOrderCnt string + T30ShopNewBuyerOrderCnt string + T1NewBuyerRepurchaseRatio string + T3NewBuyerRepurchaseRatio string + T7NewBuyerRepurchaseRatio string + T15NewBuyerRepurchaseRatio string + T30NewBuyerRepurchaseRatio string + T0ShopNewBuyerRoi string + T1ShopNewBuyerRoi string + T3ShopNewBuyerRoi string + T7ShopNewBuyerRoi string + T15ShopNewBuyerRoi string + T30ShopNewBuyerRoi string + CreateCardOrderCnt string + ForwardTsCreateCardOrderCnt string + CreateCardOrderCost string + ForwardTsCreateCardOrderCost string + ActivateCardOrderCnt string + // model/entity/cid_account_report_detail.go (续) + ForwardTsActivateCardOrderCnt string + ActivateCardOrderCost string + ForwardTsActivateCardOrderCost string + CreateCardOrderRatio string + ForwardTsCreateCardOrderRatio string + ActivateCardOrderCntRatio string + ForwardTsActivateCardOrderRatio string + LivePlayCnt string + ItemEntranceClkCnt string + ShowCnt string + ReportDateStr string + CampaignId string + CampaignName string + UnitId string + UnitName string + CreativeId string + CreativeName string + CidActualRoiAfterSubsidy string + CidCouponAmount string + CidCouponCallbackPaidRefundAmount string + CidVoucherCost string +} + +// TableName 返回表名 +func (e *CidAccountReportSum) TableName() string { + return "cid_account_report_detail" +} + +// GetCols 获取所有字段名 +func (e *CidAccountReportSum) GetCols() *CidAccountReportSumCol { + return &CidAccountReportSumCol{ + SQLBaseCol: beans.SQLBaseCol{ + Id: "id", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + }, + DataType: "data_type", + T0OrderPaymentAmt: "t0_order_payment_amt", + CreativeMaterialType: "creative_material_type", + LiveName: "live_name", + AuthorId: "author_id", + PicUrl: "pic_url", + PicName: "pic_name", + PicId: "pic_id", + CoverUrl: "cover_url", + CoverId: "cover_id", + ItemOrderConversionRatio: "item_order_conversion_ratio", + ItemCardClickRatio: "item_card_click_ratio", + ItemCardClkCnt: "item_card_clk_cnt", + LivePlayCntCost: "live_play_cnt_cost", + AdMerchantFollowCost: "ad_merchant_follow_cost", + AdMerchantFollow: "ad_merchant_follow", + NetT0OrderCnt: "net_t0_order_cnt", + NetT0Roi: "net_t0_roi", + NetT0Gmv: "net_t0_gmv", + PhotoName: "photo_name", + PhotoIdStr: "photo_id_str", + PhotoId: "photo_id", + ModPriceSegment: "mod_price_segment", + AgeSegment: "age_segment", + Province: "province", + Gender: "gender", + AdPhotoPlayedFiveRatio: "ad_photo_played_five_ratio", + AdPhotoPlayedThreeRatio: "ad_photo_played_three_ratio", + OrderSubmitRoi: "order_submit_roi", + OrderSubmitAmt: "order_submit_amt", + EventOrderSubmitCost: "event_order_submit_cost", + EventOrderSubmit: "event_order_submit", + EventOrderPaidRoi: "event_order_paid_roi", + EventAppInvoked: "event_app_invoked", + EventAddShoppingCart: "event_add_shopping_cart", + ConversionNumCost: "conversion_num_cost", + AdEffectivePlayNum: "ad_effective_play_num", + AdItemClick: "ad_item_click", + MerchantProductId: "merchant_product_id", + CostTotal: "cost_total", + AdShow: "ad_show", + AdShow1kCost: "ad_show1k_cost", + Impression: "impression", + PhotoClick: "photo_click", + PhotoClickRatio: "photo_click_ratio", + Click: "click", + ActionbarClick: "actionbar_click", + ActionbarClickCost: "actionbar_click_cost", + EspClickRatio: "esp_click_ratio", + ActionRatio: "action_ratio", + AdItemClickCount: "ad_item_click_count", + EspLivePlayedSeconds: "esp_live_played_seconds", + PlayedThreeSeconds: "played_three_seconds", + Play3sRatio: "play3s_ratio", + PlayedFiveSeconds: "played_five_seconds", + Play5sRatio: "play5s_ratio", + PlayedEnd: "played_end", + PlayEndRatio: "play_end_ratio", + Share: "share", + Comment: "comment", + Likes: "likes", + Report: "report", + Block: "block", + ItemNegative: "item_negative", + LiveShare: "live_share", + LiveComment: "live_comment", + LiveReward: "live_reward", + EffectivePlayCount: "effective_play_count", + EffectivePlayRatio: "effective_play_ratio", + ConversionNum: "conversion_num", + ConversionCostEsp: "conversion_cost_esp", + Roi: "roi", + Gmv: "gmv", + T0Gmv: "t0_gmv", + T1Gmv: "t1_gmv", + T3Gmv: "t3_gmv", + T7Gmv: "t7_gmv", + T15Gmv: "t15_gmv", + T30Gmv: "t30_gmv", + T0Roi: "t0_roi", + T1Roi: "t1_roi", + T3Roi: "t3_roi", + T7Roi: "t7_roi", + T15Roi: "t15_roi", + T30Roi: "t30_roi", + PaiedOrder: "paied_order", + OrderRatio: "order_ratio", + T0OrderCnt: "t0_order_cnt", + T0OrderCntCost: "t0_order_cnt_cost", + T0OrderCntRatio: "t0_order_cnt_ratio", + T1OrderCnt: "t1_order_cnt", + T3OrderCnt: "t3_order_cnt", + T7OrderCnt: "t7_order_cnt", + T15OrderCnt: "t15_order_cnt", + T30OrderCnt: "t30_order_cnt", + MerchantRecoFans: "merchant_reco_fans", + T1Retention: "t1_retention", + T7Retention: "t7_retention", + T15Retention: "t15_retention", + T30Retention: "t30_retention", + T1RetentionRatio: "t1_retention_ratio", + T7RetentionRatio: "t7_retention_ratio", + T15RetentionRatio: "t15_retention_ratio", + T30RetentionRatio: "t30_retention_ratio", + ReservationSuccess: "reservation_success", + ReservationCost: "reservation_cost", + StandardLivePlayedStarted: "standard_live_played_started", + AdLivePlayCnt: "ad_live_play_cnt", + AdLivePlayCntCost: "ad_live_play_cnt_cost", + LiveAudienceCost: "live_audience_cost", + LiveEventGoodsView: "live_event_goods_view", + GoodsClickRatio: "goods_click_ratio", + DirectAttrPlatNewBuyerCnt: "direct_attr_plat_new_buyer_cnt", + T30AttrPlatTotalBuyerCnt: "t30_attr_plat_total_buyer_cnt", + DirectAttrSellerNewBuyerCnt: "direct_attr_seller_new_buyer_cnt", + T30AttrSellerTotalBuyerCnt: "t30_attr_seller_total_buyer_cnt", + T7IndirectOrderAmt: "t7_indirect_order_amt", + T7IndirectOrderCnt: "t7_indirect_order_cnt", + FansT0GmvPerFans: "fans_t0_gmv_per_fans", + FansT3GmvPerFans: "fans_t3_gmv_per_fans", + FansT7GmvPerFans: "fans_t7_gmv_per_fans", + FansT15GmvPerFans: "fans_t15_gmv_per_fans", + FansT30GmvPerFans: "fans_t30_gmv_per_fans", + RecoFansCost: "reco_fans_cost", + QcpxWhiteboxDirectOrderPaymentAmt: "qcpx_whitebox_direct_order_payment_amt", + QcpxWhiteboxDirectOrderCnt: "qcpx_whitebox_direct_order_cnt", + FansT0Gmv: "fans_t0_gmv", + FansT1Gmv: "fans_t1_gmv", + FansT7Gmv: "fans_t7_gmv", + FansT15Gmv: "fans_t15_gmv", + FansT30Gmv: "fans_t30_gmv", + FansT0Roi: "fans_t0_roi", + FansT1Roi: "fans_t1_roi", + FansT7Roi: "fans_t7_roi", + FansT15Roi: "fans_t15_roi", + FansT30Roi: "fans_t30_roi", + T0ShopNewBuyerOrderPaymentAmt: "t0_shop_new_buyer_order_payment_amt", + T1ShopNewBuyerOrderPaymentAmt: "t1_shop_new_buyer_order_payment_amt", + T3ShopNewBuyerOrderPaymentAmt: "t3_shop_new_buyer_order_payment_amt", + T7ShopNewBuyerOrderPaymentAmt: "t7_shop_new_buyer_order_payment_amt", + T15ShopNewBuyerOrderPaymentAmt: "t15_shop_new_buyer_order_payment_amt", + T30ShopNewBuyerOrderPaymentAmt: "t30_shop_new_buyer_order_payment_amt", + T0ShopNewBuyerOrderCnt: "t0_shop_new_buyer_order_cnt", + T1ShopNewBuyerOrderCnt: "t1_shop_new_buyer_order_cnt", + T3ShopNewBuyerOrderCnt: "t3_shop_new_buyer_order_cnt", + T7ShopNewBuyerOrderCnt: "t7_shop_new_buyer_order_cnt", + T15ShopNewBuyerOrderCnt: "t15_shop_new_buyer_order_cnt", + T30ShopNewBuyerOrderCnt: "t30_shop_new_buyer_order_cnt", + T1NewBuyerRepurchaseRatio: "t1_new_buyer_repurchase_ratio", + T3NewBuyerRepurchaseRatio: "t3_new_buyer_repurchase_ratio", + T7NewBuyerRepurchaseRatio: "t7_new_buyer_repurchase_ratio", + T15NewBuyerRepurchaseRatio: "t15_new_buyer_repurchase_ratio", + T30NewBuyerRepurchaseRatio: "t30_new_buyer_repurchase_ratio", + T0ShopNewBuyerRoi: "t0_shop_new_buyer_roi", + T1ShopNewBuyerRoi: "t1_shop_new_buyer_roi", + T3ShopNewBuyerRoi: "t3_shop_new_buyer_roi", + T7ShopNewBuyerRoi: "t7_shop_new_buyer_roi", + T15ShopNewBuyerRoi: "t15_shop_new_buyer_roi", + T30ShopNewBuyerRoi: "t30_shop_new_buyer_roi", + CreateCardOrderCnt: "create_card_order_cnt", + ForwardTsCreateCardOrderCnt: "forward_ts_create_card_order_cnt", + CreateCardOrderCost: "create_card_order_cost", + ForwardTsCreateCardOrderCost: "forward_ts_create_card_order_cost", + ActivateCardOrderCnt: "activate_card_order_cnt", + ForwardTsActivateCardOrderCnt: "forward_ts_activate_card_order_cnt", + ActivateCardOrderCost: "activate_card_order_cost", + ForwardTsActivateCardOrderCost: "forward_ts_activate_card_order_cost", + CreateCardOrderRatio: "create_card_order_ratio", + ForwardTsCreateCardOrderRatio: "forward_ts_create_card_order_ratio", + ActivateCardOrderCntRatio: "activate_card_order_cnt_ratio", + ForwardTsActivateCardOrderRatio: "forward_ts_activate_card_order_ratio", + LivePlayCnt: "live_play_cnt", + ItemEntranceClkCnt: "item_entrance_clk_cnt", + ShowCnt: "show_cnt", + ReportDateStr: "report_date_str", + CampaignId: "campaign_id", + CampaignName: "campaign_name", + UnitId: "unit_id", + UnitName: "unit_name", + CreativeId: "creative_id", + CreativeName: "creative_name", + CidActualRoiAfterSubsidy: "cid_actual_roi_after_subsidy", + CidCouponAmount: "cid_coupon_amount", + CidCouponCallbackPaidRefundAmount: "cid_coupon_callback_paid_refund_amount", + CidVoucherCost: "cid_voucher_cost", + } +} diff --git a/model/entity/copydata/creative_report_detail.go b/model/entity/copydata/creative_report_detail.go new file mode 100644 index 0000000..4951b44 --- /dev/null +++ b/model/entity/copydata/creative_report_detail.go @@ -0,0 +1,582 @@ +package copydata + +import "gitea.com/red-future/common/beans" + +// CreativeReportDetail 广告效果指标明细表实体 +type CreativeReportDetail struct { + beans.SQLBaseDO `orm:",inherit"` + + T0OrderPaymentAmt *float64 `orm:"t0_order_payment_amt" json:"t0OrderPaymentAmt" description:"当日总成交订单金额"` + CreativeMaterialType string `orm:"creative_material_type" json:"creativeMaterialType" description:"视频素材类型"` + LiveName string `orm:"live_name" json:"liveName" description:"直播间名称"` + AuthorId string `orm:"author_id" json:"authorId" description:"直播用户快手 Id"` + PicUrl string `orm:"pic_url" json:"picUrl" description:"图片 URL"` + PicName string `orm:"pic_name" json:"picName" description:"图片名称"` + PicId string `orm:"pic_id" json:"picId" description:"图片 Id"` + CoverUrl string `orm:"cover_url" json:"coverUrl" description:"封面 URL"` + CoverId *int64 `orm:"cover_id" json:"coverId" description:"封面 Id"` + ItemOrderConversionRatio *float64 `orm:"item_order_conversion_ratio" json:"itemOrderConversionRatio" description:"转化率"` + ItemCardClickRatio *float64 `orm:"item_card_click_ratio" json:"itemCardClickRatio" description:"点击率"` + ItemCardClkCnt *int64 `orm:"item_card_clk_cnt" json:"itemCardClkCnt" description:"商品卡点击数"` + LivePlayCntCost *float64 `orm:"live_play_cnt_cost" json:"livePlayCntCost" description:"直播间观看成本"` + AdMerchantFollowCost *float64 `orm:"ad_merchant_follow_cost" json:"adMerchantFollowCost" description:"涨粉成本"` + AdMerchantFollow *int64 `orm:"ad_merchant_follow" json:"adMerchantFollow" description:"涨粉数"` + NetT0OrderCnt *int64 `orm:"net_t0_order_cnt" json:"netT0OrderCnt" description:"当日累计净成交订单数"` + NetT0Roi *float64 `orm:"net_t0_roi" json:"netT0Roi" description:"净成交 ROI"` + NetT0Gmv *float64 `orm:"net_t0_gmv" json:"netT0Gmv" description:"净成交 GMV"` + PhotoName string `orm:"photo_name" json:"photoName" description:"视频名称"` + PhotoIdStr string `orm:"photo_id_str" json:"photoIdStr" description:"视频 id"` + PhotoId string `orm:"photo_id" json:"photoId" description:"视频 id"` + ModPriceSegment string `orm:"mod_price_segment" json:"modPriceSegment" description:"设备价格区间"` + AgeSegment string `orm:"age_segment" json:"ageSegment" description:"年龄段"` + Province string `orm:"province" json:"province" description:"省份名称"` + Gender string `orm:"gender" json:"gender" description:"性别"` + AdPhotoPlayedFiveRatio *float64 `orm:"ad_photo_played_five_ratio" json:"adPhotoPlayedFiveRatio" description:"作品 5 秒播放率"` + AdPhotoPlayedThreeRatio *float64 `orm:"ad_photo_played_three_ratio" json:"adPhotoPlayedThreeRatio" description:"作品 3 秒播放率"` + OrderSubmitRoi *float64 `orm:"order_submit_roi" json:"orderSubmitRoi" description:"订单提交 ROI"` + OrderSubmitAmt *int64 `orm:"order_submit_amt" json:"orderSubmitAmt" description:"外部订单金额"` + EventOrderSubmitCost *float64 `orm:"event_order_submit_cost" json:"eventOrderSubmitCost" description:"订单提交成本"` + EventOrderSubmit *int64 `orm:"event_order_submit" json:"eventOrderSubmit" description:"订单提交数"` + EventOrderPaidRoi *float64 `orm:"event_order_paid_roi" json:"eventOrderPaidRoi" description:"订单支付率"` + EventAppInvoked *int64 `orm:"event_app_invoked" json:"eventAppInvoked" description:"唤起应用数"` + EventAddShoppingCart *int64 `orm:"event_add_shopping_cart" json:"eventAddShoppingCart" description:"添加购物车次数"` + ConversionNumCost *float64 `orm:"conversion_num_cost" json:"conversionNumCost" description:"转化成本(回传时间)"` + AdEffectivePlayNum *int64 `orm:"ad_effective_play_num" json:"adEffectivePlayNum" description:"有效播放数"` + AdItemClick *int64 `orm:"ad_item_click" json:"adItemClick" description:"行为数"` + MerchantProductId string `orm:"merchant_product_id" json:"merchantProductId" description:"商品 ID"` + CostTotal *float64 `orm:"cost_total" json:"costTotal" description:"花费"` + AdShow *int64 `orm:"ad_show" json:"adShow" description:"曝光数"` + AdShow1kCost *float64 `orm:"ad_show1k_cost" json:"adShow1kCost" description:"平均千次广告曝光花费"` + Impression *int64 `orm:"impression" json:"impression" description:"封面曝光数"` + PhotoClick *int64 `orm:"photo_click" json:"photoClick" description:"封面点击数"` + PhotoClickRatio *float64 `orm:"photo_click_ratio" json:"photoClickRatio" description:"封面点击率"` + Click *int64 `orm:"click" json:"click" description:"素材曝光数"` + ActionbarClick *int64 `orm:"actionbar_click" json:"actionbarClick" description:"行为数"` + ActionbarClickCost *float64 `orm:"actionbar_click_cost" json:"actionbarClickCost" description:"行为成本"` + EspClickRatio *float64 `orm:"esp_click_ratio" json:"espClickRatio" description:"行为率"` + ActionRatio *float64 `orm:"action_ratio" json:"actionRatio" description:"素材点击率"` + AdItemClickCount *int64 `orm:"ad_item_click_count" json:"adItemClickCount" description:"预约组件点击数"` + EspLivePlayedSeconds *int64 `orm:"esp_live_played_seconds" json:"espLivePlayedSeconds" description:"直播平均观看时长"` + PlayedThreeSeconds *int64 `orm:"played_three_seconds" json:"playedThreeSeconds" description:"作品 3 秒播放数"` + Play3sRatio *float64 `orm:"play3s_ratio" json:"play3sRatio" description:"作品 3 秒播放率"` + PlayedFiveSeconds *int64 `orm:"played_five_seconds" json:"playedFiveSeconds" description:"作品 5 秒播放数"` + Play5sRatio *float64 `orm:"play5s_ratio" json:"play5sRatio" description:"作品 5 秒播放率"` + PlayedEnd *int64 `orm:"played_end" json:"playedEnd" description:"作品完播数"` + PlayEndRatio *float64 `orm:"play_end_ratio" json:"playEndRatio" description:"作品完播率"` + Share *int64 `orm:"share" json:"share" description:"作品分享数"` + Comment *int64 `orm:"comment" json:"comment" description:"作品评论数"` + Likes *int64 `orm:"likes" json:"likes" description:"作品点赞数"` + Report *int64 `orm:"report" json:"report" description:"作品举报数"` + Block *int64 `orm:"block" json:"block" description:"作品拉黑数"` + ItemNegative *int64 `orm:"item_negative" json:"itemNegative" description:"详情页减少此类作品数"` + LiveShare *int64 `orm:"live_share" json:"liveShare" description:"直播送礼数"` + LiveComment *int64 `orm:"live_comment" json:"liveComment" description:"直播评论数"` + LiveReward *int64 `orm:"live_reward" json:"liveReward" description:"直播送礼数"` + EffectivePlayCount *int64 `orm:"effective_play_count" json:"effectivePlayCount" description:"有效播放数"` + EffectivePlayRatio *float64 `orm:"effective_play_ratio" json:"effectivePlayRatio" description:"有效播放率"` + ConversionNum *int64 `orm:"conversion_num" json:"conversionNum" description:"转化数"` + ConversionCostEsp *float64 `orm:"conversion_cost_esp" json:"conversionCostEsp" description:"转化成本"` + Roi *float64 `orm:"roi" json:"roi" description:"直接 ROI"` + Gmv *float64 `orm:"gmv" json:"gmv" description:"直接 GMV"` + T0Gmv *float64 `orm:"t0_gmv" json:"t0Gmv" description:"当日累计 GMV"` + T1Gmv *float64 `orm:"t1_gmv" json:"t1Gmv" description:"次日累计 GMV"` + T7Gmv *float64 `orm:"t7_gmv" json:"t7Gmv" description:"7 日累计 GMV"` + T15Gmv *float64 `orm:"t15_gmv" json:"t15Gmv" description:"15 日累计 GMV"` + T30Gmv *float64 `orm:"t30_gmv" json:"t30Gmv" description:"30 日累计 GMV"` + T0Roi *float64 `orm:"t0_roi" json:"t0Roi" description:"当日累计 ROI"` + T1Roi *float64 `orm:"t1_roi" json:"t1Roi" description:"次日累计 ROI"` + T7Roi *float64 `orm:"t7_roi" json:"t7Roi" description:"7 日累计 ROI"` + T15Roi *float64 `orm:"t15_roi" json:"t15Roi" description:"15 日累计 ROI"` + T30Roi *float64 `orm:"t30_roi" json:"t30Roi" description:"30 日累计 ROI"` + PaiedOrder *int64 `orm:"paied_order" json:"paiedOrder" description:"直接订单数"` + OrderRatio *float64 `orm:"order_ratio" json:"orderRatio" description:"直接下单率"` + T0OrderCnt *int64 `orm:"t0_order_cnt" json:"t0OrderCnt" description:"当日累计订单数"` + T0OrderCntCost *float64 `orm:"t0_order_cnt_cost" json:"t0OrderCntCost" description:"当日累计订单成本"` + T0OrderCntRatio *float64 `orm:"t0_order_cnt_ratio" json:"t0OrderCntRatio" description:"累计订单下单率"` + T1OrderCnt *int64 `orm:"t1_order_cnt" json:"t1OrderCnt" description:"次日累计订单数"` + T7OrderCnt *int64 `orm:"t7_order_cnt" json:"t7OrderCnt" description:"7 日累计订单数"` + T15OrderCnt *int64 `orm:"t15_order_cnt" json:"t15OrderCnt" description:"15 日累计订单数"` + T30OrderCnt *int64 `orm:"t30_order_cnt" json:"t30OrderCnt" description:"30 日累计订单数"` + MerchantRecoFans *int64 `orm:"merchant_reco_fans" json:"merchantRecoFans" description:"涨粉数"` + T1Retention *float64 `orm:"t1_retention" json:"t1Retention" description:"次日涨粉留存数"` + T7Retention *float64 `orm:"t7_retention" json:"t7Retention" description:"7 日涨粉留存数"` + T15Retention *float64 `orm:"t15_retention" json:"t15Retention" description:"15 日涨粉留存数"` + T30Retention *float64 `orm:"t30_retention" json:"t30Retention" description:"30 日涨粉留存数"` + T1RetentionRatio *float64 `orm:"t1_retention_ratio" json:"t1RetentionRatio" description:"次日涨粉留存率"` + T7RetentionRatio *float64 `orm:"t7_retention_ratio" json:"t7RetentionRatio" description:"7 日涨粉留存率"` + T15RetentionRatio *float64 `orm:"t15_retention_ratio" json:"t15RetentionRatio" description:"15 日涨粉留存率"` + T30RetentionRatio *float64 `orm:"t30_retention_ratio" json:"t30RetentionRatio" description:"30 日涨粉留存率"` + ReservationSuccess *int64 `orm:"reservation_success" json:"reservationSuccess" description:"直播预约成功数"` + ReservationCost *float64 `orm:"reservation_cost" json:"reservationCost" description:"直播预约成功成本"` + StandardLivePlayedStarted *int64 `orm:"standard_live_played_started" json:"standardLivePlayedStarted" description:"直播观看数"` + AdLivePlayCnt *int64 `orm:"ad_live_play_cnt" json:"adLivePlayCnt" description:"直播间人气数"` + AdLivePlayCntCost *float64 `orm:"ad_live_play_cnt_cost" json:"adLivePlayCntCost" description:"直播间人气成本"` + LiveAudienceCost *float64 `orm:"live_audience_cost" json:"liveAudienceCost" description:"直播观看成本"` + LiveEventGoodsView *int64 `orm:"live_event_goods_view" json:"liveEventGoodsView" description:"直播间商品点击数"` + GoodsClickRatio *float64 `orm:"goods_click_ratio" json:"goodsClickRatio" description:"直播间商品点击率"` + DirectAttrPlatNewBuyerCnt *int64 `orm:"direct_attr_plat_new_buyer_cnt" json:"directAttrPlatNewBuyerCnt" description:"直接平台新客"` + T30AttrPlatTotalBuyerCnt *int64 `orm:"t30_attr_plat_total_buyer_cnt" json:"t30AttrPlatTotalBuyerCnt" description:"30 日累计平台新客"` + DirectAttrSellerNewBuyerCnt *int64 `orm:"direct_attr_seller_new_buyer_cnt" json:"directAttrSellerNewBuyerCnt" description:"直接店铺新客"` + T30AttrSellerTotalBuyerCnt *int64 `orm:"t30_attr_seller_total_buyer_cnt" json:"t30AttrSellerTotalBuyerCnt" description:"30 日累计店铺新客"` + T3Gmv *float64 `orm:"t3_gmv" json:"t3Gmv" description:"3 日累计 GMV"` + T3OrderCnt *int64 `orm:"t3_order_cnt" json:"t3OrderCnt" description:"3 日累计订单数"` + T3Roi *float64 `orm:"t3_roi" json:"t3Roi" description:"3 日累计 ROI"` + T7IndirectOrderAmt *float64 `orm:"t7_indirect_order_amt" json:"t7IndirectOrderAmt" description:"7 日间接订单金额"` + T7IndirectOrderCnt *int64 `orm:"t7_indirect_order_cnt" json:"t7IndirectOrderCnt" description:"7 日间接订单数"` + FansT0GmvPerFans *float64 `orm:"fans_t0_gmv_per_fans" json:"fansT0GmvPerFans" description:"新增粉丝人均销售额"` + FansT3GmvPerFans *float64 `orm:"fans_t3_gmv_per_fans" json:"fansT3GmvPerFans" description:"3 日新增粉丝人均销售额"` + FansT7GmvPerFans *float64 `orm:"fans_t7_gmv_per_fans" json:"fansT7GmvPerFans" description:"7 日新增粉丝人均销售额"` + FansT15GmvPerFans *float64 `orm:"fans_t15_gmv_per_fans" json:"fansT15GmvPerFans" description:"15 日新增粉丝人均销售额"` + FansT30GmvPerFans *float64 `orm:"fans_t30_gmv_per_fans" json:"fansT30GmvPerFans" description:"30 日新增粉丝人均销售额"` + RecoFansCost *float64 `orm:"reco_fans_cost" json:"recoFansCost" description:"涨粉成本"` + QcpxWhiteboxDirectOrderPaymentAmt *float64 `orm:"qcpx_whitebox_direct_order_payment_amt" json:"qcpxWhiteboxDirectOrderPaymentAmt" description:"智能优惠券订单 GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `orm:"qcpx_whitebox_direct_order_cnt" json:"qcpxWhiteboxDirectOrderCnt" description:"智能优惠券订单数"` + FansT0Gmv *float64 `orm:"fans_t0_gmv" json:"fansT0Gmv" description:"涨粉当日 GMV"` + FansT1Gmv *float64 `orm:"fans_t1_gmv" json:"fansT1Gmv" description:"涨粉次日 GMV"` + FansT7Gmv *float64 `orm:"fans_t7_gmv" json:"fansT7Gmv" description:"涨粉 7 日 GMV"` + FansT15Gmv *float64 `orm:"fans_t15_gmv" json:"fansT15Gmv" description:"涨粉 15 日 GMV"` + FansT30Gmv *float64 `orm:"fans_t30_gmv" json:"fansT30Gmv" description:"涨粉 30 日 GMV"` + FansT0Roi *float64 `orm:"fans_t0_roi" json:"fansT0Roi" description:"涨粉当日 ROI"` + FansT1Roi *float64 `orm:"fans_t1_roi" json:"fansT1Roi" description:"涨粉次日 ROI"` + FansT7Roi *float64 `orm:"fans_t7_roi" json:"fansT7Roi" description:"涨粉 7 日 ROI"` + FansT15Roi *float64 `orm:"fans_t15_roi" json:"fansT15Roi" description:"涨粉 15 日 ROI"` + FansT30Roi *float64 `orm:"fans_t30_roi" json:"fansT30Roi" description:"涨粉 30 日 ROI"` + T0ShopNewBuyerOrderPaymentAmt *float64 `orm:"t0_shop_new_buyer_order_payment_amt" json:"t0ShopNewBuyerOrderPaymentAmt" description:"当日新客 GMV"` + T1ShopNewBuyerOrderPaymentAmt *float64 `orm:"t1_shop_new_buyer_order_payment_amt" json:"t1ShopNewBuyerOrderPaymentAmt" description:"投后 1 日新客 GMV"` + T3ShopNewBuyerOrderPaymentAmt *float64 `orm:"t3_shop_new_buyer_order_payment_amt" json:"t3ShopNewBuyerOrderPaymentAmt" description:"投后 3 日新客 GMV"` + T7ShopNewBuyerOrderPaymentAmt *float64 `orm:"t7_shop_new_buyer_order_payment_amt" json:"t7ShopNewBuyerOrderPaymentAmt" description:"投后 7 日新客 GMV"` + T15ShopNewBuyerOrderPaymentAmt *float64 `orm:"t15_shop_new_buyer_order_payment_amt" json:"t15ShopNewBuyerOrderPaymentAmt" description:"投后 15 日新客 GMV"` + T30ShopNewBuyerOrderPaymentAmt *float64 `orm:"t30_shop_new_buyer_order_payment_amt" json:"t30ShopNewBuyerOrderPaymentAmt" description:"投后 30 日新客 GMV"` + T0ShopNewBuyerOrderCnt *int64 `orm:"t0_shop_new_buyer_order_cnt" json:"t0ShopNewBuyerOrderCnt" description:"当日新客成交订单量"` + T1ShopNewBuyerOrderCnt *int64 `orm:"t1_shop_new_buyer_order_cnt" json:"t1ShopNewBuyerOrderCnt" description:"投后 1 日新客成交订单量"` + T3ShopNewBuyerOrderCnt *int64 `orm:"t3_shop_new_buyer_order_cnt" json:"t3ShopNewBuyerOrderCnt" description:"投后 3 日新客成交订单量"` + T7ShopNewBuyerOrderCnt *int64 `orm:"t7_shop_new_buyer_order_cnt" json:"t7ShopNewBuyerOrderCnt" description:"投后 7 日新客成交订单量"` + T15ShopNewBuyerOrderCnt *int64 `orm:"t15_shop_new_buyer_order_cnt" json:"t15ShopNewBuyerOrderCnt" description:"投后 15 日新客成交订单量"` + T30ShopNewBuyerOrderCnt *int64 `orm:"t30_shop_new_buyer_order_cnt" json:"t30ShopNewBuyerOrderCnt" description:"投后 30 日新客成交订单量"` + T1NewBuyerRepurchaseRatio *float64 `orm:"t1_new_buyer_repurchase_ratio" json:"t1NewBuyerRepurchaseRatio" description:"投后 1 日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `orm:"t3_new_buyer_repurchase_ratio" json:"t3NewBuyerRepurchaseRatio" description:"投后 3 日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `orm:"t7_new_buyer_repurchase_ratio" json:"t7NewBuyerRepurchaseRatio" description:"投后 7 日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `orm:"t15_new_buyer_repurchase_ratio" json:"t15NewBuyerRepurchaseRatio" description:"投后 15 日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `orm:"t30_new_buyer_repurchase_ratio" json:"t30NewBuyerRepurchaseRatio" description:"投后 30 日新客复购率"` + T0ShopNewBuyerRoi *float64 `orm:"t0_shop_new_buyer_roi" json:"t0ShopNewBuyerRoi" description:"投后当日新客 ROI"` + T1ShopNewBuyerRoi *float64 `orm:"t1_shop_new_buyer_roi" json:"t1ShopNewBuyerRoi" description:"投后 1 日新客 ROI"` + T3ShopNewBuyerRoi *float64 `orm:"t3_shop_new_buyer_roi" json:"t3ShopNewBuyerRoi" description:"投后 3 日新客 ROI"` + T7ShopNewBuyerRoi *float64 `orm:"t7_shop_new_buyer_roi" json:"t7ShopNewBuyerRoi" description:"投后 7 日新客 ROI"` + T15ShopNewBuyerRoi *float64 `orm:"t15_shop_new_buyer_roi" json:"t15ShopNewBuyerRoi" description:"投后 15 日新客 ROI"` + T30ShopNewBuyerRoi *float64 `orm:"t30_shop_new_buyer_roi" json:"t30ShopNewBuyerRoi" description:"投后 30 日新客 ROI"` + CreateCardOrderCnt *int64 `orm:"create_card_order_cnt" json:"createCardOrderCnt" description:"有效制卡订单数(回传时间)"` + ForwardTsCreateCardOrderCnt *int64 `orm:"forward_ts_create_card_order_cnt" json:"forwardTsCreateCardOrderCnt" description:"有效制卡订单数(计费时间)"` + CreateCardOrderCost *float64 `orm:"create_card_order_cost" json:"createCardOrderCost" description:"有效制卡订单成本(回传时间)"` + ForwardTsCreateCardOrderCost *float64 `orm:"forward_ts_create_card_order_cost" json:"forwardTsCreateCardOrderCost" description:"有效制卡订单成本(计费时间)"` + ActivateCardOrderCnt *int64 `orm:"activate_card_order_cnt" json:"activateCardOrderCnt" description:"电话卡激活订单数(回传时间)"` + ForwardTsActivateCardOrderCnt *int64 `orm:"forward_ts_activate_card_order_cnt" json:"forwardTsActivateCardOrderCnt" description:"电话卡激活订单数(计费时间)"` + ActivateCardOrderCost *float64 `orm:"activate_card_order_cost" json:"activateCardOrderCost" description:"电话卡激活订单成本(回传时间)"` + ForwardTsActivateCardOrderCost *float64 `orm:"forward_ts_activate_card_order_cost" json:"forwardTsActivateCardOrderCost" description:"电话卡激活订单成本(计费时间)"` + CreateCardOrderRatio *float64 `orm:"create_card_order_ratio" json:"createCardOrderRatio" description:"有效制卡订单率(回传时间)"` + ForwardTsCreateCardOrderRatio *float64 `orm:"forward_ts_create_card_order_ratio" json:"forwardTsCreateCardOrderRatio" description:"有效制卡订单率(计费时间)"` + ActivateCardOrderCntRatio *float64 `orm:"activate_card_order_cnt_ratio" json:"activateCardOrderCntRatio" description:"电话卡激活率(回传时间)"` + ForwardTsActivateCardOrderRatio *float64 `orm:"forward_ts_activate_card_order_ratio" json:"forwardTsActivateCardOrderRatio" description:"电话卡激活率(计费时间)"` + LivePlayCnt *int64 `orm:"live_play_cnt" json:"livePlayCnt" description:"全站直播观看数"` + ItemEntranceClkCnt *int64 `orm:"item_entrance_clk_cnt" json:"itemEntranceClkCnt" description:"小黄车点击数"` + ShowCnt *int64 `orm:"show_cnt" json:"showCnt" description:"全站曝光"` + ReportDateStr string `orm:"report_date_str" json:"reportDateStr" description:"时间"` + CampaignId *int64 `orm:"campaign_id" json:"campaignId" description:"计划 ID"` + CampaignName string `orm:"campaign_name" json:"campaignName" description:"计划名称"` + UnitId *int64 `orm:"unit_id" json:"unitId" description:"单元 ID"` + UnitName string `orm:"unit_name" json:"unitName" description:"单元名称"` + CreativeId *int64 `orm:"creative_id" json:"creativeId" description:"创意 ID"` + CreativeName string `orm:"creative_name" json:"creativeName" description:"创意名称"` + CidActualRoiAfterSubsidy *float64 `orm:"cid_actual_roi_after_subsidy" json:"cidActualRoiAfterSubsidy" description:"补贴后实际 ROI"` + CidCouponAmount *int64 `orm:"cid_coupon_amount" json:"cidCouponAmount" description:"核销券金额"` + CidCouponCallbackPaidRefundAmount *int64 `orm:"cid_coupon_callback_paid_refund_amount" json:"cidCouponCallbackPaidRefundAmount" description:"退单有回传_核销券金额"` + CidVoucherCost *float64 `orm:"cid_voucher_cost" json:"cidVoucherCost" description:"券成本"` +} + +// CreativeReportDetailCol 广告效果指标明细表字段定义 +type CreativeReportDetailCol struct { + beans.SQLBaseCol + T0OrderPaymentAmt string + CreativeMaterialType string + LiveName string + AuthorId string + PicUrl string + PicName string + PicId string + CoverUrl string + CoverId string + ItemOrderConversionRatio string + ItemCardClickRatio string + ItemCardClkCnt string + LivePlayCntCost string + AdMerchantFollowCost string + AdMerchantFollow string + NetT0OrderCnt string + NetT0Roi string + NetT0Gmv string + PhotoName string + PhotoIdStr string + PhotoId string + ModPriceSegment string + AgeSegment string + Province string + Gender string + AdPhotoPlayedFiveRatio string + AdPhotoPlayedThreeRatio string + OrderSubmitRoi string + OrderSubmitAmt string + EventOrderSubmitCost string + EventOrderSubmit string + EventOrderPaidRoi string + EventAppInvoked string + EventAddShoppingCart string + ConversionNumCost string + AdEffectivePlayNum string + AdItemClick string + MerchantProductId string + CostTotal string + AdShow string + AdShow1kCost string + Impression string + PhotoClick string + PhotoClickRatio string + Click string + ActionbarClick string + ActionbarClickCost string + EspClickRatio string + ActionRatio string + AdItemClickCount string + EspLivePlayedSeconds string + PlayedThreeSeconds string + Play3sRatio string + PlayedFiveSeconds string + Play5sRatio string + PlayedEnd string + PlayEndRatio string + Share string + Comment string + Likes string + Report string + Block string + ItemNegative string + LiveShare string + LiveComment string + LiveReward string + EffectivePlayCount string + EffectivePlayRatio string + ConversionNum string + ConversionCostEsp string + Roi string + Gmv string + T0Gmv string + T1Gmv string + T7Gmv string + T15Gmv string + T30Gmv string + T0Roi string + T1Roi string + T7Roi string + T15Roi string + T30Roi string + PaiedOrder string + OrderRatio string + T0OrderCnt string + T0OrderCntCost string + T0OrderCntRatio string + T1OrderCnt string + T7OrderCnt string + T15OrderCnt string + T30OrderCnt string + MerchantRecoFans string + T1Retention string + T7Retention string + T15Retention string + T30Retention string + T1RetentionRatio string + T7RetentionRatio string + T15RetentionRatio string + T30RetentionRatio string + ReservationSuccess string + ReservationCost string + StandardLivePlayedStarted string + AdLivePlayCnt string + AdLivePlayCntCost string + LiveAudienceCost string + LiveEventGoodsView string + GoodsClickRatio string + DirectAttrPlatNewBuyerCnt string + T30AttrPlatTotalBuyerCnt string + DirectAttrSellerNewBuyerCnt string + T30AttrSellerTotalBuyerCnt string + T3Gmv string + T3OrderCnt string + T3Roi string + T7IndirectOrderAmt string + T7IndirectOrderCnt string + FansT0GmvPerFans string + FansT3GmvPerFans string + FansT7GmvPerFans string + FansT15GmvPerFans string + FansT30GmvPerFans string + RecoFansCost string + QcpxWhiteboxDirectOrderPaymentAmt string + QcpxWhiteboxDirectOrderCnt string + FansT0Gmv string + FansT1Gmv string + FansT7Gmv string + FansT15Gmv string + FansT30Gmv string + FansT0Roi string + FansT1Roi string + FansT7Roi string + FansT15Roi string + FansT30Roi string + T0ShopNewBuyerOrderPaymentAmt string + T1ShopNewBuyerOrderPaymentAmt string + T3ShopNewBuyerOrderPaymentAmt string + T7ShopNewBuyerOrderPaymentAmt string + T15ShopNewBuyerOrderPaymentAmt string + T30ShopNewBuyerOrderPaymentAmt string + T0ShopNewBuyerOrderCnt string + T1ShopNewBuyerOrderCnt string + T3ShopNewBuyerOrderCnt string + T7ShopNewBuyerOrderCnt string + T15ShopNewBuyerOrderCnt string + T30ShopNewBuyerOrderCnt string + T1NewBuyerRepurchaseRatio string + T3NewBuyerRepurchaseRatio string + T7NewBuyerRepurchaseRatio string + T15NewBuyerRepurchaseRatio string + T30NewBuyerRepurchaseRatio string + T0ShopNewBuyerRoi string + T1ShopNewBuyerRoi string + T3ShopNewBuyerRoi string + T7ShopNewBuyerRoi string + T15ShopNewBuyerRoi string + T30ShopNewBuyerRoi string + CreateCardOrderCnt string + ForwardTsCreateCardOrderCnt string + CreateCardOrderCost string + ForwardTsCreateCardOrderCost string + ActivateCardOrderCnt string + ForwardTsActivateCardOrderCnt string + ActivateCardOrderCost string + ForwardTsActivateCardOrderCost string + CreateCardOrderRatio string + ForwardTsCreateCardOrderRatio string + ActivateCardOrderCntRatio string + ForwardTsActivateCardOrderRatio string + LivePlayCnt string + ItemEntranceClkCnt string + ShowCnt string + ReportDateStr string + CampaignId string + CampaignName string + UnitId string + UnitName string + CreativeId string + CreativeName string + CidActualRoiAfterSubsidy string + CidCouponAmount string + CidCouponCallbackPaidRefundAmount string + CidVoucherCost string +} + +// TableName 返回表名 +func (e *CreativeReportDetail) TableName() string { + return "creative_report_detail" +} + +// GetCols 获取所有字段名 +func (e *CreativeReportDetail) GetCols() *CreativeReportDetailCol { + return &CreativeReportDetailCol{ + SQLBaseCol: beans.SQLBaseCol{ + Id: "id", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + }, + T0OrderPaymentAmt: "t0_order_payment_amt", + CreativeMaterialType: "creative_material_type", + LiveName: "live_name", + AuthorId: "author_id", + PicUrl: "pic_url", + PicName: "pic_name", + PicId: "pic_id", + CoverUrl: "cover_url", + CoverId: "cover_id", + ItemOrderConversionRatio: "item_order_conversion_ratio", + ItemCardClickRatio: "item_card_click_ratio", + ItemCardClkCnt: "item_card_clk_cnt", + LivePlayCntCost: "live_play_cnt_cost", + AdMerchantFollowCost: "ad_merchant_follow_cost", + AdMerchantFollow: "ad_merchant_follow", + NetT0OrderCnt: "net_t0_order_cnt", + NetT0Roi: "net_t0_roi", + NetT0Gmv: "net_t0_gmv", + PhotoName: "photo_name", + PhotoIdStr: "photo_id_str", + PhotoId: "photo_id", + ModPriceSegment: "mod_price_segment", + AgeSegment: "age_segment", + Province: "province", + Gender: "gender", + AdPhotoPlayedFiveRatio: "ad_photo_played_five_ratio", + AdPhotoPlayedThreeRatio: "ad_photo_played_three_ratio", + OrderSubmitRoi: "order_submit_roi", + OrderSubmitAmt: "order_submit_amt", + EventOrderSubmitCost: "event_order_submit_cost", + EventOrderSubmit: "event_order_submit", + EventOrderPaidRoi: "event_order_paid_roi", + EventAppInvoked: "event_app_invoked", + EventAddShoppingCart: "event_add_shopping_cart", + ConversionNumCost: "conversion_num_cost", + AdEffectivePlayNum: "ad_effective_play_num", + AdItemClick: "ad_item_click", + MerchantProductId: "merchant_product_id", + CostTotal: "cost_total", + AdShow: "ad_show", + AdShow1kCost: "ad_show1k_cost", + Impression: "impression", + PhotoClick: "photo_click", + PhotoClickRatio: "photo_click_ratio", + Click: "click", + ActionbarClick: "actionbar_click", + ActionbarClickCost: "actionbar_click_cost", + EspClickRatio: "esp_click_ratio", + ActionRatio: "action_ratio", + AdItemClickCount: "ad_item_click_count", + EspLivePlayedSeconds: "esp_live_played_seconds", + PlayedThreeSeconds: "played_three_seconds", + Play3sRatio: "play3s_ratio", + PlayedFiveSeconds: "played_five_seconds", + Play5sRatio: "play5s_ratio", + PlayedEnd: "played_end", + PlayEndRatio: "play_end_ratio", + Share: "share", + Comment: "comment", + Likes: "likes", + Report: "report", + Block: "block", + ItemNegative: "item_negative", + LiveShare: "live_share", + LiveComment: "live_comment", + LiveReward: "live_reward", + EffectivePlayCount: "effective_play_count", + EffectivePlayRatio: "effective_play_ratio", + ConversionNum: "conversion_num", + ConversionCostEsp: "conversion_cost_esp", + Roi: "roi", + Gmv: "gmv", + T0Gmv: "t0_gmv", + T1Gmv: "t1_gmv", + T7Gmv: "t7_gmv", + T15Gmv: "t15_gmv", + T30Gmv: "t30_gmv", + T0Roi: "t0_roi", + T1Roi: "t1_roi", + T7Roi: "t7_roi", + T15Roi: "t15_roi", + T30Roi: "t30_roi", + PaiedOrder: "paied_order", + OrderRatio: "order_ratio", + T0OrderCnt: "t0_order_cnt", + T0OrderCntCost: "t0_order_cnt_cost", + T0OrderCntRatio: "t0_order_cnt_ratio", + T1OrderCnt: "t1_order_cnt", + T7OrderCnt: "t7_order_cnt", + T15OrderCnt: "t15_order_cnt", + T30OrderCnt: "t30_order_cnt", + MerchantRecoFans: "merchant_reco_fans", + T1Retention: "t1_retention", + T7Retention: "t7_retention", + T15Retention: "t15_retention", + T30Retention: "t30_retention", + T1RetentionRatio: "t1_retention_ratio", + T7RetentionRatio: "t7_retention_ratio", + T15RetentionRatio: "t15_retention_ratio", + T30RetentionRatio: "t30_retention_ratio", + ReservationSuccess: "reservation_success", + ReservationCost: "reservation_cost", + StandardLivePlayedStarted: "standard_live_played_started", + AdLivePlayCnt: "ad_live_play_cnt", + AdLivePlayCntCost: "ad_live_play_cnt_cost", + LiveAudienceCost: "live_audience_cost", + LiveEventGoodsView: "live_event_goods_view", + GoodsClickRatio: "goods_click_ratio", + DirectAttrPlatNewBuyerCnt: "direct_attr_plat_new_buyer_cnt", + T30AttrPlatTotalBuyerCnt: "t30_attr_plat_total_buyer_cnt", + DirectAttrSellerNewBuyerCnt: "direct_attr_seller_new_buyer_cnt", + T30AttrSellerTotalBuyerCnt: "t30_attr_seller_total_buyer_cnt", + T3Gmv: "t3_gmv", + T3OrderCnt: "t3_order_cnt", + T3Roi: "t3_roi", + T7IndirectOrderAmt: "t7_indirect_order_amt", + T7IndirectOrderCnt: "t7_indirect_order_cnt", + FansT0GmvPerFans: "fans_t0_gmv_per_fans", + FansT3GmvPerFans: "fans_t3_gmv_per_fans", + FansT7GmvPerFans: "fans_t7_gmv_per_fans", + FansT15GmvPerFans: "fans_t15_gmv_per_fans", + FansT30GmvPerFans: "fans_t30_gmv_per_fans", + RecoFansCost: "reco_fans_cost", + QcpxWhiteboxDirectOrderPaymentAmt: "qcpx_whitebox_direct_order_payment_amt", + QcpxWhiteboxDirectOrderCnt: "qcpx_whitebox_direct_order_cnt", + FansT0Gmv: "fans_t0_gmv", + FansT1Gmv: "fans_t1_gmv", + FansT7Gmv: "fans_t7_gmv", + FansT15Gmv: "fans_t15_gmv", + FansT30Gmv: "fans_t30_gmv", + FansT0Roi: "fans_t0_roi", + FansT1Roi: "fans_t1_roi", + FansT7Roi: "fans_t7_roi", + FansT15Roi: "fans_t15_roi", + FansT30Roi: "fans_t30_roi", + T0ShopNewBuyerOrderPaymentAmt: "t0_shop_new_buyer_order_payment_amt", + T1ShopNewBuyerOrderPaymentAmt: "t1_shop_new_buyer_order_payment_amt", + T3ShopNewBuyerOrderPaymentAmt: "t3_shop_new_buyer_order_payment_amt", + T7ShopNewBuyerOrderPaymentAmt: "t7_shop_new_buyer_order_payment_amt", + T15ShopNewBuyerOrderPaymentAmt: "t15_shop_new_buyer_order_payment_amt", + T30ShopNewBuyerOrderPaymentAmt: "t30_shop_new_buyer_order_payment_amt", + T0ShopNewBuyerOrderCnt: "t0_shop_new_buyer_order_cnt", + T1ShopNewBuyerOrderCnt: "t1_shop_new_buyer_order_cnt", + T3ShopNewBuyerOrderCnt: "t3_shop_new_buyer_order_cnt", + T7ShopNewBuyerOrderCnt: "t7_shop_new_buyer_order_cnt", + T15ShopNewBuyerOrderCnt: "t15_shop_new_buyer_order_cnt", + T30ShopNewBuyerOrderCnt: "t30_shop_new_buyer_order_cnt", + T1NewBuyerRepurchaseRatio: "t1_new_buyer_repurchase_ratio", + T3NewBuyerRepurchaseRatio: "t3_new_buyer_repurchase_ratio", + T7NewBuyerRepurchaseRatio: "t7_new_buyer_repurchase_ratio", + T15NewBuyerRepurchaseRatio: "t15_new_buyer_repurchase_ratio", + T30NewBuyerRepurchaseRatio: "t30_new_buyer_repurchase_ratio", + T0ShopNewBuyerRoi: "t0_shop_new_buyer_roi", + T1ShopNewBuyerRoi: "t1_shop_new_buyer_roi", + T3ShopNewBuyerRoi: "t3_shop_new_buyer_roi", + T7ShopNewBuyerRoi: "t7_shop_new_buyer_roi", + T15ShopNewBuyerRoi: "t15_shop_new_buyer_roi", + T30ShopNewBuyerRoi: "t30_shop_new_buyer_roi", + CreateCardOrderCnt: "create_card_order_cnt", + ForwardTsCreateCardOrderCnt: "forward_ts_create_card_order_cnt", + CreateCardOrderCost: "create_card_order_cost", + ForwardTsCreateCardOrderCost: "forward_ts_create_card_order_cost", + ActivateCardOrderCnt: "activate_card_order_cnt", + ForwardTsActivateCardOrderCnt: "forward_ts_activate_card_order_cnt", + ActivateCardOrderCost: "activate_card_order_cost", + ForwardTsActivateCardOrderCost: "forward_ts_activate_card_order_cost", + CreateCardOrderRatio: "create_card_order_ratio", + ForwardTsCreateCardOrderRatio: "forward_ts_create_card_order_ratio", + ActivateCardOrderCntRatio: "activate_card_order_cnt_ratio", + ForwardTsActivateCardOrderRatio: "forward_ts_activate_card_order_ratio", + LivePlayCnt: "live_play_cnt", + ItemEntranceClkCnt: "item_entrance_clk_cnt", + ShowCnt: "show_cnt", + ReportDateStr: "report_date_str", + CampaignId: "campaign_id", + CampaignName: "campaign_name", + UnitId: "unit_id", + UnitName: "unit_name", + CreativeId: "creative_id", + CreativeName: "creative_name", + CidActualRoiAfterSubsidy: "cid_actual_roi_after_subsidy", + CidCouponAmount: "cid_coupon_amount", + CidCouponCallbackPaidRefundAmount: "cid_coupon_callback_paid_refund_amount", + CidVoucherCost: "cid_voucher_cost", + } +} diff --git a/model/entity/copydata/creative_report_sum.go b/model/entity/copydata/creative_report_sum.go new file mode 100644 index 0000000..871fca5 --- /dev/null +++ b/model/entity/copydata/creative_report_sum.go @@ -0,0 +1,687 @@ +package copydata + +import "gitea.com/red-future/common/beans" + +// CreativeReportSum 广告效果指标表实体 +type CreativeReportSum struct { + beans.SQLBaseDO `orm:",inherit"` + + // 订单金额相关字段 + T0OrderPaymentAmt *float64 `orm:"t0_order_payment_amt" json:"t0OrderPaymentAmt" description:"当日总成交订单金额"` + + // 素材类型字段 + CreativeMaterialType string `orm:"creative_material_type" json:"creativeMaterialType" description:"视频素材类型(视频:HORIZONTAL_SCREEN, VERTICAL_SCREEN, UNKNOWN_TYPE;图集:ATLAS;长图:ATLAS_VERTICAL)"` + + // 直播相关字段 + LiveName string `orm:"live_name" json:"liveName" description:"直播间名称"` + AuthorId string `orm:"author_id" json:"authorId" description:"直播用户快手 Id"` + + // 图片相关字段 + PicUrl string `orm:"pic_url" json:"picUrl" description:"图片 URL"` + PicName string `orm:"pic_name" json:"picName" description:"图片名称"` + PicId string `orm:"pic_id" json:"picId" description:"图片 Id"` + + // 封面相关字段 + CoverUrl string `orm:"cover_url" json:"coverUrl" description:"封面 URL"` + CoverId *int64 `orm:"cover_id" json:"coverId" description:"封面 Id"` + + // 转化率相关字段 + ItemOrderConversionRatio *float64 `orm:"item_order_conversion_ratio" json:"itemOrderConversionRatio" description:"转化率"` + ItemCardClickRatio *float64 `orm:"item_card_click_ratio" json:"itemCardClickRatio" description:"点击率"` + ItemCardClkCnt *int64 `orm:"item_card_clk_cnt" json:"itemCardClkCnt" description:"商品卡点击数"` + + // 成本相关字段 + LivePlayCntCost *float64 `orm:"live_play_cnt_cost" json:"livePlayCntCost" description:"直播间观看成本"` + AdMerchantFollowCost *float64 `orm:"ad_merchant_follow_cost" json:"adMerchantFollowCost" description:"涨粉成本"` + AdMerchantFollow *int64 `orm:"ad_merchant_follow" json:"adMerchantFollow" description:"涨粉数"` + + // 净成交相关字段 + NetT0OrderCnt *int64 `orm:"net_t0_order_cnt" json:"netT0OrderCnt" description:"当日累计净成交订单数"` + NetT0Roi *float64 `orm:"net_t0_roi" json:"netT0Roi" description:"净成交 ROI"` + NetT0Gmv *float64 `orm:"net_t0_gmv" json:"netT0Gmv" description:"净成交 GMV"` + + // 视频相关字段 + PhotoName string `orm:"photo_name" json:"photoName" description:"视频名称"` + PhotoIdStr string `orm:"photo_id_str" json:"photoIdStr" description:"视频 id"` + PhotoId string `orm:"photo_id" json:"photoId" description:"视频 id"` + + // 用户属性相关字段 + ModPriceSegment string `orm:"mod_price_segment" json:"modPriceSegment" description:"设备价格区间"` + AgeSegment string `orm:"age_segment" json:"ageSegment" description:"年龄段"` + Province string `orm:"province" json:"province" description:"省份名称"` + Gender string `orm:"gender" json:"gender" description:"性别"` + + // 播放率相关字段 + AdPhotoPlayedFiveRatio *float64 `orm:"ad_photo_played_five_ratio" json:"adPhotoPlayedFiveRatio" description:"作品 5 秒播放率"` + AdPhotoPlayedThreeRatio *float64 `orm:"ad_photo_played_three_ratio" json:"adPhotoPlayedThreeRatio" description:"作品 3 秒播放率"` + + // 订单提交相关字段 + OrderSubmitRoi *float64 `orm:"order_submit_roi" json:"orderSubmitRoi" description:"订单提交 ROI"` + OrderSubmitAmt *int64 `orm:"order_submit_amt" json:"orderSubmitAmt" description:"外部订单金额"` + EventOrderSubmitCost *float64 `orm:"event_order_submit_cost" json:"eventOrderSubmitCost" description:"订单提交成本"` + EventOrderSubmit *int64 `orm:"event_order_submit" json:"eventOrderSubmit" description:"订单提交数"` + EventOrderPaidRoi *float64 `orm:"event_order_paid_roi" json:"eventOrderPaidRoi" description:"订单支付率"` + + // 用户行为相关字段 + EventAppInvoked *int64 `orm:"event_app_invoked" json:"eventAppInvoked" description:"唤起应用数"` + EventAddShoppingCart *int64 `orm:"event_add_shopping_cart" json:"eventAddShoppingCart" description:"添加购物车次数"` + + // 转化成本相关字段 + ConversionNumCost *float64 `orm:"conversion_num_cost" json:"conversionNumCost" description:"转化成本(回传时间)"` + AdEffectivePlayNum *int64 `orm:"ad_effective_play_num" json:"adEffectivePlayNum" description:"有效播放数"` + AdItemClick *int64 `orm:"ad_item_click" json:"adItemClick" description:"行为数"` + + // 商品相关字段 + MerchantProductId string `orm:"merchant_product_id" json:"merchantProductId" description:"商品 ID"` + + // 花费相关字段 + CostTotal *float64 `orm:"cost_total" json:"costTotal" description:"花费"` + + // 曝光相关字段 + AdShow *int64 `orm:"ad_show" json:"adShow" description:"曝光数"` + AdShow1kCost *float64 `orm:"ad_show1k_cost" json:"adShow1kCost" description:"平均千次广告曝光花费"` + Impression *int64 `orm:"impression" json:"impression" description:"封面曝光数"` + PhotoClick *int64 `orm:"photo_click" json:"photoClick" description:"封面点击数"` + PhotoClickRatio *float64 `orm:"photo_click_ratio" json:"photoClickRatio" description:"封面点击率"` + Click *int64 `orm:"click" json:"click" description:"素材曝光数"` + + // 行为相关字段 + ActionbarClick *int64 `orm:"actionbar_click" json:"actionbarClick" description:"行为数"` + ActionbarClickCost *float64 `orm:"actionbar_click_cost" json:"actionbarClickCost" description:"行为成本"` + EspClickRatio *float64 `orm:"esp_click_ratio" json:"espClickRatio" description:"行为率"` + ActionRatio *float64 `orm:"action_ratio" json:"actionRatio" description:"素材点击率"` + AdItemClickCount *int64 `orm:"ad_item_click_count" json:"adItemClickCount" description:"预约组件点击数"` + + // 直播时长相关字段 + EspLivePlayedSeconds *int64 `orm:"esp_live_played_seconds" json:"espLivePlayedSeconds" description:"直播平均观看时长"` + + // 作品播放相关字段 + PlayedThreeSeconds *int64 `orm:"played_three_seconds" json:"playedThreeSeconds" description:"作品 3 秒播放数"` + Play3sRatio *float64 `orm:"play3s_ratio" json:"play3sRatio" description:"作品 3 秒播放率"` + PlayedFiveSeconds *int64 `orm:"played_five_seconds" json:"playedFiveSeconds" description:"作品 5 秒播放数"` + Play5sRatio *float64 `orm:"play5s_ratio" json:"play5sRatio" description:"作品 5 秒播放率"` + PlayedEnd *int64 `orm:"played_end" json:"playedEnd" description:"作品完播数"` + PlayEndRatio *float64 `orm:"play_end_ratio" json:"playEndRatio" description:"作品完播率"` + + // 作品互动相关字段 + Share *int64 `orm:"share" json:"share" description:"作品分享数"` + Comment *int64 `orm:"comment" json:"comment" description:"作品评论数"` + Likes *int64 `orm:"likes" json:"likes" description:"作品点赞数"` + Report *int64 `orm:"report" json:"report" description:"作品举报数"` + Block *int64 `orm:"block" json:"block" description:"作品拉黑数"` + ItemNegative *int64 `orm:"item_negative" json:"itemNegative" description:"详情页减少此类作品数"` + + // 直播互动相关字段 + LiveShare *int64 `orm:"live_share" json:"liveShare" description:"直播送礼数"` + LiveComment *int64 `orm:"live_comment" json:"liveComment" description:"直播评论数"` + LiveReward *int64 `orm:"live_reward" json:"liveReward" description:"直播送礼数"` + + // 有效播放相关字段 + EffectivePlayCount *int64 `orm:"effective_play_count" json:"effectivePlayCount" description:"有效播放数"` + EffectivePlayRatio *float64 `orm:"effective_play_ratio" json:"effectivePlayRatio" description:"有效播放率"` + + // 转化相关字段 + ConversionNum *int64 `orm:"conversion_num" json:"conversionNum" description:"转化数"` + ConversionCostEsp *float64 `orm:"conversion_cost_esp" json:"conversionCostEsp" description:"转化成本"` + Roi *float64 `orm:"roi" json:"roi" description:"直接 ROI"` + Gmv *float64 `orm:"gmv" json:"gmv" description:"直接 GMV"` + + // 累计 GMV 相关字段 + T0Gmv *float64 `orm:"t0_gmv" json:"t0Gmv" description:"当日累计 GMV"` + T1Gmv *float64 `orm:"t1_gmv" json:"t1Gmv" description:"次日累计 GMV"` + T7Gmv *float64 `orm:"t7_gmv" json:"t7Gmv" description:"7 日累计 GMV"` + T15Gmv *float64 `orm:"t15_gmv" json:"t15Gmv" description:"15 日累计 GMV"` + T30Gmv *float64 `orm:"t30_gmv" json:"t30Gmv" description:"30 日累计 GMV"` + + // 累计 ROI 相关字段 + T0Roi *float64 `orm:"t0_roi" json:"t0Roi" description:"当日累计 ROI"` + T1Roi *float64 `orm:"t1_roi" json:"t1Roi" description:"次日累计 ROI"` + T7Roi *float64 `orm:"t7_roi" json:"t7Roi" description:"7 日累计 ROI"` + T15Roi *float64 `orm:"t15_roi" json:"t15Roi" description:"15 日累计 ROI"` + T30Roi *float64 `orm:"t30_roi" json:"t30Roi" description:"30 日累计 ROI"` + + // 订单相关字段 + PaiedOrder *int64 `orm:"paied_order" json:"paiedOrder" description:"直接订单数"` + OrderRatio *float64 `orm:"order_ratio" json:"orderRatio" description:"直接下单率"` + T0OrderCnt *int64 `orm:"t0_order_cnt" json:"t0OrderCnt" description:"当日累计订单数"` + T0OrderCntCost *float64 `orm:"t0_order_cnt_cost" json:"t0OrderCntCost" description:"当日累计订单成本"` + T0OrderCntRatio *float64 `orm:"t0_order_cnt_ratio" json:"t0OrderCntRatio" description:"累计订单下单率"` + T1OrderCnt *int64 `orm:"t1_order_cnt" json:"t1OrderCnt" description:"次日累计订单数"` + T7OrderCnt *int64 `orm:"t7_order_cnt" json:"t7OrderCnt" description:"7 日累计订单数"` + T15OrderCnt *int64 `orm:"t15_order_cnt" json:"t15OrderCnt" description:"15 日累计订单数"` + T30OrderCnt *int64 `orm:"t30_order_cnt" json:"t30OrderCnt" description:"30 日累计订单数"` + + // 涨粉相关字段 + MerchantRecoFans *int64 `orm:"merchant_reco_fans" json:"merchantRecoFans" description:"涨粉数"` + T1Retention *float64 `orm:"t1_retention" json:"t1Retention" description:"次日涨粉留存数"` + T7Retention *float64 `orm:"t7_retention" json:"t7Retention" description:"7 日涨粉留存数"` + T15Retention *float64 `orm:"t15_retention" json:"t15Retention" description:"15 日涨粉留存数"` + T30Retention *float64 `orm:"t30_retention" json:"t30Retention" description:"30 日涨粉留存数"` + T1RetentionRatio *float64 `orm:"t1_retention_ratio" json:"t1RetentionRatio" description:"次日涨粉留存率"` + T7RetentionRatio *float64 `orm:"t7_retention_ratio" json:"t7RetentionRatio" description:"7 日涨粉留存率"` + T15RetentionRatio *float64 `orm:"t15_retention_ratio" json:"t15RetentionRatio" description:"15 日涨粉留存率"` + T30RetentionRatio *float64 `orm:"t30_retention_ratio" json:"t30RetentionRatio" description:"30 日涨粉留存率"` + + // 直播预约相关字段 + ReservationSuccess *int64 `orm:"reservation_success" json:"reservationSuccess" description:"直播预约成功数"` + ReservationCost *float64 `orm:"reservation_cost" json:"reservationCost" description:"直播预约成功成本"` + + // 直播观看相关字段 + StandardLivePlayedStarted *int64 `orm:"standard_live_played_started" json:"standardLivePlayedStarted" description:"直播观看数"` + AdLivePlayCnt *int64 `orm:"ad_live_play_cnt" json:"adLivePlayCnt" description:"直播间人气数"` + AdLivePlayCntCost *float64 `orm:"ad_live_play_cnt_cost" json:"adLivePlayCntCost" description:"直播间人气成本"` + LiveAudienceCost *float64 `orm:"live_audience_cost" json:"liveAudienceCost" description:"直播观看成本"` + + // 直播间商品相关字段 + LiveEventGoodsView *int64 `orm:"live_event_goods_view" json:"liveEventGoodsView" description:"直播间商品点击数"` + GoodsClickRatio *float64 `orm:"goods_click_ratio" json:"goodsClickRatio" description:"直播间商品点击率"` + + // 新客相关字段 + DirectAttrPlatNewBuyerCnt *int64 `orm:"direct_attr_plat_new_buyer_cnt" json:"directAttrPlatNewBuyerCnt" description:"直接平台新客"` + T30AttrPlatTotalBuyerCnt *int64 `orm:"t30_attr_plat_total_buyer_cnt" json:"t30AttrPlatTotalBuyerCnt" description:"30 日累计平台新客"` + DirectAttrSellerNewBuyerCnt *int64 `orm:"direct_attr_seller_new_buyer_cnt" json:"directAttrSellerNewBuyerCnt" description:"直接店铺新客"` + T30AttrSellerTotalBuyerCnt *int64 `orm:"t30_attr_seller_total_buyer_cnt" json:"t30AttrSellerTotalBuyerCnt" description:"30 日累计店铺新客"` + + // 3 日累计相关字段 + T3Gmv *float64 `orm:"t3_gmv" json:"t3Gmv" description:"3 日累计 GMV"` + T3OrderCnt *int64 `orm:"t3_order_cnt" json:"t3OrderCnt" description:"3 日累计订单数"` + T3Roi *float64 `orm:"t3_roi" json:"t3Roi" description:"3 日累计 ROI"` + + // 7 日间接订单相关字段 + T7IndirectOrderAmt *float64 `orm:"t7_indirect_order_amt" json:"t7IndirectOrderAmt" description:"7 日间接订单金额"` + T7IndirectOrderCnt *int64 `orm:"t7_indirect_order_cnt" json:"t7IndirectOrderCnt" description:"7 日间接订单数"` + + // 粉丝人均销售额相关字段 + FansT0GmvPerFans *float64 `orm:"fans_t0_gmv_per_fans" json:"fansT0GmvPerFans" description:"新增粉丝人均销售额"` + FansT3GmvPerFans *float64 `orm:"fans_t3_gmv_per_fans" json:"fansT3GmvPerFans" description:"3 日新增粉丝人均销售额"` + FansT7GmvPerFans *float64 `orm:"fans_t7_gmv_per_fans" json:"fansT7GmvPerFans" description:"7 日新增粉丝人均销售额"` + FansT15GmvPerFans *float64 `orm:"fans_t15_gmv_per_fans" json:"fansT15GmvPerFans" description:"15 日新增粉丝人均销售额"` + FansT30GmvPerFans *float64 `orm:"fans_t30_gmv_per_fans" json:"fansT30GmvPerFans" description:"30 日新增粉丝人均销售额"` + + // 涨粉成本相关字段 + RecoFansCost *float64 `orm:"reco_fans_cost" json:"recoFansCost" description:"涨粉成本"` + + // 智能优惠券相关字段 + QcpxWhiteboxDirectOrderPaymentAmt *float64 `orm:"qcpx_whitebox_direct_order_payment_amt" json:"qcpxWhiteboxDirectOrderPaymentAmt" description:"智能优惠券订单 GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `orm:"qcpx_whitebox_direct_order_cnt" json:"qcpxWhiteboxDirectOrderCnt" description:"智能优惠券订单数"` + + // 粉丝 GMV 相关字段 + FansT0Gmv *float64 `orm:"fans_t0_gmv" json:"fansT0Gmv" description:"涨粉当日 GMV"` + FansT1Gmv *float64 `orm:"fans_t1_gmv" json:"fansT1Gmv" description:"涨粉次日 GMV"` + FansT7Gmv *float64 `orm:"fans_t7_gmv" json:"fansT7Gmv" description:"涨粉 7 日 GMV"` + FansT15Gmv *float64 `orm:"fans_t15_gmv" json:"fansT15Gmv" description:"涨粉 15 日 GMV"` + FansT30Gmv *float64 `orm:"fans_t30_gmv" json:"fansT30Gmv" description:"涨粉 30 日 GMV"` + + // 粉丝 ROI 相关字段 + FansT0Roi *float64 `orm:"fans_t0_roi" json:"fansT0Roi" description:"涨粉当日 ROI"` + FansT1Roi *float64 `orm:"fans_t1_roi" json:"fansT1Roi" description:"涨粉次日 ROI"` + FansT7Roi *float64 `orm:"fans_t7_roi" json:"fansT7Roi" description:"涨粉 7 日 ROI"` + FansT15Roi *float64 `orm:"fans_t15_roi" json:"fansT15Roi" description:"涨粉 15 日 ROI"` + FansT30Roi *float64 `orm:"fans_t30_roi" json:"fansT30Roi" description:"涨粉 30 日 ROI"` + + // 新客 GMV 相关字段 + T0ShopNewBuyerOrderPaymentAmt *float64 `orm:"t0_shop_new_buyer_order_payment_amt" json:"t0ShopNewBuyerOrderPaymentAmt" description:"当日新客 GMV"` + T1ShopNewBuyerOrderPaymentAmt *float64 `orm:"t1_shop_new_buyer_order_payment_amt" json:"t1ShopNewBuyerOrderPaymentAmt" description:"投后 1 日新客 GMV"` + T3ShopNewBuyerOrderPaymentAmt *float64 `orm:"t3_shop_new_buyer_order_payment_amt" json:"t3ShopNewBuyerOrderPaymentAmt" description:"投后 3 日新客 GMV"` + T7ShopNewBuyerOrderPaymentAmt *float64 `orm:"t7_shop_new_buyer_order_payment_amt" json:"t7ShopNewBuyerOrderPaymentAmt" description:"投后 7 日新客 GMV"` + T15ShopNewBuyerOrderPaymentAmt *float64 `orm:"t15_shop_new_buyer_order_payment_amt" json:"t15ShopNewBuyerOrderPaymentAmt" description:"投后 15 日新客 GMV"` + T30ShopNewBuyerOrderPaymentAmt *float64 `orm:"t30_shop_new_buyer_order_payment_amt" json:"t30ShopNewBuyerOrderPaymentAmt" description:"投后 30 日新客 GMV"` + + // 新客订单数相关字段 + T0ShopNewBuyerOrderCnt *int64 `orm:"t0_shop_new_buyer_order_cnt" json:"t0ShopNewBuyerOrderCnt" description:"当日新客成交订单量"` + T1ShopNewBuyerOrderCnt *int64 `orm:"t1_shop_new_buyer_order_cnt" json:"t1ShopNewBuyerOrderCnt" description:"投后 1 日新客成交订单量"` + T3ShopNewBuyerOrderCnt *int64 `orm:"t3_shop_new_buyer_order_cnt" json:"t3ShopNewBuyerOrderCnt" description:"投后 3 日新客成交订单量"` + T7ShopNewBuyerOrderCnt *int64 `orm:"t7_shop_new_buyer_order_cnt" json:"t7ShopNewBuyerOrderCnt" description:"投后 7 日新客成交订单量"` + T15ShopNewBuyerOrderCnt *int64 `orm:"t15_shop_new_buyer_order_cnt" json:"t15ShopNewBuyerOrderCnt" description:"投后 15 日新客成交订单量"` + T30ShopNewBuyerOrderCnt *int64 `orm:"t30_shop_new_buyer_order_cnt" json:"t30ShopNewBuyerOrderCnt" description:"投后 30 日新客成交订单量"` + + // 新客复购率相关字段 + T1NewBuyerRepurchaseRatio *float64 `orm:"t1_new_buyer_repurchase_ratio" json:"t1NewBuyerRepurchaseRatio" description:"投后 1 日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `orm:"t3_new_buyer_repurchase_ratio" json:"t3NewBuyerRepurchaseRatio" description:"投后 3 日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `orm:"t7_new_buyer_repurchase_ratio" json:"t7NewBuyerRepurchaseRatio" description:"投后 7 日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `orm:"t15_new_buyer_repurchase_ratio" json:"t15NewBuyerRepurchaseRatio" description:"投后 15 日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `orm:"t30_new_buyer_repurchase_ratio" json:"t30NewBuyerRepurchaseRatio" description:"投后 30 日新客复购率"` + + // 新客 ROI 相关字段 + T0ShopNewBuyerRoi *float64 `orm:"t0_shop_new_buyer_roi" json:"t0ShopNewBuyerRoi" description:"投后当日新客 ROI"` + T1ShopNewBuyerRoi *float64 `orm:"t1_shop_new_buyer_roi" json:"t1ShopNewBuyerRoi" description:"投后 1 日新客 ROI"` + T3ShopNewBuyerRoi *float64 `orm:"t3_shop_new_buyer_roi" json:"t3ShopNewBuyerRoi" description:"投后 3 日新客 ROI"` + T7ShopNewBuyerRoi *float64 `orm:"t7_shop_new_buyer_roi" json:"t7ShopNewBuyerRoi" description:"投后 7 日新客 ROI"` + T15ShopNewBuyerRoi *float64 `orm:"t15_shop_new_buyer_roi" json:"t15ShopNewBuyerRoi" description:"投后 15 日新客 ROI"` + T30ShopNewBuyerRoi *float64 `orm:"t30_shop_new_buyer_roi" json:"t30ShopNewBuyerRoi" description:"投后 30 日新客 ROI"` + + // 制卡订单相关字段 + CreateCardOrderCnt *int64 `orm:"create_card_order_cnt" json:"createCardOrderCnt" description:"有效制卡订单数(回传时间)"` + ForwardTsCreateCardOrderCnt *int64 `orm:"forward_ts_create_card_order_cnt" json:"forwardTsCreateCardOrderCnt" description:"有效制卡订单数(计费时间)"` + CreateCardOrderCost *float64 `orm:"create_card_order_cost" json:"createCardOrderCost" description:"有效制卡订单成本(回传时间)"` + ForwardTsCreateCardOrderCost *float64 `orm:"forward_ts_create_card_order_cost" json:"forwardTsCreateCardOrderCost" description:"有效制卡订单成本(计费时间)"` + + // 电话卡激活相关字段 + ActivateCardOrderCnt *int64 `orm:"activate_card_order_cnt" json:"activateCardOrderCnt" description:"电话卡激活订单数(回传时间)"` + ForwardTsActivateCardOrderCnt *int64 `orm:"forward_ts_activate_card_order_cnt" json:"forwardTsActivateCardOrderCnt" description:"电话卡激活订单数(计费时间)"` + ActivateCardOrderCost *float64 `orm:"activate_card_order_cost" json:"activateCardOrderCost" description:"电话卡激活订单成本(回传时间)"` + ForwardTsActivateCardOrderCost *float64 `orm:"forward_ts_activate_card_order_cost" json:"forwardTsActivateCardOrderCost" description:"电话卡激活订单成本(计费时间)"` + + // 制卡订单率相关字段 + CreateCardOrderRatio *float64 `orm:"create_card_order_ratio" json:"createCardOrderRatio" description:"有效制卡订单率(回传时间)"` + ForwardTsCreateCardOrderRatio *float64 `orm:"forward_ts_create_card_order_ratio" json:"forwardTsCreateCardOrderRatio" description:"有效制卡订单率(计费时间)"` + + // 电话卡激活率相关字段 + ActivateCardOrderCntRatio *float64 `orm:"activate_card_order_cnt_ratio" json:"activateCardOrderCntRatio" description:"电话卡激活率(回传时间)"` + ForwardTsActivateCardOrderRatio *float64 `orm:"forward_ts_activate_card_order_ratio" json:"forwardTsActivateCardOrderRatio" description:"电话卡激活率(计费时间)"` + + // 直播观看相关字段 + LivePlayCnt *int64 `orm:"live_play_cnt" json:"livePlayCnt" description:"全站直播观看数"` + ItemEntranceClkCnt *int64 `orm:"item_entrance_clk_cnt" json:"itemEntranceClkCnt" description:"小黄车点击数"` + ShowCnt *int64 `orm:"show_cnt" json:"showCnt" description:"全站曝光"` + + // 报告日期字段 + ReportDateStr string `orm:"report_date_str" json:"reportDateStr" description:"时间"` + + // 广告计划相关字段 + CampaignId *int64 `orm:"campaign_id" json:"campaignId" description:"计划 ID"` + CampaignName string `orm:"campaign_name" json:"campaignName" description:"计划名称"` + + // 广告单元相关字段 + UnitId *int64 `orm:"unit_id" json:"unitId" description:"单元 ID"` + UnitName string `orm:"unit_name" json:"unitName" description:"单元名称"` + + // 广告创意相关字段 + CreativeId *int64 `orm:"creative_id" json:"creativeId" description:"创意 ID"` + CreativeName string `orm:"creative_name" json:"creativeName" description:"创意名称"` + + // 新增字段 + CidActualRoiAfterSubsidy *float64 `orm:"cid_actual_roi_after_subsidy" json:"cidActualRoiAfterSubsidy" description:"补贴后实际 ROI"` + CidCouponAmount *int64 `orm:"cid_coupon_amount" json:"cidCouponAmount" description:"核销券金额"` + CidCouponCallbackPaidRefundAmount *int64 `orm:"cid_coupon_callback_paid_refund_amount" json:"cidCouponCallbackPaidRefundAmount" description:"退单有回传_核销券金额"` + CidVoucherCost *float64 `orm:"cid_voucher_cost" json:"cidVoucherCost" description:"券成本"` +} + +// CreativeReportSumCol 广告效果指标表字段定义 +type CreativeReportSumCol struct { + beans.SQLBaseCol + T0OrderPaymentAmt string + CreativeMaterialType string + LiveName string + AuthorId string + PicUrl string + PicName string + PicId string + CoverUrl string + CoverId string + ItemOrderConversionRatio string + ItemCardClickRatio string + ItemCardClkCnt string + LivePlayCntCost string + AdMerchantFollowCost string + AdMerchantFollow string + NetT0OrderCnt string + NetT0Roi string + NetT0Gmv string + PhotoName string + PhotoIdStr string + PhotoId string + ModPriceSegment string + AgeSegment string + Province string + Gender string + AdPhotoPlayedFiveRatio string + AdPhotoPlayedThreeRatio string + OrderSubmitRoi string + OrderSubmitAmt string + EventOrderSubmitCost string + EventOrderSubmit string + EventOrderPaidRoi string + EventAppInvoked string + EventAddShoppingCart string + ConversionNumCost string + AdEffectivePlayNum string + AdItemClick string + MerchantProductId string + CostTotal string + AdShow string + AdShow1kCost string + Impression string + PhotoClick string + PhotoClickRatio string + Click string + ActionbarClick string + ActionbarClickCost string + EspClickRatio string + ActionRatio string + AdItemClickCount string + EspLivePlayedSeconds string + PlayedThreeSeconds string + Play3sRatio string + PlayedFiveSeconds string + Play5sRatio string + PlayedEnd string + PlayEndRatio string + Share string + Comment string + Likes string + Report string + Block string + ItemNegative string + LiveShare string + LiveComment string + LiveReward string + EffectivePlayCount string + EffectivePlayRatio string + ConversionNum string + ConversionCostEsp string + Roi string + Gmv string + T0Gmv string + T1Gmv string + T7Gmv string + T15Gmv string + T30Gmv string + T0Roi string + T1Roi string + T7Roi string + T15Roi string + T30Roi string + PaiedOrder string + OrderRatio string + T0OrderCnt string + T0OrderCntCost string + T0OrderCntRatio string + T1OrderCnt string + T7OrderCnt string + T15OrderCnt string + T30OrderCnt string + MerchantRecoFans string + T1Retention string + T7Retention string + T15Retention string + T30Retention string + T1RetentionRatio string + T7RetentionRatio string + T15RetentionRatio string + T30RetentionRatio string + ReservationSuccess string + ReservationCost string + StandardLivePlayedStarted string + AdLivePlayCnt string + AdLivePlayCntCost string + LiveAudienceCost string + LiveEventGoodsView string + GoodsClickRatio string + DirectAttrPlatNewBuyerCnt string + T30AttrPlatTotalBuyerCnt string + DirectAttrSellerNewBuyerCnt string + T30AttrSellerTotalBuyerCnt string + T3Gmv string + T3OrderCnt string + T3Roi string + T7IndirectOrderAmt string + T7IndirectOrderCnt string + FansT0GmvPerFans string + FansT3GmvPerFans string + FansT7GmvPerFans string + FansT15GmvPerFans string + FansT30GmvPerFans string + RecoFansCost string + QcpxWhiteboxDirectOrderPaymentAmt string + QcpxWhiteboxDirectOrderCnt string + FansT0Gmv string + FansT1Gmv string + FansT7Gmv string + FansT15Gmv string + FansT30Gmv string + FansT0Roi string + FansT1Roi string + FansT7Roi string + FansT15Roi string + FansT30Roi string + T0ShopNewBuyerOrderPaymentAmt string + T1ShopNewBuyerOrderPaymentAmt string + T3ShopNewBuyerOrderPaymentAmt string + T7ShopNewBuyerOrderPaymentAmt string + T15ShopNewBuyerOrderPaymentAmt string + T30ShopNewBuyerOrderPaymentAmt string + T0ShopNewBuyerOrderCnt string + T1ShopNewBuyerOrderCnt string + T3ShopNewBuyerOrderCnt string + T7ShopNewBuyerOrderCnt string + T15ShopNewBuyerOrderCnt string + T30ShopNewBuyerOrderCnt string + T1NewBuyerRepurchaseRatio string + T3NewBuyerRepurchaseRatio string + T7NewBuyerRepurchaseRatio string + T15NewBuyerRepurchaseRatio string + T30NewBuyerRepurchaseRatio string + T0ShopNewBuyerRoi string + T1ShopNewBuyerRoi string + T3ShopNewBuyerRoi string + T7ShopNewBuyerRoi string + T15ShopNewBuyerRoi string + T30ShopNewBuyerRoi string + CreateCardOrderCnt string + ForwardTsCreateCardOrderCnt string + CreateCardOrderCost string + ForwardTsCreateCardOrderCost string + ActivateCardOrderCnt string + ForwardTsActivateCardOrderCnt string + ActivateCardOrderCost string + ForwardTsActivateCardOrderCost string + CreateCardOrderRatio string + ForwardTsCreateCardOrderRatio string + ActivateCardOrderCntRatio string + ForwardTsActivateCardOrderRatio string + LivePlayCnt string + ItemEntranceClkCnt string + ShowCnt string + ReportDateStr string + CampaignId string + CampaignName string + UnitId string + UnitName string + CreativeId string + CreativeName string + CidActualRoiAfterSubsidy string + CidCouponAmount string + CidCouponCallbackPaidRefundAmount string + CidVoucherCost string +} + +// TableName 返回表名 +func (e *CreativeReportSum) TableName() string { + return "creative_report_sum" +} + +// GetCols 获取所有字段名 +func (e *CreativeReportSum) GetCols() *CreativeReportSumCol { + return &CreativeReportSumCol{ + SQLBaseCol: beans.SQLBaseCol{ + Id: "id", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + }, + T0OrderPaymentAmt: "t0_order_payment_amt", + CreativeMaterialType: "creative_material_type", + LiveName: "live_name", + AuthorId: "author_id", + PicUrl: "pic_url", + PicName: "pic_name", + PicId: "pic_id", + CoverUrl: "cover_url", + CoverId: "cover_id", + ItemOrderConversionRatio: "item_order_conversion_ratio", + ItemCardClickRatio: "item_card_click_ratio", + ItemCardClkCnt: "item_card_clk_cnt", + LivePlayCntCost: "live_play_cnt_cost", + AdMerchantFollowCost: "ad_merchant_follow_cost", + AdMerchantFollow: "ad_merchant_follow", + NetT0OrderCnt: "net_t0_order_cnt", + NetT0Roi: "net_t0_roi", + NetT0Gmv: "net_t0_gmv", + PhotoName: "photo_name", + PhotoIdStr: "photo_id_str", + PhotoId: "photo_id", + ModPriceSegment: "mod_price_segment", + AgeSegment: "age_segment", + Province: "province", + Gender: "gender", + AdPhotoPlayedFiveRatio: "ad_photo_played_five_ratio", + AdPhotoPlayedThreeRatio: "ad_photo_played_three_ratio", + OrderSubmitRoi: "order_submit_roi", + OrderSubmitAmt: "order_submit_amt", + EventOrderSubmitCost: "event_order_submit_cost", + EventOrderSubmit: "event_order_submit", + EventOrderPaidRoi: "event_order_paid_roi", + EventAppInvoked: "event_app_invoked", + EventAddShoppingCart: "event_add_shopping_cart", + ConversionNumCost: "conversion_num_cost", + AdEffectivePlayNum: "ad_effective_play_num", + AdItemClick: "ad_item_click", + MerchantProductId: "merchant_product_id", + CostTotal: "cost_total", + AdShow: "ad_show", + AdShow1kCost: "ad_show1k_cost", + Impression: "impression", + PhotoClick: "photo_click", + PhotoClickRatio: "photo_click_ratio", + Click: "click", + ActionbarClick: "actionbar_click", + ActionbarClickCost: "actionbar_click_cost", + EspClickRatio: "esp_click_ratio", + ActionRatio: "action_ratio", + AdItemClickCount: "ad_item_click_count", + EspLivePlayedSeconds: "esp_live_played_seconds", + PlayedThreeSeconds: "played_three_seconds", + Play3sRatio: "play3s_ratio", + PlayedFiveSeconds: "played_five_seconds", + Play5sRatio: "play5s_ratio", + PlayedEnd: "played_end", + PlayEndRatio: "play_end_ratio", + Share: "share", + Comment: "comment", + Likes: "likes", + Report: "report", + Block: "block", + ItemNegative: "item_negative", + LiveShare: "live_share", + LiveComment: "live_comment", + LiveReward: "live_reward", + EffectivePlayCount: "effective_play_count", + EffectivePlayRatio: "effective_play_ratio", + ConversionNum: "conversion_num", + ConversionCostEsp: "conversion_cost_esp", + Roi: "roi", + Gmv: "gmv", + T0Gmv: "t0_gmv", + T1Gmv: "t1_gmv", + T7Gmv: "t7_gmv", + T15Gmv: "t15_gmv", + T30Gmv: "t30_gmv", + T0Roi: "t0_roi", + T1Roi: "t1_roi", + T7Roi: "t7_roi", + T15Roi: "t15_roi", + T30Roi: "t30_roi", + PaiedOrder: "paied_order", + OrderRatio: "order_ratio", + T0OrderCnt: "t0_order_cnt", + T0OrderCntCost: "t0_order_cnt_cost", + T0OrderCntRatio: "t0_order_cnt_ratio", + T1OrderCnt: "t1_order_cnt", + T7OrderCnt: "t7_order_cnt", + T15OrderCnt: "t15_order_cnt", + T30OrderCnt: "t30_order_cnt", + MerchantRecoFans: "merchant_reco_fans", + T1Retention: "t1_retention", + T7Retention: "t7_retention", + T15Retention: "t15_retention", + T30Retention: "t30_retention", + T1RetentionRatio: "t1_retention_ratio", + T7RetentionRatio: "t7_retention_ratio", + T15RetentionRatio: "t15_retention_ratio", + T30RetentionRatio: "t30_retention_ratio", + ReservationSuccess: "reservation_success", + ReservationCost: "reservation_cost", + StandardLivePlayedStarted: "standard_live_played_started", + AdLivePlayCnt: "ad_live_play_cnt", + AdLivePlayCntCost: "ad_live_play_cnt_cost", + LiveAudienceCost: "live_audience_cost", + LiveEventGoodsView: "live_event_goods_view", + GoodsClickRatio: "goods_click_ratio", + DirectAttrPlatNewBuyerCnt: "direct_attr_plat_new_buyer_cnt", + T30AttrPlatTotalBuyerCnt: "t30_attr_plat_total_buyer_cnt", + DirectAttrSellerNewBuyerCnt: "direct_attr_seller_new_buyer_cnt", + T30AttrSellerTotalBuyerCnt: "t30_attr_seller_total_buyer_cnt", + T3Gmv: "t3_gmv", + T3OrderCnt: "t3_order_cnt", + T3Roi: "t3_roi", + T7IndirectOrderAmt: "t7_indirect_order_amt", + T7IndirectOrderCnt: "t7_indirect_order_cnt", + FansT0GmvPerFans: "fans_t0_gmv_per_fans", + FansT3GmvPerFans: "fans_t3_gmv_per_fans", + FansT7GmvPerFans: "fans_t7_gmv_per_fans", + FansT15GmvPerFans: "fans_t15_gmv_per_fans", + FansT30GmvPerFans: "fans_t30_gmv_per_fans", + RecoFansCost: "reco_fans_cost", + QcpxWhiteboxDirectOrderPaymentAmt: "qcpx_whitebox_direct_order_payment_amt", + QcpxWhiteboxDirectOrderCnt: "qcpx_whitebox_direct_order_cnt", + FansT0Gmv: "fans_t0_gmv", + FansT1Gmv: "fans_t1_gmv", + FansT7Gmv: "fans_t7_gmv", + FansT15Gmv: "fans_t15_gmv", + FansT30Gmv: "fans_t30_gmv", + FansT0Roi: "fans_t0_roi", + FansT1Roi: "fans_t1_roi", + FansT7Roi: "fans_t7_roi", + FansT15Roi: "fans_t15_roi", + FansT30Roi: "fans_t30_roi", + T0ShopNewBuyerOrderPaymentAmt: "t0_shop_new_buyer_order_payment_amt", + T1ShopNewBuyerOrderPaymentAmt: "t1_shop_new_buyer_order_payment_amt", + T3ShopNewBuyerOrderPaymentAmt: "t3_shop_new_buyer_order_payment_amt", + T7ShopNewBuyerOrderPaymentAmt: "t7_shop_new_buyer_order_payment_amt", + T15ShopNewBuyerOrderPaymentAmt: "t15_shop_new_buyer_order_payment_amt", + T30ShopNewBuyerOrderPaymentAmt: "t30_shop_new_buyer_order_payment_amt", + T0ShopNewBuyerOrderCnt: "t0_shop_new_buyer_order_cnt", + T1ShopNewBuyerOrderCnt: "t1_shop_new_buyer_order_cnt", + T3ShopNewBuyerOrderCnt: "t3_shop_new_buyer_order_cnt", + T7ShopNewBuyerOrderCnt: "t7_shop_new_buyer_order_cnt", + T15ShopNewBuyerOrderCnt: "t15_shop_new_buyer_order_cnt", + T30ShopNewBuyerOrderCnt: "t30_shop_new_buyer_order_cnt", + T1NewBuyerRepurchaseRatio: "t1_new_buyer_repurchase_ratio", + T3NewBuyerRepurchaseRatio: "t3_new_buyer_repurchase_ratio", + T7NewBuyerRepurchaseRatio: "t7_new_buyer_repurchase_ratio", + T15NewBuyerRepurchaseRatio: "t15_new_buyer_repurchase_ratio", + T30NewBuyerRepurchaseRatio: "t30_new_buyer_repurchase_ratio", + T0ShopNewBuyerRoi: "t0_shop_new_buyer_roi", + T1ShopNewBuyerRoi: "t1_shop_new_buyer_roi", + T3ShopNewBuyerRoi: "t3_shop_new_buyer_roi", + T7ShopNewBuyerRoi: "t7_shop_new_buyer_roi", + T15ShopNewBuyerRoi: "t15_shop_new_buyer_roi", + T30ShopNewBuyerRoi: "t30_shop_new_buyer_roi", + CreateCardOrderCnt: "create_card_order_cnt", + ForwardTsCreateCardOrderCnt: "forward_ts_create_card_order_cnt", + CreateCardOrderCost: "create_card_order_cost", + ForwardTsCreateCardOrderCost: "forward_ts_create_card_order_cost", + ActivateCardOrderCnt: "activate_card_order_cnt", + ForwardTsActivateCardOrderCnt: "forward_ts_activate_card_order_cnt", + ActivateCardOrderCost: "activate_card_order_cost", + ForwardTsActivateCardOrderCost: "forward_ts_activate_card_order_cost", + CreateCardOrderRatio: "create_card_order_ratio", + ForwardTsCreateCardOrderRatio: "forward_ts_create_card_order_ratio", + ActivateCardOrderCntRatio: "activate_card_order_cnt_ratio", + ForwardTsActivateCardOrderRatio: "forward_ts_activate_card_order_ratio", + LivePlayCnt: "live_play_cnt", + ItemEntranceClkCnt: "item_entrance_clk_cnt", + ShowCnt: "show_cnt", + ReportDateStr: "report_date_str", + CampaignId: "campaign_id", + CampaignName: "campaign_name", + UnitId: "unit_id", + UnitName: "unit_name", + CreativeId: "creative_id", + CreativeName: "creative_name", + CidActualRoiAfterSubsidy: "cid_actual_roi_after_subsidy", + CidCouponAmount: "cid_coupon_amount", + CidCouponCallbackPaidRefundAmount: "cid_coupon_callback_paid_refund_amount", + CidVoucherCost: "cid_voucher_cost", + } +} diff --git a/model/entity/copydata/material_report.go b/model/entity/copydata/material_report.go new file mode 100644 index 0000000..9eeb1f5 --- /dev/null +++ b/model/entity/copydata/material_report.go @@ -0,0 +1,576 @@ +package copydata + +import "gitea.com/red-future/common/beans" + +// MaterialReport 素材报表数据实体 +type MaterialReport struct { + beans.SQLBaseDO `orm:",inherit"` + + CreatedBy *string `orm:"created_by" json:"createdBy" description:"创建人"` + UpdatedBy *string `orm:"updated_by" json:"updatedBy" description:"更新人"` + T0OrderPaymentAmt *float64 `orm:"t0_order_payment_amt" json:"t0OrderPaymentAmt" description:"当日订单支付金额"` + CreativeMaterialType *string `orm:"creative_material_type" json:"creativeMaterialType" description:"创意素材类型"` + LiveName *string `orm:"live_name" json:"liveName" description:"直播间名称"` + AuthorId *string `orm:"author_id" json:"authorId" description:"作者 ID"` + PicUrl *string `orm:"pic_url" json:"picUrl" description:"图片 URL"` + PicName *string `orm:"pic_name" json:"picName" description:"图片名称"` + PicId *string `orm:"pic_id" json:"picId" description:"图片 ID"` + CoverUrl *string `orm:"cover_url" json:"coverUrl" description:"封面 URL"` + CoverId *int64 `orm:"cover_id" json:"coverId" description:"封面 ID"` + ItemOrderConversionRatio *float64 `orm:"item_order_conversion_ratio" json:"itemOrderConversionRatio" description:"商品订单转化率"` + ItemCardClickRatio *float64 `orm:"item_card_click_ratio" json:"itemCardClickRatio" description:"商品卡点击率"` + ItemCardClkCnt *int64 `orm:"item_card_clk_cnt" json:"itemCardClkCnt" description:"商品卡点击数"` + LivePlayCntCost *float64 `orm:"live_play_cnt_cost" json:"livePlayCntCost" description:"直播间观看成本"` + AdMerchantFollowCost *float64 `orm:"ad_merchant_follow_cost" json:"adMerchantFollowCost" description:"商家涨粉成本"` + AdMerchantFollow *int64 `orm:"ad_merchant_follow" json:"adMerchantFollow" description:"商家涨粉数"` + NetT0OrderCnt *int64 `orm:"net_t0_order_cnt" json:"netT0OrderCnt" description:"当日净成交订单数"` + NetT0Roi *float64 `orm:"net_t0_roi" json:"netT0Roi" description:"当日净成交 ROI"` + NetT0Gmv *float64 `orm:"net_t0_gmv" json:"netT0Gmv" description:"当日净成交 GMV"` + PhotoName *string `orm:"photo_name" json:"photoName" description:"照片名称"` + PhotoIdStr *string `orm:"photo_id_str" json:"photoIdStr" description:"照片 ID 字符串"` + PhotoId *string `orm:"photo_id" json:"photoId" description:"照片 ID"` + ModPriceSegment *string `orm:"mod_price_segment" json:"modPriceSegment" description:"价格区间"` + AgeSegment *string `orm:"age_segment" json:"ageSegment" description:"年龄段"` + Province *string `orm:"province" json:"province" description:"省份"` + Gender *string `orm:"gender" json:"gender" description:"性别"` + AdPhotoPlayedFiveRatio *float64 `orm:"ad_photo_played_five_ratio" json:"adPhotoPlayedFiveRatio" description:"广告照片播放 5 秒比率"` + AdPhotoPlayedThreeRatio *float64 `orm:"ad_photo_played_three_ratio" json:"adPhotoPlayedThreeRatio" description:"广告照片播放 3 秒比率"` + OrderSubmitRoi *float64 `orm:"order_submit_roi" json:"orderSubmitRoi" description:"提交订单 ROI"` + OrderSubmitAmt *int64 `orm:"order_submit_amt" json:"orderSubmitAmt" description:"提交订单金额"` + EventOrderSubmitCost *float64 `orm:"event_order_submit_cost" json:"eventOrderSubmitCost" description:"事件订单提交成本"` + EventOrderSubmit *int64 `orm:"event_order_submit" json:"eventOrderSubmit" description:"事件订单提交数"` + EventOrderPaidRoi *float64 `orm:"event_order_paid_roi" json:"eventOrderPaidRoi" description:"事件订单支付 ROI"` + EventAppInvoked *int64 `orm:"event_app_invoked" json:"eventAppInvoked" description:"事件 APP 调用数"` + EventAddShoppingCart *int64 `orm:"event_add_shopping_cart" json:"eventAddShoppingCart" description:"事件加购数"` + ConversionNumCost *float64 `orm:"conversion_num_cost" json:"conversionNumCost" description:"转化数量成本"` + AdEffectivePlayNum *int64 `orm:"ad_effective_play_num" json:"adEffectivePlayNum" description:"广告有效播放数"` + AdItemClick *int64 `orm:"ad_item_click" json:"adItemClick" description:"广告商品点击数"` + MerchantProductId *string `orm:"merchant_product_id" json:"merchantProductId" description:"商家商品 ID"` + CostTotal *float64 `orm:"cost_total" json:"costTotal" description:"总花费"` + AdShow *int64 `orm:"ad_show" json:"adShow" description:"广告展示数"` + AdShow1kCost *float64 `orm:"ad_show1k_cost" json:"adShow1kCost" description:"千次展示成本"` + Impression *int64 `orm:"impression" json:"impression" description:"曝光数"` + PhotoClick *int64 `orm:"photo_click" json:"photoClick" description:"照片点击数"` + PhotoClickRatio *float64 `orm:"photo_click_ratio" json:"photoClickRatio" description:"照片点击率"` + Click *int64 `orm:"click" json:"click" description:"点击数"` + ActionbarClick *int64 `orm:"actionbar_click" json:"actionbarClick" description:"操作栏点击数"` + ActionbarClickCost *float64 `orm:"actionbar_click_cost" json:"actionbarClickCost" description:"操作栏点击成本"` + EspClickRatio *float64 `orm:"esp_click_ratio" json:"espClickRatio" description:"ESP 点击率"` + ActionRatio *float64 `orm:"action_ratio" json:"actionRatio" description:"操作比率"` + AdItemCount *int64 `orm:"ad_item_click_count" json:"adItemCount" description:"广告商品点击次数"` + EspLivePlayedSeconds *int64 `orm:"esp_live_played_seconds" json:"espLivePlayedSeconds" description:"ESP 直播播放秒数"` + PlayedThreeSeconds *int64 `orm:"played_three_seconds" json:"playedThreeSeconds" description:"播放 3 秒数"` + Play3sRatio *float64 `orm:"play3s_ratio" json:"play3sRatio" description:"3 秒播放率"` + PlayedFiveSeconds *int64 `orm:"played_five_seconds" json:"playedFiveSeconds" description:"播放 5 秒数"` + Play5sRatio *float64 `orm:"play5s_ratio" json:"play5sRatio" description:"5 秒播放率"` + PlayedEnd *int64 `orm:"played_end" json:"playedEnd" description:"播放结束数"` + PlayEndRatio *float64 `orm:"play_end_ratio" json:"playEndRatio" description:"完播率"` + Share *int64 `orm:"share" json:"share" description:"分享数"` + Comment *int64 `orm:"comment" json:"comment" description:"评论数"` + Likes *int64 `orm:"likes" json:"likes" description:"点赞数"` + Report *int64 `orm:"report" json:"report" description:"举报数"` + Block *int64 `orm:"block" json:"block" description:"拉黑数"` + ItemNegative *int64 `orm:"item_negative" json:"itemNegative" description:"商品负反馈数"` + LiveShare *int64 `orm:"live_share" json:"liveShare" description:"直播分享数"` + LiveComment *int64 `orm:"live_comment" json:"liveComment" description:"直播评论数"` + LiveReward *int64 `orm:"live_reward" json:"liveReward" description:"直播打赏数"` + EffectivePlayCount *int64 `orm:"effective_play_count" json:"effectivePlayCount" description:"有效播放数"` + EffectivePlayRatio *float64 `orm:"effective_play_ratio" json:"effectivePlayRatio" description:"有效播放率"` + ConversionNum *int64 `orm:"conversion_num" json:"conversionNum" description:"转化数"` + ConversionCostEsp *float64 `orm:"conversion_cost_esp" json:"conversionCostEsp" description:"转化成本 ESP"` + Roi *float64 `orm:"roi" json:"roi" description:"ROI"` + Gmv *float64 `orm:"gmv" json:"gmv" description:"GMV"` + T0Gmv *float64 `orm:"t0_gmv" json:"t0Gmv" description:"当日 GMV"` + T1Gmv *float64 `orm:"t1_gmv" json:"t1Gmv" description:"次日 GMV"` + T7Gmv *float64 `orm:"t7_gmv" json:"t7Gmv" description:"7 日 GMV"` + T15Gmv *float64 `orm:"t15_gmv" json:"t15Gmv" description:"15 日 GMV"` + T30Gmv *float64 `orm:"t30_gmv" json:"t30Gmv" description:"30 日 GMV"` + T0Roi *float64 `orm:"t0_roi" json:"t0Roi" description:"当日 ROI"` + T1Roi *float64 `orm:"t1_roi" json:"t1Roi" description:"次日 ROI"` + T7Roi *float64 `orm:"t7_roi" json:"t7Roi" description:"7 日 ROI"` + T15Roi *float64 `orm:"t15_roi" json:"t15Roi" description:"15 日 ROI"` + T30Roi *float64 `orm:"t30_roi" json:"t30Roi" description:"30 日 ROI"` + PaiedOrder *int64 `orm:"paied_order" json:"paiedOrder" description:"支付订单数"` + OrderRatio *float64 `orm:"order_ratio" json:"orderRatio" description:"订单比率"` + T0OrderCnt *int64 `orm:"t0_order_cnt" json:"t0OrderCnt" description:"当日订单数"` + T0OrderCntCost *float64 `orm:"t0_order_cnt_cost" json:"t0OrderCntCost" description:"当日订单成本"` + T0OrderCntRatio *float64 `orm:"t0_order_cnt_ratio" json:"t0OrderCntRatio" description:"当日订单比率"` + T1OrderCnt *int64 `orm:"t1_order_cnt" json:"t1OrderCnt" description:"次日订单数"` + T7OrderCnt *int64 `orm:"t7_order_cnt" json:"t7OrderCnt" description:"7 日订单数"` + T15OrderCnt *int64 `orm:"t15_order_cnt" json:"t15OrderCnt" description:"15 日订单数"` + T30OrderCnt *int64 `orm:"t30_order_cnt" json:"t30OrderCnt" description:"30 日订单数"` + MerchantRecoFans *int64 `orm:"merchant_reco_fans" json:"merchantRecoFans" description:"商家推荐粉丝数"` + T1Retention *float64 `orm:"t1_retention" json:"t1Retention" description:"次日留存率"` + T7Retention *float64 `orm:"t7_retention" json:"t7Retention" description:"7 日留存率"` + T15Retention *float64 `orm:"t15_retention" json:"t15Retention" description:"15 日留存率"` + T30Retention *float64 `orm:"t30_retention" json:"t30Retention" description:"30 日留存率"` + T1RetentionRatio *float64 `orm:"t1_retention_ratio" json:"t1RetentionRatio" description:"次日留存比率"` + T7RetentionRatio *float64 `orm:"t7_retention_ratio" json:"t7RetentionRatio" description:"7 日留存比率"` + T15RetentionRatio *float64 `orm:"t15_retention_ratio" json:"t15RetentionRatio" description:"15 日留存比率"` + T30RetentionRatio *float64 `orm:"t30_retention_ratio" json:"t30RetentionRatio" description:"30 日留存比率"` + ReservationSuccess *int64 `orm:"reservation_success" json:"reservationSuccess" description:"预约成功数"` + ReservationCost *float64 `orm:"reservation_cost" json:"reservationCost" description:"预约成本"` + StandardLivePlayedStarted *int64 `orm:"standard_live_played_started" json:"standardLivePlayedStarted" description:"标准直播开始数"` + AdLivePlayCnt *int64 `orm:"ad_live_play_cnt" json:"adLivePlayCnt" description:"广告直播播放数"` + AdLivePlayCntCost *float64 `orm:"ad_live_play_cnt_cost" json:"adLivePlayCntCost" description:"广告直播播放成本"` + LiveAudienceCost *float64 `orm:"live_audience_cost" json:"liveAudienceCost" description:"直播观众成本"` + LiveEventGoodsView *int64 `orm:"live_event_goods_view" json:"liveEventGoodsView" description:"直播事件商品浏览数"` + GoodsClickRatio *float64 `orm:"goods_click_ratio" json:"goodsClickRatio" description:"商品点击率"` + DirectAttrPlatNewBuyerCnt *int64 `orm:"direct_attr_plat_new_buyer_cnt" json:"directAttrPlatNewBuyerCnt" description:"直接吸引平台新买家数"` + T30AttrPlatTotalBuyerCnt *int64 `orm:"t30_attr_plat_total_buyer_cnt" json:"t30AttrPlatTotalBuyerCnt" description:"30 日吸引平台总买家数"` + DirectAttrSellerNewBuyerCnt *int64 `orm:"direct_attr_seller_new_buyer_cnt" json:"directAttrSellerNewBuyerCnt" description:"直接吸引商家新买家数"` + T30AttrSellerTotalBuyerCnt *int64 `orm:"t30_attr_seller_total_buyer_cnt" json:"t30AttrSellerTotalBuyerCnt" description:"30 日吸引商家总买家数"` + T3Gmv *float64 `orm:"t3_gmv" json:"t3Gmv" description:"3 日 GMV"` + T3OrderCnt *int64 `orm:"t3_order_cnt" json:"t3OrderCnt" description:"3 日订单数"` + T3Roi *float64 `orm:"t3_roi" json:"t3Roi" description:"3 日 ROI"` + T7IndirectOrderAmt *float64 `orm:"t7_indirect_order_amt" json:"t7IndirectOrderAmt" description:"7 日间接订单金额"` + T7IndirectOrderCnt *int64 `orm:"t7_indirect_order_cnt" json:"t7IndirectOrderCnt" description:"7 日间接订单数"` + FansT0GmvPerFans *float64 `orm:"fans_t0_gmv_per_fans" json:"fansT0GmvPerFans" description:"粉丝当日人均 GMV"` + FansT3GmvPerFans *float64 `orm:"fans_t3_gmv_per_fans" json:"fansT3GmvPerFans" description:"粉丝 3 日人均 GMV"` + FansT7GmvPerFans *float64 `orm:"fans_t7_gmv_per_fans" json:"fansT7GmvPerFans" description:"粉丝 7 日人均 GMV"` + FansT15GmvPerFans *float64 `orm:"fans_t15_gmv_per_fans" json:"fansT15GmvPerFans" description:"粉丝 15 日人均 GMV"` + FansT30GmvPerFans *float64 `orm:"fans_t30_gmv_per_fans" json:"fansT30GmvPerFans" description:"粉丝 30 日人均 GMV"` + RecoFansCost *float64 `orm:"reco_fans_cost" json:"recoFansCost" description:"推荐粉丝成本"` + QcpxWhiteboxDirectOrderPaymentAmt *float64 `orm:"qcpx_whitebox_direct_order_payment_amt" json:"qcpxWhiteboxDirectOrderPaymentAmt" description:"白盒直接订单支付金额"` + QcpxWhiteboxDirectOrderCnt *int64 `orm:"qcpx_whitebox_direct_order_cnt" json:"qcpxWhiteboxDirectOrderCnt" description:"白盒直接订单数"` + FansT0Gmv *float64 `orm:"fans_t0_gmv" json:"fansT0Gmv" description:"粉丝当日 GMV"` + FansT1Gmv *float64 `orm:"fans_t1_gmv" json:"fansT1Gmv" description:"粉丝次日 GMV"` + FansT7Gmv *float64 `orm:"fans_t7_gmv" json:"fansT7Gmv" description:"粉丝 7 日 GMV"` + FansT15Gmv *float64 `orm:"fans_t15_gmv" json:"fansT15Gmv" description:"粉丝 15 日 GMV"` + FansT30Gmv *float64 `orm:"fans_t30_gmv" json:"fansT30Gmv" description:"粉丝 30 日 GMV"` + FansT0Roi *float64 `orm:"fans_t0_roi" json:"fansT0Roi" description:"粉丝当日 ROI"` + FansT1Roi *float64 `orm:"fans_t1_roi" json:"fansT1Roi" description:"粉丝次日 ROI"` + FansT7Roi *float64 `orm:"fans_t7_roi" json:"fansT7Roi" description:"粉丝 7 日 ROI"` + FansT15Roi *float64 `orm:"fans_t15_roi" json:"fansT15Roi" description:"粉丝 15 日 ROI"` + FansT30Roi *float64 `orm:"fans_t30_roi" json:"fansT30Roi" description:"粉丝 30 日 ROI"` + T0ShopNewBuyerOrderPaymentAmt *float64 `orm:"t0_shop_new_buyer_order_payment_amt" json:"t0ShopNewBuyerOrderPaymentAmt" description:"当日店铺新客订单支付金额"` + T1ShopNewBuyerOrderPaymentAmt *float64 `orm:"t1_shop_new_buyer_order_payment_amt" json:"t1ShopNewBuyerOrderPaymentAmt" description:"次日店铺新客订单支付金额"` + T3ShopNewBuyerOrderPaymentAmt *float64 `orm:"t3_shop_new_buyer_order_payment_amt" json:"t3ShopNewBuyerOrderPaymentAmt" description:"3 日店铺新客订单支付金额"` + T7ShopNewBuyerOrderPaymentAmt *float64 `orm:"t7_shop_new_buyer_order_payment_amt" json:"t7ShopNewBuyerOrderPaymentAmt" description:"7 日店铺新客订单支付金额"` + T15ShopNewBuyerOrderPaymentAmt *float64 `orm:"t15_shop_new_buyer_order_payment_amt" json:"t15ShopNewBuyerOrderPaymentAmt" description:"15 日店铺新客订单支付金额"` + T30ShopNewBuyerOrderPaymentAmt *float64 `orm:"t30_shop_new_buyer_order_payment_amt" json:"t30ShopNewBuyerOrderPaymentAmt" description:"30 日店铺新客订单支付金额"` + T0ShopNewBuyerOrderCnt *int64 `orm:"t0_shop_new_buyer_order_cnt" json:"t0ShopNewBuyerOrderCnt" description:"当日店铺新客订单数"` + T1ShopNewBuyerOrderCnt *int64 `orm:"t1_shop_new_buyer_order_cnt" json:"t1ShopNewBuyerOrderCnt" description:"次日店铺新客订单数"` + T3ShopNewBuyerOrderCnt *int64 `orm:"t3_shop_new_buyer_order_cnt" json:"t3ShopNewBuyerOrderCnt" description:"3 日店铺新客订单数"` + T7ShopNewBuyerOrderCnt *int64 `orm:"t7_shop_new_buyer_order_cnt" json:"t7ShopNewBuyerOrderCnt" description:"7 日店铺新客订单数"` + T15ShopNewBuyerOrderCnt *int64 `orm:"t15_shop_new_buyer_order_cnt" json:"t15ShopNewBuyerOrderCnt" description:"15 日店铺新客订单数"` + T30ShopNewBuyerOrderCnt *int64 `orm:"t30_shop_new_buyer_order_cnt" json:"t30ShopNewBuyerOrderCnt" description:"30 日店铺新客订单数"` + T1NewBuyerRepurchaseRatio *float64 `orm:"t1_new_buyer_repurchase_ratio" json:"t1NewBuyerRepurchaseRatio" description:"次日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `orm:"t3_new_buyer_repurchase_ratio" json:"t3NewBuyerRepurchaseRatio" description:"3 日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `orm:"t7_new_buyer_repurchase_ratio" json:"t7NewBuyerRepurchaseRatio" description:"7 日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `orm:"t15_new_buyer_repurchase_ratio" json:"t15NewBuyerRepurchaseRatio" description:"15 日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `orm:"t30_new_buyer_repurchase_ratio" json:"t30NewBuyerRepurchaseRatio" description:"30 日新客复购率"` + T0ShopNewBuyerRoi *float64 `orm:"t0_shop_new_buyer_roi" json:"t0ShopNewBuyerRoi" description:"当日店铺新客 ROI"` + T1ShopNewBuyerRoi *float64 `orm:"t1_shop_new_buyer_roi" json:"t1ShopNewBuyerRoi" description:"次日店铺新客 ROI"` + T3ShopNewBuyerRoi *float64 `orm:"t3_shop_new_buyer_roi" json:"t3ShopNewBuyerRoi" description:"3 日店铺新客 ROI"` + T7ShopNewBuyerRoi *float64 `orm:"t7_shop_new_buyer_roi" json:"t7ShopNewBuyerRoi" description:"7 日店铺新客 ROI"` + T15ShopNewBuyerRoi *float64 `orm:"t15_shop_new_buyer_roi" json:"t15ShopNewBuyerRoi" description:"15 日店铺新客 ROI"` + T30ShopNewBuyerRoi *float64 `orm:"t30_shop_new_buyer_roi" json:"t30ShopNewBuyerRoi" description:"30 日店铺新客 ROI"` + CreateCardOrderCnt *int64 `orm:"create_card_order_cnt" json:"createCardOrderCnt" description:"创建卡片订单数"` + ForwardTsCreateCardOrderCnt *int64 `orm:"forward_ts_create_card_order_cnt" json:"forwardTsCreateCardOrderCnt" description:"转发 TS 创建卡片订单数"` + CreateCardOrderCost *float64 `orm:"create_card_order_cost" json:"createCardOrderCost" description:"创建卡片订单成本"` + ForwardTsCreateCardOrderCost *float64 `orm:"forward_ts_create_card_order_cost" json:"forwardTsCreateCardOrderCost" description:"转发 TS 创建卡片订单成本"` + ActivateCardOrderCnt *int64 `orm:"activate_card_order_cnt" json:"activateCardOrderCnt" description:"激活卡片订单数"` + ForwardTsActivateCardOrderCnt *int64 `orm:"forward_ts_activate_card_order_cnt" json:"forwardTsActivateCardOrderCnt" description:"转发 TS 激活卡片订单数"` + ActivateCardOrderCost *float64 `orm:"activate_card_order_cost" json:"activateCardOrderCost" description:"激活卡片订单成本"` + ForwardTsActivateCardOrderCost *float64 `orm:"forward_ts_activate_card_order_cost" json:"forwardTsActivateCardOrderCost" description:"转发 TS 激活卡片订单成本"` + CreateCardOrderRatio *float64 `orm:"create_card_order_ratio" json:"createCardOrderRatio" description:"创建卡片订单比率"` + ForwardTsCreateCardOrderRatio *float64 `orm:"forward_ts_create_card_order_ratio" json:"forwardTsCreateCardOrderRatio" description:"转发 TS 创建卡片订单比率"` + ActivateCardOrderCntRatio *float64 `orm:"activate_card_order_cnt_ratio" json:"activateCardOrderCntRatio" description:"激活卡片订单比率"` + ForwardTsActivateCardOrderRatio *float64 `orm:"forward_ts_activate_card_order_ratio" json:"forwardTsActivateCardOrderRatio" description:"转发 TS 激活卡片订单比率"` + LivePlayCnt *int64 `orm:"live_play_cnt" json:"livePlayCnt" description:"直播播放数"` + ItemEntranceClkCnt *int64 `orm:"item_entrance_clk_cnt" json:"itemEntranceClkCnt" description:"商品入口点击数"` + ShowCnt *int64 `orm:"show_cnt" json:"showCnt" description:"展示数"` + ReportDateStr string `orm:"report_date_str" json:"reportDateStr" description:"报告日期(格式:YYYY-MM-DD)"` + CampaignId *int64 `orm:"campaign_id" json:"campaignId" description:"计划 ID"` + CampaignName *string `orm:"campaign_name" json:"campaignName" description:"计划名称"` + UnitId *int64 `orm:"unit_id" json:"unitId" description:"单元 ID"` + UnitName *string `orm:"unit_name" json:"unitName" description:"单元名称"` + CreativeId *int64 `orm:"creative_id" json:"creativeId" description:"创意 ID"` + CreativeName *string `orm:"creative_name" json:"creativeName" description:"创意名称"` +} + +// MaterialReportCol 素材报表数据表字段定义 +type MaterialReportCol struct { + beans.SQLBaseCol + CreatedBy string + UpdatedBy string + T0OrderPaymentAmt string + CreativeMaterialType string + LiveName string + AuthorId string + PicUrl string + PicName string + PicId string + CoverUrl string + CoverId string + ItemOrderConversionRatio string + ItemCardClickRatio string + ItemCardClkCnt string + LivePlayCntCost string + AdMerchantFollowCost string + AdMerchantFollow string + NetT0OrderCnt string + NetT0Roi string + NetT0Gmv string + PhotoName string + PhotoIdStr string + PhotoId string + ModPriceSegment string + AgeSegment string + Province string + Gender string + AdPhotoPlayedFiveRatio string + AdPhotoPlayedThreeRatio string + OrderSubmitRoi string + OrderSubmitAmt string + EventOrderSubmitCost string + EventOrderSubmit string + EventOrderPaidRoi string + EventAppInvoked string + EventAddShoppingCart string + ConversionNumCost string + AdEffectivePlayNum string + AdItemClick string + MerchantProductId string + CostTotal string + AdShow string + AdShow1kCost string + Impression string + PhotoClick string + PhotoClickRatio string + Click string + ActionbarClick string + ActionbarClickCost string + EspClickRatio string + ActionRatio string + AdItemCount string + EspLivePlayedSeconds string + PlayedThreeSeconds string + Play3sRatio string + PlayedFiveSeconds string + Play5sRatio string + PlayedEnd string + PlayEndRatio string + Share string + Comment string + Likes string + Report string + Block string + ItemNegative string + LiveShare string + LiveComment string + LiveReward string + EffectivePlayCount string + EffectivePlayRatio string + ConversionNum string + ConversionCostEsp string + Roi string + Gmv string + T0Gmv string + T1Gmv string + T7Gmv string + T15Gmv string + T30Gmv string + T0Roi string + T1Roi string + T7Roi string + T15Roi string + T30Roi string + PaiedOrder string + OrderRatio string + T0OrderCnt string + T0OrderCntCost string + T0OrderCntRatio string + T1OrderCnt string + T7OrderCnt string + T15OrderCnt string + T30OrderCnt string + MerchantRecoFans string + T1Retention string + T7Retention string + T15Retention string + T30Retention string + T1RetentionRatio string + T7RetentionRatio string + T15RetentionRatio string + T30RetentionRatio string + ReservationSuccess string + ReservationCost string + StandardLivePlayedStarted string + AdLivePlayCnt string + AdLivePlayCntCost string + LiveAudienceCost string + LiveEventGoodsView string + GoodsClickRatio string + DirectAttrPlatNewBuyerCnt string + T30AttrPlatTotalBuyerCnt string + DirectAttrSellerNewBuyerCnt string + T30AttrSellerTotalBuyerCnt string + T3Gmv string + T3OrderCnt string + T3Roi string + T7IndirectOrderAmt string + T7IndirectOrderCnt string + FansT0GmvPerFans string + FansT3GmvPerFans string + FansT7GmvPerFans string + FansT15GmvPerFans string + FansT30GmvPerFans string + RecoFansCost string + QcpxWhiteboxDirectOrderPaymentAmt string + QcpxWhiteboxDirectOrderCnt string + FansT0Gmv string + FansT1Gmv string + FansT7Gmv string + FansT15Gmv string + FansT30Gmv string + FansT0Roi string + FansT1Roi string + FansT7Roi string + FansT15Roi string + FansT30Roi string + T0ShopNewBuyerOrderPaymentAmt string + T1ShopNewBuyerOrderPaymentAmt string + T3ShopNewBuyerOrderPaymentAmt string + T7ShopNewBuyerOrderPaymentAmt string + T15ShopNewBuyerOrderPaymentAmt string + T30ShopNewBuyerOrderPaymentAmt string + T0ShopNewBuyerOrderCnt string + T1ShopNewBuyerOrderCnt string + T3ShopNewBuyerOrderCnt string + T7ShopNewBuyerOrderCnt string + T15ShopNewBuyerOrderCnt string + T30ShopNewBuyerOrderCnt string + T1NewBuyerRepurchaseRatio string + T3NewBuyerRepurchaseRatio string + T7NewBuyerRepurchaseRatio string + T15NewBuyerRepurchaseRatio string + T30NewBuyerRepurchaseRatio string + T0ShopNewBuyerRoi string + T1ShopNewBuyerRoi string + T3ShopNewBuyerRoi string + T7ShopNewBuyerRoi string + T15ShopNewBuyerRoi string + T30ShopNewBuyerRoi string + CreateCardOrderCnt string + ForwardTsCreateCardOrderCnt string + CreateCardOrderCost string + ForwardTsCreateCardOrderCost string + ActivateCardOrderCnt string + ForwardTsActivateCardOrderCnt string + ActivateCardOrderCost string + ForwardTsActivateCardOrderCost string + CreateCardOrderRatio string + ForwardTsCreateCardOrderRatio string + ActivateCardOrderCntRatio string + ForwardTsActivateCardOrderRatio string + LivePlayCnt string + ItemEntranceClkCnt string + ShowCnt string + ReportDateStr string + CampaignId string + CampaignName string + UnitId string + UnitName string + CreativeId string + CreativeName string +} + +// TableName 返回表名 +func (e *MaterialReport) TableName() string { + return "material_report" +} + +// GetCols 获取所有字段名 +func (e *MaterialReport) GetCols() *MaterialReportCol { + return &MaterialReportCol{ + SQLBaseCol: beans.SQLBaseCol{ + Id: "id", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + }, + CreatedBy: "created_by", + UpdatedBy: "updated_by", + T0OrderPaymentAmt: "t0_order_payment_amt", + CreativeMaterialType: "creative_material_type", + LiveName: "live_name", + AuthorId: "author_id", + PicUrl: "pic_url", + PicName: "pic_name", + PicId: "pic_id", + CoverUrl: "cover_url", + CoverId: "cover_id", + ItemOrderConversionRatio: "item_order_conversion_ratio", + ItemCardClickRatio: "item_card_click_ratio", + ItemCardClkCnt: "item_card_clk_cnt", + LivePlayCntCost: "live_play_cnt_cost", + AdMerchantFollowCost: "ad_merchant_follow_cost", + AdMerchantFollow: "ad_merchant_follow", + NetT0OrderCnt: "net_t0_order_cnt", + NetT0Roi: "net_t0_roi", + NetT0Gmv: "net_t0_gmv", + PhotoName: "photo_name", + PhotoIdStr: "photo_id_str", + PhotoId: "photo_id", + ModPriceSegment: "mod_price_segment", + AgeSegment: "age_segment", + Province: "province", + Gender: "gender", + AdPhotoPlayedFiveRatio: "ad_photo_played_five_ratio", + AdPhotoPlayedThreeRatio: "ad_photo_played_three_ratio", + OrderSubmitRoi: "order_submit_roi", + OrderSubmitAmt: "order_submit_amt", + EventOrderSubmitCost: "event_order_submit_cost", + EventOrderSubmit: "event_order_submit", + EventOrderPaidRoi: "event_order_paid_roi", + EventAppInvoked: "event_app_invoked", + EventAddShoppingCart: "event_add_shopping_cart", + ConversionNumCost: "conversion_num_cost", + AdEffectivePlayNum: "ad_effective_play_num", + AdItemClick: "ad_item_click", + MerchantProductId: "merchant_product_id", + CostTotal: "cost_total", + AdShow: "ad_show", + AdShow1kCost: "ad_show1k_cost", + Impression: "impression", + PhotoClick: "photo_click", + PhotoClickRatio: "photo_click_ratio", + Click: "click", + ActionbarClick: "actionbar_click", + ActionbarClickCost: "actionbar_click_cost", + EspClickRatio: "esp_click_ratio", + ActionRatio: "action_ratio", + AdItemCount: "ad_item_click_count", + EspLivePlayedSeconds: "esp_live_played_seconds", + PlayedThreeSeconds: "played_three_seconds", + Play3sRatio: "play3s_ratio", + PlayedFiveSeconds: "played_five_seconds", + Play5sRatio: "play5s_ratio", + PlayedEnd: "played_end", + PlayEndRatio: "play_end_ratio", + Share: "share", + Comment: "comment", + Likes: "likes", + Report: "report", + Block: "block", + ItemNegative: "item_negative", + LiveShare: "live_share", + LiveComment: "live_comment", + LiveReward: "live_reward", + EffectivePlayCount: "effective_play_count", + EffectivePlayRatio: "effective_play_ratio", + ConversionNum: "conversion_num", + ConversionCostEsp: "conversion_cost_esp", + Roi: "roi", + Gmv: "gmv", + T0Gmv: "t0_gmv", + T1Gmv: "t1_gmv", + T7Gmv: "t7_gmv", + T15Gmv: "t15_gmv", + T30Gmv: "t30_gmv", + T0Roi: "t0_roi", + T1Roi: "t1_roi", + T7Roi: "t7_roi", + T15Roi: "t15_roi", + T30Roi: "t30_roi", + PaiedOrder: "paied_order", + OrderRatio: "order_ratio", + T0OrderCnt: "t0_order_cnt", + T0OrderCntCost: "t0_order_cnt_cost", + T0OrderCntRatio: "t0_order_cnt_ratio", + T1OrderCnt: "t1_order_cnt", + T7OrderCnt: "t7_order_cnt", + T15OrderCnt: "t15_order_cnt", + T30OrderCnt: "t30_order_cnt", + MerchantRecoFans: "merchant_reco_fans", + T1Retention: "t1_retention", + T7Retention: "t7_retention", + T15Retention: "t15_retention", + T30Retention: "t30_retention", + T1RetentionRatio: "t1_retention_ratio", + T7RetentionRatio: "t7_retention_ratio", + T15RetentionRatio: "t15_retention_ratio", + T30RetentionRatio: "t30_retention_ratio", + ReservationSuccess: "reservation_success", + ReservationCost: "reservation_cost", + StandardLivePlayedStarted: "standard_live_played_started", + AdLivePlayCnt: "ad_live_play_cnt", + AdLivePlayCntCost: "ad_live_play_cnt_cost", + LiveAudienceCost: "live_audience_cost", + LiveEventGoodsView: "live_event_goods_view", + GoodsClickRatio: "goods_click_ratio", + DirectAttrPlatNewBuyerCnt: "direct_attr_plat_new_buyer_cnt", + T30AttrPlatTotalBuyerCnt: "t30_attr_plat_total_buyer_cnt", + DirectAttrSellerNewBuyerCnt: "direct_attr_seller_new_buyer_cnt", + T30AttrSellerTotalBuyerCnt: "t30_attr_seller_total_buyer_cnt", + T3Gmv: "t3_gmv", + T3OrderCnt: "t3_order_cnt", + T3Roi: "t3_roi", + T7IndirectOrderAmt: "t7_indirect_order_amt", + T7IndirectOrderCnt: "t7_indirect_order_cnt", + FansT0GmvPerFans: "fans_t0_gmv_per_fans", + FansT3GmvPerFans: "fans_t3_gmv_per_fans", + FansT7GmvPerFans: "fans_t7_gmv_per_fans", + FansT15GmvPerFans: "fans_t15_gmv_per_fans", + FansT30GmvPerFans: "fans_t30_gmv_per_fans", + RecoFansCost: "reco_fans_cost", + QcpxWhiteboxDirectOrderPaymentAmt: "qcpx_whitebox_direct_order_payment_amt", + QcpxWhiteboxDirectOrderCnt: "qcpx_whitebox_direct_order_cnt", + FansT0Gmv: "fans_t0_gmv", + FansT1Gmv: "fans_t1_gmv", + FansT7Gmv: "fans_t7_gmv", + FansT15Gmv: "fans_t15_gmv", + FansT30Gmv: "fans_t30_gmv", + FansT0Roi: "fans_t0_roi", + FansT1Roi: "fans_t1_roi", + FansT7Roi: "fans_t7_roi", + FansT15Roi: "fans_t15_roi", + FansT30Roi: "fans_t30_roi", + T0ShopNewBuyerOrderPaymentAmt: "t0_shop_new_buyer_order_payment_amt", + T1ShopNewBuyerOrderPaymentAmt: "t1_shop_new_buyer_order_payment_amt", + T3ShopNewBuyerOrderPaymentAmt: "t3_shop_new_buyer_order_payment_amt", + T7ShopNewBuyerOrderPaymentAmt: "t7_shop_new_buyer_order_payment_amt", + T15ShopNewBuyerOrderPaymentAmt: "t15_shop_new_buyer_order_payment_amt", + T30ShopNewBuyerOrderPaymentAmt: "t30_shop_new_buyer_order_payment_amt", + T0ShopNewBuyerOrderCnt: "t0_shop_new_buyer_order_cnt", + T1ShopNewBuyerOrderCnt: "t1_shop_new_buyer_order_cnt", + T3ShopNewBuyerOrderCnt: "t3_shop_new_buyer_order_cnt", + T7ShopNewBuyerOrderCnt: "t7_shop_new_buyer_order_cnt", + T15ShopNewBuyerOrderCnt: "t15_shop_new_buyer_order_cnt", + T30ShopNewBuyerOrderCnt: "t30_shop_new_buyer_order_cnt", + T1NewBuyerRepurchaseRatio: "t1_new_buyer_repurchase_ratio", + T3NewBuyerRepurchaseRatio: "t3_new_buyer_repurchase_ratio", + T7NewBuyerRepurchaseRatio: "t7_new_buyer_repurchase_ratio", + T15NewBuyerRepurchaseRatio: "t15_new_buyer_repurchase_ratio", + T30NewBuyerRepurchaseRatio: "t30_new_buyer_repurchase_ratio", + T0ShopNewBuyerRoi: "t0_shop_new_buyer_roi", + T1ShopNewBuyerRoi: "t1_shop_new_buyer_roi", + T3ShopNewBuyerRoi: "t3_shop_new_buyer_roi", + T7ShopNewBuyerRoi: "t7_shop_new_buyer_roi", + T15ShopNewBuyerRoi: "t15_shop_new_buyer_roi", + T30ShopNewBuyerRoi: "t30_shop_new_buyer_roi", + CreateCardOrderCnt: "create_card_order_cnt", + ForwardTsCreateCardOrderCnt: "forward_ts_create_card_order_cnt", + CreateCardOrderCost: "create_card_order_cost", + ForwardTsCreateCardOrderCost: "forward_ts_create_card_order_cost", + ActivateCardOrderCnt: "activate_card_order_cnt", + ForwardTsActivateCardOrderCnt: "forward_ts_activate_card_order_cnt", + ActivateCardOrderCost: "activate_card_order_cost", + ForwardTsActivateCardOrderCost: "forward_ts_activate_card_order_cost", + CreateCardOrderRatio: "create_card_order_ratio", + ForwardTsCreateCardOrderRatio: "forward_ts_create_card_order_ratio", + ActivateCardOrderCntRatio: "activate_card_order_cnt_ratio", + ForwardTsActivateCardOrderRatio: "forward_ts_activate_card_order_ratio", + LivePlayCnt: "live_play_cnt", + ItemEntranceClkCnt: "item_entrance_clk_cnt", + ShowCnt: "show_cnt", + ReportDateStr: "report_date_str", + CampaignId: "campaign_id", + CampaignName: "campaign_name", + UnitId: "unit_id", + UnitName: "unit_name", + CreativeId: "creative_id", + CreativeName: "creative_name", + } +} diff --git a/model/entity/copydata/population_report.go b/model/entity/copydata/population_report.go new file mode 100644 index 0000000..9220a62 --- /dev/null +++ b/model/entity/copydata/population_report.go @@ -0,0 +1,578 @@ +package copydata + +import "gitea.com/red-future/common/beans" + +// PopulationReport 人群报表实体 +type PopulationReport struct { + beans.SQLBaseDO `orm:",inherit"` + + // 基础信息字段 + PhotoName string `orm:"photo_name" json:"photoName" description:"视频名称"` + PhotoIdStr string `orm:"photo_id_str" json:"photoIdStr" description:"视频 id"` + PhotoId string `orm:"photo_id" json:"photoId" description:"视频 id"` + ModPriceSegment string `orm:"mod_price_segment" json:"modPriceSegment" description:"设备价格区间"` + AgeSegment string `orm:"age_segment" json:"ageSegment" description:"年龄段"` + Province string `orm:"province" json:"province" description:"省份名称"` + Gender string `orm:"gender" json:"gender" description:"性别"` + MerchantProductId string `orm:"merchant_product_id" json:"merchantProductId" description:"商品 ID"` + ReportDateStr string `orm:"report_date_str" json:"reportDateStr" description:"时间"` + + // 广告结构字段 + CampaignId *int64 `orm:"campaign_id" json:"campaignId" description:"计划 ID"` + CampaignName string `orm:"campaign_name" json:"campaignName" description:"计划名称"` + UnitId *int64 `orm:"unit_id" json:"unitId" description:"单元 ID"` + UnitName string `orm:"unit_name" json:"unitName" description:"单元名称"` + CreativeId *int64 `orm:"creative_id" json:"creativeId" description:"创意 ID"` + CreativeName string `orm:"creative_name" json:"creativeName" description:"创意名称"` + + // 播放率相关字段 + AdPhotoPlayedFiveRatio *float64 `orm:"ad_photo_played_five_ratio" json:"adPhotoPlayedFiveRatio" description:"作品 5 秒播放率"` + AdPhotoPlayedThreeRatio *float64 `orm:"ad_photo_played_three_ratio" json:"adPhotoPlayedThreeRatio" description:"作品 3 秒播放率"` + + // 订单相关字段 + OrderSubmitRoi *float64 `orm:"order_submit_roi" json:"orderSubmitRoi" description:"订单提交 ROI"` + OrderSubmitAmt *int64 `orm:"order_submit_amt" json:"orderSubmitAmt" description:"外部订单金额"` + EventOrderSubmitCost *float64 `orm:"event_order_submit_cost" json:"eventOrderSubmitCost" description:"订单提交成本"` + EventOrderSubmit *int64 `orm:"event_order_submit" json:"eventOrderSubmit" description:"订单提交数"` + EventOrderPaidRoi *float64 `orm:"event_order_paid_roi" json:"eventOrderPaidRoi" description:"订单支付率"` + EventAppInvoked *int64 `orm:"event_app_invoked" json:"eventAppInvoked" description:"唤起应用数"` + EventAddShoppingCart *int64 `orm:"event_add_shopping_cart" json:"eventAddShoppingCart" description:"添加购物车次数"` + ConversionNumCost *float64 `orm:"conversion_num_cost" json:"conversionNumCost" description:"转化成本"` + AdEffectivePlayNum *int64 `orm:"ad_effective_play_num" json:"adEffectivePlayNum" description:"有效播放数"` + AdItemClick *int64 `orm:"ad_item_click" json:"adItemClick" description:"行为数"` + + // 花费相关字段 + CostTotal *float64 `orm:"cost_total" json:"costTotal" description:"花费"` + AdShow *int64 `orm:"ad_show" json:"adShow" description:"曝光数"` + AdShow1kCost *float64 `orm:"ad_show1k_cost" json:"adShow1kCost" description:"平均千次广告曝光花费"` + + // 封面相关字段 + Impression *int64 `orm:"impression" json:"impression" description:"封面曝光数"` + PhotoClick *int64 `orm:"photo_click" json:"photoClick" description:"封面点击数"` + PhotoClickRatio *float64 `orm:"photo_click_ratio" json:"photoClickRatio" description:"封面点击率"` + + // 点击相关字段 + Click *int64 `orm:"click" json:"click" description:"素材曝光数"` + ActionbarClick *int64 `orm:"actionbar_click" json:"actionbarClick" description:"行为数"` + ActionbarClickCost *float64 `orm:"actionbar_click_cost" json:"actionbarClickCost" description:"行为成本"` + EspClickRatio *float64 `orm:"esp_click_ratio" json:"espClickRatio" description:"行为率"` + ActionRatio *float64 `orm:"action_ratio" json:"actionRatio" description:"素材点击率"` + AdItemClickCount *int64 `orm:"ad_item_click_count" json:"adItemClickCount" description:"预约组件点击数"` + + // 直播时长字段 + EspLivePlayedSeconds *int64 `orm:"esp_live_played_seconds" json:"espLivePlayedSeconds" description:"直播平均观看时长"` + + // 播放数据字段 + PlayedThreeSeconds *int64 `orm:"played_three_seconds" json:"playedThreeSeconds" description:"作品 3 秒播放数"` + Play3sRatio *float64 `orm:"play3s_ratio" json:"play3sRatio" description:"作品 3 秒播放率"` + PlayedFiveSeconds *int64 `orm:"played_five_seconds" json:"playedFiveSeconds" description:"作品 5 秒播放数"` + Play5sRatio *float64 `orm:"play5s_ratio" json:"play5sRatio" description:"作品 5 秒播放率"` + PlayedEnd *int64 `orm:"played_end" json:"playedEnd" description:"作品完播数"` + PlayEndRatio *float64 `orm:"play_end_ratio" json:"playEndRatio" description:"作品完播率"` + + // 互动数据字段 + Share *int64 `orm:"share" json:"share" description:"作品分享数"` + Comment *int64 `orm:"comment" json:"comment" description:"作品评论数"` + Likes *int64 `orm:"likes" json:"likes" description:"作品点赞数"` + Report *int64 `orm:"report" json:"report" description:"作品举报数"` + Block *int64 `orm:"block" json:"block" description:"作品拉黑数"` + ItemNegative *int64 `orm:"item_negative" json:"itemNegative" description:"详情页减少此类作品数"` + + // 直播互动字段 + LiveShare *int64 `orm:"live_share" json:"liveShare" description:"直播送礼数"` + LiveComment *int64 `orm:"live_comment" json:"liveComment" description:"直播评论数"` + LiveReward *int64 `orm:"live_reward" json:"liveReward" description:"直播送礼数"` + + // 播放效果字段 + EffectivePlayCount *int64 `orm:"effective_play_count" json:"effectivePlayCount" description:"有效播放数"` + EffectivePlayRatio *float64 `orm:"effective_play_ratio" json:"effectivePlayRatio" description:"有效播放率"` + + // 转化字段 + ConversionNum *int64 `orm:"conversion_num" json:"conversionNum" description:"转化数"` + ConversionCostEsp *float64 `orm:"conversion_cost_esp" json:"conversionCostEsp" description:"转化成本"` + Roi *float64 `orm:"roi" json:"roi" description:"直接 ROI"` + Gmv *float64 `orm:"gmv" json:"gmv" description:"直接 GMV"` + + // GMV 时间序列字段 + T0Gmv *float64 `orm:"t0_gmv" json:"t0Gmv" description:"当日累计 GMV"` + T1Gmv *float64 `orm:"t1_gmv" json:"t1Gmv" description:"次日累计 GMV"` + T3Gmv *float64 `orm:"t3_gmv" json:"t3Gmv" description:"3 日累计 GMV"` + T7Gmv *float64 `orm:"t7_gmv" json:"t7Gmv" description:"7 日累计 GMV"` + T15Gmv *float64 `orm:"t15_gmv" json:"t15Gmv" description:"15 日累计 GMV"` + T30Gmv *float64 `orm:"t30_gmv" json:"t30Gmv" description:"30 日累计 GMV"` + + // ROI 时间序列字段 + T0Roi *float64 `orm:"t0_roi" json:"t0Roi" description:"当日累计 ROI"` + T1Roi *float64 `orm:"t1_roi" json:"t1Roi" description:"次日累计 ROI"` + T3Roi *float64 `orm:"t3_roi" json:"t3Roi" description:"3 日累计 ROI"` + T7Roi *float64 `orm:"t7_roi" json:"t7Roi" description:"7 日累计 ROI"` + T15Roi *float64 `orm:"t15_roi" json:"t15Roi" description:"15 日累计 ROI"` + T30Roi *float64 `orm:"t30_roi" json:"t30Roi" description:"30 日累计 ROI"` + + // 订单相关字段 + PaiedOrder *int64 `orm:"paied_order" json:"paiedOrder" description:"直接订单数"` + OrderRatio *float64 `orm:"order_ratio" json:"orderRatio" description:"直接下单率"` + T0OrderCnt *int64 `orm:"t0_order_cnt" json:"t0OrderCnt" description:"当日累计订单数"` + T0OrderCntCost *float64 `orm:"t0_order_cnt_cost" json:"t0OrderCntCost" description:"当日累计订单成本"` + T0OrderCntRatio *float64 `orm:"t0_order_cnt_ratio" json:"t0OrderCntRatio" description:"累计订单下单率"` + T1OrderCnt *int64 `orm:"t1_order_cnt" json:"t1OrderCnt" description:"次日累计订单数"` + T7OrderCnt *int64 `orm:"t7_order_cnt" json:"t7OrderCnt" description:"7 日累计订单数"` + T15OrderCnt *int64 `orm:"t15_order_cnt" json:"t15OrderCnt" description:"15 日累计订单数"` + T30OrderCnt *int64 `orm:"t30_order_cnt" json:"t30OrderCnt" description:"30 日累计订单数"` + + // 粉丝相关字段 + MerchantRecoFans *int64 `orm:"merchant_reco_fans" json:"merchantRecoFans" description:"涨粉数"` + T1Retention *float64 `orm:"t1_retention" json:"t1Retention" description:"次日涨粉留存数"` + T7Retention *float64 `orm:"t7_retention" json:"t7Retention" description:"7 日涨粉留存数"` + T15Retention *float64 `orm:"t15_retention" json:"t15Retention" description:"15 日涨粉留存数"` + T30Retention *float64 `orm:"t30_retention" json:"t30Retention" description:"30 日涨粉留存数"` + T1RetentionRatio *float64 `orm:"t1_retention_ratio" json:"t1RetentionRatio" description:"次日涨粉留存率"` + T7RetentionRatio *float64 `orm:"t7_retention_ratio" json:"t7RetentionRatio" description:"7 日涨粉留存率"` + T15RetentionRatio *float64 `orm:"t15_retention_ratio" json:"t15RetentionRatio" description:"15 日涨粉留存率"` + T30RetentionRatio *float64 `orm:"t30_retention_ratio" json:"t30RetentionRatio" description:"30 日涨粉留存率"` + + // 直播预约字段 + ReservationSuccess *int64 `orm:"reservation_success" json:"reservationSuccess" description:"直播预约成功数"` + ReservationCost *float64 `orm:"reservation_cost" json:"reservationCost" description:"直播预约成功成本"` + + // 直播观看字段 + StandardLivePlayedStarted *int64 `orm:"standard_live_played_started" json:"standardLivePlayedStarted" description:"直播观看数"` + AdLivePlayCnt *int64 `orm:"ad_live_play_cnt" json:"adLivePlayCnt" description:"直播间人气数"` + AdLivePlayCntCost *float64 `orm:"ad_live_play_cnt_cost" json:"adLivePlayCntCost" description:"直播间人气成本"` + LiveAudienceCost *float64 `orm:"live_audience_cost" json:"liveAudienceCost" description:"直播观看成本"` + + // 商品点击字段 + LiveEventGoodsView *int64 `orm:"live_event_goods_view" json:"liveEventGoodsView" description:"直播间商品点击数"` + GoodsClickRatio *float64 `orm:"goods_click_ratio" json:"goodsClickRatio" description:"直播间商品点击率"` + + // 新客相关字段 + DirectAttrPlatNewBuyerCnt *int64 `orm:"direct_attr_plat_new_buyer_cnt" json:"directAttrPlatNewBuyerCnt" description:"直接平台新客"` + T30AttrPlatTotalBuyerCnt *int64 `orm:"t30_attr_plat_total_buyer_cnt" json:"t30AttrPlatTotalBuyerCnt" description:"30 日累计平台新客"` + DirectAttrSellerNewBuyerCnt *int64 `orm:"direct_attr_seller_new_buyer_cnt" json:"directAttrSellerNewBuyerCnt" description:"直接店铺新客"` + T30AttrSellerTotalBuyerCnt *int64 `orm:"t30_attr_seller_total_buyer_cnt" json:"t30AttrSellerTotalBuyerCnt" description:"30 日累计店铺新客"` + + // 间接订单字段 + T7IndirectOrderAmt *float64 `orm:"t7_indirect_order_amt" json:"t7IndirectOrderAmt" description:"7 日间接订单金额"` + T7IndirectOrderCnt *int64 `orm:"t7_indirect_order_cnt" json:"t7IndirectOrderCnt" description:"7 日间接订单数"` + + // 粉丝人均销售额字段 + FansT0GmvPerFans *float64 `orm:"fans_t0_gmv_per_fans" json:"fansT0GmvPerFans" description:"新增粉丝人均销售额"` + FansT3GmvPerFans *float64 `orm:"fans_t3_gmv_per_fans" json:"fansT3GmvPerFans" description:"3 日新增粉丝人均销售额"` + FansT7GmvPerFans *float64 `orm:"fans_t7_gmv_per_fans" json:"fansT7GmvPerFans" description:"7 日新增粉丝人均销售额"` + FansT15GmvPerFans *float64 `orm:"fans_t15_gmv_per_fans" json:"fansT15GmvPerFans" description:"15 日新增粉丝人均销售额"` + FansT30GmvPerFans *float64 `orm:"fans_t30_gmv_per_fans" json:"fansT30GmvPerFans" description:"30 日新增粉丝人均销售额"` + + // 涨粉成本字段 + RecoFansCost *float64 `orm:"reco_fans_cost" json:"recoFansCost" description:"涨粉成本"` + + // 智能优惠券字段 + QcpxWhiteboxDirectOrderPaymentAmt *float64 `orm:"qcpx_whitebox_direct_order_payment_amt" json:"qcpxWhiteboxDirectOrderPaymentAmt" description:"智能优惠券订单 GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `orm:"qcpx_whitebox_direct_order_cnt" json:"qcpxWhiteboxDirectOrderCnt" description:"智能优惠券订单数"` + + // 粉丝 GMV 字段 + FansT0Gmv *float64 `orm:"fans_t0_gmv" json:"fansT0Gmv" description:"涨粉当日 GMV"` + FansT1Gmv *float64 `orm:"fans_t1_gmv" json:"fansT1Gmv" description:"涨粉次日 GMV"` + FansT7Gmv *float64 `orm:"fans_t7_gmv" json:"fansT7Gmv" description:"涨粉 7 日 GMV"` + FansT15Gmv *float64 `orm:"fans_t15_gmv" json:"fansT15Gmv" description:"涨粉 15 日 GMV"` + FansT30Gmv *float64 `orm:"fans_t30_gmv" json:"fansT30Gmv" description:"涨粉 30 日 GMV"` + + // 粉丝 ROI 字段 + FansT0Roi *float64 `orm:"fans_t0_roi" json:"fansT0Roi" description:"涨粉当日 ROI"` + FansT1Roi *float64 `orm:"fans_t1_roi" json:"fansT1Roi" description:"涨粉次日 ROI"` + FansT7Roi *float64 `orm:"fans_t7_roi" json:"fansT7Roi" description:"涨粉 7 日 ROI"` + FansT15Roi *float64 `orm:"fans_t15_roi" json:"fansT15Roi" description:"涨粉 15 日 ROI"` + FansT30Roi *float64 `orm:"fans_t30_roi" json:"fansT30Roi" description:"涨粉 30 日 ROI"` + + // 新客 GMV 字段 + T0ShopNewBuyerOrderPaymentAmt *float64 `orm:"t0_shop_new_buyer_order_payment_amt" json:"t0ShopNewBuyerOrderPaymentAmt" description:"当日新客 GMV"` + T1ShopNewBuyerOrderPaymentAmt *float64 `orm:"t1_shop_new_buyer_order_payment_amt" json:"t1ShopNewBuyerOrderPaymentAmt" description:"投后 1 日新客 GMV"` + T3ShopNewBuyerOrderPaymentAmt *float64 `orm:"t3_shop_new_buyer_order_payment_amt" json:"t3ShopNewBuyerOrderPaymentAmt" description:"投后 3 日新客 GMV"` + T7ShopNewBuyerOrderPaymentAmt *float64 `orm:"t7_shop_new_buyer_order_payment_amt" json:"t7ShopNewBuyerOrderPaymentAmt" description:"投后 7 日新客 GMV"` + T15ShopNewBuyerOrderPaymentAmt *float64 `orm:"t15_shop_new_buyer_order_payment_amt" json:"t15ShopNewBuyerOrderPaymentAmt" description:"投后 15 日新客 GMV"` + T30ShopNewBuyerOrderPaymentAmt *float64 `orm:"t30_shop_new_buyer_order_payment_amt" json:"t30ShopNewBuyerOrderPaymentAmt" description:"投后 30 日新客 GMV"` + + // 新客订单量字段 + T0ShopNewBuyerOrderCnt *int64 `orm:"t0_shop_new_buyer_order_cnt" json:"t0ShopNewBuyerOrderCnt" description:"当日新客成交订单量"` + T1ShopNewBuyerOrderCnt *int64 `orm:"t1_shop_new_buyer_order_cnt" json:"t1ShopNewBuyerOrderCnt" description:"投后 1 日新客成交订单量"` + T3ShopNewBuyerOrderCnt *int64 `orm:"t3_shop_new_buyer_order_cnt" json:"t3ShopNewBuyerOrderCnt" description:"投后 3 日新客成交订单量"` + T7ShopNewBuyerOrderCnt *int64 `orm:"t7_shop_new_buyer_order_cnt" json:"t7ShopNewBuyerOrderCnt" description:"投后 7 日新客成交订单量"` + T15ShopNewBuyerOrderCnt *int64 `orm:"t15_shop_new_buyer_order_cnt" json:"t15ShopNewBuyerOrderCnt" description:"投后 15 日新客成交订单量"` + T30ShopNewBuyerOrderCnt *int64 `orm:"t30_shop_new_buyer_order_cnt" json:"t30ShopNewBuyerOrderCnt" description:"投后 30 日新客成交订单量"` + + // 新客复购率字段 + T1NewBuyerRepurchaseRatio *float64 `orm:"t1_new_buyer_repurchase_ratio" json:"t1NewBuyerRepurchaseRatio" description:"投后 1 日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `orm:"t3_new_buyer_repurchase_ratio" json:"t3NewBuyerRepurchaseRatio" description:"投后 3 日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `orm:"t7_new_buyer_repurchase_ratio" json:"t7NewBuyerRepurchaseRatio" description:"投后 7 日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `orm:"t15_new_buyer_repurchase_ratio" json:"t15NewBuyerRepurchaseRatio" description:"投后 15 日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `orm:"t30_new_buyer_repurchase_ratio" json:"t30NewBuyerRepurchaseRatio" description:"投后 30 日新客复购率"` + + // 新客 ROI 字段 + T0ShopNewBuyerRoi *float64 `orm:"t0_shop_new_buyer_roi" json:"t0ShopNewBuyerRoi" description:"投后当日新客 ROI"` + T1ShopNewBuyerRoi *float64 `orm:"t1_shop_new_buyer_roi" json:"t1ShopNewBuyerRoi" description:"投后 1 日新客 ROI"` + T3ShopNewBuyerRoi *float64 `orm:"t3_shop_new_buyer_roi" json:"t3ShopNewBuyerRoi" description:"投后 3 日新客 ROI"` + T7ShopNewBuyerRoi *float64 `orm:"t7_shop_new_buyer_roi" json:"t7ShopNewBuyerRoi" description:"投后 7 日新客 ROI"` + T15ShopNewBuyerRoi *float64 `orm:"t15_shop_new_buyer_roi" json:"t15ShopNewBuyerRoi" description:"投后 15 日新客 ROI"` + T30ShopNewBuyerRoi *float64 `orm:"t30_shop_new_buyer_roi" json:"t30ShopNewBuyerRoi" description:"投后 30 日新客 ROI"` + + // 电话卡相关字段 + CreateCardOrderCnt *int64 `orm:"create_card_order_cnt" json:"createCardOrderCnt" description:"有效制卡订单数(回传时间)"` + ForwardTsCreateCardOrderCnt *int64 `orm:"forward_ts_create_card_order_cnt" json:"forwardTsCreateCardOrderCnt" description:"有效制卡订单数(计费时间)"` + CreateCardOrderCost *float64 `orm:"create_card_order_cost" json:"createCardOrderCost" description:"有效制卡订单成本(回传时间)"` + ForwardTsCreateCardOrderCost *float64 `orm:"forward_ts_create_card_order_cost" json:"forwardTsCreateCardOrderCost" description:"有效制卡订单成本(计费时间)"` + ActivateCardOrderCnt *int64 `orm:"activate_card_order_cnt" json:"activateCardOrderCnt" description:"电话卡激活订单数(回传时间)"` + ForwardTsActivateCardOrderCnt *int64 `orm:"forward_ts_activate_card_order_cnt" json:"forwardTsActivateCardOrderCnt" description:"电话卡激活订单数(计费时间)"` + ActivateCardOrderCost *float64 `orm:"activate_card_order_cost" json:"activateCardOrderCost" description:"电话卡激活订单成本(回传时间)"` + ForwardTsActivateCardOrderCost *float64 `orm:"forward_ts_activate_card_order_cost" json:"forwardTsActivateCardOrderCost" description:"电话卡激活订单成本(计费时间)"` + CreateCardOrderRatio *float64 `orm:"create_card_order_ratio" json:"createCardOrderRatio" description:"有效制卡订单率(回传时间)"` + ForwardTsCreateCardOrderRatio *float64 `orm:"forward_ts_create_card_order_ratio" json:"forwardTsCreateCardOrderRatio" description:"有效制卡订单率(计费时间)"` + ActivateCardOrderCntRatio *float64 `orm:"activate_card_order_cnt_ratio" json:"activateCardOrderCntRatio" description:"电话卡激活率(回传时间)"` + ForwardTsActivateCardOrderRatio *float64 `orm:"forward_ts_activate_card_order_ratio" json:"forwardTsActivateCardOrderRatio" description:"电话卡激活率(计费时间)"` + + // 全站数据字段 + LivePlayCnt *int64 `orm:"live_play_cnt" json:"livePlayCnt" description:"全站直播观看数"` + ItemEntranceClkCnt *int64 `orm:"item_entrance_clk_cnt" json:"itemEntranceClkCnt" description:"小黄车点击数"` + ShowCnt *int64 `orm:"show_cnt" json:"showCnt" description:"全站曝光"` +} + +// PopulationReportCol 人群报表字段定义 +type PopulationReportCol struct { + beans.SQLBaseCol + PhotoName string + PhotoIdStr string + PhotoId string + ModPriceSegment string + AgeSegment string + Province string + Gender string + MerchantProductId string + ReportDateStr string + CampaignId string + CampaignName string + UnitId string + UnitName string + CreativeId string + CreativeName string + AdPhotoPlayedFiveRatio string + AdPhotoPlayedThreeRatio string + OrderSubmitRoi string + OrderSubmitAmt string + EventOrderSubmitCost string + EventOrderSubmit string + EventOrderPaidRoi string + EventAppInvoked string + EventAddShoppingCart string + ConversionNumCost string + AdEffectivePlayNum string + AdItemClick string + CostTotal string + AdShow string + AdShow1kCost string + Impression string + PhotoClick string + PhotoClickRatio string + Click string + ActionbarClick string + ActionbarClickCost string + EspClickRatio string + ActionRatio string + AdItemClickCount string + EspLivePlayedSeconds string + PlayedThreeSeconds string + Play3sRatio string + PlayedFiveSeconds string + Play5sRatio string + PlayedEnd string + PlayEndRatio string + Share string + Comment string + Likes string + Report string + Block string + ItemNegative string + LiveShare string + LiveComment string + LiveReward string + EffectivePlayCount string + EffectivePlayRatio string + ConversionNum string + ConversionCostEsp string + Roi string + Gmv string + T0Gmv string + T1Gmv string + T3Gmv string + T7Gmv string + T15Gmv string + T30Gmv string + T0Roi string + T1Roi string + T3Roi string + T7Roi string + T15Roi string + T30Roi string + PaiedOrder string + OrderRatio string + T0OrderCnt string + T0OrderCntCost string + T0OrderCntRatio string + T1OrderCnt string + T7OrderCnt string + T15OrderCnt string + T30OrderCnt string + MerchantRecoFans string + T1Retention string + T7Retention string + T15Retention string + T30Retention string + T1RetentionRatio string + T7RetentionRatio string + T15RetentionRatio string + T30RetentionRatio string + ReservationSuccess string + ReservationCost string + StandardLivePlayedStarted string + AdLivePlayCnt string + AdLivePlayCntCost string + LiveAudienceCost string + LiveEventGoodsView string + GoodsClickRatio string + DirectAttrPlatNewBuyerCnt string + T30AttrPlatTotalBuyerCnt string + DirectAttrSellerNewBuyerCnt string + T30AttrSellerTotalBuyerCnt string + T7IndirectOrderAmt string + T7IndirectOrderCnt string + FansT0GmvPerFans string + FansT3GmvPerFans string + FansT7GmvPerFans string + FansT15GmvPerFans string + FansT30GmvPerFans string + RecoFansCost string + QcpxWhiteboxDirectOrderPaymentAmt string + QcpxWhiteboxDirectOrderCnt string + FansT0Gmv string + FansT1Gmv string + FansT7Gmv string + FansT15Gmv string + FansT30Gmv string + FansT0Roi string + FansT1Roi string + FansT7Roi string + FansT15Roi string + FansT30Roi string + T0ShopNewBuyerOrderPaymentAmt string + T1ShopNewBuyerOrderPaymentAmt string + T3ShopNewBuyerOrderPaymentAmt string + T7ShopNewBuyerOrderPaymentAmt string + T15ShopNewBuyerOrderPaymentAmt string + T30ShopNewBuyerOrderPaymentAmt string + T0ShopNewBuyerOrderCnt string + T1ShopNewBuyerOrderCnt string + T3ShopNewBuyerOrderCnt string + T7ShopNewBuyerOrderCnt string + T15ShopNewBuyerOrderCnt string + T30ShopNewBuyerOrderCnt string + T1NewBuyerRepurchaseRatio string + T3NewBuyerRepurchaseRatio string + T7NewBuyerRepurchaseRatio string + T15NewBuyerRepurchaseRatio string + T30NewBuyerRepurchaseRatio string + T0ShopNewBuyerRoi string + T1ShopNewBuyerRoi string + T3ShopNewBuyerRoi string + T7ShopNewBuyerRoi string + T15ShopNewBuyerRoi string + T30ShopNewBuyerRoi string + CreateCardOrderCnt string + ForwardTsCreateCardOrderCnt string + CreateCardOrderCost string + ForwardTsCreateCardOrderCost string + ActivateCardOrderCnt string + ForwardTsActivateCardOrderCnt string + ActivateCardOrderCost string + ForwardTsActivateCardOrderCost string + CreateCardOrderRatio string + ForwardTsCreateCardOrderRatio string + ActivateCardOrderCntRatio string + ForwardTsActivateCardOrderRatio string + LivePlayCnt string + ItemEntranceClkCnt string + ShowCnt string +} + +// TableName 返回表名 +func (e *PopulationReport) TableName() string { + return "population_report" +} + +// GetCols 获取所有字段名 +func (e *PopulationReport) GetCols() *PopulationReportCol { + return &PopulationReportCol{ + SQLBaseCol: beans.SQLBaseCol{ + Id: "id", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + }, + PhotoName: "photo_name", + PhotoIdStr: "photo_id_str", + PhotoId: "photo_id", + ModPriceSegment: "mod_price_segment", + AgeSegment: "age_segment", + Province: "province", + Gender: "gender", + MerchantProductId: "merchant_product_id", + ReportDateStr: "report_date_str", + CampaignId: "campaign_id", + CampaignName: "campaign_name", + UnitId: "unit_id", + UnitName: "unit_name", + CreativeId: "creative_id", + CreativeName: "creative_name", + AdPhotoPlayedFiveRatio: "ad_photo_played_five_ratio", + AdPhotoPlayedThreeRatio: "ad_photo_played_three_ratio", + OrderSubmitRoi: "order_submit_roi", + OrderSubmitAmt: "order_submit_amt", + EventOrderSubmitCost: "event_order_submit_cost", + EventOrderSubmit: "event_order_submit", + EventOrderPaidRoi: "event_order_paid_roi", + EventAppInvoked: "event_app_invoked", + EventAddShoppingCart: "event_add_shopping_cart", + ConversionNumCost: "conversion_num_cost", + AdEffectivePlayNum: "ad_effective_play_num", + AdItemClick: "ad_item_click", + CostTotal: "cost_total", + AdShow: "ad_show", + AdShow1kCost: "ad_show1k_cost", + Impression: "impression", + PhotoClick: "photo_click", + PhotoClickRatio: "photo_click_ratio", + Click: "click", + ActionbarClick: "actionbar_click", + ActionbarClickCost: "actionbar_click_cost", + EspClickRatio: "esp_click_ratio", + ActionRatio: "action_ratio", + AdItemClickCount: "ad_item_click_count", + EspLivePlayedSeconds: "esp_live_played_seconds", + PlayedThreeSeconds: "played_three_seconds", + Play3sRatio: "play3s_ratio", + PlayedFiveSeconds: "played_five_seconds", + Play5sRatio: "play5s_ratio", + PlayedEnd: "played_end", + PlayEndRatio: "play_end_ratio", + Share: "share", + Comment: "comment", + Likes: "likes", + Report: "report", + Block: "block", + ItemNegative: "item_negative", + LiveShare: "live_share", + LiveComment: "live_comment", + LiveReward: "live_reward", + EffectivePlayCount: "effective_play_count", + EffectivePlayRatio: "effective_play_ratio", + ConversionNum: "conversion_num", + ConversionCostEsp: "conversion_cost_esp", + Roi: "roi", + Gmv: "gmv", + T0Gmv: "t0_gmv", + T1Gmv: "t1_gmv", + T3Gmv: "t3_gmv", + T7Gmv: "t7_gmv", + T15Gmv: "t15_gmv", + T30Gmv: "t30_gmv", + T0Roi: "t0_roi", + T1Roi: "t1_roi", + T3Roi: "t3_roi", + T7Roi: "t7_roi", + T15Roi: "t15_roi", + T30Roi: "t30_roi", + PaiedOrder: "paied_order", + OrderRatio: "order_ratio", + T0OrderCnt: "t0_order_cnt", + T0OrderCntCost: "t0_order_cnt_cost", + T0OrderCntRatio: "t0_order_cnt_ratio", + T1OrderCnt: "t1_order_cnt", + T7OrderCnt: "t7_order_cnt", + T15OrderCnt: "t15_order_cnt", + T30OrderCnt: "t30_order_cnt", + MerchantRecoFans: "merchant_reco_fans", + T1Retention: "t1_retention", + T7Retention: "t7_retention", + T15Retention: "t15_retention", + T30Retention: "t30_retention", + T1RetentionRatio: "t1_retention_ratio", + T7RetentionRatio: "t7_retention_ratio", + T15RetentionRatio: "t15_retention_ratio", + T30RetentionRatio: "t30_retention_ratio", + ReservationSuccess: "reservation_success", + ReservationCost: "reservation_cost", + StandardLivePlayedStarted: "standard_live_played_started", + AdLivePlayCnt: "ad_live_play_cnt", + AdLivePlayCntCost: "ad_live_play_cnt_cost", + LiveAudienceCost: "live_audience_cost", + LiveEventGoodsView: "live_event_goods_view", + GoodsClickRatio: "goods_click_ratio", + DirectAttrPlatNewBuyerCnt: "direct_attr_plat_new_buyer_cnt", + T30AttrPlatTotalBuyerCnt: "t30_attr_plat_total_buyer_cnt", + DirectAttrSellerNewBuyerCnt: "direct_attr_seller_new_buyer_cnt", + T30AttrSellerTotalBuyerCnt: "t30_attr_seller_total_buyer_cnt", + T7IndirectOrderAmt: "t7_indirect_order_amt", + T7IndirectOrderCnt: "t7_indirect_order_cnt", + FansT0GmvPerFans: "fans_t0_gmv_per_fans", + FansT3GmvPerFans: "fans_t3_gmv_per_fans", + FansT7GmvPerFans: "fans_t7_gmv_per_fans", + FansT15GmvPerFans: "fans_t15_gmv_per_fans", + FansT30GmvPerFans: "fans_t30_gmv_per_fans", + RecoFansCost: "reco_fans_cost", + QcpxWhiteboxDirectOrderPaymentAmt: "qcpx_whitebox_direct_order_payment_amt", + QcpxWhiteboxDirectOrderCnt: "qcpx_whitebox_direct_order_cnt", + FansT0Gmv: "fans_t0_gmv", + FansT1Gmv: "fans_t1_gmv", + FansT7Gmv: "fans_t7_gmv", + FansT15Gmv: "fans_t15_gmv", + FansT30Gmv: "fans_t30_gmv", + FansT0Roi: "fans_t0_roi", + FansT1Roi: "fans_t1_roi", + FansT7Roi: "fans_t7_roi", + FansT15Roi: "fans_t15_roi", + FansT30Roi: "fans_t30_roi", + T0ShopNewBuyerOrderPaymentAmt: "t0_shop_new_buyer_order_payment_amt", + T1ShopNewBuyerOrderPaymentAmt: "t1_shop_new_buyer_order_payment_amt", + T3ShopNewBuyerOrderPaymentAmt: "t3_shop_new_buyer_order_payment_amt", + T7ShopNewBuyerOrderPaymentAmt: "t7_shop_new_buyer_order_payment_amt", + T15ShopNewBuyerOrderPaymentAmt: "t15_shop_new_buyer_order_payment_amt", + T30ShopNewBuyerOrderPaymentAmt: "t30_shop_new_buyer_order_payment_amt", + T0ShopNewBuyerOrderCnt: "t0_shop_new_buyer_order_cnt", + T1ShopNewBuyerOrderCnt: "t1_shop_new_buyer_order_cnt", + T3ShopNewBuyerOrderCnt: "t3_shop_new_buyer_order_cnt", + T7ShopNewBuyerOrderCnt: "t7_shop_new_buyer_order_cnt", + T15ShopNewBuyerOrderCnt: "t15_shop_new_buyer_order_cnt", + T30ShopNewBuyerOrderCnt: "t30_shop_new_buyer_order_cnt", + T1NewBuyerRepurchaseRatio: "t1_new_buyer_repurchase_ratio", + T3NewBuyerRepurchaseRatio: "t3_new_buyer_repurchase_ratio", + T7NewBuyerRepurchaseRatio: "t7_new_buyer_repurchase_ratio", + T15NewBuyerRepurchaseRatio: "t15_new_buyer_repurchase_ratio", + T30NewBuyerRepurchaseRatio: "t30_new_buyer_repurchase_ratio", + T0ShopNewBuyerRoi: "t0_shop_new_buyer_roi", + T1ShopNewBuyerRoi: "t1_shop_new_buyer_roi", + T3ShopNewBuyerRoi: "t3_shop_new_buyer_roi", + T7ShopNewBuyerRoi: "t7_shop_new_buyer_roi", + T15ShopNewBuyerRoi: "t15_shop_new_buyer_roi", + T30ShopNewBuyerRoi: "t30_shop_new_buyer_roi", + CreateCardOrderCnt: "create_card_order_cnt", + ForwardTsCreateCardOrderCnt: "forward_ts_create_card_order_cnt", + CreateCardOrderCost: "create_card_order_cost", + ForwardTsCreateCardOrderCost: "forward_ts_create_card_order_cost", + ActivateCardOrderCnt: "activate_card_order_cnt", + ForwardTsActivateCardOrderCnt: "forward_ts_activate_card_order_cnt", + ActivateCardOrderCost: "activate_card_order_cost", + ForwardTsActivateCardOrderCost: "forward_ts_activate_card_order_cost", + CreateCardOrderRatio: "create_card_order_ratio", + ForwardTsCreateCardOrderRatio: "forward_ts_create_card_order_ratio", + ActivateCardOrderCntRatio: "activate_card_order_cnt_ratio", + ForwardTsActivateCardOrderRatio: "forward_ts_activate_card_order_ratio", + LivePlayCnt: "live_play_cnt", + ItemEntranceClkCnt: "item_entrance_clk_cnt", + ShowCnt: "show_cnt", + } +} diff --git a/model/entity/copydata/storewide_report_detail.go b/model/entity/copydata/storewide_report_detail.go new file mode 100644 index 0000000..371cc7f --- /dev/null +++ b/model/entity/copydata/storewide_report_detail.go @@ -0,0 +1,181 @@ +package copydata + +import "gitea.com/red-future/common/beans" + +// StorewideReportDetail 广告效果指标表实体 +type StorewideReportDetail struct { + beans.SQLBaseDO `orm:",inherit"` + + // 订单金额相关字段 + T0OrderPaymentAmt *float64 `orm:"t0_order_payment_amt" json:"t0OrderPaymentAmt" description:"当日总成交订单金额"` + + // 素材类型字段 + CreativeMaterialType string `orm:"creative_material_type" json:"creativeMaterialType" description:"视频素材类型(视频:HORIZONTAL_SCREEN, VERTICAL_SCREEN, UNKNOWN_TYPE;图集:ATLAS;长图:ATLAS_VERTICAL)"` + + // 直播相关字段 + LiveName string `orm:"live_name" json:"liveName" description:"直播间名称"` + AuthorId string `orm:"author_id" json:"authorId" description:"直播用户快手 Id"` + + // 图片相关字段 + PicUrl string `orm:"pic_url" json:"picUrl" description:"图片 URL"` + PicName string `orm:"pic_name" json:"picName" description:"图片名称"` + PicId string `orm:"pic_id" json:"picId" description:"图片 Id"` + + // 封面相关字段 + CoverUrl string `orm:"cover_url" json:"coverUrl" description:"封面 URL"` + CoverId *int64 `orm:"cover_id" json:"coverId" description:"封面 Id"` + + // 商品卡点击相关字段 + ItemCardClkCnt *int64 `orm:"item_card_clk_cnt" json:"itemCardClkCnt" description:"商品卡点击数"` + + // 净成交相关字段 + NetT0OrderCnt *int64 `orm:"net_t0_order_cnt" json:"netT0OrderCnt" description:"当日累计净成交订单数"` + NetT0Roi *float64 `orm:"net_t0_roi" json:"netT0Roi" description:"净成交 ROI"` + NetT0Gmv *float64 `orm:"net_t0_gmv" json:"netT0Gmv" description:"净成交 GMV"` + + // 视频相关字段 + PhotoName string `orm:"photo_name" json:"photoName" description:"视频名称"` + PhotoIdStr string `orm:"photo_id_str" json:"photoIdStr" description:"视频 id"` + PhotoId string `orm:"photo_id" json:"photoId" description:"视频 id"` + + // 行为相关字段 + AdItemClick *int64 `orm:"ad_item_click" json:"adItemClick" description:"行为数"` + + // 商品相关字段 + MerchantProductId string `orm:"merchant_product_id" json:"merchantProductId" description:"商品 ID"` + + // 花费相关字段 + CostTotal *float64 `orm:"cost_total" json:"costTotal" description:"花费"` + + // 行为率字段 + EspClickRatio *float64 `orm:"esp_click_ratio" json:"espClickRatio" description:"行为率"` + + // 当日 GMV 相关字段 + T0Gmv *float64 `orm:"t0_gmv" json:"t0Gmv" description:"当日累计 GMV"` + T0Roi *float64 `orm:"t0_roi" json:"t0Roi" description:"当日累计 ROI"` + + // 当日订单相关字段 + T0OrderCnt *int64 `orm:"t0_order_cnt" json:"t0OrderCnt" description:"当日累计订单数"` + T0OrderCntCost *float64 `orm:"t0_order_cnt_cost" json:"t0OrderCntCost" description:"当日累计订单成本"` + + // 智能优惠券相关字段 + QcpxWhiteboxDirectOrderPaymentAmt *float64 `orm:"qcpx_whitebox_direct_order_payment_amt" json:"qcpxWhiteboxDirectOrderPaymentAmt" description:"智能优惠券订单 GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `orm:"qcpx_whitebox_direct_order_cnt" json:"qcpxWhiteboxDirectOrderCnt" description:"智能优惠券订单数"` + + // 直播观看相关字段 + LivePlayCnt *int64 `orm:"live_play_cnt" json:"livePlayCnt" description:"全站直播观看数"` + + // 商品入口点击相关字段 + ItemEntranceClkCnt *int64 `orm:"item_entrance_clk_cnt" json:"itemEntranceClkCnt" description:"小黄车点击数"` + + // 曝光相关字段 + ShowCnt *int64 `orm:"show_cnt" json:"showCnt" description:"全站曝光"` + + // 报告日期字段 + ReportDateStr string `orm:"report_date_str" json:"reportDateStr" description:"时间"` + + // 广告计划相关字段 + CampaignId *int64 `orm:"campaign_id" json:"campaignId" description:"计划 ID"` + CampaignName string `orm:"campaign_name" json:"campaignName" description:"计划名称"` + + // 广告单元相关字段 + UnitId *int64 `orm:"unit_id" json:"unitId" description:"单元 ID"` + UnitName string `orm:"unit_name" json:"unitName" description:"单元名称"` + + // 广告创意相关字段 + CreativeId *int64 `orm:"creative_id" json:"creativeId" description:"创意 ID"` + CreativeName string `orm:"creative_name" json:"creativeName" description:"创意名称"` +} + +// StorewideReportDetailCol 广告效果指标表表字段定义 +type StorewideReportDetailCol struct { + beans.SQLBaseCol + T0OrderPaymentAmt string + CreativeMaterialType string + LiveName string + AuthorId string + PicUrl string + PicName string + PicId string + CoverUrl string + CoverId string + ItemCardClkCnt string + NetT0OrderCnt string + NetT0Roi string + NetT0Gmv string + PhotoName string + PhotoIdStr string + PhotoId string + AdItemClick string + MerchantProductId string + CostTotal string + EspClickRatio string + T0Gmv string + T0Roi string + T0OrderCnt string + T0OrderCntCost string + QcpxWhiteboxDirectOrderPaymentAmt string + QcpxWhiteboxDirectOrderCnt string + LivePlayCnt string + ItemEntranceClkCnt string + ShowCnt string + ReportDateStr string + CampaignId string + CampaignName string + UnitId string + UnitName string + CreativeId string + CreativeName string +} + +// TableName 返回表名 +func (e *StorewideReportDetail) TableName() string { + return "storewide_report_detail" +} + +// GetCols 获取所有字段名 +func (e *StorewideReportDetail) GetCols() *StorewideReportDetailCol { + return &StorewideReportDetailCol{ + SQLBaseCol: beans.SQLBaseCol{ + Id: "id", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + }, + T0OrderPaymentAmt: "t0_order_payment_amt", + CreativeMaterialType: "creative_material_type", + LiveName: "live_name", + AuthorId: "author_id", + PicUrl: "pic_url", + PicName: "pic_name", + PicId: "pic_id", + CoverUrl: "cover_url", + CoverId: "cover_id", + ItemCardClkCnt: "item_card_clk_cnt", + NetT0OrderCnt: "net_t0_order_cnt", + NetT0Roi: "net_t0_roi", + NetT0Gmv: "net_t0_gmv", + PhotoName: "photo_name", + PhotoIdStr: "photo_id_str", + PhotoId: "photo_id", + AdItemClick: "ad_item_click", + MerchantProductId: "merchant_product_id", + CostTotal: "cost_total", + EspClickRatio: "esp_click_ratio", + T0Gmv: "t0_gmv", + T0Roi: "t0_roi", + T0OrderCnt: "t0_order_cnt", + T0OrderCntCost: "t0_order_cnt_cost", + QcpxWhiteboxDirectOrderPaymentAmt: "qcpx_whitebox_direct_order_payment_amt", + QcpxWhiteboxDirectOrderCnt: "qcpx_whitebox_direct_order_cnt", + LivePlayCnt: "live_play_cnt", + ItemEntranceClkCnt: "item_entrance_clk_cnt", + ShowCnt: "show_cnt", + ReportDateStr: "report_date_str", + CampaignId: "campaign_id", + CampaignName: "campaign_name", + UnitId: "unit_id", + UnitName: "unit_name", + CreativeId: "creative_id", + CreativeName: "creative_name", + } +} diff --git a/model/entity/copydata/storewide_report_sum.go b/model/entity/copydata/storewide_report_sum.go new file mode 100644 index 0000000..aefa6ca --- /dev/null +++ b/model/entity/copydata/storewide_report_sum.go @@ -0,0 +1,141 @@ +package copydata + +import "gitea.com/red-future/common/beans" + +// StorewideReportSum 广告效果指标表实体 +type StorewideReportSum struct { + beans.SQLBaseDO `orm:",inherit"` + + // 新增字段 + T0OrderPaymentAmt *float64 `orm:"t0_order_payment_amt" json:"t0OrderPaymentAmt" description:"当日总成交订单金额"` + CreativeMaterialType string `orm:"creative_material_type" json:"creativeMaterialType" description:"视频素材类型"` + LiveName string `orm:"live_name" json:"liveName" description:"直播间名称"` + AuthorId string `orm:"author_id" json:"authorId" description:"直播用户快手 Id"` + PicUrl string `orm:"pic_url" json:"picUrl" description:"图片 URL"` + PicName string `orm:"pic_name" json:"picName" description:"图片名称"` + PicId string `orm:"pic_id" json:"picId" description:"图片 Id"` + CoverUrl string `orm:"cover_url" json:"coverUrl" description:"封面 URL"` + CoverId *int64 `orm:"cover_id" json:"coverId" description:"封面 Id"` + ItemCardClkCnt *int64 `orm:"item_card_clk_cnt" json:"itemCardClkCnt" description:"商品卡点击数"` + NetT0OrderCnt *int64 `orm:"net_t0_order_cnt" json:"netT0OrderCnt" description:"当日累计净成交订单数"` + NetT0Roi *float64 `orm:"net_t0_roi" json:"netT0Roi" description:"净成交 ROI"` + NetT0Gmv *float64 `orm:"net_t0_gmv" json:"netT0Gmv" description:"净成交 GMV"` + + // 原有字段 + PhotoName string `orm:"photo_name" json:"photoName" description:"视频名称"` + PhotoIdStr string `orm:"photo_id_str" json:"photoIdStr" description:"视频 id"` + PhotoId string `orm:"photo_id" json:"photoId" description:"视频 id"` + AdItemClick *int64 `orm:"ad_item_click" json:"adItemClick" description:"行为数"` + MerchantProductId string `orm:"merchant_product_id" json:"merchantProductId" description:"商品 ID"` + CostTotal *float64 `orm:"cost_total" json:"costTotal" description:"花费"` + EspClickRatio *float64 `orm:"esp_click_ratio" json:"espClickRatio" description:"行为率"` + T0Gmv *float64 `orm:"t0_gmv" json:"t0Gmv" description:"当日累计 GMV"` + T0Roi *float64 `orm:"t0_roi" json:"t0Roi" description:"当日累计 ROI"` + T0OrderCnt *int64 `orm:"t0_order_cnt" json:"t0OrderCnt" description:"当日累计订单数"` + T0OrderCntCost *float64 `orm:"t0_order_cnt_cost" json:"t0OrderCntCost" description:"当日累计订单成本"` + QcpxWhiteboxDirectOrderPaymentAmt *float64 `orm:"qcpx_whitebox_direct_order_payment_amt" json:"qcpxWhiteboxDirectOrderPaymentAmt" description:"智能优惠券订单 GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `orm:"qcpx_whitebox_direct_order_cnt" json:"qcpxWhiteboxDirectOrderCnt" description:"智能优惠券订单数"` + LivePlayCnt *int64 `orm:"live_play_cnt" json:"livePlayCnt" description:"全站直播观看数"` + ItemEntranceClkCnt *int64 `orm:"item_entrance_clk_cnt" json:"itemEntranceClkCnt" description:"小黄车点击数"` + ShowCnt *int64 `orm:"show_cnt" json:"showCnt" description:"全站曝光"` + ReportDateStr string `orm:"report_date_str" json:"reportDateStr" description:"时间"` + CampaignId *int64 `orm:"campaign_id" json:"campaignId" description:"计划 ID"` + CampaignName string `orm:"campaign_name" json:"campaignName" description:"计划名称"` + UnitId *int64 `orm:"unit_id" json:"unitId" description:"单元 ID"` + UnitName string `orm:"unit_name" json:"unitName" description:"单元名称"` + CreativeId *int64 `orm:"creative_id" json:"creativeId" description:"创意 ID"` + CreativeName string `orm:"creative_name" json:"creativeName" description:"创意名称"` +} + +// StorewideReportSumCol 广告效果指标表表字段定义 +type StorewideReportSumCol struct { + beans.SQLBaseCol + T0OrderPaymentAmt string + CreativeMaterialType string + LiveName string + AuthorId string + PicUrl string + PicName string + PicId string + CoverUrl string + CoverId string + ItemCardClkCnt string + NetT0OrderCnt string + NetT0Roi string + NetT0Gmv string + PhotoName string + PhotoIdStr string + PhotoId string + AdItemClick string + MerchantProductId string + CostTotal string + EspClickRatio string + T0Gmv string + T0Roi string + T0OrderCnt string + T0OrderCntCost string + QcpxWhiteboxDirectOrderPaymentAmt string + QcpxWhiteboxDirectOrderCnt string + LivePlayCnt string + ItemEntranceClkCnt string + ShowCnt string + ReportDateStr string + CampaignId string + CampaignName string + UnitId string + UnitName string + CreativeId string + CreativeName string +} + +// TableName 返回表名 +func (e *StorewideReportSum) TableName() string { + return "storewide_report_sum" +} + +// GetCols 获取所有字段名 +func (e *StorewideReportSum) GetCols() *StorewideReportSumCol { + return &StorewideReportSumCol{ + SQLBaseCol: beans.SQLBaseCol{ + Id: "id", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + }, + T0OrderPaymentAmt: "t0_order_payment_amt", + CreativeMaterialType: "creative_material_type", + LiveName: "live_name", + AuthorId: "author_id", + PicUrl: "pic_url", + PicName: "pic_name", + PicId: "pic_id", + CoverUrl: "cover_url", + CoverId: "cover_id", + ItemCardClkCnt: "item_card_clk_cnt", + NetT0OrderCnt: "net_t0_order_cnt", + NetT0Roi: "net_t0_roi", + NetT0Gmv: "net_t0_gmv", + PhotoName: "photo_name", + PhotoIdStr: "photo_id_str", + PhotoId: "photo_id", + AdItemClick: "ad_item_click", + MerchantProductId: "merchant_product_id", + CostTotal: "cost_total", + EspClickRatio: "esp_click_ratio", + T0Gmv: "t0_gmv", + T0Roi: "t0_roi", + T0OrderCnt: "t0_order_cnt", + T0OrderCntCost: "t0_order_cnt_cost", + QcpxWhiteboxDirectOrderPaymentAmt: "qcpx_whitebox_direct_order_payment_amt", + QcpxWhiteboxDirectOrderCnt: "qcpx_whitebox_direct_order_cnt", + LivePlayCnt: "live_play_cnt", + ItemEntranceClkCnt: "item_entrance_clk_cnt", + ShowCnt: "show_cnt", + ReportDateStr: "report_date_str", + CampaignId: "campaign_id", + CampaignName: "campaign_name", + UnitId: "unit_id", + UnitName: "unit_name", + CreativeId: "creative_id", + CreativeName: "creative_name", + } +} diff --git a/model/entity/copydata/task_report.go b/model/entity/copydata/task_report.go new file mode 100644 index 0000000..63fb884 --- /dev/null +++ b/model/entity/copydata/task_report.go @@ -0,0 +1,133 @@ +package copydata + +import "gitea.com/red-future/common/beans" + +// TaskReport 调控任务数据实体 +type TaskReport struct { + beans.SQLBaseDO `orm:",inherit"` + + // 转化率相关字段 + ItemOrderConversionRatio *float64 `orm:"item_order_conversion_ratio" json:"itemOrderConversionRatio" description:"转化率"` + ItemCardClickRatio *float64 `orm:"item_card_click_ratio" json:"itemCardClickRatio" description:"点击率"` + ItemCardClkCnt *int64 `orm:"item_card_clk_cnt" json:"itemCardClkCnt" description:"商品卡点击数"` + LivePlayCntCost *float64 `orm:"live_play_cnt_cost" json:"livePlayCntCost" description:"直播间观看成本"` + AdMerchantFollowCost *float64 `orm:"ad_merchant_follow_cost" json:"adMerchantFollowCost" description:"涨粉成本"` + AdMerchantFollow *int64 `orm:"ad_merchant_follow" json:"adMerchantFollow" description:"涨粉数"` + NetT0OrderCnt *int64 `orm:"net_t0_order_cnt" json:"netT0OrderCnt" description:"当日累计净成交订单数"` + NetT0Roi *float64 `orm:"net_t0_roi" json:"netT0Roi" description:"净成交 ROI"` + NetT0Gmv *float64 `orm:"net_t0_gmv" json:"netT0Gmv" description:"净成交 GMV"` + + // 视频信息字段 + PhotoName string `orm:"photo_name" json:"photoName" description:"视频名称"` + PhotoId string `orm:"photo_id" json:"photoId" description:"视频 id"` + + // 核心指标字段 + CostTotal *float64 `orm:"cost_total" json:"costTotal" description:"花费"` + T0Gmv *float64 `orm:"t0_gmv" json:"t0Gmv" description:"当日累计 GMV"` + T0Roi *float64 `orm:"t0_roi" json:"t0Roi" description:"当日累计 ROI"` + T0OrderCnt *int64 `orm:"t0_order_cnt" json:"t0OrderCnt" description:"当日累计订单数"` + T0OrderCntCost *float64 `orm:"t0_order_cnt_cost" json:"t0OrderCntCost" description:"当日累计订单成本"` + + // 粉丝 GMV 字段 + FansT0Gmv *float64 `orm:"fans_t0_gmv" json:"fansT0Gmv" description:"涨粉当日 GMV"` + FansT1Gmv *float64 `orm:"fans_t1_gmv" json:"fansT1Gmv" description:"涨粉次日 GMV"` + FansT7Gmv *float64 `orm:"fans_t7_gmv" json:"fansT7Gmv" description:"涨粉 7 日 GMV"` + FansT15Gmv *float64 `orm:"fans_t15_gmv" json:"fansT15Gmv" description:"涨粉 15 日 GMV"` + FansT30Gmv *float64 `orm:"fans_t30_gmv" json:"fansT30Gmv" description:"涨粉 30 日 GMV"` + + // 粉丝 ROI 字段 + FansT0Roi *float64 `orm:"fans_t0_roi" json:"fansT0Roi" description:"涨粉当日 ROI"` + FansT1Roi *float64 `orm:"fans_t1_roi" json:"fansT1Roi" description:"涨粉次日 ROI"` + FansT7Roi *float64 `orm:"fans_t7_roi" json:"fansT7Roi" description:"涨粉 7 日 ROI"` + FansT15Roi *float64 `orm:"fans_t15_roi" json:"fansT15Roi" description:"涨粉 15 日 ROI"` + FansT30Roi *float64 `orm:"fans_t30_roi" json:"fansT30Roi" description:"涨粉 30 日 ROI"` + + // 全站数据字段 + LivePlayCnt *int64 `orm:"live_play_cnt" json:"livePlayCnt" description:"全站直播观看数"` + ItemEntranceClkCnt *int64 `orm:"item_entrance_clk_cnt" json:"itemEntranceClkCnt" description:"小黄车点击数"` + ShowCnt *int64 `orm:"show_cnt" json:"showCnt" description:"全站曝光"` + + // 时间字段 + ReportDateStr string `orm:"report_date_str" json:"reportDateStr" description:"时间(格式:YYYY-MM-DD)"` +} + +// TaskReportCol 调控任务数据表字段定义 +type TaskReportCol struct { + beans.SQLBaseCol + ItemOrderConversionRatio string + ItemCardClickRatio string + ItemCardClkCnt string + LivePlayCntCost string + AdMerchantFollowCost string + AdMerchantFollow string + NetT0OrderCnt string + NetT0Roi string + NetT0Gmv string + PhotoName string + PhotoId string + CostTotal string + T0Gmv string + T0Roi string + T0OrderCnt string + T0OrderCntCost string + FansT0Gmv string + FansT1Gmv string + FansT7Gmv string + FansT15Gmv string + FansT30Gmv string + FansT0Roi string + FansT1Roi string + FansT7Roi string + FansT15Roi string + FansT30Roi string + LivePlayCnt string + ItemEntranceClkCnt string + ShowCnt string + ReportDateStr string +} + +// TableName 返回表名 +func (e *TaskReport) TableName() string { + return "task_report" +} + +// GetCols 获取所有字段名 +func (e *TaskReport) GetCols() *TaskReportCol { + return &TaskReportCol{ + SQLBaseCol: beans.SQLBaseCol{ + Id: "id", + CreatedAt: "created_at", + UpdatedAt: "updated_at", + }, + ItemOrderConversionRatio: "item_order_conversion_ratio", + ItemCardClickRatio: "item_card_click_ratio", + ItemCardClkCnt: "item_card_clk_cnt", + LivePlayCntCost: "live_play_cnt_cost", + AdMerchantFollowCost: "ad_merchant_follow_cost", + AdMerchantFollow: "ad_merchant_follow", + NetT0OrderCnt: "net_t0_order_cnt", + NetT0Roi: "net_t0_roi", + NetT0Gmv: "net_t0_gmv", + PhotoName: "photo_name", + PhotoId: "photo_id", + CostTotal: "cost_total", + T0Gmv: "t0_gmv", + T0Roi: "t0_roi", + T0OrderCnt: "t0_order_cnt", + T0OrderCntCost: "t0_order_cnt_cost", + FansT0Gmv: "fans_t0_gmv", + FansT1Gmv: "fans_t1_gmv", + FansT7Gmv: "fans_t7_gmv", + FansT15Gmv: "fans_t15_gmv", + FansT30Gmv: "fans_t30_gmv", + FansT0Roi: "fans_t0_roi", + FansT1Roi: "fans_t1_roi", + FansT7Roi: "fans_t7_roi", + FansT15Roi: "fans_t15_roi", + FansT30Roi: "fans_t30_roi", + LivePlayCnt: "live_play_cnt", + ItemEntranceClkCnt: "item_entrance_clk_cnt", + ShowCnt: "show_cnt", + ReportDateStr: "report_date_str", + } +} diff --git a/model/entity/copydata/unit_report_detail.go b/model/entity/copydata/unit_report_detail.go new file mode 100644 index 0000000..34fca66 --- /dev/null +++ b/model/entity/copydata/unit_report_detail.go @@ -0,0 +1,198 @@ +package copydata + +import "gitea.com/red-future/common/beans" + +// UnitReportDetail 广告效果指标详情表实体 +type UnitReportDetail struct { + beans.SQLBaseDO `orm:",inherit"` + + T0OrderPaymentAmt *float64 `orm:"t0_order_payment_amt" json:"t0OrderPaymentAmt" description:"当日总成交订单金额"` + CreativeMaterialType string `orm:"creative_material_type" json:"creativeMaterialType" description:"视频素材类型(视频:HORIZONTAL_SCREEN, VERTICAL_SCREEN, UNKNOWN_TYPE;图集:ATLAS;长图:ATLAS_VERTICAL)"` + LiveName string `orm:"live_name" json:"liveName" description:"直播间名称"` + AuthorId string `orm:"author_id" json:"authorId" description:"直播用户快手 Id"` + PicUrl string `orm:"pic_url" json:"picUrl" description:"图片 URL"` + PicName string `orm:"pic_name" json:"picName" description:"图片名称"` + PicId string `orm:"pic_id" json:"picId" description:"图片 Id"` + CoverUrl string `orm:"cover_url" json:"coverUrl" description:"封面 URL"` + CoverId *int64 `orm:"cover_id" json:"coverId" description:"封面 Id"` + ItemOrderConversionRatio *float64 `orm:"item_order_conversion_ratio" json:"itemOrderConversionRatio" description:"转化率"` + ItemCardClickRatio *float64 `orm:"item_card_click_ratio" json:"itemCardClickRatio" description:"点击率"` + ItemCardClkCnt *int64 `orm:"item_card_clk_cnt" json:"itemCardClkCnt" description:"商品卡点击数"` + LivePlayCntCost *float64 `orm:"live_play_cnt_cost" json:"livePlayCntCost" description:"直播间观看成本"` + AdMerchantFollowCost *float64 `orm:"ad_merchant_follow_cost" json:"adMerchantFollowCost" description:"涨粉成本"` + AdMerchantFollow *int64 `orm:"ad_merchant_follow" json:"adMerchantFollow" description:"涨粉数"` + NetT0OrderCnt *int64 `orm:"net_t0_order_cnt" json:"netT0OrderCnt" description:"当日累计净成交订单数"` + NetT0Roi *float64 `orm:"net_t0_roi" json:"netT0Roi" description:"净成交 ROI"` + NetT0Gmv *float64 `orm:"net_t0_gmv" json:"netT0Gmv" description:"净成交 GMV"` + PhotoName string `orm:"photo_name" json:"photoName" description:"视频名称"` + PhotoIdStr string `orm:"photo_id_str" json:"photoIdStr" description:"视频 id"` + PhotoId string `orm:"photo_id" json:"photoId" description:"视频 id"` + ModPriceSegment string `orm:"mod_price_segment" json:"modPriceSegment" description:"设备价格区间,"0-500", "501-1000", "1001-1500", "1501-2000", "2001-2500", "2501-3000", "3001-3500", "3501-4000", "4001-4500", "4501-5000", "5001-5500", "5501+", "未知""` + AgeSegment string `orm:"age_segment" json:"ageSegment" description:"年龄段"0-17", "18-23", "24-30", "31-40", "41-49", "50+","未知""` + Province string `orm:"province" json:"province" description:"省份名称"` + Gender string `orm:"gender" json:"gender" description:"男,女,未知三种类型"` + AdPhotoPlayedFiveRatio *float64 `orm:"ad_photo_played_five_ratio" json:"adPhotoPlayedFiveRatio" description:"作品 5 秒播放率"` + AdPhotoPlayedThreeRatio *float64 `orm:"ad_photo_played_three_ratio" json:"adPhotoPlayedThreeRatio" description:"作品 3 秒播放率"` + OrderSubmitRoi *float64 `orm:"order_submit_roi" json:"orderSubmitRoi" description:"订单提交 ROI"` + OrderSubmitAmt *int64 `orm:"order_submit_amt" json:"orderSubmitAmt" description:"外部订单金额"` + EventOrderSubmitCost *float64 `orm:"event_order_submit_cost" json:"eventOrderSubmitCost" description:"订单提交成本"` + EventOrderSubmit *int64 `orm:"event_order_submit" json:"eventOrderSubmit" description:"订单提交数"` + EventOrderPaidRoi *float64 `orm:"event_order_paid_roi" json:"eventOrderPaidRoi" description:"订单支付率"` + EventAppInvoked *int64 `orm:"event_app_invoked" json:"eventAppInvoked" description:"唤起应用数"` + EventAddShoppingCart *int64 `orm:"event_add_shopping_cart" json:"eventAddShoppingCart" description:"添加购物车次数"` + ConversionNumCost *float64 `orm:"conversion_num_cost" json:"conversionNumCost" description:"转化成本(回传时间)"` + AdEffectivePlayNum *int64 `orm:"ad_effective_play_num" json:"adEffectivePlayNum" description:"有效播放数"` + AdItemClick *int64 `orm:"ad_item_click" json:"adItemClick" description:"行为数"` + MerchantProductId string `orm:"merchant_product_id" json:"merchantProductId" description:"商品 ID"` + CostTotal *float64 `orm:"cost_total" json:"costTotal" description:"花费"` + AdShow *int64 `orm:"ad_show" json:"adShow" description:"曝光数"` + AdShow1kCost *float64 `orm:"ad_show1k_cost" json:"adShow1kCost" description:"平均千次广告曝光花费"` + Impression *int64 `orm:"impression" json:"impression" description:"封面曝光数"` + PhotoClick *int64 `orm:"photo_click" json:"photoClick" description:"封面点击数"` + PhotoClickRatio *float64 `orm:"photo_click_ratio" json:"photoClickRatio" description:"封面点击率"` + Click *int64 `orm:"click" json:"click" description:"素材曝光数"` + ActionbarClick *int64 `orm:"actionbar_click" json:"actionbarClick" description:"行为数"` + ActionbarClickCost *float64 `orm:"actionbar_click_cost" json:"actionbarClickCost" description:"行为成本"` + EspClickRatio *float64 `orm:"esp_click_ratio" json:"espClickRatio" description:"行为率"` + ActionRatio *float64 `orm:"action_ratio" json:"actionRatio" description:"素材点击率"` + AdItemClickCount *int64 `orm:"ad_item_click_count" json:"adItemClickCount" description:"预约组件点击数"` + EspLivePlayedSeconds *int64 `orm:"esp_live_played_seconds" json:"espLivePlayedSeconds" description:"直播平均观看时长"` + PlayedThreeSeconds *int64 `orm:"played_three_seconds" json:"playedThreeSeconds" description:"作品 3 秒播放数"` + Play3sRatio *float64 `orm:"play3s_ratio" json:"play3sRatio" description:"作品 3 秒播放率"` + PlayedFiveSeconds *int64 `orm:"played_five_seconds" json:"playedFiveSeconds" description:"作品 5 秒播放数"` + Play5sRatio *float64 `orm:"play5s_ratio" json:"play5sRatio" description:"作品 5 秒播放率"` + PlayedEnd *int64 `orm:"played_end" json:"playedEnd" description:"作品完播数"` + PlayEndRatio *float64 `orm:"play_end_ratio" json:"playEndRatio" description:"作品完播率"` + Share *int64 `orm:"share" json:"share" description:"作品分享数"` + Comment *int64 `orm:"comment" json:"comment" description:"作品评论数"` + Likes *int64 `orm:"likes" json:"likes" description:"作品点赞数"` + Report *int64 `orm:"report" json:"report" description:"作品举报数"` + Block *int64 `orm:"block" json:"block" description:"作品拉黑数"` + ItemNegative *int64 `orm:"item_negative" json:"itemNegative" description:"详情页减少此类作品数"` + LiveShare *int64 `orm:"live_share" json:"liveShare" description:"直播送礼数"` + LiveComment *int64 `orm:"live_comment" json:"liveComment" description:"直播评论数"` + LiveReward *int64 `orm:"live_reward" json:"liveReward" description:"直播送礼数"` + EffectivePlayCount *int64 `orm:"effective_play_count" json:"effectivePlayCount" description:"有效播放数"` + EffectivePlayRatio *float64 `orm:"effective_play_ratio" json:"effectivePlayRatio" description:"有效播放率"` + ConversionNum *int64 `orm:"conversion_num" json:"conversionNum" description:"转化数"` + ConversionCostEsp *float64 `orm:"conversion_cost_esp" json:"conversionCostEsp" description:"转化成本"` + Roi *float64 `orm:"roi" json:"roi" description:"直接 ROI"` + Gmv *float64 `orm:"gmv" json:"gmv" description:"直接 GMV"` + T0Gmv *float64 `orm:"t0_gmv" json:"t0Gmv" description:"当日累计 GMV"` + T1Gmv *float64 `orm:"t1_gmv" json:"t1Gmv" description:"次日累计 GMV"` + T7Gmv *float64 `orm:"t7_gmv" json:"t7Gmv" description:"7 日累计 GMV"` + T15Gmv *float64 `orm:"t15_gmv" json:"t15Gmv" description:"15 日累计 GMV"` + T30Gmv *float64 `orm:"t30_gmv" json:"t30Gmv" description:"30 日累计 GMV"` + T0Roi *float64 `orm:"t0_roi" json:"t0Roi" description:"当日累计 ROI"` + T1Roi *float64 `orm:"t1_roi" json:"t1Roi" description:"次日累计 ROI"` + T7Roi *float64 `orm:"t7_roi" json:"t7Roi" description:"7 日累计 ROI"` + T15Roi *float64 `orm:"t15_roi" json:"t15Roi" description:"15 日累计 ROI"` + T30Roi *float64 `orm:"t30_roi" json:"t30Roi" description:"30 日累计 ROI"` + PaiedOrder *int64 `orm:"paied_order" json:"paiedOrder" description:"直接订单数"` + OrderRatio *float64 `orm:"order_ratio" json:"orderRatio" description:"直接下单率"` + T0OrderCnt *int64 `orm:"t0_order_cnt" json:"t0OrderCnt" description:"当日累计订单数"` + T0OrderCntCost *float64 `orm:"t0_order_cnt_cost" json:"t0OrderCntCost" description:"当日累计订单成本"` + T0OrderCntRatio *float64 `orm:"t0_order_cnt_ratio" json:"t0OrderCntRatio" description:"累计订单下单率"` + T1OrderCnt *int64 `orm:"t1_order_cnt" json:"t1OrderCnt" description:"次日累计订单数"` + T7OrderCnt *int64 `orm:"t7_order_cnt" json:"t7OrderCnt" description:"7 日累计订单数"` + T15OrderCnt *int64 `orm:"t15_order_cnt" json:"t15OrderCnt" description:"15 日累计订单数"` + T30OrderCnt *int64 `orm:"t30_order_cnt" json:"t30OrderCnt" description:"30 日累计订单数"` + MerchantRecoFans *int64 `orm:"merchant_reco_fans" json:"merchantRecoFans" description:"涨粉数"` + T1Retention *float64 `orm:"t1_retention" json:"t1Retention" description:"次日涨粉留存数"` + T7Retention *float64 `orm:"t7_retention" json:"t7Retention" description:"7 日涨粉留存数"` + T15Retention *float64 `orm:"t15_retention" json:"t15Retention" description:"15 日涨粉留存数"` + T30Retention *float64 `orm:"t30_retention" json:"t30Retention" description:"30 日涨粉留存数"` + T1RetentionRatio *float64 `orm:"t1_retention_ratio" json:"t1RetentionRatio" description:"次日涨粉留存率"` + T7RetentionRatio *float64 `orm:"t7_retention_ratio" json:"t7RetentionRatio" description:"7 日涨粉留存率"` + T15RetentionRatio *float64 `orm:"t15_retention_ratio" json:"t15RetentionRatio" description:"15 日涨粉留存率"` + T30RetentionRatio *float64 `orm:"t30_retention_ratio" json:"t30RetentionRatio" description:"30 日涨粉留存率"` + ReservationSuccess *int64 `orm:"reservation_success" json:"reservationSuccess" description:"直播预约成功数"` + ReservationCost *float64 `orm:"reservation_cost" json:"reservationCost" description:"直播预约成功成本"` + StandardLivePlayedStarted *int64 `orm:"standard_live_played_started" json:"standardLivePlayedStarted" description:"直播观看数"` + AdLivePlayCnt *int64 `orm:"ad_live_play_cnt" json:"adLivePlayCnt" description:"直播间人气数"` + AdLivePlayCntCost *float64 `orm:"ad_live_play_cnt_cost" json:"adLivePlayCntCost" description:"直播间人气成本"` + LiveAudienceCost *float64 `orm:"live_audience_cost" json:"liveAudienceCost" description:"直播观看成本"` + LiveEventGoodsView *int64 `orm:"live_event_goods_view" json:"liveEventGoodsView" description:"直播间商品点击数"` + GoodsClickRatio *float64 `orm:"goods_click_ratio" json:"goodsClickRatio" description:"直播间商品点击率"` + DirectAttrPlatNewBuyerCnt *int64 `orm:"direct_attr_plat_new_buyer_cnt" json:"directAttrPlatNewBuyerCnt" description:"直接平台新客"` + T30AttrPlatTotalBuyerCnt *int64 `orm:"t30_attr_plat_total_buyer_cnt" json:"t30AttrPlatTotalBuyerCnt" description:"30 日累计平台新客"` + DirectAttrSellerNewBuyerCnt *int64 `orm:"direct_attr_seller_new_buyer_cnt" json:"directAttrSellerNewBuyerCnt" description:"直接店铺新客"` + T30AttrSellerTotalBuyerCnt *int64 `orm:"t30_attr_seller_total_buyer_cnt" json:"t30AttrSellerTotalBuyerCnt" description:"30 日累计店铺新客"` + T3Gmv *float64 `orm:"t3_gmv" json:"t3Gmv" description:"3 日累计 GMV"` + T3OrderCnt *int64 `orm:"t3_order_cnt" json:"t3OrderCnt" description:"3 日累计订单数"` + T3Roi *float64 `orm:"t3_roi" json:"t3Roi" description:"3 日累计 ROI"` + T7IndirectOrderAmt *float64 `orm:"t7_indirect_order_amt" json:"t7IndirectOrderAmt" description:"7 日间接订单金额"` + T7IndirectOrderCnt *int64 `orm:"t7_indirect_order_cnt" json:"t7IndirectOrderCnt" description:"7 日间接订单数"` + FansT0GmvPerFans *float64 `orm:"fans_t0_gmv_per_fans" json:"fansT0GmvPerFans" description:"新增粉丝人均销售额"` + FansT3GmvPerFans *float64 `orm:"fans_t3_gmv_per_fans" json:"fansT3GmvPerFans" description:"3 日新增粉丝人均销售额"` + FansT7GmvPerFans *float64 `orm:"fans_t7_gmv_per_fans" json:"fansT7GmvPerFans" description:"7 日新增粉丝人均销售额"` + FansT15GmvPerFans *float64 `orm:"fans_t15_gmv_per_fans" json:"fansT15GmvPerFans" description:"15 日新增粉丝人均销售额"` + FansT30GmvPerFans *float64 `orm:"fans_t30_gmv_per_fans" json:"fansT30GmvPerFans" description:"30 日新增粉丝人均销售额"` + RecoFansCost *float64 `orm:"reco_fans_cost" json:"recoFansCost" description:"涨粉成本"` + QcpxWhiteboxDirectOrderPaymentAmt *float64 `orm:"qcpx_whitebox_direct_order_payment_amt" json:"qcpxWhiteboxDirectOrderPaymentAmt" description:"智能优惠券订单 GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `orm:"qcpx_whitebox_direct_order_cnt" json:"qcpxWhiteboxDirectOrderCnt" description:"智能优惠券订单数"` + FansT0Gmv *float64 `orm:"fans_t0_gmv" json:"fansT0Gmv" description:"涨粉当日 GMV"` + FansT1Gmv *float64 `orm:"fans_t1_gmv" json:"fansT1Gmv" description:"涨粉次日 GMV"` + FansT7Gmv *float64 `orm:"fans_t7_gmv" json:"fansT7Gmv" description:"涨粉 7 日 GMV"` + FansT15Gmv *float64 `orm:"fans_t15_gmv" json:"fansT15Gmv" description:"涨粉 15 日 GMV"` + FansT30Gmv *float64 `orm:"fans_t30_gmv" json:"fansT30Gmv" description:"涨粉 30 日 GMV"` + FansT0Roi *float64 `orm:"fans_t0_roi" json:"fansT0Roi" description:"涨粉当日 ROI"` + FansT1Roi *float64 `orm:"fans_t1_roi" json:"fansT1Roi" description:"涨粉次日 ROI"` + FansT7Roi *float64 `orm:"fans_t7_roi" json:"fansT7Roi" description:"涨粉 7 日 ROI"` + FansT15Roi *float64 `orm:"fans_t15_roi" json:"fansT15Roi" description:"涨粉 15 日 ROI"` + FansT30Roi *float64 `orm:"fans_t30_roi" json:"fansT30Roi" description:"涨粉 30 日 ROI"` + T0ShopNewBuyerOrderPaymentAmt *float64 `orm:"t0_shop_new_buyer_order_payment_amt" json:"t0ShopNewBuyerOrderPaymentAmt" description:"当日新客 GMV"` + T1ShopNewBuyerOrderPaymentAmt *float64 `orm:"t1_shop_new_buyer_order_payment_amt" json:"t1ShopNewBuyerOrderPaymentAmt" description:"投后 1 日新客 GMV"` + T3ShopNewBuyerOrderPaymentAmt *float64 `orm:"t3_shop_new_buyer_order_payment_amt" json:"t3ShopNewBuyerOrderPaymentAmt" description:"投后 3 日新客 GMV"` + T7ShopNewBuyerOrderPaymentAmt *float64 `orm:"t7_shop_new_buyer_order_payment_amt" json:"t7ShopNewBuyerOrderPaymentAmt" description:"投后 7 日新客 GMV"` + T15ShopNewBuyerOrderPaymentAmt *float64 `orm:"t15_shop_new_buyer_order_payment_amt" json:"t15ShopNewBuyerOrderPaymentAmt" description:"投后 15 日新客 GMV"` + T30ShopNewBuyerOrderPaymentAmt *float64 `orm:"t30_shop_new_buyer_order_payment_amt" json:"t30ShopNewBuyerOrderPaymentAmt" description:"投后 30 日新客 GMV"` + T0ShopNewBuyerOrderCnt *int64 `orm:"t0_shop_new_buyer_order_cnt" json:"t0ShopNewBuyerOrderCnt" description:"当日新客成交订单量"` + T1ShopNewBuyerOrderCnt *int64 `orm:"t1_shop_new_buyer_order_cnt" json:"t1ShopNewBuyerOrderCnt" description:"投后 1 日新客成交订单量"` + T3ShopNewBuyerOrderCnt *int64 `orm:"t3_shop_new_buyer_order_cnt" json:"t3ShopNewBuyerOrderCnt" description:"投后 3 日新客成交订单量"` + T7ShopNewBuyerOrderCnt *int64 `orm:"t7_shop_new_buyer_order_cnt" json:"t7ShopNewBuyerOrderCnt" description:"投后 7 日新客成交订单量"` + T15ShopNewBuyerOrderCnt *int64 `orm:"t15_shop_new_buyer_order_cnt" json:"t15ShopNewBuyerOrderCnt" description:"投后 15 日新客成交订单量"` + T30ShopNewBuyerOrderCnt *int64 `orm:"t30_shop_new_buyer_order_cnt" json:"t30ShopNewBuyerOrderCnt" description:"投后 30 日新客成交订单量"` + T1NewBuyerRepurchaseRatio *float64 `orm:"t1_new_buyer_repurchase_ratio" json:"t1NewBuyerRepurchaseRatio" description:"投后 1 日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `orm:"t3_new_buyer_repurchase_ratio" json:"t3NewBuyerRepurchaseRatio" description:"投后 3 日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `orm:"t7_new_buyer_repurchase_ratio" json:"t7NewBuyerRepurchaseRatio" description:"投后 7 日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `orm:"t15_new_buyer_repurchase_ratio" json:"t15NewBuyerRepurchaseRatio" description:"投后 15 日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `orm:"t30_new_buyer_repurchase_ratio" json:"t30NewBuyerRepurchaseRatio" description:"投后 30 日新客复购率"` + T0ShopNewBuyerRoi *float64 `orm:"t0_shop_new_buyer_roi" json:"t0ShopNewBuyerRoi" description:"投后当日新客 ROI"` + T1ShopNewBuyerRoi *float64 `orm:"t1_shop_new_buyer_roi" json:"t1ShopNewBuyerRoi" description:"投后 1 日新客 ROI"` + T3ShopNewBuyerRoi *float64 `orm:"t3_shop_new_buyer_roi" json:"t3ShopNewBuyerRoi" description:"投后 3 日新客 ROI"` + T7ShopNewBuyerRoi *float64 `orm:"t7_shop_new_buyer_roi" json:"t7ShopNewBuyerRoi" description:"投后 7 日新客 ROI"` + T15ShopNewBuyerRoi *float64 `orm:"t15_shop_new_buyer_roi" json:"t15ShopNewBuyerRoi" description:"投后 15 日新客 ROI"` + T30ShopNewBuyerRoi *float64 `orm:"t30_shop_new_buyer_roi" json:"t30ShopNewBuyerRoi" description:"投后 30 日新客 ROI"` + CreateCardOrderCnt *int64 `orm:"create_card_order_cnt" json:"createCardOrderCnt" description:"有效制卡订单数(回传时间)"` + ForwardTsCreateCardOrderCnt *int64 `orm:"forward_ts_create_card_order_cnt" json:"forwardTsCreateCardOrderCnt" description:"有效制卡订单数(计费时间)"` + CreateCardOrderCost *float64 `orm:"create_card_order_cost" json:"createCardOrderCost" description:"有效制卡订单成本(回传时间)"` + ForwardTsCreateCardOrderCost *float64 `orm:"forward_ts_create_card_order_cost" json:"forwardTsCreateCardOrderCost" description:"有效制卡订单成本(计费时间)"` + ActivateCardOrderCnt *int64 `orm:"activate_card_order_cnt" json:"activateCardOrderCnt" description:"电话卡激活订单数(回传时间)"` + ForwardTsActivateCardOrderCnt *int64 `orm:"forward_ts_activate_card_order_cnt" json:"forwardTsActivateCardOrderCnt" description:"电话卡激活订单数(计费时间)"` + ActivateCardOrderCost *float64 `orm:"activate_card_order_cost" json:"activateCardOrderCost" description:"电话卡激活订单成本(回传时间)"` + ForwardTsActivateCardOrderCost *float64 `orm:"forward_ts_activate_card_order_cost" json:"forwardTsActivateCardOrderCost" description:"电话卡激活订单成本(计费时间)"` + CreateCardOrderRatio *float64 `orm:"create_card_order_ratio" json:"createCardOrderRatio" description:"有效制卡订单率(回传时间)"` + ForwardTsCreateCardOrderRatio *float64 `orm:"forward_ts_create_card_order_ratio" json:"forwardTsCreateCardOrderRatio" description:"有效制卡订单率(计费时间)"` + ActivateCardOrderCntRatio *float64 `orm:"activate_card_order_cnt_ratio" json:"activateCardOrderCntRatio" description:"电话卡激活率(回传时间)"` + ForwardTsActivateCardOrderRatio *float64 `orm:"forward_ts_activate_card_order_ratio" json:"forwardTsActivateCardOrderRatio" description:"电话卡激活率(计费时间)"` + LivePlayCnt *int64 `orm:"live_play_cnt" json:"livePlayCnt" description:"全站直播观看数"` + ItemEntranceClkCnt *int64 `orm:"item_entrance_clk_cnt" json:"itemEntranceClkCnt" description:"小黄车点击数"` + ShowCnt *int64 `orm:"show_cnt" json:"showCnt" description:"全站曝光"` + ReportDateStr string `orm:"report_date_str" json:"reportDateStr" description:"时间"` + CampaignId *int64 `orm:"campaign_id" json:"campaignId" description:"计划 ID"` + CampaignName string `orm:"campaign_name" json:"campaignName" description:"计划名称"` + UnitId *int64 `orm:"unit_id" json:"unitId" description:"单元 ID"` + UnitName string `orm:"unit_name" json:"unitName" description:"单元名称"` + CreativeId *int64 `orm:"creative_id" json:"creativeId" description:"创意 ID"` + CreativeName string `orm:"creative_name" json:"creativeName" description:"创意名称"` + CidActualRoiAfterSubsidy *float64 `orm:"cid_actual_roi_after_subsidy" json:"cidActualRoiAfterSubsidy" description:"补贴后实际 ROI"` + CidCouponAmount *int64 `orm:"cid_coupon_amount" json:"cidCouponAmount" description:"核销券金额"` + CidCouponCallbackPaidRefundAmount *int64 `orm:"cid_coupon_callback_paid_refund_amount" json:"cidCouponCallbackPaidRefundAmount" description:"退单有回传_核销券金额"` + CidVoucherCost *float64 `orm:"cid_voucher_cost" json:"cidVoucherCost" description:"券成本"` +} + +// TableName 返回表名 +func (e *UnitReportDetail) TableName() string { + return "unit_report_detail" +} diff --git a/model/entity/copydata/unit_report_sum.go b/model/entity/copydata/unit_report_sum.go new file mode 100644 index 0000000..fa7fb14 --- /dev/null +++ b/model/entity/copydata/unit_report_sum.go @@ -0,0 +1,199 @@ +package copydata + +import "gitea.com/red-future/common/beans" + +// UnitReportSum 广告效果指标表实体 +type UnitReportSum struct { + beans.SQLBaseDO `orm:",inherit"` + + // 基础字段 + T0OrderPaymentAmt *float64 `orm:"t0_order_payment_amt" json:"t0OrderPaymentAmt" description:"当日总成交订单金额"` + CreativeMaterialType string `orm:"creative_material_type" json:"creativeMaterialType" description:"视频素材类型(视频:HORIZONTAL_SCREEN, VERTICAL_SCREEN, UNKNOWN_TYPE;图集:ATLAS;长图:ATLAS_VERTICAL)"` + LiveName string `orm:"live_name" json:"liveName" description:"直播间名称"` + AuthorId string `orm:"author_id" json:"authorId" description:"直播用户快手 Id"` + PicUrl string `orm:"pic_url" json:"picUrl" description:"图片 URL"` + PicName string `orm:"pic_name" json:"picName" description:"图片名称"` + PicId string `orm:"pic_id" json:"picId" description:"图片 Id"` + CoverUrl string `orm:"cover_url" json:"coverUrl" description:"封面 URL"` + CoverId *int64 `orm:"cover_id" json:"coverId" description:"封面 Id"` + ItemOrderConversionRatio *float64 `orm:"item_order_conversion_ratio" json:"itemOrderConversionRatio" description:"转化率"` + ItemCardClickRatio *float64 `orm:"item_card_click_ratio" json:"itemCardClickRatio" description:"点击率"` + ItemCardClkCnt *int64 `orm:"item_card_clk_cnt" json:"itemCardClkCnt" description:"商品卡点击数"` + LivePlayCntCost *float64 `orm:"live_play_cnt_cost" json:"livePlayCntCost" description:"直播间观看成本"` + AdMerchantFollowCost *float64 `orm:"ad_merchant_follow_cost" json:"adMerchantFollowCost" description:"涨粉成本"` + AdMerchantFollow *int64 `orm:"ad_merchant_follow" json:"adMerchantFollow" description:"涨粉数"` + NetT0OrderCnt *int64 `orm:"net_t0_order_cnt" json:"netT0OrderCnt" description:"当日累计净成交订单数"` + NetT0Roi *float64 `orm:"net_t0_roi" json:"netT0Roi" description:"净成交 ROI"` + NetT0Gmv *float64 `orm:"net_t0_gmv" json:"netT0Gmv" description:"净成交 GMV"` + PhotoName string `orm:"photo_name" json:"photoName" description:"视频名称"` + PhotoIdStr string `orm:"photo_id_str" json:"photoIdStr" description:"视频 id"` + PhotoId string `orm:"photo_id" json:"photoId" description:"视频 id"` + ModPriceSegment string `orm:"mod_price_segment" json:"modPriceSegment" description:"设备价格区间,"0-500", "501-1000", "1001-1500", "1501-2000", "2001-2500", "2501-3000", "3001-3500", "3501-4000", "4001-4500", "4501-5000", "5001-5500", "5501+", "未知""` + AgeSegment string `orm:"age_segment" json:"ageSegment" description:"年龄段"0-17", "18-23", "24-30", "31-40", "41-49", "50+","未知""` + Province string `orm:"province" json:"province" description:"省份名称"` + Gender string `orm:"gender" json:"gender" description:"男,女,未知三种类型"` + AdPhotoPlayedFiveRatio *float64 `orm:"ad_photo_played_five_ratio" json:"adPhotoPlayedFiveRatio" description:"作品 5 秒播放率"` + AdPhotoPlayedThreeRatio *float64 `orm:"ad_photo_played_three_ratio" json:"adPhotoPlayedThreeRatio" description:"作品 3 秒播放率"` + OrderSubmitRoi *float64 `orm:"order_submit_roi" json:"orderSubmitRoi" description:"订单提交 ROI"` + OrderSubmitAmt *int64 `orm:"order_submit_amt" json:"orderSubmitAmt" description:"外部订单金额"` + EventOrderSubmitCost *float64 `orm:"event_order_submit_cost" json:"eventOrderSubmitCost" description:"订单提交成本"` + EventOrderSubmit *int64 `orm:"event_order_submit" json:"eventOrderSubmit" description:"订单提交数"` + EventOrderPaidRoi *float64 `orm:"event_order_paid_roi" json:"eventOrderPaidRoi" description:"订单支付率"` + EventAppInvoked *int64 `orm:"event_app_invoked" json:"eventAppInvoked" description:"唤起应用数"` + EventAddShoppingCart *int64 `orm:"event_add_shopping_cart" json:"eventAddShoppingCart" description:"添加购物车次数"` + ConversionNumCost *float64 `orm:"conversion_num_cost" json:"conversionNumCost" description:"转化成本(回传时间)"` + AdEffectivePlayNum *int64 `orm:"ad_effective_play_num" json:"adEffectivePlayNum" description:"有效播放数"` + AdItemClick *int64 `orm:"ad_item_click" json:"adItemClick" description:"行为数"` + MerchantProductId string `orm:"merchant_product_id" json:"merchantProductId" description:"商品 ID"` + CostTotal *float64 `orm:"cost_total" json:"costTotal" description:"花费"` + AdShow *int64 `orm:"ad_show" json:"adShow" description:"曝光数"` + AdShow1kCost *float64 `orm:"ad_show1k_cost" json:"adShow1kCost" description:"平均千次广告曝光花费"` + Impression *int64 `orm:"impression" json:"impression" description:"封面曝光数"` + PhotoClick *int64 `orm:"photo_click" json:"photoClick" description:"封面点击数"` + PhotoClickRatio *float64 `orm:"photo_click_ratio" json:"photoClickRatio" description:"封面点击率"` + Click *int64 `orm:"click" json:"click" description:"素材曝光数"` + ActionbarClick *int64 `orm:"actionbar_click" json:"actionbarClick" description:"行为数"` + ActionbarClickCost *float64 `orm:"actionbar_click_cost" json:"actionbarClickCost" description:"行为成本"` + EspClickRatio *float64 `orm:"esp_click_ratio" json:"espClickRatio" description:"行为率"` + ActionRatio *float64 `orm:"action_ratio" json:"actionRatio" description:"素材点击率"` + AdItemClickCount *int64 `orm:"ad_item_click_count" json:"adItemClickCount" description:"预约组件点击数"` + EspLivePlayedSeconds *int64 `orm:"esp_live_played_seconds" json:"espLivePlayedSeconds" description:"直播平均观看时长"` + PlayedThreeSeconds *int64 `orm:"played_three_seconds" json:"playedThreeSeconds" description:"作品 3 秒播放数"` + Play3sRatio *float64 `orm:"play3s_ratio" json:"play3sRatio" description:"作品 3 秒播放率"` + PlayedFiveSeconds *int64 `orm:"played_five_seconds" json:"playedFiveSeconds" description:"作品 5 秒播放数"` + Play5sRatio *float64 `orm:"play5s_ratio" json:"play5sRatio" description:"作品 5 秒播放率"` + PlayedEnd *int64 `orm:"played_end" json:"playedEnd" description:"作品完播数"` + PlayEndRatio *float64 `orm:"play_end_ratio" json:"playEndRatio" description:"作品完播率"` + Share *int64 `orm:"share" json:"share" description:"作品分享数"` + Comment *int64 `orm:"comment" json:"comment" description:"作品评论数"` + Likes *int64 `orm:"likes" json:"likes" description:"作品点赞数"` + Report *int64 `orm:"report" json:"report" description:"作品举报数"` + Block *int64 `orm:"block" json:"block" description:"作品拉黑数"` + ItemNegative *int64 `orm:"item_negative" json:"itemNegative" description:"详情页减少此类作品数"` + LiveShare *int64 `orm:"live_share" json:"liveShare" description:"直播送礼数"` + LiveComment *int64 `orm:"live_comment" json:"liveComment" description:"直播评论数"` + LiveReward *int64 `orm:"live_reward" json:"liveReward" description:"直播送礼数"` + EffectivePlayCount *int64 `orm:"effective_play_count" json:"effectivePlayCount" description:"有效播放数"` + EffectivePlayRatio *float64 `orm:"effective_play_ratio" json:"effectivePlayRatio" description:"有效播放率"` + ConversionNum *int64 `orm:"conversion_num" json:"conversionNum" description:"转化数"` + ConversionCostEsp *float64 `orm:"conversion_cost_esp" json:"conversionCostEsp" description:"转化成本"` + Roi *float64 `orm:"roi" json:"roi" description:"直接 ROI"` + Gmv *float64 `orm:"gmv" json:"gmv" description:"直接 GMV"` + T0Gmv *float64 `orm:"t0_gmv" json:"t0Gmv" description:"当日累计 GMV"` + T1Gmv *float64 `orm:"t1_gmv" json:"t1Gmv" description:"次日累计 GMV"` + T7Gmv *float64 `orm:"t7_gmv" json:"t7Gmv" description:"7 日累计 GMV"` + T15Gmv *float64 `orm:"t15_gmv" json:"t15Gmv" description:"15 日累计 GMV"` + T30Gmv *float64 `orm:"t30_gmv" json:"t30Gmv" description:"30 日累计 GMV"` + T0Roi *float64 `orm:"t0_roi" json:"t0Roi" description:"当日累计 ROI"` + T1Roi *float64 `orm:"t1_roi" json:"t1Roi" description:"次日累计 ROI"` + T7Roi *float64 `orm:"t7_roi" json:"t7Roi" description:"7 日累计 ROI"` + T15Roi *float64 `orm:"t15_roi" json:"t15Roi" description:"15 日累计 ROI"` + T30Roi *float64 `orm:"t30_roi" json:"t30Roi" description:"30 日累计 ROI"` + PaiedOrder *int64 `orm:"paied_order" json:"paiedOrder" description:"直接订单数"` + OrderRatio *float64 `orm:"order_ratio" json:"orderRatio" description:"直接下单率"` + T0OrderCnt *int64 `orm:"t0_order_cnt" json:"t0OrderCnt" description:"当日累计订单数"` + T0OrderCntCost *float64 `orm:"t0_order_cnt_cost" json:"t0OrderCntCost" description:"当日累计订单成本"` + T0OrderCntRatio *float64 `orm:"t0_order_cnt_ratio" json:"t0OrderCntRatio" description:"累计订单下单率"` + T1OrderCnt *int64 `orm:"t1_order_cnt" json:"t1OrderCnt" description:"次日累计订单数"` + T7OrderCnt *int64 `orm:"t7_order_cnt" json:"t7OrderCnt" description:"7 日累计订单数"` + T15OrderCnt *int64 `orm:"t15_order_cnt" json:"t15OrderCnt" description:"15 日累计订单数"` + T30OrderCnt *int64 `orm:"t30_order_cnt" json:"t30OrderCnt" description:"30 日累计订单数"` + MerchantRecoFans *int64 `orm:"merchant_reco_fans" json:"merchantRecoFans" description:"涨粉数"` + T1Retention *float64 `orm:"t1_retention" json:"t1Retention" description:"次日涨粉留存数"` + T7Retention *float64 `orm:"t7_retention" json:"t7Retention" description:"7 日涨粉留存数"` + T15Retention *float64 `orm:"t15_retention" json:"t15Retention" description:"15 日涨粉留存数"` + T30Retention *float64 `orm:"t30_retention" json:"t30Retention" description:"30 日涨粉留存数"` + T1RetentionRatio *float64 `orm:"t1_retention_ratio" json:"t1RetentionRatio" description:"次日涨粉留存率"` + T7RetentionRatio *float64 `orm:"t7_retention_ratio" json:"t7RetentionRatio" description:"7 日涨粉留存率"` + T15RetentionRatio *float64 `orm:"t15_retention_ratio" json:"t15RetentionRatio" description:"15 日涨粉留存率"` + T30RetentionRatio *float64 `orm:"t30_retention_ratio" json:"t30RetentionRatio" description:"30 日涨粉留存率"` + ReservationSuccess *int64 `orm:"reservation_success" json:"reservationSuccess" description:"直播预约成功数"` + ReservationCost *float64 `orm:"reservation_cost" json:"reservationCost" description:"直播预约成功成本"` + StandardLivePlayedStarted *int64 `orm:"standard_live_played_started" json:"standardLivePlayedStarted" description:"直播观看数"` + AdLivePlayCnt *int64 `orm:"ad_live_play_cnt" json:"adLivePlayCnt" description:"直播间人气数"` + AdLivePlayCntCost *float64 `orm:"ad_live_play_cnt_cost" json:"adLivePlayCntCost" description:"直播间人气成本"` + LiveAudienceCost *float64 `orm:"live_audience_cost" json:"liveAudienceCost" description:"直播观看成本"` + LiveEventGoodsView *int64 `orm:"live_event_goods_view" json:"liveEventGoodsView" description:"直播间商品点击数"` + GoodsClickRatio *float64 `orm:"goods_click_ratio" json:"goodsClickRatio" description:"直播间商品点击率"` + DirectAttrPlatNewBuyerCnt *int64 `orm:"direct_attr_plat_new_buyer_cnt" json:"directAttrPlatNewBuyerCnt" description:"直接平台新客"` + T30AttrPlatTotalBuyerCnt *int64 `orm:"t30_attr_plat_total_buyer_cnt" json:"t30AttrPlatTotalBuyerCnt" description:"30 日累计平台新客"` + DirectAttrSellerNewBuyerCnt *int64 `orm:"direct_attr_seller_new_buyer_cnt" json:"directAttrSellerNewBuyerCnt" description:"直接店铺新客"` + T30AttrSellerTotalBuyerCnt *int64 `orm:"t30_attr_seller_total_buyer_cnt" json:"t30AttrSellerTotalBuyerCnt" description:"30 日累计店铺新客"` + T3Gmv *float64 `orm:"t3_gmv" json:"t3Gmv" description:"3 日累计 GMV"` + T3OrderCnt *int64 `orm:"t3_order_cnt" json:"t3OrderCnt" description:"3 日累计订单数"` + T3Roi *float64 `orm:"t3_roi" json:"t3Roi" description:"3 日累计 ROI"` + T7IndirectOrderAmt *float64 `orm:"t7_indirect_order_amt" json:"t7IndirectOrderAmt" description:"7 日间接订单金额"` + T7IndirectOrderCnt *int64 `orm:"t7_indirect_order_cnt" json:"t7IndirectOrderCnt" description:"7 日间接订单数"` + FansT0GmvPerFans *float64 `orm:"fans_t0_gmv_per_fans" json:"fansT0GmvPerFans" description:"新增粉丝人均销售额"` + FansT3GmvPerFans *float64 `orm:"fans_t3_gmv_per_fans" json:"fansT3GmvPerFans" description:"3 日新增粉丝人均销售额"` + FansT7GmvPerFans *float64 `orm:"fans_t7_gmv_per_fans" json:"fansT7GmvPerFans" description:"7 日新增粉丝人均销售额"` + FansT15GmvPerFans *float64 `orm:"fans_t15_gmv_per_fans" json:"fansT15GmvPerFans" description:"15 日新增粉丝人均销售额"` + FansT30GmvPerFans *float64 `orm:"fans_t30_gmv_per_fans" json:"fansT30GmvPerFans" description:"30 日新增粉丝人均销售额"` + RecoFansCost *float64 `orm:"reco_fans_cost" json:"recoFansCost" description:"涨粉成本"` + QcpxWhiteboxDirectOrderPaymentAmt *float64 `orm:"qcpx_whitebox_direct_order_payment_amt" json:"qcpxWhiteboxDirectOrderPaymentAmt" description:"智能优惠券订单 GMV"` + QcpxWhiteboxDirectOrderCnt *int64 `orm:"qcpx_whitebox_direct_order_cnt" json:"qcpxWhiteboxDirectOrderCnt" description:"智能优惠券订单数"` + FansT0Gmv *float64 `orm:"fans_t0_gmv" json:"fansT0Gmv" description:"涨粉当日 GMV"` + FansT1Gmv *float64 `orm:"fans_t1_gmv" json:"fansT1Gmv" description:"涨粉次日 GMV"` + FansT7Gmv *float64 `orm:"fans_t7_gmv" json:"fansT7Gmv" description:"涨粉 7 日 GMV"` + FansT15Gmv *float64 `orm:"fans_t15_gmv" json:"fansT15Gmv" description:"涨粉 15 日 GMV"` + FansT30Gmv *float64 `orm:"fans_t30_gmv" json:"fansT30Gmv" description:"涨粉 30 日 GMV"` + FansT0Roi *float64 `orm:"fans_t0_roi" json:"fansT0Roi" description:"涨粉当日 ROI"` + FansT1Roi *float64 `orm:"fans_t1_roi" json:"fansT1Roi" description:"涨粉次日 ROI"` + FansT7Roi *float64 `orm:"fans_t7_roi" json:"fansT7Roi" description:"涨粉 7 日 ROI"` + FansT15Roi *float64 `orm:"fans_t15_roi" json:"fansT15Roi" description:"涨粉 15 日 ROI"` + FansT30Roi *float64 `orm:"fans_t30_roi" json:"fansT30Roi" description:"涨粉 30 日 ROI"` + T0ShopNewBuyerOrderPaymentAmt *float64 `orm:"t0_shop_new_buyer_order_payment_amt" json:"t0ShopNewBuyerOrderPaymentAmt" description:"当日新客 GMV"` + T1ShopNewBuyerOrderPaymentAmt *float64 `orm:"t1_shop_new_buyer_order_payment_amt" json:"t1ShopNewBuyerOrderPaymentAmt" description:"投后 1 日新客 GMV"` + T3ShopNewBuyerOrderPaymentAmt *float64 `orm:"t3_shop_new_buyer_order_payment_amt" json:"t3ShopNewBuyerOrderPaymentAmt" description:"投后 3 日新客 GMV"` + T7ShopNewBuyerOrderPaymentAmt *float64 `orm:"t7_shop_new_buyer_order_payment_amt" json:"t7ShopNewBuyerOrderPaymentAmt" description:"投后 7 日新客 GMV"` + T15ShopNewBuyerOrderPaymentAmt *float64 `orm:"t15_shop_new_buyer_order_payment_amt" json:"t15ShopNewBuyerOrderPaymentAmt" description:"投后 15 日新客 GMV"` + T30ShopNewBuyerOrderPaymentAmt *float64 `orm:"t30_shop_new_buyer_order_payment_amt" json:"t30ShopNewBuyerOrderPaymentAmt" description:"投后 30 日新客 GMV"` + T0ShopNewBuyerOrderCnt *int64 `orm:"t0_shop_new_buyer_order_cnt" json:"t0ShopNewBuyerOrderCnt" description:"当日新客成交订单量"` + T1ShopNewBuyerOrderCnt *int64 `orm:"t1_shop_new_buyer_order_cnt" json:"t1ShopNewBuyerOrderCnt" description:"投后 1 日新客成交订单量"` + T3ShopNewBuyerOrderCnt *int64 `orm:"t3_shop_new_buyer_order_cnt" json:"t3ShopNewBuyerOrderCnt" description:"投后 3 日新客成交订单量"` + T7ShopNewBuyerOrderCnt *int64 `orm:"t7_shop_new_buyer_order_cnt" json:"t7ShopNewBuyerOrderCnt" description:"投后 7 日新客成交订单量"` + T15ShopNewBuyerOrderCnt *int64 `orm:"t15_shop_new_buyer_order_cnt" json:"t15ShopNewBuyerOrderCnt" description:"投后 15 日新客成交订单量"` + T30ShopNewBuyerOrderCnt *int64 `orm:"t30_shop_new_buyer_order_cnt" json:"t30ShopNewBuyerOrderCnt" description:"投后 30 日新客成交订单量"` + T1NewBuyerRepurchaseRatio *float64 `orm:"t1_new_buyer_repurchase_ratio" json:"t1NewBuyerRepurchaseRatio" description:"投后 1 日新客复购率"` + T3NewBuyerRepurchaseRatio *float64 `orm:"t3_new_buyer_repurchase_ratio" json:"t3NewBuyerRepurchaseRatio" description:"投后 3 日新客复购率"` + T7NewBuyerRepurchaseRatio *float64 `orm:"t7_new_buyer_repurchase_ratio" json:"t7NewBuyerRepurchaseRatio" description:"投后 7 日新客复购率"` + T15NewBuyerRepurchaseRatio *float64 `orm:"t15_new_buyer_repurchase_ratio" json:"t15NewBuyerRepurchaseRatio" description:"投后 15 日新客复购率"` + T30NewBuyerRepurchaseRatio *float64 `orm:"t30_new_buyer_repurchase_ratio" json:"t30NewBuyerRepurchaseRatio" description:"投后 30 日新客复购率"` + T0ShopNewBuyerRoi *float64 `orm:"t0_shop_new_buyer_roi" json:"t0ShopNewBuyerRoi" description:"投后当日新客 ROI"` + T1ShopNewBuyerRoi *float64 `orm:"t1_shop_new_buyer_roi" json:"t1ShopNewBuyerRoi" description:"投后 1 日新客 ROI"` + T3ShopNewBuyerRoi *float64 `orm:"t3_shop_new_buyer_roi" json:"t3ShopNewBuyerRoi" description:"投后 3 日新客 ROI"` + T7ShopNewBuyerRoi *float64 `orm:"t7_shop_new_buyer_roi" json:"t7ShopNewBuyerRoi" description:"投后 7 日新客 ROI"` + T15ShopNewBuyerRoi *float64 `orm:"t15_shop_new_buyer_roi" json:"t15ShopNewBuyerRoi" description:"投后 15 日新客 ROI"` + T30ShopNewBuyerRoi *float64 `orm:"t30_shop_new_buyer_roi" json:"t30ShopNewBuyerRoi" description:"投后 30 日新客 ROI"` + CreateCardOrderCnt *int64 `orm:"create_card_order_cnt" json:"createCardOrderCnt" description:"有效制卡订单数(回传时间)"` + ForwardTsCreateCardOrderCnt *int64 `orm:"forward_ts_create_card_order_cnt" json:"forwardTsCreateCardOrderCnt" description:"有效制卡订单数(计费时间)"` + CreateCardOrderCost *float64 `orm:"create_card_order_cost" json:"createCardOrderCost" description:"有效制卡订单成本(回传时间)"` + ForwardTsCreateCardOrderCost *float64 `orm:"forward_ts_create_card_order_cost" json:"forwardTsCreateCardOrderCost" description:"有效制卡订单成本(计费时间)"` + ActivateCardOrderCnt *int64 `orm:"activate_card_order_cnt" json:"activateCardOrderCnt" description:"电话卡激活订单数(回传时间)"` + ForwardTsActivateCardOrderCnt *int64 `orm:"forward_ts_activate_card_order_cnt" json:"forwardTsActivateCardOrderCnt" description:"电话卡激活订单数(计费时间)"` + ActivateCardOrderCost *float64 `orm:"activate_card_order_cost" json:"activateCardOrderCost" description:"电话卡激活订单成本(回传时间)"` + ForwardTsActivateCardOrderCost *float64 `orm:"forward_ts_activate_card_order_cost" json:"forwardTsActivateCardOrderCost" description:"电话卡激活订单成本(计费时间)"` + CreateCardOrderRatio *float64 `orm:"create_card_order_ratio" json:"createCardOrderRatio" description:"有效制卡订单率(回传时间)"` + ForwardTsCreateCardOrderRatio *float64 `orm:"forward_ts_create_card_order_ratio" json:"forwardTsCreateCardOrderRatio" description:"有效制卡订单率(计费时间)"` + ActivateCardOrderCntRatio *float64 `orm:"activate_card_order_cnt_ratio" json:"activateCardOrderCntRatio" description:"电话卡激活率(回传时间)"` + ForwardTsActivateCardOrderRatio *float64 `orm:"forward_ts_activate_card_order_ratio" json:"forwardTsActivateCardOrderRatio" description:"电话卡激活率(计费时间)"` + LivePlayCnt *int64 `orm:"live_play_cnt" json:"livePlayCnt" description:"全站直播观看数"` + ItemEntranceClkCnt *int64 `orm:"item_entrance_clk_cnt" json:"itemEntranceClkCnt" description:"小黄车点击数"` + ShowCnt *int64 `orm:"show_cnt" json:"showCnt" description:"全站曝光"` + ReportDateStr string `orm:"report_date_str" json:"reportDateStr" description:"时间"` + CampaignId *int64 `orm:"campaign_id" json:"campaignId" description:"计划 ID"` + CampaignName string `orm:"campaign_name" json:"campaignName" description:"计划名称"` + UnitId *int64 `orm:"unit_id" json:"unitId" description:"单元 ID"` + UnitName string `orm:"unit_name" json:"unitName" description:"单元名称"` + CreativeId *int64 `orm:"creative_id" json:"creativeId" description:"创意 ID"` + CreativeName string `orm:"creative_name" json:"creativeName" description:"创意名称"` + CidActualRoiAfterSubsidy *float64 `orm:"cid_actual_roi_after_subsidy" json:"cidActualRoiAfterSubsidy" description:"补贴后实际 ROI"` + CidCouponAmount *int64 `orm:"cid_coupon_amount" json:"cidCouponAmount" description:"核销券金额"` + CidCouponCallbackPaidRefundAmount *int64 `orm:"cid_coupon_callback_paid_refund_amount" json:"cidCouponCallbackPaidRefundAmount" description:"退单有回传_核销券金额"` + CidVoucherCost *float64 `orm:"cid_voucher_cost" json:"cidVoucherCost" description:"券成本"` +} + +// TableName 返回表名 +func (e *UnitReportSum) TableName() string { + return "unit_report_sum" +} diff --git a/model/entity/dict/api_datasource_platform.go b/model/entity/dict/api_datasource_platform.go new file mode 100644 index 0000000..61d43f6 --- /dev/null +++ b/model/entity/dict/api_datasource_platform.go @@ -0,0 +1,94 @@ +package dict + +import ( + "time" +) + +// DatasourcePlatform 数据源平台配置实体 +type DatasourcePlatform struct { + // 主键和标识字段 + ID int64 `orm:"id" json:"id" description:"主键ID,自增长"` + PlatformCode string `orm:"platform_code" json:"platformCode" description:"平台编码,唯一标识"` + PlatformName string `orm:"platform_name" json:"platformName" description:"平台名称"` + Description string `orm:"description" json:"description" description:"平台描述"` + + // 状态和基础配置 + Status string `orm:"status" json:"status" description:"状态: ACTIVE启用, INACTIVE停用"` + ApiBaseUrl string `orm:"api_base_url" json:"apiBaseUrl" description:"API基础地址"` + + // 认证配置 + AuthType string `orm:"auth_type" json:"authType" description:"认证类型: TOKEN/API_KEY/OAUTH2/BASIC"` + Token string `orm:"token" json:"token" description:"认证token/密钥"` + ApiKey string `orm:"api_key" json:"apiKey" description:"API Key"` + ClientId string `orm:"client_id" json:"clientId" description:"OAuth2 Client ID"` + ClientSecret string `orm:"client_secret" json:"clientSecret" description:"OAuth2 Client Secret"` + + // 限流配置 + RateLimitPerMinute int `orm:"rate_limit_per_minute" json:"rateLimitPerMinute" description:"每分钟请求限制"` + RateLimitPerHour int `orm:"rate_limit_per_hour" json:"rateLimitPerHour" description:"每小时请求限制"` + ConcurrencyLimit int `orm:"concurrency_limit" json:"concurrencyLimit" description:"并发连接限制"` + RequestTimeoutMs int `orm:"request_timeout_ms" json:"requestTimeoutMs" description:"请求超时时间(毫秒)"` + + // 重试策略 + MaxRetries int `orm:"max_retries" json:"maxRetries" description:"最大重试次数"` + RetryDelayMs int `orm:"retry_delay_ms" json:"retryDelayMs" description:"重试延迟(毫秒)"` + + // 元数据 + CreatedBy string `orm:"created_by" json:"createdBy" description:"创建人"` + CreatedAt *time.Time `orm:"created_at" json:"createdAt" description:"创建时间"` + UpdatedBy string `orm:"updated_by" json:"updatedBy" description:"更新人"` + UpdatedAt *time.Time `orm:"updated_at" json:"updatedAt" description:"更新时间"` + Version int `orm:"version" json:"version" description:"版本号(乐观锁)"` +} + +// DatasourcePlatformCol 数据源平台配置表字段定义 +type DatasourcePlatformCol struct { + ID string + PlatformCode string + PlatformName string + Description string + Status string + ApiBaseUrl string + AuthType string + Token string + ApiKey string + ClientId string + ClientSecret string + RateLimitPerMinute string + RateLimitPerHour string + ConcurrencyLimit string + RequestTimeoutMs string + MaxRetries string + RetryDelayMs string + CreatedBy string + CreatedAt string + UpdatedBy string + UpdatedAt string + Version string +} + +// DatasourcePlatformCols 数据源平台配置表字段常量 +var DatasourcePlatformCols = DatasourcePlatformCol{ + ID: "id", + PlatformCode: "platform_code", + PlatformName: "platform_name", + Description: "description", + Status: "status", + ApiBaseUrl: "api_base_url", + AuthType: "auth_type", + Token: "token", + ApiKey: "api_key", + ClientId: "client_id", + ClientSecret: "client_secret", + RateLimitPerMinute: "rate_limit_per_minute", + RateLimitPerHour: "rate_limit_per_hour", + ConcurrencyLimit: "concurrency_limit", + RequestTimeoutMs: "request_timeout_ms", + MaxRetries: "max_retries", + RetryDelayMs: "retry_delay_ms", + CreatedBy: "created_by", + CreatedAt: "created_at", + UpdatedBy: "updated_by", + UpdatedAt: "updated_at", + Version: "version", +} diff --git a/model/entity/dict/api_field_mapping_config.go b/model/entity/dict/api_field_mapping_config.go new file mode 100644 index 0000000..535d098 --- /dev/null +++ b/model/entity/dict/api_field_mapping_config.go @@ -0,0 +1,98 @@ +package dict + +import ( + "time" +) + +// FieldMappingConfig 字段映射配置实体 +type FieldMappingConfig struct { + Id int64 `json:"id,string" dc:"配置ID"` + ConfigName string `json:"configName" dc:"配置名称"` + VendorName string `json:"vendorName" dc:"厂商名称"` + ApiName string `json:"apiName" dc:"接口名称"` + ApiVersion string `json:"apiVersion" dc:"接口版本"` + SourceField string `json:"sourceField" dc:"源字段名"` + SourceFieldType string `json:"sourceFieldType" dc:"源字段数据类型"` + SourceFieldDesc string `json:"sourceFieldDesc" dc:"源字段描述"` + TargetField string `json:"targetField" dc:"目标字段名"` + TargetFieldType string `json:"targetFieldType" dc:"目标数据类型"` + TargetFieldDesc string `json:"targetFieldDesc" dc:"字段描述"` + TransformType string `json:"transformType" dc:"转换类型"` + TransformParams map[string]interface{} `json:"transformParams" dc:"转换参数"` + ValidationRules map[string]interface{} `json:"validationRules" dc:"验证规则"` + DefaultValue string `json:"defaultValue" dc:"默认值"` + IsRequired bool `json:"isRequired" dc:"是否必填"` + IsActive bool `json:"isActive" dc:"是否启用"` + Priority int `json:"priority" dc:"优先级"` + BusinessDomain string `json:"businessDomain" dc:"业务域"` + FieldGroup string `json:"fieldGroup" dc:"字段分组"` + ConfigVersion int `json:"configVersion" dc:"配置版本号"` + EffectiveDate *time.Time `json:"effectiveDate" dc:"生效时间"` + ExpiryDate *time.Time `json:"expiryDate" dc:"失效时间"` + CreatedBy string `json:"createdBy" dc:"创建人"` + CreatedTime time.Time `json:"createdTime" dc:"创建时间"` + UpdatedBy string `json:"updatedBy" dc:"更新人"` + UpdatedTime time.Time `json:"updatedTime" dc:"更新时间"` +} + +// FieldMappingConfigCols 字段映射配置表列名 +type FieldMappingConfigCols struct { + Id string + ConfigName string + VendorName string + ApiName string + ApiVersion string + SourceField string + SourceFieldType string + SourceFieldDesc string + TargetField string + TargetFieldType string + TargetFieldDesc string + TransformType string + TransformParams string + ValidationRules string + DefaultValue string + IsRequired string + IsActive string + Priority string + BusinessDomain string + FieldGroup string + ConfigVersion string + EffectiveDate string + ExpiryDate string + CreatedBy string + CreatedTime string + UpdatedBy string + UpdatedTime string +} + +// FieldMappingConfigCol 字段映射配置表列名常量 +var FieldMappingConfigCol = FieldMappingConfigCols{ + Id: "id", + ConfigName: "config_name", + VendorName: "vendor_name", + ApiName: "api_name", + ApiVersion: "api_version", + SourceField: "source_field", + SourceFieldType: "source_field_type", + SourceFieldDesc: "source_field_desc", + TargetField: "target_field", + TargetFieldType: "target_field_type", + TargetFieldDesc: "target_field_desc", + TransformType: "transform_type", + TransformParams: "transform_params", + ValidationRules: "validation_rules", + DefaultValue: "default_value", + IsRequired: "is_required", + IsActive: "is_active", + Priority: "priority", + BusinessDomain: "business_domain", + FieldGroup: "field_group", + ConfigVersion: "config_version", + EffectiveDate: "effective_date", + ExpiryDate: "expiry_date", + CreatedBy: "created_by", + CreatedTime: "created_time", + UpdatedBy: "updated_by", + UpdatedTime: "updated_time", +} diff --git a/model/entity/dict/api_interface.go b/model/entity/dict/api_interface.go new file mode 100644 index 0000000..dd4668e --- /dev/null +++ b/model/entity/dict/api_interface.go @@ -0,0 +1,57 @@ +package dict + +import ( + consts "cid/consts/api-feature" + + "gitea.com/red-future/common/beans" +) + +// ApiInterface 接口管理实体 +type ApiInterface struct { + beans.SQLBaseDO `orm:",inherit"` + // 基础信息 + PlatformId int64 `orm:"platform_id" json:"platformId" description:"所属平台ID"` + Name string `orm:"name" json:"name" description:"接口名称"` + Code string `orm:"code" json:"code" description:"接口编码"` + Url string `orm:"url" json:"url" description:"接口地址"` + Method consts.ApiMethod `orm:"method" json:"method" description:"请求方法:GET/POST/PUT/DELETE等"` + Status consts.PlatformStatus `orm:"status" json:"status" description:"接口状态:active启用/inactive停用"` + // 认证类型 + AuthType string `orm:"auth_type" json:"authType" description:"认证类型:oauth2/apikey/basic等"` + // 请求配置 (JSONB) + RequestConfig map[string]interface{} `orm:"request_config" json:"requestConfig" description:"请求配置"` + // 响应配置 (JSONB) + ResponseConfig map[string]interface{} `orm:"response_config" json:"responseConfig" description:"响应配置"` + // 独立限流配置 (JSONB) + LimitConfig map[string]interface{} `orm:"limit_config" json:"limitConfig" description:"接口独立限流配置(可选,覆盖平台配置)"` +} + +// ApiInterfaceCol 接口表字段定义 +type ApiInterfaceCol struct { + beans.SQLBaseCol + PlatformId string + Name string + Code string + Url string + Method string + Status string + AuthType string + RequestConfig string + ResponseConfig string + LimitConfig string +} + +// ApiInterfaceCols 接口表字段常量 +var ApiInterfaceCols = ApiInterfaceCol{ + SQLBaseCol: beans.DefSQLBaseCol, + PlatformId: "platform_id", + Name: "name", + Code: "code", + Url: "url", + Method: "method", + Status: "status", + AuthType: "auth_type", + RequestConfig: "request_config", + ResponseConfig: "response_config", + LimitConfig: "limit_config", +} diff --git a/service/api_service.go b/service/api_service.go new file mode 100644 index 0000000..00e9b3c --- /dev/null +++ b/service/api_service.go @@ -0,0 +1,396 @@ +package service + +import ( + "bytes" + "encoding/json" + "fmt" + "io/ioutil" + "math" + "net/http" + "time" + + entities "cid/entities" +) + +// APIService API服务接口 +type APIService interface { + GetCampaignReport(params *entities.RequestParams) (*entities.APIResponse, error) + GetCampaignReportByTimeRange(advertiserID int64, startTime, endTime int64) (*entities.APIResponse, error) + GetAllCampaignReport(params *entities.RequestParams) (*entities.APIResponse, error) + GetAllCampaignReportByTimeRange(advertiserID int64, startTime, endTime int64) (*entities.APIResponse, error) + GetCampaignReportWithCallback(params *entities.RequestParams, callback func(*entities.APIResponse, error) bool) error +} + +// KuaishouAPIService 快手API服务实现 +type KuaishouAPIService struct { + BaseURL string + AccessToken string + HTTPClient *http.Client + MaxRetries int + RetryDelay time.Duration + RateLimit time.Duration // 请求间隔,避免触发限流 +} + +// NewKuaishouAPIService 创建API服务实例 +func NewKuaishouAPIService(accessToken string) *KuaishouAPIService { + return &KuaishouAPIService{ + BaseURL: "https://ad.e.kuaishou.com/rest/openapi/gw/esp/report", + AccessToken: accessToken, + HTTPClient: &http.Client{ + Timeout: 30 * time.Second, + }, + MaxRetries: 3, + RetryDelay: 2 * time.Second, + RateLimit: 200 * time.Millisecond, // 默认200ms间隔 + } +} + +// SetRateLimit 设置请求间隔 +func (s *KuaishouAPIService) SetRateLimit(delay time.Duration) { + s.RateLimit = delay +} + +// GetCampaignReport 获取广告计划报表(单页) +func (s *KuaishouAPIService) GetCampaignReport(params *entities.RequestParams) (*entities.APIResponse, error) { + for retry := 0; retry <= s.MaxRetries; retry++ { + response, err := s.doRequest(params) + if err == nil { + return response, nil + } + + // 判断是否重试 + if retry < s.MaxRetries { + time.Sleep(s.RetryDelay) + continue + } + + return nil, err + } + + return nil, fmt.Errorf("请求失败,已达到最大重试次数") +} + +// doRequest 执行实际请求 +func (s *KuaishouAPIService) doRequest(params *entities.RequestParams) (*entities.APIResponse, error) { + // 序列化请求参数 + jsonData, err := json.Marshal(params) + if err != nil { + return nil, fmt.Errorf("序列化失败: %v", err) + } + + // 创建HTTP请求 + url := fmt.Sprintf("%s/campaignReport", s.BaseURL) + req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData)) + if err != nil { + return nil, fmt.Errorf("创建请求失败: %v", err) + } + + // 设置请求头 + s.setHeaders(req) + + // 发送请求 + resp, err := s.HTTPClient.Do(req) + if err != nil { + return nil, fmt.Errorf("请求失败: %v", err) + } + defer resp.Body.Close() + + // 检查HTTP状态码 + if resp.StatusCode != http.StatusOK { + body, _ := ioutil.ReadAll(resp.Body) + return nil, fmt.Errorf("HTTP状态码错误: %d, 响应: %s", resp.StatusCode, string(body)) + } + + // 读取响应 + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("读取响应失败: %v", err) + } + + // 解析响应 + var apiResponse entities.APIResponse + err = json.Unmarshal(body, &apiResponse) + if err != nil { + return nil, fmt.Errorf("解析响应失败: %v", err) + } + + // 检查API返回码 + if apiResponse.Code != 0 { + return nil, fmt.Errorf("API返回错误: %s (code: %d)", apiResponse.Message, apiResponse.Code) + } + + return &apiResponse, nil +} + +// GetAllCampaignReport 获取所有分页数据 +func (s *KuaishouAPIService) GetAllCampaignReport(params *entities.RequestParams) (*entities.APIResponse, error) { + // 1. 先获取第一页数据,得到总数 + params.ResetPage() + firstPage, err := s.GetCampaignReport(params) + if err != nil { + return nil, fmt.Errorf("获取第一页数据失败: %v", err) + } + + if firstPage.Data == nil { + return firstPage, nil // 没有数据 + } + + totalCount := firstPage.Data.TotalCount + pageSize := params.PageInfo.PageSize + + // 2. 如果只有一页,直接返回 + if totalCount <= pageSize { + return firstPage, nil + } + + // 3. 计算总页数 + totalPages := int(math.Ceil(float64(totalCount) / float64(pageSize))) + + // 4. 创建结果集 + allResponses := make([]*entities.APIResponse, 0, totalPages) + allResponses = append(allResponses, firstPage) + + // 5. 并发获取剩余页数据 + pageChan := make(chan *pageResult, totalPages-1) + + // 启动goroutine获取剩余页 + for page := 2; page <= totalPages; page++ { + go func(currentPage int) { + // 复制参数并设置页码 + pageParams := *params + pageParams.PageInfo = &entities.PageInfo{ + CurrentPage: currentPage, + PageSize: pageSize, + } + + response, err := s.GetCampaignReport(&pageParams) + pageChan <- &pageResult{ + Page: currentPage, + Response: response, + Error: err, + } + + // 控制请求频率 + time.Sleep(s.RateLimit) + }(page) + } + + // 6. 收集结果 + errors := make([]error, 0) + for i := 0; i < totalPages-1; i++ { + result := <-pageChan + if result.Error != nil { + errors = append(errors, fmt.Errorf("第%d页获取失败: %v", result.Page, result.Error)) + } else { + allResponses = append(allResponses, result.Response) + } + } + + // 7. 合并数据 + mergedResponse := entities.MergeData(allResponses) + + // 8. 如果有错误,返回错误信息 + if len(errors) > 0 { + // 可以记录错误日志,但继续返回已获取的数据 + fmt.Printf("部分页面获取失败: %v\n", errors) + } + + return mergedResponse, nil +} + +// GetAllCampaignReportByTimeRange 根据时间范围获取所有数据 +func (s *KuaishouAPIService) GetAllCampaignReportByTimeRange(advertiserID int64, startTime, endTime int64) (*entities.APIResponse, error) { + params := entities.NewRequestParams() + params.AdvertiserID = advertiserID + params.StartTime = startTime + params.EndTime = endTime + + return s.GetAllCampaignReport(params) +} + +// GetCampaignReportWithCallback 使用回调函数获取所有数据(流式处理,避免内存占用过大) +func (s *KuaishouAPIService) GetCampaignReportWithCallback(params *entities.RequestParams, callback func(*entities.APIResponse, error) bool) error { + // 1. 先获取第一页数据,得到总数 + params.ResetPage() + firstPage, err := s.GetCampaignReport(params) + if err != nil { + return fmt.Errorf("获取第一页数据失败: %v", err) + } + + // 调用回调处理第一页 + if !callback(firstPage, nil) { + return nil // 回调要求停止 + } + + if firstPage.Data == nil || firstPage.Data.TotalCount <= params.PageInfo.PageSize { + return nil // 只有一页 + } + + totalCount := firstPage.Data.TotalCount + pageSize := params.PageInfo.PageSize + totalPages := int(math.Ceil(float64(totalCount) / float64(pageSize))) + + // 2. 顺序获取剩余页数据(避免并发导致API限流) + for page := 2; page <= totalPages; page++ { + // 复制参数并设置页码 + pageParams := *params + pageParams.PageInfo = &entities.PageInfo{ + CurrentPage: page, + PageSize: pageSize, + } + + response, err := s.GetCampaignReport(&pageParams) + if !callback(response, err) { + return nil // 回调要求停止 + } + + // 控制请求频率 + time.Sleep(s.RateLimit) + } + + return nil +} + +// GetCampaignReportSequential 顺序获取所有数据(简单实现) +func (s *KuaishouAPIService) GetCampaignReportSequential(params *entities.RequestParams) (*entities.APIResponse, error) { + // 1. 先获取第一页数据,得到总数 + params.ResetPage() + firstPage, err := s.GetCampaignReport(params) + if err != nil { + return nil, fmt.Errorf("获取第一页数据失败: %v", err) + } + + if firstPage.Data == nil { + return firstPage, nil + } + + totalCount := firstPage.Data.TotalCount + pageSize := params.PageInfo.PageSize + + // 2. 如果只有一页,直接返回 + if totalCount <= pageSize { + return firstPage, nil + } + + // 3. 顺序获取所有数据 + allDetails := make([]*entities.ReportDetail, 0, totalCount) + if firstPage.Data.Detail != nil { + allDetails = append(allDetails, firstPage.Data.Detail...) + } + + totalPages := int(math.Ceil(float64(totalCount) / float64(pageSize))) + + for page := 2; page <= totalPages; page++ { + // 复制参数并设置页码 + pageParams := *params + pageParams.PageInfo = &entities.PageInfo{ + CurrentPage: page, + PageSize: pageSize, + } + + response, err := s.GetCampaignReport(&pageParams) + if err != nil { + // 记录错误但继续获取 + fmt.Printf("第%d页获取失败: %v\n", page, err) + continue + } + + if response.Data != nil && response.Data.Detail != nil { + allDetails = append(allDetails, response.Data.Detail...) + } + + // 控制请求频率 + time.Sleep(s.RateLimit) + } + + // 4. 构建完整响应 + completeResponse := &entities.APIResponse{ + Code: firstPage.Code, + Message: firstPage.Message, + Data: &entities.ReportData{ + Sum: firstPage.Data.Sum, + Detail: allDetails, + TotalCount: totalCount, + }, + } + + return completeResponse, nil +} + +// setHeaders 设置请求头 +func (s *KuaishouAPIService) setHeaders(req *http.Request) { + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Accept", "application/json") + if s.AccessToken != "" { + req.Header.Set("Access-Token", s.AccessToken) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", s.AccessToken)) + } +} + +// pageResult 分页结果 +type pageResult struct { + Page int + Response *entities.APIResponse + Error error +} + +// ReportStatistics 报表统计 +type ReportStatistics struct { + TotalImpression int64 + TotalClick int64 + TotalCost float64 + TotalGMV float64 + TotalT0GMV float64 + TotalT0OrderCnt int64 + PageCount int + RecordCount int +} + +// CalculateStatistics 计算统计信息 +func CalculateStatistics(response *entities.APIResponse) *ReportStatistics { + stats := &ReportStatistics{} + + if response.Data == nil { + return stats + } + + stats.PageCount = 1 // 默认值 + stats.RecordCount = response.Data.TotalCount + + if response.Data.Detail != nil { + for _, detail := range response.Data.Detail { + stats.TotalImpression += detail.Impression + stats.TotalClick += detail.Click + stats.TotalCost += detail.CostTotal + stats.TotalGMV += detail.GMV + stats.TotalT0GMV += detail.T0GMV + stats.TotalT0OrderCnt += detail.T0OrderCnt + } + } + + return stats +} + +// GetAverageMetrics 获取平均指标 +func (stats *ReportStatistics) GetAverageMetrics() map[string]float64 { + metrics := make(map[string]float64) + + if stats.TotalImpression > 0 { + metrics["ctr"] = float64(stats.TotalClick) / float64(stats.TotalImpression) * 100 + } + + if stats.TotalClick > 0 { + metrics["cpc"] = stats.TotalCost / float64(stats.TotalClick) + } + + if stats.TotalCost > 0 { + metrics["roi"] = stats.TotalGMV / stats.TotalCost + metrics["t0_roi"] = stats.TotalT0GMV / stats.TotalCost + } + + if stats.TotalImpression > 0 { + metrics["cpm"] = stats.TotalCost / float64(stats.TotalImpression) * 1000 + } + + return metrics +} diff --git a/service/copydata/api_account_report_service.go b/service/copydata/api_account_report_service.go new file mode 100644 index 0000000..09ee563 --- /dev/null +++ b/service/copydata/api_account_report_service.go @@ -0,0 +1,113 @@ +package copydata + +import ( + dao "cid/dao/copydata" + dto "cid/model/dto/copydata" + "context" + "errors" + + "gitea.com/red-future/common/beans" +) + +type cidAccountReportDetailService struct{} + +// CidAccountReportDetail 广告数据报表详情服务 +var CidAccountReportDetail = new(cidAccountReportDetailService) + +// Create 创建广告数据报表详情 +func (s *cidAccountReportDetailService) Create(ctx context.Context, req *dto.CidAccountReportDetailItem) (res *dto.CreateCidAccountReportDetailRes, err error) { + // 验证必要字段 + if req.DataType == "" { + return nil, errors.New("数据类型不能为空") + } + if req.ReportDateStr == "" { + return nil, errors.New("报告日期不能为空") + } + + // 插入数据库 + id, err := dao.CidAccountReportDetail.Insert(ctx, req) + if err != nil { + return nil, err + } + + res = &dto.CreateCidAccountReportDetailRes{ + Id: id, + } + return +} + +// BatchCreate 批量创建广告数据报表详情 +func (s *cidAccountReportDetailService) BatchCreate(ctx context.Context, req *dto.BatchCreateCidAccountReportDetailReq) (res *dto.BatchCreateCidAccountReportDetailRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + // 验证数据 + if len(req.Items) == 0 { + return nil, errors.New("批量创建数据不能为空") + } + + //// 验证每条数据 + //for i, item := range req.Items { + // if item.DataType == "" { + // return nil, errors.New("第" + string(rune(i+1)) + "条数据的数据类型不能为空") + // } + // if item.ReportDateStr == "" { + // return nil, errors.New("第" + string(rune(i+1)) + "条数据的报告日期不能为空") + // } + //} + + // 批量插入数据库 + successCount, failCount, failedIndexes, err := dao.CidAccountReportDetail.BatchInsert(ctx, req.Items) + if err != nil { + return nil, err + } + + res = &dto.BatchCreateCidAccountReportDetailRes{ + SuccessCount: successCount, + FailCount: failCount, + FailedItems: failedIndexes, + } + return +} + +// Create 创建广告数据报表汇总 +func (s *cidAccountReportDetailService) CreateSum(ctx context.Context, req *dto.CidAccountReportSumItem) (res *dto.CreateCidAccountReportSumRes, err error) { + // 验证必要字段 + if req.DataType == "" { + return nil, errors.New("数据类型不能为空") + } + if req.ReportDateStr == "" { + return nil, errors.New("报告日期不能为空") + } + + // 插入数据库 + id, err := dao.CidAccountReportSum.Insert(ctx, req) + if err != nil { + return nil, err + } + + res = &dto.CreateCidAccountReportSumRes{ + Id: id, + } + return +} + +// BatchCreate 批量创建广告数据报表汇总 +func (s *cidAccountReportDetailService) BatchCreateSum(ctx context.Context, req *dto.BatchCreateCidAccountReportSumReq) (res *dto.BatchCreateCidAccountReportSumRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + // 验证数据 + if len(req.Items) == 0 { + return nil, errors.New("批量创建数据不能为空") + } + + // 批量插入数据库 + successCount, failCount, failedIndexes, err := dao.CidAccountReportSum.BatchInsert(ctx, req.Items) + if err != nil { + return nil, err + } + + res = &dto.BatchCreateCidAccountReportSumRes{ + SuccessCount: successCount, + FailCount: failCount, + FailedItems: failedIndexes, + } + return +} diff --git a/service/copydata/creative_report_sum_service.go b/service/copydata/creative_report_sum_service.go new file mode 100644 index 0000000..084957e --- /dev/null +++ b/service/copydata/creative_report_sum_service.go @@ -0,0 +1,91 @@ +package copydata + +import ( + dao "cid/dao/copydata" + dto "cid/model/dto/copydata" + "context" + "errors" + + "gitea.com/red-future/common/beans" +) + +type creativeReportSumService struct{} + +// CreativeReportSum 广告效果指标表服务 +var CreativeReportSum = new(creativeReportSumService) + +// Create 创建广告效果指标表 +func (s *creativeReportSumService) Create(ctx context.Context, req *dto.CreativeReportSumItem) (res *dto.CreateCreativeReportSumRes, err error) { + // 验证必要字段 + if req.ReportDateStr == "" { + return nil, errors.New("报告日期不能为空") + } + + // 插入数据库 + id, err := dao.CreativeReportSum.Insert(ctx, req) + if err != nil { + return nil, err + } + + res = &dto.CreateCreativeReportSumRes{ + Id: id, + } + return +} + +// BatchCreate 批量创建广告效果指标表 +func (s *creativeReportSumService) BatchCreate(ctx context.Context, req *dto.BatchCreateCreativeReportSumReq) (res *dto.BatchCreateCreativeReportSumRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + // 验证数据 + if len(req.Items) == 0 { + return nil, errors.New("批量创建数据不能为空") + } + + // 批量插入数据库 + successCount, failCount, failedIndexes, err := dao.CreativeReportSum.BatchInsert(ctx, req.Items) + if err != nil { + return nil, err + } + + res = &dto.BatchCreateCreativeReportSumRes{ + SuccessCount: successCount, + FailCount: failCount, + FailedItems: failedIndexes, + } + return +} + +func (s *creativeReportSumService) CreateDetail(ctx context.Context, req *dto.CreativeReportDetailItem) (res *dto.CreateCreativeReportDetailRes, err error) { + if req.ReportDateStr == "" { + return nil, errors.New("报告日期不能为空") + } + + id, err := dao.CreativeReportDetail.Insert(ctx, req) + if err != nil { + return nil, err + } + + res = &dto.CreateCreativeReportDetailRes{ + Id: id, + } + return +} + +func (s *creativeReportSumService) BatchCreateDetail(ctx context.Context, req *dto.BatchCreateCreativeReportDetailReq) (res *dto.BatchCreateCreativeReportDetailRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + if len(req.Items) == 0 { + return nil, errors.New("批量创建数据不能为空") + } + + successCount, failCount, failedIndexes, err := dao.CreativeReportDetail.BatchInsert(ctx, req.Items) + if err != nil { + return nil, err + } + + res = &dto.BatchCreateCreativeReportDetailRes{ + SuccessCount: successCount, + FailCount: failCount, + FailedItems: failedIndexes, + } + return +} diff --git a/service/copydata/material_report_service.go b/service/copydata/material_report_service.go new file mode 100644 index 0000000..adb49d6 --- /dev/null +++ b/service/copydata/material_report_service.go @@ -0,0 +1,261 @@ +package copydata + +import ( + dao "cid/dao/copydata" + dto "cid/model/dto/copydata" + entity "cid/model/entity/copydata" + "context" + "errors" + + "gitea.com/red-future/common/beans" +) + +type materialReportService struct{} + +// MaterialReport 素材报表数据服务 +var MaterialReport = new(materialReportService) + +// Create 创建素材报表数据 +func (s *materialReportService) Create(ctx context.Context, req *dto.MaterialReportItem) (res *dto.CreateMaterialReportRes, err error) { + if req.ReportDateStr == "" { + return nil, errors.New("报告日期不能为空") + } + + id, err := dao.MaterialReport.Insert(ctx, req) + if err != nil { + return nil, err + } + + res = &dto.CreateMaterialReportRes{ + Id: id, + } + return +} + +// BatchCreate 批量创建素材报表数据 +func (s *materialReportService) BatchCreate(ctx context.Context, req *dto.BatchCreateMaterialReportReq) (res *dto.BatchCreateMaterialReportRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + + if len(req.Items) == 0 { + return nil, errors.New("批量创建数据不能为空") + } + + successCount, failCount, failedIndexes, err := dao.MaterialReport.BatchInsert(ctx, req.Items) + if err != nil { + return nil, err + } + + res = &dto.BatchCreateMaterialReportRes{ + SuccessCount: successCount, + FailCount: failCount, + FailedItems: failedIndexes, + } + return +} + +// List 获取素材报表数据列表 +func (s *materialReportService) List(ctx context.Context, req *dto.ListMaterialReportReq) (res *dto.ListMaterialReportRes, err error) { + list, total, err := dao.MaterialReport.List(ctx, req) + if err != nil { + return nil, err + } + + items := make([]*dto.MaterialReportItem, len(list)) + for i, item := range list { + items[i] = convertMaterialEntityToDTO(item) + } + + res = &dto.ListMaterialReportRes{ + List: items, + Total: total, + } + return +} + +// convertEntityToDTO 将实体转换为 DTO +func convertMaterialEntityToDTO(entity *entity.MaterialReport) *dto.MaterialReportItem { + return &dto.MaterialReportItem{ + CreatedBy: entity.CreatedBy, + UpdatedBy: entity.UpdatedBy, + T0OrderPaymentAmt: entity.T0OrderPaymentAmt, + CreativeMaterialType: entity.CreativeMaterialType, + LiveName: entity.LiveName, + AuthorId: entity.AuthorId, + PicUrl: entity.PicUrl, + PicName: entity.PicName, + PicId: entity.PicId, + CoverUrl: entity.CoverUrl, + CoverId: entity.CoverId, + ItemOrderConversionRatio: entity.ItemOrderConversionRatio, + ItemCardClickRatio: entity.ItemCardClickRatio, + ItemCardClkCnt: entity.ItemCardClkCnt, + LivePlayCntCost: entity.LivePlayCntCost, + AdMerchantFollowCost: entity.AdMerchantFollowCost, + AdMerchantFollow: entity.AdMerchantFollow, + NetT0OrderCnt: entity.NetT0OrderCnt, + NetT0Roi: entity.NetT0Roi, + NetT0Gmv: entity.NetT0Gmv, + PhotoName: entity.PhotoName, + PhotoIdStr: entity.PhotoIdStr, + PhotoId: entity.PhotoId, + ModPriceSegment: entity.ModPriceSegment, + AgeSegment: entity.AgeSegment, + Province: entity.Province, + Gender: entity.Gender, + AdPhotoPlayedFiveRatio: entity.AdPhotoPlayedFiveRatio, + AdPhotoPlayedThreeRatio: entity.AdPhotoPlayedThreeRatio, + OrderSubmitRoi: entity.OrderSubmitRoi, + OrderSubmitAmt: entity.OrderSubmitAmt, + EventOrderSubmitCost: entity.EventOrderSubmitCost, + EventOrderSubmit: entity.EventOrderSubmit, + EventOrderPaidRoi: entity.EventOrderPaidRoi, + EventAppInvoked: entity.EventAppInvoked, + EventAddShoppingCart: entity.EventAddShoppingCart, + ConversionNumCost: entity.ConversionNumCost, + AdEffectivePlayNum: entity.AdEffectivePlayNum, + AdItemClick: entity.AdItemClick, + MerchantProductId: entity.MerchantProductId, + CostTotal: entity.CostTotal, + AdShow: entity.AdShow, + AdShow1kCost: entity.AdShow1kCost, + Impression: entity.Impression, + PhotoClick: entity.PhotoClick, + PhotoClickRatio: entity.PhotoClickRatio, + Click: entity.Click, + ActionbarClick: entity.ActionbarClick, + ActionbarClickCost: entity.ActionbarClickCost, + EspClickRatio: entity.EspClickRatio, + ActionRatio: entity.ActionRatio, + AdItemCount: entity.AdItemCount, + EspLivePlayedSeconds: entity.EspLivePlayedSeconds, + PlayedThreeSeconds: entity.PlayedThreeSeconds, + Play3sRatio: entity.Play3sRatio, + PlayedFiveSeconds: entity.PlayedFiveSeconds, + Play5sRatio: entity.Play5sRatio, + PlayedEnd: entity.PlayedEnd, + PlayEndRatio: entity.PlayEndRatio, + Share: entity.Share, + Comment: entity.Comment, + Likes: entity.Likes, + Report: entity.Report, + Block: entity.Block, + ItemNegative: entity.ItemNegative, + LiveShare: entity.LiveShare, + LiveComment: entity.LiveComment, + LiveReward: entity.LiveReward, + EffectivePlayCount: entity.EffectivePlayCount, + EffectivePlayRatio: entity.EffectivePlayRatio, + ConversionNum: entity.ConversionNum, + ConversionCostEsp: entity.ConversionCostEsp, + Roi: entity.Roi, + Gmv: entity.Gmv, + T0Gmv: entity.T0Gmv, + T1Gmv: entity.T1Gmv, + T7Gmv: entity.T7Gmv, + T15Gmv: entity.T15Gmv, + T30Gmv: entity.T30Gmv, + T0Roi: entity.T0Roi, + T1Roi: entity.T1Roi, + T7Roi: entity.T7Roi, + T15Roi: entity.T15Roi, + T30Roi: entity.T30Roi, + PaiedOrder: entity.PaiedOrder, + OrderRatio: entity.OrderRatio, + T0OrderCnt: entity.T0OrderCnt, + T0OrderCntCost: entity.T0OrderCntCost, + T0OrderCntRatio: entity.T0OrderCntRatio, + T1OrderCnt: entity.T1OrderCnt, + T7OrderCnt: entity.T7OrderCnt, + T15OrderCnt: entity.T15OrderCnt, + T30OrderCnt: entity.T30OrderCnt, + MerchantRecoFans: entity.MerchantRecoFans, + T1Retention: entity.T1Retention, + T7Retention: entity.T7Retention, + T15Retention: entity.T15Retention, + T30Retention: entity.T30Retention, + T1RetentionRatio: entity.T1RetentionRatio, + T7RetentionRatio: entity.T7RetentionRatio, + T15RetentionRatio: entity.T15RetentionRatio, + T30RetentionRatio: entity.T30RetentionRatio, + ReservationSuccess: entity.ReservationSuccess, + ReservationCost: entity.ReservationCost, + StandardLivePlayedStarted: entity.StandardLivePlayedStarted, + AdLivePlayCnt: entity.AdLivePlayCnt, + AdLivePlayCntCost: entity.AdLivePlayCntCost, + LiveAudienceCost: entity.LiveAudienceCost, + LiveEventGoodsView: entity.LiveEventGoodsView, + GoodsClickRatio: entity.GoodsClickRatio, + DirectAttrPlatNewBuyerCnt: entity.DirectAttrPlatNewBuyerCnt, + T30AttrPlatTotalBuyerCnt: entity.T30AttrPlatTotalBuyerCnt, + DirectAttrSellerNewBuyerCnt: entity.DirectAttrSellerNewBuyerCnt, + T30AttrSellerTotalBuyerCnt: entity.T30AttrSellerTotalBuyerCnt, + T3Gmv: entity.T3Gmv, + T3OrderCnt: entity.T3OrderCnt, + T3Roi: entity.T3Roi, + T7IndirectOrderAmt: entity.T7IndirectOrderAmt, + T7IndirectOrderCnt: entity.T7IndirectOrderCnt, + FansT0GmvPerFans: entity.FansT0GmvPerFans, + FansT3GmvPerFans: entity.FansT3GmvPerFans, + FansT7GmvPerFans: entity.FansT7GmvPerFans, + FansT15GmvPerFans: entity.FansT15GmvPerFans, + FansT30GmvPerFans: entity.FansT30GmvPerFans, + RecoFansCost: entity.RecoFansCost, + QcpxWhiteboxDirectOrderPaymentAmt: entity.QcpxWhiteboxDirectOrderPaymentAmt, + QcpxWhiteboxDirectOrderCnt: entity.QcpxWhiteboxDirectOrderCnt, + FansT0Gmv: entity.FansT0Gmv, + FansT1Gmv: entity.FansT1Gmv, + FansT7Gmv: entity.FansT7Gmv, + FansT15Gmv: entity.FansT15Gmv, + FansT30Gmv: entity.FansT30Gmv, + FansT0Roi: entity.FansT0Roi, + FansT1Roi: entity.FansT1Roi, + FansT7Roi: entity.FansT7Roi, + FansT15Roi: entity.FansT15Roi, + FansT30Roi: entity.FansT30Roi, + T0ShopNewBuyerOrderPaymentAmt: entity.T0ShopNewBuyerOrderPaymentAmt, + T1ShopNewBuyerOrderPaymentAmt: entity.T1ShopNewBuyerOrderPaymentAmt, + T3ShopNewBuyerOrderPaymentAmt: entity.T3ShopNewBuyerOrderPaymentAmt, + T7ShopNewBuyerOrderPaymentAmt: entity.T7ShopNewBuyerOrderPaymentAmt, + T15ShopNewBuyerOrderPaymentAmt: entity.T15ShopNewBuyerOrderPaymentAmt, + T30ShopNewBuyerOrderPaymentAmt: entity.T30ShopNewBuyerOrderPaymentAmt, + T0ShopNewBuyerOrderCnt: entity.T0ShopNewBuyerOrderCnt, + T1ShopNewBuyerOrderCnt: entity.T1ShopNewBuyerOrderCnt, + T3ShopNewBuyerOrderCnt: entity.T3ShopNewBuyerOrderCnt, + T7ShopNewBuyerOrderCnt: entity.T7ShopNewBuyerOrderCnt, + T15ShopNewBuyerOrderCnt: entity.T15ShopNewBuyerOrderCnt, + T30ShopNewBuyerOrderCnt: entity.T30ShopNewBuyerOrderCnt, + T1NewBuyerRepurchaseRatio: entity.T1NewBuyerRepurchaseRatio, + T3NewBuyerRepurchaseRatio: entity.T3NewBuyerRepurchaseRatio, + T7NewBuyerRepurchaseRatio: entity.T7NewBuyerRepurchaseRatio, + T15NewBuyerRepurchaseRatio: entity.T15NewBuyerRepurchaseRatio, + T30NewBuyerRepurchaseRatio: entity.T30NewBuyerRepurchaseRatio, + T0ShopNewBuyerRoi: entity.T0ShopNewBuyerRoi, + T1ShopNewBuyerRoi: entity.T1ShopNewBuyerRoi, + T3ShopNewBuyerRoi: entity.T3ShopNewBuyerRoi, + T7ShopNewBuyerRoi: entity.T7ShopNewBuyerRoi, + T15ShopNewBuyerRoi: entity.T15ShopNewBuyerRoi, + T30ShopNewBuyerRoi: entity.T30ShopNewBuyerRoi, + CreateCardOrderCnt: entity.CreateCardOrderCnt, + ForwardTsCreateCardOrderCnt: entity.ForwardTsCreateCardOrderCnt, + CreateCardOrderCost: entity.CreateCardOrderCost, + ForwardTsCreateCardOrderCost: entity.ForwardTsCreateCardOrderCost, + ActivateCardOrderCnt: entity.ActivateCardOrderCnt, + ForwardTsActivateCardOrderCnt: entity.ForwardTsActivateCardOrderCnt, + ActivateCardOrderCost: entity.ActivateCardOrderCost, + ForwardTsActivateCardOrderCost: entity.ForwardTsActivateCardOrderCost, + CreateCardOrderRatio: entity.CreateCardOrderRatio, + ForwardTsCreateCardOrderRatio: entity.ForwardTsCreateCardOrderRatio, + ActivateCardOrderCntRatio: entity.ActivateCardOrderCntRatio, + ForwardTsActivateCardOrderRatio: entity.ForwardTsActivateCardOrderRatio, + LivePlayCnt: entity.LivePlayCnt, + ItemEntranceClkCnt: entity.ItemEntranceClkCnt, + ShowCnt: entity.ShowCnt, + ReportDateStr: entity.ReportDateStr, + CampaignId: entity.CampaignId, + CampaignName: entity.CampaignName, + UnitId: entity.UnitId, + UnitName: entity.UnitName, + CreativeId: entity.CreativeId, + CreativeName: entity.CreativeName, + } +} diff --git a/service/copydata/population_report_service.go b/service/copydata/population_report_service.go new file mode 100644 index 0000000..debbb5a --- /dev/null +++ b/service/copydata/population_report_service.go @@ -0,0 +1,237 @@ +package copydata + +import ( + dao "cid/dao/copydata" + dto "cid/model/dto/copydata" + entity "cid/model/entity/copydata" + "context" + "errors" +) + +var PopulationReportService = new(populationReportService) + +type populationReportService struct{} + +// Create 创建人群报表数据 +func (s *populationReportService) Create(ctx context.Context, req *dto.PopulationReportItem) (*dto.CreatePopulationReportRes, error) { + if req.ReportDateStr == "" { + return nil, errors.New("报告日期不能为空") + } + + id, err := dao.PopulationReport.Insert(ctx, req) + if err != nil { + return nil, err + } + + return &dto.CreatePopulationReportRes{Id: id}, nil +} + +// BatchCreate 批量创建人群报表数据 +func (s *populationReportService) BatchCreate(ctx context.Context, req []*dto.PopulationReportItem) (*dto.BatchCreatePopulationReportRes, error) { + if len(req) == 0 { + return nil, errors.New("批量创建数据不能为空") + } + + successCount, failCount, failedIndexes, err := dao.PopulationReport.BatchInsert(ctx, req) + if err != nil { + return nil, err + } + + return &dto.BatchCreatePopulationReportRes{ + SuccessCount: successCount, + FailCount: failCount, + FailedItems: failedIndexes, + }, nil +} + +// List 查询人群报表数据列表 +func (s *populationReportService) List(ctx context.Context, req *dto.ListPopulationReportReq) (*dto.ListPopulationReportRes, error) { + list, total, err := dao.PopulationReport.List(ctx, req) + if err != nil { + return nil, err + } + + // 转换为 DTO + items := s.convertToDTOs(list) + + return &dto.ListPopulationReportRes{ + List: items, + Total: total, + }, nil +} + +// convertToDTOs 将实体列表转换为 DTO 列表 +func (s *populationReportService) convertToDTOs(entities []*entity.PopulationReport) []*dto.PopulationReportItem { + items := make([]*dto.PopulationReportItem, 0, len(entities)) + for _, e := range entities { + items = append(items, s.convertToDTO(e)) + } + return items +} + +// convertToDTO 将实体转换为 DTO +func (s *populationReportService) convertToDTO(e *entity.PopulationReport) *dto.PopulationReportItem { + return &dto.PopulationReportItem{ + PhotoName: e.PhotoName, + PhotoIdStr: e.PhotoIdStr, + PhotoId: e.PhotoId, + ModPriceSegment: e.ModPriceSegment, + AgeSegment: e.AgeSegment, + Province: e.Province, + Gender: e.Gender, + MerchantProductId: e.MerchantProductId, + ReportDateStr: e.ReportDateStr, + CampaignId: e.CampaignId, + CampaignName: e.CampaignName, + UnitId: e.UnitId, + UnitName: e.UnitName, + CreativeId: e.CreativeId, + CreativeName: e.CreativeName, + AdPhotoPlayedFiveRatio: e.AdPhotoPlayedFiveRatio, + AdPhotoPlayedThreeRatio: e.AdPhotoPlayedThreeRatio, + OrderSubmitRoi: e.OrderSubmitRoi, + OrderSubmitAmt: e.OrderSubmitAmt, + EventOrderSubmitCost: e.EventOrderSubmitCost, + EventOrderSubmit: e.EventOrderSubmit, + EventOrderPaidRoi: e.EventOrderPaidRoi, + EventAppInvoked: e.EventAppInvoked, + EventAddShoppingCart: e.EventAddShoppingCart, + ConversionNumCost: e.ConversionNumCost, + AdEffectivePlayNum: e.AdEffectivePlayNum, + AdItemClick: e.AdItemClick, + CostTotal: e.CostTotal, + AdShow: e.AdShow, + AdShow1kCost: e.AdShow1kCost, + Impression: e.Impression, + PhotoClick: e.PhotoClick, + PhotoClickRatio: e.PhotoClickRatio, + Click: e.Click, + ActionbarClick: e.ActionbarClick, + ActionbarClickCost: e.ActionbarClickCost, + EspClickRatio: e.EspClickRatio, + ActionRatio: e.ActionRatio, + AdItemClickCount: e.AdItemClickCount, + EspLivePlayedSeconds: e.EspLivePlayedSeconds, + PlayedThreeSeconds: e.PlayedThreeSeconds, + Play3sRatio: e.Play3sRatio, + PlayedFiveSeconds: e.PlayedFiveSeconds, + Play5sRatio: e.Play5sRatio, + PlayedEnd: e.PlayedEnd, + PlayEndRatio: e.PlayEndRatio, + Share: e.Share, + Comment: e.Comment, + Likes: e.Likes, + Report: e.Report, + Block: e.Block, + ItemNegative: e.ItemNegative, + LiveShare: e.LiveShare, + LiveComment: e.LiveComment, + LiveReward: e.LiveReward, + EffectivePlayCount: e.EffectivePlayCount, + EffectivePlayRatio: e.EffectivePlayRatio, + ConversionNum: e.ConversionNum, + ConversionCostEsp: e.ConversionCostEsp, + Roi: e.Roi, + Gmv: e.Gmv, + T0Gmv: e.T0Gmv, + T1Gmv: e.T1Gmv, + T3Gmv: e.T3Gmv, + T7Gmv: e.T7Gmv, + T15Gmv: e.T15Gmv, + T30Gmv: e.T30Gmv, + T0Roi: e.T0Roi, + T1Roi: e.T1Roi, + T3Roi: e.T3Roi, + T7Roi: e.T7Roi, + T15Roi: e.T15Roi, + T30Roi: e.T30Roi, + PaiedOrder: e.PaiedOrder, + OrderRatio: e.OrderRatio, + T0OrderCnt: e.T0OrderCnt, + T0OrderCntCost: e.T0OrderCntCost, + T0OrderCntRatio: e.T0OrderCntRatio, + T1OrderCnt: e.T1OrderCnt, + T7OrderCnt: e.T7OrderCnt, + T15OrderCnt: e.T15OrderCnt, + T30OrderCnt: e.T30OrderCnt, + MerchantRecoFans: e.MerchantRecoFans, + T1Retention: e.T1Retention, + T7Retention: e.T7Retention, + T15Retention: e.T15Retention, + T30Retention: e.T30Retention, + T1RetentionRatio: e.T1RetentionRatio, + T7RetentionRatio: e.T7RetentionRatio, + T15RetentionRatio: e.T15RetentionRatio, + T30RetentionRatio: e.T30RetentionRatio, + ReservationSuccess: e.ReservationSuccess, + ReservationCost: e.ReservationCost, + StandardLivePlayedStarted: e.StandardLivePlayedStarted, + AdLivePlayCnt: e.AdLivePlayCnt, + AdLivePlayCntCost: e.AdLivePlayCntCost, + LiveAudienceCost: e.LiveAudienceCost, + LiveEventGoodsView: e.LiveEventGoodsView, + GoodsClickRatio: e.GoodsClickRatio, + DirectAttrPlatNewBuyerCnt: e.DirectAttrPlatNewBuyerCnt, + T30AttrPlatTotalBuyerCnt: e.T30AttrPlatTotalBuyerCnt, + DirectAttrSellerNewBuyerCnt: e.DirectAttrSellerNewBuyerCnt, + T30AttrSellerTotalBuyerCnt: e.T30AttrSellerTotalBuyerCnt, + T7IndirectOrderAmt: e.T7IndirectOrderAmt, + T7IndirectOrderCnt: e.T7IndirectOrderCnt, + FansT0GmvPerFans: e.FansT0GmvPerFans, + FansT3GmvPerFans: e.FansT3GmvPerFans, + FansT7GmvPerFans: e.FansT7GmvPerFans, + FansT15GmvPerFans: e.FansT15GmvPerFans, + FansT30GmvPerFans: e.FansT30GmvPerFans, + RecoFansCost: e.RecoFansCost, + QcpxWhiteboxDirectOrderPaymentAmt: e.QcpxWhiteboxDirectOrderPaymentAmt, + QcpxWhiteboxDirectOrderCnt: e.QcpxWhiteboxDirectOrderCnt, + FansT0Gmv: e.FansT0Gmv, + FansT1Gmv: e.FansT1Gmv, + FansT7Gmv: e.FansT7Gmv, + FansT15Gmv: e.FansT15Gmv, + FansT30Gmv: e.FansT30Gmv, + FansT0Roi: e.FansT0Roi, + FansT1Roi: e.FansT1Roi, + FansT7Roi: e.FansT7Roi, + FansT15Roi: e.FansT15Roi, + FansT30Roi: e.FansT30Roi, + T0ShopNewBuyerOrderPaymentAmt: e.T0ShopNewBuyerOrderPaymentAmt, + T1ShopNewBuyerOrderPaymentAmt: e.T1ShopNewBuyerOrderPaymentAmt, + T3ShopNewBuyerOrderPaymentAmt: e.T3ShopNewBuyerOrderPaymentAmt, + T7ShopNewBuyerOrderPaymentAmt: e.T7ShopNewBuyerOrderPaymentAmt, + T15ShopNewBuyerOrderPaymentAmt: e.T15ShopNewBuyerOrderPaymentAmt, + T30ShopNewBuyerOrderPaymentAmt: e.T30ShopNewBuyerOrderPaymentAmt, + T0ShopNewBuyerOrderCnt: e.T0ShopNewBuyerOrderCnt, + T1ShopNewBuyerOrderCnt: e.T1ShopNewBuyerOrderCnt, + T3ShopNewBuyerOrderCnt: e.T3ShopNewBuyerOrderCnt, + T7ShopNewBuyerOrderCnt: e.T7ShopNewBuyerOrderCnt, + T15ShopNewBuyerOrderCnt: e.T15ShopNewBuyerOrderCnt, + T30ShopNewBuyerOrderCnt: e.T30ShopNewBuyerOrderCnt, + T1NewBuyerRepurchaseRatio: e.T1NewBuyerRepurchaseRatio, + T3NewBuyerRepurchaseRatio: e.T3NewBuyerRepurchaseRatio, + T7NewBuyerRepurchaseRatio: e.T7NewBuyerRepurchaseRatio, + T15NewBuyerRepurchaseRatio: e.T15NewBuyerRepurchaseRatio, + T30NewBuyerRepurchaseRatio: e.T30NewBuyerRepurchaseRatio, + T0ShopNewBuyerRoi: e.T0ShopNewBuyerRoi, + T1ShopNewBuyerRoi: e.T1ShopNewBuyerRoi, + T3ShopNewBuyerRoi: e.T3ShopNewBuyerRoi, + T7ShopNewBuyerRoi: e.T7ShopNewBuyerRoi, + T15ShopNewBuyerRoi: e.T15ShopNewBuyerRoi, + T30ShopNewBuyerRoi: e.T30ShopNewBuyerRoi, + CreateCardOrderCnt: e.CreateCardOrderCnt, + ForwardTsCreateCardOrderCnt: e.ForwardTsCreateCardOrderCnt, + CreateCardOrderCost: e.CreateCardOrderCost, + ForwardTsCreateCardOrderCost: e.ForwardTsCreateCardOrderCost, + ActivateCardOrderCnt: e.ActivateCardOrderCnt, + ForwardTsActivateCardOrderCnt: e.ForwardTsActivateCardOrderCnt, + ActivateCardOrderCost: e.ActivateCardOrderCost, + ForwardTsActivateCardOrderCost: e.ForwardTsActivateCardOrderCost, + CreateCardOrderRatio: e.CreateCardOrderRatio, + ForwardTsCreateCardOrderRatio: e.ForwardTsCreateCardOrderRatio, + ActivateCardOrderCntRatio: e.ActivateCardOrderCntRatio, + ForwardTsActivateCardOrderRatio: e.ForwardTsActivateCardOrderRatio, + LivePlayCnt: e.LivePlayCnt, + ItemEntranceClkCnt: e.ItemEntranceClkCnt, + ShowCnt: e.ShowCnt, + } +} diff --git a/service/copydata/storewide_report_sum_service.go b/service/copydata/storewide_report_sum_service.go new file mode 100644 index 0000000..7a01db3 --- /dev/null +++ b/service/copydata/storewide_report_sum_service.go @@ -0,0 +1,97 @@ +package copydata + +import ( + dao "cid/dao/copydata" + dto "cid/model/dto/copydata" + "context" + "errors" + + "gitea.com/red-future/common/beans" +) + +type storewideReportService struct{} + +// StorewideReportSum 广告效果指标表服务 +var StorewideReportSum = new(storewideReportService) + +// Create 创建广告效果指标表 +func (s *storewideReportService) Create(ctx context.Context, req *dto.StorewideReportSumItem) (res *dto.CreateStorewideReportSumRes, err error) { + // 验证必要字段 + if req.ReportDateStr == "" { + return nil, errors.New("报告日期不能为空") + } + + // 插入数据库 + id, err := dao.StorewideReportSum.Insert(ctx, req) + if err != nil { + return nil, err + } + + res = &dto.CreateStorewideReportSumRes{ + Id: id, + } + return +} + +// BatchCreate 批量创建广告效果指标表 +func (s *storewideReportService) BatchCreate(ctx context.Context, req *dto.BatchCreateStorewideReportSumReq) (res *dto.BatchCreateStorewideReportSumRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + // 验证数据 + if len(req.Items) == 0 { + return nil, errors.New("批量创建数据不能为空") + } + + // 批量插入数据库 + successCount, failCount, failedIndexes, err := dao.StorewideReportSum.BatchInsert(ctx, req.Items) + if err != nil { + return nil, err + } + + res = &dto.BatchCreateStorewideReportSumRes{ + SuccessCount: successCount, + FailCount: failCount, + FailedItems: failedIndexes, + } + return +} + +// Create 创建广告效果指标表 +func (s *storewideReportService) CreateDetail(ctx context.Context, req *dto.StorewideReportDetailItem) (res *dto.CreateStorewideReportDetailRes, err error) { + // 验证必要字段 + if req.ReportDateStr == "" { + return nil, errors.New("报告日期不能为空") + } + + // 插入数据库 + id, err := dao.StorewideReportDetail.Insert(ctx, req) + if err != nil { + return nil, err + } + + res = &dto.CreateStorewideReportDetailRes{ + Id: id, + } + return +} + +// BatchCreate 批量创建广告效果指标表 +func (s *storewideReportService) BatchCreateDetail(ctx context.Context, req *dto.BatchCreateStorewideReportDetailReq) (res *dto.BatchCreateStorewideReportDetailRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + // 验证数据 + if len(req.Items) == 0 { + return nil, errors.New("批量创建数据不能为空") + } + + // 批量插入数据库 + successCount, failCount, failedIndexes, err := dao.StorewideReportDetail.BatchInsert(ctx, req.Items) + if err != nil { + return nil, err + } + + res = &dto.BatchCreateStorewideReportDetailRes{ + SuccessCount: successCount, + FailCount: failCount, + FailedItems: failedIndexes, + } + return +} diff --git a/service/copydata/task_report_service.go b/service/copydata/task_report_service.go new file mode 100644 index 0000000..704820a --- /dev/null +++ b/service/copydata/task_report_service.go @@ -0,0 +1,113 @@ +package copydata + +import ( + dao "cid/dao/copydata" + dto "cid/model/dto/copydata" + entity "cid/model/entity/copydata" + "context" + "errors" + + "gitea.com/red-future/common/beans" +) + +type taskReportService struct{} + +// TaskReport 调控任务数据服务 +var TaskReport = new(taskReportService) + +// Create 创建调控任务数据 +func (s *taskReportService) Create(ctx context.Context, req *dto.TaskReportItem) (res *dto.CreateTaskReportRes, err error) { + // 验证必要字段 + if req.ReportDateStr == "" { + return nil, errors.New("报告日期不能为空") + } + + // 插入数据库 + id, err := dao.TaskReport.Insert(ctx, req) + if err != nil { + return nil, err + } + + res = &dto.CreateTaskReportRes{ + Id: id, + } + return +} + +// BatchCreate 批量创建调控任务数据 +func (s *taskReportService) BatchCreate(ctx context.Context, req *dto.BatchCreateTaskReportReq) (res *dto.BatchCreateTaskReportRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + // 验证数据 + if len(req.Items) == 0 { + return nil, errors.New("批量创建数据不能为空") + } + + // 批量插入数据库 + successCount, failCount, failedIndexes, err := dao.TaskReport.BatchInsert(ctx, req.Items) + if err != nil { + return nil, err + } + + res = &dto.BatchCreateTaskReportRes{ + SuccessCount: successCount, + FailCount: failCount, + FailedItems: failedIndexes, + } + return +} + +// List 获取调控任务数据列表 +func (s *taskReportService) List(ctx context.Context, req *dto.ListTaskReportReq) (res *dto.ListTaskReportRes, err error) { + list, total, err := dao.TaskReport.List(ctx, req) + if err != nil { + return nil, err + } + + // 转换为 DTO 格式 + items := make([]*dto.TaskReportItem, len(list)) + for i, item := range list { + items[i] = convertEntityToDTO(item) + } + + res = &dto.ListTaskReportRes{ + List: items, + Total: total, + } + return +} + +// convertEntityToDTO 将实体转换为 DTO +func convertEntityToDTO(entity *entity.TaskReport) *dto.TaskReportItem { + return &dto.TaskReportItem{ + ItemOrderConversionRatio: entity.ItemOrderConversionRatio, + ItemCardClickRatio: entity.ItemCardClickRatio, + ItemCardClkCnt: entity.ItemCardClkCnt, + LivePlayCntCost: entity.LivePlayCntCost, + AdMerchantFollowCost: entity.AdMerchantFollowCost, + AdMerchantFollow: entity.AdMerchantFollow, + NetT0OrderCnt: entity.NetT0OrderCnt, + NetT0Roi: entity.NetT0Roi, + NetT0Gmv: entity.NetT0Gmv, + PhotoName: entity.PhotoName, + PhotoId: entity.PhotoId, + CostTotal: entity.CostTotal, + T0Gmv: entity.T0Gmv, + T0Roi: entity.T0Roi, + T0OrderCnt: entity.T0OrderCnt, + T0OrderCntCost: entity.T0OrderCntCost, + FansT0Gmv: entity.FansT0Gmv, + FansT1Gmv: entity.FansT1Gmv, + FansT7Gmv: entity.FansT7Gmv, + FansT15Gmv: entity.FansT15Gmv, + FansT30Gmv: entity.FansT30Gmv, + FansT0Roi: entity.FansT0Roi, + FansT1Roi: entity.FansT1Roi, + FansT7Roi: entity.FansT7Roi, + FansT15Roi: entity.FansT15Roi, + FansT30Roi: entity.FansT30Roi, + LivePlayCnt: entity.LivePlayCnt, + ItemEntranceClkCnt: entity.ItemEntranceClkCnt, + ShowCnt: entity.ShowCnt, + ReportDateStr: entity.ReportDateStr, + } +} diff --git a/service/copydata/unit_report_service.go b/service/copydata/unit_report_service.go new file mode 100644 index 0000000..0935b08 --- /dev/null +++ b/service/copydata/unit_report_service.go @@ -0,0 +1,90 @@ +package copydata + +import ( + dao "cid/dao/copydata" + dto "cid/model/dto/copydata" + "context" + "errors" + + "gitea.com/red-future/common/beans" +) + +type unitReportSumService struct{} + +// UnitReportSumService 广告效果指标服务 +var UnitReportSumService = new(unitReportSumService) + +// Create 创建广告效果指标 +func (s *unitReportSumService) Create(ctx context.Context, req *dto.UnitReportSumItem) (res *dto.CreateUnitReportSumRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + if req.ReportDateStr == "" { + return nil, errors.New("报告日期不能为空") + } + + id, err := dao.UnitReportSum.Insert(ctx, req) + if err != nil { + return nil, err + } + + res = &dto.CreateUnitReportSumRes{ + Id: id, + } + return +} + +// BatchCreate 批量创建广告效果指标 +func (s *unitReportSumService) BatchCreate(ctx context.Context, req *dto.BatchCreateUnitReportSumReq) (res *dto.BatchCreateUnitReportSumRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + if len(req.Items) == 0 { + return nil, errors.New("批量创建数据不能为空") + } + + successCount, failCount, failedIndexes, err := dao.UnitReportSum.BatchInsert(ctx, req.Items) + if err != nil { + return nil, err + } + + res = &dto.BatchCreateUnitReportSumRes{ + SuccessCount: successCount, + FailCount: failCount, + FailedItems: failedIndexes, + } + return +} + +// Create 创建广告效果指标详情 +func (s *unitReportSumService) CreateDetail(ctx context.Context, req *dto.UnitReportDetailItem) (res *dto.CreateUnitReportDetailRes, err error) { + if req.ReportDateStr == "" { + return nil, errors.New("报告日期不能为空") + } + + id, err := dao.UnitReportDetail.Insert(ctx, req) + if err != nil { + return nil, err + } + + res = &dto.CreateUnitReportDetailRes{ + Id: id, + } + return +} + +// BatchCreate 批量创建广告效果指标详情 +func (s *unitReportSumService) BatchCreateDetail(ctx context.Context, req *dto.BatchCreateUnitReportDetailReq) (res *dto.BatchCreateUnitReportDetailRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + if len(req.Items) == 0 { + return nil, errors.New("批量创建数据不能为空") + } + + successCount, failCount, failedIndexes, err := dao.UnitReportDetail.BatchInsert(ctx, req.Items) + if err != nil { + return nil, err + } + + res = &dto.BatchCreateUnitReportDetailRes{ + SuccessCount: successCount, + FailCount: failCount, + FailedItems: failedIndexes, + } + return +} diff --git a/service/dict/api_datasource_platform_service.go b/service/dict/api_datasource_platform_service.go new file mode 100644 index 0000000..eef7aab --- /dev/null +++ b/service/dict/api_datasource_platform_service.go @@ -0,0 +1,305 @@ +package dict + +import ( + api_feature "cid/consts/api-feature" + dao "cid/dao/dict" + dto "cid/model/dto/dict" + entity "cid/model/entity/dict" + "context" + "strconv" + "time" + + "github.com/gogf/gf/v2/util/gconv" + "github.com/olekukonko/errors" +) + +type datasourcePlatformService struct{} + +// DatasourcePlatform 数据源平台服务 +var DatasourcePlatform = new(datasourcePlatformService) + +// Create 创建数据源平台 +func (s *datasourcePlatformService) Create(ctx context.Context, req *dto.CreateDatasourcePlatformReq) (res *dto.CreateDatasourcePlatformRes, err error) { + // 检查平台编码是否重复 + exists, err := dao.DatasourcePlatform.ExistsByPlatformCode(ctx, req.PlatformCode) + if err != nil { + return nil, err + } + if exists { + return nil, errors.New("平台编码已存在") + } + + // 验证认证类型相关的必填字段 + if err = s.validateAuthFields(req); err != nil { + return nil, err + } + + // 设置创建时间为当前时间 + if req.CreatedAt == "" { + req.CreatedAt = strconv.FormatInt(time.Now().Unix(), 10) + } + req.UpdatedAt = req.CreatedAt + + // 插入数据库 + id, err := dao.DatasourcePlatform.Insert(ctx, req) + if err != nil { + return nil, err + } + + res = &dto.CreateDatasourcePlatformRes{ + Id: id, + } + return res, nil +} + +// List 获取数据源平台列表 +func (s *datasourcePlatformService) List(ctx context.Context, req *dto.ListDatasourcePlatformReq) (res *dto.ListDatasourcePlatformRes, err error) { + platformList, total, err := dao.DatasourcePlatform.List(ctx, req) + if err != nil { + return nil, err + } + + // 组装响应数据 + list := make([]dto.DatasourcePlatformItem, 0, len(platformList)) + for _, item := range platformList { + list = append(list, dto.DatasourcePlatformItem{ + Id: item.ID, + PlatformCode: item.PlatformCode, + PlatformName: item.PlatformName, + Description: item.Description, + Status: api_feature.PlatformStatus(item.Status), + StatusName: s.getStatusName(api_feature.PlatformStatus(item.Status)), + ApiBaseUrl: item.ApiBaseUrl, + AuthType: item.AuthType, + AuthTypeName: s.getAuthTypeName(item.AuthType), + RateLimitPerMinute: item.RateLimitPerMinute, + RateLimitPerHour: item.RateLimitPerHour, + ConcurrencyLimit: item.ConcurrencyLimit, + RequestTimeoutMs: item.RequestTimeoutMs, + MaxRetries: item.MaxRetries, + RetryDelayMs: item.RetryDelayMs, + CreatedBy: item.CreatedBy, + CreatedAt: item.CreatedAt.Unix(), + UpdatedBy: item.UpdatedBy, + UpdatedAt: item.UpdatedAt.Unix(), + }) + } + + res = &dto.ListDatasourcePlatformRes{ + List: list, + Total: total, + } + return res, nil +} + +// GetOne 获取单个数据源平台 +func (s *datasourcePlatformService) GetOne(ctx context.Context, req *dto.GetDatasourcePlatformReq) (res *dto.GetDatasourcePlatformRes, err error) { + platform, err := dao.DatasourcePlatform.GetOne(ctx, req) + if err != nil { + return nil, err + } + if platform == nil { + return nil, errors.New("数据源平台不存在") + } + + var platformEntity *entity.DatasourcePlatform + if err = gconv.Struct(platform, &platformEntity); err != nil { + return nil, err + } + + // 隐藏敏感信息 + platformEntity.Token = "" + platformEntity.ClientSecret = "" + platformEntity.ApiKey = "" + + return &dto.GetDatasourcePlatformRes{ + DatasourcePlatform: platformEntity, + }, nil +} + +// GetByPlatformCode 根据平台编码获取数据源平台 +func (s *datasourcePlatformService) GetByPlatformCode(ctx context.Context, platformCode string) (res *entity.DatasourcePlatform, err error) { + platform, err := dao.DatasourcePlatform.GetByPlatformCode(ctx, platformCode) + if err != nil { + return nil, err + } + if platform == nil { + return nil, errors.New("数据源平台不存在") + } + return platform, nil +} + +// Update 更新数据源平台 +func (s *datasourcePlatformService) Update(ctx context.Context, req *dto.UpdateDatasourcePlatformReq) (err error) { + // 检查平台是否存在 + exist, err := dao.DatasourcePlatform.GetOne(ctx, &dto.GetDatasourcePlatformReq{Id: req.Id}) + if err != nil { + return err + } + if exist == nil { + return errors.New("数据源平台不存在") + } + + // 如果修改了平台编码,检查新编码是否重复 + if req.PlatformCode != "" && req.PlatformCode != exist.PlatformCode { + exists, err := dao.DatasourcePlatform.ExistsByPlatformCode(ctx, req.PlatformCode, req.Id) + if err != nil { + return err + } + if exists { + return errors.New("平台编码已存在") + } + } + + // 验证认证类型相关的必填字段 + if req.AuthType != "" { + authReq := &dto.CreateDatasourcePlatformReq{ + AuthType: req.AuthType, + Token: req.Token, + ApiKey: req.ApiKey, + ClientId: req.ClientId, + ClientSecret: req.ClientSecret, + } + if err = s.validateAuthFields(authReq); err != nil { + return err + } + } + + // 设置更新时间 + req.UpdatedAt = strconv.FormatInt(time.Now().Unix(), 10) + _, err = dao.DatasourcePlatform.Update(ctx, req) + return err +} + +// UpdateStatus 更新数据源平台状态 +func (s *datasourcePlatformService) UpdateStatus(ctx context.Context, req *dto.UpdateDatasourcePlatformStatusReq) (err error) { + // 检查平台是否存在 + exist, err := dao.DatasourcePlatform.GetOne(ctx, &dto.GetDatasourcePlatformReq{Id: req.Id}) + if err != nil { + return err + } + if exist == nil { + return errors.New("数据源平台不存在") + } + + // 如果状态没有变化,直接返回 + if string(exist.Status) == req.Status.String() { + return nil + } + + _, err = dao.DatasourcePlatform.UpdateStatus(ctx, req.Id, req.Status.String(), req.UpdatedBy) + return err +} + +// Delete 删除数据源平台 +func (s *datasourcePlatformService) Delete(ctx context.Context, req *dto.DeleteDatasourcePlatformReq) (err error) { + // 检查平台是否存在 + exist, err := dao.DatasourcePlatform.GetOne(ctx, &dto.GetDatasourcePlatformReq{Id: req.Id}) + if err != nil { + return err + } + if exist == nil { + return errors.New("数据源平台不存在") + } + + // TODO: 检查是否存在关联的数据,防止误删 + // 例如:检查该平台是否有关联的接口配置等 + + _, err = dao.DatasourcePlatform.Delete(ctx, req) + return err +} + +// GetStatistics 获取平台统计信息 +func (s *datasourcePlatformService) GetStatistics(ctx context.Context) (res *dto.GetPlatformStatisticsRes, err error) { + stats, err := dao.DatasourcePlatform.GetPlatformStatistics(ctx) + if err != nil { + return nil, err + } + + res = &dto.GetPlatformStatisticsRes{ + TotalPlatforms: int(stats["totalPlatforms"]), + ActivePlatforms: int(stats["activePlatforms"]), + InactivePlatforms: int(stats["inactivePlatforms"]), + TokenAuthPlatforms: int(stats["TOKENAuthPlatforms"]), + ApiKeyAuthPlatforms: int(stats["API_KEYAuthPlatforms"]), + OAuth2AuthPlatforms: int(stats["OAUTH2AuthPlatforms"]), + BasicAuthPlatforms: int(stats["BASICAuthPlatforms"]), + } + return res, nil +} + +// ListActivePlatforms 获取所有启用的平台 +func (s *datasourcePlatformService) ListActivePlatforms(ctx context.Context) (platforms []entity.DatasourcePlatform, err error) { + return dao.DatasourcePlatform.ListActivePlatforms(ctx) +} + +// validateAuthFields 验证认证类型相关的必填字段 +func (s *datasourcePlatformService) validateAuthFields(req *dto.CreateDatasourcePlatformReq) error { + switch req.AuthType { + case "TOKEN": + if req.Token == "" { + return errors.New("TOKEN认证类型必须填写token字段") + } + case "API_KEY": + if req.ApiKey == "" { + return errors.New("API_KEY认证类型必须填写apiKey字段") + } + case "OAUTH2": + if req.ClientId == "" || req.ClientSecret == "" { + return errors.New("OAUTH2认证类型必须填写clientId和clientSecret字段") + } + case "BASIC": + // BASIC认证通常需要用户名和密码,这里可以添加相应验证 + if req.Token == "" && req.ApiKey == "" { + return errors.New("BASIC认证类型需要填写认证信息") + } + default: + return errors.New("不支持的认证类型") + } + return nil +} + +// performConnectionTest 执行连接测试(示例实现) +func (s *datasourcePlatformService) performConnectionTest(platform *entity.DatasourcePlatform) (success bool, message string) { + // 这里应该实现实际的连接测试逻辑 + // 例如:发送HTTP请求到api_base_url,验证响应 + + // 暂时返回模拟结果 + return true, "连接测试成功" +} + +// getStatusName 获取状态名称 +func (s *datasourcePlatformService) getStatusName(status api_feature.PlatformStatus) string { + statusNames := map[api_feature.PlatformStatus]string{ + api_feature.PlatformStatusActive: "启用", + api_feature.PlatformStatusInactive: "停用", + } + if name, ok := statusNames[status]; ok { + return name + } + return string(status) +} + +// getAuthTypeName 获取认证类型名称 +func (s *datasourcePlatformService) getAuthTypeName(authType string) string { + authTypeNames := map[string]string{ + "TOKEN": "Token认证", + "API_KEY": "API Key认证", + "OAUTH2": "OAuth2认证", + "BASIC": "Basic认证", + } + if name, ok := authTypeNames[authType]; ok { + return name + } + return authType +} + +// BatchUpdateStatus 批量更新平台状态 +func (s *datasourcePlatformService) BatchUpdateStatus(ctx context.Context, ids []int64, status string, updatedBy string) (err error) { + if len(ids) == 0 { + return errors.New("请选择要更新的平台") + } + + _, err = dao.DatasourcePlatform.BatchUpdateStatus(ctx, ids, status, updatedBy) + return err +} diff --git a/service/dict/api_field_mapping_config_service.go b/service/dict/api_field_mapping_config_service.go new file mode 100644 index 0000000..8943608 --- /dev/null +++ b/service/dict/api_field_mapping_config_service.go @@ -0,0 +1,396 @@ +package dict + +import ( + consts "cid/consts/dict" + "cid/dao/dict" + dto "cid/model/dto/dict" + entity "cid/model/entity/dict" + "context" + "errors" + "fmt" + "time" + + "gitea.com/red-future/common/beans" +) + +type fieldMappingConfigService struct{} + +// FieldMappingConfig 字段映射配置服务 +var FieldMappingConfig = new(fieldMappingConfigService) + +// Create 创建字段映射配置 +func (s *fieldMappingConfigService) Create(ctx context.Context, req *dto.CreateFieldMappingConfigReq) (res *dto.CreateFieldMappingConfigRes, err error) { + // 验证必填字段 + if err = s.validateRequiredFields(req); err != nil { + return nil, err + } + + // 检查重复配置 + exists, err := dict.FieldMappingConfig.CheckDuplicate(ctx, req.VendorName, req.ApiName, req.SourceField, req.TargetField, 0) + if err != nil { + return nil, errors.New("检查配置重复性失败") + } + if exists { + return nil, errors.New("相同厂商、接口、源字段和目标字段的配置已存在") + } + + // 验证转换参数 + if err = s.validateTransformParams(req.TransformType, req.TransformParams); err != nil { + return nil, fmt.Errorf("转换参数验证失败: %v", err) + } + + // 验证业务域 + if req.BusinessDomain != "" && !s.isValidBusinessDomain(req.BusinessDomain) { + return nil, errors.New("无效的业务域") + } + + // 验证生效时间和失效时间 + if req.EffectiveDate != nil && req.ExpiryDate != nil && req.EffectiveDate.After(*req.ExpiryDate) { + return nil, errors.New("生效时间不能晚于失效时间") + } + + // 插入数据库 + id, err := dict.FieldMappingConfig.Insert(ctx, req) + if err != nil { + return nil, errors.New("创建配置失败") + } + + res = &dto.CreateFieldMappingConfigRes{ + Id: id, + } + return +} + +// List 获取字段映射配置列表 +func (s *fieldMappingConfigService) List(ctx context.Context, req *dto.ListFieldMappingConfigReq) (res *dto.ListFieldMappingConfigRes, err error) { + configs, total, err := dict.FieldMappingConfig.List(ctx, req) + if err != nil { + return nil, errors.New("查询配置列表失败") + } + + // 组装响应数据 + list := make([]dto.FieldMappingConfigItem, 0, len(configs)) + for _, item := range configs { + list = append(list, dto.FieldMappingConfigItem{ + Id: item.Id, + ConfigName: item.ConfigName, + VendorName: item.VendorName, + ApiName: item.ApiName, + ApiVersion: item.ApiVersion, + SourceField: item.SourceField, + TargetField: item.TargetField, + TargetFieldType: item.TargetFieldType, + TransformType: item.TransformType, + TransformTypeName: s.getTransformTypeName(item.TransformType), + IsActive: item.IsActive, + Priority: item.Priority, + BusinessDomain: item.BusinessDomain, + BusinessDomainName: s.getBusinessDomainName(item.BusinessDomain), + FieldGroup: item.FieldGroup, + ConfigVersion: item.ConfigVersion, + CreatedBy: item.CreatedBy, + CreatedTime: item.CreatedTime, + UpdatedBy: item.UpdatedBy, + UpdatedTime: item.UpdatedTime, + }) + } + + res = &dto.ListFieldMappingConfigRes{ + List: list, + Total: total, + } + return +} + +// GetOne 获取单个字段映射配置 +func (s *fieldMappingConfigService) GetOne(ctx context.Context, req *dto.GetFieldMappingConfigReq) (res *dto.GetFieldMappingConfigRes, err error) { + config, err := dict.FieldMappingConfig.GetOne(ctx, req) + if err != nil { + return nil, errors.New("获取配置详情失败") + } + if config == nil { + return nil, errors.New("配置不存在") + } + + return &dto.GetFieldMappingConfigRes{ + FieldMappingConfig: config, + TransformTypeName: s.getTransformTypeName(config.TransformType), + BusinessDomainName: s.getBusinessDomainName(config.BusinessDomain), + }, nil +} + +// Update 更新字段映射配置 +func (s *fieldMappingConfigService) Update(ctx context.Context, req *dto.UpdateFieldMappingConfigReq) (err error) { + // 检查配置是否存在 + exist, err := dict.FieldMappingConfig.GetOne(ctx, &dto.GetFieldMappingConfigReq{Id: req.Id}) + if err != nil || exist == nil { + return errors.New("配置不存在") + } + + // 如果修改了关键字段,检查重复性 + if (req.VendorName != "" && req.VendorName != exist.VendorName) || + (req.ApiName != "" && req.ApiName != exist.ApiName) || + (req.SourceField != "" && req.SourceField != exist.SourceField) || + (req.TargetField != "" && req.TargetField != exist.TargetField) { + + vendorName := req.VendorName + if vendorName == "" { + vendorName = exist.VendorName + } + apiName := req.ApiName + if apiName == "" { + apiName = exist.ApiName + } + sourceField := req.SourceField + if sourceField == "" { + sourceField = exist.SourceField + } + targetField := req.TargetField + if targetField == "" { + targetField = exist.TargetField + } + + exists, err := dict.FieldMappingConfig.CheckDuplicate(ctx, vendorName, apiName, sourceField, targetField, req.Id) + if err != nil { + return errors.New("检查配置重复性失败") + } + if exists { + return errors.New("相同厂商、接口、源字段和目标字段的配置已存在") + } + } + + // 验证转换参数 + if req.TransformType != "" && req.TransformParams != nil { + if err = s.validateTransformParams(req.TransformType, req.TransformParams); err != nil { + return fmt.Errorf("转换参数验证失败: %v", err) + } + } + + // 验证生效时间和失效时间 + if req.EffectiveDate != nil && req.ExpiryDate != nil && req.EffectiveDate.After(*req.ExpiryDate) { + return errors.New("生效时间不能晚于失效时间") + } + + // 更新数据库 + _, err = dict.FieldMappingConfig.Update(ctx, req) + if err != nil { + return errors.New("更新配置失败") + } + + return nil +} + +// UpdateStatus 更新字段映射配置状态 +func (s *fieldMappingConfigService) UpdateStatus(ctx context.Context, req *dto.UpdateFieldMappingConfigStatusReq) (err error) { + _, err = dict.FieldMappingConfig.UpdateStatus(ctx, req.Id, req.IsActive) + if err != nil { + return errors.New("更新配置状态失败") + } + return nil +} + +// Delete 删除字段映射配置 +func (s *fieldMappingConfigService) Delete(ctx context.Context, req *dto.DeleteFieldMappingConfigReq) (err error) { + _, err = dict.FieldMappingConfig.Delete(ctx, req) + if err != nil { + return errors.New("删除配置失败") + } + return nil +} + +// QueryByVendorApi 根据厂商和接口查询字段映射 +func (s *fieldMappingConfigService) QueryByVendorApi(ctx context.Context, req *dto.QueryFieldMappingByVendorApiReq) (res *dto.QueryFieldMappingByVendorApiRes, err error) { + configs, err := dict.FieldMappingConfig.GetByVendorAndApi(ctx, req.VendorName, req.ApiName, req.ApiVersion, req.IsActive) + if err != nil { + return nil, errors.New("查询字段映射配置失败") + } + + // 过滤掉已过期的配置 + var validConfigs []*entity.FieldMappingConfig + now := time.Now() + for _, config := range configs { + if (config.EffectiveDate == nil || !config.EffectiveDate.After(now)) && + (config.ExpiryDate == nil || config.ExpiryDate.After(now)) { + validConfigs = append(validConfigs, config) + } + } + + res = &dto.QueryFieldMappingByVendorApiRes{ + List: validConfigs, + } + return +} + +// Validate 验证字段映射配置 +func (s *fieldMappingConfigService) Validate(ctx context.Context, req *dto.ValidateFieldMappingReq) (res *dto.ValidateFieldMappingRes, err error) { + ctx = context.WithValue(ctx, "user", &beans.User{UserName: "admin"}) + res = &dto.ValidateFieldMappingRes{ + IsValid: false, + } + + // 验证基本配置 + if req.ConfigName == "" || req.VendorName == "" || req.ApiName == "" || req.SourceField == "" || req.TargetField == "" { + res.Error = "配置名称、厂商名称、接口名称、源字段和目标字段不能为空" + return + } + + // 检查重复配置 + exists, err := dict.FieldMappingConfig.CheckDuplicate(ctx, req.VendorName, req.ApiName, req.SourceField, req.TargetField, 0) + if err != nil { + res.Error = "检查配置重复性失败" + return + } + if exists { + res.Error = "相同厂商、接口、源字段和目标字段的配置已存在" + return + } + + // 如果有测试值,尝试转换 + if req.TestValue != nil { + // 这里可以实现具体的转换逻辑 + // 例如:根据转换类型和参数进行值转换 + res.TransformedValue = req.TestValue + res.Warnings = []string{"转换逻辑需要根据具体业务实现"} + } + + res.IsValid = true + return +} + +// validateRequiredFields 验证必填字段 +func (s *fieldMappingConfigService) validateRequiredFields(req *dto.CreateFieldMappingConfigReq) error { + if req.ConfigName == "" { + return errors.New("配置名称不能为空") + } + if req.VendorName == "" { + return errors.New("厂商名称不能为空") + } + if req.ApiName == "" { + return errors.New("接口名称不能为空") + } + if req.SourceField == "" { + return errors.New("源字段不能为空") + } + if req.TargetField == "" { + return errors.New("目标字段不能为空") + } + if req.TargetFieldType == "" { + return errors.New("目标字段类型不能为空") + } + return nil +} + +// validateRequiredFieldsForBatch 批量创建的字段验证 +func (s *fieldMappingConfigService) validateRequiredFieldsForBatch(config *dto.BatchFieldMappingConfigItem) error { + if config.ConfigName == "" { + return errors.New("配置名称不能为空") + } + if config.VendorName == "" { + return errors.New("厂商名称不能为空") + } + if config.ApiName == "" { + return errors.New("接口名称不能为空") + } + if config.SourceField == "" { + return errors.New("源字段不能为空") + } + if config.TargetField == "" { + return errors.New("目标字段不能为空") + } + if config.TargetFieldType == "" { + return errors.New("目标字段类型不能为空") + } + return nil +} + +// validateTransformParams 验证转换参数 +func (s *fieldMappingConfigService) validateTransformParams(transformType string, params map[string]interface{}) error { + if params == nil { + return nil + } + + switch transformType { + case consts.TransformTypeFormatDate: + if _, ok := params["source_format"]; !ok { + return errors.New("日期格式化转换需要source_format参数") + } + if _, ok := params["target_format"]; !ok { + return errors.New("日期格式化转换需要target_format参数") + } + case consts.TransformTypeMapValue: + if len(params) == 0 { + return errors.New("值映射转换需要映射规则参数") + } + case consts.TransformTypeConcat: + if _, ok := params["fields"]; !ok { + return errors.New("拼接转换需要fields参数") + } + case consts.TransformTypeRegex: + if _, ok := params["pattern"]; !ok { + return errors.New("正则提取转换需要pattern参数") + } + } + + return nil +} + +// isValidBusinessDomain 验证业务域是否有效 +func (s *fieldMappingConfigService) isValidBusinessDomain(domain string) bool { + validDomains := []string{ + consts.BusinessDomainUser, + consts.BusinessDomainOrder, + consts.BusinessDomainProduct, + consts.BusinessDomainPayment, + } + for _, valid := range validDomains { + if domain == valid { + return true + } + } + return false +} + +// getTransformTypeName 获取转换类型名称 +func (s *fieldMappingConfigService) getTransformTypeName(transformType string) string { + typeNames := map[string]string{ + consts.TransformTypeDirect: "直接映射", + consts.TransformTypeFormatDate: "日期格式化", + consts.TransformTypeMapValue: "值映射", + consts.TransformTypeConcat: "拼接", + consts.TransformTypeCalc: "计算", + consts.TransformTypeRegex: "正则提取", + } + if name, ok := typeNames[transformType]; ok { + return name + } + return transformType +} + +// getBusinessDomainName 获取业务域名称 +func (s *fieldMappingConfigService) getBusinessDomainName(domain string) string { + domainNames := map[string]string{ + consts.BusinessDomainUser: "用户", + consts.BusinessDomainOrder: "订单", + consts.BusinessDomainProduct: "商品", + consts.BusinessDomainPayment: "支付", + } + if name, ok := domainNames[domain]; ok { + return name + } + return domain +} + +// GetActiveConfigsByBusinessDomain 根据业务域获取启用的配置 +func (s *fieldMappingConfigService) GetActiveConfigsByBusinessDomain(ctx context.Context, businessDomain string) ([]entity.FieldMappingConfig, error) { + return dict.FieldMappingConfig.GetActiveConfigsByBusinessDomain(ctx, businessDomain) +} + +// GetFieldGroupsByVendorApi 获取指定厂商接口的字段分组 +func (s *fieldMappingConfigService) GetFieldGroupsByVendorApi(ctx context.Context, vendorName, apiName string) ([]string, error) { + return dict.FieldMappingConfig.GetFieldGroupsByVendorApi(ctx, vendorName, apiName) +} + +// CleanExpiredConfigs 清理过期配置 +func (s *fieldMappingConfigService) CleanExpiredConfigs(ctx context.Context) (int64, error) { + return dict.FieldMappingConfig.DeleteExpiredConfigs(ctx) +} diff --git a/service/dict/api_interface_service.go b/service/dict/api_interface_service.go new file mode 100644 index 0000000..5e78b85 --- /dev/null +++ b/service/dict/api_interface_service.go @@ -0,0 +1,183 @@ +package dict + +import ( + consts "cid/consts/api-feature" + "cid/dao/dict" + dto "cid/model/dto/dict" + entity "cid/model/entity/dict" + "context" + "errors" +) + +type apiInterfaceService struct{} + +// ApiInterface 接口服务 +var ApiInterface = new(apiInterfaceService) + +// Create 创建接口 +func (s *apiInterfaceService) Create(ctx context.Context, req *dto.CreateApiInterfaceReq) (res *dto.CreateApiInterfaceRes, err error) { + _, err = DatasourcePlatform.GetOne(ctx, &dto.GetDatasourcePlatformReq{Id: req.PlatformId}) + if err != nil { + return nil, errors.New("平台不存在") + } + + // 检查接口编码在同一平台下是否重复 + interfaces, _, err := dict.ApiInterface.List(ctx, &dto.ListApiInterfaceReq{ + PlatformId: req.PlatformId, + Code: req.Code, + }) + if err != nil { + return + } + if len(interfaces) > 0 { + return nil, errors.New("接口编码在该平台下已存在") + } + + // 插入数据库 + id, err := dict.ApiInterface.Insert(ctx, req) + if err != nil { + return + } + res = &dto.CreateApiInterfaceRes{ + Id: id, + } + return +} + +// List 获取接口列表 +func (s *apiInterfaceService) List(ctx context.Context, req *dto.ListApiInterfaceReq) (res *dto.ListApiInterfaceRes, err error) { + apiList, total, err := dict.ApiInterface.List(ctx, req) + if err != nil { + return + } + + platformIds := make([]int64, 0) + for _, item := range apiList { + if item.PlatformId > 0 { + platformIds = append(platformIds, item.PlatformId) + } + } + + platformMap := make(map[int64]string) + if len(platformIds) > 0 { + res, err := DatasourcePlatform.List(ctx, &dto.ListDatasourcePlatformReq{}) + if err == nil && res != nil { + for _, p := range res.List { + platformMap[p.Id] = p.PlatformName + } + } + } + + list := make([]dto.ApiInterfaceItem, 0, len(apiList)) + for _, item := range apiList { + platformName := "" + if name, ok := platformMap[item.PlatformId]; ok { + platformName = name + } + + list = append(list, dto.ApiInterfaceItem{ + Id: item.Id, + PlatformId: item.PlatformId, + PlatformName: platformName, + Name: item.Name, + Code: item.Code, + Url: item.Url, + Method: item.Method, + Status: item.Status, + StatusName: s.getStatusName(item.Status), + CreatedAt: item.CreatedAt.Unix(), + UpdatedAt: item.UpdatedAt.Unix(), + }) + } + + res = &dto.ListApiInterfaceRes{ + List: list, + Total: total, + } + return +} + +// GetOne 获取单个接口 +func (s *apiInterfaceService) GetOne(ctx context.Context, req *dto.GetApiInterfaceReq) (res *dto.GetApiInterfaceRes, err error) { + apiInterface, err := dict.ApiInterface.GetOne(ctx, req) + if err != nil { + return + } + + var platformName string + if apiInterface.PlatformId > 0 { + platform, _ := DatasourcePlatform.GetOne(ctx, &dto.GetDatasourcePlatformReq{Id: apiInterface.PlatformId}) + if platform != nil { + platformName = platform.PlatformName + } + } + + return &dto.GetApiInterfaceRes{ + ApiInterface: apiInterface, + PlatformName: platformName, + }, nil +} + +// Update 更新接口 +func (s *apiInterfaceService) Update(ctx context.Context, req *dto.UpdateApiInterfaceReq) (err error) { + exist, err := dict.ApiInterface.GetOne(ctx, &dto.GetApiInterfaceReq{Id: req.Id}) + if err != nil || exist == nil { + return errors.New("接口不存在") + } + + if req.PlatformId > 0 && req.PlatformId != exist.PlatformId { + _, err := DatasourcePlatform.GetOne(ctx, &dto.GetDatasourcePlatformReq{Id: req.PlatformId}) + if err != nil { + return errors.New("平台不存在") + } + } + + if req.Code != "" && req.Code != exist.Code { + platformId := req.PlatformId + if platformId == 0 { + platformId = exist.PlatformId + } + interfaces, _, err := dict.ApiInterface.List(ctx, &dto.ListApiInterfaceReq{ + PlatformId: platformId, + Code: req.Code, + }) + if err != nil { + return err + } + if len(interfaces) > 0 { + return errors.New("接口编码在该平台下已存在") + } + } + + _, err = dict.ApiInterface.Update(ctx, req) + return +} + +// UpdateStatus 更新接口状态 +func (s *apiInterfaceService) UpdateStatus(ctx context.Context, req *dto.UpdateApiInterfaceStatusReq) (err error) { + _, err = dict.ApiInterface.UpdateStatus(ctx, req.Id, req.Status.String()) + return +} + +// Delete 删除接口 +func (s *apiInterfaceService) Delete(ctx context.Context, req *dto.DeleteApiInterfaceReq) (err error) { + _, err = dict.ApiInterface.Delete(ctx, req) + return +} + +// GetByIds 根据ID列表获取接口 +func (s *apiInterfaceService) GetByIds(ctx context.Context, ids []int64) (res []entity.ApiInterface, err error) { + return dict.ApiInterface.GetByIds(ctx, ids) +} + +// getStatusName 获取状态名称 +func (s *apiInterfaceService) getStatusName(status consts.PlatformStatus) string { + statusNames := map[consts.PlatformStatus]string{ + consts.PlatformStatusActive: "启用", + consts.PlatformStatusInactive: "停用", + } + if name, ok := statusNames[status]; ok { + return name + } + return string(status) +} diff --git a/update.sql b/update.sql new file mode 100644 index 0000000..6c6548a --- /dev/null +++ b/update.sql @@ -0,0 +1,219 @@ +-- CID数据库表结构 - PostgreSQL 版本 + +-- 应用管理表 +CREATE TABLE IF NOT EXISTS cid_application ( + id BIGSERIAL PRIMARY KEY, + tenant_id VARCHAR(64) DEFAULT '', + name VARCHAR(255) NOT NULL, + app_code VARCHAR(100) NOT NULL, + type VARCHAR(50) NOT NULL, + status VARCHAR(20) NOT NULL DEFAULT 'active', + description TEXT, + access_config JSONB, + limit_config JSONB, + callback_config JSONB, + created_at BIGINT NOT NULL, + updated_at BIGINT NOT NULL, + deleted_at BIGINT DEFAULT 0, + CONSTRAINT uk_cid_application_app_code UNIQUE (app_code, deleted_at) + ); + +-- 应用表索引 +CREATE INDEX IF NOT EXISTS idx_cid_application_tenant ON cid_application(tenant_id); +CREATE INDEX IF NOT EXISTS idx_cid_application_type ON cid_application(type); +CREATE INDEX IF NOT EXISTS idx_cid_application_status ON cid_application(status); +CREATE INDEX IF NOT EXISTS idx_cid_application_name ON cid_application(name); +CREATE INDEX IF NOT EXISTS idx_cid_application_app_code ON cid_application(app_code); + +-- 应用表注释 +COMMENT ON TABLE cid_application IS '应用管理表'; +COMMENT ON COLUMN cid_application.id IS '主键ID'; +COMMENT ON COLUMN cid_application.tenant_id IS '租户ID'; +COMMENT ON COLUMN cid_application.name IS '应用名称'; +COMMENT ON COLUMN cid_application.app_code IS '应用编码(唯一标识)'; +COMMENT ON COLUMN cid_application.type IS '应用类型'; +COMMENT ON COLUMN cid_application.status IS '应用状态:active启用/inactive停用'; +COMMENT ON COLUMN cid_application.description IS '应用描述'; +COMMENT ON COLUMN cid_application.access_config IS '接入配置'; +COMMENT ON COLUMN cid_application.limit_config IS '限流配置'; +COMMENT ON COLUMN cid_application.callback_config IS '回调配置'; +COMMENT ON COLUMN cid_application.created_at IS '创建时间'; +COMMENT ON COLUMN cid_application.updated_at IS '更新时间'; +COMMENT ON COLUMN cid_application.deleted_at IS '软删除时间戳,0表示未删除'; + +-- 平台管理表 +CREATE TABLE IF NOT EXISTS cid_platform ( + id BIGSERIAL PRIMARY KEY, + tenant_id VARCHAR(64) DEFAULT '', + name VARCHAR(255) NOT NULL, + type VARCHAR(50) NOT NULL, + status VARCHAR(20) NOT NULL DEFAULT 'active', + description TEXT, + auth_config JSONB, + limit_config JSONB, + platform_config JSONB, + created_at BIGINT NOT NULL, + updated_at BIGINT NOT NULL, + deleted_at BIGINT DEFAULT 0 + ); + +-- 平台表索引 +CREATE INDEX IF NOT EXISTS idx_cid_platform_tenant ON cid_platform(tenant_id); +CREATE INDEX IF NOT EXISTS idx_cid_platform_type ON cid_platform(type); +CREATE INDEX IF NOT EXISTS idx_cid_platform_status ON cid_platform(status); +CREATE INDEX IF NOT EXISTS idx_cid_platform_name ON cid_platform(name); + +-- 平台表注释 +COMMENT ON TABLE cid_platform IS '平台管理表'; +COMMENT ON COLUMN cid_platform.id IS '主键ID'; +COMMENT ON COLUMN cid_platform.tenant_id IS '租户ID'; +COMMENT ON COLUMN cid_platform.name IS '平台名称'; +COMMENT ON COLUMN cid_platform.type IS '平台类型'; +COMMENT ON COLUMN cid_platform.status IS '平台状态:active启用/inactive停用'; +COMMENT ON COLUMN cid_platform.description IS '平台描述'; +COMMENT ON COLUMN cid_platform.auth_config IS '认证配置'; +COMMENT ON COLUMN cid_platform.limit_config IS '限流配置'; +COMMENT ON COLUMN cid_platform.platform_config IS '平台专用配置'; +COMMENT ON COLUMN cid_platform.created_at IS '创建时间'; +COMMENT ON COLUMN cid_platform.updated_at IS '更新时间'; +COMMENT ON COLUMN cid_platform.deleted_at IS '软删除时间戳,0表示未删除'; + +-- 接口管理表 +CREATE TABLE IF NOT EXISTS cid_api_interface ( + id BIGSERIAL PRIMARY KEY, + tenant_id VARCHAR(64) DEFAULT '', + platform_id BIGINT NOT NULL, + name VARCHAR(255) NOT NULL, + code VARCHAR(100) NOT NULL, + url VARCHAR(500) NOT NULL, + method VARCHAR(10) NOT NULL, + status VARCHAR(20) NOT NULL DEFAULT 'active', + auth_type VARCHAR(50), + request_config JSONB, + response_config JSONB, + limit_config JSONB, + created_at BIGINT NOT NULL, + updated_at BIGINT NOT NULL, + deleted_at BIGINT DEFAULT 0, + CONSTRAINT fk_cid_api_interface_platform FOREIGN KEY (platform_id) REFERENCES cid_platform(id) + ); + +-- 接口表索引 +CREATE INDEX IF NOT EXISTS idx_cid_api_interface_tenant ON cid_api_interface(tenant_id); +CREATE INDEX IF NOT EXISTS idx_cid_api_interface_platform ON cid_api_interface(platform_id); +CREATE INDEX IF NOT EXISTS idx_cid_api_interface_code ON cid_api_interface(code); +CREATE INDEX IF NOT EXISTS idx_cid_api_interface_status ON cid_api_interface(status); +CREATE INDEX IF NOT EXISTS idx_cid_api_interface_name ON cid_api_interface(name); + +-- 接口表注释 +COMMENT ON TABLE cid_api_interface IS '接口管理表'; +COMMENT ON COLUMN cid_api_interface.id IS '主键ID'; +COMMENT ON COLUMN cid_api_interface.tenant_id IS '租户ID'; +COMMENT ON COLUMN cid_api_interface.platform_id IS '所属平台ID'; +COMMENT ON COLUMN cid_api_interface.name IS '接口名称'; +COMMENT ON COLUMN cid_api_interface.code IS '接口编码'; +COMMENT ON COLUMN cid_api_interface.url IS '接口地址'; +COMMENT ON COLUMN cid_api_interface.method IS '请求方法:GET/POST/PUT/DELETE等'; +COMMENT ON COLUMN cid_api_interface.status IS '接口状态:active启用/inactive停用'; +COMMENT ON COLUMN cid_api_interface.auth_type IS '认证类型:oauth2/apikey/basic等'; +COMMENT ON COLUMN cid_api_interface.request_config IS '请求配置'; +COMMENT ON COLUMN cid_api_interface.response_config IS '响应配置'; +COMMENT ON COLUMN cid_api_interface.limit_config IS '接口独立限流配置(可选,覆盖平台配置)'; +COMMENT ON COLUMN cid_api_interface.created_at IS '创建时间'; +COMMENT ON COLUMN cid_api_interface.updated_at IS '更新时间'; +COMMENT ON COLUMN cid_api_interface.deleted_at IS '软删除时间戳,0表示未删除'; + +-- 数据获取日志表 +CREATE TABLE IF NOT EXISTS cid_data_fetch_log ( + id BIGSERIAL PRIMARY KEY, + tenant_id VARCHAR(64) DEFAULT '', + platform_id BIGINT NOT NULL, + interface_id BIGINT NOT NULL, + request_id VARCHAR(100) NOT NULL, + status VARCHAR(20) NOT NULL DEFAULT 'pending', + start_time BIGINT NOT NULL, + end_time BIGINT DEFAULT 0, + duration INT DEFAULT 0, + request_config JSONB, + response_data TEXT, + error_message TEXT, + retry_count INT DEFAULT 0, + created_at BIGINT NOT NULL, + updated_at BIGINT NOT NULL, + deleted_at BIGINT DEFAULT 0, + CONSTRAINT fk_cid_data_fetch_log_platform FOREIGN KEY (platform_id) REFERENCES cid_platform(id), + CONSTRAINT fk_cid_data_fetch_log_interface FOREIGN KEY (interface_id) REFERENCES cid_api_interface(id) + ); + +-- 日志表索引 +CREATE INDEX IF NOT EXISTS idx_cid_data_fetch_log_tenant ON cid_data_fetch_log(tenant_id); +CREATE INDEX IF NOT EXISTS idx_cid_data_fetch_log_platform ON cid_data_fetch_log(platform_id); +CREATE INDEX IF NOT EXISTS idx_cid_data_fetch_log_interface ON cid_data_fetch_log(interface_id); +CREATE INDEX IF NOT EXISTS idx_cid_data_fetch_log_request_id ON cid_data_fetch_log(request_id); +CREATE INDEX IF NOT EXISTS idx_cid_data_fetch_log_status ON cid_data_fetch_log(status); +CREATE INDEX IF NOT EXISTS idx_cid_data_fetch_log_start_time ON cid_data_fetch_log(start_time); + +-- 日志表注释 +COMMENT ON TABLE cid_data_fetch_log IS '数据获取日志表'; +COMMENT ON COLUMN cid_data_fetch_log.id IS '主键ID'; +COMMENT ON COLUMN cid_data_fetch_log.tenant_id IS '租户ID'; +COMMENT ON COLUMN cid_data_fetch_log.platform_id IS '平台ID'; +COMMENT ON COLUMN cid_data_fetch_log.interface_id IS '接口ID'; +COMMENT ON COLUMN cid_data_fetch_log.request_id IS '请求ID'; +COMMENT ON COLUMN cid_data_fetch_log.status IS '执行状态:pending/running/success/failed/rate_limit'; +COMMENT ON COLUMN cid_data_fetch_log.start_time IS '开始时间(时间戳)'; +COMMENT ON COLUMN cid_data_fetch_log.end_time IS '结束时间(时间戳)'; +COMMENT ON COLUMN cid_data_fetch_log.duration IS '执行时长(毫秒)'; +COMMENT ON COLUMN cid_data_fetch_log.request_config IS '请求配置参数'; +COMMENT ON COLUMN cid_data_fetch_log.response_data IS '响应数据(JSON)'; +COMMENT ON COLUMN cid_data_fetch_log.error_message IS '错误信息'; +COMMENT ON COLUMN cid_data_fetch_log.retry_count IS '重试次数'; +COMMENT ON COLUMN cid_data_fetch_log.created_at IS '创建时间'; +COMMENT ON COLUMN cid_data_fetch_log.updated_at IS '更新时间'; +COMMENT ON COLUMN cid_data_fetch_log.deleted_at IS '软删除时间戳,0表示未删除'; + +-- 数据映射表 +CREATE TABLE IF NOT EXISTS cid_data_mapping ( + id BIGSERIAL PRIMARY KEY, + tenant_id VARCHAR(64) DEFAULT '', + platform_id BIGINT NOT NULL, + interface_id BIGINT NOT NULL, + source_field VARCHAR(255) NOT NULL, + target_field VARCHAR(255) NOT NULL, + field_type VARCHAR(50) NOT NULL, + default_value VARCHAR(500), + transform_rule JSONB, + priority INT DEFAULT 0, + status VARCHAR(20) NOT NULL DEFAULT 'active', + created_at BIGINT NOT NULL, + updated_at BIGINT NOT NULL, + deleted_at BIGINT DEFAULT 0, + CONSTRAINT fk_cid_data_mapping_platform FOREIGN KEY (platform_id) REFERENCES cid_platform(id), + CONSTRAINT fk_cid_data_mapping_interface FOREIGN KEY (interface_id) REFERENCES cid_api_interface(id), + CONSTRAINT uk_cid_data_mapping_interface_target UNIQUE (interface_id, target_field, deleted_at) + ); + +-- 映射表索引 +CREATE INDEX IF NOT EXISTS idx_cid_data_mapping_tenant ON cid_data_mapping(tenant_id); +CREATE INDEX IF NOT EXISTS idx_cid_data_mapping_platform ON cid_data_mapping(platform_id); +CREATE INDEX IF NOT EXISTS idx_cid_data_mapping_interface ON cid_data_mapping(interface_id); +CREATE INDEX IF NOT EXISTS idx_cid_data_mapping_source_field ON cid_data_mapping(source_field); +CREATE INDEX IF NOT EXISTS idx_cid_data_mapping_status ON cid_data_mapping(status); +CREATE INDEX IF NOT EXISTS idx_cid_data_mapping_priority ON cid_data_mapping(priority); + +-- 映射表注释 +COMMENT ON TABLE cid_data_mapping IS '数据映射表'; +COMMENT ON COLUMN cid_data_mapping.id IS '主键ID'; +COMMENT ON COLUMN cid_data_mapping.tenant_id IS '租户ID'; +COMMENT ON COLUMN cid_data_mapping.platform_id IS '平台ID'; +COMMENT ON COLUMN cid_data_mapping.interface_id IS '接口ID'; +COMMENT ON COLUMN cid_data_mapping.source_field IS '源字段(接口返回字段)'; +COMMENT ON COLUMN cid_data_mapping.target_field IS '目标字段(本地表字段)'; +COMMENT ON COLUMN cid_data_mapping.field_type IS '字段类型:string/int/float/bool/array/object'; +COMMENT ON COLUMN cid_data_mapping.default_value IS '默认值'; +COMMENT ON COLUMN cid_data_mapping.transform_rule IS '转换规则'; +COMMENT ON COLUMN cid_data_mapping.priority IS '优先级(数字越小优先级越高)'; +COMMENT ON COLUMN cid_data_mapping.status IS '状态:active启用/inactive停用'; +COMMENT ON COLUMN cid_data_mapping.created_at IS '创建时间'; +COMMENT ON COLUMN cid_data_mapping.updated_at IS '更新时间'; +COMMENT ON COLUMN cid_data_mapping.deleted_at IS '软删除时间戳,0表示未删除'; diff --git a/utils/time_utils.go b/utils/time_utils.go new file mode 100644 index 0000000..11f6d90 --- /dev/null +++ b/utils/time_utils.go @@ -0,0 +1,39 @@ +package utils + +import "time" + +// TimeToMilliseconds 时间转毫秒时间戳 +func TimeToMilliseconds(t time.Time) int64 { + return t.UnixNano() / 1e6 +} + +// DateToMilliseconds 日期转毫秒时间戳(00:00:00) +func DateToMilliseconds(year, month, day int) int64 { + t := time.Date(year, time.Month(month), day, 0, 0, 0, 0, time.Local) + return TimeToMilliseconds(t) +} + +// TodayMilliseconds 获取今天的时间戳范围 +func TodayMilliseconds() (int64, int64) { + now := time.Now() + start := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()) + end := start.AddDate(0, 0, 1).Add(-time.Second) + return TimeToMilliseconds(start), TimeToMilliseconds(end) +} + +// YesterdayMilliseconds 获取昨天的时间戳范围 +func YesterdayMilliseconds() (int64, int64) { + now := time.Now() + yesterday := now.AddDate(0, 0, -1) + start := time.Date(yesterday.Year(), yesterday.Month(), yesterday.Day(), 0, 0, 0, 0, yesterday.Location()) + end := start.AddDate(0, 0, 1).Add(-time.Second) + return TimeToMilliseconds(start), TimeToMilliseconds(end) +} + +// Last7DaysMilliseconds 获取过去7天的时间戳范围 +func Last7DaysMilliseconds() (int64, int64) { + now := time.Now() + end := time.Date(now.Year(), now.Month(), now.Day(), 23, 59, 59, 0, now.Location()) + start := end.AddDate(0, 0, -7) + return TimeToMilliseconds(start), TimeToMilliseconds(end) +}