diff --git a/app/Domains/Account/Services/AccountService.php b/app/Domains/Account/Services/AccountService.php index 9ce78c01..2cf4c7dc 100644 --- a/app/Domains/Account/Services/AccountService.php +++ b/app/Domains/Account/Services/AccountService.php @@ -81,7 +81,7 @@ class AccountService extends Service implements JwtServiceContract $rule = [ 'username' => ['username', 'between:2,12', Rule::unique($this->accountRepository->getTable(), 'username')->ignore($attributes['id']), Rule::notIn(config('domain.account.reserved_account'))], - 'nickname' => ['string', 'display_length:2,32'], + 'nickname' => ['string', 'between:2,32'], 'mobile' => ['string', 'cn_phone', Rule::unique($this->accountRepository->getTable(), 'mobile')->ignore($attributes['id'])], 'email' => ['string', 'email', Rule::unique($this->accountRepository->getTable(), 'email')->ignore($attributes['id'])], 'password' => ['string'], diff --git a/app/Domains/File/Services/FileService.php b/app/Domains/File/Services/FileService.php index 30f4a011..4e6de48e 100644 --- a/app/Domains/File/Services/FileService.php +++ b/app/Domains/File/Services/FileService.php @@ -120,17 +120,18 @@ class FileService extends Service $disk = $disk ?: config('filesystems.default'); if ($input['filename']) { - $fileModel = $this->store($file, $input, $disk); + $fileModel = $this->store($file, $input, $disk, true); } else { $fileModel = $this->validateFileInDatabase($file, function (UploadedFile $file, string $md5) use ($input, $disk) { $input['filename'] = $this->generateFilePath($md5); return $this->store($file, $input, $disk); }); + + if ($input['type'] && $input['typeid'] && in_array($input['type'], self::$types)) { + $this->apply($fileModel->id, $input['type'], $input['typeid'], $input['cover'] ?? false); + } } - if ($input['type'] && $input['typeid'] && in_array($input['type'], self::$types)) { - $this->apply($fileModel->id, $input['type'], $input['typeid'], $input['cover'] ?? false); - } return $fileModel; } @@ -243,7 +244,7 @@ class FileService extends Service * @param string $disk * @return mixed */ - protected function store(UploadedFile $file, $input, $disk) + protected function store(UploadedFile $file, $input, $disk, $cover = false) { $disk = $disk ?: config('filesystems.default'); $clientHeight = $input['height'] ?? 0; @@ -280,7 +281,7 @@ class FileService extends Service 'duration' => $clientDuration, ]; - $fileModel = $this->fileRepository->create($new); + $fileModel = $cover ? new FileModel($new) : $this->fileRepository->create($new); return $fileModel; } diff --git a/app/Domains/Permission/Repositories/RoleRepository.php b/app/Domains/Permission/Repositories/RoleRepository.php index 2c95fc24..5a934dfb 100644 --- a/app/Domains/Permission/Repositories/RoleRepository.php +++ b/app/Domains/Permission/Repositories/RoleRepository.php @@ -26,7 +26,7 @@ class RoleRepository extends Repository */ protected $fieldSearchable = [ 'id' => '=', - 'name' => '=', + 'name' => 'like', 'parent_id' => '=', ]; diff --git a/app/Domains/Real/Commands/Sync/MongoSync.php b/app/Domains/Real/Commands/Sync/MongoSync.php index 3c99fa95..0a9336f0 100644 --- a/app/Domains/Real/Commands/Sync/MongoSync.php +++ b/app/Domains/Real/Commands/Sync/MongoSync.php @@ -60,6 +60,7 @@ class MongoSync extends Command 'bloc_id' => $blocs[$value['comId']] ?? 0, 'carrier_operator' => self::$carrierOperators[$value['oType']] ?? 255, 'activated_at' => $activated_at, + 'virtual_activated_at' => $activated_at, 'created_at' => $value['sDate']->toDateTime()->format('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ]; diff --git a/app/Domains/Virtual/Repositories/OrderFlowPackageCardsRepository.php b/app/Domains/Virtual/Repositories/OrderFlowPackageCardsRepository.php new file mode 100644 index 00000000..da969eba --- /dev/null +++ b/app/Domains/Virtual/Repositories/OrderFlowPackageCardsRepository.php @@ -0,0 +1,62 @@ + '=', + 'created_at' => 'like', + ]; + + public function model() { + return Model::class; + } + + /** + * 数据格式化 + * + * @param mixed $result + * + * @return mixed + */ + public function transform($model) + { + return $model->toArray(); + } + + /** + * 查询条件 + * + * @return void + */ + public function withConditions(array $conditions = []) + { + if (isset($conditions['id'])) { + $conditions['id'] = array_wrap($conditions['id']); + $this->model = $this->model->whereIn('id', $conditions['id']); + } + + return $this; + } +} \ No newline at end of file diff --git a/app/Domains/Virtual/Repositories/OrderRenewalCardRepository.php b/app/Domains/Virtual/Repositories/OrderRenewalCardRepository.php new file mode 100644 index 00000000..8501347b --- /dev/null +++ b/app/Domains/Virtual/Repositories/OrderRenewalCardRepository.php @@ -0,0 +1,62 @@ + '=', + 'created_at' => 'like', + ]; + + public function model() { + return Model::class; + } + + /** + * 数据格式化 + * + * @param mixed $result + * + * @return mixed + */ + public function transform($model) + { + return $model->toArray(); + } + + /** + * 查询条件 + * + * @return void + */ + public function withConditions(array $conditions = []) + { + if (isset($conditions['id'])) { + $conditions['id'] = array_wrap($conditions['id']); + $this->model = $this->model->whereIn('id', $conditions['id']); + } + + return $this; + } +} \ No newline at end of file diff --git a/app/Domains/Virtual/Repositories/OrderRenewalPackageCardRepository.php b/app/Domains/Virtual/Repositories/OrderRenewalPackageCardRepository.php new file mode 100644 index 00000000..1bf316a4 --- /dev/null +++ b/app/Domains/Virtual/Repositories/OrderRenewalPackageCardRepository.php @@ -0,0 +1,62 @@ + '=', + 'created_at' => 'like', + ]; + + public function model() { + return Model::class; + } + + /** + * 数据格式化 + * + * @param mixed $result + * + * @return mixed + */ + public function transform($model) + { + return $model->toArray(); + } + + /** + * 查询条件 + * + * @return void + */ + public function withConditions(array $conditions = []) + { + if (isset($conditions['id'])) { + $conditions['id'] = array_wrap($conditions['id']); + $this->model = $this->model->whereIn('id', $conditions['id']); + } + + return $this; + } +} \ No newline at end of file diff --git a/app/Domains/Virtual/Services/PackageService.php b/app/Domains/Virtual/Services/PackageService.php index 2cbc3a6a..97b0c519 100644 --- a/app/Domains/Virtual/Services/PackageService.php +++ b/app/Domains/Virtual/Services/PackageService.php @@ -63,7 +63,7 @@ class PackageService extends Service { $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']); + $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'])], @@ -89,7 +89,7 @@ class PackageService extends Service $message = [ 'sn.required' => '请输入套餐编号', 'sn.between' => '套餐编号长度不合法', - 'sn.unique' => '套餐编号已经被其他用户所使用', + 'sn.unique' => '套餐编号已存在,请重新输入', 'name.required' => '请输入套餐名称', 'name.between' => '套餐名称长度不合法', 'name.unique' => '套餐名称已经被其他用户所使用', diff --git a/app/Domains/Virtual/Services/StatService.php b/app/Domains/Virtual/Services/StatService.php index c6c2f0ff..f68de21a 100644 --- a/app/Domains/Virtual/Services/StatService.php +++ b/app/Domains/Virtual/Services/StatService.php @@ -3,22 +3,43 @@ namespace App\Domains\Virtual\Services; use App\Core\Service; use App\Models\Virtual\Order; +use App\Models\Virtual\OrderCard; use Illuminate\Support\Facades\DB; use App\Domains\Virtual\Repositories\OrderRepository; use App\Domains\Virtual\Repositories\CompanyRepository; +use App\Domains\Virtual\Repositories\OrderCardRepository; +use App\Domains\Virtual\Repositories\OrderRenewalCardRepository; +use App\Domains\Virtual\Repositories\OrderFlowPackageCardsRepository; +use App\Domains\Virtual\Repositories\OrderRenewalPackageCardRepository; class StatService extends Service { + protected $companyRepository; protected $orderRepository; + protected $orderCardRepository; + protected $orderRenewalCardRepository; + protected $orderRenewalPackageCardRepository; + protected $orderFlowPackageCardsRepository; /** * 构造函数 * * @return void */ - public function __construct(OrderRepository $orderRepository) - { + public function __construct( + CompanyRepository $companyRepository, + OrderRepository $orderRepository, + OrderCardRepository $orderCardRepository, + OrderRenewalCardRepository $orderRenewalCardRepository, + OrderRenewalPackageCardRepository $orderRenewalPackageCardRepository, + OrderFlowPackageCardsRepository $orderFlowPackageCardsRepository + ) { + $this->companyRepository = $companyRepository; $this->orderRepository = $orderRepository; + $this->orderCardRepository = $orderCardRepository; + $this->orderRenewalCardRepository = $orderRenewalCardRepository; + $this->orderRenewalPackageCardRepository = $orderRenewalPackageCardRepository; + $this->orderFlowPackageCardsRepository = $orderFlowPackageCardsRepository; } /** @@ -28,7 +49,7 @@ class StatService extends Service */ public function companyIndex(array $conditions = []) { - $companies = app(CompanyRepository::class)->withConditions(array_only($conditions, ['name'])) + $companies = $this->companyRepository->withConditions(array_only($conditions, ['name'])) ->select(['id', 'name'])->applyConditions()->withTrashed()->paginate($conditions['limit']); if (empty($companies)) { @@ -37,28 +58,30 @@ class StatService extends Service $groupBy = 'company_id'; - $select = [$groupBy, DB::raw('sum(counts) as count')]; + $select = [$groupBy, DB::raw('count(*) as counts')]; - $model = Order::select($select)->whereIn('company_id', $companies->pluck('id')->toArray())->groupBy($groupBy); + $model = OrderCard::select($select)->whereIn('company_id', $companies->pluck('id')->toArray())->groupBy($groupBy); - $total = $this->orderRepository->setModel($model)->withConditions(['type' => 0])->get()->pluck('count', 'company_id')->toArray(); + $total = $this->orderCardRepository->setModel(clone $model)->get()->pluck('counts', 'company_id')->toArray(); $conditions = array_only($conditions, ['starttime', 'endtime']); - $count = $this->orderRepository->setModel($model)->withConditions(array_merge($conditions, ['type' => 0])) - ->get()->pluck('count', 'company_id')->toArray(); + $counts = $this->orderCardRepository->setModel(clone $model)->withConditions($conditions)->get()->pluck('counts', 'company_id')->toArray(); - $renewed_count = $this->orderRepository->setModel($model)->withConditions(array_merge($conditions, ['type' => [1, 2]])) - ->get()->pluck('count', 'company_id')->toArray(); + $orderRenewalCard = $this->orderRenewalCardRepository->select($select)->whereIn('company_id', $companies->pluck('id')->toArray())->groupBy($groupBy)->get()->pluck('counts', 'company_id')->toArray(); + $orderRenewalPackage = $this->orderRenewalPackageCardRepository->select($select)->whereIn('company_id', $companies->pluck('id')->toArray())->groupBy($groupBy)->get()->pluck('counts', 'company_id')->toArray(); - $valid_count = $this->orderRepository->setModel($model)->withConditions(array_merge($conditions, ['type' => [1, 2]])) - ->get()->pluck('count', 'company_id')->toArray(); + $renewed_counts = array_merge_sum($orderRenewalCard, $orderRenewalPackage); - $companies->map(function ($item) use ($total, $count, $renewed_count, $valid_count) { + $valid_counts = $this->orderCardRepository->setModel(clone $model)->whereHas('card', function ($query) { + return $query->whereNotNull('virtual_activated_at')->whereNull('cancelled_at'); + })->withConditions($conditions)->get()->pluck('counts', 'company_id')->toArray(); + + $companies->map(function ($item) use ($total, $counts, $renewed_counts, $valid_counts) { $item->total = $total[$item['id']] ?? 0; - $item->count = $count[$item['id']] ?? 0; - $item->renewed_count = $renewed_count[$item['id']] ?? 0; - $item->valid_count = $valid_count[$item['id']] ?? 0; + $item->counts = $counts[$item['id']] ?? 0; + $item->renewed_counts = $renewed_counts[$item['id']] ?? 0; + $item->valid_counts = $valid_counts[$item['id']] ?? 0; }); return $companies; diff --git a/app/Models/Virtual/Order.php b/app/Models/Virtual/Order.php index dd00d1ed..e7e693cf 100644 --- a/app/Models/Virtual/Order.php +++ b/app/Models/Virtual/Order.php @@ -3,13 +3,14 @@ namespace App\Models\Virtual; use App\Core\Model; +use App\Models\Card\Card; use App\Models\Real\OrderCard; use Illuminate\Database\Eloquent\SoftDeletes; use App\Models\Virtual\Relations\OrderRelations; class Order extends Model { - use SoftDeletes, OrderRelations; + use SoftDeletes; protected $table = 'virtual_orders'; @@ -17,5 +18,18 @@ class Order extends Model 'extends' => 'array', ]; - protected $dates = ['order_at']; + public function company() + { + return $this->belongsTo(Company::class, 'company_id', 'id'); + } + + public function package() + { + return $this->belongsTo(Package::class, 'package_id', 'id'); + } + + public function cards() + { + return $this->belongsToMany(Card::class, 'virtual_order_cards', 'sim', 'sim'); + } } diff --git a/app/Models/Virtual/OrderCard.php b/app/Models/Virtual/OrderCard.php index 199181cd..c31fa350 100644 --- a/app/Models/Virtual/OrderCard.php +++ b/app/Models/Virtual/OrderCard.php @@ -12,4 +12,19 @@ class OrderCard extends Model use SoftDeletes, OrderRelations, HasCompositePrimaryKey; protected $table = 'virtual_order_cards'; + + public function renewals() + { + return $this->belongsToMany(Package::class, 'virtual_order_renewal_cards', 'sim', 'package_id', 'sim', 'id'); + } + + public function renewalPackages() + { + return $this->belongsToMany(Package::class, 'virtual_order_renewal_package_cards', 'sim', 'package_id', 'sim', 'id'); + } + + public function flowPackages() + { + return $this->belongsToMany(Package::class, 'virtual_order_flows_package_cards', 'sim', 'package_id', 'sim', 'id'); + } } diff --git a/app/Models/Virtual/OrderRenewalCard.php b/app/Models/Virtual/OrderRenewalCard.php index 6b8d49c2..fa0f7bc1 100644 --- a/app/Models/Virtual/OrderRenewalCard.php +++ b/app/Models/Virtual/OrderRenewalCard.php @@ -10,5 +10,5 @@ class OrderRenewalCard extends Model { use SoftDeletes, OrderRelations; - protected $table = 'virtual_order_renewal_package_cards'; + protected $table = 'virtual_order_renewal_cards'; } diff --git a/app/Models/Virtual/OrderRenewalPackageCard.php b/app/Models/Virtual/OrderRenewalPackageCard.php index 280dc060..31db7d07 100644 --- a/app/Models/Virtual/OrderRenewalPackageCard.php +++ b/app/Models/Virtual/OrderRenewalPackageCard.php @@ -10,5 +10,5 @@ class OrderRenewalPackageCard extends Model { use SoftDeletes, OrderRelations; - protected $table = 'virtual_order_renewal_cards'; + protected $table = 'virtual_order_renewal_package_cards'; } diff --git a/app/Models/Virtual/Relations/OrderRelations.php b/app/Models/Virtual/Relations/OrderRelations.php index 8ad14268..48f73a50 100644 --- a/app/Models/Virtual/Relations/OrderRelations.php +++ b/app/Models/Virtual/Relations/OrderRelations.php @@ -24,7 +24,7 @@ trait OrderRelations return $this->belongsTo(Order::class, 'order_id', 'id'); } - public function cards() + public function card() { return $this->belongsTo(Card::class, 'sim', 'sim'); } diff --git a/app/helpers.php b/app/helpers.php index cd4569c4..33e24698 100644 --- a/app/helpers.php +++ b/app/helpers.php @@ -121,3 +121,25 @@ if (! function_exists('config_path')) { return base_path($path); } } + +if (! function_exists('array_merge_sum')) { + /** + * 合并数组(相同键名相加) + * + * @param array $arr1 + * @param array $arr2 + * @return void + */ + function array_merge_sum(...$arrays) + { + $array = []; + + foreach ($arrays as $item) { + foreach ($item as $key => $value) { + $array[$key] = isset($array[$key]) ? $array[$key] + $value : $value; + } + } + + return $array; + } +} diff --git a/frontend/public/assets/logo_big.png b/frontend/public/assets/logo_big.png index f93c693d..9773b239 100644 Binary files a/frontend/public/assets/logo_big.png and b/frontend/public/assets/logo_big.png differ diff --git a/frontend/public/assets/logo_small.jpg b/frontend/public/assets/logo_small.jpg deleted file mode 100644 index 18abf21e..00000000 Binary files a/frontend/public/assets/logo_small.jpg and /dev/null differ diff --git a/frontend/public/assets/logo_small.png b/frontend/public/assets/logo_small.png new file mode 100644 index 00000000..64d8fff3 Binary files /dev/null and b/frontend/public/assets/logo_small.png differ diff --git a/frontend/public/config.js b/frontend/public/config.js index f21ce279..7e6710ba 100644 --- a/frontend/public/config.js +++ b/frontend/public/config.js @@ -2,7 +2,7 @@ var CONFIG = { title: '流量卡BOSS管理平台', login_background: '/assets/login_background.jpg', logo_big: '/assets/logo_big.png', - logo_small: '/assets/logo_small.jpg', + logo_small: '/assets/logo_small.png', url: (window.location.hostname === 'localhost') ? 'http://v.denghaoyuan.cn' : '/' }; diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico index 97131e9a..260b42d9 100755 Binary files a/frontend/public/favicon.ico and b/frontend/public/favicon.ico differ diff --git a/frontend/src/views/user/accounts/edit.vue b/frontend/src/views/user/accounts/edit.vue index 2ee3c08a..6daa0bf7 100644 --- a/frontend/src/views/user/accounts/edit.vue +++ b/frontend/src/views/user/accounts/edit.vue @@ -47,7 +47,7 @@
  • *密码:
    -
    +
    - +