Files
zmkgC/api/video_hat/index.go
2025-07-07 20:11:59 +08:00

208 lines
7.0 KiB
Go
Raw 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.

package video_hat
import (
"context"
"fmt"
"github.com/gogf/gf/v2/frame/g"
"time"
)
type VideoDeviceHat struct {
DevNum string `json:"dev_num"` // 设备编号
DevName string `json:"dev_name"` // 设备名
Status int `json:"status"` // 安全帽状态(0离线1在线2监控中3通话中4隐私模式)
ProjectID int64 `json:"project_id"` // 项目id
UserID string `json:"user_id"` // 用户id
BatteryLevel string `json:"battery_level"` // 电量
IsLowBattery bool `json:"is_low_battery"` // 是否处于低电量true代表低电量false则不是低电量
CreateTime time.Time `json:"create_time"` // 创建时间
UpdatedAt time.Time `json:"updated_at"` // 更新时间
Longitude string `json:"longitude"` // 最新的经度
Latitude string `json:"latitude"` // 最新的维度
SipId int `json:"sip_id"` // SIPID
Uid int `json:"uid"` // 安全帽厂商返回的用户ID
PushStatus string `json:"push_status"` // 推流状态
Nickname string `json:"nick_name"` // 用户名称
UserName string `json:"user_name"` // 真实名称
HeadIcon string `json:"head_icon"` // 头像
Phone string `json:"phone"` // 电话
}
// 视频安全帽设备列表
type DeviceListReq struct {
g.Meta `path:"/video/device/list" method:"post" tags:"视频安全帽相关" summary:"视频安全帽设备列表"`
ProjectId int64 `json:"projectId" dc:"项目ID"`
DevNum string `json:"devNum" dc:"设备编号模糊查询"`
DevName string `json:"devName" dc:"设备名称模糊查询"`
Status *int `json:"status" dc:"安全帽状态等值查询"` // 使用指针允许状态为nil表示不过滤状态
Page int64 `json:"page" dc:"请求的页码" v:"required"`
PageSize int64 `json:"pageSize" dc:"每页显示的条目数" v:"required"`
}
// 视频安全帽设备列表响应结构体
type DeviceListRes struct {
Total int64 `json:"total"` // 总条目数
VideoDeviceHats []VideoDeviceHat `json:"videoDeviceHats"`
}
func (v VideoHat) DeviceList(ctx context.Context, req *DeviceListReq) (res *DeviceListRes, err error) {
res = new(DeviceListRes)
offset := (req.Page - 1) * req.PageSize
var devices []VideoDeviceHat
// 准备查询模型,设置连表查询
model := g.Model("device_video_hat AS dvh").LeftJoin("bus_construction_user AS user", "user.id=dvh.user_id")
// 根据项目ID过滤
if req.ProjectId != 0 {
model = model.Where("dvh.project_id = ?", req.ProjectId)
}
// 设备编号模糊查询
if req.DevNum != "" {
model = model.Where("dvh.dev_num LIKE ?", "%"+req.DevNum+"%")
}
// 设备名称模糊查询
if req.DevName != "" {
model = model.Where("dvh.dev_name LIKE ?", "%"+req.DevName+"%")
}
// 安全帽状态等值查询
if req.Status != nil {
model = model.Where("dvh.status = ?", *req.Status)
}
// 应用查询条件但不选取字段,用于计数
count, err := model.Count()
if err != nil {
return nil, err
}
// 选取具体字段,包括连表查询字段
model = model.Fields("dvh.*, user.nick_name,user.user_name,user.head_icon,user.phone")
// 获取当前页的设备列表
err = model.Offset(int(offset)).Limit(int(req.PageSize)).Scan(&devices)
if err != nil {
return nil, err
}
res.Total = int64(count)
res.VideoDeviceHats = devices
return res, nil
}
// 为设备绑定项目ID
type BindProjectIdReq struct {
g.Meta `path:"/video/project/bind" method:"post" tags:"视频安全帽相关" summary:"为设备绑定项目"`
ProjectId int64 `json:"projectId" dc:"项目ID"`
DevNum string `json:"devNum" dc:"设备编号"`
}
type BindProjectIdRes struct {
}
func (v VideoHat) BindProjectId(ctx context.Context, req *BindProjectIdReq) (res *BindProjectIdRes, err error) {
res = new(BindProjectIdRes)
param := g.Map{
"project_id": req.ProjectId,
}
g.Model("device_video_hat").Data(param).Where("dev_num = ?", req.DevNum).Update()
return res, nil
}
// 为设备解绑项目ID
type UnBindProjectIdReq struct {
g.Meta `path:"/video/project/unbind" method:"post" tags:"视频安全帽相关" summary:"为设备解绑项目"`
DevNum string `json:"devNum" dc:"设备编号"`
}
// 视频安全帽设备列表响应结构体
type UnBindProjectIdRes struct {
}
func (v VideoHat) UnBindProjectId(ctx context.Context, req *UnBindProjectIdReq) (res *UnBindProjectIdRes, err error) {
res = new(UnBindProjectIdRes)
param := g.Map{
"project_id": nil,
}
g.Model("device_video_hat").Data(param).Where("dev_num = ?", req.DevNum).Update()
return res, nil
}
// 为设备绑定用户ID
type BindUserIdReq struct {
g.Meta `path:"/video/user/bind" method:"post" tags:"视频安全帽相关" summary:"为设备绑定用户"`
UserId int64 `json:"userId" dc:"用户ID"`
DevNum string `json:"devNum" dc:"设备编号"`
}
type BindUserIdRes struct {
}
func (v VideoHat) BindUserId(ctx context.Context, req *BindUserIdReq) (res *BindUserIdRes, err error) {
param := g.Map{
"user_id": req.UserId,
}
g.Model("device_video_hat").Data(param).Where("dev_num = ?", req.DevNum).Update()
return res, nil
}
// 为设备绑定用户ID
type UnBindUserIdReq struct {
g.Meta `path:"/video/user/unbind" method:"post" tags:"视频安全帽相关" summary:"为设备解绑用户"`
DevNum string `json:"devNum" dc:"设备编号"`
}
type UnBindUserIdRes struct {
}
func (v VideoHat) UnBindUserId(ctx context.Context, req *UnBindUserIdReq) (res *UnBindUserIdRes, err error) {
param := g.Map{
"user_id": nil,
}
g.Model("device_video_hat").Data(param).Where("dev_num = ?", req.DevNum).Update()
return res, nil
}
// 查询某个安全帽有轨迹的时间
type DeviceListDateTimeReq struct {
g.Meta `path:"/video/device/dateList" method:"post" tags:"视频安全帽相关" summary:"视频安全帽轨迹时间列表"`
DevNum string `json:"devNum" dc:"设备编号"`
StartTime string `json:"startTime" dc:"开始时间,格式为 YYYY-MM"`
}
type DeviceDataTime struct {
DataTime string `json:"dataTime"`
}
// 视频安全帽设备列表响应结构体
type DeviceListDateTimeRes struct {
DateTimeList []DeviceDataTime `json:"dateTimeList" dc:"设备含有轨迹的数据列表"`
}
func (v VideoHat) DeviceListDateTime(ctx context.Context, req *DeviceListDateTimeReq) (res *DeviceListDateTimeRes, err error) {
res = new(DeviceListDateTimeRes)
// 解析开始时间
startTime, err := time.Parse("2006-01", req.StartTime)
if err != nil {
return nil, fmt.Errorf("invalid start time format: %v", err)
}
// 计算该月的第一天和最后一天
firstDayOfMonth := startTime
lastDayOfMonth := firstDayOfMonth.AddDate(0, 1, -1) // 增加一个月,减去一天
// 查询设备的数据时间在指定月份内
g.Model("device_data_time").
Fields("data_time AS dataTime").
Where("dev_num = ?", req.DevNum).
Where("data_time >= ?", firstDayOfMonth.Format("2006-01-02")).
Where("data_time <= ?", lastDayOfMonth.Format("2006-01-02")).
Scan(&res.DateTimeList)
return res, nil
}