127 lines
4.4 KiB
PHP
127 lines
4.4 KiB
PHP
<?php
|
|
namespace App\Domains\Stats\Services;
|
|
|
|
use App\Dicts;
|
|
use App\Core\Service;
|
|
use Illuminate\Support\Facades\DB;
|
|
use App\Exceptions\NotAllowedException;
|
|
use App\Domains\Virtual\Services\CommonService;
|
|
use App\Domains\Virtual\Repositories\OrderRepository;
|
|
use App\Domains\Virtual\Repositories\CompanyRepository;
|
|
use App\Domains\Virtual\Repositories\PackageRepository;
|
|
|
|
class OrderService extends Service
|
|
{
|
|
protected $companyRepository;
|
|
protected $packageRepository;
|
|
protected $orderRepository;
|
|
|
|
public static $classes = [
|
|
\App\Domains\Virtual\Repositories\OrderCardRepository::class,
|
|
\App\Domains\Virtual\Repositories\OrderRenewalCardRepository::class,
|
|
\App\Domains\Virtual\Repositories\OrderRenewalPackageCardRepository::class,
|
|
\App\Domains\Virtual\Repositories\OrderFlowPackageCardsRepository::class,
|
|
];
|
|
|
|
/**
|
|
* 构造函数
|
|
*
|
|
* @return void
|
|
*/
|
|
public function __construct(
|
|
CompanyRepository $companyRepository,
|
|
PackageRepository $packageRepository,
|
|
OrderRepository $orderRepository
|
|
) {
|
|
$this->companyRepository = $companyRepository;
|
|
$this->packageRepository = $packageRepository;
|
|
$this->orderRepository = $orderRepository;
|
|
}
|
|
|
|
|
|
/**
|
|
* 统计
|
|
*
|
|
* @return void
|
|
*/
|
|
public function index(array $conditions = [])
|
|
{
|
|
$conditions['source'] = 1;
|
|
|
|
$companies = $this->companyRepository->withTrashed()->get()->pluck('name', 'id')->toArray();
|
|
$packages = $this->packageRepository->withTrashed()->get()->pluck('name', 'id')->toArray();
|
|
|
|
$select = [
|
|
DB::raw("array_to_string(array_agg(id), ',') as order_id"),
|
|
'company_id',
|
|
'package_id',
|
|
'product_id',
|
|
'unit_price',
|
|
'pay_channel',
|
|
DB::raw('SUM(counts) as counts'),
|
|
DB::raw('SUM(custom_price) as custom_price'),
|
|
];
|
|
|
|
$orders = $this->orderRepository->select($select)->withConditions($conditions)->applyConditions()
|
|
->groupBy(['company_id', 'package_id', 'product_id', 'unit_price', 'pay_channel'])->paginate($conditions['limit']);
|
|
|
|
$orders->map(function ($item) use ($companies, $packages) {
|
|
$item->unit_price = sprintf('%.02f', $item->unit_price/100);
|
|
$item->custom_price = sprintf('%.02f', $item->custom_price/100);
|
|
$item->company_name = $companies[$item->company_id];
|
|
$item->package_name = $packages[$item->package_id];
|
|
$item->pay_channel_name = CommonService::namePayChannel($item->pay_channel);
|
|
});
|
|
|
|
return $orders;
|
|
}
|
|
|
|
/**
|
|
* 明细
|
|
*
|
|
* @return void
|
|
*/
|
|
public function detail(array $conditions = [])
|
|
{
|
|
if (!$class = self::$classes[$conditions['type']]) {
|
|
throw new NotAllowedException('统计类型不存在');
|
|
}
|
|
|
|
$repository = app($class);
|
|
|
|
$cards = $repository->withConditions($conditions)->applyConditions()->paginate($conditions['limit']);
|
|
|
|
return self::detailTransformer($cards);
|
|
}
|
|
|
|
/**
|
|
* 格式转化
|
|
*
|
|
* @param mixed $cards
|
|
* @return mixed
|
|
*/
|
|
public static function detailTransformer($cards)
|
|
{
|
|
$companies = app(CompanyRepository::class)->withTrashed()->get()->pluck('name', 'id')->toArray();
|
|
$packages = app(PackageRepository::class)->withTrashed()->get()->keyBy('id')->toArray();
|
|
$orders = app(OrderRepository::class)->withTrashed()
|
|
->select(['id', 'unit_price', 'pay_channel', 'order_at'])
|
|
->withConditions(['id' => array_unique($cards->pluck('order_id')->toArray())])->get()->keyBy('id')->toArray();
|
|
|
|
$cards->map(function ($item) use ($companies, $packages, $carrierOperators, $orders) {
|
|
$package = $packages[$item->package_id];
|
|
$order = $orders[$item->order_id];
|
|
|
|
$item->company_name = $companies[$item->company_id];
|
|
$item->package_name = $package['name'];
|
|
$item->carrier_operator_name = $carrierOperators[$package['carrier_operator']];
|
|
$item->service_months = $package['service_months'];
|
|
$item->unit_price = sprintf('%.02f', $order['unit_price']/100);
|
|
$item->pay_channel_name = CommonService::namePayChannel($order['pay_channel']);
|
|
$item->order_at = $order['order_at'];
|
|
});
|
|
|
|
return $cards;
|
|
}
|
|
}
|