Files
junhong_cmp_fiber/pkg/constants/package_silence.go
邹进 62ec94adec
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Failing after 38s
refactor: 出库时间更名为首次购买套餐时间,换货新资产不再按换货完成时间记录
- 字段 outbound_at → first_purchase_at,记录表 tb_asset_outbound_record → tb_asset_first_purchase_record,接口 /outbound-records → /first-purchase-records,筛选参数与导出列同步更名
- 换货后的新资产不因换货写入,在当前世代真正支付套餐订单时才记录;记录来源只保留 order / backfill,去掉换货单字段
- 迁移 000266 重命名列、表、索引与约束;同步 Spec、设计、任务与前端接口变更说明

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

320 lines
14 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
SilenceFirstPurchaseBackfillBatchSize = 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"
AuditActionAssetFirstPurchaseRecorded = "asset.first_purchase_recorded"
AuditActionAssetFirstPurchaseEnded = "asset.first_purchase_ended"
)
// 资产首次购买套餐记录。
const (
FirstPurchaseSourceOrder = "order"
FirstPurchaseSourceBackfill = "backfill"
FirstPurchaseEndReasonExchange = "exchange_return"
FirstPurchaseAssetTypeIotCard = "iot_card"
FirstPurchaseAssetTypeDevice = "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"