hospital-applets-api/app/Services/DoctorAccountService.php

921 lines
36 KiB
PHP
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.

<?php
namespace App\Services;
use App\Constants\HttpEnumCode;
use App\Model\BasicBank;
use App\Model\DoctorAccount;
use App\Model\DoctorAccountDay;
use App\Model\DoctorBankCard;
use App\Model\DoctorWithdrawal;
use App\Model\DoctorWithdrawalBank;
use App\Model\DoctorWithdrawalOrder;
use App\Model\Order;
use App\Model\OrderInquiry;
use App\Model\OrderInquiryRefund;
use App\Model\OrderServicePackage;
use App\Model\OrderServicePackageDetail;
use App\Model\OrderServicePackageRefund;
use App\Model\UserDoctor;
use App\Model\UserDoctorInfo;
use Hyperf\DbConnection\Db;
/**
* 医生账户
*/
class DoctorAccountService extends BaseService
{
/**
* 获取我的账户数据
* @return array
*/
public function getDoctorAccount(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$year = $this->request->input('date');
$date = date('Y-m-d', time());
// 获取医生数据
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$user_doctor = UserDoctor::getOne($params);
if (empty($user_doctor)) {
return fail();
}
$inquiryService = new InquiryService();
$OrderServicePackageService = new OrderServicePackageService();
// 获取医生当日的接诊订单金额
$doctor_today_inquiry_total = $inquiryService->getDoctorDayAmountTotal($user_doctor['doctor_id'], $date, $user_doctor['is_platform_deep_cooperation']);
// 获取医生当日的服务包订单问诊金额-开始时间
$doctor_today_service_package_total = $OrderServicePackageService->getDoctorDayAmountTotal($user_doctor['doctor_id'], $date);
// 医生当日的订单金额
$doctor_today_total = bcadd($doctor_today_inquiry_total, $doctor_today_service_package_total, 2);
// 获取医生当日已完成未结束的问诊订单金额
$doctor_day_inquiry_completed_amount_total = $inquiryService->getDoctorDayCompletedAmountTotal($user_doctor['doctor_id'], $date, $user_doctor['is_platform_deep_cooperation']);
// 获取医生当日未完成的服务包订单问诊金额-结束时间
$doctor_day_service_package_completed_amount_total = $OrderServicePackageService->getDoctorDayNoFinishAmountTotal($user_doctor['doctor_id'], $date);
// 已完成待入账金额
$doctor_day_completed_amount_total = bcadd($doctor_day_inquiry_completed_amount_total, $doctor_day_service_package_completed_amount_total, 2);
// 获取医生账户余额
$balance_account = 0;
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor_account = DoctorAccount::getOne($params);
if (!empty($doctor_account)) {
$balance_account = $doctor_account['balance_account'];
}
// 获取医生问诊每月账单数据
// $bill = [];
//
// $params = array();
// $params['doctor_id'] = $user_info['client_user_id'];
// $params['year'] = $year;
// $doctor_account_days = DoctorAccountDay::getDoctorMonth($params);
// if (!empty($doctor_account_days)) {
// foreach ($doctor_account_days as $doctor_account_day) {
// $data = array();
// $data['total_amount'] = bcmul((string)$doctor_account_day['total_amount'], 1, 2);
// $data['month'] = $doctor_account_day['month'];
// $bill[] = $data;
// }
// unset($doctor_account_days);
// }
// 获取医生服务包每月账单数据
$year = date('Y',strtotime($year));
$bill = $this->getDoctorMonthlyGroupBill($user_doctor,$year);
$result = array();
$result['doctor_today_inquiry_total'] = bcmul((string)$doctor_today_total, "0.75", 2); // 今日预计收入
$result['doctor_day_completed_amount_total'] = bcmul((string)$doctor_day_completed_amount_total, "0.75", 2); // 今日已完成收入
$result['balance_account'] = bcmul((string)$balance_account, "1", 2); // 账户余额
$result['bill'] = $bill; // 账单
return success($result);
}
/**
* 获取我的账户月账单明细数据
* @return array
*/
public function getDoctorAccountInfo(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$date = $this->request->input('date');
$page = $this->request->input('page', 1);
$per_page = $this->request->input('per_page', 10);
// 获取医生数据
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$user_doctor = UserDoctor::getOne($params);
if (empty($user_doctor)) {
return fail();
}
// 获取当月开始时间
$start_date = date('Y-m-01 00:00:00', strtotime($date));
// 获取当月结束时间
// 获取给定月份的下一个月的第一天,然后减去一天得到当月的最后一天
$end_date = date("Y-m-d 23:59:59", strtotime("+1 month", strtotime($start_date)) - 1);
$date_params = [$start_date, $end_date];
$results = Order::getDoctorCreatedDateOrderInquiryPage($user_doctor['doctor_id'], $date_params, $user_doctor['is_platform_deep_cooperation'], ['*'], $page, $per_page);
if (!empty($results['data'])) {
$OrderService = new OrderService();
foreach ($results['data'] as &$result) {
// 填入字段
if (!empty($result['OrderInquiry'])) {
if (!empty($result['OrderInquiry']['cancel_reason'])) {
$result['cancel_remarks'] = inquiryCancelReasonToPushString($result['OrderInquiry']['cancel_reason']);
}
$result['patient_name'] = $result['OrderInquiry']['patient_name'];
$result['patient_name_mask'] = $result['OrderInquiry']['patient_name_mask'];
$result['patient_sex'] = $result['OrderInquiry']['patient_sex'];
$result['patient_age'] = $result['OrderInquiry']['patient_age'];
$result['start_time'] = $result['OrderInquiry']['reception_time'];
$result['finish_time'] = $result['OrderInquiry']['finish_time'];
$result['inquiry_type'] = $result['OrderInquiry']['inquiry_type'];
$result['inquiry_mode'] = $result['OrderInquiry']['inquiry_mode'];
}
if (!empty($result['OrderServicePackage'])) {
$result['patient_name'] = $result['OrderServicePackage']['patient_name'];
$result['patient_name_mask'] = $result['OrderServicePackage']['patient_name_mask'];
$result['patient_sex'] = $result['OrderServicePackage']['patient_sex'];
$result['patient_age'] = $result['OrderServicePackage']['patient_age'];
$result['start_time'] = $result['OrderServicePackage']['start_time'];
$result['finish_time'] = $result['OrderServicePackage']['finish_time'];
}
// 获取订单退款金额
$result['refund_total'] = $OrderService->getOrderRefundAmount($result['order_no']);
// 获取订单可提现金额
$result['expected_amount_total'] = $OrderService->getOrderWithdrawalAmount($result,$result['refund_total']);
// 处理问诊订单状态
if (!empty($result['OrderInquiry'])) {
// 处理入账状态
if ($result['OrderInquiry']['inquiry_status'] == 4 || $result['OrderInquiry']['inquiry_status'] == 5) {
$result['entry_status'] = 1;// 入账中
} elseif ($result['OrderInquiry']['inquiry_status'] == 6) {
$result['entry_status'] = 2;// 入账成功
} elseif ($result['OrderInquiry']['inquiry_status'] == 7) {
$result['entry_status'] = 3;// 入账失败
if (($result['OrderInquiry']['amount_total'] - $result['refund_total']) > 0) {
$result['entry_status'] = 2;// 入账成功
} else {
$result['entry_status'] = 3;// 入账失败
}
} else {
$result['entry_status'] = 0;// 未知
}
// 处理入账金额
$result['estimate_income'] = bcmul((string)$result['amount_total'],"0.75",2);
}
// 处理服务包订单状态
if (!empty($result['OrderServicePackage'])) {
if ($result['OrderServicePackage']['order_service_status'] == 3) {
$result['entry_status'] = 1;// 入账中
} elseif ($result['OrderServicePackage']['order_service_status'] == 4) {
$result['entry_status'] = 2;// 入账成功
} elseif ($result['OrderServicePackage']['order_service_status'] == 5) {
if ($result['expected_amount_total'] > 0) {
$result['entry_status'] = 2;// 入账成功
} else {
$result['entry_status'] = 3;// 入账失败
}
} else {
$result['entry_status'] = 0;// 未知
}
// 获取服务包详情表
$params = array();
$params['order_id'] = $result['order_id'];
$order_service_package_detail = OrderServicePackageDetail::getOne($params);
if (empty($order_service_package_detail)){
return fail();
}
// 处理入账金额
if ($result['order_type'] == 5){
$result['estimate_income'] = bcmul(
bcmul(
(string)$order_service_package_detail['single_inquiry_price'],
(string)$order_service_package_detail['service_count'],
2
),
"0.75",
2
);
}else{
$result['estimate_income'] = bcmul(
(string)$order_service_package_detail['service_price'],
"0.75",
2
);
}
}
unset($result['OrderInquiry']);
unset($result['OrderServicePackage']);
}
}
return success($results);
}
/**
* 获取提现数据
* @return array
*/
public function getDoctorWithdrawalInfo(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
// 获取医生信息
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$user_doctor = UserDoctor::getOne($params);
if (empty($user_doctor)) {
return fail(HttpEnumCode::HTTP_ERROR, "非法医生");
}
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$user_doctor_info = UserDoctorInfo::getOne($params);
if (empty($user_doctor_info)) {
return fail(HttpEnumCode::HTTP_ERROR, "非法医生");
}
// 检测医生身份认证
$UserDoctorService = new UserDoctorService();
$res = $UserDoctorService->checkDoctorAuth($user_doctor);
if ($res !== true) {
return fail(HttpEnumCode::HTTP_ERROR, $res);
}
if ($user_doctor['is_bind_bank'] != 1) {
return fail(HttpEnumCode::HTTP_ERROR, "未绑定结算银行卡");
}
// 获取医生结算银行卡
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor_bank_card = DoctorBankCard::getWithBankOne($params);
if (empty($doctor_bank_card)) {
return success();
}
$bank = array();
$bank['bank_card_id'] = $doctor_bank_card['bank_card_id'];
$bank['bank_icon_path'] = addAliyunOssWebsite($doctor_bank_card['BasicBank']['bank_icon_path']);
$bank['bank_name'] = $doctor_bank_card['BasicBank']['bank_name'];
$bank['bank_card_code_mask'] = $doctor_bank_card['bank_card_code_mask'];
$bank['bank_card_name'] = $user_doctor_info['card_name'];
$bank['bank_card_name_mask'] = $user_doctor_info['card_name_mask'];
$amount_total = 0;
// 获取医生账户总表
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor_account = DoctorAccount::getOne($params);
if (!empty($doctor_account)) {
$amount_total = floor($doctor_account['balance_account'] * 100) / 100;
}
/* // 获取可提现订单列表
$orders = Order:: getDoctorWithdrawalOrderList($params, $user_doctor['is_platform_deep_cooperation'], ['*']);
if (empty($orders)){
// 无订单账户余额强制赋0
$amount_total = 0;
}
$OrderService = new OrderService();
// 可提现金额
$expected_amount_total = 0;
// 订单号数据
$order_nos = [];
foreach ($orders as $order){
// 获取订单退款金额
$refund_total = $OrderService->getOrderRefundAmount($order['order_no']);
// 获取订单可提现金额
$expected_amount_total = bcadd(
$expected_amount_total,
$OrderService->getOrderWithdrawalAmount($order,$refund_total),
2
);
$order_nos[] = $order['order_no'];
}
// 对比订单金额和账户金额;金额相差1元及以上返回错误
$diff_amount_total = abs($amount_total - $expected_amount_total);
if ($diff_amount_total >= 1){
return fail(HttpEnumCode::HTTP_ERROR, "提现金额错误");
}*/
// 计算医生个人所得税
$income_tax = $this->computeIndividualIncomeTax($amount_total);
$withdrawal_amount = bcsub((string)$amount_total, (string)$income_tax, 2);
$income_tax = bcmul((string)$income_tax, 1, 2);
$result = array();
$result['bank'] = $bank; //银行数据
$result['amount_total'] = $amount_total; // 账户余额
$result['withdrawal_amount'] = $withdrawal_amount; // 提现金额
$result['income_tax'] = $income_tax; // 个人所得税
return success($result);
}
// /**
// * 获取可提现问诊订单列表
// * @return array
// */
// public function getDoctorWithdrawalOrderList(): array
// {
// $user_info = $this->request->getAttribute("userInfo") ?? [];
//
// $page = $this->request->input('page', 1);
// $per_page = $this->request->input('per_page', 10);
//
// // 获取医生信息
// $params = array();
// $params['doctor_id'] = $user_info['client_user_id'];
// $user_doctor = UserDoctor::getOne($params);
// if (empty($user_doctor)) {
// return fail();
// }
//
// $fields = [
// 'order_inquiry_id',
// 'inquiry_type',
// 'inquiry_mode',
// 'inquiry_status',
// 'inquiry_refund_status',
// 'inquiry_no',
// 'amount_total',
// 'payment_amount_total',
// 'reception_time',
// 'finish_time',
// 'patient_name',
// 'patient_sex',
// 'patient_age',
// ];
//
// $params = array();
// $params['doctor_id'] = $user_info['client_user_id'];
// $params['inquiry_refund_status'] = 0; // inquiry_refund_status问诊订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭)
//
// $inquiry_status_params = [6]; // 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
//
// $inquiry_type_not_params = [];
// if ($user_doctor['is_platform_deep_cooperation'] == 0) {
// $inquiry_type_not_params = [2, 4];
// }
//
// $order_inquiry = OrderInquiry:: getDoctorOrderInquiryPage($params, $inquiry_status_params, $inquiry_type_not_params, $fields, $page, $per_page);
//
// if (!empty($order_inquiry['data'])) {
// foreach ($order_inquiry['data'] as &$item) {
// $item['expected_amount_total'] = floor($item['amount_total'] * 0.75 * 100) / 100;
// }
// }
//
// return success($order_inquiry);
// }
/**
* 获取可提现问诊订单列表
* @return array
*/
public function getDoctorWithdrawalOrderList(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$page = $this->request->input('page', 1);
$per_page = $this->request->input('per_page', 10);
// 获取医生信息
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$user_doctor = UserDoctor::getOne($params);
if (empty($user_doctor)) {
return fail();
}
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$params['is_withdrawal'] = 0;
$results = Order:: getDoctorWithdrawalOrderPage($params, $user_doctor['is_platform_deep_cooperation'], ['*'], $page, $per_page);
if (!empty($results['data'])) {
$OrderService = new OrderService();
foreach ($results['data'] as &$result) {
// 填入字段
if (!empty($result['OrderInquiry'])) {
if (!empty($result['OrderInquiry']['cancel_reason'])) {
$result['cancel_remarks'] = inquiryCancelReasonToPushString($result['OrderInquiry']['cancel_reason']);
}
$result['patient_name'] = $result['OrderInquiry']['patient_name'];
$result['patient_name_mask'] = $result['OrderInquiry']['patient_name_mask'];
$result['patient_sex'] = $result['OrderInquiry']['patient_sex'];
$result['patient_age'] = $result['OrderInquiry']['patient_age'];
$result['start_time'] = $result['OrderInquiry']['reception_time'];
$result['finish_time'] = $result['OrderInquiry']['finish_time'];
$result['inquiry_type'] = $result['OrderInquiry']['inquiry_type'];
$result['inquiry_mode'] = $result['OrderInquiry']['inquiry_mode'];
}
if (!empty($result['OrderServicePackage'])) {
$result['patient_name'] = $result['OrderServicePackage']['patient_name'];
$result['patient_name_mask'] = $result['OrderServicePackage']['patient_name_mask'];
$result['patient_sex'] = $result['OrderServicePackage']['patient_sex'];
$result['patient_age'] = $result['OrderServicePackage']['patient_age'];
$result['start_time'] = $result['OrderServicePackage']['start_time'];
$result['finish_time'] = $result['OrderServicePackage']['finish_time'];
}
// 获取订单退款金额
$result['refund_total'] = $OrderService->getOrderRefundAmount($result['order_no']);
// 获取订单可提现金额
$result['expected_amount_total'] = $OrderService->getOrderWithdrawalAmount($result,$result['refund_total']);
unset($result['OrderInquiry']);
unset($result['OrderServicePackage']);
}
}
return success($results);
}
/**
* 获取医生提现记录列表
* @return array
*/
public function getDoctorWithdrawalRecordList(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$year = $this->request->input('year');
$page = $this->request->input('page', 1);
$per_page = $this->request->input('per_page', 10);
// 获取当年开始时间
$start_date = $year . '-1-1 00:00:00';
// 获取当年结束时间
$end_date = $year . '-12-31 23:59:59';
$created_at_params = [$start_date, $end_date];
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$doctor_withdrawal = DoctorWithdrawal::getDatePage($params, $created_at_params, ['*'], $page, $per_page);
if (empty($doctor_withdrawal['data'])) {
return success();
}
return success($doctor_withdrawal);
}
/**
* 发起提现
* @return array
*/
public function addDoctorWithdrawal(): array
{
$user_info = $this->request->getAttribute("userInfo") ?? [];
$order_no = $this->request->input('order_no');
$withdrawal_amount_total = $this->request->input('withdrawal_amount_total');
$bank_card_id = $this->request->input('bank_card_id');
$order_nos = explode(',', $order_no);
if (empty($order_nos)) {
return fail();
}
$app_env = config('app_env');
if ($app_env != "dev") {
// 正式环境高于300元才可以提现
if ($withdrawal_amount_total < 300) {
return fail(HttpEnumCode::HTTP_ERROR, "提现金额小于300元");
}
}
// 每月只能提现一次
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
$start_time = date('Y-m-01', time());
$end_time = date('Y-m-t 24:00:00', time());
$created_at = [$start_time, $end_time];
$doctor_withdrawal = DoctorWithdrawal::getOneLatestTime($params, $created_at, ['*'],);
if (!empty($doctor_withdrawal)) {
return fail("每月只允许提现一次");
}
$amount_total = 0;
foreach ($order_nos as $order_no) {
$params = array();
$params['order_no'] = $order_no;
$params['doctor_id'] = $user_info['client_user_id'];
$order = Order::getOne($params);
if (empty($order)) {
return fail(HttpEnumCode::HTTP_ERROR, "存在不可提现订单");
}
// 验证订单提现状态
if ($order['is_withdrawal'] != 0) {
return fail(HttpEnumCode::HTTP_ERROR, "存在已提现订单");
}
// 问诊订单
if ($order['order_type'] == 1){
$params = array();
$params['order_id'] = $order['order_id'];
$params['doctor_id'] = $user_info['client_user_id'];
$order_inquiry = OrderInquiry::getOne($params);
if (empty($order_inquiry)) {
return fail(HttpEnumCode::HTTP_ERROR, "存在不可提现订单");
}
// 验证订单状态
if ($order_inquiry['inquiry_status'] != 6) {
return fail(HttpEnumCode::HTTP_ERROR, "提现失败");
}
// 验证订单提现状态
if ($order_inquiry['is_withdrawal'] != 0) {
return fail(HttpEnumCode::HTTP_ERROR, "存在已提现订单");
}
// 验证订单支付状态
if ($order_inquiry['inquiry_pay_status'] != 2) {
return fail(HttpEnumCode::HTTP_ERROR, "存在未支付订单");
}
// 订单退款金额
$refund_total = 0;
$params = array();
$params['inquiry_no'] = $order_inquiry['inquiry_no'];
$order_inquiry_refunds = OrderInquiryRefund::getList($params);
if (!empty($order_inquiry_refunds)) {
foreach ($order_inquiry_refunds as $order_inquiry_refund) {
$refund_total = $refund_total + $order_inquiry_refund['refund_total'];
}
}
$amount_total = bcadd(
$amount_total,
bcsub(
$order_inquiry['amount_total'],
$refund_total,
3
),
3
);
}
// 服务包订单
if ($order['order_type'] == 4 || $order['order_type'] == 5){
$params = array();
$params['order_id'] = $order['order_id'];
$params['doctor_id'] = $user_info['client_user_id'];
$order_service_package = OrderServicePackage::getOne($params);
if (empty($order_service_package)) {
return fail(HttpEnumCode::HTTP_ERROR, "存在不可提现订单");
}
// 验证订单状态
if ($order_service_package['order_service_status'] != 4 || $order_service_package['order_service_status'] != 5) {
return fail(HttpEnumCode::HTTP_ERROR, "提现失败");
}
// 验证订单支付状态
if ($order_service_package['pay_status'] != 2) {
return fail(HttpEnumCode::HTTP_ERROR, "存在未支付订单");
}
// 获取退款数据
$refund_total = 0;
$params = array();
$params['order_service_no'] = $order_service_package['order_service_no'];
$order_service_package_refunds = OrderServicePackageRefund::getList($params);
if (!empty($order_service_package_refunds)) {
foreach ($order_service_package_refunds as $order_service_package_refund) {
$refund_total = $refund_total + $order_service_package_refund['refund_total'];
}
}
// 获取订单详情数据
$params = array();
$params['order_service_no'] = $order_service_package['order_service_no'];
$order_service_package_detail = OrderServicePackageDetail::getOne($params);
if (empty($order_service_package_detail)){
return fail(HttpEnumCode::HTTP_ERROR, "提现失败");
}
// 计算本次问诊服务包问诊金额
$amount_total = bcadd(
(string)$amount_total,
bcsub(
bcmul(
(string)$order_service_package_detail['service_count'],
(string)$order_service_package_detail['single_inquiry_price'],
3
),
$refund_total,
3
),
3
);
}
}
// 提现金额
$amount_total = bcmul((string)$amount_total,"0.75",2);
// 计算医生个人所得税
$income_tax = $this->computeIndividualIncomeTax($amount_total);
// 实际提现金额
$withdrawal_amount = $amount_total - $income_tax;
if ($withdrawal_amount > 0) {
$withdrawal_amount = floor($withdrawal_amount * 100) / 100;
}
if ($withdrawal_amount_total != $withdrawal_amount) {
return fail(HttpEnumCode::SERVER_ERROR, "金额不符合");
}
// 检测提现银行卡
$params = array();
$params['bank_card_id'] = $bank_card_id;
$doctor_bank_card = DoctorBankCard::getOne($params);
if (empty($doctor_bank_card)) {
return fail(HttpEnumCode::HTTP_ERROR, "银行卡错误");
}
// 获取银行数据
$params = array();
$params['bank_id'] = $doctor_bank_card['bank_id'];
$basic_bank = BasicBank::getOne($params);
if (empty($basic_bank)) {
return fail(HttpEnumCode::HTTP_ERROR, "银行卡错误");
}
Db::beginTransaction();
try {
// 新增医生提现表
$data = array();
$data['doctor_id'] = $user_info['client_user_id'];
$data['account_name'] = $basic_bank['bank_name'];
$data['bank_card_code'] = $doctor_bank_card['bank_card_code'];
$data['bank_card_code_four'] = substr($doctor_bank_card['bank_card_code'], -4);
if ($amount_total > 0) {
$data['applied_withdrawal_amount'] = floor($amount_total * 100) / 100; // 提现金额
}
$data['actual_withdrawal_amount'] = $withdrawal_amount; // 实际提现金额
if ($income_tax > 0) {
$data['income_tax'] = floor($income_tax * 100) / 100; // 提现所得税金额
}
$data['examine_status'] = 1; // 审核状态1:审核中 2:审核通过 3:审核未通过)
$doctor_withdrawal = DoctorWithdrawal::addDoctorWithdrawal($data);
if (empty($doctor_withdrawal)) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
// 新增医生提现表-关联银行
$data = array();
$data['withdrawal_id'] = $doctor_withdrawal["withdrawal_id"];
$data['bank_id'] = $doctor_bank_card['bank_id'];
$data['bank_card_code'] = $doctor_bank_card['bank_card_code'];
$data['province_id'] = $doctor_bank_card['province_id'];
$data['province'] = $doctor_bank_card['province'];
$data['city_id'] = $doctor_bank_card['city_id'];
$data['city'] = $doctor_bank_card['city'];
$data['county_id'] = $doctor_bank_card['county_id'];
$data['county'] = $doctor_bank_card['county'];
$doctor_withdrawal_bank = DoctorWithdrawalBank::addDoctorWithdrawalBank($data);
if (empty($doctor_withdrawal_bank)) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
foreach ($order_nos as $order_no) {
$params = array();
$params['order_no'] = $order_no;
$params['doctor_id'] = $user_info['client_user_id'];
$order = Order::getOne($params);
if (empty($order)) {
Db::rollBack();
return fail(HttpEnumCode::HTTP_ERROR, "存在不可提现订单");
}
// 新增医生提现-关联订单表
$data = array();
$data['withdrawal_id'] = $doctor_withdrawal['withdrawal_id'];
$data['doctor_id'] = $user_info['client_user_id'];
$data['order_id'] = $order['order_id'];
$doctor_withdrawal_order = DoctorWithdrawalOrder::addDoctorWithdrawalOrder($data);
if (empty($doctor_withdrawal_order)) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR);
}
// 修改订单提现状态
$params = array();
$params['order_no'] = $order_no;
$data = array();
$data['is_withdrawal'] = 2;
$data['withdrawal_time'] = date('Y-m-d H:i:s', time());
Order::edit($params,$data);
// 修改问诊订单提现状态
$params = array();
$params['order_id'] = $order['order_id'];;
$data = array();
$data['is_withdrawal'] = 2;
$data['withdrawal_time'] = date('Y-m-d H:i:s', time());
OrderInquiry::edit($params, $data);
}
// 账户表锁定
$params = array();
$params['doctor_id'] = $user_info['client_user_id'];
// 账户余额
DoctorAccount::dec($params, 'balance_account', $amount_total);
// 提现金额
DoctorAccount::inc($params, 'applied_withdrawal_amount', $amount_total);
// 实际提现金额
DoctorAccount::inc($params, 'actual_withdrawal_amount', $withdrawal_amount);
// 所得税金额
DoctorAccount::inc($params, 'income_tax', $income_tax);
Db::commit();
return success();
} catch (\Exception $e) {
Db::rollBack();
return fail(HttpEnumCode::SERVER_ERROR, $e->getMessage());
}
}
/**
* 获取医生账户余额
* @param string $doctor_id
* @return float
*/
public function getDoctorBalanceAccount(string $doctor_id): float
{
$params = array();
$params['doctor_id'] = $doctor_id;
$doctor_account = DoctorAccount::getOne($params);
if (empty($doctor_account)) {
$balance_account = 0;
} else {
$balance_account = $doctor_account['balance_account'];
}
return $balance_account;
}
/**
* 获取某月医生账户已结束订单金额
* @param string $doctor_id 医生id
* @param string $date 日期 Ymd形式
* @return float|int|mixed|string
*/
public function getDoctorMonthAmountTotal(string $doctor_id, string $date): mixed
{
$params = array();
$params['doctor_id'] = $doctor_id;
$params['year'] = date('Y', strtotime($date));
$params['month'] = date('m', strtotime($date));
$total_amount = DoctorAccountDay::getDoctorSumTotalAmount($params);
if (empty($total_amount)) {
$total_amount = 0;
}
return $total_amount;
}
/**
* 计算个人所得税
* @param string|float $income
* @return float
*/
protected function computeIndividualIncomeTax(string|float $income): float
{
if ($income <= 800) {
return 0;
}
if ($income <= 4000) {
$income = $income - 800;
}
// 实际纳税金额
if ($income > 4000) {
$income = $income * 0.8;
}
if ($income <= 20000) {
$tax_rate = 0.2; // 税率
$quick_deduction = 0; // 速算扣除数
} elseif ($income <= 50000) {
$tax_rate = 0.3;// 税率
$quick_deduction = 2000; // 速算扣除数
} else {
$tax_rate = 0.4;
$quick_deduction = 7000; // 速算扣除数
}
$income_tax = $income * $tax_rate - $quick_deduction;
return $income_tax;
}
/**
* 获取医生每月账单数据
* @param array|object $user_doctor
* @param string $year
* @return array
*/
public function getDoctorMonthlyGroupBill(array|object $user_doctor,string $year): array
{
// 获取医生服务包每月账单数据
$params = array();
$params['doctor_id'] = $user_doctor['doctor_id'];
$order_service_package = OrderServicePackage::getMonthlyGroupBill($params,$year);
if (!empty($order_service_package)){
$order_service_package = $order_service_package->toArray();
}
// 获取医生问诊每月账单数据
$params = array();
$params['doctor_id'] = $user_doctor['doctor_id'];;
$order_inquiry = OrderInquiry::getMonthlyGroupBill($params,$year,$user_doctor['is_platform_deep_cooperation']);
if (!empty($order_inquiry)){
$order_inquiry = $order_inquiry->toArray();
}
// 处理月账单数据
// 合并两个数组
$merged = array_merge($order_service_package, $order_inquiry);
// 去除重复的元素
$bill = array_unique($merged, SORT_REGULAR);
// 重新索引数组
$bill = array_values($bill);
return $bill;
}
}