package dto import "time" // NotificationUnreadCountResponse 是后台账号未读数投影。 type NotificationUnreadCountResponse struct { Count int64 `json:"count" description:"未读通知数量"` DisplayCount string `json:"display_count" description:"徽标显示文本,超过 99 时为 99+"` } // NotificationListRequest 是后台通知基础分页参数。 type NotificationListRequest struct { Category string `json:"category" query:"category" validate:"omitempty,oneof=approval expiry sync system" enums:"approval,expiry,sync,system" description:"通知类别 (approval:审批, expiry:临期, sync:同步, system:系统)"` Type string `json:"type" query:"type" validate:"omitempty,max=100" maxlength:"100" description:"稳定通知类型"` Severity string `json:"severity" query:"severity" validate:"omitempty,oneof=info warning error critical" enums:"info,warning,error,critical" description:"通知级别 (info:提示, warning:警告, error:错误, critical:严重)"` IsRead *bool `json:"is_read" query:"is_read" description:"已读状态;不传时查询全部"` Page int `json:"page" query:"page" validate:"omitempty,min=1,max=10000" minimum:"1" maximum:"10000" description:"页码,默认 1,最大 10000"` PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=50" minimum:"1" maximum:"50" description:"每页数量,默认 20,最大 50"` } // NotificationItem 是后台账号可见的站内通知投影。 type NotificationItem struct { ID uint `json:"id" description:"通知ID"` Category string `json:"category" description:"通知类别 (approval:审批, expiry:临期, sync:同步, system:系统)"` Type string `json:"type" description:"稳定通知类型"` Severity string `json:"severity" description:"通知级别 (info:提示, warning:警告, error:错误, critical:严重)"` Title string `json:"title" description:"纯文本标题"` Body string `json:"body" description:"纯文本正文"` RefType string `json:"ref_type" description:"受控资源类型;可能为空。可选值及含义:system_config:系统配置, integration_log:外部集成日志, package:套餐, asset:C端资产, refund:退款, agent_recharge:代理充值, wecom_approval:企微审批, iot_card:物联网卡, device:设备, expiring_asset:临期资产列表, shop_fund:店铺资金概况, card_sync:卡同步记录。后台点击通知应调用目标解析接口,不得直接拼接路由"` RefID string `json:"ref_id" description:"受控资源数字ID的十进制字符串;可能为空。refund、agent_recharge、wecom_approval、iot_card、device、expiring_asset、shop_fund、asset 等类型使用;仅用于资源定位,不是前端URL"` RefKey string `json:"ref_key" description:"受控资源稳定Key或展示快照;可能为空。system_config 为配置Key,integration_log/card_sync 为集成标识,asset 为资产标识快照;仅用于定位或展示,不是前端URL"` IsRead bool `json:"is_read" description:"是否已读"` ReadAt *time.Time `json:"read_at,omitempty" description:"首次已读时间(ISO 8601)"` CreatedAt time.Time `json:"created_at" description:"创建时间(ISO 8601)"` } // NotificationListResponse 是后台通知基础分页结果。 type NotificationListResponse struct { Items []NotificationItem `json:"items" description:"通知列表"` Total int64 `json:"total" description:"总数量"` Page int `json:"page" description:"页码"` Size int `json:"size" description:"每页数量"` } // NotificationIDParams 是单条通知路径参数。 type NotificationIDParams struct { ID uint `json:"id" path:"id" required:"true" description:"通知ID"` } // NotificationReadResponse 是单条通知幂等已读结果。 type NotificationReadResponse struct { Success bool `json:"success" description:"请求是否成功;通知不存在、属于别人或已经已读也返回 true"` } // NotificationTargetResponse 是通知受控目标解析结果,不包含任意 URL。 type NotificationTargetResponse struct { TargetType string `json:"target_type" description:"前端白名单目标类型;空表示不支持跳转。可选值:refund_detail、agent_recharge_detail、wecom_approval_detail、iot_card_detail、device_detail、expiring_asset_list、shop_fund_summary、integration_log、system_config"` TargetID *uint `json:"target_id,omitempty" description:"ID型目标的业务主键;前端按 target_type 映射受控页面,不得自行拼接任意URL"` TargetKey string `json:"target_key,omitempty" description:"Key型目标的稳定定位值;仅用于 integration_log 或 system_config 等白名单目标"` Available bool `json:"available" description:"当前账号是否仍可访问目标;false 时只展示通知正文,不执行跳转"` } // NotificationUnreadSummaryResponse 是后台账号未读通知的固定分类汇总。 type NotificationUnreadSummaryResponse struct { Total int64 `json:"total" description:"未读通知总数"` Approval int64 `json:"approval" description:"审批类未读数量"` Expiry int64 `json:"expiry" description:"临期类未读数量"` Sync int64 `json:"sync" description:"同步类未读数量"` System int64 `json:"system" description:"系统类未读数量"` } // NotificationReadAllRequest 是后台批量已读请求。 type NotificationReadAllRequest struct { Category string `json:"category" validate:"omitempty,oneof=approval expiry sync system" enums:"approval,expiry,sync,system" description:"可选通知类别 (approval:审批, expiry:临期, sync:同步, system:系统)"` } // NotificationReadAllResponse 是后台批量已读结果。 type NotificationReadAllResponse struct { UpdatedCount int64 `json:"updated_count" description:"本次实际更新的通知数量"` } // PersonalNotificationListRequest 是个人客户通知的简化分页参数。 type PersonalNotificationListRequest struct { IsRead *bool `json:"is_read" query:"is_read" description:"已读状态;false 仅查询未读,true 仅查询已读,不传时查询全部"` Page int `json:"page" query:"page" validate:"omitempty,min=1,max=10000" minimum:"1" maximum:"10000" description:"页码,默认 1,最大 10000"` PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=50" minimum:"1" maximum:"50" description:"每页数量,默认 20,最大 50"` } // PersonalNotificationListResponse 是个人客户通知的简化分页结果。 type PersonalNotificationListResponse struct { Items []NotificationItem `json:"items" description:"当前个人客户可见的业务通知列表"` Total int64 `json:"total" description:"总数量"` Page int `json:"page" description:"页码"` Size int `json:"size" description:"每页数量"` }