diff --git a/app/admin/apis/line_reverse_order.go b/app/admin/apis/line_reverse_order.go new file mode 100644 index 0000000..1b2817e --- /dev/null +++ b/app/admin/apis/line_reverse_order.go @@ -0,0 +1,198 @@ +package apis + +import ( + "fmt" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + _ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" + + "go-admin/app/admin/models" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/actions" +) + +type LineReverseOrder struct { + api.Api +} + +// GetPage 获取反单下单列表列表 +// @Summary 获取反单下单列表列表 +// @Description 获取反单下单列表列表 +// @Tags 反单下单列表 +// @Param orderSn query string false "订单号" +// @Param orderId query string false "币安订单号" +// @Param followOrderSn query string false "跟随币安订单号" +// @Param orderType query int false "订单类型 0-主单 1-止损单 2-加仓 3-减仓" +// @Param positionSide query string false "持仓方向 LONG-多 SHORT-空" +// @Param side query string false "买卖方向 SELL-卖 BUY-买" +// @Param status query int false "状态 1-待下单 2-已下单 3-已成交 4-已平仓 5-已止损" +// @Param pageSize query int false "页条数" +// @Param pageIndex query int false "页码" +// @Success 200 {object} response.Response{data=response.Page{list=[]models.LineReverseOrder}} "{"code": 200, "data": [...]}" +// @Router /api/v1/line-reverse-order [get] +// @Security Bearer +func (e LineReverseOrder) GetPage(c *gin.Context) { + req := dto.LineReverseOrderGetPageReq{} + s := service.LineReverseOrder{} + err := e.MakeContext(c). + MakeOrm(). + Bind(&req). + MakeService(&s.Service). + Errors + if err != nil { + e.Logger.Error(err) + e.Error(500, err, err.Error()) + return + } + + p := actions.GetPermissionFromContext(c) + list := make([]models.LineReverseOrder, 0) + var count int64 + + err = s.GetPage(&req, p, &list, &count) + if err != nil { + e.Error(500, err, fmt.Sprintf("获取反单下单列表失败,\r\n失败信息 %s", err.Error())) + return + } + + e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") +} + +// Get 获取反单下单列表 +// @Summary 获取反单下单列表 +// @Description 获取反单下单列表 +// @Tags 反单下单列表 +// @Param id path int false "id" +// @Success 200 {object} response.Response{data=models.LineReverseOrder} "{"code": 200, "data": [...]}" +// @Router /api/v1/line-reverse-order/{id} [get] +// @Security Bearer +func (e LineReverseOrder) Get(c *gin.Context) { + req := dto.LineReverseOrderGetReq{} + s := service.LineReverseOrder{} + err := e.MakeContext(c). + MakeOrm(). + Bind(&req). + MakeService(&s.Service). + Errors + if err != nil { + e.Logger.Error(err) + e.Error(500, err, err.Error()) + return + } + var object models.LineReverseOrder + + p := actions.GetPermissionFromContext(c) + err = s.Get(&req, p, &object) + if err != nil { + e.Error(500, err, fmt.Sprintf("获取反单下单列表失败,\r\n失败信息 %s", err.Error())) + return + } + + e.OK( object, "查询成功") +} + +// Insert 创建反单下单列表 +// @Summary 创建反单下单列表 +// @Description 创建反单下单列表 +// @Tags 反单下单列表 +// @Accept application/json +// @Product application/json +// @Param data body dto.LineReverseOrderInsertReq true "data" +// @Success 200 {object} response.Response "{"code": 200, "message": "添加成功"}" +// @Router /api/v1/line-reverse-order [post] +// @Security Bearer +func (e LineReverseOrder) Insert(c *gin.Context) { + req := dto.LineReverseOrderInsertReq{} + s := service.LineReverseOrder{} + err := e.MakeContext(c). + MakeOrm(). + Bind(&req). + MakeService(&s.Service). + Errors + if err != nil { + e.Logger.Error(err) + e.Error(500, err, err.Error()) + return + } + // 设置创建人 + req.SetCreateBy(user.GetUserId(c)) + + err = s.Insert(&req) + if err != nil { + e.Error(500, err, fmt.Sprintf("创建反单下单列表失败,\r\n失败信息 %s", err.Error())) + return + } + + e.OK(req.GetId(), "创建成功") +} + +// Update 修改反单下单列表 +// @Summary 修改反单下单列表 +// @Description 修改反单下单列表 +// @Tags 反单下单列表 +// @Accept application/json +// @Product application/json +// @Param id path int true "id" +// @Param data body dto.LineReverseOrderUpdateReq true "body" +// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}" +// @Router /api/v1/line-reverse-order/{id} [put] +// @Security Bearer +func (e LineReverseOrder) Update(c *gin.Context) { + req := dto.LineReverseOrderUpdateReq{} + s := service.LineReverseOrder{} + err := e.MakeContext(c). + MakeOrm(). + Bind(&req). + MakeService(&s.Service). + Errors + if err != nil { + e.Logger.Error(err) + e.Error(500, err, err.Error()) + return + } + req.SetUpdateBy(user.GetUserId(c)) + p := actions.GetPermissionFromContext(c) + + err = s.Update(&req, p) + if err != nil { + e.Error(500, err, fmt.Sprintf("修改反单下单列表失败,\r\n失败信息 %s", err.Error())) + return + } + e.OK( req.GetId(), "修改成功") +} + +// Delete 删除反单下单列表 +// @Summary 删除反单下单列表 +// @Description 删除反单下单列表 +// @Tags 反单下单列表 +// @Param data body dto.LineReverseOrderDeleteReq true "body" +// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}" +// @Router /api/v1/line-reverse-order [delete] +// @Security Bearer +func (e LineReverseOrder) Delete(c *gin.Context) { + s := service.LineReverseOrder{} + req := dto.LineReverseOrderDeleteReq{} + err := e.MakeContext(c). + MakeOrm(). + Bind(&req). + MakeService(&s.Service). + Errors + if err != nil { + e.Logger.Error(err) + e.Error(500, err, err.Error()) + return + } + + // req.SetUpdateBy(user.GetUserId(c)) + p := actions.GetPermissionFromContext(c) + + err = s.Remove(&req, p) + if err != nil { + e.Error(500, err, fmt.Sprintf("删除反单下单列表失败,\r\n失败信息 %s", err.Error())) + return + } + e.OK( req.GetId(), "删除成功") +} diff --git a/app/admin/apis/line_reverse_order_ext.go b/app/admin/apis/line_reverse_order_ext.go new file mode 100644 index 0000000..ccd44a2 --- /dev/null +++ b/app/admin/apis/line_reverse_order_ext.go @@ -0,0 +1,191 @@ +package apis + +import ( + "fmt" + + "github.com/gin-gonic/gin" + "github.com/go-admin-team/go-admin-core/sdk/api" + "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" + _ "github.com/go-admin-team/go-admin-core/sdk/pkg/response" + + "go-admin/app/admin/models" + "go-admin/app/admin/service" + "go-admin/app/admin/service/dto" + "go-admin/common/actions" +) + +type LineReverseOrderExt struct { + api.Api +} + +// GetPage 获取反单拓展信息列表 +// @Summary 获取反单拓展信息列表 +// @Description 获取反单拓展信息列表 +// @Tags 反单拓展信息 +// @Param pageSize query int false "页条数" +// @Param pageIndex query int false "页码" +// @Success 200 {object} response.Response{data=response.Page{list=[]models.LineReverseOrderExt}} "{"code": 200, "data": [...]}" +// @Router /api/v1/line-reverse-order-ext [get] +// @Security Bearer +func (e LineReverseOrderExt) GetPage(c *gin.Context) { + req := dto.LineReverseOrderExtGetPageReq{} + s := service.LineReverseOrderExt{} + err := e.MakeContext(c). + MakeOrm(). + Bind(&req). + MakeService(&s.Service). + Errors + if err != nil { + e.Logger.Error(err) + e.Error(500, err, err.Error()) + return + } + + p := actions.GetPermissionFromContext(c) + list := make([]models.LineReverseOrderExt, 0) + var count int64 + + err = s.GetPage(&req, p, &list, &count) + if err != nil { + e.Error(500, err, fmt.Sprintf("获取反单拓展信息失败,\r\n失败信息 %s", err.Error())) + return + } + + e.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), "查询成功") +} + +// Get 获取反单拓展信息 +// @Summary 获取反单拓展信息 +// @Description 获取反单拓展信息 +// @Tags 反单拓展信息 +// @Param id path int false "id" +// @Success 200 {object} response.Response{data=models.LineReverseOrderExt} "{"code": 200, "data": [...]}" +// @Router /api/v1/line-reverse-order-ext/{id} [get] +// @Security Bearer +func (e LineReverseOrderExt) Get(c *gin.Context) { + req := dto.LineReverseOrderExtGetReq{} + s := service.LineReverseOrderExt{} + err := e.MakeContext(c). + MakeOrm(). + Bind(&req). + MakeService(&s.Service). + Errors + if err != nil { + e.Logger.Error(err) + e.Error(500, err, err.Error()) + return + } + var object models.LineReverseOrderExt + + p := actions.GetPermissionFromContext(c) + err = s.Get(&req, p, &object) + if err != nil { + e.Error(500, err, fmt.Sprintf("获取反单拓展信息失败,\r\n失败信息 %s", err.Error())) + return + } + + e.OK( object, "查询成功") +} + +// Insert 创建反单拓展信息 +// @Summary 创建反单拓展信息 +// @Description 创建反单拓展信息 +// @Tags 反单拓展信息 +// @Accept application/json +// @Product application/json +// @Param data body dto.LineReverseOrderExtInsertReq true "data" +// @Success 200 {object} response.Response "{"code": 200, "message": "添加成功"}" +// @Router /api/v1/line-reverse-order-ext [post] +// @Security Bearer +func (e LineReverseOrderExt) Insert(c *gin.Context) { + req := dto.LineReverseOrderExtInsertReq{} + s := service.LineReverseOrderExt{} + err := e.MakeContext(c). + MakeOrm(). + Bind(&req). + MakeService(&s.Service). + Errors + if err != nil { + e.Logger.Error(err) + e.Error(500, err, err.Error()) + return + } + // 设置创建人 + req.SetCreateBy(user.GetUserId(c)) + + err = s.Insert(&req) + if err != nil { + e.Error(500, err, fmt.Sprintf("创建反单拓展信息失败,\r\n失败信息 %s", err.Error())) + return + } + + e.OK(req.GetId(), "创建成功") +} + +// Update 修改反单拓展信息 +// @Summary 修改反单拓展信息 +// @Description 修改反单拓展信息 +// @Tags 反单拓展信息 +// @Accept application/json +// @Product application/json +// @Param id path int true "id" +// @Param data body dto.LineReverseOrderExtUpdateReq true "body" +// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}" +// @Router /api/v1/line-reverse-order-ext/{id} [put] +// @Security Bearer +func (e LineReverseOrderExt) Update(c *gin.Context) { + req := dto.LineReverseOrderExtUpdateReq{} + s := service.LineReverseOrderExt{} + err := e.MakeContext(c). + MakeOrm(). + Bind(&req). + MakeService(&s.Service). + Errors + if err != nil { + e.Logger.Error(err) + e.Error(500, err, err.Error()) + return + } + req.SetUpdateBy(user.GetUserId(c)) + p := actions.GetPermissionFromContext(c) + + err = s.Update(&req, p) + if err != nil { + e.Error(500, err, fmt.Sprintf("修改反单拓展信息失败,\r\n失败信息 %s", err.Error())) + return + } + e.OK( req.GetId(), "修改成功") +} + +// Delete 删除反单拓展信息 +// @Summary 删除反单拓展信息 +// @Description 删除反单拓展信息 +// @Tags 反单拓展信息 +// @Param data body dto.LineReverseOrderExtDeleteReq true "body" +// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}" +// @Router /api/v1/line-reverse-order-ext [delete] +// @Security Bearer +func (e LineReverseOrderExt) Delete(c *gin.Context) { + s := service.LineReverseOrderExt{} + req := dto.LineReverseOrderExtDeleteReq{} + err := e.MakeContext(c). + MakeOrm(). + Bind(&req). + MakeService(&s.Service). + Errors + if err != nil { + e.Logger.Error(err) + e.Error(500, err, err.Error()) + return + } + + // req.SetUpdateBy(user.GetUserId(c)) + p := actions.GetPermissionFromContext(c) + + err = s.Remove(&req, p) + if err != nil { + e.Error(500, err, fmt.Sprintf("删除反单拓展信息失败,\r\n失败信息 %s", err.Error())) + return + } + e.OK( req.GetId(), "删除成功") +} diff --git a/app/admin/models/line_reverse_order.go b/app/admin/models/line_reverse_order.go new file mode 100644 index 0000000..e05dc42 --- /dev/null +++ b/app/admin/models/line_reverse_order.go @@ -0,0 +1,43 @@ +package models + +import ( + "time" + + "go-admin/common/models" + +) + +type LineReverseOrder struct { + models.Model + + PId int `json:"pId" gorm:"type:bigint;comment:主单id"` + OrderSn string `json:"orderSn" gorm:"type:varchar(50);comment:订单号"` + OrderId string `json:"orderId" gorm:"type:varchar(50);comment:币安订单号"` + FollowOrderSn string `json:"followOrderSn" gorm:"type:varchar(50);comment:跟随币安订单号"` + Symbol string `json:"symbol" gorm:"type:varchar(20);comment:交易对"` + OrderType int `json:"orderType" gorm:"type:tinyint;comment:订单类型 0-主单 1-止损单 2-加仓 3-减仓"` + BuyPrice decimal.Decimal `json:"buyPrice" gorm:"type:decimal(18,8);comment:购买金额"` + Price decimal.Decimal `json:"price" gorm:"type:decimal(18,8);comment:委托价格"` + PriceU decimal.Decimal `json:"priceU" gorm:"type:decimal(18,8);comment:委托价格(U)"` + FinalPrice decimal.Decimal `json:"finalPrice" gorm:"type:decimal(18,8);comment:实际成交价"` + PositionSide string `json:"positionSide" gorm:"type:varchar(10);comment:持仓方向 LONG-多 SHORT-空"` + Side string `json:"side" gorm:"type:varchar(10);comment:买卖方向 SELL-卖 BUY-买"` + SignPrice decimal.Decimal `json:"signPrice" gorm:"type:decimal(18,8);comment:行情价"` + TriggerTime time.Time `json:"triggerTime" gorm:"type:datetime;comment:触发时间"` + Status int `json:"status" gorm:"type:tinyint;comment:状态 1-待下单 2-已下单 3-已成交 4-已平仓 5-已止损"` + models.ModelTime + models.ControlBy +} + +func (LineReverseOrder) TableName() string { + return "line_reverse_order" +} + +func (e *LineReverseOrder) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *LineReverseOrder) GetId() interface{} { + return e.Id +} \ No newline at end of file diff --git a/app/admin/models/line_reverse_order_ext.go b/app/admin/models/line_reverse_order_ext.go new file mode 100644 index 0000000..11ed45c --- /dev/null +++ b/app/admin/models/line_reverse_order_ext.go @@ -0,0 +1,30 @@ +package models + +import ( + + "go-admin/common/models" + +) + +type LineReverseOrderExt struct { + models.Model + + ReverseOrderId int `json:"reverseOrderId" gorm:"type:bigint;comment:下反单id"` + IsAddPosition int `json:"isAddPosition" gorm:"type:tinyint;comment:加仓状态 1-已加仓 2-未加仓"` + IsReduce int `json:"isReduce" gorm:"type:tinyint;comment:减仓状态 1-已减仓 2-未减仓"` + models.ModelTime + models.ControlBy +} + +func (LineReverseOrderExt) TableName() string { + return "line_reverse_order_ext" +} + +func (e *LineReverseOrderExt) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *LineReverseOrderExt) GetId() interface{} { + return e.Id +} \ No newline at end of file diff --git a/app/admin/router/line_reverse_order.go b/app/admin/router/line_reverse_order.go new file mode 100644 index 0000000..5ee8f29 --- /dev/null +++ b/app/admin/router/line_reverse_order.go @@ -0,0 +1,27 @@ +package router + +import ( + "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + + "go-admin/app/admin/apis" + "go-admin/common/middleware" + "go-admin/common/actions" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerLineReverseOrderRouter) +} + +// registerLineReverseOrderRouter +func registerLineReverseOrderRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := apis.LineReverseOrder{} + r := v1.Group("/line-reverse-order").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) + { + r.GET("", actions.PermissionAction(), api.GetPage) + r.GET("/:id", actions.PermissionAction(), api.Get) + r.POST("", api.Insert) + r.PUT("/:id", actions.PermissionAction(), api.Update) + r.DELETE("", api.Delete) + } +} \ No newline at end of file diff --git a/app/admin/router/line_reverse_order_ext.go b/app/admin/router/line_reverse_order_ext.go new file mode 100644 index 0000000..302aa71 --- /dev/null +++ b/app/admin/router/line_reverse_order_ext.go @@ -0,0 +1,27 @@ +package router + +import ( + "github.com/gin-gonic/gin" + jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth" + + "go-admin/app/admin/apis" + "go-admin/common/middleware" + "go-admin/common/actions" +) + +func init() { + routerCheckRole = append(routerCheckRole, registerLineReverseOrderExtRouter) +} + +// registerLineReverseOrderExtRouter +func registerLineReverseOrderExtRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := apis.LineReverseOrderExt{} + r := v1.Group("/line-reverse-order-ext").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()) + { + r.GET("", actions.PermissionAction(), api.GetPage) + r.GET("/:id", actions.PermissionAction(), api.Get) + r.POST("", api.Insert) + r.PUT("/:id", actions.PermissionAction(), api.Update) + r.DELETE("", api.Delete) + } +} \ No newline at end of file diff --git a/app/admin/service/dto/line_reverse_order.go b/app/admin/service/dto/line_reverse_order.go new file mode 100644 index 0000000..e6ccbd5 --- /dev/null +++ b/app/admin/service/dto/line_reverse_order.go @@ -0,0 +1,159 @@ +package dto + +import ( + "time" + + "go-admin/app/admin/models" + "go-admin/common/dto" + common "go-admin/common/models" +) + +type LineReverseOrderGetPageReq struct { + dto.Pagination `search:"-"` + OrderSn string `form:"orderSn" search:"type:contains;column:order_sn;table:line_reverse_order" comment:"订单号"` + OrderId string `form:"orderId" search:"type:contains;column:order_id;table:line_reverse_order" comment:"币安订单号"` + FollowOrderSn string `form:"followOrderSn" search:"type:contains;column:follow_order_sn;table:line_reverse_order" comment:"跟随币安订单号"` + OrderType int `form:"orderType" search:"type:exact;column:order_type;table:line_reverse_order" comment:"订单类型 0-主单 1-止损单 2-加仓 3-减仓"` + PositionSide string `form:"positionSide" search:"type:exact;column:position_side;table:line_reverse_order" comment:"持仓方向 LONG-多 SHORT-空"` + Side string `form:"side" search:"type:exact;column:side;table:line_reverse_order" comment:"买卖方向 SELL-卖 BUY-买"` + Status int `form:"status" search:"type:exact;column:status;table:line_reverse_order" comment:"状态 1-待下单 2-已下单 3-已成交 4-已平仓 5-已止损"` + LineReverseOrderOrder +} + +type LineReverseOrderOrder struct { + Id string `form:"idOrder" search:"type:order;column:id;table:line_reverse_order"` + PId string `form:"pIdOrder" search:"type:order;column:p_id;table:line_reverse_order"` + OrderSn string `form:"orderSnOrder" search:"type:order;column:order_sn;table:line_reverse_order"` + OrderId string `form:"orderIdOrder" search:"type:order;column:order_id;table:line_reverse_order"` + FollowOrderSn string `form:"followOrderSnOrder" search:"type:order;column:follow_order_sn;table:line_reverse_order"` + Symbol string `form:"symbolOrder" search:"type:order;column:symbol;table:line_reverse_order"` + OrderType string `form:"orderTypeOrder" search:"type:order;column:order_type;table:line_reverse_order"` + BuyPrice string `form:"buyPriceOrder" search:"type:order;column:buy_price;table:line_reverse_order"` + Price string `form:"priceOrder" search:"type:order;column:price;table:line_reverse_order"` + PriceU string `form:"priceUOrder" search:"type:order;column:price_u;table:line_reverse_order"` + FinalPrice string `form:"finalPriceOrder" search:"type:order;column:final_price;table:line_reverse_order"` + PositionSide string `form:"positionSideOrder" search:"type:order;column:position_side;table:line_reverse_order"` + Side string `form:"sideOrder" search:"type:order;column:side;table:line_reverse_order"` + SignPrice string `form:"signPriceOrder" search:"type:order;column:sign_price;table:line_reverse_order"` + TriggerTime string `form:"triggerTimeOrder" search:"type:order;column:trigger_time;table:line_reverse_order"` + Status string `form:"statusOrder" search:"type:order;column:status;table:line_reverse_order"` + CreatedAt string `form:"createdAtOrder" search:"type:order;column:created_at;table:line_reverse_order"` + UpdatedAt string `form:"updatedAtOrder" search:"type:order;column:updated_at;table:line_reverse_order"` + DeletedAt string `form:"deletedAtOrder" search:"type:order;column:deleted_at;table:line_reverse_order"` + CreateBy string `form:"createByOrder" search:"type:order;column:create_by;table:line_reverse_order"` + UpdateBy string `form:"updateByOrder" search:"type:order;column:update_by;table:line_reverse_order"` + +} + +func (m *LineReverseOrderGetPageReq) GetNeedSearch() interface{} { + return *m +} + +type LineReverseOrderInsertReq struct { + Id int `json:"-" comment:"主键id"` // 主键id + PId int `json:"pId" comment:"主单id"` + OrderSn string `json:"orderSn" comment:"订单号"` + OrderId string `json:"orderId" comment:"币安订单号"` + FollowOrderSn string `json:"followOrderSn" comment:"跟随币安订单号"` + Symbol string `json:"symbol" comment:"交易对"` + OrderType int `json:"orderType" comment:"订单类型 0-主单 1-止损单 2-加仓 3-减仓"` + BuyPrice decimal.Decimal `json:"buyPrice" comment:"购买金额"` + Price decimal.Decimal `json:"price" comment:"委托价格"` + PriceU decimal.Decimal `json:"priceU" comment:"委托价格(U)"` + FinalPrice decimal.Decimal `json:"finalPrice" comment:"实际成交价"` + PositionSide string `json:"positionSide" comment:"持仓方向 LONG-多 SHORT-空"` + Side string `json:"side" comment:"买卖方向 SELL-卖 BUY-买"` + SignPrice decimal.Decimal `json:"signPrice" comment:"行情价"` + TriggerTime time.Time `json:"triggerTime" comment:"触发时间"` + Status int `json:"status" comment:"状态 1-待下单 2-已下单 3-已成交 4-已平仓 5-已止损"` + common.ControlBy +} + +func (s *LineReverseOrderInsertReq) Generate(model *models.LineReverseOrder) { + if s.Id == 0 { + model.Model = common.Model{ Id: s.Id } + } + model.PId = s.PId + model.OrderSn = s.OrderSn + model.OrderId = s.OrderId + model.FollowOrderSn = s.FollowOrderSn + model.Symbol = s.Symbol + model.OrderType = s.OrderType + model.BuyPrice = s.BuyPrice + model.Price = s.Price + model.PriceU = s.PriceU + model.FinalPrice = s.FinalPrice + model.PositionSide = s.PositionSide + model.Side = s.Side + model.SignPrice = s.SignPrice + model.TriggerTime = s.TriggerTime + model.Status = s.Status + model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的 +} + +func (s *LineReverseOrderInsertReq) GetId() interface{} { + return s.Id +} + +type LineReverseOrderUpdateReq struct { + Id int `uri:"id" comment:"主键id"` // 主键id + PId int `json:"pId" comment:"主单id"` + OrderSn string `json:"orderSn" comment:"订单号"` + OrderId string `json:"orderId" comment:"币安订单号"` + FollowOrderSn string `json:"followOrderSn" comment:"跟随币安订单号"` + Symbol string `json:"symbol" comment:"交易对"` + OrderType int `json:"orderType" comment:"订单类型 0-主单 1-止损单 2-加仓 3-减仓"` + BuyPrice decimal.Decimal `json:"buyPrice" comment:"购买金额"` + Price decimal.Decimal `json:"price" comment:"委托价格"` + PriceU decimal.Decimal `json:"priceU" comment:"委托价格(U)"` + FinalPrice decimal.Decimal `json:"finalPrice" comment:"实际成交价"` + PositionSide string `json:"positionSide" comment:"持仓方向 LONG-多 SHORT-空"` + Side string `json:"side" comment:"买卖方向 SELL-卖 BUY-买"` + SignPrice decimal.Decimal `json:"signPrice" comment:"行情价"` + TriggerTime time.Time `json:"triggerTime" comment:"触发时间"` + Status int `json:"status" comment:"状态 1-待下单 2-已下单 3-已成交 4-已平仓 5-已止损"` + common.ControlBy +} + +func (s *LineReverseOrderUpdateReq) Generate(model *models.LineReverseOrder) { + if s.Id == 0 { + model.Model = common.Model{ Id: s.Id } + } + model.PId = s.PId + model.OrderSn = s.OrderSn + model.OrderId = s.OrderId + model.FollowOrderSn = s.FollowOrderSn + model.Symbol = s.Symbol + model.OrderType = s.OrderType + model.BuyPrice = s.BuyPrice + model.Price = s.Price + model.PriceU = s.PriceU + model.FinalPrice = s.FinalPrice + model.PositionSide = s.PositionSide + model.Side = s.Side + model.SignPrice = s.SignPrice + model.TriggerTime = s.TriggerTime + model.Status = s.Status + model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的 +} + +func (s *LineReverseOrderUpdateReq) GetId() interface{} { + return s.Id +} + +// LineReverseOrderGetReq 功能获取请求参数 +type LineReverseOrderGetReq struct { + Id int `uri:"id"` +} +func (s *LineReverseOrderGetReq) GetId() interface{} { + return s.Id +} + +// LineReverseOrderDeleteReq 功能删除请求参数 +type LineReverseOrderDeleteReq struct { + Ids []int `json:"ids"` +} + +func (s *LineReverseOrderDeleteReq) GetId() interface{} { + return s.Ids +} diff --git a/app/admin/service/dto/line_reverse_order_ext.go b/app/admin/service/dto/line_reverse_order_ext.go new file mode 100644 index 0000000..7cbef1d --- /dev/null +++ b/app/admin/service/dto/line_reverse_order_ext.go @@ -0,0 +1,91 @@ +package dto + +import ( + + "go-admin/app/admin/models" + "go-admin/common/dto" + common "go-admin/common/models" +) + +type LineReverseOrderExtGetPageReq struct { + dto.Pagination `search:"-"` + LineReverseOrderExtOrder +} + +type LineReverseOrderExtOrder struct { + Id string `form:"idOrder" search:"type:order;column:id;table:line_reverse_order_ext"` + ReverseOrderId string `form:"reverseOrderIdOrder" search:"type:order;column:reverse_order_id;table:line_reverse_order_ext"` + IsAddPosition string `form:"isAddPositionOrder" search:"type:order;column:is_add_position;table:line_reverse_order_ext"` + IsReduce string `form:"isReduceOrder" search:"type:order;column:is_reduce;table:line_reverse_order_ext"` + CreatedAt string `form:"createdAtOrder" search:"type:order;column:created_at;table:line_reverse_order_ext"` + UpdatedAt string `form:"updatedAtOrder" search:"type:order;column:updated_at;table:line_reverse_order_ext"` + DeletedAt string `form:"deletedAtOrder" search:"type:order;column:deleted_at;table:line_reverse_order_ext"` + CreateBy string `form:"createByOrder" search:"type:order;column:create_by;table:line_reverse_order_ext"` + UpdateBy string `form:"updateByOrder" search:"type:order;column:update_by;table:line_reverse_order_ext"` + +} + +func (m *LineReverseOrderExtGetPageReq) GetNeedSearch() interface{} { + return *m +} + +type LineReverseOrderExtInsertReq struct { + Id int `json:"-" comment:"主键id"` // 主键id + ReverseOrderId int `json:"reverseOrderId" comment:"下反单id"` + IsAddPosition int `json:"isAddPosition" comment:"加仓状态 1-已加仓 2-未加仓"` + IsReduce int `json:"isReduce" comment:"减仓状态 1-已减仓 2-未减仓"` + common.ControlBy +} + +func (s *LineReverseOrderExtInsertReq) Generate(model *models.LineReverseOrderExt) { + if s.Id == 0 { + model.Model = common.Model{ Id: s.Id } + } + model.ReverseOrderId = s.ReverseOrderId + model.IsAddPosition = s.IsAddPosition + model.IsReduce = s.IsReduce + model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的 +} + +func (s *LineReverseOrderExtInsertReq) GetId() interface{} { + return s.Id +} + +type LineReverseOrderExtUpdateReq struct { + Id int `uri:"id" comment:"主键id"` // 主键id + ReverseOrderId int `json:"reverseOrderId" comment:"下反单id"` + IsAddPosition int `json:"isAddPosition" comment:"加仓状态 1-已加仓 2-未加仓"` + IsReduce int `json:"isReduce" comment:"减仓状态 1-已减仓 2-未减仓"` + common.ControlBy +} + +func (s *LineReverseOrderExtUpdateReq) Generate(model *models.LineReverseOrderExt) { + if s.Id == 0 { + model.Model = common.Model{ Id: s.Id } + } + model.ReverseOrderId = s.ReverseOrderId + model.IsAddPosition = s.IsAddPosition + model.IsReduce = s.IsReduce + model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的 +} + +func (s *LineReverseOrderExtUpdateReq) GetId() interface{} { + return s.Id +} + +// LineReverseOrderExtGetReq 功能获取请求参数 +type LineReverseOrderExtGetReq struct { + Id int `uri:"id"` +} +func (s *LineReverseOrderExtGetReq) GetId() interface{} { + return s.Id +} + +// LineReverseOrderExtDeleteReq 功能删除请求参数 +type LineReverseOrderExtDeleteReq struct { + Ids []int `json:"ids"` +} + +func (s *LineReverseOrderExtDeleteReq) GetId() interface{} { + return s.Ids +} diff --git a/app/admin/service/line_reverse_order.go b/app/admin/service/line_reverse_order.go new file mode 100644 index 0000000..615d595 --- /dev/null +++ b/app/admin/service/line_reverse_order.go @@ -0,0 +1,109 @@ +package service + +import ( + "errors" + + "github.com/go-admin-team/go-admin-core/sdk/service" + "gorm.io/gorm" + + "go-admin/app/admin/models" + "go-admin/app/admin/service/dto" + "go-admin/common/actions" + cDto "go-admin/common/dto" +) + +type LineReverseOrder struct { + service.Service +} + +// GetPage 获取LineReverseOrder列表 +func (e *LineReverseOrder) GetPage(c *dto.LineReverseOrderGetPageReq, p *actions.DataPermission, list *[]models.LineReverseOrder, count *int64) error { + var err error + var data models.LineReverseOrder + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), + actions.Permission(data.TableName(), p), + ). + Find(list).Limit(-1).Offset(-1). + Count(count).Error + if err != nil { + e.Log.Errorf("LineReverseOrderService GetPage error:%s \r\n", err) + return err + } + return nil +} + +// Get 获取LineReverseOrder对象 +func (e *LineReverseOrder) Get(d *dto.LineReverseOrderGetReq, p *actions.DataPermission, model *models.LineReverseOrder) error { + var data models.LineReverseOrder + + err := e.Orm.Model(&data). + Scopes( + actions.Permission(data.TableName(), p), + ). + First(model, d.GetId()).Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("Service GetLineReverseOrder error:%s \r\n", err) + return err + } + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// Insert 创建LineReverseOrder对象 +func (e *LineReverseOrder) Insert(c *dto.LineReverseOrderInsertReq) error { + var err error + var data models.LineReverseOrder + c.Generate(&data) + err = e.Orm.Create(&data).Error + if err != nil { + e.Log.Errorf("LineReverseOrderService Insert error:%s \r\n", err) + return err + } + return nil +} + +// Update 修改LineReverseOrder对象 +func (e *LineReverseOrder) Update(c *dto.LineReverseOrderUpdateReq, p *actions.DataPermission) error { + var err error + var data = models.LineReverseOrder{} + e.Orm.Scopes( + actions.Permission(data.TableName(), p), + ).First(&data, c.GetId()) + c.Generate(&data) + + db := e.Orm.Save(&data) + if err = db.Error; err != nil { + e.Log.Errorf("LineReverseOrderService Save error:%s \r\n", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + } + return nil +} + +// Remove 删除LineReverseOrder +func (e *LineReverseOrder) Remove(d *dto.LineReverseOrderDeleteReq, p *actions.DataPermission) error { + var data models.LineReverseOrder + + db := e.Orm.Model(&data). + Scopes( + actions.Permission(data.TableName(), p), + ).Delete(&data, d.GetId()) + if err := db.Error; err != nil { + e.Log.Errorf("Service RemoveLineReverseOrder error:%s \r\n", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权删除该数据") + } + return nil +} diff --git a/app/admin/service/line_reverse_order_ext.go b/app/admin/service/line_reverse_order_ext.go new file mode 100644 index 0000000..36621c1 --- /dev/null +++ b/app/admin/service/line_reverse_order_ext.go @@ -0,0 +1,109 @@ +package service + +import ( + "errors" + + "github.com/go-admin-team/go-admin-core/sdk/service" + "gorm.io/gorm" + + "go-admin/app/admin/models" + "go-admin/app/admin/service/dto" + "go-admin/common/actions" + cDto "go-admin/common/dto" +) + +type LineReverseOrderExt struct { + service.Service +} + +// GetPage 获取LineReverseOrderExt列表 +func (e *LineReverseOrderExt) GetPage(c *dto.LineReverseOrderExtGetPageReq, p *actions.DataPermission, list *[]models.LineReverseOrderExt, count *int64) error { + var err error + var data models.LineReverseOrderExt + + err = e.Orm.Model(&data). + Scopes( + cDto.MakeCondition(c.GetNeedSearch()), + cDto.Paginate(c.GetPageSize(), c.GetPageIndex()), + actions.Permission(data.TableName(), p), + ). + Find(list).Limit(-1).Offset(-1). + Count(count).Error + if err != nil { + e.Log.Errorf("LineReverseOrderExtService GetPage error:%s \r\n", err) + return err + } + return nil +} + +// Get 获取LineReverseOrderExt对象 +func (e *LineReverseOrderExt) Get(d *dto.LineReverseOrderExtGetReq, p *actions.DataPermission, model *models.LineReverseOrderExt) error { + var data models.LineReverseOrderExt + + err := e.Orm.Model(&data). + Scopes( + actions.Permission(data.TableName(), p), + ). + First(model, d.GetId()).Error + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + err = errors.New("查看对象不存在或无权查看") + e.Log.Errorf("Service GetLineReverseOrderExt error:%s \r\n", err) + return err + } + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// Insert 创建LineReverseOrderExt对象 +func (e *LineReverseOrderExt) Insert(c *dto.LineReverseOrderExtInsertReq) error { + var err error + var data models.LineReverseOrderExt + c.Generate(&data) + err = e.Orm.Create(&data).Error + if err != nil { + e.Log.Errorf("LineReverseOrderExtService Insert error:%s \r\n", err) + return err + } + return nil +} + +// Update 修改LineReverseOrderExt对象 +func (e *LineReverseOrderExt) Update(c *dto.LineReverseOrderExtUpdateReq, p *actions.DataPermission) error { + var err error + var data = models.LineReverseOrderExt{} + e.Orm.Scopes( + actions.Permission(data.TableName(), p), + ).First(&data, c.GetId()) + c.Generate(&data) + + db := e.Orm.Save(&data) + if err = db.Error; err != nil { + e.Log.Errorf("LineReverseOrderExtService Save error:%s \r\n", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + } + return nil +} + +// Remove 删除LineReverseOrderExt +func (e *LineReverseOrderExt) Remove(d *dto.LineReverseOrderExtDeleteReq, p *actions.DataPermission) error { + var data models.LineReverseOrderExt + + db := e.Orm.Model(&data). + Scopes( + actions.Permission(data.TableName(), p), + ).Delete(&data, d.GetId()) + if err := db.Error; err != nil { + e.Log.Errorf("Service RemoveLineReverseOrderExt error:%s \r\n", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权删除该数据") + } + return nil +} diff --git a/services/binanceservice/biance_reverse_futures_service.go b/services/binanceservice/biance_reverse_futures_service.go new file mode 100644 index 0000000..eeefb69 --- /dev/null +++ b/services/binanceservice/biance_reverse_futures_service.go @@ -0,0 +1,15 @@ +package binanceservice + +import "github.com/go-admin-team/go-admin-core/sdk/service" + +type BinanceReverseFuturesService struct { + service.Service +} + +// +func (e *BinanceReverseFuturesService) DoReverse() error { + apiInfo, ok := ShouldReverse(apiKey) + //TODO: 实现反向开仓逻辑 + + return nil +} diff --git a/services/binanceservice/biance_reverse_spot_service.go b/services/binanceservice/biance_reverse_spot_service.go new file mode 100644 index 0000000..3abad63 --- /dev/null +++ b/services/binanceservice/biance_reverse_spot_service.go @@ -0,0 +1,12 @@ +package binanceservice + +import "github.com/go-admin-team/go-admin-core/sdk/service" + +type BinanceReverseSpotService struct { + service.Service +} + +// JudgeApiUser 判断是否需要 +func (e *BinanceReverseSpotService) JudgeApiUser() bool { + return false +} diff --git a/services/binanceservice/binance_reverse_service.go b/services/binanceservice/binance_reverse_service.go new file mode 100644 index 0000000..51d7d54 --- /dev/null +++ b/services/binanceservice/binance_reverse_service.go @@ -0,0 +1,16 @@ +package binanceservice + +import DbModels "go-admin/app/admin/models" + +// ShouldReverse 判断是否需要反单 +// return apiInfo, bool +func ShouldReverse(apiKey string) (DbModels.LineApiUser, bool) { + // TODO: 实现判断是否需要反单的逻辑 + apiInfo := GetApiInfoByKey(apiKey) + + if apiInfo.ReverseStatus == 1 && apiInfo.ReverseApiId > 0 { + return apiInfo, true + } + + return DbModels.LineApiUser{}, false +} diff --git a/services/binanceservice/binancerest.go b/services/binanceservice/binancerest.go index e267568..ba964c5 100644 --- a/services/binanceservice/binancerest.go +++ b/services/binanceservice/binancerest.go @@ -467,6 +467,21 @@ func GetApiInfo(apiId int) (DbModels.LineApiUser, error) { return api, nil } +// GetReverseApiInfo 根据apiKey获取api用户信息 +func GetApiInfoByKey(apiKey string) DbModels.LineApiUser { + result := DbModels.LineApiUser{} + keys, _ := helper.DefaultRedis.GetAllKeysAndValues(fmt.Sprintf(rediskey.API_USER, "*")) + + for _, key := range keys { + if strings.Contains(key, apiKey) { + sonic.UnmarshalString(key, &result) + break + } + } + + return result +} + /* 根据A账户获取B账号信息 */