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; } }