vd/app/Domains/Virtual/Services/CardService.php
2019-01-15 18:06:37 +08:00

116 lines
3.8 KiB
PHP

<?php
namespace App\Domains\Virtual\Services;
use App\Dicts;
use App\Core\Service;
use App\Models\Card\Card;
use Illuminate\Support\Carbon;
use App\Models\Virtual\OrderCard;
use App\Models\Virtual\OrderCardPartition;
use App\Domains\Card\Repositories\CardRepository;
use App\Domains\Virtual\Repositories\OrderCardRepository;
class CardService extends Service
{
protected $orderCardRepository;
protected $cardRepository;
protected static $typeNames = ['基础套餐', '基础续费', '续费包'];
/**
* 构造函数
*
* @return void
*/
public function __construct(OrderCardRepository $orderCardRepository, CardRepository $cardRepository)
{
$this->orderCardRepository = $orderCardRepository;
$this->cardRepository = $cardRepository;
}
/**
* 卡列表
*
* @param array $conditions
* @return mixed
*/
public function index(array $conditions = [])
{
$limit = $conditions['limit'] ?? 20;
$cards = $this->orderCardRepository->withConditions($conditions)->applyConditions()->paginate($limit);
return static::transformer($cards);
}
/**
* 格式转化
*
* @param mixed $cards
* @return mixed
*/
public static function transformer($cards)
{
$cards->load([
'card:sim,imsi,iccid,virtual_activated_at,cancelled_at',
]);
$carrierOperators = app(Dicts::class)->get('carrier_operator');
$cardStatus = app(Dicts::class)->get('card_status');
$timelines = OrderCardPartition::select(['sim', 'type', 'package_id', 'service_start_at', 'service_end_at'])
->whereIn('sim', $cards->pluck('sim')->toArray())->orderBy('created_at')->get();
$timelines->map(function ($item) {
$package = app(PackageService::class)->load($item->package_id);
$item->type_name = self::$typeNames[$item->type];
$item->name = $package['name'];
$item->service_start_at = Carbon::parse($item->service_start_at)->format('Y-m');
$item->service_end_at = Carbon::parse($item->service_end_at)->format('Y-m');
});
$timelines = $timelines->groupBy('sim');
$cards->transform(function ($item) use ($carrierOperators, $cardStatus, $timelines) {
$status = static::getStatus($item->card);
$_timelines = $timelines[$item->sim];
$company = app(CompanyService::class)->load($item->company_id);
$package = app(PackageService::class)->load($item->package_id);
$service_start_at = min(array_pluck($_timelines, 'service_start_at'));
$service_end_at = max(array_pluck($_timelines, 'service_end_at'));
return collect([
'id' => sprintf('No%011d', $item->id),
'sim' => $item->sim,
'imsi' => $item->card['imsi'],
'iccid' => $item->card['iccid'],
'carrier_operator' => $carrierOperators[$package['carrier_operator']],
'company_name' => $company['name'],
'package_name' => $package['name'],
'virtual_activated_at' => (string)$item->card['virtual_activated_at'],
'status' => $status,
'status_name' => $cardStatus[$status],
'created_at' => (string)$item->created_at,
'updated_at' => (string)$item->updated_at,
'service_start_at' => $service_start_at,
'service_end_at' => $service_end_at,
'timelines' => $_timelines,
]);
});
return collect($cards->toArray());
}
/**
* 卡状态
*
* @param Card $card
* @return void
*/
public static function getStatus($card)
{
return $card['virtual_activated_at'] ? ($card['cancelled_at'] ? 3 : 2) : 1;
}
}