Files
junhong_cmp_fiber/internal/handler/admin/polling_pause.go
邹进 7ddb9312e3
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m35s
feat: 不轮询清单与批量开关轮询
- 新增不轮询清单 tb_card_polling_pause(迁移 000256 补写存量),所有改 enable_polling 的入口同事务写清单
- 卡、设备勾选批量开关轮询(单次 500,逐项结果,开启跳过风险停机与已销户)与 CSV 文件导入
- 订单套餐生效、改有效期后自动恢复轮询并按规则评估复机
- 不轮询清单查询与导出;卡、设备列表与导出增加是否轮询
- 失败告警停机被拒视图、导出与批量关闭轮询;开关轮询影响说明

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 03:07:20 +09:00

139 lines
4.8 KiB
Go

package admin
import (
"github.com/go-playground/validator/v10"
"github.com/gofiber/fiber/v2"
"github.com/break/junhong_cmp_fiber/internal/model/dto"
pollingSvc "github.com/break/junhong_cmp_fiber/internal/service/polling"
"github.com/break/junhong_cmp_fiber/pkg/constants"
"github.com/break/junhong_cmp_fiber/pkg/errors"
"github.com/break/junhong_cmp_fiber/pkg/response"
)
// PollingPauseHandler 批量开关轮询、不轮询清单、轮询开关文件导入与告警页关闭轮询。
type PollingPauseHandler struct {
polling *pollingSvc.AssetPollingService
imports *pollingSvc.PollingStatusImportService
validator *validator.Validate
}
// NewPollingPauseHandler 创建不轮询清单 Handler。
func NewPollingPauseHandler(polling *pollingSvc.AssetPollingService, imports *pollingSvc.PollingStatusImportService, validator *validator.Validate) *PollingPauseHandler {
return &PollingPauseHandler{polling: polling, imports: imports, validator: validator}
}
func (h *PollingPauseHandler) validate(prefix string, req any) error {
if err := h.validator.Struct(req); err != nil {
return errors.New(errors.CodeInvalidParam, validationMessage(prefix, req, err))
}
return nil
}
func (h *PollingPauseHandler) batch(c *fiber.Ctx, assetType string) error {
var req dto.BatchUpdatePollingStatusRequest
if err := c.BodyParser(&req); err != nil {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
if err := h.validate("批量开关轮询参数不合法", &req); err != nil {
return err
}
result, err := h.polling.BatchUpdatePollingStatus(c.UserContext(), assetType, &req)
if err != nil {
return err
}
return response.Success(c, result)
}
// BatchCards 勾选批量开关卡轮询。POST /api/admin/iot-cards/batch-update-polling-status
func (h *PollingPauseHandler) BatchCards(c *fiber.Ctx) error {
return h.batch(c, constants.AssetTypeIotCard)
}
// BatchDevices 勾选批量开关设备轮询。POST /api/admin/devices/batch-update-polling-status
func (h *PollingPauseHandler) BatchDevices(c *fiber.Ctx) error {
return h.batch(c, constants.AssetTypeDevice)
}
// Impact 开关轮询影响说明。GET /api/admin/polling-status/impact
func (h *PollingPauseHandler) Impact(c *fiber.Ctx) error {
return response.Success(c, h.polling.Impact())
}
// ListPauses 查询不轮询清单。GET /api/admin/card-polling-pauses
func (h *PollingPauseHandler) ListPauses(c *fiber.Ctx) error {
var req dto.CardPollingPauseListRequest
if err := c.QueryParser(&req); err != nil {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
if err := h.validate("不轮询清单查询参数不合法", &req); err != nil {
return err
}
result, err := h.polling.ListPauses(c.UserContext(), &req)
if err != nil {
return err
}
return response.Success(c, result)
}
// CreateImport 创建轮询开关文件导入任务。POST /api/admin/polling-status-imports
func (h *PollingPauseHandler) CreateImport(c *fiber.Ctx) error {
var req dto.CreatePollingStatusImportRequest
if err := c.BodyParser(&req); err != nil {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
if err := h.validate("轮询开关导入参数不合法", &req); err != nil {
return err
}
result, err := h.imports.CreateImport(c.UserContext(), &req)
if err != nil {
return err
}
return response.Success(c, result)
}
// ListImports 查询轮询开关导入任务。GET /api/admin/polling-status-imports
func (h *PollingPauseHandler) ListImports(c *fiber.Ctx) error {
var req dto.PollingStatusImportListRequest
if err := c.QueryParser(&req); err != nil {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
if err := h.validate("轮询开关导入任务查询参数不合法", &req); err != nil {
return err
}
result, err := h.imports.ListImports(c.UserContext(), &req)
if err != nil {
return err
}
return response.Success(c, result)
}
// GetImport 查询轮询开关导入任务详情。GET /api/admin/polling-status-imports/:id
func (h *PollingPauseHandler) GetImport(c *fiber.Ctx) error {
id, err := rateLimitPathID(c, "id", "导入任务 ID")
if err != nil {
return err
}
result, err := h.imports.GetImport(c.UserContext(), id)
if err != nil {
return err
}
return response.Success(c, result)
}
// ClosePollingByAlerts 告警页勾选批量关闭轮询。POST /api/admin/polling-failure-alerts/close-polling
func (h *PollingPauseHandler) ClosePollingByAlerts(c *fiber.Ctx) error {
var req dto.ClosePollingByAlertsRequest
if err := c.BodyParser(&req); err != nil {
return errors.New(errors.CodeInvalidParam, "请求参数解析失败")
}
if err := h.validate("告警批量关闭轮询参数不合法", &req); err != nil {
return err
}
result, err := h.polling.ClosePollingByAlerts(c.UserContext(), &req)
if err != nil {
return err
}
return response.Success(c, result)
}