diff --git a/api/controller/base.go b/api/controller/base.go index f3f3115..46423e2 100644 --- a/api/controller/base.go +++ b/api/controller/base.go @@ -71,6 +71,7 @@ type orderPrescriptionManage struct { // 问诊管理 type inquiryManage struct { InquiryConfig // 问诊配置 + HealthPackage // 系统健康包配置 } // ca管理 diff --git a/api/controller/healthPackage.go b/api/controller/healthPackage.go new file mode 100644 index 0000000..b2b1944 --- /dev/null +++ b/api/controller/healthPackage.go @@ -0,0 +1,83 @@ +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 HealthPackage struct{} + +// GetHealthPackagePage 获取系统健康包配置列表-分页 +func (r *HealthPackage) GetHealthPackagePage(c *gin.Context) { + healthPackageRequest := requests.HealthPackageRequest{} + req := healthPackageRequest.GetHealthPackagePage + 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 + } + + if req.Page == 0 { + req.Page = 1 + } + + if req.PageSize == 0 { + req.PageSize = 20 + } + + healthPackageDao := dao.HealthPackageDao{} + healthPackage, total, err := healthPackageDao.GetHealthPackagePageSearch(req, req.Page, req.PageSize) + + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + res := dto.GetHealthPackageListDto(healthPackage) + + result := make(map[string]interface{}) + result["page"] = req.Page + result["page_size"] = req.PageSize + result["total"] = total + result["data"] = res + responses.OkWithData(result, c) +} + +// GetHealthPackage 获取系统健康包配置详情 +func (r *HealthPackage) GetHealthPackage(c *gin.Context) { + id := c.Param("package_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + packageId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + healthPackageService := service.HealthPackageService{} + getResponses, err := healthPackageService.GetHealthPackage(packageId) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(getResponses, c) +} diff --git a/api/dao/healthPackage.go b/api/dao/healthPackage.go new file mode 100644 index 0000000..1497adf --- /dev/null +++ b/api/dao/healthPackage.go @@ -0,0 +1,90 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" + "hospital-admin-api/global" +) + +type HealthPackageDao struct { +} + +// GetHealthPackageById 获取数据-id +func (r *HealthPackageDao) GetHealthPackageById(packageId int64) (m *model.HealthPackage, err error) { + err = global.Db.First(&m, packageId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetHealthPackagePreloadById 获取数据-加载全部关联-id +func (r *HealthPackageDao) GetHealthPackagePreloadById(packageId int64) (m *model.HealthPackage, err error) { + err = global.Db.Preload(clause.Associations).First(&m, packageId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteHealthPackage 删除 +func (r *HealthPackageDao) DeleteHealthPackage(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.HealthPackage{}).Error + if err != nil { + return err + } + return nil +} + +// EditHealthPackage 修改 +func (r *HealthPackageDao) EditHealthPackage(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.HealthPackage{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetHealthPackageList 获取列表 +func (r *HealthPackageDao) GetHealthPackageList(maps interface{}) (m []*model.HealthPackage, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddHealthPackage 新增 +func (r *HealthPackageDao) AddHealthPackage(tx *gorm.DB, model *model.HealthPackage) (*model.HealthPackage, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} + +// GetHealthPackagePageSearch 获取列表-分页 +func (r *HealthPackageDao) GetHealthPackagePageSearch(req requests.GetHealthPackagePage, page, pageSize int) (m []*model.HealthPackage, total int64, err error) { + var totalRecords int64 + + // 构建查询条件 + query := global.Db.Model(&model.HealthPackage{}) + + // 健康包-关联商品 + query = query.Preload("HealthPackageProduct") + + // 排序 + 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/HealthPackage.go b/api/dto/HealthPackage.go new file mode 100644 index 0000000..df25e33 --- /dev/null +++ b/api/dto/HealthPackage.go @@ -0,0 +1,68 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +type HealthPackageDto struct { + PackageId string `json:"package_id"` // 主键id + ServiceCount int `json:"service_count"` // 总服务次数 + MonthlyFrequency int `json:"monthly_frequency"` // 每月次数 + EffectiveDays string `json:"effective_days"` // 服务有效天数 + ServiceRate string `json:"service_rate"` // 服务费率。100为满值,表示1,正常费率。 + DiscountProductTotalAmount float64 `json:"discount_product_total_amount"` // 折扣商品总价格 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 + HealthPackageProduct []*HealthPackageProductDto `json:"health_package_product"` // 健康包-关联商品 +} + +func GetHealthPackageDto(m *model.HealthPackage) *HealthPackageDto { + return &HealthPackageDto{ + PackageId: fmt.Sprintf("%d", m.PackageId), + ServiceCount: m.ServiceCount, + MonthlyFrequency: m.MonthlyFrequency, + EffectiveDays: m.EffectiveDays, + ServiceRate: m.ServiceRate, + DiscountProductTotalAmount: m.DiscountProductTotalAmount, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +func GetHealthPackageListDto(m []*model.HealthPackage) []*HealthPackageDto { + // 处理返回值 + responses := make([]*HealthPackageDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &HealthPackageDto{ + PackageId: fmt.Sprintf("%d", v.PackageId), + ServiceCount: v.ServiceCount, + MonthlyFrequency: v.MonthlyFrequency, + EffectiveDays: v.EffectiveDays, + ServiceRate: v.ServiceRate, + DiscountProductTotalAmount: v.DiscountProductTotalAmount, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + if len(v.HealthPackageProduct) > 0 { + response.LoadHealthPackageProduct(v.HealthPackageProduct) + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} + +// LoadHealthPackageProduct 加载健康包-关联商品 +func (r *HealthPackageDto) LoadHealthPackageProduct(m []*model.HealthPackageProduct) *HealthPackageDto { + if len(m) > 0 { + r.HealthPackageProduct = GetHealthPackageProductListDto(m) + } + return r +} diff --git a/api/model/healthPackage.go b/api/model/healthPackage.go index cc8dc39..52a8a40 100644 --- a/api/model/healthPackage.go +++ b/api/model/healthPackage.go @@ -15,6 +15,7 @@ type HealthPackage struct { ServiceRate string `gorm:"column:service_rate;type:varchar(20);comment:服务费率。100为满值,表示1,正常费率。" json:"service_rate"` DiscountProductTotalAmount float64 `gorm:"column:discount_product_total_amount;type:decimal(10,2) unsigned;default:0.00;comment:折扣商品总价格" json:"discount_product_total_amount"` Model + HealthPackageProduct []*HealthPackageProduct `gorm:"foreignKey:PackageId;references:package_id" json:"health_package_product"` // 健康包-关联商品 } func (m *HealthPackage) TableName() string { diff --git a/api/requests/healthPackage.go b/api/requests/healthPackage.go new file mode 100644 index 0000000..cffc603 --- /dev/null +++ b/api/requests/healthPackage.go @@ -0,0 +1,11 @@ +package requests + +type HealthPackageRequest struct { + GetHealthPackagePage // 健康包 +} + +// GetHealthPackagePage 健康包 +type GetHealthPackagePage struct { + Page int `json:"page" form:"page" label:"页码"` + PageSize int `json:"page_size" form:"page_size" label:"每页个数"` +} diff --git a/api/router/router.go b/api/router/router.go index 83f7661..e2c4d02 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -459,7 +459,6 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 取消服务包订单 serviceGroup.PUT("/cancel/:order_service_id", api.OrderServicePackage.CancelOrderServicePackage) } - } // 病例管理 @@ -548,6 +547,38 @@ func privateRouter(r *gin.Engine, api controller.Api) { systemGroup.GET("/detail", api.InquiryConfig.GetSystemInquiryConfigDetail) } } + + // 健康包配置 + healthGroup := inquiryGroup.Group("/health") + { + // 系统健康包配置 + systemGroup := healthGroup.Group("/system") + { + // 获取系统健康包配置列表-分页 + systemGroup.POST("/page", api.HealthPackage.GetHealthPackagePage) + + // 获取系统健康包配置详情 + systemGroup.GET("/:package_id", api.HealthPackage.GetHealthPackage) + } + + // 医生健康包配置 + doctorGroup := healthGroup.Group("/doctor") + { + // 获取开启问诊配置医生列表-分页 + doctorGroup.GET("", api.InquiryConfig.GetDoctorInquiryConfigPage) + } + } + + // 随访包配置 + followGroup := configGroup.Group("/follow") + { + // 医生随访包配置 + doctorGroup := followGroup.Group("/doctor") + { + // 获取开启问诊配置医生列表-分页 + doctorGroup.GET("", api.InquiryConfig.GetDoctorInquiryConfigPage) + } + } } // 财务管理 @@ -690,6 +721,9 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 获取系统商品列表-分页 productGroup.POST("/page", api.Product.GetProductPage) + // 获取系统商品列表-限制条数 + productGroup.GET("/list", api.Product.GetProductPage) + // 系统商品详情 productGroup.GET("/:product_id", api.Product.GetProduct) diff --git a/api/service/HealthPackage.go b/api/service/HealthPackage.go new file mode 100644 index 0000000..40be9bf --- /dev/null +++ b/api/service/HealthPackage.go @@ -0,0 +1,30 @@ +package service + +import ( + "errors" + "hospital-admin-api/api/dao" + "hospital-admin-api/api/dto" +) + +type HealthPackageService struct { +} + +// GetHealthPackage 获取系统健康包配置详情 +func (r *HealthPackageService) GetHealthPackage(packageId int64) (g *dto.HealthPackageDto, err error) { + healthPackageDao := dao.HealthPackageDao{} + healthPackage, err := healthPackageDao.GetHealthPackagePreloadById(packageId) + if err != nil || healthPackage == nil { + return nil, errors.New(err.Error()) + } + + // 获取健康包-关联商品 + healthPackageProductDao := dao.HealthPackageProductDao{} + healthPackageProduct, err := healthPackageProductDao.GetHealthPackageProductByPackageId(packageId) + + // 处理返回值 + g = dto.GetHealthPackageDto(healthPackage) + + g.LoadHealthPackageProduct(healthPackageProduct) + + return g, nil +} diff --git a/api/service/orderServicePackage.go b/api/service/orderServicePackage.go index ea41f49..7561904 100644 --- a/api/service/orderServicePackage.go +++ b/api/service/orderServicePackage.go @@ -301,7 +301,7 @@ func (r *OrderServicePackageService) CancelOrderServicePackage(req requests.Canc orderServicePackageData["cancel_time"] = time.Now().Format("2006-01-02 15:04:05") // 订单取消时间 orderServicePackageData["cancel_reason"] = 4 // 取消订单原因(1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时) orderServicePackageData["cancel_remarks"] = req.CancelRemarks // 取消订单备注(自动添加) - err = orderServicePackageDao.EditOrderServicePackageById(tx, orderServiceId, orderServicePackageData) + err = orderServicePackageDao.EditOrderServicePackageById(tx, orderServicePackage.OrderId, orderServicePackageData) if err != nil { tx.Rollback() return false, errors.New("取消订单失败")