Files
data-engine/common/report/model/model.go
T
2026-07-02 10:23:07 +08:00

474 lines
27 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package model
import (
"time"
"gitea.redpowerfuture.com/red-future/common/beans"
)
// ============================================================
// 实体定义
// ============================================================
// BusinessConfig 业务配置
type BusinessConfig struct {
beans.SQLBaseDO `orm:",inherit"`
BusinessCode string `orm:"business_code" json:"businessCode" dc:"业务编码" eg:"KUAISHOU"`
BusinessName string `orm:"business_name" json:"businessName" dc:"业务名称" eg:"快手电商"`
Description string `orm:"description" json:"description" dc:"描述" eg:"快手电商店铺每日统计报表"`
Status string `orm:"status" json:"status" dc:"status" eg:"ACTIVE"`
Config map[string]interface{} `orm:"config" json:"config" dc:"扩展配置"`
}
// ReportConfig 报表配置
type ReportConfig struct {
beans.SQLBaseDO `orm:",inherit"`
BusinessCode string `orm:"business_code" json:"businessCode" dc:"业务编码" eg:"KUAISHOU"`
ReportCode string `orm:"report_code" json:"reportCode" dc:"报表编码" eg:"shop_daily"`
ReportName string `orm:"report_name" json:"reportName" dc:"报表名称" eg:"店铺日报"`
Description string `orm:"description" json:"description" dc:"描述" eg:"快手电商店铺每日统计报表"`
Status string `orm:"status" json:"status" dc:"状态 ACTIVE/INACTIVE" eg:"ACTIVE"`
StatTableName string `orm:"stat_table_name" json:"statTableName" dc:"统计宽表名" eg:"stat_kuaishou_shop_daily"`
StatTableComment string `orm:"stat_table_comment" json:"statTableComment" dc:"统计宽表注释" eg:"快手电商-店铺日报"`
DateField string `orm:"date_field" json:"dateField" dc:"日期字段名" eg:"stat_date"`
PrimaryKeys []string `orm:"primary_keys" json:"primaryKeys" dc:"主键字段列表"`
ConflictKeys []string `orm:"conflict_keys" json:"conflictKeys" dc:"冲突键(唯一索引)"`
Config map[string]interface{} `orm:"config" json:"config" dc:"扩展配置"`
ExtractConfigIDs string `orm:"-" json:"extractConfigIds" dc:"抽取配置ID列表,逗号分隔" eg:"1,2,3"`
Fields []FieldConfig `orm:"-" json:"fields,omitempty" dc:"字段配置列表(查询时返回)"`
}
// FieldConfig 字段配置
type FieldConfig struct {
beans.SQLBaseDO `orm:",inherit"`
BusinessCode string `orm:"business_code" json:"businessCode" dc:"业务编码" eg:"KUAISHOU"`
ReportCode string `orm:"report_code" json:"reportCode" dc:"reportCode" eg:"shop_daily"`
FieldCode string `orm:"field_code" json:"fieldCode" dc:"字段编码" eg:"order_amount"`
FieldName string `orm:"field_name" json:"fieldName" dc:"字段名称" eg:"订单金额"`
FieldType string `orm:"field_type" json:"fieldType" dc:"字段类型 STRING/INT/FLOAT/DATE/DATETIME/JSONB" eg:"FLOAT"`
DataType string `orm:"data_type" json:"dataType" dc:"数据存储类型" eg:"STRING"`
FieldRole string `orm:"field_role" json:"fieldRole" dc:"字段角色 DIMENSION(维度)/INDICATOR(指标)/FILTER(筛选)/FILTER_ONLY(仅筛选)" eg:"DIMENSION"`
IsAggregatable bool `orm:"is_aggregatable" json:"isAggregatable" dc:"是否可聚合" eg:"true"`
IsFilterable bool `orm:"is_filterable" json:"isFilterable" dc:"是否可筛选" eg:"true"`
IsQueryable bool `orm:"is_queryable" json:"isQueryable" dc:"是否可查询" eg:"true"`
IsSortable bool `orm:"is_sortable" json:"isSortable" dc:"是否可排序" eg:"true"`
DefaultAggregate string `orm:"default_aggregate" json:"defaultAggregate" dc:"默认聚合方式 SUM/COUNT/AVG/MAX/MIN" eg:"SUM"`
ValidAggregates []string `orm:"valid_aggregates" json:"validAggregates" dc:"可选聚合列表"`
FilterOperators []string `orm:"filter_operators" json:"filterOperators" dc:"可选操作符列表 =/!=/>/</>=/<=/IN/LIKE/BETWEEN"`
Expression string `orm:"expression" json:"expression" dc:"表达式(衍生字段)" eg:"order_amount - refund_amount"`
ExpressionType string `orm:"expression_type" json:"expressionType" dc:"表达式类型 DIRECT/CALCULATED" eg:"DIRECT"`
FormatPattern string `orm:"format_pattern" json:"formatPattern" dc:"格式化模板" eg:"#,##0.00"`
Unit string `orm:"unit" json:"unit" dc:"单位"`
DictCode string `orm:"dict_code" json:"dictCode" dc:"字典编码" eg:"dict_order_type"`
SortOrder int `orm:"sort_order" json:"sortOrder" dc:"排序号" eg:"1"`
GroupName string `orm:"group_name" json:"groupName" dc:"分组名称" eg:"交易指标"`
Status string `orm:"status" json:"status" dc:"status" eg:"ACTIVE"`
}
// ExtractConfig 抽取配置
type ExtractConfig struct {
beans.SQLBaseDO `orm:",inherit"`
BusinessCode string `orm:"business_code" json:"businessCode" dc:"业务编码" eg:"KUAISHOU"`
ReportCode string `orm:"report_code" json:"reportCode" dc:"reportCode" eg:"shop_daily"`
ExtractCode string `orm:"extract_code" json:"extractCode" dc:"抽取编码" eg:"kuaishou_order_extract"`
ExtractName string `orm:"extract_name" json:"extractName" dc:"抽取名称" eg:"订单抽取"`
SourceTableName string `orm:"source_table_name" json:"sourceTableName" dc:"源表名" eg:"ods_kuaishou_order"`
SourceTableAlias string `orm:"source_table_alias" json:"sourceTableAlias" dc:"源表别名" eg:"o"`
TargetTableName string `orm:"target_table_name" json:"targetTableName" dc:"目标表名" eg:"stat_kuaishou_shop_daily"`
IsEnabled bool `orm:"is_enabled" json:"isEnabled" dc:"是否启用" eg:"true"`
ExtractType string `orm:"extract_type" json:"extractType" dc:"抽取类型 FULL/INCREMENTAL" eg:"INCREMENTAL"`
ExtractMode string `orm:"extract_mode" json:"extractMode" dc:"抽取模式 DIRECT(逐行)/AGGREGATE(聚合)" eg:"DIRECT"`
ExtractKeyField string `orm:"extract_key_field" json:"extractKeyField" dc:"抽取关键字段(增量依据)" eg:"updated_at"`
ExtractKeyFormat string `orm:"extract_key_format" json:"extractKeyFormat" dc:"关键字段格式" eg:"yyyy-MM-dd HH:mm:ss"`
GroupByFields []string `orm:"group_by_fields" json:"groupByFields" dc:"GROUP BY 字段列表"`
FilterExpression string `orm:"filter_expression" json:"filterExpression" dc:"过滤表达式" eg:"status = 'PAID'"`
JoinConfigs []JoinConfig `orm:"join_configs" json:"joinConfigs" dc:"JOIN配置"`
FieldMappings []FieldMapping `orm:"field_mappings" json:"fieldMappings" dc:"字段映射列表"`
TransformRules []TransformRule `orm:"transform_rules" json:"transformRules" dc:"转换规则列表"`
BatchSize int `orm:"batch_size" json:"batchSize" dc:"批处理大小" eg:"1000"`
Status string `orm:"status" json:"status" dc:"status" eg:"ACTIVE"`
}
// ExtractLog 抽取记录(不含 Creator/Updater/DeletedAt,表结构不同)
type ExtractLog struct {
ID int64 `orm:"id" json:"id" dc:"主键ID" eg:"1"`
TenantId uint64 `orm:"tenant_id" json:"tenantId" dc:"租户ID" eg:"1"`
BusinessCode string `orm:"business_code" json:"businessCode" dc:"业务编码" eg:"KUAISHOU"`
ReportCode string `orm:"report_code" json:"reportCode" dc:"reportCode" eg:"shop_daily"`
ExtractCode string `orm:"extract_code" json:"extractCode" dc:"抽取编码" eg:"kuaishou_order_extract"`
StatDate string `orm:"stat_date" json:"statDate" dc:"统计日期" eg:"2026-06-01"`
ExtractType string `orm:"extract_type" json:"extractType" dc:"抽取类型 FULL/INCREMENTAL" eg:"INCREMENTAL"`
Status string `orm:"status" json:"status" dc:"status" eg:"ACTIVE"`
TotalCount int `orm:"total_count" json:"totalCount" dc:"总记录数" eg:"100"`
SuccessCount int `orm:"success_count" json:"successCount" dc:"成功记录数" eg:"98"`
FailCount int `orm:"fail_count" json:"failCount" dc:"失败记录数" eg:"2"`
StartTime *time.Time `orm:"start_time" json:"startTime" dc:"开始时间"`
EndTime *time.Time `orm:"end_time" json:"endTime" dc:"结束时间"`
ErrorMessage string `orm:"error_message" json:"errorMessage" dc:"错误信息"`
Executor string `orm:"executor" json:"executor" dc:"执行人" eg:"system"`
CreatedAt *time.Time `orm:"created_at" json:"createdAt" dc:"创建时间"`
UpdatedAt *time.Time `orm:"updated_at" json:"updatedAt" dc:"更新时间"`
}
// ============================================================
// 辅助结构
// ============================================================
// JoinConfig 关联配置
type JoinConfig struct {
JoinTable string `json:"joinTable" dc:"关联表名" eg:"ods_kuaishou_shop"`
JoinAlias string `json:"joinAlias" dc:"关联表别名" eg:"s"`
JoinType string `json:"joinType" dc:"LEFT/RIGHT/INNER" eg:"LEFT"`
JoinCondition string `json:"joinCondition" dc:"关联条件" eg:"o.shop_id = s.shop_id"`
FieldMappings []FieldMapping `json:"fieldMappings" dc:"字段映射列表"`
}
// FieldMapping 字段映射
type FieldMapping struct {
SourceField string `json:"sourceField" dc:"源字段"`
TargetField string `json:"targetField" dc:"目标字段"`
FieldType string `json:"fieldType" dc:"字段类型 STRING/INT/FLOAT/DATE/DATETIME/JSONB" eg:"FLOAT"`
AggregateFunction string `json:"aggregateFunction" dc:"聚合函数 SUM/COUNT/AVG/MAX/MIN"`
DefaultValue interface{} `json:"defaultValue" dc:"默认值"`
TransformRule *TransformRule `json:"transformRule,omitempty" dc:"transformRule"`
}
// TransformRule 转换规则
type TransformRule struct {
RuleCode string `json:"ruleCode" dc:"规则编码" eg:"AMOUNT_CONVERT"`
RuleType string `json:"ruleType" dc:"DIRECT/MAPPING/FORMAT/CALCULATE" eg:"FORMAT"`
Expression string `json:"expression" dc:"表达式(衍生字段)" eg:"order_amount - refund_amount"`
Format string `json:"format" dc:"format" eg:"%Y-%m-%d"`
Mapping map[string]interface{} `json:"mapping" dc:"映射表(MAPPING类型时使用)"`
}
// ============================================================
// 前端请求/响应结构体
// ============================================================
// UserSelectQueryReq 用户选择查询请求
type UserSelectQueryReq struct {
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码" eg:"KUAISHOU"`
ReportCode string `json:"reportCode" v:"required" dc:"报表编码" eg:"shop_daily"`
Dimensions []string `json:"dimensions" dc:"统计维度列表,如 shop_id/anchor_id/date"`
Indicators []IndicatorSelect `json:"indicators" dc:"统计指标列表(含聚合方式)"`
Filters []FilterCondition `json:"filters" dc:"筛选条件列表"`
TimeRange *TimeRange `json:"timeRange" dc:"时间范围"`
TimeGroup string `json:"timeGroup" dc:"时间分组: day/week/month/quarter" eg:"day"`
OrderBy []OrderCondition `json:"orderBy" dc:"排序条件"`
Page int `json:"page" dc:"页码" d:"1" eg:"1"`
PageSize int `json:"pageSize" dc:"每页条数" d:"20" eg:"20"`
}
// IndicatorSelect 指标选择
type IndicatorSelect struct {
FieldCode string `json:"fieldCode" dc:"字段编码" eg:"order_amount"`
Aggregate string `json:"aggregate" dc:"聚合方式: SUM/COUNT/AVG/MAX/MIN" eg:"SUM"`
Alias string `json:"alias" dc:"别名" eg:"总订单金额"`
}
// FilterCondition 筛选条件
type FilterCondition struct {
FieldCode string `json:"fieldCode" dc:"字段编码" eg:"order_amount"`
Operator string `json:"operator" dc:"操作符: =/!=/>/</>=/<=/IN/LIKE/BETWEEN" eg:"="`
Value interface{} `json:"value" dc:"值"`
Value2 interface{} `json:"value2" dc:"第二个值(BETWEEN时使用)"`
}
// TimeRange 时间范围
type TimeRange struct {
StartDate string `json:"startDate" dc:"开始日期 yyyy-MM-dd" eg:"2026-06-01"`
EndDate string `json:"endDate" dc:"结束日期 yyyy-MM-dd" eg:"2026-06-30"`
}
// OrderCondition 排序条件
type OrderCondition struct {
FieldCode string `json:"fieldCode" dc:"字段编码" eg:"order_amount"`
Direction string `json:"direction" dc:"排序方向: ASC/DESC" eg:"DESC"`
}
// UserSelectQueryResp 用户选择查询响应
type UserSelectQueryResp struct {
List []map[string]interface{} `json:"list" dc:"数据列表"`
Total int64 `json:"total" dc:"总数" eg:"100"`
Page int `json:"page" dc:"当前页" eg:"1"`
PageSize int `json:"pageSize" dc:"每页条数" eg:"20"`
TotalPages int `json:"totalPages" dc:"总页数" eg:"5"`
Sql string `json:"sql,omitempty" dc:"执行的SQL(调试用)" eg:"SELECT 1"`
ExecTimeMs int64 `json:"execTimeMs" dc:"执行耗时(毫秒)" eg:"1234"`
}
// ExtractDailyDataReq 按天抽取数据请求
type ExtractDailyDataReq struct {
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码" eg:"KUAISHOU"`
ReportCode string `json:"reportCode" v:"required" dc:"报表编码" eg:"shop_daily"`
StatDate string `json:"statDate" v:"required" dc:"统计日期 yyyy-MM-dd" eg:"2026-06-01"`
Executor string `json:"executor" dc:"执行人" eg:"system"`
}
// ExtractDailyDataResp 按天抽取数据响应
type ExtractDailyDataResp struct {
Success bool `json:"success" dc:"是否成功" eg:"true"`
TotalCount int `json:"totalCount" dc:"总记录数" eg:"100"`
SuccessCount int `json:"successCount" dc:"成功记录数" eg:"98"`
FailCount int `json:"failCount" dc:"失败记录数" eg:"2"`
ExecTimeMs int64 `json:"execTimeMs" dc:"执行耗时(毫秒)" eg:"1234"`
ErrorMsg string `json:"errorMsg" dc:"错误信息"`
}
// AutoCreateStatTableReq 自动创建统计宽表请求
type AutoCreateStatTableReq struct {
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码" eg:"KUAISHOU"`
ReportCode string `json:"reportCode" v:"required" dc:"报表编码" eg:"shop_daily"`
Creator string `json:"creator" dc:"创建人" eg:"admin"`
}
// AutoCreateStatTableResp 自动创建统计宽表响应
type AutoCreateStatTableResp struct {
Success bool `json:"success" dc:"是否成功" eg:"true"`
TableName string `json:"tableName" dc:"创建的表名" eg:"stat_kuaishou_shop_daily"`
ColumnCount int `json:"columnCount" dc:"字段数量" eg:"15"`
ExecTimeMs int64 `json:"execTimeMs" dc:"执行耗时(毫秒)" eg:"1234"`
}
// GetReportFieldsResp 获取报表可用字段响应
type GetReportFieldsResp struct {
BusinessCode string `json:"businessCode" dc:"业务编码" eg:"KUAISHOU"`
ReportCode string `json:"reportCode" dc:"报表编码" eg:"shop_daily"`
Dimensions []FieldConfig `json:"dimensions" dc:"维度字段列表"`
Indicators []FieldConfig `json:"indicators" dc:"指标字段列表"`
Filters []FieldConfig `json:"filters" dc:"筛选字段列表"`
}
// BackfillReq 批量回填请求
type BackfillReq struct {
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码" eg:"KUAISHOU"`
ReportCode string `json:"reportCode" v:"required" dc:"报表编码" eg:"shop_daily"`
StartDate string `json:"startDate" v:"required" dc:"开始日期 yyyy-MM-dd" eg:"2026-06-01"`
EndDate string `json:"endDate" v:"required" dc:"结束日期 yyyy-MM-dd" eg:"2026-06-30"`
Executor string `json:"executor" dc:"执行人" eg:"admin"`
}
// BackfillResp 批量回填响应
type BackfillResp struct {
Success bool `json:"success" dc:"是否全部成功" eg:"true"`
TotalDays int `json:"totalDays" dc:"总天数" eg:"30"`
SuccessDays int `json:"successDays" dc:"成功天数" eg:"28"`
FailDays int `json:"failDays" dc:"失败天数" eg:"2"`
ExecTimeMs int64 `json:"execTimeMs" dc:"总耗时(毫秒)" eg:"5678"`
ErrorMsg string `json:"errorMsg" dc:"错误信息"`
}
// ============================================================
// 配置 CRUD 请求/响应
// ============================================================
// SaveBusinessReq 保存业务配置请求(新增/修改合一)
type SaveBusinessReq struct {
ID *int64 `json:"id" dc:"有值为更新,无值为新增" eg:"1"`
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码" eg:"KUAISHOU"`
BusinessName string `json:"businessName" v:"required" dc:"业务名称" eg:"快手电商"`
Description string `json:"description" dc:"描述" eg:"快手电商店铺每日统计报表"`
Status string `json:"status" dc:"状态 ACTIVE/INACTIVE" d:"ACTIVE" eg:"ACTIVE"`
Config map[string]interface{} `json:"config" dc:"扩展配置"`
Operator string `json:"operator" dc:"操作人" eg:"="`
}
// SaveReportReq 保存报表配置请求
type SaveReportReq struct {
ID *int64 `json:"id" dc:"主键ID" eg:"1"`
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码" eg:"KUAISHOU"`
ReportCode string `json:"reportCode" v:"required" dc:"报表编码" eg:"shop_daily"`
ReportName string `json:"reportName" v:"required" dc:"报表名称" eg:"店铺日报"`
Description string `json:"description" dc:"描述" eg:"快手电商店铺每日统计报表"`
Status string `json:"status" dc:"状态" d:"ACTIVE" eg:"ACTIVE"`
StatTableName string `json:"statTableName" v:"required" dc:"统计宽表名"`
StatTableComment string `json:"statTableComment" dc:"统计宽表注释"`
DateField string `json:"dateField" dc:"日期字段" d:"stat_date" eg:"stat_date"`
PrimaryKeys []string `json:"primaryKeys" dc:"主键字段"`
ConflictKeys []string `json:"conflictKeys" dc:"冲突键(唯一索引)"`
Config map[string]interface{} `json:"config" dc:"扩展配置"`
Operator string `json:"operator" dc:"操作人" eg:"="`
}
// SaveFieldReq 保存字段配置请求
type SaveFieldReq struct {
ID *int64 `json:"id" dc:"主键ID" eg:"1"`
BusinessCode string `json:"businessCode" dc:"业务编码" eg:"KUAISHOU"`
ReportCode string `json:"reportCode" dc:"报表编码" eg:"shop_daily"`
FieldCode string `json:"fieldCode" v:"required" dc:"字段编码" eg:"order_amount"`
FieldName string `json:"fieldName" v:"required" dc:"字段名称" eg:"订单金额"`
FieldType string `json:"fieldType" v:"required" dc:"字段类型 STRING/INT/FLOAT/DATE/DATETIME/JSONB" eg:"FLOAT"`
DataType string `json:"dataType" dc:"数据存储类型" d:"STRING" eg:"STRING"`
FieldRole string `json:"fieldRole" v:"required" dc:"字段角色 DIMENSION/INDICATOR/FILTER/FILTER_ONLY" eg:"DIMENSION"`
IsAggregatable bool `json:"isAggregatable" dc:"是否可聚合" eg:"true"`
IsFilterable bool `json:"isFilterable" dc:"是否可筛选" d:"true" eg:"true"`
IsQueryable bool `json:"isQueryable" dc:"是否可查询" d:"true" eg:"true"`
IsSortable bool `json:"isSortable" dc:"是否可排序" d:"true" eg:"true"`
DefaultAggregate string `json:"defaultAggregate" dc:"默认聚合方式" eg:"SUM"`
ValidAggregates []string `json:"validAggregates" dc:"可选聚合列表"`
FilterOperators []string `json:"filterOperators" dc:"可选操作符列表"`
Expression string `json:"expression" dc:"表达式(衍生字段)" eg:"order_amount - refund_amount"`
ExpressionType string `json:"expressionType" dc:"表达式类型 DIRECT/CALCULATED" eg:"DIRECT"`
FormatPattern string `json:"formatPattern" dc:"格式化模板" eg:"#,##0.00"`
Unit string `json:"unit" dc:"单位" eg:"元"`
DictCode string `json:"dictCode" dc:"字典编码" eg:"dict_order_type"`
SortOrder int `json:"sortOrder" dc:"排序" eg:"1"`
GroupName string `json:"groupName" dc:"分组名称" eg:"交易指标"`
Status string `json:"status" dc:"状态" d:"ACTIVE" eg:"ACTIVE"`
Operator string `json:"operator" dc:"操作人" eg:"admin"`
}
// SaveReportWithFieldsReq 保存报表及字段配置请求(字段全量替换)
type SaveReportWithFieldsReq struct {
ID *int64 `json:"id" dc:"主键ID(更新时必填,新建为空)"`
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码" eg:"KUAISHOU"`
ReportCode string `json:"reportCode" v:"required" dc:"报表编码" eg:"shop_daily"`
ReportName string `json:"reportName" v:"required" dc:"报表名称" eg:"店铺日报"`
Description string `json:"description" dc:"描述" eg:"快手电商店铺每日统计报表"`
Status string `json:"status" dc:"状态" d:"ACTIVE" eg:"ACTIVE"`
StatTableName string `json:"statTableName" v:"required" dc:"统计宽表名" eg:"stat_kuaishou_shop_daily"`
StatTableComment string `json:"statTableComment" dc:"统计宽表注释" eg:"快手电商-店铺日报"`
DateField string `json:"dateField" dc:"日期字段" d:"stat_date" eg:"stat_date"`
PrimaryKeys []string `json:"primaryKeys" dc:"主键字段"`
ConflictKeys []string `json:"conflictKeys" dc:"冲突键(唯一索引)"`
Config map[string]interface{} `json:"config" dc:"扩展配置"`
Fields []SaveFieldReq `json:"fields" dc:"字段配置列表(全量替换,不在列表中的字段将被删除)"`
}
// SaveExtractConfigReq 保存抽取配置请求
type SaveExtractConfigReq struct {
ID *int64 `json:"id" dc:"主键ID" eg:"1"`
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码" eg:"KUAISHOU"`
ReportCode string `json:"reportCode" v:"required" dc:"报表编码" eg:"shop_daily"`
ExtractCode string `json:"extractCode" v:"required" dc:"抽取编码" eg:"kuaishou_order_extract"`
ExtractName string `json:"extractName" v:"required" dc:"抽取名称" eg:"订单抽取"`
SourceTableName string `json:"sourceTableName" v:"required" dc:"源表名" eg:"ods_kuaishou_order"`
SourceTableAlias string `json:"sourceTableAlias" dc:"源表别名" eg:"o"`
TargetTableName string `json:"targetTableName" v:"required" dc:"目标表名" eg:"stat_kuaishou_shop_daily"`
IsEnabled bool `json:"isEnabled" dc:"是否启用" d:"true" eg:"true"`
ExtractType string `json:"extractType" dc:"抽取类型 FULL/INCREMENTAL" d:"INCREMENTAL" eg:"INCREMENTAL"`
ExtractMode string `json:"extractMode" dc:"抽取模式 DIRECT/AGGREGATE" d:"DIRECT" eg:"DIRECT"`
ExtractKeyField string `json:"extractKeyField" dc:"抽取关键字段(增量依据)" eg:"updated_at"`
ExtractKeyFormat string `json:"extractKeyFormat" dc:"关键字段格式" eg:"yyyy-MM-dd HH:mm:ss"`
GroupByFields []string `json:"groupByFields" dc:"GROUP BY 字段列表"`
FilterExpression string `json:"filterExpression" dc:"过滤表达式" eg:"status = 'PAID'"`
JoinConfigs []JoinConfig `json:"joinConfigs" dc:"JOIN配置"`
FieldMappings []FieldMapping `json:"fieldMappings" dc:"字段映射列表"`
TransformRules []TransformRule `json:"transformRules" dc:"转换规则列表"`
BatchSize int `json:"batchSize" dc:"批处理大小" d:"1000" eg:"1000"`
Status string `json:"status" dc:"状态" d:"ACTIVE" eg:"ACTIVE"`
Operator string `json:"operator" dc:"操作人" eg:"="`
}
// PageReq 分页请求参数
type PageReq struct {
PageNum int `json:"pageNum" d:"1" dc:"页码"`
PageSize int `json:"pageSize" d:"20" dc:"每页条数"`
}
// PageRes 分页响应
type PageRes struct {
Total int `json:"total" dc:"总数"`
Page int `json:"page" dc:"当前页"`
PageSize int `json:"pageSize" dc:"每页条数"`
TotalPages int `json:"totalPages" dc:"总页数"`
}
// IdReq 通用 ID 请求
type IdReq struct {
ID int64 `json:"id" v:"required" dc:"主键ID" eg:"1"`
}
// SaveResult 写操作通用返回
type SaveResult struct {
Success bool `json:"success" dc:"是否成功" eg:"true"`
ID int64 `json:"id" dc:"主键ID" eg:"1"`
Message string `json:"message" dc:"结果消息" eg:"操作成功"`
}
// DeleteResult 删除结果
type DeleteResult struct {
Success bool `json:"success" dc:"是否成功" eg:"true"`
Message string `json:"message" dc:"结果消息" eg:"操作成功"`
}
// GetExtractConfigsReq 获取抽取配置列表请求
type GetExtractConfigsReq struct {
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码" eg:"KUAISHOU"`
ReportCode string `json:"reportCode" v:"required" dc:"报表编码" eg:"shop_daily"`
}
// ============================================================
// 常量定义
// ============================================================
const (
// 状态
StatusActive = "ACTIVE"
StatusInactive = "INACTIVE"
// 字段角色
RoleDimension = "DIMENSION"
RoleIndicator = "INDICATOR"
RoleFilter = "FILTER"
RoleFilterOnly = "FILTER_ONLY"
// 字段类型
FieldTypeString = "STRING"
FieldTypeInt = "INT"
FieldTypeFloat = "FLOAT"
FieldTypeDate = "DATE"
FieldTypeDatetime = "DATETIME"
FieldTypeJsonb = "JSONB"
// 聚合方式
AggregateSum = "SUM"
AggregateCount = "COUNT"
AggregateAvg = "AVG"
AggregateMax = "MAX"
AggregateMin = "MIN"
// 操作符
OperatorEq = "="
OperatorNe = "!="
OperatorGt = ">"
OperatorLt = "<"
OperatorGe = ">="
OperatorLe = "<="
OperatorIn = "IN"
OperatorLike = "LIKE"
OperatorBetween = "BETWEEN"
// 抽取类型
ExtractTypeFull = "FULL"
ExtractTypeIncremental = "INCREMENTAL"
// 抽取模式
ExtractModeDirect = "DIRECT" // 逐行抽取(默认,源表每行 → 宽表一行)
ExtractModeAggregate = "AGGREGATE" // 聚合抽取(按 GROUP BY 聚合,SUM/COUNT/AVG
// 抽取状态
ExtractStatusRunning = "RUNNING"
ExtractStatusSuccess = "SUCCESS"
ExtractStatusFailed = "FAILED"
)
// FieldTypeToPG 字段类型转PG列类型定义
func FieldTypeToPG(fieldType string) string {
switch fieldType {
case FieldTypeInt:
return "NUMERIC(20,0) DEFAULT 0"
case FieldTypeFloat:
return "NUMERIC(20,4) DEFAULT 0"
case FieldTypeDate:
return "VARCHAR(16) DEFAULT ''"
case FieldTypeDatetime:
return "TIMESTAMP WITH TIME ZONE"
case FieldTypeJsonb:
return "JSONB DEFAULT '{}'"
default:
return "VARCHAR(256) DEFAULT ''"
}
}