package model import ( "context" "strings" "github.com/gogf/gf/v2/errors/gerror" ) const ( TSimChannelsTestInputModeComplete = "complete" TSimChannelsTestInputModeSingle = "single" TSimChannelsTestInputModeDirectSingle = "direct_single" ) type TSimChannelsTestParam struct { ChannelId int64 `json:"channelId" v:"required#通道ID不能为空" dc:"通道ID"` InputMode string `json:"inputMode" dc:"输入模式:complete/single"` CardValueType string `json:"cardValueType" dc:"卡值类型:iccid/msisdn/imsi"` CardValue string `json:"cardValue" dc:"卡值"` Iccid string `json:"iccid" dc:"ICCID"` Imsi string `json:"imsi" dc:"IMSI"` Msisdn string `json:"msisdn" dc:"MSISDN"` Items []string `json:"items" dc:"待测试接口;为空时测试全部"` } func (in *TSimChannelsTestParam) Filter(ctx context.Context) error { in.InputMode = strings.ToLower(strings.TrimSpace(in.InputMode)) if in.InputMode == "" { in.InputMode = TSimChannelsTestInputModeComplete } in.CardValueType = strings.ToLower(strings.TrimSpace(in.CardValueType)) in.CardValue = strings.TrimSpace(in.CardValue) in.Iccid = strings.TrimSpace(in.Iccid) in.Imsi = strings.TrimSpace(in.Imsi) in.Msisdn = strings.TrimSpace(in.Msisdn) items, err := NormalizeTSimChannelTestItems(in.Items) if err != nil { return err } in.Items = items switch in.InputMode { case TSimChannelsTestInputModeComplete: if in.Iccid == "" || in.Imsi == "" || in.Msisdn == "" { return gerror.New("完整三码模式下ICCID、IMSI、MSISDN均不能为空") } if in.CardValue != "" || in.CardValueType != "" { return gerror.New("完整三码模式下不需要填写单码查询参数") } case TSimChannelsTestInputModeSingle: if in.CardValue == "" || in.CardValueType == "" { return gerror.New("单码补全模式下卡值类型和卡值不能为空") } if in.Iccid != "" || in.Imsi != "" || in.Msisdn != "" { return gerror.New("单码补全模式下不需要填写完整三码") } switch in.CardValueType { case "iccid", "imsi", "msisdn": default: return gerror.New("单码补全模式下卡值类型只能是iccid、imsi或msisdn") } case TSimChannelsTestInputModeDirectSingle: if in.CardValue == "" || in.CardValueType == "" { return gerror.New("direct single mode requires card value type and value") } if in.Iccid != "" || in.Imsi != "" || in.Msisdn != "" { return gerror.New("direct single mode does not accept complete card identifiers") } switch in.CardValueType { case "iccid", "imsi", "msisdn": default: return gerror.New("direct single mode card value type must be iccid, imsi, or msisdn") } default: return gerror.New("不支持的输入模式") } return nil } type TSimChannelsTestOutput struct { Items []*TSimChannelsTestItem `json:"items" dc:"测试结果"` GatewayResponseRaw string `json:"gatewayResponseRaw,omitempty" dc:"网关原始响应"` } // TSimChannelsTestError adds diagnostic response data without replacing the original error. type TSimChannelsTestError struct { Err error GatewayResponseRaw string } func (e *TSimChannelsTestError) Error() string { return e.Err.Error() } func (e *TSimChannelsTestError) Unwrap() error { return e.Err } type TSimChannelsTestItem struct { Key string `json:"key" dc:"查询项标识"` Name string `json:"name" dc:"查询项名称"` Status string `json:"status" dc:"状态:success/failed/timeout"` DurationMs int64 `json:"durationMs" dc:"耗时(毫秒)"` Message string `json:"message,omitempty" dc:"结果消息"` Data any `json:"data,omitempty" dc:"标准化响应数据"` ErrorCode int `json:"errorCode,omitempty" dc:"gateway or carrier error code"` ResponseJSON string `json:"responseJson,omitempty" dc:"本次通道测试响应 JSON"` } var tSimChannelTestItemKeys = map[string]struct{}{ "simBasicInfo": {}, "simSession": {}, "simStatus": {}, "simStopReason": {}, "simFrozenState": {}, "simCardBindStatus": {}, "simDeviceStatus": {}, "simRegionLimitStatus": {}, "simImei": {}, "simDataUsage": {}, "simDataUsageMonthly": {}, "simDataUsageDaily": {}, "simApnInfo": {}, } func NormalizeTSimChannelTestItems(items []string) ([]string, error) { if len(items) == 0 { return nil, nil } seen := make(map[string]struct{}, len(items)) normalized := make([]string, 0, len(items)) for _, item := range items { item = strings.TrimSpace(item) if _, ok := tSimChannelTestItemKeys[item]; !ok { return nil, gerror.Newf("不支持的测试项:%s", item) } if _, ok := seen[item]; ok { continue } seen[item] = struct{}{} normalized = append(normalized, item) } return normalized, nil }