Files
zmkgC/internal/app/system/controller/device.go

183 lines
5.6 KiB
Go
Raw Normal View History

2025-07-07 20:11:59 +08:00
// ==========================================================================
// GFast自动生成controller操作代码。
// 生成日期2023-11-24 09:57:07
// 生成路径: internal/app/system/controller/device.go
// 生成人gfast
// desc:安全帽设备java
// company:云南奇讯科技有限公司
// ==========================================================================
package controller
import (
"context"
"encoding/json"
"github.com/gogf/gf/v2/database/gredis"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/os/gmutex"
"github.com/tiger1103/gfast/v3/api/v1/system"
"github.com/tiger1103/gfast/v3/internal/app/system/dao"
"github.com/tiger1103/gfast/v3/internal/app/system/service"
"github.com/tiger1103/gfast/v3/library/liberr"
"log"
"sync"
"time"
)
type deviceController struct {
BaseController
}
var Device = new(deviceController)
// 全局map
var clientMap = make(map[string]*wsClient)
const RedisHelmetKey = "safety_helmet:"
type wsClient struct {
Socket *ghttp.WebSocket
}
type BusUserEntity struct {
NickName string ` json:"nickName" dc:"微信名称"`
HeadIcon string ` json:"headIcon" dc:"登录头像"`
UserName string ` json:"userName" dc:"人员姓名"`
DevNum string `json:"devNum" dc:"设备标识"`
LatAndLon string ` json:"LatAndLon" dc:"纬度经度格式29.101,180.101"`
}
// List 列表
func (c *deviceController) List(ctx context.Context, req *system.DeviceSearchReq) (res *system.DeviceSearchRes, err error) {
res, err = service.Device().List(ctx, req)
return
}
// AllList 返回当前项目下。设备和用户关联到的所有设备
func (c *deviceController) AllList(ctx context.Context, req *system.DeviceSearchAllReq) (res *system.DeviceSearchAllRes, err error) {
res, err = service.Device().AllList(ctx, req)
return
}
// HelmetListFunc 安全帽列表
func (c *deviceController) HelmetListFunc(ctx context.Context, req *system.HelmetListReq) (res *system.HelmetListRes, err error) {
res, err = service.Device().HelmetListFunc(ctx, req)
return
}
// Get 获取安全帽设备java
func (c *deviceController) Get(ctx context.Context, req *system.DeviceGetReq) (res *system.DeviceGetRes, err error) {
res = new(system.DeviceGetRes)
res, err = service.Device().GetByDevNum(ctx, req)
return
}
// Add 添加安全帽设备java
func (c *deviceController) Add(ctx context.Context, req *system.DeviceAddReq) (res *system.DeviceAddRes, err error) {
err = service.Device().Add(ctx, req)
return
}
// RemoveRelationFunc 移除人员
func (c *deviceController) RemoveRelationFunc(ctx context.Context, req *system.RemoveRelationReq) (res *system.RemoveRelationRes, err error) {
err = service.Device().RemoveRelationFunc(ctx, req)
return
}
// Delete 删除安全帽设备java
func (c *deviceController) Delete(ctx context.Context, req *system.DeviceDeleteReq) (res *system.DeviceDeleteRes, err error) {
err = service.Device().Delete(ctx, req.DevNums)
return
}
// ScheduleTimeFunc 根据指定时间段去查询有足迹的日期
func (c *deviceController) ScheduleTimeFunc(ctx context.Context, req *system.ScheduleTimeReq) (res *system.ScheduleTimeRes, err error) {
res = new(system.ScheduleTimeRes)
res, err = service.Device().ScheduleTimeFunc(ctx, req)
return
}
var (
once sync.Once
subscribe gredis.Conn
subscribeMu sync.Mutex
)
// 初始化订阅
func InitSubscription() {
subscribeMu.Lock()
defer subscribeMu.Unlock()
if subscribe == nil {
var err error
subscribe, _, err = g.Redis("helmetRedis").Subscribe(context.Background(), RedisHelmetKey)
if err != nil {
log.Fatal("Failed to subscribe to Redis:", err)
}
}
}
func (c *deviceController) WebsocketFunc(ctx context.Context, req *system.WebsocketReq) (res *system.WebsocketRes, err error) {
err = g.Try(ctx, func(ctx context.Context) {
once.Do(InitSubscription)
reqWs := ghttp.RequestFromCtx(ctx)
ws, err := reqWs.WebSocket()
if err != nil {
glog.Error(ctx, err)
reqWs.Exit()
}
var strData = ""
var i = 0
mutex := gmutex.New()
mutex.Lock()
defer mutex.Unlock()
for {
if strData != "" || i == 0 {
count, err := dao.BusConstructionUser.Ctx(ctx).Where("dev_num", strData).Where("project_id", req.ProjectId).Count()
if err != nil {
liberr.ErrIsNil(ctx, err, "WebSocket服务出现问题")
return
}
if count > 0 || i == 0 {
i = 1
var busUser []*BusUserEntity
err = dao.BusConstructionUser.Ctx(ctx).Where("project_id", req.ProjectId).Where("dev_num <> ''").Fields("head_icon,nick_name,user_name,dev_num").Scan(&busUser)
if err != nil {
liberr.ErrIsNil(ctx, err, "WebSocket服务出现问题")
return
}
for ii := range busUser {
get, _ := g.Redis("helmetRedis").Get(ctx, RedisHelmetKey+busUser[ii].DevNum)
if get != nil {
busUser[ii].LatAndLon = get.String()
}
}
marshal, err := json.Marshal(busUser)
if err != nil {
liberr.ErrIsNil(ctx, err, "WebSocket服务出现问题")
return
}
if err = ws.WriteMessage(1, marshal); err != nil {
return
}
}
}
_, _, err := ws.ReadMessage()
if err != nil {
return //断开就退出整个代码块
}
//第一次先发数据、然后如果前端还活着那么就继续走走到redis阻塞redis如果有消息发布就继续下一次循环如果死了就退出、
msg, err := subscribe.ReceiveMessage(ctx)
if err != nil {
log.Println("Error receiving message:", err)
time.Sleep(time.Second)
continue
}
strData = msg.Payload
}
})
return
}