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" )