109 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package orderservice
 | ||
| 
 | ||
| import (
 | ||
| 	"fmt"
 | ||
| 	"go-admin/app/admin/models"
 | ||
| 	"go-admin/app/admin/service/dto"
 | ||
| 	"go-admin/pkg/utility"
 | ||
| 	"go-admin/pkg/utility/snowflakehelper"
 | ||
| 	"time"
 | ||
| 
 | ||
| 	"github.com/go-admin-team/go-admin-core/sdk/service"
 | ||
| 	"github.com/jinzhu/copier"
 | ||
| 	"github.com/shopspring/decimal"
 | ||
| 	"gorm.io/gorm"
 | ||
| )
 | ||
| 
 | ||
| type OrderService struct {
 | ||
| 	service.Service
 | ||
| }
 | ||
| 
 | ||
| // 创建减仓后减仓单
 | ||
| func (e *OrderService) CreateReduceReduceOrder(db *gorm.DB, pid int, price, num decimal.Decimal, priceDigit int) (models.LinePreOrder, error) {
 | ||
| 	var preOrder models.LinePreOrder
 | ||
| 	var result models.LinePreOrder
 | ||
| 	var ext models.LinePreOrderExt
 | ||
| 
 | ||
| 	if err := db.Model(&models.LinePreOrder{}).Preload("Childs").Where("id =? ", pid).First(&preOrder).Error; err != nil {
 | ||
| 		return preOrder, err
 | ||
| 	}
 | ||
| 
 | ||
| 	if err := db.Model(&models.LinePreOrderExt{}).Where("order_id =? ", pid).Find(&ext).Error; err != nil {
 | ||
| 		return preOrder, err
 | ||
| 	}
 | ||
| 
 | ||
| 	copier.Copy(&result, &preOrder)
 | ||
| 
 | ||
| 	result.Id = 0
 | ||
| 	result.OrderSn = utility.Int64ToString(snowflakehelper.GetOrderId())
 | ||
| 	result.Status = 0
 | ||
| 	result.CreatedAt = time.Now()
 | ||
| 	result.TriggerTime = nil
 | ||
| 	result.UpdatedAt = time.Now()
 | ||
| 	result.BuyPrice = decimal.Zero.String()
 | ||
| 	result.Price = price.String()
 | ||
| 	result.Num = num.String()
 | ||
| 	result.ReduceOrderId = preOrder.Id
 | ||
| 
 | ||
| 	for index := range result.Childs {
 | ||
| 		result.Childs[index].Id = 0
 | ||
| 		result.Childs[index].OrderSn = utility.Int64ToString(snowflakehelper.GetOrderId())
 | ||
| 		result.Childs[index].Status = 0
 | ||
| 		result.Childs[index].CreatedAt = time.Now()
 | ||
| 		result.Childs[index].TriggerTime = nil
 | ||
| 		result.Childs[index].UpdatedAt = time.Now()
 | ||
| 		result.Childs[index].BuyPrice = decimal.Zero.String()
 | ||
| 		var pricePercent decimal.Decimal
 | ||
| 
 | ||
| 		if result.Childs[index].OrderType == 1 && ext.TakeProfitRatio.Cmp(decimal.Zero) > 0 {
 | ||
| 			// 减仓单卖出
 | ||
| 			if preOrder.Site == "SELL" {
 | ||
| 				pricePercent = decimal.NewFromInt(100).Add(ext.TakeProfitRatio).Div(decimal.NewFromInt(100))
 | ||
| 			} else {
 | ||
| 				pricePercent = decimal.NewFromInt(100).Sub(ext.TakeProfitRatio).Div(decimal.NewFromInt(100))
 | ||
| 			}
 | ||
| 
 | ||
| 		} else if result.Childs[index].OrderType == 2 && ext.StopLossRatio.Cmp(decimal.Zero) > 0 {
 | ||
| 			if preOrder.Site == "SELL" {
 | ||
| 				pricePercent = decimal.NewFromInt(100).Sub(ext.StopLossRatio).Div(decimal.NewFromInt(100))
 | ||
| 			} else {
 | ||
| 				pricePercent = decimal.NewFromInt(100).Add(ext.StopLossRatio).Div(decimal.NewFromInt(100))
 | ||
| 			}
 | ||
| 		}
 | ||
| 
 | ||
| 		//重新计算止盈止损价
 | ||
| 		if pricePercent.Cmp(decimal.Zero) > 0 {
 | ||
| 			result.Childs[index].Price = price.Mul(pricePercent).Truncate(int32(priceDigit)).String()
 | ||
| 		}
 | ||
| 	}
 | ||
| 
 | ||
| 	if err := db.Create(&result).Error; err != nil {
 | ||
| 		return result, fmt.Errorf("复制减仓单失败:pid:%d err:%v", pid, err)
 | ||
| 	}
 | ||
| 
 | ||
| 	return result, nil
 | ||
| }
 | ||
| 
 | ||
| // 触发主单失败
 | ||
| func (e *OrderService) ErrorTrigger(preOrder *dto.PreOrderRedisList, errData string) error {
 | ||
| 	// var cacheOrderKey string
 | ||
| 
 | ||
| 	// if preOrder.OrderType == 1 {
 | ||
| 	// 	cacheOrderKey = fmt.Sprintf(rediskey.PreSpotOrderList, preOrder.ExchangeType)
 | ||
| 	// } else {
 | ||
| 	// 	cacheOrderKey = fmt.Sprintf(rediskey.PreFutOrderList, preOrder.ExchangeType)
 | ||
| 	// }
 | ||
| 
 | ||
| 	if err := e.Orm.Model(&models.LinePreOrder{}).
 | ||
| 		Where("id = ? and status =1", preOrder.Id).
 | ||
| 		Updates(map[string]interface{}{
 | ||
| 			"status":       2,
 | ||
| 			"desc":         errData,
 | ||
| 			"trigger_time": time.Now(),
 | ||
| 		}).Error; err != nil {
 | ||
| 		return err
 | ||
| 	}
 | ||
| 
 | ||
| 	return nil
 | ||
| }
 |