refactor: 出库时间更名为首次购买套餐时间,换货新资产不再按换货完成时间记录
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Failing after 38s

- 字段 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>
This commit is contained in:
邹进
2026-10-27 16:47:02 +09:00
parent 909f4d0ec2
commit 62ec94adec
46 changed files with 570 additions and 560 deletions

View File

@@ -67,7 +67,7 @@ const (
SilencePurchaseAdjustDaysMax = 3650
SilenceExtensionOptionsMax = 24
SilenceBackfillBatchSize = 500
SilenceOutboundBackfillBatchSize = 5000
SilenceFirstPurchaseBackfillBatchSize = 5000
SilenceSwitchPrecheckUnconfiguredPackages = "unconfigured_packages"
SilenceSwitchPrecheckUnbackfilledUsages = "unbackfilled_usages"
SilenceSwitchPrecheckDefaultPolicyMissing = "default_policy_missing"
@@ -264,25 +264,24 @@ const (
AuditActionSilencePolicyCreated = "package_silence_policy.created"
AuditActionSilencePolicyUpdated = "package_silence_policy.updated"
AuditActionSilencePolicyStatusChanged = "package_silence_policy.status_changed"
AuditActionAssetOutboundRecorded = "asset.outbound_recorded"
AuditActionAssetOutboundEnded = "asset.outbound_ended"
AuditActionAssetFirstPurchaseRecorded = "asset.first_purchase_recorded"
AuditActionAssetFirstPurchaseEnded = "asset.first_purchase_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"
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"
)
// 沉默期审批业务字段(企微场景配置把模板控件映射到这些字段)。

View File

@@ -405,7 +405,7 @@ func (h *Handler) registerAutoPurchaseHandler() {
)
if services := h.workerResult.Services; services != nil {
autoPurchaseHandler.SetSilenceSetter(services.SilenceSetter)
autoPurchaseHandler.SetOutboundRecorder(services.SilenceOutbound)
autoPurchaseHandler.SetFirstPurchaseRecorder(services.SilenceFirstPurchase)
}
h.mux.HandleFunc(constants.TaskTypeAutoPurchaseAfterRecharge, autoPurchaseHandler.ProcessTask)
h.logger.Info("注册自动购包任务处理器", zap.String("task_type", constants.TaskTypeAutoPurchaseAfterRecharge))

View File

@@ -92,11 +92,11 @@ type WorkerServices struct {
AssetPolling *pollingSvc.AssetPollingService
// IotCardPolling 是 AssetPolling 使用的卡服务,Worker 启动时注入轮询生命周期回调。
IotCardPolling *iotCardSvc.Service
// 沉默期:总开关、统一判定、设置与出库时间用例(扫描、自动购包、延期执行共用)。
SilenceSwitch *packagesilenceApp.Switch
SilenceResolver *packagesilenceApp.Resolver
SilenceSetter *packagesilenceApp.Setter
SilenceOutbound *packagesilenceApp.OutboundRecorder
// 沉默期:总开关、统一判定、设置与首次购买套餐时间用例(扫描、自动购包、延期执行共用)。
SilenceSwitch *packagesilenceApp.Switch
SilenceResolver *packagesilenceApp.Resolver
SilenceSetter *packagesilenceApp.Setter
SilenceFirstPurchase *packagesilenceApp.FirstPurchaseRecorder
// SilenceExtensions 执行沉默期审批通过后的延期、延期订单查单恢复与异常原路退款。
SilenceExtensions *packagesilenceApp.ExtensionService
}