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