Browse Source

活动商品的优惠券使用

master
weigang 5 years ago
parent
commit
511dfaf2ff
  1. 4
      app/Constants/v3/ErrorCode.php
  2. 1
      app/Service/v3/Implementations/CouponRecService.php
  3. 25
      app/Service/v3/Implementations/OrderOnlineService.php

4
app/Constants/v3/ErrorCode.php

@ -188,8 +188,8 @@ class ErrorCode extends AbstractConstants
const GOODS_ACTIVITY_RESTRICT_LIMIT = 1155;
/**
* 订单中部分活动商不可使用优惠券
* @Message("活动商户不可使用优惠券")
* 订单中部分活动商不可使用优惠券
* @Message("有活动商品不可使用优惠券")
*/
const GOODS_ACTIVITY_CANNOT_USE_COUPON = 1156;

1
app/Service/v3/Implementations/CouponRecService.php

@ -35,6 +35,7 @@ class CouponRecService implements CouponRecServiceInterface
* @param $marketId
* @param $type
* @param $storeTypeIds
* @return array
*/
public function allForOrderOlAvailable($totalAmount, $userId, $marketId, $type, $storeTypeIds = [])
{

25
app/Service/v3/Implementations/OrderOnlineService.php

@ -100,6 +100,8 @@ class OrderOnlineService implements OrderOnlineServiceInterface
$userAddr = UserAddress::query()->find($userAddrId);
// 获取配送费用
$deliveryAmount = $this->deliveryService->do($userAddr->lat, $userAddr->lng);
// 优惠券数据
$couponRec = CouponRec::query()->lockForUpdate()->whereIn('id', $receiveCouponIds)->get()->toArray();
// 处理购物车数据,计算订单金额、子订单数据处理等
$totalAmount = 0; # 实付金额
@ -127,7 +129,7 @@ class OrderOnlineService implements OrderOnlineServiceInterface
// 用户购物车数据
$cartIds = explode(',', $storeItem->cart_ids);
$carts = ShoppingCart::query()->whereIn('id', $cartIds)->where(['market_id' => $marketId])->get();
$carts = ShoppingCart::query()->whereIn('id', $cartIds)->where(['market_id' => $marketId, 'user_id' => $userId])->get();
foreach ($carts as $k => &$cart) {
// 查个商品
@ -136,18 +138,33 @@ class OrderOnlineService implements OrderOnlineServiceInterface
$goods = Goods::query()->lockForUpdate()->find($cart->goods_id);
$check = $this->goodsService->check($goods->id, $cart->num);
if (true !== $check) {
throw new ErrorCodeException($check, '[商品失效]'.$cart->goods_id);
// throw new ErrorCodeException($check, '[商品失效1]'.$cart->goods_id);
}
} elseif ($cart->activity_type == 2) {
$goods = GoodsActivity::query()->lockForUpdate()->find($cart->goods_id);
$check = $this->goodsActivityService->check($goods->id, $cart->num, $userId);
if (true !== $check) {
throw new ErrorCodeException($check, '[商品失效]'.$cart->goods_id);
// throw new ErrorCodeException($check, '[商品失效2]'.$cart->goods_id);
}
// 活动商品不可用优惠券
if ($goods->can_use_coupon!=1 && $receiveCouponIds) {
throw new ErrorCodeException(ErrorCode::GOODS_ACTIVITY_CANNOT_USE_COUPON, '[商品失效]'.$cart->goods_id);
}
// 活动商品可用优惠券,再校验这些优惠券是不是可以在当前活动类型可用
// receiveCouponIds中是不是有当前活动不可用的优惠券
$couponIds = array_values(array_column($couponRec, 'coupon_id'));
$couponsActivityAvailable = Coupon::query()
->select(['id'])
->whereJsonContains('activity_available', [(string)$goods->type])
->whereIn('id', $couponIds)
->get()->toArray();
$couponsActivityAvailableIds = array_values(array_column($couponsActivityAvailable, 'id'));
if (!empty(array_diff($couponIds, $couponsActivityAvailableIds))) {
throw new ErrorCodeException(ErrorCode::GOODS_ACTIVITY_CANNOT_USE_COUPON, '[商品失效]'.json_encode($couponsActivityAvailableIds));
}
}
if (empty($goods)) {
@ -196,8 +213,6 @@ class OrderOnlineService implements OrderOnlineServiceInterface
// 优惠券的使用
$couponMoney = 0;
// 优惠券数据
$couponRec = CouponRec::query()->lockForUpdate()->whereIn('id', $receiveCouponIds)->get()->toArray();
if (!empty($couponRec)) {
$couponsCanUse = $this->couponRecService->allForOrderOlAvailable($totalAmount, $userId, $marketId, 2, $storeTypeIds);
$couponCanUseIds = array_column($couponsCanUse, 'id');

Loading…
Cancel
Save