neck_ring_habit.go 17 KB

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