修复通知
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m25s

This commit is contained in:
2026-08-11 11:18:11 +08:00
parent 5c01008d8a
commit a795ca3650
20 changed files with 167 additions and 37 deletions

View File

@@ -1,4 +1,4 @@
// Package packageexpiry 编排套餐临期节点提醒用例。
// Package packageexpiry 编排每日套餐临期提醒用例。
package packageexpiry
import (
@@ -8,7 +8,7 @@ import (
"github.com/break/junhong_cmp_fiber/pkg/errors"
)
// ReminderScanner 查询当天命中临期节点的资产。
// ReminderScanner 查询当天临期资产。
type ReminderScanner interface {
ReminderCandidates(ctx context.Context) ([]dto.ExpiringAssetItem, error)
}
@@ -18,7 +18,7 @@ type ReminderPublisher interface {
Publish(ctx context.Context, candidates []dto.ExpiringAssetItem) error
}
// ReminderService 扫描并发布每日套餐临期节点提醒。
// ReminderService 扫描并发布每日套餐临期提醒。
type ReminderService struct {
scanner ReminderScanner
publisher ReminderPublisher
@@ -29,7 +29,7 @@ func NewReminderService(scanner ReminderScanner, publisher ReminderPublisher) *R
return &ReminderService{scanner: scanner, publisher: publisher}
}
// Run 执行当天 15、7、3 天节点扫描并可靠发布通知。
// Run 执行当天临期扫描并可靠发布通知。
func (s *ReminderService) Run(ctx context.Context) error {
if s == nil || s.scanner == nil || s.publisher == nil {
return errors.New(errors.CodeInternalError, "套餐临期提醒用例未配置")

View File

@@ -155,24 +155,24 @@ func (h *AssetHandler) ListExpiring(c *fiber.Ctx) error {
})
}
// TriggerPackageExpiryReminder 手动提交套餐临期提醒扫描任务。
// TriggerPackageExpiryReminder 手动提交每日临期提醒扫描任务。
// POST /api/admin/expiring-assets/reminder-scan
func (h *AssetHandler) TriggerPackageExpiryReminder(c *fiber.Ctx) error {
if middleware.GetUserTypeFromContext(c.UserContext()) != constants.UserTypeSuperAdmin {
return errors.New(errors.CodeForbidden)
}
if h.packageExpiryTrigger == nil {
return errors.New(errors.CodeServiceUnavailable, "套餐临期提醒任务队列未配置")
return errors.New(errors.CodeServiceUnavailable, "每日临期提醒扫描任务队列未配置")
}
if err := h.packageExpiryTrigger(c.UserContext()); err != nil {
logger.GetAppLogger().Error("手动提交套餐临期提醒扫描任务失败", zap.Error(err))
return errors.Wrap(errors.CodeTaskQueueError, err, "提交套餐临期提醒扫描任务失败")
logger.GetAppLogger().Error("手动提交每日临期提醒扫描任务失败", zap.Error(err))
return errors.Wrap(errors.CodeTaskQueueError, err, "提交每日临期提醒扫描任务失败")
}
logger.GetAppLogger().Info("已手动提交套餐临期提醒扫描任务",
logger.GetAppLogger().Info("已手动提交每日临期提醒扫描任务",
zap.Uint("operator_id", middleware.GetUserIDFromContext(c.UserContext())))
return response.Success(c, dto.TriggerPackageExpiryReminderResponse{
TaskType: constants.TaskTypePackageExpiryReminder,
Message: "套餐临期提醒扫描任务已提交",
Message: "每日临期提醒扫描任务已提交",
})
}

View File

@@ -18,7 +18,7 @@ import (
var shanghaiLocation = time.FixedZone("Asia/Shanghai", 8*60*60)
// ReminderPublisher 将临期节点事实转换为店铺和个人客户通知 Outbox。
// ReminderPublisher 将每日临期事实转换为店铺和个人客户通知 Outbox。
type ReminderPublisher struct {
db *gorm.DB
outbox *outbox.Repository

View File

@@ -61,23 +61,13 @@ func (q *Query) List(ctx context.Context, request dto.ExpiringAssetListRequest)
return ListResult{Items: items[start:end], Total: total, Page: request.Page, Size: request.PageSize, Summary: summary}, nil
}
// ReminderCandidates 查询当天精确命中 15、7、3 天节点的全部资产,供每日通知任务复用。
// ReminderCandidates 查询当天全部临期资产,供每日通知任务复用。
func (q *Query) ReminderCandidates(ctx context.Context) ([]dto.ExpiringAssetItem, error) {
items, err := q.collect(ctx, normalizeListRequest(dto.ExpiringAssetListRequest{}))
if err != nil {
return nil, err
}
result := make([]dto.ExpiringAssetItem, 0)
for _, item := range items {
if item.DaysUntilFinalExpiry == nil {
continue
}
switch *item.DaysUntilFinalExpiry {
case 15, 7, 3:
result = append(result, item)
}
}
return result, nil
return items, nil
}
func (q *Query) collect(ctx context.Context, request dto.ExpiringAssetListRequest) ([]dto.ExpiringAssetItem, error) {

View File

@@ -20,8 +20,8 @@ func registerPackageExpiryRoutes(router fiber.Router, handler *admin.AssetHandle
})
Register(router, doc, basePath, "POST", "/expiring-assets/reminder-scan", handler.TriggerPackageExpiryReminder, RouteSpec{
Summary: "手动触发套餐临期提醒扫描",
Description: "仅超级管理员可调用。立即提交与每日 03:00 相同的 15、7、3 天节点扫描任务;任务异步执行并沿用通知防重,不生成临期列表快照。",
Summary: "手动触发每日临期提醒扫描",
Description: "仅超级管理员可调用。立即提交与每日 03:00 相同的每日临期提醒扫描任务:扫描最终到期时间可精确推算且剩余 0 至 15 个上海自然日的资产粉色8 至 15 天、紫色4 至 7 天、红色0 至 3 天)仅表示列表展示等级。任务异步执行并沿用通知防重,不生成临期列表快照。",
Tags: []string{"资产管理"},
Output: new(dto.TriggerPackageExpiryReminderResponse),
Auth: true,

View File

@@ -9,22 +9,22 @@ import (
packageexpiryapp "github.com/break/junhong_cmp_fiber/internal/application/packageexpiry"
)
// PackageExpiryReminderHandler 处理每日套餐临期节点提醒任务。
// PackageExpiryReminderHandler 处理每日套餐临期提醒扫描任务。
type PackageExpiryReminderHandler struct {
service *packageexpiryapp.ReminderService
logger *zap.Logger
}
// NewPackageExpiryReminderHandler 创建套餐临期提醒任务处理器。
// NewPackageExpiryReminderHandler 创建每日套餐临期提醒扫描任务处理器。
func NewPackageExpiryReminderHandler(service *packageexpiryapp.ReminderService, logger *zap.Logger) *PackageExpiryReminderHandler {
return &PackageExpiryReminderHandler{service: service, logger: logger}
}
// Handle 扫描 15、7、3 天节点并发布个人客户站内通知。
// Handle 扫描 0 至 15 天临期资产并发布站内通知。
func (h *PackageExpiryReminderHandler) Handle(ctx context.Context, _ *asynq.Task) error {
h.logger.Info("开始执行套餐临期节点提醒")
h.logger.Info("开始执行每日套餐临期提醒扫描")
if err := h.service.Run(ctx); err != nil {
h.logger.Error("套餐临期节点提醒失败", zap.Error(err))
h.logger.Error("每日套餐临期提醒扫描失败", zap.Error(err))
return err
}
return nil