event_health_more.go 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "kpt-pasture/model"
  7. "net/http"
  8. "strings"
  9. "time"
  10. pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
  11. "gitee.com/xuyiping_admin/pkg/logger/zaplog"
  12. "gitee.com/xuyiping_admin/pkg/xerr"
  13. "go.uber.org/zap"
  14. "gorm.io/gorm"
  15. )
  16. // CowDiseaseTreatmentDetail 发病牛只治疗详情列表
  17. func (s *StoreEntry) CowDiseaseTreatmentDetail(ctx context.Context, req *pasturePb.EventCowTreatmentDetailRequest,
  18. pagination *pasturePb.PaginationModel) (*pasturePb.EventCowTreatmentDetailResponse, error) {
  19. userModel, err := s.GetUserModel(ctx)
  20. if err != nil {
  21. return nil, xerr.WithStack(err)
  22. }
  23. eventCowDisease := &model.EventCowDisease{}
  24. var count int64 = 0
  25. pref := s.DB.Model(new(model.EventCowDisease)).
  26. Where("cow_id = ?", req.CowId).
  27. Where("pasture_id = ?", userModel.AppPasture.Id).
  28. Where("id = ?", req.Id)
  29. if req.DiseaseId > 0 {
  30. pref.Where("disease_id = ?", req.DiseaseId)
  31. }
  32. result := &pasturePb.EventCowTreatmentDetailResponse{
  33. Code: http.StatusOK,
  34. Msg: "ok",
  35. Data: &pasturePb.EventCowTreatmentDetail{
  36. List: make([]*pasturePb.EventCowTreatment, 0),
  37. Total: 0,
  38. PageSize: pagination.PageSize,
  39. Page: pagination.Page,
  40. },
  41. }
  42. if err = pref.Count(&count).
  43. Limit(int(pagination.PageSize)).
  44. Offset(int(pagination.PageOffset)).
  45. Order("id desc").
  46. First(&eventCowDisease).Error; err != nil {
  47. if errors.Is(err, gorm.ErrRecordNotFound) {
  48. return result, nil
  49. } else {
  50. return nil, xerr.WithStack(err)
  51. }
  52. }
  53. eventCowTreatmentList := make([]*model.EventCowTreatment, 0)
  54. pref2 := s.DB.Model(new(model.EventCowTreatment)).
  55. Where("cow_disease_id = ?", req.Id).
  56. Where("cow_id = ?", req.CowId)
  57. if req.TreatmentStartAt > 0 && req.TreatmentEndAt > 0 && req.TreatmentStartAt <= req.TreatmentEndAt {
  58. pref2.Where("treatment_at BETWEEN ? AND ?", req.TreatmentStartAt, req.TreatmentEndAt+86400)
  59. }
  60. if err = pref2.
  61. Order("id desc").
  62. Find(&eventCowTreatmentList).Error; err != nil {
  63. return nil, xerr.WithStack(err)
  64. }
  65. result.Data.List = model.EventCowTreatmentSlice(eventCowTreatmentList).ToPB(eventCowDisease)
  66. result.Data.Total = int32(count)
  67. result.Data.PageSize = pagination.Page
  68. result.Data.Page = pagination.PageSize
  69. return result, nil
  70. }
  71. func (s *StoreEntry) DiseaseSuggestPrescription(ctx context.Context, diseaseId int64) (*pasturePb.ConfigOptionsListResponse, error) {
  72. userModel, err := s.GetUserModel(ctx)
  73. if err != nil {
  74. return nil, xerr.WithStack(err)
  75. }
  76. res := make([]*pasturePb.ConfigOptionsList, 0)
  77. prescriptionList := make([]*model.Prescription, 0)
  78. if err = s.DB.Model(new(model.Prescription)).
  79. Where("is_show = ?", pasturePb.IsShow_Ok).
  80. Where("pasture_id = ?", userModel.AppPasture.Id).
  81. Find(&prescriptionList).Error; err != nil {
  82. return nil, xerr.WithStack(err)
  83. }
  84. for _, v := range prescriptionList {
  85. disabled := false
  86. if strings.Contains(v.ApplicableDisease, fmt.Sprintf("%d", diseaseId)) {
  87. disabled = true
  88. }
  89. res = append(res, &pasturePb.ConfigOptionsList{
  90. Value: v.Id,
  91. Label: v.Name,
  92. Disabled: disabled,
  93. })
  94. }
  95. return &pasturePb.ConfigOptionsListResponse{
  96. Code: http.StatusOK,
  97. Msg: "ok",
  98. Data: res,
  99. }, nil
  100. }
  101. func (s *StoreEntry) CowDiseaseCurable(ctx context.Context, req *pasturePb.EventCowCurableRequest) error {
  102. userModel, err := s.GetUserModel(ctx)
  103. if err != nil {
  104. return xerr.WithStack(err)
  105. }
  106. eventCowDiseaseList := make([]*model.EventCowDisease, 0)
  107. if err = s.DB.Where("id IN ?", req.Ids).
  108. Where("health_status = ?", pasturePb.HealthStatus_Treatment).
  109. Where("pasture_id = ?", userModel.AppPasture.Id).
  110. Find(&eventCowDiseaseList).Error; err != nil {
  111. zaplog.Error("GetEventCowDiseaseList", zap.Any("err", err), zap.Any("req", req))
  112. return xerr.Custom("异常数据")
  113. }
  114. if len(eventCowDiseaseList) == 0 {
  115. return nil
  116. }
  117. operationUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
  118. if err != nil {
  119. return xerr.Customf("该用户不存在: %d", req.OperationId)
  120. }
  121. eventCowTreatmentList := make([]*model.EventCowTreatment, 0)
  122. for _, v := range eventCowDiseaseList {
  123. newEventCowTreatment := model.NewEventCowCurableTreatment(userModel.AppPasture.Id, userModel.SystemUser, operationUser, v, req.Remarks, int64(req.CurableAt))
  124. eventCowTreatmentList = append(eventCowTreatmentList, newEventCowTreatment)
  125. }
  126. if len(eventCowTreatmentList) <= 0 {
  127. return nil
  128. }
  129. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  130. for _, eventCowDisease := range eventCowDiseaseList {
  131. eventCowDisease.EventCurableUpdate(int64(req.CurableAt))
  132. if err = tx.Model(eventCowDisease).
  133. Select("health_status", "diagnosed_result", "curable_at").
  134. Where("id = ?", eventCowDisease.Id).
  135. Where("health_status = ?", pasturePb.HealthStatus_Treatment).
  136. Updates(eventCowDisease).Error; err != nil {
  137. return xerr.WithStack(err)
  138. }
  139. cow, err := s.GetCowInfoByEarNumber(ctx, userModel.AppPasture.Id, eventCowDisease.EarNumber)
  140. if err != nil {
  141. return xerr.WithStack(err)
  142. }
  143. // 更新牛只健康状态
  144. cow.EventHealthStatusUpdate(pasturePb.HealthStatus_Curable)
  145. if err = tx.Model(cow).
  146. Select("health_status").
  147. Where("id = ?", eventCowDisease.CowId).
  148. Updates(cow).Error; err != nil {
  149. return xerr.WithStack(err)
  150. }
  151. // 更新发病事件日志
  152. cowLogs := &model.EventCowLog{CowId: cow.Id}
  153. curableAtFormat := ""
  154. if eventCowDisease.CurableAt > 0 {
  155. curableAtFormat = time.Unix(eventCowDisease.CurableAt, 0).Local().Format(model.LayoutDate2)
  156. }
  157. curableAtParse := time.Unix(eventCowDisease.CurableAt, 0).Local()
  158. diseaseAtParse := time.Unix(eventCowDisease.DiseaseAt, 0).Local()
  159. curableDays := int64(curableAtParse.Sub(diseaseAtParse).Hours() / 24)
  160. if err = tx.Table(cowLogs.TableName()).
  161. Where("event_type = ?", pasturePb.EventType_Disease).
  162. Where("event_at = ?", eventCowDisease.DiseaseAt).
  163. Update("event_description", fmt.Sprintf("疾病名称: %s; 状态: 已治愈; 治愈时间: %s; 治疗天数: %d;", eventCowDisease.DiseaseName, curableAtFormat, curableDays)).
  164. Error; err != nil {
  165. return xerr.WithStack(err)
  166. }
  167. }
  168. if err = tx.Model(new(model.EventCowTreatment)).Create(eventCowTreatmentList).Error; err != nil {
  169. return xerr.WithStack(err)
  170. }
  171. return nil
  172. }); err != nil {
  173. return xerr.WithStack(err)
  174. }
  175. return nil
  176. }
  177. // NeckRingUpdateHealth 更新牛只脖环揭发疾病信息
  178. func (s *StoreEntry) NeckRingUpdateHealth(ctx context.Context, pastureId, cowId int64, operationUser *model.SystemUser) error {
  179. neckRingHealthWarning := &model.NeckRingHealthWarning{}
  180. if err := s.DB.Model(new(model.NeckRingHealthWarning)).
  181. Where("pasture_id = ?", pastureId).
  182. Where("is_show = ?", pasturePb.IsShow_Ok).
  183. Where("cow_id = ?", cowId).
  184. First(neckRingHealthWarning).Error; err != nil {
  185. return xerr.WithStack(err)
  186. }
  187. neckRingHealth := &model.NeckRingHealth{}
  188. if err := s.DB.Model(new(model.NeckRingHealth)).
  189. Where("pasture_id = ?", pastureId).
  190. Where("id = ?", neckRingHealthWarning.NeckRingHealthId).
  191. First(neckRingHealth).Error; err != nil {
  192. return xerr.WithStack(err)
  193. }
  194. if err := s.DB.Transaction(func(tx *gorm.DB) error {
  195. neckRingHealthWarning.EventDiseaseUpdate()
  196. if err := tx.Model(neckRingHealthWarning).
  197. Select("is_show", pasturePb.IsShow_Ok).
  198. Where("id = ?", neckRingHealthWarning.Id).
  199. Updates(neckRingHealthWarning).Error; err != nil {
  200. return xerr.WithStack(err)
  201. }
  202. neckRingHealth.EventDiseaseUpdate(operationUser)
  203. if err := tx.Model(neckRingHealth).
  204. Select("is_show", "check_user_id", "check_user_name", "check_result", "check_at").
  205. Where("id = ?", neckRingHealth.Id).
  206. Updates(neckRingHealth).Error; err != nil {
  207. return xerr.WithStack(err)
  208. }
  209. return nil
  210. }); err != nil {
  211. return xerr.WithStack(err)
  212. }
  213. return nil
  214. }