gateway.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package app
  2. import (
  3. "errors"
  4. "github.com/sirupsen/logrus"
  5. "gorm.io/gorm"
  6. "lc-fangdaosha/global"
  7. "lc-fangdaosha/model/app"
  8. "lc-fangdaosha/model/app/request"
  9. "lc-fangdaosha/model/app/response"
  10. )
  11. var ExistError = errors.New("已存在")
  12. type GatewayService struct {
  13. }
  14. // CreateIfNotExist 创建
  15. func (gs *GatewayService) CreateIfNotExist(isn string) (*app.Gateway, error) {
  16. var gate *app.Gateway
  17. err := global.Db.Select("id, isn").Model(&app.Gateway{}).Where("isn = ? AND is_deleted = 0", isn).Scan(&gate).Debug().Error
  18. if err != nil {
  19. return nil, err
  20. }
  21. if gate != nil {
  22. return gate, ExistError
  23. }
  24. var gateway = &app.Gateway{Isn: isn}
  25. err = global.Db.Create(gateway).Debug().Error
  26. if err != nil {
  27. return nil, err
  28. }
  29. logrus.Infof("网关[%s]注册成功", isn)
  30. return gateway, nil
  31. }
  32. // List 该用户下所有设备数据
  33. func (gs *GatewayService) List(req request.GatewayRequest) (list []response.Gateways, err error) {
  34. db := global.Db.Select("g.id,g.gateway_name,g.osn,g.description,c.name AS camera_name, RIGHT(c.sn,9) AS camera_sn,c.stream_id,c.stream_url,i.device_id AS ipcast_id,i.state AS ipcast_state").
  35. Table("gateway g LEFT JOIN camera c ON g.id = c.gid").
  36. Where("g.is_deleted = 0")
  37. //条件查询设备,网关名,网关osn,摄像头sn
  38. if req.Uid > 0 {
  39. db.Where("g.uid = ?", req.Uid)
  40. }
  41. if req.Osn != "" {
  42. db.Where("g.osn = ?", req.Osn)
  43. }
  44. if req.CameraSn != "" {
  45. db.Where("c.camera_sn LIKE ?", "%"+req.CameraSn)
  46. }
  47. if req.Name != "" {
  48. db.Where("gateway_name LIKE ?", "%"+req.Name+"%")
  49. }
  50. db.Offset(req.PageSize * (req.Page - 1)).Limit(req.PageSize)
  51. err = db.Debug().Find(&list).Error
  52. return
  53. }
  54. // AdminSet 用于后台给网关配置osn或分配用户,只有超级管理员才有权限
  55. func (gs *GatewayService) AdminSet(gw *app.Gateway) error {
  56. var m = make(map[string]any)
  57. if gw.Uid != 0 {
  58. m["uid"] = gw.Uid
  59. }
  60. if gw.Osn != "" {
  61. m["osn"] = gw.Osn
  62. }
  63. return global.Db.Model(&app.Gateway{}).Where("id = ? AND is_deleted = 0", gw.ID).Updates(m).Debug().Error
  64. }
  65. // Update 由于普通用户配置网关名和描述信息
  66. func (gs *GatewayService) Update(gw *app.Gateway) error {
  67. var m = make(map[string]any)
  68. if gw.GatewayName != "" {
  69. m["gateway_name"] = gw.GatewayName
  70. }
  71. if gw.Description != "" {
  72. m["description"] = gw.Description
  73. }
  74. return global.Db.Model(&app.Gateway{}).Where("id = ? AND is_deleted = 0", gw.ID).Updates(m).Debug().Error
  75. }
  76. // DeleteGateways 删除网关及关联设备
  77. func (gs *GatewayService) DeleteGateways(gw app.Gateway) (err error) {
  78. devs := gs.DevIds(gw.ID)
  79. err = global.Db.Transaction(func(tx *gorm.DB) error {
  80. //删除网关
  81. if err := tx.Debug().Model(&app.Gateway{}).Where("id = ?", gw.ID).Update("is_deleted", 1).Error; err != nil {
  82. return err
  83. }
  84. if err = tx.Debug().Delete(&gw).Error; err != nil {
  85. return err
  86. }
  87. return nil
  88. })
  89. //删除摄像头
  90. cs := CameraService{}
  91. if devs.Cid != 0 {
  92. var c app.Camera
  93. c.ID = devs.Cid
  94. err = cs.DeleteCamera(c)
  95. if err != nil {
  96. logrus.Error("删除摄像头失败", err)
  97. }
  98. }
  99. return err
  100. }
  101. // UnbindGateways 解绑网关下面的设备
  102. func (gs *GatewayService) UnbindGateways(gw app.Gateway) error {
  103. devs := gs.DevIds(gw.ID)
  104. var err error
  105. if devs.Cid != 0 {
  106. if err1 := global.Db.Model(&app.Camera{}).Where("id = ?", devs.Cid).Update("gid", 0).Error; err1 != nil {
  107. logrus.WithFields(logrus.Fields{"网关": devs.Osn, "摄像头": devs.Csn}).Error("解绑失败", err)
  108. err = errors.Join(err1)
  109. }
  110. }
  111. if err == nil {
  112. logrus.WithFields(logrus.Fields{"网关": devs.Osn, "摄像头": devs.Csn}).Info("解绑成功")
  113. }
  114. return err
  115. }
  116. // DevIds 获取设备的id
  117. func (gs *GatewayService) DevIds(id uint) (devs app.Devices) {
  118. //查询网关及关联设备的id
  119. global.Db.Select("g.id AS gid,g.osn,c.id AS cid,RIGHT(c.sn,9) AS csn,i.id AS iid").
  120. Table("gateway g LEFT JOIN camera c ON g.id = c.gid").
  121. Where("g.id = ?", id).
  122. Find(&devs)
  123. return
  124. }