流量池

This commit is contained in:
邓皓元 2019-04-13 19:45:05 +08:00
parent a90b0f11d4
commit 6f71277e9a
10 changed files with 162 additions and 3 deletions

View File

@ -69,7 +69,17 @@ class FlowPoolMonthSync extends Command
];
}, $items);
$array = array_merge($array, $items);
$items = array_groupBy($items, 'sim');
foreach ($items as $sim => $group) {
if (count($group) > 1) {
$temp = $group[0];
$temp['kilobyte'] = array_sum(array_pluck($group, 'kilobyte'));
$items[$sim] = [$temp];
}
}
$array = array_merge($array, array_collapse($items));
}
DB::transaction(function () use ($array) {

View File

@ -10,12 +10,15 @@ use App\Exceptions\NotExistException;
use App\Models\Virtual\FlowPoolMonth;
use Illuminate\Support\Facades\Schema;
use App\Exceptions\NotAllowedException;
use Illuminate\Support\Facades\Validator;
use App\Exceptions\InvalidArgumentException;
use App\Domains\Export\Services\ExportService;
use App\Domains\Export\Services\ImportService;
use App\Domains\Virtual\Exports\FlowPoolExport;
use App\Domains\Virtual\Services\PackageService;
use App\Domains\Virtual\Services\ProductService;
use App\Domains\Virtual\Services\FlowPoolService;
use App\Domains\Virtual\Repositories\FlowPoolRepository;
use App\Domains\Virtual\Exports\FlowPoolExportDetailExport;
use App\Domains\Virtual\Repositories\OrderCardPartitionRepository;
@ -287,4 +290,78 @@ class FlowPoolController extends Controller
return res($url, '导出成功', 201);
}
/**
* 导入流量卡数据.
*
* @return \Illuminate\Http\Response
*/
public function importFlows()
{
$file = $this->request->file('file');
$data = ImportService::load($file, ['month', 'pool_id', 'sim', 'kilobyte']);
Validator::validate($data, [
'*.month' => ['required'],
'*.pool_id' => ['required'],
'*.sim' => ['required'],
'*.kilobyte' => ['required'],
]);
$flowPools = app(FlowPoolRepository::class)->withConditions(['id' => array_unique(array_pluck($data, 'pool_id'))])->get()->keyBy('id')->toArray();
$simPackage = [];
foreach (array_chunk($data, 1000) as $value) {
$cards = app(OrderCardPartitionRepository::class)->select(['sim', 'package_id'])->withConditions([
'type' => 0,
'sim' => array_pluck($value, 'sim'),
])->get()->pluck('package_id', 'sim')->toArray();
foreach ($cards as $sim => $package_id) {
$simPackage[$sim] = $package_id;
}
}
foreach ($data as &$item) {
if (!isset($simPackage[$item['sim']])) {
throw new NotExistException('卡不在VD上 #:' . $item['sim']);
}
$package_id = $simPackage[$item['sim']];
$pool = $flowPools[$item['pool_id']];
if (!in_array($package_id, $pool['package_ids'])) {
throw new InvalidArgumentException("卡不属于流量池 {$item['pool_id']} #: {$item['sim']}");
}
$item['package_id'] = $simPackage[$item['sim']];
}
DB::transaction(function () use ($data) {
$monthGroupBy = array_groupBy($data, 'month');
foreach ($monthGroupBy as $month => $values) {
$table = FlowPoolService::checkTable($month);
$simGroupBy = array_groupBy($values, 'sim');
foreach ($simGroupBy as $sim => $group) {
if (count($group) > 1) {
$temp = $group[0];
$temp['kilobyte'] = array_sum(array_pluck($group, 'kilobyte'));
$simGroupBy[$sim] = [$temp];
}
}
$values = array_collapse($simGroupBy);
foreach (array_chunk($values, 1000) as $news) {
app(FlowPoolMonth::class)->setTable($table)->upsert($news, ['sim', 'month']);
}
}
});
return res(true, '导入成功');
}
}

View File

