event_cow_log.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. package backend
  2. import (
  3. "context"
  4. "fmt"
  5. "kpt-pasture/model"
  6. "strconv"
  7. "strings"
  8. "time"
  9. "gitee.com/xuyiping_admin/pkg/xerr"
  10. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  11. )
  12. func (s *StoreEntry) SubmitEventLog(
  13. ctx context.Context,
  14. pastureId int64,
  15. cow *model.Cow,
  16. eventType pasturePb.EventType_Kind,
  17. exposeEstrusType pasturePb.ExposeEstrusType_Kind,
  18. req interface{},
  19. ) *model.EventCowLog {
  20. var (
  21. desc, remarks = "", ""
  22. eventTypeName = s.EventTypeMap()[eventType]
  23. eventAt = int64(0)
  24. eventCategoryMap = s.eventCategoryMap()
  25. penMap = s.PenMap(ctx, pastureId)
  26. cowTypeMap = s.CowTypeMap()
  27. operationUser = &model.SystemUser{}
  28. )
  29. switch eventType {
  30. case pasturePb.EventType_Enter:
  31. data := req.(*pasturePb.EventEnterRequest)
  32. eventAt = int64(data.EnterAt)
  33. remarks = data.Remarks
  34. sourceMap := s.CowSourceMap()
  35. sex := "公"
  36. if data.Sex == pasturePb.Genders_Female {
  37. sex = "母"
  38. }
  39. desc = fmt.Sprintf("性别: %s; 栏舍: %s; 体重: %s kg; price: %s; 来源: %s;", sex, penMap[cow.PenId].Name, strconv.FormatFloat(float64(data.Weight), 'f', 2, 64),
  40. strconv.FormatFloat(float64(data.Price), 'f', 2, 64), sourceMap[cow.SourceId])
  41. case pasturePb.EventType_Transfer_Ben:
  42. data := req.(*model.EventTransferGroup)
  43. transferAt, _ := time.Parse(model.LayoutDate2, data.TransferDate)
  44. eventAt = transferAt.Unix()
  45. remarks = data.Remarks
  46. operationUser.Id = data.OperationId
  47. operationUser.Name = data.OperationName
  48. desc = fmt.Sprintf("转出栏舍: %s; 转入栏舍: %s", penMap[data.PenOutId].Name, penMap[data.PenInId].Name)
  49. case pasturePb.EventType_Body_Score:
  50. case pasturePb.EventType_Pregnancy_Check:
  51. data := req.(*PregnantCheckBatchModel)
  52. eventAt = int64(data.PregnantCheckAt)
  53. if data.PregnantCheckResult == pasturePb.PregnantCheckResult_Pregnant {
  54. desc += fmt.Sprintf("孕检方式: %s; 孕检结果: %s", s.PregnantCheckMethodMap()[data.PregnantCheckMethod], s.MatingResultMap()[pasturePb.MatingResult_Pregnant])
  55. }
  56. if data.PregnantCheckResult == pasturePb.PregnantCheckResult_UnPregnant {
  57. desc += fmt.Sprintf("孕检方式: %s", s.PregnantCheckMethodMap()[data.PregnantCheckMethod])
  58. if cow.BreedStatus == pasturePb.BreedStatus_Abort {
  59. desc += fmt.Sprintf("; 复检结果: %s", s.MatingResultMap()[pasturePb.MatingResult_Abort])
  60. }
  61. if cow.BreedStatus == pasturePb.BreedStatus_Empty {
  62. desc += fmt.Sprintf("; 孕检结果: %s", s.MatingResultMap()[pasturePb.MatingResult_Empty])
  63. }
  64. }
  65. operationUser.Id = data.OperationUser.Id
  66. operationUser.Name = data.OperationUser.Name
  67. remarks = data.Remarks
  68. case pasturePb.EventType_Estrus:
  69. data := req.(*model.EventEstrus)
  70. eventAt = data.PlanDay
  71. isMating := "否"
  72. if data.IsMating == pasturePb.IsShow_Ok {
  73. isMating = "是"
  74. }
  75. desc = fmt.Sprintf("发情揭发方式:%s;是否配种:%s;", s.ExposeEstrusTypeMap()[exposeEstrusType], isMating)
  76. operationUser.Id = int64(data.OperationId)
  77. operationUser.Name = data.OperationName
  78. remarks = data.Remarks
  79. case pasturePb.EventType_Calving:
  80. data := req.(*pasturePb.EventCalving)
  81. eventAt = int64(data.CalvingAt)
  82. desc = fmt.Sprintf("怀孕天数:%d;难产等级: %s;产子数量: %d;", cow.PregnancyAge, s.CalvingLevelMap()[data.CalvingLevel], data.ChildNumber)
  83. if data.CalvingLevel > pasturePb.CalvingLevel_Natural_Childbirth {
  84. desc += fmt.Sprintf("难产原因: %s", s.DystociaReasonMap()[data.DystociaReason])
  85. }
  86. ly, qy, die := 0, 0, 0
  87. earNumber := ""
  88. if len(data.CalfItemList) > 0 {
  89. for _, v := range data.CalfItemList {
  90. if v.IsLive == pasturePb.IsShow_Ok && v.IsAdoption == pasturePb.IsShow_No {
  91. qy++
  92. }
  93. if v.IsLive == pasturePb.IsShow_No {
  94. die++
  95. }
  96. if v.IsAdoption == pasturePb.IsShow_Ok {
  97. ly++
  98. earNumber += fmt.Sprintf("犊牛耳号: %s,出生体重: %s KG;", v.EarNumber, strconv.FormatFloat(float64(v.Weight), 'f', 2, 64))
  99. }
  100. }
  101. }
  102. desc += fmt.Sprintf("留养: %d个 %s;弃养: %d; 死亡: %d个", ly, earNumber, qy, die)
  103. operationUser.Id = int64(data.OperationId)
  104. operationUser.Name = data.OperationName
  105. remarks = data.Remarks
  106. case pasturePb.EventType_Seme_Time:
  107. data := req.(*pasturePb.EventSameTime)
  108. eventAt = int64(data.SameTimeAt)
  109. desc = fmt.Sprintf("同期名称: %s;激素名称: %s;剂量:%f;操作人: %s", data.SameTimeTypeName, data.DrugsName, data.Usage, data.OperationName)
  110. operationUser.Id = int64(data.OperationId)
  111. operationUser.Name = data.OperationName
  112. remarks = data.Remarks
  113. case pasturePb.EventType_Mating:
  114. data := req.(*pasturePb.EventMating)
  115. eventAt = int64(data.MatingAt)
  116. desc = fmt.Sprintf("配种公牛: %s;配种结果:未知", data.FrozenSemenNumber)
  117. operationUser.Id = int64(data.OperationId)
  118. operationUser.Name = data.OperationName
  119. remarks = data.Remarks
  120. case pasturePb.EventType_Birth:
  121. eventAt = cow.BirthAt
  122. desc = fmt.Sprintf("出生体重: %s KG;母号:%s;父号: %s", strconv.FormatFloat(float64(cow.BirthWeight)/1000, 'f', 2, 64), cow.MotherNumber, cow.FatherNumber)
  123. case pasturePb.EventType_Death:
  124. data := req.(*model.EventDeparture)
  125. eventAt = data.DepartureAt
  126. desc = fmt.Sprintf("死亡原因: %s", data.ReasonName)
  127. operationUser.Id = data.OperationId
  128. operationUser.Name = data.OperationName
  129. case pasturePb.EventType_Transfer_Out:
  130. case pasturePb.EventType_Transfer_In:
  131. case pasturePb.EventType_Out:
  132. data := req.(*model.EventDeparture)
  133. eventAt = data.DepartureAt
  134. desc = fmt.Sprintf("淘汰原因: %s", data.ReasonName)
  135. operationUser.Id = data.OperationId
  136. operationUser.Name = data.OperationName
  137. case pasturePb.EventType_Immunication:
  138. case pasturePb.EventType_Weaning:
  139. data := req.(*pasturePb.EventWeaningBatchRequest)
  140. eventAt = int64(data.WeaningAt)
  141. operationUser.Id = int64(data.OperationId)
  142. operationUser.Name = data.OperationName
  143. remarks = data.Remarks
  144. for _, v := range data.Item {
  145. if int64(v.CowId) == cow.Id {
  146. desc = fmt.Sprintf("具体体重: %f", v.Weight)
  147. break
  148. }
  149. }
  150. case pasturePb.EventType_Sale:
  151. case pasturePb.EventType_Abort:
  152. data := req.(*pasturePb.EventAbortionItem)
  153. eventAt = int64(data.AbortionAt)
  154. operationUser.Id = int64(data.OperationId)
  155. operationUser.Name = data.OperationName
  156. remarks = data.Remarks
  157. desc = fmt.Sprintf("流产原因: %s", s.AbortionReasonsMap()[data.AbortionReasons])
  158. case pasturePb.EventType_Weight:
  159. data := req.(*pasturePb.EventWeight)
  160. eventAt = int64(data.WeightAt)
  161. operationUser.Id = int64(data.OperationId)
  162. operationUser.Name = data.OperationName
  163. remarks = data.Remarks
  164. desc = fmt.Sprintf("日龄: %d;体重: %s kg", cow.DayAge, strconv.FormatFloat(float64(data.Weight), 'f', 2, 64))
  165. case pasturePb.EventType_Castrated:
  166. case pasturePb.EventType_Insect_Repellent:
  167. }
  168. newEventCowLogModel := &model.EventCowLogModel{
  169. Cow: cow,
  170. CowTypeName: cowTypeMap[cow.CowType],
  171. OperationUser: operationUser,
  172. EventCategoryKind: eventCategoryMap[eventType],
  173. EventAt: eventAt,
  174. EventType: eventType,
  175. EventTypeName: eventTypeName,
  176. Description: desc,
  177. Remarks: remarks,
  178. PenName: penMap[cow.PenId].Name,
  179. }
  180. return model.NewEventCowLog(newEventCowLogModel)
  181. }
  182. func (s *StoreEntry) UpdateMatingResultEventCowLogByCowId(ctx context.Context, cowId int64, newResult string) error {
  183. newEventCowLog := &model.EventCowLog{CowId: cowId}
  184. if err := s.DB.Table(newEventCowLog.TableName()).
  185. Where("cow_id = ?", cowId).
  186. Where("event_category_kind = ?", pasturePb.EventCategory_Breed).
  187. Where("event_type = ?", pasturePb.EventType_Mating).
  188. Order("id desc").
  189. First(newEventCowLog).Error; err != nil {
  190. return xerr.WithStack(err)
  191. } else {
  192. desc := strings.ReplaceAll(newEventCowLog.EventDescription, "未知", newResult)
  193. if err = s.DB.Table(newEventCowLog.TableName()).
  194. Where("id = ?", newEventCowLog.Id).
  195. Update("event_description", desc).Error; err != nil {
  196. return xerr.WithStack(err)
  197. }
  198. }
  199. return nil
  200. }