feat: 实名即生效套餐沉默期、延期办理与资产出库时间
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Failing after 8m39s

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

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
邹进
2026-10-27 16:32:58 +09:00
parent d2b0d2f534
commit 909f4d0ec2
112 changed files with 10473 additions and 82 deletions

View File

@@ -325,6 +325,9 @@ func QueueForTaskType(taskType string) string {
return QueueDataCleanup
case TaskTypePackageExpiryReminder:
return QueueDataCleanup
case TaskTypePackageSilenceScan, TaskTypePackageSilenceOrderRecover:
// 沉默期扫描与延期订单查单恢复:轻量扫描,复用既有已监听队列,不新增队列与权重。
return QueueDataCleanup
case TaskTypePackageTrafficAlertScan:
// 与套餐临期扫描同队列:轻量只读扫描,复用既有已监听队列,不新增队列与权重。
return QueueDataCleanup

View File

@@ -0,0 +1,320 @@
package constants
import "time"
// 实名即生效套餐沉默期(add-package-silence-period)。
// 套餐记录沉默期状态 silence_status。空表示不适用沉默期。
const (
SilenceStatusWaiting = "waiting" // 待实名(含延期后的"延期待实名")
SilenceStatusExpired = "expired" // 沉默期已过期(status 保持 0,由激活闸门拦截)
SilenceStatusEnded = "ended" // 截止前已实名,沉默期结束
)
// SilenceStatusName 返回沉默期状态展示名。
func SilenceStatusName(status string, extended bool) string {
switch status {
case SilenceStatusWaiting:
if extended {
return "延期待实名"
}
return "待实名"
case SilenceStatusExpired:
return "沉默期已过期"
case SilenceStatusEnded:
return "沉默期已结束"
default:
return ""
}
}
// 沉默期时间口径。
const (
SilenceTimezone = "Asia/Shanghai"
SilenceDaysPerMonth = 30
SilencePackageDaysMin = 1
SilencePackageDaysMax = 90
SilenceDefaultPeriodDays = 30
SilenceDefaultUnitPrice = 500
)
// 沉默期系统配置 Key。
const (
SystemConfigModulePackage = "package"
SystemConfigSilenceEnabled = "package.silence.enabled"
SystemConfigSilenceDefaultDays = "package.silence.default_days"
SystemConfigSilenceExtensionUnitPrice = "package.silence.extension_unit_price"
ApprovalBusinessTypePackageSilence = "package_silence_approval"
PaymentOrderTypeSilenceExtension = "silence_extension"
SilenceExtensionOrderNoPrefix = "SE"
SilenceExtensionBatchNoPrefix = "SB"
SilenceExtensionOrderPayTTL = 30 * time.Minute
SilenceScanBatchSize = 200
SilenceScanMaxBatches = 20
SilenceScanUniqueTTL = 9 * time.Minute
SilenceScanMaxRetry = 3
TaskTypePackageSilenceScan = "package:silence:scan"
TaskTypePackageSilenceOrderRecover = "package:silence:order_recover"
SilenceScanCron = "*/10 * * * *"
SilenceOrderRecoverCron = "*/5 * * * *"
SilenceOrderRecoverBatchSize = 100
SilenceBatchImportMaxRows = 1000
SilenceExtensionReasonMaxLen = 1000
SilenceExtensionVoucherMaxCount = 5
SilenceExtensionEvidenceMaxCount = 10
SilencePolicyNameMaxLen = 100
SilenceExtensionInputDaysMax = 3650
SilencePurchaseAdjustDaysMax = 3650
SilenceExtensionOptionsMax = 24
SilenceBackfillBatchSize = 500
SilenceOutboundBackfillBatchSize = 5000
SilenceSwitchPrecheckUnconfiguredPackages = "unconfigured_packages"
SilenceSwitchPrecheckUnbackfilledUsages = "unbackfilled_usages"
SilenceSwitchPrecheckDefaultPolicyMissing = "default_policy_missing"
SilenceSwitchPrecheckApprovalSceneMissing = "approval_scene_missing"
SilenceExpiringSoonDaysDefault = 7
SilenceExtensionOrderCloseReasonTimeout = "timeout"
SilenceExtensionOrderCloseReasonSuperseded = "superseded"
)
// 延期政策适用范围。
const (
SilencePolicyScopeAll = "all"
SilencePolicyScopeSeries = "series"
SilencePolicyScopePackage = "package"
)
// 延期政策状态。
const (
SilencePolicyStatusDisabled = 0
SilencePolicyStatusEnabled = 1
)
// 延期路径。
const (
SilencePathOnline = "online"
SilencePathOffline = "offline"
SilencePathSpecial = "special"
SilencePathAdjust = "adjust"
)
// 延期类型;除 standard_paid 外同时是政策免审批场景的可选值。
const (
SilenceExtensionTypeStandardPaid = "standard_paid"
SilenceExtensionTypeOfflinePaid = "offline_paid"
SilenceExtensionTypeFree = "free"
SilenceExtensionTypeDiscount = "discount"
SilenceExtensionTypeComplaintCompensation = "complaint_compensation"
SilenceExtensionTypeSystemCompensation = "system_compensation"
SilenceExtensionTypeSpecialCustomer = "special_customer"
SilenceExtensionTypeBatch = "batch"
SilenceExtensionTypePurchaseAdjust = "purchase_adjust"
)
// SilenceApprovalExemptTypes 是政策可勾选的免审批场景(在线付款始终不审批,不在可选项)。
var SilenceApprovalExemptTypes = []string{
SilenceExtensionTypeOfflinePaid, SilenceExtensionTypeFree, SilenceExtensionTypeDiscount,
SilenceExtensionTypeComplaintCompensation, SilenceExtensionTypeSystemCompensation,
SilenceExtensionTypeSpecialCustomer, SilenceExtensionTypeBatch, SilenceExtensionTypePurchaseAdjust,
}
// SilenceSpecialExtensionTypes 是特殊延期可提交的类型。
var SilenceSpecialExtensionTypes = []string{
SilenceExtensionTypeFree, SilenceExtensionTypeDiscount, SilenceExtensionTypeComplaintCompensation,
SilenceExtensionTypeSystemCompensation, SilenceExtensionTypeSpecialCustomer,
}
// 延期批次状态。
const (
SilenceBatchStatusPendingPayment = "pending_payment"
SilenceBatchStatusPendingApproval = "pending_approval"
SilenceBatchStatusExecuting = "executing"
SilenceBatchStatusCompleted = "completed"
SilenceBatchStatusPartiallyCompleted = "partially_completed"
SilenceBatchStatusRejected = "rejected"
SilenceBatchStatusClosed = "closed"
SilenceBatchStatusFailed = "failed"
)
// 审批状态(批次 approval_status)。
const (
SilenceApprovalStatusPending = "pending"
SilenceApprovalStatusApproved = "approved"
SilenceApprovalStatusRejected = "rejected"
SilenceApprovalStatusCanceled = "canceled"
)
// 延期明细状态。
const (
SilenceExtensionStatusPendingPayment = "pending_payment"
SilenceExtensionStatusPendingApproval = "pending_approval"
SilenceExtensionStatusApproved = "approved"
SilenceExtensionStatusExecuting = "executing"
SilenceExtensionStatusCompleted = "completed"
SilenceExtensionStatusException = "exception"
SilenceExtensionStatusFailed = "failed"
SilenceExtensionStatusRejected = "rejected"
SilenceExtensionStatusClosed = "closed"
)
// 延期订单状态。
const (
SilenceOrderStatusPendingPayment = "pending_payment"
SilenceOrderStatusPendingApproval = "pending_approval"
SilenceOrderStatusRejected = "rejected"
SilenceOrderStatusPaid = "paid"
SilenceOrderStatusCompleted = "completed"
SilenceOrderStatusClosed = "closed"
SilenceOrderStatusException = "exception"
SilenceOrderStatusRefunded = "refunded"
)
// 延期订单来源。
const (
SilenceOrderSourceClient = "client"
SilenceOrderSourceAdmin = "admin"
SilenceOrderSourceOffline = "offline"
)
// 沉默期流水事件类型。
const (
SilenceRecordEventSet = "set"
SilenceRecordEventAdjust = "adjust"
SilenceRecordEventExpired = "expired"
SilenceRecordEventEnded = "ended"
SilenceRecordEventExtend = "extend"
SilenceRecordEventExchange = "exchange"
SilenceRecordEventBackfill = "backfill"
SilenceRecordEventRealnameBackfill = "realname_backfill"
)
// 沉默期判定触发来源。
const (
SilenceTriggerOrderPaid = "order_paid"
SilenceTriggerAutoPurchase = "auto_purchase"
SilenceTriggerActivation = "activation"
SilenceTriggerScan = "scan"
SilenceTriggerExtension = "extension"
SilenceTriggerAdjustApproval = "adjust_approval"
SilenceTriggerExchange = "exchange"
SilenceTriggerBackfill = "backfill"
SilenceTriggerEligibilityRead = "eligibility"
)
// 沉默期流水与审计的操作人类型。
const (
SilenceOperatorSystem = "system"
SilenceOperatorAccount = "account"
SilenceOperatorCustomer = "customer"
)
// 延期资格不能付费延期的原因码。
const (
SilenceReasonNotExpired = "not_expired"
SilenceReasonNoSilence = "no_silence"
SilenceReasonExtensionDisabled = "extension_disabled"
SilenceReasonNoPolicy = "no_policy"
SilenceReasonExceedsLimit = "exceeds_limit"
SilenceReasonRefunded = "refunded"
SilenceReasonOrderPending = "order_pending"
SilenceReasonActivated = "activated"
SilenceReasonAdjustPending = "adjust_pending"
)
// 延期执行异常 / 失败原因码。
const (
SilenceFailureNotExpired = "not_expired"
SilenceFailureDeadlineNotAfter = "deadline_not_after_today"
SilenceFailureExceedsLimit = "exceeds_limit"
SilenceFailureFreeUsedUp = "free_used_up"
SilenceFailureUsageInvalid = "usage_invalid"
SilenceFailureAmountMismatch = "amount_mismatch"
SilenceFailureRefundFailed = "refund_failed"
)
// 沉默期权限点(后端统一校验并叠加店铺数据范围)。
const (
PermissionPackageSilenceConfig = "package_silence:config"
PermissionPackageSilenceOverride = "package_silence:override"
PermissionPackageSilenceExtend = "package_silence:extend"
PermissionPackageSilenceExtendBatch = "package_silence:extend_batch"
PermissionPackageSilenceOffline = "package_silence:offline"
PermissionPackageSilencePolicy = "package_silence:policy"
PermissionPackageSilenceException = "package_silence:exception"
)
// 沉默期审计动作(技术方案 §11.2)。
const (
AuditActionPackageSilenceDefaultChanged = "package.silence_default_changed"
AuditActionPackageSilenceSwitchChanged = "package.silence_switch_changed"
AuditActionUsageSilenceSet = "package_usage.silence_set"
AuditActionUsageSilenceAdjustRequested = "package_usage.silence_adjust_requested"
AuditActionUsageSilenceAdjustApproved = "package_usage.silence_adjust_approved"
AuditActionUsageSilenceAdjustRejected = "package_usage.silence_adjust_rejected"
AuditActionUsageSilenceExpired = "package_usage.silence_expired"
AuditActionUsageSilenceEnded = "package_usage.silence_ended"
AuditActionUsageSilenceExtensionRequested = "package_usage.silence_extension_requested"
AuditActionUsageSilenceExtensionApproved = "package_usage.silence_extension_approved"
AuditActionUsageSilenceExtensionRejected = "package_usage.silence_extension_rejected"
AuditActionUsageSilenceExtensionApplied = "package_usage.silence_extension_applied"
AuditActionUsageSilenceExtensionException = "package_usage.silence_extension_exception"
AuditActionUsageSilenceExtensionOrderState = "package_usage.silence_extension_order_changed"
AuditActionUsageSilenceMigratedOnExchange = "package_usage.silence_migrated_on_exchange"
AuditActionUsageSilenceBackfilled = "package_usage.silence_backfilled"
AuditActionSilencePolicyCreated = "package_silence_policy.created"
AuditActionSilencePolicyUpdated = "package_silence_policy.updated"
AuditActionSilencePolicyStatusChanged = "package_silence_policy.status_changed"
AuditActionAssetOutboundRecorded = "asset.outbound_recorded"
AuditActionAssetOutboundEnded = "asset.outbound_ended"
)
// 资产出库记录。
const (
OutboundSourceOrder = "order"
OutboundSourceExchange = "exchange"
OutboundSourceBackfill = "backfill"
OutboundEndReasonExchange = "exchange_return"
OutboundAssetTypeIotCard = "iot_card"
OutboundAssetTypeDevice = "device"
SilenceAssetTypeIotCard = "iot_card"
SilenceAssetTypeDevice = "device"
SilenceAuditResourceUsage = "package_usage"
SilenceAuditResourcePackage = "package"
SilenceAuditResourcePolicy = "package_silence_policy"
SilenceAuditResourceConfig = "system_config"
SilenceAuditResourceAsset = "asset"
)
// 沉默期审批业务字段(企微场景配置把模板控件映射到这些字段)。
const (
ApprovalFieldSilenceApplyType = "apply_type" // 申请类型
ApprovalFieldSilenceBatchNo = "batch_no" // 申请单号
ApprovalFieldSilenceAssetIdentifier = "asset_identifier" // 资产
ApprovalFieldSilencePackageName = "package_name" // 套餐
ApprovalFieldSilenceOrderNo = "order_no" // 订单号
ApprovalFieldSilenceDefaultDays = "default_days" // 默认沉默期天数
ApprovalFieldSilenceRequestedDays = "requested_days" // 申请沉默期天数
ApprovalFieldSilenceOriginalDeadline = "original_deadline" // 原截止日期
ApprovalFieldSilenceInputDays = "input_days" // 延期天数
ApprovalFieldSilenceBilledDays = "billed_days" // 计费天数
ApprovalFieldSilenceNewDeadline = "new_deadline" // 新截止日期
ApprovalFieldSilenceExtensionType = "extension_type" // 延期类型
ApprovalFieldSilenceItemCount = "item_count" // 明细条数
ApprovalFieldSilenceAmount = "amount" // 费用
ApprovalFieldSilenceAmountCent = "amount_cent" // 费用(分)
ApprovalFieldSilenceReason = "reason" // 原因
ApprovalFieldSilenceBasis = "basis" // 依据
ApprovalFieldSilenceEvidenceKeys = "evidence_keys" // 申请依据附件
ApprovalFieldSilencePaymentMethod = "offline_payment_method" // 收款方式
ApprovalFieldSilenceTradeNo = "offline_trade_no" // 交易单号
ApprovalFieldSilenceVoucherKeys = "payment_voucher_keys" // 收款凭证
)
// 沉默期导出场景。
const (
ExportTaskSceneSilenceOrder = "package_silence_order" // 导出场景:沉默期延期订单
ExportTaskSceneSilenceUsage = "package_silence_usage" // 导出场景:即将过期 / 已过期套餐
)
// AuditResourceSilenceExtensionOrder 是财务流水中延期订单的调查引用资源类型。
const AuditResourceSilenceExtensionOrder = "package_silence_extension_order"

View File

@@ -197,6 +197,24 @@ const (
CodeH5PopupConfigurationNotFound = 1250 // 运营弹窗配置不存在
CodeH5PopupRiskNotEligible = 1251 // 当前资产不满足风险换卡条件
// 实名即生效套餐沉默期相关错误 (1260-1279)
CodeSilencePeriodOutOfRange = 1260 // silence_period_out_of_range:沉默期天数不在允许范围(购买时至少 1 天,套餐默认值 1~90 天)
CodeSilenceOverrideForbidden = 1261 // silence_override_forbidden:无权限调整沉默期
CodePackageExpiryBaseChangeForbidden = 1262 // package_expiry_base_change_forbidden:不允许变更该套餐的生效条件
CodeSilenceExtensionNotExpired = 1263 // silence_extension_not_expired:套餐沉默期未过期,不能延期
CodeSilenceExtensionDisabled = 1264 // silence_extension_disabled:该套餐不支持付费延期,可申请特殊延期
CodeSilenceExtensionExceedsLimit = 1265 // silence_extension_exceeds_limit:已超过可延期期限
CodeSilenceExtensionMonthsInvalid = 1266 // silence_extension_months_invalid:延期天数不在允许范围
CodeSilenceFreeExtensionUsedUp = 1267 // silence_free_extension_used_up:免费延期次数已用完,需付费延期
CodeSilenceExpiredNotRefundable = 1268 // silence_expired_not_refundable:沉默期已过期的套餐不能退款
CodeSilencePolicyOverlap = 1269 // silence_policy_overlap:同一优先级的延期政策适用范围与生效时间重叠
CodeSilenceExtensionNoPolicy = 1270 // silence_extension_no_policy:未匹配到延期政策,不能付费延期
CodeSilenceExtensionOrderPending = 1271 // silence_extension_order_pending:该套餐已有未结束的延期订单或申请
CodeSilenceOfflineTradeNoDuplicate = 1272 // silence_offline_trade_no_duplicate:线下交易单号已登记
CodeSilenceOfflineAmountMismatch = 1273 // silence_offline_amount_mismatch:实收金额与系统计算金额不一致
CodeSilenceFeatureDisabled = 1274 // silence_feature_disabled:沉默期功能未开启
CodeSilenceSwitchPrecheckFailed = 1275 // silence_switch_precheck_failed:沉默期总开关打开前检查未通过
// 服务端错误 (2000-2999) -> 5xx HTTP 状态码
CodeInternalError = 2001 // 内部服务器错误
CodeDatabaseError = 2002 // 数据库错误
@@ -358,6 +376,22 @@ var allErrorCodes = []int{
CodeEmployeeCollectionVoucherInvalid,
CodeH5PopupConfigurationNotFound,
CodeH5PopupRiskNotEligible,
CodeSilencePeriodOutOfRange,
CodeSilenceOverrideForbidden,
CodePackageExpiryBaseChangeForbidden,
CodeSilenceExtensionNotExpired,
CodeSilenceExtensionDisabled,
CodeSilenceExtensionExceedsLimit,
CodeSilenceExtensionMonthsInvalid,
CodeSilenceFreeExtensionUsedUp,
CodeSilenceExpiredNotRefundable,
CodeSilencePolicyOverlap,
CodeSilenceExtensionNoPolicy,
CodeSilenceExtensionOrderPending,
CodeSilenceOfflineTradeNoDuplicate,
CodeSilenceOfflineAmountMismatch,
CodeSilenceFeatureDisabled,
CodeSilenceSwitchPrecheckFailed,
CodeInternalError,
CodeDatabaseError,
CodeRedisError,
@@ -513,6 +547,22 @@ var errorMessages = map[int]string{
CodeEmployeeCollectionVoucherInvalid: "支付凭证数量或内容不符合要求",
CodeH5PopupConfigurationNotFound: "运营弹窗配置不存在",
CodeH5PopupRiskNotEligible: "当前资产不满足风险换卡条件",
CodeSilencePeriodOutOfRange: "沉默期天数不在允许范围(购买时至少 1 天,套餐默认值 1~90 天)",
CodeSilenceOverrideForbidden: "无权限调整沉默期",
CodePackageExpiryBaseChangeForbidden: "不允许变更该套餐的生效条件",
CodeSilenceExtensionNotExpired: "套餐沉默期未过期,不能延期",
CodeSilenceExtensionDisabled: "该套餐不支持付费延期,可申请特殊延期",
CodeSilenceExtensionExceedsLimit: "已超过可延期期限",
CodeSilenceExtensionMonthsInvalid: "延期天数不在允许范围",
CodeSilenceFreeExtensionUsedUp: "免费延期次数已用完,需付费延期",
CodeSilenceExpiredNotRefundable: "沉默期已过期的套餐不能退款",
CodeSilencePolicyOverlap: "同一优先级的延期政策适用范围与生效时间重叠",
CodeSilenceExtensionNoPolicy: "未匹配到延期政策,不能付费延期",
CodeSilenceExtensionOrderPending: "该套餐已有未结束的延期订单或申请",
CodeSilenceOfflineTradeNoDuplicate: "线下交易单号已登记",
CodeSilenceOfflineAmountMismatch: "实收金额与系统计算金额不一致",
CodeSilenceFeatureDisabled: "沉默期功能未开启",
CodeSilenceSwitchPrecheckFailed: "沉默期总开关打开前检查未通过",
CodeInvalidCredentials: "用户名或密码错误",
CodeAccountLocked: "账号已锁定",
CodePasswordExpired: "密码已过期",
@@ -580,6 +630,8 @@ func GetHTTPStatus(code int) int {
CodeEmployeeCollectionApplicationStatusInvalid,
CodeEmployeeCollectionApplicationPending,
CodeEmployeeCollectionBillClosed,
CodeSilenceExtensionOrderPending,
CodeSilenceOfflineTradeNoDuplicate,
CodeOpenAPINonceReplay:
return 409 // Conflict
case CodeTooManyRequests:

View File

@@ -95,6 +95,7 @@ func (h *Handler) RegisterHandlers() *asynq.ServeMux {
h.registerNotificationCleanupHandler()
h.registerPackageExpiryReminderHandler()
h.registerPackageTrafficAlertScanHandler()
h.registerPackageSilenceHandlers()
h.registerAutoPurchaseHandler()
h.registerDailyTrafficFlushHandler()
h.registerOperationsReportSnapshotHandler()
@@ -369,6 +370,23 @@ func (h *Handler) registerPackageTrafficAlertScanHandler() {
h.logger.Info("注册每日套餐真流量达量预警扫描任务处理器", zap.String("task_type", constants.TaskTypePackageTrafficAlertScan))
}
// registerPackageSilenceHandlers 注册沉默期扫描与延期订单查单恢复任务处理器。
func (h *Handler) registerPackageSilenceHandlers() {
services := h.workerResult.Services
if services == nil || services.SilenceResolver == nil {
h.logger.Warn("沉默期用例未装配,跳过注册沉默期任务处理器")
return
}
scan := task.NewPackageSilenceScanHandler(services.SilenceResolver, h.logger)
h.mux.HandleFunc(constants.TaskTypePackageSilenceScan, scan.Handle)
h.logger.Info("注册沉默期扫描任务处理器", zap.String("task_type", constants.TaskTypePackageSilenceScan))
if services.SilenceExtensions != nil {
recoverHandler := task.NewPackageSilenceOrderRecoverHandler(services.SilenceExtensions, h.logger)
h.mux.HandleFunc(constants.TaskTypePackageSilenceOrderRecover, recoverHandler.Handle)
h.logger.Info("注册沉默期延期订单恢复任务处理器", zap.String("task_type", constants.TaskTypePackageSilenceOrderRecover))
}
}
func (h *Handler) registerAutoPurchaseHandler() {
autoPurchaseHandler := task.NewAutoPurchaseHandler(
h.db,
@@ -385,6 +403,10 @@ func (h *Handler) registerAutoPurchaseHandler() {
h.workerResult.Services.PriorityEvents,
audit.NewWriter(audit.NewRegistry(), nil),
)
if services := h.workerResult.Services; services != nil {
autoPurchaseHandler.SetSilenceSetter(services.SilenceSetter)
autoPurchaseHandler.SetOutboundRecorder(services.SilenceOutbound)
}
h.mux.HandleFunc(constants.TaskTypeAutoPurchaseAfterRecharge, autoPurchaseHandler.ProcessTask)
h.logger.Info("注册自动购包任务处理器", zap.String("task_type", constants.TaskTypeAutoPurchaseAfterRecharge))
}

View File

@@ -2,6 +2,7 @@ package queue
import (
"context"
packagesilenceApp "github.com/break/junhong_cmp_fiber/internal/application/packagesilence"
iotCardSvc "github.com/break/junhong_cmp_fiber/internal/service/iot_card"
agentrechargeApp "github.com/break/junhong_cmp_fiber/internal/application/agentrecharge"
@@ -91,6 +92,13 @@ type WorkerServices struct {
AssetPolling *pollingSvc.AssetPollingService
// IotCardPolling 是 AssetPolling 使用的卡服务,Worker 启动时注入轮询生命周期回调。
IotCardPolling *iotCardSvc.Service
// 沉默期:总开关、统一判定、设置与出库时间用例(扫描、自动购包、延期执行共用)。
SilenceSwitch *packagesilenceApp.Switch
SilenceResolver *packagesilenceApp.Resolver
SilenceSetter *packagesilenceApp.Setter
SilenceOutbound *packagesilenceApp.OutboundRecorder
// SilenceExtensions 执行沉默期审批通过后的延期、延期订单查单恢复与异常原路退款。
SilenceExtensions *packagesilenceApp.ExtensionService
}
// WorkerBootstrapResult Worker Bootstrap 结果