Browse Source

prescription: 处方相关

Yi 8 months ago
parent
commit
38668bd968

+ 1 - 1
go.mod

@@ -3,7 +3,7 @@ module kpt-pasture
 go 1.17
 
 require (
-	gitee.com/xuyiping_admin/go_proto v0.0.0-20240725024205-61c6f300fd42
+	gitee.com/xuyiping_admin/go_proto v0.0.0-20240729074839-92b2b1102385
 	gitee.com/xuyiping_admin/pkg v0.0.0-20231218082641-aac597b8a015
 	github.com/dgrijalva/jwt-go v3.2.0+incompatible
 	github.com/getsentry/sentry-go v0.23.0

+ 19 - 0
go.sum

@@ -38,6 +38,20 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20240725024205-61c6f300fd42 h1:qRwKHFHfLcMKEX4r4HNxg58PNoOlYJQPdCubbeakJ60=
 gitee.com/xuyiping_admin/go_proto v0.0.0-20240725024205-61c6f300fd42/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240725055209-80f0f002ac59 h1:2siTu6HFl7hxsIVPqipUyPvG0FgULnLXecQshvzZ004=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240725055209-80f0f002ac59/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240725063129-1de916ecb548 h1:xWMevF4T+rYwHmIlcdYHGuOPhKfzNO4UIBT6axYF8VM=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240725063129-1de916ecb548/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240725065855-bce84c102984 h1:nMidWL0Pw5ReEdyQjLSDZ6ajaekTwFpVl5xUMG6j5ow=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240725065855-bce84c102984/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240725070854-e1efa1aee656 h1:Q5nsDTObjPbuU61BoM16BTXxpqnT0TJBbGym5BHJFVk=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240725070854-e1efa1aee656/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240729060838-f52572b4f9e1 h1:L0rYFJbl1h4/b1EGKdzSi3VdA27TPjjxpIRTQheLPQs=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240729060838-f52572b4f9e1/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240729074149-7b30664e5821 h1:QbJFiz83tXn5VOMsN7VM79oBe78H2fkITcot5yM1zfs=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240729074149-7b30664e5821/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240729074839-92b2b1102385 h1:qhfsmIovTOcKlqzaHoNzqhBuk4mwjN0pnQtG+W7BRbo=
+gitee.com/xuyiping_admin/go_proto v0.0.0-20240729074839-92b2b1102385/go.mod h1:BKrFW6YLDectlQcQk3FYKBeXvjEiodAKJ5rq7O/QiPE=
 gitee.com/xuyiping_admin/pkg v0.0.0-20231218082641-aac597b8a015 h1:dfb5dRd57L2HKjdwLT93UFmPYFPOmEl56gtZmqcNnaE=
 gitee.com/xuyiping_admin/pkg v0.0.0-20231218082641-aac597b8a015/go.mod h1:Fk4GYI/v0IK3XFrm1Gn+VkgCz5Y7mfswD5hsTJYOG6A=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
@@ -105,6 +119,7 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2
 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
 github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
 github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
 github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
 github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs=
@@ -213,10 +228,12 @@ github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkr
 github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
 github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
 github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
@@ -258,6 +275,7 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/nyaruka/phonenumbers v1.1.7 h1:5UUI9hE79Kk0dymSquXbMYB7IlNDNhvu2aNlJpm9et8=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
@@ -363,6 +381,7 @@ go.uber.org/dig v1.15.0 h1:vq3YWr8zRj1eFGC7Gvf907hE0eRjPTZ1d3xHadD6liE=
 go.uber.org/dig v1.15.0/go.mod h1:pKHs0wMynzL6brANhB2hLMro+zalv1osARTviTcqHLM=
 go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
 go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
+go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
 go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
 go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=

+ 8 - 1
http/handler/config/config.go

@@ -43,7 +43,14 @@ func DiseaseTypeOptions(c *gin.Context) {
 	}
 	ginutil.JSONResp(c, res)
 }
