From a3a3856fbbbf3e893395167b65be750fef31cf81 Mon Sep 17 00:00:00 2001 From: denghy Date: Mon, 18 Feb 2019 10:52:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=81=E9=87=8F=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repositories/FlowPoolMonthRepository.php | 4 +- .../FlowPoolPackageRepository.php | 72 +++++++++++++++ .../Repositories/FlowPoolRepository.php | 17 +++- .../Virtual/Services/FlowPoolService.php | 88 ++++++++++++++++--- app/Models/Virtual/FlowPool.php | 12 +++ app/Models/Virtual/FlowPoolPackage.php | 25 ++++++ ...9_01_24_175246_create_flow_pool_tables.php | 1 + .../src/views/virtual/flow_pools/index.vue | 8 +- .../src/views/virtual/flow_pools/js/edit.js | 8 +- .../src/views/virtual/flow_pools/js/index.js | 50 +++++++---- 10 files changed, 249 insertions(+), 36 deletions(-) create mode 100644 app/Domains/Virtual/Repositories/FlowPoolPackageRepository.php create mode 100644 app/Models/Virtual/FlowPoolPackage.php diff --git a/app/Domains/Virtual/Repositories/FlowPoolMonthRepository.php b/app/Domains/Virtual/Repositories/FlowPoolMonthRepository.php index 77a9bdad..9c90861d 100644 --- a/app/Domains/Virtual/Repositories/FlowPoolMonthRepository.php +++ b/app/Domains/Virtual/Repositories/FlowPoolMonthRepository.php @@ -16,7 +16,7 @@ class FlowPoolMonthRepository extends Repository /** * 是否开启数据转化 - * + * * @var bool */ protected $needTransform = false; @@ -59,4 +59,4 @@ class FlowPoolMonthRepository extends Repository return $this; } -} \ No newline at end of file +} diff --git a/app/Domains/Virtual/Repositories/FlowPoolPackageRepository.php b/app/Domains/Virtual/Repositories/FlowPoolPackageRepository.php new file mode 100644 index 00000000..c5baedf5 --- /dev/null +++ b/app/Domains/Virtual/Repositories/FlowPoolPackageRepository.php @@ -0,0 +1,72 @@ + '=', + 'created_at' => 'like', + ]; + + public function model() { + return Model::class; + } + + /** + * 数据格式化 + * + * @param mixed $result + * + * @return mixed + */ + public function transform($model) + { + return $model->toArray(); + } + + /** + * 查询条件 + * + * @return void + */ + public function withConditions(array $conditions = []) + { + if (isset($conditions['id'])) { + $conditions['id'] = array_wrap($conditions['id']); + $this->model = $this->model->whereIn('id', $conditions['id']); + } + + if (isset($conditions['pool_id'])) { + $conditions['pool_id'] = array_wrap($conditions['pool_id']); + $this->model = $this->model->whereIn('pool_id', $conditions['pool_id']); + } + + if (isset($conditions['package_id'])) { + $conditions['package_id'] = array_wrap($conditions['package_id']); + $this->model = $this->model->whereIn('package_id', $conditions['package_id']); + } + + return $this; + } +} diff --git a/app/Domains/Virtual/Repositories/FlowPoolRepository.php b/app/Domains/Virtual/Repositories/FlowPoolRepository.php index af77c3a8..445e9819 100644 --- a/app/Domains/Virtual/Repositories/FlowPoolRepository.php +++ b/app/Domains/Virtual/Repositories/FlowPoolRepository.php @@ -29,7 +29,8 @@ class FlowPoolRepository extends Repository 'created_at' => 'like', ]; - public function model() { + public function model() + { return Model::class; } @@ -57,6 +58,20 @@ class FlowPoolRepository extends Repository $this->model = $this->model->whereIn('id', $conditions['id']); } + if (isset($conditions['carrier_operator'])) { + $this->model = $this->model->where('carrier_operator', $conditions['carrier_operator']); + } + + if (isset($conditions['name'])) { + $this->model = $this->model->where('name', 'like', "%{$conditions['name']}%"); + } + + if (isset($conditions['company_name'])) { + $this->model = $this->model->whereHas('company', function ($relation) use ($conditions) { + $relation->withTrashed()->where('name', $conditions['company_name']); + }); + } + return $this; } } diff --git a/app/Domains/Virtual/Services/FlowPoolService.php b/app/Domains/Virtual/Services/FlowPoolService.php index 14bd97bd..80bf7ec8 100644 --- a/app/Domains/Virtual/Services/FlowPoolService.php +++ b/app/Domains/Virtual/Services/FlowPoolService.php @@ -5,23 +5,45 @@ use App\Dicts; use App\Core\Service; use Illuminate\Validation\Rule; use App\Models\Virtual\FlowPool; +use Illuminate\Support\Facades\DB; +use App\Exceptions\NotExistException; +use App\Exceptions\NotAllowedException; use Illuminate\Support\Facades\Validator; +use App\Domains\Virtual\Services\CompanyService; +use App\Domains\Virtual\Services\PackageService; use App\Domains\Virtual\Repositories\FlowPoolRepository; +use App\Domains\Virtual\Repositories\FlowPoolCardRepository; +use App\Domains\Virtual\Repositories\FlowPoolMonthRepository; +use App\Domains\Virtual\Repositories\FlowPoolPackageRepository; +use App\Domains\Virtual\Repositories\FlowPoolSettingRepository; class FlowPoolService extends Service { protected $flowPoolRepository; - protected $realFlowPoolRepository; + protected $flowPoolPackageRepository; + protected $flowPoolSettingRepository; + protected $flowPoolCardRepository; + protected $flowPoolMonthRepository; + + protected $pools; /** * 构造函数 * * @return void */ - public function __construct(FlowPoolRepository $flowPoolRepository) - { + public function __construct( + FlowPoolRepository $flowPoolRepository, + FlowPoolPackageRepository $flowPoolPackageRepository, + FlowPoolSettingRepository $flowPoolSettingRepository, + FlowPoolCardRepository $flowPoolCardRepository, + FlowPoolMonthRepository $flowPoolMonthRepository + ) { $this->flowPoolRepository = $flowPoolRepository; - $this->realFlowPoolRepository = $realFlowPoolRepository; + $this->flowPoolPackageRepository = $flowPoolPackageRepository; + $this->flowPoolSettingRepository = $flowPoolSettingRepository; + $this->flowPoolCardRepository = $flowPoolCardRepository; + $this->flowPoolMonthRepository = $flowPoolMonthRepository; } /** @@ -37,13 +59,19 @@ class FlowPoolService extends Service $flowPools = $this->flowPoolRepository->withConditions($conditions) ->applyConditions()->paginate($limit); + $packages = $this->flowPoolPackageRepository->withConditions([ + 'pool_id' => $flowPools->pluck('id')->toArray(), + ])->get()->groupBy('pool_id'); + $carrierOperators = app(Dicts::class)->get('carrier_operator'); $shares = app(Dicts::class)->get('shares'); - $flowPools->map(function ($item) use ($carrierOperators, $shares) { - $item->company_name = app(CompanyService::class)->load($item->company_id)['name']; - $item->carrier_operator_name = $carrierOperators[$item->carrier_operator]; - $item->shared_name = $shares[$item->shared]; + $flowPools->map(function ($item) use ($carrierOperators, $shares, $packages) { + $item->company_name = app(CompanyService::class)->load($item['company_id'])['name']; + $item->carrier_operator_name = $carrierOperators[$item['carrier_operator']]; + $item->shared_name = $shares[$item['shared']]; + $item->package_ids = $packages[$item->id] ? array_pluck($packages[$item->id], 'package_id') : []; + $item->real_pool_ids = empty($item->real_pool_ids) ? [] : $item->real_pool_ids; }); return $flowPools; @@ -75,12 +103,25 @@ class FlowPoolService extends Service Validator::validate($attributes, $rule, $message); + if (empty($attributes['package_ids'])) { + throw new NotAllowedException('请至少加入一个套餐'); + } + if (!$attributes['id']) { $maxId = FlowPool::withTrashed()->max('id'); $attributes['id'] = $maxId ? $maxId + 1 : 1; $attributes['sn'] = self::sn($attributes['id']); - $node = $this->flowPoolRepository->create($attributes); + DB::transaction(function () use ($attributes) { + $node = $this->flowPoolRepository->create(array_except($attributes, ['package_ids'])); + + foreach ($attributes['package_ids'] as $package_id) { + $this->flowPoolPackageRepository->create([ + 'pool_id' => $node->id, + 'package_id' => $package_id, + ]); + } + }); } if ($attributes['id']) { @@ -90,7 +131,25 @@ class FlowPoolService extends Service throw new NotExistException('流量池不存在或已删除'); } - $this->flowPoolRepository->setModel($node)->update($attributes); + DB::transaction(function () use ($attributes, $node) { + $exists = $this->flowPoolPackageRepository->withConditions([ + 'pool_id' => $node->id, + ])->get()->pluck('package_id')->toArray(); + + $this->flowPoolRepository->setModel($node)->update(array_except($attributes, ['package_ids'])); + + foreach ($exists as $package_id) { + if (!in_array($package_id, $attributes['package_ids'])) { + $this->flowPoolPackageRepository->withConditions(['package_id' => $package_id])->delete(); + } + } + + foreach ($attributes['package_ids'] as $package_id) { + if (!in_array($package_id, $exists)) { + $this->flowPoolPackageRepository->create(['pool_id' => $node->id, 'package_id' => $package_id]); + } + } + }); } return $node; @@ -114,4 +173,13 @@ class FlowPoolService extends Service { return sprintf('FP%011d', $id); } + + public function load($id) + { + if (!$this->pools) { + $this->pools = $this->flowPoolRepository->withTrashed()->get()->keyBy('id'); + } + + return $this->pools[$id]; + } } diff --git a/app/Models/Virtual/FlowPool.php b/app/Models/Virtual/FlowPool.php index fbcbbecc..f61d846c 100644 --- a/app/Models/Virtual/FlowPool.php +++ b/app/Models/Virtual/FlowPool.php @@ -3,6 +3,8 @@ namespace App\Models\Virtual; use App\Core\Model; +use App\Models\Virtual\Company; +use App\Models\Virtual\Package; use Illuminate\Database\Eloquent\SoftDeletes; class FlowPool extends Model @@ -15,4 +17,14 @@ class FlowPool extends Model 'package_ids' => 'array', 'real_pool_ids' => 'array', ]; + + public function company() + { + return $this->belongsTo(Company::class, 'company_id', 'id'); + } + + public function packages() + { + return $this->belongsToMany(Package::class, 'virtual_flow_pool_packages', 'pool_id', 'package_id'); + } } diff --git a/app/Models/Virtual/FlowPoolPackage.php b/app/Models/Virtual/FlowPoolPackage.php new file mode 100644 index 00000000..a4d922a0 --- /dev/null +++ b/app/Models/Virtual/FlowPoolPackage.php @@ -0,0 +1,25 @@ +belongsTo(Package::class, 'package_id'); + } + + public function pool() + { + return $this->belongsTo(FlowPool::class, 'pool_id'); + } +} diff --git a/database/migrations/2019_01_24_175246_create_flow_pool_tables.php b/database/migrations/2019_01_24_175246_create_flow_pool_tables.php index 10124a1c..8372afb9 100644 --- a/database/migrations/2019_01_24_175246_create_flow_pool_tables.php +++ b/database/migrations/2019_01_24_175246_create_flow_pool_tables.php @@ -41,6 +41,7 @@ class CreateFlowPoolTables extends Migration $table->integer('flows')->default(255)->comment('流量值 -1不限流量 单位MB'); $table->tinyInteger('carrier_operator')->unsigned()->default(255)->comment('运营商(0:联通 1:移动 2:电信)'); $table->tinyInteger('shared')->unsigned()->default(0)->comment('共享类型 0:未知 1纵向共享 2横向共享'); + $table->text('package_ids')->nullable()->comment('RD套餐ID'); $table->text('real_pool_ids')->nullable()->comment('RD流量池ID'); $table->text('remark')->nullable()->comment('流量池备注'); $table->tinyInteger('status')->unsigned()->default(0)->comment('状态 0:正常 1:禁用'); diff --git a/frontend/src/views/virtual/flow_pools/index.vue b/frontend/src/views/virtual/flow_pools/index.vue index ea946a66..e0db8de0 100644 --- a/frontend/src/views/virtual/flow_pools/index.vue +++ b/frontend/src/views/virtual/flow_pools/index.vue @@ -36,7 +36,7 @@ @on-search="handleCompleteCompanies" icon="ios-search" placeholder="请输入企业名称" - v-model.trim="params.name" + v-model.trim="options.company_name" >