| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 | <?phpnamespace Modules\Statistic\Http\Controllers;use Catch\Base\CatchController;use Illuminate\Foundation\Validation\ValidatesRequests;use Illuminate\Http\Request;use Illuminate\Support\Facades\DB;use Modules\User\Http\Controllers\UserTrait;class ChargeTJController extends CatchController{    use ValidatesRequests;    use UserTrait;    private function _sql(Request $request) {        $this->validate($request, [            'start_at' => 'nullable|date_format:Y-m-d',            'end_at' => 'nullable|date_format:Y-m-d|after_or_equal:start_at',            'user_id' => 'nullable|integer|min:1',            'miniprogram_id' => 'nullable|integer|min:1'        ]);        $startAt = $request->input('start_at');        $endAt = $request->input('end_at');        $userId = $request->input('user_id');        $miniprogramId = $request->input('miniprogram_id');        $roles = $this->listUserRoles();        if($roles->contains('company')) {            $puserId = $this->getLoginUserId();        } else {            $puserId = null;            $userId = $this->getLoginUserId();        }        return  DB::table('tj_optimizer_day_charge')            ->when($startAt, function ($query, $startAt){                return $query->where('day_at', '>=', $startAt);            })->when($endAt, function ($query, $endAt){                return $query->where('day_at', '<=', $endAt);            })->when($userId, function ($query, $userId){                return $query->where('user_id', $userId);            })->when($miniprogramId, function ($query, $miniprogramId) {                return $query->where('miniprogram_id', $miniprogramId);            })->when($puserId, function ($query, $puserId){                return $query->where('puser_id', $puserId);            })->orderBy('id', 'desc');    }    // 充值明细    public function list(Request $request) {        $sql = $this->_sql($request);        $isExport = $request->input('is_export', false);        if($isExport) {            $result =  $sql->get();        } else {            $result =  $sql->paginate($request->input('limit', 15));        }        $users = DB::table('users')            ->whereIn('id', $result->pluck('user_id'))            ->select('id', 'username')            ->get()->keyBy('id');        $miniprograms = DB::table('miniprogram')            ->whereIn('id', $result->pluck('miniprogram_id'))            ->select('id','name')            ->get()->keyBy('id');        foreach ($result as $item) {            $item->common_pay_money_per = $item->common_pay_uv ? bcdiv($item->common_pay_money, $item->common_pay_uv ,2 ) : 0;            $item->vip_pay_money_per = $item->vip_pay_uv ? bcdiv($item->vip_pay_money, $item->vip_pay_uv ,2 ) : 0;            $item->common_pay_rate = $item->common_pay_count ? bcdiv($item->common_pay_count,100 * ($item->common_pay_count + $item->common_unpay_count) ,2 ) . '%' : 0 .'%';            $item->vip_pay_rate = $item->vip_pay_count ? bcdiv($item->vip_pay_count ,100 * ($item->vip_pay_count + $item->vip_unpay_count), 2 ) . '%' : 0 .'%';            $item->username = $users->get($item->user_id)->username ?? '';            $item->miniprogram_name = $miniprograms->get($item->miniprogram_id)->name ?? '';        }        return $result;    }    // 充值明细中的累计    public function listTotalCharge(Request $request) {        $sql = $this->_sql($request);        $info =  $sql->select(            DB::raw("sum(pay_money) as sum_pay_money"),            DB::raw("sum(pay_count) as sum_pay_count"),        )->first();        if($info) {            return [                'sum_pay_money' => $info->sum_pay_money,                'sum_pay_count' => $info->sum_pay_count,            ];        } else {            return [                'sum_pay_money' => 0,                'sum_pay_count' => 0,            ];        }    }    // 今日充值    public function todayCharge(Request $request) {        $date = date('Y-m-d');        $userId = $this->getLoginUserId();        if($this->listUserRoles()->contains('company')) {            $info = DB::table('orders')                ->whereBetween('created_at', [$date, $date. ' 23:59:59'])                ->where('puser_id', $userId)                ->select(                    DB::raw("sum(if(status = 'unpaid', 0, price)) as pay_money"),                    DB::raw("sum(if(status <> 'unpaid' and order_type in ('coin', 'first_coin'), 1, 0)) as common_pay_count"),                    DB::raw("sum(if(status = 'unpaid' and order_type in ('coin', 'first_coin'), 1, 0)) as common_unpay_count"),                    DB::raw("sum(if(status <> 'unpaid' and order_type not in ('coin', 'first_coin'), 1, 0)) as vip_pay_count"),                    DB::raw("sum(if(status = 'unpaid' and order_type not in ('coin', 'first_coin'), 1, 0)) as vip_unpay_count"),                )->first();        } else {            $info = DB::table('orders')                ->whereBetween('created_at', [$date, $date. ' 23:59:59'])                ->where('user_id', $userId)                ->where('miniprogram_id', $request->input('miniprogram_id'))                ->select(                    DB::raw("sum(if(status = 'unpaid', 0, price)) as pay_money"),                    DB::raw("sum(if(status <> 'unpaid' and order_type in ('coin', 'first_coin'), 1, 0)) as common_pay_count"),                    DB::raw("sum(if(status = 'unpaid' and order_type in ('coin', 'first_coin'), 1, 0)) as common_unpay_count"),                    DB::raw("sum(if(status <> 'unpaid' and order_type not in ('coin', 'first_coin'), 1, 0)) as vip_pay_count"),                    DB::raw("sum(if(status = 'unpaid' and order_type not in ('coin', 'first_coin'), 1, 0)) as vip_unpay_count"),                )->first();        }        if($info) {            $info->company_pay_rate = $info->common_pay_count ? bcdiv($info->common_pay_count,($info->common_pay_count + $info->common_unpay_count) * 100,  2) . '%' : '0%';            $info->vip_pay_rate = $info->vip_pay_count ? bcdiv($info->vip_pay_count, ($info->vip_pay_count + $info->vip_unpay_count) * 100, 2) . '%' : '0%';        }        return $info;    }    // 本月充值    public function currentMonthCharge(Request $request) {        $userId = $this->getLoginUserId();        if($this->listUserRoles()->contains('company')) {            $info = DB::table('tj_company_day_charge')                ->whereBetween('day_at', [date('Y-m-01'), date('Y-m-d', strtotime('yesterday'))])                ->where('company_uid', $userId)                ->select(                    DB::raw("sum(pay_money) as pay_money"),                    DB::raw("sum(common_pay_count) as common_pay_count"),                    DB::raw("sum(common_unpay_count) as common_unpay_count"),                    DB::raw("sum(vip_unpay_count) as vip_unpay_count"),                    DB::raw("sum(vip_pay_count) as vip_pay_count"),                )->first();        } else {            $info = DB::table('tj_optimizer_day_charge')                ->whereBetween('day_at', [date('Y-m-01'), date('Y-m-d', strtotime('yesterday'))])                ->where('user_id', $userId)                ->where('miniprogram_id', $request->input('miniprogram_id'))                ->select(                    DB::raw("sum(pay_money) as pay_money"),                    DB::raw("sum(common_pay_count) as common_pay_count"),                    DB::raw("sum(common_unpay_count) as common_unpay_count"),                    DB::raw("sum(vip_unpay_count) as vip_unpay_count"),                    DB::raw("sum(vip_pay_count) as vip_pay_count"),                )->first();        }        if($info) {            $info->company_pay_rate = $info->common_pay_count ? bcdiv($info->common_pay_count,($info->common_pay_count + $info->common_unpay_count) * 100,  2) . '%' : '0%';            $info->vip_pay_rate = $info->vip_pay_count ? bcdiv($info->vip_pay_count, ($info->vip_pay_count + $info->vip_unpay_count) * 100, 2) . '%' : '0%';        }        return $info;    }    // 上月充值    public function lastMonthCharge(Request $request) {        $userId = $this->getLoginUserId();        if($this->listUserRoles()->contains('company')) {            $info = DB::table('tj_company_month_charge')                ->where('month_at', date('Y-m-d', strtotime(date('Y-m-01')) - 10))                ->where('company_uid', $userId)                ->select(                    DB::raw("sum(pay_money) as pay_money"),                    DB::raw("sum(common_pay_count) as common_pay_count"),                    DB::raw("sum(common_unpay_count) as common_unpay_count"),                    DB::raw("sum(vip_unpay_count) as vip_unpay_count"),                    DB::raw("sum(vip_pay_count) as vip_pay_count"),                )->first();        } else {            $info = DB::table('tj_optimizer_month_charge')                ->where('month_at', date('Y-m-d', strtotime(date('Y-m-01')) - 10))                ->where('user_id', $userId)                ->where('miniprogram_id', $request->input('miniprogram_id'))                ->select(                    DB::raw("sum(pay_money) as pay_money"),                    DB::raw("sum(common_pay_count) as common_pay_count"),                    DB::raw("sum(common_unpay_count) as common_unpay_count"),                    DB::raw("sum(vip_unpay_count) as vip_unpay_count"),                    DB::raw("sum(vip_pay_count) as vip_pay_count"),                )->first();        }        if($info) {            $info->company_pay_rate = $info->common_pay_count ? bcdiv($info->common_pay_count,($info->common_pay_count + $info->common_unpay_count) * 100,  2) . '%' : '0%';            $info->vip_pay_rate = $info->vip_pay_count ? bcdiv($info->vip_pay_count,($info->vip_pay_count + $info->vip_unpay_count) * 100,  2) . '%' : '0%';        }        return $info;    }    // 累计充值    public function totalCharge(Request $request) {        $userId = $this->getLoginUserId();        if($this->listUserRoles()->contains('company')) {            $info = DB::table('tj_company_month_charge')                ->where('month_at','<=', date('Y-m-d', strtotime(date('Y-m-01')) - 10))                ->where('company_uid', $userId)                ->select(                    DB::raw("sum(pay_money) as pay_money"),                    DB::raw("sum(common_pay_count) as common_pay_count"),                    DB::raw("sum(common_unpay_count) as common_unpay_count"),                    DB::raw("sum(vip_unpay_count) as vip_unpay_count"),                    DB::raw("sum(vip_pay_count) as vip_pay_count"),                )->first();        } else {            $info = DB::table('tj_optimizer_month_charge')                ->where('month_at', '<=',date('Y-m-d', strtotime(date('Y-m-01')) - 10))                ->where('user_id', $userId)                ->where('miniprogram_id', $request->input('miniprogram_id'))                ->select(                    DB::raw("sum(pay_money) as pay_money"),                    DB::raw("sum(common_pay_count) as common_pay_count"),                    DB::raw("sum(common_unpay_count) as common_unpay_count"),                    DB::raw("sum(vip_unpay_count) as vip_unpay_count"),                    DB::raw("sum(vip_pay_count) as vip_pay_count"),                )->first();        }        $currentMonthInfo = $this->currentMonthCharge($request);        $result = (object)[            'pay_money' => $info->pay_money ?? 0 + $currentMonthInfo->pay_money ?? 0,            'common_pay_count' => $info->common_pay_count ?? 0 + $currentMonthInfo->common_pay_count ?? 0,            'common_unpay_count' => $info->common_unpay_count ?? 0 + $currentMonthInfo->common_unpay_count ?? 0,            'vip_unpay_count' => $info->vip_unpay_count ?? 0 + $currentMonthInfo->vip_unpay_count ?? 0,            'vip_pay_count' => $info->vip_pay_count ?? 0 + $currentMonthInfo->vip_pay_count ?? 0,        ];        $result->company_pay_rate = $result->common_pay_count ? bcdiv($result->common_pay_count,($result->common_pay_count + $result->common_unpay_count) * 100,  2) . '%' : '0%';        $result->vip_pay_rate = $result->vip_pay_count ? bcdiv($result->vip_pay_count,($result->vip_pay_count + $result->vip_unpay_count) * 100,  2) . '%' : '0%';        return $result;    }}
 |