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>
155 lines
11 KiB
Go
155 lines
11 KiB
Go
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:"原因,写入不轮询清单"`
|
||
}
|