@ -78,4 +78,5 @@ $router->group(['prefix' => 'virtual', 'as' => 'virtual', 'middleware' => ['admi
$router->post('/flow-pools/destroy', ['as' => 'flow-pools.destroy', 'uses' => 'FlowPoolController@destroy']);
$router->post('/flow-pools/setting', ['as' => 'flow-pools.setting', 'uses' => 'FlowPoolController@setting']);
$router->addRoute(['GET', 'POST'], '/flow-pools/flows', ['as' => 'flow-pools.flows', 'uses' => 'FlowPoolController@flows']);
$router->post('/flow-pools/import-flows', ['as' => 'flow-pools.import-flows', 'uses' => 'FlowPoolController@importFlows']);
});

View File

@ -118,3 +118,22 @@ export function getFlows(data) {
export function postFlows(data) {
return service.post('api/virtual/flow-pools/flows', data);
}
/**
* [import 属性导入]
* @param {[type]} data [description]
* @return {[type]} [description]
*/
export function importFlows(file) {
let config = {
headers: {
'Content-Type': 'multipart/form-data'
}
};
let params = new FormData();
params.append('file', file);
return service.post('api/virtual/flow-pools/import-flows', params, config);
}

View File

@ -30,6 +30,10 @@
<div class="handle-item">
<Button @click="exportExcel" icon="md-download">导出</Button>
</div>
<div class="handle-item">
<Button @click="importModel = true" type="warning">导入月流量数据</Button>
</div>
</li>
</ul>
@ -125,6 +129,24 @@
:month="moment(options.month).format('YYYY-MM')"
@add-success="index(list_data.current_page)"
></ui-flows>
<Modal v-model="importModel" title="导入流量数据">
<ui-loading :show="page_loading.show"></ui-loading>
<Upload :before-upload="importFlows" action="/" :format="['xls','xlsx','csv']" class="f-l">
<Button type="primary" ghost>导入</Button>
</Upload>
<a
:href="CONFIG.url + 'storage/templates/import-flows.xls'"
download="导入流量数据模板.xls"
class="fz-12 lh-32 umar-l10"
>下载导入模板</a>
<footer class="ta-c" slot="footer">
<Button @click="importModel = false" class="w-80 umar-r5" ghost type="primary">取消</Button>
</footer>
</Modal>
</div>
</template>

View File

@ -36,6 +36,7 @@ export default {
search: {
show: true
},
importModel: false,
table_titles: [{
title: 'ID',
key: 'id',
@ -384,6 +385,20 @@ export default {
}).catch(() => {
this.isShowLoading(false);
});
},
importFlows(file) {
this.isShowLoading(true);
API.importFlows(file).then(res => {
if (res.code === 0) {
this.request();
this.$Message.success(res.message);
this.importModel = false;
}
this.isShowLoading(false);
});
return false;
}
}
};

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-4443c580.c09b5b64.css rel=prefetch><link href=/css/chunk-996b1e80.5cadf3d0.css rel=prefetch><link href=/js/chunk-00ae0766.d130b440.js rel=prefetch><link href=/js/chunk-07a274ec.55e1b3b0.js rel=prefetch><link href=/js/chunk-4443c580.99320ef2.js rel=prefetch><link href=/js/chunk-996b1e80.92847c4e.js rel=prefetch><link href=/css/app.8e379248.css rel=preload as=style><link href=/css/chunk-vendors.3c3b2e85.css rel=preload as=style><link href=/js/app.2d02cf26.js rel=preload as=script><link href=/js/chunk-vendors.ed6443e8.js rel=preload as=script><link href=/css/chunk-vendors.3c3b2e85.css rel=stylesheet><link href=/css/app.8e379248.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.2d02cf26.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-4443c580.c09b5b64.css rel=prefetch><link href=/css/chunk-996b1e80.5cadf3d0.css rel=prefetch><link href=/js/chunk-00ae0766.d130b440.js rel=prefetch><link href=/js/chunk-07a274ec.55e1b3b0.js rel=prefetch><link href=/js/chunk-4443c580.754ef273.js rel=prefetch><link href=/js/chunk-996b1e80.92847c4e.js rel=prefetch><link href=/css/app.8e379248.css rel=preload as=style><link href=/css/chunk-vendors.3c3b2e85.css rel=preload as=style><link href=/js/app.63b37964.js rel=preload as=script><link href=/js/chunk-vendors.ed6443e8.js rel=preload as=script><link href=/css/chunk-vendors.3c3b2e85.css rel=stylesheet><link href=/css/app.8e379248.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.63b37964.js></script></body></html>

Binary file not shown.