event_cow_log.go 9.4 KB

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