425 lines
20 KiB
Go
425 lines
20 KiB
Go
package model
|
||
|
||
import (
|
||
"time"
|
||
)
|
||
|
||
// ============================================================
|
||
// 实体定义
|
||
// ============================================================
|
||
|
||
// BusinessConfig 业务配置
|
||
type BusinessConfig struct {
|
||
ID int64 `orm:"id" json:"id"`
|
||
TenantId uint64 `orm:"tenant_id" json:"tenant_id"`
|
||
BusinessCode string `orm:"business_code" json:"businessCode"`
|
||
BusinessName string `orm:"business_name" json:"businessName"`
|
||
Description string `orm:"description" json:"description"`
|
||
Status string `orm:"status" json:"status"`
|
||
Config map[string]interface{} `orm:"config" json:"config"`
|
||
Creator string `orm:"creator" json:"creator"`
|
||
CreatedAt *time.Time `orm:"created_at" json:"createdAt"`
|
||
Updater string `orm:"updater" json:"updater"`
|
||
UpdatedAt *time.Time `orm:"updated_at" json:"updatedAt"`
|
||
DeletedAt *time.Time `orm:"deleted_at" json:"deletedAt"`
|
||
}
|
||
|
||
// ReportConfig 报表配置
|
||
type ReportConfig struct {
|
||
ID int64 `orm:"id" json:"id"`
|
||
TenantId uint64 `orm:"tenant_id" json:"tenant_id"`
|
||
BusinessCode string `orm:"business_code" json:"businessCode"`
|
||
ReportCode string `orm:"report_code" json:"reportCode"`
|
||
ReportName string `orm:"report_name" json:"reportName"`
|
||
Description string `orm:"description" json:"description"`
|
||
Status string `orm:"status" json:"status"`
|
||
StatTableName string `orm:"stat_table_name" json:"statTableName"`
|
||
StatTableComment string `orm:"stat_table_comment" json:"statTableComment"`
|
||
DateField string `orm:"date_field" json:"dateField"`
|
||
PrimaryKeys []string `orm:"primary_keys" json:"primaryKeys"`
|
||
ConflictKeys []string `orm:"conflict_keys" json:"conflictKeys"`
|
||
Config map[string]interface{} `orm:"config" json:"config"`
|
||
Creator string `orm:"creator" json:"creator"`
|
||
CreatedAt *time.Time `orm:"created_at" json:"createdAt"`
|
||
Updater string `orm:"updater" json:"updater"`
|
||
UpdatedAt *time.Time `orm:"updated_at" json:"updatedAt"`
|
||
DeletedAt *time.Time `orm:"deleted_at" json:"deletedAt"`
|
||
}
|
||
|
||
// FieldConfig 字段配置
|
||
type FieldConfig struct {
|
||
ID int64 `orm:"id" json:"id"`
|
||
TenantId uint64 `orm:"tenant_id" json:"tenant_id"`
|
||
BusinessCode string `orm:"business_code" json:"businessCode"`
|
||
ReportCode string `orm:"report_code" json:"reportCode"`
|
||
FieldCode string `orm:"field_code" json:"fieldCode"`
|
||
FieldName string `orm:"field_name" json:"fieldName"`
|
||
FieldType string `orm:"field_type" json:"fieldType"`
|
||
DataType string `orm:"data_type" json:"dataType"`
|
||
FieldRole string `orm:"field_role" json:"fieldRole"`
|
||
IsAggregatable bool `orm:"is_aggregatable" json:"isAggregatable"`
|
||
IsFilterable bool `orm:"is_filterable" json:"isFilterable"`
|
||
IsQueryable bool `orm:"is_queryable" json:"isQueryable"`
|
||
IsSortable bool `orm:"is_sortable" json:"isSortable"`
|
||
DefaultAggregate string `orm:"default_aggregate" json:"defaultAggregate"`
|
||
ValidAggregates []string `orm:"valid_aggregates" json:"validAggregates"`
|
||
FilterOperators []string `orm:"filter_operators" json:"filterOperators"`
|
||
Expression string `orm:"expression" json:"expression"`
|
||
ExpressionType string `orm:"expression_type" json:"expressionType"`
|
||
FormatPattern string `orm:"format_pattern" json:"formatPattern"`
|
||
Unit string `orm:"unit" json:"unit"`
|
||
DictCode string `orm:"dict_code" json:"dictCode"`
|
||
SortOrder int `orm:"sort_order" json:"sortOrder"`
|
||
GroupName string `orm:"group_name" json:"groupName"`
|
||
Status string `orm:"status" json:"status"`
|
||
Creator string `orm:"creator" json:"creator"`
|
||
CreatedAt *time.Time `orm:"created_at" json:"createdAt"`
|
||
Updater string `orm:"updater" json:"updater"`
|
||
UpdatedAt *time.Time `orm:"updated_at" json:"updatedAt"`
|
||
DeletedAt *time.Time `orm:"deleted_at" json:"deletedAt"`
|
||
}
|
||
|
||
// ExtractConfig 抽取配置
|
||
type ExtractConfig struct {
|
||
ID int64 `orm:"id" json:"id"`
|
||
TenantId uint64 `orm:"tenant_id" json:"tenant_id"`
|
||
BusinessCode string `orm:"business_code" json:"businessCode"`
|
||
ReportCode string `orm:"report_code" json:"reportCode"`
|
||
ExtractCode string `orm:"extract_code" json:"extractCode"`
|
||
ExtractName string `orm:"extract_name" json:"extractName"`
|
||
SourceTableName string `orm:"source_table_name" json:"sourceTableName"`
|
||
SourceTableAlias string `orm:"source_table_alias" json:"sourceTableAlias"`
|
||
TargetTableName string `orm:"target_table_name" json:"targetTableName"`
|
||
IsEnabled bool `orm:"is_enabled" json:"isEnabled"`
|
||
ExtractType string `orm:"extract_type" json:"extractType"`
|
||
ExtractMode string `orm:"extract_mode" json:"extractMode"`
|
||
ExtractKeyField string `orm:"extract_key_field" json:"extractKeyField"`
|
||
ExtractKeyFormat string `orm:"extract_key_format" json:"extractKeyFormat"`
|
||
GroupByFields []string `orm:"group_by_fields" json:"groupByFields"`
|
||
FilterExpression string `orm:"filter_expression" json:"filterExpression"`
|
||
JoinConfigs []JoinConfig `orm:"join_configs" json:"joinConfigs"`
|
||
FieldMappings []FieldMapping `orm:"field_mappings" json:"fieldMappings"`
|
||
TransformRules []TransformRule `orm:"transform_rules" json:"transformRules"`
|
||
BatchSize int `orm:"batch_size" json:"batchSize"`
|
||
Status string `orm:"status" json:"status"`
|
||
Creator string `orm:"creator" json:"creator"`
|
||
CreatedAt *time.Time `orm:"created_at" json:"createdAt"`
|
||
Updater string `orm:"updater" json:"updater"`
|
||
UpdatedAt *time.Time `orm:"updated_at" json:"updatedAt"`
|
||
DeletedAt *time.Time `orm:"deleted_at" json:"deletedAt"`
|
||
}
|
||
|
||
// ExtractLog 抽取记录
|
||
type ExtractLog struct {
|
||
ID int64 `orm:"id" json:"id"`
|
||
BusinessCode string `orm:"business_code" json:"businessCode"`
|
||
ReportCode string `orm:"report_code" json:"reportCode"`
|
||
ExtractCode string `orm:"extract_code" json:"extractCode"`
|
||
StatDate string `orm:"stat_date" json:"statDate"`
|
||
ExtractType string `orm:"extract_type" json:"extractType"`
|
||
Status string `orm:"status" json:"status"`
|
||
TotalCount int `orm:"total_count" json:"totalCount"`
|
||
SuccessCount int `orm:"success_count" json:"successCount"`
|
||
FailCount int `orm:"fail_count" json:"failCount"`
|
||
StartTime *time.Time `orm:"start_time" json:"startTime"`
|
||
EndTime *time.Time `orm:"end_time" json:"endTime"`
|
||
ErrorMessage string `orm:"error_message" json:"errorMessage"`
|
||
Executor string `orm:"executor" json:"executor"`
|
||
CreatedAt *time.Time `orm:"created_at" json:"createdAt"`
|
||
UpdatedAt *time.Time `orm:"updated_at" json:"updatedAt"`
|
||
}
|
||
|
||
// ============================================================
|
||
// 辅助结构
|
||
// ============================================================
|
||
|
||
// JoinConfig 关联配置
|
||
type JoinConfig struct {
|
||
JoinTable string `json:"joinTable"`
|
||
JoinAlias string `json:"joinAlias"`
|
||
JoinType string `json:"joinType"` // LEFT/RIGHT/INNER
|
||
JoinCondition string `json:"joinCondition"`
|
||
FieldMappings []FieldMapping `json:"fieldMappings"`
|
||
}
|
||
|
||
// FieldMapping 字段映射
|
||
type FieldMapping struct {
|
||
SourceField string `json:"sourceField"`
|
||
TargetField string `json:"targetField"`
|
||
FieldType string `json:"fieldType"`
|
||
AggregateFunction string `json:"aggregateFunction"`
|
||
DefaultValue interface{} `json:"defaultValue"`
|
||
TransformRule *TransformRule `json:"transformRule,omitempty"`
|
||
}
|
||
|
||
// TransformRule 转换规则
|
||
type TransformRule struct {
|
||
RuleCode string `json:"ruleCode"`
|
||
RuleType string `json:"ruleType"` // DIRECT/MAPPING/FORMAT/CALCULATE
|
||
Expression string `json:"expression"`
|
||
Format string `json:"format"`
|
||
Mapping map[string]interface{} `json:"mapping"`
|
||
}
|
||
|
||
// ============================================================
|
||
// 前端请求/响应结构体
|
||
// ============================================================
|
||
|
||
// UserSelectQueryReq 用户选择查询请求
|
||
type UserSelectQueryReq struct {
|
||
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码"`
|
||
ReportCode string `json:"reportCode" v:"required" dc:"报表编码"`
|
||
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"`
|
||
OrderBy []OrderCondition `json:"orderBy" dc:"排序条件"`
|
||
Page int `json:"page" dc:"页码" d:"1"`
|
||
PageSize int `json:"pageSize" dc:"每页条数" d:"20"`
|
||
}
|
||
|
||
// IndicatorSelect 指标选择
|
||
type IndicatorSelect struct {
|
||
FieldCode string `json:"fieldCode" dc:"字段编码"`
|
||
Aggregate string `json:"aggregate" dc:"聚合方式: SUM/COUNT/AVG/MAX/MIN"`
|
||
Alias string `json:"alias" dc:"别名"`
|
||
}
|
||
|
||
// FilterCondition 筛选条件
|
||
type FilterCondition struct {
|
||
FieldCode string `json:"fieldCode" dc:"字段编码"`
|
||
Operator string `json:"operator" dc:"操作符: =/!=/>/</>=/<=/IN/LIKE/BETWEEN"`
|
||
Value interface{} `json:"value" dc:"值"`
|
||
Value2 interface{} `json:"value2" dc:"第二个值(BETWEEN时使用)"`
|
||
}
|
||
|
||
// TimeRange 时间范围
|
||
type TimeRange struct {
|
||
StartDate string `json:"startDate" dc:"开始日期 yyyy-MM-dd"`
|
||
EndDate string `json:"endDate" dc:"结束日期 yyyy-MM-dd"`
|
||
}
|
||
|
||
// OrderCondition 排序条件
|
||
type OrderCondition struct {
|
||
FieldCode string `json:"fieldCode" dc:"字段编码"`
|
||
Direction string `json:"direction" dc:"排序方向: ASC/DESC"`
|
||
}
|
||
|
||
// UserSelectQueryResp 用户选择查询响应
|
||
type UserSelectQueryResp struct {
|
||
List []map[string]interface{} `json:"list" dc:"数据列表"`
|
||
Total int64 `json:"total" dc:"总数"`
|
||
Page int `json:"page" dc:"当前页"`
|
||
PageSize int `json:"pageSize" dc:"每页条数"`
|
||
TotalPages int `json:"totalPages" dc:"总页数"`
|
||
Sql string `json:"sql,omitempty" dc:"执行的SQL(调试用)"`
|
||
ExecTimeMs int64 `json:"execTimeMs" dc:"执行耗时(毫秒)"`
|
||
}
|
||
|
||
// ExtractDailyDataReq 按天抽取数据请求
|
||
type ExtractDailyDataReq struct {
|
||
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码"`
|
||
ReportCode string `json:"reportCode" v:"required" dc:"报表编码"`
|
||
StatDate string `json:"statDate" v:"required" dc:"统计日期 yyyy-MM-dd"`
|
||
Executor string `json:"executor" dc:"执行人"`
|
||
}
|
||
|
||
// ExtractDailyDataResp 按天抽取数据响应
|
||
type ExtractDailyDataResp struct {
|
||
Success bool `json:"success" dc:"是否成功"`
|
||
TotalCount int `json:"totalCount" dc:"总记录数"`
|
||
SuccessCount int `json:"successCount" dc:"成功记录数"`
|
||
FailCount int `json:"failCount" dc:"失败记录数"`
|
||
ExecTimeMs int64 `json:"execTimeMs" dc:"执行耗时(毫秒)"`
|
||
ErrorMsg string `json:"errorMsg" dc:"错误信息"`
|
||
}
|
||
|
||
// AutoCreateStatTableReq 自动创建统计宽表请求
|
||
type AutoCreateStatTableReq struct {
|
||
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码"`
|
||
ReportCode string `json:"reportCode" v:"required" dc:"报表编码"`
|
||
Creator string `json:"creator" dc:"创建人"`
|
||
}
|
||
|
||
// AutoCreateStatTableResp 自动创建统计宽表响应
|
||
type AutoCreateStatTableResp struct {
|
||
Success bool `json:"success" dc:"是否成功"`
|
||
TableName string `json:"tableName" dc:"创建的表名"`
|
||
ColumnCount int `json:"columnCount" dc:"字段数量"`
|
||
ExecTimeMs int64 `json:"execTimeMs" dc:"执行耗时(毫秒)"`
|
||
}
|
||
|
||
// GetReportFieldsResp 获取报表可用字段响应
|
||
type GetReportFieldsResp struct {
|
||
BusinessCode string `json:"businessCode" dc:"业务编码"`
|
||
ReportCode string `json:"reportCode" dc:"报表编码"`
|
||
Dimensions []FieldConfig `json:"dimensions" dc:"维度字段列表"`
|
||
Indicators []FieldConfig `json:"indicators" dc:"指标字段列表"`
|
||
Filters []FieldConfig `json:"filters" dc:"筛选字段列表"`
|
||
}
|
||
|
||
// ============================================================
|
||
// 配置 CRUD 请求/响应
|
||
// ============================================================
|
||
|
||
// SaveBusinessReq 保存业务配置请求(新增/修改合一)
|
||
type SaveBusinessReq struct {
|
||
ID *int64 `json:"id"` // 有值为更新,无值为新增
|
||
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码"`
|
||
BusinessName string `json:"businessName" v:"required" dc:"业务名称"`
|
||
Description string `json:"description" dc:"描述"`
|
||
Status string `json:"status" dc:"状态 ACTIVE/INACTIVE" d:"ACTIVE"`
|
||
Config map[string]interface{} `json:"config" dc:"扩展配置"`
|
||
Operator string `json:"operator" dc:"操作人"`
|
||
}
|
||
|
||
// SaveReportReq 保存报表配置请求
|
||
type SaveReportReq struct {
|
||
ID *int64 `json:"id"`
|
||
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码"`
|
||
ReportCode string `json:"reportCode" v:"required" dc:"报表编码"`
|
||
ReportName string `json:"reportName" v:"required" dc:"报表名称"`
|
||
Description string `json:"description" dc:"描述"`
|
||
Status string `json:"status" dc:"状态" d:"ACTIVE"`
|
||
StatTableName string `json:"statTableName" v:"required" dc:"统计宽表名"`
|
||
StatTableComment string `json:"statTableComment" dc:"统计宽表注释"`
|
||
DateField string `json:"dateField" dc:"日期字段" d:"stat_date"`
|
||
PrimaryKeys []string `json:"primaryKeys" dc:"主键字段"`
|
||
ConflictKeys []string `json:"conflictKeys" dc:"冲突键(唯一索引)"`
|
||
Config map[string]interface{} `json:"config" dc:"扩展配置"`
|
||
Operator string `json:"operator" dc:"操作人"`
|
||
}
|
||
|
||
// SaveFieldReq 保存字段配置请求
|
||
type SaveFieldReq struct {
|
||
ID *int64 `json:"id"`
|
||
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码"`
|
||
ReportCode string `json:"reportCode" v:"required" dc:"报表编码"`
|
||
FieldCode string `json:"fieldCode" v:"required" dc:"字段编码"`
|
||
FieldName string `json:"fieldName" v:"required" dc:"字段名称"`
|
||
FieldType string `json:"fieldType" v:"required" dc:"字段类型 STRING/INT/FLOAT/DATE/DATETIME/JSONB"`
|
||
DataType string `json:"dataType" dc:"数据存储类型" d:"STRING"`
|
||
FieldRole string `json:"fieldRole" v:"required" dc:"字段角色 DIMENSION/INDICATOR/FILTER/FILTER_ONLY"`
|
||
IsAggregatable bool `json:"isAggregatable" dc:"是否可聚合"`
|
||
IsFilterable bool `json:"isFilterable" dc:"是否可筛选" d:"true"`
|
||
IsQueryable bool `json:"isQueryable" dc:"是否可查询" d:"true"`
|
||
IsSortable bool `json:"isSortable" dc:"是否可排序" d:"true"`
|
||
DefaultAggregate string `json:"defaultAggregate" dc:"默认聚合方式"`
|
||
ValidAggregates []string `json:"validAggregates" dc:"可选聚合列表"`
|
||
FilterOperators []string `json:"filterOperators" dc:"可选操作符列表"`
|
||
Expression string `json:"expression" dc:"表达式(衍生字段)"`
|
||
ExpressionType string `json:"expressionType" dc:"表达式类型 DIRECT/CALCULATED"`
|
||
FormatPattern string `json:"formatPattern" dc:"格式化模板"`
|
||
Unit string `json:"unit" dc:"单位"`
|
||
DictCode string `json:"dictCode" dc:"字典编码"`
|
||
SortOrder int `json:"sortOrder" dc:"排序"`
|
||
GroupName string `json:"groupName" dc:"分组名称"`
|
||
Status string `json:"status" dc:"状态" d:"ACTIVE"`
|
||
Operator string `json:"operator" dc:"操作人"`
|
||
}
|
||
|
||
// SaveExtractConfigReq 保存抽取配置请求
|
||
type SaveExtractConfigReq struct {
|
||
ID *int64 `json:"id"`
|
||
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码"`
|
||
ReportCode string `json:"reportCode" v:"required" dc:"报表编码"`
|
||
ExtractCode string `json:"extractCode" v:"required" dc:"抽取编码"`
|
||
ExtractName string `json:"extractName" v:"required" dc:"抽取名称"`
|
||
SourceTableName string `json:"sourceTableName" v:"required" dc:"源表名"`
|
||
SourceTableAlias string `json:"sourceTableAlias" dc:"源表别名"`
|
||
TargetTableName string `json:"targetTableName" v:"required" dc:"目标表名"`
|
||
IsEnabled bool `json:"isEnabled" dc:"是否启用" d:"true"`
|
||
ExtractType string `json:"extractType" dc:"抽取类型 FULL/INCREMENTAL" d:"INCREMENTAL"`
|
||
ExtractMode string `json:"extractMode" dc:"抽取模式 DIRECT/AGGREGATE" d:"DIRECT"`
|
||
ExtractKeyField string `json:"extractKeyField" dc:"抽取关键字段(增量依据)"`
|
||
ExtractKeyFormat string `json:"extractKeyFormat" dc:"关键字段格式"`
|
||
GroupByFields []string `json:"groupByFields" dc:"GROUP BY 字段列表"`
|
||
FilterExpression string `json:"filterExpression" dc:"过滤表达式"`
|
||
JoinConfigs []JoinConfig `json:"joinConfigs" dc:"JOIN配置"`
|
||
FieldMappings []FieldMapping `json:"fieldMappings" dc:"字段映射列表"`
|
||
TransformRules []TransformRule `json:"transformRules" dc:"转换规则列表"`
|
||
BatchSize int `json:"batchSize" dc:"批处理大小" d:"1000"`
|
||
Status string `json:"status" dc:"状态" d:"ACTIVE"`
|
||
Operator string `json:"operator" dc:"操作人"`
|
||
}
|
||
|
||
// IdReq 通用 ID 请求
|
||
type IdReq struct {
|
||
ID int64 `json:"id" v:"required" dc:"主键ID"`
|
||
}
|
||
|
||
// SaveResult 写操作通用返回
|
||
type SaveResult struct {
|
||
Success bool `json:"success"`
|
||
ID int64 `json:"id"`
|
||
Message string `json:"message"`
|
||
}
|
||
|
||
// DeleteResult 删除结果
|
||
type DeleteResult struct {
|
||
Success bool `json:"success"`
|
||
Message string `json:"message"`
|
||
}
|
||
|
||
// GetExtractConfigsReq 获取抽取配置列表请求
|
||
type GetExtractConfigsReq struct {
|
||
BusinessCode string `json:"businessCode" v:"required" dc:"业务编码"`
|
||
ReportCode string `json:"reportCode" v:"required" dc:"报表编码"`
|
||
}
|
||
|
||
// ============================================================
|
||
// 常量定义
|
||
// ============================================================
|
||
|
||
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"
|
||
)
|