转销售、改企业

This commit is contained in:
邓皓元 2019-03-14 09:28:33 +08:00
parent fcf5818d7e
commit d2f53423ad
35 changed files with 994 additions and 190 deletions

View File

@ -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);
}
}

View File

@ -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));

View File

@ -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;
}
}

View File

@ -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) {

View File

@ -1,6 +1,7 @@
<?php
$router->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']);
});

View File

@ -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();

View File

@ -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, '重置成功');
}
}

View File

@ -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));

View File

@ -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']);

View File

@ -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;
}

View File

@ -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();

View File

@ -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;

View File

@ -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
});
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
});
});
}
};

View File

@ -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"
>
<div class="page-handle-wrap">
<ul class="handle-wraper bd-b">
<li class="f-l">
<div class="text-exp">
<Button type="text" v-if="counts" @click="sort">已选{{counts}}</Button>
<Row v-if="counts">
<a @click="sort" class="umar-r10">
<b>已选{{counts}}</b>
</a>
<a @click="clear">
<b>清空</b>
</a>
</Row>
<b v-else>全部信息</b>
</div>
</li>
@ -41,7 +48,8 @@
<li class="handle-item w-250">
<Select clearable placeholder="使用状态" v-model="params.used">
<Option :value="0">未使用</Option>
<Option :value="1">已使用</Option>
<Option :value="1">部分使用</Option>
<Option :value="2">全部使用</Option>
</Select>
</li>
@ -58,33 +66,35 @@
<ul class="handle-wraper">
<li class="handle-item w-250">
<AutoComplete
@on-search="handleCompleteCompanies"
<Select
icon="ios-search"
placeholder="企业名称"
v-model.trim="params.company_name"
clearable
filterable
>
<Option
:key="item.id"
:value="item.name"
v-for="item in completeHandledCompanies"
>{{ item.name }}</Option>
</AutoComplete>
:key="index"
:value="item ? item : ''"
v-for="(item, index) in real_companies"
>{{ item }}</Option>
</Select>
</li>
<li class="handle-item w-250">
<AutoComplete
@on-search="handleCompletePackages(type)"
<Select
icon="ios-search"
placeholder="套餐名称"
v-model.trim="params.package_name"
clearable
filterable
>
<Option
:key="item.id"
:value="item.name"
v-for="item in completeHandledPackages"
>{{ item.name }}</Option>
</AutoComplete>
:key="index"
:value="item ? item : ''"
v-for="(item, index) in real_packages"
>{{ item }}</Option>
</Select>
</li>
<li class="handle-item w-250">
@ -152,8 +162,8 @@
</div>
<footer class="ta-c" slot="footer">
<Button @click="clear" class="w-80 umar-r5" ghost type="primary">取消</Button>
<Button v-if="source === 0" :loading="loading" @click="ok" class="w-80" type="primary">确定</Button>
<Button @click="cannel" class="w-80 umar-r5" ghost type="primary">取消</Button>
<Button v-if="source === 0" :loading="loading" @click="close" class="w-80" type="primary">确定</Button>
<Button v-if="source === 1" :loading="loading" @click="order" class="w-80" type="primary">创建订单</Button>
<Button v-if="source === 2" :loading="loading" @click="store" class="w-80" type="primary">提交</Button>
</footer>

View File

