Selaa lähdekoodia

退款消息推送

kobe6258 3 kuukautta sitten
vanhempi
commit
ccb27ff0aa

+ 2 - 0
common/exception/exc_enums.go

@@ -159,6 +159,7 @@ const (
 	CreatePaymentOrderFailed
 	PaymentProcessingError
 	PaymentDoneError
+	RefundDealFail
 )
 
 // ErrorMap 用于存储错误码和错误信息的映射
@@ -269,6 +270,7 @@ var ErrorMap = map[int]string{
 	CreatePaymentOrderFailed: "创建支付订单失败",
 	PaymentProcessingError:   "支付订单处理中",
 	PaymentDoneError:         "订单已完成支付",
+	RefundDealFail:           "处理退款应答失败",
 }
 
 func Equals(code int, message string) bool {

+ 27 - 10
controllers/web_hook/htfutures_trade_controller.go

@@ -1,7 +1,10 @@
 package web_hook
 
 import (
+	logger "eta/eta_mini_ht_api/common/component/log"
+	"eta/eta_mini_ht_api/common/exception"
 	"eta/eta_mini_ht_api/controllers"
+	orderService "eta/eta_mini_ht_api/domian/order"
 	"eta/eta_mini_ht_api/service/product"
 )
 
@@ -10,13 +13,14 @@ type HTFuturesTradeController struct {
 }
 
 type ss struct {
-	ID   string `json:"id"`
-	User int    `json:"user"`
+	ID           string `json:"id"`
+	User         int    `json:"user"`
+	TradeOrderNo string `json:"tradeOrderNo"`
 }
 
-// InformPaymentResult  风险测评同步接口
-// @Summary 风险测评同步接口
-// @Description 风险测评同步接口
+// InformPaymentResult  支付通知接口
+// @Summary 支付通知接口
+// @Description 支付通知接口
 // @Success 200 {object} controllers.BaseResponse
 // @router /v1/payment/informPaymentResult [post]
 func (h *HTFuturesTradeController) InformPaymentResult() {
@@ -24,6 +28,9 @@ func (h *HTFuturesTradeController) InformPaymentResult() {
 		result = h.InitWrapData("同步风险等级")
 		ss := new(ss)
 		h.GetPostParams(ss)
+
+		logger.Info("支付结果通知: %v", ss)
+
 		//privateKey, err := authUtils.ParsePrivateKey(htConfig.GetWebhookPrivateKey())
 		_ = product.OpenProduct(ss.User, ss.ID)
 
@@ -58,9 +65,9 @@ func (h *HTFuturesTradeController) InformPaymentResult() {
 	})
 }
 
-// InformRefundResult  风险测评同步接口
-// @Summary 风险测评同步接口
-// @Description 风险测评同步接口
+// InformRefundResult  退款通知接口
+// @Summary 退款通知接口
+// @Description 退款通知接口
 // @Success 200 {object} controllers.BaseResponse
 // @router /v1/payment/informRefundResult [post]
 func (h *HTFuturesTradeController) InformRefundResult() {
@@ -68,9 +75,19 @@ func (h *HTFuturesTradeController) InformRefundResult() {
 		result = h.InitWrapData("同步风险等级")
 		ss := new(ss)
 		h.GetPostParams(ss)
-		//privateKey, err := authUtils.ParsePrivateKey(htConfig.GetWebhookPrivateKey())
-		_ = product.CloseProduct(ss.User, ss.ID)
+		flow, err := orderService.DealRefund(ss.TradeOrderNo, orderService.RefundSuccess)
+		if err != nil {
+			logger.Error("退款订单处理失败: %v", err)
+			err = exception.NewWithException(exception.RefundDealFail, err.Error())
+			h.FailedResult("退款订单处理失败", result)
+			return
+		}
+		//处理退款订单
+		if true {
+			_ = product.CloseProduct(ss.User, flow.ProductOrderNo)
+		}
 
+		//创建meta_info
 		//htConfig := config.GetConfig(contants.HT).(*config.HTBizConfig)
 		//webhookRequest := new(WebhookRequest)
 		//h.GetPostParams(webhookRequest)

+ 2 - 9
domian/user/meta_info.go → domian/message/meta_info.go

@@ -1,7 +1,7 @@
-package user
+package message
 
 import (
-	userDao "eta/eta_mini_ht_api/models/user"
+	userDao "eta/eta_mini_ht_api/models/message"
 )
 
 type MetaInfoDTO struct {
@@ -13,13 +13,6 @@ type MetaInfoDTO struct {
 	MetaType   string `json:"MetaType,omitempty"`
 }
 
-type MetaData struct {
-	SourceId      int    `json:"reportId"`
-	AuthorId      int    `json:"AuthorId"`
-	AuthorName    string `json:"authorName"`
-	PublishedTime string `json:"publishedTime"`
-}
-
 func CreateMetaInfo(dto MetaInfoDTO) (err error) {
 	return userDao.CreateMetaInfo(convertToMetaInfo(dto))
 }

+ 0 - 1
domian/order/product_order.go

@@ -65,7 +65,6 @@ var (
 		orderDao.RefundStatusFailed:     "退款失败",
 		orderDao.RefundStatusProcessing: "退款中",
 		orderDao.RefundStatusSuccess:    "退款成功",
-		orderDao.RefundStatusCanceled:   "取消退款",
 	}
 	transProductMap = map[string]productDao.MerchantProductType{
 		"report":  productDao.Report,

+ 83 - 4
domian/order/trade_order.go

@@ -1,18 +1,23 @@
 package order
 
 import (
+	"encoding/json"
 	logger "eta/eta_mini_ht_api/common/component/log"
 	"eta/eta_mini_ht_api/models"
+	"eta/eta_mini_ht_api/models/message"
 	"eta/eta_mini_ht_api/models/order"
 	"fmt"
 	"math/rand"
+	"strconv"
 	"time"
 )
 
 const (
-	RMB                  = "CNY"
-	AliPayWay PaymentWay = "alipay"
-	WechatPay PaymentWay = "wechat"
+	RMB                      = "CNY"
+	AliPayWay     PaymentWay = "alipay"
+	WechatPay     PaymentWay = "wechat"
+	RefundSuccess            = "success"
+	RefundFail               = "fail"
 )
 
 type PaymentWay string
@@ -110,7 +115,81 @@ func GetUnFailedTradeFlowByProductOrder(productOrderNo string) (dtoList []TradeO
 }
 func GetTradeOrderByNo(tradeOrderNo string) (dto TradeOrderDTO, err error) {
 	var tradeOrder order.TradeOrder
-	tradeOrder, err = order.GetTradeOrderByNo(tradeOrderNo)
+	tradeOrder, err = order.GetTradeOrderByNo(tradeOrderNo, order.PaymentTypePay)
 	dto = convertToDTO(tradeOrder)
 	return
 }
+
+type RefundDealFlowDTO struct {
+	OperatorUserID int    `gorm:"column:operator_user_id"`
+	ProductOrderNo string `gorm:"column:product_order_no"`
+	RefundOrderNo  string `gorm:"column:refund_order_no"`
+}
+
+func DealRefund(refundOrderNo string, flag string) (dto RefundDealFlowDTO, err error) {
+	flow, err := order.GetRefundFlow(refundOrderNo)
+	if err != nil {
+		logger.Error("获取退款流水失败%v,退款订单:%s", err, refundOrderNo)
+		return
+	}
+	dto = convertRefundDTO(flow)
+	//处理退款订单
+	TradeOrder, err := order.GetTradeOrderByNo(flow.RefundOrderNo, order.PaymentTypeRefund)
+	if err != nil {
+		logger.Error("获取退款订单失败%v,退款订单:%s", err, refundOrderNo)
+		return
+	}
+	err = order.DealRefundOrder(TradeOrder, true)
+	if err != nil {
+		logger.Error("处理退款结果失败%v,退款订单:%s", err, refundOrderNo)
+		return
+	}
+	_ = createRefundMetaInfo(flow.OperatorUserID, flow.ProductOrderNo, flag)
+	return
+}
+func convertRefundDTO(flow order.RefundDealFlow) RefundDealFlowDTO {
+	return RefundDealFlowDTO{
+		OperatorUserID: flow.OperatorUserID,
+		ProductOrderNo: flow.ProductOrderNo,
+		RefundOrderNo:  flow.RefundOrderNo,
+	}
+
+}
+
+func createRefundMetaInfo(sysUserId int, productOrderNo string, flag string) (err error) {
+	productOrder, err := order.GetOrderByOrderNo(productOrderNo)
+	if err != nil {
+		logger.Error("生成退款消息通知失败,获取订单信息失败:v,订单编号:%s", err, productOrderNo)
+		return
+	}
+	var result string
+	switch flag {
+	case RefundSuccess:
+		result = "成功"
+	case RefundFail:
+		result = "失败"
+	default:
+		logger.Error("生成退款消息通知失败,未知的退款状态%s,订单编号:%s", flag, productOrderNo)
+		return
+	}
+	refundInfo := message.RefundMetaData{
+		RealName:       productOrder.RealName,
+		ProductOrderNo: productOrderNo,
+		Result:         result,
+	}
+
+	bytes, err := json.Marshal(refundInfo)
+	if err != nil {
+		logger.Error("生成退款消息通知失败,序列化退款信息失败:%v,订单编号:%s", err, productOrderNo)
+		return
+	}
+	metaInfo := message.MetaInfo{
+		Meta:       string(bytes),
+		MetaType:   message.SysUserNoticeType,
+		SourceType: message.RefundSourceType,
+		Status:     message.InitStatusType,
+		From:       "HTTradePlate",
+		To:         strconv.Itoa(sysUserId),
+	}
+	return message.CreateMetaInfo(metaInfo)
+}

+ 8 - 5
domian/report/report_service.go

@@ -10,6 +10,7 @@ import (
 	stringUtils "eta/eta_mini_ht_api/common/utils/string"
 	configService "eta/eta_mini_ht_api/domian/config"
 	analystService "eta/eta_mini_ht_api/domian/financial_analyst"
+	messageDomian "eta/eta_mini_ht_api/domian/message"
 	userService "eta/eta_mini_ht_api/domian/user"
 	"eta/eta_mini_ht_api/models"
 	configDao "eta/eta_mini_ht_api/models/config"
@@ -18,6 +19,8 @@ import (
 	etaDao "eta/eta_mini_ht_api/models/eta"
 	"eta/eta_mini_ht_api/models/ht"
 	mediaDao "eta/eta_mini_ht_api/models/image"
+	"eta/eta_mini_ht_api/models/message"
+	messageDao "eta/eta_mini_ht_api/models/message"
 	reportDao "eta/eta_mini_ht_api/models/report"
 	userDao "eta/eta_mini_ht_api/models/user"
 	"math/rand"
@@ -583,12 +586,12 @@ func syncESAndSendMessage(reports []reportDao.Report) (err error) {
 			}
 			if report.Status == reportDao.StatusUnPublish {
 				//隐藏热度搜索
-				err = userDao.HiddenFlows(report.ID, userDao.ReportSourceType)
+				err = userDao.HiddenFlows(report.ID, message.ReportSourceType)
 				if err != nil {
 					logger.Error("隐藏热度搜索失败,reportId::%d,err:%v", report.ID, err)
 				}
 			} else {
-				err = userDao.ShowFlows(report.ID, userDao.ReportSourceType)
+				err = userDao.ShowFlows(report.ID, message.ReportSourceType)
 				if err != nil {
 					logger.Error("重置热度搜索失败,reportId::%d,err:%v", report.ID, err)
 				}
@@ -647,7 +650,7 @@ func syncESAndSendMessage(reports []reportDao.Report) (err error) {
 						continue
 					}
 					usersStr := stringUtils.IntToStringSlice(userIds)
-					Meta := userService.MetaData{
+					Meta := messageDao.MetaData{
 						AuthorName:    author.Name,
 						AuthorId:      author.Id,
 						SourceId:      report.ID,
@@ -655,14 +658,14 @@ func syncESAndSendMessage(reports []reportDao.Report) (err error) {
 					}
 					metaStr, _ := json.Marshal(Meta)
 					toStr := strings.Join(usersStr, ",")
-					metaContent := userService.MetaInfoDTO{
+					metaContent := messageDomian.MetaInfoDTO{
 						From:       From,
 						Meta:       string(metaStr),
 						MetaType:   "USER_NOTICE",
 						SourceType: "REPORT",
 						To:         toStr,
 					}
-					err = userService.CreateMetaInfo(metaContent)
+					err = messageDomian.CreateMetaInfo(metaContent)
 					if err != nil {
 						logger.Error("创建Meta信息失败:%v", err)
 						return err

+ 40 - 18
domian/user/user_message_service.go

@@ -4,6 +4,8 @@ import (
 	"bytes"
 	"encoding/json"
 	logger "eta/eta_mini_ht_api/common/component/log"
+	"eta/eta_mini_ht_api/domian/message"
+	messageDao "eta/eta_mini_ht_api/models/message"
 	userDao "eta/eta_mini_ht_api/models/user"
 	"fmt"
 	"strconv"
@@ -38,34 +40,54 @@ type MessageInfo struct {
 	analyst string
 }
 
-func CreateMessage(meta MetaInfoDTO) (err error) {
-	messageType := userDao.SourceType(meta.SourceType)
+func createRefundMessage(meta message.MetaInfoDTO) (err error) {
+	var content messageDao.RefundMetaData
+	err = json.Unmarshal([]byte(meta.Meta), &content)
+	messageInfo, _ := generateMessage(content, RefundMessageTemplate)
+	userId, _ := strconv.Atoi(meta.To)
+	userMessage := userDao.UserMessage{
+		UserId:  userId,
+		Message: messageInfo,
+		Type:    messageDao.RefundSourceType,
+		Status:  userDao.UnReadStatus,
+	}
+	if err = userDao.CreateMessage(userMessage); err == nil {
+		messageDao.FinishMetaInfo(meta.Id)
+	} else {
+		logger.Error("生成消息信息失败:%v", err)
+		messageDao.FailedMetaInfo(meta.Id)
+	}
+	return
+}
+func CreateMessage(meta message.MetaInfoDTO) (err error) {
+	if messageDao.SourceType(meta.SourceType) == messageDao.RefundSourceType {
+		return createRefundMessage(meta)
+	}
+	messageType := messageDao.SourceType(meta.SourceType)
 	var messageList []userDao.UserMessage
 	users := strings.Split(meta.To, ",")
-	var message string
-	var content MetaData
+	var messageInfo string
+	var content messageDao.MetaData
 	err = json.Unmarshal([]byte(meta.Meta), &content)
 	if err != nil {
 		logger.Error("生成消息信息失败:%v", err)
-		userDao.FailedMetaInfo(meta.Id)
+		messageDao.FailedMetaInfo(meta.Id)
 	}
-	switch userDao.SourceType(meta.SourceType) {
-	case userDao.ReportSourceType:
-		message = fmt.Sprintf(ReportMessageTemplate, content.AuthorName)
-		messageType = userDao.ReportSourceType
-	case userDao.VideoSourceType:
-		message = fmt.Sprintf(VideoMessageTemplate, content.AuthorName)
-	case userDao.AudioSourceType:
-		message = fmt.Sprintf(AudioMessageTemplate, content.AuthorName)
-	case userDao.RefundSourceType:
-		message, _ = generateMessage(nil, RefundMessageTemplate)
+	switch messageDao.SourceType(meta.SourceType) {
+	case messageDao.ReportSourceType:
+		messageInfo = fmt.Sprintf(ReportMessageTemplate, content.AuthorName)
+		messageType = messageDao.ReportSourceType
+	case messageDao.VideoSourceType:
+		messageInfo = fmt.Sprintf(VideoMessageTemplate, content.AuthorName)
+	case messageDao.AudioSourceType:
+		messageInfo = fmt.Sprintf(AudioMessageTemplate, content.AuthorName)
 	}
 	for _, user := range users {
 		id, _ := strconv.Atoi(user)
 		userMessage := userDao.UserMessage{
 			AnalystId: content.AuthorId,
 			UserId:    id,
-			Message:   message,
+			Message:   messageInfo,
 			SourceId:  content.SourceId,
 			Type:      messageType,
 			Status:    userDao.UnReadStatus,
@@ -73,10 +95,10 @@ func CreateMessage(meta MetaInfoDTO) (err error) {
 		messageList = append(messageList, userMessage)
 	}
 	if userDao.BatchInsertMessage(messageList) {
-		userDao.FinishMetaInfo(meta.Id)
+		messageDao.FinishMetaInfo(meta.Id)
 	} else {
 		logger.Error("生成消息信息失败:%v", err)
-		userDao.FailedMetaInfo(meta.Id)
+		messageDao.FailedMetaInfo(meta.Id)
 	}
 	return
 }

+ 7 - 6
domian/user/user_source_click_flow_service.go

@@ -3,6 +3,7 @@ package user
 import (
 	"errors"
 	logger "eta/eta_mini_ht_api/common/component/log"
+	"eta/eta_mini_ht_api/models/message"
 	userDao "eta/eta_mini_ht_api/models/user"
 	"fmt"
 	"time"
@@ -14,7 +15,7 @@ type RecordCountDTO struct {
 	Mobile      string
 	SourceId    int
 	SourceTitle string
-	SourceType  userDao.SourceType
+	SourceType  message.SourceType
 	IpAddress   string
 	Location    string
 	Referer     string
@@ -26,12 +27,12 @@ const (
 	audio = "audio"
 )
 
-func getSourceType(mediaType string) userDao.SourceType {
+func getSourceType(mediaType string) message.SourceType {
 	switch mediaType {
 	case video:
-		return userDao.VideoSourceType
+		return message.VideoSourceType
 	case audio:
-		return userDao.AudioSourceType
+		return message.AudioSourceType
 	default:
 		return ""
 	}
@@ -104,7 +105,7 @@ type HotReportDTO struct {
 }
 
 func GetHotReports(begin string, end string, limit int) (dtoList []HotReportDTO) {
-	counts, err := userDao.GetTimeDurationReportCountsById(begin, end, limit, userDao.ReportSourceType)
+	counts, err := userDao.GetTimeDurationReportCountsById(begin, end, limit, message.ReportSourceType)
 	if err != nil {
 		logger.Error("获取最热研报数据失败:%v", err)
 		return
@@ -124,7 +125,7 @@ func convertUserToReportFlow(record RecordCountDTO) userDao.UserSourceClickFlow
 		SourceId:       record.SourceId,
 		SourceTitle:    record.SourceTitle,
 		TraceId:        record.TraceId,
-		SourceType:     userDao.ReportSourceType,
+		SourceType:     message.ReportSourceType,
 		IPAddress:      record.IpAddress,
 		Location:       record.Location,
 		Referer:        record.Referer,

+ 14 - 2
models/user/meta_info.go → models/message/meta_info.go

@@ -1,4 +1,4 @@
-package user
+package message
 
 import (
 	logger "eta/eta_mini_ht_api/common/component/log"
@@ -13,6 +13,7 @@ type MetaType string
 
 const (
 	UserNoticeType    MetaType   = "USER_NOTICE"
+	SysUserNoticeType MetaType   = "SYS_USER_NOTICE"
 	InitStatusType    StatusType = "INIT"
 	PendingStatusType StatusType = "PENDING"
 	FinishStatusType  StatusType = "FINISH"
@@ -30,12 +31,23 @@ type MetaInfo struct {
 	Meta        string     `gorm:"column:meta"`
 	From        string     `gorm:"column:from"`
 	To          string     `gorm:"column:to"`
-	SourceType  SourceType `gorm:"column:source_type;type:enum('REPORT','VIDEO','AUDIO')"`
+	SourceType  SourceType `gorm:"column:source_type;type:enum('REPORT','VIDEO','AUDIO','REFUND')"`
 	MetaType    MetaType   `gorm:"column:meta_type;type:enum('USER_NOTICE')"`
 	Status      StatusType `gorm:"column:status;type:enum('INIT','PENDING','FINISH','FAILED')"`
 	CreatedTime time.Time
 	UpdatedTime time.Time
 }
+type MetaData struct {
+	SourceId      int    `json:"reportId"`
+	AuthorId      int    `json:"AuthorId"`
+	AuthorName    string `json:"authorName"`
+	PublishedTime string `json:"publishedTime"`
+}
+type RefundMetaData struct {
+	RealName       string `json:"realName,omitempty"`
+	ProductOrderNo string `json:"productOrderNo,omitempty"`
+	Result         string `json:"result,omitempty"`
+}
 
 func (mt *MetaInfo) BeforeCreate(_ *gorm.DB) (err error) {
 	mt.CreatedTime = time.Now()

+ 6 - 3
models/order/product_order.go

@@ -26,9 +26,8 @@ const (
 	RefundStatusPending    RefundStatus = "pending"
 	RefundStatusFailed     RefundStatus = "failed"
 	RefundStatusProcessing RefundStatus = "processing"
-	RefundStatusCanceled   RefundStatus = "canceled"
 
-	detailColumn = "id,order_id,user_id,template_user_id,product_id,status,created_time,updated_time,total_amount,expired_time"
+	detailColumn = "id,order_id,user_id,template_user_id,product_id,status,created_time,updated_time,total_amount,expired_time,real_name,mobile"
 )
 
 type ProductOrder struct {
@@ -157,7 +156,11 @@ func GetOrderByUser(templateUserId int, orderNo string) (order ProductOrder, err
 	err = db.Model(&ProductOrder{}).Select(detailColumn).Where("template_user_id= ? and order_id=? and is_deleted=0 ", templateUserId, orderNo).First(&order).Error
 	return
 }
-
+func GetOrderByOrderNo(orderNo string) (order ProductOrder, err error) {
+	db := models.Main()
+	err = db.Model(&ProductOrder{}).Select(detailColumn).Where("order_id=? and is_deleted=0 ", orderNo).First(&order).Error
+	return
+}
 func CloseProductOrder(templateUserId int, productOrderNo string) (err error) {
 	db := models.Main()
 	var dbOrder ProductOrder

+ 25 - 0
models/order/refund_deal_flow.go

@@ -0,0 +1,25 @@
+package order
+
+import (
+	"eta/eta_mini_ht_api/models"
+	"time"
+)
+
+type RefundDealFlow struct {
+	ID             int       `gorm:"column:id;primaryKey"`
+	OperatorUserID int       `gorm:"column:operator_user_id"`
+	ProductOrderNo string    `gorm:"column:product_order_no"`
+	RefundOrderNo  string    `gorm:"column:refund_order_no"`
+	CreatedTime    time.Time `gorm:"column:created_time"`
+}
+
+// TableName 返回表名
+func (*RefundDealFlow) TableName() string {
+	return "refund_deal_flow"
+}
+
+func GetRefundFlow(refundOrderNo string) (flow RefundDealFlow, err error) {
+	db := models.Main()
+	err = db.Select("*").Where("refund_order_no=?", refundOrderNo).First(&flow).Error
+	return
+}

+ 35 - 2
models/order/trade_order.go

@@ -56,8 +56,41 @@ func GetUnFailedTradeFlowByProductOrder(no string) (list []TradeOrder, err error
 	err = db.Where("product_order_id=? and payment_status!=? order by updated_time,created_time desc", no, PaymentStatusFailed).Find(&list).Error
 	return
 }
-func GetTradeOrderByNo(no string) (order TradeOrder, err error) {
+func GetTradeOrderByNo(tradeOrderNo string, paymentType PaymentType) (order TradeOrder, err error) {
 	db := models.Main()
-	err = db.Where("transaction_id=? and payment_type =?", no, PaymentTypePay).First(&order).Error
+	err = db.Where("transaction_id=? and payment_type =?", tradeOrderNo, paymentType).First(&order).Error
+	return
+}
+
+func DealRefundOrder(order TradeOrder, isSuccess bool) (err error) {
+	var paymentStatus PaymentStatus
+	var refundStatus RefundStatus
+	if isSuccess {
+		paymentStatus = PaymentStatusDone
+		refundStatus = RefundStatusSuccess
+	} else {
+		paymentStatus = PaymentStatusFailed
+		refundStatus = RefundStatusFailed
+	}
+	db := models.Main()
+	tx := db.Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+			return
+		}
+		tx.Commit()
+	}()
+	err = tx.Model(&TradeOrder{}).Where("id=?", order.ID).Updates(map[string]interface{}{
+		"payment_status": paymentStatus,
+		"deal_time":      time.Now(),
+	}).Error
+	if err != nil {
+		return
+	}
+	err = tx.Model(&ProductOrder{}).Where("order_id=?", order.ProductOrderID).Updates(map[string]interface{}{
+		"refund_status":      refundStatus,
+		"refund_finish_time": time.Now(),
+	}).Error
 	return
 }

+ 14 - 13
models/user/user_message.go

@@ -3,6 +3,7 @@ package user
 import (
 	logger "eta/eta_mini_ht_api/common/component/log"
 	"eta/eta_mini_ht_api/models"
+	"eta/eta_mini_ht_api/models/message"
 	"gorm.io/gorm"
 	"time"
 )
@@ -10,23 +11,23 @@ import (
 type MessageType string
 
 const (
-	UnReadStatus     StatusType = "UNREAD"
-	ReadStatus       StatusType = "READ"
-	MaxBatchNum                 = 1000
-	MyMessageColumns            = "id,source_id,type,message"
+	UnReadStatus     message.StatusType = "UNREAD"
+	ReadStatus       message.StatusType = "READ"
+	MaxBatchNum                         = 1000
+	MyMessageColumns                    = "id,source_id,type,message"
 )
 
 // UserMessage 表示 user_message 表的模型
 type UserMessage struct {
-	Id          int        `gorm:"primaryKey;autoIncrement;column:id"`
-	AnalystId   int        `gorm:"column:analyst_id"`
-	UserId      int        `gorm:"column:user_id"`
-	SourceId    int        `gorm:"column:source_id"`
-	Message     string     `gorm:"column:message"`
-	Type        SourceType `gorm:"column:type;type:enum('REPORT','VIDEO','AUDIO')"`
-	Status      StatusType `gorm:"column:status;type:enum('UNREAD','READ')"`
-	CreatedTime time.Time  `gorm:"column:created_time;type:timestamps;comment:创建时间"`
-	UpdatedTime time.Time  `gorm:"column:updated_time"`
+	Id          int                `gorm:"primaryKey;autoIncrement;column:id"`
+	AnalystId   int                `gorm:"column:analyst_id"`
+	UserId      int                `gorm:"column:user_id"`
+	SourceId    int                `gorm:"column:source_id"`
+	Message     string             `gorm:"column:message"`
+	Type        message.SourceType `gorm:"column:type;type:enum('REPORT','VIDEO','AUDIO')"`
+	Status      message.StatusType `gorm:"column:status;type:enum('UNREAD','READ')"`
+	CreatedTime time.Time          `gorm:"column:created_time;type:timestamps;comment:创建时间"`
+	UpdatedTime time.Time          `gorm:"column:updated_time"`
 }
 
 func (u *UserMessage) BeforeCreate(_ *gorm.DB) (err error) {

+ 18 - 17
models/user/user_source_click_flow.go

@@ -2,6 +2,7 @@ package user
 
 import (
 	"eta/eta_mini_ht_api/models"
+	"eta/eta_mini_ht_api/models/message"
 	"gorm.io/gorm"
 	"time"
 )
@@ -12,20 +13,20 @@ const (
 
 // UserReportClickFlow 用户点击研报流水记录
 type UserSourceClickFlow struct {
-	ID                  int        `gorm:"column:id;primaryKey;autoIncrement:'id'"`
-	TraceId             string     `gorm:"column:trace_id"`
-	UserID              int        `gorm:"column:user_id"` // 用户ID\
-	Mobile              string     `gorm:"column:mobile"`
-	SourceId            int        `gorm:"column:source_id"`    // 研报ID
-	SourceTitle         string     `gorm:"column:source_title"` // 研报ID
-	SourceType          SourceType `gorm:"column:source_type;type:enum('REPORT','VIDEO','AUDIO')"`
-	ClickTime           time.Time  `gorm:"column:click_time"` // 点击时间
-	ReadDurationSeconds int64      `gorm:"column:read_duration_seconds"`
-	IPAddress           string     `gorm:"column:ip_address"` // IP地址
-	Location            string     `gorm:"column:location"`   // 地理位置
-	Hidden              bool       `gorm:"column:hidden;type:tinyint(1);default:0"`
-	Referer             string     `gorm:"column:referer"`         // 来源页面
-	AdditionalData      string     `gorm:"column:additional_data"` // 额外数据
+	ID                  int                `gorm:"column:id;primaryKey;autoIncrement:'id'"`
+	TraceId             string             `gorm:"column:trace_id"`
+	UserID              int                `gorm:"column:user_id"` // 用户ID\
+	Mobile              string             `gorm:"column:mobile"`
+	SourceId            int                `gorm:"column:source_id"`    // 研报ID
+	SourceTitle         string             `gorm:"column:source_title"` // 研报ID
+	SourceType          message.SourceType `gorm:"column:source_type;type:enum('REPORT','VIDEO','AUDIO')"`
+	ClickTime           time.Time          `gorm:"column:click_time"` // 点击时间
+	ReadDurationSeconds int64              `gorm:"column:read_duration_seconds"`
+	IPAddress           string             `gorm:"column:ip_address"` // IP地址
+	Location            string             `gorm:"column:location"`   // 地理位置
+	Hidden              bool               `gorm:"column:hidden;type:tinyint(1);default:0"`
+	Referer             string             `gorm:"column:referer"`         // 来源页面
+	AdditionalData      string             `gorm:"column:additional_data"` // 额外数据
 }
 
 func (v *UserSourceClickFlow) BeforeCreate(tx *gorm.DB) (err error) {
@@ -53,19 +54,19 @@ type CountClickFlowById struct {
 	Count    int `gorm:"column:count"`
 }
 
-func GetTimeDurationReportCountsById(begin string, end string, limit int, sourceType SourceType) (ids []CountClickFlowById, err error) {
+func GetTimeDurationReportCountsById(begin string, end string, limit int, sourceType message.SourceType) (ids []CountClickFlowById, err error) {
 	db := models.Main()
 	err = db.Table(userSourceClickFlows).Select("source_id,count(*) count").Where("source_id>0 and source_type=? and DATE(click_time) BETWEEN ? AND ? AND hidden =0", sourceType, begin, end).Group("source_id").Order("count desc").Limit(limit).Scan(&ids).Error
 	return
 }
 
-func HiddenFlows(id int, sourceType SourceType) (err error) {
+func HiddenFlows(id int, sourceType message.SourceType) (err error) {
 	db := models.Main()
 	err = db.Table(userSourceClickFlows).Where("source_type=? and source_id =?", sourceType, id).Update("hidden", 1).Error
 	return
 }
 
-func ShowFlows(id int, sourceType SourceType) (err error) {
+func ShowFlows(id int, sourceType message.SourceType) (err error) {
 	db := models.Main()
 	err = db.Table(userSourceClickFlows).Where("source_type=? and source_id =?", sourceType, id).Update("hidden", 0).Error
 	return

+ 2 - 2
service/product/product_service.go

@@ -162,12 +162,12 @@ func convertToProductDTO(product merchantService.MerchantProductDTO) (productDTO
 
 // OpenProduct 开通产品
 func OpenProduct(templateUserId int, productOrderNo string) (err error) {
-	proudctOrder, err := order.GetProductOrderByUser(templateUserId, productOrderNo)
+	productOrder, err := order.GetProductOrderByUser(templateUserId, productOrderNo)
 	if err != nil {
 		logger.Error("获取产品订单信息失败:%v", err)
 		return
 	}
-	product, err := merchantService.GetMerchantProductById(proudctOrder.ProductID)
+	product, err := merchantService.GetMerchantProductById(productOrder.ProductID)
 	if err != nil {
 		logger.Error("获取产品信息失败:%v", err)
 		return

+ 4 - 3
task/message/notice_task.go

@@ -2,6 +2,7 @@ package message
 
 import (
 	logger "eta/eta_mini_ht_api/common/component/log"
+	"eta/eta_mini_ht_api/domian/message"
 	userService "eta/eta_mini_ht_api/domian/user"
 	"eta/eta_mini_ht_api/task/base"
 	"sync"
@@ -14,13 +15,13 @@ var (
 
 // Execute Task ETA取研报的数据
 func (au *NoticeTask) Execute(taskDetail *base.TaskDetail) (err error) {
-	metaInfoList := userService.GetInitMetaInfos()
+	metaInfoList := message.GetInitMetaInfos()
 	var wg sync.WaitGroup
 	wg.Add(len(metaInfoList))
 	for _, metaInfo := range metaInfoList {
-		go func(metaInfo userService.MetaInfoDTO) {
+		go func(metaInfo message.MetaInfoDTO) {
 			defer wg.Done()
-			if !userService.PendingMetaInfo(metaInfo.Id) {
+			if !message.PendingMetaInfo(metaInfo.Id) {
 				return
 			}
 			msgErr := userService.CreateMessage(metaInfo)