Files
2025-07-07 20:11:59 +08:00

183 lines
5.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ==========================================================================
// 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
}