@ -6,8 +6,35 @@
@on-visible-change="visibleChange"
v-model="my_show"
width="500"
:mask-style="{ 'z-index': source === 1 ? 2000 : 1000}"
:mask-style="{ 'z-index': source === 1 ? 1000 : 500}"
>
<div v-if="Object.keys(order_group).length" class="order-group-wrap">
<ul>
<li
v-for="(item, index) in order_group"
:key="index"
class="order-group-list"
:class="groupIndex === index ? 'order-group-list-selected' : ''"
@click="selectGroup(item, index)"
>
<p>
<span class="order-group-list-title">企业:</span>
<span class="order-group-list-content">{{item[0].company_name}}</span>
</p>
<p>
<span class="order-group-list-title">套餐:</span>
<span class="order-group-list-content">{{item[0].package_name}}</span>
</p>
<p>
<span class="order-group-list-title">卡量:</span>
<span
class="order-group-list-content"
>{{item.reduce((acc, cur) => {return acc + cur.counts;}, 0)}}</span>
</p>
</li>
</ul>
</div>
<div class="page-edit-wrap uinn-lr20">
<ui-loading :show="loading"></ui-loading>
@ -58,6 +85,8 @@
<Option :value="'bank'">银行转账</Option>
<Option :value="'wx'">微信支付</Option>
<Option :value="'alipay'">支付宝</Option>
<Option :value="'account'">余额支付</Option>
<Option :value="'tmall'">天猫续费</Option>
</Select>
</div>
</li>
@ -157,9 +186,60 @@
<div class="ta-c">
<Button v-if="source === 0" @click="cards" class="w-80 umar-r5" ghost type="success">选卡</Button>
<Button @click="clear" class="w-80 umar-r5" ghost type="primary">取消</Button>
<Button :loading="loading" @click="ok" class="w-80" type="primary">提交</Button>
<Button
:loading="loading"
@click="ok"
class="w-80"
type="warning"
v-if="groupIndex === '0_0'"
>转销售</Button>
<Button :loading="loading" @click="ok" class="w-80" type="primary" v-else>提交</Button>
</div>
</MDrawer>
</template>
<script src="./js/edit.js"></script>
<style lang="less" scoped>
.order-group-wrap {
position: fixed;
top: 0;
right: 500px;
overflow: auto;
height: calc(100%);
.order-group-list {
display: block;
height: 120px;
padding: 15px;
font-size: 11px;
background-color: #fff;
border: 1px solid #ececec;
white-space: nowrap;
text-overflow: ellipsis;
.order-group-list-title {
line-height: 32px;
font-weight: 700;
text-align: right;
}
.order-group-list-content {
line-height: 32px;
text-align: left;
margin-left: 10px;
}
}
.order-group-list:hover {
background-color: #fff;
border-color: #57a3f3;
}
.order-group-list:active {
background-color: #fff;
border-color: #2b85e4;
}
.order-group-list-selected {
color: #2b85e4;
background-color: #fff;
border-color: #2b85e4;
}
}
</style>

View File

@ -157,10 +157,12 @@
<ui-detail :data="detailObj.data" :show.sync="detailObj.show"></ui-detail>
<ui-cards
:orderObj="cardsObj.orderObj"
:source="cardsObj.source"
:show.sync="cardsObj.show"
:type="type"
@create-order="openEdit(true, 1, null)"
@store-success="handleOrderSuccess(1)"
></ui-cards>
<Modal v-model="orderConfirmShow" width="360">

View File

