123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- <?php
- namespace App\Modules\Finance\Models;
- use App\Consts\BillConst;
- use Illuminate\Database\Eloquent\Model;
- use DB;
- use App\Modules\Channel\Services\ChannelService;
- /**
- * Class Bill 账单
- * @package App\Modules\Finance\Models
- */
- class Bill extends Model
- {
- protected $table = 'bills';
- //recharge_amount:充值金额
- protected $fillable = ['distribution_channel_id', 'distribution_channel_name', 'date', 'recharge_amount', 'tallage',
- 'settlement_price', 'rate', 'service_amount'];
- /**
- * 根据渠道ID,时间,获取列表
- * @param $distribution_channel_id
- * @param $distribution_channel_name
- * @param string $start_date
- * @param string $end_date
- * @param bool $is_all
- * @return mixed
- */
- static function getListByDistributionChannel($distribution_channel_id, $distribution_channel_name, $start_date = '', $end_date = '', $is_all = false)
- {
- $search_object = self::orderBy('date', 'desc');
- if ($distribution_channel_id) {
- $search_object->where('distribution_channel_id', $distribution_channel_id);
- }
- if ($distribution_channel_name) {
- $search_object->where('distribution_channel_name', $distribution_channel_name);
- }
- if ($start_date) $search_object->where('date', '>=', $start_date);
- if ($end_date) $search_object->where('date', '<=', $end_date);
- if ($is_all) {
- return $search_object->get();
- } else {
- return $search_object->paginate();
- }
- }
- /**
- * 获取结算列表
- * @param $params []
- * channel_id:渠道ID 可选
- * channel_name:渠道名称 可选
- * search_name: 搜索名称
- * start_date:开始时间 可选
- * end_date:结束时间 可选
- * * @param bool $is_all
- * @return mixed
- */
- public static function getBillList($params = [], $is_all = false)
- {
- $search_object = self::orderBy('date', 'desc')
- ->where('recharge_amount', '>', 0);
- if (isset($params['channel_id']) && $params['channel_id']) $search_object->where('distribution_channel_id', $params['channel_id']);
- if (isset($params['channel_name']) && $params['channel_name']) $search_object->where('distribution_channel_name', 'like', "%" . $params['channel_name'] . "%");
- if (isset($params['search_name']) && $params['search_name']) {
- $search_object->where(function ($query) use ($params) {
- $query->where('distribution_channel_name', 'like', "%" . $params['search_name'] . "%");
- });
- }
- if (isset($params['start_date']) && $params['start_date']) $search_object->where('date', '>=', $params['start_date']);
- if (isset($params['end_date']) && $params['end_date']) $search_object->where('date', '<=', $params['end_date']);
- if ($is_all) {
- return $search_object->get();
- } else {
- return $search_object->paginate();
- }
- }
- /**
- * 获取当前渠道当前结算比例
- * @param $channelId
- * @return float
- */
- public static function getRate($channelId)
- {
- $current_date = date('Y-m-d');
- $now = time();
- try {
- \Log::info('bill:common:rate:' . $channelId);
- } catch (\Exception $e) {
- }
- $rate = 0.0;
- $startMonth = date('Y-m-01', strtotime(date("Y-m-d")));
- $endMonth = date('Y-m-d', strtotime("$startMonth +1 month -1 day"));
- $rechargeAmountCount = Bill::where('distribution_channel_id', $channelId)
- ->where('date', '<=', $endMonth)
- ->where('date', '>=', $startMonth)
- ->sum('recharge_amount');
- $commissionRates = CommissionRate::where('distribution_channel_id', $channelId)
- ->orderBy('begin_amount', 'asc')
- ->get();
- foreach ($commissionRates as $commissionRate) {
- if ($rechargeAmountCount >= $commissionRate['begin_amount']) {
- //结束金额存在,并且结算金额小于结束金额,结束
- if (!empty($commissionRate['end_amount']) && is_numeric($commissionRate['end_amount']) && $commissionRate['end_amount'] > 0 && $rechargeAmountCount < $commissionRate['end_amount']) {
- $rate = $commissionRate['rate'];
- break;
- }
- $rate = $commissionRate['rate'];
- }
- }
- return $rate;
- }
- /**
- * 创建结算单
- * @param $channelId
- * @param $channelName
- * @param $rechargeAmount
- */
- public static function makeBill($channelId, $channelName, $rechargeAmount)
- {
- // 服务费
- $rechargeAmount = (float)$rechargeAmount;
- $serviceAmount = 0;
- if (time() >= strtotime(BillConst::SERVICE_START)) {
- $serviceAmount = (float)$rechargeAmount * BillConst::SERVICE_RATE;
- $serviceAmount = getFloorNum($serviceAmount,2);
- }
- $rate = Bill::getRate($channelId);
- $dataBill['distribution_channel_id'] = $channelId;
- $dataBill['distribution_channel_name'] = $channelName;
- $dataBill['date'] = date("Y-m-d", strtotime(date("Y-m-d") . " -1 day"));
- $dataBill['recharge_amount'] = $rechargeAmount;
- $dataBill['service_amount'] = $serviceAmount;
- $dataBill['settlement_price'] = ($rechargeAmount - $serviceAmount) * $rate;
-
- // 保留2位截断小数
- $dataBill['settlement_price'] = getFloorNum($dataBill['settlement_price'],2);
-
- $dataBill['rate'] = $rate;
- // $dataBill['tallage'] = ((float)$rechargeAmount) - ((float)$rechargeAmount * $rate);
- //TODO 扣税金额为 0
- $dataBill['tallage'] = 0;
- DB::beginTransaction();
- try {
- Bill::create($dataBill);
- //更新创建提现信息
- $dataFinancialStatDB = FinancialStat::where('distribution_channel_id', $channelId)->first();
- if (empty($dataFinancialStatDB)) {
- $dataFinancialStat['distribution_channel_id'] = $channelId;
- $dataFinancialStat['accumulative_withdrawal_amount'] = 0;
- $dataFinancialStat['enable_withdrawal_amount'] = $dataBill['settlement_price'];
- $dataFinancialStat['latest_withdrawal_amount'] = 0;
- $dataFinancialStat['withdraw_pending_amount'] = 0;
- $dataFinancialStat['commission_rate'] = $rate;
- FinancialStat::create($dataFinancialStat);
- } else {
- $dataFinancialStatDB['enable_withdrawal_amount'] = (float)$dataFinancialStatDB['enable_withdrawal_amount'] + (float)$dataBill['settlement_price'];
- $dataFinancialStatDB['commission_rate'] = $rate;
- $dataFinancialStatDB->save();
- }
- DB::commit();
- } catch (\Exception $e) {
- DB::rollBack();
- }
- }
- public static function getOne($channelId, $date)
- {
- return self::where('distribution_channel_id', $channelId)
- ->where('date', $date)
- ->first();
- }
- }
-
|