diff --git a/.env.dev b/.env.dev index c6d7678d..e208c6e1 100644 --- a/.env.dev +++ b/.env.dev @@ -23,7 +23,7 @@ DB_REAL_PASSWORD=Lnx6vpIrnPMVVtlO DB_VD_OLD_HOST=rm-bp1i7dsf6fi1bc5y2o.mysql.rds.aliyuncs.com DB_VD_OLD_PORT=3306 -DB_VD_OLD_DATABASE=vd-new-11-08 +DB_VD_OLD_DATABASE=vd-new DB_VD_OLD_USERNAME=vduser DB_VD_OLD_PASSWORD=fxft@123 diff --git a/.env.prod b/.env.prod index 36a981c9..168c1049 100644 --- a/.env.prod +++ b/.env.prod @@ -23,7 +23,7 @@ DB_REAL_PASSWORD=Lnx6vpIrnPMVVtlO DB_VD_OLD_HOST=rm-bp1i7dsf6fi1bc5y2o.mysql.rds.aliyuncs.com DB_VD_OLD_PORT=3306 -DB_VD_OLD_DATABASE=vd-new-11-08 +DB_VD_OLD_DATABASE=vd-new DB_VD_OLD_USERNAME=vduser DB_VD_OLD_PASSWORD=fxft@123 diff --git a/app/Domains/Company/Http/Controllers/BootstrapController.php b/app/Domains/Company/Http/Controllers/BootstrapController.php index fd022f89..8230d84f 100644 --- a/app/Domains/Company/Http/Controllers/BootstrapController.php +++ b/app/Domains/Company/Http/Controllers/BootstrapController.php @@ -45,7 +45,13 @@ class BootstrapController extends Controller */ public function products(ProductService $productService) { - $res = $productService->getCompanyProducts($this->account->company_id, $this->request->get('carrier_operator')); + $conditions = [ + 'company_id' => $this->account->company_id, + 'carrier_operator' => $this->request->get('carrier_operator'), + ]; + + $res = $productService->index($conditions); + return res($res, '企业套餐列表', 201); } } diff --git a/app/Domains/Real/Commands/Sync/PackageSync.php b/app/Domains/Real/Commands/Sync/PackageSync.php index d54b6acd..5a7aa6b1 100644 --- a/app/Domains/Real/Commands/Sync/PackageSync.php +++ b/app/Domains/Real/Commands/Sync/PackageSync.php @@ -59,7 +59,7 @@ class PackageSync extends Command 'jxc_package.flows as flows', 'jxc_package.voices as voices', 'jxc_package.short_msg as messages', - 'jxc_package.short_msg_on as has_message_switch', + 'jxc_package.short_msg_on as has_messages', 'jxc_package.lbs as has_lbs', 'jxc_package.flow_cycle as reset_months', 'jxc_package.package_cycle as service_months', @@ -111,7 +111,7 @@ class PackageSync extends Command $item->flows = $basePackage['flows']; $item->voices = $basePackage['voices']; $item->messages = $basePackage['messages']; - $item->has_message_switch = $basePackage['has_message_switch']; + $item->has_messages = $basePackage['has_messages']; $item->has_lbs = $basePackage['has_lbs']; $item->reset_months = $basePackage['reset_months']; }); @@ -221,7 +221,7 @@ class PackageSync extends Command $package['flows'] = intval($package['flows']); $package['voices'] = intval($package['voices']); $package['messages'] = intval($package['messages']); - $package['has_message_switch'] = $package['has_message_switch'] ?? 0; + $package['has_messages'] = $package['has_messages'] ?? 0; $package['has_lbs'] = $package['has_lbs'] ?? 0; $package['reset_months'] = $package['reset_months'] ?? 0; $package['service_months'] = $package['service_months'] ?? 0; diff --git a/app/Domains/Virtual/Commands/Sync/PackageSync.php b/app/Domains/Virtual/Commands/Sync/PackageSync.php index 66b2c65a..dd8b4d75 100644 --- a/app/Domains/Virtual/Commands/Sync/PackageSync.php +++ b/app/Domains/Virtual/Commands/Sync/PackageSync.php @@ -52,6 +52,7 @@ class PackageSync extends Command 'flows' => ($item->tag == 10) ? intval($item->package_value) : 0, 'voices' => ($item->tag == 11) ? intval($item->package_value) : 0, 'messages' => 0, + 'has_messages' => 0, 'has_lbs' => 0, 'reset_months' => ($item->unit === 'year') ? $item->value * 12 : $item->value, 'service_months' => ($item->cycle_unit === 'year') ? $item->cycle_value * 12 : $item->cycle_value, @@ -82,6 +83,7 @@ class PackageSync extends Command 'flows' => empty($item->flows) ? 0 : $item->flows, 'voices' => empty($item->voice_num) ? 0 : $item->voice_num, 'messages' => empty($item->sms_num) ? 0 : $item->sms_num, + 'has_messages' => empty($item->sms_num) ? 0 : 1, 'has_lbs' => ($item->LBS === 10) ? 1 : 0, 'reset_months' => $item->flows_cycle, 'service_months' => $item->service_cycle, @@ -112,6 +114,7 @@ class PackageSync extends Command 'flows' => empty($item->flows) ? 0 : $item->flows, 'voices' => empty($item->voice_num) ? 0 : $item->voice_num, 'messages' => empty($item->sms_num) ? 0 : $item->sms_num, + 'has_messages' => empty($item->sms_num) ? 0 : 1, 'has_lbs' => ($item->LBS === 10) ? 1 : 0, 'reset_months' => $item->flows_cycle, 'service_months' => $item->service_cycle, diff --git a/app/Domains/Virtual/Commands/Sync/ProductSync.php b/app/Domains/Virtual/Commands/Sync/ProductSync.php index 0f2e17ce..0d5ef6a3 100644 --- a/app/Domains/Virtual/Commands/Sync/ProductSync.php +++ b/app/Domains/Virtual/Commands/Sync/ProductSync.php @@ -36,7 +36,7 @@ class ProductSync extends Command $base_price = floatval($value['order_account']) * 100; $products[] = [ - 'sn' => $package['sn'] . '_' . $value['company'] . '_' . $base_price, + 'sn' => strtoupper($package['sn'] . '_' . $value['company'] . '_' . $base_price), 'company_id' => $value['company'], 'package_id' => $package['id'], 'name' => $package['name'] . ' ' . $value['order_account'], diff --git a/app/Domains/Virtual/Http/Controllers/PackageController.php b/app/Domains/Virtual/Http/Controllers/PackageController.php new file mode 100644 index 00000000..68cd1577 --- /dev/null +++ b/app/Domains/Virtual/Http/Controllers/PackageController.php @@ -0,0 +1,81 @@ +request = $request; + $this->packageService = $packageService; + } + + /** + * 套餐列表. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + $conditions = []; + $conditions['limit'] = $this->request->get('limit', 20); + + $packages = $this->packageService->index($conditions); + + return res($packages, '套餐列表', 201); + } + + /** + * 创建. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + $attributes = $this->request->all(); + + $account = $this->packageService->store($attributes); + + return res($account, '创建成功'); + } + + /** + * 编辑. + * + * @return \Illuminate\Http\Response + */ + public function update($id) + { + $attributes = $this->request->all(); + $attributes['id'] = $id; + + $account = $this->packageService->store($attributes); + + return res($account, '修改成功'); + } + + /** + * 删除. + * + * @return \Illuminate\Http\Response + */ + public function destroy() + { + $ids = $this->request->ids(); + + $this->packageService->destroy($ids); + + return res(true, '删除成功'); + } +} diff --git a/app/Domains/Virtual/Http/Controllers/ProductController.php b/app/Domains/Virtual/Http/Controllers/ProductController.php index 5745622f..840f372f 100644 --- a/app/Domains/Virtual/Http/Controllers/ProductController.php +++ b/app/Domains/Virtual/Http/Controllers/ProductController.php @@ -27,12 +27,11 @@ class ProductController extends Controller * * @return \Illuminate\Http\Response */ - public function getCompanyProducts(Dicts $dicts) + public function index(Dicts $dicts) { - $companyId = $this->request->get('company_id'); - $carrierOperator = $this->request->get('carrier_operator'); + $conditions = $this->request->all(); - $products = $this->productService->getCompanyProducts($companyId, $carrierOperator); + $products = $this->productService->index($conditions); $carrierOperators = $dicts->get('carrier_operator'); diff --git a/app/Domains/Virtual/Repositories/ProductRepository.php b/app/Domains/Virtual/Repositories/ProductRepository.php index 2fb66908..315e3359 100644 --- a/app/Domains/Virtual/Repositories/ProductRepository.php +++ b/app/Domains/Virtual/Repositories/ProductRepository.php @@ -62,6 +62,16 @@ class ProductRepository extends Repository $this->model = $this->model->where('company_id', $conditions['company_id']); } + if (isset($conditions['name'])) { + $this->model = $this->model->where('name', 'like', "%{$conditions['name']}%"); + } + + if (isset($conditions['package_name'])) { + $this->model = $this->model->whereHas('package', function ($relation) use ($conditions) { + $relation->where('name', $conditions['package_name']); + }); + } + if (isset($conditions['carrier_operator'])) { $this->model = $this->model->whereHas('package', function ($relation) use ($conditions) { $relation->where('carrier_operator', $conditions['carrier_operator']); diff --git a/app/Domains/Virtual/Routes/api.php b/app/Domains/Virtual/Routes/api.php index 202212fe..157c1290 100644 --- a/app/Domains/Virtual/Routes/api.php +++ b/app/Domains/Virtual/Routes/api.php @@ -10,6 +10,13 @@ $router->group(['prefix' => 'virtual', 'as' => 'virtual', 'middleware' => ['admi $router->get('/fetch/companies', ['as' => 'fetch.companies', 'uses' => 'FetchController@companies']); $router->get('/fetch/packages', ['as' => 'fetch.packages', 'uses' => 'FetchController@packages']); + // 套餐管理 + $router->get('/packages/index', ['as' => 'packages.index', 'uses' => 'PackageController@index']); + $router->get('/packages/show/{id}', ['as' => 'packages.show', 'uses' => 'PackageController@show']); + $router->post('/packages/create', ['as' => 'packages.create', 'uses' => 'PackageController@create']); + $router->post('/packages/update/{id}', ['as' => 'packages.update', 'uses' => 'PackageController@update']); + $router->post('/packages/destroy', ['as' => 'packages.destroy', 'uses' => 'PackageController@destroy']); + // 企业管理 $router->get('/companies/index', ['as' => 'companies.index', 'uses' => 'CompanyController@index']); $router->get('/companies/show/{id}', ['as' => 'companies.show', 'uses' => 'CompanyController@show']); @@ -30,7 +37,7 @@ $router->group(['prefix' => 'virtual', 'as' => 'virtual', 'middleware' => ['admi // $router->post('/company/addresses/destroy', ['as' => 'company.addresses.destroy', 'uses' => 'CompanyAddressController@destroy']); // 企业定价管理 - $router->get('/products/index', ['as' => 'products.index', 'uses' => 'ProductController@getCompanyProducts']); + $router->get('/products/index', ['as' => 'products.index', 'uses' => 'ProductController@index']); $router->post('/products/create', ['as' => 'products.create', 'uses' => 'ProductController@create']); $router->post('/products/update/{id}', ['as' => 'products.update', 'uses' => 'ProductController@update']); $router->post('/products/destroy', ['as' => 'products.destroy', 'uses' => 'ProductController@destroy']); diff --git a/app/Domains/Virtual/Services/CommonService.php b/app/Domains/Virtual/Services/CommonService.php index 626eb887..1902243a 100644 --- a/app/Domains/Virtual/Services/CommonService.php +++ b/app/Domains/Virtual/Services/CommonService.php @@ -36,4 +36,21 @@ class CommonService return ''; } + + /** + * 生成套餐编号 + * + * @param int $type + * @param int $carrierOperator + * @param int $flow + * @param int $serviceMonths + * @return string + */ + public static function generatePackageSn($type, $carrierOperator, $flow, $serviceMonths) + { + $typeSN = ['BS', 'RW', 'RP', 'FP', 'OP', 'AP']; + $carrierOperatorSN = ['LT', 'YD', 'DX', 'QW']; + + return $typeSN[$type] . '_' . $carrierOperatorSN[$carrierOperator] . '_' . $flow . '_' . $serviceMonths; + } } diff --git a/app/Domains/Virtual/Services/PackageService.php b/app/Domains/Virtual/Services/PackageService.php new file mode 100644 index 00000000..5c17cdf4 --- /dev/null +++ b/app/Domains/Virtual/Services/PackageService.php @@ -0,0 +1,142 @@ +packageRepository = $packageRepository; + } + + /** + * 套餐列表 + * + * @param array $conditions + * @return mixed + */ + public function index(array $conditions = []) + { + $limit = $conditions['limit'] ?? 20; + + $packages = $this->packageRepository->withConditions($conditions) + ->applyConditions()->paginate($limit); + + $carrierOperators = app(Dicts::class)->get('carrier_operator'); + + $packages->map(function ($item) use ($carrierOperators) { + $item->carrier_operator_name = $carrierOperators[$item->carrier_operator]; + }); + + return $packages; + } + + /** + * 存储套餐 + * + * @param array $attributes + * @param Package $parent + * @return Package + */ + public function store(array $attributes = []) + { + $attributes = array_only($attributes, array_merge(app(Package::class)->getFillable())); + + $attributes['sn'] = $attributes['sn'] ?? CommonService::generatePackageSn($attributes['type'], $attributes['carrier_operator'], $attributes['flows'], $attributes['service_months']); + + $rule = [ + 'sn' => ['required', 'between:2,32', Rule::unique($this->packageRepository->getTable(), 'sn')->ignore($attributes['id'])], + 'name' => ['required', 'between:2,32', Rule::unique($this->packageRepository->getTable(), 'name')->ignore($attributes['id'])], + 'type' => ['required', 'in:0,2,3'], + 'carrier_operator' => ['required', 'in:0,1,2,3'], + 'cost_price' => ['numeric', 'min:0'], + 'guide_price' => ['numeric', 'min:0'], + 'flows' => ['numeric', 'min:0'], + 'voices' => ['numeric', 'min:0'], + 'messages' => ['numeric', 'min:0'], + 'has_messages' => ['in:0,1'], + 'has_lbs' => ['in:0,1'], + 'reset_months' => ['numeric', "max:{$attributes['service_months']}", 'min:0'], + 'service_months' => ['numeric', 'min:0'], + 'effect_months' => ['numeric', 'min:0'], + 'delay_months' => ['numeric', 'min:0'], + 'description' => ['max:255'], + ]; + + $message = [ + 'sn.required' => '请输入套餐编号', + 'sn.between' => '套餐编号长度不合法', + 'sn.unique' => '套餐编号已经被其他用户所使用', + 'name.required' => '请输入套餐编号', + 'name.between' => '套餐编号长度不合法', + 'name.unique' => '套餐编号已经被其他用户所使用', + 'type.required' => '请选择套餐类型', + 'type.in' => '套餐类型不合法', + 'carrier_operator.required' => '请选择运营商', + 'carrier_operator.in' => '运营商不合法', + 'cost_price.numeric' => '套餐价格必须是数字', + 'guide_price.numeric' => '套餐指导价格必须是数字', + 'flows.numeric' => '套餐指导价格必须是数字', + ]; + + Validator::validate($attributes, $rule, $message); + + $attributes['cost_price'] = floatval($attributes['cost_price']) * 100; + $attributes['guide_price'] = floatval($attributes['guide_price']) * 100; + + if (!$attributes['id']) { + $maxId = Package::withTrashed()->where('type', $attributes['type'])->max('id'); + $attributes['id'] = $maxId ? $maxId + 1 : 1; + $node = $this->packageRepository->create($attributes); + } + + if ($attributes['id']) { + $node = $this->packageRepository->find($attributes['id']); + + if (!$node) { + throw new NotExistException('套餐不存在或已删除'); + } + + // 不能修改的字段 + unset($attributes['type']); + unset($attributes['sn']); + unset($attributes['carrier_operator']); + unset($attributes['flows']); + + $this->packageRepository->setModel($node)->update($attributes); + } + + return $node; + } + + /** + * 删除 + * + * @return bool + */ + public function destroy($ids) + { + $ids = is_array($ids) ? $ids : [$ids]; + + $this->packageRepository->destroy($ids); + + return true; + } +} diff --git a/app/Domains/Virtual/Services/ProductService.php b/app/Domains/Virtual/Services/ProductService.php index 04093ba0..d9fabf9b 100644 --- a/app/Domains/Virtual/Services/ProductService.php +++ b/app/Domains/Virtual/Services/ProductService.php @@ -26,18 +26,13 @@ class ProductService extends Service /** * 获取企业定价列表 * - * @param int $companyId + * @param array $conditions * @return Collection */ - public function getCompanyProducts($companyId, $carrierOperator = null) + public function index(array $conditions = []) { - $conditions = [ - 'company_id' => $companyId, - 'carrier_operator' => $carrierOperator, - ]; - $list = $this->productRepository->with(['company:id,name', 'package:id,name,carrier_operator']) - ->withConditions($conditions)->get(); + ->withConditions($conditions)->applyConditions()->get(); return $list; } diff --git a/database/migrations/2018_11_27_175137_create_base_tables.php b/database/migrations/2018_11_27_175137_create_base_tables.php index 11754b12..d85f061a 100644 --- a/database/migrations/2018_11_27_175137_create_base_tables.php +++ b/database/migrations/2018_11_27_175137_create_base_tables.php @@ -41,15 +41,17 @@ class CreateBaseTables extends Migration $table->tinyInteger('carrier_operator')->unsigned()->default(255)->comment('运营商(0:联通 1:移动 2:电信)'); $table->integer('cost_price')->unsigned()->default(0)->comment('成本价格'); $table->integer('guide_price')->unsigned()->default(0)->comment('指导价格'); + $table->integer('renewal_cost_price')->unsigned()->default(0)->comment('续费成本价格'); + $table->integer('renewal_guide_price')->unsigned()->default(0)->comment('续费指导价格'); $table->integer('flows')->unsigned()->default(0)->comment('套餐流量(M)'); $table->integer('voices')->unsigned()->default(0)->comment('套餐语音(分钟)'); $table->integer('messages')->unsigned()->default(0)->comment('套餐短信(条)'); - $table->tinyInteger('has_message_switch')->unsigned()->default(255)->comment('短信开关(0:无 1:有)'); - $table->tinyInteger('has_lbs')->unsigned()->default(255)->comment('lbs位置服务(0:无 1:有)'); - $table->tinyInteger('reset_months')->unsigned()->default(0)->comment('流量周期(月)'); + $table->tinyInteger('has_messages')->unsigned()->default(255)->comment('是否开通短信服务(0:无 1:有)'); + $table->tinyInteger('has_lbs')->unsigned()->default(255)->comment('是否开通LBS服务(0:无 1:有)'); + $table->tinyInteger('reset_months')->unsigned()->default(0)->comment('重置周期(月)'); $table->tinyInteger('service_months')->unsigned()->default(0)->comment('套餐周期(月)'); $table->tinyInteger('effect_months')->unsigned()->default(0)->comment('生效延迟周期(月)'); - $table->tinyInteger('delay_months')->unsigned()->default(0)->comment('服务器延长周期(月)'); + $table->tinyInteger('delay_months')->unsigned()->default(0)->comment('服务延长周期(月)'); $table->text('description')->nullable()->comment('描述'); $table->timestamps(); $table->softDeletes(); diff --git a/database/migrations/2018_12_12_170419_create_virtual_orders_table.php b/database/migrations/2018_12_12_170419_create_virtual_orders_table.php index 3883c1fe..24b1421a 100644 --- a/database/migrations/2018_12_12_170419_create_virtual_orders_table.php +++ b/database/migrations/2018_12_12_170419_create_virtual_orders_table.php @@ -35,6 +35,7 @@ class CreateVirtualOrdersTable extends Migration $table->string('logistics_no', 64)->default('')->comment('物流单号'); $table->tinyInteger('order_status')->unsigned()->default(0)->after('mobile')->comment('订单状态(0:已下单 1:已取消 2:已出库 3:已发货 4:已签收)'); $table->tinyInteger('transaction_status')->unsigned()->default(0)->after('order_status')->comment('收款状态(0:未收款 1:已收款)'); + $table->text('cancel_remark')->nullable()->comment('取消备注'); $table->text('logistics_remark')->nullable()->comment('物流备注'); $table->text('remark')->nullable()->comment('订单备注'); $table->timestamps(); diff --git a/frontend/src/api/virtual/packages.js b/frontend/src/api/virtual/packages.js new file mode 100644 index 00000000..7fd2a092 --- /dev/null +++ b/frontend/src/api/virtual/packages.js @@ -0,0 +1,42 @@ +/** + * 套餐管理 + */ + +/** + * [index 套餐列表] + * @param {[type]} data [description] + * @return {[type]} [description] + */ +export function index(data) { + return service.get('api/virtual/packages/index', { + params: data + }); +} + +/** + * [create 创建套餐] + * @param {[type]} data [description] + * @return {[type]} [description] + */ +export function create(data) { + return serviceForm.post('api/virtual/packages/create', data); +} + +/** + * [update 修改套餐] + * @param {[type]} data [description] + * @param {[type]} id [角色id] + * @return {[type]} [description] + */ +export function update(data, id) { + return serviceForm.post(`api/virtual/packages/update/${id}`, data); +} + +/** + * [destroy 删除套餐] + * @param {[type]} data [description] + * @return {[type]} [description] + */ +export function destroy(data) { + return service.post('api/virtual/packages/destroy', data); +} diff --git a/frontend/src/mixins/complete.js b/frontend/src/mixins/complete.js index a4446daa..87e7140c 100644 --- a/frontend/src/mixins/complete.js +++ b/frontend/src/mixins/complete.js @@ -34,9 +34,17 @@ export default { this.initCompleteCompanies(); } + let companies = []; + if (this.completeCompaniesPinyinEngine) { - this.completeHandledCompanies = this.completeCompaniesPinyinEngine.query(value); + companies = this.completeCompaniesPinyinEngine.query(value); } + + companies = this.completeCompanies.filter(function(item) { + return (item.name.indexOf(value) !== -1) || (companies.find(element => { return element.id === item.id; })); + }); + + this.completeHandledCompanies = companies; }, initCompletePackages() { return new Promise((resolve, reject) => { @@ -57,9 +65,17 @@ export default { this.initCompletePackages(); } + let packages = []; + if (this.completePackagesPinyinEngine) { - this.completeHandledPackages = this.completePackagesPinyinEngine.query(value); + packages = this.completePackagesPinyinEngine.query(value); } + + packages = this.completePackages.filter(function(item) { + return (item.name.indexOf(value) !== -1) || (packages.find(element => { return element.id === item.id; })); + }); + + this.completeHandledPackages = packages; } } }; diff --git a/frontend/src/router/routes.js b/frontend/src/router/routes.js index ca46da79..c05e56d1 100644 --- a/frontend/src/router/routes.js +++ b/frontend/src/router/routes.js @@ -20,7 +20,8 @@ const routes = [ { path: '/companies', name: 'Companies', component: load('virtual/companies/index'), meta: { title: '企业管理' } }, { path: '/company/accounts', name: 'CompanyAccounts', component: load('virtual/company_accounts/index'), meta: { title: '账号管理' } }, { path: '/products', name: 'Products', component: load('virtual/products/index'), meta: { title: '定价管理' } }, - { path: '/orders', name: 'Orders', component: load('virtual/orders/index'), meta: { title: '订单列表' } } + { path: '/orders', name: 'Orders', component: load('virtual/orders/index'), meta: { title: '订单列表' } }, + { path: '/packages', name: 'Packages', component: load('virtual/packages/index'), meta: { title: '套餐管理' } } ] }, { path: '*', redirect: { path: '/home' } } diff --git a/frontend/src/views/system/permissions/edit.vue b/frontend/src/views/system/permissions/edit.vue index fb1ba5d1..f05a3324 100644 --- a/frontend/src/views/system/permissions/edit.vue +++ b/frontend/src/views/system/permissions/edit.vue @@ -1,189 +1,208 @@ diff --git a/frontend/src/views/system/permissions/index.vue b/frontend/src/views/system/permissions/index.vue index e73c4a97..48821870 100644 --- a/frontend/src/views/system/permissions/index.vue +++ b/frontend/src/views/system/permissions/index.vue @@ -179,7 +179,7 @@
- +
diff --git a/frontend/src/views/virtual/companies/index.vue b/frontend/src/views/virtual/companies/index.vue index 3c81aa3a..117906d6 100644 --- a/frontend/src/views/virtual/companies/index.vue +++ b/frontend/src/views/virtual/companies/index.vue @@ -27,7 +27,7 @@