Files
junhong_cmp_fiber/internal/model/dto/polling_pause_dto.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

155 lines
11 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package dto
import "time"
// BatchUpdatePollingStatusRequest 勾选批量开关轮询请求(卡或设备)。
type BatchUpdatePollingStatusRequest struct {
AssetIDs []uint `json:"asset_ids" validate:"required,min=1,max=500,dive,gt=0" minItems:"1" maxItems:"500" description:"资产ID列表(卡ID或设备ID),单次最多500个,不能重复"`
EnablePolling *bool `json:"enable_polling" validate:"required" description:"目标状态 (true:开启轮询, false:关闭轮询)"`
Reason string `json:"reason" validate:"required,max=500" maxLength:"500" description:"原因,写入不轮询清单"`
}
// PollingToggleItem 批量开关轮询逐项结果。
type PollingToggleItem struct {
AssetID uint `json:"asset_id" description:"资产ID"`
Identifier string `json:"identifier" description:"资产标识(卡为 ICCID,设备为 IMEI 或虚拟号)"`
Status int `json:"status" description:"结果 (1:成功, 2:跳过, 3:失败, 4:无权限或资产不存在)"`
StatusName string `json:"status_name" description:"结果名称"`
Reason string `json:"reason" description:"跳过或失败原因"`
}
// BatchUpdatePollingStatusResponse 批量开关轮询结果。
type BatchUpdatePollingStatusResponse struct {
SuccessCount int `json:"success_count" description:"成功数"`
SkipCount int `json:"skip_count" description:"跳过数(已是目标状态、风险停机或已销户不能开启)"`
FailCount int `json:"fail_count" description:"失败数(含无权限或资产不存在)"`
Items []PollingToggleItem `json:"items" description:"逐项结果"`
Impact []string `json:"impact" description:"本次目标状态的影响说明"`
}
// PollingToggleImpactResponse 开关轮询影响说明(供前端确认框展示)。
type PollingToggleImpactResponse struct {
Disable []string `json:"disable" description:"关闭轮询的影响"`
Enable []string `json:"enable" description:"开启轮询的影响"`
}
// CardPollingPauseListRequest 不轮询清单查询请求。
type CardPollingPauseListRequest struct {
Page int `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码"`
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页数量"`
AssetType string `json:"asset_type" query:"asset_type" validate:"omitempty,oneof=iot_card device" description:"资产类型 (iot_card:卡, device:设备)"`
CarrierID *uint `json:"carrier_id" query:"carrier_id" validate:"omitempty,min=1" description:"卡所属运营商账户ID"`
Source string `json:"source" query:"source" validate:"omitempty,oneof=single batch import risk_auto cascade order expiry_change alert history" description:"关闭来源 (single:单资产接口, batch:勾选批量, import:文件导入, risk_auto:风险停机或已销户自动关闭, cascade:设备级联, order:支付或下单生效, expiry_change:改有效期, alert:停机被拒告警处理, history:历史数据)"`
Status *int `json:"status" query:"status" validate:"omitempty,oneof=1 2" description:"状态 (1:已关闭, 2:已恢复)"`
Identifier string `json:"identifier" query:"identifier" validate:"omitempty,max=100" description:"ICCID 或 IMEI(精确)"`
OperatorID *uint `json:"operator_id" query:"operator_id" validate:"omitempty,min=1" description:"关闭操作人账号ID"`
StartTime string `json:"start_time" query:"start_time" description:"关闭时间起始(带时区的 RFC3339 秒级时间)"`
EndTime string `json:"end_time" query:"end_time" description:"关闭时间结束(带时区的 RFC3339 秒级时间)"`
}
// CardPollingPauseItem 不轮询清单记录。
type CardPollingPauseItem struct {
ID uint `json:"id" description:"记录ID"`
AssetType string `json:"asset_type" description:"资产类型 (iot_card:卡, device:设备)"`
AssetID uint `json:"asset_id" description:"资产ID"`
Identifier string `json:"identifier" description:"ICCID 或 IMEI"`
CarrierID uint `json:"carrier_id" description:"卡所属运营商账户ID(设备为 0)"`
CarrierName string `json:"carrier_name" description:"运营商账户名称"`
EnablePolling bool `json:"enable_polling" description:"资产当前轮询开关"`
GatewayExtend string `json:"gateway_extend" description:"卡当前网关扩展状态(设备为空)"`
Status int `json:"status" description:"状态 (1:已关闭, 2:已恢复)"`
StatusName string `json:"status_name" description:"状态名称"`
CloseSource string `json:"close_source" description:"关闭来源"`
CloseSourceName string `json:"close_source_name" description:"关闭来源名称"`
CloseReason string `json:"close_reason" description:"关闭原因"`
ClosedBy uint `json:"closed_by" description:"关闭操作人账号ID(系统为 0)"`
ClosedByName string `json:"closed_by_name" description:"关闭操作人"`
ClosedAt time.Time `json:"closed_at" description:"关闭时间"`
ImportTaskID uint `json:"import_task_id" description:"文件导入任务ID(非导入为 0)"`
RestoreSource string `json:"restore_source" description:"恢复来源"`
RestoreSourceName string `json:"restore_source_name" description:"恢复来源名称"`
RestoreReason string `json:"restore_reason" description:"恢复原因"`
RestoredBy uint `json:"restored_by" description:"恢复操作人账号ID(系统为 0)"`
RestoredByName string `json:"restored_by_name" description:"恢复操作人"`
RestoredAt *time.Time `json:"restored_at" description:"恢复时间"`
}
// CardPollingPausePageResult 不轮询清单分页结果。
type CardPollingPausePageResult struct {
Items []CardPollingPauseItem `json:"items" description:"清单记录"`
Total int64 `json:"total" description:"总数"`
Page int `json:"page" description:"当前页"`
PageSize int `json:"size" description:"每页数量"`
}
// CreatePollingStatusImportRequest 创建轮询开关文件导入任务请求。
type CreatePollingStatusImportRequest struct {
FileKey string `json:"file_key" validate:"required,max=500" maxLength:"500" description:"已上传的 CSV 文件 Key(必须以 polling-status-imports/ 开头);首列为 ICCID(卡)或 IMEI/虚拟号(设备),首行为表头"`
AssetType string `json:"asset_type" validate:"required,oneof=iot_card device" description:"资产类型 (iot_card:按 ICCID, device:按 IMEI 或虚拟号)"`
EnablePolling *bool `json:"enable_polling" validate:"required" description:"目标状态 (true:开启轮询, false:关闭轮询)"`
Reason string `json:"reason" validate:"required,max=500" maxLength:"500" description:"原因,写入不轮询清单"`
}
// PollingStatusImportListRequest 轮询开关导入任务列表请求。
type PollingStatusImportListRequest struct {
Page int `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码"`
PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页数量"`
Status *int `json:"status" query:"status" validate:"omitempty,oneof=1 2 3 4" description:"任务状态 (1:待处理, 2:处理中, 3:已完成, 4:失败)"`
}
// PollingStatusImportIDPath 导入任务路径参数。
type PollingStatusImportIDPath struct {
ID uint `json:"-" path:"id" required:"true" description:"导入任务ID"`
}
// PollingStatusImportTaskResponse 轮询开关导入任务。
type PollingStatusImportTaskResponse struct {
ID uint `json:"id" description:"任务ID"`
TaskNo string `json:"task_no" description:"任务编号"`
AssetType string `json:"asset_type" description:"资产类型 (iot_card:卡, device:设备)"`
EnablePolling bool `json:"enable_polling" description:"目标状态"`
Reason string `json:"reason" description:"原因"`
FileName string `json:"file_name" description:"文件名"`
Status int `json:"status" description:"任务状态 (1:待处理, 2:处理中, 3:已完成, 4:失败)"`
StatusName string `json:"status_name" description:"任务状态名称"`
TotalCount int `json:"total_count" description:"数据行数"`
SuccessCount int `json:"success_count" description:"成功行数"`
SkipCount int `json:"skip_count" description:"跳过行数"`
FailCount int `json:"fail_count" description:"失败行数"`
ErrorMessage string `json:"error_message" description:"任务级失败原因"`
CreatorName string `json:"creator_name" description:"创建人"`
CreatedAt time.Time `json:"created_at" description:"创建时间"`
StartedAt *time.Time `json:"started_at" description:"开始处理时间"`
CompletedAt *time.Time `json:"completed_at" description:"完成时间"`
}
// PollingStatusImportItemResponse 导入逐行结果。
type PollingStatusImportItemResponse struct {
Line int `json:"line" description:"行号(自数据首行起计)"`
Identifier string `json:"identifier" description:"ICCID 或 IMEI"`
AssetID uint `json:"asset_id" description:"资产ID(未找到为 0)"`
Status int `json:"status" description:"结果 (1:成功, 2:跳过, 3:失败, 4:无权限或资产不存在)"`
StatusName string `json:"status_name" description:"结果名称"`
Reason string `json:"reason" description:"跳过或失败原因"`
}
// PollingStatusImportTaskDetailResponse 导入任务详情(含逐行结果)。
type PollingStatusImportTaskDetailResponse struct {
PollingStatusImportTaskResponse
Items []PollingStatusImportItemResponse `json:"items" description:"逐行结果"`
}
// PollingStatusImportPageResult 导入任务分页结果。
type PollingStatusImportPageResult struct {
Items []PollingStatusImportTaskResponse `json:"items" description:"任务列表"`
Total int64 `json:"total" description:"总数"`
Page int `json:"page" description:"当前页"`
PageSize int `json:"size" description:"每页数量"`
}
// ClosePollingByAlertsRequest 告警页勾选批量关闭轮询请求。
type ClosePollingByAlertsRequest struct {
AlertIDs []uint `json:"alert_ids" validate:"required,min=1,max=500,dive,gt=0" minItems:"1" maxItems:"500" description:"告警ID列表,单次最多500个"`
Reason string `json:"reason" validate:"required,max=500" maxLength:"500" description:"原因,写入不轮询清单"`
}