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