event_health.go 16 KB

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