message_api_controllor.go 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "strconv"
  7. "strings"
  8. "sws_xcx/enums"
  9. "sws_xcx/models"
  10. "sws_xcx/service"
  11. "sws_xcx/utils"
  12. )
  13. type MessageApiControllor struct {
  14. BaseApiController
  15. }
  16. func (c *MessageApiControllor) PutEmqxMessage() {
  17. msg := &models.OpenEmqMsgReqVO{}
  18. err := json.Unmarshal(c.Ctx.Input.RequestBody, msg)
  19. if err != nil {
  20. c.ServeDynamicFailJsonSend(err.Error())
  21. return
  22. }
  23. ds := service.NewDeviceService()
  24. device, err := ds.GetDeviceByNo(msg.UserName)
  25. if err != nil {
  26. utils.ErrorLog("GetDeviceByNo %v:", err)
  27. c.ServeDynamicFailJsonSend(err.Error())
  28. return
  29. }
  30. if device.Id == 0 {
  31. msg := "非本系统设备,数据废弃"
  32. utils.WarningLog(msg)
  33. c.ServeDynamicFailJsonSend(msg)
  34. return
  35. }
  36. err = ds.CreateDeviceMessageLog(models.DeviceMessageLog{
  37. DeviceName: msg.DeviceName,
  38. Content: string(c.Ctx.Input.RequestBody),
  39. EventType: enums.EventTypeEmqx,
  40. MessageId: msg.Id,
  41. Topic: msg.Topic,
  42. })
  43. if err != nil {
  44. utils.ErrorLog("CreateDeviceMessageLog %v:", err)
  45. c.ServeDynamicFailJsonSend(err.Error())
  46. return
  47. }
  48. payload := &models.OpenEmqPayloadReqVO{}
  49. err = json.Unmarshal([]byte(msg.Payload), payload)
  50. if err != nil {
  51. utils.ErrorLog("json.Unmarshal %v:", err)
  52. c.ServeDynamicFailJsonSend(err.Error())
  53. return
  54. }
  55. if payload.Len != 23 {
  56. utils.WarningLog("非标准数据,数据废弃:%v", msg.Payload)
  57. }
  58. dr, err := ds.GetDeviceRelateByDeviceId(device.Id)
  59. if err != nil {
  60. utils.ErrorLog("GetDeviceRelateByDeviceId %v:", err)
  61. c.ServeDynamicFailJsonSend(err.Error())
  62. return
  63. }
  64. checkRecord := &models.CheckRecord{
  65. Acc: payload.Acc,
  66. PutSources: enums.EventTypeEmqx,
  67. MessageId: msg.Id,
  68. DeviceId: device.Id,
  69. UserId: dr.UserId,
  70. DeviceStatus: device.Status,
  71. }
  72. if dr.UserId > 0 {
  73. hp, err := service.NewUserHealthProfileService().GetUserHealthProfileByUserId(dr.UserId)
  74. if err != nil {
  75. utils.ErrorLog("GetUserHealthProfileByUserId %v:", err)
  76. c.ServeDynamicFailJsonSend(err.Error())
  77. return
  78. }
  79. checkRecord.UserHealthProfileId = int64(hp.Id)
  80. }
  81. crs := service.NewCheckRecordService()
  82. err = crs.CreateCheckRecord(checkRecord)
  83. if err != nil {
  84. utils.ErrorLog("CreateCheckRecord %v:", err)
  85. c.ServeDynamicFailJsonSend(err.Error())
  86. return
  87. }
  88. da := strings.Split(payload.Data, ",")
  89. count := payload.Count
  90. if len(da) != count {
  91. utils.WarningLog("数据长度不匹配,截取存储 %+v", payload)
  92. if len(da) < count {
  93. count = len(da)
  94. }
  95. }
  96. checkItems, err := service.NewCheckItemService().GetCheckItems("cn", device.DeviceType)
  97. if err != nil {
  98. utils.ErrorLog("GetCheckItems %v:", err)
  99. c.ServeDynamicFailJsonSend(err.Error())
  100. return
  101. }
  102. if len(checkItems) < count {
  103. c.ServeDynamicFailJsonSend("接收的数据与检查项目配置不一致")
  104. return
  105. }
  106. alerts := make([]string, 0)
  107. for i := 0; i < count; i++ {
  108. vi, _ := strconv.Atoi(da[i])
  109. err = createCheckRecordItem(checkItems, checkRecord.Id, &alerts, vi, i+1, crs)
  110. if err != nil {
  111. utils.ErrorLog("createCheckRecordItem valule:%v, err:%v:", vi, err)
  112. }
  113. }
  114. if len(alerts) > 0 {
  115. alertItemIds := strings.Join(alerts, ",")
  116. err = crs.UpdateCheckRecordAlertItems(checkRecord.Id, alertItemIds)
  117. if err != nil {
  118. utils.ErrorLog("UpdateCheckRecordAlertItems %v:", err)
  119. c.ServeDynamicFailJsonSend(err.Error())
  120. return
  121. }
  122. }
  123. }
  124. func createCheckRecordItem(items []*models.CheckItem, crId int64, alerts *[]string, vi, n int, crs *service.CheckRecordService) error {
  125. item := findItem(items, n)
  126. if item == nil {
  127. return fmt.Errorf("检测项目不匹配,需要检查基础数据!序号:%v", n)
  128. }
  129. cri := models.CheckRecordItem{
  130. CheckId: crId,
  131. CheckItemId: n,
  132. CheckValueIndex: vi,
  133. }
  134. scopes := []*models.CheckItemScopeVO{}
  135. err := json.Unmarshal([]byte(item.ScopeList), &scopes)
  136. if err != nil {
  137. return fmt.Errorf("检测项目数值范围定义不正确 err:%v", err)
  138. }
  139. scope := findScope(scopes, vi)
  140. if scope == nil {
  141. return errors.New("检测结果不匹配")
  142. }
  143. cri.CheckValue = scope.Value
  144. if scope.Type != 1 {
  145. *alerts = append(*alerts, strconv.Itoa(n))
  146. }
  147. return crs.CreateCheckRecordItem(&cri)
  148. }
  149. func findScope(scopes []*models.CheckItemScopeVO, vi int) *models.CheckItemScopeVO {
  150. for _, scope := range scopes {
  151. if scope.Index == vi {
  152. return scope
  153. }
  154. }
  155. return nil
  156. }
  157. func findItem(items []*models.CheckItem, itemNumber int) *models.CheckItem {
  158. //循环items
  159. for _, item := range items {
  160. if item.CheckItemNumber == itemNumber {
  161. return item
  162. }
  163. }
  164. return nil
  165. }