event_health.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "kpt-pasture/model"
  7. "net/http"
  8. "strings"
  9. "time"
  10. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  11. "go.uber.org/zap"
  12. "gorm.io/gorm"
  13. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  14. "gitee.com/xuyiping_admin/pkg/xerr"
  15. )
  16. // CowDiseaseCreate 牛只发病提交
  17. func (s *StoreEntry) CowDiseaseCreate(ctx context.Context, req *pasturePb.EventCowDiseaseRequest, source string) error {
  18. userModel, err := s.GetUserModel(ctx)
  19. if err != nil {
  20. return xerr.WithStack(err)
  21. }
  22. // 牛只信息
  23. cow, err := s.GetCowInfoByEarNumber(ctx, userModel.AppPasture.Id, req.EarNumber)
  24. if err != nil {
  25. return xerr.Customf("牛只信息错误: %d", req.CowId)
  26. }
  27. operationUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
  28. if err != nil {
  29. return xerr.Customf("请检查操作人信息")
  30. }
  31. disease, err := s.GetDiseaseById(ctx, userModel.AppPasture.Id, req.DiseaseId)
  32. if err != nil {
  33. return xerr.WithStack(err)
  34. }
  35. newEventCowDisease := model.NewEventCowDisease(userModel.AppPasture.Id, cow, disease, req, operationUser, userModel.SystemUser)
  36. if req.ExposeDiseaseType == pasturePb.ExposeDiseaseType_Neck_Ring {
  37. newEventCowDisease.ExposeDiseaseType = pasturePb.ExposeDiseaseType_Neck_Ring
  38. }
  39. defer func() {
  40. // 更新牛只健康状态
  41. if newEventCowDisease.HealthStatus == pasturePb.HealthStatus_Disease || newEventCowDisease.HealthStatus == pasturePb.HealthStatus_Treatment {
  42. cow.EventHealthStatusUpdate(pasturePb.HealthStatus_Disease)
  43. if err = s.DB.Model(new(model.Cow)).
  44. Select("health_status").
  45. Where("id = ?", req.CowId).
  46. Updates(cow).Error; err != nil {
  47. zaplog.Error("CowDiseaseCreate", zap.Any("EventHealthStatusUpdate", err))
  48. }
  49. }
  50. if req.PenId > 0 {
  51. penMap := s.PenMap(ctx, userModel.AppPasture.Id)
  52. penData, ok := penMap[req.PenId]
  53. if !ok {
  54. return
  55. }
  56. cow.EventPenUpdate(penData)
  57. if err = s.DB.Model(new(model.Cow)).
  58. Select("pen_id", "pen_name").
  59. Where("id = ?", cow.Id).
  60. Updates(cow).Error; err != nil {
  61. zaplog.Error("CowDiseaseCreate", zap.Any("EventPenUpdate", err))
  62. }
  63. }
  64. }()
  65. // PC端直接跳过诊断过程
  66. if source == model.SourcePC || req.ExposeDiseaseType == pasturePb.ExposeDiseaseType_Neck_Ring {
  67. newEventCowDisease.DiagnosedResult = pasturePb.IsShow_Ok
  68. newEventCowDisease.DiagnoseOperationId = int32(operationUser.Id)
  69. newEventCowDisease.DiagnoseOperationName = operationUser.Name
  70. newEventCowDisease.Source = model.SourcePC
  71. newEventCowDisease.DiagnoseId = req.DiseaseId
  72. newEventCowDisease.DiagnoseName = disease.Name
  73. newEventCowDisease.HealthStatus = pasturePb.HealthStatus_Disease
  74. }
  75. if req.PrescriptionId > 0 || len(req.PrescriptionDetail) > 0 {
  76. newEventCowDisease.HealthStatus = pasturePb.HealthStatus_Treatment
  77. newEventCowDisease.DiagnosedResult = pasturePb.IsShow_Ok
  78. newEventCowDisease.FirstTreatmentAt = int64(req.DiseaseAt)
  79. newEventCowDisease.LastTreatmentAt = int64(req.DiseaseAt)
  80. newEventCowDisease.DiagnoseId = int32(disease.Id)
  81. newEventCowDisease.DiagnoseName = disease.Name
  82. }
  83. newEventCowTreatment := &model.EventCowTreatment{}
  84. newCowTreatmentRequest := &pasturePb.CowTreatmentRequest{}
  85. var isCreatePrescription bool
  86. diseaseTypeMap := s.DiseaseTypeMap()
  87. prescription := &model.Prescription{}
  88. if req.PrescriptionId > 0 || len(req.PrescriptionDetail) > 0 {
  89. isCreatePrescription = true
  90. if req.PrescriptionId > 0 {
  91. prescription, err = s.GetPrescriptionById(ctx, userModel.AppPasture.Id, req.PrescriptionId)
  92. if err != nil {
  93. return xerr.WithStack(err)
  94. }
  95. prescriptionDrugs, err := s.PrescriptionDrugsByPrescriptionId(ctx, userModel.AppPasture.Id, prescription.Id)
  96. if err != nil {
  97. return xerr.WithStack(err)
  98. }
  99. req.PrescriptionDetail = model.PrescriptionDrugsSlice(prescriptionDrugs).ToPB()
  100. }
  101. }
  102. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  103. lastPrescriptionName := ""
  104. // 已有的处方使用次数+1
  105. if req.PrescriptionId > 0 {
  106. prescription.EventUseCountUpdate()
  107. if err = tx.Model(new(model.Prescription)).
  108. Select("use_count").
  109. Where("id = ?", prescription.Id).
  110. Updates(prescription).Error; err != nil {
  111. return xerr.WithStack(err)
  112. }
  113. lastPrescriptionName = prescription.Name
  114. }
  115. // 新的临时处方
  116. if req.PrescriptionId <= 0 && len(req.PrescriptionDetail) > 0 {
  117. newPrescriptionRequest := &pasturePb.PrescriptionRequest{
  118. Name: fmt.Sprintf("%s-%s-%s", disease.Name, time.Now().Local().Format("20060102"), operationUser.Name),
  119. ApplicableDiseaseIds: []int32{req.DiseaseId},
  120. IsShow: pasturePb.IsShow_Ok,
  121. }
  122. newPrescription := model.NewPrescription(
  123. userModel.AppPasture.Id,
  124. newPrescriptionRequest,
  125. fmt.Sprintf("%d", disease.Id),
  126. 1,
  127. 0,
  128. 0,
  129. userModel.SystemUser,
  130. )
  131. newPrescription.UseCount += 1
  132. if err = tx.Model(new(model.Prescription)).Create(newPrescription).Error; err != nil {
  133. return xerr.WithStack(err)
  134. }
  135. prescription = newPrescription
  136. lastPrescriptionName = newPrescription.Name
  137. newPrescriptionDrugs := model.NewPrescriptionDrugs(userModel.AppPasture.Id, prescription.Id, req.PrescriptionDetail)
  138. if err = tx.Model(new(model.PrescriptionDrugs)).Create(newPrescriptionDrugs).Error; err != nil {
  139. return xerr.WithStack(err)
  140. }
  141. // 记录事件日志
  142. cowLogs := s.SubmitEventLog(ctx, userModel.AppPasture.Id, cow, pasturePb.EventType_Disease, newEventCowDisease)
  143. if err = tx.Table(cowLogs.TableName()).Create(cowLogs).Error; err != nil {
  144. return xerr.WithStack(err)
  145. }
  146. }
  147. // 创建 CowDisease
  148. newEventCowDisease.LastPrescriptionName = lastPrescriptionName
  149. if err = tx.Model(new(model.EventCowDisease)).Create(newEventCowDisease).Error; err != nil {
  150. return xerr.WithStack(err)
  151. }
  152. // 创建治疗记录
  153. if isCreatePrescription {
  154. newCowTreatmentRequest = &pasturePb.CowTreatmentRequest{
  155. CowId: req.CowId,
  156. PrescriptionId: prescription.Id,
  157. DiseaseId: req.DiseaseId,
  158. DiseaseName: disease.Name,
  159. DiseaseType: disease.DiseaseType,
  160. PrescriptionDetail: req.PrescriptionDetail,
  161. TreatmentResult: pasturePb.TreatmentResult_GoOn,
  162. Remarks: req.Remarks,
  163. TreatmentAt: req.DiseaseAt,
  164. }
  165. newEventCowTreatment = model.NewEventCowTreatment(userModel.AppPasture.Id, prescription, newCowTreatmentRequest, diseaseTypeMap, operationUser, userModel.SystemUser)
  166. newEventCowTreatment.CowDiseaseId = newEventCowDisease.Id
  167. // 创建治疗记录
  168. if err = tx.Model(new(model.EventCowTreatment)).Create(newEventCowTreatment).Error; err != nil {
  169. return xerr.WithStack(err)
  170. }
  171. }
  172. return nil
  173. }); err != nil {
  174. return xerr.WithStack(err)
  175. }
  176. return nil
  177. }
  178. // CowDiseaseList 发病牛只清单
  179. func (s *StoreEntry) CowDiseaseList(ctx context.Context, req *pasturePb.SearchEventCowTreatmentRequest, pagination *pasturePb.PaginationModel) (*pasturePb.EventCowDiseaseResponse, error) {
  180. userModel, err := s.GetUserModel(ctx)
  181. if err != nil {
  182. return nil, xerr.WithStack(err)
  183. }
  184. cowDiseaseList := make([]*model.EventCowDisease, 0)
  185. var count int64 = 0
  186. pref := s.DB.Table(fmt.Sprintf("%s as a", new(model.EventCowDisease).TableName())).
  187. Joins(fmt.Sprintf("JOIN %s AS b on a.cow_id = b.id", new(model.Cow).TableName())).
  188. Select("a.*,b.pen_name").
  189. Where("a.pasture_id = ?", userModel.AppPasture.Id).
  190. Where("a.health_status != ?", pasturePb.HealthStatus_Curable)
  191. if len(req.CowIds) > 0 {
  192. pref.Where("a.cow_id IN ?", req.CowIds)
  193. }
  194. if req.EarNumber != "" {
  195. pref.Where("a.ear_number = ?", req.EarNumber)
  196. }
  197. if req.DiseaseId > 0 {
  198. pref.Where("a.disease_id = ?", req.DiseaseId)
  199. }
  200. if req.PenId > 0 {
  201. pref.Where("b.pen_id = ?", req.PenId)
  202. }
  203. if req.HealthStatus > 0 {
  204. pref.Where("a.health_status = ?", req.HealthStatus)
  205. }
  206. if req.DiseasedStartAt > 0 && req.DiseaseEndAt > 0 && req.DiseaseEndAt >= req.DiseasedStartAt {
  207. pref.Where("a.disease_at BETWEEN ? AND ?", req.DiseasedStartAt, req.DiseaseEndAt)
  208. }
  209. if err = pref.Order("a.id DESC").
  210. Count(&count).Limit(int(pagination.PageSize)).
  211. Offset(int(pagination.PageOffset)).
  212. Find(&cowDiseaseList).Error; err != nil {
  213. return nil, xerr.WithStack(err)
  214. }
  215. healthStatusMap := s.HealthStatusMap()
  216. return &pasturePb.EventCowDiseaseResponse{
  217. Code: http.StatusOK,
  218. Msg: "ok",
  219. Data: &pasturePb.EventCowDiseaseData{
  220. List: model.EventCowDiseaseSlice(cowDiseaseList).ToPB(healthStatusMap),
  221. Total: int32(count),
  222. PageSize: pagination.PageSize,
  223. Page: pagination.Page,
  224. },
  225. }, nil
  226. }
  227. // CowDiseaseDiagnose 发病牛只诊断
  228. func (s *StoreEntry) CowDiseaseDiagnose(ctx context.Context, req *pasturePb.CowDiagnosedRequest) error {
  229. userModel, err := s.GetUserModel(ctx)
  230. if err != nil {
  231. return xerr.WithStack(err)
  232. }
  233. cow, err := s.GetCowInfoByCowId(ctx, userModel.AppPasture.Id, int64(req.CowId))
  234. if err != nil {
  235. return xerr.Customf("错误的牛只信息: %d", req.CowId)
  236. }
  237. eventCowDisease := &model.EventCowDisease{}
  238. if err = s.DB.Model(new(model.EventCowDisease)).
  239. Where("cow_id = ?", req.CowId).
  240. Where("id = ?", req.Id).
  241. Where("health_status = ?", pasturePb.HealthStatus_Health).
  242. Where("pasture_id = ?", userModel.AppPasture.Id).
  243. First(eventCowDisease).Error; err != nil {
  244. zaplog.Error("CowDiseaseDiagnose", zap.Any("req", req), zap.Any("userModel", userModel))
  245. return xerr.Custom("异常牛只数据")
  246. }
  247. if eventCowDisease == nil || eventCowDisease.Id <= 0 {
  248. return xerr.Custom("异常牛只数据")
  249. }
  250. if req.DiagnosedResult == pasturePb.IsShow_No {
  251. // 未发病更新
  252. eventCowDisease.EventUnDiseaseUpdate(userModel.SystemUser, req.Remarks)
  253. if err = s.DB.Model(eventCowDisease).
  254. Select("diagnosed_result", "diagnose_operation_id", "diagnose_operation_name", "remarks").
  255. Where("id = ?", req.Id).
  256. Updates(eventCowDisease).Error; err != nil {
  257. return xerr.WithStack(err)
  258. }
  259. return nil
  260. }
  261. // 已发病
  262. disease, err := s.GetDiseaseById(ctx, userModel.AppPasture.Id, req.DiseaseId)
  263. if err != nil {
  264. return xerr.WithStack(err)
  265. }
  266. systemUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
  267. if err != nil {
  268. return xerr.WithStack(err)
  269. }
  270. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  271. eventCowDisease.EventDiseaseUpdate(disease, systemUser, req.Temperature)
  272. if err = tx.Model(eventCowDisease).
  273. Select("health_status", "diagnosed_result", "diagnose_id", "diagnose_name", "temperature", "diagnose_operation_id", "diagnose_operation_name", "diagnosed_at").
  274. Where("id = ?", req.Id).
  275. Where("cow_id = ?", req.CowId).
  276. Updates(eventCowDisease).Error; err != nil {
  277. return xerr.WithStack(err)
  278. }
  279. cow.EventHealthStatusUpdate(pasturePb.HealthStatus_Disease)
  280. if err = tx.Model(cow).
  281. Select("health_status").
  282. Where("id = ?", cow.Id).
  283. Updates(cow).Error; err != nil {
  284. return xerr.WithStack(err)
  285. }
  286. // 记录事件日志
  287. cowLogs := s.SubmitEventLog(ctx, userModel.AppPasture.Id, cow, pasturePb.EventType_Disease, eventCowDisease)
  288. if err = tx.Table(cowLogs.TableName()).Create(cowLogs).Error; err != nil {
  289. return xerr.WithStack(err)
  290. }
  291. return nil
  292. }); err != nil {
  293. return xerr.WithStack(err)
  294. }
  295. return nil
  296. }
  297. // CowDiseaseTreatment 发病牛只治疗
  298. func (s *StoreEntry) CowDiseaseTreatment(ctx context.Context, req *pasturePb.CowTreatmentRequest) error {
  299. userModel, err := s.GetUserModel(ctx)
  300. if err != nil {
  301. return xerr.WithStack(err)
  302. }
  303. pastureId := userModel.AppPasture.Id
  304. cow, err := s.GetCowInfoByCowId(ctx, pastureId, int64(req.CowId))
  305. if err != nil {
  306. return xerr.WithStack(err)
  307. }
  308. // 操作人信息
  309. operationUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
  310. if err != nil {
  311. return xerr.Customf("操作人数据异常: %d", req.OperationId)
  312. }
  313. // 处方信息
  314. prescription, err := s.GetPrescriptionById(ctx, pastureId, req.PrescriptionId)
  315. if err != nil {
  316. return xerr.WithStack(err)
  317. }
  318. // 疾病信息
  319. disease, err := s.GetDiseaseById(ctx, pastureId, req.DiseaseId)
  320. if err != nil {
  321. return xerr.WithStack(err)
  322. }
  323. req.DiseaseName = disease.Name
  324. req.DiseaseType = disease.DiseaseType
  325. // 处方信息
  326. prescriptionDrugs, err := s.PrescriptionDrugsByPrescriptionId(ctx, pastureId, prescription.Id)
  327. if err != nil {
  328. return xerr.WithStack(err)
  329. }
  330. // 牛只疾病信息
  331. eventCowDisease := &model.EventCowDisease{}
  332. if err = s.DB.Where("cow_id = ?", req.CowId).
  333. Where("pasture_id = ?", userModel.AppPasture.Id).
  334. Where("id = ?", req.Id).
  335. First(eventCowDisease).Error; err != nil {
  336. return xerr.WithStack(err)
  337. }
  338. if eventCowDisease.HealthStatus != pasturePb.HealthStatus_Disease &&
  339. eventCowDisease.HealthStatus != pasturePb.HealthStatus_Treatment {
  340. return xerr.Custom("异常牛只数据")
  341. }
  342. // 处方详情
  343. unitMap := s.UnitMap()
  344. prescriptionDetail := make([]*pasturePb.PrescriptionDrugsList, len(prescriptionDrugs))
  345. for i, v := range prescriptionDrugs {
  346. prescriptionDetail[i] = &pasturePb.PrescriptionDrugsList{
  347. DrugsId: int32(v.DrugsId),
  348. DrugsName: v.DrugsName,
  349. Unit: v.Unit,
  350. UnitName: unitMap[v.Unit],
  351. Dosages: v.Dosages,
  352. }
  353. }
  354. req.PrescriptionDetail = prescriptionDetail
  355. healthStatus := pasturePb.HealthStatus_Treatment
  356. if req.TreatmentResult == pasturePb.TreatmentResult_Curable {
  357. healthStatus = pasturePb.HealthStatus_Curable
  358. }
  359. if req.TreatmentResult == pasturePb.TreatmentResult_Out {
  360. healthStatus = pasturePb.HealthStatus_Out
  361. }
  362. if req.TreatmentResult == pasturePb.TreatmentResult_Dead {
  363. healthStatus = pasturePb.HealthStatus_Dead
  364. }
  365. diseaseTypeMap := s.DiseaseTypeMap()
  366. newEventCowTreatment := model.NewEventCowTreatment(pastureId, prescription, req, diseaseTypeMap, operationUser, userModel.SystemUser)
  367. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  368. if err = tx.Create(newEventCowTreatment).Error; err != nil {
  369. return xerr.WithStack(err)
  370. }
  371. eventCowDisease.EventTreatmentUpdate(healthStatus, int64(req.TreatmentAt), prescription.Name)
  372. if err = tx.Model(eventCowDisease).
  373. Select("health_status", "first_treatment_at", "last_treatment_at", "last_prescription_name").
  374. Where("id = ?", req.Id).
  375. Where("cow_id = ?", req.CowId).
  376. Updates(eventCowDisease).Error; err != nil {
  377. return xerr.WithStack(err)
  378. }
  379. cow.EventHealthStatusUpdate(healthStatus)
  380. if err = tx.Model(new(model.Cow)).
  381. Select("health_status").
  382. Where("id = ?", req.CowId).
  383. Updates(cow).Error; err != nil {
  384. return xerr.WithStack(err)
  385. }
  386. prescription.EventUseCountUpdate()
  387. if err = tx.Model(prescription).
  388. Select("use_count").
  389. Where("id = ?", prescription.Id).
  390. Updates(prescription).Error; err != nil {
  391. return xerr.WithStack(err)
  392. }
  393. return nil
  394. }); err != nil {
  395. return xerr.WithStack(err)
  396. }
  397. return nil
  398. }
  399. func (s *StoreEntry) DiseaseSuggestPrescription(ctx context.Context, diseaseId int64) (*pasturePb.ConfigOptionsListResponse, error) {
  400. userModel, err := s.GetUserModel(ctx)
  401. if err != nil {
  402. return nil, xerr.WithStack(err)
  403. }
  404. res := make([]*pasturePb.ConfigOptionsList, 0)
  405. prescriptionList := make([]*model.Prescription, 0)
  406. if err = s.DB.Model(new(model.Prescription)).
  407. Where("is_show = ?", pasturePb.IsShow_Ok).
  408. Where("pasture_id = ?", userModel.AppPasture.Id).
  409. Find(&prescriptionList).Error; err != nil {
  410. return nil, xerr.WithStack(err)
  411. }
  412. for _, v := range prescriptionList {
  413. disabled := false
  414. if strings.Contains(v.ApplicableDisease, fmt.Sprintf("%d", diseaseId)) {
  415. disabled = true
  416. }
  417. res = append(res, &pasturePb.ConfigOptionsList{
  418. Value: v.Id,
  419. Label: v.Name,
  420. Disabled: disabled,
  421. })
  422. }
  423. return &pasturePb.ConfigOptionsListResponse{
  424. Code: http.StatusOK,
  425. Msg: "ok",
  426. Data: res,
  427. }, nil
  428. }
  429. // CowDiseaseTreatmentDetail 发病牛只治疗详情列表
  430. func (s *StoreEntry) CowDiseaseTreatmentDetail(ctx context.Context, req *pasturePb.EventCowTreatmentDetailRequest,
  431. pagination *pasturePb.PaginationModel) (*pasturePb.EventCowTreatmentDetailResponse, error) {
  432. userModel, err := s.GetUserModel(ctx)
  433. if err != nil {
  434. return nil, xerr.WithStack(err)
  435. }
  436. eventCowDisease := &model.EventCowDisease{}
  437. var count int64 = 0
  438. pref := s.DB.Model(new(model.EventCowDisease)).
  439. Where("cow_id = ?", req.CowId).
  440. Where("pasture_id = ?", userModel.AppPasture.Id).
  441. Where("id = ?", req.Id)
  442. if req.DiseaseId > 0 {
  443. pref.Where("disease_id = ?", req.DiseaseId)
  444. }
  445. if req.DiseaseStartAt > 0 && req.DiseaseEndAt > 0 && req.DiseaseStartAt <= req.DiseaseEndAt {
  446. pref.Where("disease_at BETWEEN ? AND ?", req.DiseaseStartAt, req.DiseaseEndAt)
  447. }
  448. if err = pref.Count(&count).
  449. Limit(int(pagination.PageSize)).
  450. Offset(int(pagination.PageOffset)).
  451. Order("id desc").
  452. First(&eventCowDisease).Error; err != nil {
  453. if errors.Is(err, gorm.ErrRecordNotFound) {
  454. return &pasturePb.EventCowTreatmentDetailResponse{
  455. Code: http.StatusOK,
  456. Msg: "ok",
  457. Data: &pasturePb.EventCowTreatmentDetail{
  458. List: make([]*pasturePb.EventCowTreatment, 0),
  459. Total: 0,
  460. PageSize: pagination.PageSize,
  461. Page: pagination.Page,
  462. },
  463. }, nil
  464. } else {
  465. return nil, xerr.WithStack(err)
  466. }
  467. }
  468. eventCowTreatmentList := make([]*model.EventCowTreatment, 0)
  469. if err = s.DB.Model(new(model.EventCowTreatment)).
  470. Where("cow_disease_id = ?", req.Id).
  471. Where("cow_id = ?", req.CowId).
  472. Order("id desc").
  473. Find(&eventCowTreatmentList).Error; err != nil {
  474. return nil, xerr.WithStack(err)
  475. }
  476. return &pasturePb.EventCowTreatmentDetailResponse{
  477. Code: http.StatusOK,
  478. Msg: "ok",
  479. Data: &pasturePb.EventCowTreatmentDetail{
  480. List: model.EventCowTreatmentSlice(eventCowTreatmentList).ToPB(eventCowDisease),
  481. Total: int32(count),
  482. PageSize: pagination.Page,
  483. Page: pagination.PageSize,
  484. },
  485. }, nil
  486. }
  487. func (s *StoreEntry) CowDiseaseCurable(ctx context.Context, req *pasturePb.EventCowCurableRequest) error {
  488. userModel, err := s.GetUserModel(ctx)
  489. if err != nil {
  490. return xerr.WithStack(err)
  491. }
  492. eventCowDiseaseList := make([]*model.EventCowDisease, 0)
  493. if err = s.DB.Where("id IN ?", req.Ids).
  494. Where("health_status = ?", pasturePb.HealthStatus_Treatment).
  495. Where("pasture_id = ?", userModel.AppPasture.Id).
  496. Find(&eventCowDiseaseList).Error; err != nil {
  497. zaplog.Error("GetEventCowDiseaseList", zap.Any("err", err), zap.Any("req", req))
  498. return xerr.Custom("异常数据")
  499. }
  500. if len(eventCowDiseaseList) == 0 {
  501. return nil
  502. }
  503. operationUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
  504. if err != nil {
  505. return xerr.Customf("该用户不存在: %d", req.OperationId)
  506. }
  507. eventCowTreatmentList := make([]*model.EventCowTreatment, 0)
  508. for _, v := range eventCowDiseaseList {
  509. newEventCowTreatment := model.NewEventCowCurableTreatment(userModel.AppPasture.Id, userModel.SystemUser, operationUser, v, req.Remarks, int64(req.CurableAt))
  510. eventCowTreatmentList = append(eventCowTreatmentList, newEventCowTreatment)
  511. }
  512. if len(eventCowTreatmentList) <= 0 {
  513. return nil
  514. }
  515. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  516. for _, eventCowDisease := range eventCowDiseaseList {
  517. eventCowDisease.EventCurableUpdate(int64(req.CurableAt))
  518. if err = tx.Model(eventCowDisease).
  519. Select("health_status", "diagnosed_result", "curable_at").
  520. Where("id = ?", eventCowDisease.Id).
  521. Where("health_status = ?", pasturePb.HealthStatus_Treatment).
  522. Updates(eventCowDisease).Error; err != nil {
  523. return xerr.WithStack(err)
  524. }
  525. cow, err := s.GetCowInfoByCowId(ctx, userModel.AppPasture.Id, eventCowDisease.CowId)
  526. if err != nil {
  527. return xerr.WithStack(err)
  528. }
  529. // 更新牛只健康状态
  530. cow.EventHealthStatusUpdate(pasturePb.HealthStatus_Curable)
  531. if err = tx.Model(cow).
  532. Select("health_status").
  533. Where("id = ?", eventCowDisease.CowId).
  534. Updates(cow).Error; err != nil {
  535. return xerr.WithStack(err)
  536. }
  537. // 更新发病事件日志
  538. cowLogs := &model.EventCowLog{CowId: cow.Id}
  539. curableAtFormat := ""
  540. if eventCowDisease.CurableAt > 0 {
  541. curableAtFormat = time.Unix(eventCowDisease.CurableAt, 0).Local().Format(model.LayoutDate2)
  542. }
  543. curableAtParse := time.Unix(eventCowDisease.CurableAt, 0).Local()
  544. diseaseAtParse := time.Unix(eventCowDisease.DiseaseAt, 0).Local()
  545. curableDays := int64(curableAtParse.Sub(diseaseAtParse).Hours() / 24)
  546. if err = tx.Table(cowLogs.TableName()).
  547. Where("event_type = ?", pasturePb.EventType_Disease).
  548. Where("event_at = ?", eventCowDisease.DiseaseAt).
  549. Update("event_description", fmt.Sprintf("疾病名称: %s; 状态: 已治愈; 治愈时间: %s; 治疗天数: %d;", eventCowDisease.DiseaseName, curableAtFormat, curableDays)).
  550. Error; err != nil {
  551. return xerr.WithStack(err)
  552. }
  553. }
  554. if err = tx.Model(new(model.EventCowTreatment)).Create(eventCowTreatmentList).Error; err != nil {
  555. return xerr.WithStack(err)
  556. }
  557. return nil
  558. }); err != nil {
  559. return xerr.WithStack(err)
  560. }
  561. return nil
  562. }