vd/app/Domains/Virtual/Services/StatService.php
2018-12-27 17:47:12 +08:00

90 lines
3.8 KiB
PHP

<?php
namespace App\Domains\Virtual\Services;
use App\Core\Service;
use App\Models\Virtual\Order;
use App\Models\Virtual\OrderCard;
use Illuminate\Support\Facades\DB;
use App\Domains\Virtual\Repositories\OrderRepository;
use App\Domains\Virtual\Repositories\CompanyRepository;
use App\Domains\Virtual\Repositories\OrderCardRepository;
use App\Domains\Virtual\Repositories\OrderRenewalCardRepository;
use App\Domains\Virtual\Repositories\OrderFlowPackageCardsRepository;
use App\Domains\Virtual\Repositories\OrderRenewalPackageCardRepository;
class StatService extends Service
{
protected $companyRepository;
protected $orderRepository;
protected $orderCardRepository;
protected $orderRenewalCardRepository;
protected $orderRenewalPackageCardRepository;
protected $orderFlowPackageCardsRepository;
/**
* 构造函数
*
* @return void
*/
public function __construct(
CompanyRepository $companyRepository,
OrderRepository $orderRepository,
OrderCardRepository $orderCardRepository,
OrderRenewalCardRepository $orderRenewalCardRepository,
OrderRenewalPackageCardRepository $orderRenewalPackageCardRepository,
OrderFlowPackageCardsRepository $orderFlowPackageCardsRepository
) {
$this->companyRepository = $companyRepository;
$this->orderRepository = $orderRepository;
$this->orderCardRepository = $orderCardRepository;
$this->orderRenewalCardRepository = $orderRenewalCardRepository;
$this->orderRenewalPackageCardRepository = $orderRenewalPackageCardRepository;
$this->orderFlowPackageCardsRepository = $orderFlowPackageCardsRepository;
}
/**
* 企业统计
*
* @return void
*/
public function companyIndex(array $conditions = [])
{
$companies = $this->companyRepository->withConditions(array_only($conditions, ['name']))
->select(['id', 'name'])->applyConditions()->withTrashed()->paginate($conditions['limit']);
if (empty($companies)) {
return $companies;
}
$groupBy = 'company_id';
$select = [$groupBy, DB::raw('count(*) as counts')];
$model = OrderCard::select($select)->whereIn('company_id', $companies->pluck('id')->toArray())->groupBy($groupBy);
$total = $this->orderCardRepository->setModel(clone $model)->get()->pluck('counts', 'company_id')->toArray();
$conditions = array_only($conditions, ['starttime', 'endtime']);
$counts = $this->orderCardRepository->setModel(clone $model)->withConditions($conditions)->get()->pluck('counts', 'company_id')->toArray();
$orderRenewalCard = $this->orderRenewalCardRepository->select($select)->whereIn('company_id', $companies->pluck('id')->toArray())->groupBy($groupBy)->get()->pluck('counts', 'company_id')->toArray();
$orderRenewalPackage = $this->orderRenewalPackageCardRepository->select($select)->whereIn('company_id', $companies->pluck('id')->toArray())->groupBy($groupBy)->get()->pluck('counts', 'company_id')->toArray();
$renewed_counts = array_merge_sum($orderRenewalCard, $orderRenewalPackage);
$valid_counts = $this->orderCardRepository->setModel(clone $model)->whereHas('card', function ($query) {
return $query->whereNotNull('virtual_activated_at')->whereNull('cancelled_at');
})->withConditions($conditions)->get()->pluck('counts', 'company_id')->toArray();
$companies->map(function ($item) use ($total, $counts, $renewed_counts, $valid_counts) {
$item->total = $total[$item['id']] ?? 0;
$item->counts = $counts[$item['id']] ?? 0;
$item->renewed_counts = $renewed_counts[$item['id']] ?? 0;
$item->valid_counts = $valid_counts[$item['id']] ?? 0;
});
return $companies;
}
}