Files
junhong_cmp_fiber/internal/exporter/registry.go
邹进 909f4d0ec2
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Failing after 8m39s
feat: 实名即生效套餐沉默期、延期办理与资产出库时间
- 迁移 000259~000265:套餐记录沉默期字段与扫描索引、套餐默认沉默期、延期政策/流水/订单/批次/明细 5 张表、默认政策与系统配置(总开关默认关闭)、企微审批白名单、卡与设备出库时间及出库记录
- 沉默期设置(订单发放、自动购包、钱包续费)、后台购买时调整(超默认值按政策免审或企微审批)、统一判定与激活闸门、排队与孤儿扫描跳过过期套餐、过期套餐禁止退款、每 10 分钟扫描
- 总开关专用接口与打开前 4 项检查;延期政策;延期资格与计费;H5 自助与后台二维码在线支付(商户池路由)、支付回调与查单恢复、线下登记、特殊/批量延期、异常重试与原路退款;沉默期审批场景与终态处理
- 换货沉默期流水与出库时间;卡/设备列表、详情、导出与出库记录接口;延期订单与即将过期套餐列表及导出;财务流水纳入延期支付
- 沉默期与出库时间回填工具 cmd/silence-backfill;前端接口变更说明

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 16:32:58 +09:00

111 lines
3.2 KiB
Go

package exporter
import (
"context"
"github.com/break/junhong_cmp_fiber/internal/polling/carrierqueue"
"sort"
"gorm.io/gorm"
"github.com/break/junhong_cmp_fiber/pkg/constants"
)
// Registry 导出数据源注册中心。
type Registry struct {
sources map[string]DataSource
}
// NewRegistry 创建导出数据源注册中心。
func NewRegistry(sources ...DataSource) *Registry {
m := make(map[string]DataSource, len(sources))
for _, source := range sources {
if source == nil {
continue
}
m[source.Scene()] = source
}
return &Registry{sources: m}
}
// NewDefaultRegistry 创建默认导出数据源注册中心。
func NewDefaultRegistry(db *gorm.DB) *Registry {
return NewRegistry(
NewDeviceDataSource(db),
NewIotCardDataSource(db),
NewOrderDataSource(db, ""),
NewOrderDataSource(db, constants.OrderCategoryPlatform),
NewOrderDataSource(db, constants.OrderCategoryAgent),
NewOrderDataSource(db, constants.OrderCategoryOnline),
NewPackageDataSource(db),
NewAgentWalletTransactionDataSource(db),
NewAgentRechargeDataSource(db),
NewRefundDataSource(db),
NewExchangeDataSource(db),
NewCommissionRecordDataSource(db),
NewPackageTrafficAlertDataSource(db),
NewExpiringAssetDataSource(db),
NewOperationsActivationDataSource(db),
NewOperationsRenewalDataSource(db),
NewStopResumeRuleDataSource(db),
NewPollingPauseDataSource(db),
NewSilenceOrderDataSource(db),
NewSilenceUsageDataSource(db),
NewStopRefusedAlertDataSource(db, stopResumeAlertThreshold(db)),
)
}
// Get 获取指定场景数据源。
func (r *Registry) Get(scene string) (DataSource, bool) {
source, ok := r.sources[scene]
return source, ok
}
// IsSupported 判断场景是否支持。
func (r *Registry) IsSupported(scene string) bool {
_, ok := r.sources[scene]
return ok
}
// Scenes 返回当前支持的场景列表。
func (r *Registry) Scenes() []string {
result := make([]string, 0, len(r.sources))
for scene := range r.sources {
result = append(result, scene)
}
sort.Strings(result)
return result
}
// IsSupportedScene 判断是否为受支持的场景。
func IsSupportedScene(scene string) bool {
switch scene {
case constants.ExportTaskSceneDevice,
constants.ExportTaskSceneIotCard,
constants.ExportTaskSceneOrder,
constants.ExportTaskSceneOrderPlatform,
constants.ExportTaskSceneOrderAgent,
constants.ExportTaskSceneOrderOnline,
constants.ExportTaskScenePackage,
constants.ExportTaskSceneAgentWalletTransaction,
constants.ExportTaskSceneAgentRecharge,
constants.ExportTaskSceneRefund,
constants.ExportTaskSceneExchange,
constants.ExportTaskSceneCommissionRecord,
constants.ExportTaskScenePackageTrafficAlert,
constants.ExportTaskSceneExpiringAsset,
constants.ExportTaskSceneOperationsActivation,
constants.ExportTaskSceneOperationsRenewal,
constants.ExportTaskSceneStopResumeRuleDryRun:
return true
default:
return false
}
}
// stopResumeAlertThreshold 读取停复机连续失败告警阈值(停机被拒视图口径)。
func stopResumeAlertThreshold(db *gorm.DB) func(ctx context.Context) int {
settings := carrierqueue.NewDefaultSettingsProvider(db, nil, nil)
return func(ctx context.Context) int { return settings.Current(ctx).SRAlertFailCount }
}