79 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package scriptservice
 | 
						|
 | 
						|
import (
 | 
						|
	"github.com/bytedance/sonic"
 | 
						|
	log "github.com/go-admin-team/go-admin-core/logger"
 | 
						|
	sysservice "github.com/go-admin-team/go-admin-core/sdk/service"
 | 
						|
	"go-admin/app/admin/models"
 | 
						|
	"go-admin/app/admin/service"
 | 
						|
	"go-admin/app/admin/service/dto"
 | 
						|
	"go-admin/common/const/rediskey"
 | 
						|
	"go-admin/common/helper"
 | 
						|
	"gorm.io/gorm"
 | 
						|
	"strings"
 | 
						|
	"sync"
 | 
						|
)
 | 
						|
 | 
						|
type PreOrder struct {
 | 
						|
}
 | 
						|
 | 
						|
const GoroutineNum = 5
 | 
						|
 | 
						|
func (receiver *PreOrder) AddOrder(orm *gorm.DB) {
 | 
						|
	var wg sync.WaitGroup
 | 
						|
	for i := 1; i <= GoroutineNum; i++ {
 | 
						|
		wg.Add(1)
 | 
						|
		go workerWithLock(orm, &wg)
 | 
						|
 | 
						|
	}
 | 
						|
	wg.Wait()
 | 
						|
}
 | 
						|
 | 
						|
func workerWithLock(orm *gorm.DB, wg *sync.WaitGroup) {
 | 
						|
	defer func() {
 | 
						|
		wg.Done()
 | 
						|
	}()
 | 
						|
	scriptId, err := helper.DefaultRedis.LPopList(rediskey.PreOrderScriptList)
 | 
						|
	if err != nil {
 | 
						|
		return
 | 
						|
	}
 | 
						|
	var scriptInfo models.LinePreScript
 | 
						|
	err = orm.Model(&models.LinePreScript{}).Where("id = ? AND status = '0'", scriptId).Find(&scriptInfo).Error
 | 
						|
	if err != nil {
 | 
						|
		log.Error("获取脚本记录失败mysql err:", err)
 | 
						|
		return
 | 
						|
	}
 | 
						|
	if scriptInfo.Id > 0 {
 | 
						|
		orm.Model(&models.LinePreScript{}).Where("id = ?", scriptId).Update("status", "1")
 | 
						|
	}
 | 
						|
 | 
						|
	params := scriptInfo.ScriptParams
 | 
						|
	var batchReq dto.LineBatchAddPreOrderReq
 | 
						|
	sonic.Unmarshal([]byte(params), &batchReq)
 | 
						|
	errs := make([]error, 0)
 | 
						|
	errStr := make([]string, 0)
 | 
						|
	order := service.LinePreOrder{
 | 
						|
		Service: sysservice.Service{Orm: orm},
 | 
						|
	}
 | 
						|
	order.AddBatchPreOrder(&batchReq, nil, &errs)
 | 
						|
 | 
						|
	if len(errs) > 0 {
 | 
						|
		//e.Logger.Error(err)
 | 
						|
		for _, err2 := range errs {
 | 
						|
			errStr = append(errStr, err2.Error())
 | 
						|
		}
 | 
						|
		//e.Error(500, nil, strings.Join(errStr, ","))
 | 
						|
		orm.Model(&models.LinePreScript{}).Where("id = ?", scriptId).Updates(map[string]interface{}{
 | 
						|
			"status": "2",
 | 
						|
			"desc":   strings.Join(errStr, ","),
 | 
						|
		})
 | 
						|
		return
 | 
						|
	} else {
 | 
						|
		orm.Model(&models.LinePreScript{}).Where("id = ?", scriptId).Updates(map[string]interface{}{
 | 
						|
			"status": "2",
 | 
						|
			"desc":   "执行成功",
 | 
						|
		})
 | 
						|
	}
 | 
						|
	return
 | 
						|
}
 |