From aee6eb35d9a64c85763908be43d3d73c3e712511 Mon Sep 17 00:00:00 2001 From: denghy Date: Fri, 8 Mar 2019 15:47:28 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Domains/Real/Services/OrderService.php | 3 +- .../Real/Services/tempCodeRunnerFile.php | 2 - .../Http/Controllers/OrderController.php | 1 + .../Jobs/CreateRealVirtualRelation.php | 67 +++++++++++++++++++ app/Domains/Virtual/Services/OrderService.php | 55 ++++++++++++++- .../Virtual/Services/ProductService.php | 5 ++ app/Models/Real/RealVirtual.php | 12 ++++ ...0946_create_virtual_order_cards_tables.php | 1 + ..._03_08_110806_create_company_relations.php | 42 ++++++++++++ frontend/src/assets/css/common.less | 4 +- .../src/views/virtual/companies/detail.vue | 4 +- frontend/src/views/virtual/orders/cards.vue | 11 ++- frontend/src/views/virtual/orders/detail.vue | 13 ++-- frontend/src/views/virtual/orders/edit.vue | 60 +++++++++++------ frontend/src/views/virtual/orders/index.vue | 8 +-- frontend/src/views/virtual/orders/js/cards.js | 48 ++++++++----- frontend/src/views/virtual/orders/js/edit.js | 11 +-- frontend/src/views/virtual/orders/js/index.js | 2 +- tests/ExampleTest.php | 10 +-- vendor/composer/autoload_classmap.php | 3 +- vendor/composer/autoload_static.php | 3 +- 21 files changed, 289 insertions(+), 76 deletions(-) delete mode 100644 app/Domains/Real/Services/tempCodeRunnerFile.php create mode 100644 app/Domains/Virtual/Jobs/CreateRealVirtualRelation.php create mode 100644 app/Models/Real/RealVirtual.php create mode 100644 database/migrations/2019_03_08_110806_create_company_relations.php diff --git a/app/Domains/Real/Services/OrderService.php b/app/Domains/Real/Services/OrderService.php index 782fb4cb..328f9ddc 100644 --- a/app/Domains/Real/Services/OrderService.php +++ b/app/Domains/Real/Services/OrderService.php @@ -83,7 +83,7 @@ class OrderService extends Service $virtualOrders = app(VirtualOrderRepository::class)->withConditions(['id' => $orderIds])->get()->keyBy('id'); } - $simArray = $tmpCards[0]->pluck('sim')->toArray(); + $simArray = isset($tmpCards[0]) ? $tmpCards[0]->pluck('sim')->toArray() : []; $virtualOrderCards = []; // 没有订单的从当前状态下读取公司和套餐 @@ -96,6 +96,7 @@ class OrderService extends Service } $cards->map(function ($item) use ($virtualOrders, $virtualOrderCards) { + $item->sim = (string)$item->sim; $item->company_name = ''; $item->package_name = ''; diff --git a/app/Domains/Real/Services/tempCodeRunnerFile.php b/app/Domains/Real/Services/tempCodeRunnerFile.php deleted file mode 100644 index 2b0a9d83..00000000 --- a/app/Domains/Real/Services/tempCodeRunnerFile.php +++ /dev/null @@ -1,2 +0,0 @@ - $item->id, 'sn' => $item->sn, + 'transaction_no' => $item->transaction_no, 'package_name' => $item->package->name, 'company_name' => $item->company->name, 'pay_channel' => CommonService::namePayChannel($item->pay_channel), diff --git a/app/Domains/Virtual/Jobs/CreateRealVirtualRelation.php b/app/Domains/Virtual/Jobs/CreateRealVirtualRelation.php new file mode 100644 index 00000000..9b6ca7db --- /dev/null +++ b/app/Domains/Virtual/Jobs/CreateRealVirtualRelation.php @@ -0,0 +1,67 @@ +virtualOrderId = $virtualOrderId; + $this->realOrderIds = $realOrderIds; + } + + /** + * + */ + public function handle(RealOrderRepository $realOrderRepository, VirtualOrderRepository $virtualOrderRepository) + { + $select = ['id', 'company_id', 'package_id']; + + if (!$virtualOrder = $virtualOrderRepository->select($select)->find($this->virtualOrderId)) { + return ; + } + + $realOrders = $realOrderRepository->select($select)->whereIn('id', $this->realOrderIds)->get(); + + if (empty($realOrders)) { + return ; + } + + $array = []; + + foreach ($realOrders as $value) { + $k = implode(',', [$value['company_id'], $value['package_id'], $virtualOrder['company_id'], $virtualOrder['package_id']]); + $array[$k] = [ + 'real_company_id' => $value['company_id'], + 'real_package_id' => $value['package_id'], + 'virtual_company_id' => $virtualOrder['company_id'], + 'virtual_package_id' => $virtualOrder['package_id'], + 'counts' => 1, + 'updated_at' => date('Y-m-d H:i:s'), + ]; + } + + $builder = RealVirtual::query()->toBase(); + + $sql = $builder->getGrammar()->compileInsert($builder, $array); + + $sql .= ' on conflict (real_company_id,real_package_id,virtual_company_id,virtual_package_id) do update set + counts=real_virtual_relations.counts+excluded.counts, + updated_at=excluded.updated_at'; + + $builder->connection->insert($sql, Arr::flatten($array, 1)); + } +} diff --git a/app/Domains/Virtual/Services/OrderService.php b/app/Domains/Virtual/Services/OrderService.php index 9542cb67..5c490b55 100644 --- a/app/Domains/Virtual/Services/OrderService.php +++ b/app/Domains/Virtual/Services/OrderService.php @@ -13,6 +13,7 @@ use Dipper\Foundation\Exceptions\HttpException; use App\Domains\Virtual\Services\CompanyService; use App\Domains\Virtual\Services\PackageService; use App\Domains\Virtual\Repositories\OrderRepository; +use App\Domains\Virtual\Jobs\CreateRealVirtualRelation; use App\Domains\Virtual\Repositories\ProductRepository; use App\Models\Real\OrderCardPartition as RealOrderCardPartition; use App\Domains\Virtual\Repositories\OrderCardPartitionRepository; @@ -128,10 +129,9 @@ class OrderService extends Service 'address.required' => '请选择收货地址', ]; - DB::beginTransaction(); - if (!$attributes['id']) { $attributes['sn'] = $attributes['sn'] ?: $this->generateSn(); + $attributes['transaction_no'] = $attributes['transaction_no'] ?: $this->generateTransactionNo($attributes['pay_channel']); if ($attributes['company_id'] && $attributes['package_id'] && isset($attributes['unit_price'])) { $attributes['unit_price'] = intval($attributes['unit_price'] * 100); @@ -161,6 +161,8 @@ class OrderService extends Service Validator::validate($attributes, $rule, $message); + DB::beginTransaction(); + if (!$attributes['id']) { if ($product->company_id != $attributes['company_id']) { throw new NotAllowedException('非法操作'); @@ -212,7 +214,7 @@ class OrderService extends Service } if (!empty($data)) { - $array = array_chunk($data, 1000); + $array = array_chunk($data, 10000); foreach ($array as $value) { DB::table($table)->upsert($value, ['sim', 'order_id', 'deleted_at']); @@ -226,8 +228,11 @@ class OrderService extends Service } $this->orderRepository->forgetCached(); + $this->orderCardPartitionRepository->forgetCached(); app(RealOrderCardPartitionRepository::class)->forgetCached(); app(RealOrderRepository::class)->forgetCached(); + + CreateRealVirtualRelation::dispatch($node->id, array_pluck($attributes['selected'], 'id')); } catch (\Exception $e) { DB::rollBack(); throw new HttpException('操作失败'); @@ -319,4 +324,48 @@ class OrderService extends Service { return date('YmdHis') .sprintf('%04d', explode('.', microtime(true))[1]) . sprintf('%02d', rand(0, 99)); } + + /** + * 生成流水号 + * + * 4200000252201903085372480404 微信 + * 2019030722001407831022090620 支付宝 + * + * @return void + */ + public function generateTransactionNo($payChannel) + { + switch ($payChannel) { + case 'wx': + case 'wx_pub': + case 'wx_pub_qr': + case 'wx_pub_scan': + case 'wx_wap': + case 'wx_lite': + $transactionNo = '4200000' . sprintf('%03d', rand(0, 999)) . date('YmdHis') .sprintf('%04d', explode('.', microtime(true))[1]); + break; + case 'alipay': + case 'alipay_wap': + case 'alipay_qr': + case 'alipay_scan': + case 'alipay_pc_direct': + $transactionNo = date('YmdHis') . sprintf('%04d', explode('.', microtime(true))[1]) . '1' . sprintf('%9d', rand(0, 999999999)); + break; + case 'bank': + $transactionNo = date('YmdHis') . sprintf('%04d', explode('.', microtime(true))[1]) . '2' . sprintf('%9d', rand(0, 999999999)); + break; + case 'account': + $transactionNo = date('YmdHis') . sprintf('%04d', explode('.', microtime(true))[1]) . '3' . sprintf('%9d', rand(0, 999999999)); + break; + case 'tmall': + $transactionNo = date('YmdHis') . sprintf('%04d', explode('.', microtime(true))[1]) . '4' . sprintf('%9d', rand(0, 999999999)); + break; + + default: + $transactionNo = date('YmdHis') . sprintf('%04d', explode('.', microtime(true))[1]) . '0' . sprintf('%9d', rand(0, 999999999)); + break; + } + + return intval($transactionNo); + } } diff --git a/app/Domains/Virtual/Services/ProductService.php b/app/Domains/Virtual/Services/ProductService.php index 251296f2..d1081193 100644 --- a/app/Domains/Virtual/Services/ProductService.php +++ b/app/Domains/Virtual/Services/ProductService.php @@ -92,6 +92,11 @@ class ProductService extends Service $attributes['sn'] = self::sn($package['sn'], $attributes['company_id'], $attributes['price']); + // 禁用相同套餐的其他定价 + if ($attributes['status']) { + $this->productRepository->where('package_id', $attributes['package_id'])->update(['status' => 1]); + } + if (!$attributes['id']) { if ($this->productRepository->where('sn', $attributes['sn'])->count()) { throw new NotAllowedException('已存在相同定价,请勿重复添加'); diff --git a/app/Models/Real/RealVirtual.php b/app/Models/Real/RealVirtual.php new file mode 100644 index 00000000..d6b6a2da --- /dev/null +++ b/app/Models/Real/RealVirtual.php @@ -0,0 +1,12 @@ +integer('unit_price')->unsigned()->default(0)->comment('单价'); $table->timestamp('service_start_at')->nullable()->comment('服务开始时间'); $table->timestamp('service_end_at')->nullable()->comment('服务结束时间'); + $table->bigInteger('original_sim')->unsigned()->default(0)->comment('原始sim号'); $table->timestamps(); $table->softDeletes(); diff --git a/database/migrations/2019_03_08_110806_create_company_relations.php b/database/migrations/2019_03_08_110806_create_company_relations.php new file mode 100644 index 00000000..2fb064bf --- /dev/null +++ b/database/migrations/2019_03_08_110806_create_company_relations.php @@ -0,0 +1,42 @@ +integer('real_company_id')->unsigned()->default(0)->comment('RD企业ID'); + $table->integer('real_package_id')->unsigned()->default(0)->comment('RD套餐ID'); + $table->integer('virtual_company_id')->unsigned()->default(0)->comment('VD企业ID'); + $table->integer('virtual_package_id')->unsigned()->default(0)->comment('VD套餐ID'); + $table->integer('times')->unsigned()->default(0)->comment('关联次数'); + $table->timestamp('updated_at')->comment('更新时间'); + + $table->primary(['real_company_id', 'real_package_id', 'virtual_company_id', 'virtual_package_id']); + + $table->comment('RD VD关系关联'); + }); + } + } + + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('real_virtual_relations'); + } +} diff --git a/frontend/src/assets/css/common.less b/frontend/src/assets/css/common.less index 001f08c9..bcd08358 100644 --- a/frontend/src/assets/css/common.less +++ b/frontend/src/assets/css/common.less @@ -930,8 +930,8 @@ table { /*编辑页面*/ .page-edit-wrap { - padding-top: 20px; - padding-bottom: 20px; + padding-top: 10px; + padding-bottom: 10px; .ui-list { margin-bottom: 25px; diff --git a/frontend/src/views/virtual/companies/detail.vue b/frontend/src/views/virtual/companies/detail.vue index d3a1f82e..5b747640 100644 --- a/frontend/src/views/virtual/companies/detail.vue +++ b/frontend/src/views/virtual/companies/detail.vue @@ -1,7 +1,7 @@