From f7f1182d14e7fa50d0f806a0a465ee904ef9e78e Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Tue, 14 Nov 2023 14:43:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8C=BB=E7=94=9F=E8=B4=A6=E6=88=B7-=E5=AF=BC?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/doctorAccount.go | 27 ++++++++--- api/controller/export.go | 34 ++++++++++++++ api/dao/doctorAccount.go | 65 +++++++++++++++++++++++++- api/requests/doctorAccount.go | 11 ++++- api/router/router.go | 2 +- api/service/DoctorAccount.go | 70 ---------------------------- api/service/export.go | 80 ++++++++++++++++++++++++++++++++ api/service/userDoctor.go | 75 ++++++++++++++++++++++++++++++ output.xlsx | Bin 8139 -> 6908 bytes utils/export.go | 2 +- 10 files changed, 285 insertions(+), 81 deletions(-) diff --git a/api/controller/doctorAccount.go b/api/controller/doctorAccount.go index fc8a1cb..b96d5b6 100644 --- a/api/controller/doctorAccount.go +++ b/api/controller/doctorAccount.go @@ -3,6 +3,7 @@ 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" @@ -37,19 +38,31 @@ func (r *DoctorAccount) GetDoctorAccountPage(c *gin.Context) { } doctorAccountDao := dao.DoctorAccountDao{} - doctorAccount, total, err := doctorAccountDao.GetDoctorAccountPage(req, req.Page, req.PageSize) + doctorAccounts, total, err := doctorAccountDao.GetDoctorAccountPage(req, req.Page, req.PageSize) if err != nil { responses.FailWithMessage(err.Error(), c) return } - // 业务处理 - doctorAccountService := service.DoctorAccountService{} - res, err := doctorAccountService.GetDoctorAccountPage(doctorAccount) - if err != nil { - responses.FailWithMessage(err.Error(), c) - return + // 处理返回值 + res := dto.GetDoctorAccountListDto(doctorAccounts) + + for _, v := range res { + // 将 id 转换为 int64 类型 + doctorId, err := strconv.ParseInt(v.DoctorId, 10, 64) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + userDoctorService := service.UserDoctorService{} + + // 获取医生已完成待入账金额 + v.CompletedWaitEntryAmount, _ = userDoctorService.GetDoctorCompletedWaitEntryAmount(doctorId) + + // 获取医生今日预计收入 + v.EstimateIncome, _ = userDoctorService.GetDoctorEstimateIncome(doctorId) } result := make(map[string]interface{}) diff --git a/api/controller/export.go b/api/controller/export.go index ef7e8f2..388b8df 100644 --- a/api/controller/export.go +++ b/api/controller/export.go @@ -151,3 +151,37 @@ func (r *Export) UserDoctorBankCard(c *gin.Context) { responses.OkWithData(ossAddress, c) } + +// DoctorAccount 医生账户 +func (r *Export) DoctorAccount(c *gin.Context) { + doctorAccountRequest := requests.DoctorAccountRequest{} + req := doctorAccountRequest.DoctorAccountExportList + 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 + } + + // 获取数据 + doctorAccountDao := dao.DoctorAccountDao{} + doctorAccounts, err := doctorAccountDao.GetDoctorAccountExportListSearch(req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 业务处理 + exportService := service.ExportService{} + ossAddress, err := exportService.DoctorAccount(doctorAccounts) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.OkWithData(ossAddress, c) +} diff --git a/api/dao/doctorAccount.go b/api/dao/doctorAccount.go index 5d4ede6..a7f35c4 100644 --- a/api/dao/doctorAccount.go +++ b/api/dao/doctorAccount.go @@ -1,10 +1,12 @@ package dao import ( + "errors" "gorm.io/gorm" "hospital-admin-api/api/model" "hospital-admin-api/api/requests" "hospital-admin-api/global" + "strings" ) type DoctorAccountDao struct { @@ -90,7 +92,7 @@ func (r *DoctorAccountDao) Inc(tx *gorm.DB, maps interface{}, numeral float64, f return nil } -// GetDoctorAccountPage 获取医生列表-分页 +// GetDoctorAccountPage 获取医生账户列表-分页 func (r *DoctorAccountDao) GetDoctorAccountPage(req requests.GetDoctorAccountPage, page, pageSize int) (m []*model.DoctorAccount, total int64, err error) { var totalRecords int64 @@ -144,3 +146,64 @@ func (r *DoctorAccountDao) GetDoctorAccountPage(req requests.GetDoctorAccountPag } return m, totalRecords, nil } + +// GetDoctorAccountExportListSearch 医生账户-导出 +func (r *DoctorAccountDao) GetDoctorAccountExportListSearch(req requests.DoctorAccountExportList) (m []*model.DoctorAccount, err error) { + // 构建查询条件 + query := global.Db.Model(&model.DoctorAccount{}) + + // 医生 + 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.Omit("user_password", "salt") + }) + + // 当前搜索数据 + if req.Type == 1 { + // 手机号 + 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.UserName != "" { + subQuery := global.Db.Model(&model.UserDoctor{}). + Select("doctor_id"). + Where("user_name LIKE ?", "%"+req.UserName+"%") + + query = query.Where(gorm.Expr("doctor_id IN (?)", subQuery)) + } + } + + // 当前选择数据 + if req.Type == 2 { + if req.Id == "" { + return nil, errors.New("未提供需导出数据编号") + } + + id := strings.Split(req.Id, ",") + query = query.Where("account_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/doctorAccount.go b/api/requests/doctorAccount.go index 2930a61..3797e4f 100644 --- a/api/requests/doctorAccount.go +++ b/api/requests/doctorAccount.go @@ -1,7 +1,8 @@ package requests type DoctorAccountRequest struct { - GetDoctorAccountPage // 获取医生账户列表-分页 + GetDoctorAccountPage // 获取医生账户列表-分页 + DoctorAccountExportList // 医生账户 } // GetDoctorAccountPage 获取医生账户列表-分页 @@ -11,3 +12,11 @@ type GetDoctorAccountPage struct { Mobile string `json:"mobile" form:"mobile" label:"手机号"` UserName string `json:"user_name" form:"user_name" label:"用户名"` } + +// DoctorAccountExportList 医生账户 +type DoctorAccountExportList 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时必填 + Mobile string `json:"mobile" form:"mobile" label:"手机号"` + UserName string `json:"user_name" form:"user_name" label:"用户名"` +} diff --git a/api/router/router.go b/api/router/router.go index 1685883..bf1138f 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -615,7 +615,7 @@ func privateRouter(r *gin.Engine, api controller.Api) { doctorGroup.POST("/bank/card", api.Export.UserDoctorBankCard) // 医生账户 - doctorGroup.POST("/account", api.UserCaCert.RenewUserCloudCert) + doctorGroup.POST("/account", api.Export.DoctorAccount) // 医生账户-关联订单 doctorGroup.POST("/account/order", api.UserCaCert.RenewUserCloudCert) diff --git a/api/service/DoctorAccount.go b/api/service/DoctorAccount.go index da3b34f..09e94f7 100644 --- a/api/service/DoctorAccount.go +++ b/api/service/DoctorAccount.go @@ -4,7 +4,6 @@ import ( "errors" "hospital-admin-api/api/dao" "hospital-admin-api/api/dto" - "hospital-admin-api/api/model" "math" "time" ) @@ -105,72 +104,3 @@ func (r *DoctorAccountService) GetDoctorAccount(doctorId int64) (g *dto.DoctorAc return g, nil } - -// GetDoctorAccountPage 获取医生账户列表-分页 -func (r *DoctorAccountService) GetDoctorAccountPage(doctorAccounts []*model.DoctorAccount) (g []*dto.DoctorAccountDto, err error) { - // 处理返回值 - res := dto.GetDoctorAccountListDto(doctorAccounts) - - // 已完成待入账金额 - var completedWaitEntryAmount float64 - - // 今日预计收入 - var estimateIncome float64 - - for _, v := range res { - // 获取医生全部已完成订单 - orderInquiryDao := dao.OrderInquiryDao{} - - maps := make(map[string]interface{}) - maps["doctor_id"] = v.DoctorId - maps["inquiry_status"] = 5 // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) - maps["inquiry_refund_status"] = 0 // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常) - maps["inquiry_pay_status"] = 2 // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) - maps["is_withdrawal"] = 0 // 是否提现(0:否 1:是 2:提现中) - orderInquirys, err := orderInquiryDao.GetOrderInquiryList(maps) - if err != nil { - return nil, err - } - - if len(orderInquirys) > 0 { - for _, inquiry := range orderInquirys { - completedWaitEntryAmount = math.Floor((completedWaitEntryAmount+inquiry.AmountTotal)*0.75*100) / 100 - } - } - - // 获取医生当日接诊订单金额 - today := time.Now() - - // 获取今天的开始时间 - startOfDay := time.Date(today.Year(), today.Month(), today.Day(), 0, 0, 0, 0, today.Location()) - - // 获取今天的结束时间 - endOfDay := time.Date(today.Year(), today.Month(), today.Day(), 23, 59, 59, 999999999, today.Location()) - - // 格式化为数据库的 datetime 格式 - startTime := startOfDay.Format("2006-01-02 15:04:05") - endTime := endOfDay.Format("2006-01-02 15:04:05") - - maps = make(map[string]interface{}) - maps["doctor_id"] = v.DoctorId - maps["inquiry_refund_status"] = 0 // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭) - maps["inquiry_pay_status"] = 2 // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) - maps["is_withdrawal"] = 0 // 是否提现(0:否 1:是 2:提现中) - maps["inquiry_status"] = []int{4, 5} // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) - orderInquirys, err = orderInquiryDao.GetOrderInquiryTimeList(maps, startTime, endTime) - if err != nil { - return nil, err - } - - if len(orderInquirys) > 0 { - for _, inquiry := range orderInquirys { - estimateIncome = math.Floor((estimateIncome+inquiry.AmountTotal)*0.75*100) / 100 - } - } - - v.CompletedWaitEntryAmount = completedWaitEntryAmount - v.EstimateIncome = estimateIncome - } - - return res, err -} diff --git a/api/service/export.go b/api/service/export.go index e112140..2410271 100644 --- a/api/service/export.go +++ b/api/service/export.go @@ -111,6 +111,7 @@ type UserDoctorData struct { BankCardAddress string // 开户银行地址 } +// DoctorBankCardData 医生银行卡列表 type DoctorBankCardData struct { DoctorName string // 医生姓名 DoctorMobile string // 医生手机号 @@ -122,6 +123,19 @@ type DoctorBankCardData struct { CreatedAt time.Time // 创建时间 } +// DoctorAccountData 医生账户 +type DoctorAccountData struct { + DoctorName string // 医生姓名 + DoctorMobile string // 医生手机号 + TotalAmount float64 // 总金额(已结束订单的总金额) + BalanceAccount float64 // 账户余额 + AppliedWithdrawalAmount float64 // 提现金额 + IncomeTax float64 // 个人所得税 + ActualWithdrawalAmount float64 // 实际提现金额 + CompletedWaitEntryAmount float64 // 已完成待入账金额 + EstimateIncome float64 // 今日预计收入 +} + // DoctorWithdrawal 提现记录 func (r *ExportService) DoctorWithdrawal(doctorWithdrawals []*model.DoctorWithdrawal) (string, error) { header := []utils.HeaderCellData{ @@ -759,3 +773,69 @@ func (r *ExportService) UserDoctorBankCard(d []*model.DoctorBankCard) (string, e ossPath = utils.AddOssDomain("/" + ossPath) return ossPath, nil } + +// DoctorAccount 医生账户 +func (r *ExportService) DoctorAccount(d []*model.DoctorAccount) (string, error) { + header := []utils.HeaderCellData{ + {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: "float64", NumberFmt: "0.0000", ColWidth: 18}, + {Value: "个人所得税", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18}, + {Value: "实际提现金额", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18}, + {Value: "已完成待入账金额", CellType: "float64", NumberFmt: "0.0000", ColWidth: 22}, + {Value: "今日预计收入", CellType: "float64", NumberFmt: "0.0000", ColWidth: 18}, + } + + var dataSlice []interface{} + for _, v := range d { + data := DoctorAccountData{ + TotalAmount: v.TotalAmount, + BalanceAccount: v.BalanceAccount, + AppliedWithdrawalAmount: v.AppliedWithdrawalAmount, + ActualWithdrawalAmount: v.ActualWithdrawalAmount, + IncomeTax: v.IncomeTax, + } + + if v.UserDoctor != nil { + // 医生姓名 + data.DoctorName = v.UserDoctor.UserName + + if v.UserDoctor.User != nil { + // 手机号 + data.DoctorMobile = v.UserDoctor.User.Mobile + } + } + + userDoctorService := UserDoctorService{} + + // 获取医生已完成待入账金额 + data.CompletedWaitEntryAmount, _ = userDoctorService.GetDoctorCompletedWaitEntryAmount(v.DoctorId) + + // 获取医生今日预计收入 + data.EstimateIncome, _ = userDoctorService.GetDoctorEstimateIncome(v.DoctorId) + + dataSlice = append(dataSlice, data) + } + + file, err := utils.Export(header, dataSlice) + if err != nil { + return "", err + } + + // 设置文件名字 + now := time.Now() + dateTimeString := now.Format("20060102150405") // 当前时间字符串 + rand.Seed(time.Now().UnixNano()) // 设置随机数 + ossPath := "admin/export/output" + 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/api/service/userDoctor.go b/api/service/userDoctor.go index 0238333..eff8fe7 100644 --- a/api/service/userDoctor.go +++ b/api/service/userDoctor.go @@ -3,6 +3,7 @@ package service import ( "errors" "fmt" + "github.com/shopspring/decimal" "hospital-admin-api/api/dao" "hospital-admin-api/api/dto" "hospital-admin-api/api/model" @@ -1524,3 +1525,77 @@ func (r *UserDoctorService) GetUserDoctorById(doctorId int64) (g *dto.UserDoctor return g, nil } + +// GetDoctorCompletedWaitEntryAmount 获取医生已完成待入账金额 +func (r *UserDoctorService) GetDoctorCompletedWaitEntryAmount(doctorId int64) (g float64, err error) { + // 已完成待入账金额 + var completedWaitEntryAmount = decimal.NewFromFloat(0) + + // 获取医生全部已完成订单 + orderInquiryDao := dao.OrderInquiryDao{} + + maps := make(map[string]interface{}) + maps["doctor_id"] = doctorId + maps["inquiry_status"] = 5 // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) + maps["inquiry_refund_status"] = 0 // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常) + maps["inquiry_pay_status"] = 2 // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + maps["is_withdrawal"] = 0 // 是否提现(0:否 1:是 2:提现中) + orderInquirys, err := orderInquiryDao.GetOrderInquiryList(maps) + if err != nil { + return 0, err + } + + if len(orderInquirys) > 0 { + for _, inquiry := range orderInquirys { + // 等同于math.Floor((completedWaitEntryAmount+inquiry.AmountTotal)*0.75*100) / 100 + amountTotal := decimal.NewFromFloat(inquiry.AmountTotal) + completedWaitEntryAmount = completedWaitEntryAmount.Add(amountTotal).Mul(decimal.NewFromFloat(0.75)).Mul(decimal.NewFromFloat(100)).Floor().Div(decimal.NewFromFloat(100)) + } + } + + result, _ := completedWaitEntryAmount.Float64() + return result, nil +} + +// GetDoctorEstimateIncome 获取医生今日预计收入 +func (r *UserDoctorService) GetDoctorEstimateIncome(doctorId int64) (g float64, err error) { + // 今日预计收入 + var estimateIncome = decimal.NewFromFloat(0) + + // 获取医生当日接诊订单金额 + today := time.Now() + + // 获取今天的开始时间 + startOfDay := time.Date(today.Year(), today.Month(), today.Day(), 0, 0, 0, 0, today.Location()) + + // 获取今天的结束时间 + endOfDay := time.Date(today.Year(), today.Month(), today.Day(), 23, 59, 59, 999999999, today.Location()) + + // 格式化为数据库的 datetime 格式 + startTime := startOfDay.Format("2006-01-02 15:04:05") + endTime := endOfDay.Format("2006-01-02 15:04:05") + + orderInquiryDao := dao.OrderInquiryDao{} + + maps := make(map[string]interface{}) + maps["doctor_id"] = doctorId + maps["inquiry_refund_status"] = 0 // 问诊订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭) + maps["inquiry_pay_status"] = 2 // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + maps["is_withdrawal"] = 0 // 是否提现(0:否 1:是 2:提现中) + maps["inquiry_status"] = []int{4, 5} // 问诊订单状态(1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消) + orderInquirys, err := orderInquiryDao.GetOrderInquiryTimeList(maps, startTime, endTime) + if err != nil { + return 0, err + } + + if len(orderInquirys) > 0 { + for _, inquiry := range orderInquirys { + // 等同于math.Floor((estimateIncome+inquiry.AmountTotal)*0.75*100) / 100 + amountTotal := decimal.NewFromFloat(inquiry.AmountTotal) + estimateIncome = estimateIncome.Add(amountTotal).Mul(decimal.NewFromFloat(0.75)).Mul(decimal.NewFromFloat(100)).Floor().Div(decimal.NewFromFloat(100)) + } + } + + result, _ := estimateIncome.Float64() + return result, nil +} diff --git a/output.xlsx b/output.xlsx index 753c93de6c7a2c5d77589c44302b105cf7e8ccc5..9ddeebaadc9f84c1bbe51927c068ca6f0ab07f19 100755 GIT binary patch delta 2881 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 D3?-H9 diff --git a/utils/export.go b/utils/export.go index 4d60000..a726458 100644 --- a/utils/export.go +++ b/utils/export.go @@ -290,7 +290,7 @@ func Export(header []HeaderCellData, data []interface{}) (*bytes.Buffer, error) return buffer, nil - // // 保存文件 + // 保存文件 // if err := f.SaveAs("output.xlsx"); err != nil { // return nil, err // }