浏览代码

定时关单

kobe6258 4 月之前
父节点
当前提交
11c24b37a0

+ 38 - 15
domian/order/product_order.go

@@ -8,6 +8,7 @@ import (
 	orderDao "eta/eta_mini_ht_api/models/order"
 	"fmt"
 	"math/rand"
+	"sync"
 	"time"
 )
 
@@ -206,21 +207,43 @@ func GetOrderDetail(orderId int, userId int) (orderDTO ProductOrderDetailDTO, er
 }
 
 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.GetExpiredPendingOrderIds(minId, 500)
-	//			err = orderDao.batchCloseOrder(ids)
-	//		}()
-	//	}
-	//}
-	return nil
+	var total int
+	var minId int
+	total, minId = orderDao.GetUnPendingOrderCount()
+	var ids []int
+	for total > 0 {
+		ids = orderDao.GetExpiredPendingOrderIds(minId, 500)
+		var wg sync.WaitGroup
+		chunks := chunkSlice(ids, 100)
+		wg.Add(len(chunks))
+		for _, chunk := range chunks {
+			go func(ids []int) {
+				defer wg.Done()
+				err = orderDao.BatchCloseOrder(ids)
+			}(chunk)
+		}
+		wg.Wait()
+		total, minId = orderDao.GetUnPendingOrderCount()
+	}
+	return
+}
+
+// ChunkSlice 将切片分块
+func chunkSlice[T any](slice []T, chunkSize int) [][]T {
+	if chunkSize <= 0 {
+		return nil
+	}
+
+	var chunks [][]T
+	n := len(slice)
+	for i := 0; i < n; i += chunkSize {
+		end := i + chunkSize
+		if end > n {
+			end = n
+		}
+		chunks = append(chunks, slice[i:end])
+	}
+	return chunks
 }
 
 func GetOrderByUser(templateUserId int, orderNo string) (orderDTO ProductOrderDTO, err error) {

+ 1 - 1
main.go

@@ -38,7 +38,7 @@ func main() {
 		logger.Info("开始预加载数据")
 		if htConfig.EnableTask() {
 			//初始化研报库
-			initReport()
+			//initReport()
 		}
 		//初始化第三方AccessToken
 		initThirdPartyAccessToken()

+ 15 - 10
models/order/product_order.go

@@ -45,6 +45,7 @@ type ProductOrder struct {
 	RefundAmount     string       `gorm:"column:refund_amount;size:255;default:null;comment:'退款金额'" json:"refund_amount"`
 	PaymentWay       PaymentWay   `gorm:"column:payment_way;enum('wechat','alipay');default:null;comment:'支付渠道'"`
 	PaymentTime      time.Time    `gorm:"column:payment_time;default:null;comment:'支付时间'" json:"payment_time"`
+	ExpiredTime      time.Time    `gorm:"column:expired_time;default:null;comment:'超时时间'" json:"expired_time"`
 	Status           OrderStatus  `gorm:"column:status;type:enum('pending','processing','paid','closed','refund');default:'pending';comment:'订单状态'" json:"status"`
 	RefundStatus     RefundStatus `gorm:"column:refund_status;type:enum('pending','processing','failed','success');default:null;comment:'退款状态'" json:"refund_status"`
 	RefundFinishTime time.Time    `gorm:"column:refund_finish_time;default:null;comment:'退款完成时间'" json:"refund_finish_time"`
@@ -56,7 +57,10 @@ type ProductOrder struct {
 
 func (pr *ProductOrder) BeforeCreate(db *gorm.DB) (err error) {
 	pr.Status = OrderStatusPending
-	pr.CreatedTime = time.Now()
+	createTime := time.Now()
+	expiredTime := createTime.Add(time.Duration(15) * time.Minute)
+	pr.CreatedTime = createTime
+	pr.ExpiredTime = expiredTime
 	pr.IsDeleted = 0
 	return
 }
@@ -117,23 +121,24 @@ func GetOrderDetail(orderId int, userId int) (order ProductOrder, err error) {
 func GetUnPendingOrderCount() (count int, minId int) {
 	db := models.Main()
 	_ = db.Model(&ProductOrder{}).Select("count(*)").Where("is_deleted=0 and status=? and expired_time <= ?", OrderStatusPending, time.Now()).Scan(&count).Error
-	_ = db.Model(&ProductOrder{}).Select("MIN(id)").Where("is_deleted=0 and status =?", OrderStatusPending).Scan(&minId).Error
+	if count > 0 {
+		_ = db.Model(&ProductOrder{}).Select("MIN(id)").Where("is_deleted=0 and status =? and expired_time <= ?", OrderStatusPending, time.Now()).Scan(&minId).Error
+	}
 	return
 }
 
 func GetExpiredPendingOrderIds(minId int, limit int) (ids []int) {
 	db := models.Main()
-	_ = db.Model(&ProductOrder{}).Select("id").Where("id> ? and status=? and  is_deleted=0 and expired_time < ? order by id asc", minId, OrderStatusPending, time.Now()).Where("", time.Now()).Limit(limit).Scan(&ids).Error
+	_ = db.Model(&ProductOrder{}).Select("id").Where("id>= ? and status=? and  is_deleted=0 and expired_time <= ? order by id asc", minId, OrderStatusPending, time.Now()).Limit(limit).Scan(&ids).Error
 	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(&ProductOrder{}).Where("expired_time < ?", time.Now()).Where("status =?", StatusPending).Update("status", StatusExpired).Error
-	//if err != nil {
-	//	logger.Error("批量过期验证码失败:%v", err)
-	//}
+func BatchCloseOrder(ids []int) (err error) {
+	db := models.Main()
+	err = db.Model(&ProductOrder{}).Where("expired_time < ?", time.Now()).Where("id in ?", ids).Update("status", OrderStatusClosed).Error
+	if err != nil {
+		logger.Error("批量关闭订单失败:%v", err)
+	}
 	return nil
 }
 

+ 8 - 1
service/facade/ht_account_service.go

@@ -83,7 +83,14 @@ func CheckUserRiskLevel(templateUserId int, productId int, officialUser userServ
 		}
 		return compareRisk(mapping.ProductRiskLevel, product.RiskLevel)
 	}
-	mapping, mappingErr := permissionService.GetRiskMappingByCustomerRiskLevel(customerInfo.RiskInfo.CorpRiskLevel)
+	var mapping permissionService.CustomerProductRiskMappingDTO
+	var mappingErr error
+	if customerInfo.RiskInfo.CorpRiskLevel == "" {
+		mapping, mappingErr = permissionService.GetRiskMappingByCustomerRiskLevel(userInfo.RiskLevel)
+	} else {
+		mapping, mappingErr = permissionService.GetRiskMappingByCustomerRiskLevel(customerInfo.RiskInfo.CorpRiskLevel)
+	}
+
 	if mappingErr != nil {
 		logger.Error("查询产品风险等级映射失败:%v", mappingErr)
 		code = 200

+ 5 - 5
task/order/product_order_close_task.go

@@ -8,12 +8,12 @@ import (
 )
 
 var (
-	taskName base.TaskType = "ExpiredCodeTask"
+	taskName base.TaskType = "CloseProductOrderTask"
 	cron                   = "0/60 * * * * *"
 )
 
 // Execute Task ETA取研报的数据
-func (st *SMSTask) Execute(taskDetail *base.TaskDetail) error {
+func (st *OrderTask) Execute(taskDetail *base.TaskDetail) error {
 	logger.Info(contants.TaskFormat, "处理超时未支付的产品订单开始")
 	err := order.BatchCloseOrder()
 	if err != nil {
@@ -23,10 +23,10 @@ func (st *SMSTask) Execute(taskDetail *base.TaskDetail) error {
 	return err
 }
 
-type SMSTask struct {
+type OrderTask struct {
 }
 
 func init() {
-	smsTask := base.NewTask(taskName, cron, new(SMSTask), base.PROD)
-	base.RegisterTask(&smsTask)
+	orderTask := base.NewTask(taskName, cron, new(OrderTask), base.PROD)
+	base.RegisterTask(&orderTask)
 }

+ 6 - 5
task/task_starter.go

@@ -4,11 +4,12 @@ import (
 	"eta/eta_mini_ht_api/common/component/config"
 	"eta/eta_mini_ht_api/common/contants"
 	"eta/eta_mini_ht_api/task/base"
-	_ "eta/eta_mini_ht_api/task/eta/author"
-	_ "eta/eta_mini_ht_api/task/eta/permission"
-	_ "eta/eta_mini_ht_api/task/message"
-	_ "eta/eta_mini_ht_api/task/report"
-	_ "eta/eta_mini_ht_api/task/sms"
+	//_ "eta/eta_mini_ht_api/task/eta/author"
+	//_ "eta/eta_mini_ht_api/task/eta/permission"
+	//_ "eta/eta_mini_ht_api/task/message"
+	_ "eta/eta_mini_ht_api/task/order"
+	//_ "eta/eta_mini_ht_api/task/report"
+	//_ "eta/eta_mini_ht_api/task/sms"
 	"github.com/beego/beego/v2/server/web"
 	"github.com/beego/beego/v2/task"
 )