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>
43 lines
1.5 KiB
Go
43 lines
1.5 KiB
Go
package refund
|
||
|
||
import (
|
||
"context"
|
||
|
||
"github.com/break/junhong_cmp_fiber/internal/model"
|
||
"github.com/break/junhong_cmp_fiber/pkg/constants"
|
||
"github.com/break/junhong_cmp_fiber/pkg/errors"
|
||
)
|
||
|
||
// SilenceSwitch 读取沉默期总开关。
|
||
type SilenceSwitch interface {
|
||
Enabled(ctx context.Context) bool
|
||
}
|
||
|
||
// SetSilenceSwitch 注入沉默期总开关;打开时沉默期已过期的套餐不能申请退款。
|
||
func (s *Service) SetSilenceSwitch(sw SilenceSwitch) {
|
||
s.silenceSwitch = sw
|
||
}
|
||
|
||
// ensureSilenceRefundable 拦截沉默期已过期套餐的退款申请(add-package-silence-period §5.5)。
|
||
// 退款套餐定位口径与退款套餐失效一致:优先冻结的套餐记录,否则取订单下主套餐记录。
|
||
func (s *Service) ensureSilenceRefundable(ctx context.Context, orderID uint, packageUsageID *uint) error {
|
||
if s.silenceSwitch == nil || !s.silenceSwitch.Enabled(ctx) {
|
||
return nil
|
||
}
|
||
query := s.db.WithContext(ctx).Model(&model.PackageUsage{}).
|
||
Where("status = ? AND silence_status = ?", constants.PackageUsageStatusPending, constants.SilenceStatusExpired)
|
||
if packageUsageID != nil && *packageUsageID > 0 {
|
||
query = query.Where("id = ?", *packageUsageID)
|
||
} else {
|
||
query = query.Where("order_id = ? AND master_usage_id IS NULL", orderID)
|
||
}
|
||
var count int64
|
||
if err := query.Count(&count).Error; err != nil {
|
||
return errors.Wrap(errors.CodeDatabaseError, err, "查询套餐沉默期状态失败")
|
||
}
|
||
if count > 0 {
|
||
return errors.New(errors.CodeSilenceExpiredNotRefundable)
|
||
}
|
||
return nil
|
||
}
|