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>
76 lines
2.9 KiB
Go
76 lines
2.9 KiB
Go
package task
|
||
|
||
import (
|
||
"context"
|
||
|
||
"github.com/hibiken/asynq"
|
||
"go.uber.org/zap"
|
||
|
||
packagesilenceapp "github.com/break/junhong_cmp_fiber/internal/application/packagesilence"
|
||
"github.com/break/junhong_cmp_fiber/pkg/auditcontext"
|
||
"github.com/break/junhong_cmp_fiber/pkg/constants"
|
||
)
|
||
|
||
// PackageSilenceScanHandler 处理沉默期扫描任务 package:silence:scan(每 10 分钟)。
|
||
// 总开关关闭时直接返回;判定使用条件更新,重复执行幂等。
|
||
type PackageSilenceScanHandler struct {
|
||
resolver *packagesilenceapp.Resolver
|
||
logger *zap.Logger
|
||
}
|
||
|
||
// NewPackageSilenceScanHandler 创建沉默期扫描任务处理器。
|
||
func NewPackageSilenceScanHandler(resolver *packagesilenceapp.Resolver, logger *zap.Logger) *PackageSilenceScanHandler {
|
||
return &PackageSilenceScanHandler{resolver: resolver, logger: logger}
|
||
}
|
||
|
||
// Handle 执行一轮沉默期扫描。
|
||
func (h *PackageSilenceScanHandler) Handle(ctx context.Context, _ *asynq.Task) error {
|
||
if h.resolver == nil {
|
||
return nil
|
||
}
|
||
ctx = auditcontext.With(ctx, auditcontext.Context{
|
||
ActorKind: constants.AuditActorScheduledJob, ActorID: constants.TaskTypePackageSilenceScan,
|
||
ActorName: "沉默期扫描任务", Source: constants.AuditSourceScheduler,
|
||
})
|
||
result, err := h.resolver.Scan(ctx)
|
||
if err != nil {
|
||
h.logger.Error("沉默期扫描失败", zap.Error(err))
|
||
return err
|
||
}
|
||
if result.Scanned > 0 {
|
||
h.logger.Info("沉默期扫描完成", zap.Int("scanned", result.Scanned), zap.Int("expired", result.Expired), zap.Int("ended", result.Ended))
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// PackageSilenceOrderRecoverHandler 处理延期订单查单恢复任务(每 5 分钟):查单、超时关闭、异常订单原路退款。
|
||
type PackageSilenceOrderRecoverHandler struct {
|
||
extensions *packagesilenceapp.ExtensionService
|
||
logger *zap.Logger
|
||
}
|
||
|
||
// NewPackageSilenceOrderRecoverHandler 创建延期订单恢复任务处理器。
|
||
func NewPackageSilenceOrderRecoverHandler(extensions *packagesilenceapp.ExtensionService, logger *zap.Logger) *PackageSilenceOrderRecoverHandler {
|
||
return &PackageSilenceOrderRecoverHandler{extensions: extensions, logger: logger}
|
||
}
|
||
|
||
// Handle 执行一轮延期订单恢复。
|
||
func (h *PackageSilenceOrderRecoverHandler) Handle(ctx context.Context, _ *asynq.Task) error {
|
||
if h.extensions == nil {
|
||
return nil
|
||
}
|
||
ctx = auditcontext.With(ctx, auditcontext.Context{
|
||
ActorKind: constants.AuditActorScheduledJob, ActorID: constants.TaskTypePackageSilenceOrderRecover,
|
||
ActorName: "沉默期延期订单恢复任务", Source: constants.AuditSourceScheduler,
|
||
})
|
||
result, err := h.extensions.Recover(ctx)
|
||
if err != nil {
|
||
h.logger.Error("沉默期延期订单恢复失败", zap.Error(err))
|
||
return err
|
||
}
|
||
if result.Confirmed+result.Closed+result.Refunded > 0 {
|
||
h.logger.Info("沉默期延期订单恢复完成", zap.Int("confirmed", result.Confirmed), zap.Int("closed", result.Closed), zap.Int("refunded", result.Refunded))
|
||
}
|
||
return nil
|
||
}
|