123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- package controllers
-
- import (
- "encoding/json"
- "errors"
- "fmt"
- "strconv"
- "strings"
- "sws_xcx/enums"
- "sws_xcx/models"
- "sws_xcx/service"
- "sws_xcx/utils"
- )
-
- type MessageApiControllor struct {
- BaseApiController
- }
-
- func (c *MessageApiControllor) PutEmqxMessage() {
-
- msg := &models.OpenEmqMsgReqVO{}
- err := json.Unmarshal(c.Ctx.Input.RequestBody, msg)
- if err != nil {
- c.ServeDynamicFailJsonSend(err.Error())
- return
- }
-
- ds := service.NewDeviceService()
-
- device, err := ds.GetDeviceByNo(msg.UserName)
- if err != nil {
- utils.ErrorLog("GetDeviceByNo %v:", err)
- c.ServeDynamicFailJsonSend(err.Error())
- return
- }
- if device.Id == 0 {
- msg := "非本系统设备,数据废弃"
- utils.WarningLog(msg)
- c.ServeDynamicFailJsonSend(msg)
- return
- }
- err = ds.CreateDeviceMessageLog(models.DeviceMessageLog{
- DeviceName: msg.DeviceName,
- Content: string(c.Ctx.Input.RequestBody),
- EventType: enums.EventTypeEmqx,
- MessageId: msg.Id,
- Topic: msg.Topic,
- })
-
- if err != nil {
- utils.ErrorLog("CreateDeviceMessageLog %v:", err)
- c.ServeDynamicFailJsonSend(err.Error())
- return
- }
- payload := &models.OpenEmqPayloadReqVO{}
- err = json.Unmarshal([]byte(msg.Payload), payload)
- if err != nil {
- utils.ErrorLog("json.Unmarshal %v:", err)
- c.ServeDynamicFailJsonSend(err.Error())
- return
- }
- if payload.Len != 23 {
- utils.WarningLog("非标准数据,数据废弃:%v", msg.Payload)
- }
-
- dr, err := ds.GetDeviceRelateByDeviceId(device.Id)
- if err != nil {
- utils.ErrorLog("GetDeviceRelateByDeviceId %v:", err)
- c.ServeDynamicFailJsonSend(err.Error())
- return
- }
-
- checkRecord := &models.CheckRecord{
-
- Acc: payload.Acc,
- PutSources: enums.EventTypeEmqx,
- MessageId: msg.Id,
- DeviceId: device.Id,
- UserId: dr.UserId,
- DeviceStatus: device.Status,
- }
-
- if dr.UserId > 0 {
-
- hp, err := service.NewUserHealthProfileService().GetUserHealthProfileByUserId(dr.UserId)
- if err != nil {
- utils.ErrorLog("GetUserHealthProfileByUserId %v:", err)
- c.ServeDynamicFailJsonSend(err.Error())
- return
- }
- checkRecord.UserHealthProfileId = int64(hp.Id)
- }
- crs := service.NewCheckRecordService()
- err = crs.CreateCheckRecord(checkRecord)
- if err != nil {
- utils.ErrorLog("CreateCheckRecord %v:", err)
- c.ServeDynamicFailJsonSend(err.Error())
- return
- }
-
- da := strings.Split(payload.Data, ",")
- count := payload.Count
- if len(da) != count {
- utils.WarningLog("数据长度不匹配,截取存储 %+v", payload)
- if len(da) < count {
- count = len(da)
- }
- }
-
- checkItems, err := service.NewCheckItemService().GetCheckItems("cn", device.DeviceType)
-
- if err != nil {
- utils.ErrorLog("GetCheckItems %v:", err)
- c.ServeDynamicFailJsonSend(err.Error())
- return
- }
-
- if len(checkItems) < count {
- c.ServeDynamicFailJsonSend("接收的数据与检查项目配置不一致")
- return
- }
-
- alerts := make([]string, 0)
- for i := 0; i < count; i++ {
- vi, _ := strconv.Atoi(da[i])
- err = createCheckRecordItem(checkItems, checkRecord.Id, &alerts, vi, i+1, crs)
- if err != nil {
- utils.ErrorLog("createCheckRecordItem valule:%v, err:%v:", vi, err)
- }
- }
-
- if len(alerts) > 0 {
- alertItemIds := strings.Join(alerts, ",")
- err = crs.UpdateCheckRecordAlertItems(checkRecord.Id, alertItemIds)
- if err != nil {
- utils.ErrorLog("UpdateCheckRecordAlertItems %v:", err)
- c.ServeDynamicFailJsonSend(err.Error())
- return
- }
-
- }
-
- }
-
- func createCheckRecordItem(items []*models.CheckItem, crId int64, alerts *[]string, vi, n int, crs *service.CheckRecordService) error {
- item := findItem(items, n)
- if item == nil {
- return fmt.Errorf("检测项目不匹配,需要检查基础数据!序号:%v", n)
- }
-
- cri := models.CheckRecordItem{
- CheckId: crId,
- CheckItemId: n,
- CheckValueIndex: vi,
- }
-
- scopes := []*models.CheckItemScopeVO{}
- err := json.Unmarshal([]byte(item.ScopeList), &scopes)
- if err != nil {
- return fmt.Errorf("检测项目数值范围定义不正确 err:%v", err)
- }
- scope := findScope(scopes, vi)
- if scope == nil {
- return errors.New("检测结果不匹配")
- }
-
- cri.CheckValue = scope.Value
- if scope.Type != 1 {
- *alerts = append(*alerts, strconv.Itoa(n))
- }
- return crs.CreateCheckRecordItem(&cri)
- }
-
- func findScope(scopes []*models.CheckItemScopeVO, vi int) *models.CheckItemScopeVO {
- for _, scope := range scopes {
- if scope.Index == vi {
- return scope
- }
- }
- return nil
- }
-
- func findItem(items []*models.CheckItem, itemNumber int) *models.CheckItem {
- //循环items
- for _, item := range items {
- if item.CheckItemNumber == itemNumber {
- return item
- }
- }
- return nil
- }
|