event_cow_log.go 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "kpt-pasture/model"
  7. "strconv"
  8. "strings"
  9. "time"
  10. "gorm.io/gorm"
  11. "gitee.com/xuyiping_admin/pkg/xerr"
  12. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  13. )
  14. func (s *StoreEntry) SubmitEventLog(ctx context.Context, pastureId int64, cow *model.Cow, eventType pasturePb.EventType_Kind, req interface{}) *model.EventCowLog {
  15. userModel, err := s.GetUserModel(ctx)
  16. if err != nil {
  17. return nil
  18. }
  19. var (
  20. desc, remarks = "", ""
  21. eventTypeName = s.EventTypeMap(userModel)[eventType]
  22. eventAt = int64(0)
  23. eventCategoryMap = s.eventCategoryMap()
  24. penMap = s.PenMap(ctx, pastureId)
  25. cowTypeMap = s.CowTypeMap(userModel)
  26. operationUser = &model.SystemUser{}
  27. )
  28. switch eventType {
  29. case pasturePb.EventType_Enter:
  30. data := req.(*pasturePb.EventEnterRequest)
  31. eventAt = int64(data.EnterAt)
  32. remarks = data.Remarks
  33. sourceMap := s.CowSourceMap(userModel)
  34. operationUser.Id = int64(data.OperationId)
  35. operationUser.Name = data.OperationName
  36. sex := "公"
  37. if data.Sex == pasturePb.Genders_Female {
  38. sex = "母"
  39. }
  40. desc = fmt.Sprintf("性别: %s; 栏舍: %s; 体重: %s kg; 价格: %s; 来源: %s;", sex, penMap[cow.PenId].Name,
  41. strconv.FormatFloat(float64(data.Weight), 'f', 2, 64),
  42. strconv.FormatFloat(float64(data.Price), 'f', 2, 64), sourceMap[cow.SourceKind])
  43. case pasturePb.EventType_Transfer_Ben:
  44. data := req.(*model.EventTransferGroup)
  45. eventAt = data.TransferDate
  46. remarks = data.Remarks
  47. operationUser.Id = data.OperationId
  48. operationUser.Name = data.OperationName
  49. desc = fmt.Sprintf("转出栏舍: %s; 转入栏舍: %s", penMap[data.PenOutId].Name, penMap[data.PenInId].Name)
  50. case pasturePb.EventType_Body_Score:
  51. case pasturePb.EventType_Disease:
  52. data := req.(*model.EventCowDisease)
  53. eventAt = data.DiseaseAt
  54. remarks = data.Remarks
  55. operationUser.Id = int64(data.OperationId)
  56. operationUser.Name = data.OperationName
  57. desc = fmt.Sprintf("疾病名称: %s; 状态: 治疗中;", data.DiseaseName)
  58. case pasturePb.EventType_Pregnancy_Check:
  59. data := req.(*PregnantCheckBatchModel)
  60. eventAt = int64(data.PregnantCheckAt)
  61. if data.PregnantCheckResult == pasturePb.PregnantCheckResult_Pregnant {
  62. desc += fmt.Sprintf("孕检方式: %s; 孕检结果: %s", s.PregnantCheckMethodMap(userModel)[data.PregnantCheckMethod], s.MatingResultMap(userModel)[pasturePb.MatingResult_Pregnant])
  63. }
  64. if data.PregnantCheckResult == pasturePb.PregnantCheckResult_UnPregnant {
  65. desc += fmt.Sprintf("孕检方式: %s", s.PregnantCheckMethodMap(userModel)[data.PregnantCheckMethod])
  66. if cow.BreedStatus == pasturePb.BreedStatus_Abort {
  67. desc += fmt.Sprintf("; 复检结果: %s", s.MatingResultMap(userModel)[pasturePb.MatingResult_Abort])
  68. }
  69. if cow.BreedStatus == pasturePb.BreedStatus_Empty {
  70. desc += fmt.Sprintf("; 孕检结果: %s", s.MatingResultMap(userModel)[pasturePb.MatingResult_Empty])
  71. }
  72. }
  73. operationUser.Id = data.OperationUser.Id
  74. operationUser.Name = data.OperationUser.Name
  75. remarks = data.Remarks
  76. case pasturePb.EventType_Estrus:
  77. data := req.(*model.EventEstrus)
  78. eventAt = data.PlanDay
  79. isMating := "否"
  80. if data.IsMating == pasturePb.IsShow_Ok {
  81. isMating = "是"
  82. }
  83. desc = fmt.Sprintf("发情揭发方式:%s;是否配种:%s;", s.ExposeEstrusTypeMap(userModel)[data.ExposeEstrusType], isMating)
  84. operationUser.Id = data.OperationId
  85. operationUser.Name = data.OperationName
  86. remarks = data.Remarks
  87. case pasturePb.EventType_Calving:
  88. data := req.(*pasturePb.EventCalving)
  89. eventAt = int64(data.CalvingAt)
  90. desc = fmt.Sprintf("怀孕天数:%d;难产等级: %s;产子数量: %d;", cow.PregnancyAge, s.CalvingLevelMap(userModel)[data.CalvingLevel], data.ChildNumber)
  91. if data.CalvingLevel > pasturePb.CalvingLevel_Natural_Childbirth {
  92. desc += fmt.Sprintf("难产原因: %s", s.DystociaReasonMap(userModel)[data.DystociaReason])
  93. }
  94. ly, qy, die := 0, 0, 0
  95. earNumber := ""
  96. if len(data.CalfItemList) > 0 {
  97. for _, v := range data.CalfItemList {
  98. if v.IsLive == pasturePb.IsShow_Ok && v.IsAdoption == pasturePb.IsShow_No {
  99. qy++
  100. }
  101. if v.IsLive == pasturePb.IsShow_No {
  102. die++
  103. }
  104. if v.IsAdoption == pasturePb.IsShow_Ok {
  105. ly++
  106. earNumber += fmt.Sprintf("犊牛耳号: %s,出生体重: %s KG;", v.EarNumber, strconv.FormatFloat(float64(v.Weight), 'f', 2, 64))
  107. }
  108. }
  109. }
  110. desc += fmt.Sprintf("留养: %d个 %s;弃养: %d; 死亡: %d个", ly, earNumber, qy, die)
  111. operationUser.Id = int64(data.OperationId)
  112. operationUser.Name = data.OperationName
  113. remarks = data.Remarks
  114. case pasturePb.EventType_Seme_Time:
  115. data := req.(*pasturePb.EventSameTime)
  116. eventAt = int64(data.SameTimeAt)
  117. desc = fmt.Sprintf("同期名称: %s;激素名称: %s;剂量:%f;操作人: %s", data.SameTimeTypeName, data.DrugsName, data.Usage, data.OperationName)
  118. operationUser.Id = int64(data.OperationId)
  119. operationUser.Name = data.OperationName
  120. remarks = data.Remarks
  121. case pasturePb.EventType_Mating:
  122. data := req.(*model.EventMatingCheckBatchModel)
  123. eventAt = data.MatingAt
  124. desc = fmt.Sprintf("配种公牛: %s;配种结果:未知", data.FrozenSemen.BullId)
  125. operationUser.Id = data.OperationUser.Id
  126. operationUser.Name = data.OperationUser.Name
  127. remarks = data.Remarks
  128. case pasturePb.EventType_Birth:
  129. eventAt = cow.BirthAt
  130. desc = fmt.Sprintf("出生体重: %s KG;母号:%s;父号: %s", strconv.FormatFloat(float64(cow.BirthWeight)/1000, 'f', 2, 64), cow.MotherNumber, cow.FatherNumber)
  131. case pasturePb.EventType_Death:
  132. data := req.(*model.EventDeath)
  133. eventAt = data.DeathAt
  134. desc = fmt.Sprintf("死亡原因: %s", data.DeathReasonName)
  135. operationUser.Id = data.OperationId
  136. operationUser.Name = data.OperationName
  137. case pasturePb.EventType_Dry_Milk:
  138. data := req.(*model.EventDryMilk)
  139. eventAt = data.RealityDay
  140. operationUser.Id = data.OperationId
  141. operationUser.Name = data.OperationName
  142. case pasturePb.EventType_Out:
  143. data := req.(*pasturePb.EventCowSale)
  144. eventAt = int64(data.SaleAt)
  145. desc = fmt.Sprintf("淘汰原因: %s", data.OutReasonsName)
  146. operationUser.Id = int64(data.OperationId)
  147. operationUser.Name = data.OperationName
  148. case pasturePb.EventType_Immunication:
  149. data := req.(*model.EventImmunizationPlan)
  150. eventAt = data.RealityDay
  151. desc = fmt.Sprintf("免疫名称: %s;药物名称: %s;剂量: %d %s", data.PlanName, data.DrugsName, data.Usage, data.UnitName)
  152. operationUser.Id = data.OperationId
  153. operationUser.Name = data.OperationName
  154. case pasturePb.EventType_Weaning:
  155. data := req.(*pasturePb.WeaningItem)
  156. eventAt = int64(data.WeaningAt)
  157. operationUser.Id = int64(data.OperationId)
  158. operationUser.Name = data.OperationName
  159. remarks = data.Remarks
  160. desc = fmt.Sprintf("具体体重: %s", strconv.FormatFloat(float64(data.Weight), 'f', 2, 64))
  161. case pasturePb.EventType_Sale:
  162. data := req.(*pasturePb.EventCowSale)
  163. eventAt = int64(data.SaleAt)
  164. for _, v := range data.EarNumbers {
  165. if v == cow.EarNumber {
  166. desc = fmt.Sprintf("经销商: %s,单价: %s", data.DealerName, strconv.FormatFloat(float64(data.SalePrice), 'f', 2, 64))
  167. break
  168. }
  169. }
  170. case pasturePb.EventType_Abort:
  171. data := req.(*AbortionCheckBatchModel)
  172. eventAt = data.EventAbortion.AbortionAt
  173. operationUser.Id = data.OperationUser.Id
  174. operationUser.Name = data.OperationUser.Name
  175. remarks = data.EventAbortion.Remarks
  176. desc = fmt.Sprintf("流产原因: %s", data.EventAbortion.AbortionReasonsName)
  177. case pasturePb.EventType_Weight:
  178. data := req.(*pasturePb.EventWeight)
  179. eventAt = int64(data.WeightAt)
  180. operationUser.Id = int64(data.OperationId)
  181. operationUser.Name = data.OperationName
  182. remarks = data.Remarks
  183. desc = fmt.Sprintf("日龄: %d;体重: %s kg", cow.DayAge, strconv.FormatFloat(float64(data.Weight), 'f', 2, 64))
  184. case pasturePb.EventType_Castrated:
  185. case pasturePb.EventType_Insect_Repellent:
  186. case pasturePb.EventType_ForbiddenMating:
  187. data := req.(*model.EventForbiddenMatingItem)
  188. eventAt = data.ForbiddenMatingAt
  189. operationUser.Id = data.OperationUser.Id
  190. operationUser.Name = data.OperationUser.Name
  191. remarks = data.Remarks
  192. desc = fmt.Sprintf("禁配原因: %s", data.ForbiddenMatingReasonsName)
  193. case pasturePb.EventType_UnForbiddenMating:
  194. data := req.(*model.EventForbiddenMating)
  195. eventAt = data.UnForbiddenMatingAt
  196. operationUser.Id = data.UnForbiddenOperationId
  197. operationUser.Name = data.UnForbiddenOperationName
  198. desc = fmt.Sprintf("解禁时间: %s", time.Unix(eventAt, 0).Local().Format(model.LayoutDate2))
  199. }
  200. newEventCowLogModel := &model.EventCowLogModel{
  201. Cow: cow,
  202. CowTypeName: cowTypeMap[cow.CowType],
  203. OperationUser: operationUser,
  204. EventCategoryKind: eventCategoryMap[eventType],
  205. EventAt: eventAt,
  206. EventType: eventType,
  207. EventTypeName: eventTypeName,
  208. Description: desc,
  209. Remarks: remarks,
  210. PenName: penMap[cow.PenId].Name,
  211. }
  212. return model.NewEventCowLog(newEventCowLogModel)
  213. }
  214. func (s *StoreEntry) GetEventCowLog(ctx context.Context, pastureId, cowId int64) (*model.EventCowLog, error) {
  215. eventLog := &model.EventCowLog{CowId: cowId}
  216. if err := s.DB.Table(eventLog.TableName()).
  217. Where("cow_id = ?", cowId).
  218. Where("pasture_id = ?", pastureId).
  219. Order("event_at DESC").
  220. First(&eventLog).Error; err != nil {
  221. if !errors.Is(err, gorm.ErrRecordNotFound) {
  222. return nil, xerr.WithStack(err)
  223. }
  224. }
  225. return eventLog, nil
  226. }
  227. func (s *StoreEntry) UpdateMatingResultEventCowLogByCowId(ctx context.Context, cowId int64, newResult string) error {
  228. newEventCowLog := &model.EventCowLog{CowId: cowId}
  229. if err := s.DB.Table(newEventCowLog.TableName()).
  230. Where("cow_id = ?", cowId).
  231. Where("event_category_kind = ?", pasturePb.EventCategory_Breed).
  232. Where("event_type = ?", pasturePb.EventType_Mating).
  233. Order("id desc").
  234. First(newEventCowLog).Error; err != nil {
  235. return xerr.WithStack(err)
  236. } else {
  237. desc := strings.ReplaceAll(newEventCowLog.EventDescription, "未知", newResult)
  238. if err = s.DB.Table(newEventCowLog.TableName()).
  239. Where("id = ?", newEventCowLog.Id).
  240. Update("event_description", desc).Error; err != nil {
  241. return xerr.WithStack(err)
  242. }
  243. }
  244. return nil
  245. }