diff --git a/api/controller/doctorWithdrawal.go b/api/controller/doctorWithdrawal.go index 9af00b4..eefc220 100644 --- a/api/controller/doctorWithdrawal.go +++ b/api/controller/doctorWithdrawal.go @@ -203,3 +203,32 @@ func (r *DoctorWithdrawal) PutDoctorWithdrawalExamine(c *gin.Context) { responses.Ok(c) } + +// PutDoctorWithdrawalPayment 确认打款 +func (r *DoctorWithdrawal) PutDoctorWithdrawalPayment(c *gin.Context) { + id := c.Param("withdrawal_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + withdrawalId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 后台用户id + adminUserId := c.GetInt64("UserId") + + // 业务处理 + doctorWithdrawaService := service.DoctorWithdrawaService{} + _, err = doctorWithdrawaService.PutDoctorWithdrawalPayment(withdrawalId, adminUserId) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} diff --git a/api/router/router.go b/api/router/router.go index 1236447..b61652b 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -526,8 +526,8 @@ func privateRouter(r *gin.Engine, api controller.Api) { // 修改提现审核状态 withdrawalGroup.PUT("/examine/:withdrawal_id", api.DoctorWithdrawal.PutDoctorWithdrawalExamine) - // 修改打款状态 - withdrawalGroup.PUT("/payment/:withdrawal_id", api.OrderPrescription.GetOrderPrescriptionPage) + // 确认打款 + withdrawalGroup.PUT("/payment/:withdrawal_id", api.DoctorWithdrawal.PutDoctorWithdrawalPayment) } // 银行卡管理 diff --git a/api/service/doctorWithdrawa.go b/api/service/doctorWithdrawa.go index 58d4543..97195a5 100644 --- a/api/service/doctorWithdrawa.go +++ b/api/service/doctorWithdrawa.go @@ -112,8 +112,8 @@ func (r *DoctorWithdrawaService) PutDoctorWithdrawalIncome(req requests.PutDocto // 提现申请修改数据-提现金额固定不动,修改个人所得税,实际提现金额跟随变动 doctorWithdrawalData := make(map[string]interface{}) - doctorWithdrawalData["income_tax"] = req.IncomeTax // 提现所得税金额 doctorWithdrawalData["actual_withdrawal_amount"] = actualWithdrawalAmount // 实际提现金额 + doctorWithdrawalData["income_tax"] = req.IncomeTax // 提现所得税金额 err := doctorWithdrawalDao.EditDoctorWithdrawalById(tx, doctorWithdrawal.WithdrawalId, doctorWithdrawalData) if err != nil { tx.Rollback() @@ -173,31 +173,29 @@ func (r *DoctorWithdrawaService) PutDoctorWithdrawalExamine(req requests.PutDoct return false, errors.New(err.Error()) } + // 获取医生账户数据 + doctorAccountDao := dao.DoctorAccountDao{} + doctorAccount, err := doctorAccountDao.GetDoctorAccountByDoctorId(doctorWithdrawal.DoctorId) + if err != nil { + tx.Rollback() + return false, errors.New("医生账户数据错误") + } + + // 获取医生分成总金额 + amountTotal, err := r.getDoctorWithdrawalOrderAmountTotal(withdrawalId) + if err != nil { + tx.Rollback() + return false, err + } + + // 重新计算医生个人所得税 + incomeTax := utils.ComputeIndividualIncomeTax(amountTotal) + + // 重新计算实际提现金额 + withdrawalAmount := amountTotal - incomeTax + // 返还医生账户金额-审核不通过 if req.ExamineStatus == 3 { - // 获取医生账户数据 - doctorAccountDao := dao.DoctorAccountDao{} - doctorAccount, err := doctorAccountDao.GetDoctorAccountByDoctorId(doctorWithdrawal.DoctorId) - if err != nil { - tx.Rollback() - return false, errors.New("医生账户数据错误") - } - - // 获取提现关联订单医生分成总金额 - amountTotal, err := r.getDoctorWithdrawalOrderAmountTotal(withdrawalId) - if err != nil { - tx.Rollback() - return false, err - } - - // 重新计算医生个人所得税 - incomeTax := utils.ComputeIndividualIncomeTax(amountTotal) - - // 重新计算实际提现金额 - withdrawalAmount := math.Floor((amountTotal-incomeTax)*0.75*100) / 100 - - incomeTax = math.Floor(incomeTax*100) / 100 - // 账户余额-增加 maps := make(map[string]interface{}) maps["account_id"] = doctorAccount.AccountId @@ -207,10 +205,19 @@ func (r *DoctorWithdrawaService) PutDoctorWithdrawalExamine(req requests.PutDoct return false, err } + // 提现金额-减少 + maps = make(map[string]interface{}) + maps["account_id"] = doctorAccount.AccountId + err = doctorAccountDao.Dec(tx, maps, amountTotal, "applied_withdrawal_amount") + if err != nil { + tx.Rollback() + return false, err + } + // 实际提现金额-减少 maps = make(map[string]interface{}) maps["account_id"] = doctorAccount.AccountId - err = doctorAccountDao.Dec(tx, maps, withdrawalAmount, "applied_withdrawal_amount") + err = doctorAccountDao.Dec(tx, maps, withdrawalAmount, "actual_withdrawal_amount") if err != nil { tx.Rollback() return false, err @@ -258,6 +265,74 @@ func (r *DoctorWithdrawaService) PutDoctorWithdrawalExamine(req requests.PutDoct return true, nil } +// PutDoctorWithdrawalPayment 确认打款 +func (r *DoctorWithdrawaService) PutDoctorWithdrawalPayment(withdrawalId, adminUserId int64) (bool, error) { + doctorWithdrawalDao := dao.DoctorWithdrawalDao{} + doctorWithdrawal, _ := doctorWithdrawalDao.GetDoctorWithdrawalById(withdrawalId) + if doctorWithdrawal == nil { + return false, errors.New("数据错误") + } + + // 判断审核状态 + if doctorWithdrawal.ExamineStatus != 2 { + return false, errors.New("请先确认打款金额并审核") + } + + if doctorWithdrawal.PaymentStatus == 1 { + return false, errors.New("已打款,请勿再次操作") + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + // 提现申请修改数据 + doctorWithdrawalData := make(map[string]interface{}) + doctorWithdrawalData["payment_status"] = 1 + doctorWithdrawalData["payment_time"] = time.Now().Format("2006-01-02 15:04:05") + doctorWithdrawalData["payment_by"] = adminUserId + err := doctorWithdrawalDao.EditDoctorWithdrawalById(tx, doctorWithdrawal.WithdrawalId, doctorWithdrawalData) + if err != nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + // 获取医生提现-关联订单数据 + doctorWithdrawalOrderDao := dao.DoctorWithdrawalOrderDao{} + doctorWithdrawalOrders, err := doctorWithdrawalOrderDao.GetDoctorWithdrawalOrderByWithdrawalId(withdrawalId) + if err != nil { + tx.Rollback() + return false, errors.New("关联订单数据错误") + } + + // 修改问诊订单提现状态 + for _, v := range doctorWithdrawalOrders { + // 获取订单数据 + orderInquiryDao := dao.OrderInquiryDao{} + orderInquiry, err := orderInquiryDao.GetOrderInquiryById(v.OrderInquiryId) + if err != nil { + tx.Rollback() + return false, errors.New("关联订单数据错误") + } + + orderInquiryData := make(map[string]interface{}) + orderInquiryData["is_withdrawal"] = 1 + orderInquiryData["withdrawal_time"] = time.Now().Format("2006-01-02 15:04:05") + err = orderInquiryDao.EditOrderInquiryById(tx, orderInquiry.OrderInquiryId, orderInquiryData) + if err != nil { + tx.Rollback() + return false, errors.New("操作关联订单数据失败") + } + } + + tx.Commit() + return true, nil +} + // 获取提现关联订单医生分成总金额 func (r *DoctorWithdrawaService) getDoctorWithdrawalOrderAmountTotal(withdrawalId int64) (float64, error) { // 获取医生提现-关联订单数据 @@ -292,10 +367,7 @@ func (r *DoctorWithdrawaService) getDoctorWithdrawalOrderAmountTotal(withdrawalI amountTotal = amountTotal + orderInquiry.AmountTotal } - // 医生分成金额 - if amountTotal > 0 { - amountTotal = math.Floor(amountTotal*0.75*100) / 100 - } + amountTotal = amountTotal * 0.75 return amountTotal, nil }