Files
hospital-applets-api/app/Services/DoctorAccountService.php
T
2024-05-08 14:46:07 +08:00

921 lines
36 KiB
PHP

<?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['OrderServicePackage']['amount_total'] - $result['refund_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;
}
}