crontab.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package crontab
  2. import (
  3. "context"
  4. "errors"
  5. "kpt-pasture/model"
  6. "kpt-pasture/util"
  7. "time"
  8. "gorm.io/gorm"
  9. "gitee.com/xuyiping_admin/pkg/xerr"
  10. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  11. "go.uber.org/zap"
  12. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  13. )
  14. // UpdateCowInfo 牛只基本信息维护
  15. func (e *Entry) UpdateCowInfo() error {
  16. cowList := make([]*model.Cow, 0)
  17. if err := e.DB.Where("is_remove = ?", pasturePb.IsShow_Ok).Find(&cowList).Error; err != nil {
  18. return err
  19. }
  20. for _, cow := range cowList {
  21. dayAge := cow.GetDayAge()
  22. calvingAge := cow.GetCalvingAge()
  23. pregnancyAge := cow.GetDaysPregnant()
  24. admissionAge := cow.GetAdmissionAge()
  25. if err := e.DB.Where("id = ?", cow.Id).Updates(map[string]interface{}{
  26. "day_age": dayAge,
  27. "calving_at": calvingAge,
  28. "pregnancy_age": pregnancyAge,
  29. "admission_age": admissionAge,
  30. }).Error; err != nil {
  31. zaplog.Error("Crontab", zap.Any("UpdateCowDayAge", err))
  32. }
  33. }
  34. return nil
  35. }
  36. // GenerateAsynqWorkOrder 异步生成工作单
  37. func (e *Entry) GenerateAsynqWorkOrder() error {
  38. workOrderList := make([]*model.WorkOrderMaster, 0)
  39. if err := e.DB.Where("is_show = ?", pasturePb.IsShow_Ok).Find(&workOrderList).Error; err != nil {
  40. return err
  41. }
  42. for _, workOrder := range workOrderList {
  43. timeUnix, err := util.ConvertParseLocalUnix(workOrder.ExecTime)
  44. if timeUnix <= 0 || err != nil {
  45. zaplog.Error("crontab", zap.Any("GenerateWorkOrder", err), zap.Any("execTime", workOrder.ExecTime))
  46. continue
  47. }
  48. execTime := time.Now().Unix() - timeUnix
  49. if _, err = e.AsynqClient.CtxEnqueue(
  50. context.Background(),
  51. model.NewTaskWorkOrderPayload(workOrder.Id, time.Duration(execTime)*time.Second),
  52. ); err != nil {
  53. zaplog.Error("PushMessage CtxEnqueue", zap.Any("Err", err))
  54. }
  55. }
  56. return nil
  57. }
  58. // ImmunizationPlan 免疫计划,生成工作单
  59. func (e *Entry) ImmunizationPlan() error {
  60. planList := make([]*model.ImmunizationPlan, 0)
  61. if err := e.DB.Where("is_show = ?", pasturePb.IsShow_Ok).Find(&planList).Error; err != nil {
  62. return xerr.WithStack(err)
  63. }
  64. for _, plan := range planList {
  65. cowList := make([]*model.Cow, 0)
  66. pref := e.DB.Select("id").Where("is_remove = ?", pasturePb.IsShow_Ok).
  67. Where("cow_type = ?", plan.CowType)
  68. switch plan.Conditions {
  69. case pasturePb.ImmunizationConditions_Days_Age:
  70. pref.Where("day_age >= ?", plan.Value).
  71. Where("day_age <= ?", plan.Value2)
  72. case pasturePb.ImmunizationConditions_Days_After_Delivery:
  73. pref.Where("calving_age >= ?", plan.Value).
  74. Where("calving_age <= ?", plan.Value2)
  75. case pasturePb.ImmunizationConditions_Days_Of_Pregnancy:
  76. pref.Where("pregnancy_age >= ?", plan.Value).
  77. Where("pregnancy_age <= ?", plan.Value2).
  78. Where("is_pregnant = ?", pasturePb.IsShow_Ok)
  79. case pasturePb.ImmunizationConditions_Month:
  80. // todo 待实现月份
  81. case pasturePb.ImmunizationConditions_Admission_Days:
  82. pref.Where("admission_age >= ?", plan.Value).
  83. Where("admission_age <= ?", plan.Value2)
  84. }
  85. if err := pref.Find(&cowList).Error; err != nil {
  86. return xerr.WithStack(err)
  87. }
  88. if len(cowList) <= 0 {
  89. continue
  90. }
  91. if err := e.GenerateCalendarByImmunization(cowList, plan.Name); err != nil {
  92. zaplog.Error("crontab", zap.Any("GenerateWorkOrderCalendar", err), zap.Any("cowList", cowList))
  93. }
  94. }
  95. return nil
  96. }
  97. // SameTimePlan 同期计划,生成工作单
  98. func (e *Entry) SameTimePlan() error {
  99. sameTimeList := make([]*model.SameTime, 0)
  100. if err := e.DB.Where("is_show = ?", pasturePb.IsShow_Ok).Find(&sameTimeList).Error; err != nil {
  101. return xerr.WithStack(err)
  102. }
  103. cowSameTimeList := make([]*model.SameTimeCow, 0)
  104. if err := e.DB.Select("cow_id").Where("status = ?", pasturePb.IsShow_Ok).Find(&cowSameTimeList).Error; err != nil {
  105. if !errors.Is(err, gorm.ErrRecordNotFound) {
  106. return xerr.WithStack(err)
  107. }
  108. }
  109. cowIds := make([]int64, 0)
  110. if len(cowSameTimeList) > 0 {
  111. for _, cowSameTime := range cowSameTimeList {
  112. cowIds = append(cowIds, cowSameTime.CowId)
  113. }
  114. }
  115. for _, plan := range sameTimeList {
  116. cowList := make([]*model.Cow, 0)
  117. pref := e.DB.Select("id").
  118. Where("is_remove = ?", pasturePb.IsShow_Ok).
  119. Where("is_pregnant = ?", pasturePb.IsShow_No).
  120. Where("calving_age >= ?", plan.PostpartumDaysStart).
  121. Where("calving_age <= ?", plan.PostpartumDaysEnd)
  122. if len(cowIds) > 0 {
  123. pref.Where("id NOT IN ?", cowIds)
  124. }
  125. if err := pref.Find(&cowList); err != nil {
  126. zaplog.Error("crontab", zap.Any("SameTimePlan", err), zap.Any("plan", plan))
  127. continue
  128. }
  129. if len(cowList) <= 0 {
  130. continue
  131. }
  132. if err := e.GenerateCalendarBySameTimePlan(cowList, plan); err != nil {
  133. zaplog.Error("crontab", zap.Any("GenerateCalendarBySameTimePlan", err), zap.Any("cowList", cowList), zap.Any("plan", plan))
  134. continue
  135. }
  136. }
  137. return nil
  138. }
  139. func (e *Entry) GenerateCalendarByImmunization(cowList []*model.Cow, name string) error {
  140. workOrderCalendarList := e.getWorkOrderCalendar(name)
  141. newCowList := make([]*model.Cow, 0)
  142. if len(workOrderCalendarList) > 0 {
  143. // 过滤已经存在的牛只数据,避免重复生成工作单
  144. calendarIds := make([]int64, 0)
  145. if err := e.DB.Model(&model.WorkOrderCalendar{}).Select("id").
  146. Where("name = ?", name).
  147. Where("is_show = ?", pasturePb.IsShow_Ok).
  148. Order("id DESC").
  149. Limit(100). // todo 默认取100条数据
  150. Find(&calendarIds).Error; err != nil {
  151. return xerr.WithStack(err)
  152. }
  153. workOrderList := make([]*model.WorkOrderList, 0)
  154. if err := e.DB.Where("calendar_id IN ?", calendarIds).
  155. Where("is_show = ?", pasturePb.IsShow_Ok).
  156. Where("is_completion = ?", pasturePb.IsShow_No).
  157. Find(&workOrderList).Error; err != nil {
  158. return xerr.WithStack(err)
  159. }
  160. if len(workOrderList) > 0 {
  161. for _, cow := range cowList {
  162. for _, workOrder := range workOrderList {
  163. if workOrder.CowId == cow.Id {
  164. continue
  165. }
  166. }
  167. newCowList = append(newCowList, cow)
  168. }
  169. }
  170. }
  171. count := len(newCowList)
  172. if err := e.DB.Transaction(func(tx *gorm.DB) error {
  173. newWorkOrderCalendar := model.NewWorkOrderCalendar(name, int32(count))
  174. if err := tx.Create(newWorkOrderCalendar).Error; err != nil {
  175. return xerr.WithStack(err)
  176. }
  177. newWorkOrderList := make([]*model.WorkOrderList, 0)
  178. for _, cow := range newCowList {
  179. newWorkOrderList = append(newWorkOrderList, model.NewWorkOrderList(name, newWorkOrderCalendar.Id, cow.Id))
  180. }
  181. if err := tx.Create(newWorkOrderList).Error; err != nil {
  182. return xerr.WithStack(err)
  183. }
  184. return nil
  185. }); err != nil {
  186. return xerr.WithStack(err)
  187. }
  188. return nil
  189. }
  190. func (e *Entry) GenerateCalendarBySameTimePlan(cowList []*model.Cow, sameTime *model.SameTime) error {
  191. if len(cowList) <= 0 {
  192. return nil
  193. }
  194. cowSameTimeList := make([]*model.SameTimeCow, 0)
  195. for _, cow := range cowList {
  196. cowSameTimeList = append(cowSameTimeList, &model.SameTimeCow{
  197. CowId: cow.Id,
  198. SameTimeId: sameTime.Id,
  199. Status: pasturePb.IsShow_Ok,
  200. StartAt: time.Now().Unix(),
  201. EndAt: 0,
  202. })
  203. }
  204. if err := e.DB.Create(cowSameTimeList).Error; err != nil {
  205. return xerr.WithStack(err)
  206. }
  207. return nil
  208. }
  209. func (e *Entry) getWorkOrderCalendar(name string) []*model.WorkOrderCalendar {
  210. res := make([]*model.WorkOrderCalendar, 0)
  211. if err := e.DB.Where("name = ?", name).
  212. Where("is_show = ?", pasturePb.IsShow_Ok).
  213. Find(&res).Error; err != nil {
  214. zaplog.Error("getWorkOrderCalendar", zap.Any("err", err))
  215. }
  216. return res
  217. }