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(); } }