vd/app/Domains/Virtual/Services/OrderService.php
2018-12-13 15:10:50 +08:00

156 lines
4.7 KiB
PHP

<?php
namespace App\Domains\Virtual\Services;
use App\Dicts;
use App\Core\Service;
use App\Models\Virtual\Order;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\DB;
use App\Exceptions\NotExistException;
use App\Exceptions\NotAllowedException;
use Illuminate\Support\Facades\Validator;
use App\Domains\Virtual\Services\CommonService;
use App\Domains\Virtual\Repositories\OrderRepository;
use App\Domains\Virtual\Repositories\ProductRepository;
class OrderService extends Service
{
protected $orderRepository;
/**
* 构造函数
*
* @return void
*/
public function __construct(OrderRepository $orderRepository)
{
$this->orderRepository = $orderRepository;
}
/**
* 订单列表
*
* @param array $conditions
* @return mixed
*/
public function paginate(array $conditions = [])
{
$limit = $conditions['limit'] ?? 35;
$res = $this->orderRepository->with(['company:id,name','package:id,name,carrier_operator'])
->withConditions($conditions)->orderBy('order_at', 'desc')->paginate($limit);
return $res;
}
/**
* 订单计数
*
* @param array $conditions
* @return mixed
*/
public function count(array $conditions = [])
{
$select = [
DB::raw('COUNT(*) as total_count'),
DB::raw('SUM(custom_price) as total_price'),
DB::raw('SUM(custom_price*transaction_status) as transacted_price'),
];
$res = $this->orderRepository->select($select)->withConditions($conditions)->first()->toArray();
$res['total_price'] = $res['total_price'] ?: 0;
$res['transacted_price'] = $res['transacted_price'] ?: 0;
unset($res['company']);
unset($res['package']);
return $res;
}
/**
* 下单
*
* @param array $attributes
* @return Order
*/
public function store(array $attributes = [])
{
$attributes['sn'] = $attributes['sn'] ?: $this->generateSn();
$rule = [
'company_id' => ['required', 'exists:virtual_companies,id'],
'product_id' => ['required'],
'counts' => ['required'],
'pay_channel' => ['required', Rule::in(array_collapse(app(Dicts::class)->get('pay_channel')))],
'contacts' => ['required', 'display_length:2,32'],
'mobile' => ['required', 'cn_phone'],
'area' => ['required', 'max:255'],
'address' => ['required', 'max:255'],
];
$message = [
'company_id.required' => '请输入企业ID',
'company_id.exists' => '企业不存在或已删除',
'product_id.required' => '请选择套餐',
'counts.required' => '请输入订购数量',
'pay_channel.required' => '请选择支付方式',
'pay_channel.in' => '支付方式不合法',
'contacts.required' => '联系人不能为空',
'contacts.display_length' => '联系人名称长度不合法',
'mobile.required' => '手机号不能为空',
'mobile.cn_phone' => '手机号不合法',
'area.required' => '请选择区域',
'address.required' => '请输入详细地址',
];
Validator::validate($attributes, $rule, $message);
if (!$product = app(ProductRepository::class)->withConditions(['id' => $attributes['product_id']])->first()) {
throw new NotExistException('套餐不存在或已删除');
}
if ($product->company_id != $attributes['company_id']) {
throw new NotAllowedException('非法操作');
}
$attributes['unit_price'] = $product->base_price;
$attributes['total_price'] = $attributes['unit_price'] * $attributes['counts'];
$attributes['custom_price'] = $attributes['unit_price'] * $attributes['counts'];
$attributes['order_at'] = date('Y-m-d H:i:s');
$attributes['package_id'] = $attributes['package_id'] ?? $product->package_id;
if (!$attributes['id']) {
$node = $this->orderRepository->create($attributes);
}
if ($attributes['id']) {
if (!$node = $this->orderRepository->find($attributes['id'])) {
throw new NotExistException('订单不存在或已删除');
}
$this->orderRepository->setModel($node)->update($attributes);
}
return $node;
}
/**
* 取消订单
*
* @return bool
*/
public function cancel($id)
{
}
/**
* 生成订单编号
*
* @return void
*/
public function generateSn()
{
return date('YmdHis') . explode('.', microtime(true))[1] . sprintf('%02d', rand(0, 99));
}
}