event_health.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. package backend
  2. import (
  3. "context"
  4. "fmt"
  5. "kpt-pasture/model"
  6. "net/http"
  7. "time"
  8. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  9. "go.uber.org/zap"
  10. "gorm.io/gorm"
  11. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  12. "gitee.com/xuyiping_admin/pkg/xerr"
  13. )
  14. // CowDiseaseList 发病牛只清单
  15. func (s *StoreEntry) CowDiseaseList(ctx context.Context, req *pasturePb.SearchEventCowTreatmentRequest, pagination *pasturePb.PaginationModel) (*pasturePb.EventCowDiseaseResponse, error) {
  16. userModel, err := s.GetUserModel(ctx)
  17. if err != nil {
  18. return nil, xerr.WithStack(err)
  19. }
  20. cowDiseaseList := make([]*model.EventCowDisease, 0)
  21. var count int64 = 0
  22. pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventCowDisease).TableName())).
  23. Joins(fmt.Sprintf("JOIN %s AS b on a.cow_id = b.id", new(model.Cow).TableName())).
  24. Select("a.*,b.pen_name").
  25. Where("a.pasture_id = ?", userModel.AppPasture.Id).
  26. Where("b.admission_status = ?", pasturePb.AdmissionStatus_Admission)
  27. if len(req.CowIds) > 0 {
  28. pref.Where("a.cow_id IN ?", req.CowIds)
  29. }
  30. if req.EarNumber != "" {
  31. pref.Where("a.ear_number = ?", req.EarNumber)
  32. }
  33. if req.DiseaseId > 0 {
  34. pref.Where("a.disease_id = ?", req.DiseaseId)
  35. }
  36. if req.PenId > 0 {
  37. pref.Where("b.pen_id = ?", req.PenId)
  38. }
  39. if req.HealthStatus > 0 {
  40. pref.Where("a.health_status = ?", req.HealthStatus)
  41. }
  42. if req.DiseasedStartAt > 0 && req.DiseaseEndAt > 0 && req.DiseaseEndAt >= req.DiseasedStartAt {
  43. pref.Where("a.disease_at BETWEEN ? AND ?", req.DiseasedStartAt, req.DiseaseEndAt)
  44. }
  45. if err = pref.Order("b.health_status").
  46. Count(&count).
  47. Limit(int(pagination.PageSize)).
  48. Offset(int(pagination.PageOffset)).
  49. Find(&cowDiseaseList).Error; err != nil {
  50. return nil, xerr.WithStack(err)
  51. }
  52. healthStatusMap := s.HealthStatusMap()
  53. return &pasturePb.EventCowDiseaseResponse{
  54. Code: http.StatusOK,
  55. Msg: "ok",
  56. Data: &pasturePb.EventCowDiseaseData{
  57. List: model.EventCowDiseaseSlice(cowDiseaseList).ToPB(healthStatusMap),
  58. Total: int32(count),
  59. PageSize: pagination.PageSize,
  60. Page: pagination.Page,
  61. },
  62. }, nil
  63. }
  64. // CowDiseaseCreate 牛只发病提交
  65. func (s *StoreEntry) CowDiseaseCreate(ctx context.Context, req *pasturePb.EventCowDiseaseRequest, source string) error {
  66. userModel, err := s.GetUserModel(ctx)
  67. if err != nil {
  68. return xerr.WithStack(err)
  69. }
  70. pastureId := userModel.AppPasture.Id
  71. // 牛只信息
  72. cow, err := s.GetCowInfoByEarNumber(ctx, pastureId, req.EarNumber)
  73. if err != nil {
  74. return xerr.Customf("牛只信息错误: %d", req.CowId)
  75. }
  76. if cow.GetEventDayAge(int64(req.DiseaseAt)) < 0 {
  77. return xerr.Customf("牛号: %s,发病时间不能早于牛只出生时间", cow.EarNumber)
  78. }
  79. operationUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
  80. if err != nil {
  81. return xerr.Customf("请检查操作人信息")
  82. }
  83. disease, err := s.GetDiseaseById(ctx, pastureId, req.DiseaseId)
  84. if err != nil {
  85. return xerr.WithStack(err)
  86. }
  87. var alreadyCount int64
  88. if err = s.DB.Model(new(model.EventCowDisease)).
  89. Where("cow_id = ?", cow.Id).
  90. Where("disease_id = ?", disease.Id).
  91. Where(s.DB.Where("health_status = ?", pasturePb.HealthStatus_Disease).Or("health_status = ?", pasturePb.HealthStatus_Treatment)).
  92. Count(&alreadyCount).Error; err != nil {
  93. return xerr.Customf("该牛只已存在该疾病")
  94. }
  95. if alreadyCount > 0 {
  96. return xerr.Customf("该牛只已存在该疾病")
  97. }
  98. // 牛只疾病信息
  99. newEventCowDisease := model.NewEventCowDisease(pastureId, cow, disease, req, operationUser, userModel.SystemUser)
  100. // PC端h和脖环揭发直接跳过诊断过程
  101. if source == model.SourcePC || req.ExposeDiseaseType == pasturePb.ExposeDiseaseType_Neck_Ring {
  102. newEventCowDisease.DiagnosedResult = pasturePb.IsShow_Ok
  103. newEventCowDisease.DiagnoseOperationId = int32(operationUser.Id)
  104. newEventCowDisease.DiagnoseOperationName = operationUser.Name
  105. newEventCowDisease.Source = model.SourcePC
  106. newEventCowDisease.DiagnoseId = req.DiseaseId
  107. newEventCowDisease.DiagnoseName = disease.Name
  108. newEventCowDisease.HealthStatus = pasturePb.HealthStatus_Disease
  109. }
  110. if req.PrescriptionId > 0 || len(req.PrescriptionDetail) > 0 {
  111. newEventCowDisease.HealthStatus = pasturePb.HealthStatus_Treatment
  112. newEventCowDisease.DiagnosedResult = pasturePb.IsShow_Ok
  113. newEventCowDisease.FirstTreatmentAt = int64(req.DiseaseAt)
  114. newEventCowDisease.LastTreatmentAt = int64(req.DiseaseAt)
  115. newEventCowDisease.DiagnoseId = int32(disease.Id)
  116. newEventCowDisease.DiagnoseName = disease.Name
  117. }
  118. prescription := &model.Prescription{}
  119. prescriptionDetail := make([]*pasturePb.PrescriptionDrugsList, 0)
  120. // 获取处方信息
  121. if req.PrescriptionId > 0 {
  122. prescription, err = s.GetPrescriptionById(ctx, pastureId, req.PrescriptionId)
  123. if err != nil {
  124. return xerr.WithStack(err)
  125. }
  126. prescriptionDrugs, err := s.PrescriptionDrugsByPrescriptionId(ctx, pastureId, prescription.Id)
  127. if err != nil {
  128. return xerr.WithStack(err)
  129. }
  130. prescriptionDetail = model.PrescriptionDrugsSlice(prescriptionDrugs).ToPB()
  131. }
  132. // 创建新的处方
  133. if req.PrescriptionId <= 0 && len(req.PrescriptionDetail) > 0 {
  134. newPrescriptionRequest := &pasturePb.PrescriptionRequest{
  135. Name: fmt.Sprintf("%s-%s-%s", disease.Name, time.Now().Local().Format("20060102"), operationUser.Name),
  136. ApplicableDiseaseIds: []int32{req.DiseaseId},
  137. IsShow: pasturePb.IsShow_Ok,
  138. }
  139. prescription = model.NewPrescription(
  140. pastureId, newPrescriptionRequest, fmt.Sprintf("%d", disease.Id),
  141. 1, 0, 0, userModel.SystemUser,
  142. )
  143. if err = s.DB.Model(new(model.Prescription)).
  144. Create(prescription).Error; err != nil {
  145. zaplog.Error("CowDiseaseCreate", zap.Any("err", err), zap.Any("prescription", prescription))
  146. return xerr.Customf("创建处方错误: %s", err.Error())
  147. }
  148. newPrescriptionDrugs := model.NewPrescriptionDrugs(pastureId, prescription.Id, req.PrescriptionDetail)
  149. if err = s.DB.Model(new(model.PrescriptionDrugs)).
  150. Create(newPrescriptionDrugs).Error; err != nil {
  151. return xerr.WithStack(err)
  152. }
  153. prescriptionDetail = model.PrescriptionDrugsSlice(newPrescriptionDrugs).ToPB()
  154. }
  155. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  156. lastPrescriptionName := ""
  157. // 1. 更新处方使用次数
  158. if prescription.Id > 0 {
  159. prescription.EventUseCountUpdate() // 处方使用次数+1
  160. if err = tx.Model(new(model.Prescription)).
  161. Select("use_count").
  162. Where("id = ?", prescription.Id).
  163. Updates(prescription).Error; err != nil {
  164. return xerr.WithStack(err)
  165. }
  166. lastPrescriptionName = prescription.Name
  167. // 记录事件日志
  168. cowLogs := s.SubmitEventLog(ctx, pastureId, cow, pasturePb.EventType_Disease, newEventCowDisease)
  169. if err = tx.Table(cowLogs.TableName()).Create(cowLogs).Error; err != nil {
  170. return xerr.WithStack(err)
  171. }
  172. }
  173. // 2. 创建牛只疾病信息
  174. newEventCowDisease.LastPrescriptionName = lastPrescriptionName
  175. if err = tx.Model(new(model.EventCowDisease)).
  176. Create(newEventCowDisease).Error; err != nil {
  177. return xerr.WithStack(err)
  178. }
  179. // 3. 创建治疗记录
  180. if len(prescriptionDetail) > 0 {
  181. diseaseTypeMap := s.DiseaseTypeMap()
  182. newCowTreatmentRequest := &pasturePb.CowTreatmentRequest{
  183. CowId: req.CowId,
  184. PrescriptionId: prescription.Id,
  185. DiseaseId: int32(disease.Id),
  186. DiseaseName: disease.Name,
  187. DiseaseType: disease.DiseaseType,
  188. PrescriptionDetail: prescriptionDetail,
  189. TreatmentResult: pasturePb.TreatmentResult_GoOn,
  190. Remarks: req.Remarks,
  191. TreatmentAt: req.DiseaseAt,
  192. }
  193. newEventCowTreatment := model.NewEventCowTreatment(pastureId, prescription, newCowTreatmentRequest, diseaseTypeMap, operationUser, userModel.SystemUser)
  194. newEventCowTreatment.CowDiseaseId = newEventCowDisease.Id
  195. if err = tx.Model(new(model.EventCowTreatment)).
  196. Create(newEventCowTreatment).Error; err != nil {
  197. return xerr.WithStack(err)
  198. }
  199. }
  200. // 更新牛只健康状态
  201. if newEventCowDisease.HealthStatus == pasturePb.HealthStatus_Disease || newEventCowDisease.HealthStatus == pasturePb.HealthStatus_Treatment {
  202. cow.EventHealthStatusUpdate(newEventCowDisease.HealthStatus)
  203. if err = s.DB.Model(new(model.Cow)).
  204. Select("health_status").
  205. Where("id = ?", req.CowId).
  206. Updates(cow).Error; err != nil {
  207. zaplog.Error("CowDiseaseCreate", zap.Any("EventHealthStatusUpdate", err))
  208. }
  209. }
  210. // 更新栏舍信息
  211. if req.PenId > 0 {
  212. penMap := s.PenMap(ctx, userModel.AppPasture.Id)
  213. if penData, ok := penMap[req.PenId]; ok {
  214. cow.EventPenUpdate(penData)
  215. if err = s.DB.Model(new(model.Cow)).
  216. Select("pen_id", "pen_name").
  217. Where("id = ?", cow.Id).
  218. Updates(cow).Error; err != nil {
  219. zaplog.Error("CowDiseaseCreate", zap.Any("EventPenUpdate", err))
  220. }
  221. }
  222. }
  223. // 4. 如果是脖环揭发
  224. if req.ExposeDiseaseType == pasturePb.ExposeDiseaseType_Neck_Ring {
  225. if err = s.NeckRingUpdateHealth(ctx, pastureId, cow.Id, operationUser); err != nil {
  226. return xerr.WithStack(err)
  227. }
  228. }
  229. return nil
  230. }); err != nil {
  231. return xerr.WithStack(err)
  232. }
  233. return nil
  234. }
  235. // CowDiseaseDiagnose 发病牛只诊断
  236. func (s *StoreEntry) CowDiseaseDiagnose(ctx context.Context, req *pasturePb.CowDiagnosedRequest) error {
  237. userModel, err := s.GetUserModel(ctx)
  238. if err != nil {
  239. return xerr.WithStack(err)
  240. }
  241. cow, err := s.GetCowInfoByCowId(ctx, userModel.AppPasture.Id, int64(req.CowId))
  242. if err != nil {
  243. return xerr.Customf("错误的牛只信息: %d", req.CowId)
  244. }
  245. eventCowDisease := &model.EventCowDisease{}
  246. if err = s.DB.Model(new(model.EventCowDisease)).
  247. Where("cow_id = ?", req.CowId).
  248. Where("id = ?", req.Id).
  249. Where("health_status = ?", pasturePb.HealthStatus_Health).
  250. Where("pasture_id = ?", userModel.AppPasture.Id).
  251. First(eventCowDisease).Error; err != nil {
  252. zaplog.Error("CowDiseaseDiagnose", zap.Any("req", req), zap.Any("userModel", userModel))
  253. return xerr.Custom("异常牛只数据")
  254. }
  255. if eventCowDisease == nil || eventCowDisease.Id <= 0 {
  256. return xerr.Custom("异常牛只数据")
  257. }
  258. if req.DiagnosedResult == pasturePb.IsShow_No {
  259. // 未发病更新
  260. eventCowDisease.EventUnDiseaseUpdate(userModel.SystemUser, req.Remarks)
  261. if err = s.DB.Model(eventCowDisease).
  262. Select("diagnosed_result", "diagnose_operation_id", "diagnose_operation_name", "remarks").
  263. Where("id = ?", req.Id).
  264. Updates(eventCowDisease).Error; err != nil {
  265. return xerr.WithStack(err)
  266. }
  267. return nil
  268. }
  269. // 已发病
  270. disease, err := s.GetDiseaseById(ctx, userModel.AppPasture.Id, req.DiseaseId)
  271. if err != nil {
  272. return xerr.WithStack(err)
  273. }
  274. systemUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
  275. if err != nil {
  276. return xerr.WithStack(err)
  277. }
  278. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  279. eventCowDisease.EventDiseaseUpdate(disease, systemUser, req.Temperature)
  280. if err = tx.Model(eventCowDisease).
  281. Select("health_status", "diagnosed_result", "diagnose_id", "diagnose_name", "temperature", "diagnose_operation_id", "diagnose_operation_name", "diagnosed_at").
  282. Where("id = ?", req.Id).
  283. Where("cow_id = ?", req.CowId).
  284. Updates(eventCowDisease).Error; err != nil {
  285. return xerr.WithStack(err)
  286. }
  287. cow.EventHealthStatusUpdate(pasturePb.HealthStatus_Disease)
  288. if err = tx.Model(cow).
  289. Select("health_status").
  290. Where("id = ?", cow.Id).
  291. Updates(cow).Error; err != nil {
  292. return xerr.WithStack(err)
  293. }
  294. // 记录事件日志
  295. cowLogs := s.SubmitEventLog(ctx, userModel.AppPasture.Id, cow, pasturePb.EventType_Disease, eventCowDisease)
  296. if err = tx.Table(cowLogs.TableName()).Create(cowLogs).Error; err != nil {
  297. return xerr.WithStack(err)
  298. }
  299. return nil
  300. }); err != nil {
  301. return xerr.WithStack(err)
  302. }
  303. return nil
  304. }
  305. // CowDiseaseTreatment 发病牛只治疗
  306. func (s *StoreEntry) CowDiseaseTreatment(ctx context.Context, req *pasturePb.CowTreatmentRequest) error {
  307. userModel, err := s.GetUserModel(ctx)
  308. if err != nil {
  309. return xerr.WithStack(err)
  310. }
  311. pastureId := userModel.AppPasture.Id
  312. cow, err := s.GetCowInfoByCowId(ctx, pastureId, int64(req.CowId))
  313. if err != nil {
  314. return xerr.WithStack(err)
  315. }
  316. // 操作人信息
  317. operationUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
  318. if err != nil {
  319. return xerr.Customf("操作人数据异常: %d", req.OperationId)
  320. }
  321. // 处方信息
  322. prescription, err := s.GetPrescriptionById(ctx, pastureId, req.PrescriptionId)
  323. if err != nil {
  324. return xerr.WithStack(err)
  325. }
  326. // 疾病信息
  327. disease, err := s.GetDiseaseById(ctx, pastureId, req.DiseaseId)
  328. if err != nil {
  329. return xerr.WithStack(err)
  330. }
  331. req.DiseaseName = disease.Name
  332. req.DiseaseType = disease.DiseaseType
  333. // 处方信息
  334. prescriptionDrugs, err := s.PrescriptionDrugsByPrescriptionId(ctx, pastureId, prescription.Id)
  335. if err != nil {
  336. return xerr.WithStack(err)
  337. }
  338. // 牛只疾病信息
  339. eventCowDisease := &model.EventCowDisease{}
  340. if err = s.DB.Where("cow_id = ?", req.CowId).
  341. Where("pasture_id = ?", userModel.AppPasture.Id).
  342. Where("id = ?", req.Id).
  343. First(eventCowDisease).Error; err != nil {
  344. return xerr.WithStack(err)
  345. }
  346. if eventCowDisease.HealthStatus != pasturePb.HealthStatus_Disease &&
  347. eventCowDisease.HealthStatus != pasturePb.HealthStatus_Treatment {
  348. return xerr.Custom("异常牛只数据")
  349. }
  350. if eventCowDisease.DiagnosedAt < int64(req.TreatmentAt) {
  351. return xerr.Custom("治疗时间不能大于确诊时间")
  352. }
  353. // 处方详情
  354. unitMap := s.UnitMap()
  355. prescriptionDetail := make([]*pasturePb.PrescriptionDrugsList, len(prescriptionDrugs))
  356. for i, v := range prescriptionDrugs {
  357. prescriptionDetail[i] = &pasturePb.PrescriptionDrugsList{
  358. DrugsId: int32(v.DrugsId),
  359. DrugsName: v.DrugsName,
  360. Unit: v.Unit,
  361. UnitName: unitMap[v.Unit],
  362. Dosages: v.Dosages,
  363. }
  364. }
  365. req.PrescriptionDetail = prescriptionDetail
  366. healthStatus := pasturePb.HealthStatus_Treatment
  367. if req.TreatmentResult == pasturePb.TreatmentResult_Curable {
  368. healthStatus = pasturePb.HealthStatus_Curable
  369. }
  370. if req.TreatmentResult == pasturePb.TreatmentResult_Out {
  371. healthStatus = pasturePb.HealthStatus_Out
  372. }
  373. if req.TreatmentResult == pasturePb.TreatmentResult_Dead {
  374. healthStatus = pasturePb.HealthStatus_Dead
  375. }
  376. diseaseTypeMap := s.DiseaseTypeMap()
  377. newEventCowTreatment := model.NewEventCowTreatment(pastureId, prescription, req, diseaseTypeMap, operationUser, userModel.SystemUser)
  378. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  379. if err = tx.Create(newEventCowTreatment).Error; err != nil {
  380. return xerr.WithStack(err)
  381. }
  382. eventCowDisease.EventTreatmentUpdate(healthStatus, int64(req.TreatmentAt), prescription.Name)
  383. if err = tx.Model(eventCowDisease).
  384. Select("health_status", "first_treatment_at", "last_treatment_at", "last_prescription_name").
  385. Where("id = ?", req.Id).
  386. Where("cow_id = ?", req.CowId).
  387. Updates(eventCowDisease).Error; err != nil {
  388. return xerr.WithStack(err)
  389. }
  390. cow.EventHealthStatusUpdate(healthStatus)
  391. if err = tx.Model(new(model.Cow)).
  392. Select("health_status").
  393. Where("id = ?", req.CowId).
  394. Updates(cow).Error; err != nil {
  395. return xerr.WithStack(err)
  396. }
  397. prescription.EventUseCountUpdate()
  398. if err = tx.Model(prescription).
  399. Select("use_count").
  400. Where("id = ?", prescription.Id).
  401. Updates(prescription).Error; err != nil {
  402. return xerr.WithStack(err)
  403. }
  404. return nil
  405. }); err != nil {
  406. return xerr.WithStack(err)
  407. }
  408. return nil
  409. }