vd/app/Domains/Real/Services/OrderService.php
2019-03-29 10:21:11 +08:00

136 lines
4.8 KiB
PHP

<?php
namespace App\Domains\Real\Services;
use App\Dicts;
use App\Core\Service;
use Illuminate\Support\Facades\Log;
use App\Exceptions\NotAllowedException;
use App\Domains\Virtual\Services\CompanyService;
use App\Domains\Virtual\Services\PackageService;
use App\Domains\Real\Repositories\OrderRepository;
use App\Domains\Real\Repositories\OrderCardPartitionRepository;
use App\Domains\Virtual\Repositories\OrderRepository as VirtualOrderRepository;
use App\Domains\Virtual\Repositories\OrderCardPartitionRepository as VirtualOrderCardPartitionRepository;
class OrderService extends Service
{
public $orderRepository;
public $orderCardPartitionRepository;
/**
* 构造函数
*
* @return void
*/
public function __construct(OrderRepository $orderRepository, OrderCardPartitionRepository $orderCardPartitionRepository)
{
$this->orderRepository = $orderRepository;
$this->orderCardPartitionRepository = $orderCardPartitionRepository;
}
/**
* 订单列表
*
* @return void
*/
public function index(array $conditions = [])
{
$conditions['type'] = $conditions['type'] ?? 0;
$limit = $conditions['limit'] ?? 10;
$carrierOperators = app(Dicts::class)->get('carrier_operator');
$res = $this->orderRepository->withConditions($conditions)->applyConditions()->paginate($limit);
if (!$res->isEmpty()) {
$cards = $this->orderCardPartitionRepository->selectRaw('
order_id,SUM(counts) as counts,
SUM(CASE virtual_order_id WHEN 0 THEN 0 ELSE counts END) as shipments,
SUM(CASE WHEN refunded_at IS NULL THEN 0 ELSE counts END) as refunds
')
->withConditions(['type' => $conditions['type'], 'order_id', $res->pluck('id')->toArray()])
->groupBy('order_id')->get()->keyBy('order_id')->toArray();
}
$res->map(function ($item) use ($carrierOperators, $cards) {
$item->pay_channel_name = CommonService::namePayChannel($item->pay_channel);
$item->company_name = CommonService::company($item->company_id)['name'];
$item->package = CommonService::package($item->package_id);
$item->package_name = $item->package['name'];
$item->carrier_operator = $item->package['carrier_operator'];
$item->carrier_operator_name = $carrierOperators[$item->carrier_operator];
$item->unit_price = sprintf('%.02f', $item->unit_price/100);
$item->total_price = sprintf('%.02f', $item->total_price/100);
$item->shipments = $cards[$item->id]['shipments'] ?? 0;
$item->counts = $cards[$item->id]['counts'] ?? 0;
$item->refunds = $cards[$item->id]['refunds'] ?? 0;
});
return $res->sortByDesc('order_at')->values();
}
/**
* 获取卡列表
*
* @param int $orderId
* @return void
*/
public function cards(array $conditions = [])
{
set_time_limit(0);
ini_set('memory_limit', '4096m');
ini_set('default_socket_timeout', -1);
$counts = $this->orderCardPartitionRepository->withConditions($conditions)->sum('counts');
if ($counts > 200000) {
throw new NotAllowedException("当前请求数据量过大,请筛选过滤后查询");
}
Log::info('1', [microtime(true)]);
$cards = $this->orderCardPartitionRepository->withVirtual($conditions)->currentModel()->get();
Log::info('2', [microtime(true)]);
$tmpCards = $cards->groupBy('virtual_order_id');
$orderIds = $tmpCards->keys()->unique()->toArray();
$key = array_search(0, $orderIds);
if ($key !== false) {
unset($orderIds[$key]);
}
Log::info('3', [microtime(true)]);
$virtualOrders = [];
// 有订单的从订单中读取公司和套餐
if (!empty($orderIds)) {
$virtualOrders = app(VirtualOrderRepository::class)->withConditions(['id' => $orderIds])->get()->keyBy('id');
}
Log::info('4', [microtime(true)]);
foreach ($cards as &$item) {
$item->sim = (string)$item->sim;
$item->company_id = $item->company_id ?? 0;
$item->package_id = $item->package_id ?? 0;
if ($item->virtual_order_id) {
$virtual = $virtualOrders[$item->virtual_order_id];
$item->company_id = $virtual['company_id'];
$item->package_id = $virtual['package_id'];
}
$item->company_name = !$item->company_id ? '' : CompanyService::load($item->company_id)['name'] ?? '';
$item->package_name = !$item->package_id ? '' : PackageService::load($item->package_id)['name'] ?? '';
}
Log::info('5', [microtime(true)]);
return $cards->sortBy('sim')->sortBy('order_id')->values();
}
}