event_health_more.go 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  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. if v.LastTreatmentAt > int64(req.CurableAt) {
  124. return xerr.Customf("牛只: %s,治愈时间不能小于上次治疗时间", v.EarNumber)
  125. }
  126. newEventCowTreatment := model.NewEventCowCurableTreatment(userModel.AppPasture.Id, userModel.SystemUser, operationUser, v, req.Remarks, int64(req.CurableAt))
  127. eventCowTreatmentList = append(eventCowTreatmentList, newEventCowTreatment)
  128. }
  129. if len(eventCowTreatmentList) <= 0 {
  130. return nil
  131. }
  132. if err = s.DB.Transaction(func(tx *gorm.DB) error {
  133. for _, eventCowDisease := range eventCowDiseaseList {
  134. eventCowDisease.EventCurableUpdate(int64(req.CurableAt))
  135. if err = tx.Model(eventCowDisease).
  136. Select("health_status", "diagnosed_result", "curable_at").
  137. Where("id = ?", eventCowDisease.Id).
  138. Where("health_status = ?", pasturePb.HealthStatus_Treatment).
  139. Updates(eventCowDisease).Error; err != nil {
  140. return xerr.WithStack(err)
  141. }
  142. cow, err := s.GetCowInfoByEarNumber(ctx, userModel.AppPasture.Id, eventCowDisease.EarNumber)
  143. if err != nil {
  144. return xerr.WithStack(err)
  145. }
  146. // 更新牛只健康状态
  147. cow.EventHealthStatusUpdate(pasturePb.HealthStatus_Curable)
  148. if err = tx.Model(cow).
  149. Select("health_status").
  150. Where("id = ?", eventCowDisease.CowId).
  151. Updates(cow).Error; err != nil {
  152. return xerr.WithStack(err)
  153. }
  154. // 更新发病事件日志
  155. cowLogs := &model.EventCowLog{CowId: cow.Id}
  156. curableAtFormat := ""
  157. if eventCowDisease.CurableAt > 0 {
  158. curableAtFormat = time.Unix(eventCowDisease.CurableAt, 0).Local().Format(model.LayoutDate2)
  159. }
  160. curableAtParse := time.Unix(eventCowDisease.CurableAt, 0).Local()
  161. diseaseAtParse := time.Unix(eventCowDisease.DiseaseAt, 0).Local()
  162. curableDays := int64(curableAtParse.Sub(diseaseAtParse).Hours() / 24)
  163. if err = tx.Table(cowLogs.TableName()).
  164. Where("event_type = ?", pasturePb.EventType_Disease).
  165. Where("event_at = ?", eventCowDisease.DiseaseAt).
  166. Update("event_description", fmt.Sprintf("疾病名称: %s; 状态: 已治愈; 治愈时间: %s; 治疗天数: %d;", eventCowDisease.DiseaseName, curableAtFormat, curableDays)).
  167. Error; err != nil {
  168. return xerr.WithStack(err)
  169. }
  170. }
  171. if err = tx.Model(new(model.EventCowTreatment)).Create(eventCowTreatmentList).Error; err != nil {
  172. return xerr.WithStack(err)
  173. }
  174. return nil
  175. }); err != nil {
  176. return xerr.WithStack(err)
  177. }
  178. return nil
  179. }
  180. // NeckRingUpdateHealth 更新牛只脖环揭发疾病信息
  181. func (s *StoreEntry) NeckRingUpdateHealth(ctx context.Context, pastureId, cowId int64, operationUser *model.SystemUser) error {
  182. neckRingHealthWarning := &model.NeckRingHealthWarning{}
  183. if err := s.DB.Model(new(model.NeckRingHealthWarning)).
  184. Where("pasture_id = ?", pastureId).
  185. Where("is_show = ?", pasturePb.IsShow_Ok).
  186. Where("cow_id = ?", cowId).
  187. First(neckRingHealthWarning).Error; err != nil {
  188. return xerr.WithStack(err)
  189. }
  190. neckRingHealth := &model.NeckRingHealth{}
  191. if err := s.DB.Model(new(model.NeckRingHealth)).
  192. Where("pasture_id = ?", pastureId).
  193. Where("id = ?", neckRingHealthWarning.NeckRingHealthId).
  194. First(neckRingHealth).Error; err != nil {
  195. return xerr.WithStack(err)
  196. }
  197. if err := s.DB.Transaction(func(tx *gorm.DB) error {
  198. neckRingHealthWarning.EventDiseaseUpdate()
  199. if err := tx.Model(neckRingHealthWarning).
  200. Select("is_show", pasturePb.IsShow_Ok).
  201. Where("id = ?", neckRingHealthWarning.Id).
  202. Updates(neckRingHealthWarning).Error; err != nil {
  203. return xerr.WithStack(err)
  204. }
  205. neckRingHealth.EventDiseaseUpdate(operationUser)
  206. if err := tx.Model(neckRingHealth).
  207. Select("is_show", "check_user_id", "check_user_name", "check_result", "check_at").
  208. Where("id = ?", neckRingHealth.Id).
  209. Updates(neckRingHealth).Error; err != nil {
  210. return xerr.WithStack(err)
  211. }
  212. return nil
  213. }); err != nil {
  214. return xerr.WithStack(err)
  215. }
  216. return nil
  217. }