package nuoer import ( "errors" "fmt" ) // 平台层 code 返回码(见文档2) const ( CodeSuccess = 0 // 成功 CodeResponseError = -1 // 响应异常 ) // 业务层 busiCode 返回码(见文档2) const ( BusiCodeSuccess = 10 // 查询成功【计费】 BusiCodeNotFound = 1000 // 数据未查得 BusiCodeInsufficientFund = 1001 // 账户余额不足 BusiCodeAccountNotFound = 1002 // 账户信息不存在 BusiCodeAppIDError = 1003 // appId异常 BusiCodeProductError = 1004 // 产品编号异常 BusiCodeAccountError = 1005 // 账号信息异常 BusiCodeOverdraftLimit = 1006 // 透支余额已达上限 BusiCodeDataRequestError = 1007 // 数据请求异常 BusiCodeServiceNotOpen = 1009 // 服务尚未开通 ) var ( ErrDatasource = errors.New("数据源异常") ErrSystem = errors.New("系统异常") ErrNotFound = errors.New("查询为空") ) // platformCodeDesc 平台层 code -> 描述 var platformCodeDesc = map[int]string{ CodeSuccess: "成功", CodeResponseError: "响应异常", } // busiCodeDesc 业务层 busiCode -> 描述 var busiCodeDesc = map[int]string{ BusiCodeSuccess: "查询成功【计费】", BusiCodeNotFound: "数据未查得", BusiCodeInsufficientFund: "账户余额不足", BusiCodeAccountNotFound: "账户信息不存在", BusiCodeAppIDError: "appId异常", BusiCodeProductError: "产品编号异常", BusiCodeAccountError: "账号信息异常", BusiCodeOverdraftLimit: "透支余额已达上限", BusiCodeDataRequestError: "数据请求异常", BusiCodeServiceNotOpen: "服务尚未开通", } // GetPlatformCodeDesc 根据平台 code 获取描述 func GetPlatformCodeDesc(code int) string { if desc, ok := platformCodeDesc[code]; ok { return desc } return "" } // GetBusiCodeDesc 根据 busiCode 获取描述 func GetBusiCodeDesc(busiCode int) string { if desc, ok := busiCodeDesc[busiCode]; ok { return desc } return "" } // nuoerError 诺尔智汇平台层错误(响应 code 字段) type nuoerError struct { Code int Message string } func (e *nuoerError) Error() string { return fmt.Sprintf("诺尔智汇返回错误,code: %d,msg: %s", e.Code, e.Message) } // NewNuoerError 创建平台层错误 func NewNuoerError(code int, message string) *nuoerError { if message == "" { if desc := GetPlatformCodeDesc(code); desc != "" { message = desc } else { message = "诺尔智汇返回未知错误" } } return &nuoerError{Code: code, Message: message} } // nuoerBusiError 诺尔智汇业务层错误(data.busiCode 字段) type nuoerBusiError struct { BusiCode int BusiMsg string } func (e *nuoerBusiError) Error() string { return fmt.Sprintf("诺尔智汇业务错误,busiCode: %d,busiMsg: %s", e.BusiCode, e.BusiMsg) } // NewNuoerBusiError 创建业务层错误 func NewNuoerBusiError(busiCode int, busiMsg string) *nuoerBusiError { if busiMsg == "" { if desc := GetBusiCodeDesc(busiCode); desc != "" { busiMsg = desc } else { busiMsg = "诺尔智汇业务返回未知错误" } } return &nuoerBusiError{BusiCode: busiCode, BusiMsg: busiMsg} } // GetNotFoundErrByBusiCode 将 busiCode 映射为「查询为空」类错误(不扣费场景) func GetNotFoundErrByBusiCode(busiCode int) error { switch busiCode { case BusiCodeNotFound: return ErrNotFound default: return nil } } // GetErrByBusiCode 将 busiCode 映射为内部哨兵错误,供处理器 errors.Is 判断 func GetErrByBusiCode(busiCode int) error { if busiCode == BusiCodeSuccess { return nil } if notFound := GetNotFoundErrByBusiCode(busiCode); notFound != nil { return notFound } return ErrDatasource } // GetErrByPlatformCode 将平台 code 映射为内部哨兵错误 func GetErrByPlatformCode(code int) error { if code == CodeSuccess { return nil } return ErrDatasource }