403 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			403 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| 
 | |
| 
 | |
| namespace app\shop\logic\finance;
 | |
| 
 | |
| 
 | |
| use app\common\basics\Logic;
 | |
| use app\common\enum\NoticeEnum;
 | |
| use app\common\enum\OrderEnum;
 | |
| use app\common\enum\ShopEnum;
 | |
| use app\common\enum\PayEnum;
 | |
| use app\common\enum\OrderRefundEnum;
 | |
| use app\common\enum\WithdrawalEnum;
 | |
| use app\common\enum\AfterSaleEnum;
 | |
| use app\common\model\order\Order;
 | |
| use app\common\model\shop\Shop;
 | |
| use app\common\model\shop\ShopAccountLog;
 | |
| use app\common\model\shop\ShopBank;
 | |
| use app\common\model\shop\ShopWithdrawal;
 | |
| use app\common\model\shop\ShopSettlement;
 | |
| use app\common\server\ConfigServer;
 | |
| use app\common\server\ExportExcelServer;
 | |
| use think\Exception;
 | |
| use think\facade\Db;
 | |
| 
 | |
| class WithdrawalLogic extends Logic
 | |
| {
 | |
|     /**
 | |
|      * @Notes: 商家提现列表
 | |
|      * @Author: 张无忌
 | |
|      * @param $get
 | |
|      * @param $shop_id
 | |
|      * @return array
 | |
|      */
 | |
|     public static function lists($get, $shop_id, $is_export = false)
 | |
|     {
 | |
|         try {
 | |
|             $where[] = ['shop_id', '=', $shop_id];
 | |
|             $where[] = ['status', '=', $get['type'] ?? 0];
 | |
| 
 | |
|             if (!empty($get['start_time']) and $get['start_time']) {
 | |
|                 $where[] = ['create_time', '>=', 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;
 | |
|         }
 | |
|     }
 | |
| }
 |