dashboard.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "kpt-pasture/model"
  7. "kpt-pasture/util"
  8. "net/http"
  9. "regexp"
  10. "strconv"
  11. "strings"
  12. "time"
  13. "gorm.io/gorm"
  14. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  15. "gitee.com/xuyiping_admin/pkg/xerr"
  16. "go.uber.org/zap"
  17. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  18. )
  19. func (s *StoreEntry) NeckRingWarning(ctx context.Context) (*pasturePb.IndexNeckRingResponse, error) {
  20. userModel, err := s.GetUserModel(ctx)
  21. if err != nil {
  22. return nil, xerr.WithStack(err)
  23. }
  24. var count int64
  25. neckRingEstrusList := make([]*model.NeckRingEstrusWarning, 0)
  26. estrusWarningLevelItems := map[int32]int32{
  27. int32(pasturePb.EstrusLevel_Low): 0,
  28. int32(pasturePb.EstrusLevel_Middle): 0,
  29. int32(pasturePb.EstrusLevel_High): 0,
  30. }
  31. pref, err := s.EstrusWarningQuery(ctx, userModel.AppPasture.Id)
  32. if err != nil {
  33. return nil, xerr.Customf("系统错误!")
  34. }
  35. if err = pref.Order("a.level DESC").
  36. Count(&count).
  37. Find(&neckRingEstrusList).Error; err != nil {
  38. return nil, xerr.WithStack(err)
  39. }
  40. countEstrusWarning := 0
  41. nowTime := time.Now().Local()
  42. optimumMating := map[string]int32{
  43. "front": 0,
  44. "middle": 0,
  45. "behind": 0,
  46. }
  47. for _, v := range neckRingEstrusList {
  48. estrusWarningLevelItems[int32(v.Level)] += 1
  49. countEstrusWarning += 1
  50. cowInfo, _ := s.GetCowInfoByEarNumber(ctx, userModel.AppPasture.Id, v.EarNumber)
  51. pzHour := v.CalculatePzHour(cowInfo.Lact)
  52. optimumMatingStartTime := pzHour.Add(-4 * time.Hour)
  53. optimumMatingEndTime := pzHour.Add(4 * time.Hour)
  54. // 判断当前时间是否在 pzHour-4h 到 pzHour+4h 之间
  55. if nowTime.After(optimumMatingStartTime) && nowTime.Before(optimumMatingEndTime) {
  56. optimumMating["middle"] += 1
  57. }
  58. if nowTime.After(optimumMatingEndTime) {
  59. optimumMating["behind"] += 1
  60. }
  61. if nowTime.Before(optimumMatingStartTime) {
  62. optimumMating["front"] += 1
  63. }
  64. }
  65. abortionCount := int64(0)
  66. pref, err = s.AbortionWarningQuery(ctx, userModel.AppPasture.Id)
  67. if err != nil {
  68. return nil, xerr.Customf("系统错误!")
  69. }
  70. if err = pref.Group("cow_id").Count(&abortionCount).Error; err != nil {
  71. return nil, xerr.WithStack(err)
  72. }
  73. healthWarningNumber := int64(0)
  74. if err = s.DB.Model(new(model.NeckRingHealthWarning)).
  75. Where("pasture_id = ?", userModel.AppPasture.Id).
  76. Where("is_show = ?", pasturePb.IsShow_Ok).
  77. Group("cow_id").
  78. Count(&healthWarningNumber).Error; err != nil {
  79. zaplog.Error("NeckRingWarning", zap.Any("estrusWarningNumber", err))
  80. }
  81. return &pasturePb.IndexNeckRingResponse{
  82. Code: http.StatusOK,
  83. Msg: "ok",
  84. Data: &pasturePb.NeckRingData{
  85. EstrusWarningNumber: int32(countEstrusWarning),
  86. HealthWarningNumber: int32(healthWarningNumber),
  87. AbortionWarningNumber: int32(abortionCount),
  88. StressWarningNumber: 0,
  89. EstrusWarningLevelItems: estrusWarningLevelItems,
  90. OptimumMating: optimumMating,
  91. },
  92. }, nil
  93. }
  94. func (s *StoreEntry) FocusIndicatorsList(ctx context.Context, dimension string) (*pasturePb.IndexFocusIndicatorsResponse, error) {
  95. userModel, err := s.GetUserModel(ctx)
  96. if err != nil {
  97. return nil, xerr.WithStack(err)
  98. }
  99. userFocusIndicators := userModel.SystemUser.IndicatorsKinds
  100. if len(userFocusIndicators) <= 0 {
  101. userFocusIndicators = model.DefaultFocusIndicators
  102. }
  103. userFocusIndicatorsList := strings.Split(userFocusIndicators, ",")
  104. indicatorsDataList := make([]*model.IndicatorsData, 0)
  105. pref := s.DB.Model(new(model.IndicatorsData)).
  106. Where("pasture_id = ?", userModel.AppPasture.Id).
  107. Where("kind in (?)", userFocusIndicatorsList)
  108. /*if dimension == "Year" {
  109. pref.Where("date = ?", time.Now().Local().Format(model.LayoutMonth))
  110. }*/
  111. nowTime := time.Now().Local()
  112. if dimension == "Month" {
  113. pref.Where("date = ?", nowTime.Format(model.LayoutMonth))
  114. }
  115. if err = pref.Find(&indicatorsDataList).Error; err != nil {
  116. zaplog.Error("FocusIndicators", zap.Any("err", err))
  117. }
  118. indicatorsDetailsMap, _, err := s.GetIndicatorsDetailsMap(ctx)
  119. if err != nil {
  120. return nil, xerr.WithStack(err)
  121. }
  122. focusIndicatorsList := make([]*pasturePb.FocusIndicators, 0)
  123. for _, v := range indicatorsDataList {
  124. indicatorsDetails, ok := indicatorsDetailsMap[v.Kind]
  125. if !ok {
  126. continue
  127. }
  128. onYear, onMonth := "", ""
  129. isUp := pasturePb.IsShow_Ok
  130. if dimension == "Year" {
  131. return nil, xerr.Custom("暂不支持该维度")
  132. }
  133. if dimension == "Month" {
  134. lastMonth := nowTime.AddDate(0, -1, 0).Format(model.LayoutMonth)
  135. oldIndicators, _ := s.GetIndicatorsDataByDate(userModel.AppPasture.Id, v.Kind, lastMonth)
  136. if oldIndicators != nil {
  137. if oldIndicators.Value != "" && oldIndicators.Value != "0" {
  138. oldValue, _ := strconv.ParseFloat(oldIndicators.Value, 64)
  139. currValue, _ := strconv.ParseFloat(v.Value, 64)
  140. onMonthValue := (oldValue - currValue) / oldValue * 100
  141. omv := util.RoundToTwoDecimals(onMonthValue)
  142. if omv < 0 {
  143. isUp = pasturePb.IsShow_No
  144. }
  145. onMonth = strconv.FormatFloat(omv, 'f', 2, 64) + "%"
  146. }
  147. }
  148. }
  149. focusIndicatorsList = append(focusIndicatorsList, &pasturePb.FocusIndicators{
  150. Kind: indicatorsDetails.Kind,
  151. Name: indicatorsDetails.Name,
  152. Value: v.Value,
  153. Describe: indicatorsDetails.Zh,
  154. UnitName: indicatorsDetails.Unit,
  155. OnMonth: onMonth,
  156. OnYear: onYear,
  157. IsUp: isUp,
  158. })
  159. }
  160. indicatorsDetailsList, _ := s.FindIndicatorsDetailsList(ctx)
  161. return &pasturePb.IndexFocusIndicatorsResponse{
  162. Code: http.StatusOK,
  163. Msg: "ok",
  164. Data: &pasturePb.FocusData{
  165. FocusIndicators: focusIndicatorsList,
  166. IndicatorsSet: model.IndicatorsDetailsSlice(indicatorsDetailsList).ToPB(userFocusIndicatorsList),
  167. },
  168. }, err
  169. }
  170. func (s *StoreEntry) FocusIndicatorsSet(ctx context.Context, req *pasturePb.IndexFocusIndicatorsSetRequest) error {
  171. userModel, err := s.GetUserModel(ctx)
  172. if err != nil {
  173. return xerr.WithStack(err)
  174. }
  175. if len(req.IndicatorsKind) <= 0 {
  176. return nil
  177. }
  178. userFocusIndicators := strings.Join(req.IndicatorsKind, ",")
  179. if err = s.DB.Model(new(model.SystemUser)).
  180. Where("id = ?", userModel.SystemUser.Id).
  181. Update("indicators_kinds", userFocusIndicators).Error; err != nil {
  182. return xerr.WithStack(err)
  183. }
  184. return nil
  185. }
  186. func (s *StoreEntry) DataWarningSet(ctx context.Context, req *pasturePb.IndexDataWarningSetRequest) error {
  187. userModel, err := s.GetUserModel(ctx)
  188. if err != nil {
  189. return xerr.WithStack(err)
  190. }
  191. pastureId := userModel.AppPasture.Id
  192. if len(req.WarningDataSet) <= 0 {
  193. return xerr.Custom("请选择预警数据")
  194. }
  195. defaultDataWarning, _ := s.FindDataWarning(ctx, pastureId, model.DefaultUserId)
  196. if len(defaultDataWarning) <= 0 {
  197. return xerr.Custom("默认预警数据不存在,请联系管理员!")
  198. }
  199. userDataWarningList, err := s.FindDataWarning(ctx, pastureId, userModel.SystemUser.Id)
  200. if err != nil {
  201. return xerr.WithStack(err)
  202. }
  203. if len(userDataWarningList) <= 0 { // 新增
  204. return s.addUserDataWarning(ctx, pastureId, userModel.SystemUser.Id, defaultDataWarning, req.WarningDataSet)
  205. }
  206. return s.updateUserDataWarning(ctx, pastureId, userModel.SystemUser.Id, userDataWarningList, req.WarningDataSet)
  207. }
  208. func (s *StoreEntry) DataWarningList(ctx context.Context) (*pasturePb.IndexDataWarningResponse, error) {
  209. userModel, err := s.GetUserModel(ctx)
  210. if err != nil {
  211. return nil, xerr.WithStack(err)
  212. }
  213. pastureId := userModel.AppPasture.Id
  214. defaultDataWarning, _ := s.FindDataWarning(ctx, pastureId, model.DefaultUserId)
  215. if len(defaultDataWarning) <= 0 {
  216. return nil, xerr.Custom("默认预警数据有误,请联系管理员!")
  217. }
  218. var isExist bool // 判断是否存在自己的设置的数据
  219. userDataWarning, _ := s.FindDataWarning(ctx, pastureId, userModel.SystemUser.Id)
  220. if len(userDataWarning) == 0 {
  221. // 如果用户没有配置自己的预警数据,则使用默认数据
  222. isExist = true
  223. userDataWarning = defaultDataWarning
  224. }
  225. //newTime := time.Now().Local().Unix()
  226. needUpdateWarningIds := make([]int64, 0)
  227. for _, warningData := range userDataWarning {
  228. // 如果预警数据更新时间大于预警条件更新时间,并且更新时间距离当前时间小于2小时,则跳过
  229. /*if warningData.DataUpdateAt > warningData.ConditionUpdateAt && newTime-warningData.DataUpdateAt < int64(2*time.Hour) {
  230. continue
  231. }*/
  232. needUpdateWarningIds = append(needUpdateWarningIds, warningData.Id)
  233. }
  234. // 需要重新计算更新的warningId
  235. if len(needUpdateWarningIds) > 0 {
  236. s.UpdateWarningData(ctx, pastureId, needUpdateWarningIds)
  237. }
  238. userDataWarningItems := make([]*model.DataWarningItems, 0)
  239. // 计算过后重新获取数据
  240. if isExist {
  241. userDataWarning, _ = s.FindDataWarning(ctx, pastureId, model.DefaultUserId)
  242. userDataWarningItems, _ = s.FindDataWarningItems(ctx, pastureId, model.DefaultUserId)
  243. } else {
  244. userDataWarning, _ = s.FindDataWarning(ctx, pastureId, userModel.SystemUser.Id)
  245. userDataWarningItems, _ = s.FindDataWarningItems(ctx, pastureId, userModel.SystemUser.Id)
  246. }
  247. return &pasturePb.IndexDataWarningResponse{
  248. Code: http.StatusOK,
  249. Msg: "ok",
  250. Data: &pasturePb.DataWarning{
  251. DataSet: model.DataWarningItemsSlice(userDataWarningItems).ToPB(userDataWarning),
  252. DataShow: model.DataWarningSlice(userDataWarning).ToPB(),
  253. },
  254. }, nil
  255. }
  256. func (s *StoreEntry) DataWarningPop(ctx context.Context, req *pasturePb.WarningDataListRequest, pagination *pasturePb.PaginationModel) (*model.WarningDataPopResponse, error) {
  257. userModel, err := s.GetUserModel(ctx)
  258. if err != nil {
  259. return nil, xerr.WithStack(err)
  260. }
  261. if req.Kind <= pasturePb.DataWarningType_Invalid {
  262. return nil, xerr.Custom("请选择预警数据")
  263. }
  264. pastureId := userModel.AppPasture.Id
  265. dataWaringItem := &model.DataWarning{}
  266. if err = s.DB.Model(new(model.DataWarning)).
  267. Where("pasture_id = ?", pastureId).
  268. Where("user_id = ?", userModel.SystemUser.Id).
  269. Where("kind = ?", req.Kind).
  270. First(dataWaringItem).Error; err != nil {
  271. if errors.Is(err, gorm.ErrRecordNotFound) {
  272. if err = s.DB.Model(new(model.DataWarning)).
  273. Where("pasture_id = ?", pastureId).
  274. Where("user_id = ?", model.DefaultUserId).
  275. Where("kind = ?", req.Kind).
  276. First(dataWaringItem).Error; err != nil {
  277. return nil, xerr.WithStack(err)
  278. }
  279. } else {
  280. return nil, xerr.Custom("预警数据不存在,请联系管理员!")
  281. }
  282. }
  283. headers, headerSort, err := dataWaringItem.GetWarningColumn()
  284. if err != nil {
  285. return nil, xerr.WithStack(err)
  286. }
  287. resp := &model.WarningDataPopResponse{
  288. Code: http.StatusOK,
  289. Msg: "ok",
  290. Data: &model.WarningPop{
  291. DataList: make([]interface{}, 0),
  292. Title: dataWaringItem.Name,
  293. Kind: dataWaringItem.Kind,
  294. HeaderSort: headerSort,
  295. Headers: headers,
  296. Page: pagination.Page,
  297. PageSize: pagination.PageSize,
  298. Total: 0,
  299. },
  300. }
  301. query, params, err := s.BuildQuery(dataWaringItem.Id)
  302. if err != nil {
  303. zaplog.Error("UpdateWarningData", zap.Any("BuildQuery", err), zap.Any("warningId", dataWaringItem.Id))
  304. return resp, nil
  305. }
  306. if len(query) == 0 || len(params) == 0 {
  307. return resp, nil
  308. }
  309. var count int64
  310. cowList := make([]*model.Cow, 0)
  311. if err = s.DB.Model(new(model.Cow)).
  312. Where("pasture_id = ?", pastureId).
  313. Where(query, params...).
  314. Count(&count).
  315. Limit(int(pagination.PageSize)).
  316. Offset(int(pagination.PageOffset)).
  317. Find(&cowList).
  318. Error; err != nil {
  319. zaplog.Error("UpdateWarningData", zap.Any("err", err), zap.Any("query", query), zap.Any("params", params))
  320. }
  321. cowTypeMap := s.CowTypeMap()
  322. breedStatusMap := s.CowBreedStatusMap()
  323. cowKindMap := s.CowKindMap()
  324. cowSourceMap := s.CowSourceMap()
  325. admissionStatusMap := s.AdmissionStatusMap()
  326. healthStatusMap := s.HealthStatusMap()
  327. purposeMap := s.PurposeMap()
  328. resp.Data.Total = int32(count)
  329. systemBasic, err := s.GetSystemBasicByName(ctx, userModel.AppPasture.Id, model.PregnancyAge)
  330. if err != nil {
  331. return nil, xerr.Custom("请在基础参数配置妊娠天数")
  332. }
  333. resp.Data.DataList = model.CowSlice(cowList).ToPB(
  334. cowTypeMap, breedStatusMap, cowKindMap,
  335. cowSourceMap, admissionStatusMap, healthStatusMap,
  336. purposeMap, systemBasic.MinValue,
  337. )
  338. return resp, nil
  339. }
  340. // 新增用户预警数据
  341. func (s *StoreEntry) addUserDataWarning(ctx context.Context, pastureId, userId int64, defaultDataWarning []*model.DataWarning, warningDataSet []*pasturePb.WarningDataSet) error {
  342. // 将默认预警数据按 Kind 映射
  343. defaultDataWarningMap := make(map[pasturePb.DataWarningType_Kind]*model.DataWarning)
  344. for _, v := range defaultDataWarning {
  345. defaultDataWarningMap[v.Kind] = v
  346. }
  347. // 在事务中执行新增操作
  348. return s.DB.Transaction(func(tx *gorm.DB) error {
  349. addedKinds := make(map[pasturePb.DataWarningType_Kind]bool) // 记录已添加的 Kind
  350. for _, set := range warningDataSet {
  351. dataWarning := model.NewDataWarning(pastureId, userId, set.Kind, pasturePb.IsShow_Ok, defaultDataWarningMap[set.Kind])
  352. // 如果该 Kind 已添加,跳过
  353. if !addedKinds[set.Kind] {
  354. // 创建新的预警数据
  355. if err := tx.Model(new(model.DataWarning)).
  356. Create(dataWarning).Error; err != nil {
  357. return xerr.WithStack(err)
  358. }
  359. } else {
  360. oldDataWarning := &model.DataWarning{}
  361. if err := tx.Model(new(model.DataWarning)).
  362. Where("user_id = ?", userId).
  363. Where("kind = ?", set.Kind).
  364. First(oldDataWarning).Error; err != nil {
  365. return xerr.WithStack(err)
  366. }
  367. dataWarning.Id = oldDataWarning.Id
  368. }
  369. // 创建预警项数据
  370. if err := tx.Model(new(model.DataWarningItems)).
  371. Create(model.NewDataWarningItems(pastureId, userId, dataWarning, set)).Error; err != nil {
  372. return xerr.WithStack(err)
  373. }
  374. addedKinds[set.Kind] = true
  375. }
  376. return nil
  377. })
  378. }
  379. // 更新用户预警数据
  380. func (s *StoreEntry) updateUserDataWarning(ctx context.Context, pastureId, userId int64, userDataWarningList []*model.DataWarning, warningDataSet []*pasturePb.WarningDataSet) error {
  381. // 将请求数据按 WarningId 和 Id 映射
  382. warningIsShowMap := make(map[int32]*pasturePb.WarningDataSet)
  383. warningItemDataMap := make(map[int32]*pasturePb.WarningDataSet)
  384. for _, set := range warningDataSet {
  385. warningIsShowMap[set.WarningId] = set
  386. warningItemDataMap[set.Id] = set
  387. }
  388. // 获取用户预警项数据
  389. userDataWarningItems, err := s.FindDataWarningItems(ctx, pastureId, userId)
  390. if err != nil {
  391. return xerr.WithStack(err)
  392. }
  393. if len(userDataWarningItems) == 0 {
  394. return xerr.Custom("预警数据有误,请联系管理员!")
  395. }
  396. // 在事务中执行更新操作
  397. return s.DB.Transaction(func(tx *gorm.DB) error {
  398. // 更新预警数据的 IsShow 字段
  399. for _, warning := range userDataWarningList {
  400. if data, ok := warningIsShowMap[int32(warning.Id)]; ok {
  401. if strings.ContainsAny(warning.Name, "0123456789") {
  402. re := regexp.MustCompile(`\d+`)
  403. warning.Name = re.ReplaceAllString(warning.Name, data.Value)
  404. warning.Description = re.ReplaceAllString(warning.Description, data.Value)
  405. }
  406. if err = tx.Model(&model.DataWarning{}).
  407. Where("id = ?", warning.Id).
  408. Updates(map[string]interface{}{
  409. "is_show": data.IsShow,
  410. "name": warning.Name,
  411. "description": warning.Description,
  412. }).Error; err != nil {
  413. return xerr.WithStack(err)
  414. }
  415. }
  416. }
  417. // 更新预警项数据的 IsShow 和 Value 字段
  418. for _, item := range userDataWarningItems {
  419. if set, ok := warningItemDataMap[int32(item.Id)]; ok {
  420. value := set.Value
  421. if set.FieldName == model.FieldName {
  422. v1, _ := strconv.ParseInt(set.Value, 10, 64)
  423. value = fmt.Sprintf("%d", v1*30)
  424. }
  425. if err = tx.Model(&model.DataWarningItems{}).
  426. Where("id = ?", item.Id).
  427. Updates(map[string]interface{}{
  428. "is_show": set.IsShow,
  429. "value": value,
  430. }).Error; err != nil {
  431. return xerr.WithStack(err)
  432. }
  433. }
  434. }
  435. return nil
  436. })
  437. }
  438. func (s *StoreEntry) FindDataWarning(ctx context.Context, pastureId, userId int64) ([]*model.DataWarning, error) {
  439. dataWarningList := make([]*model.DataWarning, 0)
  440. if err := s.DB.Model(new(model.DataWarning)).
  441. Where("user_id = ?", userId).
  442. Where("pasture_id = ?", pastureId).
  443. Find(&dataWarningList).Error; err != nil {
  444. return nil, xerr.WithStack(err)
  445. }
  446. return dataWarningList, nil
  447. }
  448. func (s *StoreEntry) FindDataWarningItems(ctx context.Context, pastureId, userId int64) ([]*model.DataWarningItems, error) {
  449. dataWarningItemsList := make([]*model.DataWarningItems, 0)
  450. if err := s.DB.Model(new(model.DataWarningItems)).
  451. Where("pasture_id = ?", pastureId).
  452. Where("user_id = ?", userId).
  453. Find(&dataWarningItemsList).Error; err != nil {
  454. return nil, xerr.WithStack(err)
  455. }
  456. return dataWarningItemsList, nil
  457. }
  458. func (s *StoreEntry) FindDataWarningMap(ctx context.Context, pastureId, userId int64) (map[int64]*model.DataWarning, error) {
  459. dataWarning, err := s.FindDataWarning(ctx, pastureId, userId)
  460. if err != nil {
  461. return nil, xerr.Custom("默认预警数据有误,请联系管理员!")
  462. }
  463. dataWarningMap := make(map[int64]*model.DataWarning)
  464. for _, v := range dataWarning {
  465. dataWarningMap[v.Id] = v
  466. }
  467. return dataWarningMap, nil
  468. }
  469. func (s *StoreEntry) FindDataWarningItemsMap(ctx context.Context, userId int64) (map[int64]*model.DataWarningItems, error) {
  470. dataWarningItemsList := make([]*model.DataWarningItems, 0)
  471. if err := s.DB.Model(new(model.DataWarningItems)).
  472. Where("user_id = ?", userId).
  473. Find(&dataWarningItemsList).Error; err != nil {
  474. return nil, xerr.WithStack(err)
  475. }
  476. dataWarningItemsMap := make(map[int64]*model.DataWarningItems)
  477. for _, v := range dataWarningItemsList {
  478. dataWarningItemsMap[v.Id] = v
  479. }
  480. return dataWarningItemsMap, nil
  481. }
  482. // UpdateWarningData 更新计算数据
  483. func (s *StoreEntry) UpdateWarningData(ctx context.Context, pastureId int64, needUpdateWarningIds []int64) {
  484. if len(needUpdateWarningIds) <= 0 {
  485. return
  486. }
  487. for _, warningId := range needUpdateWarningIds {
  488. query, params, err := s.BuildQuery(warningId)
  489. if err != nil {
  490. zaplog.Error("UpdateWarningData", zap.Any("BuildQuery", err), zap.Any("warningId", warningId))
  491. }
  492. if len(query) == 0 || len(params) == 0 {
  493. continue
  494. }
  495. zaplog.Info("UpdateWarningData", zap.Any("query", query), zap.Any("params", params))
  496. var count int64
  497. if err = s.DB.Model(new(model.Cow)).
  498. Where("pasture_id = ?", pastureId).
  499. Where(query, params...).
  500. Count(&count).Error; err != nil {
  501. zaplog.Error("UpdateWarningData", zap.Any("err", err), zap.Any("query", query), zap.Any("params", params))
  502. }
  503. if err = s.DB.Model(new(model.DataWarning)).
  504. Where("id = ?", warningId).
  505. Updates(map[string]interface{}{
  506. "data_value": count,
  507. "data_update_at": time.Now().Local().Unix(),
  508. }).Error; err != nil {
  509. zaplog.Error("UpdateWarningData", zap.Any("update", err))
  510. }
  511. }
  512. }