ws
CI / changes (push) Successful in 1m29s
CI / ad (push) Successful in 0s
CI / admin (push) Successful in 0s
CI / bff (push) Successful in 29s
CI / chore (push) Successful in 0s
CI / equipment (push) Successful in 0s
CI / express (push) Successful in 0s
CI / factory (push) Successful in 0s
CI / message (push) Successful in 1s
CI / order (push) Successful in 0s
CI / payment (push) Successful in 0s
CI / product (push) Successful in 1s
CI / record (push) Successful in 0s
CI / sale (push) Successful in 20s
CI / support (push) Successful in 1s
CI / task (push) Successful in 0s
CI / user (push) Successful in 0s
CI / wecom (push) Successful in 1s

This commit is contained in:
2026-10-08 14:14:39 +08:00
parent 2cafb7a7ee
commit 6b8500ac5e
16 changed files with 862 additions and 86 deletions
@@ -1,30 +0,0 @@
package logic
import (
"context"
"lone-services/rpc/percutaneous/pb"
"lone-services/services/percutaneous/internal/svc"
"github.com/zeromicro/go-zero/core/logx"
)
type WeatherLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewWeatherLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WeatherLogic {
return &WeatherLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
func (l *WeatherLogic) Weather(in *percutaneous.EmptyRequest) (*percutaneous.Response, error) {
// todo: add your logic here and delete this line
return &percutaneous.Response{}, nil
}
@@ -0,0 +1,78 @@
package logic
import (
"context"
"lone-services/pkg/utils"
"time"
"lone-services/rpc/percutaneous/pb"
"lone-services/services/percutaneous/internal/svc"
"github.com/zeromicro/go-zero/core/logx"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
type WsAddUserStreamLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewWsAddUserStreamLogic(ctx context.Context, svcCtx *svc.ServiceContext) *WsAddUserStreamLogic {
return &WsAddUserStreamLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
// 添加用户
func (l *WsAddUserStreamLogic) WsAddUserStream(stream percutaneous.Percutaneous_WsAddUserStreamServer) error {
l.Logger.Error("in coming ws tunnel stream")
ctx := stream.Context()
// 扫码超时30s
timeout := 30 * time.Second
ctx, cancel := context.WithTimeout(ctx, timeout)
defer cancel()
for {
// 先判断上下文是否已经结束
if err := ctx.Err(); err != nil {
if err == context.DeadlineExceeded {
return status.Errorf(codes.DeadlineExceeded, "扫码超时")
}
return err
}
// 阻塞等待客户端上报扫码消息
recvFrame, err := stream.Recv()
if err != nil {
// 客户端主动关闭流
return err
}
// 解析扫码payload
type res struct {
Id int64 `json:"id"`
Name string `json:"name"`
}
var resData res
if err := utils.JsonStringToStruct(string(recvFrame.RawBody), &resData); !err {
l.Logger.Errorf("parse scan payload failed: %v", err)
return status.Errorf(codes.InvalidArgument, "解析扫码数据失败")
}
l.Logger.Errorf("receive scan success data: %+v", resData)
// 下发结果给ws客户端(同步设备)
sendFrame := &percutaneous.WsStreamRequest{
RawBody: []byte(utils.StructToJson(resData)),
}
if err := stream.Send(sendFrame); err != nil {
l.Logger.Errorf("send result frame failed: %v", err)
return err
}
// 收发完成,直接关闭grpc双向流(ws连接随之断开)
return nil
}
}
@@ -57,3 +57,33 @@ func (s *PercutaneousServer) Weather(ctx context.Context, in *percutaneous.Empty
l := logic.NewWeatherLogic(ctx, s.svcCtx)
return l.Weather(in)
}
// 登录二维码
func (s *PercutaneousServer) LoginQR(ctx context.Context, in *percutaneous.LoginQRRequest) (*percutaneous.Response, error) {
l := logic.NewLoginQRLogic(ctx, s.svcCtx)
return l.LoginQR(in)
}
// 添加用户
func (s *PercutaneousServer) AddUserQR(ctx context.Context, in *percutaneous.AddUserQRRequest) (*percutaneous.Response, error) {
l := logic.NewAddUserQRLogic(ctx, s.svcCtx)
return l.AddUserQR(in)
}
// WebSocket登录
func (s *PercutaneousServer) WsLoginStream(stream percutaneous.Percutaneous_WsLoginStreamServer) error {
l := logic.NewWsLoginStreamLogic(stream.Context(), s.svcCtx)
return l.WsLoginStream(stream)
}
// 添加用户
func (s *PercutaneousServer) WsAddUserStream(stream percutaneous.Percutaneous_WsAddUserStreamServer) error {
l := logic.NewWsAddUserStreamLogic(stream.Context(), s.svcCtx)
return l.WsAddUserStream(stream)
}
// 使用
func (s *PercutaneousServer) WsUsedStream(stream percutaneous.Percutaneous_WsUsedStreamServer) error {
l := logic.NewWsUsedStreamLogic(stream.Context(), s.svcCtx)
return l.WsUsedStream(stream)
}
@@ -14,14 +14,17 @@ import (
)
type (
AddUserQRRequest = percutaneous.AddUserQRRequest
AddUserRequest = percutaneous.AddUserRequest
EmptyRequest = percutaneous.EmptyRequest
LoginQRRequest = percutaneous.LoginQRRequest
Response = percutaneous.Response
UseRequest = percutaneous.UseRequest
UsedLogRequest = percutaneous.UsedLogRequest
UserItemsRequest = percutaneous.UserItemsRequest
WifiCheckRequest = percutaneous.WifiCheckRequest
WifiSetRequest = percutaneous.WifiSetRequest
WsStreamRequest = percutaneous.WsStreamRequest
Percutaneous interface {
WifiCheck(ctx context.Context, in *WifiCheckRequest, opts ...grpc.CallOption) (*Response, error)
@@ -31,6 +34,16 @@ type (
AddUser(ctx context.Context, in *AddUserRequest, opts ...grpc.CallOption) (*Response, error)
UserItems(ctx context.Context, in *UserItemsRequest, opts ...grpc.CallOption) (*Response, error)
Weather(ctx context.Context, in *EmptyRequest, opts ...grpc.CallOption) (*Response, error)
// 登录二维码
LoginQR(ctx context.Context, in *LoginQRRequest, opts ...grpc.CallOption) (*Response, error)
// 添加用户
AddUserQR(ctx context.Context, in *AddUserQRRequest, opts ...grpc.CallOption) (*Response, error)
// WebSocket登录
WsLoginStream(ctx context.Context, opts ...grpc.CallOption) (percutaneous.Percutaneous_WsLoginStreamClient, error)
// 添加用户
WsAddUserStream(ctx context.Context, opts ...grpc.CallOption) (percutaneous.Percutaneous_WsAddUserStreamClient, error)
// 使用
WsUsedStream(ctx context.Context, opts ...grpc.CallOption) (percutaneous.Percutaneous_WsUsedStreamClient, error)
}
defaultPercutaneous struct {
@@ -78,3 +91,33 @@ func (m *defaultPercutaneous) Weather(ctx context.Context, in *EmptyRequest, opt
client := percutaneous.NewPercutaneousClient(m.cli.Conn())
return client.Weather(ctx, in, opts...)
}
// 登录二维码
func (m *defaultPercutaneous) LoginQR(ctx context.Context, in *LoginQRRequest, opts ...grpc.CallOption) (*Response, error) {
client := percutaneous.NewPercutaneousClient(m.cli.Conn())
return client.LoginQR(ctx, in, opts...)
}
// 添加用户
func (m *defaultPercutaneous) AddUserQR(ctx context.Context, in *AddUserQRRequest, opts ...grpc.CallOption) (*Response, error) {
client := percutaneous.NewPercutaneousClient(m.cli.Conn())
return client.AddUserQR(ctx, in, opts...)
}
// WebSocket登录
func (m *defaultPercutaneous) WsLoginStream(ctx context.Context, opts ...grpc.CallOption) (percutaneous.Percutaneous_WsLoginStreamClient, error) {
client := percutaneous.NewPercutaneousClient(m.cli.Conn())
return client.WsLoginStream(ctx, opts...)
}
// 添加用户
func (m *defaultPercutaneous) WsAddUserStream(ctx context.Context, opts ...grpc.CallOption) (percutaneous.Percutaneous_WsAddUserStreamClient, error) {
client := percutaneous.NewPercutaneousClient(m.cli.Conn())
return client.WsAddUserStream(ctx, opts...)
}
// 使用
func (m *defaultPercutaneous) WsUsedStream(ctx context.Context, opts ...grpc.CallOption) (percutaneous.Percutaneous_WsUsedStreamClient, error) {
client := percutaneous.NewPercutaneousClient(m.cli.Conn())
return client.WsUsedStream(ctx, opts...)
}