device.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package dao
  2. import (
  3. "fmt"
  4. "server/global"
  5. "time"
  6. )
  7. type Device struct {
  8. global.GVA_MODEL
  9. Sn string `json:"sn" gorm:"column:sn;comment:设备sn"`
  10. Ip string `json:"ip" gorm:"column:ip;comment:ip"`
  11. RegionId int `json:"regionId" gorm:"column:region_id;comment:地区id"`
  12. Region *Region `json:"region" gorm:"foreignKey:RegionId;references:ID"`
  13. Name string `json:"name" gorm:"column:name;comment:名称"`
  14. State int `json:"state" gorm:"column:state;comment:状态"`
  15. Remark string `json:"remark" gorm:"column:remark;comment:备注"`
  16. IsSun bool `json:"isSun" gorm:"column:is_sun;comment:是否太阳能"`
  17. LoopNumber int `json:"loopNumber" gorm:"column:loop_number;comment:回路数量"`
  18. OnlineTime time.Time `json:"onlineTime" gorm:"column:online_time;default:null;comment:在线时间"`
  19. DeviceLoops []DeviceLoop `json:"deviceLoops"`
  20. Sun Sun `json:"sun"`
  21. RelayStatus []int `gorm:"-" json:"relayStatus"` //回路状态
  22. RelayTimeStr []string `gorm:"-" json:"relayTimeStr"` //回路时间设置
  23. }
  24. func (Device) TableName() string {
  25. return "device"
  26. }
  27. func QueryAllDevices() (devices []Device, err error) {
  28. err = global.GVA_DB.Find(&devices).Error
  29. return devices, err
  30. }
  31. func GetOnlineDevices() (devices []Device, err error) {
  32. err = global.GVA_DB.Where("state = 1").Preload("DeviceLoops").Find(&devices).Error
  33. return devices, err
  34. }
  35. func QueryDeviceByIp(ip string) (device Device, err error) {
  36. err = global.GVA_DB.Where("ip = ?", ip).First(&device).Error
  37. return device, err
  38. }
  39. func QueryDeviceById(id int) (device Device, err error) {
  40. err = global.GVA_DB.Where("id = ?", id).First(&device).Error
  41. return device, err
  42. }
  43. func QueryDeviceList(name, sn string, regionId, limit, offset int) (devices []Device, total int64, err error) {
  44. db := global.GVA_DB.Model(&Device{}).Preload("DeviceLoops").Preload("Region")
  45. // 如果有条件搜索 下方会自动创建搜索语句
  46. if sn != "" {
  47. db = db.Where("sn LIKE ?", "%"+sn+"%")
  48. }
  49. if name != "" {
  50. db = db.Where("name LIKE ?", "%"+name+"%")
  51. }
  52. if regionId != 0 {
  53. db = db.Where("region_id = ?", regionId)
  54. }
  55. err = db.Count(&total).Error
  56. if err != nil {
  57. return nil, 0, err
  58. }
  59. err = db.Order("name asc").Limit(limit).Offset(offset).Find(&devices).Error
  60. return devices, total, err
  61. }
  62. func QueryDevicesByRegionId(regionId int) (devices []Device, err error) {
  63. err = global.GVA_DB.Where("region_id = ?", regionId).Find(&devices).Error
  64. return devices, err
  65. }
  66. func QueryDeviceByIds(ids []int) (devices []Device, err error) {
  67. err = global.GVA_DB.Where("id in (?)", ids).Find(&devices).Error
  68. return devices, err
  69. }
  70. func (d Device) CreateDevice() error {
  71. return global.GVA_DB.Create(&d).Error
  72. }
  73. func (d Device) UpdateDevice() error {
  74. return global.GVA_DB.Where("id = ?", d.ID).Updates(&d).Error
  75. }
  76. func UpdateDeviceByMapAndSn(data map[string]interface{}, sn string) error {
  77. return global.GVA_DB.Model(&Device{}).Where("sn = ?", sn).Updates(data).Error
  78. }
  79. func DeleteDevice(id int) error {
  80. return global.GVA_DB.Where("id = ?", id).Unscoped().Delete(&Device{}).Error
  81. }
  82. func BatchUpdateDeviceTime(ids []int, timeCondition1OnTime, timeCondition1OffTime, timeCondition2OnTime, timeCondition2OffTime string) error {
  83. updateData := map[string]interface{}{
  84. "time_condition_1_on_time": timeCondition1OnTime,
  85. "time_condition_1_off_time": timeCondition1OffTime,
  86. "time_condition_2_on_time": timeCondition2OnTime,
  87. "time_condition_2_off_time": timeCondition2OffTime,
  88. }
  89. return global.GVA_DB.Model(&DeviceLoop{}).
  90. Where("device_id IN (?)", ids).
  91. Updates(updateData).Error
  92. }
  93. func BatchUpdateRegionTime(regionId int, timeCondition1OnTime, timeCondition1OffTime, timeCondition2OnTime, timeCondition2OffTime string) error {
  94. updateData := map[string]interface{}{
  95. "time_condition_1_on_time": timeCondition1OnTime,
  96. "time_condition_1_off_time": timeCondition1OffTime,
  97. "time_condition_2_on_time": timeCondition2OnTime,
  98. "time_condition_2_off_time": timeCondition2OffTime,
  99. }
  100. var deviceIds []int
  101. // 1. 查询该地区所有设备ID,捕获查询错误
  102. tx := global.GVA_DB.Begin()
  103. if tx.Error != nil {
  104. return fmt.Errorf("开启事务失败: %w", tx.Error)
  105. }
  106. if err := tx.Model(&Device{}).
  107. Select("id").
  108. Where("region_id = ?", regionId).
  109. Find(&deviceIds).Error; err != nil {
  110. _ = tx.Rollback()
  111. return fmt.Errorf("查询地区设备失败: %w", err)
  112. }
  113. if len(deviceIds) == 0 {
  114. _ = tx.Rollback()
  115. return fmt.Errorf("regionId=%d 下未查询到任何设备", regionId)
  116. }
  117. // 2. 批量更新该地区所有设备的回路时控
  118. if err := tx.Model(&DeviceLoop{}).
  119. Where("device_id IN (?)", deviceIds).
  120. Updates(updateData).Error; err != nil {
  121. _ = tx.Rollback()
  122. return fmt.Errorf("批量更新回路时控失败: %w", err)
  123. }
  124. // 全部成功提交事务
  125. if err := tx.Commit().Error; err != nil {
  126. _ = tx.Rollback()
  127. return fmt.Errorf("事务提交失败: %w", err)
  128. }
  129. return nil
  130. }