| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 | <?php/** * * @file:PromotionDayUser.php * @Date: 2023/6/25 * @Time: 16:58 */namespace Modules\Common\Services\Statistic;use Illuminate\Support\Facades\DB;use Modules\Common\Models\TjCompanyDayNewUser;use Modules\Common\Models\TjOptimizerDayNewUser;use Modules\Common\Services\BaseService;class CompanyDayUser extends BaseService{    protected static $miniPrograms; // 小程序    protected static $newUserStatisc; // 新增用户    protected static $orderStatisc; // 充值统计    protected static $orderVipStatisc; // 充值会员统计    protected static $orderCoinStatisc; // 充值会员统计    /**     * 优化师用户统计     * name:companyDayUserStatistic     * @param $date     * date 2023/06/25 17:01     */    public static function companyDayUserStatistic($date)    {        self::getMiniProgram(); // 获取小程序        self::getStatisticOrders($date); // 进行订单统计        self::getStatisticNewUser($date);        //  从优化师维度出发统计        DB::table('users', 'u')            ->leftJoin('user_has_roles as  ur', 'ur.user_id', '=', 'u.id')            ->leftJoin('roles as r', 'r.id', '=', 'ur.role_id')            ->where('r.identify', 'company')            ->select("u.id as  user_id")->orderBy('u.id')            ->chunk(10, function ($items) use ($date) {                foreach ($items as $v) {                    self::getcompanyDayData($v->user_id, $date);                }            });    }    /**     *  优化师统计     * name: getcompanyDayData     * @param $accountId 账号id     * @param  $date 日期     * @return array|int[]     * date 2023/06/26 17:24     */    private static function getcompanyDayData($accountId, $date)    {        $userHasMin = DB::table('user_has_miniprograms')->where('uid', $accountId)->get();        $userHasMin = $userHasMin->pluck('miniprogram_id')->unique()->toArray();        if ($userHasMin) {            foreach ($userHasMin as $value) {                $userData = self::$newUserStatisc->where('user_id', $accountId)->where('miniprogram_id', $value)->first();                $order = self::$orderStatisc->where('user_id', $accountId)->where('miniprogram_id', $value)->first();                $vip = self::$orderVipStatisc->where('user_id', $accountId)->where('miniprogram_id', $value)->first();                $coin = self::$orderCoinStatisc->where('user_id', $accountId)->where('miniprogram_id', $value)->first();                $min = self::$miniPrograms->where('id', $value)->first();                $data = [                    'user_id' => $accountId,                    'miniprogram_id' => $value,                    'date' => $date,                    'new_user_num' => getProp($userData, 'new_user_num', 0),                    'new_user_recharge_num' => getProp($order, 'new_user_recharge_num', 0),                    'new_user_recharge_total' => getProp($order, 'new_user_recharge_total', 0),                    'new_user_recharge_vip_num' => getProp($vip, 'new_user_recharge_vip_num', 0),                    'new_user_recharge_coin_num' => getProp($coin, 'new_user_recharge_coin_num', 0),                    'miniprogram_name' => getProp($min, 'name', ''),                    'miniprogram_play_name' => getProp($min, 'play_name', ''),                    'miniprogram_type' => getProp($min, 'type', ''),                ];                $last = TjCompanyDayNewUser::where('user_id', $accountId)->where('miniprogram_id',$value)->where('date', "<", $date)->orderBy('date', "desc")->first();                if (!is_empty($last)) {                    $data['recharge_user_total'] = $last->recharge_user_total + $data['new_user_recharge_num'];                    $data['recharge_amount_total'] = $last->recharge_amount_total + $data['new_user_recharge_total'];                } else {                    $data['recharge_user_total'] = $data['new_user_recharge_num'];                    $data['recharge_amount_total'] = $data['new_user_recharge_total'];                }                TjCompanyDayNewUser::updateOrCreate(['user_id' => $data['user_id'], 'date' => $data['date'],'miniprogram_id' => $data['miniprogram_id']], $data);            }        }    }    /**     *   获取系统所有小程序     * name: getMiniProgram     * date 2023/06/26 17:21     */    private static function getMiniProgram()    {        self::$miniPrograms = DB::table('miniprogram')->get();    }    /**     *  统计当日订单     * name: getStatisticOrders     * @param $date     * date 2023/06/26 17:21     */    private static function getStatisticOrders($date)    {        $start = $date . " 00:00:00";        $end = $date . " 23:59:59";        self::$orderStatisc = DB::table('orders')->where('status', "<>", 'UNPAID')            ->whereBetween("created_at", [$start, $end])            ->whereBetween('ranse_created_at', [$start, $end])            ->select(                'puser_id as user_id',                "miniprogram_id",                DB::raw("sum(if(status = 'unpaid', 0, price)) as  new_user_recharge_total"), // 单日新增用户充值金额                DB::raw("count(DISTINCT ranse_created_at,uid) as new_user_recharge_num")  // 当日新增用户充值人数            )->groupBy('puser_id', 'miniprogram_id')->get();        self::$orderVipStatisc = DB::table('orders')->where('status', "<>", 'UNPAID')            ->whereBetween("created_at", [$start, $end])            ->whereBetween('ranse_created_at', [$start, $end])->whereNotIn("order_type",  ["COIN", "FIRST_COIN"])            ->select(                'puser_id as user_id',                "miniprogram_id",                DB::raw("COUNT(DISTINCT ranse_end_at,uid) as new_user_recharge_vip_num") // 会员充值人数            )->groupBy('puser_id', 'miniprogram_id')->get();        self::$orderCoinStatisc = DB::table('orders')->where('status', "<>", 'UNPAID')            ->whereBetween("created_at", [$start, $end])            ->whereBetween('ranse_created_at', [$start, $end])->whereIn("order_type",  ["COIN", "FIRST_COIN"])            ->select(                'puser_id as user_id',                "miniprogram_id",                DB::raw("COUNT(DISTINCT ranse_end_at,uid) as new_user_recharge_coin_num") // 会员充值人数            )->groupBy('puser_id', 'miniprogram_id')->get();    }    /**     *  当日新用户统计     * name: getStatisticNewUser     * @param $date     * date 2023/06/26 17:21     */    private static function getStatisticNewUser($date)    {        self::$newUserStatisc = DB::table('user_ranse_record_all')->where('date', "=", $date)            ->select(                 'puser_id as user_id', 'miniprogram_id', 'miniprogram_type', 'date',                DB::raw('count(user_id) as new_user_num')            )->orderBy('puser_id')            ->groupBy('puser_id', 'miniprogram_id')->get();    }}
 |