From b38c3f17cd23a8c29c7aceb3fda6307e9f0c4609 Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Thu, 21 Dec 2023 15:16:20 +0800 Subject: [PATCH 1/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E5=95=86=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/base.go | 6 ++ api/controller/product.go | 131 +++++++++++++++++++++++++++++ api/dao/productPlatform.go | 116 +++++++++++++++++++++++++ api/dto/PlatformProduct.go | 78 +++++++++++++++++ api/model/productPlatform.go | 43 ++++++++++ api/model/productPlatformAmount.go | 34 ++++++++ api/requests/product.go | 17 ++++ api/router/router.go | 33 ++++++++ api/service/product.go | 25 ++++++ 9 files changed, 483 insertions(+) create mode 100644 api/controller/product.go create mode 100644 api/dao/productPlatform.go create mode 100644 api/dto/PlatformProduct.go create mode 100644 api/model/productPlatform.go create mode 100644 api/model/productPlatformAmount.go create mode 100644 api/requests/product.go create mode 100644 api/service/product.go diff --git a/api/controller/base.go b/api/controller/base.go index 87588bb..43c0228 100644 --- a/api/controller/base.go +++ b/api/controller/base.go @@ -15,6 +15,7 @@ type Api struct { caManage // ca管理 financeManage // 财务管理 exportManage // 导出管理 + productManage // 商品管理 } // SysSetting 系统设置 @@ -84,3 +85,8 @@ type financeManage struct { type exportManage struct { Export } + +// 商品管理 +type productManage struct { + Product +} diff --git a/api/controller/product.go b/api/controller/product.go new file mode 100644 index 0000000..5713c4f --- /dev/null +++ b/api/controller/product.go @@ -0,0 +1,131 @@ +package controller + +import ( + "github.com/gin-gonic/gin" + "hospital-admin-api/api/dao" + "hospital-admin-api/api/dto" + "hospital-admin-api/api/requests" + "hospital-admin-api/api/responses" + "hospital-admin-api/api/service" + "hospital-admin-api/global" + "hospital-admin-api/utils" + "strconv" +) + +type Product struct{} + +// GetPlatformProductPage 获取平台商品列表-分页 +func (r *Product) GetPlatformProductPage(c *gin.Context) { + productRequest := requests.ProductRequest{} + req := productRequest.GetPlatformProductPage + if err := c.ShouldBind(&req); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + if req.Page == 0 { + req.Page = 1 + } + + if req.PageSize == 0 { + req.PageSize = 20 + } + + productPlatformDao := dao.ProductPlatformDao{} + productPlatform, total, err := productPlatformDao.GetPlatformProductPageSearch(req, req.Page, req.PageSize) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + GetProductPlatformPageResponses := dto.GetProductPlatformListDto(productPlatform) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + result := make(map[string]interface{}) + result["page"] = req.Page + result["page_size"] = req.PageSize + result["total"] = total + result["data"] = GetProductPlatformPageResponses + responses.OkWithData(result, c) +} + +// GetPlatformProduct 平台商品详情 +func (r *Product) GetPlatformProduct(c *gin.Context) { + id := c.Param("product_platform_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + productPlatformId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + productService := service.ProductService{} + getPlatformProductResponses, err := productService.GetPlatformProduct(productPlatformId) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(getPlatformProductResponses, c) +} + +// GetSystemProductPage 获取系统商品列表-分页 +func (r *Product) GetSystemProductPage(c *gin.Context) { + productRequest := requests.ProductRequest{} + req := productRequest.GetPlatformProductPage + if err := c.ShouldBind(&req); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + if req.Page == 0 { + req.Page = 1 + } + + if req.PageSize == 0 { + req.PageSize = 20 + } + + productPlatformDao := dao.ProductPlatformDao{} + productPlatform, total, err := productPlatformDao.GetPlatformProductPageSearch(req, req.Page, req.PageSize) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + GetProductPlatformPageResponses := dto.GetProductPlatformListDto(productPlatform) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + result := make(map[string]interface{}) + result["page"] = req.Page + result["page_size"] = req.PageSize + result["total"] = total + result["data"] = GetProductPlatformPageResponses + responses.OkWithData(result, c) +} diff --git a/api/dao/productPlatform.go b/api/dao/productPlatform.go new file mode 100644 index 0000000..3d72640 --- /dev/null +++ b/api/dao/productPlatform.go @@ -0,0 +1,116 @@ +package dao + +import ( + "gorm.io/gorm" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" + "hospital-admin-api/global" +) + +type ProductPlatformDao struct { +} + +// GetProductPlatformById 获取平台商品数据-平台商品id +func (r *ProductPlatformDao) GetProductPlatformById(productPlatformId int64) (m *model.ProductPlatform, err error) { + err = global.Db.First(&m, productPlatformId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetProductPlatformList 获取平台商品列表 +func (r *ProductPlatformDao) GetProductPlatformList(maps interface{}) (m []*model.ProductPlatform, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteProductPlatform 删除平台商品 +func (r *ProductPlatformDao) DeleteProductPlatform(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.ProductPlatform{}).Error + if err != nil { + return err + } + return nil +} + +// EditProductPlatform 修改平台商品 +func (r *ProductPlatformDao) EditProductPlatform(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.ProductPlatform{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditProductPlatformByUserId 修改平台商品-平台商品id +func (r *ProductPlatformDao) EditProductPlatformByUserId(tx *gorm.DB, productPlatformId int64, data interface{}) error { + err := tx.Model(&model.ProductPlatform{}).Where("product_platform_id = ?", productPlatformId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// AddProductPlatform 新增平台商品 +func (r *ProductPlatformDao) AddProductPlatform(tx *gorm.DB, model *model.ProductPlatform) (*model.ProductPlatform, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} + +// GetPlatformProductPageSearch 获取平台商品列表-分页 +func (r *ProductPlatformDao) GetPlatformProductPageSearch(req requests.GetPlatformProductPage, page, pageSize int) (m []*model.ProductPlatform, total int64, err error) { + var totalRecords int64 + + // 构建查询条件 + query := global.Db.Model(&model.ProductPlatform{}) + + // 商品名称 + if req.ProductName != "" { + query = query.Where("product_name LIKE ?", "%"+req.ProductName+"%") + } + + // 药品类型 + if req.ProductType != nil { + query = query.Where("product_type = ?", req.ProductType) + } + + // 处方平台编码 + if req.ProductPlatformCode != "" { + query = query.Where("product_platform_code LIKE ?", "%"+req.ProductPlatformCode+"%") + } + + // 药店编码 + if req.ProductPharmacyCode != "" { + query = query.Where("product_pharmacy_code LIKE ?", "%"+req.ProductPharmacyCode+"%") + } + + // 批准文号 + if req.LicenseNumber != "" { + query = query.Where("license_number LIKE ?", "%"+req.LicenseNumber+"%") + } + + // 生产厂家 + if req.Manufacturer != "" { + query = query.Where("manufacturer LIKE ?", "%"+req.Manufacturer+"%") + } + + // 排序 + query = query.Order("created_at desc") + + // 查询总数量 + if err := query.Count(&totalRecords).Error; err != nil { + return nil, 0, err + } + + err = query.Scopes(model.Paginate(page, pageSize)).Find(&m).Error + if err != nil { + return nil, 0, err + } + return m, totalRecords, nil +} diff --git a/api/dto/PlatformProduct.go b/api/dto/PlatformProduct.go new file mode 100644 index 0000000..ffe34e5 --- /dev/null +++ b/api/dto/PlatformProduct.go @@ -0,0 +1,78 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +type ProductPlatformDto struct { + ProductPlatformId string `json:"product_platform_id"` // 主键id + ProductName string `json:"product_name"` // 商品名称 + ProductPrice float64 `json:"product_price"` // 商品价格 + ProductType int `json:"product_type"` // 药品类型(0:未知 1:中成药 2:西药) + ProductPlatformCode string `json:"product_platform_code"` // 处方平台商品编码 + ProductPharmacyCode string `json:"product_pharmacy_code"` // 第三方药店商品编码 + ProductSpec string `json:"product_spec"` // 商品规格 + LicenseNumber string `json:"license_number"` // 批准文号 + Manufacturer string `json:"manufacturer"` // 生产厂家 + SingleUnit string `json:"single_unit"` // 单次剂量单位 + PackagingUnit string `json:"packaging_unit"` // 基本包装单位 + PackagingCount string `json:"packaging_count"` // 基本包装数量 + RetailUnit string `json:"retail_unit"` // 零售单位 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 更新时间 +} + +// GetProductPlatformDto 平台商品详情 +func GetProductPlatformDto(m *model.ProductPlatform) *ProductPlatformDto { + return &ProductPlatformDto{ + ProductPlatformId: fmt.Sprintf("%d", m.ProductPlatformId), + ProductName: m.ProductName, + ProductPrice: m.ProductPrice, + ProductType: m.ProductType, + ProductPlatformCode: m.ProductPlatformCode, + ProductPharmacyCode: m.ProductPharmacyCode, + ProductSpec: m.ProductSpec, + LicenseNumber: m.LicenseNumber, + Manufacturer: m.Manufacturer, + SingleUnit: m.SingleUnit, + PackagingUnit: m.PackagingUnit, + PackagingCount: m.PackagingCount, + RetailUnit: m.RetailUnit, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +// GetProductPlatformListDto 平台商品列表 +func GetProductPlatformListDto(m []*model.ProductPlatform) []*ProductPlatformDto { + // 处理返回值 + responses := make([]*ProductPlatformDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &ProductPlatformDto{ + ProductPlatformId: fmt.Sprintf("%d", v.ProductPlatformId), + ProductName: v.ProductName, + ProductPrice: v.ProductPrice, + ProductType: v.ProductType, + ProductPlatformCode: v.ProductPlatformCode, + ProductPharmacyCode: v.ProductPharmacyCode, + ProductSpec: v.ProductSpec, + LicenseNumber: v.LicenseNumber, + Manufacturer: v.Manufacturer, + SingleUnit: v.SingleUnit, + PackagingUnit: v.PackagingUnit, + PackagingCount: v.PackagingCount, + RetailUnit: v.RetailUnit, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} diff --git a/api/model/productPlatform.go b/api/model/productPlatform.go new file mode 100644 index 0000000..acaa3c6 --- /dev/null +++ b/api/model/productPlatform.go @@ -0,0 +1,43 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// ProductPlatform 商品表-处方平台 +type ProductPlatform struct { + ProductPlatformId int64 `gorm:"column:product_platform_id;type:bigint(19);primary_key;comment:主键id" json:"product_platform_id"` + ProductName string `gorm:"column:product_name;type:varchar(255);comment:商品名称" json:"product_name"` + ProductPrice float64 `gorm:"column:product_price;type:decimal(10,2);comment:商品价格" json:"product_price"` + ProductType int `gorm:"column:product_type;type:tinyint(4);default:1;comment:药品类型(0:未知 1:中成药 2:西药)" json:"product_type"` + ProductPlatformCode string `gorm:"column:product_platform_code;type:varchar(100);comment:处方平台商品编码" json:"product_platform_code"` + ProductPharmacyCode string `gorm:"column:product_pharmacy_code;type:varchar(100);comment:第三方药店商品编码" json:"product_pharmacy_code"` + ProductSpec string `gorm:"column:product_spec;type:varchar(255);comment:商品规格" json:"product_spec"` + LicenseNumber string `gorm:"column:license_number;type:varchar(255);comment:批准文号" json:"license_number"` + Manufacturer string `gorm:"column:manufacturer;type:varchar(255);comment:生产厂家" json:"manufacturer"` + SingleUnit string `gorm:"column:single_unit;type:varchar(50);comment:单次剂量单位" json:"single_unit"` + PackagingUnit string `gorm:"column:packaging_unit;type:varchar(20);comment:基本包装单位" json:"packaging_unit"` + PackagingCount string `gorm:"column:packaging_count;type:varchar(20);comment:基本包装数量" json:"packaging_count"` + RetailUnit string `gorm:"column:retail_unit;type:varchar(20);comment:零售单位" json:"retail_unit"` + Model +} + +func (m *ProductPlatform) TableName() string { + return "gdxz_product_platform" +} + +func (m *ProductPlatform) BeforeCreate(tx *gorm.DB) error { + if m.ProductPlatformId == 0 { + m.ProductPlatformId = global.Snowflake.Generate().Int64() + } + + m.CreatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("CreatedAt", m.CreatedAt) + + m.UpdatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("UpdatedAt", m.UpdatedAt) + + return nil +} diff --git a/api/model/productPlatformAmount.go b/api/model/productPlatformAmount.go new file mode 100644 index 0000000..6e2ee78 --- /dev/null +++ b/api/model/productPlatformAmount.go @@ -0,0 +1,34 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// ProductPlatformAmount 商品-库存表-处方平台 +type ProductPlatformAmount struct { + AmountId int64 `gorm:"column:amount_id;type:bigint(19);primary_key;comment:主键id" json:"amount_id"` + ProductPlatformId int64 `gorm:"column:product_platform_id;type:bigint(19);comment:处方平台商品id" json:"product_platform_id"` + ProductPlatformCode string `gorm:"column:product_platform_code;type:varchar(100);comment:处方平台商品编码" json:"product_platform_code"` + Stock uint `gorm:"column:stock;type:int(11) unsigned;default:0;comment:现有库存" json:"stock"` + Model +} + +func (m *ProductPlatformAmount) TableName() string { + return "gdxz_product_platform_amount" +} + +func (m *ProductPlatformAmount) BeforeCreate(tx *gorm.DB) error { + if m.AmountId == 0 { + m.AmountId = global.Snowflake.Generate().Int64() + } + + m.CreatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("CreatedAt", m.CreatedAt) + + m.UpdatedAt = LocalTime(time.Now()) + tx.Statement.SetColumn("UpdatedAt", m.UpdatedAt) + + return nil +} diff --git a/api/requests/product.go b/api/requests/product.go new file mode 100644 index 0000000..f84287b --- /dev/null +++ b/api/requests/product.go @@ -0,0 +1,17 @@ +package requests + +type ProductRequest struct { + GetPlatformProductPage // 获取平台商品列表-分页 +} + +// GetPlatformProductPage 获取平台商品列表-分页 +type GetPlatformProductPage struct { + Page int `json:"page" form:"page" label:"页码"` + PageSize int `json:"page_size" form:"page_size" label:"每页个数"` + ProductName string `json:"product_name" form:"product_name" label:"商品名称"` // 商品名称 + ProductType *int `json:"product_type" form:"product_type" label:"药品类型"` // 药品类型(0:未知 1:中成药 2:西药) + ProductPlatformCode string `json:"product_platform_code" form:"product_platform_code" label:"处方平台编码"` // 处方平台商品编码 + ProductPharmacyCode string `json:"product_pharmacy_code" form:"product_pharmacy_code" label:"药店编码"` // 第三方药店商品编码 + LicenseNumber string `json:"license_number" form:"license_number" label:"批准文号"` // 批准文号 + Manufacturer string `json:"manufacturer" form:"manufacturer" label:"生产厂家"` // 生产厂家 +} diff --git a/api/router/router.go b/api/router/router.go index dcccc87..11ff77e 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -651,4 +651,37 @@ func privateRouter(r *gin.Engine, api controller.Api) { prescriptionGroup.POST("", api.Export.OrderPrescription) } } + + // 商品管理 + productGroup := adminGroup.Group("/product") + { + // 平台商品 + platformGroup := productGroup.Group("/platform") + { + // 获取平台商品列表-分页 + platformGroup.GET("", api.Product.GetPlatformProductPage) + + // 平台商品详情 + platformGroup.GET("/:product_platform_id", api.Product.GetPlatformProduct) + } + + // 系统商品 + systemGroup := productGroup.Group("/system") + { + // 获取系统商品列表-分页 + systemGroup.GET("", api.Product.GetSystemProductPage) + + // 系统商品详情 + systemGroup.GET("/:product_id", api.OrderProduct.GetOrderProduct) + + // 新增系统商品 + systemGroup.POST("", api.Dept.AddDept) + + // 删除系统商品 + systemGroup.DELETE("", api.Dept.DeleteDept) + + // 修改系统商品 + systemGroup.PUT("/:product_id", api.Dept.PutDept) + } + } } diff --git a/api/service/product.go b/api/service/product.go new file mode 100644 index 0000000..10775d8 --- /dev/null +++ b/api/service/product.go @@ -0,0 +1,25 @@ +package service + +import ( + "errors" + "hospital-admin-api/api/dao" + "hospital-admin-api/api/dto" +) + +type ProductService struct { +} + +// GetPlatformProduct 平台商品详情 +func (r *ProductService) GetPlatformProduct(productPlatformId int64) (g *dto.ProductPlatformDto, err error) { + // 获取平台商品数据 + productPlatformDao := dao.ProductPlatformDao{} + productPlatform, err := productPlatformDao.GetProductPlatformById(productPlatformId) + if err != nil || productPlatform == nil { + return nil, errors.New(err.Error()) + } + + // 处理返回值 + g = dto.GetProductPlatformDto(productPlatform) + + return g, nil +} From a988ba374345f0766809718ff38371b85f3e7d1c Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Thu, 21 Dec 2023 17:19:30 +0800 Subject: [PATCH 2/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=95=86=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/product.go | 46 ++++++-- api/dao/product.go | 78 ++++++++++++ api/dao/productPlatformAmount.go | 72 ++++++++++++ api/dto/Product.go | 111 ++++++++++++++++++ ...{PlatformProduct.go => ProductPlatform.go} | 0 api/model/product.go | 39 +++--- api/requests/product.go | 17 +++ api/router/router.go | 36 +++--- api/service/product.go | 28 ++++- 9 files changed, 376 insertions(+), 51 deletions(-) create mode 100644 api/dao/productPlatformAmount.go create mode 100644 api/dto/Product.go rename api/dto/{PlatformProduct.go => ProductPlatform.go} (100%) diff --git a/api/controller/product.go b/api/controller/product.go index 5713c4f..693f3ca 100644 --- a/api/controller/product.go +++ b/api/controller/product.go @@ -59,8 +59,8 @@ func (r *Product) GetPlatformProductPage(c *gin.Context) { responses.OkWithData(result, c) } -// GetPlatformProduct 平台商品详情 -func (r *Product) GetPlatformProduct(c *gin.Context) { +// GetProductPlatform 平台商品详情 +func (r *Product) GetProductPlatform(c *gin.Context) { id := c.Param("product_platform_id") if id == "" { responses.FailWithMessage("缺少参数", c) @@ -76,7 +76,7 @@ func (r *Product) GetPlatformProduct(c *gin.Context) { // 业务处理 productService := service.ProductService{} - getPlatformProductResponses, err := productService.GetPlatformProduct(productPlatformId) + getPlatformProductResponses, err := productService.GetProductPlatform(productPlatformId) if err != nil { responses.FailWithMessage(err.Error(), c) return @@ -85,10 +85,10 @@ func (r *Product) GetPlatformProduct(c *gin.Context) { responses.OkWithData(getPlatformProductResponses, c) } -// GetSystemProductPage 获取系统商品列表-分页 -func (r *Product) GetSystemProductPage(c *gin.Context) { +// GetProductPage 获取商品列表-分页 +func (r *Product) GetProductPage(c *gin.Context) { productRequest := requests.ProductRequest{} - req := productRequest.GetPlatformProductPage + req := productRequest.GetProductPage if err := c.ShouldBind(&req); err != nil { responses.FailWithMessage(err.Error(), c) return @@ -108,15 +108,15 @@ func (r *Product) GetSystemProductPage(c *gin.Context) { req.PageSize = 20 } - productPlatformDao := dao.ProductPlatformDao{} - productPlatform, total, err := productPlatformDao.GetPlatformProductPageSearch(req, req.Page, req.PageSize) + productDao := dao.ProductDao{} + product, total, err := productDao.GetProductPageSearch(req, req.Page, req.PageSize) if err != nil { responses.FailWithMessage(err.Error(), c) return } // 处理返回值 - GetProductPlatformPageResponses := dto.GetProductPlatformListDto(productPlatform) + GetProductPageResponses := dto.GetProductListDto(product) if err != nil { responses.FailWithMessage(err.Error(), c) return @@ -126,6 +126,32 @@ func (r *Product) GetSystemProductPage(c *gin.Context) { result["page"] = req.Page result["page_size"] = req.PageSize result["total"] = total - result["data"] = GetProductPlatformPageResponses + result["data"] = GetProductPageResponses responses.OkWithData(result, c) } + +// GetProduct 商品详情 +func (r *Product) GetProduct(c *gin.Context) { + id := c.Param("product_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + productId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + productService := service.ProductService{} + getPlatformProductResponses, err := productService.GetProduct(productId) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(getPlatformProductResponses, c) +} diff --git a/api/dao/product.go b/api/dao/product.go index bb089f4..205de1b 100644 --- a/api/dao/product.go +++ b/api/dao/product.go @@ -4,6 +4,7 @@ import ( "gorm.io/gorm" "gorm.io/gorm/clause" "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" "hospital-admin-api/global" ) @@ -71,3 +72,80 @@ func (r *ProductDao) AddProduct(tx *gorm.DB, model *model.Product) (*model.Produ } return model, nil } + +// GetProductPageSearch 获取商品列表-分页 +func (r *ProductDao) GetProductPageSearch(req requests.GetProductPage, page, pageSize int) (m []*model.Product, total int64, err error) { + var totalRecords int64 + + // 构建查询条件 + query := global.Db.Model(&model.Product{}) + + // 库存表 + query = query.Preload("ProductPlatformAmount", func(db *gorm.DB) *gorm.DB { + return db.Select("amount_id", "product_platform_id", "product_platform_code", "stock") + }) + + // 商品名称 + if req.ProductName != "" { + query = query.Where("product_name LIKE ?", "%"+req.ProductName+"%") + } + + // 商品通用名 + if req.CommonName != "" { + query = query.Where("common_name LIKE ?", "%"+req.CommonName+"%") + } + + // 商品助记码 + if req.MnemonicCode != "" { + query = query.Where("mnemonic_code LIKE ?", "%"+req.MnemonicCode+"%") + } + + // 药品类型 + if req.ProductType != nil { + query = query.Where("product_type = ?", req.ProductType) + } + + // 平台商品id + if req.ProductPlatformId != "" { + query = query.Where("product_platform_id = ?", req.ProductPlatformId) + } + + // 处方平台编码 + if req.ProductPlatformCode != "" { + query = query.Where("product_platform_code LIKE ?", "%"+req.ProductPlatformCode+"%") + } + + // 药店编码 + if req.ProductPharmacyCode != "" { + query = query.Where("product_pharmacy_code LIKE ?", "%"+req.ProductPharmacyCode+"%") + } + + // 批准文号 + if req.LicenseNumber != "" { + query = query.Where("license_number LIKE ?", "%"+req.LicenseNumber+"%") + } + + // 生产厂家 + if req.Manufacturer != "" { + query = query.Where("manufacturer LIKE ?", "%"+req.Manufacturer+"%") + } + + // 商品备注 + if req.ProductRemarks != "" { + query = query.Where("product_remarks LIKE ?", "%"+req.ProductRemarks+"%") + } + + // 排序 + query = query.Order("created_at desc") + + // 查询总数量 + if err := query.Count(&totalRecords).Error; err != nil { + return nil, 0, err + } + + err = query.Scopes(model.Paginate(page, pageSize)).Find(&m).Error + if err != nil { + return nil, 0, err + } + return m, totalRecords, nil +} diff --git a/api/dao/productPlatformAmount.go b/api/dao/productPlatformAmount.go new file mode 100644 index 0000000..0310aee --- /dev/null +++ b/api/dao/productPlatformAmount.go @@ -0,0 +1,72 @@ +package dao + +import ( + "gorm.io/gorm" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type ProductPlatformAmountDao struct { +} + +// GetProductPlatformAmountById 获取商品库存数据-商品库存id +func (r *ProductPlatformAmountDao) GetProductPlatformAmountById(amountId int64) (m *model.ProductPlatformAmount, err error) { + err = global.Db.First(&m, amountId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetProductPlatformAmountByProductPlatformId 获取商品库存数据-平台商品id +func (r *ProductPlatformAmountDao) GetProductPlatformAmountByProductPlatformId(productPlatformId int64) (m *model.ProductPlatformAmount, err error) { + err = global.Db.Where("product_platform_id = ?", productPlatformId).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteProductPlatformAmount 删除商品库存 +func (r *ProductPlatformAmountDao) DeleteProductPlatformAmount(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.ProductPlatformAmount{}).Error + if err != nil { + return err + } + return nil +} + +// EditProductPlatformAmount 修改商品库存 +func (r *ProductPlatformAmountDao) EditProductPlatformAmount(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.ProductPlatformAmount{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditProductPlatformAmountByUserId 修改商品库存-商品库存id +func (r *ProductPlatformAmountDao) EditProductPlatformAmountByUserId(tx *gorm.DB, amountId int64, data interface{}) error { + err := tx.Model(&model.ProductPlatformAmount{}).Where("amount_id = ?", amountId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetProductPlatformAmountList 获取商品库存列表 +func (r *ProductPlatformAmountDao) GetProductPlatformAmountList(maps interface{}) (m []*model.ProductPlatformAmount, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddProductPlatformAmount 新增商品K库存 +func (r *ProductPlatformAmountDao) AddProductPlatformAmount(tx *gorm.DB, model *model.ProductPlatformAmount) (*model.ProductPlatformAmount, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} diff --git a/api/dto/Product.go b/api/dto/Product.go new file mode 100644 index 0000000..014be80 --- /dev/null +++ b/api/dto/Product.go @@ -0,0 +1,111 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" + "hospital-admin-api/utils" +) + +type ProductDto struct { + ProductId string `json:"product_id"` // 主键id + ProductPlatformId string `json:"product_platform_id"` // 处方平台商品id + ProductName string `json:"product_name"` // 商品名称 + CommonName string `json:"common_name"` // 商品通用名 + ProductPrice float64 `json:"product_price"` // 商品价格 + MnemonicCode string `json:"mnemonic_code"` // 商品助记码(首字母简拼) + ProductType int `json:"product_type"` // 药品类型(0:未知 1:中成药 2:西药) + ProductPlatformCode string `json:"product_platform_code"` // 处方平台商品编码 + ProductPharmacyCode string `json:"product_pharmacy_code"` // 第三方药店商品编码 + ProductCoverImg string `json:"product_cover_img"` // 商品封面图 + ProductSpec string `json:"product_spec"` // 商品规格 + LicenseNumber string `json:"license_number"` // 批准文号 + Manufacturer string `json:"manufacturer"` // 生产厂家 + SingleUnit string `json:"single_unit"` // 单次剂量(例:1次1包) + SingleUse string `json:"single_use"` // 单次用法(例:口服) + PackagingUnit string `json:"packaging_unit"` // 基本包装单位(例:盒/瓶) + FrequencyUse string `json:"frequency_use"` // 使用频率(例:1天3次) + AvailableDays float64 `json:"available_days"` // 可用天数(3) + ProductRemarks string `json:"product_remarks"` // 商品备注 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 更新时间 + Stock uint `json:"stock"` // 现有库存 +} + +// GetProductDto 商品详情 +func GetProductDto(m *model.Product) *ProductDto { + return &ProductDto{ + ProductId: fmt.Sprintf("%d", m.ProductId), + ProductPlatformId: fmt.Sprintf("%d", m.ProductPlatformId), + ProductName: m.ProductName, + CommonName: m.ProductName, + ProductPrice: m.ProductPrice, + MnemonicCode: m.MnemonicCode, + ProductType: m.ProductType, + ProductPlatformCode: m.ProductPlatformCode, + ProductPharmacyCode: m.ProductPharmacyCode, + ProductCoverImg: utils.AddOssDomain(m.ProductCoverImg), + ProductSpec: m.ProductSpec, + LicenseNumber: m.LicenseNumber, + Manufacturer: m.Manufacturer, + SingleUnit: m.SingleUnit, + SingleUse: m.SingleUse, + PackagingUnit: m.PackagingUnit, + FrequencyUse: m.FrequencyUse, + AvailableDays: m.AvailableDays, + ProductRemarks: m.ProductRemarks, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +// GetProductListDto 商品列表 +func GetProductListDto(m []*model.Product) []*ProductDto { + // 处理返回值 + responses := make([]*ProductDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &ProductDto{ + ProductId: fmt.Sprintf("%d", v.ProductId), + ProductPlatformId: fmt.Sprintf("%d", v.ProductPlatformId), + ProductName: v.ProductName, + CommonName: v.ProductName, + ProductPrice: v.ProductPrice, + MnemonicCode: v.MnemonicCode, + ProductType: v.ProductType, + ProductPlatformCode: v.ProductPlatformCode, + ProductPharmacyCode: v.ProductPharmacyCode, + ProductCoverImg: utils.AddOssDomain(v.ProductCoverImg), + ProductSpec: v.ProductSpec, + LicenseNumber: v.LicenseNumber, + Manufacturer: v.Manufacturer, + SingleUnit: v.SingleUnit, + SingleUse: v.SingleUse, + PackagingUnit: v.PackagingUnit, + FrequencyUse: v.FrequencyUse, + AvailableDays: v.AvailableDays, + ProductRemarks: v.ProductRemarks, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 加载商品库存 + if v.ProductPlatformAmount != nil { + response = response.LoadProductAmount(v.ProductPlatformAmount) + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} + +// LoadProductAmount 加载商品库存 +func (r *ProductDto) LoadProductAmount(m *model.ProductPlatformAmount) *ProductDto { + if m != nil { + r.Stock = m.Stock + } + return r +} diff --git a/api/dto/PlatformProduct.go b/api/dto/ProductPlatform.go similarity index 100% rename from api/dto/PlatformProduct.go rename to api/dto/ProductPlatform.go diff --git a/api/model/product.go b/api/model/product.go index 05e681e..6c2a96a 100644 --- a/api/model/product.go +++ b/api/model/product.go @@ -8,25 +8,26 @@ import ( // Product 商品表 type Product struct { - ProductId int64 `gorm:"column:product_id;type:bigint(19);primary_key;comment:主键id" json:"product_id"` - ProductPlatformId int64 `gorm:"column:product_platform_id;type:bigint(19);comment:处方平台商品id" json:"product_platform_id"` - ProductName string `gorm:"column:product_name;type:varchar(255);comment:商品名称" json:"product_name"` - CommonName string `gorm:"column:common_name;type:varchar(100);comment:商品通用名" json:"common_name"` - ProductPrice float64 `gorm:"column:product_price;type:decimal(10,2);comment:商品价格" json:"product_price"` - MnemonicCode string `gorm:"column:mnemonic_code;type:varchar(50);comment:商品助记码(首字母简拼)" json:"mnemonic_code"` - ProductType int `gorm:"column:product_type;type:tinyint(4);default:1;comment:药品类型(0:未知 1:中成药 2:西药)" json:"product_type"` - ProductPlatformCode string `gorm:"column:product_platform_code;type:varchar(100);comment:处方平台商品编码" json:"product_platform_code"` - ProductPharmacyCode string `gorm:"column:product_pharmacy_code;type:varchar(100);comment:第三方药店商品编码" json:"product_pharmacy_code"` - ProductCoverImg string `gorm:"column:product_cover_img;type:varchar(255);comment:商品封面图" json:"product_cover_img"` - ProductSpec string `gorm:"column:product_spec;type:varchar(255);comment:商品规格" json:"product_spec"` - LicenseNumber string `gorm:"column:license_number;type:varchar(30);comment:批准文号" json:"license_number"` - Manufacturer string `gorm:"column:manufacturer;type:varchar(255);comment:生产厂家" json:"manufacturer"` - SingleUnit string `gorm:"column:single_unit;type:varchar(50);comment:单次剂量(例:1次1包)" json:"single_unit"` - SingleUse string `gorm:"column:single_use;type:varchar(50);comment:单次用法(例:口服)" json:"single_use"` - PackagingUnit string `gorm:"column:packaging_unit;type:varchar(20);comment:基本包装单位(例:盒/瓶)" json:"packaging_unit"` - FrequencyUse string `gorm:"column:frequency_use;type:varchar(50);comment:使用频率(例:1天3次)" json:"frequency_use"` - AvailableDays float64 `gorm:"column:available_days;type:float(10,2);comment:可用天数(3)" json:"available_days"` - ProductRemarks string `gorm:"column:product_remarks;type:varchar(255);comment:商品备注" json:"product_remarks"` + ProductId int64 `gorm:"column:product_id;type:bigint(19);primary_key;comment:主键id" json:"product_id"` + ProductPlatformId int64 `gorm:"column:product_platform_id;type:bigint(19);comment:处方平台商品id" json:"product_platform_id"` + ProductName string `gorm:"column:product_name;type:varchar(255);comment:商品名称" json:"product_name"` + CommonName string `gorm:"column:common_name;type:varchar(100);comment:商品通用名" json:"common_name"` + ProductPrice float64 `gorm:"column:product_price;type:decimal(10,2);comment:商品价格" json:"product_price"` + MnemonicCode string `gorm:"column:mnemonic_code;type:varchar(50);comment:商品助记码(首字母简拼)" json:"mnemonic_code"` + ProductType int `gorm:"column:product_type;type:tinyint(4);default:1;comment:药品类型(0:未知 1:中成药 2:西药)" json:"product_type"` + ProductPlatformCode string `gorm:"column:product_platform_code;type:varchar(100);comment:处方平台商品编码" json:"product_platform_code"` + ProductPharmacyCode string `gorm:"column:product_pharmacy_code;type:varchar(100);comment:第三方药店商品编码" json:"product_pharmacy_code"` + ProductCoverImg string `gorm:"column:product_cover_img;type:varchar(255);comment:商品封面图" json:"product_cover_img"` + ProductSpec string `gorm:"column:product_spec;type:varchar(255);comment:商品规格" json:"product_spec"` + LicenseNumber string `gorm:"column:license_number;type:varchar(30);comment:批准文号" json:"license_number"` + Manufacturer string `gorm:"column:manufacturer;type:varchar(255);comment:生产厂家" json:"manufacturer"` + SingleUnit string `gorm:"column:single_unit;type:varchar(50);comment:单次剂量(例:1次1包)" json:"single_unit"` + SingleUse string `gorm:"column:single_use;type:varchar(50);comment:单次用法(例:口服)" json:"single_use"` + PackagingUnit string `gorm:"column:packaging_unit;type:varchar(20);comment:基本包装单位(例:盒/瓶)" json:"packaging_unit"` + FrequencyUse string `gorm:"column:frequency_use;type:varchar(50);comment:使用频率(例:1天3次)" json:"frequency_use"` + AvailableDays float64 `gorm:"column:available_days;type:float(10,2);comment:可用天数(3)" json:"available_days"` + ProductRemarks string `gorm:"column:product_remarks;type:varchar(255);comment:商品备注" json:"product_remarks"` + ProductPlatformAmount *ProductPlatformAmount `gorm:"foreignKey:ProductPlatformId;references:product_platform_id" json:"product_platform_amount"` // 库存 Model } diff --git a/api/requests/product.go b/api/requests/product.go index f84287b..bb28705 100644 --- a/api/requests/product.go +++ b/api/requests/product.go @@ -2,6 +2,7 @@ package requests type ProductRequest struct { GetPlatformProductPage // 获取平台商品列表-分页 + GetProductPage // 获取系统商品列表-分页 } // GetPlatformProductPage 获取平台商品列表-分页 @@ -15,3 +16,19 @@ type GetPlatformProductPage struct { LicenseNumber string `json:"license_number" form:"license_number" label:"批准文号"` // 批准文号 Manufacturer string `json:"manufacturer" form:"manufacturer" label:"生产厂家"` // 生产厂家 } + +// GetProductPage 获取系统商品列表-分页 +type GetProductPage struct { + Page int `json:"page" form:"page" label:"页码"` + PageSize int `json:"page_size" form:"page_size" label:"每页个数"` + ProductName string `json:"product_name" form:"product_name" label:"商品名称"` // 商品名称 + CommonName string `json:"common_name" form:"common_name" label:"商品通用名"` // 商品通用名 + MnemonicCode string `json:"mnemonic_code" form:"mnemonic_code" label:"商品助记码"` // 商品助记码(首字母简拼) + ProductType *int `json:"product_type" form:"product_type" label:"药品类型"` // 药品类型(0:未知 1:中成药 2:西药) + ProductPlatformId string `json:"product_platform_id" form:"product_platform_id" label:"平台商品id"` // 处方平台商品id + ProductPlatformCode string `json:"product_platform_code" form:"product_platform_code" label:"处方平台编码"` // 处方平台商品编码 + ProductPharmacyCode string `json:"product_pharmacy_code" form:"product_pharmacy_code" label:"药店编码"` // 第三方药店商品编码 + LicenseNumber string `json:"license_number" form:"license_number" label:"批准文号"` // 批准文号 + Manufacturer string `json:"manufacturer" form:"manufacturer" label:"生产厂家"` // 生产厂家 + ProductRemarks string `json:"product_remarks" form:"product_remarks" label:"商品备注"` // 商品备注 +} diff --git a/api/router/router.go b/api/router/router.go index 11ff77e..4e7ff79 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -655,6 +655,21 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 商品管理 productGroup := adminGroup.Group("/product") { + // 获取系统商品列表-分页 + productGroup.GET("", api.Product.GetProductPage) + + // 系统商品详情 + productGroup.GET("/:product_id", api.Product.GetProduct) + + // 新增系统商品 + productGroup.POST("", api.Dept.AddDept) + + // 删除系统商品 + productGroup.DELETE("", api.Dept.DeleteDept) + + // 修改系统商品 + productGroup.PUT("/:product_id", api.Dept.PutDept) + // 平台商品 platformGroup := productGroup.Group("/platform") { @@ -662,26 +677,7 @@ func privateRouter(r *gin.Engine, api controller.Api) { platformGroup.GET("", api.Product.GetPlatformProductPage) // 平台商品详情 - platformGroup.GET("/:product_platform_id", api.Product.GetPlatformProduct) - } - - // 系统商品 - systemGroup := productGroup.Group("/system") - { - // 获取系统商品列表-分页 - systemGroup.GET("", api.Product.GetSystemProductPage) - - // 系统商品详情 - systemGroup.GET("/:product_id", api.OrderProduct.GetOrderProduct) - - // 新增系统商品 - systemGroup.POST("", api.Dept.AddDept) - - // 删除系统商品 - systemGroup.DELETE("", api.Dept.DeleteDept) - - // 修改系统商品 - systemGroup.PUT("/:product_id", api.Dept.PutDept) + platformGroup.GET("/:product_platform_id", api.Product.GetProductPlatform) } } } diff --git a/api/service/product.go b/api/service/product.go index 10775d8..e3200eb 100644 --- a/api/service/product.go +++ b/api/service/product.go @@ -9,8 +9,8 @@ import ( type ProductService struct { } -// GetPlatformProduct 平台商品详情 -func (r *ProductService) GetPlatformProduct(productPlatformId int64) (g *dto.ProductPlatformDto, err error) { +// GetProductPlatform 平台商品详情 +func (r *ProductService) GetProductPlatform(productPlatformId int64) (g *dto.ProductPlatformDto, err error) { // 获取平台商品数据 productPlatformDao := dao.ProductPlatformDao{} productPlatform, err := productPlatformDao.GetProductPlatformById(productPlatformId) @@ -23,3 +23,27 @@ func (r *ProductService) GetPlatformProduct(productPlatformId int64) (g *dto.Pro return g, nil } + +// GetProduct 商品详情 +func (r *ProductService) GetProduct(productId int64) (g *dto.ProductDto, err error) { + // 获取商品数据 + productDao := dao.ProductDao{} + product, err := productDao.GetProductById(productId) + if err != nil || product == nil { + return nil, errors.New(err.Error()) + } + + // 获取商品库存数据 + productPlatformAmountDao := dao.ProductPlatformAmountDao{} + productPlatformAmount, err := productPlatformAmountDao.GetProductPlatformAmountByProductPlatformId(product.ProductPlatformId) + + // 处理返回值 + g = dto.GetProductDto(product) + + if productPlatformAmount != nil { + // 加载库存 + g.LoadProductAmount(productPlatformAmount) + } + + return g, nil +} From f7387bfd4d0070294ca41befb5db857e8bb11041 Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Fri, 22 Dec 2023 15:42:07 +0800 Subject: [PATCH 3/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=95=86=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/product.go | 35 +++++++ api/dto/Product.go | 9 ++ api/model/product.go | 3 + api/requests/product.go | 23 +++++ api/router/router.go | 11 ++- api/service/order.go | 16 +-- api/service/product.go | 111 +++++++++++++++++++++ config.yaml | 2 +- extend/prescription/prescription.go | 145 ++++++++++++++++++++++------ utils/replace.go | 5 +- 10 files changed, 315 insertions(+), 45 deletions(-) diff --git a/api/controller/product.go b/api/controller/product.go index 693f3ca..c9b2190 100644 --- a/api/controller/product.go +++ b/api/controller/product.go @@ -155,3 +155,38 @@ func (r *Product) GetProduct(c *gin.Context) { responses.OkWithData(getPlatformProductResponses, c) } + +// AddProduct 新增商品 +func (r *Product) AddProduct(c *gin.Context) { + productRequest := requests.ProductRequest{} + req := productRequest.AddProduct + if err := c.ShouldBindJSON(&req); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + // 获取当前登陆用户id + userId := c.GetInt64("UserId") + if userId == 0 { + responses.FailWithMessage("角色错误", c) + return + } + + userIdStr := strconv.FormatInt(userId, 10) + + // 业务处理 + productService := service.ProductService{} + _, err := productService.AddProduct(userIdStr, req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} diff --git a/api/dto/Product.go b/api/dto/Product.go index 014be80..229f896 100644 --- a/api/dto/Product.go +++ b/api/dto/Product.go @@ -9,6 +9,9 @@ import ( type ProductDto struct { ProductId string `json:"product_id"` // 主键id ProductPlatformId string `json:"product_platform_id"` // 处方平台商品id + ProductStatus int `json:"product_status"` // 商品状态(1:正常 2:下架) + IsDelete int `json:"is_delete"` // 是否删除(0:否 1:是) + PrescriptionNum int `json:"prescription_num"` // 处方可开具的数量 ProductName string `json:"product_name"` // 商品名称 CommonName string `json:"common_name"` // 商品通用名 ProductPrice float64 `json:"product_price"` // 商品价格 @@ -36,6 +39,9 @@ func GetProductDto(m *model.Product) *ProductDto { return &ProductDto{ ProductId: fmt.Sprintf("%d", m.ProductId), ProductPlatformId: fmt.Sprintf("%d", m.ProductPlatformId), + ProductStatus: m.ProductStatus, + IsDelete: m.IsDelete, + PrescriptionNum: m.PrescriptionNum, ProductName: m.ProductName, CommonName: m.ProductName, ProductPrice: m.ProductPrice, @@ -68,6 +74,9 @@ func GetProductListDto(m []*model.Product) []*ProductDto { response := &ProductDto{ ProductId: fmt.Sprintf("%d", v.ProductId), ProductPlatformId: fmt.Sprintf("%d", v.ProductPlatformId), + ProductStatus: v.ProductStatus, + IsDelete: v.IsDelete, + PrescriptionNum: v.PrescriptionNum, ProductName: v.ProductName, CommonName: v.ProductName, ProductPrice: v.ProductPrice, diff --git a/api/model/product.go b/api/model/product.go index 6c2a96a..649c6e6 100644 --- a/api/model/product.go +++ b/api/model/product.go @@ -10,6 +10,9 @@ import ( type Product struct { ProductId int64 `gorm:"column:product_id;type:bigint(19);primary_key;comment:主键id" json:"product_id"` ProductPlatformId int64 `gorm:"column:product_platform_id;type:bigint(19);comment:处方平台商品id" json:"product_platform_id"` + ProductStatus int `gorm:"column:product_status;type:tinyint(1);default:1;comment:商品状态(1:正常 2:下架)" json:"product_status"` + IsDelete int `gorm:"column:is_delete;type:tinyint(1);default:0;comment:是否删除(0:否 1:是)" json:"is_delete"` + PrescriptionNum int `gorm:"column:prescription_num;type:int(11);default:5;comment:处方可开具的数量" json:"prescription_num"` ProductName string `gorm:"column:product_name;type:varchar(255);comment:商品名称" json:"product_name"` CommonName string `gorm:"column:common_name;type:varchar(100);comment:商品通用名" json:"common_name"` ProductPrice float64 `gorm:"column:product_price;type:decimal(10,2);comment:商品价格" json:"product_price"` diff --git a/api/requests/product.go b/api/requests/product.go index bb28705..9780bce 100644 --- a/api/requests/product.go +++ b/api/requests/product.go @@ -3,6 +3,7 @@ package requests type ProductRequest struct { GetPlatformProductPage // 获取平台商品列表-分页 GetProductPage // 获取系统商品列表-分页 + AddProduct // 新增商品 } // GetPlatformProductPage 获取平台商品列表-分页 @@ -32,3 +33,25 @@ type GetProductPage struct { Manufacturer string `json:"manufacturer" form:"manufacturer" label:"生产厂家"` // 生产厂家 ProductRemarks string `json:"product_remarks" form:"product_remarks" label:"商品备注"` // 商品备注 } + +// AddProduct 新增商品 +type AddProduct struct { + ProductPlatformId string `json:"product_platform_id" form:"product_platform_id" label:"平台商品id" validate:"required"` // 处方平台商品id + ProductName string `json:"product_name" form:"product_name" label:"商品名称" validate:"required"` // 商品名称 + CommonName string `json:"common_name" form:"common_name" label:"商品通用名" validate:"required"` // 商品通用名 + ProductPrice float64 `json:"product_price" form:"product_price" label:"商品价格" validate:"required"` // 商品价格 + MnemonicCode string `json:"mnemonic_code" form:"mnemonic_code" label:"商品助记码"` // 商品助记码(首字母简拼) + ProductType *int `json:"product_type" form:"product_type" label:"药品类型" validate:"oneof=0 1 2"` // 药品类型(0:未知 1:中成药 2:西药) + ProductPlatformCode string `json:"product_platform_code" form:"product_platform_code" label:"处方平台商品编码" validate:"required"` // 处方平台商品编码 + ProductPharmacyCode string `json:"product_pharmacy_code" form:"product_pharmacy_code" label:"第三方药店商品编码" validate:"required"` // 第三方药店商品编码 + ProductCoverImg string `json:"product_cover_img" form:"product_cover_img" label:"商品封面图"` // 商品封面图 + ProductSpec string `json:"product_spec" form:"product_spec" label:"商品规格" validate:"required"` // 商品规格 + LicenseNumber string `json:"license_number" form:"license_number" label:"批准文号" validate:"required"` // 批准文号 + Manufacturer string `json:"manufacturer" form:"manufacturer" label:"生产厂家" validate:"required"` // 生产厂家 + SingleUnit string `json:"single_unit" form:"single_unit" label:"单次剂量" validate:"required"` // 单次剂量(例:1次1包) + SingleUse string `json:"single_use" form:"single_use" label:"单次用法" validate:"required"` // 单次用法(例:口服) + PackagingUnit string `json:"packaging_unit" form:"packaging_unit" label:"基本包装单位" validate:"required"` // 基本包装单位(例:盒/瓶) + FrequencyUse string `json:"frequency_use" form:"frequency_use" label:"使用频率" validate:"required"` // 使用频率(例:1天3次) + AvailableDays float64 `json:"available_days" form:"available_days" label:"可用天数" validate:"required"` // 可用天数(3) + ProductRemarks string `json:"product_remarks" form:"product_remarks" label:"商品备注" validate:"required"` // 商品备注 +} diff --git a/api/router/router.go b/api/router/router.go index 4e7ff79..9e62e39 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -661,13 +661,13 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 系统商品详情 productGroup.GET("/:product_id", api.Product.GetProduct) - // 新增系统商品 - productGroup.POST("", api.Dept.AddDept) + // 新增商品 + productGroup.POST("", api.Product.AddProduct) - // 删除系统商品 + // 删除商品 productGroup.DELETE("", api.Dept.DeleteDept) - // 修改系统商品 + // 修改商品 productGroup.PUT("/:product_id", api.Dept.PutDept) // 平台商品 @@ -678,6 +678,9 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 平台商品详情 platformGroup.GET("/:product_platform_id", api.Product.GetProductPlatform) + + // 获取平台商品列表 + platformGroup.GET("/list", api.UserDoctor.GetUserDoctorList) } } } diff --git a/api/service/order.go b/api/service/order.go index 4ae6fe7..358be81 100644 --- a/api/service/order.go +++ b/api/service/order.go @@ -163,8 +163,8 @@ func (r *OrderService) ReportPreProduct(orderProductId, adminUserId int64) (bool icdNameStr := strings.Join(icdNameSlice, ";") // 处理上传数据-药品数据 - drugRequests := make([]prescription.DrugRequest, len(orderProductItems)) - orderDrugRequests := make([]prescription.OrderDrugRequest, len(orderProductItems)) + drugListRequests := make([]prescription.DrugListRequest, len(orderProductItems)) + orderDrugListRequests := make([]prescription.OrderDrugListRequest, len(orderProductItems)) for i, o := range orderProductItems { // 获取商品数据 productDao := dao.ProductDao{} @@ -179,7 +179,7 @@ func (r *OrderService) ReportPreProduct(orderProductId, adminUserId int64) (bool } // 药品数据1 - drugRequest := prescription.DrugRequest{ + drugRequest := prescription.DrugListRequest{ DrugCode: product.ProductPlatformCode, // 药品编码 ApprovalNumber: product.LicenseNumber, // 批准文号 DrugName: product.ProductName, // 药品名称 @@ -194,10 +194,10 @@ func (r *OrderService) ReportPreProduct(orderProductId, adminUserId int64) (bool FrequencyName: product.FrequencyUse, // 频次名称 UseDays: useDays, // 使用天数 } - drugRequests[i] = drugRequest + drugListRequests[i] = drugRequest // 药品数据2 - orderDrugRequest := prescription.OrderDrugRequest{ + orderDrugRequest := prescription.OrderDrugListRequest{ DrugCode: product.ProductPlatformCode, // 药品编码 ApprovalNumber: product.LicenseNumber, // 批准文号 DrugName: product.ProductName, // 药品名称 @@ -206,7 +206,7 @@ func (r *OrderService) ReportPreProduct(orderProductId, adminUserId int64) (bool DrugCount: o.Amount, // 药品数量 PackingUnit: product.PackagingUnit, // 药品单位 } - orderDrugRequests[i] = orderDrugRequest + orderDrugListRequests[i] = orderDrugRequest } // 处理上传数据-处方数据 @@ -237,8 +237,8 @@ func (r *OrderService) ReportPreProduct(orderProductId, adminUserId int64) (bool PhysicalExamination: "无", SupplementaryExamination: "无", AllergicHistory: orderInquiryCase.AllergyHistory, - DrugList: drugRequests, - OrderDrugList: orderDrugRequests, + DrugList: drugListRequests, + OrderDrugList: orderDrugListRequests, } presRequests[0] = presRequest diff --git a/api/service/product.go b/api/service/product.go index e3200eb..42e60e9 100644 --- a/api/service/product.go +++ b/api/service/product.go @@ -4,6 +4,12 @@ import ( "errors" "hospital-admin-api/api/dao" "hospital-admin-api/api/dto" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" + "hospital-admin-api/extend/prescription" + "hospital-admin-api/global" + "hospital-admin-api/utils" + "strconv" ) type ProductService struct { @@ -47,3 +53,108 @@ func (r *ProductService) GetProduct(productId int64) (g *dto.ProductDto, err err return g, nil } + +// AddProduct 新增商品 +func (r *ProductService) AddProduct(userId string, req requests.AddProduct) (bool, error) { + productDao := dao.ProductDao{} + productPlatformAmountDao := dao.ProductPlatformAmountDao{} + + productPlatformId, err := strconv.ParseInt(req.ProductPlatformId, 10, 64) + if err != nil { + return false, errors.New("新增失败") + } + + // 检测平台商品是否存在 + productPlatformDao := dao.ProductPlatformDao{} + productPlatform, err := productPlatformDao.GetProductPlatformById(productPlatformId) + if err != nil || productPlatform == nil { + return false, errors.New("平台商品不存在") + } + + // 检测商品是否重复 + maps := make(map[string]interface{}) + maps["product_platform_id"] = req.ProductPlatformId + products, err := productDao.GetProductList(maps) + if err != nil { + return false, errors.New("商品重复添加") + } + + if len(products) != 0 { + return false, errors.New("商品重复添加") + } + + // 处理图片 + productCoverImg := utils.RemoveOssDomain(req.ProductCoverImg) + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 新增商品表 + product := &model.Product{ + ProductPlatformId: productPlatform.ProductPlatformId, + ProductName: req.ProductName, + CommonName: req.CommonName, + ProductPrice: req.ProductPrice, + MnemonicCode: req.MnemonicCode, + ProductType: *req.ProductType, + ProductPlatformCode: req.ProductPlatformCode, + ProductPharmacyCode: req.ProductPharmacyCode, + ProductCoverImg: productCoverImg, + ProductSpec: req.ProductSpec, + LicenseNumber: req.LicenseNumber, + Manufacturer: req.Manufacturer, + SingleUnit: req.SingleUnit, + SingleUse: req.SingleUse, + PackagingUnit: req.PackagingUnit, + FrequencyUse: req.FrequencyUse, + AvailableDays: req.AvailableDays, + ProductRemarks: req.ProductRemarks, + } + + product, err = productDao.AddProduct(tx, product) + if err != nil || product == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + // 获取商品库存 + ReportPreRequest := prescription.GetProdStockRequest{ + DrugCode: product.ProductPharmacyCode, + } + + result, err := ReportPreRequest.GetProdStock() + if err != nil { + tx.Rollback() + return false, errors.New("获取商品库存失败") + } + + var quantity int + if result.Quantity != "" { + quantity, err = strconv.Atoi(result.Quantity) + if err != nil { + tx.Rollback() + return false, errors.New("获取商品库存失败") + } + } + + // 新增商品库存 + productPlatformAmount := &model.ProductPlatformAmount{ + ProductPlatformId: product.ProductPlatformId, + ProductPlatformCode: product.ProductPlatformCode, + Stock: uint(quantity), + } + + productPlatformAmount, err = productPlatformAmountDao.AddProductPlatformAmount(tx, productPlatformAmount) + if err != nil || productPlatformAmount == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + tx.Commit() + return true, nil +} diff --git a/config.yaml b/config.yaml index cdea89d..8bb5c9c 100644 --- a/config.yaml +++ b/config.yaml @@ -90,4 +90,4 @@ pre: pre-plat-client-id: ZD-004 pre-plat-client-secret: 0baa5927164710b9f800bf33546b6da3 pre-plat-app-url: http://49.233.3.200:6304/api/thridapi/ - pre-plat-pharmacy-code: ZD-10003 \ No newline at end of file + pre-plat-pharmacy-code: JG-10009 \ No newline at end of file diff --git a/extend/prescription/prescription.go b/extend/prescription/prescription.go index 8efc581..b625390 100644 --- a/extend/prescription/prescription.go +++ b/extend/prescription/prescription.go @@ -56,37 +56,37 @@ type ReportPreRequest struct { // PresRequest 上报处方请求值-处方数据 type PresRequest struct { - PrescriptionNo string `json:"prescriptionNo"` // 处方编号 - PrescriptionSubType int `json:"prescriptionSubType"` // 处方类型 0:无类型 1:普通处方 2:儿科处方 - PatientName string `json:"patientName"` // 就诊人姓名 - PatientPhone string `json:"patientPhone"` // 就诊人联系方式 - IdCard string `json:"idCard"` // 身份证号 - Advice string `json:"advice"` // 医嘱 - DiagnosisName string `json:"diagnosisName"` // 诊断 - ThirdDoctorName string `json:"thirdDoctorName"` // 开方医生姓名 - ThirdDeptName string `json:"thirdDeptName"` // 开方科室名称 - ThirdDoctorNameImg string `json:"thirdDoctorNameImg"` // 开方医生签名链接 - PrescriptionTime string `json:"prescriptionTime"` // 开方时间 - ThirdFirstPharmacist string `json:"thirdFirstPharmacist"` // 初审药师姓名 - ThirdFirstPharmacistImg string `json:"thirdFirstPharmacistImg"` // 初审药师签名链接 - ThirdFirstTime string `json:"thirdFirstTime"` // 初审时间 - ThirdLastPharmacist string `json:"thirdLastPharmacist"` // 终审药师姓名 - ThirdLastPharmacistImg string `json:"thirdLastPharmacistImg"` // 终审药师签名链接 - ThirdLastTime string `json:"ThirdLastTime"` // 终审时间 - ThirdSignImg string `json:"thirdSignImg"` // 处方签章链接 - ReferenceCharge float64 `json:"referenceCharge"` // 处方费用(不包含运费) - ChiefComplaint string `json:"chiefComplaint"` // 主诉 - HistoryPresent string `json:"historyPresent"` // 现病史 - PastHistory string `json:"pastHistory"` // 既往史 - PhysicalExamination string `json:"physicalExamination"` // 体格检查 - SupplementaryExamination string `json:"supplementaryExamination"` // 辅助检查 - AllergicHistory string `json:"allergicHistory"` // 过敏史 - DrugList []DrugRequest `json:"drugList"` // 药品列表 - OrderDrugList []OrderDrugRequest `json:"orderDrugList"` // 订单药品列表 + PrescriptionNo string `json:"prescriptionNo"` // 处方编号 + PrescriptionSubType int `json:"prescriptionSubType"` // 处方类型 0:无类型 1:普通处方 2:儿科处方 + PatientName string `json:"patientName"` // 就诊人姓名 + PatientPhone string `json:"patientPhone"` // 就诊人联系方式 + IdCard string `json:"idCard"` // 身份证号 + Advice string `json:"advice"` // 医嘱 + DiagnosisName string `json:"diagnosisName"` // 诊断 + ThirdDoctorName string `json:"thirdDoctorName"` // 开方医生姓名 + ThirdDeptName string `json:"thirdDeptName"` // 开方科室名称 + ThirdDoctorNameImg string `json:"thirdDoctorNameImg"` // 开方医生签名链接 + PrescriptionTime string `json:"prescriptionTime"` // 开方时间 + ThirdFirstPharmacist string `json:"thirdFirstPharmacist"` // 初审药师姓名 + ThirdFirstPharmacistImg string `json:"thirdFirstPharmacistImg"` // 初审药师签名链接 + ThirdFirstTime string `json:"thirdFirstTime"` // 初审时间 + ThirdLastPharmacist string `json:"thirdLastPharmacist"` // 终审药师姓名 + ThirdLastPharmacistImg string `json:"thirdLastPharmacistImg"` // 终审药师签名链接 + ThirdLastTime string `json:"ThirdLastTime"` // 终审时间 + ThirdSignImg string `json:"thirdSignImg"` // 处方签章链接 + ReferenceCharge float64 `json:"referenceCharge"` // 处方费用(不包含运费) + ChiefComplaint string `json:"chiefComplaint"` // 主诉 + HistoryPresent string `json:"historyPresent"` // 现病史 + PastHistory string `json:"pastHistory"` // 既往史 + PhysicalExamination string `json:"physicalExamination"` // 体格检查 + SupplementaryExamination string `json:"supplementaryExamination"` // 辅助检查 + AllergicHistory string `json:"allergicHistory"` // 过敏史 + DrugList []DrugListRequest `json:"drugList"` // 药品列表 + OrderDrugList []OrderDrugListRequest `json:"orderDrugList"` // 订单药品列表 } -// DrugRequest 上报处方请求值-药品数据1 -type DrugRequest struct { +// DrugListRequest 上报处方请求值-药品数据1 +type DrugListRequest struct { DrugCode string `json:"drugCode"` // 药品编码 ApprovalNumber string `json:"approvalNumber"` // 批准文号 DrugName string `json:"drugName"` // 药品名称 @@ -102,8 +102,8 @@ type DrugRequest struct { UseDays int `json:"useDays"` // 使用天数 } -// OrderDrugRequest 上报处方请求值-药品数据2 -type OrderDrugRequest struct { +// OrderDrugListRequest 上报处方请求值-药品数据2 +type OrderDrugListRequest struct { DrugCode string `json:"drugCode"` // 药品编码 ApprovalNumber string `json:"approvalNumber"` // 批准文号 DrugName string `json:"drugName"` // 药品名称 @@ -113,12 +113,30 @@ type OrderDrugRequest struct { PackingUnit string `json:"packingUnit"` // 药品单位 } +// GetProdStockRequest 获取商品库存请求值 +type GetProdStockRequest struct { + PharmacyCode string `json:"pharmacyCode"` // 药房编码 + DrugCode string `json:"drugCode"` // 三方药房药品编码 +} + // 上报处方返回数据 type reportPreResponse struct { ResultCode string `json:"resultCode"` // 操作编码 ResultDesc string `json:"resultDesc"` // 描述 } +// 获取商品库存返回数据 +type getProdStockResponse struct { + ResultCode string `json:"resultCode"` // 操作编码 + ResultDesc string `json:"resultDesc"` // 描述 + Data GetProdStockDataResponse `json:"data"` // 具体内容 +} + +type GetProdStockDataResponse struct { + Quantity string `json:"quantity"` // 库存 + Threshold string `json:"threshold"` // 库存阈值 +} + // GetToken 获取token func GetToken() (string, error) { // 准备要发送的 JSON 数据 @@ -328,3 +346,68 @@ func (r ReportPreRequest) ReportPre() (bool, error) { return true, nil } + +// GetProdStock 获取商品库存 +func (r GetProdStockRequest) GetProdStock() (*GetProdStockDataResponse, error) { + r.PharmacyCode = config.C.Pre.PrePlatPharmacyCode + jsonData, err := json.Marshal(r) + if err != nil { + return nil, err + } + + // 准备请求体 + requestBody := bytes.NewBuffer(jsonData) + + // 设置请求 URL + url := config.C.Pre.PrePlatAppUrl + "v1/pharmacy/pharmacyInventory" + + // 创建 POST 请求 + req, err := http.NewRequest("POST", url, requestBody) + if err != nil { + return nil, err + } + + // 设置请求头,指定 Content-Type 为 application/json + req.Header.Set("Content-Type", "application/json") + + token, _ := global.Redis.Get(context.Background(), "prescription_token").Result() + if token == "" { + token, err = GetToken() + if err != nil { + return nil, err + } + } + + req.Header.Set("Authorization", "Bearer "+token) + + // 发送请求 + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return nil, err + } + + defer func(Body io.ReadCloser) { + _ = Body.Close() + }(resp.Body) + + // 检查响应状态码 + if resp.StatusCode != 200 { + return nil, errors.New("返回数据错误") + } + + var response getProdStockResponse + err = json.NewDecoder(resp.Body).Decode(&response) + if err != nil { + return nil, err + } + + if response.ResultCode != "1000" { + if response.ResultDesc != "" { + return nil, errors.New(response.ResultDesc) + } + return nil, errors.New("获取商品库存失败") + } + + return &response.Data, nil +} diff --git a/utils/replace.go b/utils/replace.go index 2b61b16..dc344c2 100644 --- a/utils/replace.go +++ b/utils/replace.go @@ -7,7 +7,10 @@ import ( // RemoveOssDomain 去除oss地址中的前缀 func RemoveOssDomain(url string) string { - return strings.Replace(url, config.C.Oss.OssCustomDomainName, "", 1) + if url != "" { + url = strings.Replace(url, config.C.Oss.OssCustomDomainName, "", 1) + } + return url } // AddOssDomain 去除oss地址中的前缀 From 2eb9a7bbe2ca67f69c2a19fee326a3cc0060becf Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Fri, 22 Dec 2023 15:59:49 +0800 Subject: [PATCH 4/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=95=86=E5=93=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/product.go | 39 ++++++++++++++++++++ api/requests/product.go | 13 +++++++ api/router/router.go | 5 +-- api/service/product.go | 75 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 4 deletions(-) diff --git a/api/controller/product.go b/api/controller/product.go index c9b2190..f80005c 100644 --- a/api/controller/product.go +++ b/api/controller/product.go @@ -190,3 +190,42 @@ func (r *Product) AddProduct(c *gin.Context) { responses.Ok(c) } + +// PutProduct 修改商品 +func (r *Product) PutProduct(c *gin.Context) { + productRequest := requests.ProductRequest{} + req := productRequest.PutProduct + if err := c.ShouldBind(&req); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + id := c.Param("product_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + productId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + productService := service.ProductService{} + _, err = productService.PutProduct(productId, req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} diff --git a/api/requests/product.go b/api/requests/product.go index 9780bce..a2f7fbc 100644 --- a/api/requests/product.go +++ b/api/requests/product.go @@ -4,6 +4,7 @@ type ProductRequest struct { GetPlatformProductPage // 获取平台商品列表-分页 GetProductPage // 获取系统商品列表-分页 AddProduct // 新增商品 + PutProduct // 修改商品 } // GetPlatformProductPage 获取平台商品列表-分页 @@ -55,3 +56,15 @@ type AddProduct struct { AvailableDays float64 `json:"available_days" form:"available_days" label:"可用天数" validate:"required"` // 可用天数(3) ProductRemarks string `json:"product_remarks" form:"product_remarks" label:"商品备注" validate:"required"` // 商品备注 } + +// PutProduct 修改商品 +type PutProduct struct { + MnemonicCode string `json:"mnemonic_code" form:"mnemonic_code" label:"商品助记码"` // 商品助记码(首字母简拼) + ProductCoverImg string `json:"product_cover_img" form:"product_cover_img" label:"商品封面图"` // 商品封面图 + SingleUnit string `json:"single_unit" form:"single_unit" label:"单次剂量" validate:"required"` // 单次剂量(例:1次1包) + SingleUse string `json:"single_use" form:"single_use" label:"单次用法" validate:"required"` // 单次用法(例:口服) + PackagingUnit string `json:"packaging_unit" form:"packaging_unit" label:"基本包装单位" validate:"required"` // 基本包装单位(例:盒/瓶) + FrequencyUse string `json:"frequency_use" form:"frequency_use" label:"使用频率" validate:"required"` // 使用频率(例:1天3次) + AvailableDays float64 `json:"available_days" form:"available_days" label:"可用天数" validate:"required"` // 可用天数(3) + ProductRemarks string `json:"product_remarks" form:"product_remarks" label:"商品备注" validate:"required"` // 商品备注 +} diff --git a/api/router/router.go b/api/router/router.go index 9e62e39..b6be38d 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -664,11 +664,8 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 新增商品 productGroup.POST("", api.Product.AddProduct) - // 删除商品 - productGroup.DELETE("", api.Dept.DeleteDept) - // 修改商品 - productGroup.PUT("/:product_id", api.Dept.PutDept) + productGroup.PUT("/:product_id", api.Product.PutProduct) // 平台商品 platformGroup := productGroup.Group("/platform") diff --git a/api/service/product.go b/api/service/product.go index 42e60e9..7c498ab 100644 --- a/api/service/product.go +++ b/api/service/product.go @@ -158,3 +158,78 @@ func (r *ProductService) AddProduct(userId string, req requests.AddProduct) (boo tx.Commit() return true, nil } + +// PutProduct 修改医生 +func (r *ProductService) PutProduct(productId int64, req requests.PutProduct) (bool, error) { + // 获取商品数据 + productDao := dao.ProductDao{} + product, err := productDao.GetProductById(productId) + if err != nil || product == nil { + return false, errors.New("商品数据错误") + } + + productData := make(map[string]interface{}) // 医生数据 + + // 商品助记码 + if product.MnemonicCode != req.MnemonicCode { + productData["mnemonic_code"] = req.MnemonicCode + } + + // 单次剂量 + if product.SingleUnit != req.SingleUnit { + productData["single_unit"] = req.SingleUnit + } + + // 单次用法 + if product.SingleUse != req.SingleUse { + productData["single_use"] = req.SingleUse + } + + // 基本包装单位 + if product.PackagingUnit != req.PackagingUnit { + productData["packaging_unit"] = req.PackagingUnit + } + + // 使用频率 + if product.FrequencyUse != req.FrequencyUse { + productData["frequency_use"] = req.FrequencyUse + } + + // 可用天数 + if product.AvailableDays != req.AvailableDays { + productData["available_days"] = req.AvailableDays + } + + // 商品备注 + if product.ProductRemarks != req.ProductRemarks { + productData["product_remarks"] = req.ProductRemarks + } + + // 商品封面 + if req.ProductCoverImg != "" { + productCoverImg := utils.RemoveOssDomain(req.ProductCoverImg) + if product.ProductCoverImg != productCoverImg { + productData["product_cover_img"] = productCoverImg + } + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 修改商品数据 + if len(productData) != 0 { + err = productDao.EditProductByUserId(tx, productId, productData) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + } + + tx.Commit() + return true, nil +} From fc9f6588cc4e8473dd46cfa5aefc8f46b9e6d877 Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Fri, 22 Dec 2023 16:22:01 +0800 Subject: [PATCH 5/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=95=86=E5=93=81=E7=8A=B6=E6=80=81=EF=BC=88=E4=B8=8A/?= =?UTF-8?q?=E4=B8=8B=E6=9E=B6=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/product.go | 39 +++++++++++++++++++++++++++++++++++++ api/dao/product.go | 5 +++++ api/requests/product.go | 8 ++++++++ api/router/router.go | 3 +++ api/service/product.go | 41 ++++++++++++++++++++++++++++++++++++++- 5 files changed, 95 insertions(+), 1 deletion(-) diff --git a/api/controller/product.go b/api/controller/product.go index f80005c..0bd9604 100644 --- a/api/controller/product.go +++ b/api/controller/product.go @@ -229,3 +229,42 @@ func (r *Product) PutProduct(c *gin.Context) { responses.Ok(c) } + +// PutProductStatus 修改商品状态(上/下架) +func (r *Product) PutProductStatus(c *gin.Context) { + productRequest := requests.ProductRequest{} + req := productRequest.PutProductStatus + if err := c.ShouldBind(&req); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + id := c.Param("product_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + productId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + productService := service.ProductService{} + _, err = productService.PutProductStatus(productId, req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} diff --git a/api/dao/product.go b/api/dao/product.go index 205de1b..f0523ac 100644 --- a/api/dao/product.go +++ b/api/dao/product.go @@ -105,6 +105,11 @@ func (r *ProductDao) GetProductPageSearch(req requests.GetProductPage, page, pag query = query.Where("product_type = ?", req.ProductType) } + // 商品状态 + if req.ProductStatus != nil { + query = query.Where("product_status = ?", req.ProductStatus) + } + // 平台商品id if req.ProductPlatformId != "" { query = query.Where("product_platform_id = ?", req.ProductPlatformId) diff --git a/api/requests/product.go b/api/requests/product.go index a2f7fbc..85d1a2c 100644 --- a/api/requests/product.go +++ b/api/requests/product.go @@ -5,6 +5,7 @@ type ProductRequest struct { GetProductPage // 获取系统商品列表-分页 AddProduct // 新增商品 PutProduct // 修改商品 + PutProductStatus // 修改商品状态(上/下架) } // GetPlatformProductPage 获取平台商品列表-分页 @@ -33,6 +34,7 @@ type GetProductPage struct { LicenseNumber string `json:"license_number" form:"license_number" label:"批准文号"` // 批准文号 Manufacturer string `json:"manufacturer" form:"manufacturer" label:"生产厂家"` // 生产厂家 ProductRemarks string `json:"product_remarks" form:"product_remarks" label:"商品备注"` // 商品备注 + ProductStatus *int `json:"product_status" form:"product_status" label:"商品状态"` // 商品状态(1:正常 2:下架) } // AddProduct 新增商品 @@ -55,6 +57,7 @@ type AddProduct struct { FrequencyUse string `json:"frequency_use" form:"frequency_use" label:"使用频率" validate:"required"` // 使用频率(例:1天3次) AvailableDays float64 `json:"available_days" form:"available_days" label:"可用天数" validate:"required"` // 可用天数(3) ProductRemarks string `json:"product_remarks" form:"product_remarks" label:"商品备注" validate:"required"` // 商品备注 + ProductStatus *int `json:"product_status" form:"product_status" label:"商品状态" validate:"required oneof=1 2"` // 商品状态(1:正常 2:下架) } // PutProduct 修改商品 @@ -68,3 +71,8 @@ type PutProduct struct { AvailableDays float64 `json:"available_days" form:"available_days" label:"可用天数" validate:"required"` // 可用天数(3) ProductRemarks string `json:"product_remarks" form:"product_remarks" label:"商品备注" validate:"required"` // 商品备注 } + +// PutProductStatus 修改商品状态(上/下架) +type PutProductStatus struct { + ProductStatus *int `json:"product_status" form:"product_status" label:"商品状态" validate:"required oneof=1 2"` // 商品状态(1:正常 2:下架) +} diff --git a/api/router/router.go b/api/router/router.go index b6be38d..bec8fea 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -667,6 +667,9 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 修改商品 productGroup.PUT("/:product_id", api.Product.PutProduct) + // 修改商品状态(上/下架) + productGroup.PUT("/status/:product_id", api.Product.PutProductStatus) + // 平台商品 platformGroup := productGroup.Group("/platform") { diff --git a/api/service/product.go b/api/service/product.go index 7c498ab..1efa458 100644 --- a/api/service/product.go +++ b/api/service/product.go @@ -97,6 +97,7 @@ func (r *ProductService) AddProduct(userId string, req requests.AddProduct) (boo // 新增商品表 product := &model.Product{ ProductPlatformId: productPlatform.ProductPlatformId, + ProductStatus: *req.ProductStatus, ProductName: req.ProductName, CommonName: req.CommonName, ProductPrice: req.ProductPrice, @@ -159,7 +160,7 @@ func (r *ProductService) AddProduct(userId string, req requests.AddProduct) (boo return true, nil } -// PutProduct 修改医生 +// PutProduct 修改商品 func (r *ProductService) PutProduct(productId int64, req requests.PutProduct) (bool, error) { // 获取商品数据 productDao := dao.ProductDao{} @@ -233,3 +234,41 @@ func (r *ProductService) PutProduct(productId int64, req requests.PutProduct) (b tx.Commit() return true, nil } + +// PutProductStatus 修改商品状态(上/下架) +func (r *ProductService) PutProductStatus(productId int64, req requests.PutProductStatus) (bool, error) { + // 获取商品数据 + productDao := dao.ProductDao{} + product, err := productDao.GetProductById(productId) + if err != nil || product == nil { + return false, errors.New("商品数据错误") + } + + if product.ProductStatus == *req.ProductStatus { + return true, nil + } + + // 商品数据 + productData := make(map[string]interface{}) // 医生数据 + productData["product_status"] = req.ProductStatus + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 修改商品数据 + if len(productData) != 0 { + err = productDao.EditProductByUserId(tx, productId, productData) + if err != nil { + tx.Rollback() + return false, errors.New("操作失败") + } + } + + tx.Commit() + return true, nil +} From f3bcd318935d07f25a147b9a3136574b62fb5678 Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Fri, 22 Dec 2023 17:08:50 +0800 Subject: [PATCH 6/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=95=86=E5=93=81=E7=8A=B6=E6=80=81=EF=BC=88=E4=B8=8A/?= =?UTF-8?q?=E4=B8=8B=E6=9E=B6=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/requests/product.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/requests/product.go b/api/requests/product.go index 85d1a2c..faefb57 100644 --- a/api/requests/product.go +++ b/api/requests/product.go @@ -57,7 +57,7 @@ type AddProduct struct { FrequencyUse string `json:"frequency_use" form:"frequency_use" label:"使用频率" validate:"required"` // 使用频率(例:1天3次) AvailableDays float64 `json:"available_days" form:"available_days" label:"可用天数" validate:"required"` // 可用天数(3) ProductRemarks string `json:"product_remarks" form:"product_remarks" label:"商品备注" validate:"required"` // 商品备注 - ProductStatus *int `json:"product_status" form:"product_status" label:"商品状态" validate:"required oneof=1 2"` // 商品状态(1:正常 2:下架) + ProductStatus *int `json:"product_status" form:"product_status" label:"商品状态" validate:"required,oneof=1 2"` // 商品状态(1:正常 2:下架) } // PutProduct 修改商品 @@ -74,5 +74,5 @@ type PutProduct struct { // PutProductStatus 修改商品状态(上/下架) type PutProductStatus struct { - ProductStatus *int `json:"product_status" form:"product_status" label:"商品状态" validate:"required oneof=1 2"` // 商品状态(1:正常 2:下架) + ProductStatus *int `json:"product_status" form:"product_status" label:"商品状态" validate:"required,oneof=1 2"` // 商品状态(1:正常 2:下架) } From dceaa0aedfff0d537e4c87292c0415a8555ebd60 Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Fri, 22 Dec 2023 17:22:57 +0800 Subject: [PATCH 7/9] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E5=95=86=E5=93=81=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/product.go | 32 +++++++++++++++++++++++++++ api/dao/productPlatform.go | 45 ++++++++++++++++++++++++++++++++++++++ api/requests/product.go | 11 ++++++++++ api/router/router.go | 2 +- 4 files changed, 89 insertions(+), 1 deletion(-) diff --git a/api/controller/product.go b/api/controller/product.go index 0bd9604..30f366c 100644 --- a/api/controller/product.go +++ b/api/controller/product.go @@ -268,3 +268,35 @@ func (r *Product) PutProductStatus(c *gin.Context) { responses.Ok(c) } + +// GetPlatformProductList 获取平台商品列表 +func (r *Product) GetPlatformProductList(c *gin.Context) { + productRequest := requests.ProductRequest{} + req := productRequest.GetPlatformProductList + if err := c.ShouldBind(&req); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + productPlatformDao := dao.ProductPlatformDao{} + productPlatform, err := productPlatformDao.GetPlatformProductListSearch(req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + productPlatforms := dto.GetProductPlatformListDto(productPlatform) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(productPlatforms, c) +} diff --git a/api/dao/productPlatform.go b/api/dao/productPlatform.go index 3d72640..97d6366 100644 --- a/api/dao/productPlatform.go +++ b/api/dao/productPlatform.go @@ -114,3 +114,48 @@ func (r *ProductPlatformDao) GetPlatformProductPageSearch(req requests.GetPlatfo } return m, totalRecords, nil } + +// GetPlatformProductListSearch 获取平台商品列表 +func (r *ProductPlatformDao) GetPlatformProductListSearch(req requests.GetPlatformProductList) (m []*model.ProductPlatform, err error) { + // 构建查询条件 + query := global.Db.Model(&model.ProductPlatform{}) + + // 商品名称 + if req.ProductName != "" { + query = query.Where("product_name LIKE ?", "%"+req.ProductName+"%") + } + + // 药品类型 + if req.ProductType != nil { + query = query.Where("product_type = ?", req.ProductType) + } + + // 处方平台编码 + if req.ProductPlatformCode != "" { + query = query.Where("product_platform_code LIKE ?", "%"+req.ProductPlatformCode+"%") + } + + // 药店编码 + if req.ProductPharmacyCode != "" { + query = query.Where("product_pharmacy_code LIKE ?", "%"+req.ProductPharmacyCode+"%") + } + + // 批准文号 + if req.LicenseNumber != "" { + query = query.Where("license_number LIKE ?", "%"+req.LicenseNumber+"%") + } + + // 生产厂家 + if req.Manufacturer != "" { + query = query.Where("manufacturer LIKE ?", "%"+req.Manufacturer+"%") + } + + // 排序 + query = query.Order("created_at desc") + + err = query.Scopes(model.Paginate(1, 10)).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/requests/product.go b/api/requests/product.go index faefb57..00216c8 100644 --- a/api/requests/product.go +++ b/api/requests/product.go @@ -6,6 +6,7 @@ type ProductRequest struct { AddProduct // 新增商品 PutProduct // 修改商品 PutProductStatus // 修改商品状态(上/下架) + GetPlatformProductList // 获取平台商品列表 } // GetPlatformProductPage 获取平台商品列表-分页 @@ -20,6 +21,16 @@ type GetPlatformProductPage struct { Manufacturer string `json:"manufacturer" form:"manufacturer" label:"生产厂家"` // 生产厂家 } +// GetPlatformProductList 获取平台商品列表 +type GetPlatformProductList struct { + ProductName string `json:"product_name" form:"product_name" label:"商品名称"` // 商品名称 + ProductType *int `json:"product_type" form:"product_type" label:"药品类型"` // 药品类型(0:未知 1:中成药 2:西药) + ProductPlatformCode string `json:"product_platform_code" form:"product_platform_code" label:"处方平台编码"` // 处方平台商品编码 + ProductPharmacyCode string `json:"product_pharmacy_code" form:"product_pharmacy_code" label:"药店编码"` // 第三方药店商品编码 + LicenseNumber string `json:"license_number" form:"license_number" label:"批准文号"` // 批准文号 + Manufacturer string `json:"manufacturer" form:"manufacturer" label:"生产厂家"` // 生产厂家 +} + // GetProductPage 获取系统商品列表-分页 type GetProductPage struct { Page int `json:"page" form:"page" label:"页码"` diff --git a/api/router/router.go b/api/router/router.go index bec8fea..59751df 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -680,7 +680,7 @@ func privateRouter(r *gin.Engine, api controller.Api) { platformGroup.GET("/:product_platform_id", api.Product.GetProductPlatform) // 获取平台商品列表 - platformGroup.GET("/list", api.UserDoctor.GetUserDoctorList) + platformGroup.GET("/list", api.Product.GetPlatformProductList) } } } From 97b8a212549de6b7655e6865c1ccca334397a07c Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Mon, 25 Dec 2023 10:28:31 +0800 Subject: [PATCH 8/9] 1 --- api/dto/ProductPlatform.go | 10 ++++++++++ api/service/product.go | 23 +++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/api/dto/ProductPlatform.go b/api/dto/ProductPlatform.go index ffe34e5..aee13b2 100644 --- a/api/dto/ProductPlatform.go +++ b/api/dto/ProductPlatform.go @@ -21,6 +21,7 @@ type ProductPlatformDto struct { RetailUnit string `json:"retail_unit"` // 零售单位 CreatedAt model.LocalTime `json:"created_at"` // 创建时间 UpdatedAt model.LocalTime `json:"updated_at"` // 更新时间 + Stock uint `json:"stock"` // 现有库存 } // GetProductPlatformDto 平台商品详情 @@ -76,3 +77,12 @@ func GetProductPlatformListDto(m []*model.ProductPlatform) []*ProductPlatformDto return responses } + +// LoadProductAmount 加载商品库存 +func (r *ProductPlatformDto) LoadProductAmount(quantity int) *ProductPlatformDto { + if quantity > 0 { + r.Stock = uint(quantity) + } + + return r +} diff --git a/api/service/product.go b/api/service/product.go index 1efa458..859be79 100644 --- a/api/service/product.go +++ b/api/service/product.go @@ -24,9 +24,32 @@ func (r *ProductService) GetProductPlatform(productPlatformId int64) (g *dto.Pro return nil, errors.New(err.Error()) } + // 获取商品库存 + var quantity int + + ReportPreRequest := prescription.GetProdStockRequest{ + DrugCode: productPlatform.ProductPharmacyCode, + } + + result, err := ReportPreRequest.GetProdStock() + if err != nil { + quantity = 0 + } + + if result != nil { + if result.Quantity != "" { + quantity, err = strconv.Atoi(result.Quantity) + if err != nil { + quantity = 0 + } + } + } + // 处理返回值 g = dto.GetProductPlatformDto(productPlatform) + // 加载商品库存 + g.LoadProductAmount(quantity) return g, nil } From 1ff95186256ea462fde2b4e46463068304975d8f Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Mon, 25 Dec 2023 11:58:18 +0800 Subject: [PATCH 9/9] 2 --- extend/prescription/prescription.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extend/prescription/prescription.go b/extend/prescription/prescription.go index b625390..dde4e68 100644 --- a/extend/prescription/prescription.go +++ b/extend/prescription/prescription.go @@ -127,9 +127,9 @@ type reportPreResponse struct { // 获取商品库存返回数据 type getProdStockResponse struct { - ResultCode string `json:"resultCode"` // 操作编码 - ResultDesc string `json:"resultDesc"` // 描述 - Data GetProdStockDataResponse `json:"data"` // 具体内容 + ResultCode string `json:"resultCode"` // 操作编码 + ResultDesc string `json:"resultDesc"` // 描述 + Data []GetProdStockDataResponse `json:"data"` // 具体内容 } type GetProdStockDataResponse struct { @@ -409,5 +409,5 @@ func (r GetProdStockRequest) GetProdStock() (*GetProdStockDataResponse, error) { return nil, errors.New("获取商品库存失败") } - return &response.Data, nil + return &response.Data[0], nil }