unicornshop/app/Service/OrderService.php
2026-04-15 20:16:52 +08:00

291 lines
9.1 KiB
PHP

<?php
/**
* The file was created by Assimon.
*
* @author assimon<ashang@utf8.hk>
* @copyright assimon<ashang@utf8.hk>
* @link http://utf8.hk/
*/
namespace App\Service;
use App\Exceptions\RuleValidationException;
use App\Models\BaseModel;
use App\Models\Coupon;
use App\Models\Goods;
use App\Models\Carmis;
use App\Models\Order;
use App\Rules\SearchPwd;
use App\Rules\VerifyImg;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class OrderService
{
/**
* 商品服务层.
* @var \App\Service\PayService
*/
private $goodsService;
/**
* 优惠码服务层
* @var \App\Service\CouponService
*/
private $couponService;
public function __construct()
{
$this->goodsService = app('Service\GoodsService');
$this->couponService = app('Service\CouponService');
}
/**
* 验证集合
*
* @param Request $request
* @throws RuleValidationException
* @throws \Illuminate\Validation\ValidationException
*
* @author assimon<ashang@utf8.hk>
* @copyright assimon<ashang@utf8.hk>
* @link http://utf8.hk/
*/
public function validatorCreateOrder(Request $request): void
{
$validator = Validator::make($request->all(), [
'gid' => 'required' ,
'email' => ['required', 'email'],
'payway' => ['required', 'integer'],
'search_pwd' => [new SearchPwd()],
'by_amount' => ['required', 'integer', 'min:1'],
'img_verify_code' => [new VerifyImg()],
], [
'by_amount.required' => __('dujiaoka.prompt.buy_amount_format_error'),
'by_amount.integer' => __('dujiaoka.prompt.buy_amount_format_error'),
'by_amount.min' => __('dujiaoka.prompt.buy_amount_format_error'),
'payway.required' => __('dujiaoka.prompt.please_select_mode_of_payment'),
'payway.integer' => __('dujiaoka.prompt.please_select_mode_of_payment'),
'email.required' => __('dujiaoka.prompt.email_format_error'),
'email.email' => __('dujiaoka.prompt.email_format_error'),
'gid.required' => __('dujiaoka.prompt.goods_does_not_exist'),
]);
if ($validator->fails()) {
throw new RuleValidationException($validator->errors()->first());
}
// 极验验证
if (
dujiaoka_config_get('is_open_geetest') == BaseModel::STATUS_OPEN
&&
!Validator::make($request->all(),
['geetest_challenge' => 'geetest',],
[ 'geetest' => __('dujiaoka.prompt.geetest_validate_fail')])
) {
throw new RuleValidationException(__('dujiaoka.prompt.geetest_validate_fail'));
}
}
/**
* 得到商品详情并验证
*
* @param Request $request 请求
* @throws RuleValidationException
*
* @author assimon<ashang@utf8.hk>
* @copyright assimon<ashang@utf8.hk>
* @link http://utf8.hk/
*/
public function validatorGoods(Request $request): Goods
{
// 获得商品详情
$goods = $this->goodsService->detail($request->input('gid'));
// 商品状态验证
$this->goodsService->validatorGoodsStatus($goods);
// 如果有限购
if ($goods->buy_limit_num > 0 && $request->input('by_amount') > $goods->buy_limit_num) {
throw new RuleValidationException(__('dujiaoka.prompt.purchase_limit_exceeded'));
}
// 库存不足
if ($request->input('by_amount') > $goods->in_stock) {
throw new RuleValidationException(__('dujiaoka.prompt.inventory_shortage'));
}
return $goods;
}
/**
* 判断是否有循环卡密
*
* @param int $goodsID 商品id
* @return array|null
*
* @author ZhangYiQiu<me@zhangyiqiu.net>
* @copyright ZhangYiQiu<me@zhangyiqiu.net>
* @link http://zhangyiqiu.net/
*/
public function validatorLoopCarmis(Request $request)
{
$carmis = Carmis::query()
->where('goods_id', $request->input('gid'))
->where('status', Carmis::STATUS_UNSOLD)
->where('is_loop', true)
->count();
if($carmis > 0 && $request->input('by_amount') > 1){
throw new RuleValidationException(__('dujiaoka.prompt.loop_carmis_limit'));
}
return $carmis;
}
/**
* 优惠码验证
*
* @param Request $request
* @return Coupon|null
* @throws RuleValidationException
*
* @author assimon<ashang@utf8.hk>
* @copyright assimon<ashang@utf8.hk>
* @link http://utf8.hk/
*/
public function validatorCoupon(Request $request):? Coupon
{
// 如果提交了优惠码
if ($request->filled('coupon_code')) {
// 查询优惠码是否存在
$coupon = $this->couponService->withHasGoods($request->input('coupon_code'), $request->input('gid'));
// 此商品没有这个优惠码
if (empty($coupon)) {
throw new RuleValidationException(__('dujiaoka.prompt.coupon_does_not_exist'));
}
// 剩余次数不足
if ($coupon->ret <= 0) {
throw new RuleValidationException(__('dujiaoka.prompt.coupon_lack_of_available_opportunities'));
}
return $coupon;
}
return null;
}
/**
* 代充框验证.
*
* @param Goods $goods
* @param Request $request
* @return string
* @throws RuleValidationException
*
* @author assimon<ashang@utf8.hk>
* @copyright assimon<ashang@utf8.hk>
* @link http://utf8.hk/
*/
public function validatorChargeInput(Goods $goods, Request $request): string
{
$otherIpt = '';
// 代充框验证
if ($goods->type == Goods::MANUAL_PROCESSING && !empty($goods->other_ipu_cnf)) {
// 如果有其他输入框 判断其他输入框内容 然后载入信息
$formatIpt = format_charge_input($goods->other_ipu_cnf);
foreach ($formatIpt as $item) {
if ($item['rule'] && !$request->filled($item['field'])) {
$errMessage = $item['desc'] . __('dujiaoka.prompt.can_not_be_empty');
throw new RuleValidationException($errMessage);
}
$otherIpt .= $item['desc'].':'.$request->input($item['field']) . PHP_EOL;
}
}
return $otherIpt;
}
/**
* 通过订单号查询订单
* @param string $orderSN
* @return Order
*
* @author assimon<ashang@utf8.hk>
* @copyright assimon<ashang@utf8.hk>
* @link http://utf8.hk/
*/
public function detailOrderSN(string $orderSN):? Order
{
$order = Order::query()->with(['coupon', 'pay', 'goods'])->where('order_sn', $orderSN)->first();
return $order;
}
/**
* 根据订单号过期订单.
*
* @param string $orderSN
* @return bool
*
* @author assimon<ashang@utf8.hk>
* @copyright assimon<ashang@utf8.hk>
* @link http://utf8.hk/
*/
public function expiredOrderSN(string $orderSN): bool
{
return Order::query()->where('order_sn', $orderSN)->update(['status' => Order::STATUS_EXPIRED]);
}
/**
* 设置订单优惠码已回退
*
* @param string $orderSN
* @return bool
*
* @author assimon<ashang@utf8.hk>
* @copyright assimon<ashang@utf8.hk>
* @link http://utf8.hk/
*/
public function couponIsBack(string $orderSN): bool
{
return Order::query()->where('order_sn', $orderSN)->update(['coupon_ret_back' => Order::COUPON_BACK_OK]);
}
/**
* 通过邮箱和查询密码查询
*
* @param string $email 邮箱
* @param string $searchPwd 查询面面
* @return array|\Illuminate\Database\Concerns\BuildsQueries[]|\Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Query\Builder[]|\Illuminate\Support\Collection
*
* @author assimon<ashang@utf8.hk>
* @copyright assimon<ashang@utf8.hk>
* @link http://utf8.hk/
*/
public function withEmailAndPassword(string $email, string $searchPwd = '')
{
return Order::query()
->where('email', $email)
->when(!empty($searchPwd), function ($query) use ($searchPwd) {
$query->where('search_pwd', $searchPwd);
})
->orderBy('created_at', 'DESC')
->take(5)
->get();
}
/**
* 通过订单号集合查询
*
* @param array $orderSNS 订单号集合
* @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database\Query\Builder[]|\Illuminate\Support\Collection
*
* @author assimon<ashang@utf8.hk>
* @copyright assimon<ashang@utf8.hk>
* @link http://utf8.hk/
*/
public function byOrderSNS(array $orderSNS)
{
return Order::query()
->whereIn('order_sn', $orderSNS)
->orderBy('created_at', 'DESC')
->take(5)
->get();
}
}