diff --git a/app/Domains/Virtual/Commands/Sync/FlowPoolMonthSync.php b/app/Domains/Virtual/Commands/Sync/FlowPoolMonthSync.php index 5229dddb..266eb15f 100644 --- a/app/Domains/Virtual/Commands/Sync/FlowPoolMonthSync.php +++ b/app/Domains/Virtual/Commands/Sync/FlowPoolMonthSync.php @@ -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) { diff --git a/app/Domains/Virtual/Http/Controllers/FlowPoolController.php b/app/Domains/Virtual/Http/Controllers/FlowPoolController.php index 3045e407..7167d5a6 100644 --- a/app/Domains/Virtual/Http/Controllers/FlowPoolController.php +++ b/app/Domains/Virtual/Http/Controllers/FlowPoolController.php @@ -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, '导入成功'); + } } diff --git a/app/Domains/Virtual/Routes/api.php b/app/Domains/Virtual/Routes/api.php index b52612ec..008936c1 100644 --- a/app/Domains/Virtual/Routes/api.php +++ b/app/Domains/Virtual/Routes/api.php @@ -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']); }); diff --git a/frontend/src/api/virtual/flow_pools.js b/frontend/src/api/virtual/flow_pools.js index f86658ad..c6afd88e 100644 --- a/frontend/src/api/virtual/flow_pools.js +++ b/frontend/src/api/virtual/flow_pools.js @@ -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); +} diff --git a/frontend/src/views/virtual/flow_pools/index.vue b/frontend/src/views/virtual/flow_pools/index.vue index 6c6cccaa..427e6896 100644 --- a/frontend/src/views/virtual/flow_pools/index.vue +++ b/frontend/src/views/virtual/flow_pools/index.vue @@ -30,6 +30,10 @@