BatchPayments.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: tandunzhao
  5. * Date: 2017/11/17
  6. * Time: 下午4:32
  7. */
  8. namespace App\Modules\Finance\Models;
  9. use App\Libs\PayHelper;
  10. use App\Modules\Finance\Services\BankService;
  11. use App\Modules\Finance\Services\BatchPaymentService;
  12. use App\Modules\Finance\Services\CashAccountService;
  13. use App\Modules\Finance\Services\PaymentService;
  14. use App\Modules\Finance\Services\WithdrawCashService;
  15. use App\Modules\Manage\Services\ManageService;
  16. use Illuminate\Database\Eloquent\Model;
  17. use DB;
  18. /**
  19. * Class WithdrawCash 提现
  20. * @package App\Modules\Finance\Models
  21. */
  22. class BatchPayments extends Model
  23. {
  24. protected $table = 'batch_payments';
  25. protected $fillable = ['id','amount','amount_person', 'remark', 'pay_time','pay_merchant_source','trade_no', 'status',
  26. 'is_company','pay_merchant_source_msg','pay_merchant_source_result','bank_account','account_name','account_bank',
  27. 'channel_user_id','check_user_id','check_user_name','serial_number'];
  28. public static function addBatchPayment($param){
  29. return self::create($param);
  30. }
  31. public static function getBatchPayment($statusIn,$is_all){
  32. if(is_numeric($statusIn)) {
  33. $status = WithdrawCashService::getBatchWithdrawCashStatusStrList($statusIn);
  34. }
  35. $obj = self::leftjoin('channel_users','channel_users.id','=','batch_payments.channel_user_id')
  36. ->leftjoin('companies','companies.id','=','channel_users.company_id')
  37. ->select([DB::raw('batch_payments.*'),'companies.name as company_name'])
  38. ->where('status',$status);
  39. if($is_all){
  40. return $obj->get();
  41. }
  42. return $obj->paginate();
  43. }
  44. public static function getById($id) {
  45. return self::where('id',$id)->first();
  46. }
  47. public static function makeThreeSourcePayment($userId, $batch_payment_id, $amount, $remark) {
  48. //$withdrawCash = WithdrawCashService::getWithdrawCash($withdraw_cash_id);
  49. $batch_payment = self::getById($batch_payment_id);
  50. if(empty($batch_payment)) {
  51. return false;
  52. }
  53. $payType = '';
  54. /*if($liquidatedStat['pay_merchant_source'] == config('common.tonglianpay')) {
  55. $payType = "ALLINPAY";
  56. }
  57. if($liquidatedStat['pay_merchant_source'] == config('common.lianlianpay')) {
  58. $payType = "LIANLIANPAY";
  59. }*/
  60. $payType = "LIANLIANPAY";
  61. if($payType) {
  62. try {
  63. //$channelId = $withdrawCash['distribution_channel_id'];
  64. $transactionSerialNumber = date('YmdHis')."_".($batch_payment->channel_user_id);
  65. //$cashAccount = CashAccountService::getCashAccountSingle($channelId);
  66. //$bank = BankService::getBankSingle($cashAccount['bank_id']);
  67. $bankCode = '';
  68. $bankName = $batch_payment->account_bank; //$cashAccount['account_bank'];
  69. $bankAccountNO = $batch_payment->bank_account; //$cashAccount['card_number'];
  70. $bankAccountName = $batch_payment->account_name;//$cashAccount['account_name'];
  71. $payAmount = $amount;
  72. $summaryPay = "summary";
  73. $remarkPay = "remark";
  74. // $withdrawCash = WithdrawCashService::getWithdrawCash($withdraw_cash_id);
  75. //当前当条提现是对公还是对私
  76. $isCompany = $batch_payment->is_company;
  77. $pay_id = $batch_payment->id;
  78. DB::beginTransaction();
  79. try{
  80. //$savePayment = PaymentService::addPayment($withdraw_cash_id, $amount, $remark, $liquidatedStat['pay_merchant_source'], $transactionSerialNumber, WithdrawCashService::getWithdrawCashStatusStr(21), "", $isCompany, 0);
  81. $batch_payment->serial_number=$transactionSerialNumber;
  82. $batch_payment->status=WithdrawCashService::getWithdrawCashStatusStr(21);
  83. $savePayment=$batch_payment->save();
  84. if($savePayment) {
  85. //更新单个第三方通道可打款金额
  86. //FinanceMerchantStatService::createOrUpdate($channelId, $liquidatedStat['pay_merchant_source'], -$amount);
  87. //更新当前渠道当天当前支付通道可打款余额
  88. //LiquidatedStatService::updateAccountBalanceAmountDay($liquidatedStat['pay_merchant_source'], -$amount);
  89. //修改状态打款中
  90. $withdraws = WithdrawCashService::getByBatchPaymentId($pay_id);
  91. \Log::info($withdraws);
  92. foreach ($withdraws as $withdraw){
  93. WithdrawCashService::updateWithdrawCashStatus($withdraw->id, $userId, 21, $remark, $transactionSerialNumber);
  94. }
  95. //
  96. $resultPayData = ['code'=>1,'http_result_data'=>['123']];//PayHelper::pay($payType, $transactionSerialNumber, $bankCode, $bankName, $bankAccountNO, $bankAccountName, $payAmount, $summaryPay, $remarkPay, '', $isCompany);
  97. \Log::info('lianlianpay_ret:'.$transactionSerialNumber.':'.json_encode($resultPayData));
  98. $resultDataMsg = $remark;
  99. if(!empty($resultPayData) && !empty($resultPayData['msg'])) {
  100. $resultDataMsg = $resultDataMsg."_【".$resultPayData['msg']."】";
  101. }
  102. if(!empty($resultPayData) && $resultPayData['code'] == 1) {
  103. $resultDataHttpDataMsg = json_encode($resultPayData['http_result_data']);
  104. self::updatePaymentStatus($pay_id, WithdrawCashService::getWithdrawCashStatusStr(21), $resultDataHttpDataMsg, $resultDataMsg);
  105. } else {
  106. $resultDataHttpDataMsg = json_encode($resultPayData['http_result_data']);
  107. foreach ($withdraws as $withdraw) {
  108. WithdrawCashService::updateWithdrawCashStatus($withdraw->id, $userId, 41, $resultDataMsg, $transactionSerialNumber);
  109. }
  110. self::updatePaymentStatus($savePayment['id'], WithdrawCashService::getWithdrawCashStatusStr(41), $resultDataHttpDataMsg, $resultDataMsg);
  111. }
  112. }
  113. DB::commit();
  114. } catch (\Exception $e){
  115. Log::error($e->getMessage());
  116. DB::rollback();
  117. //WithdrawCashService::updateWithdrawCashStatus($withdraw_cash_id, $userId, -1, $remark, $transactionSerialNumber);
  118. }
  119. } catch (\Exception $e){
  120. //WithdrawCashService::updateWithdrawCashStatus($withdraw_cash_id, $userId, -1, $e->getMessage(), '');
  121. }
  122. return true;
  123. } else {
  124. return false;
  125. }
  126. }
  127. public static function updatePaymentStatus($id, $status = '', $pay_merchant_source_msg, $pay_merchant_source_result) {
  128. $dataPayment = self::find($id);
  129. if(!empty($dataPayment)) {
  130. if($status) {
  131. $dataPayment['status'] = $status;
  132. }
  133. $dataPayment['pay_merchant_source_msg'] = $pay_merchant_source_msg;
  134. $dataPayment['pay_merchant_source_result'] = $pay_merchant_source_result;
  135. $dataPayment = $dataPayment->save();
  136. }
  137. return $dataPayment;
  138. }
  139. public static function getBatchPaymentPaying(){
  140. $res = self::where('status',WithdrawCashService::getWithdrawCashStatusStr(21))->get();
  141. return $res;
  142. }
  143. public static function updateWithdrawCashStatus($id, $userId = '', $statusIn, $remark='', $serialNumber='') {
  144. //TODO 对于一个提现记录只有一条打款是没有Bug的。
  145. //TODO 一个提现记录对应多个支付通道打款,存在逻辑bug
  146. $withdrawCashs = WithdrawCash::where('batch_payment_id', $id)->get();
  147. //\DB::beginTransaction();
  148. try{
  149. //print_r($withdrawCashs);
  150. foreach ($withdrawCashs as $withdrawCash){
  151. if(!empty($withdrawCash) && is_numeric($statusIn)) {
  152. if(WithdrawCashService::isWithdrawCashStatusPaymentIngStr($withdrawCash->status)) {
  153. //当前状态是 打款中 可以修改状态
  154. } else {
  155. if(WithdrawCashService::isEditWithdrawCashStatus($id)) {
  156. return $withdrawCash;
  157. }
  158. }
  159. $userName = "";
  160. if($userId) {
  161. $manage = ManageService::getById($userId);
  162. if(!empty($manage)) {
  163. $userName = $manage['nickname'];
  164. }
  165. }
  166. $statusStr = WithdrawCashService::getWithdrawCashStatusStr($statusIn);
  167. if(empty($statusStr)) {
  168. } else {
  169. if($statusStr) {
  170. $withdrawCash->status = $statusStr;
  171. }
  172. }
  173. if(WithdrawCashService::isWithdrawCashStatusCodeSuccess($statusIn)) {
  174. //成功提现
  175. $financialStat = FinancialStat::getByDistributionChannel($withdrawCash->distribution_channel_id);
  176. //修改累计提现金额
  177. $financialStat->accumulative_withdrawal_amount = (float)($financialStat->accumulative_withdrawal_amount) + (float)($withdrawCash->amount);
  178. //修改提现中金额
  179. $financialStat->withdraw_pending_amount = (float)($financialStat->withdraw_pending_amount) - (float)$withdrawCash->amount;
  180. $financialStat->save();
  181. //
  182. // $financePayMerchantBalanceInfo = FinancialPayMerchantBalance::getOne($withdrawCash->distribution_channel_id,$withdrawCash->pay_merchant_company_id);
  183. //\Log::info('financePayMerchantBalanceInfo:channel_id:'.$withdrawCash['distribution_channel_id'].'pay_merchant_company_id:'.$withdrawCash['pay_merchant_company_id'].json_encode($financePayMerchantBalanceInfo));
  184. //修改累计提现金额
  185. // $financePayMerchantBalanceInfo->accumulative_withdrawal_amount = (float)$financePayMerchantBalanceInfo->accumulative_withdrawal_amount + (float)($withdrawCash->amount);
  186. //修改提现中金额
  187. // $financePayMerchantBalanceInfo->withdraw_pending_amount = (float)$financePayMerchantBalanceInfo->withdraw_pending_amount - (float)($withdrawCash->amount);
  188. //$financialStat->save();
  189. }
  190. if($userId) {
  191. $withdrawCash->check_user_id = $userId;
  192. }
  193. if($userName) {
  194. $withdrawCash->check_user_name = $userName;
  195. }
  196. if($remark) {
  197. $withdrawCash->remark = $remark;
  198. }
  199. if($serialNumber) {
  200. if(strpos($withdrawCash->serial_number, $serialNumber) !== false) {
  201. //包含
  202. } else {
  203. $serialNumber = ($withdrawCash->serial_number).",".$serialNumber;
  204. }
  205. $withdrawCash->serial_number = $serialNumber;
  206. }
  207. $withdrawCash->save();
  208. }
  209. }
  210. //\DB::commit();
  211. print_r('commited');
  212. }catch (\Exception $exception){
  213. //DB::rollBack();
  214. \Log::error('pay_query_failed:'.($exception->getMessege()));
  215. //throw new \Exception($exception->getMessage(),$exception->getCode());
  216. print_r('pay_query_failed:'.($exception->getMessage()));
  217. }
  218. }
  219. }