=', strtotime($get['start_time'])]; } if (!empty($get['end_time']) and $get['end_time']) { $where[] = ['create_time', '<=', strtotime($get['end_time'])]; } // 导出 if (true === $is_export) { return self::export($where); } $model = new ShopWithdrawal(); $lists = $model->field(true) ->where($where) ->paginate([ 'page' => $get['page'], 'list_rows' => $get['limit'], 'var_page' => 'page' ])->toArray(); foreach ($lists['data'] as &$item) { $item['status'] = WithdrawalEnum::getStatusDesc($item['status']); } return ['count' => $lists['total'], 'lists' => $lists['data']]; } catch (\Exception $e) { return ['error' => $e->getMessage()]; } } /** * @Notes: 财务汇总 * @Author: 张无忌 * @param $shop_id */ public static function summary($shop_id) { $orderModel = new Order(); // 成交订单笔数 $detail['dealOrderCount'] = $orderModel->where(['shop_id' => $shop_id, 'pay_status' => OrderEnum::PAY_STATUS_PAID])->count(); // 商家营业金额 $detail['businessMoney'] = $orderModel->where(['shop_id' => $shop_id, 'pay_status' => OrderEnum::PAY_STATUS_PAID])->sum('order_amount'); // 退款订单金额 $detail['refundMoney'] = $orderModel->where(['shop_id' => $shop_id])->where('refund_status', '>', 0)->sum('order_amount'); } /** * @Notes: 提现详细 * @Author: 张无忌 * @param $id * @param $shop_id * @return array */ public static function detail($id, $shop_id) { $withdrawal = (new ShopWithdrawal())->findOrEmpty($id)->toArray(); $shop = (new Shop())->with(['category'])->findOrEmpty($shop_id)->toArray(); $bank = (new ShopBank())->findOrEmpty($withdrawal['bank_id'])->toArray(); $shop['type'] = ShopEnum::getShopTypeDesc($shop['type']); $withdrawal['status'] = WithdrawalEnum::getStatusDesc($withdrawal['status']); return ['withdrawal' => $withdrawal, 'shop' => $shop, 'bank' => $bank]; } /** * @Notes: 选项卡与汇总统计详细 * @param $shop_id * @return array */ public static function statistics($shop_id) { $model = new ShopWithdrawal(); $apply = $model->where(['status' => WithdrawalEnum::APPLY_STATUS, 'shop_id' => $shop_id])->count(); $handle = $model->where(['status' => WithdrawalEnum::HANDLE_STATUS, 'shop_id' => $shop_id])->count(); $success = $model->where(['status' => WithdrawalEnum::SUCCESS_STATUS, 'shop_id' => $shop_id])->count(); $error = $model->where(['status' => WithdrawalEnum::ERROR_STATUS, 'shop_id' => $shop_id])->count(); //成交订单笔数 $modelOrder = new Order(); $modelShopWithdrawal = new ShopWithdrawal(); $orderNum = $modelOrder ->where([ ['shop_id', '=', $shop_id], ['pay_status', '>', PayEnum::UNPAID] ]) ->count('id'); //营业额 $orderAmount = $modelOrder ->where([ ['shop_id', '=', $shop_id], ['pay_status', '>', PayEnum::UNPAID] ]) ->sum('order_amount'); //退款订单金额 $refundAmount = $modelOrder ->where([ ['shop_id', '=', $shop_id], ['shipping_status', '=', OrderEnum::SHIPPING_NO], ['pay_status', '=', PayEnum::REFUNDED], ['refund_status', 'in', [OrderEnum::REFUND_STATUS_PART_REFUND, OrderEnum::REFUND_STATUS_ALL_REFUND]], ]) ->sum('order_amount'); //待退款订单金额 $refundAmountIng = $modelOrder->alias('o') ->join('order_refund or', 'or.order_id = o.id') ->where([ ['o.shop_id', '=', $shop_id], ['o.shipping_status', '=', OrderEnum::SHIPPING_NO], ['or.refund_status', '<>', OrderRefundEnum::REFUND_STATUS_COMPLETE] ]) ->sum('or.order_amount'); //售后退款金额 $salesRefundAmount = $modelOrder->alias('o') ->join('after_sale as', 'as.order_id = o.id') ->where([ ['o.shop_id', '=', $shop_id], ['o.shipping_status', '=', OrderEnum::SHIPPING_FINISH], ['as.status', '=', AfterSaleEnum::STATUS_COMPLETE] ]) ->sum('as.refund_price'); //待售后退款金额 $salesRefundAmountIng = $modelOrder->alias('o') ->join('after_sale as', 'as.order_id = o.id') ->where([ ['o.shop_id', '=', $shop_id], ['o.shipping_status', '=', OrderEnum::SHIPPING_FINISH], ['as.status', '=', AfterSaleEnum::STATUS_WAITING] ]) ->sum('as.refund_price'); //已结算成交订单数 $modelShopSettlement = new ShopSettlement(); $settleOrederNum = $modelShopSettlement ->where([ ['shop_id', '=', $shop_id], ]) ->sum('deal_order_count'); //已结算营业额 $settleOrederAmount = $modelShopSettlement ->where([ ['shop_id', '=', $shop_id], ]) ->sum('business_money'); //待结算营业额 $settleOrederAmountWait = $modelOrder ->where([ ['shop_id', '=', $shop_id], ['pay_status', '>', PayEnum::UNPAID], ['settle_id', '=', OrderEnum::SETTLE_WAIT] ]) ->sum('order_amount'); //已结算分销佣金金额 $settleDistributionAmount = $modelShopSettlement ->where([ ['shop_id', '=', $shop_id], ]) ->sum('distribution_money'); //已结算入账金额 $settleWithdrawalAmount = $modelShopSettlement ->where([ ['shop_id', '=', $shop_id], ]) ->sum('entry_account_money'); //已结算交易服务费 $settlePoundageAmount = $modelShopSettlement ->where([ ['shop_id', '=', $shop_id], ]) ->sum('trade_service_fee'); //已提现金额 $withdrawaLeftamount = $modelShopWithdrawal ->where([ ['shop_id', '=', $shop_id], ['status', '=', WithdrawalEnum::SUCCESS_STATUS] ]) ->sum('apply_amount'); //提现中金额 $withdrawaLeftamountIng = $modelShopWithdrawal ->where([ ['shop_id', '=', $shop_id], ['status', 'in', [WithdrawalEnum::APPLY_STATUS, WithdrawalEnum::HANDLE_STATUS]] ]) ->sum('apply_amount'); //可提现金额 $modelShop = new Shop(); $shopWallet = $modelShop ->where([ ['id', '=', $shop_id] ]) ->sum('wallet'); //提现手续费 $procedMoney = $modelShopWithdrawal ->where([ ['shop_id', '=', $shop_id], ['status', '=', WithdrawalEnum::SUCCESS_STATUS] ]) ->sum('poundage_amount'); return [ 'apply' => $apply, 'handle' => $handle, 'success' => $success, 'error' => $error, 'orderNum' => $orderNum, //成交订单笔数 'orderAmount' => $orderAmount, //营业额 'refundAmount' => $refundAmount, //退款订单金额 'refundAmountIng' => $refundAmountIng, //待退款订单金额 'salesRefundAmount' => $salesRefundAmount, //售后退款金额 'salesRefundAmountIng' => $salesRefundAmountIng, //待售后退款金额 'settleOrederNum' => $settleOrederNum, //已结算成交订单数 'settleOrederAmount' => $settleOrederAmount, //已结算营业额 'settleOrederAmountWait' => $settleOrederAmountWait, //待结算营业额 'settleDistributionAmount' => $settleDistributionAmount, //已结算分销佣金金额 'settleWithdrawalAmount' => $settleWithdrawalAmount, //已结算入账金额 'settlePoundageAmount' => $settlePoundageAmount, //已结算交易服务费 'withdrawaLeftamount' => $withdrawaLeftamount, //已提现金额 'procedMoney' => $procedMoney, //提现手续费 'withdrawaLeftamountIng' => $withdrawaLeftamountIng, //提现中金额 'shopWallet' => $shopWallet, //可提现金额 ]; } /** * @Notes: 申请提现 * @Author: 张无忌 * @param $post * @param $shop_id * @return bool */ public static function add($post, $shop_id) { Db::startTrans(); try { // 1、获取提现条件 $min_withdrawal_money = ConfigServer::get('shop_withdrawal', 'min_withdrawal_money', 0); $max_withdrawal_money = ConfigServer::get('shop_withdrawal', 'max_withdrawal_money', 0); $withdrawal_service_charge = ConfigServer::get('shop_withdrawal', 'withdrawal_service_charge', 0); // 2、获取商家信息 $shop = (new Shop())->findOrEmpty($shop_id)->toArray(); $wallet = $shop['wallet']; // 3、验证条件是否满足 if (floatval($post['apply_amount']) > $wallet) throw new Exception('账户余额不足'); if (floatval($post['apply_amount']) < $min_withdrawal_money) throw new Exception('最低提现金额不能少于' . $min_withdrawal_money . '元'); if (floatval($post['apply_amount']) > $max_withdrawal_money) throw new Exception('最高提现金额不能大于' . $max_withdrawal_money . '元'); // 4、获取商家提现手续费 $poundage_amount = 0; if ($withdrawal_service_charge > 0) { $proportion = $withdrawal_service_charge / 100; $poundage_amount = $post['apply_amount'] * $proportion; $poundage_amount = $poundage_amount <= 0 ? 0 : $poundage_amount; } // 5、创建申请记录 $withdrawal = ShopWithdrawal::create([ 'sn' => createSn('shop_withdrawal', 'sn'), 'bank_id' => $post['bank_id'], 'shop_id' => $shop_id, 'apply_amount' => floatval($post['apply_amount']), 'left_amount' => $post['apply_amount'] - $poundage_amount, 'poundage_amount' => $poundage_amount, 'poundage_ratio' => $withdrawal_service_charge, 'status' => WithdrawalEnum::APPLY_STATUS ]); // 6、扣除商家可提现金额 Shop::update([ 'wallet' => ['dec', floatval($post['apply_amount'])], 'update_time' => time() ], ['id' => $shop_id]); $left_amount = Shop::where(['id' => $shop_id])->value('wallet'); // 7、增加提现流水记录(待提现) $logType = ShopAccountLog::withdrawal_stay_money; ShopAccountLog::decData($shop_id, $logType, $post['apply_amount'], $left_amount, [ 'source_id' => $withdrawal['id'], 'source_sn' => $withdrawal['sn'], 'remark' => '商家提现' ]); $platform_contacts = ConfigServer::get('website_platform', 'platform_mobile'); if (!empty($platform_contacts)) { event('Notice', [ 'scene' => NoticeEnum::SHOP_WITHDRAWAL_NOTICE_PLATFORM, 'mobile' => $platform_contacts, 'params' => [ 'shop_withdrawal_sn' => $withdrawal['sn'], 'shop_name' => $shop['name'], ] ]); } Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); static::$error = $e->getMessage(); return false; } } /** * @notes 导出 * @param $where * @return array|false * @author 段誉 * @date 2022/4/24 11:59 */ public static function export($where) { try { $lists = (new ShopWithdrawal()) ->field(true) ->where($where) ->select()->toArray(); foreach ($lists as &$item) { $item['status'] = WithdrawalEnum::getStatusDesc($item['status']); } $excelFields = [ 'sn' => '提现单号', 'apply_amount' => '提现金额', 'poundage_amount' => '提现手续费', 'left_amount' => '到账金额', 'status' => '提现状态', 'create_time' => '提现时间', ]; $export = new ExportExcelServer(); $export->setFileName('财务中心'); $result = $export->createExcel($excelFields, $lists); return ['url' => $result]; } catch (\Exception $e) { self::$error = $e->getMessage(); return false; } } }