155 lines
5.0 KiB
PHP
155 lines
5.0 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\Domains\Card\Repositories\CardRepository;
|
|
use App\Domains\Virtual\Repositories\OrderCardRepository;
|
|
|
|
class CardService extends Service
|
|
{
|
|
protected $orderCardRepository;
|
|
protected $cardRepository;
|
|
|
|
/**
|
|
* 构造函数
|
|
*
|
|
* @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',
|
|
'company:id,name',
|
|
'package:id,name,carrier_operator,service_months',
|
|
'renewals:name,type,service_months',
|
|
'renewalPackages:name,type,service_months'
|
|
]);
|
|
|
|
$carrierOperators = app(Dicts::class)->get('carrier_operator');
|
|
$cardStatus = app(Dicts::class)->get('card_status');
|
|
|
|
$cards->transform(function ($item) use ($carrierOperators, $cardStatus) {
|
|
$status = static::getStatus($item->card);
|
|
$timelines = static::timelines($item);
|
|
|
|
$service_start_at = min(array_pluck($timelines, 'starttime'));
|
|
$service_end_at = max(array_pluck($timelines, 'endtime'));
|
|
|
|
return collect([
|
|
'id' => sprintf('No%011d', $item->id),
|
|
'sim' => $item->sim,
|
|
'imsi' => $item->card['imsi'],
|
|
'iccid' => $item->card['iccid'],
|
|
'carrier_operator' => $carrierOperators[$item->package['carrier_operator']],
|
|
'company_name' => $item->company['name'],
|
|
'package_name' => $item->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;
|
|
}
|
|
|
|
/**
|
|
* 生命周期
|
|
* @param OrderCard $item
|
|
*/
|
|
public static function timelines($item)
|
|
{
|
|
$array = [];
|
|
|
|
$virtual_activated_at = $item->card['virtual_activated_at'] ? Carbon::parse($item->card['virtual_activated_at'])->format('Y-m') : '';
|
|
|
|
// 基础套餐
|
|
$array[] = [
|
|
'type' => 0,
|
|
'name' => $item->package['name'],
|
|
'starttime' => $item->card['virtual_activated_at'] ? Carbon::parse($item->card['virtual_activated_at'])->format('Y-m') : '',
|
|
'endtime' => $virtual_activated_at ? Carbon::parse($virtual_activated_at)->addMonths($item->package['service_months'])->format('Y-m') : '',
|
|
];
|
|
|
|
// 续费套餐
|
|
$packages = $item->renewals->merge($item->renewalPackages);
|
|
|
|
$packages = $packages->sortBy(function ($value) {
|
|
return $value->pivot->created_at;
|
|
});
|
|
|
|
$packages->map(function ($package) use ($next, $virtual_activated_at, &$array) {
|
|
if (!$virtual_activated_at) {
|
|
$starttime = $endtime = '';
|
|
} else {
|
|
$starttime = (Carbon::parse($package->pivot->created_at) < Carbon::parse($next)) ? Carbon::parse($next) : Carbon::parse($package->pivot->created_at);
|
|
$endtime = $starttime->copy()->addMonths($package['service_months'] * $package->pivot->counts);
|
|
$next = $endtime;
|
|
$starttime = $starttime->format('Y-m');
|
|
$endtime = $endtime->format('Y-m');
|
|
}
|
|
|
|
$array[] = [
|
|
'type' => $package->type + 1,
|
|
'name' => $package->name,
|
|
'starttime' => $starttime,
|
|
'endtime' => $endtime,
|
|
];
|
|
});
|
|
|
|
$typeNames = ['基础套餐', '基础续费', '续费包'];
|
|
|
|
foreach ($array as $key => &$value) {
|
|
$value['type_name'] = $typeNames[$value['type']];
|
|
}
|
|
|
|
return $array;
|
|
}
|
|
}
|