event_check.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "kpt-pasture/model"
  6. "kpt-pasture/util"
  7. "time"
  8. "github.com/nicksnyder/go-i18n/v2/i18n"
  9. "gorm.io/gorm"
  10. "go.uber.org/zap"
  11. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  12. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  13. "gitee.com/xuyiping_admin/pkg/xerr"
  14. )
  15. // PregnantCheckBatchModel 批量孕检
  16. type PregnantCheckBatchModel struct {
  17. EventPregnancyCheck *model.EventPregnantCheck
  18. Cow *model.Cow
  19. OperationUser *model.SystemUser
  20. PregnantCheckAt int32 // 孕检日期
  21. PregnantCheckResult pasturePb.PregnantCheckResult_Kind // 孕检结果
  22. PregnantCheckMethod pasturePb.PregnantCheckMethod_Kind // 孕检方式
  23. Remarks string
  24. LastMating *model.EventMating
  25. }
  26. // MatingTimes 更新配次
  27. type MatingTimes struct {
  28. Mt int32
  29. CowId int64
  30. EventMatingId int64
  31. }
  32. type AbortionCheckBatchModel struct {
  33. EventAbortion *model.EventAbortion
  34. Cow *model.Cow
  35. OperationUser *model.SystemUser
  36. IsLact pasturePb.IsShow_Kind
  37. }
  38. func (s *StoreEntry) EnterCheck(userModel *model.UserModel, req *pasturePb.EventEnterRequest) error {
  39. var count int64
  40. if err := s.DB.Model(new(model.Cow)).
  41. Where("ear_number = ?", req.EarNumber).
  42. Where("pasture_id = ?", userModel.AppPasture.Id).
  43. Count(&count).Error; err != nil {
  44. return xerr.WithStack(err)
  45. }
  46. if count > 0 {
  47. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  48. MessageID: "cow.Exists",
  49. })
  50. return xerr.Custom(messageId)
  51. }
  52. if req.BirthAt > req.EnterAt {
  53. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  54. MessageID: "validate.birthTimeEnterTime",
  55. })
  56. return xerr.Custom(messageId)
  57. }
  58. return nil
  59. }
  60. func (s *StoreEntry) MatingCreateCheck(ctx context.Context, userModel *model.UserModel, req *pasturePb.EventMatingBatch) ([]*model.EventMatingCheckBatchModel, error) {
  61. if len(req.Items) <= 0 {
  62. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  63. MessageID: "cow.selectCow",
  64. })
  65. return nil, xerr.Custom(messageId)
  66. }
  67. if len(req.Items) > 50 {
  68. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  69. MessageID: "validate.dataLimit",
  70. })
  71. return nil, xerr.Custom(messageId)
  72. }
  73. eventMatingCheckBatchModelList := make([]*model.EventMatingCheckBatchModel, 0)
  74. for _, v := range req.Items {
  75. cowInfo, err := s.GetCowInfoByEarNumber(ctx, userModel.AppPasture.Id, v.EarNumber)
  76. if err != nil {
  77. return nil, xerr.WithStack(err)
  78. }
  79. if cowInfo.GetEventDayAge(int64(v.MatingAt)) < 0 {
  80. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  81. MessageID: "validate.matingTimeBirthTime",
  82. TemplateData: map[string]interface{}{
  83. "earNumber": cowInfo.EarNumber,
  84. },
  85. })
  86. return nil, xerr.Customf(messageId)
  87. }
  88. if int64(v.MatingAt) < cowInfo.LastCalvingAt {
  89. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  90. MessageID: "validate.matingTimeLastCalvingTime",
  91. TemplateData: map[string]interface{}{
  92. "earNumber": cowInfo.EarNumber,
  93. },
  94. })
  95. return nil, xerr.Customf(messageId)
  96. }
  97. operationUser, err := s.GetSystemUserById(ctx, int64(v.OperationId))
  98. if err != nil {
  99. return nil, xerr.WithStack(err)
  100. }
  101. frozenSemen := &model.FrozenSemen{}
  102. if err = s.DB.Where("bull_id = ?", v.FrozenSemenNumber).
  103. First(frozenSemen).Error; err != nil {
  104. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  105. MessageID: "goods.frozenSemenNotExist",
  106. })
  107. return nil, xerr.Custom(messageId)
  108. }
  109. if frozenSemen.Quantity < v.FrozenSemenCount {
  110. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  111. MessageID: "goods.frozenSemenNotEnough",
  112. })
  113. return nil, xerr.Custom(messageId)
  114. }
  115. if cowInfo.Sex != pasturePb.Genders_Female {
  116. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  117. MessageID: "validate.cowSex",
  118. TemplateData: map[string]interface{}{
  119. "earNumber": cowInfo.EarNumber,
  120. },
  121. })
  122. return nil, xerr.Customf(messageId)
  123. }
  124. if int64(v.MatingAt) < cowInfo.LastMatingAt {
  125. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  126. MessageID: "validate.matingTimeLastMatingTime",
  127. TemplateData: map[string]interface{}{
  128. "earNumber": cowInfo.EarNumber,
  129. "matingTime": time.Unix(int64(v.MatingAt), 0).Format(model.LayoutDate2),
  130. "lastMatingTime": time.Unix(cowInfo.LastMatingAt, 0).Format(model.LayoutDate2),
  131. },
  132. })
  133. return nil, xerr.Customf(messageId)
  134. }
  135. if int64(v.MatingAt) < cowInfo.LastPregnantCheckAt {
  136. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  137. MessageID: "validate.validate.pregnantCheckMatingTime",
  138. TemplateData: map[string]interface{}{
  139. "earNumber": cowInfo.EarNumber,
  140. },
  141. })
  142. return nil, xerr.Customf(messageId)
  143. }
  144. if int64(v.MatingAt) < cowInfo.LastAbortionAt {
  145. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  146. MessageID: "validate.matingTimeLastAbortionTime",
  147. TemplateData: map[string]interface{}{
  148. "earNumber": cowInfo.EarNumber,
  149. "lastAbortionDate": time.Unix(cowInfo.LastAbortionAt, 0).Format(model.LayoutDate2),
  150. "matingDate": time.Unix(int64(v.MatingAt), 0).Format(model.LayoutDate2),
  151. },
  152. })
  153. return nil, xerr.Customf(messageId)
  154. }
  155. if int64(v.MatingAt) < cowInfo.BirthAt {
  156. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  157. MessageID: "validate.matingTimeBirthTime",
  158. TemplateData: map[string]interface{}{
  159. "earNumber": cowInfo.EarNumber,
  160. },
  161. })
  162. return nil, xerr.Customf(messageId)
  163. }
  164. if cowInfo.BreedStatus == pasturePb.BreedStatus_Pregnant || cowInfo.BreedStatus == pasturePb.BreedStatus_No_Mating {
  165. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  166. MessageID: "validate.breedStatusError",
  167. TemplateData: map[string]interface{}{
  168. "earNumber": cowInfo.EarNumber,
  169. "breedStatus": cowInfo.BreedStatus.String(),
  170. },
  171. })
  172. return nil, xerr.Customf(messageId)
  173. }
  174. eventMatingCheckBatchModelList = append(eventMatingCheckBatchModelList, &model.EventMatingCheckBatchModel{
  175. Cow: cowInfo,
  176. FrozenSemen: frozenSemen,
  177. OperationUser: operationUser,
  178. MatingAt: int64(v.MatingAt),
  179. FrozenSemenCount: v.FrozenSemenCount,
  180. Remarks: v.Remarks,
  181. ExposeEstrusType: v.ExposeEstrusType,
  182. })
  183. }
  184. return eventMatingCheckBatchModelList, nil
  185. }
  186. func (s *StoreEntry) PregnantCheckDataCheck(ctx context.Context, userModel *model.UserModel, req *pasturePb.EventPregnantCheckBatch) ([]*PregnantCheckBatchModel, error) {
  187. if len(req.Items) <= 0 {
  188. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  189. MessageID: "cow.selectCow",
  190. })
  191. return nil, xerr.Custom(messageId)
  192. }
  193. if len(req.Items) > 50 {
  194. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  195. MessageID: "validate.dataLimit",
  196. })
  197. return nil, xerr.Custom(messageId)
  198. }
  199. pregnantCheckBatchModelList := make([]*PregnantCheckBatchModel, 0)
  200. cowInfo := &model.Cow{}
  201. var err error
  202. for _, item := range req.Items {
  203. cowInfo, err = s.GetCowInfoByEarNumber(ctx, userModel.AppPasture.Id, item.EarNumber)
  204. if err != nil {
  205. return nil, xerr.WithStack(err)
  206. }
  207. if cowInfo.Sex != pasturePb.Genders_Female {
  208. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  209. MessageID: "validate.cowSex",
  210. TemplateData: map[string]interface{}{
  211. "earNumber": cowInfo.EarNumber,
  212. },
  213. })
  214. return nil, xerr.Customf(messageId)
  215. }
  216. if int64(item.PregnantCheckAt) > cowInfo.LastMatingAt {
  217. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  218. MessageID: "validate.pregnantCheckMatingTime",
  219. TemplateData: map[string]interface{}{
  220. "earNumber": cowInfo.EarNumber,
  221. },
  222. })
  223. return nil, xerr.Customf(messageId)
  224. }
  225. if cowInfo.GetEventDayAge(int64(item.PregnantCheckAt)) < 0 {
  226. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  227. MessageID: "validate.pregnantCheckBirthTime",
  228. TemplateData: map[string]interface{}{
  229. "earNumber": cowInfo.EarNumber,
  230. },
  231. })
  232. return nil, xerr.Customf(messageId)
  233. }
  234. operationUser, err := s.GetSystemUserById(ctx, int64(item.OperationId))
  235. if err != nil {
  236. zaplog.Error("PregnantCheckDataCheck",
  237. zap.Any("id", item.OperationId),
  238. zap.Any("error", err.Error()),
  239. )
  240. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  241. MessageID: "auth.getOperationError",
  242. })
  243. return nil, xerr.Customf(messageId)
  244. }
  245. if cowInfo.LastMatingAt <= 0 {
  246. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  247. MessageID: "validate.matingDataError",
  248. TemplateData: map[string]interface{}{
  249. "earNumber": cowInfo.EarNumber,
  250. },
  251. })
  252. return nil, xerr.Customf(messageId)
  253. }
  254. // 过滤掉没有配种状态的牛只
  255. if cowInfo.BreedStatus != pasturePb.BreedStatus_Breeding && cowInfo.BreedStatus != pasturePb.BreedStatus_Pregnant {
  256. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  257. MessageID: "validate.cannotPregnantCheck",
  258. TemplateData: map[string]interface{}{
  259. "earNumber": cowInfo.EarNumber,
  260. },
  261. })
  262. return nil, xerr.Customf(messageId)
  263. }
  264. itemEventPregnantCheck, err := s.FindEventPregnantCheckIsExIstByCowId(ctx, cowInfo)
  265. if err != nil {
  266. return nil, xerr.WithStack(err)
  267. }
  268. if itemEventPregnantCheck.Id <= 0 {
  269. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  270. MessageID: "validate.notFoundPregnantCheckData",
  271. TemplateData: map[string]interface{}{
  272. "earNumber": cowInfo.EarNumber,
  273. },
  274. })
  275. return nil, xerr.Customf(messageId)
  276. }
  277. lastEventMating, err := s.FindLastEventMatingByCowId(ctx, userModel.AppPasture.Id, cowInfo.Id)
  278. if errors.Is(err, gorm.ErrRecordNotFound) {
  279. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  280. MessageID: "validate.notFoundMatingData",
  281. TemplateData: map[string]interface{}{
  282. "earNumber": cowInfo.EarNumber,
  283. },
  284. })
  285. return nil, xerr.Customf(messageId)
  286. }
  287. if lastEventMating == nil || lastEventMating.Status == pasturePb.IsShow_No {
  288. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  289. MessageID: "validate.notFoundMatingData",
  290. TemplateData: map[string]interface{}{
  291. "earNumber": cowInfo.EarNumber,
  292. },
  293. })
  294. return nil, xerr.Customf(messageId)
  295. }
  296. pregnantCheckBatchModelList = append(pregnantCheckBatchModelList, &PregnantCheckBatchModel{
  297. Cow: cowInfo,
  298. OperationUser: operationUser,
  299. PregnantCheckAt: item.PregnantCheckAt,
  300. PregnantCheckMethod: item.PregnantCheckMethod,
  301. PregnantCheckResult: item.PregnantCheckResult,
  302. Remarks: item.Remarks,
  303. EventPregnancyCheck: itemEventPregnantCheck,
  304. LastMating: lastEventMating,
  305. })
  306. }
  307. return pregnantCheckBatchModelList, nil
  308. }
  309. func (s *StoreEntry) EstrusCheckDataCheck(ctx context.Context, userModel *model.UserModel, req *pasturePb.EventEstrusBatch) (*model.EventEstrusBatch, error) {
  310. pastureId := userModel.AppPasture.Id
  311. exposeEstrusType := pasturePb.ExposeEstrusType_Natural_Estrus
  312. if req.ExposeEstrusType == pasturePb.ExposeEstrusType_Neck_Ring {
  313. exposeEstrusType = pasturePb.ExposeEstrusType_Neck_Ring
  314. }
  315. unMatingReasonsMap := s.UnMatingReasonsMap()
  316. res := &model.EventEstrusBatch{
  317. ExposeEstrusType: exposeEstrusType,
  318. EventEstrusList: make([]*model.EventEstrus, 0),
  319. EventMatingList: make([]*model.EventMating, 0),
  320. EarNumbers: make([]string, 0),
  321. }
  322. for _, item := range req.Items {
  323. cowInfo, err := s.GetCowInfoByEarNumber(ctx, pastureId, item.EarNumber)
  324. if err != nil {
  325. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  326. MessageID: "cow.cowNotExist",
  327. TemplateData: map[string]interface{}{
  328. "earNumber": item.EarNumber,
  329. },
  330. })
  331. return nil, xerr.Custom(messageId)
  332. }
  333. if cowInfo.Sex != pasturePb.Genders_Female {
  334. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  335. MessageID: "cow.cowSex",
  336. TemplateData: map[string]interface{}{
  337. "earNumber": cowInfo.EarNumber,
  338. },
  339. })
  340. return nil, xerr.Custom(messageId)
  341. }
  342. if int64(item.EstrusAt) <= cowInfo.BirthAt {
  343. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  344. MessageID: "validate.estrusDateBirthDate",
  345. TemplateData: map[string]interface{}{
  346. "earNumber": cowInfo.EarNumber,
  347. },
  348. })
  349. return nil, xerr.Customf(messageId)
  350. }
  351. if int64(item.EstrusAt) <= cowInfo.LastCalvingAt {
  352. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  353. MessageID: "validate.estrusDateLastCalvingDate",
  354. TemplateData: map[string]interface{}{
  355. "earNumber": cowInfo.EarNumber,
  356. },
  357. })
  358. return nil, xerr.Custom(messageId)
  359. }
  360. estrusAt := time.Unix(int64(item.EstrusAt), 0).Local().Format(model.LayoutDate2)
  361. estrusLocalStartTime := util.TimeParseLocalUnix(estrusAt)
  362. estrusLocalEndTime := util.TimeParseLocalEndUnix(estrusAt)
  363. isExists := s.FindEventEstrusByCowId(pastureId, cowInfo.Id, estrusLocalStartTime, estrusLocalEndTime)
  364. // 如果存在,并且当天已经提交过则跳过
  365. if isExists {
  366. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  367. MessageID: "validate.estrusDataAlready",
  368. TemplateData: map[string]interface{}{
  369. "earNumber": item.EarNumber,
  370. },
  371. })
  372. return nil, xerr.Customf(messageId)
  373. }
  374. operationUser, _ := s.GetSystemUserById(ctx, int64(item.OperationId))
  375. item.OperationName = operationUser.Name
  376. newEventEstrus := model.NewEventEstrus(
  377. pastureId, cowInfo, exposeEstrusType, pasturePb.IsShow_Ok,
  378. item.IsMating, int64(item.EstrusAt), operationUser, userModel.SystemUser,
  379. )
  380. if item.IsMating == pasturePb.IsShow_Ok {
  381. isExists = s.FindEventMatingByCowId(pastureId, cowInfo.Id)
  382. if isExists {
  383. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  384. MessageID: "validate.matingDataItemAlready",
  385. TemplateData: map[string]interface{}{
  386. "earNumber": item.EarNumber,
  387. },
  388. })
  389. return nil, xerr.Customf(messageId)
  390. }
  391. newEventMating := model.NewEventMating(pastureId, cowInfo, time.Now().Local().Unix(), exposeEstrusType)
  392. res.EventMatingList = append(res.EventMatingList, newEventMating)
  393. } else {
  394. newEventEstrus.UnMatingReasonsKind = item.UnMatingReasonsKind
  395. newEventEstrus.UnMatingReasonsName = unMatingReasonsMap[item.UnMatingReasonsKind]
  396. }
  397. newEventEstrus.Remarks = item.Remarks
  398. res.EventEstrusList = append(res.EventEstrusList, newEventEstrus)
  399. res.EarNumbers = append(res.EarNumbers, item.EarNumber)
  400. }
  401. return res, nil
  402. }
  403. func (s *StoreEntry) AbortionEventDataCheck(ctx context.Context, userModel *model.UserModel, items []*pasturePb.EventAbortionItem) ([]*AbortionCheckBatchModel, error) {
  404. if len(items) <= 0 {
  405. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  406. MessageID: "cow.selectCow",
  407. })
  408. return nil, xerr.Custom(messageId)
  409. }
  410. if len(items) > 50 {
  411. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  412. MessageID: "validate.dataLimit",
  413. })
  414. return nil, xerr.Custom(messageId)
  415. }
  416. abortionCheckBatchModelList := make([]*AbortionCheckBatchModel, 0)
  417. for _, item := range items {
  418. cow, err := s.GetCowInfoByEarNumber(ctx, userModel.AppPasture.Id, item.EarNumber)
  419. if err != nil {
  420. return nil, xerr.WithStack(err)
  421. }
  422. if cow.Sex != pasturePb.Genders_Female {
  423. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  424. MessageID: "cow.cowSex",
  425. TemplateData: map[string]interface{}{
  426. "earNumber": cow.EarNumber,
  427. },
  428. })
  429. return nil, xerr.Customf(messageId)
  430. }
  431. if cow.IsPregnant != pasturePb.IsShow_Ok {
  432. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  433. MessageID: "validate.CowNotPregnant",
  434. TemplateData: map[string]interface{}{
  435. "earNumber": cow.EarNumber,
  436. },
  437. })
  438. return nil, xerr.Customf(messageId)
  439. }
  440. if cow.BreedStatus != pasturePb.BreedStatus_Pregnant {
  441. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  442. MessageID: "validate.CowNotPregnant",
  443. TemplateData: map[string]interface{}{
  444. "earNumber": cow.EarNumber,
  445. },
  446. })
  447. return nil, xerr.Customf(messageId)
  448. }
  449. if cow.GetEventDayAge(int64(item.AbortionAt)) < 0 {
  450. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  451. MessageID: "validate.AbortionDateBirthDate",
  452. TemplateData: map[string]interface{}{
  453. "earNumber": item.EarNumber,
  454. },
  455. })
  456. return nil, xerr.Customf(messageId)
  457. }
  458. operationUser, err := s.GetSystemUserById(ctx, int64(item.OperationId))
  459. if err != nil {
  460. return nil, xerr.WithStack(err)
  461. }
  462. item.OperationName = operationUser.Name
  463. item.AbortionReasonsName = s.AbortionReasonsMap()[item.AbortionReasons]
  464. newEventAbortion := model.NewEventAbortion(userModel.AppPasture.Id, cow, item, pasturePb.IsShow_No)
  465. abortionCheckBatchModelList = append(abortionCheckBatchModelList, &AbortionCheckBatchModel{
  466. EventAbortion: newEventAbortion,
  467. Cow: cow,
  468. OperationUser: operationUser,
  469. IsLact: item.IsLact,
  470. })
  471. }
  472. return abortionCheckBatchModelList, nil
  473. }
  474. func (s *StoreEntry) ForbiddenMatingCheck(ctx context.Context, userModel *model.UserModel, items []*pasturePb.ForbiddenMatingItem) ([]*model.EventForbiddenMatingItem, error) {
  475. res := make([]*model.EventForbiddenMatingItem, 0)
  476. forbiddenMatingReasonsMap := s.ForbiddenMatingReasonsMap()
  477. for _, v := range items {
  478. cowInfo, err := s.GetCowInfoByEarNumber(ctx, userModel.AppPasture.Id, v.EarNumber)
  479. if err != nil {
  480. return nil, xerr.WithStack(err)
  481. }
  482. if cowInfo.Sex != pasturePb.Genders_Female {
  483. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  484. MessageID: "cow.cowSex",
  485. TemplateData: map[string]interface{}{
  486. "earNumber": cowInfo.EarNumber,
  487. },
  488. })
  489. return nil, xerr.Customf(messageId)
  490. }
  491. if v.ForbiddenMatingAt < int32(cowInfo.BirthAt) {
  492. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  493. MessageID: "validate.unMatingDate",
  494. TemplateData: map[string]interface{}{
  495. "earNumber": cowInfo.EarNumber,
  496. },
  497. })
  498. return nil, xerr.Customf(messageId)
  499. }
  500. operationUser, err := s.GetSystemUserById(ctx, int64(v.OperationId))
  501. if err != nil {
  502. return nil, xerr.WithStack(err)
  503. }
  504. res = append(res, &model.EventForbiddenMatingItem{
  505. Cow: cowInfo,
  506. ForbiddenMatingAt: int64(v.ForbiddenMatingAt),
  507. ForbiddenMatingReasonsKind: v.ForbiddenMatingReasonsKind,
  508. ForbiddenMatingReasonsName: forbiddenMatingReasonsMap[v.ForbiddenMatingReasonsKind],
  509. Remarks: v.Remarks,
  510. OperationUser: operationUser,
  511. MessageUser: userModel.SystemUser,
  512. })
  513. }
  514. return res, nil
  515. }
  516. func (s *StoreEntry) DeathCheck(ctx context.Context, userModel *model.UserModel, req *pasturePb.EventDeathBatch) ([]*model.EventDeathModel, error) {
  517. newEventDeathList := make([]*model.EventDeathModel, 0)
  518. for _, item := range req.Items {
  519. cow, err := s.GetCowInfoByEarNumber(ctx, userModel.AppPasture.Id, item.EarNumber)
  520. if err != nil {
  521. return nil, xerr.WithStack(err)
  522. }
  523. if cow.BirthAt <= int64(item.DeathAt) {
  524. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  525. MessageID: "validate.deathTime",
  526. TemplateData: map[string]interface{}{
  527. "earNumber": cow.EarNumber,
  528. },
  529. })
  530. return nil, xerr.Customf(messageId)
  531. }
  532. lastEventLog, _ := s.GetEventCowLog(ctx, userModel.AppPasture.Id, cow.Id)
  533. if lastEventLog != nil && int64(item.DeathAt) < lastEventLog.EventAt {
  534. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  535. MessageID: "validate.deathTimeLastEvent",
  536. TemplateData: map[string]interface{}{
  537. "earNumber": cow.EarNumber,
  538. },
  539. })
  540. return nil, xerr.Customf(messageId)
  541. }
  542. if name, ok := s.DeadReasonMap()[item.DeathReasonKind]; ok {
  543. item.DeathReasonName = name
  544. }
  545. operationUser, err := s.GetSystemUserById(ctx, int64(item.OperationId))
  546. if err != nil {
  547. zaplog.Error("DeathBatch", zap.Any("item", item), zap.Any("err", err))
  548. messageId, _ := userModel.LanguageContent.Localize(&i18n.LocalizeConfig{
  549. MessageID: "auth.getOperationError",
  550. })
  551. return nil, xerr.Customf(messageId)
  552. }
  553. if name, ok := s.CowDeathDestinationMap()[item.DeathDestinationKind]; ok {
  554. item.DeathDestinationName = name
  555. }
  556. newEventDeath := model.NewEventDeath(userModel.AppPasture.Id, cow, item, userModel.SystemUser, operationUser)
  557. eventDeathModel := &model.EventDeathModel{
  558. Cow: cow,
  559. EventDeath: newEventDeath,
  560. NeckRing: nil,
  561. CalvingCalf: nil,
  562. }
  563. // 犊牛死亡更新
  564. if cow.DayAge <= model.CalfDefaultDayAge {
  565. calvingCalf, ok := s.IsExistCalvingCalf(userModel.AppPasture.Id, cow.Id)
  566. if ok && calvingCalf != nil {
  567. eventDeathModel.CalvingCalf = calvingCalf
  568. }
  569. }
  570. if neckRing, ok := s.NeckRingIsExist(userModel.AppPasture.Id, item.EarNumber); ok && neckRing != nil {
  571. eventDeathModel.NeckRing = neckRing
  572. }
  573. newEventDeathList = append(newEventDeathList, eventDeathModel)
  574. }
  575. return newEventDeathList, nil
  576. }