orderCardPartitionRepository = $orderCardPartitionRepository; $this->cardRepository = $cardRepository; } /** * 卡列表 * * @param array $conditions * @return mixed */ public function index(array $conditions = []) { $limit = $conditions['limit'] ?? 20; $page = Request::get('page', 1); $conditions['type'] = 0; // 添加卡属性匹配查找 if (isset($conditions['prop_product']) || isset($conditions['prop_package'])) { $this->propConditions($conditions); } $select = [ 'id', 'sim', 'company_id', 'package_id', 'created_at', 'updated_at', ]; $total = app(OrderCardRepository::class)->selectRaw("COUNT(*) AS count")->withConditions($conditions)->first()->count; $cards = app(OrderCardRepository::class)->select($select)->withConditions($conditions)->orderBy('created_at', 'desc')->forPage($page, $limit)->get(); $cards = static::transformer($cards); return new LengthAwarePaginator($cards, $total, $limit); } /** * 格式转化 * * @param mixed $cards * @return mixed */ public static function transformer($cards) { $cards->load([ 'card:sim,imsi,iccid,virtual_activated_at,cancelled_at', ]); if (!empty($cards)) { $simArray = $cards->pluck('sim')->implode(','); $timelines = DB::select("select * from get_timelines('{{$simArray}}'::INT8[]);"); $timelines = collect($timelines)->collect()->groupBy('sim')->toArray(); } $carrierOperators = app(Dicts::class)->get('carrier_operator'); $cardStatus = app(Dicts::class)->get('card_status'); $cards->transform(function ($item) use ($carrierOperators, $cardStatus, $timelines) { $_timelines = $timelines[$item->sim] ?? []; try { foreach ($_timelines as &$timeline) { $package = PackageService::load($timeline['package_id']); $timeline['type_name'] = self::$typeNames[$timeline['type']]; $timeline['name'] = $package['name']; $timeline['service_start_at'] = $timeline['service_start_at'] ? Carbon::parse($timeline['service_start_at'])->format('Y-m') : ''; $timeline['service_end_at'] = $timeline['service_end_at'] ? Carbon::parse($timeline['service_end_at'])->format('Y-m') : ''; } } catch (\Exception $e) { throw $e; } $company = CompanyService::load($item->company_id); $package = PackageService::load($item->package_id); $service_start_at = empty($_timelines) ? '' : min(array_pluck($_timelines, 'service_start_at')); $service_end_at = empty($_timelines) ? '' : max(array_pluck($_timelines, 'service_end_at')); $data = [ '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'], 'cancelled_at' => (string)$item->card['cancelled_at'], 'created_at' => (string)Carbon::parse($item->created_at)->format('Y-m-d'), 'updated_at' => (string)Carbon::parse($item->updated_at)->format('Y-m-d'), 'service_start_at' => $service_start_at, 'service_end_at' => $service_end_at, 'timelines' => $_timelines, ]; $status = static::getStatus($data); $data['status'] = $status; $data['status_name'] = $cardStatus[$status]; // 添加卡属性匹配字段 $property = PropertyService::load($item->company_id, $item->package_id); $data['prop_product'] = $property['product'] ?? ''; $data['prop_package'] = $property['package'] ?? ''; return collect($data); }); return collect($cards->toArray()); } /** * 卡状态 * * @param Card $card * @return void */ public static function getStatus($card) { if ($card['cancelled_at']) { return 4; } if ($card['service_end_at'] && $card['service_end_at'] < date('Y-m')) { return 3; } if ($card['service_start_at']) { return 2; } if (Carbon::parse($card['created_at'])->diffInMonths(Carbon::now()) <= 6) { return 1; } return 1; } public static function propConditions(&$conditions) { $properties = app(PropertyRepository::class)->select(['company_id', 'package_id', 'product', 'package'])->get()->keyBy(function ($item) { return $item['company_id'] . '_' . $item['package_id']; }); if (isset($conditions['prop_product']) && isset($conditions['prop_package'])) { $conditions['company_and_package_id'] = $properties->filter(function ($item) use ($conditions) { return strpos($item->product, $conditions['prop_product']) !== false && strpos($item->package, $conditions['prop_package']) !== false; })->keys()->toArray(); } elseif (isset($conditions['prop_product'])) { $conditions['company_and_package_id'] = $properties->filter(function ($item) use ($conditions) { return strpos($item->product, $conditions['prop_product']) !== false; })->keys()->toArray(); } elseif (isset($conditions['prop_package'])) { $conditions['company_and_package_id'] = $properties->filter(function ($item) use ($conditions) { return strpos($item->package, $conditions['prop_package']) !== false; })->keys()->toArray(); } } }