Bill.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <?php
  2. namespace App\Modules\Finance\Models;
  3. use Illuminate\Database\Eloquent\Model;
  4. use DB;
  5. /**
  6. * Class Bill 账单
  7. * @package App\Modules\Finance\Models
  8. */
  9. class Bill extends Model
  10. {
  11. protected $table = 'bills';
  12. //recharge_amount:充值金额
  13. protected $fillable = ['distribution_channel_id','distribution_channel_name', 'date','recharge_amount', 'tallage', 'settlement_price','rate'];
  14. /**
  15. * 根据渠道ID,时间,获取列表
  16. * @param $distribution_channel_id
  17. * @param $distribution_channel_name
  18. * @param string $start_date
  19. * @param string $end_date
  20. * @param bool $is_all
  21. * @return mixed
  22. */
  23. static function getListByDistributionChannel($distribution_channel_id, $distribution_channel_name, $start_date='',$end_date='', $is_all=false)
  24. {
  25. $search_object = self::orderBy('date','desc');
  26. if($distribution_channel_id) {
  27. $search_object->where('distribution_channel_id', $distribution_channel_id);
  28. }
  29. if($distribution_channel_name) {
  30. $search_object->where('distribution_channel_name', $distribution_channel_name);
  31. }
  32. if($start_date) $search_object->where('date','>=',$start_date);
  33. if($end_date) $search_object->where('date','<=',$end_date);
  34. if($is_all)
  35. {
  36. return $search_object->get();
  37. }else{
  38. return $search_object->paginate();
  39. }
  40. }
  41. /**
  42. * 获取结算列表
  43. * @param $params[]
  44. * channel_id:渠道ID 可选
  45. * channel_name:渠道名称 可选
  46. * search_name: 搜索名称
  47. * start_date:开始时间 可选
  48. * end_date:结束时间 可选
  49. * * @param bool $is_all
  50. * @return mixed
  51. */
  52. public static function getBillList($params = [], $is_all=false) {
  53. $search_object = self::orderBy('date','desc')
  54. ->where('recharge_amount', '>', 0);
  55. if(isset($params['channel_id']) && $params['channel_id']) $search_object->where('distribution_channel_id', $params['channel_id']);
  56. if(isset($params['channel_name']) && $params['channel_name']) $search_object->where('distribution_channel_name','like', "%".$params['channel_name']."%");
  57. if(isset($params['search_name']) && $params['search_name']) {
  58. $search_object->where(function ($query) use($params) {
  59. $query->where('distribution_channel_name','like', "%".$params['search_name']."%");
  60. });
  61. }
  62. if(isset($params['start_date']) && $params['start_date']) $search_object->where('date','>=', $params['start_date']);
  63. if(isset($params['end_date']) && $params['end_date']) $search_object->where('date','<=', $params['end_date']);
  64. if($is_all)
  65. {
  66. return $search_object->get();
  67. }else{
  68. return $search_object->paginate();
  69. }
  70. }
  71. /**
  72. * 获取当前渠道当前结算比例
  73. * @param $channelId
  74. * @return float
  75. */
  76. public static function getRate($channelId) {
  77. $rate = 0.0;
  78. $startMonth = date('Y-m-01', strtotime(date("Y-m-d")));
  79. $endMonth = date('Y-m-d', strtotime("$startMonth +1 month -1 day"));
  80. $rechargeAmountCount = Bill::where('distribution_channel_id',$channelId)
  81. ->where('date', '<=', $endMonth)
  82. ->where('date', '>=', $startMonth)
  83. ->sum('recharge_amount');
  84. $commissionRates = CommissionRate::where('distribution_channel_id', $channelId)
  85. ->orderBy('begin_amount', 'asc')
  86. ->get();
  87. foreach ($commissionRates as $commissionRate) {
  88. if($rechargeAmountCount >= $commissionRate['begin_amount']) {
  89. //结束金额存在,并且结算金额小于结束金额,结束
  90. if(!empty($commissionRate['end_amount']) && is_numeric($commissionRate['end_amount']) && $commissionRate['end_amount'] > 0 && $rechargeAmountCount < $commissionRate['end_amount']) {
  91. $rate = $commissionRate['rate'];
  92. break;
  93. }
  94. $rate = $commissionRate['rate'];
  95. }
  96. }
  97. return $rate;
  98. }
  99. /**
  100. * 创建结算单
  101. * @param $channelId
  102. * @param $channelName
  103. * @param $rechargeAmount
  104. */
  105. public static function makeBill($channelId, $channelName, $rechargeAmount) {
  106. $rate = Bill::getRate($channelId);
  107. $dataBill['distribution_channel_id'] = $channelId;
  108. $dataBill['distribution_channel_name'] = $channelName;
  109. $dataBill['date'] = date("Y-m-d", strtotime(date("Y-m-d")." -1 day"));
  110. $dataBill['recharge_amount'] = (float)$rechargeAmount;
  111. $dataBill['settlement_price'] = (float)$rechargeAmount * $rate;
  112. $dataBill['rate'] = $rate;
  113. // $dataBill['tallage'] = ((float)$rechargeAmount) - ((float)$rechargeAmount * $rate);
  114. //TODO 扣税金额为 0
  115. $dataBill['tallage'] = 0;
  116. DB::beginTransaction();
  117. try{
  118. Bill::create($dataBill);
  119. //更新创建提现信息
  120. $dataFinancialStatDB = FinancialStat::where('distribution_channel_id', $channelId)->first();
  121. if(empty($dataFinancialStatDB)) {
  122. $dataFinancialStat['distribution_channel_id'] = $channelId;
  123. $dataFinancialStat['accumulative_withdrawal_amount'] = 0;
  124. $dataFinancialStat['enable_withdrawal_amount'] = $dataBill['settlement_price'];
  125. $dataFinancialStat['latest_withdrawal_amount'] = 0;
  126. $dataFinancialStat['withdraw_pending_amount'] = 0;
  127. $dataFinancialStat['commission_rate'] = $rate;
  128. FinancialStat::create($dataFinancialStat);
  129. } else {
  130. $dataFinancialStatDB['enable_withdrawal_amount'] = (float)$dataFinancialStatDB['enable_withdrawal_amount'] + (float)$dataBill['settlement_price'];
  131. $dataFinancialStatDB['commission_rate'] = $rate;
  132. $dataFinancialStatDB->save();
  133. }
  134. DB::commit();
  135. }catch (\Exception $e) {
  136. DB::rollBack();
  137. }
  138. }
  139. public static function getOne($channelId,$date){
  140. return self::where('distribution_channel_id',$channelId)
  141. ->where('date',$date)
  142. ->first();
  143. }
  144. }