hospital-admin-api/api/dao/orderProduct.go
haomingming ffbc1c83c2 11
2026-01-06 15:33:38 +08:00

638 lines
18 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package dao
import (
"errors"
"hospital-admin-api/api/model"
"hospital-admin-api/api/requests"
"hospital-admin-api/global"
"strings"
"time"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
type OrderProductDao struct {
}
// GetOrderProductById 获取药品订单数据-药品订单id
func (r *OrderProductDao) GetOrderProductById(orderProductId int64) (m *model.OrderProduct, err error) {
err = global.Db.First(&m, orderProductId).Error
if err != nil {
return nil, err
}
return m, nil
}
// GetOrderProductPreloadById 获取药品订单数据-加载全部关联-药品订单id
func (r *OrderProductDao) GetOrderProductPreloadById(orderProductId int64) (m *model.OrderProduct, err error) {
query := global.Db.Model(&model.OrderProduct{})
// 预加载所有关联
query = query.Preload(clause.Associations)
// 处方关联问诊表(抄方用)
query = query.Preload("OrderInquiry", func(db *gorm.DB) *gorm.DB {
return db.Preload("UserDoctor", func(db *gorm.DB) *gorm.DB {
return db.Select("user_id", "user_name", "doctor_id")
}).Preload("TransferUserDoctor", func(db *gorm.DB) *gorm.DB {
return db.Select("user_id", "user_name", "doctor_id")
})
})
err = query.First(&m, orderProductId).Error
if err != nil {
return nil, err
}
return m, nil
}
// DeleteOrderProduct 删除药品订单
func (r *OrderProductDao) DeleteOrderProduct(tx *gorm.DB, maps interface{}) error {
err := tx.Where(maps).Delete(&model.OrderProduct{}).Error
if err != nil {
return err
}
return nil
}
// EditOrderProduct 修改药品订单
func (r *OrderProductDao) EditOrderProduct(tx *gorm.DB, maps interface{}, data interface{}) error {
err := tx.Model(&model.OrderProduct{}).Where(maps).Updates(data).Error
if err != nil {
return err
}
return nil
}
// EditOrderProductById 修改药品订单-药品订单id
func (r *OrderProductDao) EditOrderProductById(tx *gorm.DB, orderProductId int64, data interface{}) error {
err := tx.Model(&model.OrderProduct{}).Where("order_product_id = ?", orderProductId).Updates(data).Error
if err != nil {
return err
}
return nil
}
// GetOrderProductList 获取药品订单列表
func (r *OrderProductDao) GetOrderProductList(maps interface{}) (m []*model.OrderProduct, err error) {
err = global.Db.Where(maps).Find(&m).Error
if err != nil {
return nil, err
}
return m, nil
}
// GetOrderProductNormalList 获取药品订单列表-正常订单
func (r *OrderProductDao) GetOrderProductNormalList(maps interface{}, createdAt model.LocalTime) (m []*model.OrderProduct, err error) {
query := global.Db.Where(maps)
// 格式化时间为 "Y-m-d H:i:s"
at := time.Time(createdAt).Format("2006-01-02 15:04:05")
query = query.Where("created_at < ?", at) // 有效使用时间
query = query.Where("order_product_status in (?)", []string{"1", "2", "3", "4"})
err = query.Find(&m).Error
if err != nil {
return nil, err
}
return m, nil
}
// GetOrderProduct 获取药品订单
func (r *OrderProductDao) GetOrderProduct(maps interface{}) (m *model.OrderProduct, err error) {
err = global.Db.Where(maps).First(&m).Error
if err != nil {
return nil, err
}
return m, nil
}
// AddOrderProduct 新增药品订单
func (r *OrderProductDao) AddOrderProduct(tx *gorm.DB, model *model.OrderProduct) (*model.OrderProduct, error) {
if err := tx.Create(model).Error; err != nil {
return nil, err
}
return model, nil
}
// GetOrderProductPageSearch 获取药品订单列表-分页
func (r *OrderProductDao) GetOrderProductPageSearch(req requests.GetOrderProductPage, page, pageSize int) (m []*model.OrderProduct, total int64, err error) {
var totalRecords int64
// 构建查询条件
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")
})
// 医生姓名 - 同时查询原医生和抄方医生
if req.DoctorName != "" {
// 原医生查询条件
originalDoctorSubQuery := global.Db.Model(&model.UserDoctor{}).
Select("doctor_id").
Where("user_name LIKE ?", "%"+req.DoctorName+"%")
// 抄方医生查询条件
transferDoctorSubQuery := global.Db.Model(&model.UserDoctor{}).
Select("doctor_id").
Where("user_name LIKE ?", "%"+req.DoctorName+"%")
// 查询抄方医生对应的问诊订单ID
inquirySubQuery := global.Db.Model(&model.OrderInquiry{}).
Select("order_inquiry_id").
Where(gorm.Expr("doctor_id IN (?)", transferDoctorSubQuery))
// 使用 OR 条件:原医生匹配 OR 抄方医生匹配
// 通过嵌套 Where 子查询把 OR 条件包在一组括号里,避免影响其它条件
orCond := global.Db.
Where(gorm.Expr("doctor_id IN (?)", originalDoctorSubQuery)).
Or(gorm.Expr("order_inquiry_id IN (?)", inquirySubQuery))
query = query.Where(orCond)
}
// 处方
query = query.Preload("OrderPrescription", func(db *gorm.DB) *gorm.DB {
return db.Select("order_prescription_id", "prescription_code")
})
// 问诊订单
query = query.Preload("OrderInquiry", func(db *gorm.DB) *gorm.DB {
return db.Preload("UserDoctor", func(db *gorm.DB) *gorm.DB {
return db.Select("user_id", "user_name", "doctor_id")
}).Preload("TransferUserDoctor", func(db *gorm.DB) *gorm.DB {
return db.Select("user_id", "user_name", "doctor_id")
})
})
// 患者名称
query = query.Preload("UserPatient.User", func(db *gorm.DB) *gorm.DB {
return db.Select("user_id", "user_name", "mobile")
})
// 患者姓名-就诊人
if req.PatientName != "" {
subQuery := global.Db.Model(&model.OrderInquiry{}).
Select("order_inquiry_id").
Where("patient_name LIKE ?", "%"+req.PatientName+"%")
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.PrescriptionCode != "" {
// 处方编号存在于处方表中这里通过处方表查询出对应的处方ID再反查商品订单
subQuery := global.Db.Model(&model.OrderPrescription{}).
Select("order_prescription_id").
Where("prescription_code = ?", req.PrescriptionCode)
query = query.Where("order_prescription_id IN (?)", subQuery)
}
// 订单编号
if req.OrderProductNo != "" {
query = query.Where("order_product_no = ?", req.OrderProductNo)
}
// 第三方支付流水号
if req.EscrowTradeNo != "" {
query = query.Where("escrow_trade_no = ?", req.EscrowTradeNo)
}
// 订单状态
if req.OrderProductStatus != nil {
query = query.Where("order_product_status = ?", req.OrderProductStatus)
}
// 支付渠道
if req.PayChannel != nil {
query = query.Where("pay_channel = ?", req.PayChannel)
}
// 支付状态
if req.PayStatus != nil {
query = query.Where("pay_status = ?", req.PayStatus)
}
// 订单取消原因
if req.CancelReason != nil {
query = query.Where("cancel_reason = ?", req.CancelReason)
}
// 物流编号
if req.LogisticsNo != "" {
query = query.Where("logistics_no = ?", req.LogisticsNo)
}
// 快递公司编码
if req.LogisticsCompanyCode != "" {
query = query.Where("logistics_company_code = ?", req.LogisticsCompanyCode)
}
// 订单备注
if req.Remarks != "" {
query = query.Where("remarks like ?", "%"+req.Remarks+"%")
}
// 退款状态
if req.RefundStatus != nil {
query = query.Where("refund_status = ?", req.RefundStatus)
}
// 上报处方平台状态
if req.ReportPreStatus != nil {
query = query.Where("report_pre_status = ?", req.ReportPreStatus)
}
// 发货时间
if req.DeliveryTime != "" {
deliveryTime := strings.Split(req.DeliveryTime, "&")
if len(deliveryTime) == 2 {
startTime, _ := time.Parse("2006-01-02", deliveryTime[0])
endTime, _ := time.Parse("2006-01-02", deliveryTime[1])
endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second)
query = query.Where("delivery_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.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.ReportPreTime != "" {
reportPreTime := strings.Split(req.ReportPreTime, "&")
if len(reportPreTime) == 2 {
startTime, _ := time.Parse("2006-01-02", reportPreTime[0])
endTime, _ := time.Parse("2006-01-02", reportPreTime[1])
endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second)
query = query.Where("report_pre_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.ConsigneeName != "" {
query = query.Where("consignee_name LIKE ?", "%"+req.ConsigneeName+"%")
}
// 收货人电话
if req.ConsigneeTel != "" {
query = query.Where("consignee_tel LIKE ?", "%"+req.ConsigneeTel+"%")
}
// 手机号-医生/患者 - 同时查询原医生和抄方医生
if req.Mobile != "" {
// 患者
patientUserSubQuery := global.Db.Model(&model.User{}).
Select("user_id").
Where("mobile = ?", req.Mobile)
patientSubQuery := global.Db.Model(&model.UserPatient{}).
Select("patient_id").
Where(gorm.Expr("user_id IN (?)", patientUserSubQuery))
// 原医生
doctorUserSubQuery := global.Db.Model(&model.User{}).
Select("user_id").
Where("mobile = ?", req.Mobile)
originalDoctorSubQuery := global.Db.Model(&model.UserDoctor{}).
Select("doctor_id").
Where(gorm.Expr("user_id IN (?)", doctorUserSubQuery))
// 抄方医生
transferDoctorUserSubQuery := global.Db.Model(&model.User{}).
Select("user_id").
Where("mobile = ?", req.Mobile)
transferDoctorSubQuery := global.Db.Model(&model.UserDoctor{}).
Select("doctor_id").
Where(gorm.Expr("user_id IN (?)", transferDoctorUserSubQuery))
// 查询抄方医生对应的问诊订单ID
inquirySubQuery := global.Db.Model(&model.OrderInquiry{}).
Select("order_inquiry_id").
Where(gorm.Expr("doctor_id IN (?)", transferDoctorSubQuery))
// 使用 OR 条件:患者匹配 OR 原医生匹配 OR 抄方医生匹配
// 通过嵌套 Where 子查询把 OR 条件包在一组括号里,避免影响其它条件
orCond := global.Db.
Where("patient_id IN (?)", patientSubQuery).
Or("doctor_id IN (?)", originalDoctorSubQuery).
Or(gorm.Expr("order_inquiry_id IN (?)", inquirySubQuery))
query = query.Where(orCond)
}
// 排序
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
}
// GetOrderProductExportListSearch 获取药品订单列表-导出
func (r *OrderProductDao) GetOrderProductExportListSearch(req requests.OrderProductExportList) (m []*model.OrderProduct, err error) {
// 构建查询条件
query := global.Db.Model(&model.OrderProduct{})
// 医生
query = query.Preload("UserDoctor", func(db *gorm.DB) *gorm.DB {
return db.Omit("open_id", "union_id", "wx_session_key")
})
query = query.Preload("UserDoctor.User", func(db *gorm.DB) *gorm.DB {
return db.Select("user_id", "user_name", "mobile")
})
// 处方
query = query.Preload("OrderPrescription", func(db *gorm.DB) *gorm.DB {
return db.Select("order_prescription_id", "prescription_code")
})
// 问诊订单
query = query.Preload("OrderInquiry", func(db *gorm.DB) *gorm.DB {
return db.Select("order_inquiry_id", "patient_name", "patient_name_mask", "patient_sex", "patient_age")
})
// 患者
query = query.Preload("UserPatient.User", func(db *gorm.DB) *gorm.DB {
return db.Select("user_id", "user_name", "mobile")
})
// 药品列表
query = query.Preload("OrderProductItem")
// 药品列表-药品
query = query.Preload("OrderProductItem.Product")
// 当前搜索数据
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))
}
// 患者姓名-就诊人
if req.PatientName != "" {
subQuery := global.Db.Model(&model.OrderInquiry{}).
Select("order_inquiry_id").
Where("patient_name LIKE ?", "%"+req.PatientName+"%")
query = query.Where(gorm.Expr("order_inquiry_id IN (?)", subQuery))
}
// 订单编号
if req.OrderProductNo != "" {
query = query.Where("order_product_no = ?", req.OrderProductNo)
}
// 第三方支付流水号
if req.EscrowTradeNo != "" {
query = query.Where("escrow_trade_no = ?", req.EscrowTradeNo)
}
// 订单状态
if req.OrderProductStatus != nil {
query = query.Where("order_product_status = ?", req.OrderProductStatus)
}
// 支付渠道
if req.PayChannel != nil {
query = query.Where("pay_channel = ?", req.PayChannel)
}
// 支付状态
if req.PayStatus != nil {
query = query.Where("pay_status = ?", req.PayStatus)
}
// 订单取消原因
if req.CancelReason != nil {
query = query.Where("cancel_reason = ?", req.CancelReason)
}
// 物流编号
if req.LogisticsNo != "" {
query = query.Where("logistics_no = ?", req.LogisticsNo)
}
// 快递公司编码
if req.LogisticsCompanyCode != "" {
query = query.Where("logistics_company_code = ?", req.LogisticsCompanyCode)
}
// 订单备注
if req.Remarks != "" {
query = query.Where("remarks like ?", "%"+req.Remarks+"%")
}
// 退款状态
if req.RefundStatus != nil {
query = query.Where("refund_status = ?", req.RefundStatus)
}
// 上报处方平台状态
if req.ReportPreStatus != nil {
query = query.Where("report_pre_status = ?", req.ReportPreStatus)
}
// 发货时间
if req.DeliveryTime != "" {
deliveryTime := strings.Split(req.DeliveryTime, "&")
if len(deliveryTime) == 2 {
startTime, _ := time.Parse("2006-01-02", deliveryTime[0])
endTime, _ := time.Parse("2006-01-02", deliveryTime[1])
endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second)
query = query.Where("delivery_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.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.ReportPreTime != "" {
reportPreTime := strings.Split(req.ReportPreTime, "&")
if len(reportPreTime) == 2 {
startTime, _ := time.Parse("2006-01-02", reportPreTime[0])
endTime, _ := time.Parse("2006-01-02", reportPreTime[1])
endTime = endTime.Add(23*time.Hour + 59*time.Minute + 59*time.Second)
query = query.Where("report_pre_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.ConsigneeName != "" {
query = query.Where("consignee_name LIKE ?", "%"+req.ConsigneeName+"%")
}
// 收货人电话
if req.ConsigneeTel != "" {
query = query.Where("consignee_tel LIKE ?", "%"+req.ConsigneeTel+"%")
}
// 手机号-医生/患者
if req.Mobile != "" {
// 患者
patientUserSubQuery := global.Db.Model(&model.User{}).
Select("user_id").
Where("mobile = ?", req.Mobile)
patientSubQuery := global.Db.Model(&model.UserPatient{}).
Select("patient_id").
Where(gorm.Expr("user_id IN (?)", patientUserSubQuery))
// 医生
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_product_id IN (?)", id)
}
// 排序
query = query.Order("created_at asc")
err = query.Find(&m).Error
if err != nil {
return nil, err
}
return m, nil
}