From e943a471219b141aa486e2f17e472bff713bc436 Mon Sep 17 00:00:00 2001 From: hucan <951870319@qq.com> Date: Wed, 21 May 2025 09:11:10 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/apis/line_api_user.go | 38 ++++ app/admin/apis/line_reverse_setting.go | 191 ++++++++++++++++++ app/admin/models/line_api_user.go | 38 ++-- app/admin/models/line_reverse_setting.go | 30 +++ app/admin/router/line_api_user.go | 2 + app/admin/router/line_reverse_setting.go | 27 +++ app/admin/service/dto/line_api_user.go | 132 ++++++++---- app/admin/service/dto/line_reverse_setting.go | 89 ++++++++ app/admin/service/line_api_user.go | 92 ++++++++- app/admin/service/line_reverse_setting.go | 109 ++++++++++ 10 files changed, 693 insertions(+), 55 deletions(-) create mode 100644 app/admin/apis/line_reverse_setting.go create mode 100644 app/admin/models/line_reverse_setting.go create mode 100644 app/admin/router/line_reverse_setting.go create mode 100644 app/admin/service/dto/line_reverse_setting.go create mode 100644 app/admin/service/line_reverse_setting.go diff --git a/app/admin/apis/line_api_user.go b/app/admin/apis/line_api_user.go index 127b34f..8e86f66 100644 --- a/app/admin/apis/line_api_user.go +++ b/app/admin/apis/line_api_user.go @@ -120,6 +120,11 @@ func (e LineApiUser) Insert(c *gin.Context) { // 设置创建人 req.SetCreateBy(user.GetUserId(c)) + if err := req.Valid(); err != nil { + e.Error(500, err, err.Error()) + return + } + err = s.Insert(&req) if err != nil { e.Error(500, err, fmt.Sprintf("创建api用户管理失败,\r\n失败信息 %s", err.Error())) @@ -153,6 +158,12 @@ func (e LineApiUser) Update(c *gin.Context) { e.Error(500, err, err.Error()) return } + + if err := req.Valid(); err != nil { + e.Error(500, err, err.Error()) + return + } + req.SetUpdateBy(user.GetUserId(c)) p := actions.GetPermissionFromContext(c) @@ -267,3 +278,30 @@ func (e LineApiUser) GetMainUser(c *gin.Context) { } e.OK(list, "操作成功") } + +// GetUnBindApiUser 获取未绑定下反单api用户 +func (e LineApiUser) GetUnBindReverseApiUser(c *gin.Context) { + s := service.LineApiUser{} + req := dto.GetUnBindReverseReq{} + err := e.MakeContext(c). + MakeOrm(). + Bind(&req, binding.Query, binding.Form). + MakeService(&s.Service). + Errors + + if err != nil { + e.Logger.Error(err) + e.Error(500, err, err.Error()) + return + } + + datas := make([]dto.UnBindReverseResp, 0) + + err = s.GetUnBindApiUser(&req, &datas) + if err != nil { + e.Error(500, err, fmt.Sprintf("获取失败,\r\n失败信息 %s", err.Error())) + return + } + + e.OK(datas, "查询成功") +} diff --git a/app/admin/apis/line_reverse_setting.go b/app/admin/apis/line_reverse_setting.go new file mode 100644 index 0000000..d243f7c --- /dev/null +++ b/app/admin/apis/line_reverse_setting.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 LineReverseSetting 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.LineReverseSetting}} "{"code": 200, "data": [...]}" +// @Router /api/v1/line-reverse-setting [get] +// @Security Bearer +func (e LineReverseSetting) GetPage(c *gin.Context) { + req := dto.LineReverseSettingGetPageReq{} + s := service.LineReverseSetting{} + 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.LineReverseSetting, 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.LineReverseSetting} "{"code": 200, "data": [...]}" +// @Router /api/v1/line-reverse-setting/{id} [get] +// @Security Bearer +func (e LineReverseSetting) Get(c *gin.Context) { + req := dto.LineReverseSettingGetReq{} + s := service.LineReverseSetting{} + 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.LineReverseSetting + + 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.LineReverseSettingInsertReq true "data" +// @Success 200 {object} response.Response "{"code": 200, "message": "添加成功"}" +// @Router /api/v1/line-reverse-setting [post] +// @Security Bearer +func (e LineReverseSetting) Insert(c *gin.Context) { + req := dto.LineReverseSettingInsertReq{} + s := service.LineReverseSetting{} + 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.LineReverseSettingUpdateReq true "body" +// @Success 200 {object} response.Response "{"code": 200, "message": "修改成功"}" +// @Router /api/v1/line-reverse-setting/{id} [put] +// @Security Bearer +func (e LineReverseSetting) Update(c *gin.Context) { + req := dto.LineReverseSettingUpdateReq{} + s := service.LineReverseSetting{} + 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.LineReverseSettingDeleteReq true "body" +// @Success 200 {object} response.Response "{"code": 200, "message": "删除成功"}" +// @Router /api/v1/line-reverse-setting [delete] +// @Security Bearer +func (e LineReverseSetting) Delete(c *gin.Context) { + s := service.LineReverseSetting{} + req := dto.LineReverseSettingDeleteReq{} + 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_api_user.go b/app/admin/models/line_api_user.go index 2d29adf..f359305 100644 --- a/app/admin/models/line_api_user.go +++ b/app/admin/models/line_api_user.go @@ -2,29 +2,31 @@ package models import ( "go-admin/common/models" + + "github.com/shopspring/decimal" ) type LineApiUser struct { models.Model - ExchangeType string `json:"exchangeType" gorm:"type:varchar(20);comment:交易所类型(字典 exchange_type)"` - UserId int64 `json:"userId" gorm:"type:int unsigned;comment:用户id"` - JysId int64 `json:"jysId" gorm:"type:int;comment:关联交易所账号id"` - ApiName string `json:"apiName" gorm:"type:varchar(255);comment:api用户名"` - ApiKey string `json:"apiKey" gorm:"type:varchar(255);comment:apiKey"` - ApiSecret string `json:"apiSecret" gorm:"type:varchar(255);comment:apiSecret"` - IpAddress string `json:"ipAddress" gorm:"type:varchar(255);comment:代理地址"` - UserPass string `json:"userPass" gorm:"type:varchar(255);comment:代码账号密码"` - AdminId int64 `json:"adminId" gorm:"type:int unsigned;comment:管理员id"` - Affiliation int64 `json:"affiliation" gorm:"type:int;comment:归属:1=现货,2=合约,3=现货合约"` - AdminShow int64 `json:"adminShow" gorm:"type:int;comment:是否超管可见:1=是,0=否"` - Site string `json:"site" gorm:"type:enum('1','2','3');comment:允许下单的方向:1=多;2=空;3=多空"` - Subordinate string `json:"subordinate" gorm:"type:enum('0','1','2');comment:从属关系:0=未绑定关系;1=主账号;2=副帐号"` - GroupId int64 `json:"groupId" gorm:"type:int unsigned;comment:所属组id"` - OpenStatus int64 `json:"openStatus" gorm:"type:int unsigned;comment:开启状态 0=关闭 1=开启"` - - SpotLastTime string `json:"spotLastTime" gorm:"-"` //现货websocket最后通信时间 - FuturesLastTime string `json:"futuresLastTime" gorm:"-"` //合约websocket最后通信时间 + ExchangeType string `json:"exchangeType" gorm:"type:varchar(20);comment:交易所类型(字典 exchange_type)"` + UserId int64 `json:"userId" gorm:"type:int unsigned;comment:用户id"` + ApiName string `json:"apiName" gorm:"type:varchar(255);comment:api用户名"` + ApiKey string `json:"apiKey" gorm:"type:varchar(255);comment:apiKey"` + ApiSecret string `json:"apiSecret" gorm:"type:varchar(255);comment:apiSecret"` + IpAddress string `json:"ipAddress" gorm:"type:varchar(255);comment:代理地址"` + UserPass string `json:"userPass" gorm:"type:varchar(255);comment:代码账号密码"` + Affiliation int64 `json:"affiliation" gorm:"type:int;comment:归属:1=现货,2=合约,3=现货合约"` + AdminShow int64 `json:"adminShow" gorm:"type:int;comment:是否超管可见:1=是,0=否"` + Site string `json:"site" gorm:"type:enum('1','2','3');comment:允许下单的方向:1=多;2=空;3=多空"` + Subordinate string `json:"subordinate" gorm:"type:enum('0','1','2');comment:从属关系:0=未绑定关系;1=主账号;2=副帐号"` + GroupId int64 `json:"groupId" gorm:"type:int unsigned;comment:所属组id"` + OpenStatus int64 `json:"openStatus" gorm:"type:int unsigned;comment:开启状态 0=关闭 1=开启"` + ReverseStatus int `json:"reverseStatus" gorm:"type:tinyint unsigned;comment:反向开仓:1=开启;2=关闭"` + ReverseApiId int `json:"reverseApiId" gorm:"type:bigint;comment:反向apiId"` + OrderProportion decimal.Decimal `json:"orderProportion" gorm:"type:decimal(10,2);comment:委托比例"` + SpotLastTime string `json:"spotLastTime" gorm:"-"` //现货websocket最后通信时间 + FuturesLastTime string `json:"futuresLastTime" gorm:"-"` //合约websocket最后通信时间 models.ModelTime models.ControlBy } diff --git a/app/admin/models/line_reverse_setting.go b/app/admin/models/line_reverse_setting.go new file mode 100644 index 0000000..a3431ea --- /dev/null +++ b/app/admin/models/line_reverse_setting.go @@ -0,0 +1,30 @@ +package models + +import ( + "go-admin/common/models" + + "github.com/shopspring/decimal" +) + +type LineReverseSetting struct { + models.Model + + ReverseOrderType string `json:"reverseOrderType" gorm:"type:varchar(10);comment:反单下单类型 LIMIT-限价 MARKET-市价"` + ReversePremiumRatio decimal.Decimal `json:"reversePremiumRatio" gorm:"type:decimal(10,2);comment:溢价百分比"` + StopLossRatio decimal.Decimal `json:"stopLossRatio" gorm:"type:decimal(10,2);comment:止损百分比"` + models.ModelTime + models.ControlBy +} + +func (LineReverseSetting) TableName() string { + return "line_reverse_setting" +} + +func (e *LineReverseSetting) Generate() models.ActiveRecord { + o := *e + return &o +} + +func (e *LineReverseSetting) GetId() interface{} { + return e.Id +} diff --git a/app/admin/router/line_api_user.go b/app/admin/router/line_api_user.go index ae2c66e..5f878ef 100644 --- a/app/admin/router/line_api_user.go +++ b/app/admin/router/line_api_user.go @@ -27,5 +27,7 @@ func registerLineApiUserRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMi r.POST("bind", api.Bind) //绑定从属关系 r.POST("getUser", api.GetUser) //获取未绑定的用户 r.POST("getMainUser", api.GetMainUser) //获取获取主账号的用户 + + r.GET("unbind-reverse", api.GetUnBindReverseApiUser) //获取未绑定下反单用户 } } diff --git a/app/admin/router/line_reverse_setting.go b/app/admin/router/line_reverse_setting.go new file mode 100644 index 0000000..7e6f8fb --- /dev/null +++ b/app/admin/router/line_reverse_setting.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, registerLineReverseSettingRouter) +} + +// registerLineReverseSettingRouter +func registerLineReverseSettingRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) { + api := apis.LineReverseSetting{} + r := v1.Group("/line-reverse-setting").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_api_user.go b/app/admin/service/dto/line_api_user.go index d710531..50d7c74 100644 --- a/app/admin/service/dto/line_api_user.go +++ b/app/admin/service/dto/line_api_user.go @@ -1,9 +1,12 @@ package dto import ( + "errors" "go-admin/app/admin/models" "go-admin/common/dto" common "go-admin/common/models" + + "github.com/shopspring/decimal" ) type LineApiUserGetPageReq struct { @@ -41,44 +44,66 @@ func (m *LineApiUserGetPageReq) GetNeedSearch() interface{} { } type LineApiUserInsertReq struct { - Id int `json:"-" comment:"id"` // id - ExchangeType string `json:"exchangeType" comment:"交易所code"` - UserId int64 `json:"userId" comment:"用户id"` - JysId int64 `json:"jysId" comment:"关联交易所账号id"` - ApiName string `json:"apiName" comment:"api用户名"` - ApiKey string `json:"apiKey" comment:"apiKey"` - ApiSecret string `json:"apiSecret" comment:"apiSecret"` - IpAddress string `json:"ipAddress" comment:"代理地址"` - UserPass string `json:"userPass" comment:"代码账号密码"` - AdminId int64 `json:"adminId" comment:"管理员id"` - Affiliation int64 `json:"affiliation" comment:"归属:1=现货,2=合约,3=现货合约"` - AdminShow int64 `json:"adminShow" comment:"是否超管可见:1=是,0=否"` - Site string `json:"site" comment:"允许下单的方向:1=多;2=空;3=多空"` - Subordinate string `json:"subordinate" comment:"从属关系:0=未绑定关系;1=主账号;2=副帐号"` - GroupId int64 `json:"groupId" comment:"所属组id"` - OpenStatus int64 `json:"openStatus" comment:"开启状态 0=关闭 1=开启"` + Id int `json:"-" comment:"id"` // id + ExchangeType string `json:"exchangeType" comment:"交易所code"` + UserId int64 `json:"userId" comment:"用户id"` + JysId int64 `json:"jysId" comment:"关联交易所账号id"` + ApiName string `json:"apiName" comment:"api用户名"` + ApiKey string `json:"apiKey" comment:"apiKey"` + ApiSecret string `json:"apiSecret" comment:"apiSecret"` + IpAddress string `json:"ipAddress" comment:"代理地址"` + UserPass string `json:"userPass" comment:"代码账号密码"` + Affiliation int64 `json:"affiliation" comment:"归属:1=现货,2=合约,3=现货合约"` + AdminShow int64 `json:"adminShow" comment:"是否超管可见:1=是,0=否"` + Site string `json:"site" comment:"允许下单的方向:1=多;2=空;3=多空"` + Subordinate string `json:"subordinate" comment:"从属关系:0=未绑定关系;1=主账号;2=副帐号"` + GroupId int64 `json:"groupId" comment:"所属组id"` + OpenStatus int64 `json:"openStatus" comment:"开启状态 0=关闭 1=开启"` + ReverseStatus int `json:"reverseStatus" comment:"反向下单状态 1-开启 2-关闭"` + ReverseApiId int `json:"reverseApiId" comment:"反向下单apiId"` + OrderProportion decimal.Decimal `json:"orderProportion" comment:"委托比例"` common.ControlBy } +func (s *LineApiUserInsertReq) Valid() error { + if s.ReverseStatus == 1 { + if s.OrderProportion.Cmp(decimal.Zero) <= 0 { + return errors.New("委托比例必须大于0") + } + + if s.ReverseStatus == 1 && s.ReverseApiId == 0 { + return errors.New("反向下单api不能为空") + } + } + return nil +} + func (s *LineApiUserInsertReq) Generate(model *models.LineApiUser) { if s.Id == 0 { model.Model = common.Model{Id: s.Id} } model.ExchangeType = s.ExchangeType model.UserId = s.UserId - model.JysId = s.JysId model.ApiName = s.ApiName model.ApiKey = s.ApiKey model.ApiSecret = s.ApiSecret model.IpAddress = s.IpAddress model.UserPass = s.UserPass - model.AdminId = s.AdminId model.Affiliation = s.Affiliation model.AdminShow = s.AdminShow model.Site = s.Site model.Subordinate = s.Subordinate model.GroupId = s.GroupId model.OpenStatus = s.OpenStatus + model.ReverseStatus = s.ReverseStatus + model.OrderProportion = s.OrderProportion + + if model.ReverseStatus == 1 { + model.ReverseApiId = s.ReverseApiId + } else { + model.ReverseApiId = 0 + } + model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的 } @@ -87,44 +112,66 @@ func (s *LineApiUserInsertReq) GetId() interface{} { } type LineApiUserUpdateReq struct { - Id int `uri:"id" comment:"id"` // id - ExchangeType string `json:"exchangeType" comment:"交易所code"` - UserId int64 `json:"userId" comment:"用户id"` - JysId int64 `json:"jysId" comment:"关联交易所账号id"` - ApiName string `json:"apiName" comment:"api用户名"` - ApiKey string `json:"apiKey" comment:"apiKey"` - ApiSecret string `json:"apiSecret" comment:"apiSecret"` - IpAddress string `json:"ipAddress" comment:"代理地址"` - UserPass string `json:"userPass" comment:"代码账号密码"` - AdminId int64 `json:"adminId" comment:"管理员id"` - Affiliation int64 `json:"affiliation" comment:"归属:1=现货,2=合约,3=现货合约"` - AdminShow int64 `json:"adminShow" comment:"是否超管可见:1=是,0=否"` - Site string `json:"site" comment:"允许下单的方向:1=多;2=空;3=多空"` - Subordinate string `json:"subordinate" comment:"从属关系:0=未绑定关系;1=主账号;2=副帐号"` - GroupId int64 `json:"groupId" comment:"所属组id"` - OpenStatus int64 `json:"openStatus" comment:"开启状态 0=关闭 1=开启"` + Id int `uri:"id" comment:"id"` // id + ExchangeType string `json:"exchangeType" comment:"交易所code"` + UserId int64 `json:"userId" comment:"用户id"` + JysId int64 `json:"jysId" comment:"关联交易所账号id"` + ApiName string `json:"apiName" comment:"api用户名"` + ApiKey string `json:"apiKey" comment:"apiKey"` + ApiSecret string `json:"apiSecret" comment:"apiSecret"` + IpAddress string `json:"ipAddress" comment:"代理地址"` + UserPass string `json:"userPass" comment:"代码账号密码"` + Affiliation int64 `json:"affiliation" comment:"归属:1=现货,2=合约,3=现货合约"` + AdminShow int64 `json:"adminShow" comment:"是否超管可见:1=是,0=否"` + Site string `json:"site" comment:"允许下单的方向:1=多;2=空;3=多空"` + Subordinate string `json:"subordinate" comment:"从属关系:0=未绑定关系;1=主账号;2=副帐号"` + GroupId int64 `json:"groupId" comment:"所属组id"` + OpenStatus int64 `json:"openStatus" comment:"开启状态 0=关闭 1=开启"` + ReverseStatus int `json:"reverseStatus" comment:"反向下单状态 1-开启 2-关闭"` + ReverseApiId int `json:"reverseApiId" comment:"反向下单apiId"` + OrderProportion decimal.Decimal `json:"orderProportion" comment:"委托比例"` common.ControlBy } +func (s *LineApiUserUpdateReq) Valid() error { + if s.ReverseStatus == 1 { + if s.OrderProportion.Cmp(decimal.Zero) <= 0 { + return errors.New("委托比例必须大于0") + } + + if s.ReverseStatus == 1 && s.ReverseApiId == 0 { + return errors.New("反向下单api不能为空") + } + } + return nil +} + func (s *LineApiUserUpdateReq) Generate(model *models.LineApiUser) { if s.Id == 0 { model.Model = common.Model{Id: s.Id} } model.ExchangeType = s.ExchangeType model.UserId = s.UserId - model.JysId = s.JysId model.ApiName = s.ApiName model.ApiKey = s.ApiKey model.ApiSecret = s.ApiSecret model.IpAddress = s.IpAddress model.UserPass = s.UserPass - model.AdminId = s.AdminId model.Affiliation = s.Affiliation model.AdminShow = s.AdminShow model.Site = s.Site model.Subordinate = s.Subordinate model.GroupId = s.GroupId model.OpenStatus = s.OpenStatus + model.ReverseStatus = s.ReverseStatus + model.OrderProportion = s.OrderProportion + + if model.ReverseStatus == 1 { + model.ReverseApiId = s.ReverseApiId + } else { + model.ReverseApiId = 0 + } + model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的 } @@ -159,3 +206,16 @@ type LineApiUserBindSubordinateReq struct { type GetMainUserReq struct { ExchangeType string `json:"exchangeType"` } + +type GetUnBindReverseReq struct { + ExchangeType string `json:"exchangeType" form:"exchangeType"` + ApiId int `json:"apiId" form:"apiId" comment:"当前apiId"` +} + +// 未绑定反向下单查询返回结构体 +type UnBindReverseResp struct { + Id int `json:"id"` + UserId int64 `json:"userId"` + Disabled bool `json:"disabled"` + ApiName string `json:"apiName"` +} diff --git a/app/admin/service/dto/line_reverse_setting.go b/app/admin/service/dto/line_reverse_setting.go new file mode 100644 index 0000000..a168bfc --- /dev/null +++ b/app/admin/service/dto/line_reverse_setting.go @@ -0,0 +1,89 @@ +package dto + +import ( + "go-admin/app/admin/models" + "go-admin/common/dto" + common "go-admin/common/models" + + "github.com/shopspring/decimal" +) + +type LineReverseSettingGetPageReq struct { + dto.Pagination `search:"-"` + LineReverseSettingOrder +} + +type LineReverseSettingOrder struct { + Id string `form:"idOrder" search:"type:order;column:id;table:line_reverse_setting"` + ReverseOrderType string `form:"reverseOrderTypeOrder" search:"type:order;column:reverse_order_type;table:line_reverse_setting"` + ReversePremiumRatio string `form:"reversePremiumRatioOrder" search:"type:order;column:reverse_premium_ratio;table:line_reverse_setting"` + CreatedAt string `form:"createdAtOrder" search:"type:order;column:created_at;table:line_reverse_setting"` + UpdatedAt string `form:"updatedAtOrder" search:"type:order;column:updated_at;table:line_reverse_setting"` + DeletedAt string `form:"deletedAtOrder" search:"type:order;column:deleted_at;table:line_reverse_setting"` + CreateBy string `form:"createByOrder" search:"type:order;column:create_by;table:line_reverse_setting"` + UpdateBy string `form:"updateByOrder" search:"type:order;column:update_by;table:line_reverse_setting"` +} + +func (m *LineReverseSettingGetPageReq) GetNeedSearch() interface{} { + return *m +} + +type LineReverseSettingInsertReq struct { + Id int `json:"-" comment:"主键id"` // 主键id + ReverseOrderType string `json:"reverseOrderType" comment:"反单下单类型 LIMIT-限价 MARKET-市价"` + ReversePremiumRatio decimal.Decimal `json:"reversePremiumRatio" comment:"溢价百分比"` + common.ControlBy +} + +func (s *LineReverseSettingInsertReq) Generate(model *models.LineReverseSetting) { + if s.Id == 0 { + model.Model = common.Model{Id: s.Id} + } + model.ReverseOrderType = s.ReverseOrderType + model.ReversePremiumRatio = s.ReversePremiumRatio + model.CreateBy = s.CreateBy // 添加这而,需要记录是被谁创建的 +} + +func (s *LineReverseSettingInsertReq) GetId() interface{} { + return s.Id +} + +type LineReverseSettingUpdateReq struct { + Id int `uri:"id" comment:"主键id"` // 主键id + ReverseOrderType string `json:"reverseOrderType" comment:"反单下单类型 LIMIT-限价 MARKET-市价"` + ReversePremiumRatio decimal.Decimal `json:"reversePremiumRatio" comment:"溢价百分比"` + StopLossRatio decimal.Decimal `json:"stopLossRatio" comment:"止损百分比"` + common.ControlBy +} + +func (s *LineReverseSettingUpdateReq) Generate(model *models.LineReverseSetting) { + if s.Id == 0 { + model.Model = common.Model{Id: s.Id} + } + model.ReverseOrderType = s.ReverseOrderType + model.ReversePremiumRatio = s.ReversePremiumRatio + model.StopLossRatio = s.StopLossRatio + model.UpdateBy = s.UpdateBy // 添加这而,需要记录是被谁更新的 +} + +func (s *LineReverseSettingUpdateReq) GetId() interface{} { + return s.Id +} + +// LineReverseSettingGetReq 功能获取请求参数 +type LineReverseSettingGetReq struct { + Id int `uri:"id"` +} + +func (s *LineReverseSettingGetReq) GetId() interface{} { + return s.Id +} + +// LineReverseSettingDeleteReq 功能删除请求参数 +type LineReverseSettingDeleteReq struct { + Ids []int `json:"ids"` +} + +func (s *LineReverseSettingDeleteReq) GetId() interface{} { + return s.Ids +} diff --git a/app/admin/service/line_api_user.go b/app/admin/service/line_api_user.go index 55ed4bc..577abe9 100644 --- a/app/admin/service/line_api_user.go +++ b/app/admin/service/line_api_user.go @@ -97,7 +97,28 @@ func (e *LineApiUser) Insert(c *dto.LineApiUserInsertReq) error { var err error var data models.LineApiUser c.Generate(&data) - err = e.Orm.Create(&data).Error + err = e.Orm.Transaction(func(tx *gorm.DB) error { + if c.ReverseApiId > 0 { + var count int64 + if err2 := tx.Model(models.LineApiUser{}).Where("subordinate <> '0' AND id=?", c.ReverseApiId).Count(&count).Error; err2 != nil { + return err2 + } + if count > 0 { + return errors.New("反向api已被使用") + } + + if err2 := tx.Model(models.LineApiUser{}).Where("id =?", c.ReverseApiId).Update("subordinate", 2).Error; err2 != nil { + return err2 + } + data.Subordinate = "1" + } + + if err2 := tx.Create(&data).Error; err2 != nil { + return err2 + } + + return nil + }) if err != nil { e.Log.Errorf("LineApiUserService Insert error:%s \r\n", err) return err @@ -197,6 +218,7 @@ func (e *LineApiUser) Update(c *dto.LineApiUserUpdateReq, p *actions.DataPermiss actions.Permission(data.TableName(), p), ).First(&data, c.GetId()) oldApiKey := data.ApiKey + oldReverseApiId := data.ReverseApiId c.Generate(&data) @@ -204,6 +226,33 @@ func (e *LineApiUser) Update(c *dto.LineApiUserUpdateReq, p *actions.DataPermiss //事务 err = e.Orm.Transaction(func(tx *gorm.DB) error { + if data.ReverseApiId > 0 && data.ReverseApiId != oldReverseApiId { + var count int64 + if err2 := tx.Model(models.LineApiUser{}).Where("subordinate <> '0' AND id=?", c.ReverseApiId).Count(&count).Error; err2 != nil { + return err2 + } + if count > 0 { + return errors.New("反向api已被使用") + } + + if err2 := tx.Model(models.LineApiUser{}).Where("id =?", c.ReverseApiId).Update("subordinate", "2").Error; err2 != nil { + return err2 + } + + data.Subordinate = "1" + } + + if oldReverseApiId > 0 && oldReverseApiId != data.ReverseApiId { + if err2 := tx.Model(models.LineApiUser{}).Where("id =?", oldReverseApiId).Update("subordinate", "0").Error; err2 != nil { + e.Log.Errorf("解绑反向api失败 api:%d err:%v", oldReverseApiId, err2) + return fmt.Errorf("解绑反向api失败") + } + + if data.ReverseApiId == 0 { + data.Subordinate = "0" + } + } + db := tx.Save(&data) if err = db.Error; err != nil { e.Log.Errorf("LineApiUserService Save error:%s \r\n", err) @@ -414,3 +463,44 @@ func (e *LineApiUser) GetActiveApis(apiIds []int) ([]int, error) { return result, nil } + +// GetUnBindApiUser 获取未绑定反向下单的的api用户 +func (e *LineApiUser) GetUnBindApiUser(req *dto.GetUnBindReverseReq, list *[]dto.UnBindReverseResp) error { + var datas []models.LineApiUser + var data models.LineApiUser + var count int64 + + if req.ApiId > 0 { + e.Orm.Model(data).Where("id =? AND subordinate = '2'", req.ApiId).Count(&count) + + if count > 0 { + return nil + } + } + + query := e.Orm.Model(&data). + Where("open_status =1 AND exchange_type = ? ", req.ExchangeType) + + if err := query. + Find(&datas).Error; err != nil { + e.Log.Error("获取未绑定用户失败:", err) + return fmt.Errorf("获取未绑定用户失败") + } + + for _, item := range datas { + if item.Id == req.ApiId { + continue + } + + listItem := dto.UnBindReverseResp{ + Id: item.Id, + UserId: item.UserId, + ApiName: item.ApiName, + Disabled: item.Subordinate != "0", + } + + (*list) = append((*list), listItem) + } + + return nil +} diff --git a/app/admin/service/line_reverse_setting.go b/app/admin/service/line_reverse_setting.go new file mode 100644 index 0000000..544e795 --- /dev/null +++ b/app/admin/service/line_reverse_setting.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 LineReverseSetting struct { + service.Service +} + +// GetPage 获取LineReverseSetting列表 +func (e *LineReverseSetting) GetPage(c *dto.LineReverseSettingGetPageReq, p *actions.DataPermission, list *[]models.LineReverseSetting, count *int64) error { + var err error + var data models.LineReverseSetting + + 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("LineReverseSettingService GetPage error:%s \r\n", err) + return err + } + return nil +} + +// Get 获取LineReverseSetting对象 +func (e *LineReverseSetting) Get(d *dto.LineReverseSettingGetReq, p *actions.DataPermission, model *models.LineReverseSetting) error { + var data models.LineReverseSetting + + 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 GetLineReverseSetting error:%s \r\n", err) + return err + } + if err != nil { + e.Log.Errorf("db error:%s", err) + return err + } + return nil +} + +// Insert 创建LineReverseSetting对象 +func (e *LineReverseSetting) Insert(c *dto.LineReverseSettingInsertReq) error { + var err error + var data models.LineReverseSetting + c.Generate(&data) + err = e.Orm.Create(&data).Error + if err != nil { + e.Log.Errorf("LineReverseSettingService Insert error:%s \r\n", err) + return err + } + return nil +} + +// Update 修改LineReverseSetting对象 +func (e *LineReverseSetting) Update(c *dto.LineReverseSettingUpdateReq, p *actions.DataPermission) error { + var err error + var data = models.LineReverseSetting{} + 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("LineReverseSettingService Save error:%s \r\n", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权更新该数据") + } + return nil +} + +// Remove 删除LineReverseSetting +func (e *LineReverseSetting) Remove(d *dto.LineReverseSettingDeleteReq, p *actions.DataPermission) error { + var data models.LineReverseSetting + + 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 RemoveLineReverseSetting error:%s \r\n", err) + return err + } + if db.RowsAffected == 0 { + return errors.New("无权删除该数据") + } + return nil +}