378 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			378 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | ||
|  | 
 | ||
|  | 
 | ||
|  | namespace app\admin\logic\finance; | ||
|  | 
 | ||
|  | 
 | ||
|  | use app\common\basics\Logic; | ||
|  | use app\common\enum\ShopEnum; | ||
|  | use app\common\enum\WithdrawalEnum; | ||
|  | 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\server\ExportExcelServer; | ||
|  | use app\common\server\UrlServer; | ||
|  | 
 | ||
|  | class ShopWithdrawalLogic extends Logic | ||
|  | { | ||
|  |     /** | ||
|  |      * @Notes: 申请提现记录列表 | ||
|  |      * @Author: 张无忌 | ||
|  |      * @param $get | ||
|  |      * @return array | ||
|  |      */ | ||
|  |     public static function lists($get, $is_export = false) | ||
|  |     { | ||
|  |         try { | ||
|  |             $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['start_time'])]; | ||
|  |             } | ||
|  | 
 | ||
|  |             // 导出
 | ||
|  |             if (true === $is_export) { | ||
|  |                 return self::withdrawalExport($where); | ||
|  |             } | ||
|  | 
 | ||
|  |             $model = new ShopWithdrawal(); | ||
|  |             $lists = $model->field(true) | ||
|  |                 ->where($where) | ||
|  |                 ->with(['shop']) | ||
|  |                 ->paginate([ | ||
|  |                     'page'      => $get['page'], | ||
|  |                     'list_rows' => $get['limit'], | ||
|  |                     'var_page' => 'page' | ||
|  |                 ])->toArray(); | ||
|  | 
 | ||
|  |             foreach ($lists['data'] as &$item) { | ||
|  |                 $item['status_text'] = WithdrawalEnum::getStatusDesc($item['status']); | ||
|  |             } | ||
|  | 
 | ||
