From 2db307941ed7573fa6836b0ba893d3254286697e Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 21 May 2024 09:13:14 +0800 Subject: [PATCH 01/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=20=E9=80=80?= =?UTF-8?q?=E8=BF=98=E7=94=A8=E6=88=B7=E4=BC=98=E6=83=A0=E5=8D=B7=E3=80=81?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E5=A4=84=E7=90=86=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=A4=84=E6=96=B9=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/inquiryConfig.go | 5 + api/controller/orderInquiry.go | 11 +++ api/dao/order.go | 62 +++++++++++++ api/dao/orderCoupon.go | 53 +++++++++++ api/dao/orderPrescriptionFile.go | 79 ++++++++++++++++ api/dao/orderRefund.go | 53 +++++++++++ api/dto/OrderInquiry.go | 6 ++ api/dto/OrderProduct.go | 1 + api/model/order.go | 51 ++++++++++ api/model/orderCoupon.go | 34 +++++++ api/model/orderInquiry.go | 1 + api/model/orderPrescriptionFile.go | 37 ++++++++ api/model/orderProduct.go | 1 + api/model/orderRefund.go | 40 ++++++++ api/service/OrderInquiry.go | 79 ++++++++++++---- api/service/order.go | 144 +++++++++++++++++++++++++++++ go.mod | 1 + go.sum | 2 + utils/compute.go | 48 ++++++++++ 19 files changed, 690 insertions(+), 18 deletions(-) create mode 100644 api/dao/order.go create mode 100644 api/dao/orderCoupon.go create mode 100644 api/dao/orderPrescriptionFile.go create mode 100644 api/dao/orderRefund.go create mode 100644 api/model/order.go create mode 100644 api/model/orderCoupon.go create mode 100644 api/model/orderPrescriptionFile.go create mode 100644 api/model/orderRefund.go diff --git a/api/controller/inquiryConfig.go b/api/controller/inquiryConfig.go index 552514c..aaecb05 100644 --- a/api/controller/inquiryConfig.go +++ b/api/controller/inquiryConfig.go @@ -110,6 +110,11 @@ func (r *InquiryConfig) PutDoctorInquiryConfig(c *gin.Context) { return } + if req.InquiryMode == 6 { + responses.FailWithMessage("疑难问诊暂不可使用", c) + return + } + // 业务处理 doctorInquiryConfigService := service.DoctorInquiryConfigService{} _, err = doctorInquiryConfigService.PutDoctorInquiryConfig(inquiryConfigId, req) diff --git a/api/controller/orderInquiry.go b/api/controller/orderInquiry.go index 434e239..2053578 100644 --- a/api/controller/orderInquiry.go +++ b/api/controller/orderInquiry.go @@ -87,6 +87,17 @@ func (r *OrderInquiry) GetOrderInquiry(c *gin.Context) { // CancelOrderInquiry 取消问诊订单 func (r *OrderInquiry) CancelOrderInquiry(c *gin.Context) { + //OrderService := service.OrderService{} + // + //_, err := OrderService.PdfToImg() + //if err != nil { + // responses.FailWithMessage(err.Error(), c) + // return + //} + // + //responses.Ok(c) + //return + id := c.Param("order_inquiry_id") if id == "" { responses.FailWithMessage("缺少参数", c) diff --git a/api/dao/order.go b/api/dao/order.go new file mode 100644 index 0000000..41b4d97 --- /dev/null +++ b/api/dao/order.go @@ -0,0 +1,62 @@ +package dao + +import ( + "gorm.io/gorm" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type OrderDao struct { +} + +// GetOrderById 获取数据-id +func (r *OrderDao) GetOrderById(orderId int64) (m *model.Order, err error) { + err = global.Db.First(&m, orderId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddOrder 新增 +func (r *OrderDao) AddOrder(tx *gorm.DB, model *model.Order) (*model.Order, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} + +// GetOrderList 获取列表 +func (r *OrderDao) GetOrderList(maps interface{}) (m []*model.Order, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrder 获取单个 +func (r *OrderDao) GetOrder(maps interface{}) (m *model.Order, err error) { + err = global.Db.Where(maps).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteOrderById 删除-id +func (r *OrderDao) DeleteOrderById(tx *gorm.DB, orderId int64) error { + if err := tx.Delete(&model.Order{}, orderId).Error; err != nil { + return err + } + return nil +} + +// EditOrderById 修改-id +func (r *OrderDao) EditOrderById(tx *gorm.DB, orderId int64, data interface{}) error { + err := tx.Model(&model.Order{}).Where("order_id = ?", orderId).Updates(data).Error + if err != nil { + return err + } + return nil +} diff --git a/api/dao/orderCoupon.go b/api/dao/orderCoupon.go new file mode 100644 index 0000000..acf7938 --- /dev/null +++ b/api/dao/orderCoupon.go @@ -0,0 +1,53 @@ +package dao + +import ( + "gorm.io/gorm" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type OrderCouponDao struct { +} + +// GetOrderCouponById 获取数据-接口id +func (r *OrderCouponDao) GetOrderCouponById(orderCouponId int64) (m *model.OrderCoupon, err error) { + err = global.Db.First(&m, orderCouponId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddOrderCoupon 新增 +func (r *OrderCouponDao) AddOrderCoupon(tx *gorm.DB, model *model.OrderCoupon) (*model.OrderCoupon, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} + +// GetOrderCouponList 获取列表 +func (r *OrderCouponDao) GetOrderCouponList(maps interface{}) (m []*model.OrderCoupon, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteOrderCouponById 删除-id +func (r *OrderCouponDao) DeleteOrderCouponById(tx *gorm.DB, orderCouponId int64) error { + if err := tx.Delete(&model.OrderCoupon{}, orderCouponId).Error; err != nil { + return err + } + return nil +} + +// EditOrderCouponById 修改-id +func (r *OrderCouponDao) EditOrderCouponById(tx *gorm.DB, orderCouponId int64, data interface{}) error { + err := tx.Model(&model.OrderCoupon{}).Where("order_coupon_id = ?", orderCouponId).Updates(data).Error + if err != nil { + return err + } + return nil +} diff --git a/api/dao/orderPrescriptionFile.go b/api/dao/orderPrescriptionFile.go new file mode 100644 index 0000000..0f13d82 --- /dev/null +++ b/api/dao/orderPrescriptionFile.go @@ -0,0 +1,79 @@ +package dao + +import ( + "gorm.io/gorm" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type OrderPrescriptionFileDao struct { +} + +// GetOrderPrescriptionFileById 获取处方关联CA数据-处方关联CAid +func (r *OrderPrescriptionFileDao) GetOrderPrescriptionFileById(PrescriptionFileId int64) (m *model.OrderPrescriptionFile, err error) { + err = global.Db.First(&m, PrescriptionFileId).Error + if err != nil { + return nil, err + } + return m, nil +} + +func (r *OrderPrescriptionFileDao) GetOrderPrescriptionFileByOrderPrescriptionId(orderPrescriptionId int64) (m *model.OrderPrescriptionFile, err error) { + err = global.Db.Where("order_prescription_id = ?", orderPrescriptionId).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +func (r *OrderPrescriptionFileDao) GetOrderPrescriptionFileListByOrderPrescriptionId(orderPrescriptionId int64) (m []*model.OrderPrescriptionFile, err error) { + err = global.Db.Where("order_prescription_id = ?", orderPrescriptionId).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteOrderPrescriptionFile 删除处方关联CA +func (r *OrderPrescriptionFileDao) DeleteOrderPrescriptionFile(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.OrderPrescriptionFile{}).Error + if err != nil { + return err + } + return nil +} + +// EditOrderPrescriptionFile 修改处方关联CA +func (r *OrderPrescriptionFileDao) EditOrderPrescriptionFile(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.OrderPrescriptionFile{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditOrderPrescriptionFileById 修改处方关联CA +func (r *OrderPrescriptionFileDao) EditOrderPrescriptionFileById(tx *gorm.DB, PrescriptionFileId int64, data interface{}) error { + err := tx.Model(&model.OrderPrescriptionFile{}).Where("prescription_file_id = ?", PrescriptionFileId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetOrderPrescriptionFileList 获取处方关联CA列表 +func (r *OrderPrescriptionFileDao) GetOrderPrescriptionFileList(maps interface{}) (m []*model.OrderPrescriptionFile, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddOrderPrescriptionFile 新增处方关联CA +func (r *OrderPrescriptionFileDao) AddOrderPrescriptionFile(tx *gorm.DB, model *model.OrderPrescriptionFile) (*model.OrderPrescriptionFile, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} diff --git a/api/dao/orderRefund.go b/api/dao/orderRefund.go new file mode 100644 index 0000000..fd2139d --- /dev/null +++ b/api/dao/orderRefund.go @@ -0,0 +1,53 @@ +package dao + +import ( + "gorm.io/gorm" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type OrderRefundDao struct { +} + +// GetOrderRefundById 获取接口数据-接口id +func (r *OrderRefundDao) GetOrderRefundById(orderRefundId int64) (m *model.OrderRefund, err error) { + err = global.Db.First(&m, orderRefundId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddOrderRefund 新增接口 +func (r *OrderRefundDao) AddOrderRefund(tx *gorm.DB, model *model.OrderRefund) (*model.OrderRefund, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} + +// GetOrderRefundList 获取接口列表 +func (r *OrderRefundDao) GetOrderRefundList(maps interface{}) (m []*model.OrderRefund, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteOrderRefundById 删除接口-接口id +func (r *OrderRefundDao) DeleteOrderRefundById(tx *gorm.DB, orderRefundId int64) error { + if err := tx.Delete(&model.OrderRefund{}, orderRefundId).Error; err != nil { + return err + } + return nil +} + +// EditOrderRefundById 修改接口-接口id +func (r *OrderRefundDao) EditOrderRefundById(tx *gorm.DB, orderRefundId int64, data interface{}) error { + err := tx.Model(&model.OrderRefund{}).Where("order_refund_id = ?", orderRefundId).Updates(data).Error + if err != nil { + return err + } + return nil +} diff --git a/api/dto/OrderInquiry.go b/api/dto/OrderInquiry.go index 991a1ff..30b70ec 100644 --- a/api/dto/OrderInquiry.go +++ b/api/dto/OrderInquiry.go @@ -7,6 +7,7 @@ import ( type OrderInquiryDto struct { OrderInquiryId string `json:"order_inquiry_id"` // 主键id + OrderId string `json:"order_id"` // 订单id UserId string `json:"user_id"` // 用户id-患者 PatientId string `json:"patient_id"` // 患者id DoctorId string `json:"doctor_id"` // 医生id(未分配时为null) @@ -62,6 +63,7 @@ func GetOrderInquiryDto(m *model.OrderInquiry) *OrderInquiryDto { return &OrderInquiryDto{ OrderInquiryId: fmt.Sprintf("%d", m.OrderInquiryId), + OrderId: fmt.Sprintf("%d", m.OrderId), UserId: fmt.Sprintf("%d", m.UserId), DoctorId: doctorId, PatientId: fmt.Sprintf("%d", m.PatientId), @@ -107,6 +109,7 @@ func GetOrderInquiryListDto(m []*model.OrderInquiry) []*OrderInquiryDto { for i, v := range m { response := &OrderInquiryDto{ OrderInquiryId: fmt.Sprintf("%d", v.OrderInquiryId), + OrderId: fmt.Sprintf("%d", v.OrderId), UserId: fmt.Sprintf("%d", v.UserId), PatientId: fmt.Sprintf("%d", v.PatientId), DoctorId: fmt.Sprintf("%d", v.DoctorId), @@ -165,6 +168,7 @@ func GetOrderInquiryRecordListDto(m []*model.OrderInquiry) []*OrderInquiryDto { for i, v := range m { response := &OrderInquiryDto{ OrderInquiryId: fmt.Sprintf("%d", v.OrderInquiryId), + OrderId: fmt.Sprintf("%d", v.OrderId), UserId: fmt.Sprintf("%d", v.UserId), PatientId: fmt.Sprintf("%d", v.PatientId), DoctorId: fmt.Sprintf("%d", v.DoctorId), @@ -220,6 +224,7 @@ func GetOrderInquiryForAccountListDto(m []*model.OrderInquiry) []*OrderInquiryDt for i, v := range m { response := &OrderInquiryDto{ OrderInquiryId: fmt.Sprintf("%d", v.OrderInquiryId), + OrderId: fmt.Sprintf("%d", v.OrderId), UserId: fmt.Sprintf("%d", v.UserId), PatientId: fmt.Sprintf("%d", v.PatientId), DoctorId: fmt.Sprintf("%d", v.DoctorId), @@ -276,6 +281,7 @@ func GetOrderInquiryRecordDto(m *model.OrderInquiry) *OrderInquiryDto { return &OrderInquiryDto{ OrderInquiryId: fmt.Sprintf("%d", m.OrderInquiryId), + OrderId: fmt.Sprintf("%d", m.OrderId), UserId: fmt.Sprintf("%d", m.UserId), DoctorId: doctorId, PatientId: fmt.Sprintf("%d", m.PatientId), diff --git a/api/dto/OrderProduct.go b/api/dto/OrderProduct.go index 032017a..125b7b0 100644 --- a/api/dto/OrderProduct.go +++ b/api/dto/OrderProduct.go @@ -10,6 +10,7 @@ type OrderProductDto struct { OrderProductId string `json:"order_product_id"` // 主键id OrderInquiryId string `json:"order_inquiry_id"` // 订单-问诊id;NOT NULL OrderPrescriptionId string `json:"order_prescription_id"` // 订单-处方id;NOT NULL + OrderId string `json:"order_id"` // 订单id DoctorId string `json:"doctor_id"` // 医生id PatientId string `json:"patient_id"` // 患者id FamilyId string `json:"family_id"` // 家庭成员id(就诊用户) diff --git a/api/model/order.go b/api/model/order.go new file mode 100644 index 0000000..8c4b5a5 --- /dev/null +++ b/api/model/order.go @@ -0,0 +1,51 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// Order 订单表 +type Order struct { + OrderId int64 `gorm:"column:order_id;type:bigint(19);primary_key;comment:主键id" json:"order_id"` + UserId int64 `gorm:"column:user_id;type:bigint(19);comment:用户id-患者;NOT NULL" json:"user_id"` + PatientId int64 `gorm:"column:patient_id;type:bigint(19);comment:患者id;NOT NULL" json:"patient_id"` + DoctorId int64 `gorm:"column:doctor_id;type:bigint(19);comment:医生id(存在为null的情况)" json:"doctor_id"` + OrderType int `gorm:"column:order_type;type:tinyint(1);comment:订单类型(1:问诊订单 2:药品订单 3:检测订单 4:随访包订单 5:健康包订单);NOT NULL" json:"order_type"` + IsDelete int `gorm:"column:is_delete;type:tinyint(1);default:0;comment:删除状态(0:否 1:是)" json:"is_delete"` + PayChannel int `gorm:"column:pay_channel;type:tinyint(1);default:1;comment:支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付);NOT NULL" json:"pay_channel"` + PayStatus int `gorm:"column:pay_status;type:tinyint(1);default:1;comment:支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款);NOT NULL" json:"pay_status"` + PayTime LocalTime `gorm:"column:pay_time;type:datetime;comment:支付时间" json:"pay_time"` + RefundStatus int `gorm:"column:refund_status;type:tinyint(1);default:0;comment:订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款);NOT NULL" json:"refund_status"` + OrderNo string `gorm:"column:order_no;type:varchar(30);comment:系统订单编号;NOT NULL" json:"order_no"` + EscrowTradeNo string `gorm:"column:escrow_trade_no;type:varchar(100);comment:第三方支付流水号" json:"escrow_trade_no"` + AmountTotal float64 `gorm:"column:amount_total;type:decimal(10,2) unsigned;default:0.00;comment:订单金额" json:"amount_total"` + CouponAmountTotal float64 `gorm:"column:coupon_amount_total;type:decimal(10,2) unsigned;default:0.00;comment:优惠卷总金额" json:"coupon_amount_total"` + PaymentAmountTotal float64 `gorm:"column:payment_amount_total;type:decimal(10,2) unsigned;default:0.00;comment:实际付款金额" json:"payment_amount_total"` + CancelStatus int `gorm:"column:cancel_status;type:tinyint(1);default:0;comment:取消状态(0:否 1:是)" json:"cancel_status"` + CancelTime LocalTime `gorm:"column:cancel_time;type:datetime;comment:订单取消时间" json:"cancel_time"` + CancelRemarks string `gorm:"column:cancel_remarks;type:varchar(255);comment:取消订单备注" json:"cancel_remarks"` + OrderRemarks string `gorm:"column:order_remarks;type:varchar(255);comment:订单备注" json:"order_remarks"` + IsWithdrawal int `gorm:"column:is_withdrawal;type:tinyint(1);default:0;comment:是否提现(0:否 1:是 2:提现中 3:无需提现)" json:"is_withdrawal"` + WithdrawalTime LocalTime `gorm:"column:withdrawal_time;type:datetime;comment:提现时间" json:"withdrawal_time"` + Model +} + +func (m *Order) TableName() string { + return "gdxz_order" +} + +func (m *Order) BeforeCreate(tx *gorm.DB) error { + if m.OrderId == 0 { + m.OrderId = 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/orderCoupon.go b/api/model/orderCoupon.go new file mode 100644 index 0000000..d239c19 --- /dev/null +++ b/api/model/orderCoupon.go @@ -0,0 +1,34 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +type OrderCoupon struct { + OrderCouponId int64 `gorm:"column:order_coupon_id;type:bigint(19);primary_key;comment:主键id" json:"order_coupon_id"` + OrderId int64 `gorm:"column:order_id;type:bigint(19);comment:订单id;NOT NULL" json:"order_id"` + UserCouponId int64 `gorm:"column:user_coupon_id;type:bigint(19);comment:用户优惠卷表id;NOT NULL" json:"user_coupon_id"` + CouponName string `gorm:"column:coupon_name;type:varchar(255);comment:优惠卷名称" json:"coupon_name"` + CouponUsePrice float64 `gorm:"column:coupon_use_price;type:decimal(10,2);default:0.00;comment:优惠卷使用金额" json:"coupon_use_price"` + Model +} + +func (m *OrderCoupon) TableName() string { + return "gdxz_order_coupon" +} + +func (m *OrderCoupon) BeforeCreate(tx *gorm.DB) error { + if m.OrderCouponId == 0 { + m.OrderCouponId = 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/orderInquiry.go b/api/model/orderInquiry.go index 0b69dc9..5d4f45f 100644 --- a/api/model/orderInquiry.go +++ b/api/model/orderInquiry.go @@ -9,6 +9,7 @@ import ( // OrderInquiry 订单-问诊表 type OrderInquiry struct { OrderInquiryId int64 `gorm:"column:order_inquiry_id;type:bigint(19);primary_key;comment:主键id" json:"order_inquiry_id"` + OrderId int64 `gorm:"column:order_id;type:bigint(19);comment:订单id" json:"order_id"` UserId int64 `gorm:"column:user_id;type:bigint(19);comment:用户id-患者;NOT NULL" json:"user_id"` PatientId int64 `gorm:"column:patient_id;type:bigint(19);comment:患者id;NOT NULL" json:"patient_id"` DoctorId int64 `gorm:"column:doctor_id;type:bigint(19);comment:医生id(未分配时为null)" json:"doctor_id"` diff --git a/api/model/orderPrescriptionFile.go b/api/model/orderPrescriptionFile.go new file mode 100644 index 0000000..fbba182 --- /dev/null +++ b/api/model/orderPrescriptionFile.go @@ -0,0 +1,37 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// OrderPrescriptionFile 订单-处方表-ca处方文件 +type OrderPrescriptionFile struct { + PrescriptionFileId int64 `gorm:"column:prescription_file_id;type:bigint(19);primary_key;comment:主键id" json:"prescription_file_id"` + OrderPrescriptionId int64 `gorm:"column:order_prescription_id;type:bigint(19);comment:订单-处方id" json:"order_prescription_id"` + DoctorCaFileId string `gorm:"column:doctor_ca_file_id;type:varchar(100);comment:医生签章pdf文件id(可请求ca下载)" json:"doctor_ca_file_id"` + HospitalCaFileId string `gorm:"column:hospital_ca_file_id;type:varchar(100);comment:医院签章pdf文件id(可请求ca下载)" json:"hospital_ca_file_id"` + PrescriptionImgOssPath string `gorm:"column:prescription_img_oss_path;type:varchar(255);comment:签章img文件oss路径" json:"prescription_img_oss_path"` + PrescriptionPdfOssPath string `gorm:"column:prescription_pdf_oss_path;type:varchar(255);comment:签章pdf文件oss路径" json:"prescription_pdf_oss_path"` + IsConvertedPdf int `gorm:"column:is_converted_pdf;type:tinyint(1);default:0;comment:是否已转换pdf为图片(0:否 1:是)" json:"is_converted_pdf"` + Model +} + +func (m *OrderPrescriptionFile) TableName() string { + return "gdxz_order_prescription_file" +} + +func (m *OrderPrescriptionFile) BeforeCreate(tx *gorm.DB) error { + if m.PrescriptionFileId == 0 { + m.PrescriptionFileId = 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/orderProduct.go b/api/model/orderProduct.go index 20f753c..bbd63f9 100644 --- a/api/model/orderProduct.go +++ b/api/model/orderProduct.go @@ -11,6 +11,7 @@ type OrderProduct struct { OrderProductId int64 `gorm:"column:order_product_id;type:bigint(20);primary_key;comment:主键id" json:"order_product_id"` OrderInquiryId int64 `gorm:"column:order_inquiry_id;type:bigint(19);comment:订单-问诊id;NOT NULL" json:"order_inquiry_id"` OrderPrescriptionId int64 `gorm:"column:order_prescription_id;type:bigint(19);comment:订单-处方id;NOT NULL" json:"order_prescription_id"` + OrderId int64 `gorm:"column:order_id;type:bigint(19);comment:订单id" json:"order_id"` DoctorId int64 `gorm:"column:doctor_id;type:bigint(19);comment:医生id" json:"doctor_id"` PatientId int64 `gorm:"column:patient_id;type:bigint(19);comment:患者id" json:"patient_id"` FamilyId int64 `gorm:"column:family_id;type:bigint(19);comment:家庭成员id(就诊用户)" json:"family_id"` diff --git a/api/model/orderRefund.go b/api/model/orderRefund.go new file mode 100644 index 0000000..607954a --- /dev/null +++ b/api/model/orderRefund.go @@ -0,0 +1,40 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// OrderRefund 订单-退款表 +type OrderRefund struct { + OrderRefundId int64 `gorm:"column:order_refund_id;type:bigint(19);primary_key;comment:主键id" json:"order_refund_id"` + OrderId int64 `gorm:"column:order_id;type:bigint(19);comment:订单id;NOT NULL" json:"order_id"` + PatientId int64 `gorm:"column:patient_id;type:bigint(19);comment:患者id" json:"patient_id"` + OrderNo string `gorm:"column:order_no;type:varchar(40);comment:系统订单编号" json:"order_no"` + RefundNo string `gorm:"column:refund_no;type:varchar(50);comment:系统退款编号;NOT NULL" json:"refund_no"` + RefundId string `gorm:"column:refund_id;type:varchar(50);comment:第三方退款单号" json:"refund_id"` + RefundStatus int `gorm:"column:refund_status;type:tinyint(1);default:0;comment:订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款)" json:"refund_status"` + RefundTotal float64 `gorm:"column:refund_total;type:decimal(10,2);default:0.00;comment:退款金额" json:"refund_total"` + RefundReason string `gorm:"column:refund_reason;type:varchar(255);comment:退款原因" json:"refund_reason"` + SuccessTime LocalTime `gorm:"column:success_time;type:datetime;comment:退款成功时间" json:"success_time"` + Model +} + +func (m *OrderRefund) TableName() string { + return "gdxz_order_refund" +} + +func (m *OrderRefund) BeforeCreate(tx *gorm.DB) error { + if m.OrderRefundId == 0 { + m.OrderRefundId = 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/service/OrderInquiry.go b/api/service/OrderInquiry.go index 5adf853..2057b1e 100644 --- a/api/service/OrderInquiry.go +++ b/api/service/OrderInquiry.go @@ -70,6 +70,11 @@ func (r *OrderInquiryService) CancelOrderInquiry(req requests.CancelOrderInquiry return false, errors.New("订单未支付,无需取消") } + // 检测问诊类型-服务包类型不允许取消 + if orderInquiry.InquiryMode == 8 || orderInquiry.InquiryMode == 9 { + return false, errors.New("服务包类型订单不允许退款") + } + // 检测退款金额 if req.RefundAmount > orderInquiry.PaymentAmountTotal { return false, errors.New("退款金额不可超过实付金额") @@ -100,14 +105,11 @@ func (r *OrderInquiryService) CancelOrderInquiry(req requests.CancelOrderInquiry } }() - // 问诊订单修改数据 - orderInquiryData := make(map[string]interface{}) - // 退款编号 - inquiryRefundNo := strconv.FormatInt(global.Snowflake.Generate().Int64(), 10) + refundNo := strconv.FormatInt(global.Snowflake.Generate().Int64(), 10) // 退款状态转换 - var inquiryRefundStatus int + var refundStatus int var successTime time.Time var refundId string @@ -116,7 +118,7 @@ func (r *OrderInquiryService) CancelOrderInquiry(req requests.CancelOrderInquiry refundRequest := weChat.RefundRequest{ TransactionId: orderInquiry.EscrowTradeNo, OutTradeNo: orderInquiry.InquiryNo, - OutRefundNo: inquiryRefundNo, + OutRefundNo: refundNo, Reason: "客服取消", RefundAmount: int64(req.RefundAmount * 100), PaymentAmountTotal: int64(orderInquiry.PaymentAmountTotal * 100), @@ -136,18 +138,18 @@ func (r *OrderInquiryService) CancelOrderInquiry(req requests.CancelOrderInquiry if *refund.Status == "SUCCESS" { // 退款成功 - inquiryRefundStatus = 3 + refundStatus = 3 if refund.SuccessTime != nil { successTime = *refund.SuccessTime } } else if *refund.Status == "CLOSED" { // 退款关闭 - inquiryRefundStatus = 5 + refundStatus = 5 } else if *refund.Status == "PROCESSING" { // 退款处理中 - inquiryRefundStatus = 2 + refundStatus = 2 } else if *refund.Status == "ABNORMAL" { // 退款异常 @@ -168,26 +170,40 @@ func (r *OrderInquiryService) CancelOrderInquiry(req requests.CancelOrderInquiry } else { // 支付金额为0,模拟退款 refundId = "模拟退款:" + strconv.FormatInt(global.Snowflake.Generate().Int64(), 10) - inquiryRefundStatus = 3 + refundStatus = 3 successTime = time.Now() // 模拟退款时手动退还优惠卷 if orderInquiry.CouponAmountTotal > 0 { - res := ReturnInquiryCoupon(tx, orderInquiry.OrderInquiryId) - if !res { + orderService := OrderService{} + res, err := orderService.ReturnOrderCoupon(orderInquiry.InquiryNo, tx) + if err != nil || !res { + // 退还优惠卷失败 tx.Rollback() - return false, errors.New("退还优惠卷失败") + return false, err } } } - orderInquiryData["inquiry_refund_status"] = inquiryRefundStatus + // 修改订单为取消 + orderData := make(map[string]interface{}) + orderData["cancel_status"] = 1 + orderData["cancel_time"] = time.Now().Format("2006-01-02 15:04:05") + orderData["cancel_remarks"] = req.CancelRemarks + + orderDao := dao.OrderDao{} + err = orderDao.EditOrderById(tx, orderInquiry.OrderId, orderData) + if err != nil { + tx.Rollback() + return false, errors.New("取消订单失败") + } + + // 修改问诊订单为取消 + orderInquiryData := make(map[string]interface{}) orderInquiryData["inquiry_status"] = 7 // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) orderInquiryData["cancel_time"] = time.Now().Format("2006-01-02 15:04:05") // 订单取消时间 orderInquiryData["cancel_reason"] = 4 // 取消订单原因(1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时) orderInquiryData["cancel_remarks"] = req.CancelRemarks // 取消订单备注(自动添加) - - // 修改问诊订单退款状态 err = orderInquiryDao.EditOrderInquiryById(tx, orderInquiryId, orderInquiryData) if err != nil { tx.Rollback() @@ -195,18 +211,45 @@ func (r *OrderInquiryService) CancelOrderInquiry(req requests.CancelOrderInquiry } // 新增退款表 + orderRefund := &model.OrderRefund{ + OrderId: orderInquiry.OrderId, + PatientId: orderInquiry.PatientId, + OrderNo: orderInquiry.InquiryNo, + RefundNo: refundNo, + RefundId: refundId, + RefundStatus: refundStatus, + RefundTotal: req.RefundAmount, + RefundReason: req.CancelRemarks, + } + + if refundStatus == 3 && !successTime.IsZero() { + orderRefund.SuccessTime = model.LocalTime(successTime) + } + + orderRefundDao := dao.OrderRefundDao{} + orderRefund, err = orderRefundDao.AddOrderRefund(tx, orderRefund) + if err != nil || orderRefund == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + // 新增问诊退款表 orderInquiryRefund := &model.OrderInquiryRefund{ PatientId: orderInquiry.PatientId, OrderInquiryId: orderInquiryId, InquiryNo: orderInquiry.InquiryNo, - InquiryRefundNo: inquiryRefundNo, + InquiryRefundNo: refundNo, RefundId: refundId, - InquiryRefundStatus: inquiryRefundStatus, + InquiryRefundStatus: refundStatus, RefundTotal: req.RefundAmount, RefundReason: req.CancelRemarks, SuccessTime: model.LocalTime(successTime), } + if refundStatus == 3 && !successTime.IsZero() { + orderRefund.SuccessTime = model.LocalTime(successTime) + } + orderInquiryRefundDao := dao.OrderInquiryRefundDao{} orderInquiryRefund, err = orderInquiryRefundDao.AddOrderInquiryRefund(tx, orderInquiryRefund) if err != nil || orderInquiryRefund == nil { diff --git a/api/service/order.go b/api/service/order.go index 358be81..5252cac 100644 --- a/api/service/order.go +++ b/api/service/order.go @@ -3,8 +3,10 @@ package service import ( "errors" "fmt" + "gorm.io/gorm" "hospital-admin-api/api/dao" "hospital-admin-api/api/model" + "hospital-admin-api/extend/aliyun" "hospital-admin-api/extend/prescription" "hospital-admin-api/global" "hospital-admin-api/utils" @@ -310,3 +312,145 @@ func (r *OrderService) ReportPreProduct(orderProductId, adminUserId int64) (bool return true, nil } + +// 发起订单退款-未完成 +func (r *OrderService) orderRefund(orderNo string, refundReason string) (bool, error) { + orderDao := dao.OrderDao{} + + // 获取订单数据 + maps := make(map[string]interface{}) + maps["order_no"] = orderNo + order, err := orderDao.GetOrder(maps) + if err != nil || order == nil { + return false, errors.New("订单数据错误") + } + + // 检测订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常) + if order.RefundStatus == 2 { + return false, errors.New("订单退款中") + } + + if order.RefundStatus == 3 { + return false, errors.New("订单已退款成功") + } + + if order.RefundStatus == 5 { + return false, errors.New("订单已退款关闭") + } + + // 检测支付状态 (1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + if order.PayStatus != 2 { + return false, errors.New("订单支付状态错误") + } + + return false, nil +} + +// PdfToImg 处理pdf转图片 +func (r *OrderService) PdfToImg() (bool, error) { + //orderPrescription := dao.OrderPrescriptionDao{} + orderPrescriptionFileDao := dao.OrderPrescriptionFileDao{} + + // 获取订单数据 + maps := make(map[string]interface{}) + orderPrescriptionFiles, err := orderPrescriptionFileDao.GetOrderPrescriptionFileList(maps) + if err != nil { + return false, errors.New("订单数据错误") + } + + for _, orderPrescriptionFile := range orderPrescriptionFiles { + if orderPrescriptionFile.PrescriptionPdfOssPath == "" { + continue + } + + if orderPrescriptionFile.IsConvertedPdf != 1 { + continue + } + + OrderPrescriptionId := fmt.Sprintf("%d", orderPrescriptionFile.OrderPrescriptionId) + + PrescriptionImgOssPath := strings.TrimLeft(orderPrescriptionFile.PrescriptionImgOssPath, "/") + + // 下载处方pdf到本地 + local, err := aliyun.GetObjectToLocal(PrescriptionImgOssPath, + "/Users/wucongxing/Desktop/work/go/hospital-admin-api/data/bak/"+OrderPrescriptionId+".jpg") + if err != nil || !local { + return false, err + } + + //pdfPath := "/Users/wucongxing/Desktop/work/go/hospital-admin-api/data/" + OrderPrescriptionId + ".pdf" + //outputDir := "/Users/wucongxing/Desktop/work/go/hospital-admin-api/data/img" + // + //if err := utils.ConvertPDFToImages(pdfPath, outputDir, OrderPrescriptionId+".jpg"); err != nil { + // return false, err + //} + // + //// 修改为已转换 + //// 开始事务 + //tx := global.Db.Begin() + //defer func() { + // if r := recover(); r != nil { + // tx.Rollback() + // } + //}() + // + //data := make(map[string]interface{}) + //data["is_converted_pdf"] = 1 + //err = orderPrescriptionFileDao.EditOrderPrescriptionFileById(tx, orderPrescriptionFile.PrescriptionFileId, data) + //if err != nil { + // tx.Rollback() + // return false, err + //} + // + //tx.Commit() + } + + return true, nil +} + +// ReturnOrderCoupon 退还用户优惠卷 +func (r *OrderService) ReturnOrderCoupon(orderNo string, tx *gorm.DB) (bool, error) { + orderCouponDao := dao.OrderCouponDao{} + userCouponDao := dao.UserCouponDao{} + + // 获取该订单全部优惠卷数据 + maps := make(map[string]interface{}) + maps["order_no"] = orderNo + orderCoupons, err := orderCouponDao.GetOrderCouponList(maps) + if err != nil { + return false, err + } + + // 无优惠卷数据 + if len(orderCoupons) == 0 { + return true, nil + } + + for _, coupon := range orderCoupons { + // 获取用户优惠卷数据 + userCoupon, err := userCouponDao.GetUserCouponById(coupon.UserCouponId) + if err != nil || userCoupon == nil { + // 无该优惠卷数据,无需处理 + continue + } + + // 恢复优惠卷 + userCouponData := make(map[string]interface{}) + + // 检测优惠卷过期时间。判断是否需要退还 + if userCoupon.ValidEndTime.Before(time.Now()) { + userCouponData["user_coupon_status"] = 3 + } else { + userCouponData["user_coupon_status"] = 0 + userCouponData["coupon_use_date"] = nil + } + + err = userCouponDao.EditUserCouponById(tx, userCoupon.UserCouponId, userCouponData) + if err != nil { + // 恢复优惠卷失败 + return false, errors.New("恢复优惠卷失败") + } + } + + return true, nil +} diff --git a/go.mod b/go.mod index c7f6e05..ee07b35 100644 --- a/go.mod +++ b/go.mod @@ -54,6 +54,7 @@ require ( github.com/facebookgo/stats v0.0.0-20151006221625-1b76add642e4 // indirect github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/gen2brain/go-fitz v1.23.7 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-sql-driver/mysql v1.7.1 // indirect github.com/goccy/go-json v0.10.2 // indirect diff --git a/go.sum b/go.sum index 26edb0a..fbe0c9c 100644 --- a/go.sum +++ b/go.sum @@ -151,6 +151,8 @@ github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gen2brain/go-fitz v1.23.7 h1:HPhzEVzmOINvCKqQgB/DwMzYh4ArIgy3tMwq1eJTcbg= +github.com/gen2brain/go-fitz v1.23.7/go.mod h1:HU04vc+RisUh/kvEd2pB0LAxmK1oyXdN4ftyshUr9rQ= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.0 h1:OjyFBKICoexlu99ctXNR2gg+c5pKrKMuyjgARg9qeY8= diff --git a/utils/compute.go b/utils/compute.go index 71dcfe8..1370d56 100644 --- a/utils/compute.go +++ b/utils/compute.go @@ -1,5 +1,13 @@ package utils +import ( + "fmt" + "github.com/gen2brain/go-fitz" + "image/jpeg" + "os" + "path/filepath" +) + // 一些计算 // ComputeIndividualIncomeTax 计算个人所得税 @@ -35,3 +43,43 @@ func ComputeIndividualIncomeTax(income float64) float64 { return incomeTax } + +// ConvertPDFToImages converts a PDF file to images and saves them in the specified output directory. +func ConvertPDFToImages(pdfPath string, outputDir string, filename string) error { + // Open the PDF file + doc, err := fitz.New(pdfPath) + if err != nil { + return fmt.Errorf("failed to open PDF file: %v", err) + } + defer doc.Close() + + // Ensure the output directory exists + if err := os.MkdirAll(outputDir, os.ModePerm); err != nil { + return fmt.Errorf("failed to create output directory: %v", err) + } + + // Iterate over each page in the PDF + for i := 0; i < doc.NumPage(); i++ { + // Render the page to an image + img, err := doc.Image(i) + if err != nil { + return fmt.Errorf("failed to render page %d: %v", i, err) + } + + // Create the output file + outputFile := filepath.Join(outputDir, filename) + file, err := os.Create(outputFile) + if err != nil { + return fmt.Errorf("failed to create output file: %v", err) + } + defer file.Close() + + // Encode the image as JPEG and save it to the file + opts := &jpeg.Options{Quality: 80} + if err := jpeg.Encode(file, img, opts); err != nil { + return fmt.Errorf("failed to encode image: %v", err) + } + } + + return nil +} From 931d2def985c6d591eadf950125fab4a8e649a24 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 21 May 2024 10:01:29 +0800 Subject: [PATCH 02/78] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E8=AE=A2=E5=8D=95=E7=9A=84=E9=80=80=E6=AC=BE=E9=87=91?= =?UTF-8?q?=E9=A2=9D=E5=85=A5=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/orderInquiry.go | 14 ++++++++++---- api/requests/orderInquiry.go | 4 ++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/api/controller/orderInquiry.go b/api/controller/orderInquiry.go index 2053578..d898390 100644 --- a/api/controller/orderInquiry.go +++ b/api/controller/orderInquiry.go @@ -111,24 +111,30 @@ func (r *OrderInquiry) CancelOrderInquiry(c *gin.Context) { return } - req := requests.OrderInquiryRequest{} - if err := c.ShouldBind(&req.CancelOrderInquiry); err != nil { + orderInquiryRequest := requests.OrderInquiryRequest{} + req := orderInquiryRequest.CancelOrderInquiry + if err := c.ShouldBind(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 - if err := global.Validate.Struct(req.CancelOrderInquiry); err != nil { + if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } + if req.RefundAmount == nil { + responses.FailWithMessage("退款金额不可为空", c) + return + } + // 后台用户id adminUserId := c.GetInt64("UserId") // 业务处理 orderInquiryService := service.OrderInquiryService{} - _, err = orderInquiryService.CancelOrderInquiry(req.CancelOrderInquiry, orderInquiryId, adminUserId) + _, err = orderInquiryService.CancelOrderInquiry(req, orderInquiryId, adminUserId) if err != nil { responses.FailWithMessage(err.Error(), c) return diff --git a/api/requests/orderInquiry.go b/api/requests/orderInquiry.go index 8419ded..30c8c95 100644 --- a/api/requests/orderInquiry.go +++ b/api/requests/orderInquiry.go @@ -36,8 +36,8 @@ type GetOrderInquiryPage struct { // CancelOrderInquiry 取消问诊订单 type CancelOrderInquiry struct { - RefundAmount float64 `json:"refund_amount" form:"refund_amount" validate:"required" label:"退款金额"` - CancelRemarks string `json:"cancel_remarks" form:"cancel_remarks" validate:"required" label:"取消订单备注"` + RefundAmount *float64 `json:"refund_amount" form:"refund_amount" label:"退款金额"` + CancelRemarks string `json:"cancel_remarks" form:"cancel_remarks" validate:"required" label:"取消订单备注"` } // GetOrderInquiryRecordPage 获取问诊记录列表-分页 From e19316cfc3983e80df03d13a0a4f8cf5520e6935 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 21 May 2024 10:49:42 +0800 Subject: [PATCH 03/78] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E8=8D=AF?= =?UTF-8?q?=E5=93=81=E8=AE=A2=E5=8D=95=E8=AF=A6=E6=83=85=E7=9A=84=E4=BC=98?= =?UTF-8?q?=E6=83=A0=E5=8D=B7=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dao/orderProductCoupon.go | 82 +++++++++++++++++++++++++++++++++ api/dto/OrderProduct.go | 11 +++++ api/dto/OrderProductCoupon.go | 52 +++++++++++++++++++++ api/model/orderProductCoupon.go | 35 ++++++++++++++ api/service/OrderInquiry.go | 8 ++-- api/service/orderProduct.go | 7 +++ 6 files changed, 191 insertions(+), 4 deletions(-) create mode 100644 api/dao/orderProductCoupon.go create mode 100644 api/dto/OrderProductCoupon.go create mode 100644 api/model/orderProductCoupon.go diff --git a/api/dao/orderProductCoupon.go b/api/dao/orderProductCoupon.go new file mode 100644 index 0000000..9db0efb --- /dev/null +++ b/api/dao/orderProductCoupon.go @@ -0,0 +1,82 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type OrderProductCouponDao struct { +} + +// GetOrderProductCouponById 获取药品订单优惠卷数据-药品订单优惠卷id +func (r *OrderProductCouponDao) GetOrderProductCouponById(orderCouponId int64) (m *model.OrderProductCoupon, err error) { + err = global.Db.First(&m, orderCouponId).Error + if err != nil { + return nil, err + } + return m, nil +} + +func (r *OrderProductCouponDao) GetOrderProductCouponByOrderProductId(orderProductId int64) (m *model. + OrderProductCoupon, err error) { + err = global.Db.Where("order_product_id = ?", orderProductId).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderProductCouponPreloadById 获取药品订单优惠卷数据-加载全部关联-药品订单优惠卷id +func (r *OrderProductCouponDao) GetOrderProductCouponPreloadById(orderCouponId int64) (m *model.OrderProductCoupon, err error) { + err = global.Db.Preload(clause.Associations).First(&m, orderCouponId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteOrderProductCoupon 删除药品订单优惠卷 +func (r *OrderProductCouponDao) DeleteOrderProductCoupon(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.OrderProductCoupon{}).Error + if err != nil { + return err + } + return nil +} + +// EditOrderProductCoupon 修改药品订单优惠卷 +func (r *OrderProductCouponDao) EditOrderProductCoupon(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.OrderProductCoupon{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditOrderProductCouponById 修改药品订单优惠卷-药品订单优惠卷id +func (r *OrderProductCouponDao) EditOrderProductCouponById(tx *gorm.DB, orderCouponId int64, data interface{}) error { + err := tx.Model(&model.OrderProductCoupon{}).Where("order_coupon_id = ?", orderCouponId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetOrderProductCouponList 获取药品订单优惠卷列表 +func (r *OrderProductCouponDao) GetOrderProductCouponList(maps interface{}) (m []*model.OrderProductCoupon, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddOrderProductCoupon 新增药品订单优惠卷 +func (r *OrderProductCouponDao) AddOrderProductCoupon(tx *gorm.DB, model *model.OrderProductCoupon) (*model.OrderProductCoupon, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} diff --git a/api/dto/OrderProduct.go b/api/dto/OrderProduct.go index 125b7b0..313f297 100644 --- a/api/dto/OrderProduct.go +++ b/api/dto/OrderProduct.go @@ -57,6 +57,7 @@ type OrderProductDto struct { UserDoctor *UserDoctorDto `json:"user_doctor"` // 医生数据 OrderPrescription *OrderPrescriptionDto `json:"order_prescription"` // 处方数据 OrderInquiryCase *OrderInquiryCaseDto `json:"order_inquiry_case"` // 问诊病例 + OrderProductCoupon *OrderProductCouponDto `json:"order_product_coupon"` // 优惠卷 } // OrderProductConsigneeDto 药品订单收货人数据 @@ -263,3 +264,13 @@ func (r *OrderProductDto) LoadOrderProductRefund(m *model.OrderProductRefund) *O } return r } + +// LoadOrderProductCoupon 加载药品订单优惠卷数据 +func (r *OrderProductDto) LoadOrderProductCoupon(m *model.OrderProductCoupon) *OrderProductDto { + if m != nil { + d := GetOrderProductCouponDto(m) + + r.OrderProductCoupon = d + } + return r +} diff --git a/api/dto/OrderProductCoupon.go b/api/dto/OrderProductCoupon.go new file mode 100644 index 0000000..dd54eef --- /dev/null +++ b/api/dto/OrderProductCoupon.go @@ -0,0 +1,52 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +type OrderProductCouponDto struct { + OrderCouponId string `json:"order_coupon_id"` // 主键id + OrderProductId string `json:"order_product_id"` // 订单-商品id + UserCouponId string `json:"user_coupon_id"` // 用户优惠卷表id + CouponName string `json:"coupon_name"` // 优惠卷名称 + CouponUsePrice float64 `json:"coupon_use_price"` // 优惠卷使用金额 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 +} + +func GetOrderProductCouponDto(m *model.OrderProductCoupon) *OrderProductCouponDto { + return &OrderProductCouponDto{ + OrderCouponId: fmt.Sprintf("%d", m.OrderCouponId), + OrderProductId: fmt.Sprintf("%d", m.OrderProductId), + UserCouponId: fmt.Sprintf("%d", m.UserCouponId), + CouponName: m.CouponName, + CouponUsePrice: m.CouponUsePrice, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +func GetOrderProductCouponListDto(m []*model.OrderProductCoupon) []OrderProductCouponDto { + // 处理返回值 + responses := make([]OrderProductCouponDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := OrderProductCouponDto{ + OrderCouponId: fmt.Sprintf("%d", v.OrderCouponId), + OrderProductId: fmt.Sprintf("%d", v.OrderProductId), + UserCouponId: fmt.Sprintf("%d", v.UserCouponId), + CouponName: v.CouponName, + CouponUsePrice: v.CouponUsePrice, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} diff --git a/api/model/orderProductCoupon.go b/api/model/orderProductCoupon.go new file mode 100644 index 0000000..2396132 --- /dev/null +++ b/api/model/orderProductCoupon.go @@ -0,0 +1,35 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// OrderProductCoupon 订单-商品-优惠卷表 +type OrderProductCoupon struct { + OrderCouponId int64 `gorm:"column:order_coupon_id;type:bigint(19);primary_key;comment:主键id" json:"order_coupon_id"` + OrderProductId int64 `gorm:"column:order_product_id;type:bigint(19);comment:订单-商品id" json:"order_product_id"` + UserCouponId int64 `gorm:"column:user_coupon_id;type:bigint(19);comment:用户优惠卷表id" json:"user_coupon_id"` + CouponName string `gorm:"column:coupon_name;type:varchar(255);comment:优惠卷名称" json:"coupon_name"` + CouponUsePrice float64 `gorm:"column:coupon_use_price;type:decimal(10,2);default:0.00;comment:优惠卷使用金额" json:"coupon_use_price"` + Model +} + +func (m *OrderProductCoupon) TableName() string { + return "gdxz_order_product_coupon" +} + +func (m *OrderProductCoupon) BeforeCreate(tx *gorm.DB) error { + if m.OrderCouponId == 0 { + m.OrderCouponId = 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/service/OrderInquiry.go b/api/service/OrderInquiry.go index 2057b1e..b57d500 100644 --- a/api/service/OrderInquiry.go +++ b/api/service/OrderInquiry.go @@ -76,7 +76,7 @@ func (r *OrderInquiryService) CancelOrderInquiry(req requests.CancelOrderInquiry } // 检测退款金额 - if req.RefundAmount > orderInquiry.PaymentAmountTotal { + if *req.RefundAmount > orderInquiry.PaymentAmountTotal { return false, errors.New("退款金额不可超过实付金额") } @@ -120,7 +120,7 @@ func (r *OrderInquiryService) CancelOrderInquiry(req requests.CancelOrderInquiry OutTradeNo: orderInquiry.InquiryNo, OutRefundNo: refundNo, Reason: "客服取消", - RefundAmount: int64(req.RefundAmount * 100), + RefundAmount: int64(*req.RefundAmount * 100), PaymentAmountTotal: int64(orderInquiry.PaymentAmountTotal * 100), NotifyUrl: config.C.Wechat.RefundNotifyDomain + config.C.Wechat.PatientInquiryRefundNotifyUrl, } @@ -218,7 +218,7 @@ func (r *OrderInquiryService) CancelOrderInquiry(req requests.CancelOrderInquiry RefundNo: refundNo, RefundId: refundId, RefundStatus: refundStatus, - RefundTotal: req.RefundAmount, + RefundTotal: *req.RefundAmount, RefundReason: req.CancelRemarks, } @@ -241,7 +241,7 @@ func (r *OrderInquiryService) CancelOrderInquiry(req requests.CancelOrderInquiry InquiryRefundNo: refundNo, RefundId: refundId, InquiryRefundStatus: refundStatus, - RefundTotal: req.RefundAmount, + RefundTotal: *req.RefundAmount, RefundReason: req.CancelRemarks, SuccessTime: model.LocalTime(successTime), } diff --git a/api/service/orderProduct.go b/api/service/orderProduct.go index bc4c160..5783684 100644 --- a/api/service/orderProduct.go +++ b/api/service/orderProduct.go @@ -58,6 +58,10 @@ func (r *OrderProductService) GetOrderProduct(orderProductId int64) (g *dto.Orde return nil, errors.New(err.Error()) } + // 获取药品订单优惠卷 + orderProductCouponDao := dao.OrderProductCouponDao{} + orderProductCoupon, err := orderProductCouponDao.GetOrderProductCouponByOrderProductId(orderProduct.OrderProductId) + // 处理返回值 g = dto.GetOrderProductDto(orderProduct) @@ -79,6 +83,9 @@ func (r *OrderProductService) GetOrderProduct(orderProductId int64) (g *dto.Orde // 加载退款数据 g.LoadOrderProductRefund(orderProductRefund) + // 加载药品订单优惠卷数据 + g.LoadOrderProductCoupon(orderProductCoupon) + return g, nil } From d76dbd104568981b472b3cc579ee1069992885d3 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 21 May 2024 10:56:18 +0800 Subject: [PATCH 04/78] =?UTF-8?q?=E9=97=AE=E8=AF=8A=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/export.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/service/export.go b/api/service/export.go index 101992a..61cd5f5 100644 --- a/api/service/export.go +++ b/api/service/export.go @@ -1356,7 +1356,7 @@ func (r *ExportService) OrderInquiry(d []*model.OrderInquiry) (string, error) { for _, v := range d { data := OrderInquiryForAccount{ InquiryNo: v.InquiryNo, - DoctorName: v.PatientName, + DoctorName: "", PatientName: v.PatientName, PatientAge: fmt.Sprintf("%d", v.PatientAge), EscrowTradeNo: v.EscrowTradeNo, From ebdc4142c329a34d343778fce696411cd89b4aba Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 21 May 2024 10:58:57 +0800 Subject: [PATCH 05/78] =?UTF-8?q?=E9=97=AE=E8=AF=8A=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E4=BF=AE=E6=94=B91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/export.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/service/export.go b/api/service/export.go index 61cd5f5..a7fa1c8 100644 --- a/api/service/export.go +++ b/api/service/export.go @@ -1335,8 +1335,8 @@ func (r *ExportService) OrderInquiry(d []*model.OrderInquiry) (string, error) { {Value: "优惠卷总金额", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18}, {Value: "实际付款金额", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18}, {Value: "医生收益", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18}, - {Value: "支付时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, - {Value: "接诊时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, + {Value: "支付时间", CellType: "string", NumberFmt: "", ColWidth: 30}, + {Value: "接诊时间", CellType: "string", NumberFmt: "string", ColWidth: 30}, {Value: "订单完成时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, {Value: "订单结束时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, {Value: "订单统计状态", CellType: "string", NumberFmt: "", ColWidth: 18}, From deb9a25f97022209deaaf97a12c0c23f6a71760d Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 21 May 2024 11:27:34 +0800 Subject: [PATCH 06/78] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=8D=AF=E5=93=81?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=88=97=E8=A1=A8-=E5=88=86=E9=A1=B51?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dao/orderProduct.go | 23 +++++++++++++++++++++++ api/requests/orderProduct.go | 2 ++ api/service/export.go | 4 ++-- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/api/dao/orderProduct.go b/api/dao/orderProduct.go index a79f693..e72d137 100644 --- a/api/dao/orderProduct.go +++ b/api/dao/orderProduct.go @@ -130,6 +130,29 @@ func (r *OrderProductDao) GetOrderProductPageSearch(req requests.GetOrderProduct query = query.Where(gorm.Expr("order_inquiry_id IN (?)", subQuery)) } + // 药品名称 + if req.ProductName != "" { + subQuery := global.Db.Model(&model.OrderProductItem{}). + Select("order_product_id"). + Where("product_name LIKE ?", "%"+req.ProductName+"%") + + query = query.Where(gorm.Expr("order_product_id IN (?)", subQuery)) + } + + // 药品通用名 + if req.CommonName != "" { + // 患者 + productSubQuery := global.Db.Model(&model.Product{}). + Select("product_id"). + Where("common_name LIKE ?", "%"+req.CommonName+"%") + + subQuery := global.Db.Model(&model.OrderProductItem{}). + Select("order_product_id"). + Where(gorm.Expr("product_id IN (?)", productSubQuery)) + + query = query.Where("order_product_id IN (?)", subQuery) + } + // 订单编号 if req.OrderProductNo != "" { query = query.Where("order_product_no = ?", req.OrderProductNo) diff --git a/api/requests/orderProduct.go b/api/requests/orderProduct.go index b34a675..272fb75 100644 --- a/api/requests/orderProduct.go +++ b/api/requests/orderProduct.go @@ -31,6 +31,8 @@ type GetOrderProductPage struct { ConsigneeTel string `json:"consignee_tel" form:"cancel_reason" label:"收货人电话"` PatientName string `json:"patient_name" form:"patient_name" label:"患者姓名-就诊人"` Mobile string `json:"mobile" form:"mobile" label:"手机号-医生/患者"` + ProductName string `json:"product_name" form:"product_name" label:"药品名称"` + CommonName string `json:"common_name" form:"common_name" label:"药品通用名"` } // CancelOrderProduct 取消药品订单 diff --git a/api/service/export.go b/api/service/export.go index a7fa1c8..61cd5f5 100644 --- a/api/service/export.go +++ b/api/service/export.go @@ -1335,8 +1335,8 @@ func (r *ExportService) OrderInquiry(d []*model.OrderInquiry) (string, error) { {Value: "优惠卷总金额", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18}, {Value: "实际付款金额", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18}, {Value: "医生收益", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18}, - {Value: "支付时间", CellType: "string", NumberFmt: "", ColWidth: 30}, - {Value: "接诊时间", CellType: "string", NumberFmt: "string", ColWidth: 30}, + {Value: "支付时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, + {Value: "接诊时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, {Value: "订单完成时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, {Value: "订单结束时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, {Value: "订单统计状态", CellType: "string", NumberFmt: "", ColWidth: 18}, From f1588a096e8822109040d1d8bc7c21c39e55f27d Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 21 May 2024 14:15:38 +0800 Subject: [PATCH 07/78] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E8=8D=AF=E5=93=81?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=88=97=E8=A1=A8-=E5=88=86=E9=A1=B5,?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=20=E8=8D=AF=E5=93=81=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dao/orderProduct.go | 3 ++ api/dto/OrderProduct.go | 29 +++++++++++- api/model/orderProduct.go | 91 +++++++++++++++++++------------------ api/service/orderProduct.go | 2 +- 4 files changed, 77 insertions(+), 48 deletions(-) diff --git a/api/dao/orderProduct.go b/api/dao/orderProduct.go index e72d137..91aeb9c 100644 --- a/api/dao/orderProduct.go +++ b/api/dao/orderProduct.go @@ -92,6 +92,9 @@ func (r *OrderProductDao) GetOrderProductPageSearch(req requests.GetOrderProduct // 构建查询条件 query := global.Db.Model(&model.OrderProduct{}) + // 药品数据 + query = query.Preload("OrderProductItem") + // 医生 query = query.Preload("UserDoctor", func(db *gorm.DB) *gorm.DB { return db.Omit("open_id", "union_id", "wx_session_key") diff --git a/api/dto/OrderProduct.go b/api/dto/OrderProduct.go index 313f297..e4e37b1 100644 --- a/api/dto/OrderProduct.go +++ b/api/dto/OrderProduct.go @@ -3,6 +3,7 @@ package dto import ( "fmt" "hospital-admin-api/api/model" + "strings" ) // OrderProductDto 订单详情 @@ -58,6 +59,7 @@ type OrderProductDto struct { OrderPrescription *OrderPrescriptionDto `json:"order_prescription"` // 处方数据 OrderInquiryCase *OrderInquiryCaseDto `json:"order_inquiry_case"` // 问诊病例 OrderProductCoupon *OrderProductCouponDto `json:"order_product_coupon"` // 优惠卷 + ProductName string `json:"product_name"` // 药品数据 } // OrderProductConsigneeDto 药品订单收货人数据 @@ -115,8 +117,8 @@ func GetOrderProductDto(m *model.OrderProduct) *OrderProductDto { } } -// GetOrderProductConsigneeDtoDto 药品订单收货人数据 -func GetOrderProductConsigneeDtoDto(m *model.OrderProduct) *OrderProductConsigneeDto { +// GetOrderProductConsigneeDto 药品订单收货人数据 +func GetOrderProductConsigneeDto(m *model.OrderProduct) *OrderProductConsigneeDto { return &OrderProductConsigneeDto{ ProvinceId: m.ProvinceId, Province: m.Province, @@ -181,6 +183,11 @@ func GetOrderProductListDto(m []*model.OrderProduct) []*OrderProductDto { response = response.LoadOrderPrescriptionCode(v.OrderPrescription) } + // 加载药品数据 + if v.OrderProductItem != nil { + response = response.LoadProductName(v.OrderProductItem) + } + // 将转换后的结构体添加到新切片中 responses[i] = response } @@ -274,3 +281,21 @@ func (r *OrderProductDto) LoadOrderProductCoupon(m *model.OrderProductCoupon) *O } return r } + +// LoadProductName 加载药品数据 +func (r *OrderProductDto) LoadProductName(m []*model.OrderProductItem) *OrderProductDto { + if len(m) > 0 { + var products []string + + for _, item := range m { + amount := fmt.Sprintf("%d", item.Amount) + productPrice := fmt.Sprintf("%.2f", item.ProductPrice) + + product := item.ProductName + "(N:" + amount + " " + "P:" + productPrice + ")" + products = append(products, product) + + r.ProductName = strings.Join(products, "; ") + } + } + return r +} diff --git a/api/model/orderProduct.go b/api/model/orderProduct.go index bbd63f9..f4d27c0 100644 --- a/api/model/orderProduct.go +++ b/api/model/orderProduct.go @@ -8,51 +8,52 @@ import ( // OrderProduct 订单-商品订单表 type OrderProduct struct { - OrderProductId int64 `gorm:"column:order_product_id;type:bigint(20);primary_key;comment:主键id" json:"order_product_id"` - OrderInquiryId int64 `gorm:"column:order_inquiry_id;type:bigint(19);comment:订单-问诊id;NOT NULL" json:"order_inquiry_id"` - OrderPrescriptionId int64 `gorm:"column:order_prescription_id;type:bigint(19);comment:订单-处方id;NOT NULL" json:"order_prescription_id"` - OrderId int64 `gorm:"column:order_id;type:bigint(19);comment:订单id" json:"order_id"` - DoctorId int64 `gorm:"column:doctor_id;type:bigint(19);comment:医生id" json:"doctor_id"` - PatientId int64 `gorm:"column:patient_id;type:bigint(19);comment:患者id" json:"patient_id"` - FamilyId int64 `gorm:"column:family_id;type:bigint(19);comment:家庭成员id(就诊用户)" json:"family_id"` - OrderProductNo string `gorm:"column:order_product_no;type:varchar(100);comment:订单编号" json:"order_product_no"` - EscrowTradeNo string `gorm:"column:escrow_trade_no;type:varchar(100);comment:第三方支付流水号" json:"escrow_trade_no"` - OrderProductStatus int `gorm:"column:order_product_status;type:tinyint(1);comment:订单状态(1:待支付 2:待发货 3:已发货 4:已签收 5:已取消)" json:"order_product_status"` - PayChannel int `gorm:"column:pay_channel;type:tinyint(1);comment:支付渠道(1:小程序支付 2:微信扫码支付);NOT NULL" json:"pay_channel"` - PayStatus int `gorm:"column:pay_status;type:tinyint(4);default:1;comment:支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)" json:"pay_status"` - IsDelete int `gorm:"column:is_delete;type:tinyint(1);default:0;comment:删除状态(0:否 1:是)" json:"is_delete"` - CancelReason int `gorm:"column:cancel_reason;type:tinyint(1);comment:订单取消原因(1:主动取消 2:复核失败/库存不足 3:支付超时 4:客服取消)" json:"cancel_reason"` - AmountTotal float64 `gorm:"column:amount_total;type:decimal(10,2);default:0.00;comment:订单金额" json:"amount_total"` - PaymentAmountTotal float64 `gorm:"column:payment_amount_total;type:decimal(10,2);default:0.00;comment:实际付款金额" json:"payment_amount_total"` - LogisticsFee float64 `gorm:"column:logistics_fee;type:decimal(10,2);default:0.00;comment:运费金额" json:"logistics_fee"` - LogisticsNo string `gorm:"column:logistics_no;type:varchar(100);comment:物流编号" json:"logistics_no"` - LogisticsCompanyCode string `gorm:"column:logistics_company_code;type:varchar(255);comment:快递公司编码" json:"logistics_company_code"` - SubLogisticsStatus int `gorm:"column:sub_logistics_status;type:tinyint(1);default:0;comment:快递推送订阅状态(0:未订阅/无需订阅 1:已订阅 2:订阅失败)" json:"sub_logistics_status"` - DeliveryTime LocalTime `gorm:"column:delivery_time;type:datetime;comment:发货时间" json:"delivery_time"` - PayTime LocalTime `gorm:"column:pay_time;type:datetime;comment:支付时间" json:"pay_time"` - Remarks string `gorm:"column:remarks;type:varchar(255);comment:订单备注" json:"remarks"` - RefundStatus int `gorm:"column:refund_status;type:tinyint(1);default:0;comment:商品订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常)" json:"refund_status"` - CancelTime LocalTime `gorm:"column:cancel_time;type:datetime;comment:订单取消时间" json:"cancel_time"` - CancelRemarks string `gorm:"column:cancel_remarks;type:varchar(255);comment:订单取消备注(自动添加)" json:"cancel_remarks"` - ReportPreStatus int `gorm:"column:report_pre_status;type:tinyint(1);default:0;comment:上报处方平台状态(0:未上报 1:已上报 2:上报失败))" json:"report_pre_status"` - ReportPreTime LocalTime `gorm:"column:report_pre_time;type:datetime;comment:上报处方平台时间" json:"report_pre_time"` - ReportPreFailReason string `gorm:"column:report_pre_fail_reason;type:text;comment:上报失败原因" json:"report_pre_fail_reason"` - ProvinceId int `gorm:"column:province_id;type:int(11);comment:省份id" json:"province_id"` - Province string `gorm:"column:province;type:varchar(40);comment:省份" json:"province"` - CityId int `gorm:"column:city_id;type:int(11);comment:城市id" json:"city_id"` - City string `gorm:"column:city;type:varchar(50);comment:城市" json:"city"` - CountyId int `gorm:"column:county_id;type:int(11);comment:区县id" json:"county_id"` - County string `gorm:"column:county;type:varchar(255);comment:区县" json:"county"` - Address string `gorm:"column:address;type:varchar(255);comment:详细地址" json:"address"` - AddressMask string `gorm:"column:address_mask;type:varchar(255);comment:详细地址(掩码)" json:"address_mask"` - ConsigneeName string `gorm:"column:consignee_name;type:varchar(150);comment:收货人姓名" json:"consignee_name"` - ConsigneeNameMask string `gorm:"column:consignee_name_mask;type:varchar(150);comment:收货人姓名(掩码)" json:"consignee_name_mask"` - ConsigneeTel string `gorm:"column:consignee_tel;type:varchar(50);comment:收货人电话" json:"consignee_tel"` - ConsigneeTelMask string `gorm:"column:consignee_tel_mask;type:varchar(50);comment:收货人电话(掩码)" json:"consignee_tel_mask"` - UserDoctor *UserDoctor `gorm:"foreignKey:DoctorId;references:doctor_id" json:"user_doctor"` // 医生 - OrderInquiry *OrderInquiry `gorm:"foreignKey:OrderInquiryId;references:order_inquiry_id" json:"order_inquiry"` // 问诊 - UserPatient *UserPatient `gorm:"foreignKey:PatientId;references:patient_id" json:"user_patient"` // 患者 - OrderPrescription *OrderPrescription `gorm:"foreignKey:OrderPrescriptionId;references:order_prescription_id" json:"order_prescription"` // 处方 + OrderProductId int64 `gorm:"column:order_product_id;type:bigint(20);primary_key;comment:主键id" json:"order_product_id"` + OrderInquiryId int64 `gorm:"column:order_inquiry_id;type:bigint(19);comment:订单-问诊id;NOT NULL" json:"order_inquiry_id"` + OrderPrescriptionId int64 `gorm:"column:order_prescription_id;type:bigint(19);comment:订单-处方id;NOT NULL" json:"order_prescription_id"` + OrderId int64 `gorm:"column:order_id;type:bigint(19);comment:订单id" json:"order_id"` + DoctorId int64 `gorm:"column:doctor_id;type:bigint(19);comment:医生id" json:"doctor_id"` + PatientId int64 `gorm:"column:patient_id;type:bigint(19);comment:患者id" json:"patient_id"` + FamilyId int64 `gorm:"column:family_id;type:bigint(19);comment:家庭成员id(就诊用户)" json:"family_id"` + OrderProductNo string `gorm:"column:order_product_no;type:varchar(100);comment:订单编号" json:"order_product_no"` + EscrowTradeNo string `gorm:"column:escrow_trade_no;type:varchar(100);comment:第三方支付流水号" json:"escrow_trade_no"` + OrderProductStatus int `gorm:"column:order_product_status;type:tinyint(1);comment:订单状态(1:待支付 2:待发货 3:已发货 4:已签收 5:已取消)" json:"order_product_status"` + PayChannel int `gorm:"column:pay_channel;type:tinyint(1);comment:支付渠道(1:小程序支付 2:微信扫码支付);NOT NULL" json:"pay_channel"` + PayStatus int `gorm:"column:pay_status;type:tinyint(4);default:1;comment:支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)" json:"pay_status"` + IsDelete int `gorm:"column:is_delete;type:tinyint(1);default:0;comment:删除状态(0:否 1:是)" json:"is_delete"` + CancelReason int `gorm:"column:cancel_reason;type:tinyint(1);comment:订单取消原因(1:主动取消 2:复核失败/库存不足 3:支付超时 4:客服取消)" json:"cancel_reason"` + AmountTotal float64 `gorm:"column:amount_total;type:decimal(10,2);default:0.00;comment:订单金额" json:"amount_total"` + PaymentAmountTotal float64 `gorm:"column:payment_amount_total;type:decimal(10,2);default:0.00;comment:实际付款金额" json:"payment_amount_total"` + LogisticsFee float64 `gorm:"column:logistics_fee;type:decimal(10,2);default:0.00;comment:运费金额" json:"logistics_fee"` + LogisticsNo string `gorm:"column:logistics_no;type:varchar(100);comment:物流编号" json:"logistics_no"` + LogisticsCompanyCode string `gorm:"column:logistics_company_code;type:varchar(255);comment:快递公司编码" json:"logistics_company_code"` + SubLogisticsStatus int `gorm:"column:sub_logistics_status;type:tinyint(1);default:0;comment:快递推送订阅状态(0:未订阅/无需订阅 1:已订阅 2:订阅失败)" json:"sub_logistics_status"` + DeliveryTime LocalTime `gorm:"column:delivery_time;type:datetime;comment:发货时间" json:"delivery_time"` + PayTime LocalTime `gorm:"column:pay_time;type:datetime;comment:支付时间" json:"pay_time"` + Remarks string `gorm:"column:remarks;type:varchar(255);comment:订单备注" json:"remarks"` + RefundStatus int `gorm:"column:refund_status;type:tinyint(1);default:0;comment:商品订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常)" json:"refund_status"` + CancelTime LocalTime `gorm:"column:cancel_time;type:datetime;comment:订单取消时间" json:"cancel_time"` + CancelRemarks string `gorm:"column:cancel_remarks;type:varchar(255);comment:订单取消备注(自动添加)" json:"cancel_remarks"` + ReportPreStatus int `gorm:"column:report_pre_status;type:tinyint(1);default:0;comment:上报处方平台状态(0:未上报 1:已上报 2:上报失败))" json:"report_pre_status"` + ReportPreTime LocalTime `gorm:"column:report_pre_time;type:datetime;comment:上报处方平台时间" json:"report_pre_time"` + ReportPreFailReason string `gorm:"column:report_pre_fail_reason;type:text;comment:上报失败原因" json:"report_pre_fail_reason"` + ProvinceId int `gorm:"column:province_id;type:int(11);comment:省份id" json:"province_id"` + Province string `gorm:"column:province;type:varchar(40);comment:省份" json:"province"` + CityId int `gorm:"column:city_id;type:int(11);comment:城市id" json:"city_id"` + City string `gorm:"column:city;type:varchar(50);comment:城市" json:"city"` + CountyId int `gorm:"column:county_id;type:int(11);comment:区县id" json:"county_id"` + County string `gorm:"column:county;type:varchar(255);comment:区县" json:"county"` + Address string `gorm:"column:address;type:varchar(255);comment:详细地址" json:"address"` + AddressMask string `gorm:"column:address_mask;type:varchar(255);comment:详细地址(掩码)" json:"address_mask"` + ConsigneeName string `gorm:"column:consignee_name;type:varchar(150);comment:收货人姓名" json:"consignee_name"` + ConsigneeNameMask string `gorm:"column:consignee_name_mask;type:varchar(150);comment:收货人姓名(掩码)" json:"consignee_name_mask"` + ConsigneeTel string `gorm:"column:consignee_tel;type:varchar(50);comment:收货人电话" json:"consignee_tel"` + ConsigneeTelMask string `gorm:"column:consignee_tel_mask;type:varchar(50);comment:收货人电话(掩码)" json:"consignee_tel_mask"` + UserDoctor *UserDoctor `gorm:"foreignKey:DoctorId;references:doctor_id" json:"user_doctor"` // 医生 + OrderInquiry *OrderInquiry `gorm:"foreignKey:OrderInquiryId;references:order_inquiry_id" json:"order_inquiry"` // 问诊 + UserPatient *UserPatient `gorm:"foreignKey:PatientId;references:patient_id" json:"user_patient"` // 患者 + OrderPrescription *OrderPrescription `gorm:"foreignKey:OrderPrescriptionId;references:order_prescription_id" json:"order_prescription"` // 处方 + OrderProductItem []*OrderProductItem `gorm:"foreignKey:OrderProductId;references:order_product_id" json:"order_product_item"` // 处方 Model } diff --git a/api/service/orderProduct.go b/api/service/orderProduct.go index 5783684..f45ae63 100644 --- a/api/service/orderProduct.go +++ b/api/service/orderProduct.go @@ -286,7 +286,7 @@ func (r *OrderProductService) GetOrderProductConsignee(orderProductId int64) (*d } // 处理返回值 - u := dto.GetOrderProductConsigneeDtoDto(orderProduct) + u := dto.GetOrderProductConsigneeDto(orderProduct) return u, nil } From 747dd0c306fb63843e810f31651961d8fe3f38b0 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 21 May 2024 16:30:57 +0800 Subject: [PATCH 08/78] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E8=8D=AF=E5=93=81=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/export.go | 48 +++++++++++++++++ api/dao/product.go | 91 ++++++++++++++++++++++++++++++++ api/requests/product.go | 18 +++++++ api/router/router.go | 7 +++ api/service/export.go | 109 +++++++++++++++++++++++++++++++++++++++ utils/intToString.go | 38 ++++++++++++++ 6 files changed, 311 insertions(+) diff --git a/api/controller/export.go b/api/controller/export.go index 7153f0c..ec8f92e 100644 --- a/api/controller/export.go +++ b/api/controller/export.go @@ -546,3 +546,51 @@ func (r *Export) OrderPrescription(c *gin.Context) { responses.OkWithData(ossAddress, c) } + +// Product 系统药品 +func (r *Export) Product(c *gin.Context) { + productRequest := requests.ProductRequest{} + req := productRequest.ProductExportList + 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 + } + + // 获取数据 + productDao := dao.ProductDao{} + products, err := productDao.GetProductExportListSearch(req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 业务处理 + exportService := service.ExportService{} + ossAddress, err := exportService.Product(products) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 获取当前登陆用户id + userId := c.GetInt64("UserId") + if userId != 0 { + // 记录日志 + logExport := &model.LogExport{ + AdminUserId: userId, + ExportModule: "处方", + ExportFile: utils.RemoveOssDomain(ossAddress), + } + + logExportDao := dao.LogExportDao{} + _, _ = logExportDao.AddLogExportUnTransaction(logExport) + } + + responses.OkWithData(ossAddress, c) +} diff --git a/api/dao/product.go b/api/dao/product.go index f0523ac..0d5a775 100644 --- a/api/dao/product.go +++ b/api/dao/product.go @@ -1,11 +1,13 @@ package dao import ( + "errors" "gorm.io/gorm" "gorm.io/gorm/clause" "hospital-admin-api/api/model" "hospital-admin-api/api/requests" "hospital-admin-api/global" + "strings" ) type ProductDao struct { @@ -154,3 +156,92 @@ func (r *ProductDao) GetProductPageSearch(req requests.GetProductPage, page, pag } return m, totalRecords, nil } + +// GetProductExportListSearch 获取商品列表-导出 +func (r *ProductDao) GetProductExportListSearch(req requests.ProductExportList) (m []*model.Product, err error) { + // 构建查询条件 + 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.Type == 1 { + // 商品名称 + 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) + } + + // 商品状态 + if req.ProductStatus != nil { + query = query.Where("product_status = ?", req.ProductStatus) + } + + // 平台商品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+"%") + } + } + + // 当前选中数据 + if req.Type == 2 { + if req.Id == "" { + return nil, errors.New("未提供需导出数据编号") + } + + id := strings.Split(req.Id, ",") + query = query.Where("product_id IN (?)", id) + } + + // 排序 + query = query.Order("created_at desc") + + err = query.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 353c905..c3792d1 100644 --- a/api/requests/product.go +++ b/api/requests/product.go @@ -7,6 +7,7 @@ type ProductRequest struct { PutProduct // 修改商品 PutProductStatus // 修改商品状态(上/下架) GetPlatformProductList // 获取平台商品列表 + ProductExportList // 系统药品-导出 } // GetPlatformProductPage 获取平台商品列表-分页 @@ -89,3 +90,20 @@ type PutProduct struct { type PutProductStatus struct { ProductStatus *int `json:"product_status" form:"product_status" label:"商品状态" validate:"required,oneof=1 2"` // 商品状态(1:正常 2:下架) } + +// ProductExportList 系统药品-导出 +type ProductExportList struct { + Type int `json:"type" form:"type" label:"类型" validate:"required,oneof=1 2 3"` // 1:当前搜索数据 2:当前选择数据 3:全部数据 + Id string `json:"id" form:"id" label:"id"` // 选择数据的id,逗号分隔,当type为2时必填 + 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:"商品备注"` // 商品备注 + ProductStatus *int `json:"product_status" form:"product_status" label:"商品状态"` // 商品状态(1:正常 2:下架) +} diff --git a/api/router/router.go b/api/router/router.go index 57e7778..5ff3fd8 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -663,6 +663,13 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 处方 prescriptionGroup.POST("", api.Export.OrderPrescription) } + + // 药品 + productGroup := exportGroup.Group("/product") + { + // 系统药品 + productGroup.POST("", api.Export.Product) + } } // 商品管理 diff --git a/api/service/export.go b/api/service/export.go index 61cd5f5..01a29a7 100644 --- a/api/service/export.go +++ b/api/service/export.go @@ -308,6 +308,31 @@ type OrderPrescriptionData struct { CreatedAt time.Time // 创建时间 } +// ProductData 系统商品 +type ProductData struct { + ProductName string // 商品名称 + CommonName string // 商品通用名 + Stock string // 库存 + ProductStatus string // 商品状态(1:正常 2:下架) + IsDelete string // 是否删除(0:否 1:是) + PrescriptionNum string // 处方可开具的数量 + ProductPrice float64 // 商品价格 + MnemonicCode string // 商品助记码(首字母简拼) + ProductType string // 药品类型(0:未知 1:中成药 2:西药) + ProductPlatformCode string // 处方平台商品编码 + ProductPharmacyCode string // 第三方药店商品编码 + ProductSpec string // 商品规格 + LicenseNumber string // 批准文号 + Manufacturer string // 生产厂家 + SingleUnit string // 单次剂量(例:1次1包) + SingleUse string // 单次用法(例:口服) + PackagingUnit string // 基本包装单位(例:盒/瓶) + FrequencyUse string // 使用频率(例:1天3次) + AvailableDays float64 // 可用天数(3) + ProductRemarks string // 商品备注 + CreatedAt time.Time // 创建时间 +} + // DoctorWithdrawal 提现记录 func (r *ExportService) DoctorWithdrawal(doctorWithdrawals []*model.DoctorWithdrawal) (string, error) { header := []utils.HeaderCellData{ @@ -1748,3 +1773,87 @@ func (r *ExportService) OrderPrescription(d []*model.OrderPrescription) (string, ossPath = utils.AddOssDomain("/" + ossPath) return ossPath, nil } + +// Product 系统药品 +func (r *ExportService) Product(d []*model.Product) (string, error) { + header := []utils.HeaderCellData{ + {Value: "商品名称", CellType: "string", NumberFmt: "", ColWidth: 40}, + {Value: "商品通用名", CellType: "string", NumberFmt: "", ColWidth: 40}, + {Value: "库存", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "商品状态", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "是否删除", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "处方可开具的数量", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "商品价格", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18}, + {Value: "商品助记码(首字母简拼)", CellType: "string", NumberFmt: "", ColWidth: 30}, + {Value: "药品类型", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "处方平台商品编码", CellType: "string", NumberFmt: "", ColWidth: 30}, + {Value: "第三方药店商品编码", CellType: "string", NumberFmt: "", ColWidth: 30}, + {Value: "商品规格", CellType: "string", NumberFmt: "", ColWidth: 30}, + {Value: "批准文号", CellType: "string", NumberFmt: "", ColWidth: 30}, + {Value: "生产厂家", CellType: "string", NumberFmt: "", ColWidth: 40}, + {Value: "单次剂量(例:1次1包)", CellType: "string", NumberFmt: "", ColWidth: 30}, + {Value: "单次用法(例:口服)", CellType: "string", NumberFmt: "", ColWidth: 30}, + {Value: "基本包装单位(例:盒/瓶)", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "使用频率(例:1天3次)", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "可用天数(3)", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18}, + {Value: "商品备注", CellType: "string", NumberFmt: "", ColWidth: 40}, + {Value: "创建时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, + } + + var dataSlice []interface{} + for _, v := range d { + data := ProductData{ + ProductName: v.ProductName, + CommonName: v.CommonName, + Stock: "0", + ProductStatus: utils.IsProductStatusToString(v.ProductStatus), + IsDelete: utils.IsIsDeleteToString(v.IsDelete), + PrescriptionNum: fmt.Sprintf("%d", v.PrescriptionNum), + ProductPrice: v.ProductPrice, + MnemonicCode: v.MnemonicCode, + ProductType: utils.IsProductTypeToString(v.ProductType), + ProductPlatformCode: v.ProductPlatformCode, + ProductPharmacyCode: v.ProductPharmacyCode, + 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, + } + + if v.ProductPlatformAmount != nil { + data.Stock = strconv.Itoa(int(v.ProductPlatformAmount.Stock)) + } + + if v.CreatedAt != (model.LocalTime{}) { + t := time.Time(v.CreatedAt) + data.CreatedAt = t + } + + dataSlice = append(dataSlice, data) + } + + file, err := utils.Export(header, dataSlice) + if err != nil { + return "", err + } + + // 设置文件名字 + now := time.Now() + dateTimeString := now.Format("20060102150405") // 当前时间字符串 + rand.New(rand.NewSource(time.Now().UnixNano())) // 设置随机数 + ossPath := "admin/export/系统药品" + dateTimeString + fmt.Sprintf("%d", rand.Intn(9000)+1000) + ".xlsx" + + // 上传oss + _, err = aliyun.PutObjectByte(ossPath, file.Bytes()) + if err != nil { + return "", err + } + + ossPath = utils.AddOssDomain("/" + ossPath) + return ossPath, nil +} diff --git a/utils/intToString.go b/utils/intToString.go index 26f2a11..cdbb607 100644 --- a/utils/intToString.go +++ b/utils/intToString.go @@ -565,3 +565,41 @@ func IsAutoPharVerifyToString(i int) string { return "" } } + +// IsProductStatusToString 商品状态(1:正常 2:下架) +func IsProductStatusToString(i int) string { + switch i { + case 0: + return "下架" + case 1: + return "正常" + default: + return "" + } +} + +// IsIsDeleteToString 是否删除(0:否 1:是) +func IsIsDeleteToString(i int) string { + switch i { + case 0: + return "否" + case 1: + return "是" + default: + return "" + } +} + +// IsProductTypeToString 药品类型(0:未知 1:中成药 2:西药) +func IsProductTypeToString(i int) string { + switch i { + case 0: + return "未知" + case 1: + return "中成药" + case 2: + return "西药" + default: + return "" + } +} From 22e50153de7f6fd6d33d286be046162a43a10a0e Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 22 May 2024 11:39:24 +0800 Subject: [PATCH 09/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=B3=BB=E7=BB=9F=E5=95=86=E5=93=81=E5=88=97=E8=A1=A8?= =?UTF-8?q?-=E5=88=86=E9=A1=B5=20=E5=BA=93=E5=AD=98=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/product.go | 2 +- api/dao/product.go | 10 +++++++++- api/requests/product.go | 31 ++++++++++++++++++------------- api/router/router.go | 2 +- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/api/controller/product.go b/api/controller/product.go index 30f366c..3bb0b0b 100644 --- a/api/controller/product.go +++ b/api/controller/product.go @@ -89,7 +89,7 @@ func (r *Product) GetProductPlatform(c *gin.Context) { func (r *Product) GetProductPage(c *gin.Context) { productRequest := requests.ProductRequest{} req := productRequest.GetProductPage - if err := c.ShouldBind(&req); err != nil { + if err := c.ShouldBindJSON(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } diff --git a/api/dao/product.go b/api/dao/product.go index 0d5a775..b2af336 100644 --- a/api/dao/product.go +++ b/api/dao/product.go @@ -143,7 +143,15 @@ func (r *ProductDao) GetProductPageSearch(req requests.GetProductPage, page, pag } // 排序 - query = query.Order("created_at desc") + if req.Order != nil { + if req.Order.Stock != "" { + query = query.Joins("JOIN gdxz_product_platform_amount ON gdxz_product_platform_amount.product_platform_id = gdxz_product.product_platform_id"). + Order("gdxz_product_platform_amount.stock " + req.Order.Stock) + } + + } + + query = query.Order("gdxz_product.created_at desc") // 查询总数量 if err := query.Count(&totalRecords).Error; err != nil { diff --git a/api/requests/product.go b/api/requests/product.go index c3792d1..197aa9b 100644 --- a/api/requests/product.go +++ b/api/requests/product.go @@ -34,19 +34,24 @@ type GetPlatformProductList struct { // 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:"商品备注"` // 商品备注 - ProductStatus *int `json:"product_status" form:"product_status" label:"商品状态"` // 商品状态(1:正常 2:下架) + 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:"商品备注"` // 商品备注 + ProductStatus *int `json:"product_status" form:"product_status" label:"商品状态"` // 商品状态(1:正常 2:下架) + Order *GetProductPageOrder `json:"order" form:"order" label:"排序"` +} + +type GetProductPageOrder struct { + Stock string `json:"stock" form:"stock" label:"库存" validate:"oneof=desc asc"` } // AddProduct 新增商品 diff --git a/api/router/router.go b/api/router/router.go index 5ff3fd8..cc51171 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -676,7 +676,7 @@ func privateRouter(r *gin.Engine, api controller.Api) { productGroup := adminGroup.Group("/product") { // 获取系统商品列表-分页 - productGroup.GET("", api.Product.GetProductPage) + productGroup.POST("/page", api.Product.GetProductPage) // 系统商品详情 productGroup.GET("/:product_id", api.Product.GetProduct) From 626542394d6feefbf81725b87bacf61e93bff7ac Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 24 May 2024 10:20:17 +0800 Subject: [PATCH 10/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=9C=8D=E5=8A=A1=E5=8C=85=E8=AE=A2=E5=8D=95=E5=88=97?= =?UTF-8?q?=E8=A1=A8-=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/base.go | 7 +- api/controller/orderServicePackage.go | 58 ++++ api/dao/orderServicePackage.go | 293 ++++++++++++++++++ api/dto/OrderServicePackage.go | 158 ++++++++++ .../doctorConfigDifficultConsultation.go | 36 +++ api/model/doctorConfigFollowPackage.go | 34 ++ api/model/doctorConfigFollowPackageItem.go | 34 ++ api/model/doctorConfigHealthPackage.go | 34 ++ api/model/healthPackage.go | 36 +++ api/model/healthPackageProduct.go | 36 +++ api/model/orderServicePackage.go | 62 ++++ api/model/orderServicePackageCase.go | 51 +++ api/model/orderServicePackageDetail.go | 40 +++ api/model/orderServicePackageInquiry.go | 35 +++ api/model/orderServicePackageProduct.go | 37 +++ api/model/orderServicePackageRefund.go | 40 +++ api/requests/OrderServicePackage.go | 33 ++ api/router/router.go | 13 + 18 files changed, 1034 insertions(+), 3 deletions(-) create mode 100644 api/controller/orderServicePackage.go create mode 100644 api/dao/orderServicePackage.go create mode 100644 api/dto/OrderServicePackage.go create mode 100644 api/model/doctorConfigDifficultConsultation.go create mode 100644 api/model/doctorConfigFollowPackage.go create mode 100644 api/model/doctorConfigFollowPackageItem.go create mode 100644 api/model/doctorConfigHealthPackage.go create mode 100644 api/model/healthPackage.go create mode 100644 api/model/healthPackageProduct.go create mode 100644 api/model/orderServicePackage.go create mode 100644 api/model/orderServicePackageCase.go create mode 100644 api/model/orderServicePackageDetail.go create mode 100644 api/model/orderServicePackageInquiry.go create mode 100644 api/model/orderServicePackageProduct.go create mode 100644 api/model/orderServicePackageRefund.go create mode 100644 api/requests/OrderServicePackage.go diff --git a/api/controller/base.go b/api/controller/base.go index 43c0228..290330d 100644 --- a/api/controller/base.go +++ b/api/controller/base.go @@ -45,9 +45,10 @@ type basic struct { // 订单管理 type order struct { - Order // 订单 - OrderInquiry // 问诊订单 - OrderProduct // 药品订单 + Order // 订单 + OrderInquiry // 问诊订单 + OrderProduct // 药品订单 + OrderServicePackage // 服务包订单 } // 患者管理 diff --git a/api/controller/orderServicePackage.go b/api/controller/orderServicePackage.go new file mode 100644 index 0000000..e32c88f --- /dev/null +++ b/api/controller/orderServicePackage.go @@ -0,0 +1,58 @@ +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/global" + "hospital-admin-api/utils" +) + +type OrderServicePackage struct{} + +// GetOrderServicePackagePage 获取服务包订单列表-分页 +func (r *OrderServicePackage) GetOrderServicePackagePage(c *gin.Context) { + orderServicePackageRequest := requests.OrderServicePackageRequest{} + req := orderServicePackageRequest.GetOrderServicePackagePage + 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 + } + + orderServicePackageDao := dao.OrderServicePackageDao{} + orderServicePackage, total, err := orderServicePackageDao.GetOrderServicePackagePageSearch(req, req.Page, req.PageSize) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + GetOrderInquiryPageResponses := dto.GetOrderServicePackageListDto(orderServicePackage) + 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"] = GetOrderInquiryPageResponses + responses.OkWithData(result, c) +} diff --git a/api/dao/orderServicePackage.go b/api/dao/orderServicePackage.go new file mode 100644 index 0000000..a9aec68 --- /dev/null +++ b/api/dao/orderServicePackage.go @@ -0,0 +1,293 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" + "hospital-admin-api/global" + "strings" + "time" +) + +type OrderServicePackageDao struct { +} + +// GetOrderServicePackageById 获取数据-id +func (r *OrderServicePackageDao) GetOrderServicePackageById(orderServiceId int64) (m *model.OrderServicePackage, err error) { + err = global.Db.First(&m, orderServiceId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackagePreloadById 获取数据-加载全部关联-id +func (r *OrderServicePackageDao) GetOrderServicePackagePreloadById(orderServiceId int64) (m *model.OrderServicePackage, err error) { + err = global.Db.Preload(clause.Associations).First(&m, orderServiceId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackageByOrderProductId 获取数据-药品订单id +func (r *OrderServicePackageDao) GetOrderServicePackageByOrderProductId(orderId int64) (m *model.OrderServicePackage, err error) { + err = global.Db.Where("order_id = ?", orderId).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteOrderServicePackage 删除 +func (r *OrderServicePackageDao) DeleteOrderServicePackage(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.OrderServicePackage{}).Error + if err != nil { + return err + } + return nil +} + +// EditOrderServicePackage 修改 +func (r *OrderServicePackageDao) EditOrderServicePackage(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.OrderServicePackage{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditOrderServicePackageById 修改-药品订单id +func (r *OrderServicePackageDao) EditOrderServicePackageById(tx *gorm.DB, orderId int64, data interface{}) error { + err := tx.Model(&model.OrderServicePackage{}).Where("order_id = ?", orderId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetOrderServicePackageList 获取列表 +func (r *OrderServicePackageDao) GetOrderServicePackageList(maps interface{}) (m []*model.OrderServicePackage, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddOrderServicePackage 新增 +func (r *OrderServicePackageDao) AddOrderServicePackage(tx *gorm.DB, model *model.OrderServicePackage) (*model.OrderServicePackage, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} + +// GetOrderServicePackagePageSearch 获取问诊订单列表-分页 +func (r *OrderServicePackageDao) GetOrderServicePackagePageSearch(req requests.GetOrderServicePackagePage, page, pageSize int) (m []*model.OrderServicePackage, total int64, err error) { + var totalRecords int64 + + // 构建查询条件 + query := global.Db.Model(&model.OrderServicePackage{}) + + // 医生 + query = query.Preload("UserDoctor", func(db *gorm.DB) *gorm.DB { + return db.Omit("open_id", "union_id", "wx_session_key") + }) + + // 医生姓名 + if req.DoctorName != "" { + subQuery := global.Db.Model(&model.UserDoctor{}). + Select("doctor_id"). + Where("user_name LIKE ?", "%"+req.DoctorName+"%") + + query = query.Where(gorm.Expr("doctor_id IN (?)", subQuery)) + } + + // 用户 + query = query.Preload("User", func(db *gorm.DB) *gorm.DB { + return db.Select("user_id", "user_name", "mobile") + }) + + // 主键id + if req.OrderServiceId != "" { + query = query.Where("order_service_id = ?", req.OrderServiceId) + } + + // 订单id + if req.OrderId != "" { + query = query.Where("order_id = ?", req.OrderId) + } + + // 服务包类型 + if req.OrderServiceType != nil { + query = query.Where("order_service_type = ?", req.OrderServiceType) + } + + // 订单状态 + if req.OrderServiceStatus != nil { + query = query.Where("order_service_status = ?", req.OrderServiceStatus) + } + + // 删除状态 + if req.OrderServiceStatus != nil { + query = query.Where("order_service_status = ?", req.OrderServiceStatus) + } + + // 订单退款状态 + if req.RefundStatus != nil { + query = query.Where("refund_status = ?", req.RefundStatus) + } + + // 支付渠道 + if req.PayChannel != nil { + query = query.Where("pay_channel = ?", req.PayChannel) + } + + // 支付状态 + if req.PayStatus != nil { + query = query.Where("pay_status = ?", req.PayStatus) + } + + // 系统订单编号 + if req.OrderServiceNo != "" { + query = query.Where("order_service_no = ?", req.OrderServiceNo) + } + + // 第三方支付流水号 + if req.EscrowTradeNo != "" { + query = query.Where("escrow_trade_no = ?", req.EscrowTradeNo) + } + + // 支付时间 + if req.PayTime != "" { + payTime := strings.Split(req.PayTime, "&") + if len(payTime) == 2 { + startTime, _ := time.Parse("2006-01-02", payTime[0]) + endTime, _ := time.Parse("2006-01-02", payTime[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("pay_time BETWEEN ? AND ?", startTime, endTime) + } + } + + // 开始服务时间 + if req.StartTime != "" { + orderStartTime := strings.Split(req.StartTime, "&") + if len(orderStartTime) == 2 { + startTime, _ := time.Parse("2006-01-02", orderStartTime[0]) + endTime, _ := time.Parse("2006-01-02", orderStartTime[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("start_time BETWEEN ? AND ?", startTime, endTime) + } + } + + // 结束服务时间 + if req.FinishTime != "" { + finishTime := strings.Split(req.FinishTime, "&") + if len(finishTime) == 2 { + startTime, _ := time.Parse("2006-01-02", finishTime[0]) + endTime, _ := time.Parse("2006-01-02", finishTime[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("finish_time BETWEEN ? AND ?", startTime, endTime) + } + } + + // 订单取消时间 + if req.CancelTime != "" { + cancelTime := strings.Split(req.CancelTime, "&") + if len(cancelTime) == 2 { + startTime, _ := time.Parse("2006-01-02", cancelTime[0]) + endTime, _ := time.Parse("2006-01-02", cancelTime[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("cancel_time BETWEEN ? AND ?", startTime, endTime) + } + } + + // 取消订单原因 + if req.CancelReason != nil { + query = query.Where("cancel_reason = ?", req.CancelReason) + } + + // 取消订单备注 + if req.CancelRemarks != "" { + query = query.Where("cancel_remarks LIKE ?", "%"+req.CancelRemarks+"%") + } + + // 添加完成订单延迟队列状态 + if req.AddFinishStatus != nil { + query = query.Where("add_finish_status = ?", req.AddFinishStatus) + } + + // 添加完成订单延迟队列时间 + if req.AddFinishTime != "" { + addFinishTime := strings.Split(req.AddFinishTime, "&") + if len(addFinishTime) == 2 { + startTime, _ := time.Parse("2006-01-02", addFinishTime[0]) + endTime, _ := time.Parse("2006-01-02", addFinishTime[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("add_finish_time BETWEEN ? AND ?", startTime, endTime) + } + } + + // 创建时间 + if req.CreatedAt != "" { + createdAt := strings.Split(req.CreatedAt, "&") + if len(createdAt) == 2 { + startTime, _ := time.Parse("2006-01-02", createdAt[0]) + endTime, _ := time.Parse("2006-01-02", createdAt[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("created_at BETWEEN ? AND ?", startTime, endTime) + } + } + + // 患者姓名-就诊人 + if req.PatientName != "" { + query = query.Where("patient_name LIKE ?", "%"+req.PatientName+"%") + } + + // 手机号-医生/患者 + if req.Mobile != "" { + // 患者 + patientSubQuery := global.Db.Model(&model.User{}). + Select("user_id"). + Where("mobile = ?", req.Mobile) + + // 医生 + doctorUserSubQuery := global.Db.Model(&model.User{}). + Select("user_id"). + Where("mobile = ?", req.Mobile) + + doctorSubQuery := global.Db.Model(&model.UserDoctor{}). + Select("doctor_id"). + Where(gorm.Expr("user_id IN (?)", doctorUserSubQuery)) + + query = query.Where("user_id IN (?)", patientSubQuery).Or("doctor_id IN (?)", doctorSubQuery) + } + + // 排序 + 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/OrderServicePackage.go b/api/dto/OrderServicePackage.go new file mode 100644 index 0000000..5c18051 --- /dev/null +++ b/api/dto/OrderServicePackage.go @@ -0,0 +1,158 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +// OrderServicePackageDto 订单-服务包表 +type OrderServicePackageDto struct { + OrderServiceId string `json:"order_service_id"` // 主键id + OrderId string `json:"order_id"` // 订单id + UserId string `json:"user_id"` // 用户id-患者 + PatientId string `json:"patient_id"` // 患者id + DoctorId string `json:"doctor_id"` // 医生id + FamilyId string `json:"family_id"` // 家庭成员id(就诊用户) + OrderServiceType int `json:"order_service_type"` // 服务包类型(1:健康包 2:随访包) + OrderServiceStatus int `json:"order_service_status"` // 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) + IsDelete int `json:"is_delete"` // 删除状态(0:否 1:是) + RefundStatus int `json:"refund_status"` // 订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款) + PayChannel int `json:"pay_channel"` // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) + PayStatus int `json:"pay_status"` // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + OrderServiceNo string `json:"order_service_no"` // 系统订单编号 + EscrowTradeNo string `json:"escrow_trade_no"` // 第三方支付流水号 + AmountTotal float64 `json:"amount_total"` // 订单金额 + CouponAmountTotal float64 `json:"coupon_amount_total"` // 优惠卷总金额 + PaymentAmountTotal float64 `json:"payment_amount_total"` // 实际付款金额 + PayTime model.LocalTime `json:"pay_time"` // 支付时间 + StartTime model.LocalTime `json:"start_time"` // 开始服务时间 + FinishTime model.LocalTime `json:"finish_time"` // 结束服务时间 + CancelTime model.LocalTime `json:"cancel_time"` // 订单取消时间 + CancelReason int `json:"cancel_reason"` // 取消订单原因(1:医生未接受服务 2:主动取消 4:客服取消 5:支付超时) + CancelRemarks string `json:"cancel_remarks"` // 取消订单备注 + AddFinishStatus int `json:"add_finish_status"` // 添加完成订单延迟队列状态(0:未添加 1:已添加 2:添加失败) + AddFinishTime model.LocalTime `json:"add_finish_time"` // 添加完成订单延迟队列时间 + AddFinishFailReason string `json:"add_finish_fail_reason"` // 添加完成订单延迟队列失败原因 + PatientName string `json:"patient_name"` // 患者姓名-就诊人 + PatientNameMask string `json:"patient_name_mask"` // 患者姓名-就诊人(掩码) + PatientSex int `json:"patient_sex"` // 患者性别-就诊人(0:未知 1:男 2:女) + PatientAge int `json:"patient_age"` // 患者年龄-就诊人 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 更新时间 + DoctorName string `json:"doctor_name"` // 医生姓名 + UserName string `json:"user_name"` // 用户姓名(患者) +} + +// GetOrderServicePackageDto 服务包订单详情 +func GetOrderServicePackageDto(m *model.OrderServicePackage) *OrderServicePackageDto { + return &OrderServicePackageDto{ + OrderServiceId: fmt.Sprintf("%d", m.OrderServiceId), + OrderId: fmt.Sprintf("%d", m.OrderId), + UserId: fmt.Sprintf("%d", m.UserId), + PatientId: fmt.Sprintf("%d", m.PatientId), + DoctorId: fmt.Sprintf("%d", m.DoctorId), + FamilyId: fmt.Sprintf("%d", m.FamilyId), + OrderServiceType: m.OrderServiceType, + OrderServiceStatus: m.OrderServiceStatus, + IsDelete: m.IsDelete, + RefundStatus: m.RefundStatus, + PayChannel: m.PayChannel, + PayStatus: m.PayStatus, + OrderServiceNo: m.OrderServiceNo, + EscrowTradeNo: m.EscrowTradeNo, + AmountTotal: m.AmountTotal, + CouponAmountTotal: m.CouponAmountTotal, + PaymentAmountTotal: m.PaymentAmountTotal, + PayTime: m.PayTime, + StartTime: m.StartTime, + FinishTime: m.FinishTime, + CancelTime: m.CancelTime, + CancelReason: m.CancelReason, + CancelRemarks: m.CancelRemarks, + AddFinishStatus: m.AddFinishStatus, + AddFinishTime: m.AddFinishTime, + AddFinishFailReason: m.AddFinishFailReason, + PatientName: m.PatientName, + PatientNameMask: m.PatientNameMask, + PatientSex: m.PatientSex, + PatientAge: m.PatientAge, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +// GetOrderServicePackageListDto 服务包订单列表 +func GetOrderServicePackageListDto(m []*model.OrderServicePackage) []*OrderServicePackageDto { + // 处理返回值 + responses := make([]*OrderServicePackageDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &OrderServicePackageDto{ + OrderServiceId: fmt.Sprintf("%d", v.OrderServiceId), + OrderId: fmt.Sprintf("%d", v.OrderId), + UserId: fmt.Sprintf("%d", v.UserId), + PatientId: fmt.Sprintf("%d", v.PatientId), + DoctorId: fmt.Sprintf("%d", v.DoctorId), + FamilyId: fmt.Sprintf("%d", v.FamilyId), + OrderServiceType: v.OrderServiceType, + OrderServiceStatus: v.OrderServiceStatus, + IsDelete: v.IsDelete, + RefundStatus: v.RefundStatus, + PayChannel: v.PayChannel, + PayStatus: v.PayStatus, + OrderServiceNo: v.OrderServiceNo, + EscrowTradeNo: v.EscrowTradeNo, + AmountTotal: v.AmountTotal, + CouponAmountTotal: v.CouponAmountTotal, + PaymentAmountTotal: v.PaymentAmountTotal, + PayTime: v.PayTime, + StartTime: v.StartTime, + FinishTime: v.FinishTime, + CancelTime: v.CancelTime, + CancelReason: v.CancelReason, + CancelRemarks: v.CancelRemarks, + AddFinishStatus: v.AddFinishStatus, + AddFinishTime: v.AddFinishTime, + AddFinishFailReason: v.AddFinishFailReason, + PatientName: v.PatientName, + PatientNameMask: v.PatientNameMask, + PatientSex: v.PatientSex, + PatientAge: v.PatientAge, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 加载医生名称 + if v.UserDoctor != nil { + response = response.LoadDoctorName(v.UserDoctor) + } + + // 加载用户姓名(患者) + if v.User != nil { + response = response.LoadUserName(v.User) + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} + +// LoadDoctorName 加载医生名称 +func (r *OrderServicePackageDto) LoadDoctorName(m *model.UserDoctor) *OrderServicePackageDto { + if m != nil { + r.DoctorName = m.UserName + } + return r +} + +// LoadUserName 加载用户姓名(患者) +func (r *OrderServicePackageDto) LoadUserName(m *model.User) *OrderServicePackageDto { + if m != nil { + r.UserName = m.UserName + } + return r +} diff --git a/api/model/doctorConfigDifficultConsultation.go b/api/model/doctorConfigDifficultConsultation.go new file mode 100644 index 0000000..e0cdd48 --- /dev/null +++ b/api/model/doctorConfigDifficultConsultation.go @@ -0,0 +1,36 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// DoctorConfigDifficultConsultation 医生配置-疑难会诊 +type DoctorConfigDifficultConsultation struct { + DifficultConsultationId int64 `gorm:"column:difficult_consultation_id;type:bigint(19);primary_key;comment:主键id" json:"difficult_consultation_id"` + DoctorId int64 `gorm:"column:doctor_id;type:bigint(19);comment:医生id;NOT NULL" json:"doctor_id"` + ServiceContent string `gorm:"column:service_content;type:text;comment:服务内容" json:"service_content"` + ServiceProcess string `gorm:"column:service_process;type:text;comment:服务流程" json:"service_process"` + ServicePeriod uint `gorm:"column:service_period;type:int(10) unsigned;comment:服务周期;NOT NULL" json:"service_period"` + ServiceRounds uint `gorm:"column:service_rounds;type:int(1) unsigned;default:0;comment:服务回合数(0表示不限次)" json:"service_rounds"` + Model +} + +func (m *DoctorConfigDifficultConsultation) TableName() string { + return "gdxz_doctor_config_difficult_consultation" +} + +func (m *DoctorConfigDifficultConsultation) BeforeCreate(tx *gorm.DB) error { + if m.DifficultConsultationId == 0 { + m.DifficultConsultationId = 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/doctorConfigFollowPackage.go b/api/model/doctorConfigFollowPackage.go new file mode 100644 index 0000000..5ef5460 --- /dev/null +++ b/api/model/doctorConfigFollowPackage.go @@ -0,0 +1,34 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// DoctorConfigFollowPackage 医生配置-随访包 +type DoctorConfigFollowPackage struct { + FollowPackageId int64 `gorm:"column:follow_package_id;type:bigint(19);primary_key;comment:主键id" json:"follow_package_id"` + DoctorId int64 `gorm:"column:doctor_id;type:bigint(19);comment:医生id" json:"doctor_id"` + MonthlyFrequency int `gorm:"column:monthly_frequency;type:int(1);default:0;comment:每月次数(0表示不限次)" json:"monthly_frequency"` + ServiceRounds int `gorm:"column:service_rounds;type:int(1);default:0;comment:服务回合数(0表示不限次)" json:"service_rounds"` + Model +} + +func (m *DoctorConfigFollowPackage) TableName() string { + return "gdxz_doctor_config_follow_package" +} + +func (m *DoctorConfigFollowPackage) BeforeCreate(tx *gorm.DB) error { + if m.FollowPackageId == 0 { + m.FollowPackageId = 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/doctorConfigFollowPackageItem.go b/api/model/doctorConfigFollowPackageItem.go new file mode 100644 index 0000000..73f9ea4 --- /dev/null +++ b/api/model/doctorConfigFollowPackageItem.go @@ -0,0 +1,34 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// DoctorConfigFollowPackageItem 医生配置-随访包-明细 +type DoctorConfigFollowPackageItem struct { + FollowPackageItemId int64 `gorm:"column:follow_package_item_id;type:bigint(19);primary_key;comment:主键id" json:"follow_package_item_id"` + FollowPackageId int64 `gorm:"column:follow_package_id;type:bigint(19);comment:医生随访包id;NOT NULL" json:"follow_package_id"` + ServicePeriod int `gorm:"column:service_period;type:int(5);comment:服务周期(天)" json:"service_period"` + ServicePrice float64 `gorm:"column:service_price;type:decimal(10,2);comment:服务价格" json:"service_price"` + Model +} + +func (m *DoctorConfigFollowPackageItem) TableName() string { + return "gdxz_doctor_config_follow_package_item" +} + +func (m *DoctorConfigFollowPackageItem) BeforeCreate(tx *gorm.DB) error { + if m.FollowPackageItemId == 0 { + m.FollowPackageItemId = 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/doctorConfigHealthPackage.go b/api/model/doctorConfigHealthPackage.go new file mode 100644 index 0000000..015fac3 --- /dev/null +++ b/api/model/doctorConfigHealthPackage.go @@ -0,0 +1,34 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// DoctorConfigHealthPackage 医生配置-健康包 +type DoctorConfigHealthPackage struct { + HealthPackageId int64 `gorm:"column:health_package_id;type:bigint(19);primary_key;comment:主键id" json:"health_package_id"` + DoctorId int64 `gorm:"column:doctor_id;type:bigint(19);comment:医生id;NOT NULL" json:"doctor_id"` + PackageId int64 `gorm:"column:package_id;type:bigint(19);comment:健康包配置id;NOT NULL" json:"package_id"` + ServicePrice float64 `gorm:"column:service_price;type:decimal(10,2);comment:服务价格(根据图文问诊价格计算)" json:"service_price"` + Model +} + +func (m *DoctorConfigHealthPackage) TableName() string { + return "gdxz_doctor_config_health_package" +} + +func (m *DoctorConfigHealthPackage) BeforeCreate(tx *gorm.DB) error { + if m.HealthPackageId == 0 { + m.HealthPackageId = 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/healthPackage.go b/api/model/healthPackage.go new file mode 100644 index 0000000..cc8dc39 --- /dev/null +++ b/api/model/healthPackage.go @@ -0,0 +1,36 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// HealthPackage 健康包 +type HealthPackage struct { + PackageId int64 `gorm:"column:package_id;type:bigint(20);primary_key;comment:主键id" json:"package_id"` + ServiceCount int `gorm:"column:service_count;type:int(1);comment:总服务次数" json:"service_count"` + MonthlyFrequency int `gorm:"column:monthly_frequency;type:int(1);comment:每月次数" json:"monthly_frequency"` + EffectiveDays string `gorm:"column:effective_days;type:varchar(20);comment:服务有效天数" json:"effective_days"` + 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 +} + +func (m *HealthPackage) TableName() string { + return "gdxz_health_package" +} + +func (m *HealthPackage) BeforeCreate(tx *gorm.DB) error { + if m.PackageId == 0 { + m.PackageId = 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/healthPackageProduct.go b/api/model/healthPackageProduct.go new file mode 100644 index 0000000..08f7758 --- /dev/null +++ b/api/model/healthPackageProduct.go @@ -0,0 +1,36 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// HealthPackageProduct 健康包-关联商品 +type HealthPackageProduct struct { + PackageProductId int64 `gorm:"column:package_product_id;type:bigint(19);comment:主键id" json:"package_product_id"` + PackageId int64 `gorm:"column:package_id;type:bigint(19);comment:健康包id" json:"package_id"` + ProductId int64 `gorm:"column:product_id;type:bigint(19);primary_key;comment:商品id" json:"product_id"` + ProductName string `gorm:"column:product_name;type:varchar(255);comment:商品名称" json:"product_name"` + Quantity int `gorm:"column:quantity;type:int(1);default:1;comment:数量" json:"quantity"` + DiscountProductPrice float64 `gorm:"column:discount_product_price;type:decimal(10,2) unsigned;default:0.00;comment:折扣商品价格" json:"discount_product_price"` + Model +} + +func (m *HealthPackageProduct) TableName() string { + return "gdxz_health_package_product" +} + +func (m *HealthPackageProduct) BeforeCreate(tx *gorm.DB) error { + if m.PackageProductId == 0 { + m.PackageProductId = 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/orderServicePackage.go b/api/model/orderServicePackage.go new file mode 100644 index 0000000..a65af7d --- /dev/null +++ b/api/model/orderServicePackage.go @@ -0,0 +1,62 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// OrderServicePackage 订单-服务包表 +type OrderServicePackage struct { + OrderServiceId int64 `gorm:"column:order_service_id;type:bigint(19);primary_key;comment:主键id" json:"order_service_id"` + OrderId int64 `gorm:"column:order_id;type:bigint(19);comment:订单id;NOT NULL" json:"order_id"` + UserId int64 `gorm:"column:user_id;type:bigint(19);comment:用户id-患者;NOT NULL" json:"user_id"` + PatientId int64 `gorm:"column:patient_id;type:bigint(19);comment:患者id;NOT NULL" json:"patient_id"` + DoctorId int64 `gorm:"column:doctor_id;type:bigint(19);comment:医生id;NOT NULL" json:"doctor_id"` + FamilyId int64 `gorm:"column:family_id;type:bigint(19);comment:家庭成员id(就诊用户);NOT NULL" json:"family_id"` + OrderServiceType int `gorm:"column:order_service_type;type:tinyint(1);comment:服务包类型(1:健康包 2:随访包);NOT NULL" json:"order_service_type"` + OrderServiceStatus int `gorm:"column:order_service_status;type:tinyint(4);comment:订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消);NOT NULL" json:"order_service_status"` + IsDelete int `gorm:"column:is_delete;type:tinyint(1);default:0;comment:删除状态(0:否 1:是)" json:"is_delete"` + RefundStatus int `gorm:"column:refund_status;type:tinyint(1);default:0;comment:订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款);NOT NULL" json:"refund_status"` + PayChannel int `gorm:"column:pay_channel;type:tinyint(1);comment:支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付);NOT NULL" json:"pay_channel"` + PayStatus int `gorm:"column:pay_status;type:tinyint(1);default:1;comment:支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款);NOT NULL" json:"pay_status"` + OrderServiceNo string `gorm:"column:order_service_no;type:varchar(30);comment:系统订单编号;NOT NULL" json:"order_service_no"` + EscrowTradeNo string `gorm:"column:escrow_trade_no;type:varchar(100);comment:第三方支付流水号;NOT NULL" json:"escrow_trade_no"` + AmountTotal float64 `gorm:"column:amount_total;type:decimal(10,2);default:0.00;comment:订单金额" json:"amount_total"` + CouponAmountTotal float64 `gorm:"column:coupon_amount_total;type:decimal(10,2);default:0.00;comment:优惠卷总金额" json:"coupon_amount_total"` + PaymentAmountTotal float64 `gorm:"column:payment_amount_total;type:decimal(10,2);default:0.00;comment:实际付款金额" json:"payment_amount_total"` + PayTime LocalTime `gorm:"column:pay_time;type:datetime;comment:支付时间" json:"pay_time"` + StartTime LocalTime `gorm:"column:start_time;type:datetime;comment:开始服务时间" json:"start_time"` + FinishTime LocalTime `gorm:"column:finish_time;type:datetime;comment:结束服务时间" json:"finish_time"` + CancelTime LocalTime `gorm:"column:cancel_time;type:datetime;comment:订单取消时间" json:"cancel_time"` + CancelReason int `gorm:"column:cancel_reason;type:tinyint(1);comment:取消订单原因(1:医生未接受服务 2:主动取消 4:客服取消 5:支付超时)" json:"cancel_reason"` + CancelRemarks string `gorm:"column:cancel_remarks;type:varchar(255);comment:取消订单备注" json:"cancel_remarks"` + AddFinishStatus int `gorm:"column:add_finish_status;type:tinyint(1);default:0;comment:添加完成订单延迟队列状态(0:未添加 1:已添加 2:添加失败)" json:"add_finish_status"` + AddFinishTime LocalTime `gorm:"column:add_finish_time;type:datetime;comment:添加完成订单延迟队列时间" json:"add_finish_time"` + AddFinishFailReason string `gorm:"column:add_finish_fail_reason;type:varchar(255);comment:添加完成订单延迟队列失败原因" json:"add_finish_fail_reason"` + PatientName string `gorm:"column:patient_name;type:varchar(255);comment:患者姓名-就诊人" json:"patient_name"` + PatientNameMask string `gorm:"column:patient_name_mask;type:varchar(255);comment:患者姓名-就诊人(掩码)" json:"patient_name_mask"` + PatientSex int `gorm:"column:patient_sex;type:tinyint(1);default:0;comment:患者性别-就诊人(0:未知 1:男 2:女)" json:"patient_sex"` + PatientAge int `gorm:"column:patient_age;type:int(1);comment:患者年龄-就诊人" json:"patient_age"` + Model + UserDoctor *UserDoctor `gorm:"foreignKey:DoctorId;references:doctor_id" json:"user_doctor"` // 医生 + User *User `gorm:"foreignKey:UserId;references:user_id" json:"user"` // 患者 +} + +func (m *OrderServicePackage) TableName() string { + return "gdxz_order_service_package" +} + +func (m *OrderServicePackage) BeforeCreate(tx *gorm.DB) error { + if m.OrderServiceId == 0 { + m.OrderServiceId = 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/orderServicePackageCase.go b/api/model/orderServicePackageCase.go new file mode 100644 index 0000000..ae3aea4 --- /dev/null +++ b/api/model/orderServicePackageCase.go @@ -0,0 +1,51 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +type OrderServicePackageCase struct { + OrderServiceCaseId int64 `gorm:"column:order_service_case_id;type:bigint(19);primary_key;comment:主键id" json:"order_service_case_id"` + UserId int64 `gorm:"column:user_id;type:bigint(19);comment:用户id;NOT NULL" json:"user_id"` + PatientId int64 `gorm:"column:patient_id;type:bigint(19);comment:患者id;NOT NULL" json:"patient_id"` + OrderId int64 `gorm:"column:order_id;type:bigint(19);comment:订单id;NOT NULL" json:"order_id"` + OrderServiceId int64 `gorm:"column:order_service_id;type:bigint(19);comment:订单-服务包id;NOT NULL" json:"order_service_id"` + FamilyId int64 `gorm:"column:family_id;type:bigint(19);comment:家庭成员id;NOT NULL" json:"family_id"` + DiseaseClassId int64 `gorm:"column:disease_class_id;type:bigint(19);comment:疾病分类id-系统" json:"disease_class_id"` + Relation int `gorm:"column:relation;type:tinyint(1);comment:与患者关系(1:本人 2:父母 3:爱人 4:子女 5:亲戚 6:其他 )" json:"relation"` + Status int `gorm:"column:status;type:tinyint(1);default:1;comment:状态(1:正常 2:删除)" json:"status"` + Name string `gorm:"column:name;type:varchar(50);comment:患者名称" json:"name"` + Sex int `gorm:"column:sex;type:tinyint(1);default:0;comment:患者性别(0:未知 1:男 2:女)" json:"sex"` + Age int `gorm:"column:age;type:int(11);comment:患者年龄" json:"age"` + DiseaseClassName string `gorm:"column:disease_class_name;type:varchar(255);comment:疾病名称-系统" json:"disease_class_name"` + DiagnosisDate LocalTime `gorm:"column:diagnosis_date;type:datetime;comment:确诊日期" json:"diagnosis_date"` + DiseaseDesc string `gorm:"column:disease_desc;type:text;comment:病情描述(主诉)" json:"disease_desc"` + DiagnoseImages string `gorm:"column:diagnose_images;type:varchar(1000);comment:复诊凭证(多个使用逗号分隔)" json:"diagnose_images"` + IsAllergyHistory int `gorm:"column:is_allergy_history;type:tinyint(1);comment:是否存在过敏史(0:否 1:是)" json:"is_allergy_history"` + AllergyHistory string `gorm:"column:allergy_history;type:varchar(255);comment:过敏史描述" json:"allergy_history"` + IsFamilyHistory int `gorm:"column:is_family_history;type:tinyint(1);comment:是否存在家族病史(0:否 1:是)" json:"is_family_history"` + FamilyHistory string `gorm:"column:family_history;type:varchar(255);comment:家族病史描述" json:"family_history"` + IsPregnant int `gorm:"column:is_pregnant;type:tinyint(1);comment:是否备孕、妊娠、哺乳期(0:否 1:是)" json:"is_pregnant"` + Pregnant string `gorm:"column:pregnant;type:varchar(255);comment:备孕、妊娠、哺乳期描述" json:"pregnant"` + Model +} + +func (m *OrderServicePackageCase) TableName() string { + return "gdxz_order_service_package_case" +} + +func (m *OrderServicePackageCase) BeforeCreate(tx *gorm.DB) error { + if m.OrderServiceCaseId == 0 { + m.OrderServiceCaseId = 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/orderServicePackageDetail.go b/api/model/orderServicePackageDetail.go new file mode 100644 index 0000000..33f0d37 --- /dev/null +++ b/api/model/orderServicePackageDetail.go @@ -0,0 +1,40 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// OrderServicePackageDetail 订单-服务包详情表 +type OrderServicePackageDetail struct { + OrderServiceDetailId int64 `gorm:"column:order_service_detail_id;type:bigint(19);primary_key;comment:主键id" json:"order_service_detail_id"` + OrderServiceId int64 `gorm:"column:order_service_id;type:bigint(19);comment:服务包订单id" json:"order_service_id"` + OrderId int64 `gorm:"column:order_id;type:bigint(19);comment:订单id" json:"order_id"` + PackageId int64 `gorm:"column:package_id;type:bigint(19);comment:健康包配置id(随访包时为空)" json:"package_id"` + OrderServiceNo string `gorm:"column:order_service_no;type:varchar(30);comment:系统订单编号" json:"order_service_no"` + ServicePeriod int `gorm:"column:service_period;type:int(1);comment:服务周期(天)" json:"service_period"` + ServiceCount int `gorm:"column:service_count;type:int(1);comment:总服务次数(0表示不限次)" json:"service_count"` + MonthlyFrequency int `gorm:"column:monthly_frequency;type:int(1);comment:每月次数(0表示不限次)" json:"monthly_frequency"` + SingleInquiryPrice float64 `gorm:"column:single_inquiry_price;type:decimal(10,2);default:0.00;comment:单次图文问诊价格" json:"single_inquiry_price"` + ServicePrice float64 `gorm:"column:service_price;type:decimal(10,2);default:0.00;comment:总服务价格" json:"service_price"` + Model +} + +func (m *OrderServicePackageDetail) TableName() string { + return "gdxz_order_service_package_detail" +} + +func (m *OrderServicePackageDetail) BeforeCreate(tx *gorm.DB) error { + if m.OrderServiceDetailId == 0 { + m.OrderServiceDetailId = 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/orderServicePackageInquiry.go b/api/model/orderServicePackageInquiry.go new file mode 100644 index 0000000..808a3b8 --- /dev/null +++ b/api/model/orderServicePackageInquiry.go @@ -0,0 +1,35 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// OrderServicePackageInquiry 服务包关联问诊订单表 +type OrderServicePackageInquiry struct { + ServiceInquiryId int64 `gorm:"column:service_inquiry_id;type:bigint(19);primary_key;comment:主键id" json:"service_inquiry_id"` + OrderServiceId int64 `gorm:"column:order_service_id;type:bigint(19);comment:订单-服务包id;NOT NULL" json:"order_service_id"` + OrderInquiryId int64 `gorm:"column:order_inquiry_id;type:bigint(19);comment:订单-问诊id;NOT NULL" json:"order_inquiry_id"` + OrderServiceNo string `gorm:"column:order_service_no;type:varchar(30);comment:服务包系统订单编号" json:"order_service_no"` + InquiryNo string `gorm:"column:inquiry_no;type:varchar(30);comment:问诊系统订单编号" json:"inquiry_no"` + Model +} + +func (m *OrderServicePackageInquiry) TableName() string { + return "gdxz_order_service_package_inquiry" +} + +func (m *OrderServicePackageInquiry) BeforeCreate(tx *gorm.DB) error { + if m.ServiceInquiryId == 0 { + m.ServiceInquiryId = 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/orderServicePackageProduct.go b/api/model/orderServicePackageProduct.go new file mode 100644 index 0000000..8bbc8e6 --- /dev/null +++ b/api/model/orderServicePackageProduct.go @@ -0,0 +1,37 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// OrderServicePackageProduct 订单-服务包-关联商品订单表 +type OrderServicePackageProduct struct { + ServiceProductId int64 `gorm:"column:service_product_id;type:bigint(19);primary_key;comment:主键id" json:"service_product_id"` + OrderServiceId int64 `gorm:"column:order_service_id;type:bigint(19);comment:订单-服务包id;NOT NULL" json:"order_service_id"` + OrderProductId int64 `gorm:"column:order_product_id;type:bigint(19);comment:订单-商品id;NOT NULL" json:"order_product_id"` + OrderProductNo string `gorm:"column:order_product_no;type:varchar(100);comment:订单-商品系统编号;NOT NULL" json:"order_product_no"` + ProductItemId int64 `gorm:"column:product_item_id;type:bigint(19);comment:订单-商品明细id;NOT NULL" json:"product_item_id"` + ProductId int64 `gorm:"column:product_id;type:bigint(19);comment:商品id;NOT NULL" json:"product_id"` + UsedQuantity int `gorm:"column:used_quantity;type:int(1);default:0;comment:商品使用数量" json:"used_quantity"` + Model +} + +func (m *OrderServicePackageProduct) TableName() string { + return "gdxz_order_service_package_product" +} + +func (m *OrderServicePackageProduct) BeforeCreate(tx *gorm.DB) error { + if m.ServiceProductId == 0 { + m.ServiceProductId = 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/orderServicePackageRefund.go b/api/model/orderServicePackageRefund.go new file mode 100644 index 0000000..d6d6d43 --- /dev/null +++ b/api/model/orderServicePackageRefund.go @@ -0,0 +1,40 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// OrderServicePackageRefund 订单-服务包-退款表 +type OrderServicePackageRefund struct { + ServiceRefundId int64 `gorm:"column:service_refund_id;type:bigint(19);primary_key;comment:主键id" json:"service_refund_id"` + PatientId int64 `gorm:"column:patient_id;type:bigint(19);comment:患者id" json:"patient_id"` + OrderServiceId int64 `gorm:"column:order_service_id;type:bigint(19);comment:订单-服务包id" json:"order_service_id"` + OrderServiceNo string `gorm:"column:order_service_no;type:varchar(100);comment:系统订单编号" json:"order_service_no"` + ServiceRefundNo string `gorm:"column:service_refund_no;type:varchar(50);comment:系统退款编号" json:"service_refund_no"` + RefundId string `gorm:"column:refund_id;type:varchar(50);comment:第三方退款单号" json:"refund_id"` + RefundStatus int `gorm:"column:refund_status;type:tinyint(1);default:0;comment:订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款)" json:"refund_status"` + RefundTotal float64 `gorm:"column:refund_total;type:decimal(10,2);default:0.00;comment:退款金额" json:"refund_total"` + RefundReason string `gorm:"column:refund_reason;type:varchar(255);comment:退款原因" json:"refund_reason"` + SuccessTime LocalTime `gorm:"column:success_time;type:datetime;comment:退款成功时间" json:"success_time"` + Model +} + +func (m *OrderServicePackageRefund) TableName() string { + return "gdxz_order_service_package_refund" +} + +func (m *OrderServicePackageRefund) BeforeCreate(tx *gorm.DB) error { + if m.ServiceRefundId == 0 { + m.ServiceRefundId = 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/OrderServicePackage.go b/api/requests/OrderServicePackage.go new file mode 100644 index 0000000..b385014 --- /dev/null +++ b/api/requests/OrderServicePackage.go @@ -0,0 +1,33 @@ +package requests + +type OrderServicePackageRequest struct { + GetOrderServicePackagePage // 获取药品订单列表-分页 +} + +// GetOrderServicePackagePage 订单-服务包表 +type GetOrderServicePackagePage struct { + Page int `json:"page" form:"page" label:"页码"` + PageSize int `json:"page_size" form:"page_size" label:"每页个数"` + OrderServiceId string `json:"order_service_id" form:"order_service_id" label:"主键id"` // 主键id + OrderId string `json:"order_id" form:"order_id" label:"订单id"` // 订单id + OrderServiceType *int `json:"order_service_type" form:"order_service_type" label:"服务包类型(1:健康包 2:随访包)"` // 服务包类型(1:健康包 2:随访包) + OrderServiceStatus *int `json:"order_service_status" form:"order_service_status" label:"订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消)"` // 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) + IsDelete *int `json:"is_delete" form:"is_delete" label:"删除状态(0:否 1:是)"` // 删除状态(0:否 1:是) + RefundStatus *int `json:"refund_status" form:"refund_status" label:"订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款)"` // 订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款) + PayChannel *int `json:"pay_channel" form:"pay_channel" label:"支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付)"` // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) + PayStatus *int `json:"pay_status" form:"pay_status" label:"支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)"` // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + OrderServiceNo string `json:"order_service_no" form:"order_service_no" label:"系统订单编号"` // 系统订单编号 + EscrowTradeNo string `json:"escrow_trade_no" form:"escrow_trade_no" label:"第三方支付流水号"` // 第三方支付流水号 + PayTime string `json:"pay_time" form:"pay_time" label:"支付时间"` // 支付时间 + StartTime string `json:"start_time" form:"start_time" label:"开始服务时间"` // 开始服务时间 + FinishTime string `json:"finish_time" form:"finish_time" label:"结束服务时间"` // 结束服务时间 + CancelTime string `json:"cancel_time" form:"cancel_time" label:"订单取消时间"` // 订单取消时间 + CancelReason *int `json:"cancel_reason" form:"cancel_reason" label:"取消订单原因(1:医生未接受服务 2:主动取消 4:客服取消 5:支付超时)"` // 取消订单原因(1:医生未接受服务 2:主动取消 4:客服取消 5:支付超时) + CancelRemarks string `json:"cancel_remarks" form:"cancel_remarks" label:"取消订单备注"` // 取消订单备注 + AddFinishStatus *int `json:"add_finish_status" form:"add_finish_status" label:"添加完成订单延迟队列状态(0:未添加 1:已添加 2:添加失败)"` // 添加完成订单延迟队列状态(0:未添加 1:已添加 2:添加失败) + AddFinishTime string `json:"add_finish_time" form:"add_finish_time" label:"添加完成订单延迟队列时间"` // 添加完成订单延迟队列时间 + PatientName string `json:"patient_name" form:"patient_name" label:"患者姓名-就诊人"` // 患者姓名-就诊人 + CreatedAt string `json:"created_at" form:"created_at" label:"订单创建时间"` // 时间区间,数组形式,下标0为开始时间,下标1为结束时间 + Mobile string `json:"mobile" form:"mobile" label:"手机号-医生/患者"` + DoctorName string `json:"doctor_name" form:"doctor_name" label:"医生姓名"` +} diff --git a/api/router/router.go b/api/router/router.go index cc51171..a925bd2 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -448,6 +448,19 @@ func privateRouter(r *gin.Engine, api controller.Api) { inquiryRecordGroup.GET("/:order_inquiry_id", api.OrderInquiry.GetOrderInquiryRecord) } + // 服务包订单 + serviceGroup := orderGroup.Group("/service") + { + // 获取服务包订单列表-分页 + serviceGroup.POST("/page", api.OrderServicePackage.GetOrderServicePackagePage) + + // 问诊订单详情 + serviceGroup.GET("/:order_inquiry_id", api.OrderInquiry.GetOrderInquiry) + + // 取消问诊订单 + serviceGroup.PUT("/cancel/:order_inquiry_id", api.OrderInquiry.CancelOrderInquiry) + } + } // 病例管理 From 5bfc3b548073e3c5e6b64ff943438e98b682ae72 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 27 May 2024 16:25:26 +0800 Subject: [PATCH 11/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=9C=8D=E5=8A=A1=E5=8C=85=E8=AE=A2=E5=8D=95=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E6=9D=83=E7=9B=8A=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/orderServicePackage.go | 54 +++++ api/dao/healthPackageProduct.go | 74 +++++++ api/dao/orderServicePackage.go | 4 +- api/dao/orderServicePackageCase.go | 100 ++++++++++ api/dao/orderServicePackageDetail.go | 100 ++++++++++ api/dao/orderServicePackageInquiry.go | 74 +++++++ api/dao/orderServicePackageProduct.go | 57 ++++++ api/dao/orderServicePackageRefund.go | 100 ++++++++++ api/dao/userCoupon.go | 38 ++++ api/dto/HealthPackageProduct.go | 56 ++++++ api/dto/OrderInquiry.go | 2 +- api/dto/OrderInquiryRefund.go | 4 +- api/dto/OrderServicePackage.go | 180 +++++++++++++---- api/dto/OrderServicePackageCase.go | 106 ++++++++++ api/dto/OrderServicePackageDetail.go | 77 +++++++ api/dto/OrderServicePackageInquiry.go | 71 +++++++ api/dto/OrderServicePackageProduct.go | 77 +++++++ api/dto/OrderServicePackageRefund.go | 70 +++++++ api/dto/UserCoupon.go | 80 ++++++++ api/dto/coupon.go | 124 ++++++++++++ api/model/coupon.go | 58 ++++++ api/model/orderServicePackage.go | 6 +- api/model/orderServicePackageInquiry.go | 1 + api/model/orderServicePackageProduct.go | 1 + api/model/userCoupon.go | 1 + api/router/router.go | 9 +- api/service/orderServicePackage.go | 255 ++++++++++++++++++++++++ 27 files changed, 1734 insertions(+), 45 deletions(-) create mode 100644 api/dao/healthPackageProduct.go create mode 100644 api/dao/orderServicePackageCase.go create mode 100644 api/dao/orderServicePackageDetail.go create mode 100644 api/dao/orderServicePackageInquiry.go create mode 100644 api/dao/orderServicePackageProduct.go create mode 100644 api/dao/orderServicePackageRefund.go create mode 100644 api/dto/HealthPackageProduct.go create mode 100644 api/dto/OrderServicePackageCase.go create mode 100644 api/dto/OrderServicePackageDetail.go create mode 100644 api/dto/OrderServicePackageInquiry.go create mode 100644 api/dto/OrderServicePackageProduct.go create mode 100644 api/dto/OrderServicePackageRefund.go create mode 100644 api/dto/UserCoupon.go create mode 100644 api/dto/coupon.go create mode 100644 api/model/coupon.go create mode 100644 api/service/orderServicePackage.go diff --git a/api/controller/orderServicePackage.go b/api/controller/orderServicePackage.go index e32c88f..4affa0c 100644 --- a/api/controller/orderServicePackage.go +++ b/api/controller/orderServicePackage.go @@ -6,8 +6,10 @@ import ( "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 OrderServicePackage struct{} @@ -56,3 +58,55 @@ func (r *OrderServicePackage) GetOrderServicePackagePage(c *gin.Context) { result["data"] = GetOrderInquiryPageResponses responses.OkWithData(result, c) } + +// GetOrderServicePackage 获取服务包订单详情 +func (r *OrderServicePackage) GetOrderServicePackage(c *gin.Context) { + id := c.Param("order_service_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + orderServiceId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + orderServicePackageService := service.OrderServicePackageService{} + getResponses, err := orderServicePackageService.GetOrderServicePackage(orderServiceId) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(getResponses, c) +} + +// GetOrderServicePackageDetailInfo 获取服务包订单服务权益详情 +func (r *OrderServicePackage) GetOrderServicePackageDetailInfo(c *gin.Context) { + id := c.Param("order_service_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + orderServiceId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + orderServicePackageService := service.OrderServicePackageService{} + getResponses, err := orderServicePackageService.GetOrderServicePackageDetailInfo(orderServiceId) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(getResponses, c) +} diff --git a/api/dao/healthPackageProduct.go b/api/dao/healthPackageProduct.go new file mode 100644 index 0000000..888cdf0 --- /dev/null +++ b/api/dao/healthPackageProduct.go @@ -0,0 +1,74 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type HealthPackageProductDao struct { +} + +// GetHealthPackageProductById 获取数据-id +func (r *HealthPackageProductDao) GetHealthPackageProductById(packageProductId int64) (m *model.HealthPackageProduct, err error) { + err = global.Db.First(&m, packageProductId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetHealthPackageProductPreloadById 获取数据-加载全部关联-id +func (r *HealthPackageProductDao) GetHealthPackageProductPreloadById(packageProductId int64) (m *model.HealthPackageProduct, err error) { + err = global.Db.Preload(clause.Associations).First(&m, packageProductId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetHealthPackageProductByPackageId 获取数据-id +func (r *HealthPackageProductDao) GetHealthPackageProductByPackageId(packageId int64) (m []*model.HealthPackageProduct, + err error) { + err = global.Db.Where("package_id = ?", packageId).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteHealthPackageProduct 删除 +func (r *HealthPackageProductDao) DeleteHealthPackageProduct(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.HealthPackageProduct{}).Error + if err != nil { + return err + } + return nil +} + +// EditHealthPackageProduct 修改 +func (r *HealthPackageProductDao) EditHealthPackageProduct(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.HealthPackageProduct{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetHealthPackageProductList 获取列表 +func (r *HealthPackageProductDao) GetHealthPackageProductList(maps interface{}) (m []*model.HealthPackageProduct, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddHealthPackageProduct 新增 +func (r *HealthPackageProductDao) AddHealthPackageProduct(tx *gorm.DB, model *model.HealthPackageProduct) (*model.HealthPackageProduct, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} diff --git a/api/dao/orderServicePackage.go b/api/dao/orderServicePackage.go index a9aec68..8a1a555 100644 --- a/api/dao/orderServicePackage.go +++ b/api/dao/orderServicePackage.go @@ -31,8 +31,8 @@ func (r *OrderServicePackageDao) GetOrderServicePackagePreloadById(orderServiceI return m, nil } -// GetOrderServicePackageByOrderProductId 获取数据-药品订单id -func (r *OrderServicePackageDao) GetOrderServicePackageByOrderProductId(orderId int64) (m *model.OrderServicePackage, err error) { +// GetOrderServicePackageByOrderId 获取数据-订单id +func (r *OrderServicePackageDao) GetOrderServicePackageByOrderId(orderId int64) (m *model.OrderServicePackage, err error) { err = global.Db.Where("order_id = ?", orderId).First(&m).Error if err != nil { return nil, err diff --git a/api/dao/orderServicePackageCase.go b/api/dao/orderServicePackageCase.go new file mode 100644 index 0000000..1ddf5e5 --- /dev/null +++ b/api/dao/orderServicePackageCase.go @@ -0,0 +1,100 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type OrderServicePackageCaseDao struct { +} + +// GetOrderServicePackageCaseById 获取数据-id +func (r *OrderServicePackageCaseDao) GetOrderServicePackageCaseById(orderServiceCaseId int64) (m *model.OrderServicePackageCase, err error) { + err = global.Db.First(&m, orderServiceCaseId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackageCasePreloadById 获取数据-加载全部关联-id +func (r *OrderServicePackageCaseDao) GetOrderServicePackageCasePreloadById(orderServiceCaseId int64) (m *model.OrderServicePackageCase, err error) { + err = global.Db.Preload(clause.Associations).First(&m, orderServiceCaseId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackageCaseByOrderId 获取数据-订单id +func (r *OrderServicePackageCaseDao) GetOrderServicePackageCaseByOrderId(orderId int64) (m *model.OrderServicePackageCase, err error) { + err = global.Db.Where("order_id = ?", orderId).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackageCaseByOrderServicePackageId 获取数据-订单id +func (r *OrderServicePackageCaseDao) GetOrderServicePackageCaseByOrderServicePackageId(orderServicePackageId int64) (m *model.OrderServicePackageCase, err error) { + err = global.Db.Where("order_service_id = ?", orderServicePackageId).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteOrderServicePackageCase 删除 +func (r *OrderServicePackageCaseDao) DeleteOrderServicePackageCase(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.OrderServicePackageCase{}).Error + if err != nil { + return err + } + return nil +} + +// EditOrderServicePackageCase 修改 +func (r *OrderServicePackageCaseDao) EditOrderServicePackageCase(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.OrderServicePackageCase{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditOrderServicePackageCaseByOrderServicePackageId 修改-id +func (r *OrderServicePackageCaseDao) EditOrderServicePackageCaseByOrderServicePackageId(tx *gorm.DB, orderServicePackageId int64, data interface{}) error { + err := tx.Model(&model.OrderServicePackageCase{}).Where("order_service_id = ?", orderServicePackageId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditOrderServicePackageCaseById 修改-药品订单id +func (r *OrderServicePackageCaseDao) EditOrderServicePackageCaseById(tx *gorm.DB, orderId int64, data interface{}) error { + err := tx.Model(&model.OrderServicePackageCase{}).Where("order_id = ?", orderId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetOrderServicePackageCaseList 获取列表 +func (r *OrderServicePackageCaseDao) GetOrderServicePackageCaseList(maps interface{}) (m []*model.OrderServicePackageCase, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddOrderServicePackageCase 新增 +func (r *OrderServicePackageCaseDao) AddOrderServicePackageCase(tx *gorm.DB, model *model.OrderServicePackageCase) (*model.OrderServicePackageCase, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} diff --git a/api/dao/orderServicePackageDetail.go b/api/dao/orderServicePackageDetail.go new file mode 100644 index 0000000..3ffe3f2 --- /dev/null +++ b/api/dao/orderServicePackageDetail.go @@ -0,0 +1,100 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type OrderServicePackageDetailDao struct { +} + +// GetOrderServicePackageDetailById 获取数据-id +func (r *OrderServicePackageDetailDao) GetOrderServicePackageDetailById(orderServiceDetailId int64) (m *model.OrderServicePackageDetail, err error) { + err = global.Db.First(&m, orderServiceDetailId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackageDetailPreloadById 获取数据-加载全部关联-id +func (r *OrderServicePackageDetailDao) GetOrderServicePackageDetailPreloadById(orderServiceDetailId int64) (m *model.OrderServicePackageDetail, err error) { + err = global.Db.Preload(clause.Associations).First(&m, orderServiceDetailId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackageDetailByOrderId 获取数据-订单id +func (r *OrderServicePackageDetailDao) GetOrderServicePackageDetailByOrderId(orderId int64) (m *model.OrderServicePackageDetail, err error) { + err = global.Db.Where("order_id = ?", orderId).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackageDetailByOrderServicePackageId 获取数据-订单id +func (r *OrderServicePackageDetailDao) GetOrderServicePackageDetailByOrderServicePackageId(orderServicePackageId int64) (m *model.OrderServicePackageDetail, err error) { + err = global.Db.Where("order_service_id = ?", orderServicePackageId).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteOrderServicePackageDetail 删除 +func (r *OrderServicePackageDetailDao) DeleteOrderServicePackageDetail(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.OrderServicePackageDetail{}).Error + if err != nil { + return err + } + return nil +} + +// EditOrderServicePackageDetail 修改 +func (r *OrderServicePackageDetailDao) EditOrderServicePackageDetail(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.OrderServicePackageDetail{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditOrderServicePackageDetailByOrderServicePackageId 修改-id +func (r *OrderServicePackageDetailDao) EditOrderServicePackageDetailByOrderServicePackageId(tx *gorm.DB, orderServicePackageId int64, data interface{}) error { + err := tx.Model(&model.OrderServicePackageDetail{}).Where("order_service_id = ?", orderServicePackageId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditOrderServicePackageDetailById 修改-药品订单id +func (r *OrderServicePackageDetailDao) EditOrderServicePackageDetailById(tx *gorm.DB, orderId int64, data interface{}) error { + err := tx.Model(&model.OrderServicePackageDetail{}).Where("order_id = ?", orderId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetOrderServicePackageDetailList 获取列表 +func (r *OrderServicePackageDetailDao) GetOrderServicePackageDetailList(maps interface{}) (m []*model.OrderServicePackageDetail, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddOrderServicePackageDetail 新增 +func (r *OrderServicePackageDetailDao) AddOrderServicePackageDetail(tx *gorm.DB, model *model.OrderServicePackageDetail) (*model.OrderServicePackageDetail, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} diff --git a/api/dao/orderServicePackageInquiry.go b/api/dao/orderServicePackageInquiry.go new file mode 100644 index 0000000..ad58e01 --- /dev/null +++ b/api/dao/orderServicePackageInquiry.go @@ -0,0 +1,74 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type OrderServicePackageInquiryDao struct { +} + +// GetOrderServicePackageInquiryById 获取数据-id +func (r *OrderServicePackageInquiryDao) GetOrderServicePackageInquiryById(serviceProductId int64) (m *model.OrderServicePackageInquiry, err error) { + err = global.Db.First(&m, serviceProductId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackageInquiryPreloadById 获取数据-加载全部关联-id +func (r *OrderServicePackageInquiryDao) GetOrderServicePackageInquiryPreloadById(serviceProductId int64) (m *model.OrderServicePackageInquiry, err error) { + err = global.Db.Preload(clause.Associations).First(&m, serviceProductId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackageInquiryByOrderNo 获取数据-系统订单编号 +func (r *OrderServicePackageInquiryDao) GetOrderServicePackageInquiryByOrderNo(orderNo string) (m []*model.OrderServicePackageInquiry, err error) { + err = global.Db.Where("order_service_no = ?", orderNo).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackageInquiryPreloadByOrderNo 获取数据-系统订单编号 +func (r *OrderServicePackageInquiryDao) GetOrderServicePackageInquiryPreloadByOrderNo(orderNo string) (m []*model.OrderServicePackageInquiry, err error) { + err = global.Db.Preload(clause.Associations).Where("order_service_no = ?", orderNo).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteOrderServicePackageInquiry 删除 +func (r *OrderServicePackageInquiryDao) DeleteOrderServicePackageInquiry(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.OrderServicePackageInquiry{}).Error + if err != nil { + return err + } + return nil +} + +// EditOrderServicePackageInquiry 修改 +func (r *OrderServicePackageInquiryDao) EditOrderServicePackageInquiry(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.OrderServicePackageInquiry{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetOrderServicePackageInquiryList 获取列表 +func (r *OrderServicePackageInquiryDao) GetOrderServicePackageInquiryList(maps interface{}) (m []*model.OrderServicePackageInquiry, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/dao/orderServicePackageProduct.go b/api/dao/orderServicePackageProduct.go new file mode 100644 index 0000000..0cc789d --- /dev/null +++ b/api/dao/orderServicePackageProduct.go @@ -0,0 +1,57 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type OrderServicePackageProductDao struct { +} + +// GetOrderServicePackageProductById 获取数据-id +func (r *OrderServicePackageProductDao) GetOrderServicePackageProductById(serviceProductId int64) (m *model.OrderServicePackageProduct, err error) { + err = global.Db.First(&m, serviceProductId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackageProductPreloadById 获取数据-加载全部关联-id +func (r *OrderServicePackageProductDao) GetOrderServicePackageProductPreloadById(serviceProductId int64) (m *model.OrderServicePackageProduct, err error) { + err = global.Db.Preload(clause.Associations).First(&m, serviceProductId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackageProductPreloadByOrderServiceId 获取数据 +func (r *OrderServicePackageProductDao) GetOrderServicePackageProductPreloadByOrderServiceId(orderServiceId int64) (m []*model. + OrderServicePackageProduct, err error) { + err = global.Db.Where("order_service_id = ?", orderServiceId).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// EditOrderServicePackageProduct 修改 +func (r *OrderServicePackageProductDao) EditOrderServicePackageProduct(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.OrderServicePackageProduct{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetOrderServicePackageProductList 获取列表 +func (r *OrderServicePackageProductDao) GetOrderServicePackageProductList(maps interface{}) (m []*model.OrderServicePackageProduct, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/dao/orderServicePackageRefund.go b/api/dao/orderServicePackageRefund.go new file mode 100644 index 0000000..bb26d2b --- /dev/null +++ b/api/dao/orderServicePackageRefund.go @@ -0,0 +1,100 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type OrderServicePackageRefundDao struct { +} + +// GetOrderServicePackageRefundById 获取数据-id +func (r *OrderServicePackageRefundDao) GetOrderServicePackageRefundById(serviceRefundId int64) (m *model.OrderServicePackageRefund, err error) { + err = global.Db.First(&m, serviceRefundId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackageRefundPreloadById 获取数据-加载全部关联-id +func (r *OrderServicePackageRefundDao) GetOrderServicePackageRefundPreloadById(serviceRefundId int64) (m *model.OrderServicePackageRefund, err error) { + err = global.Db.Preload(clause.Associations).First(&m, serviceRefundId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackageRefundByOrderServicePackageId 获取数据-服务包订单id +func (r *OrderServicePackageRefundDao) GetOrderServicePackageRefundByOrderServicePackageId(orderServicePackageId int64) (m *model.OrderServicePackageRefund, err error) { + err = global.Db.Where("order_service_id = ?", orderServicePackageId).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetOrderServicePackageRefundByOrderNo 获取数据-系统订单id +func (r *OrderServicePackageRefundDao) GetOrderServicePackageRefundByOrderNo(orderNo int64) (m *model.OrderServicePackageRefund, err error) { + err = global.Db.Where("order_service_no = ?", orderNo).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteOrderServicePackageRefund 删除 +func (r *OrderServicePackageRefundDao) DeleteOrderServicePackageRefund(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.OrderServicePackageRefund{}).Error + if err != nil { + return err + } + return nil +} + +// EditOrderServicePackageRefund 修改 +func (r *OrderServicePackageRefundDao) EditOrderServicePackageRefund(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.OrderServicePackageRefund{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditOrderServicePackageRefundByOrderServicePackageId 修改-id +func (r *OrderServicePackageRefundDao) EditOrderServicePackageRefundByOrderServicePackageId(tx *gorm.DB, orderServicePackageId int64, data interface{}) error { + err := tx.Model(&model.OrderServicePackageRefund{}).Where("order_service_id = ?", orderServicePackageId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditOrderServicePackageRefundById 修改-药品订单id +func (r *OrderServicePackageRefundDao) EditOrderServicePackageRefundById(tx *gorm.DB, orderNo string, data interface{}) error { + err := tx.Model(&model.OrderServicePackageRefund{}).Where("order_service_no = ?", orderNo).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetOrderServicePackageRefundList 获取列表 +func (r *OrderServicePackageRefundDao) GetOrderServicePackageRefundList(maps interface{}) (m []*model.OrderServicePackageRefund, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddOrderServicePackageRefund 新增 +func (r *OrderServicePackageRefundDao) AddOrderServicePackageRefund(tx *gorm.DB, model *model.OrderServicePackageRefund) (*model.OrderServicePackageRefund, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} diff --git a/api/dao/userCoupon.go b/api/dao/userCoupon.go index a3610d5..acdb8ab 100644 --- a/api/dao/userCoupon.go +++ b/api/dao/userCoupon.go @@ -5,6 +5,7 @@ import ( "gorm.io/gorm/clause" "hospital-admin-api/api/model" "hospital-admin-api/global" + "time" ) type UserCouponDao struct { @@ -79,3 +80,40 @@ func (r *UserCouponDao) AddUserCoupon(tx *gorm.DB, model *model.UserCoupon) (*mo } return model, nil } + +// GetUserAllObjectTypeCoupon 获取用户某一类型优惠卷 +func (r *UserCouponDao) GetUserAllObjectTypeCoupon(userId int64, distributionObject int) (m []*model.UserCoupon, err error) { + // 构建查询条件 + query := global.Db.Model(&model.UserCoupon{}) + + query = query.Preload("Coupon") + + // 用户优惠卷搜索条件 + query = query.Where("user_id = ?", userId) + + // 获取当前时间 + currentTime := time.Now() + + // 格式化时间为 "Y-m-d H:i:s" + formattedTime := currentTime.Format("2006-01-02 15:04:05") + + query = query.Where("valid_start_time < ?", formattedTime) // 有效使用时间 + query = query.Where("valid_end_time > ?", formattedTime) // 过期使用时间 + + // 优惠卷搜索条件 + subQuery := global.Db.Model(&model.Coupon{}). + Where("gdxz_user_coupon.coupon_id = gdxz_coupon.coupon_id"). + Where("gdxz_coupon.distribution_object = ?", distributionObject). + Where("gdxz_coupon.coupon_client = ?", 1). + Where("gdxz_coupon.coupon_status = ?", 1) + + query = query.Where("EXISTS (?)", subQuery) + + query = query.Group("coupon_id") + + err = query.Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/dto/HealthPackageProduct.go b/api/dto/HealthPackageProduct.go new file mode 100644 index 0000000..3043243 --- /dev/null +++ b/api/dto/HealthPackageProduct.go @@ -0,0 +1,56 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +// HealthPackageProductDto 健康包-关联商品 +type HealthPackageProductDto struct { + PackageProductId string `json:"package_product_id"` // 主键id + PackageId string `json:"package_id"` // 健康包id + ProductId string `json:"product_id"` // 商品id + ProductName string `json:"product_name"` // 商品名称 + Quantity int `json:"quantity"` // 数量 + DiscountProductPrice float64 `json:"discount_product_price"` // 折扣商品价格 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 +} + +func GetHealthPackageProductDto(m *model.HealthPackageProduct) *HealthPackageProductDto { + return &HealthPackageProductDto{ + PackageProductId: fmt.Sprintf("%d", m.PackageProductId), + PackageId: fmt.Sprintf("%d", m.PackageId), + ProductId: fmt.Sprintf("%d", m.ProductId), + ProductName: m.ProductName, + Quantity: m.Quantity, + DiscountProductPrice: m.DiscountProductPrice, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +func GetHealthPackageProductListDto(m []*model.HealthPackageProduct) []*HealthPackageProductDto { + // 处理返回值 + responses := make([]*HealthPackageProductDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &HealthPackageProductDto{ + PackageProductId: fmt.Sprintf("%d", v.PackageProductId), + PackageId: fmt.Sprintf("%d", v.PackageId), + ProductId: fmt.Sprintf("%d", v.ProductId), + ProductName: v.ProductName, + Quantity: v.Quantity, + DiscountProductPrice: v.DiscountProductPrice, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} diff --git a/api/dto/OrderInquiry.go b/api/dto/OrderInquiry.go index 30b70ec..0e2bcb5 100644 --- a/api/dto/OrderInquiry.go +++ b/api/dto/OrderInquiry.go @@ -337,7 +337,7 @@ func (r *OrderInquiryDto) LoadUserName(m *model.User) *OrderInquiryDto { // LoadOrderInquiryRefund 加载订单退款数据 func (r *OrderInquiryDto) LoadOrderInquiryRefund(m *model.OrderInquiryRefund) *OrderInquiryDto { if m != nil { - d := GetOrderInquiryRefundBankDto(m) + d := GetOrderInquiryRefundDto(m) r.OrderInquiryRefund = d } diff --git a/api/dto/OrderInquiryRefund.go b/api/dto/OrderInquiryRefund.go index 07069a1..acc15a8 100644 --- a/api/dto/OrderInquiryRefund.go +++ b/api/dto/OrderInquiryRefund.go @@ -12,7 +12,7 @@ type OrderInquiryRefundDto struct { InquiryNo string `json:"inquiry_no"` // 系统订单编号 InquiryRefundNo string `json:"inquiry_refund_no"` // 系统退款编号 RefundId string `json:"refund_id"` // 第三方退款单号 - InquiryRefundStatus int `json:"inquiry_refund_status"` // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常) + InquiryRefundStatus int `json:"inquiry_refund_status"` // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4 // :拒绝退款 5:退款关闭 6:退款异常) RefundTotal float64 `json:"refund_total"` // 退款金额 RefundReason string `json:"refund_reason"` // 退款原因 SuccessTime model.LocalTime `json:"success_time"` // 退款成功时间 @@ -20,7 +20,7 @@ type OrderInquiryRefundDto struct { UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 } -func GetOrderInquiryRefundBankDto(m *model.OrderInquiryRefund) *OrderInquiryRefundDto { +func GetOrderInquiryRefundDto(m *model.OrderInquiryRefund) *OrderInquiryRefundDto { return &OrderInquiryRefundDto{ InquiryRefundId: fmt.Sprintf("%d", m.InquiryRefundId), PatientId: fmt.Sprintf("%d", m.PatientId), diff --git a/api/dto/OrderServicePackage.go b/api/dto/OrderServicePackage.go index 5c18051..c9b0b22 100644 --- a/api/dto/OrderServicePackage.go +++ b/api/dto/OrderServicePackage.go @@ -5,42 +5,71 @@ import ( "hospital-admin-api/api/model" ) -// OrderServicePackageDto 订单-服务包表 +// OrderServicePackageDto 订单-服务包 type OrderServicePackageDto struct { - OrderServiceId string `json:"order_service_id"` // 主键id - OrderId string `json:"order_id"` // 订单id - UserId string `json:"user_id"` // 用户id-患者 - PatientId string `json:"patient_id"` // 患者id - DoctorId string `json:"doctor_id"` // 医生id - FamilyId string `json:"family_id"` // 家庭成员id(就诊用户) - OrderServiceType int `json:"order_service_type"` // 服务包类型(1:健康包 2:随访包) - OrderServiceStatus int `json:"order_service_status"` // 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) - IsDelete int `json:"is_delete"` // 删除状态(0:否 1:是) - RefundStatus int `json:"refund_status"` // 订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款) - PayChannel int `json:"pay_channel"` // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) - PayStatus int `json:"pay_status"` // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) - OrderServiceNo string `json:"order_service_no"` // 系统订单编号 - EscrowTradeNo string `json:"escrow_trade_no"` // 第三方支付流水号 - AmountTotal float64 `json:"amount_total"` // 订单金额 - CouponAmountTotal float64 `json:"coupon_amount_total"` // 优惠卷总金额 - PaymentAmountTotal float64 `json:"payment_amount_total"` // 实际付款金额 - PayTime model.LocalTime `json:"pay_time"` // 支付时间 - StartTime model.LocalTime `json:"start_time"` // 开始服务时间 - FinishTime model.LocalTime `json:"finish_time"` // 结束服务时间 - CancelTime model.LocalTime `json:"cancel_time"` // 订单取消时间 - CancelReason int `json:"cancel_reason"` // 取消订单原因(1:医生未接受服务 2:主动取消 4:客服取消 5:支付超时) - CancelRemarks string `json:"cancel_remarks"` // 取消订单备注 - AddFinishStatus int `json:"add_finish_status"` // 添加完成订单延迟队列状态(0:未添加 1:已添加 2:添加失败) - AddFinishTime model.LocalTime `json:"add_finish_time"` // 添加完成订单延迟队列时间 - AddFinishFailReason string `json:"add_finish_fail_reason"` // 添加完成订单延迟队列失败原因 - PatientName string `json:"patient_name"` // 患者姓名-就诊人 - PatientNameMask string `json:"patient_name_mask"` // 患者姓名-就诊人(掩码) - PatientSex int `json:"patient_sex"` // 患者性别-就诊人(0:未知 1:男 2:女) - PatientAge int `json:"patient_age"` // 患者年龄-就诊人 - CreatedAt model.LocalTime `json:"created_at"` // 创建时间 - UpdatedAt model.LocalTime `json:"updated_at"` // 更新时间 - DoctorName string `json:"doctor_name"` // 医生姓名 - UserName string `json:"user_name"` // 用户姓名(患者) + OrderServiceId string `json:"order_service_id"` // 主键id + OrderId string `json:"order_id"` // 订单id + UserId string `json:"user_id"` // 用户id-患者 + PatientId string `json:"patient_id"` // 患者id + DoctorId string `json:"doctor_id"` // 医生id + FamilyId string `json:"family_id"` // 家庭成员id(就诊用户) + OrderServiceType int `json:"order_service_type"` // 服务包类型(1:健康包 2:随访包) + OrderServiceStatus int `json:"order_service_status"` // 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) + IsDelete int `json:"is_delete"` // 删除状态(0:否 1:是) + RefundStatus int `json:"refund_status"` // 订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款) + PayChannel int `json:"pay_channel"` // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) + PayStatus int `json:"pay_status"` // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + OrderServiceNo string `json:"order_service_no"` // 系统订单编号 + EscrowTradeNo string `json:"escrow_trade_no"` // 第三方支付流水号 + AmountTotal float64 `json:"amount_total"` // 订单金额 + CouponAmountTotal float64 `json:"coupon_amount_total"` // 优惠卷总金额 + PaymentAmountTotal float64 `json:"payment_amount_total"` // 实际付款金额 + PayTime model.LocalTime `json:"pay_time"` // 支付时间 + StartTime model.LocalTime `json:"start_time"` // 开始服务时间 + FinishTime model.LocalTime `json:"finish_time"` // 结束服务时间 + CancelTime model.LocalTime `json:"cancel_time"` // 订单取消时间 + CancelReason int `json:"cancel_reason"` // 取消订单原因(1:医生未接受服务 2:主动取消 4:客服取消 5:支付超时) + CancelRemarks string `json:"cancel_remarks"` // 取消订单备注 + AddFinishStatus int `json:"add_finish_status"` // 添加完成订单延迟队列状态(0:未添加 1:已添加 2:添加失败) + AddFinishTime model.LocalTime `json:"add_finish_time"` // 添加完成订单延迟队列时间 + AddFinishFailReason string `json:"add_finish_fail_reason"` // 添加完成订单延迟队列失败原因 + PatientName string `json:"patient_name"` // 患者姓名-就诊人 + PatientNameMask string `json:"patient_name_mask"` // 患者姓名-就诊人(掩码) + PatientSex int `json:"patient_sex"` // 患者性别-就诊人(0:未知 1:男 2:女) + PatientAge int `json:"patient_age"` // 患者年龄-就诊人 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 更新时间 + DoctorName string `json:"doctor_name"` // 医生姓名 + UserName string `json:"user_name"` // 用户姓名(患者) + UserDoctor *UserDoctorDto `json:"user_doctor"` // 医生数据 + OrderServicePackageCase *OrderServicePackageCaseDto `json:"order_service_package_case"` // 病例 + OrderServicePackageRefund *OrderServicePackageRefundDto `json:"order_service_package_refund"` // 退款数据 +} + +// OrderServicePackageDetailInfoDto 服务包权益 +type OrderServicePackageDetailInfoDto struct { + OrderServiceId string `json:"order_service_id"` // 主键id + OrderId string `json:"order_id"` // 订单id + UserId string `json:"user_id"` // 用户id-患者 + PatientId string `json:"patient_id"` // 患者id + DoctorId string `json:"doctor_id"` // 医生id + FamilyId string `json:"family_id"` // 家庭成员id(就诊用户) + OrderServiceType int `json:"order_service_type"` // 服务包类型(1:健康包 2:随访包) + OrderServiceStatus int `json:"order_service_status"` // 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) + IsDelete int `json:"is_delete"` // 删除状态(0:否 1:是) + OrderServiceNo string `json:"order_service_no"` // 系统订单编号 + PayTime model.LocalTime `json:"pay_time"` // 支付时间 + StartTime model.LocalTime `json:"start_time"` // 开始服务时间 + FinishTime model.LocalTime `json:"finish_time"` // 结束服务时间 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + OrderServicePackageProduct []*OrderServicePackageProductDto `json:"order_service_package_product"` // 关联商品订单 + OrderServicePackageInquiry []*OrderServicePackageInquiryDto `json:"order_service_package_inquiry"` // 关联问诊订单 + UserCoupon []*UserCouponDto `json:"user_coupon"` // 关联优惠卷 + OrderServicePackageDetail *OrderServicePackageDetailDto `json:"order_service_package_detail"` // 服务包订单详情 + CurrentMonthStartDate string `json:"current_month_start_date"` // 当月开始时间 + CurrentMonthFinishDate string `json:"current_month_finish_date"` // 当月结束时间 + MonthInquiryCount int `json:"month_inquiry_count"` // 当月问诊次数 + RemainingInquiryCount string `json:"remaining_inquiry_count"` // 当月剩余问诊次数 } // GetOrderServicePackageDto 服务包订单详情 @@ -141,6 +170,26 @@ func GetOrderServicePackageListDto(m []*model.OrderServicePackage) []*OrderServi return responses } +// GetOrderServicePackageDetailInfoDto 服务包权益详情 +func GetOrderServicePackageDetailInfoDto(m *model.OrderServicePackage) *OrderServicePackageDetailInfoDto { + return &OrderServicePackageDetailInfoDto{ + OrderServiceId: fmt.Sprintf("%d", m.OrderServiceId), + OrderId: fmt.Sprintf("%d", m.OrderId), + UserId: fmt.Sprintf("%d", m.UserId), + PatientId: fmt.Sprintf("%d", m.PatientId), + DoctorId: fmt.Sprintf("%d", m.DoctorId), + FamilyId: fmt.Sprintf("%d", m.FamilyId), + OrderServiceType: m.OrderServiceType, + OrderServiceStatus: m.OrderServiceStatus, + IsDelete: m.IsDelete, + OrderServiceNo: m.OrderServiceNo, + PayTime: m.PayTime, + StartTime: m.StartTime, + FinishTime: m.FinishTime, + CreatedAt: m.CreatedAt, + } +} + // LoadDoctorName 加载医生名称 func (r *OrderServicePackageDto) LoadDoctorName(m *model.UserDoctor) *OrderServicePackageDto { if m != nil { @@ -156,3 +205,64 @@ func (r *OrderServicePackageDto) LoadUserName(m *model.User) *OrderServicePackag } return r } + +// LoadOrderServicePackageRefund 加载订单退款数据 +func (r *OrderServicePackageDto) LoadOrderServicePackageRefund(m *model.OrderServicePackageRefund) *OrderServicePackageDto { + if m != nil { + d := GetOrderServicePackageRefundDto(m) + + r.OrderServicePackageRefund = d + } + return r +} + +// LoadMaskOrderServicePackageCase 加载病例 +func (r *OrderServicePackageDto) LoadMaskOrderServicePackageCase(m *model.OrderServicePackageCase) *OrderServicePackageDto { + if m != nil { + d := GetOrderServicePackageCaseDto(m) + + r.OrderServicePackageCase = d + } + return r +} + +// LoadOrderServicePackageProduct 加载关联商品订单 +func (r *OrderServicePackageDetailInfoDto) LoadOrderServicePackageProduct(m []*model.OrderServicePackageProduct) *OrderServicePackageDetailInfoDto { + if len(m) > 0 { + d := GetOrderServicePackageProductListDto(m) + + r.OrderServicePackageProduct = d + } + return r +} + +// LoadOrderServicePackageInquiry 加载关联问诊订单 +func (r *OrderServicePackageDetailInfoDto) LoadOrderServicePackageInquiry(m []*model.OrderServicePackageInquiry) *OrderServicePackageDetailInfoDto { + if len(m) > 0 { + d := GetOrderServicePackageInquiryListDto(m) + + r.OrderServicePackageInquiry = d + } + return r +} + +// LoadUserCoupon 加载优惠卷数据 +func (r *OrderServicePackageDetailInfoDto) LoadUserCoupon(m []*model.UserCoupon) *OrderServicePackageDetailInfoDto { + if len(m) > 0 { + d := GetUserCouponListDto(m) + + r.UserCoupon = d + } + return r +} + +// LoadOrderServicePackageDetail 加载服务包订单详情数据 +func (r *OrderServicePackageDetailInfoDto) LoadOrderServicePackageDetail(m *model. + OrderServicePackageDetail) *OrderServicePackageDetailInfoDto { + if m != nil { + d := GetOrderServicePackageDetailDto(m) + + r.OrderServicePackageDetail = d + } + return r +} diff --git a/api/dto/OrderServicePackageCase.go b/api/dto/OrderServicePackageCase.go new file mode 100644 index 0000000..230ef3b --- /dev/null +++ b/api/dto/OrderServicePackageCase.go @@ -0,0 +1,106 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +// OrderServicePackageCaseDto 订单-服务包病例表 +type OrderServicePackageCaseDto struct { + OrderServiceCaseId string `json:"order_service_case_id"` // 主键id + UserId string `json:"user_id"` // 用户id; NOT NULL + PatientId string `json:"patient_id"` // 患者id; NOT NULL + OrderId string `json:"order_id"` // 订单id; NOT NULL + OrderServiceId string `json:"order_service_id"` // 订单-服务包id; NOT NULL + FamilyId string `json:"family_id"` // 家庭成员id; NOT NULL + DiseaseClassId string `json:"disease_class_id"` // 疾病分类id-系统 + Relation int `json:"relation"` // 与患者关系(1:本人 2:父母 3:爱人 4:子女 5:亲戚 6:其他 ) + Status int `json:"status"` // 状态(1:正常 2:删除) + Name string `json:"name"` // 患者名称 + Sex int `json:"sex"` // 患者性别(0:未知 1:男 2:女) + Age int `json:"age"` // 患者年龄 + DiseaseClassName string `json:"disease_class_name"` // 疾病名称-系统 + DiagnosisDate model.LocalTime `json:"diagnosis_date"` // 确诊日期 + DiseaseDesc string `json:"disease_desc"` // 病情描述(主诉) + DiagnoseImages string `json:"diagnose_images"` // 复诊凭证(多个使用逗号分隔) + IsAllergyHistory int `json:"is_allergy_history"` // 是否存在过敏史(0:否 1:是) + AllergyHistory string `json:"allergy_history"` // 过敏史描述 + IsFamilyHistory int `json:"is_family_history"` // 是否存在家族病史(0:否 1:是) + FamilyHistory string `json:"family_history"` // 家族病史描述 + IsPregnant int `json:"is_pregnant"` // 是否备孕、妊娠、哺乳期(0:否 1:是) + Pregnant string `json:"pregnant"` // 备孕、妊娠、哺乳期描述 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 +} + +// GetOrderServicePackageCaseDto 服务包订单病例详情 +func GetOrderServicePackageCaseDto(m *model.OrderServicePackageCase) *OrderServicePackageCaseDto { + return &OrderServicePackageCaseDto{ + OrderServiceCaseId: fmt.Sprintf("%d", m.OrderServiceCaseId), + UserId: fmt.Sprintf("%d", m.UserId), + PatientId: fmt.Sprintf("%d", m.PatientId), + OrderId: fmt.Sprintf("%d", m.OrderId), + OrderServiceId: fmt.Sprintf("%d", m.OrderServiceId), + FamilyId: fmt.Sprintf("%d", m.FamilyId), + DiseaseClassId: fmt.Sprintf("%d", m.DiseaseClassId), + Relation: m.Relation, + Status: m.Status, + Name: m.Name, + Sex: m.Sex, + Age: m.Age, + DiseaseClassName: m.DiseaseClassName, + DiagnosisDate: m.DiagnosisDate, + DiseaseDesc: m.DiseaseDesc, + DiagnoseImages: m.DiagnoseImages, + IsAllergyHistory: m.IsAllergyHistory, + AllergyHistory: m.AllergyHistory, + IsFamilyHistory: m.IsFamilyHistory, + FamilyHistory: m.FamilyHistory, + IsPregnant: m.IsPregnant, + Pregnant: m.Pregnant, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +// GetOrderServicePackageCaseListDto 服务包订单病例列表 +func GetOrderServicePackageCaseListDto(m []*model.OrderServicePackageCase) []*OrderServicePackageCaseDto { + // 处理返回值 + responses := make([]*OrderServicePackageCaseDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &OrderServicePackageCaseDto{ + OrderServiceCaseId: fmt.Sprintf("%d", v.OrderServiceCaseId), + UserId: fmt.Sprintf("%d", v.UserId), + PatientId: fmt.Sprintf("%d", v.PatientId), + OrderId: fmt.Sprintf("%d", v.OrderId), + OrderServiceId: fmt.Sprintf("%d", v.OrderServiceId), + FamilyId: fmt.Sprintf("%d", v.FamilyId), + DiseaseClassId: fmt.Sprintf("%d", v.DiseaseClassId), + Relation: v.Relation, + Status: v.Status, + Name: v.Name, + Sex: v.Sex, + Age: v.Age, + DiseaseClassName: v.DiseaseClassName, + DiagnosisDate: v.DiagnosisDate, + DiseaseDesc: v.DiseaseDesc, + DiagnoseImages: v.DiagnoseImages, + IsAllergyHistory: v.IsAllergyHistory, + AllergyHistory: v.AllergyHistory, + IsFamilyHistory: v.IsFamilyHistory, + FamilyHistory: v.FamilyHistory, + IsPregnant: v.IsPregnant, + Pregnant: v.Pregnant, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} diff --git a/api/dto/OrderServicePackageDetail.go b/api/dto/OrderServicePackageDetail.go new file mode 100644 index 0000000..f72856e --- /dev/null +++ b/api/dto/OrderServicePackageDetail.go @@ -0,0 +1,77 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +// OrderServicePackageDetailDto 订单-服务包详情表 +type OrderServicePackageDetailDto struct { + OrderServiceDetailId string `json:"order_service_detail_id"` // 主键id + OrderServiceId string `json:"order_service_id"` // 服务包订单id + OrderId string `json:"order_id"` // 订单id + PackageId string `json:"package_id"` // 健康包配置id(随访包时为空) + OrderServiceNo string `json:"order_service_no"` // 系统订单编号 + ServicePeriod int `json:"service_period"` // 服务周期(天) + ServiceCount int `json:"service_count"` // 总服务次数(0表示不限次) + MonthlyFrequency int `json:"monthly_frequency"` // 每月次数(0表示不限次) + SingleInquiryPrice float64 `json:"single_inquiry_price"` // 单次图文问诊价格 + ServicePrice float64 `json:"service_price"` // 总服务价格 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 + RemainingQuantity int `json:"remaining_quantity"` // 药品的剩余数量 +} + +// GetOrderServicePackageDetailDto 订单-服务包详情详情 +func GetOrderServicePackageDetailDto(m *model.OrderServicePackageDetail) *OrderServicePackageDetailDto { + return &OrderServicePackageDetailDto{ + OrderServiceDetailId: fmt.Sprintf("%d", m.OrderServiceDetailId), + OrderServiceId: fmt.Sprintf("%d", m.OrderServiceId), + OrderId: fmt.Sprintf("%d", m.OrderId), + PackageId: fmt.Sprintf("%d", m.PackageId), + OrderServiceNo: m.OrderServiceNo, + ServicePeriod: m.ServicePeriod, + ServiceCount: m.ServiceCount, + MonthlyFrequency: m.MonthlyFrequency, + SingleInquiryPrice: m.SingleInquiryPrice, + ServicePrice: m.ServicePrice, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +// GetOrderServicePackageDetailListDto 订单-服务包详情列表 +func GetOrderServicePackageDetailListDto(m []*model.OrderServicePackageDetail) []*OrderServicePackageDetailDto { + // 处理返回值 + responses := make([]*OrderServicePackageDetailDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &OrderServicePackageDetailDto{ + OrderServiceDetailId: fmt.Sprintf("%d", v.OrderServiceDetailId), + OrderServiceId: fmt.Sprintf("%d", v.OrderServiceId), + OrderId: fmt.Sprintf("%d", v.OrderId), + PackageId: fmt.Sprintf("%d", v.PackageId), + OrderServiceNo: v.OrderServiceNo, + ServicePeriod: v.ServicePeriod, + ServiceCount: v.ServiceCount, + MonthlyFrequency: v.MonthlyFrequency, + SingleInquiryPrice: v.SingleInquiryPrice, + ServicePrice: v.ServicePrice, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} + +// LoadRemainingQuantity 加载药品剩余数量 +func (r *OrderServicePackageDetailDto) LoadRemainingQuantity(remainingQuantity int) *OrderServicePackageDetailDto { + r.RemainingQuantity = remainingQuantity + return r +} diff --git a/api/dto/OrderServicePackageInquiry.go b/api/dto/OrderServicePackageInquiry.go new file mode 100644 index 0000000..8e3cd4c --- /dev/null +++ b/api/dto/OrderServicePackageInquiry.go @@ -0,0 +1,71 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +// OrderServicePackageInquiryDto 服务包关联问诊订单表 +type OrderServicePackageInquiryDto struct { + ServiceInquiryId string `json:"service_inquiry_id"` // 主键id + OrderServiceId string `json:"order_service_id"` // 订单-服务包id + OrderInquiryId string `json:"order_inquiry_id"` // 订单-问诊id + OrderServiceNo string `json:"order_service_no"` // 服务包系统订单编号 + InquiryNo string `json:"inquiry_no"` // 问诊系统订单编号 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 + OrderInquiry *OrderInquiryDto `json:"order_inquiry"` // 问诊订单 +} + +// GetOrderServicePackageInquiryDto 服务包关联问诊订单详情 +func GetOrderServicePackageInquiryDto(m *model.OrderServicePackageInquiry) *OrderServicePackageInquiryDto { + return &OrderServicePackageInquiryDto{ + ServiceInquiryId: fmt.Sprintf("%d", m.ServiceInquiryId), + OrderServiceId: fmt.Sprintf("%d", m.OrderServiceId), + OrderInquiryId: fmt.Sprintf("%d", m.OrderInquiryId), + OrderServiceNo: m.OrderServiceNo, + InquiryNo: m.InquiryNo, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +// GetOrderServicePackageInquiryListDto 服务包关联问诊订单列表 +func GetOrderServicePackageInquiryListDto(m []*model.OrderServicePackageInquiry) []*OrderServicePackageInquiryDto { + // 处理返回值 + responses := make([]*OrderServicePackageInquiryDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &OrderServicePackageInquiryDto{ + ServiceInquiryId: fmt.Sprintf("%d", v.ServiceInquiryId), + OrderServiceId: fmt.Sprintf("%d", v.OrderServiceId), + OrderInquiryId: fmt.Sprintf("%d", v.OrderInquiryId), + OrderServiceNo: v.OrderServiceNo, + InquiryNo: v.InquiryNo, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 加载问诊订单数据 + if v.OrderInquiry != nil { + response = response.LoadOrderInquiry(v.OrderInquiry) + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} + +// LoadOrderInquiry 加载问诊订单数据 +func (r *OrderServicePackageInquiryDto) LoadOrderInquiry(m *model.OrderInquiry) *OrderServicePackageInquiryDto { + if m != nil { + d := GetOrderInquiryDto(m) + + r.OrderInquiry = d + } + return r +} diff --git a/api/dto/OrderServicePackageProduct.go b/api/dto/OrderServicePackageProduct.go new file mode 100644 index 0000000..2e24fb8 --- /dev/null +++ b/api/dto/OrderServicePackageProduct.go @@ -0,0 +1,77 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +// OrderServicePackageProductDto 订单-服务包-关联商品订单表 +type OrderServicePackageProductDto struct { + ServiceProductId string `json:"service_product_id"` // 主键id + OrderServiceId string `json:"order_service_id"` // 订单-服务包id + OrderProductId string `json:"order_product_id"` // 订单-商品id + OrderProductNo string `json:"order_product_no"` // 订单-商品系统编号 + ProductItemId string `json:"product_item_id"` // 订单-商品明细id + ProductId string `json:"product_id"` // 商品id + UsedQuantity int `json:"used_quantity"` // 商品使用数量 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 + OrderProduct *OrderProductDto `json:"order_product"` // 药品订单 +} + +// GetOrderServicePackageProductDto 服务包订单病例详情 +func GetOrderServicePackageProductDto(m *model.OrderServicePackageProduct) *OrderServicePackageProductDto { + return &OrderServicePackageProductDto{ + ServiceProductId: fmt.Sprintf("%d", m.ServiceProductId), + OrderServiceId: fmt.Sprintf("%d", m.OrderServiceId), + OrderProductId: fmt.Sprintf("%d", m.OrderProductId), + OrderProductNo: m.OrderProductNo, + ProductItemId: fmt.Sprintf("%d", m.ProductItemId), + ProductId: fmt.Sprintf("%d", m.ProductId), + UsedQuantity: m.UsedQuantity, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +// GetOrderServicePackageProductListDto 服务包订单病例列表 +func GetOrderServicePackageProductListDto(m []*model.OrderServicePackageProduct) []*OrderServicePackageProductDto { + // 处理返回值 + responses := make([]*OrderServicePackageProductDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &OrderServicePackageProductDto{ + ServiceProductId: fmt.Sprintf("%d", v.ServiceProductId), + OrderServiceId: fmt.Sprintf("%d", v.OrderServiceId), + OrderProductId: fmt.Sprintf("%d", v.OrderProductId), + OrderProductNo: v.OrderProductNo, + ProductItemId: fmt.Sprintf("%d", v.ProductItemId), + ProductId: fmt.Sprintf("%d", v.ProductId), + UsedQuantity: v.UsedQuantity, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 加载问诊订单数据 + if v.OrderProduct != nil { + response = response.LoadOrderProduct(v.OrderProduct) + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} + +// LoadOrderProduct 加载药品订单数据 +func (r *OrderServicePackageProductDto) LoadOrderProduct(m *model.OrderProduct) *OrderServicePackageProductDto { + if m != nil { + d := GetOrderProductDto(m) + + r.OrderProduct = d + } + return r +} diff --git a/api/dto/OrderServicePackageRefund.go b/api/dto/OrderServicePackageRefund.go new file mode 100644 index 0000000..799a99c --- /dev/null +++ b/api/dto/OrderServicePackageRefund.go @@ -0,0 +1,70 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +// OrderServicePackageRefundDto 订单-服务包-退款表 +type OrderServicePackageRefundDto struct { + ServiceRefundId string `json:"service_refund_id"` // 主键id + PatientId string `json:"patient_id"` // 患者id + OrderServiceId string `json:"order_service_id"` // 订单-服务包id + OrderServiceNo string `json:"order_service_no"` // 系统订单编号 + ServiceRefundNo string `json:"service_refund_no"` // 系统退款编号 + RefundId string `json:"refund_id"` // 第三方退款单号 + RefundStatus int `json:"refund_status"` // 订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6 // :退款异常 7:部分退款) + RefundTotal float64 `json:"refund_total"` // 退款金额 + RefundReason string `json:"refund_reason"` // 退款原因 + SuccessTime model.LocalTime `json:"success_time"` // 退款成功时间 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 +} + +// GetOrderServicePackageRefundDto 服务包订单病例详情 +func GetOrderServicePackageRefundDto(m *model.OrderServicePackageRefund) *OrderServicePackageRefundDto { + return &OrderServicePackageRefundDto{ + ServiceRefundId: fmt.Sprintf("%d", m.ServiceRefundId), + PatientId: fmt.Sprintf("%d", m.PatientId), + OrderServiceId: fmt.Sprintf("%d", m.OrderServiceId), + OrderServiceNo: m.OrderServiceNo, + ServiceRefundNo: m.ServiceRefundNo, + RefundId: m.RefundId, + RefundStatus: m.RefundStatus, + RefundTotal: m.RefundTotal, + RefundReason: m.RefundReason, + SuccessTime: m.SuccessTime, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +// GetOrderServicePackageRefundListDto 服务包订单病例列表 +func GetOrderServicePackageRefundListDto(m []*model.OrderServicePackageRefund) []*OrderServicePackageRefundDto { + // 处理返回值 + responses := make([]*OrderServicePackageRefundDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &OrderServicePackageRefundDto{ + ServiceRefundId: fmt.Sprintf("%d", v.ServiceRefundId), + PatientId: fmt.Sprintf("%d", v.PatientId), + OrderServiceId: fmt.Sprintf("%d", v.OrderServiceId), + OrderServiceNo: v.OrderServiceNo, + ServiceRefundNo: v.ServiceRefundNo, + RefundId: v.RefundId, + RefundStatus: v.RefundStatus, + RefundTotal: v.RefundTotal, + RefundReason: v.RefundReason, + SuccessTime: v.SuccessTime, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} diff --git a/api/dto/UserCoupon.go b/api/dto/UserCoupon.go new file mode 100644 index 0000000..60ab469 --- /dev/null +++ b/api/dto/UserCoupon.go @@ -0,0 +1,80 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +// UserCouponDto 用户优惠卷表 +type UserCouponDto struct { + UserCouponId string `json:"user_coupon_id"` // 主键id + UserId string `json:"user_id"` // 用户id + PatientId string `json:"patient_id"` // 患者id + CouponId string `json:"coupon_id"` // 优惠卷id + UserCouponStatus int `json:"user_coupon_status"` // 状态(0:未使用 1:已使用 3:已过期) + CouponUseDate model.LocalTime `json:"coupon_use_date"` // 使用时间 + ValidStartTime model.LocalTime `json:"valid_start_time"` // 有效使用时间 + ValidEndTime model.LocalTime `json:"valid_end_time"` // 过期使用时间 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 + Coupon *CouponDto `json:"coupon"` // 优惠卷 +} + +// GetUserCouponDto 用户优惠卷详情 +func GetUserCouponDto(m *model.UserCoupon) *UserCouponDto { + return &UserCouponDto{ + UserCouponId: fmt.Sprintf("%d", m.UserCouponId), + UserId: fmt.Sprintf("%d", m.UserId), + PatientId: fmt.Sprintf("%d", m.PatientId), + CouponId: fmt.Sprintf("%d", m.CouponId), + UserCouponStatus: m.UserCouponStatus, + CouponUseDate: model.LocalTime(m.CouponUseDate), + ValidStartTime: model.LocalTime(m.ValidStartTime), + ValidEndTime: model.LocalTime(m.ValidEndTime), + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +// GetUserCouponListDto 用户优惠卷列表 +func GetUserCouponListDto(m []*model.UserCoupon) []*UserCouponDto { + // 处理返回值 + responses := make([]*UserCouponDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &UserCouponDto{ + UserCouponId: fmt.Sprintf("%d", v.UserCouponId), + UserId: fmt.Sprintf("%d", v.UserId), + PatientId: fmt.Sprintf("%d", v.PatientId), + CouponId: fmt.Sprintf("%d", v.CouponId), + UserCouponStatus: v.UserCouponStatus, + CouponUseDate: model.LocalTime(v.CouponUseDate), + ValidStartTime: model.LocalTime(v.ValidStartTime), + ValidEndTime: model.LocalTime(v.ValidEndTime), + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 加载问诊订单数据 + if v.Coupon != nil { + response = response.LoadCoupon(v.Coupon) + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} + +// LoadCoupon 加载优惠卷数据 +func (r *UserCouponDto) LoadCoupon(m *model.Coupon) *UserCouponDto { + if m != nil { + d := GetCouponDto(m) + + r.Coupon = d + } + return r +} diff --git a/api/dto/coupon.go b/api/dto/coupon.go new file mode 100644 index 0000000..0a1e8ab --- /dev/null +++ b/api/dto/coupon.go @@ -0,0 +1,124 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +// CouponDto 优惠卷表 +type CouponDto struct { + CouponId string `json:"coupon_id"` // 主键id + CouponName string `json:"coupon_name"` // 优惠卷名称 + CouponIcon string `json:"coupon_icon"` // 优惠卷图片 + CouponClient int `json:"coupon_client"` // 使用平台(1:小程序) + CouponType int `json:"coupon_type"` // 优惠卷类型(1:无门槛 2:满减 3:数量) + CouponStatus int `json:"coupon_status"` // 状态(1:正常 2:强制失效 3:结束 4:删除) + DistributionObject int `json:"distribution_object"` // 发放对象(1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户) + ApplicationScope int `json:"application_scope"` // 适用范围(1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品) + InquiryType string `json:"inquiry_type"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) + BrandId string `json:"brand_id"` // 关联品牌id(如不限制品牌,此项为空) + IsMutex int `json:"is_mutex"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 + IsDisplay int `json:"is_display"` // 是否展示(0:否 1:是) + DistributionWithDay int `json:"distribution_with_day"` // 发放关联天数(发放对象为近期消费等类型时规定天数) + MinUsableNumber int `json:"min_usable_number"` // 单商品最小可使用数量(默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) + CouponCount int `json:"coupon_count"` // 发放数量 + CouponTakeCount int `json:"coupon_take_count"` // 已领取数量 + CouponUsedCount int `json:"coupon_used_count"` // 已使用数量 + CouponPrice float64 `json:"coupon_price"` // 优惠卷金额 + WithAmount float64 `json:"with_amount"` // 符合满减标准金额(优惠卷类型为满减时使用) + ValidType int `json:"valid_type"` // 有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效) + ValidDays int `json:"valid_days"` // 自领取之日起有效天数 + ValidStartTime model.LocalTime `json:"valid_start_time"` // 开始使用时间 + ValidEndTime model.LocalTime `json:"valid_end_time"` // 结束使用时间 + ProductId string `json:"product_id"` // 关联商品id,逗号分隔,指定商品时,填入此项。 + ReissueIntervalDays int `json:"reissue_interval_days"` // 确认收货后的再次发放间隔天数(如果设置为 0,则表示不再次发放。当适用范围为商品时生效) + IsReissuableAfterExpire int `json:"is_reissuable_after_expire"` // 过期之后是否允许再次发放(0:否 1:是) + IsPopup int `json:"is_popup"` // 是否首页弹窗(0:否 1:是) + CouponDesc string `json:"coupon_desc"` // 优惠卷描述 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 +} + +// GetCouponDto 优惠卷详情 +func GetCouponDto(m *model.Coupon) *CouponDto { + return &CouponDto{ + CouponId: fmt.Sprintf("%d", m.CouponId), + CouponName: m.CouponName, + CouponIcon: m.CouponIcon, + CouponClient: m.CouponClient, + CouponType: m.CouponType, + CouponStatus: m.CouponStatus, + DistributionObject: m.DistributionObject, + ApplicationScope: m.ApplicationScope, + InquiryType: m.InquiryType, + BrandId: fmt.Sprintf("%d", m.BrandId), + IsMutex: m.IsMutex, + IsDisplay: m.IsDisplay, + DistributionWithDay: m.DistributionWithDay, + MinUsableNumber: m.MinUsableNumber, + CouponCount: m.CouponCount, + CouponTakeCount: m.CouponTakeCount, + CouponUsedCount: m.CouponUsedCount, + CouponPrice: m.CouponPrice, + WithAmount: m.WithAmount, + ValidType: m.ValidType, + ValidDays: m.ValidDays, + ValidStartTime: m.ValidStartTime, + ValidEndTime: m.ValidEndTime, + ProductId: fmt.Sprintf("%d", m.ProductId), + ReissueIntervalDays: m.ReissueIntervalDays, + IsReissuableAfterExpire: m.IsReissuableAfterExpire, + IsPopup: m.IsPopup, + CouponDesc: m.CouponDesc, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +// GetCouponListDto 优惠卷列表 +func GetCouponListDto(m []*model.Coupon) []*CouponDto { + // 处理返回值 + responses := make([]*CouponDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &CouponDto{ + CouponId: fmt.Sprintf("%d", v.CouponId), + CouponName: v.CouponName, + CouponIcon: v.CouponIcon, + CouponClient: v.CouponClient, + CouponType: v.CouponType, + CouponStatus: v.CouponStatus, + DistributionObject: v.DistributionObject, + ApplicationScope: v.ApplicationScope, + InquiryType: v.InquiryType, + BrandId: fmt.Sprintf("%d", v.BrandId), + IsMutex: v.IsMutex, + IsDisplay: v.IsDisplay, + DistributionWithDay: v.DistributionWithDay, + MinUsableNumber: v.MinUsableNumber, + CouponCount: v.CouponCount, + CouponTakeCount: v.CouponTakeCount, + CouponUsedCount: v.CouponUsedCount, + CouponPrice: v.CouponPrice, + WithAmount: v.WithAmount, + ValidType: v.ValidType, + ValidDays: v.ValidDays, + ValidStartTime: v.ValidStartTime, + ValidEndTime: v.ValidEndTime, + ProductId: fmt.Sprintf("%d", v.ProductId), + ReissueIntervalDays: v.ReissueIntervalDays, + IsReissuableAfterExpire: v.IsReissuableAfterExpire, + IsPopup: v.IsPopup, + CouponDesc: v.CouponDesc, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} diff --git a/api/model/coupon.go b/api/model/coupon.go new file mode 100644 index 0000000..338feb5 --- /dev/null +++ b/api/model/coupon.go @@ -0,0 +1,58 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// Coupon 优惠卷表 +type Coupon struct { + CouponId int64 `gorm:"column:coupon_id;type:bigint(19);primary_key;comment:主键id" json:"coupon_id"` + CouponName string `gorm:"column:coupon_name;type:varchar(255);comment:优惠卷名称" json:"coupon_name"` + CouponIcon string `gorm:"column:coupon_icon;type:varchar(255);comment:优惠卷图片" json:"coupon_icon"` + CouponClient int `gorm:"column:coupon_client;type:tinyint(1);comment:使用平台(1:小程序);NOT NULL" json:"coupon_client"` + CouponType int `gorm:"column:coupon_type;type:tinyint(1);comment:优惠卷类型(1:无门槛 2:满减 3:数量);NOT NULL" json:"coupon_type"` + CouponStatus int `gorm:"column:coupon_status;type:tinyint(1);default:1;comment:状态(1:正常 2:强制失效 3:结束 4:删除)" json:"coupon_status"` + DistributionObject int `gorm:"column:distribution_object;type:tinyint(1);default:1;comment:发放对象(1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户)" json:"distribution_object"` + ApplicationScope int `gorm:"column:application_scope;type:tinyint(1);default:1;comment:适用范围(1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品)" json:"application_scope"` + InquiryType string `gorm:"column:inquiry_type;type:varchar(100);comment:关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测)" json:"inquiry_type"` + BrandId int64 `gorm:"column:brand_id;type:bigint(19);comment:关联品牌id(如不限制品牌,此项为空)" json:"brand_id"` + IsMutex int `gorm:"column:is_mutex;type:tinyint(1);default:1;comment:是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用" json:"is_mutex"` + IsDisplay int `gorm:"column:is_display;type:tinyint(1);comment:是否展示(0:否 1:是)" json:"is_display"` + DistributionWithDay int `gorm:"column:distribution_with_day;type:int(11);default:0;comment:发放关联天数(发放对象为近期消费等类型时规定天数)" json:"distribution_with_day"` + MinUsableNumber int `gorm:"column:min_usable_number;type:int(11);default:1;comment:单商品最小可使用数量(默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处)" json:"min_usable_number"` + CouponCount int `gorm:"column:coupon_count;type:int(10);default:0;comment:发放数量" json:"coupon_count"` + CouponTakeCount int `gorm:"column:coupon_take_count;type:int(10);default:0;comment:已领取数量" json:"coupon_take_count"` + CouponUsedCount int `gorm:"column:coupon_used_count;type:int(10);default:0;comment:已使用数量" json:"coupon_used_count"` + CouponPrice float64 `gorm:"column:coupon_price;type:decimal(10,2);default:0.00;comment:优惠卷金额" json:"coupon_price"` + WithAmount float64 `gorm:"column:with_amount;type:decimal(10,2);default:0.00;comment:符合满减标准金额(优惠卷类型为满减时使用)" json:"with_amount"` + ValidType int `gorm:"column:valid_type;type:tinyint(4);comment:有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效);NOT NULL" json:"valid_type"` + ValidDays int `gorm:"column:valid_days;type:int(3);comment:自领取之日起有效天数" json:"valid_days"` + ValidStartTime LocalTime `gorm:"column:valid_start_time;type:datetime;comment:开始使用时间" json:"valid_start_time"` + ValidEndTime LocalTime `gorm:"column:valid_end_time;type:datetime;comment:结束使用时间" json:"valid_end_time"` + ProductId string `gorm:"column:product_id;type:text;comment:关联商品id,逗号分隔,指定商品时,填入此项。" json:"product_id"` + ReissueIntervalDays int `gorm:"column:reissue_interval_days;type:int(5);default:0;comment:确认收货后的再次发放间隔天数(如果设置为 0,则表示不再次发放。当适用范围为商品时生效)" json:"reissue_interval_days"` + IsReissuableAfterExpire int `gorm:"column:is_reissuable_after_expire;type:tinyint(1);default:0;comment:过期之后是否允许再次发放(0:否 1:是)" json:"is_reissuable_after_expire"` + IsPopup int `gorm:"column:is_popup;type:tinyint(1);default:0;comment:是否首页弹窗(0:否 1:是)" json:"is_popup"` + CouponDesc string `gorm:"column:coupon_desc;type:text;comment:优惠卷描述" json:"coupon_desc"` + Model +} + +func (m *Coupon) TableName() string { + return "gdxz_coupon" +} + +func (m *Coupon) BeforeCreate(tx *gorm.DB) error { + if m.CouponId == 0 { + m.CouponId = 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/orderServicePackage.go b/api/model/orderServicePackage.go index a65af7d..a1e1c4c 100644 --- a/api/model/orderServicePackage.go +++ b/api/model/orderServicePackage.go @@ -39,8 +39,10 @@ type OrderServicePackage struct { PatientSex int `gorm:"column:patient_sex;type:tinyint(1);default:0;comment:患者性别-就诊人(0:未知 1:男 2:女)" json:"patient_sex"` PatientAge int `gorm:"column:patient_age;type:int(1);comment:患者年龄-就诊人" json:"patient_age"` Model - UserDoctor *UserDoctor `gorm:"foreignKey:DoctorId;references:doctor_id" json:"user_doctor"` // 医生 - User *User `gorm:"foreignKey:UserId;references:user_id" json:"user"` // 患者 + UserDoctor *UserDoctor `gorm:"foreignKey:DoctorId;references:doctor_id" json:"user_doctor"` // 医生 + User *User `gorm:"foreignKey:UserId;references:user_id" json:"user"` // 患者 + OrderServicePackageInquiry []*OrderServicePackageInquiry `gorm:"foreignKey:OrderServiceId;references:order_service_id" json:"order_service_package_inquiry"` // 关联问诊订单 + OrderServicePackageProduct []*OrderServicePackageProduct `gorm:"foreignKey:OrderServiceId;references:order_service_id" json:"order_service_package_product"` // 关联商品订单 } func (m *OrderServicePackage) TableName() string { diff --git a/api/model/orderServicePackageInquiry.go b/api/model/orderServicePackageInquiry.go index 808a3b8..b281f99 100644 --- a/api/model/orderServicePackageInquiry.go +++ b/api/model/orderServicePackageInquiry.go @@ -14,6 +14,7 @@ type OrderServicePackageInquiry struct { OrderServiceNo string `gorm:"column:order_service_no;type:varchar(30);comment:服务包系统订单编号" json:"order_service_no"` InquiryNo string `gorm:"column:inquiry_no;type:varchar(30);comment:问诊系统订单编号" json:"inquiry_no"` Model + OrderInquiry *OrderInquiry `gorm:"foreignKey:OrderInquiryId;references:order_inquiry_id" json:"order_inquiry"` // 关联问诊订单 } func (m *OrderServicePackageInquiry) TableName() string { diff --git a/api/model/orderServicePackageProduct.go b/api/model/orderServicePackageProduct.go index 8bbc8e6..f08e45c 100644 --- a/api/model/orderServicePackageProduct.go +++ b/api/model/orderServicePackageProduct.go @@ -16,6 +16,7 @@ type OrderServicePackageProduct struct { ProductId int64 `gorm:"column:product_id;type:bigint(19);comment:商品id;NOT NULL" json:"product_id"` UsedQuantity int `gorm:"column:used_quantity;type:int(1);default:0;comment:商品使用数量" json:"used_quantity"` Model + OrderProduct *OrderProduct `gorm:"foreignKey:OrderProductId;references:order_product_id" json:"order_product"` // 关联药品订单 } func (m *OrderServicePackageProduct) TableName() string { diff --git a/api/model/userCoupon.go b/api/model/userCoupon.go index 15d563f..c2baead 100644 --- a/api/model/userCoupon.go +++ b/api/model/userCoupon.go @@ -17,6 +17,7 @@ type UserCoupon struct { ValidStartTime time.Time `gorm:"column:valid_start_time;type:datetime;comment:有效使用时间" json:"valid_start_time"` ValidEndTime time.Time `gorm:"column:valid_end_time;type:datetime;comment:过期使用时间" json:"valid_end_time"` Model + Coupon *Coupon `gorm:"foreignKey:CouponId;references:coupon_id" json:"coupon"` } func (m *UserCoupon) TableName() string { diff --git a/api/router/router.go b/api/router/router.go index a925bd2..d1e0277 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -454,11 +454,14 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 获取服务包订单列表-分页 serviceGroup.POST("/page", api.OrderServicePackage.GetOrderServicePackagePage) - // 问诊订单详情 - serviceGroup.GET("/:order_inquiry_id", api.OrderInquiry.GetOrderInquiry) + // 获取服务包订单详情 + serviceGroup.GET("/:order_service_id", api.OrderServicePackage.GetOrderServicePackage) + + // 获取服务包订单服务权益详情 + serviceGroup.GET("/detail/:order_service_id", api.OrderServicePackage.GetOrderServicePackageDetailInfo) // 取消问诊订单 - serviceGroup.PUT("/cancel/:order_inquiry_id", api.OrderInquiry.CancelOrderInquiry) + serviceGroup.PUT("/cancel/:order_inquiry_id", api.OrderServicePackage.GetOrderServicePackageDetailInfo) } } diff --git a/api/service/orderServicePackage.go b/api/service/orderServicePackage.go new file mode 100644 index 0000000..703e144 --- /dev/null +++ b/api/service/orderServicePackage.go @@ -0,0 +1,255 @@ +package service + +import ( + "errors" + "hospital-admin-api/api/dao" + "hospital-admin-api/api/dto" + "hospital-admin-api/api/model" + "strconv" + "time" +) + +type OrderServicePackageService struct { +} + +// GetOrderServicePackage 服务包订单详情 +func (r *OrderServicePackageService) GetOrderServicePackage(orderServiceId int64) (g *dto.OrderServicePackageDto, err error) { + // 获取订单数据 + orderServicePackageDao := dao.OrderServicePackageDao{} + orderServicePackage, err := orderServicePackageDao.GetOrderServicePackageById(orderServiceId) + if err != nil || orderServicePackage == nil { + return nil, errors.New(err.Error()) + } + + // 获取病例 + orderServicePackageCaseDao := dao.OrderServicePackageCaseDao{} + orderServicePackageCase, err := orderServicePackageCaseDao.GetOrderServicePackageCaseByOrderServicePackageId(orderServiceId) + if orderServicePackageCase == nil { + return nil, errors.New("数据错误,无问诊病例") + } + + // 获取退款数据 + orderServicePackageRefundDao := dao.OrderServicePackageRefundDao{} + orderServicePackageRefund, err := orderServicePackageRefundDao.GetOrderServicePackageRefundByOrderServicePackageId(orderServiceId) + + // 医生数据 + userDoctorService := UserDoctorService{} + userDoctor, err := userDoctorService.GetUserDoctorById(orderServicePackage.DoctorId) + if err != nil { + return nil, errors.New(err.Error()) + } + + // 处理返回值 + g = dto.GetOrderServicePackageDto(orderServicePackage) + + // 加载医生数据 + g.UserDoctor = userDoctor + + // 加载订单退款数据 + g.LoadOrderServicePackageRefund(orderServicePackageRefund) + + // 加载问诊病例 + g.LoadMaskOrderServicePackageCase(orderServicePackageCase) + + return g, nil +} + +// GetOrderServicePackageDetailInfo 获取服务包订单服务权益详情 +func (r *OrderServicePackageService) GetOrderServicePackageDetailInfo(orderServiceId int64) (g *dto.OrderServicePackageDetailInfoDto, err error) { + // 获取订单数据 + orderServicePackageDao := dao.OrderServicePackageDao{} + orderServicePackage, err := orderServicePackageDao.GetOrderServicePackageById(orderServiceId) + if err != nil || orderServicePackage == nil { + return nil, errors.New(err.Error()) + } + + // 获取关联问诊订单 + orderServicePackageInquiryDao := dao.OrderServicePackageInquiryDao{} + orderServicePackageInquiry, err := orderServicePackageInquiryDao.GetOrderServicePackageInquiryPreloadByOrderNo(orderServicePackage.OrderServiceNo) + + // 获取订单详情数据 + orderServicePackageDDao := dao.OrderServicePackageDetailDao{} + orderServicePackageDetail, err := orderServicePackageDDao.GetOrderServicePackageDetailByOrderServicePackageId(orderServiceId) + if err != nil || orderServicePackageDetail == nil { + return nil, errors.New(err.Error()) + } + + // 处理返回值 + g = dto.GetOrderServicePackageDetailInfoDto(orderServicePackage) + + // 加载关联问诊订单数据 + g.LoadOrderServicePackageInquiry(orderServicePackageInquiry) + + // 加载服务包订单详情数据 + g.LoadOrderServicePackageDetail(orderServicePackageDetail) + + // 获取服务包当前月时间区间 + CurrentMonthStartDate, CurrentMonthFinishDate, err := r.getOrderServicePackageCurrentMonthDate(g.StartTime) + g.CurrentMonthStartDate = CurrentMonthStartDate.Format("2006年01月02日 15时04分") + g.CurrentMonthFinishDate = CurrentMonthFinishDate.Format("2006年01月02日 15时04分") + + // 获取服务包当月已问诊次数 + g.MonthInquiryCount, err = r.GetCurrentMonthInquiryCount(g.OrderServiceType, orderServicePackage.UserId, orderServicePackage.DoctorId, CurrentMonthStartDate, CurrentMonthFinishDate) + if err != nil { + return nil, err + } + + // 获取服务包当月剩余问诊次数 + g.RemainingInquiryCount = r.GetRemainingInquiryCount(orderServicePackageDetail.MonthlyFrequency, g.MonthInquiryCount) + + // 健康包数据 + if orderServicePackage.OrderServiceType == 1 { + if g.OrderServiceStatus == 3 || g.OrderServiceStatus == 4 || g.OrderServiceStatus == 5 { + // 获取用户某一类型优惠卷 + userCouponDao := dao.UserCouponDao{} + userCoupon, _ := userCouponDao.GetUserAllObjectTypeCoupon(orderServicePackage.UserId, 7) + + // 加载优惠卷数据 + g.LoadUserCoupon(userCoupon) + + // 获取健康包药品订单数据-周期内所有药品订单 + orderServicePackageProductDao := dao.OrderServicePackageProductDao{} + orderServicePackageProduct, _ := orderServicePackageProductDao.GetOrderServicePackageProductPreloadByOrderServiceId( + orderServicePackage.OrderServiceId) + + // 加载关联药品订单数据 + g.LoadOrderServicePackageProduct(orderServicePackageProduct) + + // 获取服务包内所有药品 + healthPackageProductDao := dao.HealthPackageProductDao{} + + maps := make(map[string]interface{}) + maps["inquiry_type"] = 1 + healthPackageProducts, err := healthPackageProductDao.GetHealthPackageProductByPackageId(orderServicePackageDetail.PackageId) + if err != nil { + return nil, err + } + + for _, healthPackageProduct := range healthPackageProducts { + // 获取服务包内某一药品的剩余数量 + remainingQuantity, err := r.GetOrderServiceProductCanUseQuantity(orderServicePackage.OrderServiceId, healthPackageProduct.ProductId, healthPackageProduct.Quantity) + if err != nil { + return nil, err + } + + g.OrderServicePackageDetail.LoadRemainingQuantity(remainingQuantity) + } + } + } + + return g, nil +} + +// 获取服务包当前月时间区间 +func (r *OrderServicePackageService) getOrderServicePackageCurrentMonthDate(startTime model.LocalTime) (startDate, finishDate time.Time, err error) { + if startTime.IsEmpty() { + return time.Time{}, time.Time{}, err + } + + // 获取当前时间 + now := time.Now() + + // 获取开启服务日期和今日的相差天数 + diff := now.Sub(time.Time(startTime)).Hours() / 24 + diffDays := int(diff) + + // 获取当前月次 + monthTime := (diffDays + 29) / 30 // 向上取整 + + days := monthTime * 30 + + // 当前所属月结束时间 + currentMonthFinishDate := time.Time(startTime).AddDate(0, 0, days) + + // 当前所属月开始时间 + currentMonthStartDate := currentMonthFinishDate.AddDate(0, 0, -30) + + return currentMonthStartDate, currentMonthFinishDate, nil +} + +// 检测问诊是否服务包首次问诊 +func (r *OrderServicePackageService) isFirstInquiryServicePackage(orderNo string) (bool, error) { + orderServicePackageDao := dao.OrderServicePackageDao{} + + maps := make(map[string]interface{}) + maps["order_service_no"] = orderNo + orderServicePackage, err := orderServicePackageDao.GetOrderServicePackageList(maps) + if err != nil { + return false, err + } + + if len(orderServicePackage) == 1 { + return true, nil + } + + return false, err +} + +// GetCurrentMonthInquiryCount 获取服务包当月已问诊次数 +func (r *OrderServicePackageService) GetCurrentMonthInquiryCount(orderServiceType int, userId, doctorId int64, startDate, endDate time.Time) (int, error) { + orderInquiryDao := dao.OrderInquiryDao{} + + maps := make(map[string]interface{}) + maps["inquiry_type"] = 1 + + if orderServiceType == 1 { + maps["inquiry_mode"] = 8 + } else { + maps["inquiry_mode"] = 9 + } + + maps["user_id"] = userId + maps["doctor_id"] = doctorId + maps["inquiry_refund_status"] = 0 + maps["inquiry_pay_status"] = 2 + maps["inquiry_status"] = []int{1, 2, 3, 4, 5, 6} + orderInquirys, err := orderInquiryDao.GetOrderInquiryTimeList(maps, startDate.Format("2006-01-02 15:04"), endDate.Format("2006-01-02 15:04:05")) + if err != nil { + return 0, err + } + + return len(orderInquirys), err +} + +// GetRemainingInquiryCount 获取服务包当月剩余问诊次数 +func (r *OrderServicePackageService) GetRemainingInquiryCount(monthlyFrequency, monthInquiryCount int) string { + result := "" + if monthlyFrequency != 0 { + monthInquiryCount = monthlyFrequency - monthInquiryCount + if monthInquiryCount < 0 { + result = "0" + } else { + result = strconv.Itoa(monthInquiryCount) + } + } else { + result = "不限" + } + return result +} + +// GetOrderServiceProductCanUseQuantity 获取服务包内某一药品的可使用数量 +func (r *OrderServicePackageService) GetOrderServiceProductCanUseQuantity(orderServiceId, productId int64, totalQuantity int) (int, error) { + orderServicePackageProductDao := dao.OrderServicePackageProductDao{} + + maps := make(map[string]interface{}) + maps["order_service_id"] = orderServiceId + maps["product_id"] = productId + orderServicePackageProducts, err := orderServicePackageProductDao.GetOrderServicePackageProductList(maps) + if err != nil { + return 0, err + } + + // 订单使用数量 + usedQuantity := 0 + for _, product := range orderServicePackageProducts { + usedQuantity = usedQuantity + product.UsedQuantity + } + + // 剩余数量 = 总数量-使用数量 + remainingQuantity := totalQuantity - usedQuantity + if remainingQuantity < 0 { + remainingQuantity = 0 + } + + return remainingQuantity, err +} From 0bae6f821f60a780998ec598188620d63748ece0 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 27 May 2024 18:30:23 +0800 Subject: [PATCH 12/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=9C=8D=E5=8A=A1=E5=8C=85=E8=AE=A2=E5=8D=95=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E6=9D=83=E7=9B=8A=E8=AF=A6=E6=83=851?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/orderServicePackage.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/api/service/orderServicePackage.go b/api/service/orderServicePackage.go index 703e144..ad5664f 100644 --- a/api/service/orderServicePackage.go +++ b/api/service/orderServicePackage.go @@ -117,9 +117,6 @@ func (r *OrderServicePackageService) GetOrderServicePackageDetailInfo(orderServi // 获取服务包内所有药品 healthPackageProductDao := dao.HealthPackageProductDao{} - - maps := make(map[string]interface{}) - maps["inquiry_type"] = 1 healthPackageProducts, err := healthPackageProductDao.GetHealthPackageProductByPackageId(orderServicePackageDetail.PackageId) if err != nil { return nil, err From 061c91c686500d98111f0d4bfcd16961f9da9d0e Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 28 May 2024 09:53:55 +0800 Subject: [PATCH 13/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=B3=BB=E7=BB=9F=E4=BC=98=E6=83=A0=E5=8D=B7=E5=88=97?= =?UTF-8?q?=E8=A1=A8-=E5=88=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/base.go | 6 ++ api/controller/coupon.go | 58 ++++++++++++++ api/dao/coupon.go | 167 +++++++++++++++++++++++++++++++++++++++ api/dto/coupon.go | 4 +- api/requests/coupon.go | 26 ++++++ api/router/router.go | 42 ++++++++++ 6 files changed, 301 insertions(+), 2 deletions(-) create mode 100644 api/controller/coupon.go create mode 100644 api/dao/coupon.go create mode 100644 api/requests/coupon.go diff --git a/api/controller/base.go b/api/controller/base.go index 290330d..4fd5c69 100644 --- a/api/controller/base.go +++ b/api/controller/base.go @@ -16,6 +16,7 @@ type Api struct { financeManage // 财务管理 exportManage // 导出管理 productManage // 商品管理 + couponManage // 优惠卷管理 } // SysSetting 系统设置 @@ -91,3 +92,8 @@ type exportManage struct { type productManage struct { Product } + +// 优惠卷管理 +type couponManage struct { + Coupon +} diff --git a/api/controller/coupon.go b/api/controller/coupon.go new file mode 100644 index 0000000..6d14a35 --- /dev/null +++ b/api/controller/coupon.go @@ -0,0 +1,58 @@ +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/global" + "hospital-admin-api/utils" +) + +type Coupon struct{} + +// GetSystemCouponPage 获取系统优惠卷列表-分页 +func (r *Coupon) GetSystemCouponPage(c *gin.Context) { + couponRequest := requests.CouponRequest{} + req := couponRequest.GetSystemCouponPage + 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 + } + + couponDao := dao.CouponDao{} + coupon, total, err := couponDao.GetCouponPageSearch(req, req.Page, req.PageSize) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + GetProductPlatformPageResponses := dto.GetCouponListDto(coupon) + 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/coupon.go b/api/dao/coupon.go new file mode 100644 index 0000000..c20d879 --- /dev/null +++ b/api/dao/coupon.go @@ -0,0 +1,167 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" + "hospital-admin-api/global" + "strings" + "time" +) + +type CouponDao struct { +} + +// GetCouponById 获取数据-id +func (r *CouponDao) GetCouponById(couponId int64) (m *model.Coupon, err error) { + err = global.Db.First(&m, couponId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetCouponPreloadById 获取数据-加载全部关联-id +func (r *CouponDao) GetCouponPreloadById(couponId int64) (m *model.Coupon, err error) { + err = global.Db.Preload(clause.Associations).First(&m, couponId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// EditCoupon 修改 +func (r *CouponDao) EditCoupon(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.Coupon{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditCouponByOrderServicePackageId 修改-id +func (r *CouponDao) EditCouponByOrderServicePackageId(tx *gorm.DB, couponId int64, data interface{}) error { + err := tx.Model(&model.Coupon{}).Where("coupon_id = ?", couponId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetCouponList 获取列表 +func (r *CouponDao) GetCouponList(maps interface{}) (m []*model.Coupon, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddCoupon 新增 +func (r *CouponDao) AddCoupon(tx *gorm.DB, model *model.Coupon) (*model.Coupon, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} + +// GetCouponPageSearch 获取列表-分页 +func (r *CouponDao) GetCouponPageSearch(req requests.GetSystemCouponPage, page, pageSize int) (m []*model.Coupon, total int64, err error) { + var totalRecords int64 + + // 构建查询条件 + query := global.Db.Model(&model.Coupon{}) + + // 优惠卷名称 + if req.CouponName != "" { + query = query.Where("coupon_name LIKE ?", "%"+req.CouponName+"%") + } + + // 使用平台(1:小程序) + if req.CouponClient != nil { + query = query.Where("coupon_client = ?", req.CouponClient) + } + + // 优惠卷类型(1:无门槛 2:满减 3:数量 + if req.CouponType != nil { + query = query.Where("coupon_type = ?", req.CouponType) + } + + // 状态(1:正常 2:强制失效 3:结束 4:删除) + if req.CouponStatus != nil { + query = query.Where("coupon_status = ?", req.CouponStatus) + } + + // 发放对象(1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户) + if req.DistributionObject != nil { + query = query.Where("distribution_object = ?", req.DistributionObject) + } + + // 适用范围(1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品) + if req.ApplicationScope != nil { + query = query.Where("application_scope = ?", req.ApplicationScope) + } + + // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) + if req.InquiryType != "" { + query = query.Where("inquiry_type = ?", req.InquiryType) + } + + // 关联品牌id(如不限制品牌,此项为空) + if req.BrandId != "" { + query = query.Where("brand_id = ?", req.BrandId) + } + + // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 + if req.IsMutex != nil { + query = query.Where("is_mutex = ?", req.IsMutex) + } + + // 是否展示(0:否 1:是) + if req.IsDisplay != nil { + query = query.Where("is_display = ?", req.IsDisplay) + } + + // 有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效) + if req.ValidType != nil { + query = query.Where("valid_type = ?", req.ValidType) + } + + // 过期之后是否允许再次发放(0:否 1:是) + if req.IsReissuableAfterExpire != nil { + query = query.Where("is_reissuable_after_expire = ?", req.IsReissuableAfterExpire) + } + + // 是否首页弹窗(0:否 1:是) + if req.IsPopup != nil { + query = query.Where("is_popup = ?", req.IsPopup) + } + + // 创建时间 + if req.CreatedAt != "" { + createdAt := strings.Split(req.CreatedAt, "&") + if len(createdAt) == 2 { + startTime, _ := time.Parse("2006-01-02", createdAt[0]) + endTime, _ := time.Parse("2006-01-02", createdAt[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("created_at BETWEEN ? AND ?", startTime, endTime) + } + } + + // 排序 + 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/coupon.go b/api/dto/coupon.go index 0a1e8ab..ec170eb 100644 --- a/api/dto/coupon.go +++ b/api/dto/coupon.go @@ -65,7 +65,7 @@ func GetCouponDto(m *model.Coupon) *CouponDto { ValidDays: m.ValidDays, ValidStartTime: m.ValidStartTime, ValidEndTime: m.ValidEndTime, - ProductId: fmt.Sprintf("%d", m.ProductId), + ProductId: m.ProductId, ReissueIntervalDays: m.ReissueIntervalDays, IsReissuableAfterExpire: m.IsReissuableAfterExpire, IsPopup: m.IsPopup, @@ -106,7 +106,7 @@ func GetCouponListDto(m []*model.Coupon) []*CouponDto { ValidDays: v.ValidDays, ValidStartTime: v.ValidStartTime, ValidEndTime: v.ValidEndTime, - ProductId: fmt.Sprintf("%d", v.ProductId), + ProductId: v.ProductId, ReissueIntervalDays: v.ReissueIntervalDays, IsReissuableAfterExpire: v.IsReissuableAfterExpire, IsPopup: v.IsPopup, diff --git a/api/requests/coupon.go b/api/requests/coupon.go new file mode 100644 index 0000000..fdd4761 --- /dev/null +++ b/api/requests/coupon.go @@ -0,0 +1,26 @@ +package requests + +type CouponRequest struct { + GetSystemCouponPage // 获取系统优惠卷列表-分页 +} + +// GetSystemCouponPage 获取系统优惠卷列表-分页 +type GetSystemCouponPage struct { + Page int `json:"page" form:"page" label:"页码"` + PageSize int `json:"page_size" form:"page_size" label:"每页个数"` + CouponName string `json:"coupon_name" form:"coupon_name" label:"优惠卷名称"` // 优惠卷名称 + CouponClient *int `json:"coupon_client" form:"coupon_client" label:"使用平台(1:小程序)"` // 使用平台(1:小程序) + CouponType *int `json:"coupon_type" form:"coupon_type" label:"优惠卷类型(1:无门槛 2:满减 3:数量)"` // 优惠卷类型(1:无门槛 2:满减 3:数量) + CouponStatus *int `json:"coupon_status" form:"coupon_status" label:"状态(1:正常 2:强制失效 3:结束 4:删除)"` // 状态(1:正常 2:强制失效 3:结束 4:删除) + DistributionObject *int `json:"distribution_object" form:"distribution_object" label:"发放对象(1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户)"` // 发放对象(1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户) + ApplicationScope *int `json:"application_scope" form:"application_scope" label:"适用范围(1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品)"` // 适用范围(1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品) + InquiryType string `json:"inquiry_type" form:"inquiry_type" label:"关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测)"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) + BrandId string `json:"brand_id" form:"brand_id" label:"关联品牌id(如不限制品牌,此项为空)"` // 关联品牌id(如不限制品牌,此项为空) + IsMutex *int `json:"is_mutex" form:"is_mutex" label:"是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 + IsDisplay *int `json:"is_display" form:"is_display" label:"是否展示(0:否 1:是)"` // 是否展示(0:否 1:是) + ValidType *int `json:"valid_type" form:"valid_type" label:"有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效)"` // 有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效) + IsReissuableAfterExpire *int `json:"is_reissuable_after_expire" form:"is_reissuable_after_expire" label:"过期之后是否允许再次发放(0:否 1:是)"` // 过期之后是否允许再次发放(0:否 1:是) + IsPopup *int `json:"is_popup" form:"is_popup" label:"是否首页弹窗(0:否 1:是)"` // 是否首页弹窗(0:否 1:是) + CouponDesc string `json:"coupon_desc" form:"coupon_desc" label:"优惠卷描述"` + CreatedAt string `json:"created_at" form:"created_at" label:"创建时间"` // 创建时间 +} diff --git a/api/router/router.go b/api/router/router.go index d1e0277..65b02bc 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -719,4 +719,46 @@ func privateRouter(r *gin.Engine, api controller.Api) { platformGroup.GET("/list", api.Product.GetPlatformProductList) } } + + // 优惠卷管理 + couponGroup := adminGroup.Group("/coupon") + { + // 系统优惠卷管理 + systemGroup := couponGroup.Group("/system") + { + // 获取系统优惠卷列表-分页 + systemGroup.POST("/page", api.Coupon.GetSystemCouponPage) + + // 系统优惠卷详情 + systemGroup.GET("/:product_id", api.Product.GetProduct) + + // 新增系统优惠卷 + systemGroup.POST("", api.Product.AddProduct) + + // 修改系统优惠卷 + systemGroup.PUT("/:product_id", api.Product.PutProduct) + + // 修改系统优惠卷状态 + systemGroup.PUT("/status/:product_id", api.Product.PutProductStatus) + } + + // 用户优惠卷管理 + userGroup := couponGroup.Group("/user") + { + // 获取用户优惠卷列表-分页 + userGroup.POST("/page", api.Product.GetProductPage) + + // 系统用户优惠卷详情 + userGroup.GET("/:product_id", api.Product.GetProduct) + + // 新增用户优惠卷 + userGroup.POST("", api.Product.AddProduct) + + // 修改用户优惠卷 + userGroup.PUT("/:product_id", api.Product.PutProduct) + + // 修改用户优惠卷状态 + userGroup.PUT("/status/:product_id", api.Product.PutProductStatus) + } + } } From 3e381fdd43e9676ac3eb7fbf7f54bf75df08c48d Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 28 May 2024 14:59:04 +0800 Subject: [PATCH 14/78] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=8C=85=E8=AE=A2=E5=8D=95=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E6=9D=83=E7=9B=8A=E8=AF=A6=E6=83=85=20=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dto/OrderServicePackage.go | 72 +++++++++++++++++++----------- api/service/orderServicePackage.go | 4 +- 2 files changed, 49 insertions(+), 27 deletions(-) diff --git a/api/dto/OrderServicePackage.go b/api/dto/OrderServicePackage.go index c9b0b22..8901f88 100644 --- a/api/dto/OrderServicePackage.go +++ b/api/dto/OrderServicePackage.go @@ -48,28 +48,28 @@ type OrderServicePackageDto struct { // OrderServicePackageDetailInfoDto 服务包权益 type OrderServicePackageDetailInfoDto struct { - OrderServiceId string `json:"order_service_id"` // 主键id - OrderId string `json:"order_id"` // 订单id - UserId string `json:"user_id"` // 用户id-患者 - PatientId string `json:"patient_id"` // 患者id - DoctorId string `json:"doctor_id"` // 医生id - FamilyId string `json:"family_id"` // 家庭成员id(就诊用户) - OrderServiceType int `json:"order_service_type"` // 服务包类型(1:健康包 2:随访包) - OrderServiceStatus int `json:"order_service_status"` // 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) - IsDelete int `json:"is_delete"` // 删除状态(0:否 1:是) - OrderServiceNo string `json:"order_service_no"` // 系统订单编号 - PayTime model.LocalTime `json:"pay_time"` // 支付时间 - StartTime model.LocalTime `json:"start_time"` // 开始服务时间 - FinishTime model.LocalTime `json:"finish_time"` // 结束服务时间 - CreatedAt model.LocalTime `json:"created_at"` // 创建时间 - OrderServicePackageProduct []*OrderServicePackageProductDto `json:"order_service_package_product"` // 关联商品订单 - OrderServicePackageInquiry []*OrderServicePackageInquiryDto `json:"order_service_package_inquiry"` // 关联问诊订单 - UserCoupon []*UserCouponDto `json:"user_coupon"` // 关联优惠卷 - OrderServicePackageDetail *OrderServicePackageDetailDto `json:"order_service_package_detail"` // 服务包订单详情 - CurrentMonthStartDate string `json:"current_month_start_date"` // 当月开始时间 - CurrentMonthFinishDate string `json:"current_month_finish_date"` // 当月结束时间 - MonthInquiryCount int `json:"month_inquiry_count"` // 当月问诊次数 - RemainingInquiryCount string `json:"remaining_inquiry_count"` // 当月剩余问诊次数 + OrderServiceId string `json:"order_service_id"` // 主键id + OrderId string `json:"order_id"` // 订单id + UserId string `json:"user_id"` // 用户id-患者 + PatientId string `json:"patient_id"` // 患者id + DoctorId string `json:"doctor_id"` // 医生id + FamilyId string `json:"family_id"` // 家庭成员id(就诊用户) + OrderServiceType int `json:"order_service_type"` // 服务包类型(1:健康包 2:随访包) + OrderServiceStatus int `json:"order_service_status"` // 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) + IsDelete int `json:"is_delete"` // 删除状态(0:否 1:是) + OrderServiceNo string `json:"order_service_no"` // 系统订单编号 + PayTime model.LocalTime `json:"pay_time"` // 支付时间 + StartTime model.LocalTime `json:"start_time"` // 开始服务时间 + FinishTime model.LocalTime `json:"finish_time"` // 结束服务时间 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + OrderProduct []*OrderProductDto `json:"order_product"` // 关联商品订单 + OrderInquiry []*OrderInquiryDto `json:"order_inquiry"` // 关联问诊订单 + UserCoupon []*UserCouponDto `json:"user_coupon"` // 关联优惠卷 + OrderServicePackageDetail *OrderServicePackageDetailDto `json:"order_service_package_detail"` // 服务包订单详情 + CurrentMonthStartDate string `json:"current_month_start_date"` // 当月开始时间 + CurrentMonthFinishDate string `json:"current_month_finish_date"` // 当月结束时间 + MonthInquiryCount int `json:"month_inquiry_count"` // 当月问诊次数 + RemainingInquiryCount string `json:"remaining_inquiry_count"` // 当月剩余问诊次数 } // GetOrderServicePackageDto 服务包订单详情 @@ -229,9 +229,19 @@ func (r *OrderServicePackageDto) LoadMaskOrderServicePackageCase(m *model.OrderS // LoadOrderServicePackageProduct 加载关联商品订单 func (r *OrderServicePackageDetailInfoDto) LoadOrderServicePackageProduct(m []*model.OrderServicePackageProduct) *OrderServicePackageDetailInfoDto { if len(m) > 0 { - d := GetOrderServicePackageProductListDto(m) + responses := make([]*OrderProductDto, len(m)) - r.OrderServicePackageProduct = d + for i, inquiry := range m { + if inquiry.OrderProduct != nil { + // 将转换后的结构体添加到新切片中 + response := GetOrderProductDto(inquiry.OrderProduct) + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + r.OrderProduct = responses } return r } @@ -239,9 +249,19 @@ func (r *OrderServicePackageDetailInfoDto) LoadOrderServicePackageProduct(m []*m // LoadOrderServicePackageInquiry 加载关联问诊订单 func (r *OrderServicePackageDetailInfoDto) LoadOrderServicePackageInquiry(m []*model.OrderServicePackageInquiry) *OrderServicePackageDetailInfoDto { if len(m) > 0 { - d := GetOrderServicePackageInquiryListDto(m) + responses := make([]*OrderInquiryDto, len(m)) - r.OrderServicePackageInquiry = d + for i, inquiry := range m { + if inquiry.OrderInquiry != nil { + // 将转换后的结构体添加到新切片中 + response := GetOrderInquiryDto(inquiry.OrderInquiry) + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + r.OrderInquiry = responses } return r } diff --git a/api/service/orderServicePackage.go b/api/service/orderServicePackage.go index ad5664f..dc58b40 100644 --- a/api/service/orderServicePackage.go +++ b/api/service/orderServicePackage.go @@ -78,7 +78,9 @@ func (r *OrderServicePackageService) GetOrderServicePackageDetailInfo(orderServi g = dto.GetOrderServicePackageDetailInfoDto(orderServicePackage) // 加载关联问诊订单数据 - g.LoadOrderServicePackageInquiry(orderServicePackageInquiry) + if len(orderServicePackageInquiry) > 0 { + g.LoadOrderServicePackageInquiry(orderServicePackageInquiry) + } // 加载服务包订单详情数据 g.LoadOrderServicePackageDetail(orderServicePackageDetail) From a2e4c2286f1a7ed296c6f7fd391943307192496c Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 28 May 2024 17:39:15 +0800 Subject: [PATCH 15/78] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=8C=85=E8=AE=A2=E5=8D=95=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E6=9D=83=E7=9B=8A=E8=AF=A6=E6=83=85=20=E4=B8=AD1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dao/orderServicePackageProduct.go | 5 ++--- api/dto/OrderServicePackage.go | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/api/dao/orderServicePackageProduct.go b/api/dao/orderServicePackageProduct.go index 0cc789d..c5dde9e 100644 --- a/api/dao/orderServicePackageProduct.go +++ b/api/dao/orderServicePackageProduct.go @@ -29,9 +29,8 @@ func (r *OrderServicePackageProductDao) GetOrderServicePackageProductPreloadById } // GetOrderServicePackageProductPreloadByOrderServiceId 获取数据 -func (r *OrderServicePackageProductDao) GetOrderServicePackageProductPreloadByOrderServiceId(orderServiceId int64) (m []*model. - OrderServicePackageProduct, err error) { - err = global.Db.Where("order_service_id = ?", orderServiceId).Find(&m).Error +func (r *OrderServicePackageProductDao) GetOrderServicePackageProductPreloadByOrderServiceId(orderServiceId int64) (m []*model.OrderServicePackageProduct, err error) { + err = global.Db.Preload(clause.Associations).Where("order_service_id = ?", orderServiceId).Find(&m).Error if err != nil { return nil, err } diff --git a/api/dto/OrderServicePackage.go b/api/dto/OrderServicePackage.go index 8901f88..2de95e5 100644 --- a/api/dto/OrderServicePackage.go +++ b/api/dto/OrderServicePackage.go @@ -231,10 +231,10 @@ func (r *OrderServicePackageDetailInfoDto) LoadOrderServicePackageProduct(m []*m if len(m) > 0 { responses := make([]*OrderProductDto, len(m)) - for i, inquiry := range m { - if inquiry.OrderProduct != nil { + for i, product := range m { + if product.OrderProduct != nil { // 将转换后的结构体添加到新切片中 - response := GetOrderProductDto(inquiry.OrderProduct) + response := GetOrderProductDto(product.OrderProduct) // 将转换后的结构体添加到新切片中 responses[i] = response From 8f5ace1ef279003f2aa662747d61911161ae4b91 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 29 May 2024 09:28:50 +0800 Subject: [PATCH 16/78] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=8C=85=E8=AE=A2=E5=8D=95=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E6=9D=83=E7=9B=8A=E8=AF=A6=E6=83=85=20=E4=B8=AD=E5=85=B3?= =?UTF-8?q?=E8=81=94=E7=97=85=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dto/OrderServicePackage.go | 11 +++++++++++ api/service/orderServicePackage.go | 10 ++++++++++ 2 files changed, 21 insertions(+) diff --git a/api/dto/OrderServicePackage.go b/api/dto/OrderServicePackage.go index 2de95e5..a32aa5b 100644 --- a/api/dto/OrderServicePackage.go +++ b/api/dto/OrderServicePackage.go @@ -65,6 +65,7 @@ type OrderServicePackageDetailInfoDto struct { OrderProduct []*OrderProductDto `json:"order_product"` // 关联商品订单 OrderInquiry []*OrderInquiryDto `json:"order_inquiry"` // 关联问诊订单 UserCoupon []*UserCouponDto `json:"user_coupon"` // 关联优惠卷 + OrderServicePackageCase *OrderServicePackageCaseDto `json:"order_service_package_case"` // 关联病例 OrderServicePackageDetail *OrderServicePackageDetailDto `json:"order_service_package_detail"` // 服务包订单详情 CurrentMonthStartDate string `json:"current_month_start_date"` // 当月开始时间 CurrentMonthFinishDate string `json:"current_month_finish_date"` // 当月结束时间 @@ -286,3 +287,13 @@ func (r *OrderServicePackageDetailInfoDto) LoadOrderServicePackageDetail(m *mode } return r } + +// LoadOrderServicePackageCase 加载服务包订单关联病例数据 +func (r *OrderServicePackageDetailInfoDto) LoadOrderServicePackageCase(m *model.OrderServicePackageCase) *OrderServicePackageDetailInfoDto { + if m != nil { + d := GetOrderServicePackageCaseDto(m) + + r.OrderServicePackageCase = d + } + return r +} diff --git a/api/service/orderServicePackage.go b/api/service/orderServicePackage.go index dc58b40..9ebff55 100644 --- a/api/service/orderServicePackage.go +++ b/api/service/orderServicePackage.go @@ -74,6 +74,13 @@ func (r *OrderServicePackageService) GetOrderServicePackageDetailInfo(orderServi return nil, errors.New(err.Error()) } + // 获取关联病例 + orderServicePackageCaseDao := dao.OrderServicePackageCaseDao{} + orderServicePackageCase, err := orderServicePackageCaseDao.GetOrderServicePackageCaseByOrderId(orderServicePackage.OrderId) + if err != nil || orderServicePackageDetail == nil { + return nil, errors.New(err.Error()) + } + // 处理返回值 g = dto.GetOrderServicePackageDetailInfoDto(orderServicePackage) @@ -85,6 +92,9 @@ func (r *OrderServicePackageService) GetOrderServicePackageDetailInfo(orderServi // 加载服务包订单详情数据 g.LoadOrderServicePackageDetail(orderServicePackageDetail) + // 加载服务包订单关联病例数据 + g.LoadOrderServicePackageCase(orderServicePackageCase) + // 获取服务包当前月时间区间 CurrentMonthStartDate, CurrentMonthFinishDate, err := r.getOrderServicePackageCurrentMonthDate(g.StartTime) g.CurrentMonthStartDate = CurrentMonthStartDate.Format("2006年01月02日 15时04分") From 76e1bd831a774e78c82d8ab2a1736dc053fe4425 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 29 May 2024 15:54:39 +0800 Subject: [PATCH 17/78] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86amqp?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.yaml | 10 ++- config/amqp.go | 9 +++ config/config.go | 1 + extend/rabbitMq/rabbitMq.go | 155 ++++++++++++++++++++++++++++++++++++ go.mod | 32 +++----- go.sum | 41 +--------- 6 files changed, 190 insertions(+), 58 deletions(-) create mode 100644 config/amqp.go create mode 100644 extend/rabbitMq/rabbitMq.go diff --git a/config.yaml b/config.yaml index ef8b5a2..fe07cbb 100644 --- a/config.yaml +++ b/config.yaml @@ -95,4 +95,12 @@ 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: JG-10009 \ No newline at end of file + pre-plat-pharmacy-code: JG-10009 + +# [rabbitMq] +amqp: + host: 127.0.0.1 + port: 5672 + user: gdxz_2022rabbitmq + password: qwr2p&¥e@3.2p + vhost: gdxz_2022rabbitmq \ No newline at end of file diff --git a/config/amqp.go b/config/amqp.go new file mode 100644 index 0000000..f7d1c63 --- /dev/null +++ b/config/amqp.go @@ -0,0 +1,9 @@ +package config + +type Amqp struct { + Host string `mapstructure:"host" json:"host" yaml:"host"` // 服务器地址 + Port int `mapstructure:"port" json:"port" yaml:"port"` // 服务器端口 + Password string `mapstructure:"password" json:"password" yaml:"password"` // 密码 + User string `mapstructure:"user" json:"user" yaml:"user"` + Vhost string `mapstructure:"vhost" json:"vhost" yaml:"vhost"` +} diff --git a/config/config.go b/config/config.go index 1d6ead0..d805f13 100644 --- a/config/config.go +++ b/config/config.go @@ -16,4 +16,5 @@ type Config struct { Dysms Dysms `mapstructure:"dysms" json:"dysms" yaml:"dysms"` Wechat Wechat `mapstructure:"wechat" json:"wechat" yaml:"wechat"` Pre Pre `mapstructure:"pre" json:"pre" yaml:"pre"` // 处方平台 + Amqp Amqp `mapstructure:"amqp" json:"amqp" yaml:"amqp"` } diff --git a/extend/rabbitMq/rabbitMq.go b/extend/rabbitMq/rabbitMq.go new file mode 100644 index 0000000..9b0e089 --- /dev/null +++ b/extend/rabbitMq/rabbitMq.go @@ -0,0 +1,155 @@ +package rabbitMq + +import ( + "encoding/json" + "fmt" + "github.com/streadway/amqp" + "hospital-admin-api/config" + "net/url" + "time" +) + +type RabbitMQ struct { + conn *amqp.Connection + channel *amqp.Channel +} + +// NewRabbitMQClient 初始化客户端 +func NewRabbitMQClient() (*RabbitMQ, error) { + m := config.C.Amqp + + user := url.QueryEscape(m.User) + password := url.QueryEscape(m.Password) + + dsn := fmt.Sprintf("amqp://%s:%s@%s:%d/%s", user, password, m.Host, m.Port, m.Vhost) + conn, err := amqp.Dial(dsn) + if err != nil { + return nil, err + } + + ch, err := conn.Channel() + if err != nil { + return nil, err + } + + return &RabbitMQ{ + conn: conn, + channel: ch, + }, nil +} + +// Publish 生产 +func (r *RabbitMQ) Publish(queueName, exchangeName, routingKey string, message interface{}) error { + _, err := r.channel.QueueDeclare( + queueName, // 队列名字 + true, // 消息是否持久化 + false, // 不使用的时候删除队列 + false, // 是否排他 + false, // 是否阻塞 + nil, // arguments + ) + if err != nil { + return err + } + + body, err := json.Marshal(message) + if err != nil { + return err + } + + err = r.channel.Publish( + exchangeName, // exchange(交换机名字) + routingKey, // + false, // 是否为无法路由的消息进行返回处理 + false, // 是否对路由到无消费者队列的消息进行返回处理 RabbitMQ 3.0 废弃 + amqp.Publishing{ + ContentType: "text/plain", + Body: body, // 消息内容 + }) + if err != nil { + return err + } + + return nil +} + +func (r *RabbitMQ) PublishWithDelay(queueName, exchangeName, routingKey string, message interface{}, delay time.Duration) error { + err := r.channel.ExchangeDeclare( + queueName, // name + "x-delayed-message", // type + true, // durable + false, // auto-deleted + false, // internal + false, // 阻塞处理 + amqp.Table{"x-delayed-type": "direct"}, // arguments + ) + if err != nil { + return err + } + + body, err := json.Marshal(message) + if err != nil { + return err + } + + err = r.channel.Publish( + exchangeName, // exchange + routingKey, // routing key + false, // 是否为无法路由的消息进行返回处理 + false, // 是否对路由到无消费者队列的消息进行返回处理 RabbitMQ 3.0 废弃 + amqp.Publishing{ + ContentType: "text/plain", + Body: body, + Headers: amqp.Table{"x-delay": int32(delay / time.Millisecond)}, + }) + if err != nil { + return err + } + + return nil +} + +// Consume 消费 +func (r *RabbitMQ) Consume(queueName string) (<-chan amqp.Delivery, error) { + q, err := r.channel.QueueDeclare( + queueName, // 队列名称 + false, // 是否持久化 + false, // 是否自动删除队列 + false, // 排他 + false, // 阻塞处理 + nil, // arguments + ) + if err != nil { + return nil, err + } + + msgs, err := r.channel.Consume( + q.Name, // queue + "", // consumer + true, // auto-ack + false, // exclusive + false, // no-local + false, // no-wait + nil, // args + ) + if err != nil { + return nil, err + } + + return msgs, nil +} + +func (r *RabbitMQ) Close() { + if r.channel != nil { + err := r.channel.Close() + if err != nil { + return + } + } + if r.conn != nil { + err := r.conn.Close() + if err != nil { + return + } + } +} diff --git a/go.mod b/go.mod index ee07b35..d021d6c 100644 --- a/go.mod +++ b/go.mod @@ -3,43 +3,41 @@ module hospital-admin-api go 1.19 require ( + github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.4 + github.com/alibabacloud-go/dysmsapi-20170525/v3 v3.0.6 + github.com/alibabacloud-go/tea v1.1.19 + github.com/alibabacloud-go/tea-utils/v2 v2.0.3 + github.com/aliyun/aliyun-oss-go-sdk v2.2.7+incompatible + github.com/bwmarrin/snowflake v0.3.0 github.com/facebookarchive/grace v0.0.0-20180706040059-75cf19382434 github.com/fsnotify/fsnotify v1.6.0 + github.com/gen2brain/go-fitz v1.23.7 github.com/gin-gonic/gin v1.9.0 github.com/go-playground/locales v0.14.1 github.com/go-playground/universal-translator v0.18.1 github.com/go-playground/validator/v10 v10.14.0 github.com/go-redis/redis/v8 v8.11.5 github.com/golang-jwt/jwt/v5 v5.0.0 + github.com/google/uuid v1.3.0 github.com/mojocn/base64Captcha v1.3.5 + github.com/shopspring/decimal v1.3.1 github.com/sirupsen/logrus v1.9.2 github.com/spf13/viper v1.16.0 + github.com/streadway/amqp v1.1.0 + github.com/wechatpay-apiv3/wechatpay-go v0.2.17 + github.com/xuri/excelize/v2 v2.8.0 gorm.io/driver/mysql v1.5.1 gorm.io/gorm v1.25.1 ) require ( github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 // indirect - github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.4 // indirect github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68 // indirect - github.com/alibabacloud-go/dysmsapi-20170525/v3 v3.0.6 // indirect github.com/alibabacloud-go/endpoint-util v1.1.0 // indirect - github.com/alibabacloud-go/facebody-20191230 v1.1.12 // indirect github.com/alibabacloud-go/openapi-util v0.1.0 // indirect - github.com/alibabacloud-go/openplatform-20191219 v1.1.5 // indirect - github.com/alibabacloud-go/tea v1.1.19 // indirect - github.com/alibabacloud-go/tea-fileform v1.1.0 // indirect - github.com/alibabacloud-go/tea-oss-sdk v1.1.0 // indirect - github.com/alibabacloud-go/tea-oss-utils v1.1.0 // indirect - github.com/alibabacloud-go/tea-rpc v1.3.3 // indirect - github.com/alibabacloud-go/tea-rpc-utils v1.1.2 // indirect github.com/alibabacloud-go/tea-utils v1.3.5 // indirect - github.com/alibabacloud-go/tea-utils/v2 v2.0.3 // indirect github.com/alibabacloud-go/tea-xml v1.1.2 // indirect - github.com/aliyun/aliyun-oss-go-sdk v2.2.7+incompatible // indirect github.com/aliyun/credentials-go v1.1.2 // indirect - github.com/bitly/go-simplejson v0.5.1 // indirect - github.com/bwmarrin/snowflake v0.3.0 // indirect github.com/bytedance/sonic v1.9.1 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect @@ -54,12 +52,10 @@ require ( github.com/facebookgo/stats v0.0.0-20151006221625-1b76add642e4 // indirect github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect - github.com/gen2brain/go-fitz v1.23.7 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-sql-driver/mysql v1.7.1 // indirect github.com/goccy/go-json v0.10.2 // indirect github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect - github.com/google/uuid v1.3.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect @@ -75,19 +71,15 @@ require ( github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/richardlehane/mscfb v1.0.4 // indirect github.com/richardlehane/msoleps v1.0.3 // indirect - github.com/shopspring/decimal v1.3.1 // indirect github.com/spf13/afero v1.9.5 // indirect github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/subosito/gotenv v1.4.2 // indirect - github.com/tencentcloud/tencentcloud-sdk-go v3.0.233+incompatible // indirect github.com/tjfoc/gmsm v1.3.2 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.11 // indirect - github.com/wechatpay-apiv3/wechatpay-go v0.2.17 // indirect github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca // indirect - github.com/xuri/excelize/v2 v2.8.0 // indirect github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a // indirect golang.org/x/arch v0.3.0 // indirect golang.org/x/crypto v0.12.0 // indirect diff --git a/go.sum b/go.sum index fbe0c9c..dfc270a 100644 --- a/go.sum +++ b/go.sum @@ -38,6 +38,7 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/agiledragon/gomonkey v2.0.2+incompatible h1:eXKi9/piiC3cjJD1658mEE2o3NjkJ5vDLgYjCQu0Xlw= github.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw= github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4 h1:iC9YFYKDGEy3n/FtqJnOkZsene9olVspKmkX5A2YBEo= github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc= @@ -50,53 +51,27 @@ github.com/alibabacloud-go/dysmsapi-20170525/v3 v3.0.6 h1:UTl97mt2qfavxveqCkaVg4 github.com/alibabacloud-go/dysmsapi-20170525/v3 v3.0.6/go.mod h1:UWpcGrWwTbES9QW7OQ7xDffukMJ/l7lzioixIz8+lgY= github.com/alibabacloud-go/endpoint-util v1.1.0 h1:r/4D3VSw888XGaeNpP994zDUaxdgTSHBbVfZlzf6b5Q= github.com/alibabacloud-go/endpoint-util v1.1.0/go.mod h1:O5FuCALmCKs2Ff7JFJMudHs0I5EBgecXXxZRyswlEjE= -github.com/alibabacloud-go/facebody-20191230 v1.1.12 h1:FQ45N0Tks6MvCezdFIc/ZL8ZhtAEJ6Pi1RLJmv7CS/s= -github.com/alibabacloud-go/facebody-20191230 v1.1.12/go.mod h1:u/DWpOyFof4FxMomUBCcdvkLBBBV1aBRhZFhSddO294= github.com/alibabacloud-go/openapi-util v0.0.11/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws= github.com/alibabacloud-go/openapi-util v0.1.0 h1:0z75cIULkDrdEhkLWgi9tnLe+KhAFE/r5Pb3312/eAY= github.com/alibabacloud-go/openapi-util v0.1.0/go.mod h1:sQuElr4ywwFRlCCberQwKRFhRzIyG4QTP/P4y1CJ6Ws= -github.com/alibabacloud-go/openplatform-20191219 v1.1.5 h1:NQdRXirBxoNrI9MbaaTxbHJKsUS+uga1inKMAcnuFPI= -github.com/alibabacloud-go/openplatform-20191219 v1.1.5/go.mod h1:GfQnFm82wfSsJ0a+bETDqPW64tXUzcw2u2o2i7OacH8= github.com/alibabacloud-go/tea v1.1.0/go.mod h1:IkGyUSX4Ba1V+k4pCtJUc6jDpZLFph9QMy2VUPTwukg= github.com/alibabacloud-go/tea v1.1.7/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= github.com/alibabacloud-go/tea v1.1.8/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= -github.com/alibabacloud-go/tea v1.1.10/go.mod h1:/tmnEaQMyb4Ky1/5D+SE1BAsa5zj/KeGOFfwYm3N/p4= github.com/alibabacloud-go/tea v1.1.17/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= github.com/alibabacloud-go/tea v1.1.19 h1:Xroq0M+pr0mC834Djj3Fl4ZA8+GGoA0i7aWse1vmgf4= github.com/alibabacloud-go/tea v1.1.19/go.mod h1:nXxjm6CIFkBhwW4FQkNrolwbfon8Svy6cujmKFUq98A= -github.com/alibabacloud-go/tea-fileform v1.1.0 h1:Qt33K9WCaONMhSetPWquog/QAk0xp9zB2uuhK8/gnyc= -github.com/alibabacloud-go/tea-fileform v1.1.0/go.mod h1:1seBx6+yrLZ5GFYrb8O1EnHvih1wXajQNE5TQNkhLd4= -github.com/alibabacloud-go/tea-oss-sdk v1.1.0 h1:LX6XDD9E5AGgIh9IrNMIcaUOUJE8nz8DaV9FiB2/Ewc= -github.com/alibabacloud-go/tea-oss-sdk v1.1.0/go.mod h1:xpyYJtYKYzJB7JBKyTxoYEfPxcvONfOU/gAjBFeQzRc= -github.com/alibabacloud-go/tea-oss-utils v1.1.0 h1:y65crjjcZ2Pbb6UZtC2deuIZHDVTS3IaDWE7M9nVLRc= -github.com/alibabacloud-go/tea-oss-utils v1.1.0/go.mod h1:PFCF12e9yEKyBUIn7X1IrF/pNjvxgkHy0CgxX4+xRuY= -github.com/alibabacloud-go/tea-rpc v1.1.3/go.mod h1:uwhvnxPK69jcAYkVyP1WCFhTh1oVLiibUseSUpC7L8g= -github.com/alibabacloud-go/tea-rpc v1.1.7/go.mod h1:FU//dNbNYv1jSz1BGj6Sc3Co0IrbWsCnPiB/e1YnvgQ= -github.com/alibabacloud-go/tea-rpc v1.3.3 h1:NZJtukZouR0jpN0dWeBB5bMZdVvTyRPyISxc/hfOALo= -github.com/alibabacloud-go/tea-rpc v1.3.3/go.mod h1:zwKwxuf92liNsPcLOxPdrkvR5Dq6jtX2du6qx8FT094= -github.com/alibabacloud-go/tea-rpc-utils v1.1.0/go.mod h1:rxGY+fLbm3Fj3oJpeU0hBTmz52Ux50nm7JL01tyPv9c= -github.com/alibabacloud-go/tea-rpc-utils v1.1.1/go.mod h1:V5HdNi6Xdn0JMpgVhQ19vsFAS51tydr7BqcJtuXH1Yw= -github.com/alibabacloud-go/tea-rpc-utils v1.1.2 h1:ZTfFREnP2q9D49T2J/1jYYOndepGdrUOgm/JR8/bIQ0= -github.com/alibabacloud-go/tea-rpc-utils v1.1.2/go.mod h1:V5HdNi6Xdn0JMpgVhQ19vsFAS51tydr7BqcJtuXH1Yw= -github.com/alibabacloud-go/tea-utils v1.1.0/go.mod h1:kx2tz0XYhq6igVQCHhCPmOQK4r5LXK0rJUJxiS3VvPg= -github.com/alibabacloud-go/tea-utils v1.3.0/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE= github.com/alibabacloud-go/tea-utils v1.3.1/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE= -github.com/alibabacloud-go/tea-utils v1.3.4/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE= github.com/alibabacloud-go/tea-utils v1.3.5 h1:NqtVd9PlYqrFDG8cjXn5eCxMo1Qi1gbhN7DA2vptD7w= github.com/alibabacloud-go/tea-utils v1.3.5/go.mod h1:EI/o33aBfj3hETm4RLiAxF/ThQdSngxrpF8rKUDJjPE= github.com/alibabacloud-go/tea-utils/v2 v2.0.0/go.mod h1:U5MTY10WwlquGPS34DOeomUGBB0gXbLueiq5Trwu0C4= github.com/alibabacloud-go/tea-utils/v2 v2.0.3 h1:6OM8vm/6pjQg1a7zc3QNMviaoumnhImRi5V84CnuFkc= github.com/alibabacloud-go/tea-utils/v2 v2.0.3/go.mod h1:sj1PbjPodAVTqGTA3olprfeeqqmwD0A5OQz94o9EuXQ= -github.com/alibabacloud-go/tea-xml v1.1.0/go.mod h1:V/VlXBTCRN0OBvIjtaIXdpU6YAbyofXrIRWCfQ7u47U= github.com/alibabacloud-go/tea-xml v1.1.2 h1:oLxa7JUXm2EDFzMg+7oRsYc+kutgCVwm+bZlhhmvW5M= github.com/alibabacloud-go/tea-xml v1.1.2/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8= github.com/aliyun/aliyun-oss-go-sdk v2.2.7+incompatible h1:KpbJFXwhVeuxNtBJ74MCGbIoaBok2uZvkD7QXp2+Wis= github.com/aliyun/aliyun-oss-go-sdk v2.2.7+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= -github.com/aliyun/credentials-go v1.1.0/go.mod h1:ZXrrxv386Mj6z8NpihLKpexQE550m7j3LlyCvYub9aE= github.com/aliyun/credentials-go v1.1.2 h1:qU1vwGIBb3UJ8BwunHDRFtAhS6jnQLnde/yk0+Ih2GY= github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw= -github.com/bitly/go-simplejson v0.5.1 h1:xgwPbetQScXt1gh9BmoJ6j9JMr3TElvuIyjR8pgdoow= -github.com/bitly/go-simplejson v0.5.1/go.mod h1:YOPVLzCfwK14b4Sff3oP1AmGhI9T9Vsg84etUnlyp+Q= github.com/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0= github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= @@ -285,6 +260,7 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/mojocn/base64Captcha v1.3.5 h1:Qeilr7Ta6eDtG4S+tQuZ5+hO+QHbiGAJdi4PfoagaA0= github.com/mojocn/base64Captcha v1.3.5/go.mod h1:/tTTXn4WTpX9CfrmipqRytCpJ27Uw3G6I7NcP2WwcmY= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= @@ -320,6 +296,8 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/streadway/amqp v1.1.0 h1:py12iX8XSyI7aN/3dUT8DFIDJazNJsVJdxNVEpnQTZM= +github.com/streadway/amqp v1.1.0/go.mod h1:WYSrTEYHOXHd0nwFeUXAe2G2hRnQT+deZJJf88uS9Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -337,8 +315,6 @@ github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gt github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/tencentcloud/tencentcloud-sdk-go v3.0.233+incompatible h1:q+D/Y9jla3afgsIihtyhwyl0c2W+eRWNM9ohVwPiiPw= -github.com/tencentcloud/tencentcloud-sdk-go v3.0.233+incompatible/go.mod h1:0PfYow01SHPMhKY31xa+EFz2RStxIqj6JFAJS+IkCi4= github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM= github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= @@ -378,8 +354,6 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -395,8 +369,6 @@ golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMk golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.7.0 h1:gzS29xtG1J5ybQlv0PuyfE3nmc6R4qB73m6LUUmvFuw= -golang.org/x/image v0.7.0/go.mod h1:nd/q4ef1AKKYl/4kft7g+6UyGbdiqWqTP1ZAbRoV7Rg= golang.org/x/image v0.11.0 h1:ds2RoQvBvYTiJkwpSFDwCcDFNX7DqjL2WsUgTNk0Ooo= golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -457,7 +429,6 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= @@ -525,7 +496,6 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -543,14 +513,12 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA= golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -700,7 +668,6 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 44f9cdcb93347611f0efdb23094d50ca59a19f1c Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 30 May 2024 10:22:05 +0800 Subject: [PATCH 18/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=EF=BC=9A?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=B3=BB=E7=BB=9F=E4=BC=98=E6=83=A0=E5=8D=B7?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/coupon.go | 54 +++++++++ api/dto/coupon.go | 65 +++++----- api/model/coupon.go | 56 ++++----- api/requests/coupon.go | 29 +++++ api/router/router.go | 6 +- api/service/coupon.go | 250 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 397 insertions(+), 63 deletions(-) create mode 100644 api/service/coupon.go diff --git a/api/controller/coupon.go b/api/controller/coupon.go index 6d14a35..477387c 100644 --- a/api/controller/coupon.go +++ b/api/controller/coupon.go @@ -6,8 +6,10 @@ import ( "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 Coupon struct{} @@ -56,3 +58,55 @@ func (r *Coupon) GetSystemCouponPage(c *gin.Context) { result["data"] = GetProductPlatformPageResponses responses.OkWithData(result, c) } + +// GetSystemCoupon 系统优惠卷详情 +func (r *Coupon) GetSystemCoupon(c *gin.Context) { + id := c.Param("coupon_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + couponId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + couponService := service.CouponService{} + getSystemCouponResponses, err := couponService.GetSystemCoupon(couponId) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(getSystemCouponResponses, c) +} + +// AddSystemCoupon 新增系统优惠卷 +func (r *Coupon) AddSystemCoupon(c *gin.Context) { + couponRequest := requests.CouponRequest{} + req := couponRequest.AddSystemCoupon + 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 + } + + // 业务处理 + couponService := service.CouponService{} + _, err := couponService.AddSystemCoupon(req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} diff --git a/api/dto/coupon.go b/api/dto/coupon.go index ec170eb..1d0466b 100644 --- a/api/dto/coupon.go +++ b/api/dto/coupon.go @@ -3,40 +3,41 @@ package dto import ( "fmt" "hospital-admin-api/api/model" + "hospital-admin-api/utils" ) // CouponDto 优惠卷表 type CouponDto struct { - CouponId string `json:"coupon_id"` // 主键id - CouponName string `json:"coupon_name"` // 优惠卷名称 - CouponIcon string `json:"coupon_icon"` // 优惠卷图片 - CouponClient int `json:"coupon_client"` // 使用平台(1:小程序) - CouponType int `json:"coupon_type"` // 优惠卷类型(1:无门槛 2:满减 3:数量) - CouponStatus int `json:"coupon_status"` // 状态(1:正常 2:强制失效 3:结束 4:删除) - DistributionObject int `json:"distribution_object"` // 发放对象(1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户) - ApplicationScope int `json:"application_scope"` // 适用范围(1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品) - InquiryType string `json:"inquiry_type"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) - BrandId string `json:"brand_id"` // 关联品牌id(如不限制品牌,此项为空) - IsMutex int `json:"is_mutex"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 - IsDisplay int `json:"is_display"` // 是否展示(0:否 1:是) - DistributionWithDay int `json:"distribution_with_day"` // 发放关联天数(发放对象为近期消费等类型时规定天数) - MinUsableNumber int `json:"min_usable_number"` // 单商品最小可使用数量(默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) - CouponCount int `json:"coupon_count"` // 发放数量 - CouponTakeCount int `json:"coupon_take_count"` // 已领取数量 - CouponUsedCount int `json:"coupon_used_count"` // 已使用数量 - CouponPrice float64 `json:"coupon_price"` // 优惠卷金额 - WithAmount float64 `json:"with_amount"` // 符合满减标准金额(优惠卷类型为满减时使用) - ValidType int `json:"valid_type"` // 有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效) - ValidDays int `json:"valid_days"` // 自领取之日起有效天数 - ValidStartTime model.LocalTime `json:"valid_start_time"` // 开始使用时间 - ValidEndTime model.LocalTime `json:"valid_end_time"` // 结束使用时间 - ProductId string `json:"product_id"` // 关联商品id,逗号分隔,指定商品时,填入此项。 - ReissueIntervalDays int `json:"reissue_interval_days"` // 确认收货后的再次发放间隔天数(如果设置为 0,则表示不再次发放。当适用范围为商品时生效) - IsReissuableAfterExpire int `json:"is_reissuable_after_expire"` // 过期之后是否允许再次发放(0:否 1:是) - IsPopup int `json:"is_popup"` // 是否首页弹窗(0:否 1:是) - CouponDesc string `json:"coupon_desc"` // 优惠卷描述 - CreatedAt model.LocalTime `json:"created_at"` // 创建时间 - UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 + CouponId string `json:"coupon_id"` // 主键id + CouponName string `json:"coupon_name"` // 优惠卷名称 + CouponIcon string `json:"coupon_icon"` // 优惠卷图片 + CouponClient int `json:"coupon_client"` // 使用平台(1:小程序) + CouponType int `json:"coupon_type"` // 优惠卷类型(1:无门槛 2:满减 3:数量) + CouponStatus int `json:"coupon_status"` // 状态(1:正常 2:强制失效 3:结束 4:删除) + DistributionObject int `json:"distribution_object"` // 发放对象(1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户) + ApplicationScope int `json:"application_scope"` // 适用范围(1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品) + InquiryType string `json:"inquiry_type"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) + BrandId string `json:"brand_id"` // 关联品牌id(如不限制品牌,此项为空) + IsMutex int `json:"is_mutex"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 + IsDisplay int `json:"is_display"` // 是否展示(0:否 1:是) + DistributionWithDay int `json:"distribution_with_day"` // 发放关联天数(发放对象为近期消费等类型时规定天数) + MinUsableNumber int `json:"min_usable_number"` // 单商品最小可使用数量(默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) + CouponCount int `json:"coupon_count"` // 发放数量 + CouponTakeCount int `json:"coupon_take_count"` // 已领取数量 + CouponUsedCount int `json:"coupon_used_count"` // 已使用数量 + CouponPrice float64 `json:"coupon_price"` // 优惠卷金额 + WithAmount float64 `json:"with_amount"` // 符合满减标准金额(优惠卷类型为满减时使用) + ValidType int `json:"valid_type"` // 有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效) + ValidDays int `json:"valid_days"` // 自领取之日起有效天数 + ValidStartTime *model.LocalTime `json:"valid_start_time"` // 开始使用时间 + ValidEndTime *model.LocalTime `json:"valid_end_time"` // 结束使用时间 + ProductId string `json:"product_id"` // 关联商品id,逗号分隔,指定商品时,填入此项。 + ReissueIntervalDays int `json:"reissue_interval_days"` // 确认收货后的再次发放间隔天数(如果设置为 0,则表示不再次发放。当适用范围为商品时生效) + IsReissuableAfterExpire int `json:"is_reissuable_after_expire"` // 过期之后是否允许再次发放(0:否 1:是) + IsPopup int `json:"is_popup"` // 是否首页弹窗(0:否 1:是) + CouponDesc string `json:"coupon_desc"` // 优惠卷描述 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 } // GetCouponDto 优惠卷详情 @@ -44,7 +45,7 @@ func GetCouponDto(m *model.Coupon) *CouponDto { return &CouponDto{ CouponId: fmt.Sprintf("%d", m.CouponId), CouponName: m.CouponName, - CouponIcon: m.CouponIcon, + CouponIcon: utils.AddOssDomain(m.CouponIcon), CouponClient: m.CouponClient, CouponType: m.CouponType, CouponStatus: m.CouponStatus, @@ -85,7 +86,7 @@ func GetCouponListDto(m []*model.Coupon) []*CouponDto { response := &CouponDto{ CouponId: fmt.Sprintf("%d", v.CouponId), CouponName: v.CouponName, - CouponIcon: v.CouponIcon, + CouponIcon: utils.AddOssDomain(v.CouponIcon), CouponClient: v.CouponClient, CouponType: v.CouponType, CouponStatus: v.CouponStatus, diff --git a/api/model/coupon.go b/api/model/coupon.go index 338feb5..e84a0b0 100644 --- a/api/model/coupon.go +++ b/api/model/coupon.go @@ -8,34 +8,34 @@ import ( // Coupon 优惠卷表 type Coupon struct { - CouponId int64 `gorm:"column:coupon_id;type:bigint(19);primary_key;comment:主键id" json:"coupon_id"` - CouponName string `gorm:"column:coupon_name;type:varchar(255);comment:优惠卷名称" json:"coupon_name"` - CouponIcon string `gorm:"column:coupon_icon;type:varchar(255);comment:优惠卷图片" json:"coupon_icon"` - CouponClient int `gorm:"column:coupon_client;type:tinyint(1);comment:使用平台(1:小程序);NOT NULL" json:"coupon_client"` - CouponType int `gorm:"column:coupon_type;type:tinyint(1);comment:优惠卷类型(1:无门槛 2:满减 3:数量);NOT NULL" json:"coupon_type"` - CouponStatus int `gorm:"column:coupon_status;type:tinyint(1);default:1;comment:状态(1:正常 2:强制失效 3:结束 4:删除)" json:"coupon_status"` - DistributionObject int `gorm:"column:distribution_object;type:tinyint(1);default:1;comment:发放对象(1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户)" json:"distribution_object"` - ApplicationScope int `gorm:"column:application_scope;type:tinyint(1);default:1;comment:适用范围(1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品)" json:"application_scope"` - InquiryType string `gorm:"column:inquiry_type;type:varchar(100);comment:关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测)" json:"inquiry_type"` - BrandId int64 `gorm:"column:brand_id;type:bigint(19);comment:关联品牌id(如不限制品牌,此项为空)" json:"brand_id"` - IsMutex int `gorm:"column:is_mutex;type:tinyint(1);default:1;comment:是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用" json:"is_mutex"` - IsDisplay int `gorm:"column:is_display;type:tinyint(1);comment:是否展示(0:否 1:是)" json:"is_display"` - DistributionWithDay int `gorm:"column:distribution_with_day;type:int(11);default:0;comment:发放关联天数(发放对象为近期消费等类型时规定天数)" json:"distribution_with_day"` - MinUsableNumber int `gorm:"column:min_usable_number;type:int(11);default:1;comment:单商品最小可使用数量(默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处)" json:"min_usable_number"` - CouponCount int `gorm:"column:coupon_count;type:int(10);default:0;comment:发放数量" json:"coupon_count"` - CouponTakeCount int `gorm:"column:coupon_take_count;type:int(10);default:0;comment:已领取数量" json:"coupon_take_count"` - CouponUsedCount int `gorm:"column:coupon_used_count;type:int(10);default:0;comment:已使用数量" json:"coupon_used_count"` - CouponPrice float64 `gorm:"column:coupon_price;type:decimal(10,2);default:0.00;comment:优惠卷金额" json:"coupon_price"` - WithAmount float64 `gorm:"column:with_amount;type:decimal(10,2);default:0.00;comment:符合满减标准金额(优惠卷类型为满减时使用)" json:"with_amount"` - ValidType int `gorm:"column:valid_type;type:tinyint(4);comment:有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效);NOT NULL" json:"valid_type"` - ValidDays int `gorm:"column:valid_days;type:int(3);comment:自领取之日起有效天数" json:"valid_days"` - ValidStartTime LocalTime `gorm:"column:valid_start_time;type:datetime;comment:开始使用时间" json:"valid_start_time"` - ValidEndTime LocalTime `gorm:"column:valid_end_time;type:datetime;comment:结束使用时间" json:"valid_end_time"` - ProductId string `gorm:"column:product_id;type:text;comment:关联商品id,逗号分隔,指定商品时,填入此项。" json:"product_id"` - ReissueIntervalDays int `gorm:"column:reissue_interval_days;type:int(5);default:0;comment:确认收货后的再次发放间隔天数(如果设置为 0,则表示不再次发放。当适用范围为商品时生效)" json:"reissue_interval_days"` - IsReissuableAfterExpire int `gorm:"column:is_reissuable_after_expire;type:tinyint(1);default:0;comment:过期之后是否允许再次发放(0:否 1:是)" json:"is_reissuable_after_expire"` - IsPopup int `gorm:"column:is_popup;type:tinyint(1);default:0;comment:是否首页弹窗(0:否 1:是)" json:"is_popup"` - CouponDesc string `gorm:"column:coupon_desc;type:text;comment:优惠卷描述" json:"coupon_desc"` + CouponId int64 `gorm:"column:coupon_id;type:bigint(19);primary_key;comment:主键id" json:"coupon_id"` + CouponName string `gorm:"column:coupon_name;type:varchar(255);comment:优惠卷名称" json:"coupon_name"` + CouponIcon string `gorm:"column:coupon_icon;type:varchar(255);comment:优惠卷图片" json:"coupon_icon"` + CouponClient int `gorm:"column:coupon_client;type:tinyint(1);comment:使用平台(1:小程序);NOT NULL" json:"coupon_client"` + CouponType int `gorm:"column:coupon_type;type:tinyint(1);comment:优惠卷类型(1:无门槛 2:满减 3:数量);NOT NULL" json:"coupon_type"` + CouponStatus int `gorm:"column:coupon_status;type:tinyint(1);default:1;comment:状态(1:正常 2:强制失效 3:结束 4:删除)" json:"coupon_status"` + DistributionObject int `gorm:"column:distribution_object;type:tinyint(1);default:1;comment:发放对象(1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户)" json:"distribution_object"` + ApplicationScope int `gorm:"column:application_scope;type:tinyint(1);default:1;comment:适用范围(1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品)" json:"application_scope"` + InquiryType string `gorm:"column:inquiry_type;type:varchar(100);comment:关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测)" json:"inquiry_type"` + BrandId *int64 `gorm:"column:brand_id;type:bigint(19);comment:关联品牌id(如不限制品牌,此项为空)" json:"brand_id"` + IsMutex int `gorm:"column:is_mutex;type:tinyint(1);default:1;comment:是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用" json:"is_mutex"` + IsDisplay int `gorm:"column:is_display;type:tinyint(1);comment:是否展示(0:否 1:是)" json:"is_display"` + DistributionWithDay int `gorm:"column:distribution_with_day;type:int(11);default:0;comment:发放关联天数(发放对象为近期消费等类型时规定天数)" json:"distribution_with_day"` + MinUsableNumber int `gorm:"column:min_usable_number;type:int(11);default:1;comment:单商品最小可使用数量(默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处)" json:"min_usable_number"` + CouponCount int `gorm:"column:coupon_count;type:int(10);default:0;comment:发放数量" json:"coupon_count"` + CouponTakeCount int `gorm:"column:coupon_take_count;type:int(10);default:0;comment:已领取数量" json:"coupon_take_count"` + CouponUsedCount int `gorm:"column:coupon_used_count;type:int(10);default:0;comment:已使用数量" json:"coupon_used_count"` + CouponPrice float64 `gorm:"column:coupon_price;type:decimal(10,2);default:0.00;comment:优惠卷金额" json:"coupon_price"` + WithAmount float64 `gorm:"column:with_amount;type:decimal(10,2);default:0.00;comment:符合满减标准金额(优惠卷类型为满减时使用)" json:"with_amount"` + ValidType int `gorm:"column:valid_type;type:tinyint(4);comment:有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效);NOT NULL" json:"valid_type"` + ValidDays int `gorm:"column:valid_days;type:int(3);comment:自领取之日起有效天数" json:"valid_days"` + ValidStartTime *LocalTime `gorm:"column:valid_start_time;type:datetime;comment:开始使用时间" json:"valid_start_time"` + ValidEndTime *LocalTime `gorm:"column:valid_end_time;type:datetime;comment:结束使用时间" json:"valid_end_time"` + ProductId string `gorm:"column:product_id;type:text;comment:关联商品id,逗号分隔,指定商品时,填入此项。" json:"product_id"` + ReissueIntervalDays int `gorm:"column:reissue_interval_days;type:int(5);default:0;comment:确认收货后的再次发放间隔天数(如果设置为 0,则表示不再次发放。当适用范围为商品时生效)" json:"reissue_interval_days"` + IsReissuableAfterExpire int `gorm:"column:is_reissuable_after_expire;type:tinyint(1);default:0;comment:过期之后是否允许再次发放(0:否 1:是)" json:"is_reissuable_after_expire"` + IsPopup int `gorm:"column:is_popup;type:tinyint(1);default:0;comment:是否首页弹窗(0:否 1:是)" json:"is_popup"` + CouponDesc string `gorm:"column:coupon_desc;type:text;comment:优惠卷描述" json:"coupon_desc"` Model } diff --git a/api/requests/coupon.go b/api/requests/coupon.go index fdd4761..af00ef9 100644 --- a/api/requests/coupon.go +++ b/api/requests/coupon.go @@ -2,6 +2,7 @@ package requests type CouponRequest struct { GetSystemCouponPage // 获取系统优惠卷列表-分页 + AddSystemCoupon // 新增系统优惠卷 } // GetSystemCouponPage 获取系统优惠卷列表-分页 @@ -24,3 +25,31 @@ type GetSystemCouponPage struct { CouponDesc string `json:"coupon_desc" form:"coupon_desc" label:"优惠卷描述"` CreatedAt string `json:"created_at" form:"created_at" label:"创建时间"` // 创建时间 } + +// AddSystemCoupon 新增系统优惠卷 +type AddSystemCoupon struct { + CouponName string `json:"coupon_name" form:"coupon_name" label:"优惠卷名称" validate:"required"` // 优惠卷名称 + CouponIcon string `json:"coupon_icon" form:"coupon_icon" label:"头像"` // 优惠卷名称 + CouponClient *int `json:"coupon_client" form:"coupon_client" label:"使用平台" validate:"required,oneof=1"` // 使用平台(1:小程序) + CouponType *int `json:"coupon_type" form:"coupon_type" label:"优惠卷类型" validate:"required,oneof=1 2 3"` // 优惠卷类型(1 :无门槛 2:满减 3:数量) + DistributionObject *int `json:"distribution_object" form:"distribution_object" label:"发放对象" validate:"required,oneof=1 2 3 4 5 6 7"` + ApplicationScope *int `json:"application_scope" form:"application_scope" label:"适用范围" validate:"required,oneof=1 2 3 4 5 6"` + InquiryType *string `json:"inquiry_type" form:"inquiry_type" label:"关联问诊类型" validate:"omitempty,oneof=1 2 3 4 5 6"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) + BrandId *string `json:"brand_id" form:"brand_id" label:"关联品牌id"` // 关联品牌id(如不限制品牌,此项为空) + IsMutex *int `json:"is_mutex" form:"is_mutex" label:"是否互斥" validate:"required,oneof=0 1"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 + IsDisplay *int `json:"is_display" form:"is_display" label:"是否展示" validate:"required,oneof=0 1"` // 是否展示(0:否 1:是) + DistributionWithDay *int `json:"distribution_with_day" form:"distribution_with_day" label:"发放关联天数" validate:"omitempty,numeric,min=1"` // (发放对象为近期消费等类型时规定天数) + MinUsableNumber *int `json:"min_usable_number" form:"min_usable_number" label:"单商品最小可使用数量" validate:"omitempty,numeric,min=1"` // (默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) + CouponCount *int `json:"coupon_count" form:"coupon_count" label:"发放数量" validate:"required,number,min=1"` // (默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) + CouponPrice *float64 `json:"coupon_price" form:"coupon_price" label:"优惠卷金额" validate:"required,numeric,gt=0"` + WithAmount *float64 `json:"with_amount" form:"with_amount" label:"符合满减标准金额" validate:"omitempty,gt=1"` // (优惠卷类型为满减时使用) + ValidType *int `json:"valid_type" form:"valid_type" label:"有效类型" validate:"required,oneof=1 2"` // 有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效) + ValidDays *int `json:"valid_days" form:"valid_days" label:"自领取之日起有效天数" validate:"omitempty,numeric,min=1"` // 自领取之日起有效天数 + ValidStartTime *string `json:"valid_start_time" form:"valid_start_time" label:"开始使用时间"` // 开始使用时间 + ValidEndTime *string `json:"valid_end_time" form:"valid_end_time" label:"结束使用时间"` // 结束使用时间 + ProductId []string `json:"product_id" form:"product_id" label:"关联商品id"` // ,逗号分隔,指定商品时,填入此项。 + ReissueIntervalDays *int `json:"reissue_interval_days" form:"reissue_interval_days" label:"确认收货后的再次发放间隔天数" validate:"omitempty,numeric,min=0"` // (如果设置为 0,则表示不再次发放。当适用范围为商品时生效) + IsReissuableAfterExpire *int `json:"is_reissuable_after_expire" form:"is_reissuable_after_expire" label:"过期之后是否允许再次发放" validate:"omitempty,oneof=0 1"` // 过期之后是否允许再次发放(0:否 1:是) + IsPopup *int `json:"is_popup" form:"is_popup" label:"是否首页弹窗" validate:"required,oneof=0 1"` // 是否首页弹窗(0:否 1:是) + CouponDesc *string `json:"coupon_desc" form:"coupon_desc" label:"优惠卷描述"` +} diff --git a/api/router/router.go b/api/router/router.go index 65b02bc..758e9a3 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -730,13 +730,13 @@ func privateRouter(r *gin.Engine, api controller.Api) { systemGroup.POST("/page", api.Coupon.GetSystemCouponPage) // 系统优惠卷详情 - systemGroup.GET("/:product_id", api.Product.GetProduct) + systemGroup.GET("/:coupon_id", api.Coupon.GetSystemCoupon) // 新增系统优惠卷 - systemGroup.POST("", api.Product.AddProduct) + systemGroup.POST("", api.Coupon.AddSystemCoupon) // 修改系统优惠卷 - systemGroup.PUT("/:product_id", api.Product.PutProduct) + systemGroup.PUT("/:coupon_id", api.Product.PutProduct) // 修改系统优惠卷状态 systemGroup.PUT("/status/:product_id", api.Product.PutProductStatus) diff --git a/api/service/coupon.go b/api/service/coupon.go new file mode 100644 index 0000000..8353239 --- /dev/null +++ b/api/service/coupon.go @@ -0,0 +1,250 @@ +package service + +import ( + "errors" + "fmt" + "hospital-admin-api/api/dao" + "hospital-admin-api/api/dto" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" + "hospital-admin-api/global" + "hospital-admin-api/utils" + "strconv" + "strings" + "time" +) + +type CouponService struct { +} + +// GetSystemCoupon 系统优惠卷详情 +func (r *CouponService) GetSystemCoupon(couponId int64) (g *dto.CouponDto, err error) { + couponDao := dao.CouponDao{} + coupon, err := couponDao.GetCouponById(couponId) + if err != nil || coupon == nil { + return nil, errors.New(err.Error()) + } + + // 处理返回值 + g = dto.GetCouponDto(coupon) + + return g, nil +} + +// AddSystemCoupon 新增系统优惠卷 +func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, error) { + // 满减 + if *req.CouponType == 2 { + if *req.WithAmount == 0 { + return false, errors.New("请填入符合满减标准金额") + } + } + + // 数量 + if *req.CouponType == 3 { + if *req.MinUsableNumber == 0 { + return false, errors.New("请填入单商品最小可使用数量") + } + } + + // 发放对象-近期消费 + if *req.DistributionObject == 4 { + if *req.DistributionWithDay == 0 { + return false, errors.New("请填入发放关联天数") + } + } + + // 适用范围-全场通用 + if *req.ApplicationScope == 1 { + // 满减 + if *req.CouponType == 2 { + if *req.WithAmount == 0 { + return false, errors.New("请填入符合满减标准金额") + } + } + + // 数量 + if *req.CouponType == 3 { + if *req.MinUsableNumber == 0 { + return false, errors.New("请填入单商品最小可使用数量") + } + } + } + + // 适用范围-问诊 + if *req.ApplicationScope == 2 { + // 关联问诊类型 + if req.InquiryType == nil { + return false, errors.New("请填入关联问诊类型") + } + } + + // 适用范围-按品牌适用 + if *req.ApplicationScope == 3 { + // 关联品牌id + if req.BrandId == nil { + return false, errors.New("请填入关联品牌") + } + } + + // 适用范围-单品使用 + if *req.ApplicationScope == 5 { + // 关联商品id + if len(req.ProductId) == 0 { + return false, errors.New("请填入关联商品") + } + + productDao := dao.ProductDao{} + for _, s := range req.ProductId { + // 将 id 转换为 int64 类型 + productId, err := strconv.ParseInt(s, 10, 64) + if err != nil { + return false, errors.New("新增失败") + } + + _, err = productDao.GetProductById(productId) + if err != nil { + return false, errors.New("存在错误商品") + } + } + } + + // 有效类型-绝对时效 + if *req.ValidType == 1 { + if req.ValidStartTime == nil { + return false, errors.New("请填入开始使用时间") + } + + if req.ValidEndTime == nil { + return false, errors.New("请填入结束使用时间") + } + } + + // 有效类型-相对时效 + if *req.ValidType == 2 { + if req.ValidDays == nil { + return false, errors.New("请填入有效天数") + } + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + fmt.Println(r) + } + }() + + // 新增优惠卷表 + coupon := &model.Coupon{ + CouponName: req.CouponName, + CouponIcon: utils.AddOssDomain(req.CouponIcon), + CouponClient: *req.CouponClient, + CouponType: *req.CouponType, + CouponStatus: *req.CouponClient, + DistributionObject: *req.DistributionObject, + ApplicationScope: *req.ApplicationScope, + IsMutex: *req.IsMutex, + IsDisplay: *req.IsDisplay, + CouponCount: *req.CouponCount, + CouponPrice: *req.CouponPrice, + ValidType: *req.ValidType, + IsPopup: *req.IsPopup, + } + + // 关联品牌id + if req.BrandId != nil { + // 将 id 转换为 int64 类型 + brandId, err := strconv.ParseInt(*req.BrandId, 10, 64) + if err != nil { + tx.Rollback() + return false, errors.New("新增失败") + } + + coupon.BrandId = &brandId + } + + // 时间区间 + if req.ValidStartTime != nil { + t, err := time.Parse("2006-01-02", *req.ValidStartTime) + if err != nil { + tx.Rollback() + return false, errors.New("新增失败") + } + + validStartTime := model.LocalTime(t) + + coupon.ValidStartTime = &validStartTime + } + + if req.ValidEndTime != nil { + t, err := time.Parse("2006-01-02", *req.ValidEndTime) + if err != nil { + tx.Rollback() + return false, errors.New("新增失败") + } + + ValidEndTime := model.LocalTime(t) + + coupon.ValidEndTime = &ValidEndTime + } + + // 关联商品id + if req.ProductId != nil { + productId := strings.Join(req.ProductId, ",") + if productId != "" { + coupon.ProductId = productId + } + } + + // 关联问诊类型 + if req.InquiryType != nil { + coupon.InquiryType = *req.InquiryType + } + + // 发放关联天数 + if req.DistributionWithDay != nil { + coupon.DistributionWithDay = *req.DistributionWithDay + } + + // 关联 单商品最小可使用数量 + if req.DistributionWithDay != nil { + coupon.DistributionWithDay = *req.DistributionWithDay + } + + // 符合满减标准金额 + if req.WithAmount != nil { + coupon.WithAmount = *req.WithAmount + } + + // 有效天数 + if req.ValidDays != nil { + coupon.ValidDays = *req.ValidDays + } + + // 再次发放间隔天数 + if req.ReissueIntervalDays != nil { + coupon.ReissueIntervalDays = *req.ReissueIntervalDays + } + + // 允许再次发放 + if req.IsReissuableAfterExpire != nil { + coupon.IsReissuableAfterExpire = *req.IsReissuableAfterExpire + } + + // 优惠卷描述 + if req.CouponDesc != nil { + coupon.CouponDesc = *req.CouponDesc + } + + couponDao := dao.CouponDao{} + coupon, err := couponDao.AddCoupon(tx, coupon) + if err != nil || coupon == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + tx.Commit() + return true, nil +} From d207720a4c3b0666265ac69c7aeb8b3390d6fbd0 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 30 May 2024 14:13:07 +0800 Subject: [PATCH 19/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=B3=BB=E7=BB=9F=E4=BC=98=E6=83=A0=E5=8D=B7?= =?UTF-8?q?=E3=80=81=E4=BF=AE=E6=94=B9=E7=B3=BB=E7=BB=9F=E4=BC=98=E6=83=A0?= =?UTF-8?q?=E5=8D=B7=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/coupon.go | 78 +++++++++++++ api/dao/coupon.go | 4 +- api/dto/coupon.go | 8 +- api/model/coupon.go | 4 +- api/requests/coupon.go | 33 +++++- api/router/router.go | 4 +- api/service/coupon.go | 231 ++++++++++++++++++++++++++++++++++++++- 7 files changed, 347 insertions(+), 15 deletions(-) diff --git a/api/controller/coupon.go b/api/controller/coupon.go index 477387c..2d59413 100644 --- a/api/controller/coupon.go +++ b/api/controller/coupon.go @@ -110,3 +110,81 @@ func (r *Coupon) AddSystemCoupon(c *gin.Context) { responses.Ok(c) } + +// PutSystemCoupon 修改系统优惠卷 +func (r *Coupon) PutSystemCoupon(c *gin.Context) { + couponRequest := requests.CouponRequest{} + req := couponRequest.PutSystemCoupon + 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 := c.Param("coupon_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + couponId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + couponService := service.CouponService{} + _, err = couponService.PutSystemCoupon(couponId, req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} + +// PutSystemCouponStatus 修改系统优惠卷状态 +func (r *Coupon) PutSystemCouponStatus(c *gin.Context) { + couponRequest := requests.CouponRequest{} + req := couponRequest.PutSystemCouponStatus + 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 := c.Param("coupon_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + couponId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + couponService := service.CouponService{} + _, err = couponService.PutSystemCouponStatus(couponId, req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} diff --git a/api/dao/coupon.go b/api/dao/coupon.go index c20d879..331b494 100644 --- a/api/dao/coupon.go +++ b/api/dao/coupon.go @@ -40,8 +40,8 @@ func (r *CouponDao) EditCoupon(tx *gorm.DB, maps interface{}, data interface{}) return nil } -// EditCouponByOrderServicePackageId 修改-id -func (r *CouponDao) EditCouponByOrderServicePackageId(tx *gorm.DB, couponId int64, data interface{}) error { +// EditCouponById 修改 +func (r *CouponDao) EditCouponById(tx *gorm.DB, couponId int64, data interface{}) error { err := tx.Model(&model.Coupon{}).Where("coupon_id = ?", couponId).Updates(data).Error if err != nil { return err diff --git a/api/dto/coupon.go b/api/dto/coupon.go index 1d0466b..1ddac2f 100644 --- a/api/dto/coupon.go +++ b/api/dto/coupon.go @@ -53,10 +53,10 @@ func GetCouponDto(m *model.Coupon) *CouponDto { ApplicationScope: m.ApplicationScope, InquiryType: m.InquiryType, BrandId: fmt.Sprintf("%d", m.BrandId), - IsMutex: m.IsMutex, + IsMutex: *m.IsMutex, IsDisplay: m.IsDisplay, DistributionWithDay: m.DistributionWithDay, - MinUsableNumber: m.MinUsableNumber, + MinUsableNumber: *m.MinUsableNumber, CouponCount: m.CouponCount, CouponTakeCount: m.CouponTakeCount, CouponUsedCount: m.CouponUsedCount, @@ -94,10 +94,10 @@ func GetCouponListDto(m []*model.Coupon) []*CouponDto { ApplicationScope: v.ApplicationScope, InquiryType: v.InquiryType, BrandId: fmt.Sprintf("%d", v.BrandId), - IsMutex: v.IsMutex, + IsMutex: *v.IsMutex, IsDisplay: v.IsDisplay, DistributionWithDay: v.DistributionWithDay, - MinUsableNumber: v.MinUsableNumber, + MinUsableNumber: *v.MinUsableNumber, CouponCount: v.CouponCount, CouponTakeCount: v.CouponTakeCount, CouponUsedCount: v.CouponUsedCount, diff --git a/api/model/coupon.go b/api/model/coupon.go index e84a0b0..0f51d26 100644 --- a/api/model/coupon.go +++ b/api/model/coupon.go @@ -18,10 +18,10 @@ type Coupon struct { ApplicationScope int `gorm:"column:application_scope;type:tinyint(1);default:1;comment:适用范围(1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品)" json:"application_scope"` InquiryType string `gorm:"column:inquiry_type;type:varchar(100);comment:关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测)" json:"inquiry_type"` BrandId *int64 `gorm:"column:brand_id;type:bigint(19);comment:关联品牌id(如不限制品牌,此项为空)" json:"brand_id"` - IsMutex int `gorm:"column:is_mutex;type:tinyint(1);default:1;comment:是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用" json:"is_mutex"` + IsMutex *int `gorm:"column:is_mutex;type:tinyint(1);default:1;comment:是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用" json:"is_mutex"` IsDisplay int `gorm:"column:is_display;type:tinyint(1);comment:是否展示(0:否 1:是)" json:"is_display"` DistributionWithDay int `gorm:"column:distribution_with_day;type:int(11);default:0;comment:发放关联天数(发放对象为近期消费等类型时规定天数)" json:"distribution_with_day"` - MinUsableNumber int `gorm:"column:min_usable_number;type:int(11);default:1;comment:单商品最小可使用数量(默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处)" json:"min_usable_number"` + MinUsableNumber *int `gorm:"column:min_usable_number;type:int(11);default:1;comment:单商品最小可使用数量(默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处)" json:"min_usable_number"` CouponCount int `gorm:"column:coupon_count;type:int(10);default:0;comment:发放数量" json:"coupon_count"` CouponTakeCount int `gorm:"column:coupon_take_count;type:int(10);default:0;comment:已领取数量" json:"coupon_take_count"` CouponUsedCount int `gorm:"column:coupon_used_count;type:int(10);default:0;comment:已使用数量" json:"coupon_used_count"` diff --git a/api/requests/coupon.go b/api/requests/coupon.go index af00ef9..64b38bc 100644 --- a/api/requests/coupon.go +++ b/api/requests/coupon.go @@ -1,8 +1,10 @@ package requests type CouponRequest struct { - GetSystemCouponPage // 获取系统优惠卷列表-分页 - AddSystemCoupon // 新增系统优惠卷 + GetSystemCouponPage // 获取系统优惠卷列表-分页 + AddSystemCoupon // 新增系统优惠卷 + PutSystemCoupon // 修改系统优惠卷 + PutSystemCouponStatus // 修改系统优惠卷状态 } // GetSystemCouponPage 获取系统优惠卷列表-分页 @@ -33,7 +35,7 @@ type AddSystemCoupon struct { CouponClient *int `json:"coupon_client" form:"coupon_client" label:"使用平台" validate:"required,oneof=1"` // 使用平台(1:小程序) CouponType *int `json:"coupon_type" form:"coupon_type" label:"优惠卷类型" validate:"required,oneof=1 2 3"` // 优惠卷类型(1 :无门槛 2:满减 3:数量) DistributionObject *int `json:"distribution_object" form:"distribution_object" label:"发放对象" validate:"required,oneof=1 2 3 4 5 6 7"` - ApplicationScope *int `json:"application_scope" form:"application_scope" label:"适用范围" validate:"required,oneof=1 2 3 4 5 6"` + ApplicationScope *int `json:"application_scope" form:"application_scope" label:"适用范围" validate:"required,oneof=1 2 3 4 5 6"` // (1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品) InquiryType *string `json:"inquiry_type" form:"inquiry_type" label:"关联问诊类型" validate:"omitempty,oneof=1 2 3 4 5 6"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) BrandId *string `json:"brand_id" form:"brand_id" label:"关联品牌id"` // 关联品牌id(如不限制品牌,此项为空) IsMutex *int `json:"is_mutex" form:"is_mutex" label:"是否互斥" validate:"required,oneof=0 1"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 @@ -53,3 +55,28 @@ type AddSystemCoupon struct { IsPopup *int `json:"is_popup" form:"is_popup" label:"是否首页弹窗" validate:"required,oneof=0 1"` // 是否首页弹窗(0:否 1:是) CouponDesc *string `json:"coupon_desc" form:"coupon_desc" label:"优惠卷描述"` } + +// PutSystemCoupon 修改系统优惠卷 +type PutSystemCoupon struct { + CouponName string `json:"coupon_name" form:"coupon_name" label:"优惠卷名称" validate:"required"` // 优惠卷名称 + CouponIcon string `json:"coupon_icon" form:"coupon_icon" label:"头像"` // 优惠卷名称 + DistributionObject *int `json:"distribution_object" form:"distribution_object" label:"发放对象" validate:"required,oneof=1 2 3 4 5 6 7"` // (1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户) + InquiryType *string `json:"inquiry_type" form:"inquiry_type" label:"关联问诊类型" validate:"omitempty,oneof=1 2 3 4 5 6"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) + BrandId *string `json:"brand_id" form:"brand_id" label:"关联品牌id"` // 关联品牌id(如不限制品牌,此项为空) + IsMutex *int `json:"is_mutex" form:"is_mutex" label:"是否互斥" validate:"required,oneof=0 1"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 + IsDisplay *int `json:"is_display" form:"is_display" label:"是否展示" validate:"required,oneof=0 1"` // 是否展示(0:否 1:是) + DistributionWithDay *int `json:"distribution_with_day" form:"distribution_with_day" label:"发放关联天数" validate:"omitempty,numeric,min=1"` // (发放对象为近期消费等类型时规定天数) + MinUsableNumber *int `json:"min_usable_number" form:"min_usable_number" label:"单商品最小可使用数量" validate:"omitempty,numeric,min=1"` // (默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) + CouponCount *int `json:"coupon_count" form:"coupon_count" label:"发放数量" validate:"required,number,min=1"` // (默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) + CouponPrice *float64 `json:"coupon_price" form:"coupon_price" label:"优惠卷金额" validate:"required,numeric,gt=0"` // 优惠卷金额 + ProductId []string `json:"product_id" form:"product_id" label:"关联商品id"` // ,逗号分隔,指定商品时,填入此项。 + ReissueIntervalDays *int `json:"reissue_interval_days" form:"reissue_interval_days" label:"确认收货后的再次发放间隔天数" validate:"omitempty,numeric,min=0"` // (如果设置为 0,则表示不再次发放。当适用范围为商品时生效) + IsReissuableAfterExpire *int `json:"is_reissuable_after_expire" form:"is_reissuable_after_expire" label:"过期之后是否允许再次发放" validate:"omitempty,oneof=0 1"` // 过期之后是否允许再次发放(0:否 1:是) + IsPopup *int `json:"is_popup" form:"is_popup" label:"是否首页弹窗" validate:"required,oneof=0 1"` // 是否首页弹窗(0:否 1:是) + CouponDesc *string `json:"coupon_desc" form:"coupon_desc" label:"优惠卷描述"` +} + +// PutSystemCouponStatus 修改系统优惠卷状态 +type PutSystemCouponStatus struct { + CouponStatus int `json:"coupon_status" form:"coupon_status" label:"状态" validate:"required,oneof=2 3 4"` // (1:正常 2:强制失效 3:结束 4:删除) +} diff --git a/api/router/router.go b/api/router/router.go index 758e9a3..1e47da2 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -736,10 +736,10 @@ func privateRouter(r *gin.Engine, api controller.Api) { systemGroup.POST("", api.Coupon.AddSystemCoupon) // 修改系统优惠卷 - systemGroup.PUT("/:coupon_id", api.Product.PutProduct) + systemGroup.PUT("/:coupon_id", api.Coupon.PutSystemCoupon) // 修改系统优惠卷状态 - systemGroup.PUT("/status/:product_id", api.Product.PutProductStatus) + systemGroup.PUT("/status/:coupon_id", api.Coupon.PutSystemCouponStatus) } // 用户优惠卷管理 diff --git a/api/service/coupon.go b/api/service/coupon.go index 8353239..b8367cb 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -145,7 +145,7 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err CouponStatus: *req.CouponClient, DistributionObject: *req.DistributionObject, ApplicationScope: *req.ApplicationScope, - IsMutex: *req.IsMutex, + IsMutex: req.IsMutex, IsDisplay: *req.IsDisplay, CouponCount: *req.CouponCount, CouponPrice: *req.CouponPrice, @@ -208,11 +208,16 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err coupon.DistributionWithDay = *req.DistributionWithDay } - // 关联 单商品最小可使用数量 + // 发放关联天数 if req.DistributionWithDay != nil { coupon.DistributionWithDay = *req.DistributionWithDay } + // 单商品最小可使用数量 + if req.MinUsableNumber != nil { + coupon.MinUsableNumber = req.MinUsableNumber + } + // 符合满减标准金额 if req.WithAmount != nil { coupon.WithAmount = *req.WithAmount @@ -245,6 +250,228 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err return false, errors.New(err.Error()) } + // 增加优惠卷过期队列 + + tx.Commit() + return true, nil +} + +// PutSystemCoupon 修改系统优惠卷 +func (r *CouponService) PutSystemCoupon(couponId int64, req requests.PutSystemCoupon) (bool, error) { + couponDao := dao.CouponDao{} + coupon, err := couponDao.GetCouponById(couponId) + if err != nil { + return false, err + } + + if coupon.CouponStatus != 1 { + return false, errors.New("优惠卷非正常状态,不支持更改") + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + couponData := make(map[string]interface{}) + + // 优惠卷名称 + if req.CouponName != coupon.CouponName { + couponData["coupon_name"] = req.CouponName + } + + // 头像 + if req.CouponIcon != "" { + if req.CouponIcon != coupon.CouponIcon { + couponData["coupon_icon"] = req.CouponIcon + } + } + + // 发放对象 + if req.DistributionObject != nil { + if *req.DistributionObject != coupon.DistributionObject { + couponData["distribution_object"] = req.DistributionObject + } + } + + // 关联问诊类型 + if coupon.ApplicationScope == 2 { + if req.InquiryType != nil { + if *req.InquiryType != coupon.InquiryType { + couponData["inquiry_type"] = req.InquiryType + } + } + } + + // 关联品牌id + if coupon.ApplicationScope == 3 { + // 将 id 转换为 int64 类型 + brandId, err := strconv.ParseInt(*req.BrandId, 10, 64) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + + if &brandId != coupon.BrandId { + couponData["brand_id"] = req.InquiryType + } + } + + // 是否互斥 + if req.IsMutex != nil { + if req.IsMutex != coupon.IsMutex { + couponData["is_mutex"] = req.IsMutex + } + } + + // 是否展示 + if req.IsDisplay != nil { + if *req.IsDisplay != coupon.IsDisplay { + couponData["is_display"] = req.IsDisplay + } + } + + // 发放关联天数 + if coupon.DistributionObject == 4 { + if req.DistributionWithDay != nil { + if *req.DistributionWithDay != coupon.DistributionWithDay { + couponData["distribution_with_day"] = req.InquiryType + } + } + } + + // 单商品最小可使用数量 + if coupon.ApplicationScope == 1 && coupon.CouponType == 3 { + if req.MinUsableNumber != nil { + couponData["min_usable_number"] = req.InquiryType + } + } + + // 发放数量 + if req.CouponCount != nil { + if *req.CouponCount != coupon.CouponCount { + if *req.CouponCount <= coupon.CouponTakeCount { + tx.Rollback() + return false, errors.New("发放数量,不可低于已发放数量") + } + + couponData["coupon_count"] = req.InquiryType + } + } + + // 优惠卷金额 + if req.CouponPrice != nil { + if *req.CouponPrice != coupon.CouponPrice { + couponData["coupon_price"] = req.InquiryType + } + } + + // 关联商品id + if len(req.ProductId) > 0 { + productId := strings.Join(req.ProductId, ",") + + if productId != coupon.ProductId { + productDao := dao.ProductDao{} + for _, s := range req.ProductId { + // 将 id 转换为 int64 类型 + productId, err := strconv.ParseInt(s, 10, 64) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + + _, err = productDao.GetProductById(productId) + if err != nil { + tx.Rollback() + return false, errors.New("存在错误商品") + } + } + + couponData["product_id"] = productId + } + } + + // 确认收货后的再次发放间隔天数 + if req.ReissueIntervalDays != nil { + if *req.ReissueIntervalDays != coupon.ReissueIntervalDays { + couponData["reissue_interval_days"] = req.ReissueIntervalDays + } + } + + // 过期之后是否允许再次发放 + if req.IsReissuableAfterExpire != nil { + if *req.IsReissuableAfterExpire != coupon.IsReissuableAfterExpire { + couponData["is_reissuable_after_expire"] = req.IsReissuableAfterExpire + } + } + + // 是否首页弹窗 + if *req.IsPopup != coupon.IsPopup { + couponData["is_popup"] = req.IsPopup + } + + // 优惠卷描述 + if req.CouponDesc != nil { + if *req.CouponDesc != coupon.CouponDesc { + couponData["coupon_desc"] = req.CouponDesc + } + } + + err = couponDao.EditCouponById(tx, coupon.CouponId, couponData) + if err != nil || coupon == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + tx.Commit() + return true, nil +} + +// PutSystemCouponStatus 修改系统优惠卷状态 +func (r *CouponService) PutSystemCouponStatus(couponId int64, req requests.PutSystemCouponStatus) (bool, error) { + couponDao := dao.CouponDao{} + coupon, err := couponDao.GetCouponById(couponId) + if err != nil { + return false, err + } + + // 状态未变 + if coupon.CouponStatus == req.CouponStatus { + return true, nil + } + + if coupon.CouponStatus == 2 { + return false, errors.New("优惠卷已强制失效,无法再次操作") + } + + if coupon.CouponStatus == 3 { + return false, errors.New("优惠卷已结束,无法再次操作") + } + + if coupon.CouponStatus == 4 { + return false, errors.New("优惠卷已删除,无法再次操作") + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + couponData := make(map[string]interface{}) + couponData["coupon_status"] = req.CouponStatus + + err = couponDao.EditCouponById(tx, coupon.CouponId, couponData) + if err != nil || coupon == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + tx.Commit() return true, nil } From 7b021906a2f64d37cf0eb932060f987905b8fc42 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 31 May 2024 17:21:26 +0800 Subject: [PATCH 20/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=EF=BC=9A?= =?UTF-8?q?=E5=8F=91=E6=94=BE=E7=B3=BB=E7=BB=9F=E4=BC=98=E6=83=A0=E5=8D=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/coupon.go | 91 +++++++++++++ api/dao/coupon.go | 18 +++ api/dao/couponGrant.go | 55 ++++++++ api/dao/popup.go | 64 +++++++++ api/dao/userCoupon.go | 125 ++++++++++++++++++ api/dao/userPatient.go | 9 ++ api/dto/UserCoupon.go | 20 ++- api/model/couponGrantRecord.go | 39 ++++++ api/model/popup.go | 40 ++++++ api/model/userCoupon.go | 17 +-- api/requests/coupon.go | 26 ++++ api/router/router.go | 17 +-- api/service/coupon.go | 234 +++++++++++++++++++++++++++++++++ api/service/messagePush.go | 36 +++++ 14 files changed, 767 insertions(+), 24 deletions(-) create mode 100644 api/dao/couponGrant.go create mode 100644 api/dao/popup.go create mode 100644 api/model/couponGrantRecord.go create mode 100644 api/model/popup.go create mode 100644 api/service/messagePush.go diff --git a/api/controller/coupon.go b/api/controller/coupon.go index 2d59413..ca3021c 100644 --- a/api/controller/coupon.go +++ b/api/controller/coupon.go @@ -188,3 +188,94 @@ func (r *Coupon) PutSystemCouponStatus(c *gin.Context) { responses.Ok(c) } + +// GetUserCouponPage 获取用户优惠卷列表-分页 +func (r *Coupon) GetUserCouponPage(c *gin.Context) { + couponRequest := requests.CouponRequest{} + req := couponRequest.GetUserCouponPage + 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 + } + + userCouponDao := dao.UserCouponDao{} + userCoupon, total, err := userCouponDao.GetUserCouponPageSearch(req, req.Page, req.PageSize) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + GetProductPlatformPageResponses := dto.GetUserCouponListDto(userCoupon) + 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) +} + +// GrantSystemCoupon 发放系统优惠卷 +func (r *Coupon) GrantSystemCoupon(c *gin.Context) { + couponRequest := requests.CouponRequest{} + req := couponRequest.GrantSystemCoupon + 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 := c.Param("coupon_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + couponId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 获取当前登陆用户id + userId := c.GetInt64("UserId") + if userId == 0 { + responses.FailWithMessage("角色错误", c) + return + } + + // 业务处理 + couponService := service.CouponService{} + _, err = couponService.GrantSystemCoupon(couponId, userId, req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} diff --git a/api/dao/coupon.go b/api/dao/coupon.go index 331b494..4783c67 100644 --- a/api/dao/coupon.go +++ b/api/dao/coupon.go @@ -165,3 +165,21 @@ func (r *CouponDao) GetCouponPageSearch(req requests.GetSystemCouponPage, page, } return m, totalRecords, nil } + +// Inc 自增 +func (r *CouponDao) Inc(tx *gorm.DB, couponId int64, field string, numeral int) error { + err := tx.Model(&model.Coupon{}).Where("coupon_id = ?", couponId).UpdateColumn("coupon_take_count", gorm.Expr(field+" + ?", numeral)).Error + if err != nil { + return err + } + return nil +} + +// Dec 自减 +func (r *CouponDao) Dec(tx *gorm.DB, couponId int64, field string, numeral int) error { + err := tx.Model(&model.Coupon{}).Where("coupon_id = ?", couponId).UpdateColumn("coupon_take_count", gorm.Expr(field+" - ?", numeral)).Error + if err != nil { + return err + } + return nil +} diff --git a/api/dao/couponGrant.go b/api/dao/couponGrant.go new file mode 100644 index 0000000..815b33f --- /dev/null +++ b/api/dao/couponGrant.go @@ -0,0 +1,55 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type CouponGrantDao struct { +} + +// GetCouponGrantById 获取数据-id +func (r *CouponGrantDao) GetCouponGrantById(orderServiceId int64) (m *model.CouponGrant, err error) { + err = global.Db.First(&m, orderServiceId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetCouponGrantPreloadById 获取数据-加载全部关联-id +func (r *CouponGrantDao) GetCouponGrantPreloadById(orderServiceId int64) (m *model.CouponGrant, err error) { + err = global.Db.Preload(clause.Associations).First(&m, orderServiceId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetCouponGrantByCouponId 获取数据-id +func (r *CouponGrantDao) GetCouponGrantByCouponId(couponId int64) (m *model.CouponGrant, err error) { + err = global.Db.Where("coupon_id = ?", couponId).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetCouponGrantList 获取列表 +func (r *CouponGrantDao) GetCouponGrantList(maps interface{}) (m []*model.CouponGrant, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddCouponGrant 新增 +func (r *CouponGrantDao) AddCouponGrant(tx *gorm.DB, model *model.CouponGrant) (*model.CouponGrant, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} diff --git a/api/dao/popup.go b/api/dao/popup.go new file mode 100644 index 0000000..8105188 --- /dev/null +++ b/api/dao/popup.go @@ -0,0 +1,64 @@ +package dao + +import ( + "gorm.io/gorm" + "gorm.io/gorm/clause" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type PopupDao struct { +} + +// GetPopupById 获取数据-id +func (r *PopupDao) GetPopupById(popupId int64) (m *model.Popup, err error) { + err = global.Db.First(&m, popupId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetPopupPreloadById 获取数据-加载全部关联-id +func (r *PopupDao) GetPopupPreloadById(popupId int64) (m *model.Popup, err error) { + err = global.Db.Preload(clause.Associations).First(&m, popupId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// EditPopup 修改 +func (r *PopupDao) EditPopup(tx *gorm.DB, maps interface{}, data interface{}) error { + err := tx.Model(&model.Popup{}).Where(maps).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// EditPopupByOrderServicePackageId 修改-id +func (r *PopupDao) EditPopupByOrderServicePackageId(tx *gorm.DB, popupId int64, data interface{}) error { + err := tx.Model(&model.Popup{}).Where("popup_id = ?", popupId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetPopupList 获取列表 +func (r *PopupDao) GetPopupList(maps interface{}) (m []*model.Popup, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddPopup 新增 +func (r *PopupDao) AddPopup(tx *gorm.DB, model *model.Popup) (*model.Popup, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} diff --git a/api/dao/userCoupon.go b/api/dao/userCoupon.go index acdb8ab..f7964f2 100644 --- a/api/dao/userCoupon.go +++ b/api/dao/userCoupon.go @@ -4,7 +4,9 @@ import ( "gorm.io/gorm" "gorm.io/gorm/clause" "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" "hospital-admin-api/global" + "strings" "time" ) @@ -73,6 +75,15 @@ func (r *UserCouponDao) GetUserCouponList(maps interface{}) (m []*model.UserCoup return m, nil } +// GetUserCoupon 获取 +func (r *UserCouponDao) GetUserCoupon(maps interface{}) (m *model.UserCoupon, err error) { + err = global.Db.Where(maps).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + // AddUserCoupon 新增用户优惠卷 func (r *UserCouponDao) AddUserCoupon(tx *gorm.DB, model *model.UserCoupon) (*model.UserCoupon, error) { if err := tx.Create(model).Error; err != nil { @@ -117,3 +128,117 @@ func (r *UserCouponDao) GetUserAllObjectTypeCoupon(userId int64, distributionObj } return m, nil } + +// GetUserCouponPageSearch 获取用户优惠卷列表-分页 +func (r *UserCouponDao) GetUserCouponPageSearch(req requests.GetUserCouponPage, page, pageSize int) (m []*model.UserCoupon, total int64, err error) { + var totalRecords int64 + + // 构建查询条件 + query := global.Db.Model(&model.UserCoupon{}) + + // 用户 + query = query.Preload("User", func(db *gorm.DB) *gorm.DB { + return db.Omit("user_password", "salt") + }) + + query = query.Preload("Coupon") + + // 优惠卷名称 + if req.CouponName != "" { + query = query.Where("coupon_name LIKE ?", "%"+req.CouponName+"%") + } + + // 优惠卷编号 + if req.CouponId != "" { + query = query.Where("coupon_id = ?", req.CouponId) + } + + // 使用状态 + if req.UserCouponStatus != nil { + query = query.Where("user_coupon_status = ?", req.UserCouponStatus) + } + + // 使用时间 + if req.CouponUseDate != "" { + couponUseDate := strings.Split(req.CouponUseDate, "&") + if len(couponUseDate) == 2 { + startTime, _ := time.Parse("2006-01-02", couponUseDate[0]) + endTime, _ := time.Parse("2006-01-02", couponUseDate[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("coupon_use_date BETWEEN ? AND ?", startTime, endTime) + } + } + + // 有效使用时间 + if req.ValidStartTime != "" { + validStartTime := strings.Split(req.ValidStartTime, "&") + if len(validStartTime) == 2 { + startTime, _ := time.Parse("2006-01-02", validStartTime[0]) + endTime, _ := time.Parse("2006-01-02", validStartTime[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("valid_start_time BETWEEN ? AND ?", startTime, endTime) + } + } + + // 过期使用时间 + if req.ValidEndTime != "" { + validEndTime := strings.Split(req.ValidEndTime, "&") + if len(validEndTime) == 2 { + startTime, _ := time.Parse("2006-01-02", validEndTime[0]) + endTime, _ := time.Parse("2006-01-02", validEndTime[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("valid_end_time BETWEEN ? AND ?", startTime, endTime) + } + } + + // 创建时间 + if req.CreatedAt != "" { + createdAt := strings.Split(req.CreatedAt, "&") + if len(createdAt) == 2 { + startTime, _ := time.Parse("2006-01-02", createdAt[0]) + endTime, _ := time.Parse("2006-01-02", createdAt[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("created_at BETWEEN ? AND ?", startTime, endTime) + } + } + + // 手机号 + if req.Mobile != "" { + subQuery := global.Db.Model(&model.User{}). + Select("user_id"). + Where("mobile LIKE ?", "%"+req.Mobile+"%") + + query = query.Where(gorm.Expr("user_id IN (?)", subQuery)) + } + + // 用户名 + if req.UserName != "" { + subQuery := global.Db.Model(&model.UserPatient{}). + Select("user_id"). + Where("user_name LIKE ?", "%"+req.UserName+"%") + + query = query.Where(gorm.Expr("user_id IN (?)", subQuery)) + } + + // 排序 + 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/userPatient.go b/api/dao/userPatient.go index 6753c9d..1cd8193 100644 --- a/api/dao/userPatient.go +++ b/api/dao/userPatient.go @@ -235,3 +235,12 @@ func (r *UserPatientDao) GetUserPatientExportListSearch(req requests.UserPatient return m, nil } + +// GetUserPatientByUserId 获取患者数据-id +func (r *UserPatientDao) GetUserPatientByUserId(userId int64) (m *model.UserPatient, err error) { + err = global.Db.Where("user_id = ?", userId).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/dto/UserCoupon.go b/api/dto/UserCoupon.go index 60ab469..09ab35c 100644 --- a/api/dto/UserCoupon.go +++ b/api/dto/UserCoupon.go @@ -18,6 +18,7 @@ type UserCouponDto struct { CreatedAt model.LocalTime `json:"created_at"` // 创建时间 UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 Coupon *CouponDto `json:"coupon"` // 优惠卷 + UserName string `json:"user_name"` // 用户名称 } // GetUserCouponDto 用户优惠卷详情 @@ -28,7 +29,7 @@ func GetUserCouponDto(m *model.UserCoupon) *UserCouponDto { PatientId: fmt.Sprintf("%d", m.PatientId), CouponId: fmt.Sprintf("%d", m.CouponId), UserCouponStatus: m.UserCouponStatus, - CouponUseDate: model.LocalTime(m.CouponUseDate), + CouponUseDate: model.LocalTime(*m.CouponUseDate), ValidStartTime: model.LocalTime(m.ValidStartTime), ValidEndTime: model.LocalTime(m.ValidEndTime), CreatedAt: m.CreatedAt, @@ -49,18 +50,23 @@ func GetUserCouponListDto(m []*model.UserCoupon) []*UserCouponDto { PatientId: fmt.Sprintf("%d", v.PatientId), CouponId: fmt.Sprintf("%d", v.CouponId), UserCouponStatus: v.UserCouponStatus, - CouponUseDate: model.LocalTime(v.CouponUseDate), + CouponUseDate: model.LocalTime(*v.CouponUseDate), ValidStartTime: model.LocalTime(v.ValidStartTime), ValidEndTime: model.LocalTime(v.ValidEndTime), CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, } - // 加载问诊订单数据 + // 加载优惠卷数据 if v.Coupon != nil { response = response.LoadCoupon(v.Coupon) } + // 加载用户属性 + if v.User != nil { + response = response.LoadUserAttr(v.User) + } + // 将转换后的结构体添加到新切片中 responses[i] = response } @@ -78,3 +84,11 @@ func (r *UserCouponDto) LoadCoupon(m *model.Coupon) *UserCouponDto { } return r } + +// LoadUserAttr 加载用户属性 +func (r *UserCouponDto) LoadUserAttr(m *model.User) *UserCouponDto { + if m != nil { + r.UserName = m.UserName + } + return r +} diff --git a/api/model/couponGrantRecord.go b/api/model/couponGrantRecord.go new file mode 100644 index 0000000..0a11d9b --- /dev/null +++ b/api/model/couponGrantRecord.go @@ -0,0 +1,39 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// CouponGrant 优惠卷发放记录表 +type CouponGrant struct { + GrantId int64 `gorm:"column:grant_id;type:bigint(19);primary_key;comment:主键id" json:"grant_id"` + CouponId int64 `gorm:"column:coupon_id;type:bigint(19);comment:优惠卷id" json:"coupon_id"` + GrantType int `gorm:"column:grant_type;type:tinyint(1);default:1;comment:发放类型(1:具体用户 2:未拥有用户)" json:"grant_type"` + UserId int64 `gorm:"column:user_id;type:bigint(19);comment:用户id(发放类型为具体用户时存在)" json:"user_id"` + TotalQuantity int `gorm:"column:total_quantity;type:int(5);default:0;comment:目标发放数量" json:"total_quantity"` + GrantQuantity int `gorm:"column:grant_quantity;type:int(5);comment:已发放数量" json:"grant_quantity"` + GrantResult int `gorm:"column:grant_result;type:tinyint(1);default:2;comment:发放结果(1:成功 2:发放中 3:部分 4:失败)" json:"grant_result"` + StopReason string `gorm:"column:stop_reason;type:varchar(255);comment:停止原因" json:"stop_reason"` + AdminUserId int64 `gorm:"column:admin_user_id;type:bigint(19);comment:后台操作用户id" json:"admin_user_id"` + Model +} + +func (m *CouponGrant) TableName() string { + return "gdxz_coupon_grant" +} + +func (m *CouponGrant) BeforeCreate(tx *gorm.DB) error { + if m.GrantId == 0 { + m.GrantId = 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/popup.go b/api/model/popup.go new file mode 100644 index 0000000..c6fa302 --- /dev/null +++ b/api/model/popup.go @@ -0,0 +1,40 @@ +package model + +import ( + "gorm.io/gorm" + "hospital-admin-api/global" + "time" +) + +// Popup 弹窗表 +type Popup struct { + PopupId int64 `gorm:"column:popup_id;type:bigint(19);primary_key;comment:主键id" json:"popup_id"` + UserId int64 `gorm:"column:user_id;type:bigint(19);comment:用户id" json:"user_id"` + AppType int `gorm:"column:app_type;type:tinyint(4);comment:应用程序类型(1:小程序 2:app);NOT NULL" json:"app_type"` + ClientType int `gorm:"column:client_type;type:tinyint(4);comment:客户端类型(1:患者端 2:医生端 3:药师端);NOT NULL" json:"client_type"` + Status int `gorm:"column:status;type:tinyint(4);default:0;comment:状态(0:未弹 1:已弹)" json:"status"` + PopupType int `gorm:"column:popup_type;type:tinyint(4);comment:弹窗类型(1:结算费用规则 2:新优惠卷弹窗);NOT NULL" json:"popup_type"` + PopupTitle string `gorm:"column:popup_title;type:varchar(255);comment:标题" json:"popup_title"` + PopupContent string `gorm:"column:popup_content;type:varchar(1000);comment:内容" json:"popup_content"` + PopupImg string `gorm:"column:popup_img;type:varchar(255);comment:封面图片" json:"popup_img"` + PopupLink string `gorm:"column:popup_link;type:varchar(255);comment:跳转地址" json:"popup_link"` + Model +} + +func (m *Popup) TableName() string { + return "gdxz_popup" +} + +func (m *Popup) BeforeCreate(tx *gorm.DB) error { + if m.PopupId == 0 { + m.PopupId = 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/userCoupon.go b/api/model/userCoupon.go index c2baead..22c545f 100644 --- a/api/model/userCoupon.go +++ b/api/model/userCoupon.go @@ -8,16 +8,17 @@ import ( // UserCoupon 用户优惠卷表 type UserCoupon struct { - UserCouponId int64 `gorm:"column:user_coupon_id;type:bigint(19);primary_key;comment:主键id" json:"user_coupon_id"` - UserId int64 `gorm:"column:user_id;type:bigint(19);comment:用户id;NOT NULL" json:"user_id"` - PatientId int64 `gorm:"column:patient_id;type:bigint(19);comment:患者id" json:"patient_id"` - CouponId int64 `gorm:"column:coupon_id;type:bigint(19);comment:优惠卷id;NOT NULL" json:"coupon_id"` - UserCouponStatus int `gorm:"column:user_coupon_status;type:tinyint(1);default:0;comment:状态(0:未使用 1:已使用 3:已过期)" json:"user_coupon_status"` - CouponUseDate time.Time `gorm:"column:coupon_use_date;type:datetime;comment:使用时间" json:"coupon_use_date"` - ValidStartTime time.Time `gorm:"column:valid_start_time;type:datetime;comment:有效使用时间" json:"valid_start_time"` - ValidEndTime time.Time `gorm:"column:valid_end_time;type:datetime;comment:过期使用时间" json:"valid_end_time"` + UserCouponId int64 `gorm:"column:user_coupon_id;type:bigint(19);primary_key;comment:主键id" json:"user_coupon_id"` + UserId int64 `gorm:"column:user_id;type:bigint(19);comment:用户id;NOT NULL" json:"user_id"` + PatientId int64 `gorm:"column:patient_id;type:bigint(19);comment:患者id" json:"patient_id"` + CouponId int64 `gorm:"column:coupon_id;type:bigint(19);comment:优惠卷id;NOT NULL" json:"coupon_id"` + UserCouponStatus int `gorm:"column:user_coupon_status;type:tinyint(1);default:0;comment:状态(0:未使用 1:已使用 3:已过期)" json:"user_coupon_status"` + CouponUseDate *time.Time `gorm:"column:coupon_use_date;type:datetime;comment:使用时间" json:"coupon_use_date"` + ValidStartTime time.Time `gorm:"column:valid_start_time;type:datetime;comment:有效使用时间" json:"valid_start_time"` + ValidEndTime time.Time `gorm:"column:valid_end_time;type:datetime;comment:过期使用时间" json:"valid_end_time"` Model Coupon *Coupon `gorm:"foreignKey:CouponId;references:coupon_id" json:"coupon"` + User *User `gorm:"foreignKey:UserId;references:user_id" json:"user"` // 用户 } func (m *UserCoupon) TableName() string { diff --git a/api/requests/coupon.go b/api/requests/coupon.go index 64b38bc..91d91d8 100644 --- a/api/requests/coupon.go +++ b/api/requests/coupon.go @@ -5,6 +5,8 @@ type CouponRequest struct { AddSystemCoupon // 新增系统优惠卷 PutSystemCoupon // 修改系统优惠卷 PutSystemCouponStatus // 修改系统优惠卷状态 + GetUserCouponPage // 获取用户优惠卷列表-分页 + GrantSystemCoupon // 发放系统优惠卷 } // GetSystemCouponPage 获取系统优惠卷列表-分页 @@ -80,3 +82,27 @@ type PutSystemCoupon struct { type PutSystemCouponStatus struct { CouponStatus int `json:"coupon_status" form:"coupon_status" label:"状态" validate:"required,oneof=2 3 4"` // (1:正常 2:强制失效 3:结束 4:删除) } + +// GetUserCouponPage 获取用户优惠卷列表-分页 +type GetUserCouponPage struct { + Page int `json:"page" form:"page" label:"页码"` + PageSize int `json:"page_size" form:"page_size" label:"每页个数"` + CouponName string `json:"coupon_name" form:"coupon_name" label:"优惠卷名称"` // 优惠卷名称 + CouponId string `json:"coupon_id" form:"coupon_id" label:"优惠卷编号"` // 优惠卷名称 + UserCouponStatus *int `json:"user_coupon_status" form:"user_coupon_status" label:"使用状态(0:未使用 1:已使用 3:已过期)"` // 状态(1:正常 2:强制失效 3:结束 4:删除) + CouponUseDate string `json:"coupon_use_date" form:"coupon_use_date" label:"使用时间"` // 使用时间 + ValidStartTime string `json:"valid_start_time" form:"valid_start_time" label:"有效使用时间"` // 有效使用时间 + ValidEndTime string `json:"valid_end_time" form:"valid_end_time" label:"过期使用时间"` // 过期使用时间 + CreatedAt string `json:"created_at" form:"created_at" label:"创建时间"` // 创建时间 + Mobile string `json:"mobile" form:"mobile" label:"手机号"` + UserName string `json:"user_name" form:"user_name" label:"用户名"` +} + +// GrantSystemCoupon 发放系统优惠卷 +type GrantSystemCoupon struct { + Type int `json:"type" form:"type" label:"用户编号" validate:"required,oneof=1 2"` // 发放类型(1:具体用户 2:全部用户) + UserId string `json:"user_id" form:"user_id" label:"用户编号" validate:"number"` // 用户编号 + TotalQuantity int `json:"total_quantity" form:"total_quantity" label:"总发放数量" validate:"required,number,min=1"` // 总发放数量-发完即止 + SingleQuantity int `json:"single_quantity" form:"single_quantity" label:"个人可发放数量" validate:"required,number,min=1"` // 个人可发放数量-发完即止,依次发放,到达发放总数量后即停止 + IsForce *int `json:"is_follow_rules" form:"is_force_grant" label:"是否遵循优惠卷发放对象规则" validate:"oneof=0 1"` // 是否遵循优惠卷发放对象规则(0:否 1:是)(是:遵循优惠卷发放对象规则进行发放。否:不满足优惠卷发放对象规则也会发放一张) +} diff --git a/api/router/router.go b/api/router/router.go index 1e47da2..705d39d 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -740,25 +740,16 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 修改系统优惠卷状态 systemGroup.PUT("/status/:coupon_id", api.Coupon.PutSystemCouponStatus) + + // 发放系统优惠卷 + systemGroup.POST("/grant/:coupon_id", api.Coupon.GrantSystemCoupon) } // 用户优惠卷管理 userGroup := couponGroup.Group("/user") { // 获取用户优惠卷列表-分页 - userGroup.POST("/page", api.Product.GetProductPage) - - // 系统用户优惠卷详情 - userGroup.GET("/:product_id", api.Product.GetProduct) - - // 新增用户优惠卷 - userGroup.POST("", api.Product.AddProduct) - - // 修改用户优惠卷 - userGroup.PUT("/:product_id", api.Product.PutProduct) - - // 修改用户优惠卷状态 - userGroup.PUT("/status/:product_id", api.Product.PutProductStatus) + userGroup.POST("/page", api.Coupon.GetUserCouponPage) } } } diff --git a/api/service/coupon.go b/api/service/coupon.go index b8367cb..f6d0521 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -1,12 +1,14 @@ package service import ( + "encoding/json" "errors" "fmt" "hospital-admin-api/api/dao" "hospital-admin-api/api/dto" "hospital-admin-api/api/model" "hospital-admin-api/api/requests" + "hospital-admin-api/extend/rabbitMq" "hospital-admin-api/global" "hospital-admin-api/utils" "strconv" @@ -475,3 +477,235 @@ func (r *CouponService) PutSystemCouponStatus(couponId int64, req requests.PutSy tx.Commit() return true, nil } + +// GrantSystemCoupon 发放系统优惠卷 +func (r *CouponService) GrantSystemCoupon(couponId, adminUserId int64, req requests.GrantSystemCoupon) (bool, error) { + if req.Type == 2 { + return false, errors.New("暂时只支持具体用户发放") + } + + couponDao := dao.CouponDao{} + coupon, err := couponDao.GetCouponById(couponId) + if err != nil { + return false, err + } + + if coupon.CouponStatus != 1 { + return false, errors.New("优惠卷非正常状态,不支持发放") + } + + // 检测订单过期时间 + now := time.Now() + validEndTime := time.Time(*coupon.ValidEndTime) + if now.After(validEndTime) { + return false, errors.New("优惠卷已过期,不支持发放") + } + + // 检测优惠卷剩余数量 + remainingQuantity := coupon.CouponCount - coupon.CouponTakeCount + if remainingQuantity <= 0 { + return false, errors.New("优惠卷数量不足,无法发放") + } + + // 检测优惠卷可发放数量 + if req.TotalQuantity >= remainingQuantity { + return false, errors.New("优惠卷数量不足,无法发放") + } + + // 检测优惠卷过期时间 + now = now.Add(time.Minute * 10) + if coupon.ValidType == 1 { + // 1:绝对时效 + validStartTime := time.Time(*coupon.ValidStartTime) + if now.Before(validStartTime) { + return false, errors.New("优惠卷还未启用") + } + + validEndTime := time.Time(*coupon.ValidEndTime) + if now.After(validEndTime) { + return false, errors.New("优惠卷即将过期,不支持发放") + } + } + + // 获取优惠卷发放记录表 + couponGrantDao := dao.CouponGrantDao{} + + maps := make(map[string]interface{}) + maps["coupon_id"] = coupon.CouponId + maps["grant_result"] = 2 + couponGrants, _ := couponGrantDao.GetCouponGrantList(maps) + if len(couponGrants) > 0 { + return false, errors.New("请等待上次发放结束后再执行此操作") + } + + // 将 id 转换为 int64 类型 + userId, err := strconv.ParseInt(req.UserId, 10, 64) + if err != nil { + return false, errors.New("发放失败") + } + + userDao := dao.UserDao{} + user, _ := userDao.GetUserById(userId) + if user == nil { + return false, errors.New("用户错误") + } + + // 获取患者数据 + userPatientDao := dao.UserPatientDao{} + userPatient, _ := userPatientDao.GetUserPatientByUserId(userId) + if userPatient == nil { + return false, errors.New("用户错误") + } + + // 检测用户是否已领取该优惠卷 + userCouponDao := dao.UserCouponDao{} + + maps = make(map[string]interface{}) + maps["user_id"] = user.UserId + maps["coupon_id"] = coupon.CouponId + maps["user_coupon_status"] = 0 + userCoupons, _ := userCouponDao.GetUserCouponList(maps) + if len(userCoupons) >= req.SingleQuantity { + return false, errors.New("用户已有该优惠卷") + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + for i := 0; i < req.SingleQuantity; i++ { + // 添加用户优惠卷表 + UserCouponModel := &model.UserCoupon{ + UserId: user.UserId, + PatientId: userPatient.PatientId, + CouponId: couponId, + CouponUseDate: nil, + } + + // 有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效) + if coupon.ValidType == 1 { + UserCouponModel.ValidStartTime = time.Time(*coupon.ValidStartTime) + UserCouponModel.ValidEndTime = time.Time(*coupon.ValidEndTime) + } + + if coupon.ValidType == 2 { + UserCouponModel.ValidStartTime = now + UserCouponModel.ValidEndTime = now.AddDate(0, 0, coupon.ValidDays) + } + + userCoupon, _ := userCouponDao.AddUserCoupon(tx, UserCouponModel) + if userCoupon == nil { + tx.Rollback() + return false, errors.New("发放失败") + } + + // 增加优惠卷发放数量 + err = couponDao.Inc(tx, couponId, "coupon_take_count", 1) + if err != nil { + tx.Rollback() + return false, errors.New("发放失败") + } + + // 添加弹窗表 + if coupon.IsPopup == 1 { + popupModel := &model.Popup{ + UserId: user.UserId, + AppType: 1, + ClientType: 1, + PopupType: 2, + PopupTitle: "红包福利", + PopupContent: "", + } + + popupContent := make(map[string]interface{}) + popupContent["user_coupon_id"] = fmt.Sprintf("%d", userCoupon.UserCouponId) + popupContent["coupon_price"] = coupon.CouponPrice + popupContent["application_scope"] = coupon.ApplicationScope + popupContent["inquiry_type"] = coupon.InquiryType + popupContent["valid_type"] = coupon.ValidType + popupContent["valid_days"] = coupon.ValidDays + popupContent["valid_start_time"] = coupon.ValidStartTime + popupContent["valid_end_time"] = coupon.ValidEndTime + + popupContentData, err := json.Marshal(popupContent) + if err != nil { + tx.Rollback() + return false, errors.New("发放失败") + } + + popupModel.PopupContent = string(popupContentData) + + popupDao := dao.PopupDao{} + popup, _ := popupDao.AddPopup(tx, popupModel) + if popup == nil { + tx.Rollback() + return false, errors.New("发放失败") + } + } + + // 增加优惠卷过期队列 + // 计算当天的结束时间 + year, month, day := now.Date() + location := now.Location() + endOfDay := time.Date(year, month, day, 23, 59, 59, 0, location) + if userCoupon.ValidEndTime.Before(endOfDay) { + // 需添加队列 + // 建立队列连接 + rabbitMQ, err := rabbitMq.NewRabbitMQClient() + if err != nil { + tx.Rollback() + return false, errors.New("发放失败") + } + + defer rabbitMQ.Close() + + data := make(map[string]interface{}) + data["user_coupon_id"] = fmt.Sprintf("%d", userCoupon.UserCouponId) + + delay := userCoupon.ValidEndTime.Sub(time.Now()) + + if delay < 10 { + delay = 10 * time.Second + } + + err = rabbitMQ.PublishWithDelay("user.coupon.expired.delay.queue", "amqp.delay.direct", "UserCouponExpired", data, delay) + if err != nil { + tx.Rollback() + return false, err + } + + go func() { + // 发送通知 + res, _ := PatientDistributeCoupon(coupon.CouponName, user.UserId) + if !res { + utils.LogJsonErr("CouponService-GrantSystemCoupon", "优惠卷通知发送失败") + } + }() + } + } + + // 添加优惠卷发放记录表 + couponGrantModel := &model.CouponGrant{ + CouponId: coupon.CouponId, + GrantType: req.Type, + UserId: userId, + TotalQuantity: req.TotalQuantity, + GrantQuantity: req.SingleQuantity, + GrantResult: 1, + StopReason: "", + AdminUserId: adminUserId, + } + + _, err = couponGrantDao.AddCouponGrant(tx, couponGrantModel) + if err != nil { + tx.Rollback() + return false, err + } + + tx.Commit() + return true, nil +} diff --git a/api/service/messagePush.go b/api/service/messagePush.go new file mode 100644 index 0000000..3d5b6f0 --- /dev/null +++ b/api/service/messagePush.go @@ -0,0 +1,36 @@ +package service + +import ( + "errors" + "fmt" + "hospital-admin-api/extend/rabbitMq" +) + +// PatientDistributeCoupon 患者-优惠劵发放-站内 +func PatientDistributeCoupon(couponName string, userId int64) (bool, error) { + // 建立队列连接 + rabbitMQ, err := rabbitMq.NewRabbitMQClient() + if err != nil { + return false, errors.New("内部错误") + } + + defer rabbitMQ.Close() + + data := make(map[string]interface{}) + data["user_id"] = fmt.Sprintf("%d", userId) + data["notice_type"] = 3 + data["notice_system_type"] = 2 + data["from_name"] = "肝胆小秘书" + data["notice_brief_title"] = "有新的优惠券已下发至您的账户,点击查看详情。" + data["notice_title"] = fmt.Sprintf("【%s】已到账", couponName) + data["notice_content"] = "有新的优惠劵已下发至您的账户中,点击查看详情!" + data["link_type"] = 7 + + err = rabbitMQ.Publish("send.station.message.queue", "amqp.direct", "SendStationMessage", data) + if err != nil { + return false, err + } + + return true, nil + +} From 61ca263d0d74ad7836800f5b7d6ac89f1a4b4303 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 31 May 2024 17:42:34 +0800 Subject: [PATCH 21/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=20=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E4=BC=98=E6=83=A0=E5=8D=B7=E8=AF=A6=E6=83=85=20?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=8F=91=E6=94=BE=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dto/CouponGrant.go | 67 +++++++++++++++++ api/dto/coupon.go | 71 +++++++++++-------- api/model/coupon.go | 1 + .../{couponGrantRecord.go => couponGrant.go} | 0 api/service/coupon.go | 7 +- 5 files changed, 115 insertions(+), 31 deletions(-) create mode 100644 api/dto/CouponGrant.go rename api/model/{couponGrantRecord.go => couponGrant.go} (100%) diff --git a/api/dto/CouponGrant.go b/api/dto/CouponGrant.go new file mode 100644 index 0000000..5593855 --- /dev/null +++ b/api/dto/CouponGrant.go @@ -0,0 +1,67 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +// CouponGrantDto 发放优惠券表 +type CouponGrantDto struct { + GrantId string `json:"grant_id"` // 主键id + CouponId string `json:"coupon_id"` // 优惠卷id + GrantType int `json:"grant_type"` // 发放类型(1:具体用户 2:未拥有用户) + UserId string `json:"user_id"` // 用户id(发放类型为具体用户时存在) + TotalQuantity int `json:"total_quantity"` // 目标发放数量 + GrantQuantity int `json:"grant_quantity"` // 已发放数量 + GrantResult int `json:"grant_result"` // 发放结果(1:成功 2:发放中 3:部分 4:失败) + StopReason string `json:"stop_reason"` // 停止原因 + AdminUserId string `json:"admin_user_id"` // 后台操作用户id + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 +} + +// GetCouponGrantDto 优惠卷详情 +func GetCouponGrantDto(m *model.CouponGrant) *CouponGrantDto { + return &CouponGrantDto{ + GrantId: fmt.Sprintf("%d", m.GrantId), + CouponId: fmt.Sprintf("%d", m.CouponId), + GrantType: m.GrantType, + UserId: fmt.Sprintf("%d", m.UserId), + TotalQuantity: m.TotalQuantity, + GrantQuantity: m.GrantQuantity, + GrantResult: m.GrantResult, + StopReason: m.StopReason, + AdminUserId: fmt.Sprintf("%d", m.AdminUserId), + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +// GetCouponGrantListDto 优惠卷列表 +func GetCouponGrantListDto(m []*model.CouponGrant) []*CouponGrantDto { + // 处理返回值 + responses := make([]*CouponGrantDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &CouponGrantDto{ + GrantId: fmt.Sprintf("%d", v.GrantId), + CouponId: fmt.Sprintf("%d", v.CouponId), + GrantType: v.GrantType, + UserId: fmt.Sprintf("%d", v.UserId), + TotalQuantity: v.TotalQuantity, + GrantQuantity: v.GrantQuantity, + GrantResult: v.GrantResult, + StopReason: v.StopReason, + AdminUserId: fmt.Sprintf("%d", v.AdminUserId), + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} diff --git a/api/dto/coupon.go b/api/dto/coupon.go index 1ddac2f..c775d4e 100644 --- a/api/dto/coupon.go +++ b/api/dto/coupon.go @@ -8,36 +8,37 @@ import ( // CouponDto 优惠卷表 type CouponDto struct { - CouponId string `json:"coupon_id"` // 主键id - CouponName string `json:"coupon_name"` // 优惠卷名称 - CouponIcon string `json:"coupon_icon"` // 优惠卷图片 - CouponClient int `json:"coupon_client"` // 使用平台(1:小程序) - CouponType int `json:"coupon_type"` // 优惠卷类型(1:无门槛 2:满减 3:数量) - CouponStatus int `json:"coupon_status"` // 状态(1:正常 2:强制失效 3:结束 4:删除) - DistributionObject int `json:"distribution_object"` // 发放对象(1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户) - ApplicationScope int `json:"application_scope"` // 适用范围(1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品) - InquiryType string `json:"inquiry_type"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) - BrandId string `json:"brand_id"` // 关联品牌id(如不限制品牌,此项为空) - IsMutex int `json:"is_mutex"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 - IsDisplay int `json:"is_display"` // 是否展示(0:否 1:是) - DistributionWithDay int `json:"distribution_with_day"` // 发放关联天数(发放对象为近期消费等类型时规定天数) - MinUsableNumber int `json:"min_usable_number"` // 单商品最小可使用数量(默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) - CouponCount int `json:"coupon_count"` // 发放数量 - CouponTakeCount int `json:"coupon_take_count"` // 已领取数量 - CouponUsedCount int `json:"coupon_used_count"` // 已使用数量 - CouponPrice float64 `json:"coupon_price"` // 优惠卷金额 - WithAmount float64 `json:"with_amount"` // 符合满减标准金额(优惠卷类型为满减时使用) - ValidType int `json:"valid_type"` // 有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效) - ValidDays int `json:"valid_days"` // 自领取之日起有效天数 - ValidStartTime *model.LocalTime `json:"valid_start_time"` // 开始使用时间 - ValidEndTime *model.LocalTime `json:"valid_end_time"` // 结束使用时间 - ProductId string `json:"product_id"` // 关联商品id,逗号分隔,指定商品时,填入此项。 - ReissueIntervalDays int `json:"reissue_interval_days"` // 确认收货后的再次发放间隔天数(如果设置为 0,则表示不再次发放。当适用范围为商品时生效) - IsReissuableAfterExpire int `json:"is_reissuable_after_expire"` // 过期之后是否允许再次发放(0:否 1:是) - IsPopup int `json:"is_popup"` // 是否首页弹窗(0:否 1:是) - CouponDesc string `json:"coupon_desc"` // 优惠卷描述 - CreatedAt model.LocalTime `json:"created_at"` // 创建时间 - UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 + CouponId string `json:"coupon_id"` // 主键id + CouponName string `json:"coupon_name"` // 优惠卷名称 + CouponIcon string `json:"coupon_icon"` // 优惠卷图片 + CouponClient int `json:"coupon_client"` // 使用平台(1:小程序) + CouponType int `json:"coupon_type"` // 优惠卷类型(1:无门槛 2:满减 3:数量) + CouponStatus int `json:"coupon_status"` // 状态(1:正常 2:强制失效 3:结束 4:删除) + DistributionObject int `json:"distribution_object"` // 发放对象(1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户) + ApplicationScope int `json:"application_scope"` // 适用范围(1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品) + InquiryType string `json:"inquiry_type"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) + BrandId string `json:"brand_id"` // 关联品牌id(如不限制品牌,此项为空) + IsMutex int `json:"is_mutex"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 + IsDisplay int `json:"is_display"` // 是否展示(0:否 1:是) + DistributionWithDay int `json:"distribution_with_day"` // 发放关联天数(发放对象为近期消费等类型时规定天数) + MinUsableNumber int `json:"min_usable_number"` // 单商品最小可使用数量(默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) + CouponCount int `json:"coupon_count"` // 发放数量 + CouponTakeCount int `json:"coupon_take_count"` // 已领取数量 + CouponUsedCount int `json:"coupon_used_count"` // 已使用数量 + CouponPrice float64 `json:"coupon_price"` // 优惠卷金额 + WithAmount float64 `json:"with_amount"` // 符合满减标准金额(优惠卷类型为满减时使用) + ValidType int `json:"valid_type"` // 有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效) + ValidDays int `json:"valid_days"` // 自领取之日起有效天数 + ValidStartTime *model.LocalTime `json:"valid_start_time"` // 开始使用时间 + ValidEndTime *model.LocalTime `json:"valid_end_time"` // 结束使用时间 + ProductId string `json:"product_id"` // 关联商品id,逗号分隔,指定商品时,填入此项。 + ReissueIntervalDays int `json:"reissue_interval_days"` // 确认收货后的再次发放间隔天数(如果设置为 0,则表示不再次发放。当适用范围为商品时生效) + IsReissuableAfterExpire int `json:"is_reissuable_after_expire"` // 过期之后是否允许再次发放(0:否 1:是) + IsPopup int `json:"is_popup"` // 是否首页弹窗(0:否 1:是) + CouponDesc string `json:"coupon_desc"` // 优惠卷描述 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 + CouponGrant []*CouponGrantDto `json:"coupon_grant"` // 发放记录 } // GetCouponDto 优惠卷详情 @@ -123,3 +124,13 @@ func GetCouponListDto(m []*model.Coupon) []*CouponDto { return responses } + +// LoadCouponGrant 加载发放优惠卷数据 +func (r *CouponDto) LoadCouponGrant(m []*model.CouponGrant) *CouponDto { + if len(m) > 0 { + d := GetCouponGrantListDto(m) + + r.CouponGrant = d + } + return r +} diff --git a/api/model/coupon.go b/api/model/coupon.go index 0f51d26..c183b89 100644 --- a/api/model/coupon.go +++ b/api/model/coupon.go @@ -37,6 +37,7 @@ type Coupon struct { IsPopup int `gorm:"column:is_popup;type:tinyint(1);default:0;comment:是否首页弹窗(0:否 1:是)" json:"is_popup"` CouponDesc string `gorm:"column:coupon_desc;type:text;comment:优惠卷描述" json:"coupon_desc"` Model + CouponGrant []*CouponGrant `gorm:"foreignKey:CouponId;references:coupon_id" json:"coupon_grant"` // 优惠卷发放记录 } func (m *Coupon) TableName() string { diff --git a/api/model/couponGrantRecord.go b/api/model/couponGrant.go similarity index 100% rename from api/model/couponGrantRecord.go rename to api/model/couponGrant.go diff --git a/api/service/coupon.go b/api/service/coupon.go index f6d0521..414a32a 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -22,7 +22,7 @@ type CouponService struct { // GetSystemCoupon 系统优惠卷详情 func (r *CouponService) GetSystemCoupon(couponId int64) (g *dto.CouponDto, err error) { couponDao := dao.CouponDao{} - coupon, err := couponDao.GetCouponById(couponId) + coupon, err := couponDao.GetCouponPreloadById(couponId) if err != nil || coupon == nil { return nil, errors.New(err.Error()) } @@ -30,6 +30,11 @@ func (r *CouponService) GetSystemCoupon(couponId int64) (g *dto.CouponDto, err e // 处理返回值 g = dto.GetCouponDto(coupon) + // 加载发放优惠卷数据 + if len(coupon.CouponGrant) > 0 { + g = g.LoadCouponGrant(coupon.CouponGrant) + } + return g, nil } From adb89dd9a110ef611d652073e173c3bb55876b59 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 3 Jun 2024 08:32:58 +0800 Subject: [PATCH 22/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E5=85=A5?= =?UTF-8?q?=E5=8F=82=E4=BB=A3=E7=A0=81=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/inquiryConfig.go | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/api/controller/inquiryConfig.go b/api/controller/inquiryConfig.go index aaecb05..eb0820a 100644 --- a/api/controller/inquiryConfig.go +++ b/api/controller/inquiryConfig.go @@ -17,28 +17,29 @@ type InquiryConfig struct{} // GetDoctorInquiryConfigPage 获取开启问诊配置医生列表-分页 func (r *InquiryConfig) GetDoctorInquiryConfigPage(c *gin.Context) { - req := requests.InquiryConfigRequest{} - if err := c.ShouldBind(&req.GetDoctorInquiryConfigPage); err != nil { + inquiryConfigRequest := requests.InquiryConfigRequest{} + req := inquiryConfigRequest.GetDoctorInquiryConfigPage + if err := c.ShouldBind(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 - if err := global.Validate.Struct(req.GetDoctorInquiryConfigPage); err != nil { + if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } - if req.GetDoctorInquiryConfigPage.Page == 0 { - req.GetDoctorInquiryConfigPage.Page = 1 + if req.Page == 0 { + req.Page = 1 } - if req.GetDoctorInquiryConfigPage.PageSize == 0 { - req.GetDoctorInquiryConfigPage.PageSize = 20 + if req.PageSize == 0 { + req.PageSize = 20 } doctorInquiryConfigDao := dao.DoctorInquiryConfigDao{} - doctorInquiryConfig, total, err := doctorInquiryConfigDao.GetUserDoctorPageSearch(req.GetDoctorInquiryConfigPage, req.GetDoctorInquiryConfigPage.Page, req.GetDoctorInquiryConfigPage.PageSize) + doctorInquiryConfig, total, err := doctorInquiryConfigDao.GetUserDoctorPageSearch(req, req.Page, req.PageSize) if err != nil { responses.FailWithMessage(err.Error(), c) @@ -49,8 +50,8 @@ func (r *InquiryConfig) GetDoctorInquiryConfigPage(c *gin.Context) { res := dto.GetDoctorInquiryConfigListDto(doctorInquiryConfig) result := make(map[string]interface{}) - result["page"] = req.GetDoctorInquiryConfigPage.Page - result["page_size"] = req.GetDoctorInquiryConfigPage.PageSize + result["page"] = req.Page + result["page_size"] = req.PageSize result["total"] = total result["data"] = res responses.OkWithData(result, c) From cbe044f1efc3743b70a5e265fb192741b2b5c17e Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 3 Jun 2024 09:56:26 +0800 Subject: [PATCH 23/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E6=95=B0=E6=8D=AE-=E8=8E=B7=E5=8F=96=E5=9C=B0?= =?UTF-8?q?=E5=8C=BA=E5=88=97=E8=A1=A8=E7=9A=84=E8=B7=AF=E7=94=B1=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E6=96=B0=E5=A2=9E=E5=9C=B0=E5=8C=BA?= =?UTF-8?q?=E3=80=81=E4=BF=AE=E6=94=B9=E5=9C=B0=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/area.go | 45 ---------------- api/controller/base.go | 7 ++- api/controller/basic.go | 116 ++++++++++++++++++++++++++++++++++++++++ api/requests/area.go | 13 ----- api/requests/basic.go | 25 +++++++++ api/router/router.go | 23 ++++++-- api/service/basic.go | 110 +++++++++++++++++++++++++++++++++++++ 7 files changed, 275 insertions(+), 64 deletions(-) delete mode 100644 api/controller/area.go delete mode 100644 api/requests/area.go diff --git a/api/controller/area.go b/api/controller/area.go deleted file mode 100644 index 78791c9..0000000 --- a/api/controller/area.go +++ /dev/null @@ -1,45 +0,0 @@ -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/global" - "hospital-admin-api/utils" -) - -type Area struct{} - -// GetAreaList 获取地区列表 -func (b *Area) GetAreaList(c *gin.Context) { - req := requests.AreaRequest{} - if err := c.ShouldBind(&req.GetAreaList); err != nil { - responses.FailWithMessage(err.Error(), c) - return - } - - // 参数验证 - if err := global.Validate.Struct(req.GetAreaList); err != nil { - responses.FailWithMessage(utils.Translate(err), c) - return - } - - // 处理参数 - if req.ParentId == "" && req.AreaId == "" && req.AreaName == "" { - req.ParentId = "1" - req.AreaType = 2 - } - - areaDao := dao.AreaDao{} - area, err := areaDao.GetAreaListByStruct(req.GetAreaList) - if err != nil { - responses.Ok(c) - return - } - - // 处理返回值 - r := dto.GetAreaListDto(area) - responses.OkWithData(r, c) -} diff --git a/api/controller/base.go b/api/controller/base.go index 4fd5c69..f3f3115 100644 --- a/api/controller/base.go +++ b/api/controller/base.go @@ -17,6 +17,7 @@ type Api struct { exportManage // 导出管理 productManage // 商品管理 couponManage // 优惠卷管理 + basicManage // 基础数据管理 } // SysSetting 系统设置 @@ -41,7 +42,6 @@ type basic struct { Hospital // 医院管理 DiseaseClassExpertise // 专长管理 Bank // 银行管理 - Area // 省市区管理 } // 订单管理 @@ -97,3 +97,8 @@ type productManage struct { type couponManage struct { Coupon } + +// 基础数据管理 +type basicManage struct { + Basic +} diff --git a/api/controller/basic.go b/api/controller/basic.go index b0b429f..c0b801f 100644 --- a/api/controller/basic.go +++ b/api/controller/basic.go @@ -1 +1,117 @@ 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 Basic struct { + Area // 省市区 +} + +// Area 省市区 +type Area struct{} + +// GetAreaList 获取地区列表 +func (b *Area) GetAreaList(c *gin.Context) { + basicRequest := requests.BasicRequest{} + req := basicRequest.GetAreaList + 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.ParentId == "" && req.AreaId == "" && req.AreaName == "" { + req.ParentId = "1" + req.AreaType = 2 + } + + areaDao := dao.AreaDao{} + area, err := areaDao.GetAreaListByStruct(req) + if err != nil { + responses.Ok(c) + return + } + + // 处理返回值 + r := dto.GetAreaListDto(area) + responses.OkWithData(r, c) +} + +// AddArea 新增地区 +func (r *Area) AddArea(c *gin.Context) { + basicRequest := requests.BasicRequest{} + req := basicRequest.AddArea + 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 + } + + // 业务处理 + basicService := service.BasicService{} + _, err := basicService.AddArea(req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} + +// PutArea 修改地区 +func (r *Area) PutArea(c *gin.Context) { + basicRequest := requests.BasicRequest{} + req := basicRequest.PutArea + 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 := c.Param("area_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + areaId, err := strconv.Atoi(id) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + basicService := service.BasicService{} + _, err = basicService.PutArea(areaId, req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + responses.Ok(c) +} diff --git a/api/requests/area.go b/api/requests/area.go deleted file mode 100644 index 2753dbd..0000000 --- a/api/requests/area.go +++ /dev/null @@ -1,13 +0,0 @@ -package requests - -type AreaRequest struct { - GetAreaList // 获取地区列表 -} - -// GetAreaList 获取地区列表 -type GetAreaList struct { - AreaId string `json:"area_id" form:"area_id" label:"地区编号"` - AreaName string `json:"area_name" form:"area_name" label:"名称"` - ParentId string `json:"parent_id" form:"parent_id" label:"上级编号"` - AreaType int `json:"area_type" form:"area_type" label:"类型(1:国家,2:省,3:市,4:区县)"` -} diff --git a/api/requests/basic.go b/api/requests/basic.go index 7ff089a..3fdf4d4 100644 --- a/api/requests/basic.go +++ b/api/requests/basic.go @@ -1,4 +1,29 @@ package requests type BasicRequest struct { + GetAreaList // 获取地区列表 + AddArea // 新增地区 + PutArea // 修改地区 +} + +// GetAreaList 获取地区列表 +type GetAreaList struct { + AreaId string `json:"area_id" form:"area_id" label:"地区编号"` + AreaName string `json:"area_name" form:"area_name" label:"名称"` + ParentId string `json:"parent_id" form:"parent_id" label:"上级编号"` + AreaType int `json:"area_type" form:"area_type" label:"类型(1:国家,2:省,3:市,4:区县)"` +} + +// AddArea 新增地区 +type AddArea struct { + AreaName string `json:"area_name" form:"area_name" label:"名称" validate:"required"` + ParentId string `json:"parent_id" form:"parent_id" label:"上级编号" validate:"required"` + AreaType *int `json:"area_type" form:"area_type" label:"类型(1:国家,2:省,3:市,4:区县)" validate:"required"` + Zip string `json:"zip" form:"zip" label:"邮编"` +} + +// PutArea 修改地区 +type PutArea struct { + AreaName string `json:"area_name" form:"area_name" label:"名称" validate:"required"` + Zip string `json:"zip" form:"zip" label:"邮编"` } diff --git a/api/router/router.go b/api/router/router.go index 705d39d..4eab98a 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -165,11 +165,7 @@ func basicRouter(r *gin.Engine, api controller.Api) { areaGroup := basicGroup.Group("/area") { // 获取地区列表 - areaGroup.GET("/list", api.Area.GetAreaList) - - // 获取地区列表-分页 - - // 地区详情 + areaGroup.GET("/list", api.Basic.Area.GetAreaList) // 修改地区 @@ -752,4 +748,21 @@ func privateRouter(r *gin.Engine, api controller.Api) { userGroup.POST("/page", api.Coupon.GetUserCouponPage) } } + + // 基础数据 + basicGroup := adminGroup.Group("/basic") + { + // 地区管理 + areaGroup := basicGroup.Group("/area") + { + // 获取地区列表 + areaGroup.GET("", api.Basic.Area.GetAreaList) + + // 新增地区 + areaGroup.POST("", api.Basic.Area.AddArea) + + // 修改地区 + areaGroup.PUT("/:area_id", api.Basic.Area.PutArea) + } + } } diff --git a/api/service/basic.go b/api/service/basic.go index 1cbbf3b..3168daf 100644 --- a/api/service/basic.go +++ b/api/service/basic.go @@ -1,3 +1,113 @@ package service +import ( + "errors" + "fmt" + "hospital-admin-api/api/dao" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" + "hospital-admin-api/global" + "strconv" +) + type BasicService struct{} + +// AddArea 新增地区 +func (r *BasicService) AddArea(req requests.AddArea) (bool, error) { + if *req.AreaType == 1 { + return false, errors.New("不可添加国家") + } + + // 检测上级是否存在 + maps := make(map[string]interface{}) + maps["parent_id"] = req.ParentId + if *req.AreaType == 4 { + maps["area_type"] = 3 + } + if *req.AreaType == 3 { + maps["area_type"] = 2 + } + + if *req.AreaType == 2 { + maps["area_type"] = 1 + } + + areaDao := dao.AreaDao{} + _, err := areaDao.GetAreaList(maps) + if err != nil { + return false, errors.New("上级地区错误") + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + fmt.Println(r) + } + }() + + parentId, err := strconv.ParseInt(req.ParentId, 10, 64) + if err != nil { + tx.Rollback() + return false, errors.New("新增失败") + } + + // 新增优惠卷表 + area := &model.Area{ + AreaName: req.AreaName, + ParentId: parentId, + Zip: req.Zip, + AreaType: *req.AreaType, + } + + area, err = areaDao.AddArea(tx, area) + if err != nil || area == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + tx.Commit() + return true, nil +} + +// PutArea 修改地区 +func (r *BasicService) PutArea(areaId int, req requests.PutArea) (bool, error) { + areaDao := dao.AreaDao{} + area, err := areaDao.GetAreaById(areaId) + if err != nil { + return false, err + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + fmt.Println(r) + } + }() + + areaData := make(map[string]interface{}) + + if req.AreaName != area.AreaName { + areaData["area_name"] = req.AreaName + } + + if req.Zip != "" { + if req.Zip != area.Zip { + areaData["zip"] = req.Zip + } + } + + if len(areaData) > 0 { + err = areaDao.EditAreaById(tx, areaId, areaData) + if err != nil || area == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + } + + tx.Commit() + return true, nil +} From 62473de7fcdf2cf2927cb04fb4f2b58008b4e33d Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 3 Jun 2024 10:38:50 +0800 Subject: [PATCH 24/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E9=BA=BB?= =?UTF-8?q?=E7=B2=BE=E8=8D=AF=E5=93=81=E5=88=97=E8=A1=A8=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BA=86=E7=B3=BB=E7=BB=9F=E5=95=86=E5=93=81=E7=9A=84?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dao/product.go | 5 +++++ api/model/product.go | 1 + api/requests/product.go | 2 ++ api/router/router.go | 19 +++++++++++++++++++ 4 files changed, 27 insertions(+) diff --git a/api/dao/product.go b/api/dao/product.go index b2af336..8fe4cfe 100644 --- a/api/dao/product.go +++ b/api/dao/product.go @@ -107,6 +107,11 @@ func (r *ProductDao) GetProductPageSearch(req requests.GetProductPage, page, pag query = query.Where("product_type = ?", req.ProductType) } + // 是否麻精药品 + if req.IsMajing != nil { + query = query.Where("is_majing = ?", req.IsMajing) + } + // 商品状态 if req.ProductStatus != nil { query = query.Where("product_status = ?", req.ProductStatus) diff --git a/api/model/product.go b/api/model/product.go index 649c6e6..458c1b9 100644 --- a/api/model/product.go +++ b/api/model/product.go @@ -18,6 +18,7 @@ type Product struct { 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"` + IsMajing int `gorm:"column:is_majing;type:tinyint(1);default:0;comment:是否麻精药品(0:否 1:是)" json:"is_majing"` 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"` diff --git a/api/requests/product.go b/api/requests/product.go index 197aa9b..ab4efb6 100644 --- a/api/requests/product.go +++ b/api/requests/product.go @@ -40,6 +40,7 @@ type GetProductPage struct { 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:西药) + IsMajing *int `json:"is_majing" form:"is_majing" label:"药品类型"` // 是否麻精药品(0:否 1:是) 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:"药店编码"` // 第三方药店商品编码 @@ -62,6 +63,7 @@ type AddProduct struct { 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:西药) + IsMajing *int `json:"is_majing" form:"is_majing" label:"是否麻精药品" validate:"oneof=0 1"` // 是否麻精药品(0:否 1:是) 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:"商品封面图"` // 商品封面图 diff --git a/api/router/router.go b/api/router/router.go index 4eab98a..90f2731 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -714,6 +714,25 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 获取平台商品列表 platformGroup.GET("/list", api.Product.GetPlatformProductList) } + + // 麻精药品 + majingGroup := productGroup.Group("/majing") + { + // 获取麻精药品列表-分页 + majingGroup.POST("/page", api.Product.GetProductPage) + + // 系统麻精药品详情 + majingGroup.GET("/:product_id", api.Product.GetProduct) + + // 新增麻精药品 + majingGroup.POST("", api.Product.AddProduct) + + // 修改麻精药品 + majingGroup.PUT("/:product_id", api.Product.PutProduct) + + // 修改麻精药品状态(上/下架) + majingGroup.PUT("/status/:product_id", api.Product.PutProductStatus) + } } // 优惠卷管理 From f6d6417acfa6a8d5b347c785e836ed951cccb491 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 3 Jun 2024 11:47:52 +0800 Subject: [PATCH 25/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E5=8C=BB?= =?UTF-8?q?=E9=99=A2=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/area.go | 112 +++++++++++++++++ api/controller/basic.go | 112 ----------------- api/controller/hospital.go | 146 +++++++++++++++++++++- api/dao/hospital.go | 57 +++++++-- api/requests/area.go | 29 +++++ api/requests/basic.go | 25 ---- api/requests/hospital.go | 53 +++++++- api/router/router.go | 42 +++---- api/service/InquiryConfig.go | 2 +- api/service/area.go | 113 +++++++++++++++++ api/service/basic.go | 110 ----------------- api/service/hospital.go | 233 +++++++++++++++++++++++++++++++++++ api/service/userDoctor.go | 6 +- 13 files changed, 752 insertions(+), 288 deletions(-) create mode 100644 api/controller/area.go create mode 100644 api/requests/area.go create mode 100644 api/service/area.go create mode 100644 api/service/hospital.go diff --git a/api/controller/area.go b/api/controller/area.go new file mode 100644 index 0000000..d61a027 --- /dev/null +++ b/api/controller/area.go @@ -0,0 +1,112 @@ +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 Area struct{} + +// GetAreaList 获取地区列表 +func (b *Area) GetAreaList(c *gin.Context) { + areaRequest := requests.AreaRequest{} + req := areaRequest.GetAreaList + 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.ParentId == "" && req.AreaId == "" && req.AreaName == "" { + req.ParentId = "1" + req.AreaType = 2 + } + + areaDao := dao.AreaDao{} + area, err := areaDao.GetAreaListByStruct(req) + if err != nil { + responses.Ok(c) + return + } + + // 处理返回值 + r := dto.GetAreaListDto(area) + responses.OkWithData(r, c) +} + +// AddArea 新增地区 +func (r *Area) AddArea(c *gin.Context) { + areaRequest := requests.AreaRequest{} + req := areaRequest.AddArea + 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 + } + + // 业务处理 + areaService := service.AreaService{} + _, err := areaService.AddArea(req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} + +// PutArea 修改地区 +func (r *Area) PutArea(c *gin.Context) { + areaRequest := requests.AreaRequest{} + req := areaRequest.PutArea + 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 := c.Param("area_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + areaId, err := strconv.Atoi(id) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + areaService := service.AreaService{} + _, err = areaService.PutArea(areaId, req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + responses.Ok(c) +} diff --git a/api/controller/basic.go b/api/controller/basic.go index c0b801f..9683a6b 100644 --- a/api/controller/basic.go +++ b/api/controller/basic.go @@ -1,117 +1,5 @@ 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 Basic struct { Area // 省市区 } - -// Area 省市区 -type Area struct{} - -// GetAreaList 获取地区列表 -func (b *Area) GetAreaList(c *gin.Context) { - basicRequest := requests.BasicRequest{} - req := basicRequest.GetAreaList - 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.ParentId == "" && req.AreaId == "" && req.AreaName == "" { - req.ParentId = "1" - req.AreaType = 2 - } - - areaDao := dao.AreaDao{} - area, err := areaDao.GetAreaListByStruct(req) - if err != nil { - responses.Ok(c) - return - } - - // 处理返回值 - r := dto.GetAreaListDto(area) - responses.OkWithData(r, c) -} - -// AddArea 新增地区 -func (r *Area) AddArea(c *gin.Context) { - basicRequest := requests.BasicRequest{} - req := basicRequest.AddArea - 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 - } - - // 业务处理 - basicService := service.BasicService{} - _, err := basicService.AddArea(req) - if err != nil { - responses.FailWithMessage(err.Error(), c) - return - } - - responses.Ok(c) -} - -// PutArea 修改地区 -func (r *Area) PutArea(c *gin.Context) { - basicRequest := requests.BasicRequest{} - req := basicRequest.PutArea - 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 := c.Param("area_id") - if id == "" { - responses.FailWithMessage("缺少参数", c) - return - } - - // 将 id 转换为 int64 类型 - areaId, err := strconv.Atoi(id) - if err != nil { - responses.Fail(c) - return - } - - // 业务处理 - basicService := service.BasicService{} - _, err = basicService.PutArea(areaId, req) - if err != nil { - responses.FailWithMessage(err.Error(), c) - return - } - responses.Ok(c) -} diff --git a/api/controller/hospital.go b/api/controller/hospital.go index b33077d..87768f4 100644 --- a/api/controller/hospital.go +++ b/api/controller/hospital.go @@ -7,28 +7,31 @@ import ( "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 Hospital struct{} -// GetHospitalLimit 获取医院列表-限制条数 -func (b *Hospital) GetHospitalLimit(c *gin.Context) { +// GetHospitalList 获取医院列表 +func (b *Hospital) GetHospitalList(c *gin.Context) { hospitalRequest := requests.HospitalRequest{} - if err := c.ShouldBind(&hospitalRequest.GetHospitalLimit); err != nil { + req := hospitalRequest.GetHospitalList + if err := c.ShouldBind(&req); err != nil { responses.FailWithMessage(err.Error(), c) return } // 参数验证 - if err := global.Validate.Struct(hospitalRequest.GetHospitalLimit); err != nil { + if err := global.Validate.Struct(req); err != nil { responses.FailWithMessage(utils.Translate(err), c) return } - hospitalDao := dao.Hospital{} - hospitals, err := hospitalDao.GetHospitalLimitByMaps(hospitalRequest.GetHospitalLimit) + hospitalDao := dao.HospitalDao{} + hospitals, err := hospitalDao.GetHospitalLimitByMaps(req) if err != nil { responses.Ok(c) return @@ -38,3 +41,134 @@ func (b *Hospital) GetHospitalLimit(c *gin.Context) { getHospitalLimitResponse := dto.GetHospitalListDto(hospitals) responses.OkWithData(getHospitalLimitResponse, c) } + +// GetHospitalPage 获取医院列表-分页 +func (r *Hospital) GetHospitalPage(c *gin.Context) { + hospitalRequest := requests.HospitalRequest{} + req := hospitalRequest.GetHospitalPage + 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 + } + + hospitalDao := dao.HospitalDao{} + hospital, total, err := hospitalDao.GetHospitalPageSearch(req, req.Page, req.PageSize) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + GetHospitalPageResponses := dto.GetHospitalListDto(hospital) + + result := make(map[string]interface{}) + result["page"] = req.Page + result["page_size"] = req.PageSize + result["total"] = total + result["data"] = GetHospitalPageResponses + responses.OkWithData(result, c) +} + +// AddHospital 新增医院 +func (r *Hospital) AddHospital(c *gin.Context) { + hospitalRequest := requests.HospitalRequest{} + req := hospitalRequest.AddHospital + 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 + } + + // 业务处理 + hospitalService := service.HospitalService{} + _, err := hospitalService.AddHospital(req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} + +// PutHospital 修改医院 +func (r *Hospital) PutHospital(c *gin.Context) { + hospitalRequest := requests.HospitalRequest{} + req := hospitalRequest.PutHospital + 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 := c.Param("hospital_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + hospitalId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + hospitalService := service.HospitalService{} + _, err = hospitalService.PutHospital(hospitalId, req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + responses.Ok(c) +} + +// GetHospital 医院详情 +func (r *Hospital) GetHospital(c *gin.Context) { + id := c.Param("hospital_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + hospitalId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + hospitalService := service.HospitalService{} + getHospitalResponses, err := hospitalService.GetHospital(hospitalId) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(getHospitalResponses, c) +} diff --git a/api/dao/hospital.go b/api/dao/hospital.go index d10eb12..bfac701 100644 --- a/api/dao/hospital.go +++ b/api/dao/hospital.go @@ -7,11 +7,11 @@ import ( "hospital-admin-api/global" ) -type Hospital struct { +type HospitalDao struct { } // GetHospitalById 获取医院数据-医院id -func (r *Hospital) GetHospitalById(hospitalId int64) (m *model.Hospital, err error) { +func (r *HospitalDao) GetHospitalById(hospitalId int64) (m *model.Hospital, err error) { err = global.Db.First(&m, hospitalId).Error if err != nil { return nil, err @@ -20,7 +20,7 @@ func (r *Hospital) GetHospitalById(hospitalId int64) (m *model.Hospital, err err } // AddHospital 新增医院 -func (r *Hospital) AddHospital(tx *gorm.DB, model *model.Hospital) (*model.Hospital, error) { +func (r *HospitalDao) AddHospital(tx *gorm.DB, model *model.Hospital) (*model.Hospital, error) { if err := tx.Create(model).Error; err != nil { return nil, err } @@ -28,7 +28,7 @@ func (r *Hospital) AddHospital(tx *gorm.DB, model *model.Hospital) (*model.Hospi } // GetHospitalList 获取医院列表 -func (r *Hospital) GetHospitalList(maps interface{}) (m []*model.Hospital, err error) { +func (r *HospitalDao) GetHospitalList(maps interface{}) (m []*model.Hospital, err error) { err = global.Db.Where(maps).Find(&m).Error if err != nil { return nil, err @@ -37,7 +37,7 @@ func (r *Hospital) GetHospitalList(maps interface{}) (m []*model.Hospital, err e } // DeleteHospitalById 删除医院-医院id -func (r *Hospital) DeleteHospitalById(tx *gorm.DB, hospitalId int64) error { +func (r *HospitalDao) DeleteHospitalById(tx *gorm.DB, hospitalId int64) error { if err := tx.Delete(&model.Hospital{}, hospitalId).Error; err != nil { return err } @@ -45,7 +45,7 @@ func (r *Hospital) DeleteHospitalById(tx *gorm.DB, hospitalId int64) error { } // EditHospitalById 修改医院-医院id -func (r *Hospital) EditHospitalById(tx *gorm.DB, hospitalId int64, data interface{}) error { +func (r *HospitalDao) EditHospitalById(tx *gorm.DB, hospitalId int64, data interface{}) error { err := tx.Model(&model.Hospital{}).Where("hospital_id = ?", hospitalId).Updates(data).Error if err != nil { return err @@ -54,7 +54,7 @@ func (r *Hospital) EditHospitalById(tx *gorm.DB, hospitalId int64, data interfac } // GetHospitalLimitByMaps 获取医院列表-限制条数 -func (r *Hospital) GetHospitalLimitByMaps(hospitalRequest requests.GetHospitalLimit) (m []*model.Hospital, err error) { +func (r *HospitalDao) GetHospitalLimitByMaps(hospitalRequest requests.GetHospitalList) (m []*model.Hospital, err error) { result := global.Db if hospitalRequest.HospitalName != "" { result = result.Where("hospital_name like ?", "%"+hospitalRequest.HospitalName+"%") @@ -94,3 +94,46 @@ func (r *Hospital) GetHospitalLimitByMaps(hospitalRequest requests.GetHospitalLi } return m, nil } + +// GetHospitalPageSearch 获取医院列表-分页 +func (r *HospitalDao) GetHospitalPageSearch(req requests.GetHospitalPage, page, pageSize int) (m []*model.Hospital, total int64, err error) { + var totalRecords int64 + + // 构建查询条件 + query := global.Db.Model(&model.Hospital{}) + + if req.HospitalName != "" { + query = query.Where("hospital_name like ?", "%"+req.HospitalName+"%") + } + + if req.HospitalLevelName != "" { + query = query.Where("hospital_level_name like ?", "%"+req.HospitalLevelName+"%") + } + + if req.ProvinceId != 0 { + query = query.Where("province_id = ?", req.ProvinceId) + } + + if req.CityId != 0 { + query = query.Where("city_id = ?", req.CityId) + } + + if req.CountyId != 0 { + query = query.Where("county_id = ?", req.CountyId) + } + + // 排序 + 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/requests/area.go b/api/requests/area.go new file mode 100644 index 0000000..3502fc8 --- /dev/null +++ b/api/requests/area.go @@ -0,0 +1,29 @@ +package requests + +type AreaRequest struct { + GetAreaList // 获取地区列表 + AddArea // 新增地区 + PutArea // 修改地区 +} + +// GetAreaList 获取地区列表 +type GetAreaList struct { + AreaId string `json:"area_id" form:"area_id" label:"地区编号"` + AreaName string `json:"area_name" form:"area_name" label:"名称"` + ParentId string `json:"parent_id" form:"parent_id" label:"上级编号"` + AreaType int `json:"area_type" form:"area_type" label:"类型(1:国家,2:省,3:市,4:区县)"` +} + +// AddArea 新增地区 +type AddArea struct { + AreaName string `json:"area_name" form:"area_name" label:"名称" validate:"required"` + ParentId string `json:"parent_id" form:"parent_id" label:"上级编号" validate:"required"` + AreaType *int `json:"area_type" form:"area_type" label:"类型(1:国家,2:省,3:市,4:区县)" validate:"required"` + Zip string `json:"zip" form:"zip" label:"邮编"` +} + +// PutArea 修改地区 +type PutArea struct { + AreaName string `json:"area_name" form:"area_name" label:"名称" validate:"required"` + Zip string `json:"zip" form:"zip" label:"邮编"` +} diff --git a/api/requests/basic.go b/api/requests/basic.go index 3fdf4d4..7ff089a 100644 --- a/api/requests/basic.go +++ b/api/requests/basic.go @@ -1,29 +1,4 @@ package requests type BasicRequest struct { - GetAreaList // 获取地区列表 - AddArea // 新增地区 - PutArea // 修改地区 -} - -// GetAreaList 获取地区列表 -type GetAreaList struct { - AreaId string `json:"area_id" form:"area_id" label:"地区编号"` - AreaName string `json:"area_name" form:"area_name" label:"名称"` - ParentId string `json:"parent_id" form:"parent_id" label:"上级编号"` - AreaType int `json:"area_type" form:"area_type" label:"类型(1:国家,2:省,3:市,4:区县)"` -} - -// AddArea 新增地区 -type AddArea struct { - AreaName string `json:"area_name" form:"area_name" label:"名称" validate:"required"` - ParentId string `json:"parent_id" form:"parent_id" label:"上级编号" validate:"required"` - AreaType *int `json:"area_type" form:"area_type" label:"类型(1:国家,2:省,3:市,4:区县)" validate:"required"` - Zip string `json:"zip" form:"zip" label:"邮编"` -} - -// PutArea 修改地区 -type PutArea struct { - AreaName string `json:"area_name" form:"area_name" label:"名称" validate:"required"` - Zip string `json:"zip" form:"zip" label:"邮编"` } diff --git a/api/requests/hospital.go b/api/requests/hospital.go index cb4d9ff..6fa3615 100644 --- a/api/requests/hospital.go +++ b/api/requests/hospital.go @@ -1,13 +1,17 @@ package requests type HospitalRequest struct { - GetHospitalLimit // 获取医院列表-限制条数 + GetHospitalList // 获取医院列表 + GetHospitalPage // 获取医院列表-分页 + AddHospital // 新增医院 + PutHospital // 修改医院 } -// GetHospitalLimit 获取医院列表-限制条数 -type GetHospitalLimit struct { +// GetHospitalList 获取医院列表 +type GetHospitalList struct { HospitalName string `json:"hospital_name" form:"hospital_name" label:"医院名称"` HospitalLevelName string `json:"hospital_level_name" form:"hospital_level_name" label:"医院等级名称"` + HospitalStatus int `json:"hospital_status" form:"hospital_status" label:"状态"` // 状态(0:禁用 1:正常 2:删除) ProvinceId int `json:"province_id" form:"province_id" label:"省份id"` Province string `json:"province" form:"province" label:"省份"` CityId int `json:"city_id" form:"city_id" label:"城市id"` @@ -15,3 +19,46 @@ type GetHospitalLimit struct { CountyId int `json:"county_id" form:"county_id" label:"区县id"` County string `json:"county" form:"county" label:"区县"` } + +// GetHospitalPage 获取医院列表-分页 +type GetHospitalPage struct { + Page int `json:"page" form:"page" label:"页码"` + PageSize int `json:"page_size" form:"page_size" label:"每页个数"` + HospitalName string `json:"hospital_name" form:"hospital_name" label:"医院名称"` + HospitalLevelName string `json:"hospital_level_name" form:"hospital_level_name" label:"医院等级名称"` + ProvinceId int `json:"province_id" form:"province_id" label:"省份id"` + CityId int `json:"city_id" form:"city_id" label:"城市id"` + CountyId int `json:"county_id" form:"county_id" label:"区县id"` +} + +// AddHospital 新增医院 +type AddHospital struct { + HospitalName string `json:"hospital_name" form:"hospital_name" label:"医院名称" validate:"required"` // 医院名称 + HospitalStatus *int `json:"hospital_status" form:"hospital_status" label:"状态" validate:"required,oneof=0 1 2"` // 状态(0:禁用 1:正常 2:删除) + HospitalLevelName string `json:"hospital_level_name" form:"hospital_level_name" label:"医院等级名称" validate:"required"` // 医院等级名称 + PostCode string `json:"post_code" form:"post_code" label:"邮政编码"` // 邮政编码 + TelePhone string `json:"tele_phone" form:"tele_phone" label:"电话"` // 电话 + ProvinceId int `json:"province_id" form:"province_id" label:"省份id" validate:"required"` // 省份id + CityId int `json:"city_id" form:"city_id" label:"城市id" validate:"required"` // 城市id + CountyId int `json:"county_id" form:"county_id" label:"区县id" validate:"required"` // 区县id + Address string `json:"address" form:"address" label:"地址" validate:"required"` // 地址 + Lat string `json:"lat" form:"lat" label:"纬度"` // 纬度 + Lng string `json:"lng" form:"lng" label:"经度"` // 经度 + Desc string `json:"desc" form:"desc" label:"简介"` // 简介 +} + +// PutHospital 修改医院 +type PutHospital struct { + HospitalName string `json:"hospital_name" form:"hospital_name" label:"医院名称" validate:"required"` // 医院名称 + HospitalStatus *int `json:"hospital_status" form:"hospital_status" label:"状态" validate:"required,oneof=0 1 2"` // 状态(0:禁用 1:正常 2:删除) + HospitalLevelName string `json:"hospital_level_name" form:"hospital_level_name" label:"医院等级名称" validate:"required"` // 医院等级名称 + PostCode string `json:"post_code" form:"post_code" label:"邮政编码"` // 邮政编码 + TelePhone string `json:"tele_phone" form:"tele_phone" label:"电话"` // 电话 + ProvinceId int `json:"province_id" form:"province_id" label:"省份id" validate:"required"` // 省份id + CityId int `json:"city_id" form:"city_id" label:"城市id" validate:"required"` // 城市id + CountyId int `json:"county_id" form:"county_id" label:"区县id" validate:"required"` // 区县id + Address string `json:"address" form:"address" label:"地址" validate:"required"` // 地址 + Lat string `json:"lat" form:"lat" label:"纬度"` // 纬度 + Lng string `json:"lng" form:"lng" label:"经度"` // 经度 + Desc string `json:"desc" form:"desc" label:"简介"` // 简介 +} diff --git a/api/router/router.go b/api/router/router.go index 90f2731..e677e7c 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -128,7 +128,7 @@ func basicRouter(r *gin.Engine, api controller.Api) { hospitalGroup := basicGroup.Group("/hospital") { // 获取医院列表-限制条数 - hospitalGroup.GET("/list", api.Hospital.GetHospitalLimit) + hospitalGroup.GET("/list", api.Hospital.GetHospitalList) } // 专长管理-基础数据 @@ -714,25 +714,6 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 获取平台商品列表 platformGroup.GET("/list", api.Product.GetPlatformProductList) } - - // 麻精药品 - majingGroup := productGroup.Group("/majing") - { - // 获取麻精药品列表-分页 - majingGroup.POST("/page", api.Product.GetProductPage) - - // 系统麻精药品详情 - majingGroup.GET("/:product_id", api.Product.GetProduct) - - // 新增麻精药品 - majingGroup.POST("", api.Product.AddProduct) - - // 修改麻精药品 - majingGroup.PUT("/:product_id", api.Product.PutProduct) - - // 修改麻精药品状态(上/下架) - majingGroup.PUT("/status/:product_id", api.Product.PutProductStatus) - } } // 优惠卷管理 @@ -775,7 +756,7 @@ func privateRouter(r *gin.Engine, api controller.Api) { areaGroup := basicGroup.Group("/area") { // 获取地区列表 - areaGroup.GET("", api.Basic.Area.GetAreaList) + areaGroup.GET("", api.Area.GetAreaList) // 新增地区 areaGroup.POST("", api.Basic.Area.AddArea) @@ -783,5 +764,24 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 修改地区 areaGroup.PUT("/:area_id", api.Basic.Area.PutArea) } + + // 医院管理 + hospitalGroup := basicGroup.Group("/hospital") + { + // 获取医院列表-限制条数 + hospitalGroup.GET("", api.Hospital.GetHospitalList) + + // 获取医院列表-分页 + hospitalGroup.POST("/page", api.Hospital.GetHospitalPage) + + // 获取医院详情 + hospitalGroup.GET("/:hospital_id", api.Hospital.GetHospital) + + // 新增医院 + hospitalGroup.POST("", api.Hospital.AddHospital) + + // 修改医院 + hospitalGroup.PUT("/:hospital_id", api.Hospital.PutHospital) + } } } diff --git a/api/service/InquiryConfig.go b/api/service/InquiryConfig.go index 27aa7e0..dc38526 100644 --- a/api/service/InquiryConfig.go +++ b/api/service/InquiryConfig.go @@ -126,7 +126,7 @@ func (r *DoctorInquiryConfigService) GetDoctorInquiryConfig(inquiryConfigId int6 } // 获取医生医院数据 - hospitalDao := dao.Hospital{} + hospitalDao := dao.HospitalDao{} hospital, err := hospitalDao.GetHospitalById(userDoctor.HospitalID) // 获取系统问诊配置 diff --git a/api/service/area.go b/api/service/area.go new file mode 100644 index 0000000..15f24fa --- /dev/null +++ b/api/service/area.go @@ -0,0 +1,113 @@ +package service + +import ( + "errors" + "fmt" + "hospital-admin-api/api/dao" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" + "hospital-admin-api/global" + "strconv" +) + +type AreaService struct{} + +// AddArea 新增地区 +func (r *AreaService) AddArea(req requests.AddArea) (bool, error) { + if *req.AreaType == 1 { + return false, errors.New("不可添加国家") + } + + // 检测上级是否存在 + maps := make(map[string]interface{}) + maps["parent_id"] = req.ParentId + if *req.AreaType == 4 { + maps["area_type"] = 3 + } + if *req.AreaType == 3 { + maps["area_type"] = 2 + } + + if *req.AreaType == 2 { + maps["area_type"] = 1 + } + + areaDao := dao.AreaDao{} + _, err := areaDao.GetAreaList(maps) + if err != nil { + return false, errors.New("上级地区错误") + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + fmt.Println(r) + } + }() + + parentId, err := strconv.ParseInt(req.ParentId, 10, 64) + if err != nil { + tx.Rollback() + return false, errors.New("新增失败") + } + + // 新增优惠卷表 + area := &model.Area{ + AreaName: req.AreaName, + ParentId: parentId, + Zip: req.Zip, + AreaType: *req.AreaType, + } + + area, err = areaDao.AddArea(tx, area) + if err != nil || area == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + tx.Commit() + return true, nil +} + +// PutArea 修改地区 +func (r *AreaService) PutArea(areaId int, req requests.PutArea) (bool, error) { + areaDao := dao.AreaDao{} + area, err := areaDao.GetAreaById(areaId) + if err != nil { + return false, err + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + fmt.Println(r) + } + }() + + areaData := make(map[string]interface{}) + + if req.AreaName != area.AreaName { + areaData["area_name"] = req.AreaName + } + + if req.Zip != "" { + if req.Zip != area.Zip { + areaData["zip"] = req.Zip + } + } + + if len(areaData) > 0 { + err = areaDao.EditAreaById(tx, areaId, areaData) + if err != nil || area == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + } + + tx.Commit() + return true, nil +} diff --git a/api/service/basic.go b/api/service/basic.go index 3168daf..1cbbf3b 100644 --- a/api/service/basic.go +++ b/api/service/basic.go @@ -1,113 +1,3 @@ package service -import ( - "errors" - "fmt" - "hospital-admin-api/api/dao" - "hospital-admin-api/api/model" - "hospital-admin-api/api/requests" - "hospital-admin-api/global" - "strconv" -) - type BasicService struct{} - -// AddArea 新增地区 -func (r *BasicService) AddArea(req requests.AddArea) (bool, error) { - if *req.AreaType == 1 { - return false, errors.New("不可添加国家") - } - - // 检测上级是否存在 - maps := make(map[string]interface{}) - maps["parent_id"] = req.ParentId - if *req.AreaType == 4 { - maps["area_type"] = 3 - } - if *req.AreaType == 3 { - maps["area_type"] = 2 - } - - if *req.AreaType == 2 { - maps["area_type"] = 1 - } - - areaDao := dao.AreaDao{} - _, err := areaDao.GetAreaList(maps) - if err != nil { - return false, errors.New("上级地区错误") - } - - // 开始事务 - tx := global.Db.Begin() - defer func() { - if r := recover(); r != nil { - tx.Rollback() - fmt.Println(r) - } - }() - - parentId, err := strconv.ParseInt(req.ParentId, 10, 64) - if err != nil { - tx.Rollback() - return false, errors.New("新增失败") - } - - // 新增优惠卷表 - area := &model.Area{ - AreaName: req.AreaName, - ParentId: parentId, - Zip: req.Zip, - AreaType: *req.AreaType, - } - - area, err = areaDao.AddArea(tx, area) - if err != nil || area == nil { - tx.Rollback() - return false, errors.New(err.Error()) - } - - tx.Commit() - return true, nil -} - -// PutArea 修改地区 -func (r *BasicService) PutArea(areaId int, req requests.PutArea) (bool, error) { - areaDao := dao.AreaDao{} - area, err := areaDao.GetAreaById(areaId) - if err != nil { - return false, err - } - - // 开始事务 - tx := global.Db.Begin() - defer func() { - if r := recover(); r != nil { - tx.Rollback() - fmt.Println(r) - } - }() - - areaData := make(map[string]interface{}) - - if req.AreaName != area.AreaName { - areaData["area_name"] = req.AreaName - } - - if req.Zip != "" { - if req.Zip != area.Zip { - areaData["zip"] = req.Zip - } - } - - if len(areaData) > 0 { - err = areaDao.EditAreaById(tx, areaId, areaData) - if err != nil || area == nil { - tx.Rollback() - return false, errors.New(err.Error()) - } - } - - tx.Commit() - return true, nil -} diff --git a/api/service/hospital.go b/api/service/hospital.go new file mode 100644 index 0000000..b579410 --- /dev/null +++ b/api/service/hospital.go @@ -0,0 +1,233 @@ +package service + +import ( + "errors" + "fmt" + "hospital-admin-api/api/dao" + "hospital-admin-api/api/dto" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" + "hospital-admin-api/global" +) + +type HospitalService struct { +} + +// AddHospital 新增医院 +func (r *HospitalService) AddHospital(req requests.AddHospital) (bool, error) { + hospitalDao := dao.HospitalDao{} + + // 检测医院是否重复 + maps := make(map[string]interface{}) + maps["hospital_name"] = req.HospitalName + maps["province_id"] = req.ProvinceId + maps["city_id"] = req.CityId + hospitals, err := hospitalDao.GetHospitalList(maps) + if err != nil { + return false, errors.New("医院重复添加") + } + + if len(hospitals) != 0 { + return false, errors.New("医院重复添加") + } + + var province string + var city string + var county string + + areaDao := dao.AreaDao{} + if req.ProvinceId != 0 { + area, err := areaDao.GetAreaById(req.ProvinceId) + if err != nil || area == nil { + return false, errors.New("省份数据错误") + } + province = area.AreaName + } + + if req.CityId != 0 { + area, err := areaDao.GetAreaById(req.CityId) + if err != nil || area == nil { + return false, errors.New("城市数据错误") + } + city = area.AreaName + } + + if req.CountyId != 0 { + area, err := areaDao.GetAreaById(req.CountyId) + if err != nil || area == nil { + return false, errors.New("城市数据错误") + } + county = area.AreaName + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 新增商品表 + hospital := &model.Hospital{ + HospitalName: req.HospitalName, + HospitalStatus: *req.HospitalStatus, + HospitalLevelName: req.HospitalLevelName, + PostCode: req.PostCode, + TelePhone: req.TelePhone, + ProvinceId: req.ProvinceId, + Province: province, + CityId: req.CityId, + City: city, + CountyId: req.CountyId, + County: county, + Address: req.Address, + Lat: req.Lat, + Lng: req.Lng, + Desc: req.Desc, + } + + hospital, err = hospitalDao.AddHospital(tx, hospital) + if err != nil || hospital == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + tx.Commit() + return true, nil +} + +// PutHospital 修改医院 +func (r *HospitalService) PutHospital(hospitalId int64, req requests.PutHospital) (bool, error) { + hospitalDao := dao.HospitalDao{} + area, err := hospitalDao.GetHospitalById(hospitalId) + if err != nil || area == nil { + return false, errors.New("省份数据错误") + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + fmt.Println(r) + } + }() + + hospitalData := make(map[string]interface{}) + + if req.HospitalName != area.HospitalName { + hospitalData["hospital_name"] = req.HospitalName + } + + if *req.HospitalStatus != area.HospitalStatus { + hospitalData["hospital_status"] = req.HospitalStatus + } + + if req.HospitalLevelName != area.HospitalLevelName { + hospitalData["hospital_level_name"] = req.HospitalLevelName + } + + if req.PostCode != "" { + if req.PostCode != area.PostCode { + hospitalData["post_code"] = req.PostCode + } + } + + if req.TelePhone != "" { + if req.TelePhone != area.TelePhone { + hospitalData["tele_phone"] = req.TelePhone + } + } + + if req.ProvinceId != 0 { + if req.ProvinceId != area.ProvinceId { + areaDao := dao.AreaDao{} + area, err := areaDao.GetAreaById(req.ProvinceId) + if err != nil || area == nil { + return false, errors.New("省份数据错误") + } + + hospitalData["province_id"] = req.ProvinceId + hospitalData["province"] = area.AreaName + + } + } + + if req.CityId != 0 { + if req.CityId != area.CityId { + areaDao := dao.AreaDao{} + area, err := areaDao.GetAreaById(req.CityId) + if err != nil || area == nil { + return false, errors.New("省份数据错误") + } + + hospitalData["city_id"] = req.CityId + hospitalData["city"] = area.AreaName + + } + } + + if req.CountyId != 0 { + if req.CountyId != area.CountyId { + areaDao := dao.AreaDao{} + area, err := areaDao.GetAreaById(req.CountyId) + if err != nil || area == nil { + return false, errors.New("省份数据错误") + } + + hospitalData["county_id"] = req.CountyId + hospitalData["county"] = area.AreaName + + } + } + + if req.Address != "" { + if req.Address != area.Address { + hospitalData["address"] = req.Address + } + } + + if req.Lat != "" { + if req.Lat != area.Lat { + hospitalData["lat"] = req.Lat + } + } + + if req.Lng != "" { + if req.Lng != area.Lng { + hospitalData["lng"] = req.Lng + } + } + + if req.Desc != "" { + if req.Desc != area.Desc { + hospitalData["desc"] = req.Desc + } + } + + if len(hospitalData) > 0 { + err = hospitalDao.EditHospitalById(tx, hospitalId, hospitalData) + if err != nil || area == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + } + + tx.Commit() + return true, nil +} + +// GetHospital 系统优惠卷详情 +func (r *HospitalService) GetHospital(hospitalId int64) (g *dto.HospitalDto, err error) { + hospitalDao := dao.HospitalDao{} + hospital, err := hospitalDao.GetHospitalById(hospitalId) + if err != nil || hospital == nil { + return nil, errors.New(err.Error()) + } + + // 处理返回值 + g = dto.GetHospitalDto(hospital) + + return g, nil +} diff --git a/api/service/userDoctor.go b/api/service/userDoctor.go index 8905eb7..8e61811 100644 --- a/api/service/userDoctor.go +++ b/api/service/userDoctor.go @@ -157,7 +157,7 @@ func (r *UserDoctorService) PutUserDoctor(doctorId int64, req requests.PutUserDo if userDoctor.HospitalID != hospitalId { // 获取医院数据 - hospitalDao := dao.Hospital{} + hospitalDao := dao.HospitalDao{} hospital, err := hospitalDao.GetHospitalById(hospitalId) if err != nil || hospital == nil { return false, errors.New("医院错误") @@ -773,7 +773,7 @@ func (r *UserDoctorService) AddUserDoctor(userId string, req requests.AddUserDoc } // 获取医院数据 - hospitalDao := dao.Hospital{} + hospitalDao := dao.HospitalDao{} hospital, err := hospitalDao.GetHospitalById(hospitalId) if err != nil || hospital == nil { return false, errors.New("医院错误") @@ -1179,7 +1179,7 @@ func (r *UserDoctorService) PutUserDoctorPending(doctorId int64, req requests.Pu } // 获取医院名称 - hospitalDao := dao.Hospital{} + hospitalDao := dao.HospitalDao{} hospital, err := hospitalDao.GetHospitalById(userDoctor.HospitalID) if err != nil { return false, errors.New("审核失败") From f514dd16c113768bc85deb5492aa4da1c9c97560 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 3 Jun 2024 13:26:00 +0800 Subject: [PATCH 26/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E6=9C=8D=E5=8A=A1=E5=8C=85=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/orderServicePackage.go | 47 ++++++ api/requests/OrderServicePackage.go | 7 + api/router/router.go | 4 +- api/service/OrderInquiry.go | 2 +- api/service/orderServicePackage.go | 226 ++++++++++++++++++++++++++ config.yaml | 2 + config/wechat.go | 2 + extend/weChat/weChatPay.go | 5 + 8 files changed, 292 insertions(+), 3 deletions(-) diff --git a/api/controller/orderServicePackage.go b/api/controller/orderServicePackage.go index 4affa0c..cecd7a7 100644 --- a/api/controller/orderServicePackage.go +++ b/api/controller/orderServicePackage.go @@ -110,3 +110,50 @@ func (r *OrderServicePackage) GetOrderServicePackageDetailInfo(c *gin.Context) { responses.OkWithData(getResponses, c) } + +// CancelOrderServicePackage 取消服务包订单 +func (r *OrderServicePackage) CancelOrderServicePackage(c *gin.Context) { + id := c.Param("order_service_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + orderServiceId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + orderServicePackageRequest := requests.OrderServicePackageRequest{} + req := orderServicePackageRequest.CancelOrderServicePackage + 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.RefundAmount == nil { + responses.FailWithMessage("退款金额不可为空", c) + return + } + + // 后台用户id + adminUserId := c.GetInt64("UserId") + + // 业务处理 + orderServicePackageService := service.OrderServicePackageService{} + _, err = orderServicePackageService.CancelOrderServicePackage(req, orderServiceId, adminUserId) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} diff --git a/api/requests/OrderServicePackage.go b/api/requests/OrderServicePackage.go index b385014..220789c 100644 --- a/api/requests/OrderServicePackage.go +++ b/api/requests/OrderServicePackage.go @@ -2,6 +2,7 @@ package requests type OrderServicePackageRequest struct { GetOrderServicePackagePage // 获取药品订单列表-分页 + CancelOrderServicePackage // 取消服务包订单 } // GetOrderServicePackagePage 订单-服务包表 @@ -31,3 +32,9 @@ type GetOrderServicePackagePage struct { Mobile string `json:"mobile" form:"mobile" label:"手机号-医生/患者"` DoctorName string `json:"doctor_name" form:"doctor_name" label:"医生姓名"` } + +// CancelOrderServicePackage 取消服务包订单 +type CancelOrderServicePackage struct { + RefundAmount *float64 `json:"refund_amount" form:"refund_amount" label:"退款金额"` + CancelRemarks string `json:"cancel_remarks" form:"cancel_remarks" validate:"required" label:"取消订单备注"` +} diff --git a/api/router/router.go b/api/router/router.go index e677e7c..83f7661 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -456,8 +456,8 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 获取服务包订单服务权益详情 serviceGroup.GET("/detail/:order_service_id", api.OrderServicePackage.GetOrderServicePackageDetailInfo) - // 取消问诊订单 - serviceGroup.PUT("/cancel/:order_inquiry_id", api.OrderServicePackage.GetOrderServicePackageDetailInfo) + // 取消服务包订单 + serviceGroup.PUT("/cancel/:order_service_id", api.OrderServicePackage.CancelOrderServicePackage) } } diff --git a/api/service/OrderInquiry.go b/api/service/OrderInquiry.go index b57d500..d3e1e0f 100644 --- a/api/service/OrderInquiry.go +++ b/api/service/OrderInquiry.go @@ -259,7 +259,7 @@ func (r *OrderInquiryService) CancelOrderInquiry(req requests.CancelOrderInquiry // 记录日志 orderOperationLog := &model.OrderOperationLog{ - OrderId: orderInquiry.OrderInquiryId, + OrderId: orderInquiry.OrderId, OrderNo: orderInquiry.InquiryNo, OrderType: 1, OperatorId: adminUserId, diff --git a/api/service/orderServicePackage.go b/api/service/orderServicePackage.go index 9ebff55..ea41f49 100644 --- a/api/service/orderServicePackage.go +++ b/api/service/orderServicePackage.go @@ -5,6 +5,10 @@ import ( "hospital-admin-api/api/dao" "hospital-admin-api/api/dto" "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" + "hospital-admin-api/config" + "hospital-admin-api/extend/weChat" + "hospital-admin-api/global" "strconv" "time" ) @@ -149,6 +153,228 @@ func (r *OrderServicePackageService) GetOrderServicePackageDetailInfo(orderServi return g, nil } +// CancelOrderServicePackage 取消服务包订单 +func (r *OrderServicePackageService) CancelOrderServicePackage(req requests.CancelOrderServicePackage, orderServiceId, adminUserId int64) (bool, error) { + // 获取订单数据 + orderServicePackageDao := dao.OrderServicePackageDao{} + orderServicePackage, err := orderServicePackageDao.GetOrderServicePackagePreloadById(orderServiceId) + if err != nil || orderServicePackage == nil { + return false, errors.New("订单数据错误") + } + + // 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) + if orderServicePackage.OrderServiceStatus == 5 { + return false, errors.New("订单已取消,无法再次取消") + } + + // 检测订单退款状态 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常) + if orderServicePackage.RefundStatus == 1 { + return false, errors.New("订单申请退款中,无法取消") + } + + if orderServicePackage.RefundStatus == 2 { + return false, errors.New("订单正在退款中,无法取消") + } + + if orderServicePackage.RefundStatus == 3 { + return false, errors.New("订单已退款成功,无法取消") + } + + if orderServicePackage.RefundStatus == 6 { + return false, errors.New("订单退款异常,请联系技术人员") + } + + // 检测支付状态 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + if orderServicePackage.PayStatus != 2 { + return false, errors.New("订单未支付,无需取消") + } + + // 检测退款金额 + if *req.RefundAmount > orderServicePackage.PaymentAmountTotal { + return false, errors.New("退款金额不可超过实付金额") + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 退款编号 + refundNo := strconv.FormatInt(global.Snowflake.Generate().Int64(), 10) + + // 退款状态转换 + var refundStatus int + var successTime time.Time + var refundId string + + // 发起退款 + if orderServicePackage.PaymentAmountTotal > 0 { + refundRequest := weChat.RefundRequest{ + TransactionId: orderServicePackage.EscrowTradeNo, + OutTradeNo: orderServicePackage.OrderServiceNo, + OutRefundNo: refundNo, + Reason: "客服取消", + RefundAmount: int64(*req.RefundAmount * 100), + PaymentAmountTotal: int64(orderServicePackage.PaymentAmountTotal * 100), + NotifyUrl: config.C.Wechat.RefundNotifyDomain + config.C.Wechat.PatientServiceRefundNotifyUrl, + } + + refund, err := refundRequest.Refund(4) + if err != nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + if refund.Status == nil { + tx.Rollback() + return false, errors.New("退款状态错误") + } + + if *refund.Status == "SUCCESS" { + // 退款成功 + refundStatus = 3 + + if refund.SuccessTime != nil { + successTime = *refund.SuccessTime + } + } else if *refund.Status == "CLOSED" { + // 退款关闭 + refundStatus = 5 + + } else if *refund.Status == "PROCESSING" { + // 退款处理中 + refundStatus = 2 + + } else if *refund.Status == "ABNORMAL" { + // 退款异常 + tx.Rollback() + return false, errors.New("退款状态错误") + } else { + tx.Rollback() + return false, errors.New("退款状态错误") + } + + if refund.RefundId == nil { + tx.Rollback() + return false, errors.New("缺少退款订单编号") + } + + // 退款编号 + refundId = *refund.RefundId + } else { + // 支付金额为0,模拟退款 + refundId = "模拟退款:" + strconv.FormatInt(global.Snowflake.Generate().Int64(), 10) + refundStatus = 3 + successTime = time.Now() + + // 模拟退款时手动退还优惠卷 + if orderServicePackage.CouponAmountTotal > 0 { + orderService := OrderService{} + res, err := orderService.ReturnOrderCoupon(orderServicePackage.OrderServiceNo, tx) + if err != nil || !res { + // 退还优惠卷失败 + tx.Rollback() + return false, err + } + } + } + + // 修改订单为取消 + orderData := make(map[string]interface{}) + orderData["cancel_status"] = 1 + orderData["cancel_time"] = time.Now().Format("2006-01-02 15:04:05") + orderData["cancel_remarks"] = req.CancelRemarks + + orderDao := dao.OrderDao{} + err = orderDao.EditOrderById(tx, orderServicePackage.OrderId, orderData) + if err != nil { + tx.Rollback() + return false, errors.New("取消订单失败") + } + + // 修改服务包订单为取消 + orderServicePackageData := make(map[string]interface{}) + orderServicePackageData["order_service_status"] = 5 // 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) + 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) + if err != nil { + tx.Rollback() + return false, errors.New("取消订单失败") + } + + // 新增退款表 + orderRefund := &model.OrderRefund{ + OrderId: orderServicePackage.OrderId, + PatientId: orderServicePackage.PatientId, + OrderNo: orderServicePackage.OrderServiceNo, + RefundNo: refundNo, + RefundId: refundId, + RefundStatus: refundStatus, + RefundTotal: *req.RefundAmount, + RefundReason: req.CancelRemarks, + } + + if refundStatus == 3 && !successTime.IsZero() { + orderRefund.SuccessTime = model.LocalTime(successTime) + } + + orderRefundDao := dao.OrderRefundDao{} + orderRefund, err = orderRefundDao.AddOrderRefund(tx, orderRefund) + if err != nil || orderRefund == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + // 新增服务包退款表 + orderServicePackageRefund := &model.OrderServicePackageRefund{ + PatientId: orderServicePackage.PatientId, + OrderServiceId: orderServicePackage.OrderServiceId, + OrderServiceNo: orderServicePackage.OrderServiceNo, + ServiceRefundNo: refundNo, + RefundId: refundId, + RefundStatus: refundStatus, + RefundTotal: *req.RefundAmount, + RefundReason: req.CancelRemarks, + SuccessTime: model.LocalTime(successTime), + } + + if refundStatus == 3 && !successTime.IsZero() { + orderRefund.SuccessTime = model.LocalTime(successTime) + } + + orderServicePackageRefundDao := dao.OrderServicePackageRefundDao{} + orderServicePackageRefund, err = orderServicePackageRefundDao.AddOrderServicePackageRefund(tx, orderServicePackageRefund) + if err != nil || orderServicePackageRefund == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + // 记录日志 + orderOperationLog := &model.OrderOperationLog{ + OrderId: orderServicePackage.OrderId, + OrderNo: orderServicePackage.OrderServiceNo, + OrderType: 4, + OperatorId: adminUserId, + OperationContent: "取消订单并退款", + } + + orderOperationLogDao := dao.OrderOperationLogDao{} + orderOperationLog, err = orderOperationLogDao.AddOrderOperationLog(tx, orderOperationLog) + if err != nil || orderOperationLog == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + tx.Commit() + + return true, nil +} + // 获取服务包当前月时间区间 func (r *OrderServicePackageService) getOrderServicePackageCurrentMonthDate(startTime model.LocalTime) (startDate, finishDate time.Time, err error) { if startTime.IsEmpty() { diff --git a/config.yaml b/config.yaml index fe07cbb..96ea071 100644 --- a/config.yaml +++ b/config.yaml @@ -72,6 +72,8 @@ wechat: patient-product-refund-notify-url: callback/wxpay/product/refund patient-detection-pay-notify-url: callback/wxpay/detection/success patient-detection-refund-notify-url: callback/wxpay/detection/refund + patient-service-pay-notify-url: callback/wxpay/service/success + patient-service-refund-notify-url: callback/wxpay/service/refund refund-notify-domain: https://dev.hospital.applets.igandanyiyuan.com/ doctor-app-id: wxc83296720404aa7b doctor-app-secret: 817665d3763637fe66d56548f8484622 diff --git a/config/wechat.go b/config/wechat.go index c13ba3d..ab46ef7 100644 --- a/config/wechat.go +++ b/config/wechat.go @@ -9,6 +9,8 @@ type Wechat struct { PatientProductRefundNotifyUrl string `mapstructure:"patient-product-refund-notify-url" json:"patient-product-refund-notify-url" yaml:"patient-product-refund-notify-url"` PatientDetectionPayNotifyUrl string `mapstructure:"patient-detection-pay-notify-url" json:"patient-detection-pay-notify-url" yaml:"patient-detection-pay-notify-url"` PatientDetectionRefundNotifyUrl string `mapstructure:"patient-detection-refund-notify-url" json:"patient-detection-refund-notify-url" yaml:"patient-detection-refund-notify-url"` + PatientServicePayNotifyUrl string `mapstructure:"patient-service-pay-notify-url" json:"patient-service-pay-notify-url" yaml:"patient-service-pay-notify-url"` + PatientServiceRefundNotifyUrl string `mapstructure:"patient-service-refund-notify-url" json:"patient-service-refund-notify-url" yaml:"patient-service-refund-notify-url"` RefundNotifyDomain string `mapstructure:"refund-notify-domain" json:"refund-notify-domain" yaml:"refund-notify-domain"` // 回调域名 DoctorAppId string `mapstructure:"doctor-app-id" json:"doctor-app-id" yaml:"doctor-app-id"` DoctorAppSecret string `mapstructure:"doctor-app-secret" json:"doctor-app-secret" yaml:"doctor-app-secret"` diff --git a/extend/weChat/weChatPay.go b/extend/weChat/weChatPay.go index 85aa982..0a3ea0b 100644 --- a/extend/weChat/weChatPay.go +++ b/extend/weChat/weChatPay.go @@ -38,6 +38,11 @@ func (r RefundRequest) Refund(orderType int) (*refunddomestic.Refund, error) { mchId = config.C.Wechat.Pay1636644248.MchId mchCertificateSerialNumber = config.C.Wechat.Pay1636644248.MchCertificateSerialNumber v3ApiSecret = config.C.Wechat.Pay1636644248.V3ApiSecret + } else if orderType == 4 { + // 服务包 + mchId = config.C.Wechat.Pay1659662936.MchId + mchCertificateSerialNumber = config.C.Wechat.Pay1659662936.MchCertificateSerialNumber + v3ApiSecret = config.C.Wechat.Pay1659662936.V3ApiSecret } if mchId == "" { From 0dac42527f9bfcf4968c98b58e2efcc1ffcb8165 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 3 Jun 2024 16:29:55 +0800 Subject: [PATCH 27/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BC=98=E6=83=A0?= =?UTF-8?q?=E5=8D=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dto/UserCoupon.go | 28 ++++++++++++++-------------- api/model/userCoupon.go | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/api/dto/UserCoupon.go b/api/dto/UserCoupon.go index 09ab35c..a03a1e3 100644 --- a/api/dto/UserCoupon.go +++ b/api/dto/UserCoupon.go @@ -7,18 +7,18 @@ import ( // UserCouponDto 用户优惠卷表 type UserCouponDto struct { - UserCouponId string `json:"user_coupon_id"` // 主键id - UserId string `json:"user_id"` // 用户id - PatientId string `json:"patient_id"` // 患者id - CouponId string `json:"coupon_id"` // 优惠卷id - UserCouponStatus int `json:"user_coupon_status"` // 状态(0:未使用 1:已使用 3:已过期) - CouponUseDate model.LocalTime `json:"coupon_use_date"` // 使用时间 - ValidStartTime model.LocalTime `json:"valid_start_time"` // 有效使用时间 - ValidEndTime model.LocalTime `json:"valid_end_time"` // 过期使用时间 - CreatedAt model.LocalTime `json:"created_at"` // 创建时间 - UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 - Coupon *CouponDto `json:"coupon"` // 优惠卷 - UserName string `json:"user_name"` // 用户名称 + UserCouponId string `json:"user_coupon_id"` // 主键id + UserId string `json:"user_id"` // 用户id + PatientId string `json:"patient_id"` // 患者id + CouponId string `json:"coupon_id"` // 优惠卷id + UserCouponStatus int `json:"user_coupon_status"` // 状态(0:未使用 1:已使用 3:已过期) + CouponUseDate *model.LocalTime `json:"coupon_use_date"` // 使用时间 + ValidStartTime model.LocalTime `json:"valid_start_time"` // 有效使用时间 + ValidEndTime model.LocalTime `json:"valid_end_time"` // 过期使用时间 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 + Coupon *CouponDto `json:"coupon"` // 优惠卷 + UserName string `json:"user_name"` // 用户名称 } // GetUserCouponDto 用户优惠卷详情 @@ -29,7 +29,7 @@ func GetUserCouponDto(m *model.UserCoupon) *UserCouponDto { PatientId: fmt.Sprintf("%d", m.PatientId), CouponId: fmt.Sprintf("%d", m.CouponId), UserCouponStatus: m.UserCouponStatus, - CouponUseDate: model.LocalTime(*m.CouponUseDate), + CouponUseDate: m.CouponUseDate, ValidStartTime: model.LocalTime(m.ValidStartTime), ValidEndTime: model.LocalTime(m.ValidEndTime), CreatedAt: m.CreatedAt, @@ -50,7 +50,7 @@ func GetUserCouponListDto(m []*model.UserCoupon) []*UserCouponDto { PatientId: fmt.Sprintf("%d", v.PatientId), CouponId: fmt.Sprintf("%d", v.CouponId), UserCouponStatus: v.UserCouponStatus, - CouponUseDate: model.LocalTime(*v.CouponUseDate), + CouponUseDate: v.CouponUseDate, ValidStartTime: model.LocalTime(v.ValidStartTime), ValidEndTime: model.LocalTime(v.ValidEndTime), CreatedAt: v.CreatedAt, diff --git a/api/model/userCoupon.go b/api/model/userCoupon.go index 22c545f..a4f64a3 100644 --- a/api/model/userCoupon.go +++ b/api/model/userCoupon.go @@ -13,7 +13,7 @@ type UserCoupon struct { PatientId int64 `gorm:"column:patient_id;type:bigint(19);comment:患者id" json:"patient_id"` CouponId int64 `gorm:"column:coupon_id;type:bigint(19);comment:优惠卷id;NOT NULL" json:"coupon_id"` UserCouponStatus int `gorm:"column:user_coupon_status;type:tinyint(1);default:0;comment:状态(0:未使用 1:已使用 3:已过期)" json:"user_coupon_status"` - CouponUseDate *time.Time `gorm:"column:coupon_use_date;type:datetime;comment:使用时间" json:"coupon_use_date"` + CouponUseDate *LocalTime `gorm:"column:coupon_use_date;type:datetime;comment:使用时间" json:"coupon_use_date"` ValidStartTime time.Time `gorm:"column:valid_start_time;type:datetime;comment:有效使用时间" json:"valid_start_time"` ValidEndTime time.Time `gorm:"column:valid_end_time;type:datetime;comment:过期使用时间" json:"valid_end_time"` Model From ad242af2c48b3fa9694084ca4f45e9555c1b9ae5 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 3 Jun 2024 17:11:48 +0800 Subject: [PATCH 28/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=8D=AF=E5=93=81?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E9=80=80=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/model/orderProduct.go | 1 + api/service/orderProduct.go | 119 ++++++++++++++++++++---------------- 2 files changed, 66 insertions(+), 54 deletions(-) diff --git a/api/model/orderProduct.go b/api/model/orderProduct.go index f4d27c0..836f1e8 100644 --- a/api/model/orderProduct.go +++ b/api/model/orderProduct.go @@ -23,6 +23,7 @@ type OrderProduct struct { IsDelete int `gorm:"column:is_delete;type:tinyint(1);default:0;comment:删除状态(0:否 1:是)" json:"is_delete"` CancelReason int `gorm:"column:cancel_reason;type:tinyint(1);comment:订单取消原因(1:主动取消 2:复核失败/库存不足 3:支付超时 4:客服取消)" json:"cancel_reason"` AmountTotal float64 `gorm:"column:amount_total;type:decimal(10,2);default:0.00;comment:订单金额" json:"amount_total"` + CouponAmountTotal float64 `gorm:"column:coupon_amount_total;type:decimal(10,2);default:0.00;comment:优惠卷总金额" json:"coupon_amount_total"` PaymentAmountTotal float64 `gorm:"column:payment_amount_total;type:decimal(10,2);default:0.00;comment:实际付款金额" json:"payment_amount_total"` LogisticsFee float64 `gorm:"column:logistics_fee;type:decimal(10,2);default:0.00;comment:运费金额" json:"logistics_fee"` LogisticsNo string `gorm:"column:logistics_no;type:varchar(100);comment:物流编号" json:"logistics_no"` diff --git a/api/service/orderProduct.go b/api/service/orderProduct.go index f45ae63..19e6326 100644 --- a/api/service/orderProduct.go +++ b/api/service/orderProduct.go @@ -161,67 +161,78 @@ func (r *OrderProductService) CancelOrderProduct(req requests.CancelOrderProduct var successTime time.Time var refundId string - // // 通知处方平台订单取消 - // _, err = prescription.NoticePreOrderCancel(orderProduct.OrderProductNo) - // if err != nil { - // tx.Rollback() - // return false, err - // } - - // 微信退款 - refundRequest := weChat.RefundRequest{ - TransactionId: orderProduct.EscrowTradeNo, - OutTradeNo: orderProduct.OrderProductNo, - OutRefundNo: refundNo, - Reason: "客服取消", - RefundAmount: int64(orderProduct.PaymentAmountTotal * 100), - PaymentAmountTotal: int64(orderProduct.PaymentAmountTotal * 100), - NotifyUrl: config.C.Wechat.RefundNotifyDomain + config.C.Wechat.PatientProductRefundNotifyUrl, - } - - refund, err := refundRequest.Refund(2) - if err != nil { - tx.Rollback() - return false, errors.New(err.Error()) - } - - if refund.Status == nil { - tx.Rollback() - return false, errors.New("退款状态错误") - } - - if *refund.Status == "SUCCESS" { - // 退款成功 - refundStatus = 3 - - if refund.SuccessTime != nil { - successTime = *refund.SuccessTime + if orderProduct.PaymentAmountTotal > 0 { + // 微信退款 + refundRequest := weChat.RefundRequest{ + TransactionId: orderProduct.EscrowTradeNo, + OutTradeNo: orderProduct.OrderProductNo, + OutRefundNo: refundNo, + Reason: "客服取消", + RefundAmount: int64(orderProduct.PaymentAmountTotal * 100), + PaymentAmountTotal: int64(orderProduct.PaymentAmountTotal * 100), + NotifyUrl: config.C.Wechat.RefundNotifyDomain + config.C.Wechat.PatientProductRefundNotifyUrl, } - } else if *refund.Status == "CLOSED" { - // 退款关闭 - refundStatus = 5 - } else if *refund.Status == "PROCESSING" { - // 退款处理中 - refundStatus = 2 + refund, err := refundRequest.Refund(2) + if err != nil { + tx.Rollback() + return false, errors.New(err.Error()) + } - } else if *refund.Status == "ABNORMAL" { - // 退款异常 - tx.Rollback() - return false, errors.New("退款状态错误") + if refund.Status == nil { + tx.Rollback() + return false, errors.New("退款状态错误") + } + + if *refund.Status == "SUCCESS" { + // 退款成功 + refundStatus = 3 + + if refund.SuccessTime != nil { + successTime = *refund.SuccessTime + } + } else if *refund.Status == "CLOSED" { + // 退款关闭 + refundStatus = 5 + + } else if *refund.Status == "PROCESSING" { + // 退款处理中 + refundStatus = 2 + + } else if *refund.Status == "ABNORMAL" { + // 退款异常 + tx.Rollback() + return false, errors.New("退款状态错误") + } else { + tx.Rollback() + return false, errors.New("退款状态错误") + } + + if refund.RefundId == nil { + tx.Rollback() + return false, errors.New("缺少退款订单编号") + } + + // 退款编号 + refundId = *refund.RefundId } else { - tx.Rollback() - return false, errors.New("退款状态错误") - } + // 支付金额为0,模拟退款 + refundId = "模拟退款:" + strconv.FormatInt(global.Snowflake.Generate().Int64(), 10) + refundStatus = 3 + successTime = time.Now() - if refund.RefundId == nil { - tx.Rollback() - return false, errors.New("缺少退款订单编号") + // 模拟退款时手动退还优惠卷 + if orderProduct.CouponAmountTotal > 0 { + orderService := OrderService{} + res, err := orderService.ReturnOrderCoupon(orderProduct.OrderProductNo, tx) + if err != nil || !res { + // 退还优惠卷失败 + tx.Rollback() + return false, err + } + } } - // 退款编号 - refundId = *refund.RefundId - // 修改问诊订单退款状态 orderProductData["refund_status"] = refundStatus orderProductData["order_product_status"] = 5 // 订单状态(1:待支付 2:待发货 3:已发货 4:已签收 5:已取消) From 58bf39a5e304c464df6c52eb5f3d15574b359bfd Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 4 Jun 2024 14:52:44 +0800 Subject: [PATCH 29/78] 1 --- api/controller/base.go | 1 + api/controller/healthPackage.go | 83 +++++++++++++++++++++++++++ api/dao/healthPackage.go | 90 ++++++++++++++++++++++++++++++ api/dto/HealthPackage.go | 68 ++++++++++++++++++++++ api/model/healthPackage.go | 1 + api/requests/healthPackage.go | 11 ++++ api/router/router.go | 36 +++++++++++- api/service/HealthPackage.go | 30 ++++++++++ api/service/orderServicePackage.go | 2 +- 9 files changed, 320 insertions(+), 2 deletions(-) create mode 100644 api/controller/healthPackage.go create mode 100644 api/dao/healthPackage.go create mode 100644 api/dto/HealthPackage.go create mode 100644 api/requests/healthPackage.go create mode 100644 api/service/HealthPackage.go 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("取消订单失败") From 89addf8e5903166ba384e79b2e8690dbe8e738dc Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 4 Jun 2024 16:32:00 +0800 Subject: [PATCH 30/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E5=81=A5?= =?UTF-8?q?=E5=BA=B7=E5=8C=85=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/healthPackage.go | 69 ++++++++++- api/requests/healthPackage.go | 24 +++- api/requests/healthPackageProduct.go | 14 +++ api/router/router.go | 34 ++--- api/service/HealthPackage.go | 179 ++++++++++++++++++++++++++- 5 files changed, 290 insertions(+), 30 deletions(-) create mode 100644 api/requests/healthPackageProduct.go diff --git a/api/controller/healthPackage.go b/api/controller/healthPackage.go index b2b1944..07cba00 100644 --- a/api/controller/healthPackage.go +++ b/api/controller/healthPackage.go @@ -14,7 +14,7 @@ import ( type HealthPackage struct{} -// GetHealthPackagePage 获取系统健康包配置列表-分页 +// GetHealthPackagePage 获取健康包列表-分页 func (r *HealthPackage) GetHealthPackagePage(c *gin.Context) { healthPackageRequest := requests.HealthPackageRequest{} req := healthPackageRequest.GetHealthPackagePage @@ -56,7 +56,7 @@ func (r *HealthPackage) GetHealthPackagePage(c *gin.Context) { responses.OkWithData(result, c) } -// GetHealthPackage 获取系统健康包配置详情 +// GetHealthPackage 获取健康包详情 func (r *HealthPackage) GetHealthPackage(c *gin.Context) { id := c.Param("package_id") if id == "" { @@ -81,3 +81,68 @@ func (r *HealthPackage) GetHealthPackage(c *gin.Context) { responses.OkWithData(getResponses, c) } + +// PutHealthPackage 修改健康包 +func (r *HealthPackage) PutHealthPackage(c *gin.Context) { + healthPackageRequest := requests.HealthPackageRequest{} + req := healthPackageRequest.PutHealthPackage + 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 := 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{} + _, err = healthPackageService.PutHealthPackage(packageId, req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} + +// AddHealthPackage 新增健康包 +func (r *HealthPackage) AddHealthPackage(c *gin.Context) { + healthPackageRequest := requests.HealthPackageRequest{} + req := healthPackageRequest.AddHealthPackage + 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 + } + + // 业务处理 + healthPackageService := service.HealthPackageService{} + _, err := healthPackageService.AddHealthPackage(req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} diff --git a/api/requests/healthPackage.go b/api/requests/healthPackage.go index cffc603..0eff1fe 100644 --- a/api/requests/healthPackage.go +++ b/api/requests/healthPackage.go @@ -1,11 +1,31 @@ package requests type HealthPackageRequest struct { - GetHealthPackagePage // 健康包 + GetHealthPackagePage // 获取健康包列表-分页 + PutHealthPackage // 修改健康包 + AddHealthPackage // 新增健康包 } -// GetHealthPackagePage 健康包 +// GetHealthPackagePage 获取健康包列表-分页 type GetHealthPackagePage struct { Page int `json:"page" form:"page" label:"页码"` PageSize int `json:"page_size" form:"page_size" label:"每页个数"` } + +// PutHealthPackage 修改健康包 +type PutHealthPackage struct { + ServiceCount int `json:"service_count" form:"service_count" label:"总服务次数" validate:"required,min=1"` + MonthlyFrequency int `json:"monthly_frequency" form:"monthly_frequency" label:"每月次数" validate:"required,min=1"` + EffectiveDays string `json:"effective_days" form:"effective_days" label:"服务有效天数" validate:"required,min=1"` + ServiceRate string `json:"service_rate" form:"service_rate" label:"服务费率。100为满值,表示1,正常费率。" validate:"required,min=1"` + HealthPackageProduct []*HealthPackageProduct `json:"health_package_product" form:"health_package_product" label:"关联商品" validate:"required"` +} + +// AddHealthPackage 新增健康包 +type AddHealthPackage struct { + ServiceCount int `json:"service_count" form:"service_count" label:"总服务次数" validate:"required,min=1"` + MonthlyFrequency int `json:"monthly_frequency" form:"monthly_frequency" label:"每月次数" validate:"required,min=1"` + EffectiveDays string `json:"effective_days" form:"effective_days" label:"服务有效天数" validate:"required,min=1"` + ServiceRate string `json:"service_rate" form:"service_rate" label:"服务费率。100为满值,表示1,正常费率。" validate:"required,min=1"` + HealthPackageProduct []*HealthPackageProduct `json:"health_package_product" form:"health_package_product" label:"关联商品" validate:"required"` +} diff --git a/api/requests/healthPackageProduct.go b/api/requests/healthPackageProduct.go new file mode 100644 index 0000000..6d9dece --- /dev/null +++ b/api/requests/healthPackageProduct.go @@ -0,0 +1,14 @@ +package requests + +type HealthPackageProductRequest struct { + HealthPackageProduct // 健康包-关联商品 +} + +// HealthPackageProduct 健康包-关联商品 +type HealthPackageProduct struct { + PackageId string `json:"package_id" form:"package_id" label:"健康包id"` + ProductId string `gorm:"primaryKey" json:"product_id" form:"product_id" label:"商品id"` + ProductName string `json:"product_name" form:"product_name" label:"商品名称"` + Quantity int `json:"quantity" form:"quantity" label:"数量"` + DiscountProductPrice float64 `json:"discount_product_price" form:"discount_product_price" label:"折扣商品价格"` +} diff --git a/api/router/router.go b/api/router/router.go index e2c4d02..f8fc5a1 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -548,36 +548,20 @@ func privateRouter(r *gin.Engine, api controller.Api) { } } - // 健康包配置 + // 健康包管理 healthGroup := inquiryGroup.Group("/health") { - // 系统健康包配置 - systemGroup := healthGroup.Group("/system") - { - // 获取系统健康包配置列表-分页 - systemGroup.POST("/page", api.HealthPackage.GetHealthPackagePage) + // 获取健康包列表-分页 + healthGroup.POST("/page", api.HealthPackage.GetHealthPackagePage) - // 获取系统健康包配置详情 - systemGroup.GET("/:package_id", api.HealthPackage.GetHealthPackage) - } + // 获取健康包详情 + healthGroup.GET("/:package_id", api.HealthPackage.GetHealthPackage) - // 医生健康包配置 - doctorGroup := healthGroup.Group("/doctor") - { - // 获取开启问诊配置医生列表-分页 - doctorGroup.GET("", api.InquiryConfig.GetDoctorInquiryConfigPage) - } - } + // 修改健康包 + healthGroup.PUT("/:package_id", api.HealthPackage.PutHealthPackage) - // 随访包配置 - followGroup := configGroup.Group("/follow") - { - // 医生随访包配置 - doctorGroup := followGroup.Group("/doctor") - { - // 获取开启问诊配置医生列表-分页 - doctorGroup.GET("", api.InquiryConfig.GetDoctorInquiryConfigPage) - } + // 新增健康包 + healthGroup.POST("", api.HealthPackage.AddHealthPackage) } } diff --git a/api/service/HealthPackage.go b/api/service/HealthPackage.go index 40be9bf..82c3276 100644 --- a/api/service/HealthPackage.go +++ b/api/service/HealthPackage.go @@ -4,12 +4,16 @@ 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/global" + "strconv" ) type HealthPackageService struct { } -// GetHealthPackage 获取系统健康包配置详情 +// GetHealthPackage 获取健康包 func (r *HealthPackageService) GetHealthPackage(packageId int64) (g *dto.HealthPackageDto, err error) { healthPackageDao := dao.HealthPackageDao{} healthPackage, err := healthPackageDao.GetHealthPackagePreloadById(packageId) @@ -28,3 +32,176 @@ func (r *HealthPackageService) GetHealthPackage(packageId int64) (g *dto.HealthP return g, nil } + +// PutHealthPackage 修改健康包 +func (r *HealthPackageService) PutHealthPackage(packageId int64, req requests.PutHealthPackage) (bool, error) { + // 获取系统问诊配置 + healthPackageDao := dao.HealthPackageDao{} + healthPackage, err := healthPackageDao.GetHealthPackageById(packageId) + if err != nil || healthPackage == nil { + return false, errors.New("数据错误") + } + + var discountProductTotalAmount float64 + + // 验证商品 + productDao := dao.ProductDao{} + for _, product := range req.HealthPackageProduct { + productId, err := strconv.ParseInt(product.ProductId, 10, 64) + if err != nil { + return false, err + } + + // 获取商品数据 + _, err = productDao.GetProductById(productId) + if err != nil { + return false, errors.New("商品数据错误") + } + + discountProductTotalAmount = discountProductTotalAmount + product.DiscountProductPrice + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 修改系统问诊配置 + healthPackageData := make(map[string]interface{}) + if req.ServiceCount != healthPackage.ServiceCount { + healthPackageData["service_count"] = req.ServiceCount + } + + if req.MonthlyFrequency != healthPackage.MonthlyFrequency { + healthPackageData["monthly_frequency"] = req.MonthlyFrequency + } + + if req.EffectiveDays != healthPackage.EffectiveDays { + healthPackageData["effective_days"] = req.EffectiveDays + } + + if req.ServiceRate != healthPackage.ServiceRate { + healthPackageData["service_rate"] = req.ServiceRate + } + + if discountProductTotalAmount != healthPackage.DiscountProductTotalAmount { + healthPackageData["discount_product_total_amount"] = discountProductTotalAmount + } + + if len(healthPackageData) > 0 { + err = healthPackageDao.EditHealthPackage(tx, packageId, healthPackageData) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + } + + // 删除关联商品 + healthPackageProductDao := dao.HealthPackageProductDao{} + + maps := make(map[string]interface{}) + maps["package_id"] = healthPackage.PackageId + err = healthPackageProductDao.DeleteHealthPackageProduct(tx, maps) + if err != nil { + return false, err + } + + // 增加关联商品 + for _, product := range req.HealthPackageProduct { + productId, err := strconv.ParseInt(product.ProductId, 10, 64) + if err != nil { + return false, err + } + + healthPackageProduct := &model.HealthPackageProduct{ + PackageId: healthPackage.PackageId, + ProductId: productId, + ProductName: product.ProductName, + Quantity: product.Quantity, + DiscountProductPrice: product.DiscountProductPrice, + } + + healthPackageProduct, err = healthPackageProductDao.AddHealthPackageProduct(tx, healthPackageProduct) + if err != nil || healthPackageProduct == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + } + + tx.Commit() + return true, nil +} + +// AddHealthPackage 新增健康包 +func (r *HealthPackageService) AddHealthPackage(req requests.AddHealthPackage) (bool, error) { + var discountProductTotalAmount float64 + + // 验证商品 + productDao := dao.ProductDao{} + for _, product := range req.HealthPackageProduct { + productId, err := strconv.ParseInt(product.ProductId, 10, 64) + if err != nil { + return false, err + } + + // 获取商品数据 + _, err = productDao.GetProductById(productId) + if err != nil { + return false, errors.New("商品数据错误") + } + + discountProductTotalAmount = discountProductTotalAmount + product.DiscountProductPrice + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 新增医生问诊配置 + healthPackage := &model.HealthPackage{ + ServiceCount: req.ServiceCount, + MonthlyFrequency: req.MonthlyFrequency, + EffectiveDays: req.EffectiveDays, + ServiceRate: req.ServiceRate, + DiscountProductTotalAmount: discountProductTotalAmount, + } + + healthPackageDao := dao.HealthPackageDao{} + healthPackage, err := healthPackageDao.AddHealthPackage(tx, healthPackage) + if err != nil || healthPackage == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + healthPackageProductDao := dao.HealthPackageProductDao{} + for _, product := range req.HealthPackageProduct { + productId, err := strconv.ParseInt(product.ProductId, 10, 64) + if err != nil { + return false, err + } + + healthPackageProduct := &model.HealthPackageProduct{ + PackageId: healthPackage.PackageId, + ProductId: productId, + ProductName: product.ProductName, + Quantity: product.Quantity, + DiscountProductPrice: product.DiscountProductPrice, + } + + healthPackageProduct, err = healthPackageProductDao.AddHealthPackageProduct(tx, healthPackageProduct) + if err != nil || healthPackageProduct == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + } + + tx.Commit() + return true, nil +} From d996b204b3a848b3211eb6535e73d76259d288b1 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 4 Jun 2024 16:59:52 +0800 Subject: [PATCH 31/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=20=E9=97=AE?= =?UTF-8?q?=E8=AF=8A=E7=AE=A1=E7=90=86=20=E8=B7=AF=E7=94=B1=E5=9C=B0?= =?UTF-8?q?=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/router/router.go | 48 ++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/api/router/router.go b/api/router/router.go index f8fc5a1..4da6f99 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -512,40 +512,36 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 问诊管理 inquiryGroup := adminGroup.Group("/inquiry") { - // 问诊配置 - configGroup := inquiryGroup.Group("/config") + // 医生问诊配置 + doctorGroup := inquiryGroup.Group("/doctor") { - // 医生问诊配置 - doctorGroup := configGroup.Group("/doctor") - { - // 获取开启问诊配置医生列表-分页 - doctorGroup.GET("", api.InquiryConfig.GetDoctorInquiryConfigPage) + // 获取开启问诊配置医生列表-分页 + doctorGroup.GET("", api.InquiryConfig.GetDoctorInquiryConfigPage) - // 医生问诊配置详情 - doctorGroup.GET("/:inquiry_config_id", api.InquiryConfig.GetDoctorInquiryConfig) + // 医生问诊配置详情 + doctorGroup.GET("/:inquiry_config_id", api.InquiryConfig.GetDoctorInquiryConfig) - // 修改医生问诊配置 - doctorGroup.PUT("/:inquiry_config_id", api.InquiryConfig.PutDoctorInquiryConfig) + // 修改医生问诊配置 + doctorGroup.PUT("/:inquiry_config_id", api.InquiryConfig.PutDoctorInquiryConfig) - // 新增医生问诊配置 - doctorGroup.POST("", api.InquiryConfig.AddDoctorInquiryConfig) - } + // 新增医生问诊配置 + doctorGroup.POST("", api.InquiryConfig.AddDoctorInquiryConfig) + } - // 系统问诊配置 - systemGroup := configGroup.Group("/system") - { - // 获取系统问诊配置列表-分页 - systemGroup.GET("", api.InquiryConfig.GetSystemInquiryConfigPage) + // 系统问诊配置 + systemGroup := inquiryGroup.Group("/system") + { + // 获取系统问诊配置列表-分页 + systemGroup.GET("", api.InquiryConfig.GetSystemInquiryConfigPage) - // 系统问诊配置详情-id - systemGroup.GET("/:system_inquiry_config_id", api.InquiryConfig.GetSystemInquiryConfig) + // 系统问诊配置详情-id + systemGroup.GET("/:system_inquiry_config_id", api.InquiryConfig.GetSystemInquiryConfig) - // 修改系统问诊配置 - systemGroup.PUT("/:system_inquiry_config_id", api.InquiryConfig.PutSystemInquiryConfig) + // 修改系统问诊配置 + systemGroup.PUT("/:system_inquiry_config_id", api.InquiryConfig.PutSystemInquiryConfig) - // 系统问诊配置详情-条件 - systemGroup.GET("/detail", api.InquiryConfig.GetSystemInquiryConfigDetail) - } + // 系统问诊配置详情-条件 + systemGroup.GET("/detail", api.InquiryConfig.GetSystemInquiryConfigDetail) } // 健康包管理 From 6f805fae4c380cfa16836a122d544912defdbf99 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 5 Jun 2024 08:49:06 +0800 Subject: [PATCH 32/78] 1 --- api/dto/coupon.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api/dto/coupon.go b/api/dto/coupon.go index c775d4e..c077e49 100644 --- a/api/dto/coupon.go +++ b/api/dto/coupon.go @@ -20,7 +20,7 @@ type CouponDto struct { BrandId string `json:"brand_id"` // 关联品牌id(如不限制品牌,此项为空) IsMutex int `json:"is_mutex"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 IsDisplay int `json:"is_display"` // 是否展示(0:否 1:是) - DistributionWithDay int `json:"distribution_with_day"` // 发放关联天数(发放对象为近期消费等类型时规定天数) + DistributionWithDay *int `json:"distribution_with_day"` // 发放关联天数(发放对象为近期消费等类型时规定天数) MinUsableNumber int `json:"min_usable_number"` // 单商品最小可使用数量(默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) CouponCount int `json:"coupon_count"` // 发放数量 CouponTakeCount int `json:"coupon_take_count"` // 已领取数量 @@ -56,7 +56,7 @@ func GetCouponDto(m *model.Coupon) *CouponDto { BrandId: fmt.Sprintf("%d", m.BrandId), IsMutex: *m.IsMutex, IsDisplay: m.IsDisplay, - DistributionWithDay: m.DistributionWithDay, + DistributionWithDay: &m.DistributionWithDay, MinUsableNumber: *m.MinUsableNumber, CouponCount: m.CouponCount, CouponTakeCount: m.CouponTakeCount, @@ -97,7 +97,7 @@ func GetCouponListDto(m []*model.Coupon) []*CouponDto { BrandId: fmt.Sprintf("%d", v.BrandId), IsMutex: *v.IsMutex, IsDisplay: v.IsDisplay, - DistributionWithDay: v.DistributionWithDay, + DistributionWithDay: &v.DistributionWithDay, MinUsableNumber: *v.MinUsableNumber, CouponCount: v.CouponCount, CouponTakeCount: v.CouponTakeCount, From 1ad5c29520901ca5c34d462bc368a3e4c1aaa3e3 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 5 Jun 2024 08:59:36 +0800 Subject: [PATCH 33/78] 2 --- api/requests/coupon.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/api/requests/coupon.go b/api/requests/coupon.go index 91d91d8..87c75ab 100644 --- a/api/requests/coupon.go +++ b/api/requests/coupon.go @@ -37,14 +37,14 @@ type AddSystemCoupon struct { CouponClient *int `json:"coupon_client" form:"coupon_client" label:"使用平台" validate:"required,oneof=1"` // 使用平台(1:小程序) CouponType *int `json:"coupon_type" form:"coupon_type" label:"优惠卷类型" validate:"required,oneof=1 2 3"` // 优惠卷类型(1 :无门槛 2:满减 3:数量) DistributionObject *int `json:"distribution_object" form:"distribution_object" label:"发放对象" validate:"required,oneof=1 2 3 4 5 6 7"` - ApplicationScope *int `json:"application_scope" form:"application_scope" label:"适用范围" validate:"required,oneof=1 2 3 4 5 6"` // (1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品) - InquiryType *string `json:"inquiry_type" form:"inquiry_type" label:"关联问诊类型" validate:"omitempty,oneof=1 2 3 4 5 6"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) - BrandId *string `json:"brand_id" form:"brand_id" label:"关联品牌id"` // 关联品牌id(如不限制品牌,此项为空) - IsMutex *int `json:"is_mutex" form:"is_mutex" label:"是否互斥" validate:"required,oneof=0 1"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 - IsDisplay *int `json:"is_display" form:"is_display" label:"是否展示" validate:"required,oneof=0 1"` // 是否展示(0:否 1:是) - DistributionWithDay *int `json:"distribution_with_day" form:"distribution_with_day" label:"发放关联天数" validate:"omitempty,numeric,min=1"` // (发放对象为近期消费等类型时规定天数) - MinUsableNumber *int `json:"min_usable_number" form:"min_usable_number" label:"单商品最小可使用数量" validate:"omitempty,numeric,min=1"` // (默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) - CouponCount *int `json:"coupon_count" form:"coupon_count" label:"发放数量" validate:"required,number,min=1"` // (默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) + ApplicationScope *int `json:"application_scope" form:"application_scope" label:"适用范围" validate:"required,oneof=1 2 3 4 5 6"` // (1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品) + InquiryType *string `json:"inquiry_type" form:"inquiry_type" label:"关联问诊类型" validate:"omitempty,oneof=1 2 3 4 5 6"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) + BrandId *string `json:"brand_id" form:"brand_id" label:"关联品牌id"` // 关联品牌id(如不限制品牌,此项为空) + IsMutex *int `json:"is_mutex" form:"is_mutex" label:"是否互斥" validate:"required,oneof=0 1"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 + IsDisplay *int `json:"is_display" form:"is_display" label:"是否展示" validate:"required,oneof=0 1"` // 是否展示(0:否 1:是) + DistributionWithDay *int `json:"distribution_with_day" form:"distribution_with_day" label:"发放关联天数" validate:"omitempty,numeric"` // (发放对象为近期消费等类型时规定天数) + MinUsableNumber *int `json:"min_usable_number" form:"min_usable_number" label:"单商品最小可使用数量" validate:"omitempty,numeric"` // (默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) + CouponCount *int `json:"coupon_count" form:"coupon_count" label:"发放数量" validate:"required,number,min=1"` // (默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) CouponPrice *float64 `json:"coupon_price" form:"coupon_price" label:"优惠卷金额" validate:"required,numeric,gt=0"` WithAmount *float64 `json:"with_amount" form:"with_amount" label:"符合满减标准金额" validate:"omitempty,gt=1"` // (优惠卷类型为满减时使用) ValidType *int `json:"valid_type" form:"valid_type" label:"有效类型" validate:"required,oneof=1 2"` // 有效类型(1:绝对时效,xxx-xxx时间段有效 2:相对时效 n天内有效) @@ -67,8 +67,8 @@ type PutSystemCoupon struct { BrandId *string `json:"brand_id" form:"brand_id" label:"关联品牌id"` // 关联品牌id(如不限制品牌,此项为空) IsMutex *int `json:"is_mutex" form:"is_mutex" label:"是否互斥" validate:"required,oneof=0 1"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 IsDisplay *int `json:"is_display" form:"is_display" label:"是否展示" validate:"required,oneof=0 1"` // 是否展示(0:否 1:是) - DistributionWithDay *int `json:"distribution_with_day" form:"distribution_with_day" label:"发放关联天数" validate:"omitempty,numeric,min=1"` // (发放对象为近期消费等类型时规定天数) - MinUsableNumber *int `json:"min_usable_number" form:"min_usable_number" label:"单商品最小可使用数量" validate:"omitempty,numeric,min=1"` // (默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) + DistributionWithDay *int `json:"distribution_with_day" form:"distribution_with_day" label:"发放关联天数" validate:"omitempty,numeric"` // (发放对象为近期消费等类型时规定天数) + MinUsableNumber *int `json:"min_usable_number" form:"min_usable_number" label:"单商品最小可使用数量" validate:"omitempty,numeric"` // (默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) CouponCount *int `json:"coupon_count" form:"coupon_count" label:"发放数量" validate:"required,number,min=1"` // (默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) CouponPrice *float64 `json:"coupon_price" form:"coupon_price" label:"优惠卷金额" validate:"required,numeric,gt=0"` // 优惠卷金额 ProductId []string `json:"product_id" form:"product_id" label:"关联商品id"` // ,逗号分隔,指定商品时,填入此项。 From 895a53b51c17f9424990122d4f46341cd02fad9b Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 5 Jun 2024 10:57:44 +0800 Subject: [PATCH 34/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=20=E5=8C=BB?= =?UTF-8?q?=E7=94=9F=E5=81=A5=E5=BA=B7=E5=8C=85=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/base.go | 5 +- api/controller/doctorConfigHealthPackage.go | 162 ++++++++++++ api/dao/doctorConfigHealthPackage.go | 131 ++++++++++ api/dto/DoctorConfigHealthPackage.go | 93 +++++++ api/dto/DoctotInquiryConfig.go | 4 +- api/model/doctorConfigHealthPackage.go | 2 + api/model/doctorInquiryConfig.go | 2 +- api/requests/doctorConfigHealthPackage.go | 30 +++ api/router/router.go | 16 ++ api/service/InquiryConfig.go | 8 +- api/service/doctorConfigHealthPackage.go | 267 ++++++++++++++++++++ 11 files changed, 711 insertions(+), 9 deletions(-) create mode 100644 api/controller/doctorConfigHealthPackage.go create mode 100644 api/dao/doctorConfigHealthPackage.go create mode 100644 api/dto/DoctorConfigHealthPackage.go create mode 100644 api/requests/doctorConfigHealthPackage.go create mode 100644 api/service/doctorConfigHealthPackage.go diff --git a/api/controller/base.go b/api/controller/base.go index 46423e2..6255c85 100644 --- a/api/controller/base.go +++ b/api/controller/base.go @@ -70,8 +70,9 @@ type orderPrescriptionManage struct { // 问诊管理 type inquiryManage struct { - InquiryConfig // 问诊配置 - HealthPackage // 系统健康包配置 + InquiryConfig // 问诊配置 + HealthPackage // 系统健康包配置 + DoctorConfigHealthPackage // 医生健康包配置 } // ca管理 diff --git a/api/controller/doctorConfigHealthPackage.go b/api/controller/doctorConfigHealthPackage.go new file mode 100644 index 0000000..da578d3 --- /dev/null +++ b/api/controller/doctorConfigHealthPackage.go @@ -0,0 +1,162 @@ +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 DoctorConfigHealthPackage struct{} + +// GetDoctorHealthPage 获取开启健康包服务的医生-分页 +func (r *DoctorConfigHealthPackage) GetDoctorHealthPage(c *gin.Context) { + doctorConfigHealthPackageRequest := requests.DoctorConfigHealthPackageRequest{} + req := doctorConfigHealthPackageRequest.GetDoctorHealthPage + 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 + } + + doctorConfigHealthPackageDao := dao.DoctorConfigHealthPackageDao{} + doctorConfigHealthPackage, total, err := doctorConfigHealthPackageDao.GetDoctorHealthPageSearch(req, req.Page, req.PageSize) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + res := dto.GetDoctorConfigHealthPackageListDto(doctorConfigHealthPackage) + + doctorInquiryConfigDao := dao.DoctorInquiryConfigDao{} + for _, v := range res { + maps := make(map[string]interface{}) + maps["doctor_id"] = v.DoctorId + maps["inquiry_type"] = 1 + maps["inquiry_mode"] = 8 + doctorInquiryConfig, err := doctorInquiryConfigDao.GetDoctorInquiryConfig(maps) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + v.LoadDoctorInquiryConfig(doctorInquiryConfig) + } + + result := make(map[string]interface{}) + result["page"] = req.Page + result["page_size"] = req.PageSize + result["total"] = total + result["data"] = res + responses.OkWithData(result, c) +} + +// GetDoctorHealth 医生健康包配置详情 +func (r *DoctorConfigHealthPackage) GetDoctorHealth(c *gin.Context) { + id := c.Param("health_package_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + healthPackageId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + doctorConfigHealthPackageService := service.DoctorConfigHealthPackageService{} + getUserDoctorResponses, err := doctorConfigHealthPackageService.GetDoctorHealth(healthPackageId) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(getUserDoctorResponses, c) +} + +// PutDoctorHealth 修改医生健康包配置 +func (r *DoctorConfigHealthPackage) PutDoctorHealth(c *gin.Context) { + doctorConfigHealthPackageRequest := requests.DoctorConfigHealthPackageRequest{} + req := doctorConfigHealthPackageRequest.PutDoctorHealth + 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 := c.Param("health_package_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + healthPackageId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + doctorConfigHealthPackageService := service.DoctorConfigHealthPackageService{} + _, err = doctorConfigHealthPackageService.PutDoctorHealth(healthPackageId, req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} + +// AddDoctorHealth 新增医生健康包配置 +func (r *DoctorConfigHealthPackage) AddDoctorHealth(c *gin.Context) { + doctorConfigHealthPackageRequest := requests.DoctorConfigHealthPackageRequest{} + req := doctorConfigHealthPackageRequest.AddDoctorHealth + 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 + } + + // 业务处理 + doctorConfigHealthPackageService := service.DoctorConfigHealthPackageService{} + _, err := doctorConfigHealthPackageService.AddDoctorHealth(req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} diff --git a/api/dao/doctorConfigHealthPackage.go b/api/dao/doctorConfigHealthPackage.go new file mode 100644 index 0000000..e2ce643 --- /dev/null +++ b/api/dao/doctorConfigHealthPackage.go @@ -0,0 +1,131 @@ +package dao + +import ( + "gorm.io/gorm" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" + "hospital-admin-api/global" +) + +type DoctorConfigHealthPackageDao struct { +} + +// GetDoctorConfigHealthPackageListByDoctorId 获取列表-医生id +func (r *DoctorConfigHealthPackageDao) GetDoctorConfigHealthPackageListByDoctorId(doctorId int64) (m []*model.DoctorConfigHealthPackage, err error) { + err = global.Db.Where("doctor_id = ?", doctorId).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetDoctorConfigHealthPackageById 获取医生健康包配置数据-问诊配置id +func (r *DoctorConfigHealthPackageDao) GetDoctorConfigHealthPackageById(healthPackageId int64) (m *model.DoctorConfigHealthPackage, err error) { + err = global.Db.First(&m, healthPackageId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteDoctorConfigHealthPackage 删除医生健康包配置 +func (r *DoctorConfigHealthPackageDao) DeleteDoctorConfigHealthPackage(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.DoctorConfigHealthPackage{}).Error + if err != nil { + return err + } + return nil +} + +// EditDoctorConfigHealthPackageById 修改医生健康包配置-健康包配置id +func (r *DoctorConfigHealthPackageDao) EditDoctorConfigHealthPackageById(tx *gorm.DB, healthPackageId int64, data interface{}) error { + err := tx.Model(&model.DoctorConfigHealthPackage{}).Where("health_package_id = ?", healthPackageId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetDoctorConfigHealthPackageList 获取医生健康包配置列表 +func (r *DoctorConfigHealthPackageDao) GetDoctorConfigHealthPackageList(maps interface{}) (m []*model.DoctorConfigHealthPackage, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddDoctorConfigHealthPackage 新增医生健康包配置 +func (r *DoctorConfigHealthPackageDao) AddDoctorConfigHealthPackage(tx *gorm.DB, model *model.DoctorConfigHealthPackage) (*model.DoctorConfigHealthPackage, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} + +// GetDoctorConfigHealthPackage 获取医生健康包配置 +func (r *DoctorConfigHealthPackageDao) GetDoctorConfigHealthPackage(maps interface{}) (m *model.DoctorConfigHealthPackage, err error) { + err = global.Db.Where(maps).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetDoctorHealthPageSearch 获取开启健康包服务的医生-分页 +func (r *DoctorConfigHealthPackageDao) GetDoctorHealthPageSearch(req requests.GetDoctorHealthPage, page, pageSize int) (m []*model.DoctorConfigHealthPackage, total int64, err error) { + var totalRecords int64 + + // 构建查询条件 + query := global.Db.Model(&model.DoctorConfigHealthPackage{}) + + // 医生 + query = query.Preload("UserDoctor", func(db *gorm.DB) *gorm.DB { + return db.Omit("open_id", "union_id", "wx_session_key") + }) + + // 健康包表 + query = query.Preload("HealthPackage") + + // 用户表 + query = query.Preload("UserDoctor.User", func(db *gorm.DB) *gorm.DB { + return db.Omit("user_password", "salt") + }) + + // 手机号 + if req.Mobile != "" { + // 医生 + doctorUserSubQuery := global.Db.Model(&model.User{}). + Select("user_id"). + Where("mobile = ?", req.Mobile) + + doctorSubQuery := global.Db.Model(&model.UserDoctor{}). + Select("doctor_id"). + Where(gorm.Expr("user_id IN (?)", doctorUserSubQuery)) + + query = query.Where("doctor_id IN (?)", doctorSubQuery) + } + + // 医生姓名 + if req.DoctorName != "" { + subQuery := global.Db.Model(&model.UserDoctor{}). + Select("doctor_id"). + Where("user_name LIKE ?", "%"+req.DoctorName+"%") + + query = query.Where("doctor_id IN (?)", subQuery) + } + + // 排序 + 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/DoctorConfigHealthPackage.go b/api/dto/DoctorConfigHealthPackage.go new file mode 100644 index 0000000..ad8175c --- /dev/null +++ b/api/dto/DoctorConfigHealthPackage.go @@ -0,0 +1,93 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +// DoctorConfigHealthPackageDto 医生配置-健康包 +type DoctorConfigHealthPackageDto struct { + HealthPackageId string `json:"health_package_id"` // 主键id + DoctorId string `json:"doctor_id"` // 医生id + PackageId string `json:"package_id"` // 健康包配置id + ServicePrice float64 `json:"service_price"` // 服务价格(根据图文问诊价格计算) + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 + HealthPackage *HealthPackageDto `json:"health_package"` // 健康包 + UserDoctor *UserDoctorDto `json:"user_doctor"` // 医生数据 + DoctorInquiryConfig *DoctorInquiryConfigDto `json:"doctor_inquiry_config"` // 医生问诊配置数据 +} + +func GetDoctorConfigHealthPackageDto(m *model.DoctorConfigHealthPackage) *DoctorConfigHealthPackageDto { + return &DoctorConfigHealthPackageDto{ + HealthPackageId: fmt.Sprintf("%d", m.HealthPackageId), + DoctorId: fmt.Sprintf("%d", m.DoctorId), + PackageId: fmt.Sprintf("%d", m.PackageId), + ServicePrice: m.ServicePrice, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +func GetDoctorConfigHealthPackageListDto(m []*model.DoctorConfigHealthPackage) []*DoctorConfigHealthPackageDto { + // 处理返回值 + responses := make([]*DoctorConfigHealthPackageDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &DoctorConfigHealthPackageDto{ + HealthPackageId: fmt.Sprintf("%d", v.HealthPackageId), + DoctorId: fmt.Sprintf("%d", v.DoctorId), + PackageId: fmt.Sprintf("%d", v.PackageId), + ServicePrice: v.ServicePrice, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + if v.HealthPackage != nil { + response.LoadHealthPackage(v.HealthPackage) + } + + if v.UserDoctor != nil { + response.LoadUserDoctor(v.UserDoctor) + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} + +// LoadHealthPackage 加载健康包 +func (r *DoctorConfigHealthPackageDto) LoadHealthPackage(m *model.HealthPackage) *DoctorConfigHealthPackageDto { + if m != nil { + r.HealthPackage = GetHealthPackageDto(m) + } + return r +} + +// LoadUserDoctor 加载医生数据 +func (r *DoctorConfigHealthPackageDto) LoadUserDoctor(m *model.UserDoctor) *DoctorConfigHealthPackageDto { + if m != nil { + r.UserDoctor = GetUserDoctorDto(m) + } + return r +} + +// LoadUserDoctorHospital 加载医生医院数据 +func (r *DoctorConfigHealthPackageDto) LoadUserDoctorHospital(m *model.Hospital) *DoctorConfigHealthPackageDto { + if m != nil && r.UserDoctor != nil { + r.UserDoctor.Hospital = GetHospitalDto(m) + } + return r +} + +// LoadDoctorInquiryConfig 加载医生问诊配置 +func (r *DoctorConfigHealthPackageDto) LoadDoctorInquiryConfig(m *model.DoctorInquiryConfig) *DoctorConfigHealthPackageDto { + if m != nil { + r.DoctorInquiryConfig = GetDoctorInquiryConfigDto(m) + } + return r +} diff --git a/api/dto/DoctotInquiryConfig.go b/api/dto/DoctotInquiryConfig.go index 813834e..0f7ad32 100644 --- a/api/dto/DoctotInquiryConfig.go +++ b/api/dto/DoctotInquiryConfig.go @@ -36,7 +36,7 @@ func GetDoctorInquiryConfigDto(m *model.DoctorInquiryConfig) *DoctorInquiryConfi IsEnable: m.IsEnable, LastEnableMethod: m.LastEnableMethod, WorkNumDay: m.WorkNumDay, - InquiryPrice: m.InquiryPrice, + InquiryPrice: *m.InquiryPrice, CreatedAt: m.CreatedAt, UpdatedAt: m.UpdatedAt, } @@ -56,7 +56,7 @@ func GetDoctorInquiryConfigListDto(m []*model.DoctorInquiryConfig) []*DoctorInqu IsEnable: v.IsEnable, LastEnableMethod: v.LastEnableMethod, WorkNumDay: v.WorkNumDay, - InquiryPrice: v.InquiryPrice, + InquiryPrice: *v.InquiryPrice, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, } diff --git a/api/model/doctorConfigHealthPackage.go b/api/model/doctorConfigHealthPackage.go index 015fac3..bcbf840 100644 --- a/api/model/doctorConfigHealthPackage.go +++ b/api/model/doctorConfigHealthPackage.go @@ -13,6 +13,8 @@ type DoctorConfigHealthPackage struct { PackageId int64 `gorm:"column:package_id;type:bigint(19);comment:健康包配置id;NOT NULL" json:"package_id"` ServicePrice float64 `gorm:"column:service_price;type:decimal(10,2);comment:服务价格(根据图文问诊价格计算)" json:"service_price"` Model + UserDoctor *UserDoctor `gorm:"foreignKey:DoctorId;references:doctor_id" json:"user_doctor"` // 医生 + HealthPackage *HealthPackage `gorm:"foreignKey:PackageId;references:package_id" json:"health_package"` } func (m *DoctorConfigHealthPackage) TableName() string { diff --git a/api/model/doctorInquiryConfig.go b/api/model/doctorInquiryConfig.go index 22ac040..75042d5 100644 --- a/api/model/doctorInquiryConfig.go +++ b/api/model/doctorInquiryConfig.go @@ -15,7 +15,7 @@ type DoctorInquiryConfig struct { IsEnable int `gorm:"column:is_enable;type:tinyint(1);default:0;comment:是否启用(0:否 1:是)" json:"is_enable"` LastEnableMethod int `gorm:"column:last_enable_method;type:tinyint(1);default:1;comment:最后开启方式(1:自己 2:后台)" json:"last_enable_method"` WorkNumDay int `gorm:"column:work_num_day;type:int(10);default:0;comment:每日接诊数量" json:"work_num_day"` - InquiryPrice float64 `gorm:"column:inquiry_price;type:decimal(10,2);comment:接诊价格(专家问诊-公益问诊)" json:"inquiry_price"` + InquiryPrice *float64 `gorm:"column:inquiry_price;type:decimal(10,2);comment:接诊价格(专家问诊-公益问诊)" json:"inquiry_price"` UserDoctor *UserDoctor `gorm:"foreignKey:DoctorId;references:doctor_id" json:"user_doctor"` // 医生 Model } diff --git a/api/requests/doctorConfigHealthPackage.go b/api/requests/doctorConfigHealthPackage.go new file mode 100644 index 0000000..ad42246 --- /dev/null +++ b/api/requests/doctorConfigHealthPackage.go @@ -0,0 +1,30 @@ +package requests + +type DoctorConfigHealthPackageRequest struct { + GetDoctorHealthPage // 获取医生账户列表-分页 + PutDoctorHealth // 修改医生健康包配置 + AddDoctorHealth // 新增医生健康包配置 +} + +// GetDoctorHealthPage 获取医生账户列表-分页 +type GetDoctorHealthPage struct { + Page int `json:"page" form:"page" label:"页码"` + PageSize int `json:"page_size" form:"page_size" label:"每页个数"` + Mobile string `json:"mobile" form:"mobile" label:"手机号"` + DoctorName string `json:"doctor_name" form:"doctor_name" label:"医生姓名"` +} + +// PutDoctorHealth 修改医生健康包配置 +type PutDoctorHealth struct { + PackageId string `json:"package_id" form:"package_id" label:"健康包配置id" validate:"required"` + ServicePrice string `json:"service_price" form:"service_price" label:"服务价格" validate:"required,min=1"` + IsEnable int `json:"is_enable" form:"is_enable" validate:"oneof=0 1" label:"是否启用"` // 0:否 1:是 +} + +// AddDoctorHealth 新增医生健康包配置 +type AddDoctorHealth struct { + DoctorId string `json:"doctor_id" form:"doctor_id" label:"医生id" validate:"required"` + PackageId string `json:"package_id" form:"package_id" label:"健康包配置id" validate:"required"` + ServicePrice string `json:"service_price" form:"service_price" label:"服务价格" validate:"required,min=1"` + IsEnable int `json:"is_enable" form:"is_enable" validate:"oneof=0 1" label:"是否启用"` // 0:否 1:是 +} diff --git a/api/router/router.go b/api/router/router.go index 4da6f99..b2e6acd 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -526,6 +526,22 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 新增医生问诊配置 doctorGroup.POST("", api.InquiryConfig.AddDoctorInquiryConfig) + + // 医生健康包配置 + healthGroup := doctorGroup.Group("/health") + { + // 获取开启健康包服务的医生-分页 + healthGroup.GET("", api.DoctorConfigHealthPackage.GetDoctorHealthPage) + + // 医生健康包配置详情 + healthGroup.GET("/:health_package_id", api.DoctorConfigHealthPackage.GetDoctorHealth) + + // 修改医生健康包配置 + healthGroup.PUT("/:health_package_id", api.DoctorConfigHealthPackage.PutDoctorHealth) + + // 新增医生健康包配置 + healthGroup.POST("", api.DoctorConfigHealthPackage.AddDoctorHealth) + } } // 系统问诊配置 diff --git a/api/service/InquiryConfig.go b/api/service/InquiryConfig.go index dc38526..a395902 100644 --- a/api/service/InquiryConfig.go +++ b/api/service/InquiryConfig.go @@ -70,7 +70,7 @@ func (r *DoctorInquiryConfigService) HandleDoctorInquiryConfig(tx *gorm.DB, doct IsEnable: isEnable, LastEnableMethod: 2, WorkNumDay: workNumDay, - InquiryPrice: inquiryPrice, + InquiryPrice: &inquiryPrice, } adminUser, _ := doctorInquiryConfigDao.AddDoctorInquiryConfig(tx, m) @@ -89,7 +89,7 @@ func (r *DoctorInquiryConfigService) HandleDoctorInquiryConfig(tx *gorm.DB, doct data["work_num_day"] = workNumDay } - if d.InquiryPrice != inquiryPrice { + if d.InquiryPrice != &inquiryPrice { data["inquiry_price"] = inquiryPrice } @@ -286,7 +286,7 @@ func (r *DoctorInquiryConfigService) PutDoctorInquiryConfig(inquiryConfigId int6 doctorInquiryConfigData["work_num_day"] = req.WorkNumDay } - if req.InquiryPrice != doctorInquiryConfig.InquiryPrice { + if req.InquiryPrice != *doctorInquiryConfig.InquiryPrice { doctorInquiryConfigData["inquiry_price"] = req.InquiryPrice } @@ -500,7 +500,7 @@ func (r *DoctorInquiryConfigService) AddDoctorInquiryConfig(req requests.AddDoct IsEnable: req.IsEnable, LastEnableMethod: 2, WorkNumDay: req.WorkNumDay, - InquiryPrice: req.InquiryPrice, + InquiryPrice: &req.InquiryPrice, } doctorInquiryConfig, err = doctorInquiryConfigDao.AddDoctorInquiryConfig(tx, doctorInquiryConfig) diff --git a/api/service/doctorConfigHealthPackage.go b/api/service/doctorConfigHealthPackage.go new file mode 100644 index 0000000..f1d6e72 --- /dev/null +++ b/api/service/doctorConfigHealthPackage.go @@ -0,0 +1,267 @@ +package service + +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/global" + "strconv" +) + +type DoctorConfigHealthPackageService struct { +} + +// GetDoctorHealth 医生健康包配置详情 +func (r *DoctorConfigHealthPackageService) GetDoctorHealth(healthPackageId int64) (res *dto.DoctorConfigHealthPackageDto, err error) { + doctorConfigHealthPackageDao := dao.DoctorConfigHealthPackageDao{} + + doctorConfigHealthPackage, err := doctorConfigHealthPackageDao.GetDoctorConfigHealthPackageById(healthPackageId) + if err != nil || doctorConfigHealthPackage == nil { + return nil, errors.New("获取失败") + } + + // 获取医生数据 + userDoctorDao := dao.UserDoctorDao{} + userDoctor, err := userDoctorDao.GetUserDoctorById(doctorConfigHealthPackage.DoctorId) + if err != nil || userDoctor == nil { + return nil, errors.New("获取失败") + } + + // 获取服务包数据 + healthPackageDao := dao.HealthPackageDao{} + healthPackage, err := healthPackageDao.GetHealthPackageById(doctorConfigHealthPackage.PackageId) + if err != nil || healthPackage == nil { + return nil, errors.New("获取失败") + } + + // 获取医生医院数据 + hospitalDao := dao.HospitalDao{} + hospital, err := hospitalDao.GetHospitalById(userDoctor.HospitalID) + + // 获取医生问诊配置 + doctorInquiryConfigDao := dao.DoctorInquiryConfigDao{} + maps := make(map[string]interface{}) + maps["doctor_id"] = doctorConfigHealthPackage.DoctorId + maps["inquiry_type"] = 1 + maps["inquiry_mode"] = 8 + doctorInquiryConfig, err := doctorInquiryConfigDao.GetDoctorInquiryConfig(maps) + if err != nil { + return nil, errors.New("获取失败") + } + + // 处理返回值 + res = dto.GetDoctorConfigHealthPackageDto(doctorConfigHealthPackage) + + // 加载医生数据 + res.LoadUserDoctor(userDoctor) + + // 加载医生医院 + if hospital != nil { + res.LoadUserDoctorHospital(hospital) + } + + // 获取医生问诊配置 + res.LoadDoctorInquiryConfig(doctorInquiryConfig) + + return res, nil +} + +// PutDoctorHealth 修改医生健康包配置 +func (r *DoctorConfigHealthPackageService) PutDoctorHealth(healthPackageId int64, req requests.PutDoctorHealth) (bool, error) { + doctorConfigHealthPackageDao := dao.DoctorConfigHealthPackageDao{} + + doctorConfigHealthPackage, err := doctorConfigHealthPackageDao.GetDoctorConfigHealthPackageById(healthPackageId) + if err != nil || doctorConfigHealthPackage == nil { + return false, errors.New("修改失败") + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + doctorConfigHealthPackageData := make(map[string]interface{}) + + // 将 id 转换为 int64 类型 + packageId, err := strconv.ParseInt(req.PackageId, 10, 64) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + + if packageId != doctorConfigHealthPackage.PackageId { + doctorConfigHealthPackageData["package_id"] = packageId + } + + servicePrice, err := strconv.ParseFloat(req.ServicePrice, 64) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + + if servicePrice != doctorConfigHealthPackage.ServicePrice { + doctorConfigHealthPackageData["service_price"] = servicePrice + } + + if len(doctorConfigHealthPackageData) > 0 { + err := doctorConfigHealthPackageDao.EditDoctorConfigHealthPackageById(tx, healthPackageId, doctorConfigHealthPackageData) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + } + + // 处理问诊配置 + // 获取医生问诊配置 + doctorInquiryConfigDao := dao.DoctorInquiryConfigDao{} + maps := make(map[string]interface{}) + maps["doctor_id"] = doctorConfigHealthPackage.DoctorId + maps["inquiry_type"] = 1 + maps["inquiry_mode"] = 8 + doctorInquiryConfig, _ := doctorInquiryConfigDao.GetDoctorInquiryConfig(maps) + if doctorInquiryConfig == nil { + // 新增医生问诊配置 + doctorInquiryConfig = &model.DoctorInquiryConfig{ + DoctorId: doctorConfigHealthPackage.DoctorId, + InquiryType: 1, + InquiryMode: 8, + IsEnable: req.IsEnable, + LastEnableMethod: 2, + WorkNumDay: 0, + InquiryPrice: nil, + } + + doctorInquiryConfig, err = doctorInquiryConfigDao.AddDoctorInquiryConfig(tx, doctorInquiryConfig) + if err != nil || doctorInquiryConfig == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + } else { + // 修改医生问诊配置 + doctorInquiryConfigData := make(map[string]interface{}) + if req.IsEnable != doctorInquiryConfig.IsEnable { + doctorInquiryConfigData["is_enable"] = req.IsEnable + if req.IsEnable == 1 { + doctorInquiryConfigData["last_enable_method"] = 2 + } + } + + if len(doctorInquiryConfigData) > 0 { + err = doctorInquiryConfigDao.EditDoctorInquiryConfigById(tx, doctorInquiryConfig.InquiryConfigId, doctorInquiryConfigData) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + } + } + + tx.Commit() + return true, nil +} + +// AddDoctorHealth 新增医生健康包配置 +func (r *DoctorConfigHealthPackageService) AddDoctorHealth(req requests.AddDoctorHealth) (bool, error) { + // 将 id 转换为 int64 类型 + packageId, err := strconv.ParseInt(req.PackageId, 10, 64) + if err != nil { + return false, errors.New("修改失败") + } + + doctorId, err := strconv.ParseInt(req.DoctorId, 10, 64) + if err != nil { + return false, errors.New("修改失败") + } + + // 获取医生数据 + userDoctorDao := dao.UserDoctorDao{} + userDoctor, err := userDoctorDao.GetUserDoctorById(doctorId) + if err != nil || userDoctor == nil { + return false, errors.New("医生错误") + } + + doctorConfigHealthPackageDao := dao.DoctorConfigHealthPackageDao{} + + maps := make(map[string]interface{}) + maps["doctor_id"] = doctorId + doctorConfigHealthPackage, err := doctorConfigHealthPackageDao.GetDoctorConfigHealthPackage(maps) + if doctorConfigHealthPackage != nil { + return false, errors.New("该医生存在健康包配置,请勿重复添加") + } + + // 获取健康包配置 + healthPackageDao := dao.HealthPackageDao{} + healthPackage, err := healthPackageDao.GetHealthPackagePreloadById(packageId) + if err != nil { + return false, errors.New("健康包错误") + } + + // 获取专家图文问诊价格 + maps = make(map[string]interface{}) + maps["doctor_id"] = req.DoctorId + maps["inquiry_type"] = 1 + maps["inquiry_mode"] = 1 + + doctorInquiryConfigDao := dao.DoctorInquiryConfigDao{} + doctorInquiryConfig, err := doctorInquiryConfigDao.GetDoctorInquiryConfig(maps) + if err != nil && req.IsEnable == 1 { + return false, errors.New("本服务需设置图文问诊的价格,才可开启") + } + + // 价格计算 + // 重新价格计算(专家图文问诊价格*费率+30盒35元的干爽颗粒) + serviceRate, err := strconv.ParseFloat(healthPackage.ServiceRate, 64) + if err != nil { + return false, errors.New("修改失败") + } + + inquiryPrice := *doctorInquiryConfig.InquiryPrice + servicePrice := inquiryPrice*serviceRate/100*6 + healthPackage.DiscountProductTotalAmount + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 创建医生健康包 + doctorConfigHealthPackage = &model.DoctorConfigHealthPackage{ + DoctorId: doctorId, + PackageId: packageId, + ServicePrice: servicePrice, + } + + doctorConfigHealthPackage, err = doctorConfigHealthPackageDao.AddDoctorConfigHealthPackage(tx, doctorConfigHealthPackage) + if err != nil || doctorConfigHealthPackage == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + // 增加医生问诊配置 + if req.IsEnable == 1 { + doctorInquiryConfig = &model.DoctorInquiryConfig{ + DoctorId: doctorId, + InquiryType: 1, + InquiryMode: 8, + IsEnable: req.IsEnable, + LastEnableMethod: 2, + WorkNumDay: 0, + InquiryPrice: nil, + } + + doctorInquiryConfig, err = doctorInquiryConfigDao.AddDoctorInquiryConfig(tx, doctorInquiryConfig) + if err != nil || doctorInquiryConfig == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + } + + tx.Commit() + return true, nil +} From d108f9b94845d203b130c0853ec4340a176a7159 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 5 Jun 2024 11:01:18 +0800 Subject: [PATCH 35/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=20=E5=8C=BB?= =?UTF-8?q?=E7=94=9F=E5=81=A5=E5=BA=B7=E5=8C=85=E9=85=8D=E7=BD=AE1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/doctorConfigHealthPackage.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/api/service/doctorConfigHealthPackage.go b/api/service/doctorConfigHealthPackage.go index f1d6e72..cb8615a 100644 --- a/api/service/doctorConfigHealthPackage.go +++ b/api/service/doctorConfigHealthPackage.go @@ -62,6 +62,10 @@ func (r *DoctorConfigHealthPackageService) GetDoctorHealth(healthPackageId int64 res.LoadUserDoctorHospital(hospital) } + if healthPackage != nil { + res.LoadHealthPackage(healthPackage) + } + // 获取医生问诊配置 res.LoadDoctorInquiryConfig(doctorInquiryConfig) From 6c65e3cb3d01f77a1d89588920ae100ac460b171 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 5 Jun 2024 11:45:41 +0800 Subject: [PATCH 36/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BC=98=E6=83=A0?= =?UTF-8?q?=E5=8D=B7=E6=97=B6=E9=97=B4=E6=88=B3=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/coupon.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/service/coupon.go b/api/service/coupon.go index 414a32a..c88cb69 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -174,7 +174,7 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err // 时间区间 if req.ValidStartTime != nil { - t, err := time.Parse("2006-01-02", *req.ValidStartTime) + t, err := time.Parse("2006-01-02 15:04:05", *req.ValidStartTime) if err != nil { tx.Rollback() return false, errors.New("新增失败") @@ -186,7 +186,7 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err } if req.ValidEndTime != nil { - t, err := time.Parse("2006-01-02", *req.ValidEndTime) + t, err := time.Parse("2006-01-02 15:04:05", *req.ValidEndTime) if err != nil { tx.Rollback() return false, errors.New("新增失败") From eab9e413f71bd967db7d378754c735a64f90e50e Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 5 Jun 2024 13:51:32 +0800 Subject: [PATCH 37/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E5=8C=BB?= =?UTF-8?q?=E7=94=9F=E9=9A=8F=E8=AE=BF=E5=8C=85=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/base.go | 1 + api/controller/doctorConfigFollowPackage.go | 159 +++++++++ api/controller/doctorConfigHealthPackage.go | 9 +- api/dao/doctorConfigFollowPackage.go | 131 +++++++ api/dao/doctorConfigFollowPackageItem.go | 54 +++ api/dto/DoctorConfigFollowPackage.go | 89 +++++ api/dto/DoctorConfigFollowPackageItem.go | 50 +++ api/dto/DoctotInquiryConfig.go | 6 +- api/model/doctorConfigFollowPackage.go | 2 + api/requests/DoctorConfigFollowPackageItem.go | 10 + api/requests/doctorConfigFollowPackage.go | 32 ++ api/requests/doctorConfigHealthPackage.go | 4 +- api/router/router.go | 16 + api/service/doctorConfigFollowPackage.go | 326 ++++++++++++++++++ 14 files changed, 878 insertions(+), 11 deletions(-) create mode 100644 api/controller/doctorConfigFollowPackage.go create mode 100644 api/dao/doctorConfigFollowPackage.go create mode 100644 api/dao/doctorConfigFollowPackageItem.go create mode 100644 api/dto/DoctorConfigFollowPackage.go create mode 100644 api/dto/DoctorConfigFollowPackageItem.go create mode 100644 api/requests/DoctorConfigFollowPackageItem.go create mode 100644 api/requests/doctorConfigFollowPackage.go create mode 100644 api/service/doctorConfigFollowPackage.go diff --git a/api/controller/base.go b/api/controller/base.go index 6255c85..0b9e332 100644 --- a/api/controller/base.go +++ b/api/controller/base.go @@ -73,6 +73,7 @@ type inquiryManage struct { InquiryConfig // 问诊配置 HealthPackage // 系统健康包配置 DoctorConfigHealthPackage // 医生健康包配置 + DoctorConfigFollowPackage // 医生随访包配置 } // ca管理 diff --git a/api/controller/doctorConfigFollowPackage.go b/api/controller/doctorConfigFollowPackage.go new file mode 100644 index 0000000..5d5f658 --- /dev/null +++ b/api/controller/doctorConfigFollowPackage.go @@ -0,0 +1,159 @@ +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 DoctorConfigFollowPackage struct{} + +// GetDoctorFollowPage 获取开启随访包服务的医生-分页 +func (r *DoctorConfigFollowPackage) GetDoctorFollowPage(c *gin.Context) { + DoctorConfigFollowPackageRequest := requests.DoctorConfigFollowPackageRequest{} + req := DoctorConfigFollowPackageRequest.GetDoctorFollowPage + 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 + } + + doctorConfigFollowPackageDao := dao.DoctorConfigFollowPackageDao{} + DoctorConfigFollowPackage, total, err := doctorConfigFollowPackageDao.GetDoctorFollowPageSearch(req, req.Page, req.PageSize) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + res := dto.GetDoctorConfigFollowPackageListDto(DoctorConfigFollowPackage) + + doctorInquiryConfigDao := dao.DoctorInquiryConfigDao{} + for _, v := range res { + maps := make(map[string]interface{}) + maps["doctor_id"] = v.DoctorId + maps["inquiry_type"] = 1 + maps["inquiry_mode"] = 9 + doctorInquiryConfig, _ := doctorInquiryConfigDao.GetDoctorInquiryConfig(maps) + if doctorInquiryConfig != nil { + v.LoadDoctorInquiryConfig(doctorInquiryConfig) + } + } + + result := make(map[string]interface{}) + result["page"] = req.Page + result["page_size"] = req.PageSize + result["total"] = total + result["data"] = res + responses.OkWithData(result, c) +} + +// GetDoctorFollow 医生随访包配置详情 +func (r *DoctorConfigFollowPackage) GetDoctorFollow(c *gin.Context) { + id := c.Param("follow_package_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + followPackageId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + DoctorConfigFollowPackageService := service.DoctorConfigFollowPackageService{} + getUserDoctorResponses, err := DoctorConfigFollowPackageService.GetDoctorFollow(followPackageId) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(getUserDoctorResponses, c) +} + +// PutDoctorFollow 修改医生随访包配置 +func (r *DoctorConfigFollowPackage) PutDoctorFollow(c *gin.Context) { + DoctorConfigFollowPackageRequest := requests.DoctorConfigFollowPackageRequest{} + req := DoctorConfigFollowPackageRequest.PutDoctorFollow + 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 := c.Param("follow_package_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + followPackageId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + DoctorConfigFollowPackageService := service.DoctorConfigFollowPackageService{} + _, err = DoctorConfigFollowPackageService.PutDoctorFollow(followPackageId, req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} + +// AddDoctorFollow 新增医生随访包配置 +func (r *DoctorConfigFollowPackage) AddDoctorFollow(c *gin.Context) { + DoctorConfigFollowPackageRequest := requests.DoctorConfigFollowPackageRequest{} + req := DoctorConfigFollowPackageRequest.AddDoctorFollow + 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 + } + + // 业务处理 + DoctorConfigFollowPackageService := service.DoctorConfigFollowPackageService{} + _, err := DoctorConfigFollowPackageService.AddDoctorFollow(req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} diff --git a/api/controller/doctorConfigHealthPackage.go b/api/controller/doctorConfigHealthPackage.go index da578d3..cbcad42 100644 --- a/api/controller/doctorConfigHealthPackage.go +++ b/api/controller/doctorConfigHealthPackage.go @@ -53,13 +53,10 @@ func (r *DoctorConfigHealthPackage) GetDoctorHealthPage(c *gin.Context) { maps["doctor_id"] = v.DoctorId maps["inquiry_type"] = 1 maps["inquiry_mode"] = 8 - doctorInquiryConfig, err := doctorInquiryConfigDao.GetDoctorInquiryConfig(maps) - if err != nil { - responses.FailWithMessage(err.Error(), c) - return + doctorInquiryConfig, _ := doctorInquiryConfigDao.GetDoctorInquiryConfig(maps) + if doctorInquiryConfig != nil { + v.LoadDoctorInquiryConfig(doctorInquiryConfig) } - - v.LoadDoctorInquiryConfig(doctorInquiryConfig) } result := make(map[string]interface{}) diff --git a/api/dao/doctorConfigFollowPackage.go b/api/dao/doctorConfigFollowPackage.go new file mode 100644 index 0000000..654559b --- /dev/null +++ b/api/dao/doctorConfigFollowPackage.go @@ -0,0 +1,131 @@ +package dao + +import ( + "gorm.io/gorm" + "hospital-admin-api/api/model" + "hospital-admin-api/api/requests" + "hospital-admin-api/global" +) + +type DoctorConfigFollowPackageDao struct { +} + +// GetDoctorConfigFollowPackageListByDoctorId 获取列表-医生id +func (r *DoctorConfigFollowPackageDao) GetDoctorConfigFollowPackageListByDoctorId(doctorId int64) (m []*model.DoctorConfigFollowPackage, err error) { + err = global.Db.Where("doctor_id = ?", doctorId).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetDoctorConfigFollowPackageById 获取医生随访包配置数据-id +func (r *DoctorConfigFollowPackageDao) GetDoctorConfigFollowPackageById(followPackageId int64) (m *model.DoctorConfigFollowPackage, err error) { + err = global.Db.First(&m, followPackageId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteDoctorConfigFollowPackage 删除医生随访包配置 +func (r *DoctorConfigFollowPackageDao) DeleteDoctorConfigFollowPackage(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.DoctorConfigFollowPackage{}).Error + if err != nil { + return err + } + return nil +} + +// EditDoctorConfigFollowPackageById 修改医生随访包配置-随访包配置id +func (r *DoctorConfigFollowPackageDao) EditDoctorConfigFollowPackageById(tx *gorm.DB, followPackageId int64, data interface{}) error { + err := tx.Model(&model.DoctorConfigFollowPackage{}).Where("follow_package_id = ?", followPackageId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetDoctorConfigFollowPackageList 获取医生随访包配置列表 +func (r *DoctorConfigFollowPackageDao) GetDoctorConfigFollowPackageList(maps interface{}) (m []*model.DoctorConfigFollowPackage, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddDoctorConfigFollowPackage 新增医生随访包配置 +func (r *DoctorConfigFollowPackageDao) AddDoctorConfigFollowPackage(tx *gorm.DB, model *model.DoctorConfigFollowPackage) (*model.DoctorConfigFollowPackage, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} + +// GetDoctorConfigFollowPackage 获取医生随访包配置 +func (r *DoctorConfigFollowPackageDao) GetDoctorConfigFollowPackage(maps interface{}) (m *model.DoctorConfigFollowPackage, err error) { + err = global.Db.Where(maps).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetDoctorFollowPageSearch 获取开启随访包服务的医生-分页 +func (r *DoctorConfigFollowPackageDao) GetDoctorFollowPageSearch(req requests.GetDoctorFollowPage, page, pageSize int) (m []*model.DoctorConfigFollowPackage, total int64, err error) { + var totalRecords int64 + + // 构建查询条件 + query := global.Db.Model(&model.DoctorConfigFollowPackage{}) + + // 医生 + query = query.Preload("UserDoctor", func(db *gorm.DB) *gorm.DB { + return db.Omit("open_id", "union_id", "wx_session_key") + }) + + // 明细 + query = query.Preload("DoctorConfigFollowPackageItem") + + // 用户表 + query = query.Preload("UserDoctor.User", func(db *gorm.DB) *gorm.DB { + return db.Omit("user_password", "salt") + }) + + // 手机号 + if req.Mobile != "" { + // 医生 + doctorUserSubQuery := global.Db.Model(&model.User{}). + Select("user_id"). + Where("mobile = ?", req.Mobile) + + doctorSubQuery := global.Db.Model(&model.UserDoctor{}). + Select("doctor_id"). + Where(gorm.Expr("user_id IN (?)", doctorUserSubQuery)) + + query = query.Where("doctor_id IN (?)", doctorSubQuery) + } + + // 医生姓名 + if req.DoctorName != "" { + subQuery := global.Db.Model(&model.UserDoctor{}). + Select("doctor_id"). + Where("user_name LIKE ?", "%"+req.DoctorName+"%") + + query = query.Where("doctor_id IN (?)", subQuery) + } + + // 排序 + 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/doctorConfigFollowPackageItem.go b/api/dao/doctorConfigFollowPackageItem.go new file mode 100644 index 0000000..27416b3 --- /dev/null +++ b/api/dao/doctorConfigFollowPackageItem.go @@ -0,0 +1,54 @@ +package dao + +import ( + "gorm.io/gorm" + "hospital-admin-api/api/model" + "hospital-admin-api/global" +) + +type DoctorConfigFollowPackageItemDao struct { +} + +// GetDoctorConfigFollowPackageItemListByFollowPackageId 获取列表-id +func (r *DoctorConfigFollowPackageItemDao) GetDoctorConfigFollowPackageItemListByFollowPackageId(followPackageId int64) (m []*model.DoctorConfigFollowPackageItem, err error) { + err = global.Db.Where("follow_package_id = ?", followPackageId).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// DeleteDoctorConfigFollowPackageItem 删除医生随访包列表配置 +func (r *DoctorConfigFollowPackageItemDao) DeleteDoctorConfigFollowPackageItem(tx *gorm.DB, maps interface{}) error { + err := tx.Where(maps).Delete(&model.DoctorConfigFollowPackageItem{}).Error + if err != nil { + return err + } + return nil +} + +// EditDoctorConfigFollowPackageItemById 修改医生随访包列表配置-随访包列表配置id +func (r *DoctorConfigFollowPackageItemDao) EditDoctorConfigFollowPackageItemById(tx *gorm.DB, followPackageItemId int64, data interface{}) error { + err := tx.Model(&model.DoctorConfigFollowPackageItem{}).Where("follow_package_item_id = ?", followPackageItemId).Updates(data).Error + if err != nil { + return err + } + return nil +} + +// GetDoctorConfigFollowPackageItemList 获取医生随访包列表配置列表 +func (r *DoctorConfigFollowPackageItemDao) GetDoctorConfigFollowPackageItemList(maps interface{}) (m []*model.DoctorConfigFollowPackageItem, err error) { + err = global.Db.Where(maps).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + +// AddDoctorConfigFollowPackageItem 新增医生随访包列表配置 +func (r *DoctorConfigFollowPackageItemDao) AddDoctorConfigFollowPackageItem(tx *gorm.DB, model *model.DoctorConfigFollowPackageItem) (*model.DoctorConfigFollowPackageItem, error) { + if err := tx.Create(model).Error; err != nil { + return nil, err + } + return model, nil +} diff --git a/api/dto/DoctorConfigFollowPackage.go b/api/dto/DoctorConfigFollowPackage.go new file mode 100644 index 0000000..a832138 --- /dev/null +++ b/api/dto/DoctorConfigFollowPackage.go @@ -0,0 +1,89 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +// DoctorConfigFollowPackageDto 医生配置-健康包 +type DoctorConfigFollowPackageDto struct { + FollowPackageId string `json:"follow_package_id"` // 主键id + DoctorId string `json:"doctor_id"` // 医生id + MonthlyFrequency int `json:"monthly_frequency"` // 每月次数(0表示不限次) + ServiceRounds int `json:"service_rounds"` // 服务回合数(0表示不限次) + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 + UserDoctor *UserDoctorDto `json:"user_doctor"` // 医生数据 + DoctorInquiryConfig *DoctorInquiryConfigDto `json:"doctor_inquiry_config"` // 医生问诊配置数据 + DoctorConfigFollowPackageItem []*DoctorConfigFollowPackageItemDto `json:"doctor_config_follow_package_item"` // 医生随访包配置明细数据 +} + +func GetDoctorConfigFollowPackageDto(m *model.DoctorConfigFollowPackage) *DoctorConfigFollowPackageDto { + return &DoctorConfigFollowPackageDto{ + FollowPackageId: fmt.Sprintf("%d", m.FollowPackageId), + DoctorId: fmt.Sprintf("%d", m.DoctorId), + MonthlyFrequency: m.MonthlyFrequency, + ServiceRounds: m.ServiceRounds, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +func GetDoctorConfigFollowPackageListDto(m []*model.DoctorConfigFollowPackage) []*DoctorConfigFollowPackageDto { + // 处理返回值 + responses := make([]*DoctorConfigFollowPackageDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &DoctorConfigFollowPackageDto{ + FollowPackageId: fmt.Sprintf("%d", v.FollowPackageId), + DoctorId: fmt.Sprintf("%d", v.DoctorId), + MonthlyFrequency: v.MonthlyFrequency, + ServiceRounds: v.ServiceRounds, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + if v.UserDoctor != nil { + response.LoadUserDoctor(v.UserDoctor) + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} + +// LoadUserDoctor 加载医生数据 +func (r *DoctorConfigFollowPackageDto) LoadUserDoctor(m *model.UserDoctor) *DoctorConfigFollowPackageDto { + if m != nil { + r.UserDoctor = GetUserDoctorDto(m) + } + return r +} + +// LoadUserDoctorHospital 加载医生医院数据 +func (r *DoctorConfigFollowPackageDto) LoadUserDoctorHospital(m *model.Hospital) *DoctorConfigFollowPackageDto { + if m != nil && r.UserDoctor != nil { + r.UserDoctor.Hospital = GetHospitalDto(m) + } + return r +} + +// LoadDoctorInquiryConfig 加载医生问诊配置 +func (r *DoctorConfigFollowPackageDto) LoadDoctorInquiryConfig(m *model.DoctorInquiryConfig) *DoctorConfigFollowPackageDto { + if m != nil { + r.DoctorInquiryConfig = GetDoctorInquiryConfigDto(m) + } + return r +} + +// LoadDoctorConfigFollowPackageItem 加载医生随访包列表配置 +func (r *DoctorConfigFollowPackageDto) LoadDoctorConfigFollowPackageItem(m []*model.DoctorConfigFollowPackageItem) *DoctorConfigFollowPackageDto { + if len(m) > 0 { + r.DoctorConfigFollowPackageItem = GetDoctorConfigFollowPackageItemListDto(m) + } + return r +} diff --git a/api/dto/DoctorConfigFollowPackageItem.go b/api/dto/DoctorConfigFollowPackageItem.go new file mode 100644 index 0000000..f5b2589 --- /dev/null +++ b/api/dto/DoctorConfigFollowPackageItem.go @@ -0,0 +1,50 @@ +package dto + +import ( + "fmt" + "hospital-admin-api/api/model" +) + +// DoctorConfigFollowPackageItemDto 医生配置-随访包-明细 +type DoctorConfigFollowPackageItemDto struct { + FollowPackageItemId string `json:"follow_package_item_id"` // 主键id + FollowPackageId string `json:"follow_package_id"` // 医生随访包id + ServicePeriod int `json:"service_period"` // 服务周期(天) + ServicePrice float64 `json:"service_price"` // 服务价格 + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 +} + +func GetDoctorConfigFollowPackageItemDto(m *model.DoctorConfigFollowPackageItem) *DoctorConfigFollowPackageItemDto { + return &DoctorConfigFollowPackageItemDto{ + FollowPackageItemId: fmt.Sprintf("%d", m.FollowPackageItemId), + FollowPackageId: fmt.Sprintf("%d", m.FollowPackageId), + ServicePeriod: m.ServicePeriod, + ServicePrice: m.ServicePrice, + CreatedAt: m.CreatedAt, + UpdatedAt: m.UpdatedAt, + } +} + +func GetDoctorConfigFollowPackageItemListDto(m []*model.DoctorConfigFollowPackageItem) []*DoctorConfigFollowPackageItemDto { + // 处理返回值 + responses := make([]*DoctorConfigFollowPackageItemDto, len(m)) + + if len(m) > 0 { + for i, v := range m { + response := &DoctorConfigFollowPackageItemDto{ + FollowPackageItemId: fmt.Sprintf("%d", v.FollowPackageItemId), + FollowPackageId: fmt.Sprintf("%d", v.FollowPackageId), + ServicePeriod: v.ServicePeriod, + ServicePrice: v.ServicePrice, + CreatedAt: v.CreatedAt, + UpdatedAt: v.UpdatedAt, + } + + // 将转换后的结构体添加到新切片中 + responses[i] = response + } + } + + return responses +} diff --git a/api/dto/DoctotInquiryConfig.go b/api/dto/DoctotInquiryConfig.go index 0f7ad32..d0ed406 100644 --- a/api/dto/DoctotInquiryConfig.go +++ b/api/dto/DoctotInquiryConfig.go @@ -14,7 +14,7 @@ type DoctorInquiryConfigDto struct { IsEnable int `json:"is_enable"` // 是否启用(0:否 1:是) LastEnableMethod int `json:"last_enable_method"` // 最后开启方式(1:自己 2:后台) WorkNumDay int `json:"work_num_day"` // 每日接诊数量 - InquiryPrice float64 `json:"inquiry_price"` // 接诊价格(专家问诊-公益问诊) + InquiryPrice *float64 `json:"inquiry_price"` // 接诊价格(专家问诊-公益问诊) CreatedAt model.LocalTime `json:"created_at"` // 创建时间 UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 DoctorName string `json:"doctor_name"` // 医生姓名 @@ -36,7 +36,7 @@ func GetDoctorInquiryConfigDto(m *model.DoctorInquiryConfig) *DoctorInquiryConfi IsEnable: m.IsEnable, LastEnableMethod: m.LastEnableMethod, WorkNumDay: m.WorkNumDay, - InquiryPrice: *m.InquiryPrice, + InquiryPrice: m.InquiryPrice, CreatedAt: m.CreatedAt, UpdatedAt: m.UpdatedAt, } @@ -56,7 +56,7 @@ func GetDoctorInquiryConfigListDto(m []*model.DoctorInquiryConfig) []*DoctorInqu IsEnable: v.IsEnable, LastEnableMethod: v.LastEnableMethod, WorkNumDay: v.WorkNumDay, - InquiryPrice: *v.InquiryPrice, + InquiryPrice: v.InquiryPrice, CreatedAt: v.CreatedAt, UpdatedAt: v.UpdatedAt, } diff --git a/api/model/doctorConfigFollowPackage.go b/api/model/doctorConfigFollowPackage.go index 5ef5460..d5d9ec6 100644 --- a/api/model/doctorConfigFollowPackage.go +++ b/api/model/doctorConfigFollowPackage.go @@ -13,6 +13,8 @@ type DoctorConfigFollowPackage struct { MonthlyFrequency int `gorm:"column:monthly_frequency;type:int(1);default:0;comment:每月次数(0表示不限次)" json:"monthly_frequency"` ServiceRounds int `gorm:"column:service_rounds;type:int(1);default:0;comment:服务回合数(0表示不限次)" json:"service_rounds"` Model + UserDoctor *UserDoctor `gorm:"foreignKey:DoctorId;references:doctor_id" json:"user_doctor"` // 医生 + DoctorConfigFollowPackageItem []*DoctorConfigFollowPackageItem `gorm:"foreignKey:FollowPackageId;references:follow_package_id" json:"doctor_config_follow_package_item"` // 明细 } func (m *DoctorConfigFollowPackage) TableName() string { diff --git a/api/requests/DoctorConfigFollowPackageItem.go b/api/requests/DoctorConfigFollowPackageItem.go new file mode 100644 index 0000000..fb62066 --- /dev/null +++ b/api/requests/DoctorConfigFollowPackageItem.go @@ -0,0 +1,10 @@ +package requests + +type DoctorConfigFollowPackageItemRequest struct { + DoctorConfigFollowPackageItem +} + +type DoctorConfigFollowPackageItem struct { + ServicePeriod int `json:"service_period" form:"service_period" label:"服务周期(天)" validate:"required"` + ServicePrice float64 `json:"service_price" form:"service_price" label:"服务价格" validate:"required,min=1"` // (0表示不限次) +} diff --git a/api/requests/doctorConfigFollowPackage.go b/api/requests/doctorConfigFollowPackage.go new file mode 100644 index 0000000..8493748 --- /dev/null +++ b/api/requests/doctorConfigFollowPackage.go @@ -0,0 +1,32 @@ +package requests + +type DoctorConfigFollowPackageRequest struct { + GetDoctorFollowPage // 获取医生健康包列表-分页 + PutDoctorFollow // 修改医生健康包配置 + AddDoctorFollow // 新增医生健康包配置 +} + +// GetDoctorFollowPage 获取医生健康包列表-分页 +type GetDoctorFollowPage struct { + Page int `json:"page" form:"page" label:"页码"` + PageSize int `json:"page_size" form:"page_size" label:"每页个数"` + Mobile string `json:"mobile" form:"mobile" label:"手机号"` + DoctorName string `json:"doctor_name" form:"doctor_name" label:"医生姓名"` +} + +// PutDoctorFollow 修改医生健康包配置 +type PutDoctorFollow struct { + MonthlyFrequency *int `json:"monthly_frequency" form:"monthly_frequency" label:"每月次数" validate:"required"` // (0表示不限次) + ServiceRounds *int `json:"service_rounds" form:"service_rounds" label:"服务回合数" validate:"required"` // (0表示不限次) + IsEnable *int `json:"is_enable" form:"is_enable" validate:"oneof=0 1" label:"是否启用" validate:"required"` // 0:否 1:是 + DoctorConfigFollowPackageItem []*DoctorConfigFollowPackageItem `json:"doctor_config_follow_package_item" form:"doctor_config_follow_package_item" label:"医生健康包明细" validate:"required"` // +} + +// AddDoctorFollow 新增医生健康包配置 +type AddDoctorFollow struct { + DoctorId string `json:"doctor_id" form:"doctor_id" label:"医生id" validate:"required"` + MonthlyFrequency *int `json:"monthly_frequency" form:"monthly_frequency" label:"每月次数" validate:"required"` // (0表示不限次) + ServiceRounds *int `json:"service_rounds" form:"service_rounds" label:"服务回合数" validate:"required"` // (0表示不限次) + IsEnable *int `json:"is_enable" form:"is_enable" validate:"oneof=0 1" label:"是否启用" validate:"required"` // 0:否 1:是 + DoctorConfigFollowPackageItem []*DoctorConfigFollowPackageItem `json:"doctor_config_follow_package_item" form:"doctor_config_follow_package_item" label:"医生健康包明细" validate:"required"` // +} diff --git a/api/requests/doctorConfigHealthPackage.go b/api/requests/doctorConfigHealthPackage.go index ad42246..e31b054 100644 --- a/api/requests/doctorConfigHealthPackage.go +++ b/api/requests/doctorConfigHealthPackage.go @@ -1,12 +1,12 @@ package requests type DoctorConfigHealthPackageRequest struct { - GetDoctorHealthPage // 获取医生账户列表-分页 + GetDoctorHealthPage // 获取医生健康包列表-分页 PutDoctorHealth // 修改医生健康包配置 AddDoctorHealth // 新增医生健康包配置 } -// GetDoctorHealthPage 获取医生账户列表-分页 +// GetDoctorHealthPage 获取医生健康包列表-分页 type GetDoctorHealthPage 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 b2e6acd..b53ea33 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -542,6 +542,22 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 新增医生健康包配置 healthGroup.POST("", api.DoctorConfigHealthPackage.AddDoctorHealth) } + + // 医生随访包配置 + followGroup := doctorGroup.Group("/follow") + { + // 获取开启随访包服务的医生-分页 + followGroup.GET("", api.DoctorConfigFollowPackage.GetDoctorFollowPage) + + // 医生随访包配置详情 + followGroup.GET("/:follow_package_id", api.DoctorConfigFollowPackage.GetDoctorFollow) + + // 修改医生随访包配置 + followGroup.PUT("/:follow_package_id", api.DoctorConfigFollowPackage.PutDoctorFollow) + + // 新增医生随访包配置 + followGroup.POST("", api.DoctorConfigFollowPackage.AddDoctorFollow) + } } // 系统问诊配置 diff --git a/api/service/doctorConfigFollowPackage.go b/api/service/doctorConfigFollowPackage.go new file mode 100644 index 0000000..b31394b --- /dev/null +++ b/api/service/doctorConfigFollowPackage.go @@ -0,0 +1,326 @@ +package service + +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/global" + "strconv" +) + +type DoctorConfigFollowPackageService struct { +} + +// GetDoctorFollow 医生随访包配置详情 +func (r *DoctorConfigFollowPackageService) GetDoctorFollow(followPackageId int64) (res *dto.DoctorConfigFollowPackageDto, err error) { + DoctorConfigFollowPackageDao := dao.DoctorConfigFollowPackageDao{} + + DoctorConfigFollowPackage, err := DoctorConfigFollowPackageDao.GetDoctorConfigFollowPackageById(followPackageId) + if err != nil || DoctorConfigFollowPackage == nil { + return nil, errors.New("获取失败") + } + + // 获取医生数据 + userDoctorDao := dao.UserDoctorDao{} + userDoctor, err := userDoctorDao.GetUserDoctorById(DoctorConfigFollowPackage.DoctorId) + if err != nil || userDoctor == nil { + return nil, errors.New("获取失败") + } + + // 获取医生医院数据 + hospitalDao := dao.HospitalDao{} + hospital, err := hospitalDao.GetHospitalById(userDoctor.HospitalID) + + // 获取随访包列表数据 + doctorConfigFollowPackageItemDao := dao.DoctorConfigFollowPackageItemDao{} + doctorConfigFollowPackageItem, err := doctorConfigFollowPackageItemDao.GetDoctorConfigFollowPackageItemListByFollowPackageId(DoctorConfigFollowPackage.FollowPackageId) + if err != nil || doctorConfigFollowPackageItem == nil { + return nil, errors.New("获取失败") + } + + // 获取医生问诊配置 + doctorInquiryConfigDao := dao.DoctorInquiryConfigDao{} + maps := make(map[string]interface{}) + maps["doctor_id"] = DoctorConfigFollowPackage.DoctorId + maps["inquiry_type"] = 1 + maps["inquiry_mode"] = 9 + doctorInquiryConfig, err := doctorInquiryConfigDao.GetDoctorInquiryConfig(maps) + if err != nil { + return nil, errors.New("获取失败") + } + + // 处理返回值 + res = dto.GetDoctorConfigFollowPackageDto(DoctorConfigFollowPackage) + + // 加载医生数据 + res.LoadUserDoctor(userDoctor) + + // 加载医生医院 + if hospital != nil { + res.LoadUserDoctorHospital(hospital) + } + + // 加载医生随访包列表配置 + res.LoadDoctorConfigFollowPackageItem(doctorConfigFollowPackageItem) + + // 获取医生问诊配置 + res.LoadDoctorInquiryConfig(doctorInquiryConfig) + + return res, nil +} + +// PutDoctorFollow 修改医生随访包配置 +func (r *DoctorConfigFollowPackageService) PutDoctorFollow(followPackageId int64, req requests.PutDoctorFollow) (bool, error) { + doctorConfigFollowPackageDao := dao.DoctorConfigFollowPackageDao{} + DoctorConfigFollowPackage, err := doctorConfigFollowPackageDao.GetDoctorConfigFollowPackageById(followPackageId) + if err != nil || DoctorConfigFollowPackage == nil { + return false, errors.New("修改失败") + } + + // 获取医生数据 + userDoctorDao := dao.UserDoctorDao{} + userDoctor, err := userDoctorDao.GetUserDoctorById(DoctorConfigFollowPackage.DoctorId) + if err != nil || userDoctor == nil { + return false, errors.New("医生错误") + } + + if userDoctor.IdcardStatus != 1 { + return false, errors.New("请先进行实名认证") + } + + if userDoctor.IdenAuthStatus != 1 { + return false, errors.New("请先进行身份认证") + } + + if userDoctor.IsBindBank != 1 { + return false, errors.New("请先进行绑定结算银行卡") + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + doctorConfigFollowPackageData := make(map[string]interface{}) + + if *req.MonthlyFrequency != DoctorConfigFollowPackage.MonthlyFrequency { + doctorConfigFollowPackageData["monthly_frequency"] = req.MonthlyFrequency + } + + if *req.ServiceRounds != DoctorConfigFollowPackage.ServiceRounds { + doctorConfigFollowPackageData["service_rounds"] = req.ServiceRounds + } + + if len(doctorConfigFollowPackageData) > 0 { + err := doctorConfigFollowPackageDao.EditDoctorConfigFollowPackageById(tx, followPackageId, doctorConfigFollowPackageData) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + } + + // 处理问诊配置 + // 获取医生问诊配置 + doctorInquiryConfigDao := dao.DoctorInquiryConfigDao{} + maps := make(map[string]interface{}) + maps["doctor_id"] = DoctorConfigFollowPackage.DoctorId + maps["inquiry_type"] = 1 + maps["inquiry_mode"] = 9 + doctorInquiryConfig, _ := doctorInquiryConfigDao.GetDoctorInquiryConfig(maps) + if doctorInquiryConfig == nil { + // 新增医生问诊配置 + doctorInquiryConfig = &model.DoctorInquiryConfig{ + DoctorId: DoctorConfigFollowPackage.DoctorId, + InquiryType: 1, + InquiryMode: 9, + IsEnable: *req.IsEnable, + LastEnableMethod: 2, + WorkNumDay: 0, + InquiryPrice: nil, + } + + doctorInquiryConfig, err = doctorInquiryConfigDao.AddDoctorInquiryConfig(tx, doctorInquiryConfig) + if err != nil || doctorInquiryConfig == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + } else { + // 修改医生问诊配置 + doctorInquiryConfigData := make(map[string]interface{}) + if *req.IsEnable != doctorInquiryConfig.IsEnable { + doctorInquiryConfigData["is_enable"] = req.IsEnable + if *req.IsEnable == 1 { + doctorInquiryConfigData["last_enable_method"] = 2 + } + } + + if len(doctorInquiryConfigData) > 0 { + err = doctorInquiryConfigDao.EditDoctorInquiryConfigById(tx, doctorInquiryConfig.InquiryConfigId, doctorInquiryConfigData) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + } + } + + // 删除随访包明细 + maps = make(map[string]interface{}) + maps["follow_package_id"] = DoctorConfigFollowPackage.FollowPackageId + + doctorConfigFollowPackageItemDao := dao.DoctorConfigFollowPackageItemDao{} + err = doctorConfigFollowPackageItemDao.DeleteDoctorConfigFollowPackageItem(tx, maps) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + + // 处理随访包明细 + for _, item := range req.DoctorConfigFollowPackageItem { + if item.ServicePrice < 10 || item.ServicePrice > 9999 { + tx.Rollback() + return false, errors.New("服务价格只允许设置在10-9999范围内") + } + + if item.ServicePrice != 30 && item.ServicePrice != 90 && item.ServicePrice != 180 && item.ServicePrice != 360 { + tx.Rollback() + return false, errors.New("服务周期错误") + } + + doctorConfigFollowPackageItem := &model.DoctorConfigFollowPackageItem{ + FollowPackageId: DoctorConfigFollowPackage.FollowPackageId, + ServicePeriod: item.ServicePeriod, + ServicePrice: item.ServicePrice, + } + + doctorConfigFollowPackageItem, err := doctorConfigFollowPackageItemDao.AddDoctorConfigFollowPackageItem(tx, doctorConfigFollowPackageItem) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + } + + tx.Commit() + return true, nil +} + +// AddDoctorFollow 新增医生随访包配置 +func (r *DoctorConfigFollowPackageService) AddDoctorFollow(req requests.AddDoctorFollow) (bool, error) { + doctorId, err := strconv.ParseInt(req.DoctorId, 10, 64) + if err != nil { + return false, errors.New("修改失败") + } + + // 获取医生数据 + userDoctorDao := dao.UserDoctorDao{} + userDoctor, err := userDoctorDao.GetUserDoctorById(doctorId) + if err != nil || userDoctor == nil { + return false, errors.New("医生错误") + } + + if userDoctor.IdcardStatus != 1 { + return false, errors.New("请先进行实名认证") + } + + if userDoctor.IdenAuthStatus != 1 { + return false, errors.New("请先进行身份认证") + } + + if userDoctor.IsBindBank != 1 { + return false, errors.New("请先进行绑定结算银行卡") + } + + DoctorConfigFollowPackageDao := dao.DoctorConfigFollowPackageDao{} + + maps := make(map[string]interface{}) + maps["doctor_id"] = doctorId + DoctorConfigFollowPackage, err := DoctorConfigFollowPackageDao.GetDoctorConfigFollowPackage(maps) + if DoctorConfigFollowPackage != nil { + return false, errors.New("该医生存在随访包配置,请勿重复添加") + } + + // 获取专家图文问诊价格 + maps = make(map[string]interface{}) + maps["doctor_id"] = req.DoctorId + maps["inquiry_type"] = 1 + maps["inquiry_mode"] = 1 + + doctorInquiryConfigDao := dao.DoctorInquiryConfigDao{} + doctorInquiryConfig, err := doctorInquiryConfigDao.GetDoctorInquiryConfig(maps) + if err != nil && *req.IsEnable == 1 { + return false, errors.New("本服务需设置图文问诊的价格,才可开启") + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 创建医生随访包 + DoctorConfigFollowPackage = &model.DoctorConfigFollowPackage{ + DoctorId: doctorId, + MonthlyFrequency: *req.MonthlyFrequency, + ServiceRounds: *req.ServiceRounds, + } + + DoctorConfigFollowPackage, err = DoctorConfigFollowPackageDao.AddDoctorConfigFollowPackage(tx, DoctorConfigFollowPackage) + if err != nil || DoctorConfigFollowPackage == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + // 处理随访包明细 + doctorConfigFollowPackageItemDao := dao.DoctorConfigFollowPackageItemDao{} + for _, item := range req.DoctorConfigFollowPackageItem { + if item.ServicePrice < 10 || item.ServicePrice > 9999 { + tx.Rollback() + return false, errors.New("服务价格只允许设置在10-9999范围内") + } + + if item.ServicePrice != 30 && item.ServicePrice != 90 && item.ServicePrice != 180 && item.ServicePrice != 360 { + tx.Rollback() + return false, errors.New("服务周期错误") + } + + doctorConfigFollowPackageItem := &model.DoctorConfigFollowPackageItem{ + FollowPackageId: DoctorConfigFollowPackage.FollowPackageId, + ServicePeriod: item.ServicePeriod, + ServicePrice: item.ServicePrice, + } + + doctorConfigFollowPackageItem, err := doctorConfigFollowPackageItemDao.AddDoctorConfigFollowPackageItem(tx, doctorConfigFollowPackageItem) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + } + + // 增加医生问诊配置 + if *req.IsEnable == 1 { + doctorInquiryConfig = &model.DoctorInquiryConfig{ + DoctorId: doctorId, + InquiryType: 1, + InquiryMode: 9, + IsEnable: *req.IsEnable, + LastEnableMethod: 2, + WorkNumDay: 0, + InquiryPrice: nil, + } + + doctorInquiryConfig, err = doctorInquiryConfigDao.AddDoctorInquiryConfig(tx, doctorInquiryConfig) + if err != nil || doctorInquiryConfig == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + } + + tx.Commit() + return true, nil +} From 9f6b54a6c4093983fd54b16db39d89d3925d87da Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 5 Jun 2024 14:06:00 +0800 Subject: [PATCH 38/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=82=A3=E8=80=85=E5=88=97=E8=A1=A8-=E9=99=90?= =?UTF-8?q?=E5=88=B6=E6=9D=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/userPatient.go | 28 ++++++++++++++++++ api/dao/userPatient.go | 55 +++++++++++++++++++++++++++++++++++ api/requests/userPatient.go | 9 ++++++ api/router/router.go | 3 ++ 4 files changed, 95 insertions(+) diff --git a/api/controller/userPatient.go b/api/controller/userPatient.go index 341d38f..ebc57b1 100644 --- a/api/controller/userPatient.go +++ b/api/controller/userPatient.go @@ -118,3 +118,31 @@ func (r *UserPatient) PutUserDoctorStatus(c *gin.Context) { responses.Ok(c) } + +// GetUserPatientList 获取患者列表-限制条数 +func (r *UserPatient) GetUserPatientList(c *gin.Context) { + userPatientRequest := requests.UserPatientRequest{} + req := userPatientRequest.GetUserPatientList + 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 + } + + userPatientDao := dao.UserPatientDao{} + userPatient, err := userPatientDao.GetUserPatientListSearch(req) + + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + getUserPatientListResponses := dto.GetUserPatientListDto(userPatient) + responses.OkWithData(getUserPatientListResponses, c) +} diff --git a/api/dao/userPatient.go b/api/dao/userPatient.go index 1cd8193..e8d64a1 100644 --- a/api/dao/userPatient.go +++ b/api/dao/userPatient.go @@ -244,3 +244,58 @@ func (r *UserPatientDao) GetUserPatientByUserId(userId int64) (m *model.UserPati } return m, nil } + +// GetUserPatientListSearch 获取患者列表-限制条数 +func (r *UserPatientDao) GetUserPatientListSearch(req requests.GetUserPatientList) (m []*model.UserPatient, err error) { + + // 构建查询条件 + query := global.Db.Model(&model.UserPatient{}).Omit("open_id", "union_id", "wx_session_key") + + // 用户 + query = query.Preload("User", func(db *gorm.DB) *gorm.DB { + return db.Omit("user_password", "salt") + }) + + // 用户名称 + if req.UserName != "" { + query = query.Where("user_name LIKE ?", "%"+req.UserName+"%") + } + + // 手机号 + if req.Mobile != "" { + subQuery := global.Db.Model(&model.User{}). + Select("user_id"). + Where("mobile = ?", req.Mobile) + + query = query.Where(gorm.Expr("user_id IN (?)", subQuery)) + } + + // 用户状态 + if req.Status != nil { + query = query.Where("status = ?", req.Status) + } + + // 注册时间 + if req.CreatedAt != "" { + cancelTime := strings.Split(req.CreatedAt, "&") + if len(cancelTime) == 2 { + startTime, _ := time.Parse("2006-01-02", cancelTime[0]) + endTime, _ := time.Parse("2006-01-02", cancelTime[1]) + + if startTime == endTime { + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + } + + query = query.Where("created_at BETWEEN ? AND ?", startTime, endTime) + } + } + + // 排序 + query = query.Order("created_at desc") + + err = query.Limit(10).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/requests/userPatient.go b/api/requests/userPatient.go index 8db3717..a0c2195 100644 --- a/api/requests/userPatient.go +++ b/api/requests/userPatient.go @@ -4,6 +4,7 @@ type UserPatientRequest struct { GetUserPatientPage // 获取患者列表-分页 PutUserDoctorStatus // 修改患者状态 UserPatientExportList // 患者列表-导出 + GetUserPatientList // 获取患者列表-限制条数 } // GetUserPatientPage 获取患者列表-分页 @@ -31,3 +32,11 @@ type UserPatientExportList struct { Mobile string `json:"mobile" form:"mobile" label:"手机号"` CreatedAt string `json:"created_at" form:"created_at" label:"注册时间"` // 时间区间,数组形式,下标0为开始时间,下标1为结束时间 } + +// GetUserPatientList 获取患者列表-限制条数 +type GetUserPatientList struct { + UserName string `json:"user_name" form:"user_name" label:"用户名称"` + Status *int `json:"status" form:"status" label:"状态"` // (0:禁用 1:正常 2:删除) + Mobile string `json:"mobile" form:"mobile" label:"手机号"` + CreatedAt string `json:"created_at" form:"created_at" label:"注册时间"` // 时间区间,数组形式,下标0为开始时间,下标1为结束时间 +} diff --git a/api/router/router.go b/api/router/router.go index b53ea33..de35127 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -482,6 +482,9 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 获取患者列表-分页 patientGroup.GET("", api.UserPatient.GetUserPatientPage) + // 获取患者列表-限制条数 + patientGroup.GET("/list", api.UserPatient.GetUserPatientList) + // 患者详情 patientGroup.GET("/:patient_id", api.UserPatient.GetUserPatient) From ca629cdb2dc1bc0d9fabe0e87d001d4747373e7f Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 5 Jun 2024 14:12:53 +0800 Subject: [PATCH 39/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=B3=BB=E7=BB=9F=E5=95=86=E5=93=81=E5=88=97=E8=A1=A8?= =?UTF-8?q?-=E9=99=90=E5=88=B6=E6=9D=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/product.go | 32 ++++++++++++++ api/controller/userPatient.go | 1 - api/dao/product.go | 80 +++++++++++++++++++++++++++++++++++ api/requests/product.go | 17 ++++++++ api/router/router.go | 2 +- 5 files changed, 130 insertions(+), 2 deletions(-) diff --git a/api/controller/product.go b/api/controller/product.go index 3bb0b0b..2bf2711 100644 --- a/api/controller/product.go +++ b/api/controller/product.go @@ -300,3 +300,35 @@ func (r *Product) GetPlatformProductList(c *gin.Context) { responses.OkWithData(productPlatforms, c) } + +// GetProductList 获取系统商品列表-限制条数 +func (r *Product) GetProductList(c *gin.Context) { + productRequest := requests.ProductRequest{} + req := productRequest.GetProductList + 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 + } + + productDao := dao.ProductDao{} + product, err := productDao.GetProductListSearch(req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + getProductListResponses := dto.GetProductListDto(product) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(getProductListResponses, c) +} diff --git a/api/controller/userPatient.go b/api/controller/userPatient.go index ebc57b1..2508c01 100644 --- a/api/controller/userPatient.go +++ b/api/controller/userPatient.go @@ -136,7 +136,6 @@ func (r *UserPatient) GetUserPatientList(c *gin.Context) { userPatientDao := dao.UserPatientDao{} userPatient, err := userPatientDao.GetUserPatientListSearch(req) - if err != nil { responses.FailWithMessage(err.Error(), c) return diff --git a/api/dao/product.go b/api/dao/product.go index 8fe4cfe..8dc91b8 100644 --- a/api/dao/product.go +++ b/api/dao/product.go @@ -258,3 +258,83 @@ func (r *ProductDao) GetProductExportListSearch(req requests.ProductExportList) return m, nil } + +// GetProductListSearch 获取系统商品列表-限制条数 +func (r *ProductDao) GetProductListSearch(req requests.GetProductList) (m []*model.Product, err error) { + // 构建查询条件 + 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) + } + + // 是否麻精药品 + if req.IsMajing != nil { + query = query.Where("is_majing = ?", req.IsMajing) + } + + // 商品状态 + if req.ProductStatus != nil { + query = query.Where("product_status = ?", req.ProductStatus) + } + + // 平台商品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("gdxz_product.created_at desc") + + err = query.Limit(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 ab4efb6..4fdaa00 100644 --- a/api/requests/product.go +++ b/api/requests/product.go @@ -8,6 +8,7 @@ type ProductRequest struct { PutProductStatus // 修改商品状态(上/下架) GetPlatformProductList // 获取平台商品列表 ProductExportList // 系统药品-导出 + GetProductList // 获取系统商品列表-限制条数 } // GetPlatformProductPage 获取平台商品列表-分页 @@ -51,6 +52,22 @@ type GetProductPage struct { Order *GetProductPageOrder `json:"order" form:"order" label:"排序"` } +// GetProductList 获取系统商品列表-限制条数 +type GetProductList struct { + 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:西药) + IsMajing *int `json:"is_majing" form:"is_majing" label:"药品类型"` // 是否麻精药品(0:否 1:是) + 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:"商品备注"` // 商品备注 + ProductStatus *int `json:"product_status" form:"product_status" label:"商品状态"` // 商品状态(1:正常 2:下架) +} + type GetProductPageOrder struct { Stock string `json:"stock" form:"stock" label:"库存" validate:"oneof=desc asc"` } diff --git a/api/router/router.go b/api/router/router.go index de35127..59c7c00 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -737,7 +737,7 @@ func privateRouter(r *gin.Engine, api controller.Api) { productGroup.POST("/page", api.Product.GetProductPage) // 获取系统商品列表-限制条数 - productGroup.GET("/list", api.Product.GetProductPage) + productGroup.GET("/list", api.Product.GetProductList) // 系统商品详情 productGroup.GET("/:product_id", api.Product.GetProduct) From d76c00556cf77c214e4216611301e6bc53f0d8d2 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 5 Jun 2024 15:27:33 +0800 Subject: [PATCH 40/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=8C=85=E8=AE=A2=E5=8D=95=E5=AF=BC=E5=87=BA=E3=80=81?= =?UTF-8?q?=E5=95=86=E5=93=81=E5=88=97=E8=A1=A8=E5=A2=9E=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E5=95=86=E5=93=81id=E6=90=9C=E7=B4=A2=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/export.go | 49 +++++++ api/dao/orderServicePackage.go | 215 ++++++++++++++++++++++++++++ api/dao/product.go | 5 + api/model/orderServicePackage.go | 1 + api/requests/OrderServicePackage.go | 32 ++++- api/requests/product.go | 1 + api/router/router.go | 3 + api/service/export.go | 143 ++++++++++++++++++ utils/intToString.go | 60 ++++++++ 9 files changed, 507 insertions(+), 2 deletions(-) diff --git a/api/controller/export.go b/api/controller/export.go index ec8f92e..9a115da 100644 --- a/api/controller/export.go +++ b/api/controller/export.go @@ -594,3 +594,52 @@ func (r *Export) Product(c *gin.Context) { responses.OkWithData(ossAddress, c) } + +// OrderService 服务包订单 +func (r *Export) OrderService(c *gin.Context) { + orderServicePackageRequest := requests.OrderServicePackageRequest{} + req := orderServicePackageRequest.OrderServicePackageExportList + 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 + } + + // 获取数据 + orderServicePackageDao := dao.OrderServicePackageDao{} + orderServicePackage, err := orderServicePackageDao.GetOrderServicePackageExportListSearch(req) + + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 业务处理 + exportService := service.ExportService{} + ossAddress, err := exportService.OrderServicePackage(orderServicePackage) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 获取当前登陆用户id + userId := c.GetInt64("UserId") + if userId != 0 { + // 记录日志 + logExport := &model.LogExport{ + AdminUserId: userId, + ExportModule: "服务包订单", + ExportFile: utils.RemoveOssDomain(ossAddress), + } + + logExportDao := dao.LogExportDao{} + _, _ = logExportDao.AddLogExportUnTransaction(logExport) + } + + responses.OkWithData(ossAddress, c) +} diff --git a/api/dao/orderServicePackage.go b/api/dao/orderServicePackage.go index 8a1a555..5071020 100644 --- a/api/dao/orderServicePackage.go +++ b/api/dao/orderServicePackage.go @@ -1,6 +1,7 @@ package dao import ( + "errors" "gorm.io/gorm" "gorm.io/gorm/clause" "hospital-admin-api/api/model" @@ -291,3 +292,217 @@ func (r *OrderServicePackageDao) GetOrderServicePackagePageSearch(req requests.G } return m, totalRecords, nil } + +// GetOrderServicePackageExportListSearch 获取服务包订单列表-导出 +func (r *OrderServicePackageDao) GetOrderServicePackageExportListSearch(req requests.OrderServicePackageExportList) (m []*model.OrderServicePackage, err error) { + // 构建查询条件 + query := global.Db.Model(&model.OrderServicePackage{}) + + // 医生 + query = query.Preload("UserDoctor", func(db *gorm.DB) *gorm.DB { + return db.Omit("open_id", "union_id", "wx_session_key") + }) + + // 用户 + query = query.Preload("User", func(db *gorm.DB) *gorm.DB { + return db.Select("user_id", "user_name", "mobile") + }) + + // 患者 + query = query.Preload("UserPatient.User", func(db *gorm.DB) *gorm.DB { + return db.Select("user_id", "user_name", "mobile") + }) + + // 当前搜索数据 + if req.Type == 1 { + // 医生姓名 + if req.DoctorName != "" { + subQuery := global.Db.Model(&model.UserDoctor{}). + Select("doctor_id"). + Where("user_name LIKE ?", "%"+req.DoctorName+"%") + + query = query.Where(gorm.Expr("doctor_id IN (?)", subQuery)) + } + + // 订单id + if req.OrderId != "" { + query = query.Where("order_id = ?", req.OrderId) + } + + // 服务包类型 + if req.OrderServiceType != nil { + query = query.Where("order_service_type = ?", req.OrderServiceType) + } + + // 订单状态 + if req.OrderServiceStatus != nil { + query = query.Where("order_service_status = ?", req.OrderServiceStatus) + } + + // 删除状态 + if req.OrderServiceStatus != nil { + query = query.Where("order_service_status = ?", req.OrderServiceStatus) + } + + // 订单退款状态 + if req.RefundStatus != nil { + query = query.Where("refund_status = ?", req.RefundStatus) + } + + // 支付渠道 + if req.PayChannel != nil { + query = query.Where("pay_channel = ?", req.PayChannel) + } + + // 支付状态 + if req.PayStatus != nil { + query = query.Where("pay_status = ?", req.PayStatus) + } + + // 系统订单编号 + if req.OrderServiceNo != "" { + query = query.Where("order_service_no = ?", req.OrderServiceNo) + } + + // 第三方支付流水号 + if req.EscrowTradeNo != "" { + query = query.Where("escrow_trade_no = ?", req.EscrowTradeNo) + } + + // 支付时间 + if req.PayTime != "" { + payTime := strings.Split(req.PayTime, "&") + if len(payTime) == 2 { + startTime, _ := time.Parse("2006-01-02", payTime[0]) + endTime, _ := time.Parse("2006-01-02", payTime[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("pay_time BETWEEN ? AND ?", startTime, endTime) + } + } + + // 开始服务时间 + if req.StartTime != "" { + orderStartTime := strings.Split(req.StartTime, "&") + if len(orderStartTime) == 2 { + startTime, _ := time.Parse("2006-01-02", orderStartTime[0]) + endTime, _ := time.Parse("2006-01-02", orderStartTime[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("start_time BETWEEN ? AND ?", startTime, endTime) + } + } + + // 结束服务时间 + if req.FinishTime != "" { + finishTime := strings.Split(req.FinishTime, "&") + if len(finishTime) == 2 { + startTime, _ := time.Parse("2006-01-02", finishTime[0]) + endTime, _ := time.Parse("2006-01-02", finishTime[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("finish_time BETWEEN ? AND ?", startTime, endTime) + } + } + + // 订单取消时间 + if req.CancelTime != "" { + cancelTime := strings.Split(req.CancelTime, "&") + if len(cancelTime) == 2 { + startTime, _ := time.Parse("2006-01-02", cancelTime[0]) + endTime, _ := time.Parse("2006-01-02", cancelTime[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("cancel_time BETWEEN ? AND ?", startTime, endTime) + } + } + + // 取消订单原因 + if req.CancelReason != nil { + query = query.Where("cancel_reason = ?", req.CancelReason) + } + + // 取消订单备注 + if req.CancelRemarks != "" { + query = query.Where("cancel_remarks LIKE ?", "%"+req.CancelRemarks+"%") + } + + // 添加完成订单延迟队列状态 + if req.AddFinishStatus != nil { + query = query.Where("add_finish_status = ?", req.AddFinishStatus) + } + + // 添加完成订单延迟队列时间 + if req.AddFinishTime != "" { + addFinishTime := strings.Split(req.AddFinishTime, "&") + if len(addFinishTime) == 2 { + startTime, _ := time.Parse("2006-01-02", addFinishTime[0]) + endTime, _ := time.Parse("2006-01-02", addFinishTime[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("add_finish_time BETWEEN ? AND ?", startTime, endTime) + } + } + + // 创建时间 + if req.CreatedAt != "" { + createdAt := strings.Split(req.CreatedAt, "&") + if len(createdAt) == 2 { + startTime, _ := time.Parse("2006-01-02", createdAt[0]) + endTime, _ := time.Parse("2006-01-02", createdAt[1]) + + endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second) + + query = query.Where("created_at BETWEEN ? AND ?", startTime, endTime) + } + } + + // 患者姓名-就诊人 + if req.PatientName != "" { + query = query.Where("patient_name LIKE ?", "%"+req.PatientName+"%") + } + + // 手机号-医生/患者 + if req.Mobile != "" { + // 患者 + patientSubQuery := global.Db.Model(&model.User{}). + Select("user_id"). + Where("mobile = ?", req.Mobile) + + // 医生 + doctorUserSubQuery := global.Db.Model(&model.User{}). + Select("user_id"). + Where("mobile = ?", req.Mobile) + + doctorSubQuery := global.Db.Model(&model.UserDoctor{}). + Select("doctor_id"). + Where(gorm.Expr("user_id IN (?)", doctorUserSubQuery)) + + query = query.Where("user_id IN (?)", patientSubQuery).Or("doctor_id IN (?)", doctorSubQuery) + } + } + + // 当前选中数据 + if req.Type == 2 { + if req.Id == "" { + return nil, errors.New("未提供需导出数据编号") + } + + id := strings.Split(req.Id, ",") + query = query.Where("order_service_id IN (?)", id) + } + + // 排序 + query = query.Order("created_at desc") + + err = query.Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/dao/product.go b/api/dao/product.go index 8dc91b8..8c0fd47 100644 --- a/api/dao/product.go +++ b/api/dao/product.go @@ -269,6 +269,11 @@ func (r *ProductDao) GetProductListSearch(req requests.GetProductList) (m []*mod return db.Select("amount_id", "product_platform_id", "product_platform_code", "stock") }) + // 商品id + if req.ProductId != "" { + query = query.Where("product_id = ?", req.ProductId) + } + // 商品名称 if req.ProductName != "" { query = query.Where("product_name LIKE ?", "%"+req.ProductName+"%") diff --git a/api/model/orderServicePackage.go b/api/model/orderServicePackage.go index a1e1c4c..b8a0119 100644 --- a/api/model/orderServicePackage.go +++ b/api/model/orderServicePackage.go @@ -43,6 +43,7 @@ type OrderServicePackage struct { User *User `gorm:"foreignKey:UserId;references:user_id" json:"user"` // 患者 OrderServicePackageInquiry []*OrderServicePackageInquiry `gorm:"foreignKey:OrderServiceId;references:order_service_id" json:"order_service_package_inquiry"` // 关联问诊订单 OrderServicePackageProduct []*OrderServicePackageProduct `gorm:"foreignKey:OrderServiceId;references:order_service_id" json:"order_service_package_product"` // 关联商品订单 + UserPatient *UserPatient `gorm:"foreignKey:PatientId;references:patient_id" json:"user_patient"` } func (m *OrderServicePackage) TableName() string { diff --git a/api/requests/OrderServicePackage.go b/api/requests/OrderServicePackage.go index 220789c..82459f5 100644 --- a/api/requests/OrderServicePackage.go +++ b/api/requests/OrderServicePackage.go @@ -1,8 +1,9 @@ package requests type OrderServicePackageRequest struct { - GetOrderServicePackagePage // 获取药品订单列表-分页 - CancelOrderServicePackage // 取消服务包订单 + GetOrderServicePackagePage // 获取药品订单列表-分页 + CancelOrderServicePackage // 取消服务包订单 + OrderServicePackageExportList // 获取服务包订单列表-导出 } // GetOrderServicePackagePage 订单-服务包表 @@ -38,3 +39,30 @@ type CancelOrderServicePackage struct { RefundAmount *float64 `json:"refund_amount" form:"refund_amount" label:"退款金额"` CancelRemarks string `json:"cancel_remarks" form:"cancel_remarks" validate:"required" label:"取消订单备注"` } + +// OrderServicePackageExportList 获取服务包订单列表-导出 +type OrderServicePackageExportList struct { + Type int `json:"type" form:"type" label:"类型" validate:"required,oneof=1 2 3"` // 1:当前搜索数据 2:当前选择数据 3:全部数据 + Id string `json:"id" form:"id" label:"id"` // 选择数据的id,逗号分隔,当type为2时必填 + OrderId string `json:"order_id" form:"order_id" label:"订单id"` // 订单id + OrderServiceType *int `json:"order_service_type" form:"order_service_type" label:"服务包类型(1:健康包 2:随访包)"` // 服务包类型(1:健康包 2:随访包) + OrderServiceStatus *int `json:"order_service_status" form:"order_service_status" label:"订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消)"` // 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) + IsDelete *int `json:"is_delete" form:"is_delete" label:"删除状态(0:否 1:是)"` // 删除状态(0:否 1:是) + RefundStatus *int `json:"refund_status" form:"refund_status" label:"订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款)"` // 订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款) + PayChannel *int `json:"pay_channel" form:"pay_channel" label:"支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付)"` // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) + PayStatus *int `json:"pay_status" form:"pay_status" label:"支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)"` // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + OrderServiceNo string `json:"order_service_no" form:"order_service_no" label:"系统订单编号"` // 系统订单编号 + EscrowTradeNo string `json:"escrow_trade_no" form:"escrow_trade_no" label:"第三方支付流水号"` // 第三方支付流水号 + PayTime string `json:"pay_time" form:"pay_time" label:"支付时间"` // 支付时间 + StartTime string `json:"start_time" form:"start_time" label:"开始服务时间"` // 开始服务时间 + FinishTime string `json:"finish_time" form:"finish_time" label:"结束服务时间"` // 结束服务时间 + CancelTime string `json:"cancel_time" form:"cancel_time" label:"订单取消时间"` // 订单取消时间 + CancelReason *int `json:"cancel_reason" form:"cancel_reason" label:"取消订单原因(1:医生未接受服务 2:主动取消 4:客服取消 5:支付超时)"` // 取消订单原因(1:医生未接受服务 2:主动取消 4:客服取消 5:支付超时) + CancelRemarks string `json:"cancel_remarks" form:"cancel_remarks" label:"取消订单备注"` // 取消订单备注 + AddFinishStatus *int `json:"add_finish_status" form:"add_finish_status" label:"添加完成订单延迟队列状态(0:未添加 1:已添加 2:添加失败)"` // 添加完成订单延迟队列状态(0:未添加 1:已添加 2:添加失败) + AddFinishTime string `json:"add_finish_time" form:"add_finish_time" label:"添加完成订单延迟队列时间"` // 添加完成订单延迟队列时间 + PatientName string `json:"patient_name" form:"patient_name" label:"患者姓名-就诊人"` // 患者姓名-就诊人 + CreatedAt string `json:"created_at" form:"created_at" label:"订单创建时间"` // 时间区间,数组形式,下标0为开始时间,下标1为结束时间 + Mobile string `json:"mobile" form:"mobile" label:"手机号-医生/患者"` + DoctorName string `json:"doctor_name" form:"doctor_name" label:"医生姓名"` +} diff --git a/api/requests/product.go b/api/requests/product.go index 4fdaa00..84b434a 100644 --- a/api/requests/product.go +++ b/api/requests/product.go @@ -54,6 +54,7 @@ type GetProductPage struct { // GetProductList 获取系统商品列表-限制条数 type GetProductList struct { + ProductId string `json:"product_id" form:"product_id" label:"商品id"` // 商品id 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:"商品助记码"` // 商品助记码(首字母简拼) diff --git a/api/router/router.go b/api/router/router.go index 59c7c00..0e166f0 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -713,6 +713,9 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 药品订单 orderGroup.POST("/product", api.Export.OrderProduct) + + // 服务包订单 + orderGroup.POST("/service", api.Export.OrderService) } // 处方 diff --git a/api/service/export.go b/api/service/export.go index 01a29a7..86e075d 100644 --- a/api/service/export.go +++ b/api/service/export.go @@ -282,6 +282,34 @@ type OrderProductData struct { CreatedAt time.Time // 创建时间 } +// OrderServicePackageDto 订单-服务包 +type OrderServicePackageDto struct { + OrderServiceNo string // 系统订单编号 + DoctorName string // 医生姓名 + PatientName string // 患者姓名-就诊人 + PatientSex string // 患者性别-就诊人(0:未知 1:男 2:女) + PatientAge int // 患者年龄-就诊人 + PatientMobile string // 患者电话 + EscrowTradeNo string // 第三方支付流水号 + OrderServiceType string // 服务包类型(1:健康包 2:随访包) + OrderServiceStatus string // 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) + PayChannel string // 支付渠道(1:小程序支付 2:微信扫码支付 3:模拟支付) + PayStatus string // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + CancelReason string // 取消订单原因(1:医生未接受服务 2:主动取消 4:客服取消 5:支付超时) + AmountTotal float64 // 订单金额 + PaymentAmountTotal float64 // 实际付款金额 + PayTime time.Time // 支付时间 + StartTime time.Time // 开始服务时间 + FinishTime time.Time // 结束服务时间 + RefundStatus string // 订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款) + CancelTime time.Time // 订单取消时间 + CancelRemarks string // 取消订单备注 + AddFinishStatus string // 添加完成订单延迟队列状态(0:未添加 1:已添加 2:添加失败) + AddFinishTime time.Time // 添加完成订单延迟队列时间 + AddFinishFailReason string // 添加完成订单延迟队列失败原因 + CreatedAt time.Time // 创建时间 +} + // OrderPrescriptionData 处方 type OrderPrescriptionData struct { DoctorName string // 医生姓名 @@ -1641,6 +1669,121 @@ func (r *ExportService) OrderProduct(d []*model.OrderProduct) (string, error) { return ossPath, nil } +// OrderServicePackage 服务包订单 +func (r *ExportService) OrderServicePackage(d []*model.OrderServicePackage) (string, error) { + header := []utils.HeaderCellData{ + {Value: "系统订单编号", CellType: "string", NumberFmt: "", ColWidth: 25}, + {Value: "医生姓名", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "患者姓名-就诊人", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "患者性别-就诊人", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "患者年龄-就诊人", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "患者电话", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "第三方支付流水号", CellType: "string", NumberFmt: "", ColWidth: 35}, + {Value: "服务包类型", CellType: "string", NumberFmt: "", ColWidth: 25}, + {Value: "订单状态", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "支付渠道", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "支付状态", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "订单取消原因", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "订单金额", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18}, + {Value: "实际付款金额", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18}, + {Value: "支付时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, + {Value: "开始服务时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, + {Value: "结束服务时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, + {Value: "退款状态", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "订单取消时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, + {Value: "订单取消备注", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "添加完成订单延迟队列状态", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "添加完成订单延迟队列时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, + {Value: "添加完成订单延迟队列失败原因", CellType: "string", NumberFmt: "", ColWidth: 18}, + {Value: "创建时间", CellType: "date", NumberFmt: "yyyy-mm-dd hh:mm:ss", ColWidth: 30}, + } + + var dataSlice []interface{} + for _, v := range d { + data := OrderServicePackageDto{ + OrderServiceNo: v.OrderServiceNo, + PatientName: v.PatientName, + PatientSex: utils.SexToString(v.PatientSex), + PatientAge: v.PatientAge, + EscrowTradeNo: v.EscrowTradeNo, + OrderServiceType: utils.OrderServiceTypeToString(v.OrderServiceType), + OrderServiceStatus: utils.OrderServiceStatusToString(v.OrderServiceStatus), + PayChannel: utils.PayChannelToString(v.PayChannel), + PayStatus: utils.PayStatusToString(v.PayStatus), + CancelReason: utils.OrderServicePackageCancelReasonToString(v.CancelReason), + AmountTotal: v.AmountTotal, + PaymentAmountTotal: v.AmountTotal, + RefundStatus: utils.RefundStatusToString(v.RefundStatus), + CancelRemarks: v.CancelRemarks, + AddFinishStatus: utils.AddFinishStatusToString(v.AddFinishStatus), + AddFinishFailReason: v.AddFinishFailReason, + } + + if v.UserDoctor != nil { + // 医生姓名 + data.DoctorName = v.UserDoctor.UserName + } + + if v.UserPatient != nil { + if v.UserPatient.User != nil { + data.PatientMobile = v.UserPatient.User.Mobile + } + } + + if v.PayTime != (model.LocalTime{}) { + t := time.Time(v.PayTime) + data.PayTime = t + } + + if v.StartTime != (model.LocalTime{}) { + t := time.Time(v.StartTime) + data.StartTime = t + } + + if v.FinishTime != (model.LocalTime{}) { + t := time.Time(v.FinishTime) + data.FinishTime = t + } + + if v.CancelTime != (model.LocalTime{}) { + t := time.Time(v.CancelTime) + data.CancelTime = t + } + + if v.AddFinishTime != (model.LocalTime{}) { + t := time.Time(v.AddFinishTime) + data.AddFinishTime = t + } + + if v.CreatedAt != (model.LocalTime{}) { + t := time.Time(v.CreatedAt) + data.CreatedAt = t + } + + dataSlice = append(dataSlice, data) + } + + file, err := utils.Export(header, dataSlice) + if err != nil { + return "", err + } + + // 设置文件名字 + now := time.Now() + dateTimeString := now.Format("20060102150405") // 当前时间字符串 + rand.New(rand.NewSource(time.Now().UnixNano())) // 设置随机数 + ossPath := "admin/export/服务包订单" + dateTimeString + fmt.Sprintf("%d", rand.Intn(9000)+1000) + ".xlsx" + + // 上传oss + _, err = aliyun.PutObjectByte(ossPath, file.Bytes()) + if err != nil { + return "", err + } + + ossPath = utils.AddOssDomain("/" + ossPath) + return ossPath, nil +} + // OrderPrescription 处方 func (r *ExportService) OrderPrescription(d []*model.OrderPrescription) (string, error) { header := []utils.HeaderCellData{ diff --git a/utils/intToString.go b/utils/intToString.go index cdbb607..d19143d 100644 --- a/utils/intToString.go +++ b/utils/intToString.go @@ -603,3 +603,63 @@ func IsProductTypeToString(i int) string { return "" } } + +// OrderServiceTypeToString 服务包类型(1:健康包 2:随访包) +func OrderServiceTypeToString(i int) string { + switch i { + case 1: + return "健康包" + case 2: + return "随访包" + default: + return "" + } +} + +// OrderServiceStatusToString 订单状态(1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消) +func OrderServiceStatusToString(i int) string { + switch i { + case 1: + return "待支付" + case 2: + return "未开始" + case 3: + return "服务中" + case 4: + return "服务完成" + case 5: + return "服务取消" + default: + return "" + } +} + +// OrderServicePackageCancelReasonToString 取消订单原因(1:医生未接受服务 2:主动取消 4:客服取消 5:支付超时) +func OrderServicePackageCancelReasonToString(i int) string { + switch i { + case 1: + return "医生未接受服务" + case 2: + return "主动取消" + case 3: + return "客服取消" + case 4: + return "支付超时" + default: + return "" + } +} + +// AddFinishStatusToString 添加完成订单延迟队列状态(0:未添加 1:已添加 2:添加失败) +func AddFinishStatusToString(i int) string { + switch i { + case 0: + return "未添加" + case 1: + return "已添加" + case 2: + return "添加失败" + default: + return "未知" + } +} From 1bd908c79f143767df7a0fe6692f04059a430a45 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 5 Jun 2024 15:43:00 +0800 Subject: [PATCH 41/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=B3=BB=E7=BB=9F=E5=95=86=E5=93=81=E5=88=97=E8=A1=A8?= =?UTF-8?q?-=E9=99=90=E5=88=B6=E6=9D=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dao/product.go | 2 +- api/requests/product.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/api/dao/product.go b/api/dao/product.go index 8c0fd47..2568d3a 100644 --- a/api/dao/product.go +++ b/api/dao/product.go @@ -336,7 +336,7 @@ func (r *ProductDao) GetProductListSearch(req requests.GetProductList) (m []*mod query = query.Order("gdxz_product.created_at desc") - err = query.Limit(10).Find(&m).Error + err = query.Limit(req.Limit).Find(&m).Error if err != nil { return nil, err } diff --git a/api/requests/product.go b/api/requests/product.go index 84b434a..9028a34 100644 --- a/api/requests/product.go +++ b/api/requests/product.go @@ -67,6 +67,7 @@ type GetProductList struct { 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:下架) + Limit int `json:"limit" form:"limit" label:"限制条数"` } type GetProductPageOrder struct { From 52888553bf9c5ce2e07799e61d8aa8556ab28ead Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 5 Jun 2024 16:39:09 +0800 Subject: [PATCH 42/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E8=8D=AF?= =?UTF-8?q?=E5=93=81=E8=AE=A2=E5=8D=95=E5=8F=96=E6=B6=88=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?order=E8=A1=A8=E5=8F=96=E6=B6=88=E3=80=82=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E4=BA=86=E6=9C=8D=E5=8A=A1=E5=8C=85=E8=AE=A2=E5=8D=95=E5=8F=96?= =?UTF-8?q?=E6=B6=88=E5=85=B3=E8=81=94=E9=97=AE=E8=AF=8A=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E5=8F=96=E6=B6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/OrderInquiry.go | 2 +- api/service/orderProduct.go | 41 +++++++++- api/service/orderServicePackage.go | 127 ++++++++++++++++++++++++++++- 3 files changed, 167 insertions(+), 3 deletions(-) diff --git a/api/service/OrderInquiry.go b/api/service/OrderInquiry.go index d3e1e0f..980efbc 100644 --- a/api/service/OrderInquiry.go +++ b/api/service/OrderInquiry.go @@ -247,7 +247,7 @@ func (r *OrderInquiryService) CancelOrderInquiry(req requests.CancelOrderInquiry } if refundStatus == 3 && !successTime.IsZero() { - orderRefund.SuccessTime = model.LocalTime(successTime) + orderInquiryRefund.SuccessTime = model.LocalTime(successTime) } orderInquiryRefundDao := dao.OrderInquiryRefundDao{} diff --git a/api/service/orderProduct.go b/api/service/orderProduct.go index 19e6326..ca7d08d 100644 --- a/api/service/orderProduct.go +++ b/api/service/orderProduct.go @@ -233,6 +233,19 @@ func (r *OrderProductService) CancelOrderProduct(req requests.CancelOrderProduct } } + // 修改订单为取消 + orderData := make(map[string]interface{}) + orderData["cancel_status"] = 1 + orderData["cancel_time"] = time.Now().Format("2006-01-02 15:04:05") + orderData["cancel_remarks"] = req.CancelRemarks + + orderDao := dao.OrderDao{} + err = orderDao.EditOrderById(tx, orderProduct.OrderId, orderData) + if err != nil { + tx.Rollback() + return false, errors.New("取消订单失败") + } + // 修改问诊订单退款状态 orderProductData["refund_status"] = refundStatus orderProductData["order_product_status"] = 5 // 订单状态(1:待支付 2:待发货 3:已发货 4:已签收 5:已取消) @@ -246,6 +259,29 @@ func (r *OrderProductService) CancelOrderProduct(req requests.CancelOrderProduct return false, errors.New("取消订单失败") } + // 新增退款表 + orderRefund := &model.OrderRefund{ + OrderId: orderProduct.OrderId, + PatientId: orderProduct.PatientId, + OrderNo: orderProduct.OrderProductNo, + RefundNo: refundNo, + RefundId: refundId, + RefundStatus: refundStatus, + RefundTotal: orderProduct.PaymentAmountTotal, + RefundReason: req.CancelRemarks, + } + + if refundStatus == 3 && !successTime.IsZero() { + orderRefund.SuccessTime = model.LocalTime(successTime) + } + + orderRefundDao := dao.OrderRefundDao{} + orderRefund, err = orderRefundDao.AddOrderRefund(tx, orderRefund) + if err != nil || orderRefund == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + // 新增退款表 orderProductRefund := &model.OrderProductRefund{ PatientId: orderProduct.PatientId, @@ -256,7 +292,10 @@ func (r *OrderProductService) CancelOrderProduct(req requests.CancelOrderProduct ProductRefundStatus: refundStatus, RefundTotal: orderProduct.PaymentAmountTotal, RefundReason: req.CancelRemarks, - SuccessTime: model.LocalTime(successTime), + } + + if refundStatus == 3 && !successTime.IsZero() { + orderProductRefund.SuccessTime = model.LocalTime(successTime) } orderProductRefundDao := dao.OrderProductRefundDao{} diff --git a/api/service/orderServicePackage.go b/api/service/orderServicePackage.go index 7561904..4c311a0 100644 --- a/api/service/orderServicePackage.go +++ b/api/service/orderServicePackage.go @@ -344,7 +344,7 @@ func (r *OrderServicePackageService) CancelOrderServicePackage(req requests.Canc } if refundStatus == 3 && !successTime.IsZero() { - orderRefund.SuccessTime = model.LocalTime(successTime) + orderServicePackageRefund.SuccessTime = model.LocalTime(successTime) } orderServicePackageRefundDao := dao.OrderServicePackageRefundDao{} @@ -354,6 +354,131 @@ func (r *OrderServicePackageService) CancelOrderServicePackage(req requests.Canc return false, errors.New(err.Error()) } + // 获取服务包关联问诊订单 + for _, inquiry := range orderServicePackage.OrderServicePackageInquiry { + // 获取订单数据 + orderInquiryDao := dao.OrderInquiryDao{} + orderInquiry, err := orderInquiryDao.GetOrderInquiryById(inquiry.OrderInquiryId) + if err != nil || orderInquiry == nil { + tx.Rollback() + return false, errors.New("取消订单失败") + } + + // 检测订单状态 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) + if orderInquiry.InquiryStatus == 6 { + continue + } + + // 检测订单状态 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) + if orderInquiry.InquiryStatus == 7 { + continue + } + + // 支付金额为0,模拟退款 + refundId = "模拟退款:" + strconv.FormatInt(global.Snowflake.Generate().Int64(), 10) + refundStatus = 3 + successTime = time.Now() + + // 模拟退款时手动退还优惠卷 + if orderInquiry.CouponAmountTotal > 0 { + orderService := OrderService{} + res, err := orderService.ReturnOrderCoupon(orderInquiry.InquiryNo, tx) + if err != nil || !res { + // 退还优惠卷失败 + tx.Rollback() + return false, err + } + } + + // 修改订单为取消 + orderData := make(map[string]interface{}) + orderData["cancel_status"] = 1 + orderData["cancel_time"] = time.Now().Format("2006-01-02 15:04:05") + orderData["cancel_remarks"] = req.CancelRemarks + + orderDao := dao.OrderDao{} + err = orderDao.EditOrderById(tx, orderInquiry.OrderId, orderData) + if err != nil { + tx.Rollback() + return false, errors.New("取消订单失败") + } + + // 修改问诊订单为取消 + orderInquiryData := make(map[string]interface{}) + orderInquiryData["inquiry_status"] = 7 // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) + orderInquiryData["cancel_time"] = time.Now().Format("2006-01-02 15:04:05") // 订单取消时间 + orderInquiryData["cancel_reason"] = 4 // 取消订单原因(1:医生未接诊 2:主动取消 3:无可分配医生 4:客服取消 5:支付超时) + orderInquiryData["cancel_remarks"] = req.CancelRemarks // 取消订单备注(自动添加) + err = orderInquiryDao.EditOrderInquiryById(tx, orderInquiry.OrderInquiryId, orderInquiryData) + if err != nil { + tx.Rollback() + return false, errors.New("取消订单失败") + } + + // 新增退款表 + orderRefund := &model.OrderRefund{ + OrderId: orderInquiry.OrderId, + PatientId: orderInquiry.PatientId, + OrderNo: orderInquiry.InquiryNo, + RefundNo: refundNo, + RefundId: refundId, + RefundStatus: refundStatus, + RefundTotal: *req.RefundAmount, + RefundReason: req.CancelRemarks, + } + + if refundStatus == 3 && !successTime.IsZero() { + orderRefund.SuccessTime = model.LocalTime(successTime) + } + + orderRefundDao := dao.OrderRefundDao{} + orderRefund, err = orderRefundDao.AddOrderRefund(tx, orderRefund) + if err != nil || orderRefund == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + // 新增问诊退款表 + orderInquiryRefund := &model.OrderInquiryRefund{ + PatientId: orderInquiry.PatientId, + OrderInquiryId: orderInquiry.OrderInquiryId, + InquiryNo: orderInquiry.InquiryNo, + InquiryRefundNo: refundNo, + RefundId: refundId, + InquiryRefundStatus: refundStatus, + RefundTotal: *req.RefundAmount, + RefundReason: req.CancelRemarks, + SuccessTime: model.LocalTime(successTime), + } + + if refundStatus == 3 && !successTime.IsZero() { + orderInquiryRefund.SuccessTime = model.LocalTime(successTime) + } + + orderInquiryRefundDao := dao.OrderInquiryRefundDao{} + orderInquiryRefund, err = orderInquiryRefundDao.AddOrderInquiryRefund(tx, orderInquiryRefund) + if err != nil || orderInquiryRefund == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + // 记录日志 + orderOperationLog := &model.OrderOperationLog{ + OrderId: orderInquiry.OrderId, + OrderNo: orderInquiry.InquiryNo, + OrderType: 1, + OperatorId: adminUserId, + OperationContent: "服务包关联取消订单", + } + + orderOperationLogDao := dao.OrderOperationLogDao{} + orderOperationLog, err = orderOperationLogDao.AddOrderOperationLog(tx, orderOperationLog) + if err != nil || orderOperationLog == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + } + // 记录日志 orderOperationLog := &model.OrderOperationLog{ OrderId: orderServicePackage.OrderId, From 7f5330361fe1db0cbf6cdbf554e9a021fd9396e8 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 5 Jun 2024 17:39:18 +0800 Subject: [PATCH 43/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E4=BC=98=E6=83=A0=E5=8D=B7=20=E9=97=AE=E8=AF=8A?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dto/coupon.go | 20 +++++++++++++++++--- api/requests/coupon.go | 4 ++-- api/service/coupon.go | 16 +++++++++++----- utils/intToString.go | 20 ++++++++++++++++++++ 4 files changed, 50 insertions(+), 10 deletions(-) diff --git a/api/dto/coupon.go b/api/dto/coupon.go index c077e49..9802b08 100644 --- a/api/dto/coupon.go +++ b/api/dto/coupon.go @@ -4,6 +4,7 @@ import ( "fmt" "hospital-admin-api/api/model" "hospital-admin-api/utils" + "strings" ) // CouponDto 优惠卷表 @@ -16,7 +17,7 @@ type CouponDto struct { CouponStatus int `json:"coupon_status"` // 状态(1:正常 2:强制失效 3:结束 4:删除) DistributionObject int `json:"distribution_object"` // 发放对象(1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户) ApplicationScope int `json:"application_scope"` // 适用范围(1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品) - InquiryType string `json:"inquiry_type"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) + InquiryType []string `json:"inquiry_type"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) BrandId string `json:"brand_id"` // 关联品牌id(如不限制品牌,此项为空) IsMutex int `json:"is_mutex"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 IsDisplay int `json:"is_display"` // 是否展示(0:否 1:是) @@ -52,7 +53,6 @@ func GetCouponDto(m *model.Coupon) *CouponDto { CouponStatus: m.CouponStatus, DistributionObject: m.DistributionObject, ApplicationScope: m.ApplicationScope, - InquiryType: m.InquiryType, BrandId: fmt.Sprintf("%d", m.BrandId), IsMutex: *m.IsMutex, IsDisplay: m.IsDisplay, @@ -93,7 +93,6 @@ func GetCouponListDto(m []*model.Coupon) []*CouponDto { CouponStatus: v.CouponStatus, DistributionObject: v.DistributionObject, ApplicationScope: v.ApplicationScope, - InquiryType: v.InquiryType, BrandId: fmt.Sprintf("%d", v.BrandId), IsMutex: *v.IsMutex, IsDisplay: v.IsDisplay, @@ -117,6 +116,11 @@ func GetCouponListDto(m []*model.Coupon) []*CouponDto { UpdatedAt: v.UpdatedAt, } + // 加载关联问诊类型 + if v.InquiryType != "" { + response.LoadInquiryType(v.InquiryType) + } + // 将转换后的结构体添加到新切片中 responses[i] = response } @@ -134,3 +138,13 @@ func (r *CouponDto) LoadCouponGrant(m []*model.CouponGrant) *CouponDto { } return r } + +// LoadInquiryType 加载关联问诊类型 +func (r *CouponDto) LoadInquiryType(m string) *CouponDto { + if m != "" { + inquiryType := strings.Split(m, ",") + + r.InquiryType = inquiryType + } + return r +} diff --git a/api/requests/coupon.go b/api/requests/coupon.go index 87c75ab..85c5454 100644 --- a/api/requests/coupon.go +++ b/api/requests/coupon.go @@ -38,7 +38,7 @@ type AddSystemCoupon struct { CouponType *int `json:"coupon_type" form:"coupon_type" label:"优惠卷类型" validate:"required,oneof=1 2 3"` // 优惠卷类型(1 :无门槛 2:满减 3:数量) DistributionObject *int `json:"distribution_object" form:"distribution_object" label:"发放对象" validate:"required,oneof=1 2 3 4 5 6 7"` ApplicationScope *int `json:"application_scope" form:"application_scope" label:"适用范围" validate:"required,oneof=1 2 3 4 5 6"` // (1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品) - InquiryType *string `json:"inquiry_type" form:"inquiry_type" label:"关联问诊类型" validate:"omitempty,oneof=1 2 3 4 5 6"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) + InquiryType []string `json:"inquiry_type" form:"inquiry_type" label:"关联问诊类型"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) BrandId *string `json:"brand_id" form:"brand_id" label:"关联品牌id"` // 关联品牌id(如不限制品牌,此项为空) IsMutex *int `json:"is_mutex" form:"is_mutex" label:"是否互斥" validate:"required,oneof=0 1"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 IsDisplay *int `json:"is_display" form:"is_display" label:"是否展示" validate:"required,oneof=0 1"` // 是否展示(0:否 1:是) @@ -63,7 +63,7 @@ type PutSystemCoupon struct { CouponName string `json:"coupon_name" form:"coupon_name" label:"优惠卷名称" validate:"required"` // 优惠卷名称 CouponIcon string `json:"coupon_icon" form:"coupon_icon" label:"头像"` // 优惠卷名称 DistributionObject *int `json:"distribution_object" form:"distribution_object" label:"发放对象" validate:"required,oneof=1 2 3 4 5 6 7"` // (1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户) - InquiryType *string `json:"inquiry_type" form:"inquiry_type" label:"关联问诊类型" validate:"omitempty,oneof=1 2 3 4 5 6"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) + InquiryType []string `json:"inquiry_type" form:"inquiry_type" label:"关联问诊类型"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) BrandId *string `json:"brand_id" form:"brand_id" label:"关联品牌id"` // 关联品牌id(如不限制品牌,此项为空) IsMutex *int `json:"is_mutex" form:"is_mutex" label:"是否互斥" validate:"required,oneof=0 1"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 IsDisplay *int `json:"is_display" form:"is_display" label:"是否展示" validate:"required,oneof=0 1"` // 是否展示(0:否 1:是) diff --git a/api/service/coupon.go b/api/service/coupon.go index c88cb69..c33951b 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -35,6 +35,11 @@ func (r *CouponService) GetSystemCoupon(couponId int64) (g *dto.CouponDto, err e g = g.LoadCouponGrant(coupon.CouponGrant) } + // 加载关联问诊类型 + if coupon.InquiryType != "" { + g.LoadInquiryType(coupon.InquiryType) + } + return g, nil } @@ -81,7 +86,7 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err // 适用范围-问诊 if *req.ApplicationScope == 2 { // 关联问诊类型 - if req.InquiryType == nil { + if len(req.InquiryType) == 0 { return false, errors.New("请填入关联问诊类型") } } @@ -206,8 +211,8 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err } // 关联问诊类型 - if req.InquiryType != nil { - coupon.InquiryType = *req.InquiryType + if len(req.InquiryType) > 0 { + coupon.InquiryType = strings.Join(req.InquiryType, ",") } // 发放关联天数 @@ -306,8 +311,9 @@ func (r *CouponService) PutSystemCoupon(couponId int64, req requests.PutSystemCo // 关联问诊类型 if coupon.ApplicationScope == 2 { - if req.InquiryType != nil { - if *req.InquiryType != coupon.InquiryType { + if len(req.InquiryType) > 0 { + inquiryType := strings.Join(req.InquiryType, ",") + if inquiryType != coupon.InquiryType { couponData["inquiry_type"] = req.InquiryType } } diff --git a/utils/intToString.go b/utils/intToString.go index d19143d..90d6fd5 100644 --- a/utils/intToString.go +++ b/utils/intToString.go @@ -663,3 +663,23 @@ func AddFinishStatusToString(i int) string { return "未知" } } + +// CouponInquiryTypeToString 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) +func CouponInquiryTypeToString(i int) string { + switch i { + case 1: + return "全部" + case 2: + return "快速问诊" + case 3: + return "专家问诊" + case 4: + return "公益问诊" + case 5: + return "问诊购药" + case 6: + return "检测" + default: + return "未知" + } +} From ef5bd881069c88719a4ce5360488f7c38f19669c Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 5 Jun 2024 17:45:53 +0800 Subject: [PATCH 44/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E4=BC=98=E6=83=A0=E5=8D=B7=20=E9=97=AE=E8=AF=8A?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/coupon.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/service/coupon.go b/api/service/coupon.go index c33951b..adf19ec 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -314,7 +314,7 @@ func (r *CouponService) PutSystemCoupon(couponId int64, req requests.PutSystemCo if len(req.InquiryType) > 0 { inquiryType := strings.Join(req.InquiryType, ",") if inquiryType != coupon.InquiryType { - couponData["inquiry_type"] = req.InquiryType + couponData["inquiry_type"] = inquiryType } } } From 575c93bb73a15ce4fe2e5329dadce9355dc543e0 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 5 Jun 2024 18:56:27 +0800 Subject: [PATCH 45/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E4=BC=98=E6=83=A0=E5=8D=B7=E6=98=AF=E5=90=A6=E5=85=A8=E9=83=A8?= =?UTF-8?q?=E5=8F=91=E6=94=BE=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/coupon.go | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/api/service/coupon.go b/api/service/coupon.go index adf19ec..b59bcf2 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -519,7 +519,7 @@ func (r *CouponService) GrantSystemCoupon(couponId, adminUserId int64, req reque } // 检测优惠卷可发放数量 - if req.TotalQuantity >= remainingQuantity { + if req.TotalQuantity > remainingQuantity { return false, errors.New("优惠卷数量不足,无法发放") } @@ -588,6 +588,25 @@ func (r *CouponService) GrantSystemCoupon(couponId, adminUserId int64, req reque } }() + // 增加优惠卷发放数量 + err = couponDao.Inc(tx, couponId, "coupon_take_count", req.SingleQuantity) + if err != nil { + tx.Rollback() + return false, errors.New("发放失败") + } + + // 检测优惠卷是否全部发放完毕 + if (req.TotalQuantity - remainingQuantity) == 0 { + maps := make(map[string]interface{}) + maps["coupon_status"] = 3 + err := couponDao.EditCouponById(tx, coupon.CouponId, maps) + if err != nil { + tx.Rollback() + return false, errors.New("发放失败") + } + } + + // 发放优惠卷 for i := 0; i < req.SingleQuantity; i++ { // 添加用户优惠卷表 UserCouponModel := &model.UserCoupon{ @@ -614,13 +633,6 @@ func (r *CouponService) GrantSystemCoupon(couponId, adminUserId int64, req reque return false, errors.New("发放失败") } - // 增加优惠卷发放数量 - err = couponDao.Inc(tx, couponId, "coupon_take_count", 1) - if err != nil { - tx.Rollback() - return false, errors.New("发放失败") - } - // 添加弹窗表 if coupon.IsPopup == 1 { popupModel := &model.Popup{ From 7dbab928bb7864f808920713e422c59af1a5434c Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 6 Jun 2024 14:26:42 +0800 Subject: [PATCH 46/78] =?UTF-8?q?=E5=BA=9F=E5=BC=83=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E6=A3=80=E6=B5=8B=E6=98=AF=E5=90=A6=E5=B7=B2?= =?UTF-8?q?=E5=8F=91=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/coupon.go | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/api/service/coupon.go b/api/service/coupon.go index b59bcf2..192da62 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -73,6 +73,10 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err if *req.WithAmount == 0 { return false, errors.New("请填入符合满减标准金额") } + + if *req.WithAmount > *req.CouponPrice { + return false, errors.New("满减标准金额不可超过优惠卷金额") + } } // 数量 @@ -571,14 +575,15 @@ func (r *CouponService) GrantSystemCoupon(couponId, adminUserId int64, req reque // 检测用户是否已领取该优惠卷 userCouponDao := dao.UserCouponDao{} - maps = make(map[string]interface{}) - maps["user_id"] = user.UserId - maps["coupon_id"] = coupon.CouponId - maps["user_coupon_status"] = 0 - userCoupons, _ := userCouponDao.GetUserCouponList(maps) - if len(userCoupons) >= req.SingleQuantity { - return false, errors.New("用户已有该优惠卷") - } + //// 废弃,不进行检测是否已发放 + //maps = make(map[string]interface{}) + //maps["user_id"] = user.UserId + //maps["coupon_id"] = coupon.CouponId + //maps["user_coupon_status"] = 0 + //userCoupons, _ := userCouponDao.GetUserCouponList(maps) + //if len(userCoupons) >= req.SingleQuantity { + // return false, errors.New("用户已有该优惠卷") + //} // 开始事务 tx := global.Db.Begin() From 859c9f56d0e545f58ed6fc8e91a99248dcb96ce7 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 7 Jun 2024 08:40:14 +0800 Subject: [PATCH 47/78] =?UTF-8?q?=E4=BC=98=E6=83=A0=E5=8D=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/coupon.go | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/api/service/coupon.go b/api/service/coupon.go index 192da62..14b49c5 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -509,13 +509,6 @@ func (r *CouponService) GrantSystemCoupon(couponId, adminUserId int64, req reque return false, errors.New("优惠卷非正常状态,不支持发放") } - // 检测订单过期时间 - now := time.Now() - validEndTime := time.Time(*coupon.ValidEndTime) - if now.After(validEndTime) { - return false, errors.New("优惠卷已过期,不支持发放") - } - // 检测优惠卷剩余数量 remainingQuantity := coupon.CouponCount - coupon.CouponTakeCount if remainingQuantity <= 0 { @@ -528,6 +521,7 @@ func (r *CouponService) GrantSystemCoupon(couponId, adminUserId int64, req reque } // 检测优惠卷过期时间 + now := time.Now() now = now.Add(time.Minute * 10) if coupon.ValidType == 1 { // 1:绝对时效 From 035676ba5797d7363e3a38c89809c8c0c4fb30f2 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 7 Jun 2024 09:19:04 +0800 Subject: [PATCH 48/78] 1 --- api/dao/couponGrant.go | 17 ++++++++++--- api/dto/CouponGrant.go | 54 ++++++++++++++++++++++++++++++++-------- api/model/couponGrant.go | 1 + api/service/coupon.go | 10 +++++--- 4 files changed, 64 insertions(+), 18 deletions(-) diff --git a/api/dao/couponGrant.go b/api/dao/couponGrant.go index 815b33f..8859462 100644 --- a/api/dao/couponGrant.go +++ b/api/dao/couponGrant.go @@ -11,8 +11,8 @@ type CouponGrantDao struct { } // GetCouponGrantById 获取数据-id -func (r *CouponGrantDao) GetCouponGrantById(orderServiceId int64) (m *model.CouponGrant, err error) { - err = global.Db.First(&m, orderServiceId).Error +func (r *CouponGrantDao) GetCouponGrantById(couponId int64) (m *model.CouponGrant, err error) { + err = global.Db.First(&m, couponId).Error if err != nil { return nil, err } @@ -20,8 +20,17 @@ func (r *CouponGrantDao) GetCouponGrantById(orderServiceId int64) (m *model.Coup } // GetCouponGrantPreloadById 获取数据-加载全部关联-id -func (r *CouponGrantDao) GetCouponGrantPreloadById(orderServiceId int64) (m *model.CouponGrant, err error) { - err = global.Db.Preload(clause.Associations).First(&m, orderServiceId).Error +func (r *CouponGrantDao) GetCouponGrantPreloadById(couponId int64) (m *model.CouponGrant, err error) { + err = global.Db.Preload(clause.Associations).First(&m, couponId).Error + if err != nil { + return nil, err + } + return m, nil +} + +// GetCouponGrantListPreloadByCouponId 获取数据-加载全部关联-id +func (r *CouponGrantDao) GetCouponGrantListPreloadByCouponId(couponId int64) (m []*model.CouponGrant, err error) { + err = global.Db.Preload(clause.Associations).Where("coupon_id = ?", couponId).Find(&m).Error if err != nil { return nil, err } diff --git a/api/dto/CouponGrant.go b/api/dto/CouponGrant.go index 5593855..d11ecb8 100644 --- a/api/dto/CouponGrant.go +++ b/api/dto/CouponGrant.go @@ -2,22 +2,25 @@ package dto import ( "fmt" + "hospital-admin-api/api/dao" "hospital-admin-api/api/model" ) // CouponGrantDto 发放优惠券表 type CouponGrantDto struct { - GrantId string `json:"grant_id"` // 主键id - CouponId string `json:"coupon_id"` // 优惠卷id - GrantType int `json:"grant_type"` // 发放类型(1:具体用户 2:未拥有用户) - UserId string `json:"user_id"` // 用户id(发放类型为具体用户时存在) - TotalQuantity int `json:"total_quantity"` // 目标发放数量 - GrantQuantity int `json:"grant_quantity"` // 已发放数量 - GrantResult int `json:"grant_result"` // 发放结果(1:成功 2:发放中 3:部分 4:失败) - StopReason string `json:"stop_reason"` // 停止原因 - AdminUserId string `json:"admin_user_id"` // 后台操作用户id - CreatedAt model.LocalTime `json:"created_at"` // 创建时间 - UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 + GrantId string `json:"grant_id"` // 主键id + CouponId string `json:"coupon_id"` // 优惠卷id + GrantType int `json:"grant_type"` // 发放类型(1:具体用户 2:未拥有用户) + UserId string `json:"user_id"` // 用户id(发放类型为具体用户时存在) + TotalQuantity int `json:"total_quantity"` // 目标发放数量 + GrantQuantity int `json:"grant_quantity"` // 已发放数量 + GrantResult int `json:"grant_result"` // 发放结果(1:成功 2:发放中 3:部分 4:失败) + StopReason string `json:"stop_reason"` // 停止原因 + AdminUserId string `json:"admin_user_id"` // 后台操作用户id + CreatedAt model.LocalTime `json:"created_at"` // 创建时间 + UpdatedAt model.LocalTime `json:"updated_at"` // 修改时间 + UserName string `json:"user_name"` // 用户名称 + AdminUserName string `json:"admin_user_name"` // 操作人名称 } // GetCouponGrantDto 优惠卷详情 @@ -58,6 +61,14 @@ func GetCouponGrantListDto(m []*model.CouponGrant) []*CouponGrantDto { UpdatedAt: v.UpdatedAt, } + if v.User != nil { + response.LoadUserAttr(v.User) + } + + if v.AdminUserId != 0 { + response.LoadAdminUserName(v.AdminUserId) + } + // 将转换后的结构体添加到新切片中 responses[i] = response } @@ -65,3 +76,24 @@ func GetCouponGrantListDto(m []*model.CouponGrant) []*CouponGrantDto { return responses } + +// LoadUserAttr 加载用户属性 +func (r *CouponGrantDto) LoadUserAttr(m *model.User) *CouponGrantDto { + if m != nil { + r.UserName = m.UserName + } + return r +} + +// LoadAdminUserName 加载后台用户属性 +func (r *CouponGrantDto) LoadAdminUserName(adminUserId int64) *CouponGrantDto { + if adminUserId != 0 { + // 获取后台操作人记录 + adminUserDao := dao.AdminUserDao{} + adminUser, _ := adminUserDao.GetAdminUserFirstById(adminUserId) + if adminUser != nil { + r.AdminUserName = adminUser.NickName + } + } + return r +} diff --git a/api/model/couponGrant.go b/api/model/couponGrant.go index 0a11d9b..1867750 100644 --- a/api/model/couponGrant.go +++ b/api/model/couponGrant.go @@ -18,6 +18,7 @@ type CouponGrant struct { StopReason string `gorm:"column:stop_reason;type:varchar(255);comment:停止原因" json:"stop_reason"` AdminUserId int64 `gorm:"column:admin_user_id;type:bigint(19);comment:后台操作用户id" json:"admin_user_id"` Model + User *User `gorm:"foreignKey:UserId;references:user_id" json:"user"` // 用户 } func (m *CouponGrant) TableName() string { diff --git a/api/service/coupon.go b/api/service/coupon.go index 14b49c5..ef614fd 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -22,17 +22,21 @@ type CouponService struct { // GetSystemCoupon 系统优惠卷详情 func (r *CouponService) GetSystemCoupon(couponId int64) (g *dto.CouponDto, err error) { couponDao := dao.CouponDao{} - coupon, err := couponDao.GetCouponPreloadById(couponId) + coupon, err := couponDao.GetCouponById(couponId) if err != nil || coupon == nil { return nil, errors.New(err.Error()) } + // 获取优惠卷发放数据 + couponGrantDao := dao.CouponGrantDao{} + couponGrants, err := couponGrantDao.GetCouponGrantListPreloadByCouponId(coupon.CouponId) + // 处理返回值 g = dto.GetCouponDto(coupon) // 加载发放优惠卷数据 - if len(coupon.CouponGrant) > 0 { - g = g.LoadCouponGrant(coupon.CouponGrant) + if len(couponGrants) > 0 { + g = g.LoadCouponGrant(couponGrants) } // 加载关联问诊类型 From db0e61429db41f59c6022233fd1baecff128889c Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 7 Jun 2024 12:28:23 +0800 Subject: [PATCH 49/78] 2 --- api/dao/userDoctor.go | 5 +++++ api/requests/userDoctor.go | 1 + 2 files changed, 6 insertions(+) diff --git a/api/dao/userDoctor.go b/api/dao/userDoctor.go index 0ea6ca7..1e2e252 100644 --- a/api/dao/userDoctor.go +++ b/api/dao/userDoctor.go @@ -366,6 +366,11 @@ func (r *UserDoctorDao) GetUserDoctorListSearch(req requests.GetUserDoctorList) return db.Select("hospital_id,hospital_name,hospital_level_name") }) + // 医生id + if req.DoctorId != "" { + query = query.Where("doctor_id = ?", req.DoctorId) + } + // 用户名称 if req.UserName != "" { query = query.Where("user_name LIKE ?", "%"+req.UserName+"%") diff --git a/api/requests/userDoctor.go b/api/requests/userDoctor.go index cf61673..3d06635 100644 --- a/api/requests/userDoctor.go +++ b/api/requests/userDoctor.go @@ -138,6 +138,7 @@ type PutMulti struct { // GetUserDoctorList 获取医生列表 type GetUserDoctorList struct { + DoctorId string `json:"doctor_id" form:"doctor_id" label:"医生id"` UserName string `json:"user_name" form:"user_name" label:"医生姓名"` IDCardStatus *int `json:"idcard_status" form:"idcard_status" label:"身份证状态"` // (0:未认证 1:认证通过 2:认证失败) IdenAuthStatus *int `json:"iden_auth_status" form:"iden_auth_status" label:"认证状态"` // (0:未认证 1:认证通过 2:审核中 3:认证失败) From c00052ae627099908b45856da925b38b36e0f996 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 7 Jun 2024 13:35:42 +0800 Subject: [PATCH 50/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=81=A5=E5=BA=B7=E5=8C=85=E5=88=97=E8=A1=A8-?= =?UTF-8?q?=E9=99=90=E5=88=B6=E6=9D=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/healthPackage.go | 32 ++++++++++++++++++++++++++++++++ api/dao/healthPackage.go | 19 +++++++++++++++++++ api/requests/healthPackage.go | 6 ++++++ api/router/router.go | 3 +++ 4 files changed, 60 insertions(+) diff --git a/api/controller/healthPackage.go b/api/controller/healthPackage.go index 07cba00..6efbf9b 100644 --- a/api/controller/healthPackage.go +++ b/api/controller/healthPackage.go @@ -56,6 +56,38 @@ func (r *HealthPackage) GetHealthPackagePage(c *gin.Context) { responses.OkWithData(result, c) } +// GetHealthPackageList 获取健康包列表-限制条数 +func (r *HealthPackage) GetHealthPackageList(c *gin.Context) { + healthPackageRequest := requests.HealthPackageRequest{} + req := healthPackageRequest.GetHealthPackageList + 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 + } + + healthPackageDao := dao.HealthPackageDao{} + healthPackage, err := healthPackageDao.GetHealthPackageListSearch(req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 处理返回值 + getHealthPackageListResponses := dto.GetHealthPackageListDto(healthPackage) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(getHealthPackageListResponses, c) +} + // GetHealthPackage 获取健康包详情 func (r *HealthPackage) GetHealthPackage(c *gin.Context) { id := c.Param("package_id") diff --git a/api/dao/healthPackage.go b/api/dao/healthPackage.go index 1497adf..81a5a7c 100644 --- a/api/dao/healthPackage.go +++ b/api/dao/healthPackage.go @@ -88,3 +88,22 @@ func (r *HealthPackageDao) GetHealthPackagePageSearch(req requests.GetHealthPack } return m, totalRecords, nil } + +// GetHealthPackageListSearch 获取健康包列表-限制条数 +func (r *HealthPackageDao) GetHealthPackageListSearch(req requests.GetHealthPackageList) (m []*model.HealthPackage, err error) { + // 构建查询条件 + query := global.Db.Model(&model.HealthPackage{}) + + // 健康包-关联商品 + query = query.Preload("HealthPackageProduct") + + // 排序 + query = query.Order("created_at desc") + + err = query.Limit(req.Limit).Find(&m).Error + if err != nil { + return nil, err + } + + return m, nil +} diff --git a/api/requests/healthPackage.go b/api/requests/healthPackage.go index 0eff1fe..2d19bda 100644 --- a/api/requests/healthPackage.go +++ b/api/requests/healthPackage.go @@ -4,6 +4,7 @@ type HealthPackageRequest struct { GetHealthPackagePage // 获取健康包列表-分页 PutHealthPackage // 修改健康包 AddHealthPackage // 新增健康包 + GetHealthPackageList // 获取健康包列表-限制条数 } // GetHealthPackagePage 获取健康包列表-分页 @@ -12,6 +13,11 @@ type GetHealthPackagePage struct { PageSize int `json:"page_size" form:"page_size" label:"每页个数"` } +// GetHealthPackageList 获取健康包列表-限制条数 +type GetHealthPackageList struct { + Limit int `json:"limit" form:"limit" label:"限制条数"` +} + // PutHealthPackage 修改健康包 type PutHealthPackage struct { ServiceCount int `json:"service_count" form:"service_count" label:"总服务次数" validate:"required,min=1"` diff --git a/api/router/router.go b/api/router/router.go index 0e166f0..acda2ab 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -585,6 +585,9 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 获取健康包列表-分页 healthGroup.POST("/page", api.HealthPackage.GetHealthPackagePage) + // 获取健康包列表-限制条数 + healthGroup.GET("/list", api.HealthPackage.GetHealthPackageList) + // 获取健康包详情 healthGroup.GET("/:package_id", api.HealthPackage.GetHealthPackage) From 47131b0ad9125e31848e64b5194f0c308a152ebd Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 7 Jun 2024 17:19:18 +0800 Subject: [PATCH 51/78] 1 --- api/service/doctorConfigFollowPackage.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/service/doctorConfigFollowPackage.go b/api/service/doctorConfigFollowPackage.go index b31394b..6ead267 100644 --- a/api/service/doctorConfigFollowPackage.go +++ b/api/service/doctorConfigFollowPackage.go @@ -186,7 +186,7 @@ func (r *DoctorConfigFollowPackageService) PutDoctorFollow(followPackageId int64 return false, errors.New("服务价格只允许设置在10-9999范围内") } - if item.ServicePrice != 30 && item.ServicePrice != 90 && item.ServicePrice != 180 && item.ServicePrice != 360 { + if item.ServicePeriod != 30 && item.ServicePeriod != 90 && item.ServicePeriod != 180 && item.ServicePeriod != 360 { tx.Rollback() return false, errors.New("服务周期错误") } From 4545359713ceba1f591a80de7cd62f8457f9387f Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 7 Jun 2024 17:19:51 +0800 Subject: [PATCH 52/78] 2 --- api/service/doctorConfigFollowPackage.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/service/doctorConfigFollowPackage.go b/api/service/doctorConfigFollowPackage.go index 6ead267..55c50ba 100644 --- a/api/service/doctorConfigFollowPackage.go +++ b/api/service/doctorConfigFollowPackage.go @@ -284,7 +284,7 @@ func (r *DoctorConfigFollowPackageService) AddDoctorFollow(req requests.AddDocto return false, errors.New("服务价格只允许设置在10-9999范围内") } - if item.ServicePrice != 30 && item.ServicePrice != 90 && item.ServicePrice != 180 && item.ServicePrice != 360 { + if item.ServicePeriod != 30 && item.ServicePeriod != 90 && item.ServicePeriod != 180 && item.ServicePeriod != 360 { tx.Rollback() return false, errors.New("服务周期错误") } From cb00d5a0824d24f0293566709bb27e15c18462e1 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 11 Jun 2024 13:48:35 +0800 Subject: [PATCH 53/78] =?UTF-8?q?=E4=BC=98=E6=83=A0=E5=8D=B7=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E9=98=9F=E5=88=97=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/coupon.go | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/api/service/coupon.go b/api/service/coupon.go index ef614fd..2f4cbc6 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -271,6 +271,41 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err } // 增加优惠卷过期队列 + if coupon.ValidType == 1 { + validEndTime := time.Time(*coupon.ValidStartTime) + + // 计算当天的结束时间 + now := time.Now() + year, month, day := now.Date() + location := now.Location() + endOfDay := time.Date(year, month, day, 23, 59, 59, 0, location) + if validEndTime.Before(endOfDay) { + // 需添加队列 + // 建立队列连接 + rabbitMQ, err := rabbitMq.NewRabbitMQClient() + if err != nil { + tx.Rollback() + return false, errors.New("发放失败") + } + + defer rabbitMQ.Close() + + data := make(map[string]interface{}) + data["coupon_id"] = fmt.Sprintf("%d", coupon.CouponId) + + delay := validEndTime.Sub(time.Now()) + + if delay < 10 { + delay = 10 * time.Second + } + + err = rabbitMQ.PublishWithDelay("coupon.expired.delay.queue", "amqp.delay.direct", "CouponExpired", data, delay) + if err != nil { + tx.Rollback() + return false, err + } + } + } tx.Commit() return true, nil @@ -447,6 +482,8 @@ func (r *CouponService) PutSystemCoupon(couponId int64, req requests.PutSystemCo return false, errors.New(err.Error()) } + // 新增队列 + tx.Commit() return true, nil } @@ -526,7 +563,6 @@ func (r *CouponService) GrantSystemCoupon(couponId, adminUserId int64, req reque // 检测优惠卷过期时间 now := time.Now() - now = now.Add(time.Minute * 10) if coupon.ValidType == 1 { // 1:绝对时效 validStartTime := time.Time(*coupon.ValidStartTime) @@ -535,7 +571,7 @@ func (r *CouponService) GrantSystemCoupon(couponId, adminUserId int64, req reque } validEndTime := time.Time(*coupon.ValidEndTime) - if now.After(validEndTime) { + if now.Add(time.Minute * 10).After(validEndTime) { return false, errors.New("优惠卷即将过期,不支持发放") } } From 3a0ebf9a366ca0b616fb16d27f311eff0e7025d1 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 11 Jun 2024 15:53:27 +0800 Subject: [PATCH 54/78] =?UTF-8?q?=E5=8F=91=E6=94=BE=E4=BC=98=E6=83=A0?= =?UTF-8?q?=E5=8D=B7=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=BF=87=E6=9C=9F=E9=98=9F?= =?UTF-8?q?=E5=88=97=E6=97=B6=E9=97=B4=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/coupon.go | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/api/service/coupon.go b/api/service/coupon.go index 2f4cbc6..8436a78 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -187,7 +187,14 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err // 时间区间 if req.ValidStartTime != nil { - t, err := time.Parse("2006-01-02 15:04:05", *req.ValidStartTime) + // 获取本地时区 + location, err := time.LoadLocation("Local") + if err != nil { + tx.Rollback() + return false, errors.New("新增失败") + } + + t, err := time.ParseInLocation("2006-01-02 15:04:05", *req.ValidStartTime, location) if err != nil { tx.Rollback() return false, errors.New("新增失败") @@ -199,7 +206,15 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err } if req.ValidEndTime != nil { - t, err := time.Parse("2006-01-02 15:04:05", *req.ValidEndTime) + // 获取本地时区 + location, err := time.LoadLocation("Local") + if err != nil { + tx.Rollback() + return false, errors.New("新增失败") + } + + t, err := time.ParseInLocation("2006-01-02 15:04:05", *req.ValidEndTime, location) + fmt.Println(t) if err != nil { tx.Rollback() return false, errors.New("新增失败") @@ -272,7 +287,7 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err // 增加优惠卷过期队列 if coupon.ValidType == 1 { - validEndTime := time.Time(*coupon.ValidStartTime) + validEndTime := time.Time(*coupon.ValidEndTime) // 计算当天的结束时间 now := time.Now() @@ -293,7 +308,7 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err data := make(map[string]interface{}) data["coupon_id"] = fmt.Sprintf("%d", coupon.CouponId) - delay := validEndTime.Sub(time.Now()) + delay := validEndTime.Sub(now) if delay < 10 { delay = 10 * time.Second From 2f0906718e2bd1cbbaf47bd044ea8dec76097266 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Tue, 11 Jun 2024 17:23:34 +0800 Subject: [PATCH 55/78] =?UTF-8?q?=E5=8F=91=E6=94=BE=E4=BC=98=E6=83=A0?= =?UTF-8?q?=E5=8D=B7=EF=BC=8C=E5=A2=9E=E5=8A=A0=E8=BF=87=E6=9C=9F=E9=98=9F?= =?UTF-8?q?=E5=88=97=E6=97=B6=E9=97=B4=E5=A4=84=E7=90=861?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/coupon.go | 1 - 1 file changed, 1 deletion(-) diff --git a/api/service/coupon.go b/api/service/coupon.go index 8436a78..7d5e3ac 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -214,7 +214,6 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err } t, err := time.ParseInLocation("2006-01-02 15:04:05", *req.ValidEndTime, location) - fmt.Println(t) if err != nil { tx.Rollback() return false, errors.New("新增失败") From 4eb92a6aa834b76c03560de9b67fca8aa0abf65e Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 12 Jun 2024 13:28:56 +0800 Subject: [PATCH 56/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=8C=85=E8=AE=A2=E5=8D=95=E5=85=B3=E8=81=94?= =?UTF-8?q?=E9=97=AE=E8=AF=8A=E8=AE=A2=E5=8D=95=E5=8F=96=E6=B6=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/orderServicePackage.go | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/api/service/orderServicePackage.go b/api/service/orderServicePackage.go index 4c311a0..0bbdab9 100644 --- a/api/service/orderServicePackage.go +++ b/api/service/orderServicePackage.go @@ -378,17 +378,8 @@ func (r *OrderServicePackageService) CancelOrderServicePackage(req requests.Canc refundId = "模拟退款:" + strconv.FormatInt(global.Snowflake.Generate().Int64(), 10) refundStatus = 3 successTime = time.Now() - - // 模拟退款时手动退还优惠卷 - if orderInquiry.CouponAmountTotal > 0 { - orderService := OrderService{} - res, err := orderService.ReturnOrderCoupon(orderInquiry.InquiryNo, tx) - if err != nil || !res { - // 退还优惠卷失败 - tx.Rollback() - return false, err - } - } + // 退款编号 + refundNo = strconv.FormatInt(global.Snowflake.Generate().Int64(), 10) // 修改订单为取消 orderData := make(map[string]interface{}) @@ -423,7 +414,7 @@ func (r *OrderServicePackageService) CancelOrderServicePackage(req requests.Canc RefundNo: refundNo, RefundId: refundId, RefundStatus: refundStatus, - RefundTotal: *req.RefundAmount, + RefundTotal: orderInquiry.PaymentAmountTotal, RefundReason: req.CancelRemarks, } @@ -446,7 +437,7 @@ func (r *OrderServicePackageService) CancelOrderServicePackage(req requests.Canc InquiryRefundNo: refundNo, RefundId: refundId, InquiryRefundStatus: refundStatus, - RefundTotal: *req.RefundAmount, + RefundTotal: orderInquiry.PaymentAmountTotal, RefundReason: req.CancelRemarks, SuccessTime: model.LocalTime(successTime), } From 272e206514b92f84b2c5fe8935a4147592feff19 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Wed, 12 Jun 2024 15:38:16 +0800 Subject: [PATCH 57/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=9C=B0=E5=8C=BA?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=9C=B0=E5=8C=BAid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/area.go | 4 ++-- api/service/area.go | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/api/controller/area.go b/api/controller/area.go index d61a027..abf04c6 100644 --- a/api/controller/area.go +++ b/api/controller/area.go @@ -64,13 +64,13 @@ func (r *Area) AddArea(c *gin.Context) { // 业务处理 areaService := service.AreaService{} - _, err := areaService.AddArea(req) + _, areaId, err := areaService.AddArea(req) if err != nil { responses.FailWithMessage(err.Error(), c) return } - responses.Ok(c) + responses.OkWithData(areaId, c) } // PutArea 修改地区 diff --git a/api/service/area.go b/api/service/area.go index 15f24fa..bb58daf 100644 --- a/api/service/area.go +++ b/api/service/area.go @@ -13,9 +13,9 @@ import ( type AreaService struct{} // AddArea 新增地区 -func (r *AreaService) AddArea(req requests.AddArea) (bool, error) { +func (r *AreaService) AddArea(req requests.AddArea) (bool, string, error) { if *req.AreaType == 1 { - return false, errors.New("不可添加国家") + return false, "", errors.New("不可添加国家") } // 检测上级是否存在 @@ -35,7 +35,7 @@ func (r *AreaService) AddArea(req requests.AddArea) (bool, error) { areaDao := dao.AreaDao{} _, err := areaDao.GetAreaList(maps) if err != nil { - return false, errors.New("上级地区错误") + return false, "", errors.New("上级地区错误") } // 开始事务 @@ -50,7 +50,7 @@ func (r *AreaService) AddArea(req requests.AddArea) (bool, error) { parentId, err := strconv.ParseInt(req.ParentId, 10, 64) if err != nil { tx.Rollback() - return false, errors.New("新增失败") + return false, "", errors.New("新增失败") } // 新增优惠卷表 @@ -64,11 +64,13 @@ func (r *AreaService) AddArea(req requests.AddArea) (bool, error) { area, err = areaDao.AddArea(tx, area) if err != nil || area == nil { tx.Rollback() - return false, errors.New(err.Error()) + return false, "", errors.New(err.Error()) } + areaId := fmt.Sprintf("%d", area.AreaId) + tx.Commit() - return true, nil + return true, areaId, nil } // PutArea 修改地区 From 69a586272a24eadb709d1d8744f934a949fd2d82 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 13 Jun 2024 09:13:37 +0800 Subject: [PATCH 58/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=97=AE=E8=AF=8A?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E8=AF=A6=E6=83=85=E4=B8=AD=E7=9A=84=20?= =?UTF-8?q?=E7=97=85=E4=BE=8B=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dto/OrderInquiryCase.go | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/api/dto/OrderInquiryCase.go b/api/dto/OrderInquiryCase.go index b756891..ef6fe1e 100644 --- a/api/dto/OrderInquiryCase.go +++ b/api/dto/OrderInquiryCase.go @@ -25,7 +25,7 @@ type OrderInquiryCaseDto struct { DiseaseClassName string `json:"disease_class_name"` // 疾病名称-系统 DiagnosisDate model.LocalTime `json:"diagnosis_date"` // 确诊日期 DiseaseDesc string `json:"disease_desc"` // 病情描述(主诉) - DiagnoseImages []*string `json:"diagnose_images"` // 复诊凭证(多个使用逗号分隔) + DiagnoseImages []string `json:"diagnose_images"` // 复诊凭证(多个使用逗号分隔) IsAllergyHistory *int `json:"is_allergy_history"` // 是否存在过敏史(0:否 1:是) AllergyHistory string `json:"allergy_history"` // 过敏史描述 IsFamilyHistory *int `json:"is_family_history"` // 是否存在家族病史(0:否 1:是) @@ -49,12 +49,11 @@ type OrderInquiryCaseDto struct { func GetOrderInquiryCaseDto(m *model.OrderInquiryCase) *OrderInquiryCaseDto { // 复诊凭证 - var diagnoseImages []*string + var diagnoseImages []string if m.DiagnoseImages != "" { - diagnoseImages := strings.Split(m.DiagnoseImages, ",") - - for i, image := range diagnoseImages { - diagnoseImages[i] = utils.AddOssDomain(image) + results := strings.Split(m.DiagnoseImages, ",") + for _, result := range results { + diagnoseImages = append(diagnoseImages, utils.AddOssDomain(result)) } } @@ -89,6 +88,16 @@ func GetOrderInquiryCaseDto(m *model.OrderInquiryCase) *OrderInquiryCaseDto { } func GetMaskOrderInquiryCaseDto(m *model.OrderInquiryCase) *OrderInquiryCaseDto { + // 复诊凭证 + var diagnoseImages []string + + if m.DiagnoseImages != "" { + results := strings.Split(m.DiagnoseImages, ",") + for _, result := range results { + diagnoseImages = append(diagnoseImages, utils.AddOssDomain(result)) + } + } + return &OrderInquiryCaseDto{ InquiryCaseId: fmt.Sprintf("%d", m.InquiryCaseId), UserId: fmt.Sprintf("%d", m.InquiryCaseId), @@ -104,6 +113,7 @@ func GetMaskOrderInquiryCaseDto(m *model.OrderInquiryCase) *OrderInquiryCaseDto DiseaseClassName: m.DiseaseClassName, DiagnosisDate: m.DiagnosisDate, DiseaseDesc: m.DiseaseDesc, + DiagnoseImages: diagnoseImages, CreatedAt: m.CreatedAt, UpdatedAt: m.UpdatedAt, } From c83299f2f4c77fc8ff0407e3dab272faa1235bdf Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 13 Jun 2024 09:29:34 +0800 Subject: [PATCH 59/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=97=AE=E8=AF=8A?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E8=AF=A6=E6=83=85=E4=B8=AD=E7=9A=84=20?= =?UTF-8?q?=E7=97=85=E4=BE=8B=E6=95=B0=E6=8D=AE1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dto/OrderInquiryCase.go | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/api/dto/OrderInquiryCase.go b/api/dto/OrderInquiryCase.go index ef6fe1e..4f2c4b1 100644 --- a/api/dto/OrderInquiryCase.go +++ b/api/dto/OrderInquiryCase.go @@ -5,7 +5,6 @@ import ( "hospital-admin-api/api/dao" "hospital-admin-api/api/model" "hospital-admin-api/utils" - "strings" ) type OrderInquiryCaseDto struct { @@ -25,7 +24,7 @@ type OrderInquiryCaseDto struct { DiseaseClassName string `json:"disease_class_name"` // 疾病名称-系统 DiagnosisDate model.LocalTime `json:"diagnosis_date"` // 确诊日期 DiseaseDesc string `json:"disease_desc"` // 病情描述(主诉) - DiagnoseImages []string `json:"diagnose_images"` // 复诊凭证(多个使用逗号分隔) + DiagnoseImages string `json:"diagnose_images"` // 复诊凭证(多个使用逗号分隔) IsAllergyHistory *int `json:"is_allergy_history"` // 是否存在过敏史(0:否 1:是) AllergyHistory string `json:"allergy_history"` // 过敏史描述 IsFamilyHistory *int `json:"is_family_history"` // 是否存在家族病史(0:否 1:是) @@ -48,15 +47,6 @@ type OrderInquiryCaseDto struct { } func GetOrderInquiryCaseDto(m *model.OrderInquiryCase) *OrderInquiryCaseDto { - // 复诊凭证 - var diagnoseImages []string - if m.DiagnoseImages != "" { - results := strings.Split(m.DiagnoseImages, ",") - for _, result := range results { - diagnoseImages = append(diagnoseImages, utils.AddOssDomain(result)) - } - } - return &OrderInquiryCaseDto{ InquiryCaseId: fmt.Sprintf("%d", m.InquiryCaseId), UserId: fmt.Sprintf("%d", m.InquiryCaseId), @@ -74,7 +64,7 @@ func GetOrderInquiryCaseDto(m *model.OrderInquiryCase) *OrderInquiryCaseDto { DiseaseClassName: m.DiseaseClassName, DiagnosisDate: m.DiagnosisDate, DiseaseDesc: m.DiseaseDesc, - DiagnoseImages: diagnoseImages, + DiagnoseImages: m.DiagnoseImages, IsAllergyHistory: m.IsAllergyHistory, AllergyHistory: m.AllergyHistory, IsFamilyHistory: m.IsFamilyHistory, @@ -88,16 +78,6 @@ func GetOrderInquiryCaseDto(m *model.OrderInquiryCase) *OrderInquiryCaseDto { } func GetMaskOrderInquiryCaseDto(m *model.OrderInquiryCase) *OrderInquiryCaseDto { - // 复诊凭证 - var diagnoseImages []string - - if m.DiagnoseImages != "" { - results := strings.Split(m.DiagnoseImages, ",") - for _, result := range results { - diagnoseImages = append(diagnoseImages, utils.AddOssDomain(result)) - } - } - return &OrderInquiryCaseDto{ InquiryCaseId: fmt.Sprintf("%d", m.InquiryCaseId), UserId: fmt.Sprintf("%d", m.InquiryCaseId), @@ -113,7 +93,7 @@ func GetMaskOrderInquiryCaseDto(m *model.OrderInquiryCase) *OrderInquiryCaseDto DiseaseClassName: m.DiseaseClassName, DiagnosisDate: m.DiagnosisDate, DiseaseDesc: m.DiseaseDesc, - DiagnoseImages: diagnoseImages, + DiagnoseImages: m.DiagnoseImages, CreatedAt: m.CreatedAt, UpdatedAt: m.UpdatedAt, } From 326e7ef32dc55f329d7724cbb0f541c9fd81da37 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 13 Jun 2024 13:16:26 +0800 Subject: [PATCH 60/78] =?UTF-8?q?=E5=8F=96=E6=B6=88=E8=8D=AF=E5=93=81?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=9B=9E=E9=80=80?= =?UTF-8?q?=E5=81=A5=E5=BA=B7=E5=8C=85=E5=B7=B2=E4=BD=BF=E7=94=A8=E8=8D=AF?= =?UTF-8?q?=E5=93=81=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dao/orderServicePackage.go | 9 +++++++ api/dao/orderServicePackageProduct.go | 18 ++++++++++++++ api/service/orderProduct.go | 36 ++++++++++++++++++++++++++- api/service/orderServicePackage.go | 18 ++++++++++++++ 4 files changed, 80 insertions(+), 1 deletion(-) diff --git a/api/dao/orderServicePackage.go b/api/dao/orderServicePackage.go index 5071020..9d4ec53 100644 --- a/api/dao/orderServicePackage.go +++ b/api/dao/orderServicePackage.go @@ -77,6 +77,15 @@ func (r *OrderServicePackageDao) GetOrderServicePackageList(maps interface{}) (m return m, nil } +// GetOrderServicePackage 获取 +func (r *OrderServicePackageDao) GetOrderServicePackage(maps interface{}) (m *model.OrderServicePackage, err error) { + err = global.Db.Where(maps).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + // AddOrderServicePackage 新增 func (r *OrderServicePackageDao) AddOrderServicePackage(tx *gorm.DB, model *model.OrderServicePackage) (*model.OrderServicePackage, error) { if err := tx.Create(model).Error; err != nil { diff --git a/api/dao/orderServicePackageProduct.go b/api/dao/orderServicePackageProduct.go index c5dde9e..4fef133 100644 --- a/api/dao/orderServicePackageProduct.go +++ b/api/dao/orderServicePackageProduct.go @@ -46,6 +46,15 @@ func (r *OrderServicePackageProductDao) EditOrderServicePackageProduct(tx *gorm. return nil } +// EditOrderServicePackageProductById 修改 +func (r *OrderServicePackageProductDao) EditOrderServicePackageProductById(tx *gorm.DB, serviceProductId int64, data interface{}) error { + err := tx.Model(&model.OrderServicePackageProduct{}).Where("service_product_id = ?", serviceProductId).Updates(data).Error + if err != nil { + return err + } + return nil +} + // GetOrderServicePackageProductList 获取列表 func (r *OrderServicePackageProductDao) GetOrderServicePackageProductList(maps interface{}) (m []*model.OrderServicePackageProduct, err error) { err = global.Db.Where(maps).Find(&m).Error @@ -54,3 +63,12 @@ func (r *OrderServicePackageProductDao) GetOrderServicePackageProductList(maps i } return m, nil } + +// GetOrderServicePackageProduct 获取 +func (r *OrderServicePackageProductDao) GetOrderServicePackageProduct(maps interface{}) (m *model.OrderServicePackageProduct, err error) { + err = global.Db.Where(maps).First(&m).Error + if err != nil { + return nil, err + } + return m, nil +} diff --git a/api/service/orderProduct.go b/api/service/orderProduct.go index ca7d08d..5cba44d 100644 --- a/api/service/orderProduct.go +++ b/api/service/orderProduct.go @@ -246,7 +246,7 @@ func (r *OrderProductService) CancelOrderProduct(req requests.CancelOrderProduct return false, errors.New("取消订单失败") } - // 修改问诊订单退款状态 + // 修改订单退款状态 orderProductData["refund_status"] = refundStatus orderProductData["order_product_status"] = 5 // 订单状态(1:待支付 2:待发货 3:已发货 4:已签收 5:已取消) orderProductData["cancel_time"] = time.Now().Format("2006-01-02 15:04:05") // 订单取消时间 @@ -305,6 +305,40 @@ func (r *OrderProductService) CancelOrderProduct(req requests.CancelOrderProduct return false, errors.New(err.Error()) } + // 获取患者家庭成员进行中的服务包订单-健康包 + OrderServicePackageService := OrderServicePackageService{} + patientFamilyInProgressServicePackage, err := OrderServicePackageService.GetPatientFamilyInProgressServicePackage(orderProduct.UserPatient.UserId, orderProduct.FamilyId, orderProduct.DoctorId, 1) + if patientFamilyInProgressServicePackage != nil { + // 获取药品订单列表 + orderProductItemDao := dao.OrderProductItemDao{} + orderProductItems, err := orderProductItemDao.GetOrderProductItemByOrderProductId(orderProductId) + if err != nil || len(orderProductItems) <= 0 { + tx.Rollback() + return false, errors.New("订单数据错误") + } + + for _, item := range orderProductItems { + orderServicePackageProductDao := dao.OrderServicePackageProductDao{} + + // 回退服务包已使用药品数量 + maps := make(map[string]interface{}) + maps["order_service_id"] = patientFamilyInProgressServicePackage.OrderServiceId + maps["order_product_id"] = item.OrderProductId + maps["product_item_id"] = item.ProductItemId + maps["product_id"] = item.ProductId + orderServicePackageProduct, err := orderServicePackageProductDao.GetOrderServicePackageProduct(maps) + if err == nil && orderServicePackageProduct != nil { + orderServicePackageProductData := make(map[string]interface{}) + orderServicePackageProductData["used_quantity"] = 0 + err := orderServicePackageProductDao.EditOrderServicePackageProductById(tx, orderServicePackageProduct.ServiceProductId, orderServicePackageProductData) + if err != nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + } + } + } + // 记录日志 orderOperationLog := &model.OrderOperationLog{ OrderId: orderProduct.OrderProductId, diff --git a/api/service/orderServicePackage.go b/api/service/orderServicePackage.go index 0bbdab9..0922781 100644 --- a/api/service/orderServicePackage.go +++ b/api/service/orderServicePackage.go @@ -604,3 +604,21 @@ func (r *OrderServicePackageService) GetOrderServiceProductCanUseQuantity(orderS return remainingQuantity, err } + +// GetPatientFamilyInProgressServicePackage 获取患者家庭成员进行中的服务包订单 +func (r *OrderServicePackageService) GetPatientFamilyInProgressServicePackage(patientUserId, familyId, doctorId int64, serviceType int) (*model.OrderServicePackage, error) { + orderServicePackageDao := dao.OrderServicePackageDao{} + + maps := make(map[string]interface{}) + maps["user_id"] = patientUserId + maps["doctor_id"] = doctorId + maps["family_id"] = familyId + maps["order_service_type"] = serviceType + maps["order_service_status"] = 3 + orderServicePackage, err := orderServicePackageDao.GetOrderServicePackage(maps) + if err != nil { + return nil, err + } + + return orderServicePackage, err +} From 672661c7081f694310f5584b31c9b31127e63d27 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 13 Jun 2024 13:19:13 +0800 Subject: [PATCH 61/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=20=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=94=A8=E6=88=B7=E4=BC=98=E6=83=A0=E5=8D=B7=E5=88=97?= =?UTF-8?q?=E8=A1=A8-=E5=88=86=E9=A1=B5=20=E4=B8=AD=E4=BC=98=E6=83=A0?= =?UTF-8?q?=E5=8D=B7=E5=90=8D=E7=A7=B0=E6=90=9C=E7=B4=A2=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dao/userCoupon.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/api/dao/userCoupon.go b/api/dao/userCoupon.go index f7964f2..6a0d67a 100644 --- a/api/dao/userCoupon.go +++ b/api/dao/userCoupon.go @@ -145,7 +145,11 @@ func (r *UserCouponDao) GetUserCouponPageSearch(req requests.GetUserCouponPage, // 优惠卷名称 if req.CouponName != "" { - query = query.Where("coupon_name LIKE ?", "%"+req.CouponName+"%") + subQuery := global.Db.Model(&model.Coupon{}). + Select("coupon_id"). + Where("coupon_name LIKE ?", "%"+req.CouponName+"%") + + query = query.Where(gorm.Expr("coupon_id IN (?)", subQuery)) } // 优惠卷编号 From 7a367d329ebdbe1cde88e736092facf896bb629a Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 13 Jun 2024 13:31:14 +0800 Subject: [PATCH 62/78] 1 --- api/service/coupon.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/api/service/coupon.go b/api/service/coupon.go index 7d5e3ac..02fc902 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -753,15 +753,15 @@ func (r *CouponService) GrantSystemCoupon(couponId, adminUserId int64, req reque tx.Rollback() return false, err } - - go func() { - // 发送通知 - res, _ := PatientDistributeCoupon(coupon.CouponName, user.UserId) - if !res { - utils.LogJsonErr("CouponService-GrantSystemCoupon", "优惠卷通知发送失败") - } - }() } + + go func() { + // 发送通知 + res, _ := PatientDistributeCoupon(coupon.CouponName, user.UserId) + if !res { + utils.LogJsonErr("CouponService-GrantSystemCoupon", "优惠卷通知发送失败") + } + }() } // 添加优惠卷发放记录表 From b6032b854722d6e63ce1dbc30bd7ab768a47e54c Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 13 Jun 2024 13:39:13 +0800 Subject: [PATCH 63/78] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E4=BC=98?= =?UTF-8?q?=E6=83=A0=E9=87=91=E9=A2=9D=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dto/OrderProduct.go | 1 + api/service/orderProduct.go | 3 +++ 2 files changed, 4 insertions(+) diff --git a/api/dto/OrderProduct.go b/api/dto/OrderProduct.go index e4e37b1..203bcd3 100644 --- a/api/dto/OrderProduct.go +++ b/api/dto/OrderProduct.go @@ -60,6 +60,7 @@ type OrderProductDto struct { OrderInquiryCase *OrderInquiryCaseDto `json:"order_inquiry_case"` // 问诊病例 OrderProductCoupon *OrderProductCouponDto `json:"order_product_coupon"` // 优惠卷 ProductName string `json:"product_name"` // 药品数据 + DiscountAmount float64 `json:"discount_amount"` // 优惠金额 } // OrderProductConsigneeDto 药品订单收货人数据 diff --git a/api/service/orderProduct.go b/api/service/orderProduct.go index 5cba44d..c92b03f 100644 --- a/api/service/orderProduct.go +++ b/api/service/orderProduct.go @@ -86,6 +86,9 @@ func (r *OrderProductService) GetOrderProduct(orderProductId int64) (g *dto.Orde // 加载药品订单优惠卷数据 g.LoadOrderProductCoupon(orderProductCoupon) + // 计算优惠金额 + g.DiscountAmount = orderProduct.AmountTotal + orderProduct.LogisticsFee - orderProduct.CouponAmountTotal - orderProduct.PaymentAmountTotal + return g, nil } From 5536b3517f8f9d35cc28ca4c2eb662f9db17378e Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 13 Jun 2024 13:55:48 +0800 Subject: [PATCH 64/78] 1 --- api/service/coupon.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/api/service/coupon.go b/api/service/coupon.go index 02fc902..806a48e 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -386,7 +386,7 @@ func (r *CouponService) PutSystemCoupon(couponId int64, req requests.PutSystemCo } if &brandId != coupon.BrandId { - couponData["brand_id"] = req.InquiryType + couponData["brand_id"] = req.BrandId } } @@ -408,7 +408,7 @@ func (r *CouponService) PutSystemCoupon(couponId int64, req requests.PutSystemCo if coupon.DistributionObject == 4 { if req.DistributionWithDay != nil { if *req.DistributionWithDay != coupon.DistributionWithDay { - couponData["distribution_with_day"] = req.InquiryType + couponData["distribution_with_day"] = req.DistributionWithDay } } } @@ -416,7 +416,7 @@ func (r *CouponService) PutSystemCoupon(couponId int64, req requests.PutSystemCo // 单商品最小可使用数量 if coupon.ApplicationScope == 1 && coupon.CouponType == 3 { if req.MinUsableNumber != nil { - couponData["min_usable_number"] = req.InquiryType + couponData["min_usable_number"] = req.MinUsableNumber } } @@ -428,14 +428,14 @@ func (r *CouponService) PutSystemCoupon(couponId int64, req requests.PutSystemCo return false, errors.New("发放数量,不可低于已发放数量") } - couponData["coupon_count"] = req.InquiryType + couponData["coupon_count"] = req.CouponCount } } // 优惠卷金额 if req.CouponPrice != nil { if *req.CouponPrice != coupon.CouponPrice { - couponData["coupon_price"] = req.InquiryType + couponData["coupon_price"] = req.CouponPrice } } From 2017e1cac446ed0e894b8ee7430b8aeb48336802 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 13 Jun 2024 14:43:16 +0800 Subject: [PATCH 65/78] 1 --- api/dao/doctorConfigHealthPackage.go | 3 +++ api/dto/DoctorConfigHealthPackage.go | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/api/dao/doctorConfigHealthPackage.go b/api/dao/doctorConfigHealthPackage.go index e2ce643..ab6fc4b 100644 --- a/api/dao/doctorConfigHealthPackage.go +++ b/api/dao/doctorConfigHealthPackage.go @@ -92,6 +92,9 @@ func (r *DoctorConfigHealthPackageDao) GetDoctorHealthPageSearch(req requests.Ge return db.Omit("user_password", "salt") }) + // 医院表 + query = query.Preload("UserDoctor.Hospital") + // 手机号 if req.Mobile != "" { // 医生 diff --git a/api/dto/DoctorConfigHealthPackage.go b/api/dto/DoctorConfigHealthPackage.go index ad8175c..e18df50 100644 --- a/api/dto/DoctorConfigHealthPackage.go +++ b/api/dto/DoctorConfigHealthPackage.go @@ -52,6 +52,10 @@ func GetDoctorConfigHealthPackageListDto(m []*model.DoctorConfigHealthPackage) [ response.LoadUserDoctor(v.UserDoctor) } + if v.UserDoctor.Hospital != nil { + response.LoadUserDoctorHospital(v.UserDoctor.Hospital) + } + // 将转换后的结构体添加到新切片中 responses[i] = response } From 320f8745f40b3624878e4ad59dc97829db90de2e Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 13 Jun 2024 14:53:42 +0800 Subject: [PATCH 66/78] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E7=9C=81?= =?UTF-8?q?=E5=B8=82=E5=8C=BA=E7=9A=84=E5=BF=85=E8=A6=81=E5=85=A5=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/requests/area.go | 2 ++ api/service/area.go | 21 ++++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/api/requests/area.go b/api/requests/area.go index 3502fc8..d96b9b7 100644 --- a/api/requests/area.go +++ b/api/requests/area.go @@ -16,6 +16,7 @@ type GetAreaList struct { // AddArea 新增地区 type AddArea struct { + AreaId string `json:"area_id" form:"area_id" label:"名称" validate:"required"` AreaName string `json:"area_name" form:"area_name" label:"名称" validate:"required"` ParentId string `json:"parent_id" form:"parent_id" label:"上级编号" validate:"required"` AreaType *int `json:"area_type" form:"area_type" label:"类型(1:国家,2:省,3:市,4:区县)" validate:"required"` @@ -24,6 +25,7 @@ type AddArea struct { // PutArea 修改地区 type PutArea struct { + AreaId string `json:"area_id" form:"area_id" label:"名称" validate:"required"` AreaName string `json:"area_name" form:"area_name" label:"名称" validate:"required"` Zip string `json:"zip" form:"zip" label:"邮编"` } diff --git a/api/service/area.go b/api/service/area.go index bb58daf..f7f5407 100644 --- a/api/service/area.go +++ b/api/service/area.go @@ -53,8 +53,15 @@ func (r *AreaService) AddArea(req requests.AddArea) (bool, string, error) { return false, "", errors.New("新增失败") } + areaId, err := strconv.ParseInt(req.AreaId, 10, 64) + if err != nil { + tx.Rollback() + return false, "", errors.New("新增失败") + } + // 新增优惠卷表 area := &model.Area{ + AreaId: areaId, AreaName: req.AreaName, ParentId: parentId, Zip: req.Zip, @@ -67,10 +74,8 @@ func (r *AreaService) AddArea(req requests.AddArea) (bool, string, error) { return false, "", errors.New(err.Error()) } - areaId := fmt.Sprintf("%d", area.AreaId) - tx.Commit() - return true, areaId, nil + return true, fmt.Sprintf("%d", area.AreaId), nil } // PutArea 修改地区 @@ -102,6 +107,16 @@ func (r *AreaService) PutArea(areaId int, req requests.PutArea) (bool, error) { } } + if req.AreaId != "" { + areaId, err := strconv.ParseInt(req.AreaId, 10, 64) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + + areaData["area_id"] = areaId + } + if len(areaData) > 0 { err = areaDao.EditAreaById(tx, areaId, areaData) if err != nil || area == nil { From 032d9e2facb3403b787c45fb8014c779da10f6a6 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 13 Jun 2024 15:30:46 +0800 Subject: [PATCH 67/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=20=E5=8C=BB?= =?UTF-8?q?=E7=94=9F=E9=97=AE=E8=AF=8A=E9=85=8D=E7=BD=AE=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=85=A5=E5=8F=82=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BA=86=20=20=E8=8E=B7=E5=8F=96=E5=BC=80=E5=90=AF=E9=97=AE?= =?UTF-8?q?=E8=AF=8A=E9=85=8D=E7=BD=AE=E5=8C=BB=E7=94=9F=E5=88=97=E8=A1=A8?= =?UTF-8?q?-=E5=88=86=E9=A1=B5=20=E8=B7=AF=E7=94=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/inquiryConfig.go | 16 ++++++++-------- api/requests/inquiryConfig.go | 9 +++++++++ api/router/router.go | 4 ++-- api/service/InquiryConfig.go | 27 ++++++++++++++++++++++++--- 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/api/controller/inquiryConfig.go b/api/controller/inquiryConfig.go index eb0820a..28664f0 100644 --- a/api/controller/inquiryConfig.go +++ b/api/controller/inquiryConfig.go @@ -59,22 +59,22 @@ func (r *InquiryConfig) GetDoctorInquiryConfigPage(c *gin.Context) { // GetDoctorInquiryConfig 医生问诊配置详情 func (r *InquiryConfig) GetDoctorInquiryConfig(c *gin.Context) { - id := c.Param("inquiry_config_id") - if id == "" { - responses.FailWithMessage("缺少参数", c) + inquiryConfigRequest := requests.InquiryConfigRequest{} + req := inquiryConfigRequest.GetDoctorInquiryConfig + if err := c.ShouldBind(&req); err != nil { + responses.FailWithMessage(err.Error(), c) return } - // 将 id 转换为 int64 类型 - inquiryConfigId, err := strconv.ParseInt(id, 10, 64) - if err != nil { - responses.Fail(c) + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) return } // 业务处理 inquiryConfigService := service.InquiryConfigService{} - getUserDoctorResponses, err := inquiryConfigService.GetDoctorInquiryConfig(inquiryConfigId) + getUserDoctorResponses, err := inquiryConfigService.GetDoctorInquiryConfig(req) if err != nil { responses.FailWithMessage(err.Error(), c) return diff --git a/api/requests/inquiryConfig.go b/api/requests/inquiryConfig.go index 5ec1910..f93dad6 100644 --- a/api/requests/inquiryConfig.go +++ b/api/requests/inquiryConfig.go @@ -7,6 +7,7 @@ type InquiryConfigRequest struct { GetSystemInquiryConfigPage // 获取系统问诊配置列表-分页 PutSystemInquiryConfig // 修改系统问诊配置 GetSystemInquiryConfigDetail // 系统问诊配置详情-条件 + GetDoctorInquiryConfig // 医生问诊配置详情 } // GetDoctorInquiryConfigPage 获取开启问诊配置医生列表-分页 @@ -20,6 +21,14 @@ type GetDoctorInquiryConfigPage struct { IsEnable *int `json:"is_enable" form:"is_enable" label:"是否启用"` // 0:否 1:是 } +// GetDoctorInquiryConfig 医生问诊配置详情 +type GetDoctorInquiryConfig struct { + InquiryConfigId string `json:"inquiry_config_id" form:"inquiry_config_id" label:"主键id"` + InquiryType *int `json:"inquiry_type" form:"inquiry_type" label:"问诊类型"` // 1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药 5:检测 + InquiryMode *int `json:"inquiry_mode" form:"inquiry_mode" label:"问诊方式"` // 1:图文 2:视频 3:语音 4:电话 5:会员 + DoctorId string `json:"doctor_id" form:"doctor_id" label:"医生id"` +} + // PutDoctorInquiryConfig 修改医生问诊配置 type PutDoctorInquiryConfig struct { DoctorId string `json:"doctor_id" form:"doctor_id" validate:"required"` // 医生id diff --git a/api/router/router.go b/api/router/router.go index acda2ab..9967888 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -519,10 +519,10 @@ func privateRouter(r *gin.Engine, api controller.Api) { doctorGroup := inquiryGroup.Group("/doctor") { // 获取开启问诊配置医生列表-分页 - doctorGroup.GET("", api.InquiryConfig.GetDoctorInquiryConfigPage) + doctorGroup.GET("/page", api.InquiryConfig.GetDoctorInquiryConfigPage) // 医生问诊配置详情 - doctorGroup.GET("/:inquiry_config_id", api.InquiryConfig.GetDoctorInquiryConfig) + doctorGroup.GET("", api.InquiryConfig.GetDoctorInquiryConfig) // 修改医生问诊配置 doctorGroup.PUT("/:inquiry_config_id", api.InquiryConfig.PutDoctorInquiryConfig) diff --git a/api/service/InquiryConfig.go b/api/service/InquiryConfig.go index a395902..5319035 100644 --- a/api/service/InquiryConfig.go +++ b/api/service/InquiryConfig.go @@ -109,11 +109,32 @@ func (r *DoctorInquiryConfigService) HandleDoctorInquiryConfig(tx *gorm.DB, doct } // GetDoctorInquiryConfig 医生问诊配置详情 -func (r *DoctorInquiryConfigService) GetDoctorInquiryConfig(inquiryConfigId int64) (res *dto.DoctorInquiryConfigDto, err error) { +func (r *DoctorInquiryConfigService) GetDoctorInquiryConfig(req requests.GetDoctorInquiryConfig) (res *dto.DoctorInquiryConfigDto, err error) { doctorInquiryConfigDao := dao.DoctorInquiryConfigDao{} // 获取医生问诊配置 - doctorInquiryConfig, err := doctorInquiryConfigDao.GetDoctorInquiryConfigById(inquiryConfigId) + maps := make(map[string]interface{}) + if req.InquiryConfigId != "" { + maps["inquiry_config_id"] = req.InquiryConfigId + } else { + if req.DoctorId != "" { + maps["doctor_id"] = req.DoctorId + } + + if req.InquiryType != nil { + maps["inquiry_type"] = req.InquiryType + } + + if req.InquiryMode != nil { + maps["inquiry_mode"] = req.InquiryMode + } + } + + if len(maps) <= 0 { + return nil, errors.New("参数错误") + } + + doctorInquiryConfig, err := doctorInquiryConfigDao.GetDoctorInquiryConfig(maps) if err != nil || doctorInquiryConfig == nil { return nil, errors.New("获取失败") } @@ -132,7 +153,7 @@ func (r *DoctorInquiryConfigService) GetDoctorInquiryConfig(inquiryConfigId int6 // 获取系统问诊配置 systemInquiryConfigDao := dao.SystemInquiryConfigDao{} - maps := make(map[string]interface{}) + maps = make(map[string]interface{}) maps["inquiry_type"] = doctorInquiryConfig.InquiryType maps["inquiry_mode"] = doctorInquiryConfig.InquiryMode systemInquiryConfig, err := systemInquiryConfigDao.GetSystemInquiryConfig(maps) From 9c244603b7c26d51eb2c985e08ec1923f91690d0 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 13 Jun 2024 16:11:02 +0800 Subject: [PATCH 68/78] 1 --- api/requests/inquiryConfig.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/requests/inquiryConfig.go b/api/requests/inquiryConfig.go index f93dad6..93cc2dc 100644 --- a/api/requests/inquiryConfig.go +++ b/api/requests/inquiryConfig.go @@ -97,5 +97,5 @@ type SystemInquiryTime struct { // GetSystemInquiryConfigDetail 系统问诊配置详情-条件 type GetSystemInquiryConfigDetail struct { InquiryType *int `json:"inquiry_type" form:"inquiry_type" validate:"required,oneof=1 2 3 4 5" label:"问诊类型"` // 1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药 5:检测 - InquiryMode *int `json:"inquiry_mode" form:"inquiry_mode" validate:"required,oneof=1 2 3 4 5 6" label:"问诊方式"` + InquiryMode *int `json:"inquiry_mode" form:"inquiry_mode" validate:"required,oneof=1 2 3 4 5 6 7 8 9" label:"问诊方式"` } From 453c6c16b7363a65fa7c27b6e552742384f16b0f Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 13 Jun 2024 17:23:12 +0800 Subject: [PATCH 69/78] 2 --- api/requests/area.go | 4 ++-- api/service/area.go | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/api/requests/area.go b/api/requests/area.go index d96b9b7..79e086c 100644 --- a/api/requests/area.go +++ b/api/requests/area.go @@ -16,7 +16,7 @@ type GetAreaList struct { // AddArea 新增地区 type AddArea struct { - AreaId string `json:"area_id" form:"area_id" label:"名称" validate:"required"` + AreaId string `json:"area_id" form:"area_id" label:"地区编号" validate:"required"` AreaName string `json:"area_name" form:"area_name" label:"名称" validate:"required"` ParentId string `json:"parent_id" form:"parent_id" label:"上级编号" validate:"required"` AreaType *int `json:"area_type" form:"area_type" label:"类型(1:国家,2:省,3:市,4:区县)" validate:"required"` @@ -25,7 +25,7 @@ type AddArea struct { // PutArea 修改地区 type PutArea struct { - AreaId string `json:"area_id" form:"area_id" label:"名称" validate:"required"` + AreaId string `json:"area_id" form:"area_id" label:"地区编号" validate:"required"` AreaName string `json:"area_name" form:"area_name" label:"名称" validate:"required"` Zip string `json:"zip" form:"zip" label:"邮编"` } diff --git a/api/service/area.go b/api/service/area.go index f7f5407..0fe033c 100644 --- a/api/service/area.go +++ b/api/service/area.go @@ -38,6 +38,14 @@ func (r *AreaService) AddArea(req requests.AddArea) (bool, string, error) { return false, "", errors.New("上级地区错误") } + // 检测编码是否重复 + maps = make(map[string]interface{}) + maps["area_id"] = req.AreaId + areas, _ := areaDao.GetAreaList(maps) + if len(areas) >= 1 { + return false, "", errors.New("地区编码重复") + } + // 开始事务 tx := global.Db.Begin() defer func() { @@ -86,6 +94,14 @@ func (r *AreaService) PutArea(areaId int, req requests.PutArea) (bool, error) { return false, err } + // 检测编码是否重复 + maps := make(map[string]interface{}) + maps["area_id"] = req.AreaId + areas, err := areaDao.GetAreaList(maps) + if len(areas) > 1 { + return false, errors.New("地区编码重复") + } + // 开始事务 tx := global.Db.Begin() defer func() { From bce2afc8a7e79a925102651566c365146c71edef Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 13 Jun 2024 17:26:09 +0800 Subject: [PATCH 70/78] 3 --- api/service/area.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/api/service/area.go b/api/service/area.go index 0fe033c..663e1df 100644 --- a/api/service/area.go +++ b/api/service/area.go @@ -38,6 +38,10 @@ func (r *AreaService) AddArea(req requests.AddArea) (bool, string, error) { return false, "", errors.New("上级地区错误") } + if len(req.AreaId) > 6 { + return false, "", errors.New("请输入正确地区编码") + } + // 检测编码是否重复 maps = make(map[string]interface{}) maps["area_id"] = req.AreaId @@ -94,6 +98,10 @@ func (r *AreaService) PutArea(areaId int, req requests.PutArea) (bool, error) { return false, err } + if len(req.AreaId) > 6 { + return false, errors.New("请输入正确地区编码") + } + // 检测编码是否重复 maps := make(map[string]interface{}) maps["area_id"] = req.AreaId From 1bbdcd6ae6ebf13ddbe6131a133d268d762a896e Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 14 Jun 2024 15:09:25 +0800 Subject: [PATCH 71/78] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=8C=85=E5=BD=93=E6=9C=88=E5=B7=B2=E9=97=AE?= =?UTF-8?q?=E8=AF=8A=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/orderServicePackage.go | 32 ++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/api/service/orderServicePackage.go b/api/service/orderServicePackage.go index 0922781..7c25e3e 100644 --- a/api/service/orderServicePackage.go +++ b/api/service/orderServicePackage.go @@ -99,20 +99,30 @@ func (r *OrderServicePackageService) GetOrderServicePackageDetailInfo(orderServi // 加载服务包订单关联病例数据 g.LoadOrderServicePackageCase(orderServicePackageCase) - // 获取服务包当前月时间区间 - CurrentMonthStartDate, CurrentMonthFinishDate, err := r.getOrderServicePackageCurrentMonthDate(g.StartTime) - g.CurrentMonthStartDate = CurrentMonthStartDate.Format("2006年01月02日 15时04分") - g.CurrentMonthFinishDate = CurrentMonthFinishDate.Format("2006年01月02日 15时04分") + if g.OrderServiceStatus == 3 || g.OrderServiceStatus == 4 || g.OrderServiceStatus == 5 { + if !g.StartTime.IsEmpty() { + // 获取服务包当前月时间区间 + CurrentMonthStartDate, CurrentMonthFinishDate, err := r.getOrderServicePackageCurrentMonthDate(g.StartTime) + g.CurrentMonthStartDate = CurrentMonthStartDate.Format("2006年01月02日 15时04分") + g.CurrentMonthFinishDate = CurrentMonthFinishDate.Format("2006年01月02日 15时04分") - // 获取服务包当月已问诊次数 - g.MonthInquiryCount, err = r.GetCurrentMonthInquiryCount(g.OrderServiceType, orderServicePackage.UserId, orderServicePackage.DoctorId, CurrentMonthStartDate, CurrentMonthFinishDate) - if err != nil { - return nil, err + // 检测问诊是否服务包首次问诊 + isFirst, err := r.isFirstInquiryServicePackage(g.OrderServiceNo) + if isFirst { + g.MonthInquiryCount = 1 + } else { + // 获取服务包当月已问诊次数 + g.MonthInquiryCount, err = r.GetCurrentMonthInquiryCount(g.OrderServiceType, orderServicePackage.UserId, orderServicePackage.DoctorId, CurrentMonthStartDate, CurrentMonthFinishDate) + if err != nil { + return nil, err + } + } + + // 获取服务包当月剩余问诊次数 + g.RemainingInquiryCount = r.GetRemainingInquiryCount(orderServicePackageDetail.MonthlyFrequency, g.MonthInquiryCount) + } } - // 获取服务包当月剩余问诊次数 - g.RemainingInquiryCount = r.GetRemainingInquiryCount(orderServicePackageDetail.MonthlyFrequency, g.MonthInquiryCount) - // 健康包数据 if orderServicePackage.OrderServiceType == 1 { if g.OrderServiceStatus == 3 || g.OrderServiceStatus == 4 || g.OrderServiceStatus == 5 { From ece26a2a1773772baa4737aabf40aead581889b6 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 14 Jun 2024 15:35:37 +0800 Subject: [PATCH 72/78] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=8C=85=E5=BD=93=E6=9C=88=E5=B7=B2=E9=97=AE?= =?UTF-8?q?=E8=AF=8A=E6=AC=A1=E6=95=B01?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/orderServicePackage.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/api/service/orderServicePackage.go b/api/service/orderServicePackage.go index 7c25e3e..5dfa474 100644 --- a/api/service/orderServicePackage.go +++ b/api/service/orderServicePackage.go @@ -2,6 +2,7 @@ package service import ( "errors" + "fmt" "hospital-admin-api/api/dao" "hospital-admin-api/api/dto" "hospital-admin-api/api/model" @@ -118,6 +119,7 @@ func (r *OrderServicePackageService) GetOrderServicePackageDetailInfo(orderServi } } + fmt.Println(g.MonthInquiryCount) // 获取服务包当月剩余问诊次数 g.RemainingInquiryCount = r.GetRemainingInquiryCount(orderServicePackageDetail.MonthlyFrequency, g.MonthInquiryCount) } @@ -530,16 +532,16 @@ func (r *OrderServicePackageService) getOrderServicePackageCurrentMonthDate(star // 检测问诊是否服务包首次问诊 func (r *OrderServicePackageService) isFirstInquiryServicePackage(orderNo string) (bool, error) { - orderServicePackageDao := dao.OrderServicePackageDao{} + orderServicePackageInquiryDao := dao.OrderServicePackageInquiryDao{} maps := make(map[string]interface{}) maps["order_service_no"] = orderNo - orderServicePackage, err := orderServicePackageDao.GetOrderServicePackageList(maps) + orderServicePackageInquiry, err := orderServicePackageInquiryDao.GetOrderServicePackageInquiryList(maps) if err != nil { return false, err } - if len(orderServicePackage) == 1 { + if len(orderServicePackageInquiry) == 1 { return true, nil } From 81d90bbe5e1f384cab6e62047ef993f4de883b7f Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 14 Jun 2024 15:45:46 +0800 Subject: [PATCH 73/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dao/coupon.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/api/dao/coupon.go b/api/dao/coupon.go index 4783c67..224160d 100644 --- a/api/dao/coupon.go +++ b/api/dao/coupon.go @@ -78,6 +78,11 @@ func (r *CouponDao) GetCouponPageSearch(req requests.GetSystemCouponPage, page, query = query.Where("coupon_name LIKE ?", "%"+req.CouponName+"%") } + // 优惠卷描述 + if req.CouponDesc != "" { + query = query.Where("coupon_desc LIKE ?", "%"+req.CouponDesc+"%") + } + // 使用平台(1:小程序) if req.CouponClient != nil { query = query.Where("coupon_client = ?", req.CouponClient) From fec6306b3cf56f08ad61e221d05d9627393644a7 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 14 Jun 2024 17:21:47 +0800 Subject: [PATCH 74/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=80=80=E8=BF=98?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BC=98=E6=83=A0=E5=8D=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/OrderInquiry.go | 2 +- api/service/order.go | 4 ++-- api/service/orderProduct.go | 2 +- api/service/orderServicePackage.go | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/api/service/OrderInquiry.go b/api/service/OrderInquiry.go index 980efbc..e4fa26e 100644 --- a/api/service/OrderInquiry.go +++ b/api/service/OrderInquiry.go @@ -176,7 +176,7 @@ func (r *OrderInquiryService) CancelOrderInquiry(req requests.CancelOrderInquiry // 模拟退款时手动退还优惠卷 if orderInquiry.CouponAmountTotal > 0 { orderService := OrderService{} - res, err := orderService.ReturnOrderCoupon(orderInquiry.InquiryNo, tx) + res, err := orderService.ReturnOrderCoupon(orderInquiry.OrderId, tx) if err != nil || !res { // 退还优惠卷失败 tx.Rollback() diff --git a/api/service/order.go b/api/service/order.go index 5252cac..5b5a346 100644 --- a/api/service/order.go +++ b/api/service/order.go @@ -409,13 +409,13 @@ func (r *OrderService) PdfToImg() (bool, error) { } // ReturnOrderCoupon 退还用户优惠卷 -func (r *OrderService) ReturnOrderCoupon(orderNo string, tx *gorm.DB) (bool, error) { +func (r *OrderService) ReturnOrderCoupon(orderId int64, tx *gorm.DB) (bool, error) { orderCouponDao := dao.OrderCouponDao{} userCouponDao := dao.UserCouponDao{} // 获取该订单全部优惠卷数据 maps := make(map[string]interface{}) - maps["order_no"] = orderNo + maps["order_id"] = orderId orderCoupons, err := orderCouponDao.GetOrderCouponList(maps) if err != nil { return false, err diff --git a/api/service/orderProduct.go b/api/service/orderProduct.go index c92b03f..278318d 100644 --- a/api/service/orderProduct.go +++ b/api/service/orderProduct.go @@ -227,7 +227,7 @@ func (r *OrderProductService) CancelOrderProduct(req requests.CancelOrderProduct // 模拟退款时手动退还优惠卷 if orderProduct.CouponAmountTotal > 0 { orderService := OrderService{} - res, err := orderService.ReturnOrderCoupon(orderProduct.OrderProductNo, tx) + res, err := orderService.ReturnOrderCoupon(orderProduct.OrderId, tx) if err != nil || !res { // 退还优惠卷失败 tx.Rollback() diff --git a/api/service/orderServicePackage.go b/api/service/orderServicePackage.go index 5dfa474..dfcb515 100644 --- a/api/service/orderServicePackage.go +++ b/api/service/orderServicePackage.go @@ -285,7 +285,7 @@ func (r *OrderServicePackageService) CancelOrderServicePackage(req requests.Canc // 模拟退款时手动退还优惠卷 if orderServicePackage.CouponAmountTotal > 0 { orderService := OrderService{} - res, err := orderService.ReturnOrderCoupon(orderServicePackage.OrderServiceNo, tx) + res, err := orderService.ReturnOrderCoupon(orderServicePackage.OrderId, tx) if err != nil || !res { // 退还优惠卷失败 tx.Rollback() From d1a7f5b980815c12756e55db6d48373b93c0d641 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 17 Jun 2024 08:47:28 +0800 Subject: [PATCH 75/78] 1 --- api/service/orderServicePackage.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/api/service/orderServicePackage.go b/api/service/orderServicePackage.go index dfcb515..bc222dd 100644 --- a/api/service/orderServicePackage.go +++ b/api/service/orderServicePackage.go @@ -2,7 +2,6 @@ package service import ( "errors" - "fmt" "hospital-admin-api/api/dao" "hospital-admin-api/api/dto" "hospital-admin-api/api/model" @@ -10,6 +9,7 @@ import ( "hospital-admin-api/config" "hospital-admin-api/extend/weChat" "hospital-admin-api/global" + "math" "strconv" "time" ) @@ -119,7 +119,6 @@ func (r *OrderServicePackageService) GetOrderServicePackageDetailInfo(orderServi } } - fmt.Println(g.MonthInquiryCount) // 获取服务包当月剩余问诊次数 g.RemainingInquiryCount = r.GetRemainingInquiryCount(orderServicePackageDetail.MonthlyFrequency, g.MonthInquiryCount) } @@ -517,12 +516,12 @@ func (r *OrderServicePackageService) getOrderServicePackageCurrentMonthDate(star diffDays := int(diff) // 获取当前月次 - monthTime := (diffDays + 29) / 30 // 向上取整 + monthTime := math.Ceil(float64(diffDays / 30)) // 向上取整 days := monthTime * 30 // 当前所属月结束时间 - currentMonthFinishDate := time.Time(startTime).AddDate(0, 0, days) + currentMonthFinishDate := time.Time(startTime).AddDate(0, 0, int(days)) // 当前所属月开始时间 currentMonthStartDate := currentMonthFinishDate.AddDate(0, 0, -30) From 53acd30bf8c47e39c727daf76b141a41dcb26d15 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 17 Jun 2024 08:53:47 +0800 Subject: [PATCH 76/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=20=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=9C=8D=E5=8A=A1=E5=8C=85=E5=BD=93=E5=89=8D=E6=9C=88?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=8C=BA=E9=97=B4=E7=9A=84=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/orderServicePackage.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/api/service/orderServicePackage.go b/api/service/orderServicePackage.go index bc222dd..f863c1b 100644 --- a/api/service/orderServicePackage.go +++ b/api/service/orderServicePackage.go @@ -509,14 +509,14 @@ func (r *OrderServicePackageService) getOrderServicePackageCurrentMonthDate(star } // 获取当前时间 - now := time.Now() + now := time.Now().Unix() // 获取开启服务日期和今日的相差天数 - diff := now.Sub(time.Time(startTime)).Hours() / 24 - diffDays := int(diff) + diff := math.Abs(float64(now - time.Time(startTime).Unix())) + diffDays := math.Ceil(diff / 60 / 60 / 24) // 获取当前月次 - monthTime := math.Ceil(float64(diffDays / 30)) // 向上取整 + monthTime := math.Ceil(diffDays / 30) // 向上取整 days := monthTime * 30 From c3bafbb11c7b2b7702ab1d20d3f8a844ea49d16b Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 17 Jun 2024 09:24:25 +0800 Subject: [PATCH 77/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E6=8E=A5?= =?UTF-8?q?=E8=AF=8A=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/dao/orderInquiry.go | 9 +++++++++ api/service/orderServicePackage.go | 13 ++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/api/dao/orderInquiry.go b/api/dao/orderInquiry.go index 1508606..d243a0c 100644 --- a/api/dao/orderInquiry.go +++ b/api/dao/orderInquiry.go @@ -461,6 +461,15 @@ func (r *OrderInquiryDao) GetOrderInquiryTimeList(maps interface{}, startTime, e return m, nil } +// GetOrderInquiryCreatedTimeList 获取问诊订单列表-创建时间 +func (r *OrderInquiryDao) GetOrderInquiryCreatedTimeList(maps interface{}, startTime, endTime string) (m []*model.OrderInquiry, err error) { + err = global.Db.Where(maps).Where("created_at BETWEEN ? AND ?", startTime, endTime).Find(&m).Error + if err != nil { + return nil, err + } + return m, nil +} + // GetOrderInquiryForAccountPageSearch 获取账户关联问诊订单列表-分页 func (r *OrderInquiryDao) GetOrderInquiryForAccountPageSearch(req requests.GetOrderInquiryForAccountPage, page, pageSize int) (m []*model.OrderInquiry, total int64, err error) { var totalRecords int64 diff --git a/api/service/orderServicePackage.go b/api/service/orderServicePackage.go index f863c1b..1ff10b1 100644 --- a/api/service/orderServicePackage.go +++ b/api/service/orderServicePackage.go @@ -2,6 +2,7 @@ package service import ( "errors" + "fmt" "hospital-admin-api/api/dao" "hospital-admin-api/api/dto" "hospital-admin-api/api/model" @@ -113,14 +114,18 @@ func (r *OrderServicePackageService) GetOrderServicePackageDetailInfo(orderServi g.MonthInquiryCount = 1 } else { // 获取服务包当月已问诊次数 - g.MonthInquiryCount, err = r.GetCurrentMonthInquiryCount(g.OrderServiceType, orderServicePackage.UserId, orderServicePackage.DoctorId, CurrentMonthStartDate, CurrentMonthFinishDate) + g.MonthInquiryCount, err = r.GetCurrentMonthInquiryCount(g.OrderServiceType, orderServicePackage.UserId, orderServicePackage.DoctorId, g.PayTime) if err != nil { return nil, err } } + fmt.Println(g.MonthInquiryCount) + // 获取服务包当月剩余问诊次数 g.RemainingInquiryCount = r.GetRemainingInquiryCount(orderServicePackageDetail.MonthlyFrequency, g.MonthInquiryCount) + + fmt.Println(g.RemainingInquiryCount) } } @@ -548,9 +553,11 @@ func (r *OrderServicePackageService) isFirstInquiryServicePackage(orderNo string } // GetCurrentMonthInquiryCount 获取服务包当月已问诊次数 -func (r *OrderServicePackageService) GetCurrentMonthInquiryCount(orderServiceType int, userId, doctorId int64, startDate, endDate time.Time) (int, error) { +func (r *OrderServicePackageService) GetCurrentMonthInquiryCount(orderServiceType int, userId, doctorId int64, startTime model.LocalTime) (int, error) { orderInquiryDao := dao.OrderInquiryDao{} + CurrentMonthStartDate, CurrentMonthFinishDate, err := r.getOrderServicePackageCurrentMonthDate(startTime) + maps := make(map[string]interface{}) maps["inquiry_type"] = 1 @@ -565,7 +572,7 @@ func (r *OrderServicePackageService) GetCurrentMonthInquiryCount(orderServiceTyp maps["inquiry_refund_status"] = 0 maps["inquiry_pay_status"] = 2 maps["inquiry_status"] = []int{1, 2, 3, 4, 5, 6} - orderInquirys, err := orderInquiryDao.GetOrderInquiryTimeList(maps, startDate.Format("2006-01-02 15:04"), endDate.Format("2006-01-02 15:04:05")) + orderInquirys, err := orderInquiryDao.GetOrderInquiryCreatedTimeList(maps, CurrentMonthStartDate.Format("2006-01-02 15:04:05"), CurrentMonthFinishDate.Format("2006-01-02 15:04:05")) if err != nil { return 0, err } From 0de58be7ef50caffd94cd182f6877e873be6eecb Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Mon, 17 Jun 2024 14:37:54 +0800 Subject: [PATCH 78/78] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=81=A5=E5=BA=B7?= =?UTF-8?q?=E5=8C=85=20=E5=A4=9A=E7=82=B9=E6=89=A7=E4=B8=9A=E7=9A=84?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/doctorConfigHealthPackage.go | 62 ++++++++++++++++++++++++ api/service/userDoctor.go | 26 ++++++++++ extend/tencentIm/base.go | 46 ------------------ 3 files changed, 88 insertions(+), 46 deletions(-) diff --git a/api/service/doctorConfigHealthPackage.go b/api/service/doctorConfigHealthPackage.go index cb8615a..b135da8 100644 --- a/api/service/doctorConfigHealthPackage.go +++ b/api/service/doctorConfigHealthPackage.go @@ -81,6 +81,48 @@ func (r *DoctorConfigHealthPackageService) PutDoctorHealth(healthPackageId int64 return false, errors.New("修改失败") } + // 获取医生数据 + userDoctorDao := dao.UserDoctorDao{} + userDoctor, err := userDoctorDao.GetUserDoctorById(doctorConfigHealthPackage.DoctorId) + if err != nil || userDoctor == nil { + return false, errors.New("修改失败") + } + + if userDoctor.IdcardStatus != 1 { + return false, errors.New("该医生未进行实名认证") + } + + if userDoctor.IdenAuthStatus != 1 { + return false, errors.New("该医生未进行身份认证") + } + + if userDoctor.IsBindBank != 1 { + return false, errors.New("该医生未绑定结算银行卡") + } + + // 开启 + if req.IsEnable == 1 { + // 获取医生多点执业状态 + userDoctorService := UserDoctorService{} + + multiPointStatus, _ := userDoctorService.GetDoctorMultiPointEnable(userDoctor.DoctorId) + if multiPointStatus == 0 { + return false, errors.New("该医生未开启多点执业") + } + + // 获取专家图文问诊价格 + maps := make(map[string]interface{}) + maps["doctor_id"] = userDoctor.DoctorId + maps["inquiry_type"] = 1 + maps["inquiry_mode"] = 1 + + doctorInquiryConfigDao := dao.DoctorInquiryConfigDao{} + _, err := doctorInquiryConfigDao.GetDoctorInquiryConfig(maps) + if err != nil && req.IsEnable == 1 { + return false, errors.New("本服务需设置图文问诊的价格,才可开启") + } + } + // 开始事务 tx := global.Db.Begin() defer func() { @@ -188,6 +230,18 @@ func (r *DoctorConfigHealthPackageService) AddDoctorHealth(req requests.AddDocto return false, errors.New("医生错误") } + if userDoctor.IdcardStatus != 1 { + return false, errors.New("该医生未进行实名认证") + } + + if userDoctor.IdenAuthStatus != 1 { + return false, errors.New("该医生未进行身份认证") + } + + if userDoctor.IsBindBank != 1 { + return false, errors.New("该医生未绑定结算银行卡") + } + doctorConfigHealthPackageDao := dao.DoctorConfigHealthPackageDao{} maps := make(map[string]interface{}) @@ -216,6 +270,14 @@ func (r *DoctorConfigHealthPackageService) AddDoctorHealth(req requests.AddDocto return false, errors.New("本服务需设置图文问诊的价格,才可开启") } + // 获取医生多点执业状态 + userDoctorService := UserDoctorService{} + + multiPointStatus, _ := userDoctorService.GetDoctorMultiPointEnable(userDoctor.DoctorId) + if multiPointStatus == 0 { + return false, errors.New("该医生未开启多点执业") + } + // 价格计算 // 重新价格计算(专家图文问诊价格*费率+30盒35元的干爽颗粒) serviceRate, err := strconv.ParseFloat(healthPackage.ServiceRate, 64) diff --git a/api/service/userDoctor.go b/api/service/userDoctor.go index 8e61811..43a34aa 100644 --- a/api/service/userDoctor.go +++ b/api/service/userDoctor.go @@ -1925,3 +1925,29 @@ func (r *UserDoctorService) PutDoctorIntroduction(doctorId int64, req requests.P return true, nil } + +// GetDoctorMultiPointEnable 获取医生多点执业状态 +func (r *UserDoctorService) GetDoctorMultiPointEnable(doctorId int64) (int, error) { + doctorInquiryConfigDao := dao.DoctorInquiryConfigDao{} + userDoctorDao := dao.UserDoctorDao{} + + maps := make(map[string]interface{}) + maps["doctor_id"] = doctorId + maps["inquiry_type"] = 4 + maps["inquiry_mode"] = 1 + doctorInquiryConfig, err := doctorInquiryConfigDao.GetDoctorInquiryConfig(maps) + if err != nil || doctorInquiryConfig == nil { + return 0, nil + } + + userDoctor, err := userDoctorDao.GetUserDoctorById(doctorId) + if err != nil || userDoctor == nil { + return 0, errors.New("医生数据错误") + } + + if doctorInquiryConfig.IsEnable == 1 && userDoctor.MultiPointStatus == 1 { + return 1, nil + } + + return 0, nil +} diff --git a/extend/tencentIm/base.go b/extend/tencentIm/base.go index 07d2479..2cea9f4 100644 --- a/extend/tencentIm/base.go +++ b/extend/tencentIm/base.go @@ -58,52 +58,6 @@ func getRequestUrlParams(userId string) (bool, string) { return true, queryString } -// -// // 统一请求 -// func postRequest(url string, requestBody []byte) (map[string]interface{}, error) { -// responseMap := make(map[string]interface{}) -// -// // 发起 POST 请求 -// resp, err := http.Post(url, "application/json", bytes.NewBuffer(requestBody)) -// if err != nil { -// return nil, err -// } -// -// defer func(Body io.ReadCloser) { -// _ = Body.Close() -// }(resp.Body) -// -// body, err := io.ReadAll(resp.Body) -// if err != nil { -// return nil, err -// } -// -// err = json.Unmarshal([]byte(string(body)), &responseMap) -// if err != nil { -// // json解析失败 -// return nil, err -// } -// -// if responseMap == nil { -// return nil, errors.New("请求im失败") -// } -// -// if _, ok := responseMap["ErrorCode"]; ok { -// errorCode := responseMap["ErrorCode"].(int) -// if errorCode != 0 { -// if errorInfo, ok := responseMap["ErrorInfo"].(string); ok { -// return nil, errors.New(errorInfo) -// } else { -// return nil, errors.New("请求im失败") -// } -// } -// } else { -// return nil, errors.New("请求im失败") -// } -// -// return responseMap, nil -// } - // 统一请求 func postRequest(url string, requestBody []byte) (*responseData, error) { var responseData responseData