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>
61 lines
2.0 KiB
Go
61 lines
2.0 KiB
Go
package packagesilence
|
||
|
||
import (
|
||
"context"
|
||
|
||
"go.uber.org/zap"
|
||
|
||
"github.com/break/junhong_cmp_fiber/internal/model"
|
||
"github.com/break/junhong_cmp_fiber/pkg/constants"
|
||
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
||
)
|
||
|
||
// ScanResult 是一轮沉默期扫描的结果。
|
||
type ScanResult struct {
|
||
Scanned int
|
||
Expired int
|
||
Ended int
|
||
}
|
||
|
||
// Scan 执行沉默期扫描 package:silence:scan(技术方案 §5.4):
|
||
// 查询 status = 0、待实名、已过截止、无调整审批的套餐记录,逐条执行统一判定(期内已实名则结束并激活,否则过期)。
|
||
// 单批 200、最多 20 批;只在总开关打开时运行;条件更新保证与实时判定并发时只有一方生效。
|
||
func (r *Resolver) Scan(ctx context.Context) (ScanResult, error) {
|
||
result := ScanResult{}
|
||
if !r.sw.Enabled(ctx) {
|
||
return result, nil
|
||
}
|
||
lastID := uint(0)
|
||
for batch := 0; batch < constants.SilenceScanMaxBatches; batch++ {
|
||
var ids []uint
|
||
if err := r.db.WithContext(ctx).Model(&model.PackageUsage{}).
|
||
Where("status = ? AND silence_status = ? AND silence_deadline_at < ? AND silence_adjust_pending = ? AND id > ?",
|
||
constants.PackageUsageStatusPending, constants.SilenceStatusWaiting, r.now(), false, lastID).
|
||
Order("id ASC").Limit(constants.SilenceScanBatchSize).Pluck("id", &ids).Error; err != nil {
|
||
return result, errors.Wrap(errors.CodeDatabaseError, err, "查询到期沉默期套餐失败")
|
||
}
|
||
if len(ids) == 0 {
|
||
break
|
||
}
|
||
for _, id := range ids {
|
||
lastID = id
|
||
resolved, err := r.ResolveAndActivate(ctx, id, ResolveOptions{Trigger: constants.SilenceTriggerScan, AllowExpire: true})
|
||
if err != nil {
|
||
r.logger.Warn("沉默期扫描判定失败,下一轮重试", zap.Uint("usage_id", id), zap.Error(err))
|
||
continue
|
||
}
|
||
result.Scanned++
|
||
if resolved.Changed && resolved.Status == constants.SilenceStatusExpired {
|
||
result.Expired++
|
||
}
|
||
if resolved.Changed && resolved.Status == constants.SilenceStatusEnded {
|
||
result.Ended++
|
||
}
|
||
}
|
||
if len(ids) < constants.SilenceScanBatchSize {
|
||
break
|
||
}
|
||
}
|
||
return result, nil
|
||
}
|