This commit is contained in:
@@ -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, "套餐临期提醒用例未配置")
|
||||
|
||||
@@ -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: "每日临期提醒扫描任务已提交",
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user