neck_ring_habit.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. package mqtt
  2. import (
  3. "fmt"
  4. "kpt-pasture/model"
  5. "kpt-pasture/module/crontab"
  6. "math"
  7. "time"
  8. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  9. "go.uber.org/zap"
  10. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  11. "gitee.com/xuyiping_admin/pkg/xerr"
  12. )
  13. const (
  14. MinChangeFilter = -99
  15. MinRuminaFilter = -99
  16. MinChewFilter = -99
  17. MinChangeHigh = -99
  18. DefaultNb = 30
  19. )
  20. func (e *Entry) PastureUpdateActiveHabit() {
  21. pastureList := e.FindPastureList()
  22. if pastureList == nil || len(pastureList) == 0 {
  23. return
  24. }
  25. for _, pasture := range pastureList {
  26. if err := e.EntryUpdateActiveHabit(pasture.Id); err != nil {
  27. zaplog.Error("PastureUpdateActiveHabit", zap.Any("PastureUpdateActiveHabit", err), zap.Any("pasture", pasture))
  28. }
  29. zaplog.Info(fmt.Sprintf("PastureUpdateActiveHabit Success %d", pasture.Id))
  30. }
  31. }
  32. func (e *Entry) EntryUpdateActiveHabit(pastureId int64) (err error) {
  33. lastMaxHabitData, err := e.GetSystemConfigure2(pastureId, model.MaxHabit)
  34. if err != nil {
  35. return xerr.WithStack(err)
  36. }
  37. lastMaxHabitId := lastMaxHabitData.Value
  38. currentMaxHabit := &model.NeckActiveHabit{}
  39. if err = e.DB.Model(currentMaxHabit).
  40. Where("id > ?", lastMaxHabitId).
  41. Order("id desc").First(currentMaxHabit).Error; err != nil {
  42. return xerr.WithStack(err)
  43. }
  44. // 本次执行<=上次执行的id,则不执行
  45. if currentMaxHabit.Id < lastMaxHabitId {
  46. return nil
  47. }
  48. // 统一更新is_max_time为0
  49. if err = e.DB.Model(new(model.NeckActiveHabit)).
  50. Where("is_max_time = ?", pasturePb.IsShow_Ok).
  51. Where("heat_date > ?", time.Now().AddDate(0, 0, -10).Format(model.LayoutDate2)).
  52. Update("is_max_time", pasturePb.IsShow_No).Error; err != nil {
  53. return xerr.WithStack(err)
  54. }
  55. // 获取这段执行数据内最大日期和最小日期
  56. xToday := &crontab.XToday{}
  57. if err = e.DB.Model(new(model.NeckActiveHabit)).
  58. Select(`MIN(heat_date) as x_beg_date, MAX(heat_date) as x_end_date`).
  59. Where("id BETWEEN ? AND ?", lastMaxHabitId, currentMaxHabit.Id).
  60. First(xToday).Error; err != nil {
  61. return xerr.WithStack(err)
  62. }
  63. xToday.LastMaxHabitId = lastMaxHabitId
  64. xToday.CurrMaxHabitId = currentMaxHabit.Id
  65. minHeatDateParse, err := time.Parse(model.LayoutDate2, xToday.XBegDate)
  66. if err != nil {
  67. return xerr.WithStack(err)
  68. }
  69. xBefore2Day := minHeatDateParse.AddDate(0, 0, -1).Format(model.LayoutDate2)
  70. xBefore7Day := minHeatDateParse.AddDate(0, 0, -7).Format(model.LayoutDate2)
  71. xMin2Id, err := e.GetMinIdByHeatDate(xBefore2Day, xToday.LastMaxHabitId)
  72. if err != nil {
  73. return xerr.WithStack(err)
  74. }
  75. xMin7Id, err := e.GetMinIdByHeatDate(xBefore7Day, xToday.LastMaxHabitId)
  76. if err != nil {
  77. return xerr.WithStack(err)
  78. }
  79. defer func() {
  80. // 更新最后一次执行的id值
  81. if err == nil {
  82. e.DB.Model(new(model.SystemConfigure)).
  83. Where("name = ?", model.MaxHabit).
  84. Where("pasture_id = ?", pastureId).
  85. Update("value", currentMaxHabit.Id)
  86. }
  87. }()
  88. xToday.XMin2Id = xMin2Id
  89. xToday.XMin7Id = xMin7Id
  90. // id到上一次执行结果并且heat_date > 7天之前的最大牛只id置为is_max_time=1
  91. maxHabitIdArray := make([]*model.MaxHabitIdModel, 0)
  92. if err = e.DB.Model(new(model.NeckActiveHabit)).
  93. Select("Max(id) as id").
  94. Where("change_filter > ?", model.DefaultChangeFilter).
  95. Where("heat_date > ?", xBefore7Day).
  96. Group("neck_ring_number").
  97. Find(&maxHabitIdArray).Error; err != nil {
  98. return xerr.WithStack(err)
  99. }
  100. if len(maxHabitIdArray) > 0 {
  101. maxHabitIds := make([]int64, 0)
  102. for _, v := range maxHabitIdArray {
  103. maxHabitIds = append(maxHabitIds, v.Id)
  104. }
  105. if err = e.DB.Model(new(model.NeckActiveHabit).TableName()).
  106. Where("id IN (?)", maxHabitIds).
  107. Update("is_max_time", pasturePb.IsShow_Ok).Error; err != nil {
  108. return xerr.WithStack(err)
  109. }
  110. }
  111. activeLowest, err := e.GetSystemConfigure2(pastureId, model.ActiveLowest)
  112. if err != nil {
  113. return xerr.WithStack(err)
  114. }
  115. ruminaLowest, err := e.GetSystemConfigure2(pastureId, model.RuminaLowest)
  116. if err != nil {
  117. return xerr.WithStack(err)
  118. }
  119. xToday.ActiveLowest = activeLowest.Value
  120. xToday.RuminaLowest = ruminaLowest.Value
  121. // 更新活动滤波
  122. if err = e.FilterUpdate(pastureId, xToday); err != nil {
  123. zaplog.Error("EntryUpdateActiveHabit", zap.Any("FilterUpdate", err), zap.Any("xToday", xToday))
  124. return xerr.WithStack(err)
  125. }
  126. // 更新周平均值
  127. if err = e.WeeklyActiveAvgUpdate(pastureId, xToday); err != nil {
  128. zaplog.Error("EntryUpdateActiveHabit", zap.Any("WeeklyActiveAvgUpdate", err), zap.Any("xToday", xToday))
  129. return xerr.WithStack(err)
  130. }
  131. if err = e.ActivityVolumeChanges(pastureId, xToday); err != nil {
  132. zaplog.Error("EntryUpdateActiveHabit", zap.Any("ActivityVolumeChanges", err), zap.Any("xToday", xToday))
  133. return xerr.WithStack(err)
  134. }
  135. return nil
  136. }
  137. // FilterUpdate 更新活动滤波
  138. func (e *Entry) FilterUpdate(pastureId int64, xToDay *crontab.XToday) error {
  139. newNeckActiveHabitList := make([]*model.NeckActiveHabit, 0)
  140. if err := e.DB.Model(new(model.NeckActiveHabit)).
  141. Where("pasture_id = ?", pastureId).
  142. Where(e.DB.Where("change_filter = ?", model.InitChangeFilter).Or("is_max_time = ?", pasturePb.IsShow_Ok)).
  143. Where(e.DB.Where("high >= ?", xToDay.ActiveLowest).Or("rumina >= ?", xToDay.RuminaLowest)).
  144. Order("neck_ring_number,id").
  145. Find(&newNeckActiveHabitList).Error; err != nil {
  146. return xerr.WithStack(err)
  147. }
  148. var filterValues = make(map[string]*model.NeckActiveHabit)
  149. // 活动量滤波
  150. for _, v := range newNeckActiveHabitList {
  151. prev, ok := filterValues[v.NeckRingNumber]
  152. if !ok {
  153. if v.FilterHigh <= 0 {
  154. v.FilterHigh = v.High
  155. }
  156. if v.FilterRumina <= 0 {
  157. v.FilterRumina = v.Rumina
  158. }
  159. if v.FilterChew <= 0 {
  160. v.FilterChew = v.Rumina + v.Intake
  161. }
  162. filterValues[v.NeckRingNumber] = v
  163. continue
  164. }
  165. if v.FilterHigh <= 0 {
  166. v.FilterHigh = int32(computeIfPositiveElse(float64(v.High), float64(prev.FilterHigh), 0.23, 0.77))
  167. }
  168. if v.FilterRumina <= 0 {
  169. v.FilterRumina = int32(computeIfPositiveElse(float64(v.Rumina), float64(prev.FilterRumina), 0.33, 0.67))
  170. }
  171. if v.FilterChew <= 0 {
  172. v.FilterChew = int32(computeIfPositiveElse(float64(v.Rumina+v.Intake), float64(prev.FilterChew), 0.33, 0.67))
  173. }
  174. // 更新过滤值
  175. filterValues[v.NeckRingNumber] = v
  176. if err := e.DB.Model(new(model.NeckActiveHabit)).
  177. Select("filter_high", "filter_rumina", "filter_chew").
  178. Where("id = ?", v.Id).
  179. Updates(v).Error; err != nil {
  180. return xerr.WithStack(err)
  181. }
  182. }
  183. zaplog.Info("EntryUpdateActiveHabit-FilterUpdate-Success")
  184. return nil
  185. }
  186. func (e *Entry) WeeklyActiveAvgUpdate(pastureId int64, xToday *crontab.XToday) error {
  187. beginDayDate, err := time.Parse(model.LayoutDate2, xToday.XBegDate)
  188. if err != nil {
  189. return xerr.WithStack(err)
  190. }
  191. before7DayDate := beginDayDate.AddDate(0, 0, -7).Format(model.LayoutDate2)
  192. before1DayDate := beginDayDate.AddDate(0, 0, -1).Format(model.LayoutDate2)
  193. weeklyActive, err := e.GetSystemConfigure2(pastureId, model.WeeklyActive)
  194. if err != nil {
  195. return xerr.WithStack(err)
  196. }
  197. xframeId := int64(0)
  198. maxXframeId := int64(11)
  199. xStartDate, _ := time.Parse(model.LayoutDate2, xToday.XBegDate)
  200. xEndDate, _ := time.Parse(model.LayoutDate2, xToday.XEndDate)
  201. for xStartDate.Format(model.LayoutDate2) < xEndDate.Format(model.LayoutDate2) || (xStartDate == xEndDate && xframeId <= maxXframeId) {
  202. // 时间点周平均
  203. AvgHabitList := make([]*crontab.AvgHabit, 0)
  204. if err = e.DB.Model(new(model.NeckActiveHabit)).
  205. Select("neck_ring_number").
  206. Select("IF(COUNT(1)>=3, ROUND((SUM(filter_high) -MIN(filter_high) -MAX(filter_high))/ABS(COUNT(1) -2),0), -1) as avg_high_habit").
  207. Select("IF(COUNT(1)>=3, ROUND((SUM(filter_rumina) -MIN(filter_rumina) -MAX(filter_rumina))/ABS(COUNT(1) -2),0), -1) as avg_rumina_habit").
  208. Select("IF(COUNT(1)>=3, ROUND((SUM(filter_chew) -MIN(filter_chew) -MAX(filter_chew))/ABS(COUNT(1) -2),0), -1) as avg_chew_habit").
  209. Select("ROUND(AVG(intake),0) as avg_intake_habit").
  210. Select("ROUND(AVG(inactive),0) as avg_inactive_habit").
  211. Where("id BETWEEN ? AND ?", xToday.XMin7Id, xToday.CurrMaxHabitId).
  212. Where("heat_date BETWEEN ? AND ?", before7DayDate, before1DayDate).
  213. Where("frameid = ?", xframeId).
  214. Where("pasture_id = ?", pastureId).
  215. Where("change_filter = ?", model.InitChangeFilter).
  216. Where(e.DB.Where("high > ?", xToday.ActiveLowest).Or("rumina > ?", xToday.RuminaLowest)).
  217. Group("neck_ring_number").
  218. Find(&AvgHabitList).Error; err != nil {
  219. return xerr.WithStack(err)
  220. }
  221. for _, v := range AvgHabitList {
  222. if err = e.DB.Model(new(model.NeckActiveHabit)).
  223. Select("avg_high_habit", "avg_rumina_habit", "avg_chew_habit", "avg_intake_habit", "avg_inactive_habit").
  224. Where("neck_ring_number = ?", v.NeckRingNumber).
  225. Where("id BETWEEN ? AND ?", xToday.LastMaxHabitId, xToday.CurrMaxHabitId).
  226. Where("frameid = ?", xframeId).
  227. Where("change_filter = ?", model.InitChangeFilter).
  228. Where("heat_date = ?", xStartDate).
  229. Updates(v).Error; err != nil {
  230. return xerr.WithStack(err)
  231. }
  232. }
  233. // 累计24小时数值
  234. sumHabitList := make([]*crontab.SumHabit, 0)
  235. if err = e.DB.Model(new(model.NeckActiveHabit)).
  236. Select("neck_ring_number").
  237. Select("IF(COUNT(1)>6, ROUND(AVG( h2.filter_rumina)*12,0), 0) as sum_rumina").
  238. Select("IF(COUNT(1)>6, ROUND(AVG( h2.intake)*12,0), 0) as sum_intake").
  239. Select("IF(COUNT(1)>6, ROUND(AVG( h2.inactive)*12,0), 0) as sum_inactive").
  240. Select("IF(COUNT(1)>6, ROUND(AVG( h2.active)*12,0), 0) as sum_active").
  241. Select("MAX(h2.change_filter) as sum_max_high").
  242. Select("MIN(IF(change_filter > ?, change_filter, 0)) as sum_min_high", MinChangeFilter).
  243. Select("MIN( CASE WHEN filter_chew > ? THEN filter_chew WHEN filter_rumina >= ? THEN filter_rumina ELSE 0 END) as sum_min_chew", MinChangeFilter, MinRuminaFilter).
  244. Where("id BETWEEN ? AND ?", xToday.XMin2Id, xToday.CurrMaxHabitId).
  245. Where("pasture_id = ?", pastureId).
  246. Where("heat_date BETWEEN ? AND ?", xStartDate.AddDate(0, 0, -1).Format(model.LayoutDate2), xStartDate.Format(model.LayoutDate2)).
  247. Where("created_at BETWEEN ? AND ?", xStartDate.Add(-23*time.Hour).Unix(), xStartDate.Unix()).
  248. Where(e.DB.Where("high > ?", xToday.ActiveLowest).Or("rumina >= ?", xToday.RuminaLowest)).
  249. Group("neck_ring_number").
  250. Find(&sumHabitList).Error; err != nil {
  251. return xerr.WithStack(err)
  252. }
  253. for _, v := range sumHabitList {
  254. if err = e.DB.Model(new(model.NeckActiveHabit)).
  255. Select("sum_rumina", "sum_intake", "sum_inactive", "sum_active", "sum_max_high", "sum_min_high", "sum_min_chew").
  256. Where("neck_ring_number = ?", v.NeckRingNumber).
  257. Where("id BETWEEN ? AND ?", xToday.LastMaxHabitId, xToday.CurrMaxHabitId).
  258. Where("heat_date = ?", xStartDate.Format(model.LayoutDate2)).
  259. Where("frameid = ?", xframeId).
  260. Where("change_filter = ?", model.InitChangeFilter).
  261. Updates(v).Error; err != nil {
  262. return xerr.WithStack(err)
  263. }
  264. }
  265. // 变化百分比
  266. changeHabitList := make([]*model.NeckActiveHabit, 0)
  267. if err = e.DB.Model(new(model.NeckActiveHabit)).
  268. Where("id BETWEEN ? AND ?", xToday.LastMaxHabitId, xToday.CurrMaxHabitId).
  269. Where("heat_date = ?", xStartDate.Format(model.LayoutDate2)).
  270. Where("frameid = ?", xframeId).
  271. Where("pasture_id = ?", pastureId).
  272. Where("change_filter = ?", model.InitChangeFilter).
  273. Where("avg_high_habit > ?", 0).
  274. Where(e.DB.Where("high > ?", xToday.ActiveLowest).Or("rumina >= ?", xToday.RuminaLowest)).
  275. Find(&changeHabitList).Error; err != nil {
  276. return xerr.WithStack(err)
  277. }
  278. for _, v := range changeHabitList {
  279. if v.FilterHigh-v.AvgHighHabit > 0 {
  280. v.ChangeHigh = (v.FilterHigh - v.AvgHighHabit) / int32(float64(v.WeekHigh)*0.6+float64(v.AvgHighHabit)*0.2+float64(weeklyActive.Value)*0.2)
  281. } else {
  282. v.ChangeHigh = v.FilterHigh - v.AvgHighHabit/v.AvgHighHabit*100
  283. }
  284. v.ChangeRumina = v.RuminaFilter - v.AvgRuminaHabit/v.AvgHighHabit*100
  285. v.ChangeChew = v.FilterChew - v.AvgChewHabit/v.AvgHighHabit*100
  286. if err = e.DB.Model(new(model.NeckActiveHabit)).
  287. Select("change_high", "change_rumina", "change_chew").
  288. Where("id = ?", v.Id).
  289. Updates(v).Error; err != nil {
  290. return xerr.WithStack(err)
  291. }
  292. }
  293. if xframeId == maxXframeId {
  294. xframeId = 0
  295. xStartDate = xStartDate.AddDate(0, 0, 1)
  296. } else {
  297. xframeId++
  298. }
  299. }
  300. zaplog.Info("EntryUpdateActiveHabit-WeeklyActiveAvgUpdate-Success")
  301. return nil
  302. }
  303. // UpdateChangeFilter 变化趋势滤波
  304. func (e *Entry) UpdateChangeFilter(pastureId int64, xToday *crontab.XToday) (err error) {
  305. xRuminaDisc, err := e.GetSystemConfigure2(pastureId, model.XRuminaDisc)
  306. if err != nil {
  307. return err
  308. }
  309. xChangeDiscount, err := e.GetSystemConfigure2(pastureId, model.XChangeDiscount)
  310. if err != nil {
  311. return err
  312. }
  313. newChangeFilterList := make([]*crontab.ChangeFilterData, 0)
  314. if err = e.DB.Model(new(model.NeckActiveHabit)).
  315. Select("id,neck_ring_number,change_high,change_filter,rumina_filter,change_rumina,chew_filter,change_chew").
  316. Select("IF(lact=0,0.8,1) as xlc_dis_count").
  317. Where("id BETWEEN ? AND ?", xToday.XMin2Id, xToday.CurrMaxHabitId).
  318. Where("pasture_id = ?", pastureId).
  319. Where(e.DB.Where("change_filter = ?", model.InitChangeFilter).Or("is_max_time = ?", pasturePb.IsShow_Ok)).
  320. Where("change_high > ?", MinChangeHigh).
  321. Order("neck_ring_number,heat_date,frameid").
  322. Find(&newChangeFilterList).Error; err != nil {
  323. return xerr.WithStack(err)
  324. }
  325. var filterValues = make(map[string]*crontab.ChangeFilterData)
  326. for _, v := range newChangeFilterList {
  327. prev, ok := filterValues[v.NeckRingNumber]
  328. if v.ChangeFilter <= MinChangeFilter {
  329. prefChangeFilter := int32(0)
  330. if ok {
  331. prefChangeFilter = prev.ChangeFilter
  332. }
  333. leastValue := v.HighChange
  334. if prefChangeFilter < v.HighChange {
  335. leastValue = prefChangeFilter
  336. }
  337. v.ChangeFilter = int32(float64(prefChangeFilter)*(1-(float64(xChangeDiscount.Value)/10)*v.XlcDisCount) +
  338. float64(leastValue)*(float64(xChangeDiscount.Value)/10)*v.XlcDisCount)
  339. }
  340. if v.RuminaFilter <= MinChangeFilter {
  341. prefRuminaFilter := int32(0)
  342. if ok {
  343. prefRuminaFilter = prev.RuminaFilter
  344. }
  345. factor := float64(1)
  346. if math.Abs(float64(v.ChangeRumina)) > 60 {
  347. factor = 0.5
  348. }
  349. v.RuminaFilter = int32(float64(prefRuminaFilter)*(1-float64(xRuminaDisc.Value/10)*v.XlcDisCount*factor) +
  350. float64(v.ChangeRumina)*float64(xRuminaDisc.Value)/10*v.XlcDisCount*factor)
  351. }
  352. if v.RuminaFilter > 50 {
  353. v.RuminaFilter = 50
  354. }
  355. if v.ChewFilter <= MinChangeFilter {
  356. prefChewFilter := int32(0)
  357. if ok {
  358. prefChewFilter = prev.ChewFilter
  359. }
  360. factor := float64(1)
  361. if math.Abs(float64(v.ChangeChew)) > 60 {
  362. factor = 0.5
  363. }
  364. v.ChewFilter = int32(float64(prefChewFilter)*(1-float64(xRuminaDisc.Value)/10*factor) +
  365. float64(v.ChangeChew)*float64(xRuminaDisc.Value)/10*factor)
  366. }
  367. if v.ChewFilter > 50 {
  368. v.ChangeChew = 50
  369. }
  370. if err = e.DB.Model(new(model.NeckActiveHabit)).
  371. Select("change_filter", "rumina_filter", "chew_filter").
  372. Where("id = ?", v.Id).
  373. Where("neck_ring_number = ?", v.NeckRingNumber).
  374. Where("change_filter = ?", model.InitChangeFilter).
  375. Updates(v).Error; err != nil {
  376. return xerr.WithStack(err)
  377. }
  378. filterValues[v.NeckRingNumber] = v
  379. }
  380. return nil
  381. }
  382. // ActivityVolumeChanges 计算活动量变化趋势校正值(活跃度校正)
  383. func (e *Entry) ActivityVolumeChanges(pastureId int64, xToday *crontab.XToday) error {
  384. currDate, _ := time.Parse(model.LayoutDate2, xToday.XBegDate)
  385. XEndDateTime, _ := time.Parse(model.LayoutDate2, xToday.XEndDate)
  386. xframeId := int64(0)
  387. maxXframeId := int64(11)
  388. dayTimes := int64(1)
  389. for currDate.Format(model.LayoutDate2) < XEndDateTime.Format(model.LayoutDate2) || (currDate == XEndDateTime && xframeId <= maxXframeId) {
  390. activityVolumeList := make([]*crontab.ActivityVolume, 0)
  391. activeTime := fmt.Sprintf("%s %02d:00:00", currDate.Format(model.LayoutDate2), xframeId*2)
  392. activeTimeParse, err := time.Parse(model.LayoutTime, activeTime)
  393. if err != nil {
  394. return xerr.WithStack(err)
  395. }
  396. if dayTimes == 1 {
  397. if err = e.DB.Model(new(model.NeckActiveHabit)).
  398. Select("neck_ring_number").
  399. Select("AVG(IF(change_filter>=60, 60, change_filter)) as avg_filter").
  400. Select("ROUND(STD(IF(change_filter>=60, 60, change_filter))) as std_filter").
  401. Select("COUNT(1) as nb").
  402. Where("id BETWEEN ? AND ?", xToday.XMin7Id, xToday.CurrMaxHabitId).
  403. Where("heat_date BETWEEN ? AND ?", currDate.AddDate(0, 0, -7).Format(model.LayoutDate2), currDate.AddDate(0, 0, -1).Format(model.LayoutDate2)).
  404. Where("frameid = ?", xframeId).
  405. Where("pasture_id = ?", pastureId).
  406. Where(e.DB.Where("high > ?", xToday.ActiveLowest).Or("rumina >= ?", xToday.RuminaLowest)).
  407. Where("active_time <= ?", activeTimeParse.Add(-12*time.Hour)).
  408. Where("change_filter > ?", MinChangeFilter).
  409. Having("nb > ?", DefaultNb).
  410. Group("neck_ring_number").
  411. Find(&activityVolumeList).Error; err != nil {
  412. return xerr.WithStack(err)
  413. }
  414. }
  415. for _, v := range activityVolumeList {
  416. filterCorrect := model.DefaultFilterCorrect - int(math.Floor(float64(v.AvgFilter)/3+float64(v.StdFilter)/2))
  417. if err = e.DB.Model(new(model.NeckActiveHabit)).
  418. Where("neck_ring_number = ?", v.NeckRingNumber).
  419. Where("id BETWEEN ? AND ?", xToday.LastMaxHabitId, xToday.CurrMaxHabitId).
  420. Where("frameid = ?", xframeId).
  421. Where("head_date = ?", currDate.Format(model.LayoutDate2)).
  422. Update("filter_correct", filterCorrect).Error; err != nil {
  423. return xerr.WithStack(err)
  424. }
  425. }
  426. /*n := 0
  427. if n <= 10 {
  428. // todo
  429. n += 2
  430. }*/
  431. zaplog.Info("ActivityVolumeChanges",
  432. zap.Any("xToday", xToday),
  433. zap.Any("currDate", currDate.Format(model.LayoutDate2)),
  434. zap.Any("xframeId", xframeId),
  435. zap.Any("activityVolumeList", activityVolumeList),
  436. )
  437. if err = e.DB.Model(new(model.NeckActiveHabit)).
  438. Where("id BETWEEN ? AND ?", xToday.LastMaxHabitId, xToday.CurrMaxHabitId).
  439. Where("heat_date = ?", currDate.Format(model.LayoutDate2)).
  440. Where("frameid = ?", xframeId).
  441. Where("change_filter = ?", model.InitChangeFilter).
  442. Updates(map[string]interface{}{
  443. "change_filter": MinChangeFilter,
  444. "rumina_filter": MinRuminaFilter,
  445. "chew_filter": MinChewFilter,
  446. "filter_correct": model.DefaultFilterCorrect,
  447. }).Error; err != nil {
  448. return xerr.WithStack(err)
  449. }
  450. if xframeId == maxXframeId {
  451. xframeId = 0
  452. currDate = currDate.AddDate(0, 0, 1)
  453. dayTimes = 1
  454. } else {
  455. xframeId++
  456. dayTimes++
  457. }
  458. /*// 更新评分
  459. newNeckActiveHabitList := make([]*model.NeckActiveHabit, 0)
  460. if err = e.DB.Model(new(model.NeckActiveHabit)).
  461. Where("id BETWEEN ? AND ?", xToday.LastMaxHabitId, xToday.CurrMaxHabitId).
  462. Where("heat_date = ?", currDate.Format(model.LayoutDate2)).
  463. Where("frameid = ?", xframeId).
  464. Where("score = ?", 0).
  465. Find(&newNeckActiveHabitList).Error; err != nil {
  466. return xerr.WithStack(err)
  467. }*/
  468. // todo 待开发
  469. }
  470. zaplog.Info("EntryUpdateActiveHabit-ActivityVolumeChanges-Success")
  471. return nil
  472. }
  473. // 辅助函数来计算过滤值
  474. func computeIfPositiveElse(newValue, prevFilterValue float64, weightPrev, weightNew float64) float64 {
  475. return math.Ceil((prevFilterValue * weightPrev) + (weightNew * newValue))
  476. }