kobe6258 6 天之前
父节点
当前提交
8e6561be77

+ 78 - 0
controllers/web_hook/htfutures_account_controller.go

@@ -312,6 +312,77 @@ func (h *HTFuturesAccountController) SyncCustomerAccountInfo() {
 	})
 }
 
+// SyncCustomerIDInfo  证件信息同步接口
+// @Summary证件信息同步接口
+// @Description 证件信息同步接口
+// @Success 200 {object} controllers.BaseResponse
+// @router /v1/syncIDInfo/ [post]
+func (h *HTFuturesAccountController) SyncCustomerIDInfo() {
+	controllers.WrapWebhook(&h.WebHookController, func() (result *controllers.WrapData, err error) {
+		result = h.InitWrapData("证件信息信息")
+		syncCustomerRiskLevelReq := new(IDInfoReq)
+		h.GetPostParams(syncCustomerRiskLevelReq)
+		if ThirdRateLimitFilter(syncCustomerRiskLevelReq.IdNo) != 200 {
+			err = exception.New(exception.TooManyRequest)
+			h.FailedResult("接口请求太频繁,请稍后重试", result)
+			return
+		}
+
+		if syncCustomerRiskLevelReq.MobileTel == "" {
+			err = exception.New(exception.SyncAccountStatusError)
+			h.FailedResult("手机号码不能为空", result)
+			return
+		}
+		if _, ok := idKindMap[syncCustomerRiskLevelReq.IdKind]; !ok {
+			err = exception.New(exception.SyncAccountStatusError)
+			validIdKind := make([]string, 0)
+			for _, v := range idKindMap {
+				validIdKind = append(validIdKind, string(v))
+			}
+			h.FailedResult(fmt.Sprintf("证件类型不合法,当前只支持[%s]", strings.Join(validIdKind, ",")), result)
+			return
+		}
+		if syncCustomerRiskLevelReq.IdNo == "" {
+			err = exception.New(exception.SyncAccountStatusError)
+			h.FailedResult("证号号码不能为空", result)
+			return
+		}
+		idBeginDate, parseErr := time.Parse(time.DateOnly, syncCustomerRiskLevelReq.IdBeginDate)
+		if parseErr != nil {
+			err = exception.New(exception.SyncAccountStatusError)
+			h.FailedResult("身份证有效开始时间不合法["+syncCustomerRiskLevelReq.IdBeginDate+"]", result)
+			return
+		}
+		idEndDate, parseErr := time.Parse(time.DateOnly, syncCustomerRiskLevelReq.IdEndDate)
+		if parseErr != nil {
+			err = exception.New(exception.SyncAccountStatusError)
+			h.FailedResult("身份证有效结束时间不合法["+syncCustomerRiskLevelReq.IdEndDate+"]", result)
+			return
+		}
+		if idEndDate.Before(idBeginDate) {
+			err = exception.New(exception.SyncAccountStatusError)
+			h.FailedResult("身份证有效结束时间不合法,开始日期不能大于结束日期", result)
+			return
+		}
+		err = accountService.UpdateUserIDINFO(accountService.IDInfoDTO{
+			MobileTel:   syncCustomerRiskLevelReq.MobileTel,
+			IdKind:      syncCustomerRiskLevelReq.IdKind,
+			IdNo:        syncCustomerRiskLevelReq.IdNo,
+			IdBeginDate: idBeginDate,
+			IdEndDate:   idEndDate,
+		})
+		if err != nil {
+			logger.ErrorWithTraceId(h.Ctx, err.Error())
+			h.FailedResult(err.Error(), result)
+			err = exception.New(exception.SyncAccountStatusError)
+			return
+		}
+		result = h.InitWrapData("同步开户信息成功")
+		h.SuccessResult("success", syncCustomerRiskLevelReq, result)
+		return
+	})
+}
+
 type SyncCustomerRiskLevelReq struct {
 	CustInfo CustInfo `json:"custInfo"`
 	RiskInfo RiskInfo `json:"riskInfo"`
@@ -368,3 +439,10 @@ type AccountOpenInfoReq struct {
 	ErrorMessage string `json:"error_message"`
 	Timestamp    int64  `json:"timestamp"`
 }
+type IDInfoReq struct {
+	MobileTel   string `json:"mobile_tel"`
+	IdKind      int    `json:"id_kind"`
+	IdNo        string `json:"id_no"`
+	IdBeginDate string `json:"id_begin_date"`
+	IdEndDate   string `json:"id_end_date"`
+}

+ 1 - 1
controllers/webhook_controller.go

@@ -62,7 +62,7 @@ func (b *WebHookController) JsonResult(status int, errCode int, errMsg string, m
 	b.ServeJSON()
 }
 
-// Wrap ControllerWrap 是一个用于封装控制器方法的函数
+// WrapWebhook Wrap ControllerWrap 是一个用于封装控制器方法的函数
 func WrapWebhook(a *WebHookController, fn func() (*WrapData, error)) {
 	result, err := fn()
 	if err != nil {

+ 1 - 0
models/user/third_user_biz_flow.go

@@ -8,6 +8,7 @@ import (
 const (
 	BizTypeAccountOpen = "account_open"
 	BizTypeRiskSync    = "risk_sync"
+	BizIDInfoSync      = "risk_sync"
 	BizTypeSuccess     = "success"
 	BizTypeFailed      = "failed"
 )

+ 25 - 3
models/user/user.go

@@ -41,15 +41,37 @@ func OpenAccountSuccess(info User) (err error) {
 	}
 	defer func() {
 		if err != nil {
-			tx.Rollback()
+			err = tx.Rollback().Error
 			return
 		}
-		tx.Commit()
+		err = tx.Commit().Error
 	}()
 	err = tx.Save(&info).Error
 	if err != nil {
 		return
 	}
-	err = tx.Exec("update template_users set account_status='open' where id=?", info.TemplateUserID).Error
+	err = tx.Exec("update template_users set account_status='open' , username=? where id=?", info.RealName, info.TemplateUserID).Error
+	return
+}
+
+func UpdateIDInfo(info User) (err error) {
+	db := models.Main()
+	tx := db.Begin()
+	if tx.Error != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			err = tx.Rollback().Error
+			return
+		}
+		err = tx.Commit().Error
+	}()
+	err = tx.Save(&info).Error
+	if err != nil {
+		return
+	}
+	DateStr := info.IDEndDate.Format(time.DateOnly)
+	err = tx.Exec("update template_users set risk_valid_end_date=? where id=?", DateStr, info.TemplateUserID).Error
 	return
 }

+ 9 - 0
routers/commentsRouter.go

@@ -644,6 +644,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: "SyncCustomerIDInfo",
+            Router: `/v1/syncIDInfo/`,
+            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",

+ 61 - 0
service/user/user_service.go

@@ -619,6 +619,13 @@ type AccountStatusDTO struct {
 	AccountStatus string
 	ErrorMessage  string
 }
+type IDInfoDTO struct {
+	MobileTel   string
+	IdKind      int
+	IdNo        string
+	IdBeginDate time.Time
+	IdEndDate   time.Time
+}
 
 func (bk BookMarkReport) GetID() int {
 	return bk.ReportID
@@ -710,3 +717,57 @@ func UpdateUserAccountOpenStatus(dto AccountStatusDTO) (err error) {
 	}
 	return
 }
+
+func UpdateUserIDINFO(dto IDInfoDTO) (err error) {
+	//通过手机号获取临时用户
+	templateUser, err := userDao.GetUserByMobile(dto.MobileTel)
+	if err != nil {
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			logger.Error("获取用户信息失败,手机号码不存在:" + dto.MobileTel)
+			err = fmt.Errorf("获取用户信息失败,手机号码不存在:%s", dto.MobileTel)
+		} else {
+			logger.Error("获取用户信息失败:" + err.Error())
+			err = fmt.Errorf("获取用户信息失败,手机号码:%s", dto.MobileTel)
+		}
+		return
+	}
+	//根据临时用户id获取正式用户信息
+	userInfo, err := userDao.GetThirdUserInfoByTemplateUserId(templateUser.Id)
+	if err != nil {
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			logger.Error("用户记录不存在,手机号码:" + dto.MobileTel)
+			err = fmt.Errorf("用户记录不存在,手机号码:%s", dto.MobileTel)
+		} else {
+			logger.Error("获取用户记录失败:" + err.Error())
+			err = fmt.Errorf("获取用户记录失败,手机号码:%s", dto.MobileTel)
+		}
+		return
+	}
+	if userInfo.IDNo != dto.IdNo {
+		logger.Error("证件号码不一致,手机号码:" + dto.MobileTel)
+		err = fmt.Errorf("证件号码不一致,手机号码:%s", dto.MobileTel)
+		return
+	}
+	var thirdBizFlow *userDao.ThirdUserBizFlow
+	userInfo.IDBeginDate = dto.IdBeginDate
+	userInfo.IDEndDate = dto.IdEndDate
+	err = userDao.UpdateIDInfo(userInfo)
+	if err != nil {
+		logger.Error(fmt.Sprintf("更新用户证件信息失败:%v", userInfo) + err.Error())
+		err = fmt.Errorf("更新用户证件信息失败,手机号码:%v", dto.MobileTel)
+		return
+	}
+	thirdBizFlow = &userDao.ThirdUserBizFlow{
+		TemplateUserId: templateUser.Id,
+		UserId:         userInfo.ID,
+		BizType:        userDao.BizIDInfoSync,
+		BizStatus:      userDao.BizTypeSuccess,
+		CreatedTime:    time.Now(),
+	}
+
+	flowErr := userDao.InsertThirdBizFlow(thirdBizFlow)
+	if flowErr != nil {
+		logger.Error(fmt.Sprintf("插入第三方回调信息记录失败:%v", thirdBizFlow) + flowErr.Error())
+	}
+	return
+}