feat: 实名即生效套餐沉默期、延期办理与资产出库时间
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Failing after 8m39s
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:
@@ -325,6 +325,9 @@ func QueueForTaskType(taskType string) string {
|
||||
return QueueDataCleanup
|
||||
case TaskTypePackageExpiryReminder:
|
||||
return QueueDataCleanup
|
||||
case TaskTypePackageSilenceScan, TaskTypePackageSilenceOrderRecover:
|
||||
// 沉默期扫描与延期订单查单恢复:轻量扫描,复用既有已监听队列,不新增队列与权重。
|
||||
return QueueDataCleanup
|
||||
case TaskTypePackageTrafficAlertScan:
|
||||
// 与套餐临期扫描同队列:轻量只读扫描,复用既有已监听队列,不新增队列与权重。
|
||||
return QueueDataCleanup
|
||||
|
||||
320
pkg/constants/package_silence.go
Normal file
320
pkg/constants/package_silence.go
Normal 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"
|
||||
@@ -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:
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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 结果
|
||||
|
||||
Reference in New Issue
Block a user