浏览代码

增加风测回调接口

kobe6258 5 月之前
父节点
当前提交
a7b11cb0bf

+ 2 - 0
common/exception/exc_enums.go

@@ -17,6 +17,7 @@ const (
 	SysErrCode int = iota + 10000 // iota 自动递增,从 1 开始
 	UnknownError
 	Unauthorized
+	SysError
 )
 
 // BIZErrCode  业务错误
@@ -114,6 +115,7 @@ const (
 
 // ErrorMap 用于存储错误码和错误信息的映射
 var ErrorMap = map[int]string{
+	SysError:              "系统异常",
 	UnknownError:          "未知错误",
 	Unauthorized:          "用户未授权",
 	IllegalCodeLength:     "无效的验证码位数设置",

+ 112 - 0
controllers/user/user_controller.go

@@ -1,9 +1,12 @@
 package user
 
 import (
+	"encoding/json"
 	"encoding/xml"
 	"eta/eta_mini_ht_api/common/component/cache"
+	"eta/eta_mini_ht_api/common/component/config"
 	logger "eta/eta_mini_ht_api/common/component/log"
+	"eta/eta_mini_ht_api/common/contants"
 	"eta/eta_mini_ht_api/common/exception"
 	authUtils "eta/eta_mini_ht_api/common/utils/auth"
 	"eta/eta_mini_ht_api/controllers"
@@ -530,3 +533,112 @@ type Notify struct {
 	EventKey     string `xml:"EventKey"`
 	Content      string `xml:"Content"`
 }
+
+type SyncCustomerRiskLevelReq struct {
+	CustInfo CustInfo `json:"custInfo"`
+	RiskInfo RiskInfo `json:"riskInfo"`
+}
+
+type CustInfo struct {
+	MobileTel  string `json:"mobile_tel"`
+	ClientName string `json:"client_name"`
+	IdKind     string `json:"id_kind"`
+	IdNo       string `json:"id_no"`
+}
+
+type RiskInfo struct {
+	CorpBeginDate  string `json:"corp_begin_date"`
+	CorpEndDate    string `json:"corp_end_date"`
+	UserInvestTerm string `json:"user_invest_term"`
+	UserInvestKind string `json:"user_invest_kind"`
+	CorpRiskLevel  string `json:"corp_risk_level"`
+}
+type WebhookRequest struct {
+	Data string `json:"data"`
+	//EncryptKey string `json:"encryptKey"`
+}
+
+// SyncCustomerRiskLevel  风险测评同步接口
+// @Summary 风险测评同步接口
+// @Description 风险测评同步接口
+// @Success 200 {object} controllers.BaseResponse
+// @router /riskLevel [post]
+func (h *UserController) SyncCustomerRiskLevel() {
+	controllers.Wrap(&h.BaseController, func() (result *controllers.WrapData, err error) {
+		result = h.InitWrapData("同步风险等级")
+		htConfig := config.GetConfig(contants.HT).(*config.HTBizConfig)
+
+		webhookRequest := new(WebhookRequest)
+		h.GetPostParams(webhookRequest)
+		privateKey, err := authUtils.ParsePrivateKey(htConfig.GetWebhookPrivateKey())
+		if err != nil {
+			err = exception.New(exception.SysError)
+			logger.Error("解析私钥失败: %v", err)
+			h.FailedResult("解析私钥失败", result)
+			return
+		}
+		decodeData, err := authUtils.DecryptWithRSA(privateKey, webhookRequest.Data)
+		if err != nil {
+			err = exception.New(exception.SysError)
+			logger.Error("解密请求体失败: %v", err)
+			h.FailedResult("解密请求体失败", result)
+			return
+		}
+		syncCustomerRiskLevelReq := new(SyncCustomerRiskLevelReq)
+		err = json.Unmarshal(decodeData, syncCustomerRiskLevelReq)
+		if err != nil {
+			err = exception.New(exception.SyncRiskError)
+			logger.Error("解析请求体失败: %v", err)
+			h.FailedResult("解析请求体失败", result)
+			return
+		}
+		custInfo := syncCustomerRiskLevelReq.CustInfo
+		riskInfo := syncCustomerRiskLevelReq.RiskInfo
+		if custInfo.ClientName == "" {
+			err = exception.New(exception.SyncRiskError)
+			h.FailedResult("用户名字不能为空", result)
+			return
+		}
+		if custInfo.MobileTel == "" {
+			err = exception.New(exception.SyncRiskError)
+			h.FailedResult("手机号码不能为空", result)
+			return
+		}
+		if custInfo.IdNo == "" {
+			err = exception.New(exception.SyncRiskError)
+			h.FailedResult("身份证号不能为空", result)
+			return
+		}
+		//if !utils.IsValidIDCard(custInfo.IdNo) && !utils.IsValidOldIDCard(custInfo.IdNo) {
+		//	err = exception.New(exception.SyncRiskError)
+		//	h.FailedResult("身份证号不合法", result)
+		//	return
+		//}
+		if riskInfo.CorpRiskLevel == "" {
+			err = exception.New(exception.SyncRiskError)
+			h.FailedResult("风险等级不能为空", result)
+			return
+		}
+		if riskInfo.CorpEndDate == "" {
+			err = exception.New(exception.SyncRiskError)
+			h.FailedResult("风险测评有效结束日期不能为空", result)
+			return
+		}
+		err = userService.UpdateRiskLevelInfo(userService.RiskLevelInfoDTO{
+			Name:             custInfo.ClientName,
+			PhoneNumber:      custInfo.MobileTel,
+			RiskLevel:        riskInfo.CorpRiskLevel,
+			RiskValidEndDate: riskInfo.CorpEndDate,
+		})
+		if err != nil {
+			logger.ErrorWithTraceId(h.Ctx, err.Error())
+			h.FailedResult(err.Error(), result)
+			err = exception.New(exception.SyncRiskError)
+			return
+		}
+		logger.InfoWithTraceId(h.Ctx, err.Error())
+		result = h.InitWrapData("同步风险等级成功")
+		h.SuccessResult("success", syncCustomerRiskLevelReq, result)
+		return
+	})
+}

+ 65 - 0
controllers/web_hook/htfutures_account_controller.go

@@ -74,6 +74,67 @@ func (h *HTFuturesAccountController) SyncCustomerRiskLevel() {
 	})
 }
 
+// SyncCustomerAccountInfo  开户信息同步接口
+// @Summary 开户信息同步接口
+// @Description 开户信息同步接口
+// @Success 200 {object} controllers.BaseResponse
+// @router /v1/syncAccountInfo/ [post]
+func (h *HTFuturesAccountController) SyncCustomerAccountInfo() {
+	controllers.WrapWebhook(&h.WebHookController, func() (result *controllers.WrapData, err error) {
+		result = h.InitWrapData("同步风险等级")
+		syncCustomerRiskLevelReq := new(SyncCustomerRiskLevelReq)
+		h.GetPostParams(syncCustomerRiskLevelReq)
+		custInfo := syncCustomerRiskLevelReq.CustInfo
+		riskInfo := syncCustomerRiskLevelReq.RiskInfo
+		if custInfo.ClientName == "" {
+			err = exception.New(exception.SyncRiskError)
+			h.FailedResult("用户名字不能为空", result)
+			return
+		}
+		if custInfo.MobileTel == "" {
+			err = exception.New(exception.SyncRiskError)
+			h.FailedResult("手机号码不能为空", result)
+			return
+		}
+		if custInfo.IdNo == "" {
+			err = exception.New(exception.SyncRiskError)
+			h.FailedResult("身份证号不能为空", result)
+			return
+		}
+		//if !utils.IsValidIDCard(custInfo.IdNo) && !utils.IsValidOldIDCard(custInfo.IdNo) {
+		//	err = exception.New(exception.SyncRiskError)
+		//	h.FailedResult("身份证号不合法", result)
+		//	return
+		//}
+		if riskInfo.CorpRiskLevel == "" {
+			err = exception.New(exception.SyncRiskError)
+			h.FailedResult("风险等级不能为空", result)
+			return
+		}
+		if riskInfo.CorpEndDate == "" {
+			err = exception.New(exception.SyncRiskError)
+			h.FailedResult("风险测评有效结束日期不能为空", result)
+			return
+		}
+		err = userService.UpdateRiskLevelInfo(userService.RiskLevelInfoDTO{
+			Name:             custInfo.ClientName,
+			PhoneNumber:      custInfo.MobileTel,
+			RiskLevel:        riskInfo.CorpRiskLevel,
+			RiskValidEndDate: riskInfo.CorpEndDate,
+		})
+		if err != nil {
+			logger.ErrorWithTraceId(h.Ctx, err.Error())
+			h.FailedResult(err.Error(), result)
+			err = exception.New(exception.SyncRiskError)
+			return
+		}
+		logger.InfoWithTraceId(h.Ctx, err.Error())
+		result = h.InitWrapData("同步风险等级成功")
+		h.SuccessResult("success", syncCustomerRiskLevelReq, result)
+		return
+	})
+}
+
 type SyncCustomerRiskLevelReq struct {
 	CustInfo CustInfo `json:"custInfo"`
 	RiskInfo RiskInfo `json:"riskInfo"`
@@ -93,3 +154,7 @@ type RiskInfo struct {
 	UserInvestKind string `json:"user_invest_kind"`
 	CorpRiskLevel  string `json:"corp_risk_level"`
 }
+type SyncCustomerAccountInfoReq struct {
+	CustInfo CustInfo `json:"custInfo"`
+	RiskInfo RiskInfo `json:"riskInfo"`
+}

+ 15 - 4
controllers/ws_controller.go

@@ -1,6 +1,7 @@
 package controllers
 
 import (
+	logger "eta/eta_mini_ht_api/common/component/log"
 	"fmt"
 	beego "github.com/beego/beego/v2/server/web"
 	"github.com/gorilla/websocket"
@@ -10,6 +11,8 @@ import (
 
 var upgrader = websocket.Upgrader{
 	CheckOrigin: func(r *http.Request) bool {
+
+		fmt.Println(r.Header.Get("Authorization"))
 		return true // 允许跨域连接
 	},
 }
@@ -18,8 +21,15 @@ type WebSocketController struct {
 	beego.Controller
 }
 
+// Connect  ws链接
+// @Description 风险测评同步接口
+// @Success 200 {object} controllers.BaseResponse
+// @router /connect [get]
 func (c *WebSocketController) Connect() {
+
 	ws, err := upgrader.Upgrade(c.Ctx.ResponseWriter, c.Ctx.Request, nil)
+	test := c.Ctx.Request.Header.Get("Authorization")
+	fmt.Println("发大水范德萨" + test)
 	if err != nil {
 		//beego.Error(err)
 		return
@@ -27,17 +37,18 @@ func (c *WebSocketController) Connect() {
 	defer ws.Close()
 
 	for {
-		var msg string
-		_, _, err = ws.ReadMessage()
+
+		var msg []byte
+		_, msg, err = ws.ReadMessage()
 		if err != nil {
-			//	beego.Error(err)
+			logger.Error("", err)
 			break
 		}
 		// 处理接收到的消息
 		fmt.Printf("Received: %s\n", msg)
 
 		// 发送消息回客户端
-		err = ws.WriteMessage(websocket.TextMessage, []byte("Server: "+msg))
+		err = ws.WriteMessage(websocket.TextMessage, []byte("Server: "+string(msg)))
 		if err != nil {
 			//beego.Error(err)
 			break

+ 17 - 16
domian/report/permission_service.go

@@ -12,19 +12,20 @@ func GetClassifyIdsByPermissionIds(permissionIds []int) (classifyIds []int, err
 func GetPermissionNamesByPermissionIds(permissionIds []int) (permissionNames []string, err error) {
 	return etaDao.GetPermissionNamesByPermissionIds(permissionIds)
 }
-func GetPermissionList() (dtoList []PermissionDTO, err error) {
-	list, err := etaDao.GetChartPermissionList()
-	if err != nil {
-		logger.Error("获取研报列表失败")
-		return
-	}
-	dtoList = make([]PermissionDTO, 0)
-	for _, node := range list {
-		dto := convertPermissionDTO(node)
-		dtoList = append(dtoList, dto)
-	}
-	return
-}
+
+//	func GetPermissionList() (dtoList []PermissionDTO, err error) {
+//		list, err := etaDao.GetChartPermissionList()
+//		if err != nil {
+//			logger.Error("获取研报列表失败")
+//			return
+//		}
+//		dtoList = make([]PermissionDTO, 0)
+//		for _, node := range list {
+//			dto := convertPermissionDTO(node)
+//			dtoList = append(dtoList, dto)
+//		}
+//		return
+//	}
 func GetFirstPermissionsByIds(ids []int) (permissionDTOS []PermissionDTO, err error) {
 	list, err := etaDao.GetFirstPermissionsByIds(ids)
 	if err != nil {
@@ -37,9 +38,9 @@ func GetFirstPermissionsByIds(ids []int) (permissionDTOS []PermissionDTO, err er
 }
 
 // 获取二级品种id
-func GetPermissionIdByName(name string) (permissionId int, err error) {
-	return etaDao.GetPermissionIdByName(name)
-}
+//func GetPermissionIdByName(name string) (permissionId int, err error) {
+//	return etaDao.GetPermissionIdByName(name)
+//}
 
 // 获取一级品种(海通的板块)
 func GetReportPermissionsById(id int, source string) (permissionIds []PermissionDTO) {

+ 1 - 0
middleware/auth_middleware.go

@@ -67,6 +67,7 @@ var privateRoutes = []string{
 	"/user/readMessages",
 	"/user/readMessage",
 	"/user/feedback",
+	"/webhook/*",
 	"/user/checkFollowStatus",
 	"/user/followingAnalysts",
 	"/user/message",

+ 4 - 2
models/config/permission.go

@@ -51,11 +51,13 @@ func GetPermissionList() (list []Permission, err error) {
 }
 func GetPermissionListByIds(permissionIds []int) (list []Permission, err error) {
 	db := models.Main()
-	err = db.Model(&Permission{}).Select(Columns).Where("permission_id in ? and (risk_level !='' and risk_level is NOT NULL )", permissionIds).Find(&list).Error
+	//一级分类不能挂风险等级
+	err = db.Model(&Permission{}).Select(Columns).Where("permission_id in ? and (risk_level !='' and risk_level is NOT NULL and parent_id !=0 )", 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
+	//一级分类不能挂风险等级
+	err = db.Model(&Permission{}).Select(Columns).Where("risk_level is NOT NULL and risk_level != '' and parent_id !=0").Find(&list).Error
 	return
 }

+ 8 - 8
models/eta/eta_permission.go

@@ -6,9 +6,8 @@ import (
 )
 
 const (
-	Columns                 = "chart_permission_id,permission_name,parent_id"
-	SyncColumns             = "chart_permission_id,permission_name,parent_id,sort"
-	FirstPermissionsColumns = "DISTINCT parent_id"
+	Columns     = "chart_permission_id,permission_name,parent_id"
+	SyncColumns = "chart_permission_id,permission_name,parent_id,sort"
 )
 
 // ChartPermission represents the structure of the chart_permission table.
@@ -41,11 +40,12 @@ func GetSyncPermissionList() (chartPermissionList []ChartPermission, err error)
 	}
 	return
 }
-func GetPermissionNamesByClassifyID(ids []int) (chartPermissionNames []string, err error) {
-	sql := "select chart_permission_id, permission_name from chart_permission WHERE chart_permission_id in ?"
-	err = doSql(sql, &chartPermissionNames, ids)
-	return
-}
+
+//	func GetPermissionNamesByClassifyID(ids []int) (chartPermissionNames []string, err error) {
+//		sql := "select chart_permission_id, permission_name from chart_permission WHERE chart_permission_id in ?"
+//		err = doSql(sql, &chartPermissionNames, ids)
+//		return
+//	}
 func GetPermissionNamesByPermissionIds(ids []int) (chartPermissionNames []string, err error) {
 	sql := "select permission_name from chart_permission WHERE chart_permission_id in ?"
 	err = doSql(sql, &chartPermissionNames, ids)

+ 27 - 0
routers/commentsRouter.go

@@ -377,6 +377,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:UserController"] = append(beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:UserController"],
+        beego.ControllerComments{
+            Method: "SyncCustomerRiskLevel",
+            Router: `/riskLevel`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:UserController"] = append(beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/user:UserController"],
         beego.ControllerComments{
             Method: "Notify",
@@ -386,6 +395,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/web_hook:HTFuturesAccountController"] = append(beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/web_hook:HTFuturesAccountController"],
+        beego.ControllerComments{
+            Method: "SyncCustomerAccountInfo",
+            Router: `/v1/syncAccountInfo/`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/web_hook:HTFuturesAccountController"] = append(beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers/web_hook:HTFuturesAccountController"],
         beego.ControllerComments{
             Method: "SyncCustomerRiskLevel",
@@ -395,4 +413,13 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers:WebSocketController"] = append(beego.GlobalControllerRouter["eta/eta_mini_ht_api/controllers:WebSocketController"],
+        beego.ControllerComments{
+            Method: "Connect",
+            Router: `/connect`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
 }

+ 7 - 0
routers/router.go

@@ -1,6 +1,7 @@
 package routers
 
 import (
+	"eta/eta_mini_ht_api/controllers"
 	"eta/eta_mini_ht_api/controllers/media"
 	"eta/eta_mini_ht_api/controllers/order"
 	"eta/eta_mini_ht_api/controllers/product"
@@ -26,6 +27,7 @@ func init() {
 
 	web.InsertFilter("*", web.BeforeRouter, middleware.AuthMiddleware())
 	web.InsertFilter("/htapi/webhook/*", web.BeforeRouter, middleware.WebHookAuthMiddleware())
+
 	ns := web.NewNamespace("/htapi",
 		web.NSNamespace("/user",
 			web.NSInclude(
@@ -67,6 +69,11 @@ func init() {
 				&order.OrderController{},
 			),
 		),
+		web.NSNamespace("/ws",
+			web.NSInclude(
+				&controllers.WebSocketController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }