Browse Source

风险等级报告列表

kobe6258 6 months ago
parent
commit
e7f35cc7ff

+ 6 - 3
common/exception/exc_enums.go

@@ -66,6 +66,8 @@ const (
 	ReadMessageFailed
 	BindMobileFailed
 	CheckFollowStatusByNamesFailed
+	RiskUnTestError
+	RiskExpiredError
 )
 
 // WechatErrCode 微信
@@ -99,9 +101,8 @@ const (
 
 // ErrorMap 用于存储错误码和错误信息的映射
 var ErrorMap = map[int]string{
-	UnknownError: "未知错误",
-	Unauthorized: "用户未授权",
-
+	UnknownError:          "未知错误",
+	Unauthorized:          "用户未授权",
 	IllegalCodeLength:     "无效的验证码位数设置",
 	IllegalPhoneNumber:    "无效的手机号码",
 	SMSCodeGenerateFailed: "生成手机验证码失败",
@@ -140,6 +141,8 @@ var ErrorMap = map[int]string{
 	IllegalAnalystId:                   "研究员Id非法",
 	CheckFollowStatusByNamesFailed:     "获取关注猪状态失败",
 	BatchFollowingAnalystFailed:        "批量关注研究员列表失败",
+	RiskUnTestError:                    "客户未做风险测评",
+	RiskExpiredError:                   "客户风险测评已过期",
 	//微信
 	WeChatServerError:    "微信服务器发生错误",
 	WechatUserInfoFailed: "获取微信用户信息失败",

+ 11 - 8
controllers/report/report_controller.go

@@ -68,6 +68,7 @@ func (r *ReportController) List(permissionIds string) {
 			PageSize: r.PageInfo.PageSize,
 		}
 		detailType := r.Data["detailType"].(string)
+		userInfo := r.Data["user"].(user.User)
 		permissionIdList, err := r.TransPermissionIds(permissionIds)
 		if err != nil {
 			logger.Error("品种列表解析错误:%v", err)
@@ -77,30 +78,32 @@ func (r *ReportController) List(permissionIds string) {
 		}
 		var reportOrgIds map[string][]int
 		if r.PageInfo.LatestId == 0 {
-			pageRes.Total, pageRes.LatestId, reportOrgIds = report.GetTotalPageCountByPermissionIds(permissionIdList)
+			pageRes.Total, pageRes.LatestId, reportOrgIds = report.GetTotalPageCountByPermissionIds(permissionIdList, isLogin(detailType), userInfo.Id)
+			if err != nil {
+				logger.Error("分页查询报告列表失败:%v", err)
+				r.FailedResult("分页查询报告列表失败", result)
+				return
+			}
 			r.PageInfo.LatestId = pageRes.LatestId
 		} else {
 			pageRes.LatestId = r.PageInfo.LatestId
 			pageRes.Total = r.PageInfo.Total
 		}
 		pageRes.TotalPage = page.TotalPages(pageRes.Total, pageRes.PageSize)
-		if len(permissionIdList) > 0 && len(reportOrgIds) == 0 {
-			logger.Info("没有搜索到相关品种的报告,返回空")
+		if len(reportOrgIds) == 0 {
+			logger.Info("没有搜索到相关品种的报告,返回空列表")
 			reports := new(page.PageResult)
 			reports.Data = []reportService.ReportDTO{}
 			reports.Page = pageRes
 			r.SuccessResult("查询报告列表成功", reports, result)
 			return
 		}
-		all := false
 		if len(permissionIdList) == 0 && len(reportOrgIds) > 0 {
 			err = exception.New(exception.UnknownError)
 			r.FailedResult("查询报告列表失败", result)
 		}
-		if len(permissionIdList) == 0 && len(reportOrgIds) == 0 {
-			all = true
-		}
-		list, err := report.GetReportPage(r.PageInfo, reportOrgIds, all, isLogin(detailType))
+
+		list, err := report.GetReportPage(r.PageInfo, reportOrgIds, false, isLogin(detailType))
 		if err != nil {
 			r.FailedResult("分页查询报告列表失败", result)
 			return

+ 37 - 0
domian/config/customer_product_risk_mapping.go

@@ -0,0 +1,37 @@
+package config
+
+import (
+	"errors"
+	logger "eta/eta_mini_ht_api/common/component/log"
+	mappingDao "eta/eta_mini_ht_api/models/config"
+	"gorm.io/gorm"
+)
+
+type CustomerProductRiskMappingDTO struct {
+	CustomerRiskLevel string
+	ProductRiskLevel  string
+}
+
+func GetRiskMappingByCustomerRiskLevel(customerRiskLevel string) (dto CustomerProductRiskMappingDTO, err error) {
+	if customerRiskLevel == "" {
+		err = errors.New("客户风险等级不能为空")
+		return
+	}
+	mapping, err := mappingDao.GetCustomerRiskMapping(customerRiskLevel)
+	if err != nil {
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			logger.Error("产品风险等级未配置")
+		} else {
+			logger.Error("查询产品风险等级配置失败")
+		}
+		return
+	}
+	dto = convertToDTO(mapping)
+	return
+}
+func convertToDTO(mapping mappingDao.CustomerProductRiskMapping) CustomerProductRiskMappingDTO {
+	return CustomerProductRiskMappingDTO{
+		CustomerRiskLevel: mapping.CustomerRisk,
+		ProductRiskLevel:  mapping.ProductRisk,
+	}
+}

+ 35 - 0
domian/config/permission_service.go

@@ -10,6 +10,7 @@ type PermissionDTO struct {
 	PermissionId   int    `json:"permissionId"`
 	PermissionName string `json:"permissionName"`
 	ParentId       int    `json:"parentId"`
+	RiskLevel      string `json:"riskLevel"`
 	Sort           int    `json:"sort"`
 }
 type PermissionNode struct {
@@ -34,6 +35,40 @@ func assemblePermissionNode(list []PermissionDTO, node *PermissionNode, current
 		}
 	}
 }
+
+func GetPermissionListWithRisk() (dtos []PermissionDTO, err error) {
+	permissions, err := permissionDao.GetPermissionListWithRisk()
+	if err != nil {
+		logger.Error("获取设置风险等级的品种列表失败:%v", err)
+	}
+	for _, permission := range permissions {
+		dtos = append(dtos, PermissionDTO{
+			PermissionId:   permission.PermissionId,
+			PermissionName: permission.Name,
+			ParentId:       permission.ParentId,
+			RiskLevel:      permission.RiskLevel,
+			Sort:           permission.Sort,
+		})
+	}
+	return
+}
+
+func GetPermissionListByIds(permissionIds []int) (dtos []PermissionDTO, err error) {
+	permissions, err := permissionDao.GetPermissionListByIds(permissionIds)
+	if err != nil {
+		logger.Error("通过ID查找品种列表失败:%v", err)
+	}
+	for _, permission := range permissions {
+		dtos = append(dtos, PermissionDTO{
+			PermissionId:   permission.PermissionId,
+			PermissionName: permission.Name,
+			ParentId:       permission.ParentId,
+			RiskLevel:      permission.RiskLevel,
+			Sort:           permission.Sort,
+		})
+	}
+	return
+}
 func GetPermissionList() (root *PermissionNode, err error) {
 	list, err := permissionDao.GetPermissionList()
 	if err != nil {

+ 30 - 0
models/config/customer_product_risk_mapping.go

@@ -0,0 +1,30 @@
+package config
+
+import (
+	"eta/eta_mini_ht_api/models"
+	"time"
+)
+
+const (
+	configColumn = "customer_risk,product_risk"
+)
+
+type CustomerProductRiskMapping struct {
+	Id           int       `gorm:"primaryKey;autoIncrement"`
+	CustomerRisk string    `gorm:"customer_risk"` // 客户风险
+	ProductRisk  string    `gorm:"product_risk"`  // 产品风险
+	Creator      string    `gorm:"creator"`       //创建人
+	Modifier     string    `gorm:"modifier"`      //修改人
+	IsDeleted    bool      `gorm:"is_deleted"`    // 是否删除
+	CreatedTime  time.Time `gorm:"created"`       // 创建时间
+	UpdatedTime  time.Time `gorm:"updated_time"`  // 更新时间
+}
+
+func (cp *CustomerProductRiskMapping) TableName() string {
+	return "customer_product_risk_mapping"
+}
+func GetCustomerRiskMapping(customerRisk string) (mapping CustomerProductRiskMapping, err error) {
+	db := models.Main()
+	err = db.Model(CustomerProductRiskMapping{}).Select(configColumn).Where("customer_risk=? and is_deleted= ?", customerRisk, false).First(&mapping).Error
+	return
+}

+ 10 - 0
models/config/permission.go

@@ -45,3 +45,13 @@ func GetPermissionList() (list []Permission, err error) {
 	err = db.Model(&Permission{}).Select(Columns).Order("parent_id asc").Order("sort asc").Find(&list).Error
 	return
 }
+func GetPermissionListByIds(permissionIds []int) (list []Permission, err error) {
+	db := models.Main()
+	err = db.Model(&Permission{}).Select(Columns).Where("permission_id in ? and (risk_level !='' ", permissionIds).Find(&list).Error
+	return
+}
+func GetPermissionListWithRisk() (list []Permission, err error) {
+	db := models.Main()
+	err = db.Model(&Permission{}).Select(Columns).Where("risk_level is NOT NULL and risk_level != '' ").Find(&list).Error
+	return
+}

+ 2 - 2
models/report/report.go

@@ -215,7 +215,7 @@ func GetMaxIdByPermissionIds(orgIds map[string][]int) (total int64, maxId int64,
 		return
 	}
 	if len(orgIds["HT"]) == 0 {
-		err = db.Model(&Report{}).Select("count(*)").Where("status = ?", StatusPublish).Where(" source='ETA' and org_id in ?", orgIds["ETA"]).Scan(&maxId).Error
+		err = db.Model(&Report{}).Select("count(*)").Where("status = ?", StatusPublish).Where(" source='ETA' and org_id in ?", orgIds["ETA"]).Scan(&total).Error
 		if err != nil {
 			logger.Error("获取报告最大ID失败:%v", err)
 			return
@@ -227,7 +227,7 @@ func GetMaxIdByPermissionIds(orgIds map[string][]int) (total int64, maxId int64,
 		}
 		return
 	}
-	err = db.Model(&Report{}).Select("count(*)").Where("status = ?", StatusPublish).Where(" source='ETA' and org_id in ?", orgIds["ETA"]).Or("source='HT' and org_id in ?", orgIds["HT"]).Scan(&maxId).Error
+	err = db.Model(&Report{}).Select("count(*)").Where("status = ?", StatusPublish).Where(" source='ETA' and org_id in ?", orgIds["ETA"]).Or("source='HT' and org_id in ?", orgIds["HT"]).Scan(&total).Error
 	if err != nil {
 		logger.Error("获取报告最大ID失败:%v", err)
 		return

+ 100 - 8
service/report/report_service.go

@@ -2,6 +2,7 @@ package report
 
 import (
 	"encoding/json"
+	"errors"
 	logger "eta/eta_mini_ht_api/common/component/log"
 	"eta/eta_mini_ht_api/common/exception"
 	"eta/eta_mini_ht_api/common/utils/date"
@@ -10,6 +11,11 @@ import (
 	mediaService "eta/eta_mini_ht_api/domian/media"
 	reportService "eta/eta_mini_ht_api/domian/report"
 	userService "eta/eta_mini_ht_api/domian/user"
+	user "eta/eta_mini_ht_api/service/user"
+	"fmt"
+	"gorm.io/gorm"
+	"strconv"
+	"strings"
 	"sync"
 	"time"
 )
@@ -124,18 +130,104 @@ func getHTReportDetail(report *reportService.ReportDTO) (url string, err error)
 func GetTotalPageCount() (total int64, latestId int64, err error) {
 	return reportService.GetTotalPageCount()
 }
-
-func GetTotalPageCountByPermissionIds(permissionIds []int) (total int64, latestId int64, ids map[string][]int) {
-	if len(permissionIds) == 0 {
-		var err error
-		total, latestId, err = GetTotalPageCount()
+func GetTotalPageCountByPermissionIds(permissionIds []int, isLogin bool, userId int) (total int64, latestId int64, ids map[string][]int) {
+	var err error
+	//登录了需要校验风险等级,如果风险等级没做或者过期直接返回空,做了就筛选风险等级
+	if isLogin {
+		userProfile, userErr := user.GetUserProfile(userId)
+		if userErr != nil {
+			if errors.Is(userErr, gorm.ErrRecordNotFound) {
+				err = exception.New(exception.TemplateUserNotFound)
+			} else {
+				err = exception.New(exception.TemplateUserFoundFailed)
+			}
+			logger.Error("分页查询报告列表失败:%v", err)
+			return
+		}
+		//获取产品风险等级
+		if userProfile.RiskLevel == user.RiskUnTest {
+			logger.Error("客户未做风险等级测评,mobile:%d", userProfile.Mobile)
+			return
+		}
+		if userProfile.RiskLevelStatus == user.RiskExpired {
+			logger.Error("客户风险等级已过期,mobile:%d", userProfile.Mobile)
+			return
+		}
+		mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(userProfile.RiskLevel)
+		if mappingErr != nil {
+			logger.Error("查询产品风险等级映射失败:%v", mappingErr)
+			return
+		}
+		var permissionList []permissionService.PermissionDTO
+		if len(permissionIds) == 0 {
+			//获取所有设置风险等级的品种
+			permissionList, err = permissionService.GetPermissionListWithRisk()
+		} else {
+			//更具id过滤设置了风险等级的品种
+			permissionList, err = permissionService.GetPermissionListByIds(permissionIds)
+		}
+		permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
+		if len(permissionList) == 0 {
+			return
+		}
+		var filterPermissionIds []int
+		for _, permission := range permissionList {
+			filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
+		}
+		return reportService.GetTotalPageCountByPermissionIds(filterPermissionIds)
+	} else { //没有登录的时候展示所有设置了风险等级的品种报告,筛选的时候过滤传入ID中没有设置风险等级的品种
+		var permissionList []permissionService.PermissionDTO
+		if len(permissionIds) == 0 {
+			//获取所有设置风险等级的品种
+			permissionList, err = permissionService.GetPermissionListWithRisk()
+		} else {
+			//更具id过滤设置了风险等级的品种
+			permissionList, err = permissionService.GetPermissionListByIds(permissionIds)
+		}
 		if err != nil {
-			logger.Error("获取统计信息失败:%v", err)
+			logger.Error("根据ID查询品种列表失败:%v", err)
+		}
+		var filterPermissionIds []int
+		for _, permission := range permissionList {
+			filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
+		}
+		//查询品种
+		return reportService.GetTotalPageCountByPermissionIds(filterPermissionIds)
+	}
+}
+func filterPermissionsByRisk(permissionList []permissionService.PermissionDTO, riskLevel string) (resultList []permissionService.PermissionDTO) {
+	riskLevelNum, err := parseRiskLevel(riskLevel)
+	if err != nil {
+		logger.Error("风险等级解析失败:%v", err)
+		return
+	}
+	for _, permission := range permissionList {
+		pRiskNum, riskErr := parseRiskLevel(permission.RiskLevel)
+		if riskErr != nil {
+			logger.Error("解析品种风险等级失败 permission:%d,risk:%v", permission.PermissionId, permission.RiskLevel)
+			continue
 		}
-		return total, latestId, map[string][]int{}
+		if pRiskNum <= riskLevelNum {
+			resultList = append(resultList, permission)
+		}
+	}
+	return
+}
+
+// ParseRiskLevel 解析风险等级字符串,并返回数字部分
+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 reportService.GetTotalPageCountByPermissionIds(permissionIds)
+	return number, nil
 }
+
 func SearchReportList(key string, pageInfo page.PageInfo) (reports []reportService.ReportDTO, err error) {
 	offset := page.StartIndex(pageInfo.Current, pageInfo.PageSize)
 	reports, err = reportService.SearchReportList(key, offset, pageInfo.PageSize, pageInfo.LatestId)

+ 15 - 17
service/user/user_service.go

@@ -13,17 +13,16 @@ import (
 )
 
 const (
-	riskValid   = "valid"
-	riskExpired = "expired"
-	riskUnTest  = "unTest"
+	RiskValid   = "valid"
+	RiskExpired = "expired"
+	RiskUnTest  = "unTest"
 )
 
 type User struct {
-	Id        int    `json:"id"`
-	Username  string `json:"username"`
-	Mobile    string `json:"mobile"`
-	RiskLevel string `json:"riskLevel"`
-	OpenId    string `json:"openId,omitempty"`
+	Id       int    `json:"id"`
+	Username string `json:"username"`
+	Mobile   string `json:"mobile"`
+	OpenId   string `json:"openId,omitempty"`
 }
 
 type AnalystDetail struct {
@@ -50,22 +49,22 @@ func convertUserDTOToProfile(dto userService.UserDTO) (profile UserProfile) {
 		profile.UserName = dto.Mobile
 	}
 	if dto.RiskLevel == "" {
-		profile.RiskLevelStatus = riskUnTest
+		profile.RiskLevelStatus = RiskUnTest
 		return
 	}
 	date, err := time.Parse(time.DateOnly, dto.RiskValidEndDate)
 	if err != nil {
 		logger.Error("解析日期失败:%v", err)
-		profile.RiskLevelStatus = riskExpired
+		profile.RiskLevelStatus = RiskExpired
 		return
 	}
 	currentDate := time.Now().Truncate(24 * time.Hour)
 	expiryDate := date.Truncate(24 * time.Hour)
 	if expiryDate.Before(currentDate) {
-		profile.RiskLevelStatus = riskExpired
+		profile.RiskLevelStatus = RiskExpired
 		return
 	}
-	profile.RiskLevelStatus = riskValid
+	profile.RiskLevelStatus = RiskValid
 	return
 }
 func GetUserProfile(userId int) (userProfile UserProfile, err error) {
@@ -297,10 +296,9 @@ func GetUserByOpenId(openId string) (user User, err error) {
 
 func convertToUser(userDTO userService.UserDTO) User {
 	return User{
-		Id:        userDTO.Id,
-		Username:  userDTO.Username,
-		OpenId:    userDTO.OpenId,
-		RiskLevel: userDTO.RiskLevel,
-		Mobile:    userDTO.Mobile,
+		Id:       userDTO.Id,
+		Username: userDTO.Username,
+		OpenId:   userDTO.OpenId,
+		Mobile:   userDTO.Mobile,
 	}
 }