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; } }