This commit is contained in:
邓皓元 2019-01-14 15:41:37 +08:00
parent 4ce6b81341
commit 806eba208a
9 changed files with 37 additions and 87 deletions

View File

@ -6,6 +6,7 @@ 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;
@ -14,6 +15,8 @@ class CardService extends Service
protected $orderCardRepository;
protected $cardRepository;
protected static $typeNames = ['基础套餐', '基础续费', '续费包'];
/**
* 构造函数
*
@ -50,30 +53,41 @@ class CardService extends Service
{
$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);
$timelines = OrderCardPartition::select(['sim', 'type', 'package_id', 'service_start_at', 'service_end_at'])
->whereIn('sim', $cards->pluck('sim')->toArray())->orderBy('created_at')->get();
$service_start_at = min(array_pluck($timelines, 'starttime'));
$service_end_at = max(array_pluck($timelines, 'endtime'));
$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[$item->package['carrier_operator']],
'company_name' => $item->company['name'],
'package_name' => $item->package['name'],
'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],
@ -81,7 +95,7 @@ class CardService extends Service
'updated_at' => (string)$item->updated_at,
'service_start_at' => $service_start_at,
'service_end_at' => $service_end_at,
'timelines' => $timelines,
'timelines' => $_timelines,
]);
});
@ -98,57 +112,4 @@ class CardService extends Service
{
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;
}
}

View File

@ -3,28 +3,12 @@
namespace App\Models\Virtual;
use App\Core\Model;
use App\Models\HasCompositePrimaryKey;
use Illuminate\Database\Eloquent\SoftDeletes;
use App\Models\Virtual\Relations\OrderRelations;
class OrderCardPartition extends Model
{
use SoftDeletes, OrderRelations, HasCompositePrimaryKey;
use SoftDeletes, OrderRelations;
protected $table = 'virtual_order_cards';
public function renewals()
{
return $this->belongsToMany(Package::class, 'virtual_order_renewal_cards', 'sim', 'package_id', 'sim', 'id')->withPivot('created_at', 'counts');
}
public function renewalPackages()
{
return $this->belongsToMany(Package::class, 'virtual_order_renewal_package_cards', 'sim', 'package_id', 'sim', 'id')->withPivot('created_at', 'counts');
}
public function flowPackages()
{
return $this->belongsToMany(Package::class, 'virtual_order_flows_package_cards', 'sim', 'package_id', 'sim', 'id')->withPivot('created_at', 'counts');
}
protected $table = 'virtual_order_cards_partition';
}

View File

@ -122,7 +122,6 @@ AS $$
DECLARE
order_row RECORD;
BEGIN
RAISE NOTICE '% - %', NEW.sim, NEW.virtual_activated_at;
IF (TG_OP = 'INSERT') THEN
-- 插入数据
SELECT

View File

@ -55,7 +55,7 @@
<Row>
<Col span="8">{{item.name}}</Col>
<Col span="8">{{item.type_name}}</Col>
<Col span="8">{{item.starttime}} {{item.endtime}}</Col>
<Col span="8">{{item.service_start_at}} {{item.service_end_at}}</Col>
</Row>
</li>
</ul>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=\favicon.ico><script src=\config.js></script><title></title><link href=/css/chunk-bd098298.36d75fd0.css rel=prefetch><link href=/js/chunk-00ae0766.9e6b7bf3.js rel=prefetch><link href=/js/chunk-bd098298.41031d8f.js rel=prefetch><link href=/css/app.36043160.css rel=preload as=style><link href=/css/chunk-vendors.3c3b2e85.css rel=preload as=style><link href=/js/app.55e13136.js rel=preload as=script><link href=/js/chunk-vendors.02a4e5bc.js rel=preload as=script><link href=/css/chunk-vendors.3c3b2e85.css rel=stylesheet><link href=/css/app.36043160.css rel=stylesheet></head><body><noscript><strong>很抱歉如果没有启用JavaScript程序不能正常工作若要继续使用请启用它。</strong></noscript><div id=app></div><script src=/js/chunk-vendors.02a4e5bc.js></script><script src=/js/app.55e13136.js></script></body></html>
<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=\favicon.ico><script src=\config.js></script><title></title><link href=/css/chunk-bd098298.36d75fd0.css rel=prefetch><link href=/js/chunk-00ae0766.9e6b7bf3.js rel=prefetch><link href=/js/chunk-bd098298.8011ee29.js rel=prefetch><link href=/css/app.36043160.css rel=preload as=style><link href=/css/chunk-vendors.3c3b2e85.css rel=preload as=style><link href=/js/app.5a1c2656.js rel=preload as=script><link href=/js/chunk-vendors.02a4e5bc.js rel=preload as=script><link href=/css/chunk-vendors.3c3b2e85.css rel=stylesheet><link href=/css/app.36043160.css rel=stylesheet></head><body><noscript><strong>很抱歉如果没有启用JavaScript程序不能正常工作若要继续使用请启用它。</strong></noscript><div id=app></div><script src=/js/chunk-vendors.02a4e5bc.js></script><script src=/js/app.5a1c2656.js></script></body></html>