event_health.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. package backend
  2. import (
  3. "context"
  4. "fmt"
  5. "kpt-pasture/model"
  6. "net/http"
  7. "strings"
  8. "time"
  9. "gorm.io/gorm"
  10. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  11. "gitee.com/xuyiping_admin/pkg/xerr"
  12. )
  13. // CowDiseaseCreate 牛只发病提交
  14. func (s *StoreEntry) CowDiseaseCreate(ctx context.Context, req *pasturePb.EventCowDiseaseRequest) error {
  15. cow, err := s.GetCowInfoByCowId(ctx, int64(req.CowId))
  16. if err != nil {
  17. return xerr.WithStack(err)
  18. }
  19. operationUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
  20. if err != nil {
  21. return xerr.WithStack(err)
  22. }
  23. currUser, err := s.GetCurrentSystemUser(ctx)
  24. if err != nil {
  25. return xerr.Custom("登录信息错误")
  26. }
  27. disease, err := s.GetDiseaseById(ctx, req.DiseaseId)
  28. if err != nil {
  29. return xerr.WithStack(err)
  30. }
  31. prescription := &model.Prescription{}
  32. if req.PrescriptionId > 0 {
  33. prescription, err = s.GetPrescriptionById(ctx, req.PrescriptionId)
  34. if err != nil {
  35. return xerr.WithStack(err)
  36. }
  37. }
  38. defer func() {
  39. if req.PenId > 0 {
  40. s.UpdateCowPenId(ctx, int64(req.CowId), int64(req.PenId))
  41. }
  42. }()
  43. newEventCowDisease := model.NewEventCowDisease(cow, disease, req, operationUser, currUser)
  44. if prescription.Id > 0 {
  45. newEventCowDisease.HealthStatus = pasturePb.HealthStatus_Treatment
  46. }
  47. var newEventCowTreatment *model.EventCowTreatment
  48. var newCowTreatmentRequest *pasturePb.CowTreatmentRequest
  49. unitMap := s.UnitMap()
  50. diseaseTypeMap := s.DiseaseTypeMap()
  51. if prescription.Id > 0 {
  52. prescriptionDrugs, err := s.PrescriptionDrugsByPrescriptionId(ctx, prescription.Id)
  53. if err != nil {
  54. return xerr.WithStack(err)
  55. }
  56. prescriptionDetail := make([]*pasturePb.TreatmentDrugs, len(prescriptionDrugs))
  57. for i, v := range prescriptionDrugs {
  58. prescriptionDetail[i] = &pasturePb.TreatmentDrugs{
  59. DrugsId: int32(v.DrugsId),
  60. DrugsName: v.DrugsName,
  61. Unit: v.Unit,
  62. UnitName: unitMap[v.Unit],
  63. UseNum: float32(v.Dosages),
  64. }
  65. }
  66. newCowTreatmentRequest = &pasturePb.CowTreatmentRequest{
  67. CowId: req.CowId,
  68. PrescriptionId: prescription.Id,
  69. DiseaseId: req.DiseaseId,
  70. DiseaseName: disease.Name,
  71. PrescriptionDetail: prescriptionDetail,
  72. TreatmentResult: pasturePb.TreatmentResult_GoOn,
  73. Remarks: req.Remarks,
  74. TreatmentAt: req.DiseaseAt,
  75. }
  76. } else {
  77. if len(req.PrescriptionDetail) <= 0 {
  78. return xerr.Custom("请填写治疗处方详情")
  79. }
  80. prescriptionDetail := make([]*pasturePb.TreatmentDrugs, len(req.PrescriptionDetail))
  81. for i, v := range req.PrescriptionDetail {
  82. if v.DrugsId <= 0 {
  83. return xerr.Custom("请选择药方中的药品")
  84. }
  85. drugsData, err := s.GetDrugsById(ctx, int64(v.DrugsId))
  86. if err != nil {
  87. return xerr.WithStack(err)
  88. }
  89. prescriptionDetail[i] = &pasturePb.TreatmentDrugs{
  90. DrugsId: v.DrugsId,
  91. DrugsName: drugsData.Name,
  92. Unit: v.Unit,
  93. UnitName: unitMap[v.Unit],
  94. UseNum: float32(v.UseNum),
  95. }
  96. }
  97. req.PrescriptionDetail = prescriptionDetail
  98. newCowTreatmentRequest = &pasturePb.CowTreatmentRequest{
  99. CowId: req.CowId,
  100. PrescriptionId: prescription.Id,
  101. DiseaseId: req.DiseaseId,
  102. DiseaseName: disease.Name,
  103. PrescriptionDetail: req.PrescriptionDetail,
  104. TreatmentResult: pasturePb.TreatmentResult_GoOn,
  105. Remarks: req.Remarks,
  106. TreatmentAt: req.DiseaseAt,
  107. }
  108. }
  109. newEventCowTreatment = model.NewEventCowTreatment(prescription, newCowTreatmentRequest, diseaseTypeMap, operationUser)
  110. newEventCowDisease.DiagnosedAt = int64(req.DiseaseAt)
  111. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  112. if err = tx.Model(new(model.EventCowDisease)).Create(newEventCowDisease).Error; err != nil {
  113. return xerr.WithStack(err)
  114. }
  115. // 创建治疗记录
  116. if err = tx.Model(new(model.EventCowTreatment)).Create(newEventCowTreatment).Error; err != nil {
  117. return xerr.WithStack(err)
  118. }
  119. // 创建新的处方
  120. if req.PrescriptionId <= 0 {
  121. newPrescriptionRequest := &pasturePb.PrescriptionRequest{
  122. Name: fmt.Sprintf("%s-%s-%s", disease.Name, time.Now().Format("20060102"), operationUser.Name),
  123. ApplicableDiseaseIds: []int32{req.DiseaseId},
  124. }
  125. newPrescription := model.NewPrescription(newPrescriptionRequest, disease.Name, 1, 0, 0, currUser)
  126. if err = tx.Create(newPrescription).Error; err != nil {
  127. return xerr.WithStack(err)
  128. }
  129. // 创建处方药品
  130. drugsList := make([]*pasturePb.PrescriptionDrugsList, len(req.PrescriptionDetail))
  131. for _, v := range req.PrescriptionDetail {
  132. drugsList = append(drugsList, &pasturePb.PrescriptionDrugsList{
  133. DrugsId: v.DrugsId,
  134. DrugsName: v.DrugsName,
  135. Dosages: int32(v.UseNum),
  136. Unit: v.Unit,
  137. UnitName: v.UnitName,
  138. UseDays: 1,
  139. })
  140. }
  141. newPrescriptionDrugs := model.NewPrescriptionDrugs(newPrescription.Id, drugsList)
  142. if err = tx.Create(&newPrescriptionDrugs).Error; err != nil {
  143. return xerr.WithStack(err)
  144. }
  145. }
  146. if err = tx.Model(new(model.Cow)).
  147. Where("id = ?", req.CowId).
  148. Updates(map[string]interface{}{
  149. "health_status": pasturePb.HealthStatus_Disease,
  150. }).Error; err != nil {
  151. return xerr.WithStack(err)
  152. }
  153. return nil
  154. }); err != nil {
  155. return xerr.WithStack(err)
  156. }
  157. return nil
  158. }
  159. // CowDiseaseList 发病牛只清单
  160. func (s *StoreEntry) CowDiseaseList(ctx context.Context, req *pasturePb.SearchEventCowTreatmentRequest, pagination *pasturePb.PaginationModel) (*pasturePb.EventCowDiseaseResponse, error) {
  161. cowDiseaseList := make([]*model.EventCowDisease, 0)
  162. var count int64 = 0
  163. pref := s.DB.Select("a.*,b.name").Table(fmt.Sprintf("%s as a", new(model.EventCowDisease).TableName())).
  164. Joins(fmt.Sprintf("JOIN %s AS b on a.pen_id = b.id", new(model.Pen).TableName())).
  165. Where("a.diagnosed_result < ?", pasturePb.IsShow_No)
  166. if len(req.CowIds) > 0 {
  167. pref.Where("a.cow_id IN ?", req.CowIds)
  168. }
  169. if req.DiseaseId > 0 {
  170. pref.Where("a.disease_id = ?", req.DiseaseId)
  171. }
  172. if req.PenId > 0 {
  173. pref.Where("a.pen_id = ?", req.PenId)
  174. }
  175. if req.Lact > 0 {
  176. pref.Where("a.lact = ?", req.Lact)
  177. }
  178. if req.MinDayAge > 0 && req.MaxDayAge > 0 && req.MaxDayAge >= req.MinDayAge {
  179. pref.Where("a.day_age BETWEEN ? AND ?", req.MinDayAge, req.MaxDayAge)
  180. }
  181. if req.HealthStatus > 0 {
  182. pref.Where("a.health_status = ?", req.HealthStatus)
  183. }
  184. if req.DiseasedStartAt > 0 && req.DiseaseEndAt > 0 && req.DiseaseEndAt >= req.DiseasedStartAt {
  185. pref.Where("a.disease_at BETWEEN ? AND ?", req.DiseasedStartAt, req.DiseaseEndAt)
  186. }
  187. if err := pref.Order("a.id desc").
  188. Count(&count).Limit(int(pagination.PageSize)).
  189. Offset(int(pagination.PageOffset)).
  190. Find(&cowDiseaseList).Error; err != nil {
  191. return nil, xerr.WithStack(err)
  192. }
  193. healthStatusMap := s.HealthStatusMap()
  194. return &pasturePb.EventCowDiseaseResponse{
  195. Code: http.StatusOK,
  196. Message: "ok",
  197. Data: &pasturePb.EventCowDiseaseData{
  198. List: model.EventCowDiseaseSlice(cowDiseaseList).ToPB(healthStatusMap),
  199. Total: int32(count),
  200. PageSize: pagination.PageSize,
  201. Page: pagination.Page,
  202. },
  203. }, nil
  204. }
  205. // CowDiseaseDiagnose 发病牛只诊断
  206. func (s *StoreEntry) CowDiseaseDiagnose(ctx context.Context, req *pasturePb.CowDiagnosedRequest) error {
  207. eventCowDisease := &model.EventCowDisease{}
  208. if err := s.DB.Where("cow_id = ?", req.CowId).
  209. Where("id = ?", req.Id).
  210. First(eventCowDisease).Error; err != nil {
  211. return xerr.WithStack(err)
  212. }
  213. if eventCowDisease.HealthStatus != pasturePb.HealthStatus_Health {
  214. return xerr.Custom("异常牛只数据")
  215. }
  216. currentUser, err := s.GetCurrentSystemUser(ctx)
  217. if err != nil {
  218. return xerr.WithStack(err)
  219. }
  220. // 未发病
  221. if req.DiagnosedResult == pasturePb.IsShow_No {
  222. if err = s.DB.Model(eventCowDisease).
  223. Where("id = ?", req.Id).
  224. Where("cow_id = ?", req.CowId).
  225. Updates(map[string]interface{}{
  226. "diagnosed_result": pasturePb.IsShow_No,
  227. "diagnose_operation_id": currentUser.Id,
  228. "diagnose_operation_name": currentUser.Name,
  229. "remarks": req.Remarks,
  230. }).Error; err != nil {
  231. return xerr.WithStack(err)
  232. }
  233. return nil
  234. }
  235. // 已发病
  236. disease, err := s.GetDiseaseById(ctx, req.DiseaseId)
  237. if err != nil {
  238. return xerr.WithStack(err)
  239. }
  240. systemUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
  241. if err != nil {
  242. return xerr.WithStack(err)
  243. }
  244. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  245. if err = tx.Model(eventCowDisease).
  246. Where("id = ?", req.Id).
  247. Where("cow_id = ?", req.CowId).
  248. Updates(map[string]interface{}{
  249. "health_status": pasturePb.HealthStatus_Disease,
  250. "diagnosed_result": pasturePb.IsShow_Ok,
  251. "diagnose_id": req.DiseaseId,
  252. "diagnose_name": disease.Name,
  253. "temperature": int32(req.Temperature * 100),
  254. "diagnose_operation_id": req.OperationId,
  255. "diagnose_operation_name": systemUser.Name,
  256. "diagnosed_at": time.Now().Unix(),
  257. }).Error; err != nil {
  258. return xerr.WithStack(err)
  259. }
  260. if err = tx.Model(new(model.Cow)).
  261. Where("id = ?", req.CowId).
  262. Updates(map[string]interface{}{
  263. "health_status": pasturePb.HealthStatus_Disease,
  264. }).Error; err != nil {
  265. return xerr.WithStack(err)
  266. }
  267. return nil
  268. }); err != nil {
  269. return xerr.WithStack(err)
  270. }
  271. return nil
  272. }
  273. // CowDiseaseTreatment 发病牛只治疗
  274. func (s *StoreEntry) CowDiseaseTreatment(ctx context.Context, req *pasturePb.CowTreatmentRequest) error {
  275. eventCowDisease := &model.EventCowDisease{}
  276. if err := s.DB.Where("cow_id = ?", req.CowId).
  277. Where("id = ?", req.Id).
  278. First(eventCowDisease).Error; err != nil {
  279. return xerr.WithStack(err)
  280. }
  281. if eventCowDisease.HealthStatus != pasturePb.HealthStatus_Disease &&
  282. eventCowDisease.HealthStatus != pasturePb.HealthStatus_Treatment {
  283. return xerr.Custom("异常牛只数据")
  284. }
  285. systemUser, _ := s.GetSystemUserById(ctx, int64(req.OperationId))
  286. prescription, err := s.GetPrescriptionById(ctx, req.PrescriptionId)
  287. if err != nil {
  288. return xerr.WithStack(err)
  289. }
  290. disease, err := s.GetDiseaseById(ctx, eventCowDisease.DiagnoseId)
  291. if err != nil {
  292. return xerr.WithStack(err)
  293. }
  294. req.DiseaseName = disease.Name
  295. req.DiseaseType = disease.DiseaseType
  296. prescriptionDrugs, err := s.PrescriptionDrugsByPrescriptionId(ctx, prescription.Id)
  297. if err != nil {
  298. return xerr.WithStack(err)
  299. }
  300. unitMap := s.UnitMap()
  301. prescriptionDetail := make([]*pasturePb.TreatmentDrugs, len(prescriptionDrugs))
  302. for i, v := range prescriptionDrugs {
  303. prescriptionDetail[i] = &pasturePb.TreatmentDrugs{
  304. DrugsId: int32(v.DrugsId),
  305. DrugsName: v.DrugsName,
  306. Unit: v.Unit,
  307. UnitName: unitMap[v.Unit],
  308. UseNum: float32(v.Dosages),
  309. }
  310. }
  311. req.PrescriptionDetail = prescriptionDetail
  312. healthStatus := pasturePb.HealthStatus_Treatment
  313. if req.TreatmentResult == pasturePb.TreatmentResult_Curable {
  314. healthStatus = pasturePb.HealthStatus_Curable
  315. }
  316. if req.TreatmentResult == pasturePb.TreatmentResult_Out {
  317. healthStatus = pasturePb.HealthStatus_Out
  318. }
  319. if req.TreatmentResult == pasturePb.TreatmentResult_Dead {
  320. healthStatus = pasturePb.HealthStatus_Dead
  321. }
  322. diseaseTypeMap := s.DiseaseTypeMap()
  323. newEventCowTreatment := model.NewEventCowTreatment(prescription, req, diseaseTypeMap, systemUser)
  324. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  325. if err = tx.Create(newEventCowTreatment).Error; err != nil {
  326. return xerr.WithStack(err)
  327. }
  328. if err = tx.Model(eventCowDisease).
  329. Where("id = ?", req.Id).
  330. Where("cow_id = ?", req.CowId).
  331. Updates(map[string]interface{}{
  332. "health_status": healthStatus,
  333. }).Error; err != nil {
  334. return xerr.WithStack(err)
  335. }
  336. if err = tx.Model(new(model.Cow)).
  337. Where("id = ?", req.CowId).
  338. Updates(map[string]interface{}{
  339. "health_status": healthStatus,
  340. }).Error; err != nil {
  341. return xerr.WithStack(err)
  342. }
  343. if err = tx.Model(new(model.Prescription)).
  344. Where("id = ?", prescription.Id).
  345. Updates(map[string]interface{}{
  346. "use_count": prescription.UseCount + 1,
  347. }).Error; err != nil {
  348. return xerr.WithStack(err)
  349. }
  350. return nil
  351. }); err != nil {
  352. return xerr.WithStack(err)
  353. }
  354. return nil
  355. }
  356. func (s *StoreEntry) DiseaseSuggestPrescription(ctx context.Context, diseaseId int64) (*pasturePb.ConfigOptionsListResponse, error) {
  357. res := make([]*pasturePb.ConfigOptionsList, 0)
  358. prescriptionList := make([]*model.Prescription, 0)
  359. if err := s.DB.Model(new(model.Prescription)).Where("is_show = ?", pasturePb.IsShow_Ok).Find(&prescriptionList).Error; err != nil {
  360. return nil, xerr.WithStack(err)
  361. }
  362. for _, v := range prescriptionList {
  363. disabled := false
  364. if strings.Contains(v.ApplicableDisease, fmt.Sprintf("%d", diseaseId)) {
  365. disabled = true
  366. }
  367. res = append(res, &pasturePb.ConfigOptionsList{
  368. Value: v.Id,
  369. Label: v.Name,
  370. Disabled: disabled,
  371. })
  372. }
  373. return &pasturePb.ConfigOptionsListResponse{
  374. Code: http.StatusOK,
  375. Message: "ok",
  376. Data: res,
  377. }, nil
  378. }
  379. // CowDiseaseTreatmentDetail 发病牛只治疗详情列表
  380. func (s *StoreEntry) CowDiseaseTreatmentDetail(
  381. ctx context.Context,
  382. req *pasturePb.EventCowTreatmentDetailRequest,
  383. pagination *pasturePb.PaginationModel,
  384. ) (*pasturePb.EventCowTreatmentDetailResponse, error) {
  385. eventCowDiseaseList := make([]*model.EventCowDisease, 0)
  386. var count int64 = 0
  387. pref := s.DB.Model(new(model.EventCowDisease)).Where("cow_id = ?", req.CowId)
  388. if req.DiseaseId > 0 {
  389. pref.Where("disease_id = ?", req.DiseaseId)
  390. }
  391. if req.DiseaseStartAt > 0 && req.DiseaseEndAt > 0 && req.DiseaseStartAt <= req.DiseaseEndAt {
  392. pref.Where("disease_at BETWEEN ? AND ?", req.DiseaseStartAt, req.DiseaseEndAt)
  393. }
  394. if err := pref.Count(&count).
  395. Limit(int(pagination.PageSize)).
  396. Offset(int(pagination.PageOffset)).
  397. Order("id desc").
  398. Find(&eventCowDiseaseList).Error; err != nil {
  399. return nil, xerr.WithStack(err)
  400. }
  401. eventCowTreatmentList := make([]*model.EventCowTreatment, 0)
  402. cowDiseaseIds := make([]int64, len(eventCowDiseaseList))
  403. for i, v := range eventCowDiseaseList {
  404. cowDiseaseIds[i] = v.Id
  405. }
  406. if err := s.DB.Model(new(model.EventCowTreatment)).
  407. Select("*").Where("cow_disease_id IN ?", cowDiseaseIds).
  408. Where("cow_id = ?", req.CowId).
  409. Group("cow_disease_id").
  410. Order("id desc").
  411. Find(&eventCowTreatmentList).Error; err != nil {
  412. return nil, xerr.WithStack(err)
  413. }
  414. return &pasturePb.EventCowTreatmentDetailResponse{
  415. Code: http.StatusOK,
  416. Message: "ok",
  417. Data: &pasturePb.EventCowTreatmentDetail{
  418. List: model.EventCowTreatmentSlice(eventCowTreatmentList).ToPB(eventCowDiseaseList),
  419. Total: int32(count),
  420. PageSize: pagination.Page,
  421. Page: pagination.PageSize,
  422. },
  423. }, nil
  424. }
  425. func (s *StoreEntry) CowDiseaseCurable(ctx context.Context, req *pasturePb.EventCowCurableRequest) error {
  426. eventCowDiseaseList := make([]*model.EventCowDisease, 0)
  427. if err := s.DB.Where("id IN ?", req.Ids).
  428. Where("health_status = ?", pasturePb.HealthStatus_Treatment).
  429. Find(&eventCowDiseaseList).Error; err != nil {
  430. return xerr.WithStack(err)
  431. }
  432. if len(eventCowDiseaseList) == 0 {
  433. return nil
  434. }
  435. if len(eventCowDiseaseList) != len(req.Ids) {
  436. return xerr.New("id 参数错误")
  437. }
  438. operationUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
  439. if err != nil {
  440. return xerr.WithStack(err)
  441. }
  442. eventCowTreatmentList := make([]*model.EventCowTreatment, 0)
  443. for _, v := range eventCowDiseaseList {
  444. eventCowTreatmentList = append(eventCowTreatmentList, &model.EventCowTreatment{
  445. CowId: v.CowId,
  446. CowDiseaseId: v.Id,
  447. DiseaseId: int64(v.DiseaseId),
  448. DiseaseName: v.DiseaseName,
  449. PrescriptionId: 0,
  450. PrescriptionName: "",
  451. PrescriptionDetail: "",
  452. TreatmentResult: pasturePb.TreatmentResult_Curable,
  453. OperationId: operationUser.Id,
  454. OperationName: operationUser.Name,
  455. Remarks: req.Remarks,
  456. TreatmentAt: int64(req.CurableAt),
  457. })
  458. }
  459. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  460. if err = tx.Model(model.EventCowDisease{}).Where("id IN ?", req.Ids).
  461. Where("health_status = ?", pasturePb.HealthStatus_Treatment).Updates(map[string]interface{}{
  462. "health_status": pasturePb.HealthStatus_Curable,
  463. "diagnosed_result": pasturePb.IsShow_Ok,
  464. "curable_at": req.CurableAt,
  465. }).Error; err != nil {
  466. return xerr.WithStack(err)
  467. }
  468. if err = tx.Model(model.Cow{}).Where("id IN ?", req.Ids).Updates(map[string]interface{}{
  469. "health_status": pasturePb.HealthStatus_Curable,
  470. }).Error; err != nil {
  471. return xerr.WithStack(err)
  472. }
  473. if err = tx.Model(model.EventCowTreatment{}).Create(eventCowTreatmentList).Error; err != nil {
  474. return xerr.WithStack(err)
  475. }
  476. return nil
  477. }); err != nil {
  478. return xerr.WithStack(err)
  479. }
  480. return nil
  481. }