@ -1,4 +1,5 @@
import { mapGetters } from 'vuex';
import * as API from 'api/virtual/orders';
export default {
components: {
@ -16,10 +17,22 @@ export default {
type: {
type: Number,
default: 0
},
orderObj: {
type: Object,
default: null
}
},
computed: {
...mapGetters(['orders', 'cards', 'selected', 'counts', 'getFilterUsedCards', 'getRealOrderById', 'getSelectedByOrderId', 'getCardByOderIdAndSim'])
relationObj: {
get() {
return this.$store.state.order.relationObj;
},
set(value) {
this.$store.commit('SET_RELATION_OBJ', value);
}
},
...mapGetters(['orders', 'cards', 'selected', 'counts', 'getFilterUsedCards', 'getRealOrderById', 'getSelectedByOrderId', 'getCardByOderIdAndSim', 'relations', 'real_companies', 'real_packages'])
},
data() {
return {
@ -36,8 +49,8 @@ export default {
page: 1
},
params: {
company_id: '',
package_id: '',
company_name: '',
package_name: '',
carrier_operator: '',
time: [
this.moment().subtract('2', 'months').startOf('month').format('YYYY-MM-DD'),
@ -46,6 +59,7 @@ export default {
used: '',
sim: ''
},
filterOrders: [],
showOrders: [],
showCards: [],
orderColumns: [
@ -56,15 +70,11 @@ export default {
let value = false;
let indeterminate = false;
let total = this.showOrders.reduce((acc, cur) => {
let total = this.orders.reduce((acc, cur) => {
return acc + cur.counts;
}, 0);
let select = this.getSelectedByOrderId(this.showOrders.map(el => {
return el.id;
}));
let counts = select.reduce((acc, cur) => {
let counts = this.selected.reduce((acc, cur) => {
return acc + cur.counts;
}, 0);
@ -78,7 +88,9 @@ export default {
},
on: {
input: value => {
let order_id = this.showOrders.map(item => {
let order_id = this.filterOrders.filter(el => {
return el.shipments !== el.counts;
}).map(item => {
return item.id;
});
@ -113,23 +125,26 @@ export default {
{
title: "订单编号",
key: "sn",
width: 220
width: 220,
sortable: true
},
{
title: "企业名称",
key: "company_name",
width: 210
width: 210,
sortable: true
},
{
title: "运营商",
key: "carrier_operator_name",
width: 75
width: 80
},
{
title: "套餐名称",
key: "package_name",
width: 150
width: 150,
sortable: true
},
{
title: "支付方式",
@ -139,7 +154,8 @@ export default {
{
title: "数量",
key: "counts",
width: 90
width: 100,
sortable: true
},
{
title: "已用数量",
@ -149,13 +165,15 @@ export default {
{
title: "订单金额",
key: "total_price",
width: 100
width: 120,
sortable: true
},
{
title: "订单时间",
key: "order_at",
width: 150
width: 150,
sortable: true
},
{
title: "所需卡量",
@ -209,7 +227,14 @@ export default {
let cards = this.getFilterUsedCards(this.showCards);
let array = cards.map(item => {
return { order_id: item.order_id, sim: item.sim, counts: item.counts };
return {
order_id: item.order_id,
sim: item.sim,
counts: item.counts,
virtual_order_id: item.virtual_order_id,
company_id: item.company_id,
package_id: item.package_id
};
});
this.$store.commit('PUSH_SELECTED', array);
@ -247,12 +272,9 @@ export default {
{
title: "SIM",
key: "sim",
width: 135
},
{
title: "数量",
key: "counts",
width: 60
width: 135,
sortable: true
},
{
title: "状态",
@ -269,15 +291,22 @@ export default {
);
}
},
{
title: "数量",
key: "counts",
width: 60
},
{
title: "VD企业",
key: "company_name",
width: 210
width: 210,
sortable: true
},
{
title: "VD套餐",
key: "package_name",
width: 150
width: 150,
sortable: true
}
]
};
@ -289,31 +318,38 @@ export default {
if (bool) {
this.index();
}
},
orders(array) {
this.page.total = array.length;
}
},
methods: {
ok() {
this.my_show = false;
},
index(force = 0) {
let params = this.parseParams(this.params);
if (params.type !== this.type) {
params.type = this.type;
this.$store.commit('SET_SELECTED', []);
if (this.params.type != this.type) {
this.params.type = this.type;
this.$store.dispatch('initOrder');
}
this.orderLoading = true;
let params = this.parseParams({ times: this.params.times, type: this.params.type });
if (force) {
this.$store.commit('SET_ORDER_PARAMS', {});
params.skipCache = 1;
}
this.orderLoading = true;
if (this.params.sim !== '') {
params.sim = this.params.sim;
this.cardLoading = true;
this.$store.dispatch("getCardsByParams", params).then((cards) => {
this.showCards = cards;
this.cardLoading = false;
}).catch(() => {
this.cardLoading = false;
});
}
this.$store.dispatch("getOrders", params).then(() => {
this.sortOrders('order_at');
this.changePage(1);
this.orderLoading = false;
}).catch(() => {
@ -326,7 +362,45 @@ export default {
},
changePage(page) {
this.page.page = page;
this.showOrders = this.orders.slice((page - 1) * this.page.limit, page * this.page.limit);
this.filterOrders = JSON.parse(JSON.stringify(this.orders));
if (this.params.company_name !== '' && this.params.company_name !== undefined) {
this.filterOrders = this.filterOrders.filter(el => {
return el.company_name.indexOf(this.params.company_name) !== -1;
});
}
if (this.params.package_name !== '' && this.params.package_name !== undefined) {
this.filterOrders = this.filterOrders.filter(el => {
return el.package_name.indexOf(this.params.package_name) !== -1;
});
}
if (this.params.carrier_operator !== '' && this.params.carrier_operator !== undefined) {
this.filterOrders = this.filterOrders.filter(el => {
return el.carrier_operator === this.params.carrier_operator;
});
}
if (this.params.used !== '' && this.params.used !== undefined) {
this.filterOrders = this.filterOrders.filter(el => {
switch (this.params.used) {
case 0:
return el.shipments === 0;
case 1:
return el.shipments > 0 && el.shipments !== el.counts;
case 2:
return el.shipments > 0 && el.shipments === el.counts;
default:
break;
}
});
}
this.page.total = this.filterOrders.length;
this.showOrders = this.filterOrders.slice((page - 1) * this.page.limit, page * this.page.limit);
},
handleOrderRowDblclick(row) {
this.getCards(row.id);
@ -336,10 +410,16 @@ export default {
this.$emit("update:show", false);
}
},
clear() {
this.$store.commit('SET_REAL_ORDER_SELECTED', []);
close() {
this.my_show = false;
},
clear() {
this.$store.dispatch('initOrder');
},
cannel() {
this.clear();
this.close();
},
resetSearch() {
for (let k in this.params) {
if (k === 'time') {
@ -351,7 +431,9 @@ export default {
this.params[k] = '';
}
}
this.index();
this.$store.dispatch('initOrder');
this.index(1);
},
getCards(order_id) {
this.cardLoading = true;
@ -402,7 +484,7 @@ export default {
});
let arr = cards.map(item => {
return { order_id: item.order_id, sim: item.sim, counts: item.counts };
return JSON.parse(JSON.stringify(item));
});
if (counts !== null) {
@ -419,12 +501,65 @@ export default {
},
handleSelectCards(row, value) {
let action = value ? 'PUSH_SELECTED' : 'REMOVE_SELECTED';
this.$store.commit(action, [{ order_id: row.order_id, sim: row.sim, counts: row.counts }]);
this.$store.commit(action, [row]);
},
order() {
if (this.selected.findIndex(el => { return el.virtual_order_id !== 0; }) !== -1) {
return this.$Message.error('所选数据存在已使用的卡');
}
if (this.type !== 0) {
let group = {};
for (let index = 0; index < this.selected.length; index++) {
const element = this.selected[index];
let key = element.company_id + '_' + element.package_id;
if (group.hasOwnProperty(key)) {
group[key].push(element);
} else {
group[key] = [element];
}
}
if (Object.keys(group).length >= 1) {
this.$store.commit('SET_ORDER_GROUP', group);
}
}
this.$emit('create-order');
},
store() {},
store() {
if (!this.orderObj) {
return this.$Message.error('订单错误');
}
let counts = this.selected.reduce((acc, cur) => {
return acc + cur.counts;
}, 0);
if (this.orderObj.counts !== counts) {
return this.$Message.error('选择的卡数量不正确');
}
let params = {};
params.type = this.type;
params.selected = this.selected.map(el => {
return { order_id: el.order_id, counts: el.counts, sim: el.sim };
});
this.loading = true;
// 编辑
API.update(params, this.orderObj.id).then(res => {
this.loading = false;
if (res.code == 0) {
this.$emit('store-success');
this.$Message.success('操作成功');
this.clear();
}
}).catch(err => {
this.loading = false;
});
},
sort() {
this.showCards = this.cards;
@ -443,6 +578,65 @@ export default {
this.$store.commit('SET_REAL_ORDERS', orders);
this.changePage(1);
},
sortOrders(sortBy = 'times') {
let mapped = [];
if (sortBy === 'order_at') {
mapped = this.orders.map((el, i) => {
return { index: i, order_at: el.order_at };
});
mapped.sort((a, b) => {
if (a.shipments === a.counts) {
return -1;
}
return a.order_at > b.order_at ? -1 : (a.order_at < b.order_at ? 1 : 0);
});
} else {
let virtual_company_id = this.relationObj.virtual_company_id;
let virtual_package_id = this.relationObj.virtual_package_id;
let relations = this.relations;
let sortRules = relations.filter(el => {
if (virtual_company_id !== '' && virtual_package_id !== '') {
if (virtual_company_id == el.virtual_company_id || virtual_package_id == el.virtual_package_id) {
return true;
}
}
return false;
});
mapped = this.orders.map((el, i) => {
let display = -1;
for (let index = 0; index < sortRules.length; index++) {
const element = sortRules[index];
if (element.real_company_id == el.company_id && element.real_package_id == el.package_id) {
display = el[sortBy];
} else if (element.real_company_id == el.company_id) {
display = 0;
} else if (element.real_package_id == el.package_id) {
display = 0;
}
}
return { index: i, display };
});
mapped.sort((a, b) => {
return a.display > b.display ? -1 : (a.display < b.display ? 1 : 0);
});
}
let orders = mapped.map(el => {
return this.orders[el.index];
});
this.$store.commit('SET_REAL_ORDERS', orders);
}
}
};

View File

@ -47,11 +47,29 @@ export default {
address: '',
contacts: '',
mobile: ''
}
},
groupIndex: '',
group: {}
};
},
computed: {
...mapGetters(['selected', 'counts'])
relationObj: {
get() {
return this.$store.state.order.relationObj;
},
set(value) {
this.$store.commit('SET_RELATION_OBJ', value);
}
},
order_group: {
get() {
return this.$store.state.order.order_group;
},
set(value) {
this.$store.commit('SET_ORDER_GROUP', value);
}
},
...mapGetters(['selected', 'counts', 'orders', 'relations'])
},
watch: {
show(bool) {
@ -63,11 +81,7 @@ export default {
});
});
this.initCompletePackages(this.type).then(packages => {
this.completePackagesFilter = packages.filter(function(item) {
return item.status === 0;
});
});
this.handleChange(0);
if (this.data) {
for (let k in this.data) {
@ -76,10 +90,23 @@ export default {
}
}
}
if (this.selected.length && !Object.keys(this.order_group).length) {
this.setParamsByReal(this.selected);
}
if (Object.keys(this.order_group).length) {
let key = Object.keys(this.order_group)[0];
this.selectGroup(this.order_group[key], key);
}
}
},
counts(value) {
if (value) {
if (this.selected.length && !Object.keys(this.order_group).length) {
this.setParamsByReal(this.selected);
}
this.params.counts = value;
}
}
@ -89,44 +116,67 @@ export default {
this.params.type = this.type;
if (!this.params.company_id) {
this.$Message.info('请选择企业');
return;
return this.$Message.info('请选择企业');
}
if (!this.params.package_id) {
this.$Message.info('请选择套餐');
return;
return this.$Message.info('请选择套餐');
}
if (!this.params.pay_channel) {
this.$Message.info('请选择支付方式');
return;
return this.$Message.info('请选择支付方式');
}
if (!this.params.counts) {
this.$Message.info('请输入订单卡量');
return;
return this.$Message.info('请输入订单卡量');
}
if (!this.params.order_at) {
this.$Message.info('请选择订单时间');
return;
return this.$Message.info('请选择订单时间');
}
if (this.params.contacts && !(/[\s\S]{2,32}/.test(this.params.contacts))) {
this.$Message.info('联系人长度在2-32之间');
return;
return this.$Message.info('联系人长度在2-32之间');
}
if (this.params.mobile && !isPhone(this.params.mobile)) {
this.$Message.info('手机号填写不正确');
return;
return this.$Message.info('手机号填写不正确');
}
if (this.selected.length) {
this.params.selected = this.selected;
}
if (Object.keys(this.order_group).length) {
if (!this.group.length) {
return this.$Message.error('请选择一个订单组');
}
if (this.groupIndex === '0_0') {
// 卡不在VD上转销售
this.params.type = -1;
this.post();
} else if (this.params.company_id !== this.group[0].company_id) {
// 改企业的
this.params.type = -2;
this.$Modal.confirm({
title: '提示',
content: '是否确认修改所选卡的企业?',
onOk: () => {
this.post();
}
});
}
this.params.selected = this.group.map(el => {
return { order_id: el.order_id, counts: el.counts, sim: el.sim };
});
} else if (this.selected.length) {
this.params.selected = this.selected.map(el => {
return { order_id: el.order_id, counts: el.counts, sim: el.sim };
});
this.post();
} else {
this.post();
}
},
post() {
this.loading = true;
if (this.data) {
@ -134,9 +184,7 @@ export default {
API.update(this.params, this.data.id).then(res => {
this.loading = false;
if (res.code == 0) {
this.$emit('update-success');
this.$Message.success('更新成功');
this.clear();
this.handelSuccess();
}
}).catch(err => {
this.loading = false;
@ -146,9 +194,7 @@ export default {
API.create(this.params).then(res => {
this.loading = false;
if (res.code == 0) {
this.$emit('add-success');
this.$Message.success('添加成功');
this.clear();
this.handelSuccess();
}
}).catch(err => {
this.loading = false;
@ -173,27 +219,167 @@ export default {
this.my_show = false;
},
handleChange(type) {
if (type === 1) {
this.params.package_id = '';
this.initCompletePackages(this.type).then(packages => {
this.completePackagesFilter = packages.filter(item => {
return item.status === 0 && item.carrier_operator === this.params.carrier_operator;
let packageType = this.type === 1 ? 0 : this.type;
this.initCompletePackages(packageType).then(packages => {
let completePackagesFilter = [];
completePackagesFilter = packages.filter(item => {
return item.status === 0;
});
if (type === 1) {
this.params.package_id = '';
completePackagesFilter = packages.filter(item => {
return item.carrier_operator === this.params.carrier_operator;
});
});
}
if (type === 2) {
let selectPackage = this.completePackagesFilter.find(item => {
return item.id === this.params.package_id;
});
if (selectPackage) {
this.params.carrier_operator = selectPackage.carrier_operator;
}
}
if (type === 2) {
let selectPackage = packages.find(item => {
return item.id === this.params.package_id;
});
if (selectPackage) {
this.params.carrier_operator = selectPackage.carrier_operator;
}
}
this.completePackagesFilter = completePackagesFilter;
});
},
cards() {
this.relationObj = {
virtual_company_id: this.params.company_id,
virtual_package_id: this.params.package_id
};
this.$emit('select-cards');
},
selectGroup(item, index) {
this.groupIndex = index;
this.group = item;
this.params.company_id = item[0].company_id;
this.params.counts = item.reduce((acc, cur) => { return acc + cur.counts; }, 0);
if ([0, 1].indexOf(this.type)) {
this.params.package_id = item[0].package_id;
this.handleChange(2);
}
this.setParamsByReal(item);
},
setParamsByReal(array) {
let tmp = array.map(el => { return el.company_id + '_' + el.package_id; }).filter((v, i, a) => {
return a.indexOf(v) === i;
});
if (tmp.length > 1) {
return;
}
let order = this.orders.find(el => { return el.id === array[0].order_id; });
if (order) {
switch (order.pay_channel_name) {
case '银行转账':
this.params.pay_channel = 'bank';
break;
case '微信支付':
this.params.pay_channel = 'wx';
break;
case '支付宝':
this.params.pay_channel = 'alipay';
break;
case '余额支付':
this.params.pay_channel = 'account';
break;
case '天猫续费':
this.params.pay_channel = 'tmall';
break;
default:
break;
}
this.params.order_at = order.order_at;
this.params.transaction_no = order.transaction_no;
this.params.contacts = order.contacts;
this.params.mobile = order.mobile;
this.params.remark = order.remark;
this.params.address = order.address;
}
let relations = this.relations.filter(el => {
return array.findIndex(e => { return e.company_id === el.real_company_id && e.package_id === el.real_package_id; }) !== -1;
});
if (relations.length) {
let mappedCompany = this.companies.map(el, i => {
return { index: i, company_id: el.id };
});
mappedCompany = mappedCompany.map(el => {
el.display = 0;
let relation = relations.find(e => { return e.virtual_company_id === el.id; });
if (relation) {
el.display = relation.updated_at;
}
});
mappedCompany.sort((a, b) => {
return a.display > b.display ? 1 : (a.display < b.display ? -1 : 0);
});
this.companies = mappedCompany.map(el => {
return this.companies[el.index];
});
let mappedPackage = this.completePackagesFilter.map(el, i => {
return { index: i, package_id: el.id };
});
mappedPackage = mappedPackage.map(el => {
el.display = 0;
let relation = relations.find(e => { return e.virtual_package_id === el.id; });
if (relation) {
el.display = relation.updated_at;
}
});
mappedPackage.sort((a, b) => {
return a.display > b.display ? 1 : (a.display < b.display ? -1 : 0);
});
this.completePackagesFilter = mappedPackage.map(el => {
return this.completePackagesFilter[el.index];
});
}
},
handelSuccess() {
if (Object.keys(this.order_group).length >= 1) {
let mapped = JSON.parse(JSON.stringify(this.order_group));
this.$store.commit('REMOVE_SELECTED', mapped[this.groupIndex]);
delete mapped[this.groupIndex];
this.order_group = mapped;
if (Object.keys(this.order_group).length >= 1) {
let key = Object.keys(this.order_group)[0];
this.selectGroup(this.order_group[key], key);
}
}
this.$Message.success('操作成功');
if (!this.order_group || Object.keys(this.order_group).length < 1) {
this.clear();
if (this.data) {
this.$emit('update-success');
} else {
this.$emit('add-success');
}
}
}
}
};

View File

@ -419,7 +419,7 @@ export default {
{
title: '操作',
key: 'action',
width: 210,
width: 190,
fixed: 'right',
render: (h, {
row,
@ -469,20 +469,49 @@ export default {
class: ['btn'],
on: {
click: () => {
this.openCards(true, 2);
this.openCards(true, 2, row);
}
}
}, '排单')]));
}
}
if (this.haveJurisdiction('destroy')) {
if (this.haveJurisdiction('destroy') && row.shipments) {
html.push(h('Button', {
props: {
type: 'warning',
size: 'small',
disabled: false
},
class: ['btn'],
on: {
click: () => {
this.$Modal.confirm({
title: '提示',
content: '重置将清空该订单的排单记录,请谨慎操作',
onOk: () => {
this.isShowLoading(true);
API.reset({
ids: row.id
}).then(res => {
if (res.code == 0) {
this.$Message.success('操作成功');
this.request();
}
});
}
});
}
}
}, '重置'));
}
if (this.haveJurisdiction('destroy') && !row.shipments) {
html.push(h('Button', {
props: {
type: 'error',
size: 'small',
disabled: false,
icon: 'md-trash'
disabled: false
},
class: ['btn'],
on: {
@ -572,10 +601,11 @@ export default {
* source 0:选创建订单页面打开 1:从选卡按钮打开 2:从排单按钮打开
* @return {[type]} [description]
*/
openCards(bool, source) {
openCards(bool, source, orderObj = {}) {
this.cardsObj = {
show: bool,
source
source,
orderObj
};
},
@ -684,9 +714,7 @@ export default {
handleOrderSuccess(value) {
let page = value ? this.list_data.current_page : 1;
this.cardsObj.show = false;
this.$store.commit("SET_REAL_ORDER_SELECTED", []);
this.$store.commit("SET_ORDER_PARAMS", {});
this.$store.commit("SET_CARD_PARAMS", {});
this.$store.dispatch('initOrder');
this.index(page);
}
}

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

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

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-12217672.0f76ed17.css rel=prefetch><link href=/css/chunk-68d959cc.4c3a90e7.css rel=prefetch><link href=/js/chunk-00ae0766.d130b440.js rel=prefetch><link href=/js/chunk-07a274ec.47bfd5a6.js rel=prefetch><link href=/js/chunk-12217672.35ad14fb.js rel=prefetch><link href=/js/chunk-68d959cc.dc5e174a.js rel=prefetch><link href=/css/app.d71a8195.css rel=preload as=style><link href=/css/chunk-vendors.5803e894.css rel=preload as=style><link href=/js/app.eb0a5ca2.js rel=preload as=script><link href=/js/chunk-vendors.ed6443e8.js rel=preload as=script><link href=/css/chunk-vendors.5803e894.css rel=stylesheet><link href=/css/app.d71a8195.css rel=stylesheet></head><body><noscript><strong>很抱歉如果没有启用JavaScript程序不能正常工作若要继续使用请启用它。</strong></noscript><div id=app></div><script src=/js/chunk-vendors.ed6443e8.js></script><script src=/js/app.eb0a5ca2.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-12217672.0f76ed17.css rel=prefetch><link href=/css/chunk-aac852ec.251cac58.css rel=prefetch><link href=/js/chunk-00ae0766.3874cd10.js rel=prefetch><link href=/js/chunk-07a274ec.c3ad5dec.js rel=prefetch><link href=/js/chunk-12217672.67e501de.js rel=prefetch><link href=/js/chunk-aac852ec.be64dbbe.js rel=prefetch><link href=/css/app.d71a8195.css rel=preload as=style><link href=/css/chunk-vendors.5803e894.css rel=preload as=style><link href=/js/app.266531a3.js rel=preload as=script><link href=/js/chunk-vendors.ed6443e8.js rel=preload as=script><link href=/css/chunk-vendors.5803e894.css rel=stylesheet><link href=/css/app.d71a8195.css rel=stylesheet></head><body><noscript><strong>很抱歉如果没有启用JavaScript程序不能正常工作若要继续使用请启用它。</strong></noscript><div id=app></div><script src=/js/chunk-vendors.ed6443e8.js></script><script src=/js/app.266531a3.js></script></body></html>

View File

@ -1,7 +1,12 @@
<?php
use App\Domains\Virtual\Jobs\CreateRealVirtualRelation;
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Query\Grammars\Grammar;
use App\Models\Card\Card;
require_once realpath(dirname(__FILE__) . '/TestCase.php');
CreateRealVirtualRelation::dispatchNow(1, [1, 2]);
$res = Card::selectRaw('MAX(SUBSTR(sim::text, 4, 1)) as max')
->whereRaw("sim::text SIMILAR TO '106\d244756200|106\d244756201|106_852546016|104_340502885'")
->first();
dd($res);