cow_more.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. package model
  2. import (
  3. "fmt"
  4. "time"
  5. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  6. )
  7. func (c CowSlice) ToPB2(penWeightSlice PenWeightSlice) []*pasturePb.CowList {
  8. res := make([]*pasturePb.CowList, len(c))
  9. for i, v := range c {
  10. penWeight := penWeightSlice.GetPenWeight(v.PenId)
  11. penAvgWeight := float32(0)
  12. cowPenAvgWeightDiffValue := float32(0)
  13. if penWeight != nil {
  14. penAvgWeight = float32(penWeight.AvgWeight) / 1000
  15. cowPenAvgWeightDiffValue = float32(v.CurrentWeight-int64(penWeight.AvgWeight)) / 1000
  16. }
  17. res[i] = &pasturePb.CowList{
  18. CowId: int32(v.Id),
  19. DayAge: v.DayAge,
  20. AverageDailyWeightGain: float32(v.GetAverageDailyWeight()),
  21. EarNumber: v.EarNumber,
  22. PenName: v.PenName,
  23. BirthAt: int32(v.BirthAt),
  24. BirthWeight: float32(v.BirthWeight) / 1000,
  25. CurrentWeight: float32(v.CurrentWeight) / 1000,
  26. LastWeightAt: int32(v.LastWeightAt),
  27. AdmissionAge: v.AdmissionAge,
  28. AdmissionWeight: float32(v.AbortionAge) / 1000,
  29. PreviousStageDailyWeight: float32(v.GetPreviousStageDailyWeight()),
  30. PenAvgWeight: penAvgWeight,
  31. CowPenAvgWeightDiffValue: cowPenAvgWeightDiffValue,
  32. }
  33. }
  34. return res
  35. }
  36. // NewEnterCow 入场新增牛只
  37. func NewEnterCow(pastureId int64, req *pasturePb.EventEnterRequest, penMap map[int32]*Pen) *Cow {
  38. var isPregnant = pasturePb.IsShow_No
  39. if req.BreedStatus == pasturePb.BreedStatus_Pregnant {
  40. isPregnant = pasturePb.IsShow_Ok
  41. }
  42. admissionAt := int64(0)
  43. switch req.CowSource {
  44. case pasturePb.CowSource_Calving:
  45. admissionAt = int64(req.BirthAt)
  46. case pasturePb.CowSource_Transfer_In:
  47. admissionAt = int64(req.EnterAt)
  48. case pasturePb.CowSource_Buy:
  49. admissionAt = int64(req.EnterAt)
  50. }
  51. breedStatus := pasturePb.BreedStatus_Invalid
  52. isForbiddenMating := pasturePb.IsShow_No
  53. cowType := pasturePb.CowType_Invalid
  54. if req.Sex == pasturePb.Genders_Female {
  55. if req.Lact == 0 && req.MatingAt <= 0 {
  56. breedStatus = pasturePb.BreedStatus_UnBreed
  57. cowType = pasturePb.CowType_Reserve_Calf
  58. }
  59. if req.MatingAt > 0 && (req.PregnantCheckResult != pasturePb.PregnantCheckResult_Pregnant &&
  60. req.PregnantCheckResult != pasturePb.PregnantCheckResult_UnPregnant) &&
  61. req.MatingAt >= req.CalvingAt && req.MatingAt >= req.AbortionAt {
  62. breedStatus = pasturePb.BreedStatus_Breeding
  63. if req.Lact == 0 {
  64. cowType = pasturePb.CowType_Reserve_Calf
  65. } else {
  66. cowType = pasturePb.CowType_Breeding_Calf
  67. }
  68. }
  69. if req.MatingAt > 0 && req.PregnantCheckResult == pasturePb.PregnantCheckResult_Pregnant &&
  70. req.MatingAt >= req.CalvingAt && req.MatingAt >= req.AbortionAt {
  71. breedStatus = pasturePb.BreedStatus_Pregnant
  72. if req.Lact == 0 {
  73. cowType = pasturePb.CowType_Reserve_Calf
  74. } else {
  75. cowType = pasturePb.CowType_Breeding_Calf
  76. }
  77. }
  78. if req.MatingAt > 0 && req.PregnantCheckResult == pasturePb.PregnantCheckResult_UnPregnant &&
  79. req.MatingAt >= req.CalvingAt && req.MatingAt >= req.AbortionAt {
  80. breedStatus = pasturePb.BreedStatus_Empty
  81. if req.Lact == 0 {
  82. cowType = pasturePb.CowType_Reserve_Calf
  83. } else {
  84. cowType = pasturePb.CowType_Breeding_Calf
  85. }
  86. }
  87. if req.CalvingAt > 0 && req.CalvingAt >= req.MatingAt && req.CalvingAt >= req.AbortionAt {
  88. breedStatus = pasturePb.BreedStatus_Calving
  89. cowType = pasturePb.CowType_Breeding_Calf
  90. }
  91. if req.AbortionAt > 0 && req.AbortionAt >= req.CalvingAt && req.AbortionAt >= req.MatingAt {
  92. breedStatus = pasturePb.BreedStatus_Abort
  93. cowType = pasturePb.CowType_Breeding_Calf
  94. }
  95. }
  96. if breedStatus == pasturePb.BreedStatus_No_Mating {
  97. isForbiddenMating = pasturePb.IsShow_Ok
  98. }
  99. cow := &Cow{
  100. PastureId: pastureId,
  101. Sex: req.Sex,
  102. EarNumber: req.EarNumber,
  103. PenId: req.PenId,
  104. PenName: penMap[req.PenId].Name,
  105. Lact: req.Lact,
  106. CowType: cowType,
  107. BreedStatus: breedStatus,
  108. CowKind: req.CowKind,
  109. SourceKind: req.CowSource,
  110. FatherNumber: req.FatherNumber,
  111. MotherNumber: req.MotherNumber,
  112. AdmissionStatus: pasturePb.AdmissionStatus_Admission,
  113. HealthStatus: pasturePb.HealthStatus_Health,
  114. PurposeKind: req.PurposeKind,
  115. EleEarNumber: req.EleEarNumber,
  116. IsPregnant: isPregnant,
  117. IsForbiddenMating: isForbiddenMating,
  118. WeaningAt: int64(req.WeaningAt),
  119. BirthAt: int64(req.BirthAt),
  120. AdmissionWeight: int64(req.Weight * 1000),
  121. FirstMatingAt: int64(req.MatingAt),
  122. LastMatingAt: int64(req.MatingAt),
  123. LastPregnantCheckAt: int64(req.PregnancyCheckAt),
  124. AdmissionAt: admissionAt,
  125. BirthWeight: int64(req.Weight * 1000),
  126. LastWeightAt: int64(req.EstrusAt),
  127. CurrentWeight: int64(req.Weight * 1000),
  128. LastDryMilkAt: int64(req.DryMilkAt),
  129. MatingTimes: req.MatingTimes,
  130. LastCalvingAt: int64(req.CalvingAt),
  131. LastBullNumber: req.BullNumber,
  132. LastAbortionAt: int64(req.AbortionAt),
  133. AdmissionPrice: req.Price,
  134. BatchNumber: req.BatchNumber,
  135. NeckRingNumber: req.NeckRingNumber,
  136. }
  137. cow.AdmissionAge = cow.GetAdmissionAge()
  138. cow.DayAge = cow.GetDayAge()
  139. return cow
  140. }
  141. // NewCalfCow 产犊新增
  142. func NewCalfCow(matherInfo *Cow, calf *CalvingCalf) *Cow {
  143. return &Cow{
  144. PastureId: calf.PastureId,
  145. Sex: calf.Sex,
  146. EarNumber: calf.EarNumber,
  147. PenId: calf.PenId,
  148. PenName: calf.PenName,
  149. CowType: pasturePb.CowType_Lactating_Calf, // 哺乳犊牛
  150. BreedStatus: pasturePb.BreedStatus_UnBreed, // 未配
  151. CowKind: matherInfo.CowKind, // 牛只品种
  152. BirthWeight: calf.BirthWeight,
  153. BirthAt: calf.BirthAt,
  154. SourceKind: pasturePb.CowSource_Calving, // 产犊方式
  155. FatherNumber: matherInfo.LastBullNumber,
  156. MotherNumber: matherInfo.EarNumber,
  157. AdmissionStatus: pasturePb.AdmissionStatus_Admission,
  158. IsPregnant: pasturePb.IsShow_No,
  159. AdmissionAt: calf.BirthAt,
  160. }
  161. }
  162. // ExcelEnterCow excel导入入场新增牛只
  163. func ExcelEnterCow(pastureId int64, req *pasturePb.EventEnterRequest) *Cow {
  164. var isPregnant = pasturePb.IsShow_No
  165. if req.BreedStatus == pasturePb.BreedStatus_Pregnant {
  166. isPregnant = pasturePb.IsShow_Ok
  167. }
  168. admissionAt := int64(0)
  169. switch req.CowSource {
  170. case pasturePb.CowSource_Calving:
  171. admissionAt = int64(req.BirthAt)
  172. case pasturePb.CowSource_Transfer_In:
  173. admissionAt = int64(req.EnterAt)
  174. case pasturePb.CowSource_Buy:
  175. admissionAt = int64(req.EnterAt)
  176. }
  177. breedStatus := pasturePb.BreedStatus_Invalid
  178. if req.Sex == pasturePb.Genders_Female {
  179. if req.Lact == 0 && req.MatingAt <= 0 {
  180. breedStatus = pasturePb.BreedStatus_UnBreed
  181. }
  182. if req.MatingAt > 0 && (req.PregnantCheckResult != pasturePb.PregnantCheckResult_Pregnant &&
  183. req.PregnantCheckResult != pasturePb.PregnantCheckResult_UnPregnant) &&
  184. req.MatingAt >= req.CalvingAt && req.MatingAt >= req.AbortionAt {
  185. breedStatus = pasturePb.BreedStatus_Breeding
  186. }
  187. if req.MatingAt > 0 && req.PregnantCheckResult == pasturePb.PregnantCheckResult_Pregnant &&
  188. req.MatingAt >= req.CalvingAt && req.MatingAt >= req.AbortionAt {
  189. breedStatus = pasturePb.BreedStatus_Pregnant
  190. }
  191. if req.MatingAt > 0 && req.PregnantCheckResult == pasturePb.PregnantCheckResult_UnPregnant &&
  192. req.MatingAt >= req.CalvingAt && req.MatingAt >= req.AbortionAt {
  193. breedStatus = pasturePb.BreedStatus_Empty
  194. }
  195. if req.CalvingAt > 0 && req.CalvingAt >= req.MatingAt && req.CalvingAt >= req.AbortionAt {
  196. breedStatus = pasturePb.BreedStatus_Calving
  197. }
  198. if req.AbortionAt > 0 && req.AbortionAt >= req.CalvingAt && req.AbortionAt >= req.MatingAt {
  199. breedStatus = pasturePb.BreedStatus_Abort
  200. }
  201. }
  202. cow := &Cow{
  203. PastureId: pastureId,
  204. Sex: req.Sex,
  205. EarNumber: req.EarNumber,
  206. PenId: req.PenId,
  207. PenName: req.PenName,
  208. Lact: req.Lact,
  209. CowType: req.CowType,
  210. BreedStatus: breedStatus,
  211. CowKind: req.CowKind,
  212. SourceKind: req.CowSource,
  213. FatherNumber: req.FatherNumber,
  214. MotherNumber: req.MotherNumber,
  215. AdmissionStatus: pasturePb.AdmissionStatus_Admission,
  216. HealthStatus: pasturePb.HealthStatus_Health,
  217. PurposeKind: req.PurposeKind,
  218. EleEarNumber: req.EleEarNumber,
  219. IsPregnant: isPregnant,
  220. IsForbiddenMating: req.IsForbiddenMatingKind,
  221. WeaningAt: int64(req.WeaningAt),
  222. BirthAt: int64(req.BirthAt),
  223. AdmissionWeight: int64(req.Weight * 1000),
  224. FirstMatingAt: int64(req.MatingAt),
  225. LastMatingAt: int64(req.MatingAt),
  226. LastPregnantCheckAt: int64(req.PregnancyCheckAt),
  227. AdmissionAt: admissionAt,
  228. BirthWeight: int64(req.Weight * 1000),
  229. LastWeightAt: int64(req.EstrusAt),
  230. CurrentWeight: int64(req.Weight * 1000),
  231. LastDryMilkAt: int64(req.DryMilkAt),
  232. MatingTimes: req.MatingTimes,
  233. LastCalvingAt: int64(req.CalvingAt),
  234. LastBullNumber: req.BullNumber,
  235. LastAbortionAt: int64(req.AbortionAt),
  236. AdmissionPrice: req.Price,
  237. BatchNumber: req.BatchNumber,
  238. NeckRingNumber: req.NeckRingNumber,
  239. }
  240. cow.AdmissionAge = cow.GetAdmissionAge()
  241. cow.DayAge = cow.GetDayAge()
  242. return cow
  243. }
  244. type BarCowStruct struct {
  245. Number int32 `json:"number"`
  246. TypeId pasturePb.CowType_Kind `json:"type_id"`
  247. }
  248. // BarCowStructSlice 首页牛群结构
  249. type BarCowStructSlice []*BarCowStruct
  250. func (b BarCowStructSlice) ToPB(cowTypeMap map[pasturePb.CowType_Kind]string, count int32) []*pasturePb.BarCowStruct {
  251. var pb []*pasturePb.BarCowStruct
  252. for _, v := range b {
  253. name := fmt.Sprintf("%s", cowTypeMap[v.TypeId])
  254. pb = append(pb, &pasturePb.BarCowStruct{Name: name, Value: v.Number})
  255. }
  256. return pb
  257. }
  258. type CowWeightRange struct {
  259. WeightRange string `json:"weight_range"`
  260. Count int32 `json:"count"`
  261. }
  262. func (c CowSlice) WeightRangeToPB(penMap map[int32]*Pen) []*pasturePb.CowList {
  263. res := make([]*pasturePb.CowList, len(c))
  264. for i, v := range c {
  265. penName := ""
  266. if pen, ok := penMap[v.PenId]; ok {
  267. penName = pen.Name
  268. }
  269. res[i] = &pasturePb.CowList{
  270. CowId: int32(v.Id),
  271. DayAge: v.DayAge,
  272. AverageDailyWeightGain: float32(v.GetAverageDailyWeight()),
  273. PreviousStageDailyWeight: float32(v.GetPreviousStageDailyWeight()),
  274. EarNumber: v.EarNumber,
  275. PenName: penName,
  276. BirthAt: int32(v.BirthAt),
  277. BirthWeight: float32(v.BirthWeight) / 1000,
  278. CurrentWeight: float32(v.CurrentWeight) / 1000,
  279. LastWeightAt: int32(v.LastWeightAt),
  280. AdmissionAge: v.AdmissionAge,
  281. }
  282. }
  283. return res
  284. }
  285. func (c CowSlice) LongTermInfertilityToPB(breedStatusMap map[pasturePb.BreedStatus_Kind]string) []*pasturePb.LongTermInfertility {
  286. res := make([]*pasturePb.LongTermInfertility, len(c))
  287. for i, v := range c {
  288. breedStatusName := ""
  289. if breedStatus, ok := breedStatusMap[v.BreedStatus]; ok {
  290. breedStatusName = breedStatus
  291. }
  292. lastCalvingAtFormat := ""
  293. if v.LastCalvingAt > 0 {
  294. lastCalvingAtFormat = time.Unix(v.LastCalvingAt, 0).Local().Format(LayoutDate2)
  295. }
  296. lastAbortionAtFormat := ""
  297. if v.LastAbortionAt > 0 {
  298. lastAbortionAtFormat = time.Unix(v.LastAbortionAt, 0).Local().Format(LayoutDate2)
  299. }
  300. lastMatingAtFormat := ""
  301. if v.LastMatingAt > 0 {
  302. lastMatingAtFormat = time.Unix(v.LastMatingAt, 0).Local().Format(LayoutDate2)
  303. }
  304. res[i] = &pasturePb.LongTermInfertility{
  305. CowId: int32(v.Id),
  306. EarNumber: v.EarNumber,
  307. Lact: v.Lact,
  308. PenId: v.PenId,
  309. CalvingAge: v.CalvingAge,
  310. PenName: v.PenName,
  311. BreedStatusName: breedStatusName,
  312. BreedStatus: v.BreedStatus,
  313. LastCalvingAtFormat: lastCalvingAtFormat,
  314. LastAbortionAtFormat: lastAbortionAtFormat,
  315. LastMatingAtFormat: lastMatingAtFormat,
  316. MatingTimes: v.MatingTimes,
  317. LastBullNumber: v.LastBullNumber,
  318. AbortionTimes: v.AbortionTimes,
  319. }
  320. }
  321. return res
  322. }
  323. func (c CowSlice) CanSaleToPB(cowKindMap map[pasturePb.CowKind_Kind]string) []*pasturePb.CanSalesReport {
  324. res := make([]*pasturePb.CanSalesReport, len(c))
  325. for i, v := range c {
  326. cowKindName, lastWeightAtFormat, admissionAtFormat := "", "", ""
  327. if name, ok := cowKindMap[v.CowKind]; ok {
  328. cowKindName = name
  329. }
  330. if v.LastWeightAt > 0 {
  331. lastWeightAtFormat = time.Unix(v.LastWeightAt, 0).Local().Format(LayoutDate2)
  332. }
  333. if v.AdmissionAt > 0 {
  334. admissionAtFormat = time.Unix(v.AdmissionAt, 0).Local().Format(LayoutDate2)
  335. }
  336. res[i] = &pasturePb.CanSalesReport{
  337. CowId: int32(v.Id),
  338. EarNumber: v.EarNumber,
  339. BatchNumber: v.BatchNumber,
  340. CowKindName: cowKindName,
  341. PenName: v.PenName,
  342. Weight: float32(v.CurrentWeight) / 1000,
  343. AdmissionAge: v.AdmissionAge,
  344. EnterWeight: 0,
  345. EnterPrice: 0,
  346. LastWeightAtFormat: lastWeightAtFormat,
  347. DayAvgFeedCost: 0,
  348. AllFeedCost: 0,
  349. AllMedicalCharge: 0,
  350. OtherCost: 0,
  351. ProfitAndLoss: 0,
  352. AdmissionAtFormat: admissionAtFormat,
  353. DayAvgWeight: 0,
  354. }
  355. }
  356. return res
  357. }
  358. // CowBehaviorCurveResponse 脖环行为数据PC端
  359. type CowBehaviorCurveResponse struct {
  360. Code int32 `json:"code"`
  361. Msg string `json:"msg"`
  362. Data *CowBehaviorCurveData `json:"data"`
  363. }
  364. type CowBehaviorCurveData struct {
  365. OriginalDateList []int32 `json:"originalDateList"` // 原始行为数据
  366. ChangeDateList []int32 `json:"changeDateList"` // 变化数据
  367. SumDateList []int32 `json:"sumDateList"` // 累计24小时数据
  368. SumChewList []int32 `json:"sumChewList"` // 累计24小时咀嚼
  369. DateTimeList []string `json:"dateTimeList"` // 时间数据
  370. EstrusList map[pasturePb.EstrusLevel_Kind][]string `json:"estrusList"` // 发情预警
  371. EventList []*pasturePb.CowEvent `json:"eventList"` // 事件数据
  372. EventMap map[pasturePb.EventType_Kind]string `json:"eventMap"` // 所有事件
  373. RuminaChange []int32 `json:"ruminaChange"` // 反刍变化
  374. LowActivity int32 `json:"lowActivity"` // 低活动量参数
  375. MiddleActivity int32 `json:"middleActivity"` // 中活动量行数
  376. IQR1 []int32 `json:"IQR1"` // IQR1
  377. IQR3 []int32 `json:"IQR3"` // IQR3
  378. }