dashboard.go 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "kpt-pasture/model"
  6. "kpt-pasture/util"
  7. "net/http"
  8. "strconv"
  9. "strings"
  10. "time"
  11. "gorm.io/gorm"
  12. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  13. "go.uber.org/zap"
  14. "gitee.com/xuyiping_admin/pkg/xerr"
  15. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  16. )
  17. func (s *StoreEntry) Bar(ctx context.Context) (*pasturePb.BarCowStructResponse, error) {
  18. barCowStructList := make([]*model.BarCowStruct, 0)
  19. var count int32 = 0
  20. if err := s.DB.Model(new(model.Cow)).
  21. Select("COUNT(*) AS number ,cow_type").
  22. Where("admission_status = ?", pasturePb.AdmissionStatus_Admission).
  23. Group("cow_type").
  24. Find(&barCowStructList).Error; err != nil {
  25. return nil, xerr.WithStack(err)
  26. }
  27. cowTypeMap := s.CowTypeMap()
  28. for _, v := range barCowStructList {
  29. count += v.Number
  30. }
  31. return &pasturePb.BarCowStructResponse{
  32. Code: http.StatusOK,
  33. Msg: "ok",
  34. Data: &pasturePb.BarCowStructData{
  35. List: model.BarCowStructSlice(barCowStructList).ToPB(cowTypeMap, count),
  36. Total: 38563,
  37. },
  38. }, nil
  39. }
  40. func (s *StoreEntry) NeckRingWarning(ctx context.Context) (*pasturePb.IndexNeckRingResponse, error) {
  41. userModel, err := s.GetUserModel(ctx)
  42. if err != nil {
  43. return nil, xerr.WithStack(err)
  44. }
  45. estrusWarningCowList := make([]*model.NeckRingEstrus, 0)
  46. estrusWarningLevelItems := map[int32]int32{
  47. int32(pasturePb.EstrusLevel_Low): 0,
  48. int32(pasturePb.EstrusLevel_Middle): 0,
  49. int32(pasturePb.EstrusLevel_High): 0,
  50. }
  51. if err = s.DB.Model(new(model.EventEstrus)).
  52. Where("pasture_id = ?", userModel.AppPasture.Id).
  53. Where("is_show = ?", pasturePb.IsShow_Ok).
  54. Group("cow_id").Find(&estrusWarningCowList).Error; err != nil {
  55. zaplog.Error("NeckRingWarning", zap.Any("estrusWarningNumber", err))
  56. }
  57. for _, v := range estrusWarningCowList {
  58. estrusWarningLevelItems[int32(v.Level)] += estrusWarningLevelItems[int32(v.Level)]
  59. }
  60. healthWarningNumber := int64(0)
  61. if err = s.DB.Model(new(model.NeckRingHealthWarning)).
  62. Where("pasture_id = ?", userModel.AppPasture.Id).
  63. Where("is_show = ?", pasturePb.IsShow_Ok).
  64. Group("cow_id").
  65. Count(&healthWarningNumber).Error; err != nil {
  66. zaplog.Error("NeckRingWarning", zap.Any("estrusWarningNumber", err))
  67. }
  68. return &pasturePb.IndexNeckRingResponse{
  69. Code: http.StatusOK,
  70. Msg: "ok",
  71. Data: &pasturePb.NeckRingData{
  72. EstrusWarningNumber: int32(len(estrusWarningCowList)),
  73. HealthWarningNumber: int32(healthWarningNumber),
  74. AbortionWarningNumber: 0,
  75. StressWarningNumber: 0,
  76. EstrusWarningLevelItems: estrusWarningLevelItems,
  77. },
  78. }, nil
  79. }
  80. func (s *StoreEntry) FocusIndicatorsList(ctx context.Context, dimension string) (*pasturePb.IndexFocusIndicatorsResponse, error) {
  81. userModel, err := s.GetUserModel(ctx)
  82. if err != nil {
  83. return nil, xerr.WithStack(err)
  84. }
  85. userFocusIndicators := userModel.SystemUser.IndicatorsKinds
  86. if len(userFocusIndicators) <= 0 {
  87. userFocusIndicators = model.DefaultFocusIndicators
  88. }
  89. userFocusIndicatorsList := strings.Split(userFocusIndicators, ",")
  90. indicatorsDataList := make([]*model.IndicatorsData, 0)
  91. pref := s.DB.Model(new(model.IndicatorsData)).
  92. Where("pasture_id = ?", userModel.AppPasture.Id).
  93. Where("kind in (?)", userFocusIndicatorsList)
  94. /*if dimension == "Year" {
  95. pref.Where("date = ?", time.Now().Format(model.LayoutMonth))
  96. }*/
  97. nowTime := time.Now()
  98. if dimension == "Month" {
  99. pref.Where("date = ?", nowTime.Format(model.LayoutMonth))
  100. }
  101. if err = pref.Find(&indicatorsDataList).Error; err != nil {
  102. zaplog.Error("FocusIndicators", zap.Any("err", err))
  103. }
  104. indicatorsDetailsMap, err := s.GetIndicatorsDetailsMap(ctx)
  105. if err != nil {
  106. return nil, xerr.WithStack(err)
  107. }
  108. focusIndicatorsList := make([]*pasturePb.FocusIndicators, 0)
  109. for _, v := range indicatorsDataList {
  110. indicatorsDetails, ok := indicatorsDetailsMap[v.Kind]
  111. if !ok {
  112. continue
  113. }
  114. onYear, onMonth := "", ""
  115. if dimension == "Year" {
  116. return nil, xerr.Custom("暂不支持该维度")
  117. }
  118. if dimension == "Month" {
  119. lastMonth := nowTime.AddDate(0, -1, 0).Format(model.LayoutMonth)
  120. oldIndicators, _ := s.GetIndicatorsDataByDate(userModel.AppPasture.Id, v.Kind, lastMonth)
  121. if oldIndicators != nil {
  122. if oldIndicators.Value != "" && oldIndicators.Value != "0" {
  123. oldValue, _ := strconv.ParseFloat(oldIndicators.Value, 64)
  124. currValue, _ := strconv.ParseFloat(v.Value, 64)
  125. onMonthValue := (oldValue - currValue) / oldValue * 100
  126. omv := util.RoundToTwoDecimals(onMonthValue)
  127. onMonth = strconv.FormatFloat(omv, 'f', 2, 64) + "%"
  128. }
  129. }
  130. }
  131. focusIndicatorsList = append(focusIndicatorsList, &pasturePb.FocusIndicators{
  132. Kind: indicatorsDetails.Kind,
  133. Name: indicatorsDetails.Name,
  134. Value: v.Value,
  135. Describe: indicatorsDetails.Zh,
  136. UnitName: indicatorsDetails.Unit,
  137. OnMonth: onMonth,
  138. OnYear: onYear,
  139. })
  140. }
  141. indicatorsDetailsList, _ := s.FindIndicatorsDetailsList(ctx)
  142. return &pasturePb.IndexFocusIndicatorsResponse{
  143. Code: http.StatusOK,
  144. Msg: "ok",
  145. Data: &pasturePb.FocusData{
  146. FocusIndicators: focusIndicatorsList,
  147. IndicatorsSet: model.IndicatorsDetailsSlice(indicatorsDetailsList).ToPB(userFocusIndicatorsList),
  148. },
  149. }, err
  150. }
  151. func (s *StoreEntry) FocusIndicatorsSet(ctx context.Context, req *pasturePb.IndexFocusIndicatorsSetRequest) error {
  152. userModel, err := s.GetUserModel(ctx)
  153. if err != nil {
  154. return xerr.WithStack(err)
  155. }
  156. if len(req.IndicatorsKind) <= 0 {
  157. return nil
  158. }
  159. userFocusIndicators := strings.Join(req.IndicatorsKind, ",")
  160. if err = s.DB.Model(new(model.SystemUser)).Where("id = ?", userModel.SystemUser.Id).Update("indicators_kinds", userFocusIndicators).Error; err != nil {
  161. return xerr.WithStack(err)
  162. }
  163. return nil
  164. }
  165. func (s *StoreEntry) DataWarningSet(ctx context.Context, req *pasturePb.IndexDataWarningSetRequest) error {
  166. userModel, err := s.GetUserModel(ctx)
  167. if err != nil {
  168. return xerr.WithStack(err)
  169. }
  170. if len(req.WarningDataSet) <= 0 {
  171. return nil
  172. }
  173. userDataWarningList := make([]*model.DataWarning, 0)
  174. if err = s.DB.Model(new(model.DataWarning)).
  175. Where("user_id = ?", userModel.SystemUser.Id).
  176. Find(&userDataWarningList).Error; err != nil {
  177. if errors.Is(err, gorm.ErrRecordNotFound) {
  178. } else {
  179. return xerr.WithStack(err)
  180. }
  181. }
  182. /*for _, v := range userDataWarningList {
  183. }*/
  184. return nil
  185. }
  186. func (s *StoreEntry) DataWarningList(ctx context.Context) (*pasturePb.IndexDataWarningResponse, error) {
  187. userModel, err := s.GetUserModel(ctx)
  188. if err != nil {
  189. return nil, xerr.WithStack(err)
  190. }
  191. defaultUserDataWarningList, err := s.DefaultDataWarning(ctx)
  192. if err != nil {
  193. return nil, xerr.WithStack(err)
  194. }
  195. currentUserDataWarningList := make([]*model.DataWarning, 0)
  196. if err = s.DB.Model(new(model.DataWarning)).
  197. Where("user_id = ?", userModel.SystemUser.Id).
  198. Find(&currentUserDataWarningList).Error; err != nil {
  199. return nil, xerr.WithStack(err)
  200. }
  201. // 如果用户没有配置自己的预警数据,则使用默认数据
  202. if len(currentUserDataWarningList) <= 0 {
  203. currentUserDataWarningList = defaultUserDataWarningList
  204. }
  205. if len(currentUserDataWarningList) <= 0 {
  206. return nil, xerr.Custom("当前用户未配置预警数据,请联系管理员!")
  207. }
  208. warningIds := make([]int64, 0)
  209. warningMap := make(map[int64]*model.DataWarning)
  210. dataShow := make([]*pasturePb.WarningDataShow, 0)
  211. for _, warningData := range currentUserDataWarningList {
  212. dataUpdateTimeFormat := ""
  213. if warningData.DataUpdateAt > 0 {
  214. dataUpdateTimeFormat = time.Unix(warningData.DataUpdateAt, 0).Format(model.LayoutTime)
  215. }
  216. dataShow = append(dataShow, &pasturePb.WarningDataShow{
  217. Name: warningData.Name,
  218. Number: warningData.DataValue,
  219. Describe: warningData.Description,
  220. DataUpdateTimeFormat: dataUpdateTimeFormat,
  221. })
  222. warningMap[warningData.Id] = warningData
  223. // 如果预警数据更新时间大于预警条件更新时间,则跳过
  224. if warningData.DataUpdateAt > warningData.ConditionUpdateAt {
  225. continue
  226. }
  227. warningIds = append(warningIds, warningData.Id)
  228. }
  229. dataWaningItems := make([]*model.DataWarningItems, 0)
  230. if err = s.DB.Model(new(model.DataWarningItems)).
  231. Where("warning_id in (?)", warningIds).
  232. Find(&dataWaningItems).Error; err != nil {
  233. return nil, xerr.WithStack(err)
  234. }
  235. dataSet := make([]*pasturePb.WarningDataSet, 0)
  236. for _, v := range dataWaningItems {
  237. warningData := warningMap[v.WarningId]
  238. dataSet = append(dataSet, &pasturePb.WarningDataSet{
  239. WarningId: int32(v.WarningId),
  240. GroupId: v.GroupId,
  241. Name: warningData.Name,
  242. FieldDesc: v.FieldDesc,
  243. Operator: v.Operator,
  244. Value: v.Value,
  245. Kind: warningData.Kind,
  246. IsShow: pasturePb.IsShow_Ok,
  247. })
  248. }
  249. return &pasturePb.IndexDataWarningResponse{
  250. Code: http.StatusOK,
  251. Msg: "ok",
  252. Data: &pasturePb.DataWarning{
  253. DataSet: dataSet,
  254. DataShow: dataShow,
  255. },
  256. }, nil
  257. }
  258. func (s *StoreEntry) DefaultDataWarning(ctx context.Context) ([]*model.DataWarning, error) {
  259. defaultUserDataWarningList := make([]*model.DataWarning, 0)
  260. if err := s.DB.Model(new(model.DataWarning)).
  261. Where("user_id = ?", model.DefaultUserId).
  262. Find(&defaultUserDataWarningList).Error; err != nil {
  263. return nil, xerr.WithStack(err)
  264. }
  265. return defaultUserDataWarningList, nil
  266. }