-
+func DiseaseOptions(c *gin.Context) {
+	res, err := middleware.Dependency(c).StoreEventHub.OpsService.DiseaseOptions(c)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	ginutil.JSONResp(c, res)
+}
 func BreedStatusOptions(c *gin.Context) {
 	res, err := middleware.Dependency(c).StoreEventHub.OpsService.BreedStatusOptions(c)
 	if err != nil {

+ 48 - 0
http/handler/pasture/barn.go

@@ -494,3 +494,51 @@ func CreatedOrUpdateDiseaseType(c *gin.Context) {
 		Data: &operationPb.Success{Success: true},
 	})
 }
+
+func SearchPrescriptionList(c *gin.Context) {
+	var req pasturePb.SearchPrescriptionRequest
+	if err := ginutil.BindProto(c, &req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	pagination := &pasturePb.PaginationModel{
+		Page:       int32(c.GetInt(middleware.Page)),
+		PageSize:   int32(c.GetInt(middleware.PageSize)),
+		PageOffset: int32(c.GetInt(middleware.PageOffset)),
+	}
+
+	res, err := middleware.Dependency(c).StoreEventHub.OpsService.SearchPrescriptionList(c, &req, pagination)
+	if err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+	ginutil.JSONResp(c, res)
+}
+
+func CreatedOrUpdatePrescription(c *gin.Context) {
+	var req pasturePb.PrescriptionRequest
+	if err := ginutil.BindProto(c, &req); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := valid.ValidateStruct(&req,
+		valid.Field(&req.Name, valid.Required),
+		valid.Field(&req.PrescriptionDrugsItem, valid.Required),
+	); err != nil {
+		apierr.AbortBadRequest(c, http.StatusBadRequest, err)
+		return
+	}
+
+	if err := middleware.BackendOperation(c).OpsService.CreateOrUpdatePrescription(c, &req); err != nil {
+		apierr.ClassifiedAbort(c, err)
+		return
+	}
+
+	ginutil.JSONResp(c, &operationPb.CommonOK{
+		Code: http.StatusOK,
+		Msg:  "ok",
+		Data: &operationPb.Success{Success: true},
+	})
+}

+ 1 - 0
http/route/config_api.go

@@ -25,5 +25,6 @@ func ConfigAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		pastureRoute.GET("/system/user/options", config.SystemUserOptions)
 		pastureRoute.GET("/system/base/config/options", config.SystemBaseConfigOptions)
 		pastureRoute.GET("/disease/type/options", config.DiseaseTypeOptions)
+		pastureRoute.GET("/disease/options", config.DiseaseOptions)
 	}
 }

+ 5 - 0
http/route/pasture_api.go

