Browse Source

创建商品订单

kobe6258 4 months ago
parent
commit
769d5d8351

+ 34 - 0
api/ht_account_api.go

@@ -1,6 +1,7 @@
 package api
 
 import (
+	"encoding/base64"
 	"encoding/json"
 	"eta/eta_mini_ht_api/common/component/config"
 	logger "eta/eta_mini_ht_api/common/component/log"
@@ -45,6 +46,39 @@ type ClientSuitInfoReq struct {
 	IdNo       string `json:"id_no"`
 }
 
+type CustomerRiskReq struct {
+	MobileTel  string `json:"mobile_tel"`
+	ClientName string `json:"client_name"`
+	IdKind     int    `json:"id_kind"`
+	IdNo       string `json:"id_no"`
+	CreateTime string `json:"create_time"`
+	LoginType  string `json:"login_type"`
+}
+
+func (f *HTAccountApi) EnCodeData(req CustomerRiskReq) (token string, err error) {
+	publicKey, err := auth.ParsePublicKey(f.htConfig.GetWebhookPublicKey())
+	if err != nil {
+		logger.Error("解析公钥失败:%v", err)
+	}
+	str, _ := json.Marshal(req)
+	rsa, err := auth.EncryptWithRSA(publicKey, str)
+	if err != nil {
+		return
+	}
+	token = base64.StdEncoding.EncodeToString(rsa)
+	fmt.Printf("加密后的请求: %v", token)
+	privateKey, err := auth.ParsePrivateKey(f.htConfig.GetWebhookPrivateKey())
+	if err != nil {
+		logger.Error("解析私钥失败: %v", err)
+		return
+	}
+	decodeData, err := auth.DecryptWithRSA(privateKey, token)
+	if err != nil {
+		return
+	}
+	fmt.Printf("解密后的请求: %v", string(decodeData))
+	return
+}
 func (f *HTAccountApi) GetCustomerRiskLevelInfo(req ClientSuitInfoReq) (info CustomerAccountInfo, err error) {
 	url := f.htConfig.GetAccountApiUrl() + clientSuitInfoUrl
 	resp, err := f.client.Post(url, nil)

+ 6 - 0
common/component/config/ht_biz_config.go

@@ -11,6 +11,7 @@ type HTOpts struct {
 	Task              string
 	AccountApiUrl     string
 	WebhookPrivateKey string
+	WebhookPublicKey  string
 	AccountInfoUrl    string
 	CapAppId          string
 	CapSecretKey      string
@@ -47,6 +48,10 @@ func (e *HTBizConfig) EnableTask() bool {
 func (e *HTBizConfig) GetWebhookPrivateKey() string {
 	return e.opts.WebhookPrivateKey
 }
+
+func (e *HTBizConfig) GetWebhookPublicKey() string {
+	return e.opts.WebhookPublicKey
+}
 func (e *HTBizConfig) GetAccountApiUrl() string {
 	return e.opts.AccountApiUrl
 }
@@ -69,6 +74,7 @@ func (e *HTBizConfig) InitConfig() {
 		Task:              e.GetString("task"),
 		AccountApiUrl:     e.GetString("api.account_url"),
 		WebhookPrivateKey: e.GetString("webhook.private_key"),
+		WebhookPublicKey:  e.GetString("webhook.public_key"),
 		AccountInfoUrl:    e.GetString("api.account_url"),
 		CapAppId:          e.GetString("api.app_id"),
 		CapSecretKey:      e.GetString("api.secret_key"),

+ 4 - 2
common/exception/exc_enums.go

@@ -123,6 +123,7 @@ const (
 	WebhookErrCode int = iota + 80000
 	SyncRiskError
 	GetCapTokenFailed
+	GenerateRiskTestTokenFailed
 )
 
 // ErrorMap 用于存储错误码和错误信息的映射
@@ -207,8 +208,9 @@ var ErrorMap = map[int]string{
 	IllegalProductId:      "非法的产品ID",
 	IllegalProductOrderId: "非法的产品订单ID",
 	//webhook
-	SyncRiskError:     "同步风险等级失败",
-	GetCapTokenFailed: "获取cap token失败",
+	SyncRiskError:               "同步风险等级失败",
+	GetCapTokenFailed:           "获取cap token失败",
+	GenerateRiskTestTokenFailed: "生成风险测评token失败",
 }
 
 func Equals(code int, message string) bool {

+ 15 - 3
common/utils/auth/rsa_utils.go

@@ -3,7 +3,6 @@ package auth
 import (
 	"crypto/rand"
 	"crypto/rsa"
-	"crypto/sha256"
 	"crypto/x509"
 	"encoding/base64"
 	"encoding/pem"
@@ -14,8 +13,7 @@ import (
 
 // EncryptWithRSA 使用 RSA 公钥加密数据
 func EncryptWithRSA(publicKey *rsa.PublicKey, data []byte) ([]byte, error) {
-	hash := sha256.Sum256(data)
-	encrypted, err := rsa.EncryptOAEP(sha256.New(), rand.Reader, publicKey, hash[:], nil)
+	encrypted, err := rsa.EncryptPKCS1v15(rand.Reader, publicKey, data)
 	if err != nil {
 		return nil, err
 	}
@@ -61,6 +59,20 @@ func ParsePrivateKey(configPath string) (privateKey *rsa.PrivateKey, err error)
 	privateKey = privateInfo.(*rsa.PrivateKey)
 	return
 }
+func ParsePublicKey(configPath string) (publicKey *rsa.PublicKey, err error) {
+	pemBlock, err := os.ReadFile(configPath)
+	block, _ := pem.Decode(pemBlock)
+	if block == nil {
+		logger.Error("公钥解析失败")
+		return nil, errors.New("公钥解析失败")
+	}
+	key, err := x509.ParsePKIXPublicKey(block.Bytes)
+	if err != nil {
+		return nil, err
+	}
+	publicKey = key.(*rsa.PublicKey)
+	return
+}
 
 // ParsePublicKeyFromPEM 解析RSA公钥
 func ParsePublicKeyFromPEM() (publicKey *rsa.PublicKey, err error) {

+ 3 - 0
conf/rsa_public_key_ht.pem

@@ -0,0 +1,3 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlLQRXT9wYRnmtScCqAW5tanweW1eAYwUWWg/FbuhTJoKsD6CowNBYoBiRUUsvoHBXNAOtDABY7CSkRChS/j6PQS/Hf75Zp5MO1ahYnZDBUSyDR0IoewYDbfcMNLvbJeQiEJneXhYsUAGtST1rV3nygJLEBi45IpsrTUKlud9pvKJzJEGXm2k7Oqv7PD7H+rVnhrdSnP/SseoBpx0aFhz2Yl4dPwHmBKyTN5CD/5OHChhQWYJsYUQ1DsjnhYFN0fiA7Ovgzlf+JdhsmSMJjAlIll1hiB51AU/1q1/b1zW8vIA53Dd3isVm75CMx43Vt7FY3bo+GTw2JcwA9cGAdEdeQIDAQAB
+-----END PUBLIC KEY-----

+ 1 - 0
controllers/report/report_controller.go

@@ -62,6 +62,7 @@ func (r *ReportController) Search(key string) {
 		pageRes.TotalPage = page.TotalPages(pageRes.Total, pageRes.PageSize)
 		list := make([]reportService.ReportDTO, 0)
 		if pageRes.LatestId > 0 {
+			//订阅 TODO
 			list, err = report.SearchReportList(key, reportIds, r.PageInfo, isLogin(detailType), userInfo.Id)
 			if err != nil {
 				r.FailedResult("分页搜索报告列表失败", result)

+ 59 - 1
controllers/user/account_controller.go

@@ -1,7 +1,65 @@
 package user
 
-import "eta/eta_mini_ht_api/controllers"
+import (
+	logger "eta/eta_mini_ht_api/common/component/log"
+	"eta/eta_mini_ht_api/controllers"
+	"eta/eta_mini_ht_api/service/facade"
+	"github.com/google/uuid"
+	"net/url"
+	"strings"
+)
 
 type AccountController struct {
 	controllers.BaseController
 }
+type RiskInfoTokenResp struct {
+	Token string `json:"token"`
+}
+
+const (
+	TraceHeaderKey = "X-Trace-ID"
+	MDCTraceId     = "traceId"
+)
+
+func (a *AccountController) Prepare() {
+	var requestBody string
+	uri := a.Ctx.Input.URI()
+	method := a.Ctx.Input.Method()
+	if method == "GET" {
+		requestBody = a.Ctx.Request.RequestURI
+	} else {
+		requestBody, _ = url.QueryUnescape(string(a.Ctx.Input.RequestBody))
+	}
+	ip := a.Ctx.Input.IP()
+	a.Ctx.Input.URL()
+	traceId := uuid.NewString()
+	traceId = strings.ReplaceAll(traceId, "-", "")
+	a.Ctx.Output.Header(TraceHeaderKey, traceId)
+	//// 设置MDC中的traceId
+	a.Ctx.Input.SetData(MDCTraceId, traceId)
+	// 清理MDC中的traceId
+	logger.InfoWithTraceId(a.Ctx, "webhookRequest:[uri:%s, requestBody:%s, ip:%s]", uri, requestBody, ip)
+}
+
+// GetRiskInfoToken  获取风险测评问卷请求Token
+// @Summary 获取风险测评问卷请求Token
+// @Description 获取风险测评问卷请求Token
+// @Success 200 {object} controllers.BaseResponse
+// @router /v1/riskTestToken/ [get]
+func (a *AccountController) GetRiskInfoToken(mobile string) {
+	controllers.Wrap(&a.BaseController, func() (result *controllers.WrapData, err error) {
+		result = a.InitWrapData("获取风险测评问卷请求Token失败")
+		token, err := facade.GetRiskTestToken(mobile)
+		if err != nil {
+			logger.InfoWithTraceId(a.Ctx, err.Error())
+			a.FailedResult("风险测评问卷请求token生成失败", result)
+			return
+		}
+		result = a.InitWrapData("风险测评问卷请求token生成成功")
+		a.SuccessResult("success", RiskInfoTokenResp{
+			Token: token,
+		}, result)
+		return
+	})
+
+}

+ 0 - 2
controllers/web_hook/htfutures_account_controller.go

@@ -11,8 +11,6 @@ type HTFuturesAccountController struct {
 	controllers.WebHookController
 }
 
-type Risk struct{}
-
 // SyncCustomerRiskLevel  风险测评同步接口
 // @Summary 风险测评同步接口
 // @Description 风险测评同步接口

+ 18 - 0
domian/order/product_order.go

@@ -122,3 +122,21 @@ func GetOrderDetail(orderId int, userId int) (orderDTO ProductOrderDetailDTO, er
 	orderDTO = convertProductOrderDetailDTO(order)
 	return
 }
+
+func BatchCloseOrder() (err error) {
+	//total, minId := orderDao.GetUnPendingOrderCount()
+	//if total > 500 {
+	//	chunk := (total + 99) / 100
+	//	var wg sync.WaitGroup
+	//	wg.Add(chunk)
+	//	for i := 0; i < chunk; i++ {
+	//		go func() {
+	//			defer wg.Done()
+	//			var ids []int
+	//			ids, minId = orderDao.GetPendingOrderIds(minId, 500)
+	//			err = orderDao.batchCloseOrder(ids)
+	//		}()
+	//	}
+	//}
+	return nil
+}

+ 3 - 0
main.go

@@ -1,6 +1,7 @@
 package main
 
 import (
+	"encoding/base64"
 	"eta/eta_mini_ht_api/api"
 	_ "eta/eta_mini_ht_api/common/component"
 	"eta/eta_mini_ht_api/common/component/cache"
@@ -14,6 +15,7 @@ import (
 	"eta/eta_mini_ht_api/models/ht"
 	_ "eta/eta_mini_ht_api/routers"
 	_ "eta/eta_mini_ht_api/task"
+	"fmt"
 	"github.com/beego/beego/v2/server/web"
 	"sync"
 	"time"
@@ -61,6 +63,7 @@ func initThirdPartyAccessToken() {
 		}
 		duration := expireTime.Sub(time.Now()).Seconds()
 		_ = redisUtils.SetString(accessToken, token.AccessToken, int(duration))
+		fmt.Printf(base64.StdEncoding.EncodeToString([]byte(token.AccessToken)))
 	}
 }
 func initReport() {

+ 0 - 1
middleware/webhook_middleware.go

@@ -17,7 +17,6 @@ var (
 
 func WebHookAuthMiddleware() web.FilterFunc {
 	return func(ctx *context.Context) {
-
 		body := ctx.Input.RequestBody
 		webhookRequest := new(WebhookRequest)
 		err := json.Unmarshal(body, &webhookRequest)

+ 24 - 0
models/order/product_order.go

@@ -94,3 +94,27 @@ func GetOrderDetail(orderId int, userId int) (order ProductOrder, err error) {
 	err = db.Model(&ProductOrder{}).Select("*").Where("id = ? and user_id = ? and is_deleted=0 ", orderId, userId).First(&order).Error
 	return
 }
+
+func GetUnPendingOrderCount() (count int, minId int) {
+	db := models.Main()
+	_ = db.Model(&ProductOrder{}).Select("count(*)").Where("is_deleted=0 and status=?", OrderStatusPending).Scan(&count).Error
+	_ = db.Model(&ProductOrder{}).Select("MIN(id)").Where("is_deleted=0 and status =?", OrderStatusPending).Scan(&minId).Error
+	return
+}
+
+func GetPendingOrderIds(minId int, limit int) (ids []int, latestId int) {
+	db := models.Main()
+	_ = db.Model(&ProductOrder{}).Select("id").Where("id> ? and status=? and  is_deleted=0 order by id asc", minId, OrderStatusPending).Limit(limit).Scan(&ids).Error
+	latestId = ids[0]
+	return
+}
+
+func batchCloseOrder(ids []int) error {
+	//db := models.Main()
+	//_ = db.Model(&ProductOrder{}).Select("id").Where("id> ? and status=? and  is_deleted=0 order by id asc", minId, OrderStatusPending).Limit(limit).Scan(&ids).Error
+	//err = db.Model(&VerificationRecord{}).Where("expired_time < ?", time.Now()).Where("status =?", StatusPending).Update("status", StatusExpired).Error
+	//if err != nil {
+	//	logger.Error("批量过期验证码失败:%v", err)
+	//}
+	return nil
+}

+ 2 - 1
models/user/userSubscriptionAccessList.go

@@ -18,9 +18,10 @@ type UserSubscriptionAccessList struct {
 	UserId      int             `gorm:"column:user_id"`
 	ProductID   int             `gorm:"column:product_id"`
 	ProductName string          `gorm:"column:product_name"`
+	IsPermanent bool            `gorm:"column:is_permanent"`
 	BeginDate   time.Time       `gorm:"column:begin_date"`
 	EndDate     time.Time       `gorm:"column:end_date"`
-	Status      SubscribeStatus `gorm:"column:status;type:enum('valid','expired')"`
+	Status      SubscribeStatus `gorm:"column:status;type:enum('valid','expired');default:'valid'"`
 }
 
 func (UserSubscriptionAccessList) TableName() string {

+ 11 - 0
routers/commentsRouter.go

@@ -148,6 +148,17 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:AccountController"] = append(beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:AccountController"],
+        beego.ControllerComments{
+            Method: "GetRiskInfoToken",
+            Router: `/v1/riskTestToken/`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(
+				param.New("mobile"),
+			),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:AnalystController"] = append(beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:AnalystController"],
         beego.ControllerComments{
             Method: "AnalystDetail",

+ 5 - 0
routers/router.go

@@ -40,6 +40,11 @@ func init() {
 				&user.AuthController{},
 			),
 		),
+		web.NSNamespace("/account",
+			web.NSInclude(
+				&user.AccountController{},
+			),
+		),
 		web.NSNamespace("/report",
 			web.NSInclude(
 				&report.ReportController{},

+ 10 - 0
service/facade/ht_account_service.go

@@ -127,3 +127,13 @@ func compareRisk(cusPdRisk string, pdRisk string) (code int, err error) {
 	}
 	return
 }
+
+func GetRiskTestToken(mobile string) (token string, err error) {
+	token, err = htApi.EnCodeData(api.CustomerRiskReq{
+		MobileTel: mobile,
+	})
+	if err != nil {
+		err = exception.NewWithException(exception.GenerateRiskTestTokenFailed, err.Error())
+	}
+	return
+}

+ 161 - 136
service/report/report_service.go

@@ -261,73 +261,71 @@ func getETAReportDetail(report *reportService.ReportDTO) (etaReport reportServic
 func getHTReportDetail(report *reportService.ReportDTO) (url string, err error) {
 	return reportService.GetHtReport(report.OrgId)
 }
-func GetTotalPageCount() (total int64, latestId int64, err error) {
-	return reportService.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, mapping.ProductRiskLevel)
-	} 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("根据ID查询品种列表失败:%v", err)
-		}
-		var filterPermissionIds []int
-		for _, permission := range permissionList {
-			filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
-		}
-		//查询品种
-		return reportService.GetTotalPageCountByPermissionIds(filterPermissionIds, "")
-	}
+	return getCount(permissionIds, isLogin, userId)
+	//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, mapping.ProductRiskLevel)
+	//} 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("根据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)
@@ -431,11 +429,6 @@ func SearchReportList(key string, Ids []int, pageInfo page.PageInfo, isLogin boo
 	}
 	return
 }
-
-func SearchMaxReportId(key string) (total int64, id int64) {
-
-	return reportService.SearchMaxReportId(key)
-}
 func RangeSearchByAnalyst(analystName string, userId int) (total int64, latestId int64, ids []int) {
 	var err error
 	//登录了需要校验风险等级,如果风险等级没做或者过期直接返回空,做了就筛选风险等级
@@ -478,66 +471,9 @@ func RangeSearchByAnalyst(analystName string, userId int) (total int64, latestId
 	return reportService.GetTotalPageCountByAnalyst(analystName, filterPermissionIds)
 }
 func RangeSearch(isLogin bool, userId int) (total int64, latestId int64, orgIds 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
-		//获取所有设置风险等级的品种
-		permissionList, err = permissionService.GetPermissionListWithRisk()
-		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, mapping.ProductRiskLevel)
-	} else { //没有登录的时候展示所有设置了风险等级的品种报告,筛选的时候过滤传入ID中没有设置风险等级的品种
-		var permissionList []permissionService.PermissionDTO
-		//获取所有设置风险等级的品种
-		permissionList, err = permissionService.GetPermissionListWithRisk()
-		if err != nil {
-			logger.Error("根据ID查询品种列表失败:%v", err)
-		}
-		var filterPermissionIds []int
-		for _, permission := range permissionList {
-			filterPermissionIds = append(filterPermissionIds, permission.PermissionId)
-		}
-		//查询品种
-		return reportService.GetTotalPageCountByPermissionIds(filterPermissionIds, "")
-	}
+	return getCount(nil, isLogin, userId)
 }
-
-// GetReportPage 分页获取报告列表
-func GetReportPage(pageInfo page.PageInfo, orgIds map[string][]int, searchAll bool, isLogin bool, userId int) (reports []reportService.ReportDTO, err error) {
-	var list []reportService.ReportDTO
-	list, err = reportService.GetReportPageByOrgIds(pageInfo, orgIds, searchAll)
-	//并发获取研报的标签
+func dealReportInfo(list []reportService.ReportDTO, isLogin bool, userId int) (err error) {
 	var wg sync.WaitGroup
 	wg.Add(len(list))
 	for i := 0; i < len(list); i++ {
@@ -594,10 +530,78 @@ func GetReportPage(pageInfo page.PageInfo, orgIds map[string][]int, searchAll bo
 					report.RiskLevel = product.RiskLevel
 				}
 			}
-			reports = append(reports, *report)
 		}(&list[i])
 	}
 	wg.Wait()
+	return
+}
+
+// GetReportPage 分页获取报告列表
+func GetReportPage(pageInfo page.PageInfo, orgIds map[string][]int, searchAll bool, isLogin bool, userId int) (reports []reportService.ReportDTO, err error) {
+	var list []reportService.ReportDTO
+	list, err = reportService.GetReportPageByOrgIds(pageInfo, orgIds, searchAll)
+	err = dealReportInfo(list, isLogin, userId)
+	////并发获取研报的标签
+	//var wg sync.WaitGroup
+	//wg.Add(len(list))
+	//for i := 0; i < len(list); i++ {
+	//	go func(report *reportService.ReportDTO) {
+	//		defer wg.Done()
+	//		report.Login = isLogin
+	//		report.PermissionNames = getReportPermissionNames(report.OrgId, report.Source)
+	//		permissions := getReportSecondPermissions(report.OrgId, report.Source)
+	//		if len(permissions) == 0 {
+	//			return
+	//		}
+	//		riskNum := getHighestRiskLevel(permissions)
+	//		report.RiskLevel = strings.Join([]string{"R", strconv.Itoa(riskNum)}, "")
+	//		var src string
+	//		src, err = mediaService.GetImageSrc(report.CoverSrc)
+	//		if err != nil {
+	//			logger.Error("获取图片地址失败:%v", err)
+	//			src = ""
+	//		} else {
+	//			report.CoverUrl = src
+	//		}
+	//		//下查询产品信息
+	//		product, pdErr := productService.GetProductBySourceId(report.ReportID, productDao.Report)
+	//		if pdErr != nil {
+	//			if errors.Is(pdErr, gorm.ErrRecordNotFound) {
+	//				report.Price = defaultProductPrice
+	//				report.IsFree = true
+	//				report.IsSubscribe = false
+	//			} else {
+	//				report.Price = defaultProductPrice
+	//				report.IsFree = false
+	//				report.IsSubscribe = false
+	//			}
+	//		} else {
+	//			report.Price = product.Price.String()
+	//			report.IsFree = false
+	//			if isLogin {
+	//				subscribe, subscribeErr := userService.GetUserSubscribe(product.Id, userId)
+	//				if subscribeErr != nil {
+	//					report.IsSubscribe = false
+	//				} else {
+	//					report.IsSubscribe = subscribe.Status == userDao.SubscribeValid
+	//				}
+	//			}
+	//			pdRiskNum, parseErr := parseRiskLevel(product.RiskLevel)
+	//			if parseErr != nil {
+	//				return
+	//			}
+	//			rpRiskNum, parseErr := parseRiskLevel(report.RiskLevel)
+	//			if parseErr != nil {
+	//				return
+	//			}
+	//			if rpRiskNum <= pdRiskNum {
+	//				report.RiskLevel = product.RiskLevel
+	//			}
+	//		}
+	//		reports = append(reports, *report)
+	//	}(&list[i])
+	//}
+	//wg.Wait()
 	if err != nil {
 		err = exception.New(exception.QueryReportPageFailed)
 	}
@@ -997,6 +1001,9 @@ func GetReportByIdListByOrgIds(orgIds map[string][]int) (ids []int, err error) {
 }
 
 func RangePermissionIds(isLogin bool, userId int) (filterPermissionIds []int, riskLevel string, err error) {
+	return checkUserRisk(nil, isLogin, userId)
+}
+func checkUserRisk(permissionIds []int, isLogin bool, userId int) (filterPermissionIds []int, riskLevel string, err error) {
 	if isLogin {
 		userProfile, userErr := user.GetUserProfile(userId)
 		if userErr != nil {
@@ -1005,7 +1012,7 @@ func RangePermissionIds(isLogin bool, userId int) (filterPermissionIds []int, ri
 			} else {
 				err = exception.New(exception.TemplateUserFoundFailed)
 			}
-			logger.Error("获取有权限的品种列表失败:%v", err)
+			logger.Error("分页查询报告列表失败:%v", err)
 			return
 		}
 		//获取产品风险等级
@@ -1023,8 +1030,13 @@ func RangePermissionIds(isLogin bool, userId int) (filterPermissionIds []int, ri
 			return
 		}
 		var permissionList []permissionService.PermissionDTO
-		//获取所有设置风险等级的品种
-		permissionList, err = permissionService.GetPermissionListWithRisk()
+		if len(permissionIds) == 0 {
+			//获取所有设置风险等级的品种
+			permissionList, err = permissionService.GetPermissionListWithRisk()
+		} else {
+			//更具id过滤设置了风险等级的品种
+			permissionList, err = permissionService.GetPermissionListByIds(permissionIds)
+		}
 		permissionList = filterPermissionsByRisk(permissionList, mapping.ProductRiskLevel)
 		riskLevel = mapping.ProductRiskLevel
 		if len(permissionList) == 0 {
@@ -1036,8 +1048,13 @@ func RangePermissionIds(isLogin bool, userId int) (filterPermissionIds []int, ri
 		return
 	} else { //没有登录的时候展示所有设置了风险等级的品种报告,筛选的时候过滤传入ID中没有设置风险等级的品种
 		var permissionList []permissionService.PermissionDTO
-		//获取所有设置风险等级的品种
-		permissionList, err = permissionService.GetPermissionListWithRisk()
+		if len(permissionIds) == 0 {
+			//获取所有设置风险等级的品种
+			permissionList, err = permissionService.GetPermissionListWithRisk()
+		} else {
+			//更具id过滤设置了风险等级的品种
+			permissionList, err = permissionService.GetPermissionListByIds(permissionIds)
+		}
 		if err != nil {
 			logger.Error("根据ID查询品种列表失败:%v", err)
 		}
@@ -1048,3 +1065,11 @@ func RangePermissionIds(isLogin bool, userId int) (filterPermissionIds []int, ri
 		return
 	}
 }
+func getCount(permissionIds []int, isLogin bool, userId int) (total int64, latestId int64, ids map[string][]int) {
+	filterPermissionIds, riskLevel, err := checkUserRisk(permissionIds, isLogin, userId)
+	if err != nil {
+		logger.Error("校验用户风险等级失败:%v", err)
+		return
+	}
+	return reportService.GetTotalPageCountByPermissionIds(filterPermissionIds, riskLevel)
+}

+ 32 - 0
task/order/product_order_close_task.go

@@ -0,0 +1,32 @@
+package sms
+
+import (
+	logger "eta/eta_mini_ht_api/common/component/log"
+	"eta/eta_mini_ht_api/common/contants"
+	"eta/eta_mini_ht_api/domian/order"
+	"eta/eta_mini_ht_api/task/base"
+)
+
+var (
+	taskName base.TaskType = "ExpiredCodeTask"
+	cron                   = "0/60 * * * * *"
+)
+
+// Execute Task ETA取研报的数据
+func (st *SMSTask) Execute(taskDetail *base.TaskDetail) error {
+	logger.Info(contants.TaskFormat, "处理超时未支付的产品订单开始")
+	err := order.BatchCloseOrder()
+	if err != nil {
+		logger.Error("关闭超时订单失败:%v", err)
+	}
+	logger.Info(contants.TaskFormat, "处理超时未支付的产品订单结束")
+	return err
+}
+
+type SMSTask struct {
+}
+
+func init() {
+	smsTask := base.NewTask(taskName, cron, new(SMSTask), base.PROD)
+	base.RegisterTask(&smsTask)
+}