|  |             return ['count'=>$lists['total'], 'lists'=>$lists['data']]; | ||
|  |         } catch (\Exception $e) { | ||
|  |             static::$error = $e->getMessage(); | ||
|  |             return ['error'=>$e->getMessage()]; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @Notes: 统计 | ||
|  |      * @Author: 张无忌 | ||
|  |      * @return array | ||
|  |      */ | ||
|  |     public static function statistics() | ||
|  |     { | ||
|  |         $model = new ShopWithdrawal(); | ||
|  |         $apply   = $model->where(['status'=>WithdrawalEnum::APPLY_STATUS])->count(); | ||
|  |         $handle  = $model->where(['status'=>WithdrawalEnum::HANDLE_STATUS])->count(); | ||
|  |         $success = $model->where(['status'=>WithdrawalEnum::SUCCESS_STATUS])->count(); | ||
|  |         $error   = $model->where(['status'=>WithdrawalEnum::ERROR_STATUS])->count(); | ||
|  | 
 | ||
|  |         return ['apply'=>$apply, 'handle'=>$handle, 'success'=>$success, 'error'=>$error]; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @Notes: 数据汇总 | ||
|  |      * @Author: 张无忌 | ||
|  |      */ | ||
|  |     public static function summary() | ||
|  |     { | ||
|  |         $model = new ShopWithdrawal(); | ||
|  |         $successWithdrawn = $model->where(['status'=>WithdrawalEnum::SUCCESS_STATUS])->sum('apply_amount'); | ||
|  |         $handleWithdrawn = $model->where(['status'=>WithdrawalEnum::HANDLE_STATUS])->sum('apply_amount'); | ||
|  |         $totalWallet = (new Shop())->where(['del'=>0])->sum('wallet'); | ||
|  | 
 | ||
|  |         return ['successWithdrawn'=>$successWithdrawn, 'handleWithdrawn'=>$handleWithdrawn, 'totalWallet'=>$totalWallet]; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @Notes: 提现详细 | ||
|  |      * @Author: 张无忌 | ||
|  |      * @param $id | ||
|  |      * @return array | ||
|  |      */ | ||
|  |     public static function detail($id) | ||
|  |     { | ||
|  |         $withdrawal = (new ShopWithdrawal())->findOrEmpty($id)->toArray(); | ||
|  |         $shop   = (new Shop())->with(['category'])->findOrEmpty($withdrawal['shop_id'])->toArray(); | ||
|  |         $bank   = (new ShopBank())->findOrEmpty($withdrawal['bank_id'])->toArray(); | ||
|  | 
 | ||
|  |         $shop['type'] = ShopEnum::getShopTypeDesc($shop['type']); | ||
|  |         $withdrawal['status_text'] = WithdrawalEnum::getStatusDesc($withdrawal['status']); | ||
|  | 
 | ||
|  |         return ['withdrawal'=>$withdrawal, 'shop'=>$shop, 'bank'=>$bank]; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @Notes: 审核提现 | ||
|  |      * @Author: 张无忌 | ||
|  |      * @param $post | ||
|  |      * @return bool | ||
|  |      */ | ||
|  |     public static function examine($post) | ||
|  |     { | ||
|  |         try { | ||
|  |             if ($post['is_examine']) { | ||
|  |                 // 同意提现
 | ||
|  |                 ShopWithdrawal::update([ | ||
|  |                     'explain'     => $post['explain'] ?? '', | ||
|  |                     'status'      => WithdrawalEnum::HANDLE_STATUS, | ||
|  |                     'update_time' => time() | ||
|  |                 ], ['id'=>$post['id']]); | ||
|  | 
 | ||
|  |             } else { | ||
|  |                 // 拒绝提现
 | ||
|  |                 $withdrawal = (new ShopWithdrawal())->findOrEmpty($post['id'])->toArray(); | ||
|  |                 ShopWithdrawal::update([ | ||
|  |                     'explain'     => $post['explain'] ?? '', | ||
|  |                     'status'      => WithdrawalEnum::ERROR_STATUS, | ||
|  |                     'update_time' => time() | ||
|  |                 ], ['id'=>$post['id']]); | ||
|  | 
 | ||
|  |                 Shop::update([ | ||
|  |                     'wallet'      => ['inc', $withdrawal['apply_amount']], | ||
|  |                     'update_time' => time() | ||
|  |                 ], ['id'=>$withdrawal['shop_id']]); | ||
|  | 
 | ||
|  |                 (new ShopAccountLog())->where([ | ||
|  |                     'source_id' => $withdrawal['id'], | ||
|  |                     'source_sn' => $withdrawal['sn'] | ||
|  |                 ])->update([ | ||
|  |                     'change_type' => 1, | ||
|  |                     'left_amount' => ['inc', $withdrawal['apply_amount']], | ||
|  |                     'source_type' => ShopAccountLog::withdrawal_fail_money | ||
|  |                 ]); | ||
|  |             } | ||
|  | 
 | ||
|  |             return true; | ||
|  |         } catch (\Exception $e) { | ||
|  |             static::$error = $e->getMessage(); | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @Notes: 审核提现转账 | ||
|  |      * @Author: 张无忌 | ||
|  |      * @param $post | ||
|  |      * @return bool | ||
|  |      */ | ||
|  |     public static function transfer($post) | ||
|  |     { | ||
|  |         try { | ||
|  |             if ($post['is_examine']) { | ||
|  |                 // 转账成功
 | ||
|  |                 ShopWithdrawal::update([ | ||
|  |                     'explain'          => $post['explain'] ?? '', | ||
|  |                     'status'           => WithdrawalEnum::SUCCESS_STATUS, | ||
|  |                     'transfer_voucher' => $post['image'] ?? '', | ||
|  |                     'transfer_time'    => time(), | ||
|  |                     'update_time'      => time() | ||
|  |                 ], ['id'=>(int)$post['id']]); | ||
|  | 
 | ||
|  |                 $withdrawal = (new ShopWithdrawal())->findOrEmpty($post['id'])->toArray(); | ||
|  |                 (new ShopAccountLog())->where([ | ||
|  |                     'source_id' => $withdrawal['id'], | ||
|  |                     'source_sn' => $withdrawal['sn'] | ||
|  |                 ])->update([ | ||
|  |                     'change_type' => 2, | ||
|  |                     'source_type' => ShopAccountLog::withdrawal_dec_money | ||
|  |                 ]); | ||
|  | 
 | ||
|  |             } else { | ||
|  |                 // 转账失败
 | ||
|  |                 $withdrawal = (new ShopWithdrawal())->findOrEmpty($post['id'])->toArray(); | ||
|  |                 ShopWithdrawal::update([ | ||
|  |                     'explain'          => $post['explain'] ?? '', | ||
|  |                     'status'           => WithdrawalEnum::ERROR_STATUS, | ||
|  |                     'transfer_voucher' => $post['image'] ?? '', | ||
|  |                     'transfer_time'    => time(), | ||
|  |                     'update_time'      => time() | ||
|  |                 ], ['id'=>$post['id']]); | ||
|  | 
 | ||
|  |                 Shop::update([ | ||
|  |                     'wallet'      => ['inc', $withdrawal['apply_amount']], | ||
|  |                     'update_time' => time() | ||
|  |                 ], ['id'=>$withdrawal['shop_id']]); | ||
|  | 
 | ||
|  |                 (new ShopAccountLog())->where([ | ||
|  |                     'source_id' => $withdrawal['id'], | ||
|  |                     'source_sn' => $withdrawal['sn'] | ||
|  |                 ])->update([ | ||
|  |                     'change_type' => 1, | ||
|  |                     'left_amount' => ['inc', $withdrawal['apply_amount']], | ||
|  |                     'source_type' => ShopAccountLog::withdrawal_fail_money | ||
|  |                 ]); | ||
|  |             } | ||
|  | 
 | ||
|  |             return true; | ||
|  |         } catch (\Exception $e) { | ||
|  |             static::$error = $e->getMessage(); | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @Notes: 账户明细 | ||
|  |      * @Author: 张无忌 | ||
|  |      * @param $get | ||
|  |      * @return array | ||
|  |      */ | ||
|  |     public static function account($get, $is_export = false) | ||
|  |     { | ||
|  |         $where = []; | ||
|  |         if (isset($get['shop_name']) && $get['shop_name']) {  | ||
|  |             $where[] = ['S.name', 'like', '%' . $get['shop_name'] . '%']; | ||
|  |         } | ||
|  |         if (isset($get['search_key']) && $get['search_key']) { | ||
|  |             switch($get['search_key']){ | ||
|  |                 case 'settle': | ||
|  |                     $where[] = ['SAL.source_type', '=', ShopAccountLog::settlement_add_money]; | ||
|  |                     break; | ||
|  |                 case 'withdrawal': | ||
|  |                     $where[] = ['SAL.source_type', '=', ShopAccountLog::withdrawal_dec_money]; | ||
|  |                     break; | ||
|  |                 case 'withdrawal_error': | ||
|  |                     $where[] = ['SAL.source_type', '=', ShopAccountLog::withdrawal_fail_money]; | ||
|  |                     break; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         if (!empty($get['start_time']) and $get['start_time']) { | ||
|  |             $where[] = ['SAL.create_time', '>=', strtotime($get['start_time'])]; | ||
|  |         } | ||
|  | 
 | ||
|  |         if (!empty($get['end_time']) and $get['end_time']) { | ||
|  |             $where[] = ['SAL.create_time', '<=', strtotime($get['end_time'])]; | ||
|  |         } | ||
|  | 
 | ||
|  |         // 导出
 | ||
|  |         if (true === $is_export) { | ||
|  |             return self::accountExport($where); | ||
|  |         } | ||
|  | 
 | ||
|  |         $model = new ShopAccountLog(); | ||
|  |         $lists = $model->alias('SAL') | ||
|  |                     ->field(['SAL.*', 'S.name,S.logo,S.type']) | ||
|  |                     ->join('shop S', 'S.id = SAL.shop_id') | ||
|  |                     ->order('SAL.id desc') | ||
|  |                     ->where($where) | ||
|  |                     ->paginate([ | ||
|  |                         'page'      => $get['page'], | ||
|  |                         'list_rows' => $get['limit'], | ||
|  |                         'var_page'  => 'page' | ||
|  |                     ])->toArray(); | ||
|  | 
 | ||
|  | 
 | ||
|  |         foreach ($lists['data'] as &$item) { | ||
|  |             $item['logo'] = empty($item['logo']) ? '' : UrlServer::getFileUrl($item['logo']); | ||
|  |             $item['type'] = ShopEnum::getShopTypeDesc($item['type']); | ||
|  |             $item['source_type'] = ShopAccountLog::getSourceType($item['source_type']); | ||
|  |             $item['change_amount'] = $item['change_type'] == 1 ? '+'.$item['change_amount'] : '-'.$item['change_amount']; | ||
|  |             $item['logo'] = !empty($item['logo']) ? UrlServer::getFileUrl($item['logo']) : ""; | ||
|  |         } | ||
|  | 
 | ||
|  |         return ['count'=>$lists['total'], 'lists'=>$lists['data']]; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @notes 导出商家明细Excel | ||
|  |      * @param array $where | ||
|  |      * @return array|false | ||
|  |      * @author 段誉 | ||
|  |      * @date 2022/4/24 10:10 | ||
|  |      */ | ||
|  |     public static function withdrawalExport($where) | ||
|  |     { | ||
|  |         try { | ||
|  |             $model = new ShopWithdrawal(); | ||
|  |             $lists = $model->field(true) | ||
|  |                 ->where($where) | ||
|  |                 ->with(['shop']) | ||
|  |                 ->select()->toArray(); | ||
|  | 
 | ||
|  |             foreach ($lists as &$item) { | ||
|  |                 $item['status_text'] = WithdrawalEnum::getStatusDesc($item['status']); | ||
|  |                 $item['shop_name'] = $item['shop']['name']; | ||
|  |                 $item['shop_type'] = ShopEnum::getShopTypeDesc($item['shop']['type']); | ||
|  |             } | ||
|  | 
 | ||
|  |             $excelFields = [ | ||
|  |                 'shop_name' => '商家名称', | ||
|  |                 'shop_type' => '商家类型', | ||
|  |                 'sn' => '提现单号', | ||
|  |                 'apply_amount' => '提现金额', | ||
|  |                 'poundage_amount' => '提现手续费', | ||
|  |                 'left_amount' => '到账金额', | ||
|  |                 'status_text' => '提现状态', | ||
|  |                 'create_time' => '提现时间', | ||
|  |             ]; | ||
|  | 
 | ||
|  |             $export = new ExportExcelServer(); | ||
|  |             $export->setFileName('商家提现'); | ||
|  |             $result = $export->createExcel($excelFields, $lists); | ||
|  | 
 | ||
|  |             return ['url' => $result]; | ||
|  | 
 | ||
|  |         } catch (\Exception $e) { | ||
|  |             self::$error = $e->getMessage(); | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /** | ||
|  |      * @notes 导出商家账户明细Excel | ||
|  |      * @param array $where | ||
|  |      * @return array|false | ||
|  |      * @author 段誉 | ||
|  |      * @date 2022/4/24 10:10 | ||
|  |      */ | ||
|  |     public static function accountExport($where) | ||
|  |     { | ||
|  |         try { | ||
|  |             $model = new ShopAccountLog(); | ||
|  |             $lists = $model->alias('SAL') | ||
|  |                 ->field(['SAL.*', 'S.name,S.type']) | ||
|  |                 ->join('shop S', 'S.id = SAL.shop_id') | ||
|  |                 ->order('SAL.id desc') | ||
|  |                 ->where($where) | ||
|  |                 ->select()->toArray(); | ||
|  | 
 | ||
|  |             foreach ($lists as &$item) { | ||
|  |                 $item['type'] = ShopEnum::getShopTypeDesc($item['type']); | ||
|  |                 $item['source_type'] = ShopAccountLog::getSourceType($item['source_type']); | ||
|  |                 $item['change_amount'] = $item['change_type'] == 1 ? '+'.$item['change_amount'] : '-'.$item['change_amount']; | ||
|  |             } | ||
|  | 
 | ||
|  |             $excelFields = [ | ||
|  |                 'name' => '商家名称', | ||
|  |                 'type' => '商家类型', | ||
|  |                 'log_sn' => '明细流水号', | ||
|  |                 'source_sn' => '来源单号', | ||
|  |                 'source_type' => '明细类型', | ||
|  |                 'change_amount' => '变动金额', | ||
|  |                 'left_amount' => '剩余金额', | ||
|  |                 'create_time' => '记录时间', | ||
|  |             ]; | ||
|  | 
 | ||
|  |             $export = new ExportExcelServer(); | ||
|  |             $export->setFileName('商家账户明细'); | ||
|  |             $export->setExportNumber(['log_sn', 'source_sn']); | ||
|  |             $result = $export->createExcel($excelFields, $lists); | ||
|  | 
 | ||
|  |             return ['url' => $result]; | ||
|  | 
 | ||
|  |         } catch (\Exception $e) { | ||
|  |             self::$error = $e->getMessage(); | ||
|  |             return false; | ||
|  |         } | ||
|  |     } | ||
|  | } |