@@ -30,11 +30,16 @@ func PastureManageAPI(opts ...func(engine *gin.Engine)) func(s *gin.Engine) {
 		pastureRoute.POST("/cow/source/list", pasture.SearchCowSourceList)
 		pastureRoute.POST("/cow/source/createOrUpdate", pasture.CreatedOrUpdateCowSource)
 
+		// 疾病相关
 		pastureRoute.POST("/disease/type/list", pasture.SearchDiseaseTypeList)
 		pastureRoute.POST("/disease/type/createOrUpdate", pasture.CreatedOrUpdateDiseaseType)
 		pastureRoute.POST("/disease/list", pasture.SearchDiseaseList)
 		pastureRoute.POST("/disease/createOrUpdate", pasture.CreatedOrUpdateDisease)
 
+		// 处方相关
+		pastureRoute.POST("/prescription/list", pasture.SearchPrescriptionList)
+		pastureRoute.POST("/prescription/createOrUpdate", pasture.CreatedOrUpdatePrescription)
+
 		pastureRoute.POST("/seme/time/create", pasture.SemeTimeCreated)
 		pastureRoute.POST("/seme/time/list", pasture.SemeTimeList)
 		pastureRoute.GET("/seme/time/detail/:semeTimeId", pasture.SemeTimeDetail)

+ 14 - 0
model/disease.go

@@ -31,12 +31,14 @@ func (d DiseaseSlice) ToPB(user []*SystemUser, diseaseTypeList []*ConfigDiseaseT
 		for _, u := range user {
 			if u.Id == dl.OperationId {
 				operationName = u.NickName
+				break
 			}
 		}
 
 		for _, dt := range diseaseTypeList {
 			if dt.Id == int64(dl.DiseaseType) {
 				diseaseTypeName = dt.Name
+				break
 			}
 		}
 
@@ -56,3 +58,15 @@ func (d DiseaseSlice) ToPB(user []*SystemUser, diseaseTypeList []*ConfigDiseaseT
 	}
 	return res
 }
+
+func (c DiseaseSlice) ToPB2() []*pasturePb.ConfigOptionsList {
+	res := make([]*pasturePb.ConfigOptionsList, len(c))
+	for i, d := range c {
+		res[i] = &pasturePb.ConfigOptionsList{
+			Value:    int32(d.Id),
+			Label:    d.Name,
+			Disabled: true,
+		}
+	}
+	return res
+}

+ 40 - 36
model/drugs.go

@@ -3,22 +3,24 @@ package model
 import pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
 
 type Drugs struct {
-	Id           int64                       `json:"id"`
-	Name         string                      `json:"name"`
-	CategoryId   pasturePb.DrugCategory_Kind `json:"category_id"`
-	Producer     string                      `json:"producer"`
-	BatchNumber  string                      `json:"batch_number"`
-	ProductionAt int64                       `json:"production_at"`
-	ExpirationAt int64                       `json:"expiration_at"`
-	Unit         pasturePb.Unit_Kind         `json:"unit"`
-	Specs        string                      `json:"specs"`
-	Inventory    int32                       `json:"inventory"`
-	UsageMethod  pasturePb.DrugUsage_Kind    `json:"usage_method"`
-	Price        int32                       `json:"price"`
-	Remarks      string                      `json:"remarks"`
-	OperationId  int32                       `json:"operation_id"`
-	CreatedAt    int64                       `json:"created_at"`
-	UpdatedAt    int64                       `json:"updated_at"`
+	Id              int64                       `json:"id"`
+	Name            string                      `json:"name"`
+	CategoryId      pasturePb.DrugCategory_Kind `json:"category_id"`
+	Producer        string                      `json:"producer"`
+	BatchNumber     string                      `json:"batch_number"`
+	ProductionAt    int64                       `json:"production_at"`
+	ExpirationAt    int64                       `json:"expiration_at"`
+	Unit            pasturePb.Unit_Kind         `json:"unit"`
+	Specs           string                      `json:"specs"`
+	Inventory       int32                       `json:"inventory"`
+	UsageMethod     pasturePb.DrugUsage_Kind    `json:"usage_method"`
+	Price           int32                       `json:"price"`
+	MilkExpiredDays int32                       `json:"milk_expired_days"`
+	MeatExpiredDays int32                       `json:"meat_expired_days"`
+	Remarks         string                      `json:"remarks"`
+	OperationId     int32                       `json:"operation_id"`
+	CreatedAt       int64                       `json:"created_at"`
+	UpdatedAt       int64                       `json:"updated_at"`
 }
 
 func (d *Drugs) TableName() string {
@@ -58,26 +60,28 @@ func (d DrugsSlice) ToPB(systemUserList []*SystemUser, drugsCategoryMap map[past
 		}
 
 		res[i] = &pasturePb.SearchDrugsList{
-			Id:            int32(v.Id),
-			Name:          v.Name,
-			CategoryId:    v.CategoryId,
-			CategoryName:  drugsCategoryMap[v.CategoryId],
-			Producer:      v.Producer,
-			BatchNumber:   v.BatchNumber,
-			ProductionAt:  int32(v.ProductionAt),
-			ExpirationAt:  int32(v.ExpirationAt),
-			Unit:          v.Unit,
-			UnitName:      unitMap[v.Unit],
-			Specs:         v.Specs,
-			Inventory:     v.Inventory,
-			Usage:         v.UsageMethod,
-			UsageName:     drugUsageMap[v.UsageMethod],
-			Price:         float32(v.Price) / 100,
-			Remarks:       v.Remarks,
-			OperationId:   v.OperationId,
-			OperationName: operationName,
-			CreatedAt:     int32(v.CreatedAt),
-			UpdatedAt:     int32(v.UpdatedAt),
+			Id:              int32(v.Id),
+			Name:            v.Name,
+			CategoryId:      v.CategoryId,
+			CategoryName:    drugsCategoryMap[v.CategoryId],
+			Producer:        v.Producer,
+			BatchNumber:     v.BatchNumber,
+			ProductionAt:    int32(v.ProductionAt),
+			ExpirationAt:    int32(v.ExpirationAt),
+			Unit:            v.Unit,
+			UnitName:        unitMap[v.Unit],
+			Specs:           v.Specs,
+			Inventory:       v.Inventory,
+			Usage:           v.UsageMethod,
+			UsageName:       drugUsageMap[v.UsageMethod],
+			Price:           float32(v.Price) / 100,
+			MeatExpiredDays: v.MeatExpiredDays,
+			MilkExpiredDays: v.MilkExpiredDays,
+			Remarks:         v.Remarks,
+			OperationId:     v.OperationId,
+			OperationName:   operationName,
+			CreatedAt:       int32(v.CreatedAt),
+			UpdatedAt:       int32(v.UpdatedAt),
 		}
 	}
 	return res

+ 91 - 0
model/prescription.go

@@ -0,0 +1,91 @@
+package model
+
+import (
+	"fmt"
+	"strings"
+
+	pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
+)
+
+type Prescription struct {
+	Id                int64                 `json:"id"`
+	Name              string                `json:"name"`
+	ApplicableDisease string                `json:"applicable_disease"`
+	UseDays           int32                 `json:"use_days"`
+	UseCount          int32                 `json:"use_count"`
+	MeatExpiredDays   int32                 `json:"meat_expired_days"`
+	MilkExpiredDays   int32                 `json:"milk_expired_days"`
+	IsShow            pasturePb.IsShow_Kind `json:"is_show"`
+	Remarks           string                `json:"remarks"`
+	OperationId       int64                 `json:"operation_id"`
+	CreatedAt         int64                 `json:"created_at"`
+	UpdatedAt         int64                 `json:"updated_at"`
+}
+
+func (p *Prescription) TableName() string {
+	return "prescription"
+}
+
+func NewPrescription(req *pasturePb.PrescriptionRequest, useDays, meatExpiredDays, milkExpiredDays int32, operationId int64) *Prescription {
+	applicableDisease := ""
+	for _, v := range req.ApplicableDisease {
+		applicableDisease += fmt.Sprintf("%d", v) + "|"
+	}
+	return &Prescription{
+		Name:              req.Name,
+		ApplicableDisease: applicableDisease,
+		UseDays:           useDays,
+		UseCount:          0,
+		MeatExpiredDays:   meatExpiredDays,
+		MilkExpiredDays:   milkExpiredDays,
+		IsShow:            req.IsShow,
+		Remarks:           req.Remarks,
+		OperationId:       operationId,
+	}
+}
+
+type PrescriptionSlice []*Prescription
+
+func (p PrescriptionSlice) ToPB(userList []*SystemUser, prescriptionDrugsList []*PrescriptionDrugs) []*pasturePb.SearchPrescriptionList {
+	res := make([]*pasturePb.SearchPrescriptionList, len(p))
+	for i, v := range p {
+		operationName := ""
+		for _, u := range userList {
+			if u.Id == v.OperationId {
+				operationName = u.Name
+				break
+			}
+		}
+		drugsList := make([]*pasturePb.PrescriptionDrugsList, 0)
+		for _, d := range prescriptionDrugsList {
+			if d.PrescriptionId != v.Id {
+				continue
+			}
+			drugsList = append(drugsList, &pasturePb.PrescriptionDrugsList{
+				Id:       int32(d.Id),
+				DrugsId:  int32(d.DrugsId),
+				Unit:     d.Unit,
+				UnitName: d.UnitName,
+				Dosages:  d.Dosages,
+				UseDays:  d.UseDays,
+			})
+		}
+		res[i] = &pasturePb.SearchPrescriptionList{
+			Id:                int32(v.Id),
+			Name:              v.Name,
+			ApplicableDisease: strings.Split(v.ApplicableDisease, "|"),
+			UseDays:           v.UseDays,
+			UseCount:          v.UseCount,
+			MeatExpiredDays:   v.MeatExpiredDays,
+			MilkExpiredDays:   v.MilkExpiredDays,
+			IsShow:            v.IsShow,
+			Remarks:           v.Remarks,
+			OperationId:       int32(v.OperationId),
+			OperationName:     operationName,
+			CreatedAt:         int32(v.CreatedAt),
+			UpdatedAt:         int32(v.UpdatedAt),
+			DrugsList:         drugsList,
+		}
+	}
+	return res
+}

+ 37 - 0
model/prescription_drugs.go

@@ -0,0 +1,37 @@
+package model
+
+import pasturePb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/cow"
+
+type PrescriptionDrugs struct {
+	Id             int64                 `json:"id"`
+	PrescriptionId int64                 `json:"prescription_id"`
+	DrugsId        int64                 `json:"drugs_id"`
+	UseDays        int32                 `json:"use_days"`
+	Dosages        int32                 `json:"dosages"`
+	Unit           pasturePb.Unit_Kind   `json:"unit"`
+	UnitName       string                `json:"unit_name"`
+	IsShow         pasturePb.IsShow_Kind `json:"is_show"`
+	CreatedAt      int64                 `json:"created_at"`
+	UpdatedAt      int64                 `json:"updated_at"`
+}
+
+func (p *PrescriptionDrugs) TableName() string {
+	return "prescription_drugs"
+}
+
+func NewPrescriptionDrugs(prescriptionId int64, req *pasturePb.PrescriptionRequest) []*PrescriptionDrugs {
+	res := make([]*PrescriptionDrugs, len(req.PrescriptionDrugsItem))
+	for i, v := range req.PrescriptionDrugsItem {
+
+		res[i] = &PrescriptionDrugs{
+			PrescriptionId: prescriptionId,
+			DrugsId:        int64(v.DrugsId),
+			UseDays:        v.UseDays,
+			Dosages:        v.Dosages,
+			Unit:           v.Unit,
+			UnitName:       v.UnitName,
+			IsShow:         pasturePb.IsShow_Ok,
+		}
+	}
+	return res
+}

+ 15 - 0
module/backend/config_data.go

@@ -698,6 +698,21 @@ func (s *StoreEntry) DiseaseTypeOptions(ctx context.Context) (*pasturePb.ConfigO
 	}, nil
 }
 
+func (s *StoreEntry) DiseaseOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error) {
+	diseaseList := make([]*model.Disease, 0)
+	pref := s.DB.Table(new(model.Disease).TableName()).
+		Where("is_show =? ", pasturePb.IsShow_Ok)
+
+	if err := pref.Find(&diseaseList).Error; err != nil {
+		return nil, xxerr.WithStack(err)
+	}
+	return &pasturePb.ConfigOptionsListResponse{
+		Code:    http.StatusOK,
+		Message: "ok",
+		Data:    model.DiseaseSlice(diseaseList).ToPB2(),
+	}, nil
+}
+
 func (s *StoreEntry) BreedStatusOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error) {
 	return &pasturePb.ConfigOptionsListResponse{
 		Code:    http.StatusOK,

+ 1 - 1
module/backend/goods.go

@@ -29,7 +29,7 @@ func (s *StoreEntry) DrugsList(ctx context.Context, req *pasturePb.SearchDrugsRe
 	}
 
 	if err := pref.Order("id desc").Count(&count).Limit(int(pagination.PageSize)).Offset(int(pagination.PageOffset)).
-		Find(&drugsList).Debug().Error; err != nil {
+		Find(&drugsList).Error; err != nil {
 		return nil, xerr.WithStack(err)
 	}
 

+ 4 - 0
module/backend/interface.go

@@ -116,6 +116,9 @@ type PastureManageService interface {
 	CreateOrUpdateDiseaseType(ctx context.Context, req *pasturePb.SearchBaseConfigList) error
 	SearchDiseaseList(ctx context.Context, req *pasturePb.SearchDiseaseRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchDiseaseResponse, error)
 	CreateOrUpdateDisease(ctx context.Context, req *pasturePb.SearchDiseaseList) error
+
+	SearchPrescriptionList(ctx context.Context, req *pasturePb.SearchPrescriptionRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchPrescriptionResponse, error)
+	CreateOrUpdatePrescription(ctx context.Context, req *pasturePb.PrescriptionRequest) error
 }
 
 //go:generate mockgen -destination mock/ConfigDataService.go -package kptservicemock kpt-pasture/module/backend ConfigDataService
@@ -132,6 +135,7 @@ type ConfigDataService interface {
 	BullOptions(ctx context.Context) (*pasturePb.BullOptionsListResponse, error)
 	SystemBaseConfigOptions(ctx context.Context, optionName string) (*pasturePb.ConfigOptionsListResponse, error)
 	DiseaseTypeOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error)
+	DiseaseOptions(ctx context.Context) (*pasturePb.ConfigOptionsListResponse, error)
 }
 
 //go:generate mockgen -destination mock/EventService.go -package kptservicemock kpt-pasture/module/backend EventService

+ 125 - 0
module/backend/pasture.go

@@ -609,3 +609,128 @@ func (s *StoreEntry) CreateOrUpdateDiseaseType(ctx context.Context, req *pasture
 	}
 	return nil
 }
+
+func (s *StoreEntry) SearchPrescriptionList(ctx context.Context, req *pasturePb.SearchPrescriptionRequest, pagination *pasturePb.PaginationModel) (*pasturePb.SearchPrescriptionResponse, error) {
+	prescriptionList := make([]*model.Prescription, 0)
+	var count int64 = 0
+
+	pref := s.DB.Model(new(model.Prescription))
+	if req.Name != "" {
+		pref.Where("name like ?", fmt.Sprintf("%s%s%s", "%", req.Name, "%"))
+	}
+
+	if err := pref.Order("id desc").Count(&count).Limit(int(pagination.PageSize)).Offset(int(pagination.PageOffset)).
+		Find(&prescriptionList).Error; err != nil {
+		return nil, xerr.WithStack(err)
+	}
+
+	prescriptionIds := make([]int64, 0)
+	for _, prescription := range prescriptionList {
+		prescriptionIds = append(prescriptionIds, prescription.Id)
+	}
+
+	prescriptionDrugs := make([]*model.PrescriptionDrugs, 0)
+	if len(prescriptionIds) > 0 {
+		if err := s.DB.Model(new(model.PrescriptionDrugs)).Where("prescription_id in (?)", prescriptionIds).
+			Where("is_show = ? ", pasturePb.IsShow_Ok).
+			Find(&prescriptionDrugs).Error; err != nil {
+			return nil, xerr.WithStack(err)
+		}
+	}
+
+	systemUserList, _ := s.SystemUserList(ctx)
+	return &pasturePb.SearchPrescriptionResponse{
+		Code:    http.StatusOK,
+		Message: "ok",
+		Data: &pasturePb.SearchPrescriptionData{
+			List:     model.PrescriptionSlice(prescriptionList).ToPB(systemUserList, prescriptionDrugs),
+			Total:    int32(count),
+			PageSize: pagination.PageSize,
+			Page:     pagination.Page,
+		},
+	}, nil
+}
+
+func (s *StoreEntry) CreateOrUpdatePrescription(ctx context.Context, req *pasturePb.PrescriptionRequest) error {
+	currUser, _ := s.GetCurrentSystemUser(ctx)
+	var maxUseDays, maxMeatExpiredDays, maxMilkExpiredDays int32 = 0, 0, 0
+	for _, v := range req.PrescriptionDrugsItem {
+		if v.DrugsId <= 0 {
+			return xerr.Customf("错误处方药品的数据")
+		}
+		if v.UseDays <= 0 {
+			return xerr.Customf("错误处方药品使用天数")
+		}
+		if v.UseDays > maxUseDays {
+			maxUseDays = v.UseDays
+		}
+
+		drugs, err := s.DrugsById(ctx, int64(v.DrugsId))
+		if err != nil {
+			return xerr.WithStack(err)
+		}
+
+		if drugs.MeatExpiredDays > maxMeatExpiredDays {
+			maxMeatExpiredDays = drugs.MeatExpiredDays
+		}
+
+		if drugs.MilkExpiredDays > maxMilkExpiredDays {
+			maxMilkExpiredDays = drugs.MilkExpiredDays
+		}
+	}
+	newPrescription := model.NewPrescription(req, maxUseDays, maxMeatExpiredDays, maxMilkExpiredDays, currUser.Id)
+
+	if req.Id > 0 {
+		prescription := &model.Prescription{Id: int64(req.Id)}
+		if err := s.DB.Model(&model.Prescription{}).First(prescription).Error; err != nil {
+			if !errors.Is(err, gorm.ErrRecordNotFound) {
+				return xerr.WithStack(err)
+			}
+		}
+		if err := s.DB.Transaction(func(tx *gorm.DB) error {
+			if err := tx.Model(&model.Prescription{}).Where(map[string]interface{}{
+				"id": req.Id,
+			}).Updates(map[string]interface{}{
+				"name":               newPrescription.Name,
+				"applicable_disease": newPrescription.ApplicableDisease,
+				"use_days":           newPrescription.UseDays,
+				"meat_expired_days":  newPrescription.MeatExpiredDays,
+				"milk_expired_days":  newPrescription.MilkExpiredDays,
+				"remarks":            newPrescription.Remarks,
+			}).Error; err != nil {
+				return xerr.WithStack(err)
+			}
+
+			if err := tx.Model(&model.PrescriptionDrugs{}).Where("prescription_id", req.Id).Delete(&model.PrescriptionDrugs{}).Error; err != nil {
+				return xerr.WithStack(err)
+			}
+			// 创建处方药品
+			newPrescriptionDrugs := model.NewPrescriptionDrugs(int64(req.Id), req)
+			if err := tx.Create(&newPrescriptionDrugs).Error; err != nil {
+				return xerr.WithStack(err)
+			}
+
+			return nil
+		}); err != nil {
+			return xerr.WithStack(err)
+		}
+		return nil
+	}
+
+	// 创建处方
+	if err := s.DB.Transaction(func(tx *gorm.DB) error {
+		// 创建处方
+		if err := tx.Create(&newPrescription).Error; err != nil {
+			return xerr.WithStack(err)
+		}
+		// 创建处方药品
+		newPrescriptionDrugs := model.NewPrescriptionDrugs(newPrescription.Id, req)
+		if err := tx.Create(&newPrescriptionDrugs).Error; err != nil {
+			return xerr.WithStack(err)
+		}
+		return nil
+	}); err != nil {
+		return xerr.WithStack(err)
+	}
+	return nil
+}

+ 11 - 0
module/backend/sql.go

@@ -119,3 +119,14 @@ func (s *StoreEntry) DiseaseTypeList(ctx context.Context) ([]*model.ConfigDiseas
 	}
 	return diseaseTypeList, nil
 }
+
+func (s *StoreEntry) DrugsById(ctx context.Context, id int64) (*model.Drugs, error) {
+	drugs := &model.Drugs{Id: id}
+	if err := s.DB.First(drugs).Error; err != nil {
+		if errors.Is(err, gorm.ErrRecordNotFound) {
+			return nil, xerr.Customf("该药品数据不存在: %d", id)
+		}
+		return nil, xerr.WithStack(err)
+	}
+	return drugs, nil
+}