device.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package item
  2. import (
  3. "fmt"
  4. "net"
  5. "server/dao"
  6. "server/global"
  7. "server/modbus"
  8. "server/model"
  9. "server/model/item/request"
  10. "server/utils"
  11. )
  12. type DeviceService struct{}
  13. func (ds *DeviceService) QueryAllDevices() ([]dao.Device, error) {
  14. return dao.QueryAllDevices()
  15. }
  16. // GetOnlineDevice 获取在线设备 总共设备 在线率
  17. func (ds *DeviceService) GetOnlineDevice() (total, online int) {
  18. devices, err := dao.GetOnlineDevices()
  19. if err != nil {
  20. global.GVA_LOG.Error(fmt.Sprintf("GetOnlineDevices err = %s\n", err.Error()))
  21. return
  22. }
  23. allDevices, err := dao.QueryAllDevices()
  24. if err != nil {
  25. global.GVA_LOG.Error(fmt.Sprintf("GetAllDevices err = %s\n", err.Error()))
  26. return
  27. }
  28. return len(allDevices), len(devices)
  29. }
  30. func (ds *DeviceService) QueryDeviceList(info request.SearchDeviceList) ([]dao.Device, int64, error) {
  31. limit := info.PageSize
  32. offset := info.PageSize * (info.Page - 1)
  33. devs, total, err := dao.QueryDeviceList(info.Name, info.Sn, info.RegionId, limit, offset)
  34. for i, dev := range devs {
  35. status, _ := dao.QueryDeviceLoopsByDeviceId(int(dev.ID))
  36. var relayStatus []int
  37. for _, loop := range status {
  38. relayStatus = append(relayStatus, loop.State)
  39. }
  40. devs[i].RelayStatus = relayStatus
  41. devs[i].RelayTimeStr = ds.GetDeviceRelayTimeStrByDevId(int(dev.ID), dev.LoopNumber)
  42. }
  43. return devs, total, err
  44. }
  45. func (ds *DeviceService) GetDeviceRelayTimeStrByDevId(id int, circuitNum int) (statusArr []string) {
  46. deviceRelays, err := dao.QueryDeviceLoopsByDeviceId(id)
  47. if err != nil {
  48. return
  49. }
  50. statusMap := make(map[int]dao.DeviceLoop)
  51. for _, relay := range deviceRelays {
  52. statusMap[relay.RelayId] = relay
  53. }
  54. for i := 1; i <= circuitNum; i++ {
  55. relayInfo, _ := statusMap[i]
  56. timeStr := "未设定时"
  57. if relayInfo.TimeCondition1OnTime == "" && relayInfo.TimeCondition1OffTime == "" && relayInfo.TimeCondition2OnTime == "" && relayInfo.TimeCondition2OffTime == "" {
  58. //timeStr := ""
  59. } else {
  60. timeStr = fmt.Sprintf("时控1[%v]-[%v], 时控2[%v]-[%v]", relayInfo.TimeCondition1OnTime, relayInfo.TimeCondition1OffTime, relayInfo.TimeCondition2OnTime, relayInfo.TimeCondition2OffTime)
  61. }
  62. statusArr = append(statusArr, timeStr)
  63. }
  64. return
  65. }
  66. func (ds *DeviceService) CreateDevice(device dao.Device) error {
  67. if device.LoopNumber <= 0 {
  68. return fmt.Errorf("device.LoopNumber 必须大于0")
  69. }
  70. tx := global.GVA_DB.Begin()
  71. if tx.Error != nil {
  72. return tx.Error
  73. }
  74. defer func() {
  75. if r := recover(); r != nil {
  76. _ = tx.Rollback()
  77. }
  78. }()
  79. // 创建设备
  80. if err := tx.Create(&device).Error; err != nil {
  81. _ = tx.Rollback()
  82. return fmt.Errorf("创建设备失败: %w", err)
  83. }
  84. deviceID := int(device.ID)
  85. for i := 1; i <= device.LoopNumber; i++ {
  86. loop := dao.DeviceLoop{
  87. DeviceId: deviceID,
  88. RelayId: i,
  89. Name: fmt.Sprintf("回路 %d", i),
  90. }
  91. if err := tx.Create(&loop).Error; err != nil {
  92. _ = tx.Rollback()
  93. return fmt.Errorf("创建回路%d失败: %w", i, err)
  94. }
  95. }
  96. // 全部成功提交
  97. if err := tx.Commit().Error; err != nil {
  98. _ = tx.Rollback()
  99. return err
  100. }
  101. return nil
  102. }
  103. func (ds *DeviceService) UpdateDevice(device dao.Device) error {
  104. return device.UpdateDevice()
  105. }
  106. func (ds *DeviceService) DeviceLoopSwitch(deviceLoop dao.DeviceLoop) error {
  107. data := modbus.DeviceLoopSwitch(deviceLoop.RelayId, deviceLoop.State)
  108. dev1, _ := dao.QueryDeviceById(deviceLoop.DeviceId)
  109. if conn1, ok := model.ConnectionMap1.Load(dev1.Ip); ok {
  110. // 成功找到连接
  111. netConn := conn1.(net.Conn)
  112. if dev1.State == 0 {
  113. return fmt.Errorf("设备离线无法操作")
  114. }
  115. err := utils.WriteDevice(data, netConn)
  116. if err != nil {
  117. global.GVA_LOG.Error(fmt.Sprintf("设备回路开关 写命令错误: %s -- conn: %v", err, netConn.RemoteAddr().String()))
  118. return err
  119. }
  120. } else {
  121. // 没有找到对应的连接
  122. global.GVA_LOG.Warn(fmt.Sprintf("设备回路开关Connection for key %s not found", dev1.Ip))
  123. }
  124. return nil
  125. }
  126. func (ds *DeviceService) RegionSwitch(req model.RegionRequest) error {
  127. devices, err := dao.QueryDevicesByRegionId(req.RegionId)
  128. if err != nil {
  129. return err
  130. }
  131. for _, device := range devices {
  132. data := modbus.DeviceSwitch(device.LoopNumber, req.State)
  133. if conn1, ok := model.ConnectionMap1.Load(device.Ip); ok {
  134. // 成功找到连接
  135. netConn := conn1.(net.Conn)
  136. modbus.OperationCommand = data
  137. err := utils.WriteDevice(data, netConn)
  138. if err != nil {
  139. global.GVA_LOG.Error(fmt.Sprintf("设备回路开关 写命令错误: %s -- conn: %v", err, netConn.RemoteAddr().String()))
  140. return err
  141. }
  142. } else {
  143. // 没有找到对应的连接
  144. global.GVA_LOG.Warn(fmt.Sprintf("设备开关Connection for key %s not found", device.Ip))
  145. }
  146. }
  147. return nil
  148. }
  149. func (ds *DeviceService) DeviceBatchSwitch(req model.DevicesRequest) error {
  150. devices, err := dao.QueryDeviceByIds(req.IDs)
  151. if err != nil {
  152. return err
  153. }
  154. for _, device := range devices {
  155. if device.State == 0 {
  156. continue
  157. }
  158. data := modbus.DeviceSwitch(device.LoopNumber, req.State)
  159. modbus.OperationCommand = data
  160. if conn1, ok := model.ConnectionMap1.Load(device.Ip); ok {
  161. // 成功找到连接
  162. netConn := conn1.(net.Conn)
  163. err := utils.WriteDevice(data, netConn)
  164. if err != nil {
  165. global.GVA_LOG.Error(fmt.Sprintf("设备批量控制 写命令错误: %s -- conn: %v", err, netConn.RemoteAddr().String()))
  166. }
  167. } else {
  168. // 没有找到对应的连接
  169. global.GVA_LOG.Warn(fmt.Sprintf("设备批量控制Connection for key %s not found", device.Ip))
  170. }
  171. }
  172. return nil
  173. }
  174. func (ds *DeviceService) BatchUpdateDeviceTime(req request.UpdateDeviceTimeData) error {
  175. return dao.BatchUpdateDeviceTime(req.Ids, req.TimeCondition1OnTime, req.TimeCondition1OffTime, req.TimeCondition2OnTime, req.TimeCondition2OffTime)
  176. }
  177. func (ds *DeviceService) BatchUpdateRegionTime(req request.UpdateRegionTimeData) error {
  178. return dao.BatchUpdateRegionTime(req.RegionId, req.TimeCondition1OnTime, req.TimeCondition1OffTime, req.TimeCondition2OnTime, req.TimeCondition2OffTime)
  179. }