repository = $repository; $this->areaCode = $this->request->param('areaCode', ''); $this->streetCode = $this->request->param('streetCode', ''); if ($this->areaCode == '' && $this->streetCode == '') { throw new ValidateException('请选择地区'); } } public function userMerchantCount() { // 近5日 平台用户量统计 $userCountlist = []; $merchatCountList = []; // 4天前 $startBeforeDay5 = strtotime(date('Y-m-d', strtotime('-4 days'))); $endBeforeDay5 = $startBeforeDay5+ 86399; $userCountlist[] = $this->getTimeRangeUserCount([$startBeforeDay5, $endBeforeDay5]); // 3天前 $startBeforeDay4 = strtotime(date('Y-m-d', strtotime('-3 days'))); $endBeforeDay4 = $startBeforeDay4 + 86399; $userCountlist[] = $this->getTimeRangeUserCount([$startBeforeDay4, $endBeforeDay4]); // 2天前 $startBeforeDay3 = strtotime(date('Y-m-d', strtotime('-2 days'))); $endBeforeDay3 = $startBeforeDay3 + 86399; $userCountlist[] = $this->getTimeRangeUserCount([$startBeforeDay3, $endBeforeDay3]); // 1天前 $startBeforeDay2= strtotime(date('Y-m-d', strtotime('-1 days'))); $endBeforeDay2 = $startBeforeDay2+ 86399; $userCountlist[] = $this->getTimeRangeUserCount([$startBeforeDay2, $endBeforeDay2]); // 今天 $startCurrDay1 = strtotime(date('Y-m-d', time())); $endCurrDay1 = $startCurrDay1+ 86399; $userCountlist[] = $this->getTimeRangeUserCount([$startCurrDay1, $endCurrDay1]); // 地方店铺数量统计 // 遍历统计每个乡镇的店铺数 $merchantTotalCount = 0; // 查镇的用户统计不需要查店铺数 if ($this->streetCode == '') { // 该地区下所有乡镇 $geoStreetList = Db::name('geo_street')->where('area_code',$this->areaCode)->select()->toArray(); foreach ($geoStreetList as $street) { $temp['street_name'] = $street['street_name']; $temp['merchant_count'] = Db::name('merchant')->where('street_id', $street['street_code'])->count(); $merchantTotalCount += $temp['merchant_count']; $merchatCountList[] = $temp; unset($temp); } } return app('json')->success(compact('merchantTotalCount' ,'userCountlist', 'merchatCountList')); } public function getTimeRangeUserCount($timeRange=[]) { // 新增 $newUserCount = Db::name('user')->alias('u') ->join('user_address ua', 'u.uid = ua.uid') ->where(function ($query){ if ($this->streetCode != '') { $query->where('ua.street', $this->streetCode); } else { $query->where('ua.district', $this->areaCode); } }) ->whereTime('u.create_time', 'between', $timeRange) ->count(); // 访问 $viewUserCount = Db::name('user')->alias('u') ->join('user_address ua', 'u.uid = ua.uid') ->where(function ($query){ if ($this->streetCode != '') { $query->where('ua.street', $this->streetCode); } else { $query->where('ua.district', $this->areaCode); } }) ->whereTime('u.last_time', 'between', $timeRange) ->count(); // 累计 $totalUserCount = Db::name('user')->alias('u') ->join('user_address ua', 'u.uid = ua.uid') ->where(function ($query){ if ($this->streetCode != '') { $query->where('ua.street', $this->streetCode); } else { $query->where('ua.district', $this->areaCode); } }) ->whereTime('u.create_time', '<', $timeRange[1]) ->count(); return compact('newUserCount', 'viewUserCount', 'totalUserCount'); } public function userTradeCount(StoreOrderRepository $orderRepository, UserVisitRepository $userVisitRepository) { $monthDateRow = []; // 获取当前月份的第一天 $firstDay = date('Y-m-01', time()); $i = 0; $lastDay = date('Y-m-d', strtotime("$firstDay +1 month -1 day")); while (date('Y-m-d', strtotime("$firstDay +$i days")) <= $lastDay) { $monthDateRow[] = date('Y-m-d', strtotime("$firstDay +$i days")); $i++; } $this->merId = null; $userTradeCountList = Cache::store('file')->remember(self::class . '@userTradeCount' . $this->streetCode, function () use ($orderRepository, $userVisitRepository, $monthDateRow) { $list = []; foreach ($monthDateRow as $date) { $visitUser = $this->dateVisitUserNum($date); $orderUser = $this->orderUserNum($date, null); // $orderPrice = $this->orderPrice($date, null); $payOrderUser = $this->orderUserNum($date, 1); $payOrderPrice = $this->orderPrice($date, 1); // $userRate = $payOrderUser ? bcdiv($payOrderPrice, $payOrderUser, 2) : 0; // $orderRate = $visitUser ? bcdiv($orderUser, $visitUser, 2) : 0; // $payOrderRate = $orderUser ? bcdiv($payOrderUser, $orderUser, 2) : 0; $list[] = compact('date','visitUser', 'orderUser', 'payOrderUser'); } return $list; }, 2000 + random_int(600, 1200)); // 县 $area = Db::name('geo_area')->field('area_code, area_name')->where('area_code', $this->areaCode)->find(); // 镇/街道 $streetList = Db::name('geo_street')->field('street_code, street_name')->where('area_code', $this->areaCode)->select(); return app('json')->success(compact('userTradeCountList', 'area', 'streetList')); } protected function dateVisitUserNum($date) { return UserVisit::getDB()->alias('A')->join('StoreProduct B', 'A.type_id = B.product_id')->join('merchant m', 'B.mer_id=m.mer_id')->when($date, function ($query, $date) { getModelTime($query, $date, 'A.create_time'); })->where( function ($query) { if ($this->streetCode != '') { $query->where('m.street_id', $this->streetCode); } else { $query->where('m.area_id', $this->areaCode); } })->where('A.type', 'product')->group(' A.uid')->count(); } public function orderUserNum($date, $paid = null) { return StoreOrder::getDB()->alias('o')->join('merchant m', 'o.mer_id=m.mer_id')->when($paid, function ($query, $paid) { $query->where('paid', $paid); })->where( function ($query) { if ($this->streetCode != '') { $query->where('m.street_id', $this->streetCode); } else { $query->where('m.area_id', $this->areaCode); } })->when($date, function ($query, $date) use ($paid) { if (!$paid) { getModelTime($query, $date, 'o.create_time'); } else getModelTime($query, $date, 'pay_time'); })->group('o.uid')->count(); } public function orderPrice($date, $paid = null) { return StoreOrder::getDB()->alias('o')->join('merchant m', 'o.mer_id=m.mer_id')->when($paid, function ($query, $paid) { $query->where('o.paid', $paid); })->where( function ($query) { if ($this->streetCode != '') { $query->where('m.street_id', $this->streetCode); } else { $query->where('m.area_id', $this->areaCode); } })->when($date, function ($query, $date) use ($paid) { if (!$paid) { $query->where(function ($query) use ($date) { $query->where(function ($query) use ($date) { $query->where('o.paid', 1); getModelTime($query, $date, 'pay_time'); })->whereOr(function ($query) use ($date) { $query->where('o.paid', 0); getModelTime($query, $date, 'o.create_time'); }); }); } else getModelTime($query, $date, 'pay_time'); })->sum('o.pay_price'); } }