|
@@ -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)
|