calendar.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. package backend
  2. import (
  3. "context"
  4. "fmt"
  5. "kpt-pasture/model"
  6. "net/http"
  7. "time"
  8. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  9. "gitee.com/xuyiping_admin/pkg/xerr"
  10. )
  11. // CalendarToDoList 获取日历待办列表
  12. func (s *StoreEntry) CalendarToDoList(ctx context.Context, req *pasturePb.CalendarToDoRequest, pagination *pasturePb.PaginationModel) (*pasturePb.CalendarToDoResponse, error) {
  13. currentUser, err := s.GetCurrentSystemUser(ctx)
  14. if err != nil || currentUser.Id <= 0 {
  15. return nil, xerr.WithStack(err)
  16. }
  17. var count int64 = 0
  18. eventItem := make([]*model.EventItem, 0)
  19. pref := s.DB.Model(&model.EventItem{})
  20. if req.StartAt > 0 && req.EndAt > 0 && req.StartAt <= req.EndAt {
  21. pref = pref.Where("plan_day >= ?", req.StartAt).
  22. Where("plan_day <= ?", req.EndAt)
  23. }
  24. if len(req.CowIds) > 0 {
  25. cowList, _ := s.ParseCowIds(ctx, req.CowIds)
  26. cowIds := make([]int64, 0)
  27. for _, cow := range cowList {
  28. cowIds = append(cowIds, cow.Id)
  29. }
  30. if len(cowIds) > 0 {
  31. pref.Where("cow_id IN (?)", cowIds)
  32. }
  33. }
  34. if req.CalendarType > pasturePb.CalendarType_Invalid {
  35. pref.Where("calendar_type = ?", req.CalendarType)
  36. }
  37. if req.IsFinish > 0 {
  38. pref.Where("is_finish = ?", req.IsFinish)
  39. }
  40. if req.IsExpire > 0 {
  41. pref.Where("is_expire = ?", req.IsExpire)
  42. }
  43. if err = pref.Order("id desc").
  44. Count(&count).
  45. Limit(int(pagination.PageSize)).
  46. Offset(int(pagination.PageOffset)).
  47. Find(&eventItem).Error; err != nil {
  48. return nil, xerr.WithStack(err)
  49. }
  50. penMap := s.PenMap(ctx)
  51. calendarMap := CalendarTypeMap()
  52. return &pasturePb.CalendarToDoResponse{
  53. Code: http.StatusOK,
  54. Message: "ok",
  55. Data: &pasturePb.CalendarToDoData{
  56. List: model.EventItemSlice(eventItem).ToPB(penMap, calendarMap),
  57. Total: int32(count),
  58. PageSize: pagination.PageSize,
  59. Page: pagination.Page,
  60. },
  61. }, nil
  62. }
  63. func (s *StoreEntry) CalendarList(ctx context.Context, req *pasturePb.CalendarRequest) (*pasturePb.CalendarResponse, error) {
  64. calendarList := make([]*model.Calendar, 0)
  65. if err := s.DB.Model(&model.Calendar{}).
  66. Where("show_day >= ?", req.ShowStartDay).
  67. Where("show_day <= ?", req.ShowEndDay).
  68. Where("is_show = ?", pasturePb.IsShow_Ok).
  69. Find(&calendarList).Error; err != nil {
  70. return nil, xerr.WithStack(err)
  71. }
  72. return &pasturePb.CalendarResponse{
  73. Code: http.StatusOK,
  74. Message: "ok",
  75. Data: model.CalendarSlice(calendarList).ToPB(),
  76. }, nil
  77. }
  78. func (s *StoreEntry) CalendarTableDetail(
  79. ctx context.Context,
  80. req *pasturePb.CalendarTableRequest,
  81. pagination *pasturePb.PaginationModel,
  82. ) (interface{}, error) {
  83. if req.Start != time.Now().Format(model.LayoutDate2) {
  84. return nil, xerr.New("参数错误")
  85. }
  86. newCalendar := &model.Calendar{}
  87. if err := s.DB.Model(&model.Calendar{}).
  88. Where("calendar_type = ?", req.CalendarType).
  89. Where("show_day = ?", req.Start).
  90. Where("is_show = ?", pasturePb.IsShow_Ok).
  91. First(newCalendar).Error; err != nil {
  92. return nil, xerr.WithStack(err)
  93. }
  94. if newCalendar.Id <= 0 {
  95. return nil, xerr.New("不存在该日历数据")
  96. }
  97. return s.getCalendarCowList(ctx, req.CalendarType, req.Start, pagination)
  98. }
  99. func (s *StoreEntry) getCalendarCowList(
  100. ctx context.Context,
  101. calendarType pasturePb.CalendarType_Kind,
  102. startDate string,
  103. pagination *pasturePb.PaginationModel) (*model.CalendarResponse, error) {
  104. switch calendarType {
  105. case pasturePb.CalendarType_Immunisation: // 免疫
  106. return s.ImmunisationCowList(ctx, startDate, pagination)
  107. case pasturePb.CalendarType_PG, pasturePb.CalendarType_RnGH: // 同期
  108. return s.SameTimeCowList(ctx, startDate, pagination, calendarType)
  109. case pasturePb.CalendarType_Pregnancy_Check: // 孕检
  110. return s.PregnancyCheckCowList(ctx, startDate, pagination)
  111. case pasturePb.CalendarType_WorkOrder: // 工作单
  112. return s.WorkOrderCowList(ctx, startDate, pagination)
  113. case pasturePb.CalendarType_Weaning: // 断奶
  114. return s.WeaningCowList(ctx, startDate, pagination)
  115. case pasturePb.CalendarType_Treatment: // 治疗
  116. return s.TreatmentCowList(ctx, startDate, pagination)
  117. case pasturePb.CalendarType_Mating: // 配种
  118. return s.MatingCowList(ctx, startDate, pagination)
  119. default:
  120. return nil, xerr.New("不支持的日历类型")
  121. }
  122. }
  123. func (s *StoreEntry) ImmunisationCowList(ctx context.Context, dateTime string, pagination *pasturePb.PaginationModel) (*model.CalendarResponse, error) {
  124. immunizationPlanCowList := make([]*model.CowImmunizationPlan, 0)
  125. count := int64(0)
  126. if err := s.DB.Model(&model.CowImmunizationPlan{}).
  127. Where("plan_start_time <= ?", dateTime).
  128. Where("status = ?", pasturePb.IsShow_No).
  129. Order("id desc").Count(&count).Limit(int(pagination.PageSize)).Offset(int(pagination.PageOffset)).
  130. Find(&immunizationPlanCowList).Error; err != nil {
  131. return nil, xerr.WithStack(err)
  132. }
  133. return &model.CalendarResponse{
  134. Code: http.StatusOK,
  135. Message: "ok",
  136. Data: &model.CalendarData{
  137. Total: int32(count),
  138. Page: pagination.Page,
  139. PageSize: pagination.PageSize,
  140. Header: model.ImmunizationCalendarHeader{
  141. Id: "编号",
  142. CowId: "牛号",
  143. PlanStartTime: "免疫开始时间",
  144. ImmunizationPlanName: "免疫名称",
  145. Status: "状态",
  146. },
  147. List: model.ImmunizationPlanCowSlice(immunizationPlanCowList).ToPB(),
  148. },
  149. }, nil
  150. }
  151. func (s *StoreEntry) SameTimeCowList(ctx context.Context, dateTime string, pagination *pasturePb.PaginationModel, calendarType pasturePb.CalendarType_Kind) (*model.CalendarResponse, error) {
  152. sameTimeBodyList := make([]*model.SameTimeBody, 0)
  153. count := int64(0)
  154. pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventCowSameTime).TableName())).
  155. Select("a.id,a.cow_id,a.status,b.breed_status,b.cow_type,b.pen_id,b.day_age,b.calving_age,b.abortion_age").
  156. Joins("left join cow as b on a.cow_id = b.id").
  157. Where("b.admission_status = ?", pasturePb.AdmissionStatus_Admission).
  158. Where("a.plan_day <= ?", dateTime).
  159. Where("a.status = ?", pasturePb.IsShow_No)
  160. if calendarType == pasturePb.CalendarType_PG {
  161. pref.Where("a.same_time_type = ?", calendarType)
  162. }
  163. if calendarType == pasturePb.CalendarType_RnGH {
  164. pref.Where("a.same_time_type = ?", calendarType)
  165. }
  166. if err := pref.Order("a.id desc").Count(&count).
  167. Limit(int(pagination.PageSize)).
  168. Offset(int(pagination.PageOffset)).
  169. Find(&sameTimeBodyList).Error; err != nil {
  170. return nil, xerr.WithStack(err)
  171. }
  172. cowTypeMap := s.CowTypeMap()
  173. breedStatusMap := s.CowBreedStatusMap()
  174. penMap := s.PenMap(ctx)
  175. return &model.CalendarResponse{
  176. Code: http.StatusOK,
  177. Message: "ok",
  178. Data: &model.CalendarData{
  179. Total: int32(count),
  180. Page: pagination.Page,
  181. PageSize: pagination.PageSize,
  182. Header: model.SameTimeHeader{
  183. Id: "编号",
  184. CowId: "牛号",
  185. BreedStatusName: "繁殖状态",
  186. CowTypeName: "牛只类型",
  187. PenName: "栏舍",
  188. Lact: "胎次",
  189. CalvingAge: "产后天数",
  190. AbortionAge: "流产天数",
  191. DayAge: "日龄",
  192. Status: "状态",
  193. },
  194. List: model.SameTimeBodySlice(sameTimeBodyList).ToPB(cowTypeMap, breedStatusMap, penMap),
  195. },
  196. }, nil
  197. }
  198. func (s *StoreEntry) PregnancyCheckCowList(ctx context.Context, dateTime string, pagination *pasturePb.PaginationModel) (*model.CalendarResponse, error) {
  199. newCowPregnancyCheckList := make([]*model.EventPregnantCheck, 0)
  200. var count int64
  201. if err := s.DB.Model(&model.EventPregnantCheck{}).
  202. Where("plan_day <= ?", dateTime).
  203. Where("status = ?", pasturePb.IsShow_No).
  204. Order("id desc").Count(&count).
  205. Limit(int(pagination.PageSize)).
  206. Offset(int(pagination.PageOffset)).
  207. Find(&newCowPregnancyCheckList).Error; err != nil {
  208. return nil, xerr.WithStack(err)
  209. }
  210. return &model.CalendarResponse{
  211. Code: http.StatusOK,
  212. Message: "ok",
  213. Data: &model.CalendarData{
  214. Total: int32(count),
  215. Page: pagination.Page,
  216. PageSize: pagination.PageSize,
  217. Header: model.PregnantCheckHeader{
  218. Id: "编号",
  219. CowId: "牛号",
  220. CowType: "牛只类型",
  221. PenName: "栏舍",
  222. Lact: "胎次",
  223. DayAge: "日龄",
  224. PlanDay: "孕检日期",
  225. CheckName: "孕检名称",
  226. },
  227. List: model.EventPregnantCheckSlice(newCowPregnancyCheckList).ToPB2(),
  228. },
  229. }, nil
  230. }
  231. func (s *StoreEntry) WorkOrderCowList(ctx context.Context, dateTime string, pagination *pasturePb.PaginationModel) (*model.CalendarResponse, error) {
  232. return nil, nil
  233. }
  234. func (s *StoreEntry) WeaningCowList(ctx context.Context, dateTime string, pagination *pasturePb.PaginationModel) (*model.CalendarResponse, error) {
  235. weaningBodyList := make([]*model.WeaningBody, 0)
  236. count := int64(0)
  237. pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventCowSameTime).TableName())).
  238. Select("a.*,b.day_age").
  239. Joins("left join cow as b on a.cow_id = b.id").
  240. Where("b.admission_status = ?", pasturePb.AdmissionStatus_Admission).
  241. Where("a.plan_day <= ?", dateTime).
  242. Where("a.status = ?", pasturePb.IsShow_No)
  243. if err := pref.Order("a.id desc").Count(&count).
  244. Limit(int(pagination.PageSize)).
  245. Offset(int(pagination.PageOffset)).
  246. Find(&weaningBodyList).Error; err != nil {
  247. return nil, xerr.WithStack(err)
  248. }
  249. return &model.CalendarResponse{
  250. Code: http.StatusOK,
  251. Message: "ok",
  252. Data: &model.CalendarData{
  253. Total: int32(count),
  254. Page: pagination.Page,
  255. PageSize: pagination.PageSize,
  256. Header: model.WeaningHeader{
  257. Id: "编号",
  258. CowId: "牛号",
  259. PenName: "栏舍",
  260. PlanDay: "断奶日期",
  261. DayAge: "日龄",
  262. Status: "状态",
  263. },
  264. List: weaningBodyList,
  265. },
  266. }, nil
  267. }
  268. func (s *StoreEntry) TreatmentCowList(ctx context.Context, dateTime string, pagination *pasturePb.PaginationModel) (*model.CalendarResponse, error) {
  269. return nil, nil
  270. }
  271. func (s *StoreEntry) MatingCowList(ctx context.Context, dateTime string, pagination *pasturePb.PaginationModel) (*model.CalendarResponse, error) {
  272. cowMatingBodyList := make([]*model.CowMatingBody, 0)
  273. count := int64(0)
  274. pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventCowSameTime).TableName())).
  275. Select("a.id,a.cow_id,a.status,b.breed_status,b.cow_type,b.pen_id,b.day_age,b.calving_age,b.abortion_age").
  276. Joins("left join cow as b on a.cow_id = b.id").
  277. Where("b.admission_status = ?", pasturePb.AdmissionStatus_Admission).
  278. Where("a.plan_day <= ?", dateTime).
  279. Where("a.status = ?", pasturePb.IsShow_No)
  280. if err := pref.Order("a.id desc").Count(&count).
  281. Limit(int(pagination.PageSize)).
  282. Offset(int(pagination.PageOffset)).
  283. Find(&cowMatingBodyList).Error; err != nil {
  284. return nil, xerr.WithStack(err)
  285. }
  286. cowTypeMap := s.CowTypeMap()
  287. breedStatusMap := s.CowBreedStatusMap()
  288. penMap := s.PenMap(ctx)
  289. return &model.CalendarResponse{
  290. Code: http.StatusOK,
  291. Message: "ok",
  292. Data: &model.CalendarData{
  293. Total: int32(count),
  294. Page: pagination.Page,
  295. PageSize: pagination.PageSize,
  296. Header: model.SameTimeHeader{
  297. Id: "编号",
  298. CowId: "牛号",
  299. BreedStatusName: "繁殖状态",
  300. CowTypeName: "牛只类型",
  301. PenName: "栏舍",
  302. Lact: "胎次",
  303. CalvingAge: "产后天数",
  304. AbortionAge: "流产天数",
  305. DayAge: "日龄",
  306. Status: "状态",
  307. },
  308. List: model.CowMatingBodySlice(cowMatingBodyList).ToPB(cowTypeMap, breedStatusMap, penMap),
  309. },
  310. }, nil
  311. }