Bill.php 7.3 KB

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