feat: 不轮询清单与批量开关轮询
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m35s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m35s
- 新增不轮询清单 tb_card_polling_pause(迁移 000256 补写存量),所有改 enable_polling 的入口同事务写清单 - 卡、设备勾选批量开关轮询(单次 500,逐项结果,开启跳过风险停机与已销户)与 CSV 文件导入 - 订单套餐生效、改有效期后自动恢复轮询并按规则评估复机 - 不轮询清单查询与导出;卡、设备列表与导出增加是否轮询 - 失败告警停机被拒视图、导出与批量关闭轮询;开关轮询影响说明 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
138
internal/handler/admin/polling_pause.go
Normal file
138
internal/handler/admin/polling_pause.go
Normal file
@@ -0,0 +1,138 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user