package facade import ( "eta/eta_mini_ht_api/api" logger "eta/eta_mini_ht_api/common/component/log" "eta/eta_mini_ht_api/common/exception" permissionService "eta/eta_mini_ht_api/domian/config" userService "eta/eta_mini_ht_api/domian/user" "eta/eta_mini_ht_api/service/product" "eta/eta_mini_ht_api/service/user" "fmt" "strconv" "strings" ) var ( htApi = api.GetInstance() ) const ( RiskUnTest = 432 RiskNotMatch = 433 RiskExpired = 434 ) func SyncRiskInfo(mobile string) (info string, err error) { return "", nil } func CheckUserRiskLevel(templateUserId int, productId int, officialUser userService.OfficialUserDTO) (code int, err error) { //是否完成风测 //风测是否过期 //风测等级是否符合 if productId <= 0 { logger.Error("产品id异常:%v", productId) code = 200 err = exception.New(exception.IllegalProductId) return } if templateUserId <= 0 { logger.Error("用户id异常:%v", templateUserId) code = 200 err = exception.New(exception.IllegalTemplateUserId) return } productInfo, err := product.GetProductInfoById(productId) if err != nil { logger.Error("获取产品信息失败:%v", err) code = 200 err = exception.New(exception.ProductInfoError) return } userInfo, userErr := user.GetUserProfile(templateUserId) if userErr != nil { logger.Error("获取临时用户信息失败:%v,userId:%v", userErr, templateUserId) } customerInfo, err := htApi.GetCustomerRiskLevelInfo(api.ClientSuitInfoReq{ ClientName: officialUser.RealName, IdKind: officialUser.IdKind, IdNo: officialUser.IdNo, }) if err != nil { logger.Error("api获取客户风险信息失败:%v", err) if userInfo.RiskLevelStatus == user.RiskUnTest { logger.Error("客户风险等级未测试,mobile:%v", userInfo.Mobile) code = RiskUnTest err = exception.New(exception.RiskUnTestError) return } if userInfo.RiskLevelStatus == user.RiskExpired { logger.Error("客户风险等级已过期,mobile:%v", userInfo.Mobile) code = RiskExpired err = exception.New(exception.RiskExpiredError) return } mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userInfo.RiskLevel) if mappingErr != nil { logger.Error("查询产品风险等级映射失败:%v", mappingErr) code = 200 err = exception.New(exception.QueryRiskMappingError) return } return compareRisk(mapping.ProductRiskLevel, productInfo.RiskLevel) } var mapping permissionService.CustomerProductRiskMappingDTO var mappingErr error if customerInfo.RiskInfo.CorpRiskLevel == "" { mapping, mappingErr = permissionService.GetRiskMappingByCustomerRiskLevel(userInfo.RiskLevel) } else { mapping, mappingErr = permissionService.GetRiskMappingByCustomerRiskLevel(customerInfo.RiskInfo.CorpRiskLevel) } if mappingErr != nil { logger.Error("查询产品风险等级映射失败:%v", mappingErr) code = 200 err = exception.NewWithException(exception.QueryRiskMappingError, err.Error()) return } return compareRisk(mapping.ProductRiskLevel, productInfo.RiskLevel) } func parseRiskLevel(level string) (int, error) { parts := strings.Split(level, "R") if len(parts) < 2 { return 0, fmt.Errorf("无效的风险等级: %s", level) } numberStr := parts[1] number, err := strconv.Atoi(numberStr) if err != nil { return 0, fmt.Errorf("无法将风险等级转换为数字: %s", err) } return number, nil } func compareRisk(cusPdRisk string, pdRisk string) (code int, err error) { riskLevelNum, err := parseRiskLevel(cusPdRisk) if err != nil { logger.Error("客户风险等级映射风险等级解析失败:%v,risk:%v", err, cusPdRisk) code = 200 err = exception.New(exception.QueryRiskMappingError) return } pRiskNum, riskErr := parseRiskLevel(pdRisk) if riskErr != nil { logger.Error("产品风险等级解析失败:risk:%v", pdRisk) code = 200 err = exception.New(exception.QueryRiskMappingError) return } if pRiskNum > riskLevelNum { code = RiskNotMatch err = exception.New(exception.RiskUnMatchError) return } return } func GetRiskTestToken(templateUserId int, mobile string) (token string, err error) { officalUser, err := user.GetUserByTemplateUserId(templateUserId) if err != nil { logger.Error("获取用户信息失败:%v", err) token, err = htApi.EnCodeData(api.CustomerRiskReq{ MobileTel: mobile, LoginType: "1", }) } else { token, err = htApi.EnCodeData(api.CustomerRiskReq{ MobileTel: mobile, LoginType: "1", IdNo: officalUser.IdNo, ClientName: officalUser.RealName, IdKind: officalUser.IdKind, }) } if err != nil { err = exception.NewWithException(exception.GenerateRiskTestTokenFailed, err.Error()) } return }