event_health_more.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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. if req.DiseaseStartAt > 0 && req.DiseaseEndAt > 0 && req.DiseaseStartAt <= req.DiseaseEndAt {
  33. pref.Where("disease_at BETWEEN ? AND ?", req.DiseaseStartAt, req.DiseaseEndAt)
  34. }
  35. if err = pref.Count(&count).
  36. Limit(int(pagination.PageSize)).
  37. Offset(int(pagination.PageOffset)).
  38. Order("id desc").
  39. First(&eventCowDisease).Error; err != nil {
  40. if errors.Is(err, gorm.ErrRecordNotFound) {
  41. return &pasturePb.EventCowTreatmentDetailResponse{
  42. Code: http.StatusOK,
  43. Msg: "ok",
  44. Data: &pasturePb.EventCowTreatmentDetail{
  45. List: make([]*pasturePb.EventCowTreatment, 0),
  46. Total: 0,
  47. PageSize: pagination.PageSize,
  48. Page: pagination.Page,
  49. },
  50. }, nil
  51. } else {
  52. return nil, xerr.WithStack(err)
  53. }
  54. }
  55. eventCowTreatmentList := make([]*model.EventCowTreatment, 0)
  56. if err = s.DB.Model(new(model.EventCowTreatment)).
  57. Where("cow_disease_id = ?", req.Id).
  58. Where("cow_id = ?", req.CowId).
  59. Order("id desc").
  60. Find(&eventCowTreatmentList).Error; err != nil {
  61. return nil, xerr.WithStack(err)
  62. }
  63. return &pasturePb.EventCowTreatmentDetailResponse{
  64. Code: http.StatusOK,
  65. Msg: "ok",
  66. Data: &pasturePb.EventCowTreatmentDetail{
  67. List: model.EventCowTreatmentSlice(eventCowTreatmentList).ToPB(eventCowDisease),
  68. Total: int32(count),
  69. PageSize: pagination.Page,
  70. Page: pagination.PageSize,
  71. },
  72. }, nil
  73. }
  74. func (s *StoreEntry) DiseaseSuggestPrescription(ctx context.Context, diseaseId int64) (*pasturePb.ConfigOptionsListResponse, error) {
  75. userModel, err := s.GetUserModel(ctx)
  76. if err != nil {
  77. return nil, xerr.WithStack(err)
  78. }
  79. res := make([]*pasturePb.ConfigOptionsList, 0)
  80. prescriptionList := make([]*model.Prescription, 0)
  81. if err = s.DB.Model(new(model.Prescription)).
  82. Where("is_show = ?", pasturePb.IsShow_Ok).
  83. Where("pasture_id = ?", userModel.AppPasture.Id).
  84. Find(&prescriptionList).Error; err != nil {
  85. return nil, xerr.WithStack(err)
  86. }
  87. for _, v := range prescriptionList {
  88. disabled := false
  89. if strings.Contains(v.ApplicableDisease, fmt.Sprintf("%d", diseaseId)) {
  90. disabled = true
  91. }
  92. res = append(res, &pasturePb.ConfigOptionsList{
  93. Value: v.Id,
  94. Label: v.Name,
  95. Disabled: disabled,
  96. })
  97. }
  98. return &pasturePb.ConfigOptionsListResponse{
  99. Code: http.StatusOK,
  100. Msg: "ok",
  101. Data: res,
  102. }, nil
  103. }
  104. func (s *StoreEntry) CowDiseaseCurable(ctx context.Context, req *pasturePb.EventCowCurableRequest) error {
  105. userModel, err := s.GetUserModel(ctx)
  106. if err != nil {
  107. return xerr.WithStack(err)
  108. }
  109. eventCowDiseaseList := make([]*model.EventCowDisease, 0)
  110. if err = s.DB.Where("id IN ?", req.Ids).
  111. Where("health_status = ?", pasturePb.HealthStatus_Treatment).
  112. Where("pasture_id = ?", userModel.AppPasture.Id).
  113. Find(&eventCowDiseaseList).Error; err != nil {
  114. zaplog.Error("GetEventCowDiseaseList", zap.Any("err", err), zap.Any("req", req))
  115. return xerr.Custom("异常数据")
  116. }
  117. if len(eventCowDiseaseList) == 0 {
  118. return nil
  119. }
  120. operationUser, err := s.GetSystemUserById(ctx, int64(req.OperationId))
  121. if err != nil {
  122. return xerr.Customf("该用户不存在: %d", req.OperationId)
  123. }
  124. eventCowTreatmentList := make([]*model.EventCowTreatment, 0)
  125. for _, v := range eventCowDiseaseList {
  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.GetCowInfoByCowId(ctx, userModel.AppPasture.Id, eventCowDisease.CowId)
  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("is_show = ?", pasturePb.IsShow_Ok).
  194. Where("id = ?", neckRingHealthWarning.NeckRingHealthId).
  195. First(neckRingHealth).Error; err != nil {
  196. return xerr.WithStack(err)
  197. }
  198. if err := s.DB.Transaction(func(tx *gorm.DB) error {
  199. neckRingHealthWarning.EventDiseaseUpdate()
  200. if err := tx.Model(neckRingHealthWarning).
  201. Select("is_show", pasturePb.IsShow_Ok).
  202. Where("id = ?", neckRingHealthWarning.Id).
  203. Updates(neckRingHealthWarning).Error; err != nil {
  204. return xerr.WithStack(err)
  205. }
  206. neckRingHealth.EventDiseaseUpdate(operationUser)
  207. if err := tx.Model(neckRingHealth).
  208. Select("is_show", "check_user_id", "check_user_name", "check_result", "check_at").
  209. Where("id = ?", neckRingHealth.Id).
  210. Updates(neckRingHealth).Error; err != nil {
  211. return xerr.WithStack(err)
  212. }
  213. return nil
  214. }); err != nil {
  215. return xerr.WithStack(err)
  216. }
  217. return nil
  218. }