From fa465a01f035fe0a99d02c457ade9c6c7927ed0a Mon Sep 17 00:00:00 2001 From: gjs Date: Wed, 21 Oct 2026 16:56:57 +0800 Subject: [PATCH] add apis --- pkg/utils/tools.go | 11 +++ rpc/equipment/equipment.pb | Bin 20812 -> 20925 bytes rpc/equipment/equipment.proto | 7 ++ rpc/equipment/pb/equipment.pb.go | 89 +++++++++--------- rpc/equipment/pb/equipment_grpc.pb.go | 42 ++++++++- .../equipment/equipmentclient/equipment.go | 10 +- .../internal/logic/authorizationCodeLogic.go | 48 ++++++++++ .../internal/server/equipmentServer.go | 7 +- 8 files changed, 166 insertions(+), 48 deletions(-) create mode 100644 services/equipment/internal/logic/authorizationCodeLogic.go diff --git a/pkg/utils/tools.go b/pkg/utils/tools.go index 0ebb56d..e8946ac 100644 --- a/pkg/utils/tools.go +++ b/pkg/utils/tools.go @@ -319,6 +319,17 @@ func RandString(num uint8) string { return string(res) } +func RandNumber(num uint8) string { + chars := "123456789" + rand.Seed(time.Now().UnixNano()) + + res := make([]byte, num) + for i := range res { + res[i] = chars[rand.Intn(len(chars))] + } + return string(res) +} + // ExcelColumn 定义导出的列:表头 + 对应结构体字段 type ExcelColumn struct { Header string // 表头显示名称 diff --git a/rpc/equipment/equipment.pb b/rpc/equipment/equipment.pb index c0c4db448273af5088d7d543418ea2d873c17f6d..24792fb5983196e7024a6ab1755dd0ca4e9770cd 100644 GIT binary patch delta 64 zcmX@Jh;i>?#tn~+nQmBbernvr&$L%&bEb0}k4Qe3pkrxCMt)IdRbokIex7rFO6uf^ T{`!-h{nS{Jft<~+{Sz4hR9hK1 delta 30 mcmdnHnDNXa#tn~+nVws1ernvr&vZt5bEb0}&*p@HSVjQYR1C2I diff --git a/rpc/equipment/equipment.proto b/rpc/equipment/equipment.proto index 68a741c..0329f6c 100644 --- a/rpc/equipment/equipment.proto +++ b/rpc/equipment/equipment.proto @@ -429,6 +429,13 @@ service Equipment { }; }; + rpc AuthorizationCode(EmptyRequest) returns(Response){ + option (google.api.http) = { + post: "/api/v3/device/authorization/code" + body: "*" + }; + }; + rpc InternalBindAdd(InternalBindAddRequest) returns(Response); rpc InternalBindInfo(InternalBindInfoRequest) returns(Response); diff --git a/rpc/equipment/pb/equipment.pb.go b/rpc/equipment/pb/equipment.pb.go index cce54a6..e67e790 100644 --- a/rpc/equipment/pb/equipment.pb.go +++ b/rpc/equipment/pb/equipment.pb.go @@ -2345,7 +2345,7 @@ const file_equipment_equipment_proto_rawDesc = "" + "\x02id\x18\x01 \x01(\x03R\x02id\"A\n" + "\x11ApiVersionRequest\x12\x12\n" + "\x04type\x18\x01 \x01(\x05R\x04type\x12\x18\n" + - "\aversion\x18\x02 \x01(\tR\aversion2\xcc\x1b\n" + + "\aversion\x18\x02 \x01(\tR\aversion2\xbd\x1c\n" + "\tEquipment\x12Y\n" + "\x05Items\x12\x17.equipment.ItemsRequest\x1a\x13.equipment.Response\"\"\x82\xd3\xe4\x93\x02\x1c:\x01*\x12\x17/admin/v3/version/items\x12T\n" + "\x04Info\x12\x14.equipment.IdRequest\x1a\x13.equipment.Response\"!\x82\xd3\xe4\x93\x02\x1b:\x01*\x12\x16/admin/v3/version/info\x12\\\n" + @@ -2383,7 +2383,8 @@ const file_equipment_equipment_proto_rawDesc = "" + "\x11AuthorizationBind\x12#.equipment.AuthorizationBindRequest\x1a\x13.equipment.Response\",\x82\xd3\xe4\x93\x02&:\x01*\"!/api/v3/device/authorization/bind\x12\x81\x01\n" + "\x13AuthorizationCancel\x12%.equipment.AuthorizationCancelRequest\x1a\x13.equipment.Response\".\x82\xd3\xe4\x93\x02(:\x01*\"#/api/v3/device/authorization/cancel\x12\x84\x01\n" + "\x14AuthorizationControl\x12&.equipment.AuthorizationControlRequest\x1a\x13.equipment.Response\"/\x82\xd3\xe4\x93\x02):\x01*\"$/api/v3/device/authorization/control\x12q\n" + - "\x12AuthorizationItems\x12\x17.equipment.EmptyRequest\x1a\x13.equipment.Response\"-\x82\xd3\xe4\x93\x02':\x01*\"\"/api/v3/device/authorization/items\x12I\n" + + "\x12AuthorizationItems\x12\x17.equipment.EmptyRequest\x1a\x13.equipment.Response\"-\x82\xd3\xe4\x93\x02':\x01*\"\"/api/v3/device/authorization/items\x12o\n" + + "\x11AuthorizationCode\x12\x17.equipment.EmptyRequest\x1a\x13.equipment.Response\",\x82\xd3\xe4\x93\x02&:\x01*\"!/api/v3/device/authorization/code\x12I\n" + "\x0fInternalBindAdd\x12!.equipment.InternalBindAddRequest\x1a\x13.equipment.Response\x12K\n" + "\x10InternalBindInfo\x12\".equipment.InternalBindInfoRequest\x1a\x13.equipment.Response\x12R\n" + "\x0fInternalUserAdd\x12\".equipment.InternalUserInfoRequest\x1a\x1b.equipment.InternalResponse\x12Y\n" + @@ -2469,47 +2470,49 @@ var file_equipment_equipment_proto_depIdxs = []int32{ 16, // 28: equipment.Equipment.AuthorizationCancel:input_type -> equipment.AuthorizationCancelRequest 17, // 29: equipment.Equipment.AuthorizationControl:input_type -> equipment.AuthorizationControlRequest 19, // 30: equipment.Equipment.AuthorizationItems:input_type -> equipment.EmptyRequest - 10, // 31: equipment.Equipment.InternalBindAdd:input_type -> equipment.InternalBindAddRequest - 11, // 32: equipment.Equipment.InternalBindInfo:input_type -> equipment.InternalBindInfoRequest - 28, // 33: equipment.Equipment.InternalUserAdd:input_type -> equipment.InternalUserInfoRequest - 28, // 34: equipment.Equipment.InternalUserEditNumber:input_type -> equipment.InternalUserInfoRequest - 0, // 35: equipment.Equipment.Items:output_type -> equipment.Response - 0, // 36: equipment.Equipment.Info:output_type -> equipment.Response - 0, // 37: equipment.Equipment.Create:output_type -> equipment.Response - 0, // 38: equipment.Equipment.Edit:output_type -> equipment.Response - 0, // 39: equipment.Equipment.Status:output_type -> equipment.Response - 0, // 40: equipment.Equipment.MaskItems:output_type -> equipment.Response - 0, // 41: equipment.Equipment.BeansItems:output_type -> equipment.Response - 0, // 42: equipment.Equipment.BindExpiry:output_type -> equipment.Response - 0, // 43: equipment.Equipment.UserBind:output_type -> equipment.Response - 0, // 44: equipment.Equipment.ApiMaskAdd:output_type -> equipment.Response - 0, // 45: equipment.Equipment.ApiBindItems:output_type -> equipment.Response - 0, // 46: equipment.Equipment.ApiUnBind:output_type -> equipment.Response - 0, // 47: equipment.Equipment.ApiBindAdd:output_type -> equipment.Response - 0, // 48: equipment.Equipment.ApiBindExpiry:output_type -> equipment.Response - 0, // 49: equipment.Equipment.ApiBindExpiryGet:output_type -> equipment.Response - 0, // 50: equipment.Equipment.ApiBeansAdd:output_type -> equipment.Response - 0, // 51: equipment.Equipment.ApiBeansLast:output_type -> equipment.Response - 0, // 52: equipment.Equipment.ApiBeansItems:output_type -> equipment.Response - 0, // 53: equipment.Equipment.ApiMaskUse:output_type -> equipment.Response - 0, // 54: equipment.Equipment.ApiMaskUsedItems:output_type -> equipment.Response - 0, // 55: equipment.Equipment.ApiMaskStoreUse:output_type -> equipment.Response - 0, // 56: equipment.Equipment.ApiMaskStoreUseItems:output_type -> equipment.Response - 0, // 57: equipment.Equipment.ApiVersion:output_type -> equipment.Response - 0, // 58: equipment.Equipment.ApiBindInfo:output_type -> equipment.Response - 0, // 59: equipment.Equipment.ApiBindUpdate:output_type -> equipment.Response - 0, // 60: equipment.Equipment.ApiCheckMask:output_type -> equipment.Response - 0, // 61: equipment.Equipment.ApiEditName:output_type -> equipment.Response - 0, // 62: equipment.Equipment.AuthorizationBind:output_type -> equipment.Response - 0, // 63: equipment.Equipment.AuthorizationCancel:output_type -> equipment.Response - 0, // 64: equipment.Equipment.AuthorizationControl:output_type -> equipment.Response - 0, // 65: equipment.Equipment.AuthorizationItems:output_type -> equipment.Response - 0, // 66: equipment.Equipment.InternalBindAdd:output_type -> equipment.Response - 0, // 67: equipment.Equipment.InternalBindInfo:output_type -> equipment.Response - 29, // 68: equipment.Equipment.InternalUserAdd:output_type -> equipment.InternalResponse - 29, // 69: equipment.Equipment.InternalUserEditNumber:output_type -> equipment.InternalResponse - 35, // [35:70] is the sub-list for method output_type - 0, // [0:35] is the sub-list for method input_type + 19, // 31: equipment.Equipment.AuthorizationCode:input_type -> equipment.EmptyRequest + 10, // 32: equipment.Equipment.InternalBindAdd:input_type -> equipment.InternalBindAddRequest + 11, // 33: equipment.Equipment.InternalBindInfo:input_type -> equipment.InternalBindInfoRequest + 28, // 34: equipment.Equipment.InternalUserAdd:input_type -> equipment.InternalUserInfoRequest + 28, // 35: equipment.Equipment.InternalUserEditNumber:input_type -> equipment.InternalUserInfoRequest + 0, // 36: equipment.Equipment.Items:output_type -> equipment.Response + 0, // 37: equipment.Equipment.Info:output_type -> equipment.Response + 0, // 38: equipment.Equipment.Create:output_type -> equipment.Response + 0, // 39: equipment.Equipment.Edit:output_type -> equipment.Response + 0, // 40: equipment.Equipment.Status:output_type -> equipment.Response + 0, // 41: equipment.Equipment.MaskItems:output_type -> equipment.Response + 0, // 42: equipment.Equipment.BeansItems:output_type -> equipment.Response + 0, // 43: equipment.Equipment.BindExpiry:output_type -> equipment.Response + 0, // 44: equipment.Equipment.UserBind:output_type -> equipment.Response + 0, // 45: equipment.Equipment.ApiMaskAdd:output_type -> equipment.Response + 0, // 46: equipment.Equipment.ApiBindItems:output_type -> equipment.Response + 0, // 47: equipment.Equipment.ApiUnBind:output_type -> equipment.Response + 0, // 48: equipment.Equipment.ApiBindAdd:output_type -> equipment.Response + 0, // 49: equipment.Equipment.ApiBindExpiry:output_type -> equipment.Response + 0, // 50: equipment.Equipment.ApiBindExpiryGet:output_type -> equipment.Response + 0, // 51: equipment.Equipment.ApiBeansAdd:output_type -> equipment.Response + 0, // 52: equipment.Equipment.ApiBeansLast:output_type -> equipment.Response + 0, // 53: equipment.Equipment.ApiBeansItems:output_type -> equipment.Response + 0, // 54: equipment.Equipment.ApiMaskUse:output_type -> equipment.Response + 0, // 55: equipment.Equipment.ApiMaskUsedItems:output_type -> equipment.Response + 0, // 56: equipment.Equipment.ApiMaskStoreUse:output_type -> equipment.Response + 0, // 57: equipment.Equipment.ApiMaskStoreUseItems:output_type -> equipment.Response + 0, // 58: equipment.Equipment.ApiVersion:output_type -> equipment.Response + 0, // 59: equipment.Equipment.ApiBindInfo:output_type -> equipment.Response + 0, // 60: equipment.Equipment.ApiBindUpdate:output_type -> equipment.Response + 0, // 61: equipment.Equipment.ApiCheckMask:output_type -> equipment.Response + 0, // 62: equipment.Equipment.ApiEditName:output_type -> equipment.Response + 0, // 63: equipment.Equipment.AuthorizationBind:output_type -> equipment.Response + 0, // 64: equipment.Equipment.AuthorizationCancel:output_type -> equipment.Response + 0, // 65: equipment.Equipment.AuthorizationControl:output_type -> equipment.Response + 0, // 66: equipment.Equipment.AuthorizationItems:output_type -> equipment.Response + 0, // 67: equipment.Equipment.AuthorizationCode:output_type -> equipment.Response + 0, // 68: equipment.Equipment.InternalBindAdd:output_type -> equipment.Response + 0, // 69: equipment.Equipment.InternalBindInfo:output_type -> equipment.Response + 29, // 70: equipment.Equipment.InternalUserAdd:output_type -> equipment.InternalResponse + 29, // 71: equipment.Equipment.InternalUserEditNumber:output_type -> equipment.InternalResponse + 36, // [36:72] is the sub-list for method output_type + 0, // [0:36] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/rpc/equipment/pb/equipment_grpc.pb.go b/rpc/equipment/pb/equipment_grpc.pb.go index 57ccd19..0f95c33 100644 --- a/rpc/equipment/pb/equipment_grpc.pb.go +++ b/rpc/equipment/pb/equipment_grpc.pb.go @@ -50,6 +50,7 @@ const ( Equipment_AuthorizationCancel_FullMethodName = "/equipment.Equipment/AuthorizationCancel" Equipment_AuthorizationControl_FullMethodName = "/equipment.Equipment/AuthorizationControl" Equipment_AuthorizationItems_FullMethodName = "/equipment.Equipment/AuthorizationItems" + Equipment_AuthorizationCode_FullMethodName = "/equipment.Equipment/AuthorizationCode" Equipment_InternalBindAdd_FullMethodName = "/equipment.Equipment/InternalBindAdd" Equipment_InternalBindInfo_FullMethodName = "/equipment.Equipment/InternalBindInfo" Equipment_InternalUserAdd_FullMethodName = "/equipment.Equipment/InternalUserAdd" @@ -94,8 +95,9 @@ type EquipmentClient interface { AuthorizationCancel(ctx context.Context, in *AuthorizationCancelRequest, opts ...grpc.CallOption) (*Response, error) // 更改打开权限开关 AuthorizationControl(ctx context.Context, in *AuthorizationControlRequest, opts ...grpc.CallOption) (*Response, error) - // 更改打用户端获取授权列表开权限开关 + // 用户端获取授权列表 AuthorizationItems(ctx context.Context, in *EmptyRequest, opts ...grpc.CallOption) (*Response, error) + AuthorizationCode(ctx context.Context, in *EmptyRequest, opts ...grpc.CallOption) (*Response, error) InternalBindAdd(ctx context.Context, in *InternalBindAddRequest, opts ...grpc.CallOption) (*Response, error) InternalBindInfo(ctx context.Context, in *InternalBindInfoRequest, opts ...grpc.CallOption) (*Response, error) // 添加用户信息 @@ -422,6 +424,16 @@ func (c *equipmentClient) AuthorizationItems(ctx context.Context, in *EmptyReque return out, nil } +func (c *equipmentClient) AuthorizationCode(ctx context.Context, in *EmptyRequest, opts ...grpc.CallOption) (*Response, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Response) + err := c.cc.Invoke(ctx, Equipment_AuthorizationCode_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *equipmentClient) InternalBindAdd(ctx context.Context, in *InternalBindAddRequest, opts ...grpc.CallOption) (*Response, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(Response) @@ -500,8 +512,9 @@ type EquipmentServer interface { AuthorizationCancel(context.Context, *AuthorizationCancelRequest) (*Response, error) // 更改打开权限开关 AuthorizationControl(context.Context, *AuthorizationControlRequest) (*Response, error) - // 更改打用户端获取授权列表开权限开关 + // 用户端获取授权列表 AuthorizationItems(context.Context, *EmptyRequest) (*Response, error) + AuthorizationCode(context.Context, *EmptyRequest) (*Response, error) InternalBindAdd(context.Context, *InternalBindAddRequest) (*Response, error) InternalBindInfo(context.Context, *InternalBindInfoRequest) (*Response, error) // 添加用户信息 @@ -611,6 +624,9 @@ func (UnimplementedEquipmentServer) AuthorizationControl(context.Context, *Autho func (UnimplementedEquipmentServer) AuthorizationItems(context.Context, *EmptyRequest) (*Response, error) { return nil, status.Error(codes.Unimplemented, "method AuthorizationItems not implemented") } +func (UnimplementedEquipmentServer) AuthorizationCode(context.Context, *EmptyRequest) (*Response, error) { + return nil, status.Error(codes.Unimplemented, "method AuthorizationCode not implemented") +} func (UnimplementedEquipmentServer) InternalBindAdd(context.Context, *InternalBindAddRequest) (*Response, error) { return nil, status.Error(codes.Unimplemented, "method InternalBindAdd not implemented") } @@ -1202,6 +1218,24 @@ func _Equipment_AuthorizationItems_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _Equipment_AuthorizationCode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EmptyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EquipmentServer).AuthorizationCode(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Equipment_AuthorizationCode_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EquipmentServer).AuthorizationCode(ctx, req.(*EmptyRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Equipment_InternalBindAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(InternalBindAddRequest) if err := dec(in); err != nil { @@ -1405,6 +1439,10 @@ var Equipment_ServiceDesc = grpc.ServiceDesc{ MethodName: "AuthorizationItems", Handler: _Equipment_AuthorizationItems_Handler, }, + { + MethodName: "AuthorizationCode", + Handler: _Equipment_AuthorizationCode_Handler, + }, { MethodName: "InternalBindAdd", Handler: _Equipment_InternalBindAdd_Handler, diff --git a/services/equipment/equipmentclient/equipment.go b/services/equipment/equipmentclient/equipment.go index 2473c8d..28d2f7f 100644 --- a/services/equipment/equipmentclient/equipment.go +++ b/services/equipment/equipmentclient/equipment.go @@ -83,8 +83,9 @@ type ( AuthorizationCancel(ctx context.Context, in *AuthorizationCancelRequest, opts ...grpc.CallOption) (*Response, error) // 更改打开权限开关 AuthorizationControl(ctx context.Context, in *AuthorizationControlRequest, opts ...grpc.CallOption) (*Response, error) - // 更改打用户端获取授权列表开权限开关 + // 用户端获取授权列表 AuthorizationItems(ctx context.Context, in *EmptyRequest, opts ...grpc.CallOption) (*Response, error) + AuthorizationCode(ctx context.Context, in *EmptyRequest, opts ...grpc.CallOption) (*Response, error) InternalBindAdd(ctx context.Context, in *InternalBindAddRequest, opts ...grpc.CallOption) (*Response, error) InternalBindInfo(ctx context.Context, in *InternalBindInfoRequest, opts ...grpc.CallOption) (*Response, error) // 添加用户信息 @@ -258,12 +259,17 @@ func (m *defaultEquipment) AuthorizationControl(ctx context.Context, in *Authori return client.AuthorizationControl(ctx, in, opts...) } -// 更改打用户端获取授权列表开权限开关 +// 用户端获取授权列表 func (m *defaultEquipment) AuthorizationItems(ctx context.Context, in *EmptyRequest, opts ...grpc.CallOption) (*Response, error) { client := equipment.NewEquipmentClient(m.cli.Conn()) return client.AuthorizationItems(ctx, in, opts...) } +func (m *defaultEquipment) AuthorizationCode(ctx context.Context, in *EmptyRequest, opts ...grpc.CallOption) (*Response, error) { + client := equipment.NewEquipmentClient(m.cli.Conn()) + return client.AuthorizationCode(ctx, in, opts...) +} + func (m *defaultEquipment) InternalBindAdd(ctx context.Context, in *InternalBindAddRequest, opts ...grpc.CallOption) (*Response, error) { client := equipment.NewEquipmentClient(m.cli.Conn()) return client.InternalBindAdd(ctx, in, opts...) diff --git a/services/equipment/internal/logic/authorizationCodeLogic.go b/services/equipment/internal/logic/authorizationCodeLogic.go new file mode 100644 index 0000000..87a8774 --- /dev/null +++ b/services/equipment/internal/logic/authorizationCodeLogic.go @@ -0,0 +1,48 @@ +package logic + +import ( + "context" + "lone-services/pkg/redis" + "lone-services/pkg/utils" + "lone-services/services/equipment/internal/dao" + "strconv" + "time" + + "lone-services/rpc/equipment/pb" + "lone-services/services/equipment/internal/svc" + + "github.com/zeromicro/go-zero/core/logx" +) + +type AuthorizationCodeLogic struct { + ctx context.Context + svcCtx *svc.ServiceContext + logx.Logger + BaseLogic +} + +func NewAuthorizationCodeLogic(ctx context.Context, svcCtx *svc.ServiceContext) *AuthorizationCodeLogic { + return &AuthorizationCodeLogic{ + ctx: ctx, + svcCtx: svcCtx, + Logger: logx.WithContext(ctx), + } +} + +func (l *AuthorizationCodeLogic) AuthorizationCode(in *equipment.EmptyRequest) (*equipment.Response, error) { + adminInfo := utils.GetUserFromCtx(l.ctx) + if adminInfo.ID < utils.NumberOne { + return l.fail(utils.ErrorNoLoginInfo) + } + + key := dao.CodeName + strconv.FormatInt(adminInfo.ID, utils.NumberTen) + + code := utils.RandNumber(utils.NumberSix) + out := utils.GetConfigInt("code.out-time") + _, err := redis.Client.Set(l.ctx, key, code, time.Duration(out)*time.Second).Result() + if err != nil { + l.Logger.Error(err) + return l.fail(utils.Fail) + } + return l.ok(code) +} diff --git a/services/equipment/internal/server/equipmentServer.go b/services/equipment/internal/server/equipmentServer.go index 728fd27..6f4dcd2 100644 --- a/services/equipment/internal/server/equipmentServer.go +++ b/services/equipment/internal/server/equipmentServer.go @@ -177,12 +177,17 @@ func (s *EquipmentServer) AuthorizationControl(ctx context.Context, in *equipmen return l.AuthorizationControl(in) } -// 更改打用户端获取授权列表开权限开关 +// 用户端获取授权列表 func (s *EquipmentServer) AuthorizationItems(ctx context.Context, in *equipment.EmptyRequest) (*equipment.Response, error) { l := logic.NewAuthorizationItemsLogic(ctx, s.svcCtx) return l.AuthorizationItems(in) } +func (s *EquipmentServer) AuthorizationCode(ctx context.Context, in *equipment.EmptyRequest) (*equipment.Response, error) { + l := logic.NewAuthorizationCodeLogic(ctx, s.svcCtx) + return l.AuthorizationCode(in) +} + func (s *EquipmentServer) InternalBindAdd(ctx context.Context, in *equipment.InternalBindAddRequest) (*equipment.Response, error) { l := logic.NewInternalBindAddLogic(ctx, s.svcCtx) return l.InternalBindAdd(in)