diff --git a/app/Domains/Virtual/Http/Controllers/FetchController.php b/app/Domains/Virtual/Http/Controllers/FetchController.php
index 961eb9f6..e74b06cf 100644
--- a/app/Domains/Virtual/Http/Controllers/FetchController.php
+++ b/app/Domains/Virtual/Http/Controllers/FetchController.php
@@ -36,7 +36,7 @@ class FetchController extends Controller
public function packages(PackageRepository $packageRepository)
{
$type = $this->request->ids('type');
- return res($this->search($packageRepository->whereIn('type', $type)), '', 201);
+ return res($this->search($packageRepository->whereIn('type', $type), ['name', 'carrier_operator']), '', 201);
}
/**
@@ -53,7 +53,10 @@ class FetchController extends Controller
$search = $this->request->get('search');
$limit = $this->request->get('limit', 0);
- $results = $repository->select([$primaryKey, $field, 'status'])->get();
+ $field = array_wrap($field);
+ $field = array_merge([$primaryKey, 'status'], $field);
+
+ $results = $repository->select($field)->get();
if ($search) {
$results = $results->filter(function ($item) use ($search, $field) {
diff --git a/app/Domains/Virtual/Http/Controllers/OrderController.php b/app/Domains/Virtual/Http/Controllers/OrderController.php
index 37bf471a..226f4caf 100644
--- a/app/Domains/Virtual/Http/Controllers/OrderController.php
+++ b/app/Domains/Virtual/Http/Controllers/OrderController.php
@@ -107,6 +107,20 @@ class OrderController extends Controller
return res($order, '订单详情', 201);
}
+ /**
+ * 下单
+ */
+ public function create()
+ {
+ $attributes = $this->request->all();
+ $attributes['source'] = 1;
+
+ $res = $this->orderService->store($attributes);
+
+ return res($res, '下单成功');
+ }
+
+
/**
* 编辑.
*
diff --git a/app/Domains/Virtual/Repositories/ProductRepository.php b/app/Domains/Virtual/Repositories/ProductRepository.php
index c2e72057..af035dd4 100644
--- a/app/Domains/Virtual/Repositories/ProductRepository.php
+++ b/app/Domains/Virtual/Repositories/ProductRepository.php
@@ -67,6 +67,14 @@ class ProductRepository extends Repository
$query->where('company_id', $conditions['company_id']);
}
+ if (isset($conditions['package_id'])) {
+ $query->where('package_id', $conditions['package_id']);
+ }
+
+ if (isset($conditions['price'])) {
+ $query->where('price', $conditions['price']);
+ }
+
if (isset($conditions['status'])) {
$query->where('status', $conditions['status']);
}
diff --git a/app/Domains/Virtual/Services/OrderService.php b/app/Domains/Virtual/Services/OrderService.php
index 6a09b49c..2354149d 100644
--- a/app/Domains/Virtual/Services/OrderService.php
+++ b/app/Domains/Virtual/Services/OrderService.php
@@ -96,7 +96,21 @@ class OrderService extends Service
{
$attributes['sn'] = $attributes['sn'] ?: $this->generateSn();
+ if ($attributes['company_id'] && $attributes['package_id'] && isset($attributes['unit_price'])) {
+ $attributes['unit_price'] = intval($attributes['unit_price'] * 100);
+ $product = ProductService::getProduct($attributes['company_id'], $attributes['package_id'], $attributes['unit_price']);
+ } elseif ($attributes['product_id']) {
+ $product = app(ProductRepository::class)->find($attributes['product_id']);
+ }
+
+ if (!$product) {
+ throw new NotExistException('请选择套餐');
+ }
+
+ $attributes['product_id'] = $product->id;
+
$rule = [
+ 'type' => ['required', 'in:0,1,2,3'],
'company_id' => ['exists:virtual_companies,id'],
'product_id' => [],
'counts' => [],
@@ -123,18 +137,17 @@ class OrderService extends Service
$rule['product_id'][] = 'required';
$rule['counts'][] = 'required';
$rule['pay_channel'][] = 'required';
- $rule['contacts'][] = 'required';
- $rule['mobile'][] = 'required';
- $rule['address'][] = 'required';
+
+ if (!$attributes['source']) {
+ $rule['contacts'][] = 'required';
+ $rule['mobile'][] = 'required';
+ $rule['address'][] = 'required';
+ }
}
Validator::validate($attributes, $rule, $message);
if (!$attributes['id']) {
- if (!$product = app(ProductRepository::class)->withConditions(['id' => $attributes['product_id']])->first()) {
- throw new NotExistException('套餐不存在或已删除');
- }
-
if ($product->company_id != $attributes['company_id']) {
throw new NotAllowedException('非法操作');
}
diff --git a/app/Domains/Virtual/Services/PackageService.php b/app/Domains/Virtual/Services/PackageService.php
index c4ecfb77..04c91e11 100644
--- a/app/Domains/Virtual/Services/PackageService.php
+++ b/app/Domains/Virtual/Services/PackageService.php
@@ -151,7 +151,7 @@ class PackageService extends Service
public static function load($id)
{
if (!self::$packages) {
- self::$packages = app(PackageRepository::class)->select(['id', 'name', 'carrier_operator', 'flows', 'service_months', 'status'])->withTrashed()->get()->keyBy('id');
+ self::$packages = app(PackageRepository::class)->select(['id', 'sn', 'name', 'carrier_operator', 'flows', 'service_months', 'status'])->withTrashed()->get()->keyBy('id');
}
return self::$packages[$id];
diff --git a/app/Domains/Virtual/Services/ProductService.php b/app/Domains/Virtual/Services/ProductService.php
index 65393bc5..251296f2 100644
--- a/app/Domains/Virtual/Services/ProductService.php
+++ b/app/Domains/Virtual/Services/ProductService.php
@@ -151,4 +151,32 @@ class ProductService extends Service
{
return strtoupper($packageSn . '_' . $companyId . '_' . $price);
}
+
+ /**
+ * 获取定价
+ *
+ * @param string $sn
+ * @return void
+ */
+ public static function getProduct($companyId, $packageId, $price)
+ {
+ $package = PackageService::load($packageId);
+
+ $product = app(ProductRepository::class)->withConditions([
+ 'company_id' => $companyId,
+ 'package_id' => $packageId,
+ 'price' => $price,
+ ])->first();
+
+ if (!$product) {
+ $product = app(ProductService::class)->store([
+ 'name' => $package['name'] . ' ' . $price,
+ 'company_id' => $companyId,
+ 'package_id' => $package['id'],
+ 'price' => $price/100,
+ ]);
+ }
+
+ return $product;
+ }
}
diff --git a/app/Models/Virtual/Order.php b/app/Models/Virtual/Order.php
index e9a43738..2e71bb14 100644
--- a/app/Models/Virtual/Order.php
+++ b/app/Models/Virtual/Order.php
@@ -90,6 +90,34 @@ class Order extends Model
'extends' => 'array',
];
+ protected $fillable = [
+ 'id',
+ 'sn',
+ 'source',
+ 'type',
+ 'company_id',
+ 'package_id',
+ 'product_id',
+ 'transaction_no',
+ 'pay_channel',
+ 'unit_price',
+ 'counts',
+ 'total_price',
+ 'custom_price',
+ 'order_at',
+ 'area',
+ 'address',
+ 'contacts',
+ 'mobile',
+ 'logistics_company',
+ 'logistics_no',
+ 'order_status',
+ 'transaction_status',
+ 'logistics_remark',
+ 'remark',
+ 'extends',
+ ];
+
public function company()
{
return $this->belongsTo(Company::class, 'company_id', 'id');
diff --git a/frontend/package.json b/frontend/package.json
index 45eb0b04..e97d0dae 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -14,6 +14,7 @@
"blueimp-md5": "^2.10.0",
"file-saver": "^1.3.8",
"iview": "^3.0.1",
+ "iview-area": "^1.6.0",
"jquery": "^3.3.1",
"js-cookie": "^2.2.0",
"moment": "^2.22.2",
diff --git a/frontend/src/assets/css/common.less b/frontend/src/assets/css/common.less
index a71e966c..001f08c9 100644
--- a/frontend/src/assets/css/common.less
+++ b/frontend/src/assets/css/common.less
@@ -796,7 +796,6 @@ table {
page-break-after: left;
margin-left: 120px;
word-break: break-all;
- line-height: 32px;
}
}
diff --git a/frontend/src/main.js b/frontend/src/main.js
index 578f9b3b..24d1f413 100644
--- a/frontend/src/main.js
+++ b/frontend/src/main.js
@@ -2,9 +2,9 @@ import 'iview/dist/styles/iview.css';
import 'css/common.less';
import 'css/layout.less';
import '@riophae/vue-treeselect/dist/vue-treeselect.css';
-
import Vue from 'vue';
import iView from 'iview';
+import iviewArea from 'iview-area';
import Cookies from 'js-cookie';
import Treeselect from '@riophae/vue-treeselect';
import { service, serviceForm } from 'service/service';
@@ -29,6 +29,7 @@ Vue.prototype.moment = moment;
Vue.config.productionTip = false;
Vue.use(iView);
+Vue.use(iviewArea);
Vue.mixin(mixins);
Vue.mixin(complete);
Vue.use(base);
diff --git a/frontend/src/views/virtual/flow_pools/detail.vue b/frontend/src/views/virtual/flow_pools/detail.vue
index 163dd186..7a92cfd3 100644
--- a/frontend/src/views/virtual/flow_pools/detail.vue
+++ b/frontend/src/views/virtual/flow_pools/detail.vue
@@ -8,7 +8,7 @@
>
-
-
- -
-- -
-- -
+- -
+- -
+- -
+- -
+ +