ht_account_service.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package facade
  2. import (
  3. "eta/eta_mini_ht_api/api"
  4. logger "eta/eta_mini_ht_api/common/component/log"
  5. "eta/eta_mini_ht_api/common/exception"
  6. permissionService "eta/eta_mini_ht_api/domian/config"
  7. "eta/eta_mini_ht_api/service/product"
  8. "eta/eta_mini_ht_api/service/user"
  9. "fmt"
  10. "strconv"
  11. "strings"
  12. )
  13. var (
  14. htApi = api.GetInstance()
  15. )
  16. const (
  17. RiskUnTest = 432
  18. RiskNotMatch = 433
  19. RiskExpired = 434
  20. )
  21. func SyncRiskInfo(mobile string) (info string, err error) {
  22. return "", nil
  23. }
  24. func CheckUserRiskLevel(templateUserId int, productId int) (code int, err error) {
  25. //是否完成风测
  26. //风测是否过期
  27. //风测等级是否符合
  28. if productId <= 0 {
  29. logger.Error("产品id异常:%v", productId)
  30. code = 200
  31. err = exception.New(exception.IllegalProductId)
  32. return
  33. }
  34. if templateUserId <= 0 {
  35. logger.Error("用户id异常:%v", templateUserId)
  36. code = 200
  37. err = exception.New(exception.IllegalTemplateUserId)
  38. return
  39. }
  40. product, err := product.GetProductInfoById(productId)
  41. if err != nil {
  42. logger.Error("获取产品信息失败:%v", err)
  43. code = 200
  44. err = exception.New(exception.ProductInfoError)
  45. return
  46. }
  47. userInfo, userErr := user.GetUserProfile(templateUserId)
  48. if userErr != nil {
  49. logger.Error("获取临时用户信息失败:%v,userId:%v", userErr, templateUserId)
  50. }
  51. officialUser, err := user.GetUserByTemplateUserId(templateUserId)
  52. if err != nil {
  53. if userErr != nil {
  54. logger.Error("获取正式用户信息失败:%v,templateUserId:%v", userErr, templateUserId)
  55. code = 200
  56. err = exception.New(exception.OfficialUserFoundError)
  57. return
  58. }
  59. }
  60. customerInfo, err := htApi.GetCustomerRiskLevelInfo(api.ClientSuitInfoReq{
  61. ClientName: officialUser.RealName,
  62. IdKind: officialUser.IdKind,
  63. IdNo: officialUser.IdNo,
  64. })
  65. if err != nil {
  66. logger.Error("api获取客户风险信息失败:%v", err)
  67. if userInfo.RiskLevelStatus == user.RiskUnTest {
  68. logger.Error("客户风险等级未测试,mobile:%v", userInfo.Mobile)
  69. code = RiskUnTest
  70. err = exception.New(exception.RiskUnTestError)
  71. return
  72. }
  73. if userInfo.RiskLevelStatus == user.RiskExpired {
  74. logger.Error("客户风险等级已过期,mobile:%v", userInfo.Mobile)
  75. code = RiskExpired
  76. err = exception.New(exception.RiskExpiredError)
  77. return
  78. }
  79. mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userInfo.RiskLevel)
  80. if mappingErr != nil {
  81. logger.Error("查询产品风险等级映射失败:%v", mappingErr)
  82. code = 200
  83. err = exception.New(exception.QueryRiskMappingError)
  84. return
  85. }
  86. return compareRisk(mapping.ProductRiskLevel, product.RiskLevel)
  87. }
  88. mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(customerInfo.RiskInfo.CorpRiskLevel)
  89. if mappingErr != nil {
  90. logger.Error("查询产品风险等级映射失败:%v", mappingErr)
  91. code = 200
  92. err = exception.New(exception.IllegalProductId)
  93. return
  94. }
  95. return compareRisk(mapping.ProductRiskLevel, product.RiskLevel)
  96. }
  97. func parseRiskLevel(level string) (int, error) {
  98. parts := strings.Split(level, "R")
  99. if len(parts) < 2 {
  100. return 0, fmt.Errorf("无效的风险等级: %s", level)
  101. }
  102. numberStr := parts[1]
  103. number, err := strconv.Atoi(numberStr)
  104. if err != nil {
  105. return 0, fmt.Errorf("无法将风险等级转换为数字: %s", err)
  106. }
  107. return number, nil
  108. }
  109. func compareRisk(cusPdRisk string, pdRisk string) (code int, err error) {
  110. riskLevelNum, err := parseRiskLevel(cusPdRisk)
  111. if err != nil {
  112. logger.Error("客户风险等级映射风险等级解析失败:%v,risk:%v", err, cusPdRisk)
  113. code = 200
  114. err = exception.New(exception.QueryRiskMappingError)
  115. return
  116. }
  117. pRiskNum, riskErr := parseRiskLevel(pdRisk)
  118. if riskErr != nil {
  119. logger.Error("产品风险等级解析失败:risk:%v", pdRisk)
  120. code = 200
  121. err = exception.New(exception.QueryRiskMappingError)
  122. return
  123. }
  124. if pRiskNum > riskLevelNum {
  125. code = RiskNotMatch
  126. err = exception.New(exception.RiskUnMatchError)
  127. return
  128. }
  129. return
  130. }