diff --git a/app/Domains/Real/Http/Controllers/OrderController.php b/app/Domains/Real/Http/Controllers/OrderController.php index c8c70e60..8653b2e6 100644 --- a/app/Domains/Real/Http/Controllers/OrderController.php +++ b/app/Domains/Real/Http/Controllers/OrderController.php @@ -3,6 +3,7 @@ namespace App\Domains\Real\Http\Controllers; use App\Core\Controller; use Illuminate\Http\Request; +use App\Models\Real\RealVirtual; use App\Domains\Real\Services\OrderService; class OrderController extends Controller @@ -29,12 +30,19 @@ class OrderController extends Controller $conditions = $this->request->all(); $conditions['limit'] = $this->request->get('limit', 10); + if (isset($conditions['sim'])) { + $conditions['sim'] = array_map('intval', array_map('trim', str_to_array($conditions['sim'], "\n"))); + } + $orders = $this->orderService->index($conditions); - $orders->transform(function($item){ + $orders->transform(function ($item) { return $item->only([ 'id', 'sn', + 'company_id', + 'package_id', + 'carrier_operator', 'company_name', 'package_name', 'carrier_operator_name', @@ -43,6 +51,10 @@ class OrderController extends Controller 'shipments', 'total_price', 'order_at', + 'transaction_no', + 'address', + 'contacts', + 'mobile', ]); }); @@ -58,8 +70,23 @@ class OrderController extends Controller { $conditions = $this->request->all(); - $orders = $this->orderService->cards($conditions); + if (isset($conditions['sim'])) { + $conditions['sim'] = array_map('intval', array_map('trim', str_to_array($conditions['sim'], "\n"))); + } - return res($orders, '卡列表', 201); + $cards = $this->orderService->cards($conditions); + + return res($cards, '卡列表', 201); + } + + /** + * 记录关联 + * + * @return void + */ + public function relations() + { + $relations = RealVirtual::get(); + return res($relations, '关联列表', 201); } } diff --git a/app/Domains/Real/Jobs/MongoSyncJob.php b/app/Domains/Real/Jobs/MongoSyncJob.php index 2fc5a8ce..91e32f4a 100644 --- a/app/Domains/Real/Jobs/MongoSyncJob.php +++ b/app/Domains/Real/Jobs/MongoSyncJob.php @@ -82,7 +82,6 @@ class MongoSyncJob implements ShouldQueue 'carrier_operator' => self::$carrierOperators[$value['oType']] ?? 255, 'activated_at' => $activated_at, 'virtual_activated_at' => $activated_at, - 'real_company_id' => empty($value['bNo']) ? -1 : ($companies[$value['bNo']]['id'] ?? 0), 'created_at' => $value['sDate'] ? $value['sDate']->toDateTime()->format('Y-m-d H:i:s') : null, 'updated_at' => date('Y-m-d H:i:s'), ]; @@ -94,8 +93,7 @@ class MongoSyncJob implements ShouldQueue $sql .= ' on conflict (sim) do update set activated_at=excluded.activated_at, - virtual_activated_at=COALESCE(cards.virtual_activated_at, excluded.activated_at), - real_company_id=excluded.real_company_id'; + virtual_activated_at=COALESCE(cards.virtual_activated_at, excluded.activated_at)'; $builder->connection->insert($sql, Arr::flatten($values, 1)); diff --git a/app/Domains/Real/Repositories/OrderCardPartitionRepository.php b/app/Domains/Real/Repositories/OrderCardPartitionRepository.php index ada9652d..78b2f704 100644 --- a/app/Domains/Real/Repositories/OrderCardPartitionRepository.php +++ b/app/Domains/Real/Repositories/OrderCardPartitionRepository.php @@ -48,4 +48,34 @@ class OrderCardPartitionRepository extends Repository { return $model->toArray(); } + + public function withVirtual($conditions) + { + $select = 'distinct on (real_order_cards_partition.sim) + real_order_cards_partition.sim, + real_order_cards_partition.order_id, + real_order_cards_partition.virtual_order_id, + real_order_cards_partition.counts, + virtual_order_cards_partition.company_id, + virtual_order_cards_partition.package_id + '; + + $this->model = $this->model->selectRaw($select); + + $this->model = $this->model->leftJoin('virtual_order_cards_partition', 'virtual_order_cards_partition.sim', '=', 'real_order_cards_partition.sim'); + + $this->model= $this->model->orderBy('real_order_cards_partition.sim')->orderBy('virtual_order_cards_partition.created_at'); + + if (isset($conditions['type'])) { + $conditions['type'] = array_wrap($conditions['type']); + $this->model= $this->model->whereIn('real_order_cards_partition.type', $conditions['type']); + } + + if (isset($conditions['order_id'])) { + $conditions['order_id'] = array_wrap($conditions['order_id']); + $this->model= $this->model->whereIn('real_order_cards_partition.order_id', $conditions['order_id']); + } + + return $this; + } } diff --git a/app/Domains/Real/Repositories/OrderRepository.php b/app/Domains/Real/Repositories/OrderRepository.php index d7869463..503fe5d9 100644 --- a/app/Domains/Real/Repositories/OrderRepository.php +++ b/app/Domains/Real/Repositories/OrderRepository.php @@ -108,6 +108,13 @@ class OrderRepository extends Repository $query->where('order_at', '<=', Carbon::parse($conditions['endtime'])); } + if (isset($conditions['sim'])) { + $conditions['sim'] = array_wrap($conditions['sim']); + $query->whereHas('cards', function ($relation) use ($conditions) { + $relation->whereIn('sim', $conditions['sim']); + }); + } + if (isset($conditions['used'])) { $operator = $conditions['used'] ? '>' : '='; $query->whereHas('cards', function ($relation) use ($conditions) { diff --git a/app/Domains/Real/Routes/api.php b/app/Domains/Real/Routes/api.php index 4cab800e..a5958709 100644 --- a/app/Domains/Real/Routes/api.php +++ b/app/Domains/Real/Routes/api.php @@ -1,6 +1,7 @@ group(['prefix' => 'real', 'as' => 'reals', 'middleware' => ['adminAuth']], function ($router) { - $router->get('/orders/index', ['as' => 'orders.index', 'uses' => 'OrderController@index']); - $router->get('/orders/cards', ['as' => 'orders.cards', 'uses' => 'OrderController@cards']); + $router->addRoute(['GET', 'POST'], '/orders/index', ['as' => 'orders.index', 'uses' => 'OrderController@index']); + $router->addRoute(['GET', 'POST'], '/orders/cards', ['as' => 'orders.cards', 'uses' => 'OrderController@cards']); + $router->get('/orders/relations', ['as' => 'orders.relations', 'uses' => 'OrderController@relations']); }); diff --git a/app/Domains/Real/Services/OrderService.php b/app/Domains/Real/Services/OrderService.php index e28c4744..8db40f5c 100644 --- a/app/Domains/Real/Services/OrderService.php +++ b/app/Domains/Real/Services/OrderService.php @@ -9,7 +9,6 @@ use App\Domains\Real\Repositories\OrderRepository; use App\Domains\Real\Repositories\OrderCardPartitionRepository; use App\Domains\Virtual\Repositories\OrderRepository as VirtualOrderRepository; use App\Domains\Virtual\Repositories\OrderCardPartitionRepository as VirtualOrderCardPartitionRepository; -use Carbon\Carbon; class OrderService extends Service { @@ -51,13 +50,14 @@ class OrderService extends Service $item->company_name = CommonService::company($item->company_id)['name']; $item->package = CommonService::package($item->package_id); $item->package_name = $item->package['name']; - $item->carrier_operator_name = $carrierOperators[$item->package['carrier_operator']]; + $item->carrier_operator = $item->package['carrier_operator']; + $item->carrier_operator_name = $carrierOperators[$item->carrier_operator]; $item->unit_price = sprintf('%.02f', $item->unit_price/100); $item->total_price = sprintf('%.02f', $item->total_price/100); $item->shipments = $cards[$item->id] ?? 0; }); - return $res; + return $res->sortByDesc('order_at')->values(); } /** @@ -68,8 +68,11 @@ class OrderService extends Service */ public function cards(array $conditions = []) { - $cards = $this->orderCardPartitionRepository->select(['sim', 'order_id', 'virtual_order_id', 'counts']) - ->withConditions($conditions)->applyConditions()->get(); + set_time_limit(0); + ini_set('memory_limit', '4096m'); + ini_set('default_socket_timeout', -1); + + $cards = $this->orderCardPartitionRepository->withVirtual($conditions)->get(); $tmpCards = $cards->groupBy('virtual_order_id'); @@ -87,33 +90,19 @@ class OrderService extends Service $virtualOrders = app(VirtualOrderRepository::class)->withConditions(['id' => $orderIds])->get()->keyBy('id'); } - $simArray = isset($tmpCards[0]) ? $tmpCards[0]->pluck('sim')->toArray() : []; - - $virtualOrderCards = []; - // 没有订单的从当前状态下读取公司和套餐 - if (!empty($simArray)) { - $virtualOrderCards = app(VirtualOrderCardPartitionRepository::class)->selectRaw('distinct on (sim) sim,company_id,package_id') - ->withConditions([ - 'type' => [0, 1], - 'sim' => $simArray, - ])->newest()->get()->keyBy('sim'); - } - $cards->map(function ($item) use ($virtualOrders, $virtualOrderCards) { $item->sim = (string)$item->sim; - $item->company_name = ''; - $item->package_name = ''; + $item->company_id = $item->company_id ?? 0; + $item->package_id = $item->package_id ?? 0; if ($item->virtual_order_id) { $virtual = $virtualOrders[$item->virtual_order_id]; - } else { - $virtual = $virtualOrderCards[$item->sim]; + $item->company_id = $virtual['company_id']; + $item->package_id = $virtual['package_id']; } - if ($virtual) { - $item->company_name = CompanyService::load($virtual['company_id'])['name']; - $item->package_name = PackageService::load($virtual['package_id'])['name']; - } + $item->company_name = !$item->company_id ? '' : CompanyService::load($item->company_id)['name'] ?? ''; + $item->package_name = !$item->package_id ? '' : PackageService::load($item->package_id)['name'] ?? ''; }); return $cards->sortBy('sim')->sortBy('order_id')->values(); diff --git a/app/Domains/Virtual/Http/Controllers/OrderController.php b/app/Domains/Virtual/Http/Controllers/OrderController.php index 42f369cf..77562042 100644 --- a/app/Domains/Virtual/Http/Controllers/OrderController.php +++ b/app/Domains/Virtual/Http/Controllers/OrderController.php @@ -151,4 +151,18 @@ class OrderController extends Controller return res(true, '删除成功'); } + + /** + * 重置. + * + * @return \Illuminate\Http\Response + */ + public function reset() + { + $ids = $this->request->ids(); + + $this->orderService->reset($ids); + + return res(true, '重置成功'); + } } diff --git a/app/Domains/Virtual/Jobs/CreateRealVirtualRelation.php b/app/Domains/Virtual/Jobs/CreateRealVirtualRelation.php index 9b6ca7db..0910dbd5 100644 --- a/app/Domains/Virtual/Jobs/CreateRealVirtualRelation.php +++ b/app/Domains/Virtual/Jobs/CreateRealVirtualRelation.php @@ -49,7 +49,7 @@ class CreateRealVirtualRelation implements ShouldQueue 'real_package_id' => $value['package_id'], 'virtual_company_id' => $virtualOrder['company_id'], 'virtual_package_id' => $virtualOrder['package_id'], - 'counts' => 1, + 'times' => 1, 'updated_at' => date('Y-m-d H:i:s'), ]; } @@ -59,7 +59,7 @@ class CreateRealVirtualRelation implements ShouldQueue $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, + times=real_virtual_relations.times+excluded.times, updated_at=excluded.updated_at'; $builder->connection->insert($sql, Arr::flatten($array, 1)); diff --git a/app/Domains/Virtual/Routes/api.php b/app/Domains/Virtual/Routes/api.php index ddc24e81..06863759 100644 --- a/app/Domains/Virtual/Routes/api.php +++ b/app/Domains/Virtual/Routes/api.php @@ -48,6 +48,7 @@ $router->group(['prefix' => 'virtual', 'as' => 'virtual', 'middleware' => ['admi $router->post('/orders/create', ['as' => 'orders.create', 'uses' => 'OrderController@create']); $router->post('/orders/update/{id}', ['as' => 'orders.update', 'uses' => 'OrderController@update']); $router->post('/orders/destroy', ['as' => 'orders.destroy', 'uses' => 'OrderController@destroy']); + $router->post('/orders/reset', ['as' => 'orders.reset', 'uses' => 'OrderController@reset']); // 客户管理 $router->get('/cards/index', ['as' => 'cards.index', 'uses' => 'CardController@index']); diff --git a/app/Domains/Virtual/Services/OrderService.php b/app/Domains/Virtual/Services/OrderService.php index 51505137..3aed21e0 100644 --- a/app/Domains/Virtual/Services/OrderService.php +++ b/app/Domains/Virtual/Services/OrderService.php @@ -9,7 +9,9 @@ use Illuminate\Support\Facades\DB; use App\Exceptions\NotExistException; use App\Exceptions\NotAllowedException; use Illuminate\Support\Facades\Validator; +use App\Models\Virtual\OrderCardPartition; use Dipper\Foundation\Exceptions\HttpException; +use Illuminate\Database\Query\Grammars\Grammar; use App\Domains\Virtual\Services\CompanyService; use App\Domains\Virtual\Services\PackageService; use App\Domains\Virtual\Repositories\OrderRepository; @@ -107,7 +109,7 @@ class OrderService extends Service public function store(array $attributes = []) { $rule = [ - 'type' => ['in:0,1,2,3'], + 'type' => ['in:0,1,2,3,-1,-2'], // 转销售 -1,改企业 -2 'company_id' => ['exists:virtual_companies,id'], 'product_id' => [], 'counts' => [], @@ -163,6 +165,28 @@ class OrderService extends Service DB::beginTransaction(); + // 改企业的卡新增一批虚拟卡,并替换原有订单里的卡 + if ($attributes['type'] == -2 && $attributes['selected']) { + $simArray = implode(',', array_pluck($attributes['selected'], 'sim')); + try { + DB::statement("select change_cards('{{$simArray}}'::INT8[]);"); + } catch (\Exception $e) { + DB::rollBack(); + throw $e; + } + } + + // 转销售和该企业的都立即激活卡 + if ($attributes['type'] <0 && $attributes['selected']) { + $params = array_pluck($attributes['selected'], 'sim'); + $sql = 'UPDATE cards SET virtual_activated_at = ? WHERE sim IN (%s)'; + $sql = sprintf($sql, app(Grammar::class)->parameterize($params)); + array_unshift($params, $attributes['order_at']); + DB::update($sql, $params); + + $attributes['type'] = 0; + } + if (!$attributes['id']) { if ($product->company_id != $attributes['company_id']) { throw new NotAllowedException('非法操作'); @@ -229,7 +253,10 @@ class OrderService extends Service $this->orderCardPartitionRepository->forgetCached(); app(RealOrderCardPartitionRepository::class)->forgetCached(); - CreateRealVirtualRelation::dispatch($node->id, array_pluck($attributes['selected'], 'order_id')); + // 销售订单创建企业套餐关联 + if ($node['type'] === 0) { + CreateRealVirtualRelation::dispatch($node->id, array_pluck($attributes['selected'], 'order_id')); + } } catch (\Exception $e) { DB::rollBack(); throw new HttpException('操作失败'); @@ -285,6 +312,41 @@ class OrderService extends Service return $node; } + /** + * 重置 + * + * @return bool + */ + public function reset($ids) + { + $ids = is_array($ids) ? $ids : [$ids]; + + foreach ($ids as $id) { + if (!$node = $this->orderRepository->find($id)) { + throw new NotExistException('订单不存在或已删除'); + } + } + + DB::transaction(function () use ($ids) { + $sql = 'UPDATE virtual_order_cards_partition SET sim=original_sim,original_sim=0 + WHERE original_sim IN ( + SELECT DISTINCT SIM FROM virtual_order_cards_partition WHERE "type"=0 AND order_id IN (%s) + )'; + + $sql = sprintf($sql, app(Grammar::class)->parameterize($ids)); + + DB::statement($sql, $ids); + + $this->orderCardPartitionRepository->whereIn('order_id', $ids)->delete(); + app(RealOrderCardPartitionRepository::class)->whereIn('virtual_order_id', $ids)->update(['virtual_order_id' => 0]); + }); + + app(RealOrderCardPartitionRepository::class)->forgetCached(); + app(RealOrderRepository::class)->forgetCached(); + + return true; + } + /** * 删除 * @@ -300,14 +362,16 @@ class OrderService extends Service } } - DB::transaction(function () use ($ids) { - $this->orderRepository->destroy($ids); - $this->orderCardPartitionRepository->whereIn('order_id', $ids)->delete(); - app(RealOrderCardPartitionRepository::class)->whereIn('virtual_order_id', $ids)->update(['virtual_order_id' => 0]); - }); + $this->orderRepository->destroy($ids); - app(RealOrderCardPartitionRepository::class)->forgetCached(); - app(RealOrderRepository::class)->forgetCached(); + // DB::transaction(function () use ($ids) { + // $this->orderRepository->destroy($ids); + // $this->orderCardPartitionRepository->whereIn('order_id', $ids)->delete(); + // app(RealOrderCardPartitionRepository::class)->whereIn('virtual_order_id', $ids)->update(['virtual_order_id' => 0]); + // }); + + // app(RealOrderCardPartitionRepository::class)->forgetCached(); + // app(RealOrderRepository::class)->forgetCached(); return true; } diff --git a/database/migrations/2018_12_24_164218_create_cards_table.php b/database/migrations/2018_12_24_164218_create_cards_table.php index 1f8e3d4e..739b59e5 100644 --- a/database/migrations/2018_12_24_164218_create_cards_table.php +++ b/database/migrations/2018_12_24_164218_create_cards_table.php @@ -26,7 +26,6 @@ class CreateCardsTable extends Migration $table->timestamp('activated_at')->nullable()->comment('激活时间'); $table->timestamp('virtual_activated_at')->nullable()->comment('虚拟激活时间'); $table->tinyInteger('type')->unsigned()->default(0)->comment('类型(0:真实卡 1:虚拟卡 2:未知卡)'); - $table->integer('real_company_id')->unsigned()->default(0)->comment("企业ID"); $table->timestamp('cancelled_at')->nullable()->comment('注销时间'); $table->timestamps(); diff --git a/database/migrations/create_virtaul_order_cards_func.pgsql b/database/migrations/create_virtaul_order_cards_func.pgsql index 37e3d661..fa7c6fcd 100644 --- a/database/migrations/create_virtaul_order_cards_func.pgsql +++ b/database/migrations/create_virtaul_order_cards_func.pgsql @@ -118,3 +118,56 @@ BEGIN RETURN TRUE; END; $$ LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION CHANGE_CARDS(INT8[]) + RETURNS void +AS +$$ +DECLARE + maxCursor INT2; + params TEXT := ''; + simRow INT8; + query TEXT; +BEGIN + FOREACH simRow IN ARRAY $1 + LOOP + IF SUBSTR(simRow::text, 4, 1)::INT > 4 THEN + RAISE EXCEPTION 'Error Card Sim --> %', simRow USING ERRCODE = '10000'; + END IF; + + params := params || OVERLAY(simRow::text PLACING '_' FROM 4 FOR 1); + END LOOP; + + params := trim('|' from params); + + RAISE NOTICE 'params : %', params; + + SELECT MAX(SUBSTR(sim::text, 4, 1)) INTO maxCursor FROM cards WHERE sim::TEXT SIMILAR TO params; + + + RAISE NOTICE 'maxCursor : %', maxCursor; + + IF maxCursor > 8 THEN + RAISE EXCEPTION 'Max Cursor --> %', maxCursor USING ERRCODE = '10001'; + END IF; + + query := 'WITH new_cards AS ( + SELECT + cards.sim as original_sim, + OVERLAY(cards.sim::TEXT PLACING (4 + t.counts)::TEXT FROM 4 FOR 1)::INT8 as sim, + OVERLAY(imsi::TEXT PLACING (1 + t.counts)::TEXT FROM 3 FOR 1) as imsi, + OVERLAY(iccid::TEXT PLACING (1 + t.counts)::TEXT FROM 5 FOR 1) as iccid, + bloc_id, carrier_operator, activated_at, virtual_activated_at, type, real_company_id, cancelled_at, created_at, updated_at + FROM cards JOIN ( + SELECT OVERLAY(sim::TEXT PLACING $1 FROM 4 FOR 1), COUNT ( * ) AS counts, MIN ( sim ) AS sim FROM cards WHERE sim::TEXT SIMILAR TO $2 GROUP BY 1 + ) AS t ON t.sim = cards.sim + ), new_inserts AS ( + INSERT INTO cards SELECT sim,imsi,iccid,bloc_id, carrier_operator, activated_at, virtual_activated_at, type, real_company_id, cancelled_at, created_at, updated_at FROM new_cards + ) + UPDATE virtual_order_cards_partition SET original_sim=t.original_sim,sim=t.sim FROM (SELECT sim,original_sim FROM new_cards) as t + WHERE virtual_order_cards_partition.sim=t.original_sim'; + + EXECUTE query USING '_', params; +END; +$$ LANGUAGE plpgsql + SET synchronous_commit TO OFF; diff --git a/frontend/src/api/real/orders.js b/frontend/src/api/real/orders.js index 84efb7be..fb745995 100644 --- a/frontend/src/api/real/orders.js +++ b/frontend/src/api/real/orders.js @@ -4,9 +4,7 @@ * @return {[type]} [description] */ export function index(data) { - return service.get('api/real/orders/index', { - params: data - }); + return service.post('api/real/orders/index', data); } /** @@ -15,7 +13,16 @@ export function index(data) { * @return {[type]} [description] */ export function cards(data) { - return service.get('api/real/orders/cards', { + return service.post('api/real/orders/cards', data); +} + +/** + * [relations 关联列表] + * @param {[type]} data [description] + * @return {[type]} [description] + */ +export function relations(data = {}) { + return service.get('api/real/orders/relations', { params: data }); } diff --git a/frontend/src/api/virtual/orders.js b/frontend/src/api/virtual/orders.js index 0eb21dab..f4ffd933 100644 --- a/frontend/src/api/virtual/orders.js +++ b/frontend/src/api/virtual/orders.js @@ -49,3 +49,12 @@ export function update(data, id) { export function destroy(data) { return service.post('api/virtual/orders/destroy', data); } + +/** + * [reset 重置订单] + * @param {[type]} data [description] + * @return {[type]} [description] + */ +export function reset(data) { + return service.post('api/virtual/orders/reset', data); +} diff --git a/frontend/src/mixins/complete.js b/frontend/src/mixins/complete.js index 085376b5..22dc0287 100644 --- a/frontend/src/mixins/complete.js +++ b/frontend/src/mixins/complete.js @@ -62,9 +62,9 @@ export default { initCompletePackages(type = 0) { return new Promise((resolve, reject) => { if (!this.completePackageInitialized) { - this.completePackageInitialized = true; FETCH.packages(type, null, 0).then(res => { if (res.code === 0) { + this.completePackageInitialized = true; this.completePackages = res.data; resolve(res.data); } diff --git a/frontend/src/store/module/order.js b/frontend/src/store/module/order.js index 93bfe2a0..98610b31 100644 --- a/frontend/src/store/module/order.js +++ b/frontend/src/store/module/order.js @@ -1,14 +1,27 @@ import * as API from 'api/real/orders'; const state = { - real_orders: [], - cards: [], + order_group: {}, // 订单组 + real_orders: [], // RD订单 + cards: [], // RD订单卡列表 + relations: [], selected: [], orderParams: {}, - cardParams: {} + cardParams: {}, + real_companies: [], + real_packages: [], + relationParams: {}, + relationObj: { + real_company_id: '', + real_package_id: '', + virtual_company_id: '', + virtual_package_id: '' + } }; const getters = { + relations: state => state.relations, + relationObj: state => state.relationObj, orders: state => state.real_orders, cards: state => state.cards, selected: state => state.selected, @@ -40,15 +53,18 @@ const getters = { return state.selected.find(item => { return item.order_id === order_id && item.sim === sim; }); + }, + real_companies: (state) => { + return state.real_orders.map(el => { return el.company_name; }).filter((v, i, s) => { return s.indexOf(v) === i; }); + }, + real_packages: (state) => { + return state.real_orders.map(el => { return el.package_name; }).filter((v, i, s) => { return s.indexOf(v) === i; }); } }; const mutations = { - SET_CARD_PARAMS(state, obj) { - state.cardParams = obj; - }, - SET_ORDER_PARAMS(state, obj) { - state.orderParams = obj; + SET_ORDER_GROUP(state, data) { + state.order_group = data; }, SET_REAL_ORDERS(state, data) { state.real_orders = data; @@ -56,6 +72,21 @@ const mutations = { SET_CARDS(state, data) { state.cards = data; }, + SET_RELATIONS(state, data) { + state.relations = data; + }, + SET_RELATION_OBJ(state, obj) { + state.relationObj = obj; + }, + SET_RELATION_PARAMS(state, data) { + state.relationParams = data; + }, + SET_CARD_PARAMS(state, obj) { + state.cardParams = obj; + }, + SET_ORDER_PARAMS(state, obj) { + state.orderParams = obj; + }, PUSH_CARDS(state, cards) { state.cards = state.cards.concat(cards.filter(item => { return state.cards.findIndex(v => { @@ -67,9 +98,7 @@ const mutations = { state.selected = data; }, PUSH_SELECTED(state, array) { - let selected = state.selected.map(item => { - return { order_id: item.order_id, sim: item.sim, counts: item.counts }; - }); + let selected = JSON.parse(JSON.stringify(state.selected)); for (let index = 0; index < array.length; index++) { const element = array[index]; @@ -82,7 +111,7 @@ const mutations = { selected.splice(i, 1); } - let obj = { order_id: element.order_id, sim: element.sim, counts: element.counts }; + let obj = element; selected.push(obj); } @@ -91,7 +120,7 @@ const mutations = { }, REMOVE_SELECTED(state, array) { let selected = state.selected.map(item => { - return { order_id: item.order_id, sim: item.sim, counts: item.counts }; + return JSON.parse(JSON.stringify(item)); }); for (let index = 0; index < array.length; index++) { @@ -115,6 +144,36 @@ const mutations = { }; const actions = { + initOrder(context) { + context.commit('SET_RELATION_PARAMS', {}); + context.commit('SET_ORDER_PARAMS', {}); + context.commit('SET_CARD_PARAMS', {}); + context.commit('SET_RELATION_OBJ', {}); + context.commit('SET_ORDER_GROUP', {}); + context.commit('SET_REAL_ORDERS', []); + context.commit('SET_CARDS', []); + context.commit('SET_SELECTED', []); + }, + getRelations(context, params) { + return new Promise((resolve, reject) => { + if (JSON.stringify(context.state.relationParams) == JSON.stringify(params)) { + return resolve(context.state.relations); + } + + context.commit('SET_RELATION_PARAMS', params); + + API.relations(params).then(res => { + if (res.code === 0) { + context.commit('SET_RELATIONS', res.data); + resolve(res.data); + } else { + reject(res); + } + }).catch(err => { + reject(err); + }); + }); + }, getOrders(context, params) { params.limit = 0; return new Promise((resolve, reject) => { @@ -167,8 +226,16 @@ const actions = { } API.cards({ order_id: array, type }).then(res => { + let index = context.state.cards.length; + if (res.code === 0) { - context.commit('PUSH_CARDS', res.data); + let data = res.data; + + data.map(row => { + row._index = index++; + }); + + context.commit('PUSH_CARDS', data); let cards = context.state.cards.filter(v => { return order_id.indexOf(v.order_id) !== -1; @@ -181,6 +248,20 @@ const actions = { reject(err); }); }); + }, + getCardsByParams(context, params) { + return new Promise((resolve, reject) => { + API.cards(params).then(res => { + if (res.code === 0) { + context.commit('PUSH_CARDS', res.data); + resolve(res.data); + } else { + reject(res); + } + }).catch(err => { + reject(err); + }); + }); } }; diff --git a/frontend/src/views/virtual/orders/cards.vue b/frontend/src/views/virtual/orders/cards.vue index 866be62f..3128f6d0 100644 --- a/frontend/src/views/virtual/orders/cards.vue +++ b/frontend/src/views/virtual/orders/cards.vue @@ -6,13 +6,20 @@ @on-visible-change="visibleChange" v-model="my_show" width="1440" - :z-index="source === 0 ? 2000 : 1000" + :z-index="source === 0 ? 1000 : 500" >
+ 企业: + {{item[0].company_name}} +
++ 套餐: + {{item[0].package_name}} +
++ 卡量: + {{item.reduce((acc, cur) => {return acc + cur.counts;}, 0)}} +
+{{message}}
\n选择图标
\n\n0){if(e.strm.data_type===f){e.strm.data_type=oe(e)}ne(e,e.l_desc);ne(e,e.d_desc);l=fe(e);i=e.opt_len+3+7>>>3;s=e.static_len+3+7>>>3;if(s<=i){i=s}}else{i=s=t+5}if(t+4<=i&&r!==-1){he(e,r,t,a)}else if(e.strategy===n||s===i){G(e,(c<<1)+(a?1:0),3);ae(e,D,O)}else{G(e,(u<<1)+(a?1:0),3);le(e,e.l_desc.max_code+1,e.d_desc.max_code+1,l+1);ae(e,e.dyn_ltree,e.dyn_dtree)}J(e);if(a){q(e)}}function pe(e,r,t){e.pending_buf[e.d_buf+e.last_lit*2]=r>>>8&255;e.pending_buf[e.d_buf+e.last_lit*2+1]=r&255;e.pending_buf[e.l_buf+e.last_lit]=t&255;e.last_lit++;if(r===0){e.dyn_ltree[t*2]++}else{e.matches++;r--;e.dyn_ltree[(P[t]+p+1)*2]++;e.dyn_dtree[z(r)*2]++}return e.last_lit===e.lit_bufsize-1}t._tr_init=ue;t._tr_stored_block=he;t._tr_flush_block=ve;t._tr_tally=pe;t._tr_align=de},{"../utils/common":27}],39:[function(e,r,t){"use strict";function a(){this.input=null;this.next_in=0;this.avail_in=0;this.total_in=0;this.output=null;this.next_out=0;this.avail_out=0;this.total_out=0;this.msg="";this.state=null;this.data_type=2;this.adler=0}r.exports=a},{}]},{},[9])(9)});var XLSX={};function make_xlsx_lib(e){e.version="0.13.5";var r=1200,t=1252;if(typeof module!=="undefined"&&typeof require!=="undefined"){if(typeof cptable==="undefined"){if(typeof global!=="undefined")global.cptable=undefined;else if(typeof window!=="undefined")window.cptable=undefined}}var a=[874,932,936,949,950];for(var n=0;n<=8;++n)a.push(1250+n);var i={0:1252,1:65001,2:65001,77:1e4,128:932,129:949,130:1361,134:936,136:950,161:1253,162:1254,163:1258,177:1255,178:1256,186:1257,204:1251,222:874,238:1250,255:1252,69:6969};var s=function(e){if(a.indexOf(e)==-1)return;t=i[0]=e};function f(){s(1252)}var l=function(e){r=e;s(e)};function o(){l(1200);f()}function c(e){var r=[];for(var t=0,a=e.length;t>1;++t)r[t]=String.fromCharCode(e.charCodeAt(2*t)+(e.charCodeAt(2*t+1)<<8));return r.join("")}function h(e){var r=[];for(var t=0;t 0)F[B+K]={level:y};T=-1;break;case"covered-table-cell":++T;if(i.sheetStubs){if(i.dense){if(!g[B])g[B]=[];g[B][T]={t:"z"}}else g[ot({r:B,c:T})]={t:"z"}}break;case"table-cell":;case"数据":if(w[0].charAt(w[0].length-2)==="/"){++T;k=Te(w[0],false);N=parseInt(k["number-columns-repeated"]||"1",10);E={t:"z",v:null};if(k.formula&&i.cellFormula!=false)E.f=Uu(Ae(k.formula));if((k["数据类型"]||k["value-type"])=="string"){E.t="s";E.v=Ae(k["string-value"]||"");if(i.dense){if(!g[B])g[B]=[];g[B][T]=E}else{g[ot({r:B,c:T})]=E}}T+=N-1}else if(w[1]!=="/"){++T;N=1;var Y=P?B+P-1:B;if(T>x.e.c)x.e.c=T;if(T 0)g[B+$][T+N]=ie(E)}else{g[ot({r:B+$,c:T})]=E;while(--N>0)g[ot({r:B+$,c:T+N})]=ie(E)}if(x.e.c<=T)x.e.c=T}}}N=parseInt(k["number-columns-repeated"]||"1",10);T+=N-1;N=0;E={};S=""}U={};break;case"document":;case"document-content":;case"电子表格文档":;case"spreadsheet":;case"主体":;case"scripts":;case"styles":;case"font-face-decls":if(w[1]==="/"){if((l=f.pop())[0]!==w[3])throw"Bad state: "+l}else if(w[0].charAt(w[0].length-2)!=="/")f.push([w[3],true]);break;case"annotation":if(w[1]==="/"){if((l=f.pop())[0]!==w[3])throw"Bad state: "+l;V.t=S;V.a=z;W.push(V)}else if(w[0].charAt(w[0].length-2)!=="/"){f.push([w[3],false])}z="";X=0;S="";_=0;break;case"creator":if(w[1]==="/"){z=s.slice(X,w.index)}else X=w.index+w[0].length;break;case"meta":;case"元数据":;case"settings":;case"config-item-set":;case"config-item-map-indexed":;case"config-item-map-entry":;case"config-item-map-named":;case"shapes":;case"frame":;case"text-box":;case"image":;case"data-pilot-tables":;case"list-style":;case"form":;case"dde-links":;case"event-listeners":;case"chart":if(w[1]==="/"){if((l=f.pop())[0]!==w[3])throw"Bad state: "+l}else if(w[0].charAt(w[0].length-2)!=="/")f.push([w[3],false]);S="";_=0;break;case"scientific-number":break;case"currency-symbol":break;case"currency-style":break;case"number-style":;case"percentage-style":;case"date-style":;case"time-style":if(w[1]==="/"){I[c.name]=u;if((l=f.pop())[0]!==w[3])throw"Bad state: "+l}else if(w[0].charAt(w[0].length-2)!=="/"){u="";c=Te(w[0],false);f.push([w[3],true])}break;case"script":break;case"libraries":break;case"automatic-styles":break;case"master-styles":break;case"default-style":;case"page-layout":break;case"style":break;case"map":break;case"font-face":break;case"paragraph-properties":break;case"table-properties":break;case"table-column-properties":break;case"table-row-properties":break;case"table-cell-properties":break;case"number":switch(f[f.length-1][0]){case"time-style":;case"date-style":o=Te(w[0],false);u+=r[w[3]][o.style==="long"?1:0];break;}break;case"fraction":break;case"day":;case"month":;case"year":;case"era":;case"day-of-week":;case"week-of-year":;case"quarter":;case"hours":;case"minutes":;case"seconds":;case"am-pm":switch(f[f.length-1][0]){case"time-style":;case"date-style":o=Te(w[0],false);u+=r[w[3]][o.style==="long"?1:0];break;}break;case"boolean-style":break;case"boolean":break;case"text-style":break;case"text":if(w[0].slice(-2)==="/>")break;else if(w[1]==="/")switch(f[f.length-1][0]){case"number-style":;case"date-style":;case"time-style":u+=s.slice(h,w.index);break;}else h=w.index+w[0].length;break;case"named-range":o=Te(w[0],false);H=Wu(o["cell-range-address"]);var Z={Name:o.name,Ref:H[0]+"!"+H[1]};if(j)Z.Sheet=b.length;M.Names.push(Z);break;case"text-content":break;case"text-properties":break;case"embedded-text":break;case"body":;case"电子表格":break;case"forms":break;case"table-column":break;case"table-header-rows":break;case"table-rows":break;case"table-column-group":break;case"table-header-columns":break;case"table-columns":break;case"null-date":break;case"graphic-properties":break;case"calculation-settings":break;case"named-expressions":break;case"label-range":break;case"label-ranges":break;case"named-expression":break;case"sort":break;case"sort-by":break;case"sort-groups":break;case"tab":break;case"line-break":break;case"span":break;case"p":;case"文本串":if(w[1]==="/"&&(!k||!k["string-value"]))S=(S.length>0?S+"\\n":"")+e(s.slice(_,w.index),C);else{C=Te(w[0],false);_=w.index+w[0].length}break;case"s":break;case"database-range":if(w[1]==="/")break;try{H=Wu(Te(w[0])["target-range-address"]);m[H[0]]["!autofilter"]={ref:H[1]}}catch(Q){}break;case"date":break;case"object":break;case"title":;case"标题":break;case"desc":break;case"binary-data":break;case"table-source":break;case"scenario":break;case"iteration":break;case"content-validations":break;case"content-validation":break;case"help-message":break;case"error-message":break;case"database-ranges":break;case"filter":break;case"filter-and":break;case"filter-or":break;case"filter-condition":break;case"list-level-style-bullet":break;case"list-level-style-number":break;case"list-level-properties":break;case"sender-firstname":;case"sender-lastname":;case"sender-initials":;case"sender-title":;case"sender-position":;case"sender-email":;case"sender-phone-private":;case"sender-fax":;case"sender-company":;case"sender-phone-work":;case"sender-street":;case"sender-city":;case"sender-postal-code":;case"sender-country":;case"sender-state-or-province":;case"author-name":;case"author-initials":;case"chapter":;case"file-name":;case"template-name":;case"sheet-name":break;case"event-listener":break;case"initial-creator":;case"creation-date":;case"print-date":;case"generator":;case"document-statistic":;case"user-defined":;case"editing-duration":;case"editing-cycles":break;case"config-item":break;case"page-number":break;case"page-count":break;case"time":break;case"cell-range-source":break;case"detective":break;case"operation":break;case"highlighted-range":break;case"data-pilot-table":;case"source-cell-range":;case"source-service":;case"data-pilot-field":;case"data-pilot-level":;case"data-pilot-subtotals":;case"data-pilot-subtotal":;case"data-pilot-members":;case"data-pilot-member":;case"data-pilot-display-info":;case"data-pilot-sort-info":;case"data-pilot-layout-info":;case"data-pilot-field-reference":;case"data-pilot-groups":;case"data-pilot-group":;case"data-pilot-group-member":break;case"rect":break;case"dde-connection-decls":;case"dde-connection-decl":;case"dde-link":;case"dde-source":break;case"properties":break;case"property":break;case"a":if(w[1]!=="/"){U=Te(w[0],false);if(!U.href)break;U.Target=U.href;delete U.href;if(U.Target.charAt(0)=="#"&&U.Target.indexOf(".")>-1){H=Wu(U.Target.slice(1));U.Target="#"+H[0]+"!"+H[1]}}break;case"table-protection":break;case"data-pilot-grand-total":break;case"office-document-common-attrs":break;default:switch(w[2]){case"dc:":;case"calcext:":;case"loext:":;case"ooo:":;case"chartooo:":;case"draw:":;case"style:":;case"chart:":;case"form:":;case"uof:":;case"表:":;case"字:":break;default:if(i.WTF)throw new Error(w);};}var q={Sheets:m,SheetNames:b,Workbook:M};if(i.bookSheets)delete q.Sheets;return q}}();function Np(e,r){r=r||{};var t=!!ve(e,"objectdata");if(t)Na(me(e,"META-INF/manifest.xml"),r);var a=be(e,"content.xml");if(!a)throw new Error("Missing content.xml in "+(t?"ODS":"UOF")+" file");var n=Pp(t?a:We(a),r);if(ve(e,"meta.xml"))n.Props=Xa(me(e,"meta.xml"));return n}function Lp(e,r){return Pp(e,r)}var Mp=function(){var e="0&&u!==x)C[u].name="!MiniFAT";C[m[0]].name="!FAT";C.fat_addrs=m;C.ssz=a;var B={},T=[],y=[],I=[];p(s,C,_,T,n,B,y,u);c(y,I,T);T.shift();var A={FileIndex:y,FullPaths:I};if(r&&r.raw)A.raw={header:w,sectors:_};return A}function f(e){e.chk(R,"Header Signature: ");e.chk(O,"CLSID: ");var r=e._R(2,"u");return[e._R(2,"u"),r]}function l(e,r){var t=9;e.l+=2;switch(t=e._R(2)){case 9:if(r!=3)throw new Error("Sector Shift: Expected 9 saw "+t);break;case 12:if(r!=4)throw new Error("Sector Shift: Expected 12 saw "+t);break;default:throw new Error("Sector Shift: Expected 9 or 12 saw "+t);}e.chk("0600","Mini Sector Shift: ");e.chk("000000000000","Reserved: ")}function o(e,r){var t=Math.ceil(e.length/r)-1;var a=[];for(var n=1;n
").replace(Pe,function(e){return""+("000"+e.charCodeAt(0).toString(16)).slice(-4)+";"})}function Le(e){var r=e+"";return r.replace(Re,function(e){return Ie[e]}).replace(Pe,function(e){return""+e.charCodeAt(0).toString(16).toUpperCase()+";"})}var Me=function(){var e=/(\\d+);/g;function r(e,r){return String.fromCharCode(parseInt(r,10))}return function t(a){return a.replace(e,r)}}();var Ue=function(){return function e(r){return r.replace(/(\\r\\n|[\\r\\n])/g,"
")}}();function He(e){switch(e){case 1:;case true:;case"1":;case"true":;case"TRUE":return true;default:return false;}}var We=function Xm(e){var r="",t=0,a=0,n=0,i=0,s=0,f=0;while(ta.l){a=a.slice(0,a.l);a.l=a.length}if(a.length>0)e.push(a);a=null};var i=function c(e){if(a&&e":a.strike=1;break;case"":break;case"":;case"":a.u=1;break;case"":break;case"":;case"":a.b=1;break;case"":break;case"":;case"":a.i=1;break;case"":break;case"");t.push("")}if(s=="superscript")s="sup";else if(s=="subscript")s="sub";if(s!=""){r.push("<"+s+">");t.push(""+s+">")}t.push("");return n};function f(t){var a=[[],"",[]];var i=t.match(e);if(!i)return"";a[1]=i[1];var f=t.match(r);if(f)s(f[1],a[0],a[2]);return a[0].join("")+a[1].replace(n,"
")+a[2].join("")}return function o(e){return e.replace(t,"").split(a).map(f).join("")}}();var sf=/<(?:\\w+:)?t[^>]*>([^<]*)<\\/(?:\\w+:)?t>/g,ff=/<(?:\\w+:)?r>/;var lf=/<(?:\\w+:)?rPh.*?>([\\s\\S]*?)<\\/(?:\\w+:)?rPh>/g;function of(e,r){var t=r?r.cellHTML:true;var a={};if(!e)return null;if(e.match(/^\\s*<(?:\\w+:)?t[^>]*>/)){a.t=Ae(We(e.slice(e.indexOf(">")+1).split(/<\\/(?:\\w+:)?t>/)[0]||""));a.r=We(e);if(t)a.h=Ne(a.t)}else if(e.match(ff)){a.r=We(e);a.t=Ae(We((e.replace(lf,"").match(sf)||[]).join("").replace(_e,"")));if(t)a.h=nf(a.r)}return a}var cf=/<(?:\\w+:)?sst([^>]*)>([\\s\\S]*)<\\/(?:\\w+:)?sst>/;var uf=/<(?:\\w+:)?(?:si|sstItem)>/g;var hf=/<\\/(?:\\w+:)?(?:si|sstItem)>/;function df(e,r){var t=[],a="";if(!e)return t;var n=e.match(cf);if(n){a=n[2].replace(uf,"").split(hf);for(var i=0;i!=a.length;++i){var s=of(a[i].trim(),r);if(s!=null)t[t.length]=s}n=Te(n[1]);t.Count=n.count;t.Unique=n.uniqueCount}return t}Ia.SST="http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";var vf=/^\\s|\\s$|[\\t\\n\\r]/;function pf(e,r){if(!r.bookSST)return"";var t=[ke];t[t.length]=rr("sst",null,{xmlns:nr.main[0],count:e.Count,uniqueCount:e.Unique});for(var a=0;a!=e.length;++a){if(e[a]==null)continue;var n=e[a];var i="":n.strike=1;break;case""+s+"
");a.push(jv(i,r,e,t));return a.join("")}function Jv(e,r){if(!r)r={};if(!e.SSF)e.SSF=R.get_table();if(e.SSF){D(R);R.load_table(e.SSF);r.revssf=K(e.SSF);r.revssf[e.SSF[65535]]=0;r.ssf=e.SSF;r.cellXfs=[];$u(r.cellXfs,{},{revssf:{General:0}})}var t=[];t.push(Hv(e,r));t.push(Wv(e,r));t.push("");t.push("");for(var a=0;a]*>)/i," ");var o=-1,c=0,u=0,h=0;var d={s:{r:1e7,c:1e7},e:{r:0,c:0}};var v=[];for(s=0;s ";return v+i.join("")+" "}function a(e,r,t){var a=[];return a.join("")+""}var n=\'
"+l);return o.join("")}return{to_workbook:r,to_sheet:e,_row:t,BEGIN:n,END:i,_preamble:a,from_sheet:s}}();function Rp(e,r){var t=r||{};if(p!=null)t.dense=p;var a=t.dense?[]:{};var n=e.getElementsByTagName("tr");var i=t.sheetRows||1e7;var s={s:{r:0,c:0},e:{r:0,c:0}};var f=[],l=0;var o=[];var c=0,u=0,h,d,v,m;for(;c