| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 | <?php/** * Created by PhpStorm. * User: tandunzhao * Date: 2017/11/17 * Time: 下午4:32 */namespace App\Modules\Finance\Models;use App\Libs\PayHelper;use App\Modules\Finance\Services\BankService;use App\Modules\Finance\Services\BatchPaymentService;use App\Modules\Finance\Services\CashAccountService;use App\Modules\Finance\Services\PaymentService;use App\Modules\Finance\Services\WithdrawCashService;use App\Modules\Manage\Services\ManageService;use Illuminate\Database\Eloquent\Model;use DB;/** * Class WithdrawCash 提现 * @package App\Modules\Finance\Models */class BatchPayments extends Model{    protected $table = 'batch_payments';    protected $fillable = ['id','amount','amount_person', 'remark', 'pay_time','pay_merchant_source','trade_no', 'status',        'is_company','pay_merchant_source_msg','pay_merchant_source_result','bank_account','account_name','account_bank',        'channel_user_id','check_user_id','check_user_name','serial_number'];    public static function addBatchPayment($param){        return self::create($param);    }    public static function getBatchPayment($statusIn,$is_all){        if(is_numeric($statusIn)) {            $status = WithdrawCashService::getBatchWithdrawCashStatusStrList($statusIn);        }        $obj =  self::leftjoin('channel_users','channel_users.id','=','batch_payments.channel_user_id')            ->leftjoin('companies','companies.id','=','channel_users.company_id')            ->select([DB::raw('batch_payments.*'),'companies.name as company_name'])            ->where('status',$status);        if($is_all){            return $obj->get();        }        return $obj->paginate();    }    public static function getById($id) {        return self::where('id',$id)->first();    }    public static function makeThreeSourcePayment($userId, $batch_payment_id, $amount, $remark) {        //$withdrawCash = WithdrawCashService::getWithdrawCash($withdraw_cash_id);        $batch_payment = self::getById($batch_payment_id);        if(empty($batch_payment)) {            return false;        }        $payType = '';        /*if($liquidatedStat['pay_merchant_source'] == config('common.tonglianpay')) {            $payType = "ALLINPAY";        }        if($liquidatedStat['pay_merchant_source'] == config('common.lianlianpay')) {            $payType = "LIANLIANPAY";        }*/        $payType = "LIANLIANPAY";        if($payType) {            try {                //$channelId = $withdrawCash['distribution_channel_id'];                $transactionSerialNumber = date('YmdHis')."_".($batch_payment->channel_user_id);                //$cashAccount = CashAccountService::getCashAccountSingle($channelId);                //$bank = BankService::getBankSingle($cashAccount['bank_id']);                $bankCode = '';                $bankName = $batch_payment->account_bank;       //$cashAccount['account_bank'];                $bankAccountNO = $batch_payment->bank_account;  //$cashAccount['card_number'];                $bankAccountName = $batch_payment->account_name;//$cashAccount['account_name'];                $payAmount = $amount;                $summaryPay = "summary";                $remarkPay = "remark";               // $withdrawCash = WithdrawCashService::getWithdrawCash($withdraw_cash_id);                //当前当条提现是对公还是对私                $isCompany = $batch_payment->is_company;                $pay_id = $batch_payment->id;                DB::beginTransaction();                try{                    //$savePayment = PaymentService::addPayment($withdraw_cash_id, $amount, $remark, $liquidatedStat['pay_merchant_source'], $transactionSerialNumber, WithdrawCashService::getWithdrawCashStatusStr(21), "", $isCompany, 0);                    $batch_payment->serial_number=$transactionSerialNumber;                    $batch_payment->status=WithdrawCashService::getWithdrawCashStatusStr(21);                    $savePayment=$batch_payment->save();                    if($savePayment) {                        //更新单个第三方通道可打款金额                        //FinanceMerchantStatService::createOrUpdate($channelId, $liquidatedStat['pay_merchant_source'], -$amount);                        //更新当前渠道当天当前支付通道可打款余额                        //LiquidatedStatService::updateAccountBalanceAmountDay($liquidatedStat['pay_merchant_source'], -$amount);                        //修改状态打款中                        $withdraws = WithdrawCashService::getByBatchPaymentId($pay_id);                        \Log::info($withdraws);                        foreach ($withdraws as $withdraw){                            WithdrawCashService::updateWithdrawCashStatus($withdraw->id, $userId, 21, $remark, $transactionSerialNumber);                        }                        //                        $resultPayData = ['code'=>1,'http_result_data'=>['123']];//PayHelper::pay($payType, $transactionSerialNumber, $bankCode, $bankName, $bankAccountNO, $bankAccountName, $payAmount, $summaryPay, $remarkPay, '', $isCompany);                        \Log::info('lianlianpay_ret:'.$transactionSerialNumber.':'.json_encode($resultPayData));                        $resultDataMsg = $remark;                        if(!empty($resultPayData) && !empty($resultPayData['msg'])) {                            $resultDataMsg = $resultDataMsg."_【".$resultPayData['msg']."】";                        }                        if(!empty($resultPayData) && $resultPayData['code'] == 1) {                            $resultDataHttpDataMsg = json_encode($resultPayData['http_result_data']);                            self::updatePaymentStatus($pay_id, WithdrawCashService::getWithdrawCashStatusStr(21), $resultDataHttpDataMsg, $resultDataMsg);                        } else {                            $resultDataHttpDataMsg = json_encode($resultPayData['http_result_data']);                            foreach ($withdraws as $withdraw) {                                WithdrawCashService::updateWithdrawCashStatus($withdraw->id, $userId, 41, $resultDataMsg, $transactionSerialNumber);                            }                            self::updatePaymentStatus($savePayment['id'], WithdrawCashService::getWithdrawCashStatusStr(41), $resultDataHttpDataMsg, $resultDataMsg);                        }                    }                    DB::commit();                } catch (\Exception $e){                    Log::error($e->getMessage());                    DB::rollback();                    //WithdrawCashService::updateWithdrawCashStatus($withdraw_cash_id, $userId, -1, $remark, $transactionSerialNumber);                }            } catch (\Exception $e){                //WithdrawCashService::updateWithdrawCashStatus($withdraw_cash_id, $userId, -1, $e->getMessage(), '');            }            return true;        } else {            return false;        }    }    public static function updatePaymentStatus($id, $status = '', $pay_merchant_source_msg, $pay_merchant_source_result) {        $dataPayment = self::find($id);        if(!empty($dataPayment)) {            if($status) {                $dataPayment['status'] = $status;            }            $dataPayment['pay_merchant_source_msg'] = $pay_merchant_source_msg;            $dataPayment['pay_merchant_source_result'] = $pay_merchant_source_result;            $dataPayment = $dataPayment->save();        }        return $dataPayment;    }    public static function getBatchPaymentPaying(){        $res = self::where('status',WithdrawCashService::getWithdrawCashStatusStr(21))->get();        return $res;    }    public static function updateWithdrawCashStatus($id, $userId = '', $statusIn, $remark='', $serialNumber='') {        //TODO 对于一个提现记录只有一条打款是没有Bug的。        //TODO 一个提现记录对应多个支付通道打款,存在逻辑bug        $withdrawCashs = WithdrawCash::where('batch_payment_id', $id)->get();        //\DB::beginTransaction();        try{        //print_r($withdrawCashs);            foreach ($withdrawCashs as $withdrawCash){                if(!empty($withdrawCash) && is_numeric($statusIn)) {                    if(WithdrawCashService::isWithdrawCashStatusPaymentIngStr($withdrawCash->status)) {                        //当前状态是 打款中 可以修改状态                    } else {                        if(WithdrawCashService::isEditWithdrawCashStatus($id)) {                            return $withdrawCash;                        }                    }                    $userName = "";                    if($userId) {                        $manage = ManageService::getById($userId);                        if(!empty($manage)) {                            $userName = $manage['nickname'];                        }                    }                    $statusStr = WithdrawCashService::getWithdrawCashStatusStr($statusIn);                    if(empty($statusStr)) {                    } else {                        if($statusStr) {                            $withdrawCash->status = $statusStr;                        }                    }                    if(WithdrawCashService::isWithdrawCashStatusCodeSuccess($statusIn)) {                        //成功提现                        $financialStat = FinancialStat::getByDistributionChannel($withdrawCash->distribution_channel_id);                        //修改累计提现金额                        $financialStat->accumulative_withdrawal_amount = (float)($financialStat->accumulative_withdrawal_amount) + (float)($withdrawCash->amount);                        //修改提现中金额                        $financialStat->withdraw_pending_amount = (float)($financialStat->withdraw_pending_amount) - (float)$withdrawCash->amount;                        $financialStat->save();                        //                       // $financePayMerchantBalanceInfo = FinancialPayMerchantBalance::getOne($withdrawCash->distribution_channel_id,$withdrawCash->pay_merchant_company_id);                        //\Log::info('financePayMerchantBalanceInfo:channel_id:'.$withdrawCash['distribution_channel_id'].'pay_merchant_company_id:'.$withdrawCash['pay_merchant_company_id'].json_encode($financePayMerchantBalanceInfo));                        //修改累计提现金额                       // $financePayMerchantBalanceInfo->accumulative_withdrawal_amount = (float)$financePayMerchantBalanceInfo->accumulative_withdrawal_amount + (float)($withdrawCash->amount);                        //修改提现中金额                       // $financePayMerchantBalanceInfo->withdraw_pending_amount = (float)$financePayMerchantBalanceInfo->withdraw_pending_amount - (float)($withdrawCash->amount);                        //$financialStat->save();                    }                    if($userId) {                        $withdrawCash->check_user_id = $userId;                    }                    if($userName) {                        $withdrawCash->check_user_name = $userName;                    }                    if($remark) {                        $withdrawCash->remark = $remark;                    }                    if($serialNumber) {                        if(strpos($withdrawCash->serial_number, $serialNumber) !== false) {                            //包含                        } else {                            $serialNumber = ($withdrawCash->serial_number).",".$serialNumber;                        }                        $withdrawCash->serial_number = $serialNumber;                    }                    $withdrawCash->save();                }            }            //\DB::commit();            print_r('commited');        }catch (\Exception $exception){            //DB::rollBack();            \Log::error('pay_query_failed:'.($exception->getMessege()));            //throw new \Exception($exception->getMessage(),$exception->getCode());            print_r('pay_query_failed:'.($exception->getMessage()));        }    }}
 |