dev_screens.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. package devices
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "gorm.io/gorm"
  7. "net/http"
  8. "server/dao/devices"
  9. promodel "server/model/common/devices"
  10. "server/model/common/request"
  11. model "server/model/devices"
  12. "server/service/tcp"
  13. "server/utils/logger"
  14. "time"
  15. )
  16. type ScreensService struct{}
  17. func (screensService *ScreensService) GetScreensInfoList(info request.PageInfo) (list interface{}, total int64, err error) {
  18. limit := info.PageSize
  19. offset := info.PageSize * (info.Page - 1)
  20. keyword := info.Keyword
  21. shunt := info.Shunt
  22. screensList, total, err := devices.QueryScreensInfoList(limit, offset, keyword, shunt)
  23. for i, screens := range screensList {
  24. screensList[i].Status = tcp.Devices[screens.Sn].Info.Status
  25. screensList[i].LastOfflineTime = tcp.Devices[screens.Sn].Info.LastOfflineTime
  26. screensList[i].LastOnlineTime = tcp.Devices[screens.Sn].Info.LastOnlineTime
  27. }
  28. return screensList, total, err
  29. }
  30. func (screensService *ScreensService) QueryScreensParms() (list interface{}, err error) {
  31. resolution := devices.Resolution{}
  32. getResolution, err := resolution.GetResolution()
  33. screensSize := devices.ScreensSize{}
  34. getScreensSize, err := screensSize.GetScreensSize()
  35. way := devices.GateWay{}
  36. gatewayList, err := way.PublicGateway()
  37. params := model.RspParams{Resolution: getResolution, ScreensSize: getScreensSize, PubGateway: gatewayList}
  38. return params, err
  39. }
  40. func (screensService *ScreensService) DelScreens(sn string) error {
  41. s := devices.Screens{}
  42. err := s.DelScreens(sn)
  43. delete(tcp.Devices, sn)
  44. return err
  45. }
  46. func (screensService *ScreensService) AddScreens(screens devices.Screens) error {
  47. err := screens.IsExistedByCode()
  48. if !errors.Is(err, gorm.ErrRecordNotFound) {
  49. logger.Logger.Errorf("Create IsExistedByCode \n")
  50. return errors.New("设备编码已存在!")
  51. }
  52. err = screens.AddScreens()
  53. //将该屏信息添加到内存中
  54. tcp.Devices[screens.Sn] = &tcp.Device{Info: screens}
  55. return err
  56. }
  57. func (screensService *ScreensService) UpdateScreens(screens devices.Screens, oldSn string) error {
  58. for s, _ := range tcp.Devices {
  59. if s == screens.Sn && oldSn != screens.Sn { //判断修改的新的sn是否已存在,存在这不让修改,
  60. return errors.New("设备Sn重复")
  61. }
  62. }
  63. //如果改了其它参数,没改sn,则只更新内存中的设备基础信息,且数据库中的原有status、LastOnlineTime、LastOfflineTime不做修改
  64. if oldSn == screens.Sn {
  65. tcp.Devices[screens.Sn].Info = screens
  66. err := screens.UpdateScreens()
  67. if err != nil {
  68. return errors.New("修改失败")
  69. }
  70. return nil
  71. }
  72. //如果改了sn 则要修改内存和数据库中的status、LastOnlineTime、LastOfflineTime信息
  73. screens.Status = 0
  74. var empty *time.Time
  75. screens.LastOnlineTime = empty
  76. screens.LastOfflineTime = empty
  77. err := screens.UpdateScreens()
  78. if err != nil {
  79. return errors.New("修改失败")
  80. }
  81. //从内存中删除原有的资源,并添加新的
  82. delete(tcp.Devices, oldSn)
  83. screens.Status = 0
  84. screens.LastOnlineTime = empty
  85. screens.LastOfflineTime = empty
  86. tcp.Devices[screens.Sn] = &tcp.Device{Info: screens}
  87. return nil
  88. }
  89. /**
  90. 以下是关于设备操作的一些业务方法
  91. */
  92. // 开关屏
  93. func (screensService *ScreensService) SwitchScreens(swatch promodel.SwitchScreens) error {
  94. //判断组网方式 0代表网关 1代表4G模块
  95. err := tcp.SwitchScreen(swatch.Sn, swatch.Flag)
  96. if err != nil {
  97. logger.Logger.Errorf("SwitchScreens faild,error: %v \n", err)
  98. return errors.New("开关屏幕失败!")
  99. }
  100. return nil
  101. }
  102. // 发送内码文字
  103. func (screensService *ScreensService) SendInternalCode(sn string, content []promodel.InternalCodeContent) error {
  104. err := tcp.SendInternalCode(sn, content)
  105. if err != nil {
  106. logger.Logger.Errorf("SendInternalCode faild,error: %v \n", err)
  107. return errors.New("发送内码文字失败!")
  108. }
  109. return nil
  110. }
  111. // 远程喊话
  112. func (screensService *ScreensService) VoiceBroad(sn string, content string) error {
  113. err := tcp.VoiceBroad(sn, content)
  114. if err != nil {
  115. logger.Logger.Errorf("SendInternalCode faild,error: %v \n", err)
  116. return errors.New("远程喊话失败!")
  117. }
  118. return nil
  119. }
  120. // 设置屏幕亮度和声音开关时间
  121. func (screensService *ScreensService) SetBrightAudioLed(sb model.ReqBrightness) error {
  122. //先将白天、晚上亮度 声音开关时间 更新到数据库
  123. screens := devices.Screens{}
  124. err := screens.UpdateBrightAudioLedBySn(sb.Sn, sb.DayBright, sb.NightBright, sb.AudioOn, sb.AudioOff, sb.LedOn, sb.LedOff)
  125. if err != nil {
  126. logger.Logger.Errorf("SetBright faild,error: %v \n", err)
  127. return errors.New("亮度更新数据库失败!")
  128. }
  129. //修改屏幕亮度 判断当前时间是白天还是晚上(立马去更改当前所处时间的亮度)
  130. currentTime := time.Now()
  131. hour := currentTime.Hour()
  132. minute := currentTime.Minute()
  133. // 判断当前时间是否在 8:00 到 18:00 之间
  134. if (hour > 8 || (hour == 8 && minute >= 0)) && (hour < 18) {
  135. //白天
  136. err = tcp.SetBrightness(sb.Sn, sb.DayBright)
  137. if err != nil {
  138. logger.Logger.Errorf("SetBright[白天] faild,error: %v \n", err)
  139. return errors.New("设置白天亮度失败!")
  140. }
  141. } else {
  142. //晚上
  143. err = tcp.SetBrightness(sb.Sn, sb.NightBright)
  144. if err != nil {
  145. logger.Logger.Errorf("SetBright[晚上] faild,error: %v \n", err)
  146. return errors.New("设置晚上亮度失败!")
  147. }
  148. }
  149. //修改时控开关时间
  150. err = SetSwitchClock([]string{sb.SwitchSn}, sb.AudioOn, sb.AudioOff)
  151. if err != nil {
  152. logger.Logger.Errorf("SetSwitchClock faild,error: %v \n", err)
  153. return err
  154. }
  155. return nil
  156. }
  157. func SetSwitchClock(switchSn []string, audioOn, audioOff string) error {
  158. //目标接口的 URL
  159. url := "https://cloud.long-chi.com/lczh_wxapp_api/dev/batchUpdateDeviceTime"
  160. token := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVVUlEIjoiYjFkZDU2MGItM2RmNC00MTg0LWE2NzktODYyM2M1Y2I3ZDVkIiwiSUQiOjI0MCwiVXNlcm5hbWUiOiJzbWFydEludGVyc2VjdGlvbiIsIk5pY2tOYW1lIjoi5pm65oWn6Lev5Y-jIiwiQXV0aG9yaXR5SWQiOjk5OTk5LCJPcGVuaWQiOiIiLCJCdWZmZXJUaW1lIjo4NjQwMCwiaXNzIjoicW1QbHVzIiwiZXhwIjo0MTAyMzI5NjAwLCJhdWQiOiJHVkEiLCJuYmYiOjE3MzE5OTc5MDl9.DTWzlXPNbQ9bT7pX_X_tvJ06oW9bngPLKXsFNb54uV4"
  161. params := model.BatchUpdateDeviceTime{
  162. DeviceSn: switchSn,
  163. TimeSetData: model.DeviceRelay{
  164. TimeCondition1OnTime: audioOn, //声音开时间
  165. TimeCondition1OffTime: audioOff, //声音关时间
  166. },
  167. }
  168. buf, err := json.Marshal(&params)
  169. if err != nil {
  170. logger.Logger.Errorf("Fail to marshal [SetSwitchClock], error: %v \n", err)
  171. return err
  172. }
  173. req, err := http.NewRequest("PUT", url, bytes.NewBuffer(buf))
  174. if err != nil {
  175. logger.Logger.Errorf("Fail to create request [SetSwitchClock], error: %v \n", err)
  176. return err
  177. }
  178. // 在请求头中添加x-token字段,值为<Token>
  179. req.Header.Add("x-token", token)
  180. req.Header.Add("Content-Type", "application/json")
  181. // 创建一个 HTTP 客户端
  182. client := &http.Client{}
  183. // 发送请求
  184. resp, err := client.Do(req)
  185. if err != nil {
  186. logger.Logger.Errorf("Fail to Do request [SetSwitchClock], error: %v \n", err)
  187. return err
  188. }
  189. defer resp.Body.Close()
  190. if resp.StatusCode != 200 {
  191. return errors.New("设置声音时控 fail")
  192. }
  193. return nil
  194. }