feat(运营报表): AUG26-015 设备激活与套餐续费日报快照、查询趋势与受控导出
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 15m33s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 15m33s
- 新增成对迁移 000231 与三张快照表:日级头行、设备粒度激活行、到期事件粒度续费行,以快照日期为唯一键 - 新增每日 03:30(Asia/Shanghai)日报快照生成任务与幂等整日替换,失败重试沿用同一目标日 - 新增六条受控入口:两张报表的汇总、日/月趋势与受控导出,配套查询层只读快照事实 - 新增 operations_activation 与 operations_renewal 两个导出场景,创建期冻结筛选与可见店铺范围、派发期冻结表头、执行期只按冻结值复核资格 - 采购数量口径按系统内未删除设备数实施并在 PRD 标注,附实测差额依据 - 同步证据链 requirement-evidence.json 与入口能力矩阵、ARCHITECTURE 与验证记录 - 归档 change add-operations-reports 并新建主 Spec openspec/specs/operations-report/spec.md
This commit is contained in:
@@ -97,6 +97,7 @@ const (
|
||||
TaskTypeRefundChannelRecovery = "refund:channel:recovery" // 渠道原路退款结果恢复与查询
|
||||
TaskTypeRefundCommissionRecovery = "refund:commission:recovery" // 退款佣金回溯后处理补偿
|
||||
TaskTypePackageTrafficAlertScan = "package:traffic:alert:scan" // 每日套餐真流量达量预警扫描
|
||||
TaskTypeOperationsReportSnapshot = "operations:report:snapshot" // 每日运营报表日报快照生成
|
||||
|
||||
// 运营商通道流量阈值任务类型(由 Asynq Scheduler 调度)
|
||||
TaskTypeCarrierThresholdCycle = "carrier_threshold:cycle" // 通道阈值周期处理:跨期解锁与条件复机
|
||||
@@ -319,6 +320,9 @@ func QueueForTaskType(taskType string) string {
|
||||
case TaskTypePackageTrafficAlertScan:
|
||||
// 与套餐临期扫描同队列:轻量只读扫描,复用既有已监听队列,不新增队列与权重。
|
||||
return QueueDataCleanup
|
||||
case TaskTypeOperationsReportSnapshot:
|
||||
// 与套餐临期扫描同队列:每日一次的快照整日替换(秒级),复用既有已监听队列,不新增队列与权重。
|
||||
return QueueDataCleanup
|
||||
case TaskTypeDailyTrafficFlush:
|
||||
return QueueDailyTrafficFlush
|
||||
case TaskTypeAuditDailyArchive, TaskTypeIntegrationDailyArchive, TaskTypeAuditDailyRetention:
|
||||
@@ -401,6 +405,10 @@ const (
|
||||
ExportTaskScenePackageTrafficAlert = "package_traffic_alert"
|
||||
// ExportTaskSceneExpiringAsset 表示临期资产导出场景,一行对应一项资产,取当前生效主套餐最终到期时间。
|
||||
ExportTaskSceneExpiringAsset = "expiring_asset"
|
||||
// ExportTaskSceneOperationsActivation 表示设备激活情况报表导出场景,导出行与页面分组行同口径并含合计行。
|
||||
ExportTaskSceneOperationsActivation = "operations_activation"
|
||||
// ExportTaskSceneOperationsRenewal 表示套餐续费情况报表导出场景,导出行与页面分组行同口径并含合计行。
|
||||
ExportTaskSceneOperationsRenewal = "operations_renewal"
|
||||
)
|
||||
|
||||
// ExportTaskInvalidTimeFilterMessage 是导出任务冻结的时间边界非法时写入 error_message 的安全失败摘要。
|
||||
|
||||
@@ -84,6 +84,7 @@ func BuildDocHandlers() *bootstrap.Handlers {
|
||||
PhoneAssetAssociation: admin.NewPhoneAssetAssociationHandler(nil, nil),
|
||||
PackageTrafficAlert: admin.NewPackageTrafficAlertHandler(nil, nil, nil, nil),
|
||||
AssetAutoRenewal: admin.NewAssetAutoRenewalConfigHandler(nil, nil),
|
||||
OperationsReport: admin.NewOperationsReportHandler(nil, nil, nil),
|
||||
ClientWechat: app.NewClientWechatHandler(nil, nil, nil),
|
||||
SuperAdmin: admin.NewSuperAdminHandler(nil),
|
||||
SystemConfig: admin.NewSystemConfigHandler(nil, nil),
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"go.uber.org/zap"
|
||||
"gorm.io/gorm"
|
||||
|
||||
operationsReportApp "github.com/break/junhong_cmp_fiber/internal/application/operationsreport"
|
||||
packageExpiryApp "github.com/break/junhong_cmp_fiber/internal/application/packageexpiry"
|
||||
packageTrafficAlertApp "github.com/break/junhong_cmp_fiber/internal/application/packagetrafficalert"
|
||||
"github.com/break/junhong_cmp_fiber/internal/exporter"
|
||||
@@ -14,6 +15,7 @@ import (
|
||||
"github.com/break/junhong_cmp_fiber/internal/infrastructure/integrationlog"
|
||||
"github.com/break/junhong_cmp_fiber/internal/infrastructure/messaging/outbox"
|
||||
notification "github.com/break/junhong_cmp_fiber/internal/infrastructure/notification"
|
||||
operationsReportInfra "github.com/break/junhong_cmp_fiber/internal/infrastructure/operationsreport"
|
||||
packageExpiryInfra "github.com/break/junhong_cmp_fiber/internal/infrastructure/packageexpiry"
|
||||
packageTrafficAlertInfra "github.com/break/junhong_cmp_fiber/internal/infrastructure/packagetrafficalert"
|
||||
"github.com/break/junhong_cmp_fiber/internal/polling"
|
||||
@@ -92,6 +94,7 @@ func (h *Handler) RegisterHandlers() *asynq.ServeMux {
|
||||
h.registerPackageTrafficAlertScanHandler()
|
||||
h.registerAutoPurchaseHandler()
|
||||
h.registerDailyTrafficFlushHandler()
|
||||
h.registerOperationsReportSnapshotHandler()
|
||||
|
||||
h.logger.Info("所有任务处理器注册完成")
|
||||
return h.mux
|
||||
@@ -391,6 +394,17 @@ func (h *Handler) registerDailyTrafficFlushHandler() {
|
||||
h.logger.Info("注册每日流量落盘任务处理器", zap.String("task_type", constants.TaskTypeDailyTrafficFlush))
|
||||
}
|
||||
|
||||
// registerOperationsReportSnapshotHandler 注册运营报表日报快照生成任务处理器。
|
||||
// 生成用例依赖只读数据源与整日替换写入适配,二者都在此按需装配。
|
||||
func (h *Handler) registerOperationsReportSnapshotHandler() {
|
||||
source := operationsReportInfra.NewSource(h.db)
|
||||
store := operationsReportInfra.NewSnapshotStore(h.db)
|
||||
generator := operationsReportApp.NewGenerator(source, store, h.logger)
|
||||
handler := task.NewOperationsReportSnapshotHandler(generator, h.logger)
|
||||
h.mux.HandleFunc(constants.TaskTypeOperationsReportSnapshot, handler.Handle)
|
||||
h.logger.Info("注册每日运营报表日报快照生成任务处理器", zap.String("task_type", constants.TaskTypeOperationsReportSnapshot))
|
||||
}
|
||||
|
||||
// GetMux 获取 ServeMux(用于启动 Worker 服务器)
|
||||
func (h *Handler) GetMux() *asynq.ServeMux {
|
||||
return h.mux
|
||||
|
||||
Reference in New Issue
Block a user