neck_ring.go 17 KB

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