event_health.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  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. operationUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
  77. if err != nil {
  78. return xerr.Customf("请检查操作人信息")
  79. }
  80. disease, err := s.GetDiseaseById(ctx, pastureId, req.DiseaseId)
  81. if err != nil {
  82. return xerr.WithStack(err)
  83. }
  84. var alreadyCount int64
  85. if err = s.DB.Model(new(model.EventCowDisease)).
  86. Where("cow_id = ?", cow.Id).
  87. Where("disease_id = ?", disease.Id).
  88. Where(s.DB.Where("health_status = ?", pasturePb.HealthStatus_Disease).Or("health_status = ?", pasturePb.HealthStatus_Treatment)).
  89. Count(&alreadyCount).Error; err != nil {
  90. return xerr.Customf("该牛只已存在该疾病")
  91. }
  92. if alreadyCount > 0 {
  93. return xerr.Customf("该牛只已存在该疾病")
  94. }
  95. // 牛只疾病信息
  96. newEventCowDisease := model.NewEventCowDisease(pastureId, cow, disease, req, operationUser, userModel.SystemUser)
  97. // PC端h和脖环揭发直接跳过诊断过程
  98. if source == model.SourcePC || req.ExposeDiseaseType == pasturePb.ExposeDiseaseType_Neck_Ring {
  99. newEventCowDisease.DiagnosedResult = pasturePb.IsShow_Ok
  100. newEventCowDisease.DiagnoseOperationId = int32(operationUser.Id)
  101. newEventCowDisease.DiagnoseOperationName = operationUser.Name
  102. newEventCowDisease.Source = model.SourcePC
  103. newEventCowDisease.DiagnoseId = req.DiseaseId
  104. newEventCowDisease.DiagnoseName = disease.Name
  105. newEventCowDisease.HealthStatus = pasturePb.HealthStatus_Disease
  106. }
  107. if req.PrescriptionId > 0 || len(req.PrescriptionDetail) > 0 {
  108. newEventCowDisease.HealthStatus = pasturePb.HealthStatus_Treatment
  109. newEventCowDisease.DiagnosedResult = pasturePb.IsShow_Ok
  110. newEventCowDisease.FirstTreatmentAt = int64(req.DiseaseAt)
  111. newEventCowDisease.LastTreatmentAt = int64(req.DiseaseAt)
  112. newEventCowDisease.DiagnoseId = int32(disease.Id)
  113. newEventCowDisease.DiagnoseName = disease.Name
  114. }
  115. prescription := &model.Prescription{}
  116. prescriptionDetail := make([]*pasturePb.PrescriptionDrugsList, 0)
  117. // 获取处方信息
  118. if req.PrescriptionId > 0 {
  119. prescription, err = s.GetPrescriptionById(ctx, pastureId, req.PrescriptionId)
  120. if err != nil {
  121. return xerr.WithStack(err)
  122. }
  123. prescriptionDrugs, err := s.PrescriptionDrugsByPrescriptionId(ctx, pastureId, prescription.Id)
  124. if err != nil {
  125. return xerr.WithStack(err)
  126. }
  127. prescriptionDetail = model.PrescriptionDrugsSlice(prescriptionDrugs).ToPB()
  128. }
  129. // 创建新的处方
  130. if req.PrescriptionId <= 0 && len(req.PrescriptionDetail) > 0 {
  131. newPrescriptionRequest := &pasturePb.PrescriptionRequest{
  132. Name: fmt.Sprintf("%s-%s-%s", disease.Name, time.Now().Local().Format("20060102"), operationUser.Name),
  133. ApplicableDiseaseIds: []int32{req.DiseaseId},
  134. IsShow: pasturePb.IsShow_Ok,
  135. }
  136. prescription = model.NewPrescription(
  137. pastureId, newPrescriptionRequest, fmt.Sprintf("%d", disease.Id),
  138. 1, 0, 0, userModel.SystemUser,
  139. )
  140. if err = s.DB.Model(new(model.Prescription)).
  141. Create(prescription).Error; err != nil {
  142. zaplog.Error("CowDiseaseCreate", zap.Any("err", err), zap.Any("prescription", prescription))
  143. return xerr.Customf("创建处方错误: %s", err.Error())
  144. }
  145. newPrescriptionDrugs := model.NewPrescriptionDrugs(pastureId, prescription.Id, req.PrescriptionDetail)
  146. if err = s.DB.Model(new(model.PrescriptionDrugs)).
  147. Create(newPrescriptionDrugs).Error; err != nil {
  148. return xerr.WithStack(err)
  149. }
  150. prescriptionDetail = model.PrescriptionDrugsSlice(newPrescriptionDrugs).ToPB()
  151. }
  152. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  153. lastPrescriptionName := ""
  154. // 1. 更新处方使用次数
  155. if prescription.Id > 0 {
  156. prescription.EventUseCountUpdate() // 处方使用次数+1
  157. if err = tx.Model(new(model.Prescription)).
  158. Select("use_count").
  159. Where("id = ?", prescription.Id).
  160. Updates(prescription).Error; err != nil {
  161. return xerr.WithStack(err)
  162. }
  163. lastPrescriptionName = prescription.Name
  164. // 记录事件日志
  165. cowLogs := s.SubmitEventLog(ctx, pastureId, cow, pasturePb.EventType_Disease, newEventCowDisease)
  166. if err = tx.Table(cowLogs.TableName()).Create(cowLogs).Error; err != nil {
  167. return xerr.WithStack(err)
  168. }
  169. }
  170. // 2. 创建牛只疾病信息
  171. newEventCowDisease.LastPrescriptionName = lastPrescriptionName
  172. if err = tx.Model(new(model.EventCowDisease)).
  173. Create(newEventCowDisease).Error; err != nil {
  174. return xerr.WithStack(err)
  175. }
  176. // 3. 创建治疗记录
  177. if len(prescriptionDetail) > 0 {
  178. diseaseTypeMap := s.DiseaseTypeMap()
  179. newCowTreatmentRequest := &pasturePb.CowTreatmentRequest{
  180. CowId: req.CowId,
  181. PrescriptionId: prescription.Id,
  182. DiseaseId: int32(disease.Id),
  183. DiseaseName: disease.Name,
  184. DiseaseType: disease.DiseaseType,
  185. PrescriptionDetail: prescriptionDetail,
  186. TreatmentResult: pasturePb.TreatmentResult_GoOn,
  187. Remarks: req.Remarks,
  188. TreatmentAt: req.DiseaseAt,
  189. }
  190. newEventCowTreatment := model.NewEventCowTreatment(pastureId, prescription, newCowTreatmentRequest, diseaseTypeMap, operationUser, userModel.SystemUser)
  191. newEventCowTreatment.CowDiseaseId = newEventCowDisease.Id
  192. if err = tx.Model(new(model.EventCowTreatment)).
  193. Create(newEventCowTreatment).Error; err != nil {
  194. return xerr.WithStack(err)
  195. }
  196. }
  197. // 更新牛只健康状态
  198. if newEventCowDisease.HealthStatus == pasturePb.HealthStatus_Disease || newEventCowDisease.HealthStatus == pasturePb.HealthStatus_Treatment {
  199. cow.EventHealthStatusUpdate(newEventCowDisease.HealthStatus)
  200. if err = s.DB.Model(new(model.Cow)).
  201. Select("health_status").
  202. Where("id = ?", req.CowId).
  203. Updates(cow).Error; err != nil {
  204. zaplog.Error("CowDiseaseCreate", zap.Any("EventHealthStatusUpdate", err))
  205. }
  206. }
  207. // 更新栏舍信息
  208. if req.PenId > 0 {
  209. penMap := s.PenMap(ctx, userModel.AppPasture.Id)
  210. if penData, ok := penMap[req.PenId]; ok {
  211. cow.EventPenUpdate(penData)
  212. if err = s.DB.Model(new(model.Cow)).
  213. Select("pen_id", "pen_name").
  214. Where("id = ?", cow.Id).
  215. Updates(cow).Error; err != nil {
  216. zaplog.Error("CowDiseaseCreate", zap.Any("EventPenUpdate", err))
  217. }
  218. }
  219. }
  220. // 4. 如果是脖环揭发
  221. if req.ExposeDiseaseType == pasturePb.ExposeDiseaseType_Neck_Ring {
  222. if err = s.NeckRingUpdateHealth(ctx, pastureId, cow.Id, operationUser); err != nil {
  223. return xerr.WithStack(err)
  224. }
  225. }
  226. return nil
  227. }); err != nil {
  228. return xerr.WithStack(err)
  229. }
  230. return nil
  231. }
  232. // CowDiseaseDiagnose 发病牛只诊断
  233. func (s *StoreEntry) CowDiseaseDiagnose(ctx context.Context, req *pasturePb.CowDiagnosedRequest) error {
  234. userModel, err := s.GetUserModel(ctx)
  235. if err != nil {
  236. return xerr.WithStack(err)
  237. }
  238. cow, err := s.GetCowInfoByCowId(ctx, userModel.AppPasture.Id, int64(req.CowId))
  239. if err != nil {
  240. return xerr.Customf("错误的牛只信息: %d", req.CowId)
  241. }
  242. eventCowDisease := &model.EventCowDisease{}
  243. if err = s.DB.Model(new(model.EventCowDisease)).
  244. Where("cow_id = ?", req.CowId).
  245. Where("id = ?", req.Id).
  246. Where("health_status = ?", pasturePb.HealthStatus_Health).
  247. Where("pasture_id = ?", userModel.AppPasture.Id).
  248. First(eventCowDisease).Error; err != nil {
  249. zaplog.Error("CowDiseaseDiagnose", zap.Any("req", req), zap.Any("userModel", userModel))
  250. return xerr.Custom("异常牛只数据")
  251. }
  252. if eventCowDisease == nil || eventCowDisease.Id <= 0 {
  253. return xerr.Custom("异常牛只数据")
  254. }
  255. if req.DiagnosedResult == pasturePb.IsShow_No {
  256. // 未发病更新
  257. eventCowDisease.EventUnDiseaseUpdate(userModel.SystemUser, req.Remarks)
  258. if err = s.DB.Model(eventCowDisease).
  259. Select("diagnosed_result", "diagnose_operation_id", "diagnose_operation_name", "remarks").
  260. Where("id = ?", req.Id).
  261. Updates(eventCowDisease).Error; err != nil {
  262. return xerr.WithStack(err)
  263. }
  264. return nil
  265. }
  266. // 已发病
  267. disease, err := s.GetDiseaseById(ctx, userModel.AppPasture.Id, req.DiseaseId)
  268. if err != nil {
  269. return xerr.WithStack(err)
  270. }
  271. systemUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
  272. if err != nil {
  273. return xerr.WithStack(err)
  274. }
  275. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  276. eventCowDisease.EventDiseaseUpdate(disease, systemUser, req.Temperature)
  277. if err = tx.Model(eventCowDisease).
  278. Select("health_status", "diagnosed_result", "diagnose_id", "diagnose_name", "temperature", "diagnose_operation_id", "diagnose_operation_name", "diagnosed_at").
  279. Where("id = ?", req.Id).
  280. Where("cow_id = ?", req.CowId).
  281. Updates(eventCowDisease).Error; err != nil {
  282. return xerr.WithStack(err)
  283. }
  284. cow.EventHealthStatusUpdate(pasturePb.HealthStatus_Disease)
  285. if err = tx.Model(cow).
  286. Select("health_status").
  287. Where("id = ?", cow.Id).
  288. Updates(cow).Error; err != nil {
  289. return xerr.WithStack(err)
  290. }
  291. // 记录事件日志
  292. cowLogs := s.SubmitEventLog(ctx, userModel.AppPasture.Id, cow, pasturePb.EventType_Disease, eventCowDisease)
  293. if err = tx.Table(cowLogs.TableName()).Create(cowLogs).Error; err != nil {
  294. return xerr.WithStack(err)
  295. }
  296. return nil
  297. }); err != nil {
  298. return xerr.WithStack(err)
  299. }
  300. return nil
  301. }
  302. // CowDiseaseTreatment 发病牛只治疗
  303. func (s *StoreEntry) CowDiseaseTreatment(ctx context.Context, req *pasturePb.CowTreatmentRequest) error {
  304. userModel, err := s.GetUserModel(ctx)
  305. if err != nil {
  306. return xerr.WithStack(err)
  307. }
  308. pastureId := userModel.AppPasture.Id
  309. cow, err := s.GetCowInfoByCowId(ctx, pastureId, int64(req.CowId))
  310. if err != nil {
  311. return xerr.WithStack(err)
  312. }
  313. // 操作人信息
  314. operationUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
  315. if err != nil {
  316. return xerr.Customf("操作人数据异常: %d", req.OperationId)
  317. }
  318. // 处方信息
  319. prescription, err := s.GetPrescriptionById(ctx, pastureId, req.PrescriptionId)
  320. if err != nil {
  321. return xerr.WithStack(err)
  322. }
  323. // 疾病信息
  324. disease, err := s.GetDiseaseById(ctx, pastureId, req.DiseaseId)
  325. if err != nil {
  326. return xerr.WithStack(err)
  327. }
  328. req.DiseaseName = disease.Name
  329. req.DiseaseType = disease.DiseaseType
  330. // 处方信息
  331. prescriptionDrugs, err := s.PrescriptionDrugsByPrescriptionId(ctx, pastureId, prescription.Id)
  332. if err != nil {
  333. return xerr.WithStack(err)
  334. }
  335. // 牛只疾病信息
  336. eventCowDisease := &model.EventCowDisease{}
  337. if err = s.DB.Where("cow_id = ?", req.CowId).
  338. Where("pasture_id = ?", userModel.AppPasture.Id).
  339. Where("id = ?", req.Id).
  340. First(eventCowDisease).Error; err != nil {
  341. return xerr.WithStack(err)
  342. }
  343. if eventCowDisease.HealthStatus != pasturePb.HealthStatus_Disease &&
  344. eventCowDisease.HealthStatus != pasturePb.HealthStatus_Treatment {
  345. return xerr.Custom("异常牛只数据")
  346. }
  347. // 处方详情
  348. unitMap := s.UnitMap()
  349. prescriptionDetail := make([]*pasturePb.PrescriptionDrugsList, len(prescriptionDrugs))
  350. for i, v := range prescriptionDrugs {
  351. prescriptionDetail[i] = &pasturePb.PrescriptionDrugsList{
  352. DrugsId: int32(v.DrugsId),
  353. DrugsName: v.DrugsName,
  354. Unit: v.Unit,
  355. UnitName: unitMap[v.Unit],
  356. Dosages: v.Dosages,
  357. }
  358. }
  359. req.PrescriptionDetail = prescriptionDetail
  360. healthStatus := pasturePb.HealthStatus_Treatment
  361. if req.TreatmentResult == pasturePb.TreatmentResult_Curable {
  362. healthStatus = pasturePb.HealthStatus_Curable
  363. }
  364. if req.TreatmentResult == pasturePb.TreatmentResult_Out {
  365. healthStatus = pasturePb.HealthStatus_Out
  366. }
  367. if req.TreatmentResult == pasturePb.TreatmentResult_Dead {
  368. healthStatus = pasturePb.HealthStatus_Dead
  369. }
  370. diseaseTypeMap := s.DiseaseTypeMap()
  371. newEventCowTreatment := model.NewEventCowTreatment(pastureId, prescription, req, diseaseTypeMap, operationUser, userModel.SystemUser)
  372. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  373. if err = tx.Create(newEventCowTreatment).Error; err != nil {
  374. return xerr.WithStack(err)
  375. }
  376. eventCowDisease.EventTreatmentUpdate(healthStatus, int64(req.TreatmentAt), prescription.Name)
  377. if err = tx.Model(eventCowDisease).
  378. Select("health_status", "first_treatment_at", "last_treatment_at", "last_prescription_name").
  379. Where("id = ?", req.Id).
  380. Where("cow_id = ?", req.CowId).
  381. Updates(eventCowDisease).Error; err != nil {
  382. return xerr.WithStack(err)
  383. }
  384. cow.EventHealthStatusUpdate(healthStatus)
  385. if err = tx.Model(new(model.Cow)).
  386. Select("health_status").
  387. Where("id = ?", req.CowId).
  388. Updates(cow).Error; err != nil {
  389. return xerr.WithStack(err)
  390. }
  391. prescription.EventUseCountUpdate()
  392. if err = tx.Model(prescription).
  393. Select("use_count").
  394. Where("id = ?", prescription.Id).
  395. Updates(prescription).Error; err != nil {
  396. return xerr.WithStack(err)
  397. }
  398. return nil
  399. }); err != nil {
  400. return xerr.WithStack(err)
  401. }
  402. return nil
  403. }