183 lines
5.6 KiB
Go
183 lines
5.6 KiB
Go
// ==========================================================================
|
||
// 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
|
||
}
|