Browse Source

Merge branch '0927-deal-redis' into master

# Conflicts:
#	app/Service/v3/Implementations/GoodsService.php
master
weigang 5 years ago
parent
commit
79468ad9fe
  1. 198
      app/Service/v3/Implementations/BadgeService.php
  2. 14
      app/Service/v3/Implementations/GoodsActivityService.php
  3. 47
      app/Service/v3/Implementations/GoodsInventoryService.php
  4. 12
      app/Service/v3/Implementations/GoodsService.php
  5. 101
      app/Service/v3/Implementations/OrderOnlineService.php
  6. 6
      app/Service/v3/Interfaces/BadgeServiceInterface.php
  7. 33
      app/Service/v3/Interfaces/GoodsInventoryServiceInterface.php
  8. 1
      config/autoload/dependencies.php

198
app/Service/v3/Implementations/BadgeService.php

@ -77,14 +77,36 @@ class BadgeService implements BadgeServiceInterface
public function allByUserOrder($userId) public function allByUserOrder($userId)
{ {
$redis = ApplicationContext::getContainer()->get(Redis::class); $redis = ApplicationContext::getContainer()->get(Redis::class);
$redisHName = 'badge:user';
$redisHKey = 'user_id_'.$userId;
// 取出当前用户的key的badge(key=>value json串)
$userBadges = $redis->hGet($redisHName, $redisHKey);
$userBadges = json_decode($userBadges, true);
return [ return [
'unpaid' => count($redis->sMembers('badge_unpaid_user_'.$userId)),
'receiving' => count($redis->sMembers('badge_receiving_user_'.$userId)),
'finish' => count($redis->sMembers('badge_finish_user_'.$userId)),
'refund' => count($redis->sMembers('badge_refund_user_'.$userId)),
'canceled' => count($redis->sMembers('badge_canceled_user_'.$userId)),
'rejection' => count($redis->sMembers('badge_rejection_store_'.$userId)),
'unpaid' => isset($userBadges['unpaid']) ? count($userBadges['unpaid']) : 0,
'receiving' => isset($userBadges['receiving']) ? count($userBadges['receiving']) : 0,
'finish' => isset($userBadges['finish']) ? count($userBadges['finish']) : 0,
'refund' => isset($userBadges['refund']) ? count($userBadges['refund']) : 0,
'canceled' => isset($userBadges['canceled']) ? count($userBadges['canceled']) : 0,
'rejection' => isset($userBadges['rejection']) ? count($userBadges['rejection']) : 0,
'unpaid_arr' => $userBadges['unpaid'] ?? [],
'receiving_arr' => $userBadges['receiving'] ?? [],
'finish_arr' => $userBadges['finish'] ?? [],
'refund_arr' => $userBadges['refund'] ?? [],
'canceled_arr' => $userBadges['canceled'] ?? [],
'rejection_arr' => $userBadges['rejection'] ?? [],
]; ];
// return [
// 'unpaid' => count($redis->sMembers('badge_unpaid_user_'.$userId)),
// 'receiving' => count($redis->sMembers('badge_receiving_user_'.$userId)),
// 'finish' => count($redis->sMembers('badge_finish_user_'.$userId)),
// 'refund' => count($redis->sMembers('badge_refund_user_'.$userId)),
// 'canceled' => count($redis->sMembers('badge_canceled_user_'.$userId)),
// 'rejection' => count($redis->sMembers('badge_rejection_store_'.$userId)),
// ];
} }
/** /**
@ -93,14 +115,36 @@ class BadgeService implements BadgeServiceInterface
public function allByStoreOrder($storeId) public function allByStoreOrder($storeId)
{ {
$redis = ApplicationContext::getContainer()->get(Redis::class); $redis = ApplicationContext::getContainer()->get(Redis::class);
$redisHName = 'badge:store';
$redisHKey = 'store_id_'.$storeId;
// 取出当前用户的key的badge(key=>value json串)
$storeBadges = $redis->hGet($redisHName, $redisHKey);
$storeBadges = json_decode($storeBadges, true);
return [ return [
'paid' => count($redis->sMembers('badge_paid_store_'.$storeId)),
'delivery' => count($redis->sMembers('badge_delivery_store_'.$storeId)),
'finish' => count($redis->sMembers('badge_finish_store_'.$storeId)),
'refund' => count($redis->sMembers('badge_refund_store_'.$storeId)),
'canceled' => count($redis->sMembers('badge_canceled_store_'.$storeId)),
'rejection' => count($redis->sMembers('badge_rejection_store_'.$storeId)),
'paid' => isset($storeBadges['paid']) ? count($storeBadges['paid']) : 0,
'delivery' => isset($storeBadges['delivery']) ? count($storeBadges['delivery']) : 0,
'finish' => isset($storeBadges['finish']) ? count($storeBadges['finish']) : 0,
'refund' => isset($storeBadges['refund']) ? count($storeBadges['refund']) : 0,
'canceled' => isset($storeBadges['canceled']) ? count($storeBadges['canceled']) : 0,
'rejection' => isset($storeBadges['rejection']) ? count($storeBadges['rejection']) : 0,
'paid_arr' => $storeBadges['paid'] ?? [],
'delivery_arr' => $storeBadges['delivery'] ?? [],
'finish_arr' => $storeBadges['finish'] ?? [],
'refund_arr' => $storeBadges['refund'] ?? [],
'canceled_arr' => $storeBadges['canceled'] ?? [],
'rejection_arr' => $storeBadges['rejection'] ?? [],
]; ];
// return [
// 'paid' => count($redis->sMembers('badge_paid_store_'.$storeId)),
// 'delivery' => count($redis->sMembers('badge_delivery_store_'.$storeId)),
// 'finish' => count($redis->sMembers('badge_finish_store_'.$storeId)),
// 'refund' => count($redis->sMembers('badge_refund_store_'.$storeId)),
// 'canceled' => count($redis->sMembers('badge_canceled_store_'.$storeId)),
// 'rejection' => count($redis->sMembers('badge_rejection_store_'.$storeId)),
// ];
} }
/** /**
@ -109,13 +153,30 @@ class BadgeService implements BadgeServiceInterface
public function sAddUserOrder($badge, $userId, $globalOrderId) public function sAddUserOrder($badge, $userId, $globalOrderId)
{ {
$redis = ApplicationContext::getContainer()->get(Redis::class); $redis = ApplicationContext::getContainer()->get(Redis::class);
$redis->sRem('badge_unpaid_user_'.$userId, $globalOrderId); # 移除用户待付款
$redis->sRem('badge_receiving_user_'.$userId, $globalOrderId); # 移除用户待收货
$redis->sRem('badge_finish_user_'.$userId, $globalOrderId); # 移除用户已完成
$redis->sRem('badge_canceled_user_'.$userId, $globalOrderId); # 移除用户已取消
$redis->sRem('badge_refund_user_'.$userId, $globalOrderId); # 移除用户退款售后
$redis->sRem('badge_rejection_store_', $userId, $globalOrderId); # 移除用户拒单
$redis->sAdd('badge_'.$badge.'_user_'.$userId, $globalOrderId); # 新增用户当前状态的值
$redisHName = 'badge:user';
$redisHKey = 'user_id_'.$userId;
// 取出当前用户的key的badge(key=>value json串)
$userBadges = $redis->hGet($redisHName, $redisHKey);
$userBadges = json_decode($userBadges, true);
$userBadges['unpaid'] = isset($userBadges['unpaid']) ? array_diff($userBadges['unpaid'], [$globalOrderId]) : []; # 移除用户待付款
$userBadges['receiving'] = isset($userBadges['receiving']) ? array_diff($userBadges['receiving'], [$globalOrderId]) : []; # 移除用户待收货
$userBadges['finish'] = isset($userBadges['finish']) ? array_diff($userBadges['finish'], [$globalOrderId]) : []; # 移除用户已完成
$userBadges['canceled'] = isset($userBadges['canceled']) ? array_diff($userBadges['canceled'], [$globalOrderId]) : []; # 移除用户已取消
$userBadges['refund'] = isset($userBadges['refund']) ? array_diff($userBadges['refund'], [$globalOrderId]) : []; # 移除用户退款售后
$userBadges['rejection'] = isset($userBadges['rejection']) ? array_diff($userBadges['rejection'], [$globalOrderId]) : []; # 移除用户拒单
$userBadges[$badge] = array_merge($userBadges[$badge], [$globalOrderId]); # 新增用户当前状态的值
$redis->hSet($redisHName,$redisHKey,json_encode($userBadges));
// $redis->sRem('badge_unpaid_user_'.$userId, $globalOrderId); # 移除用户待付款
// $redis->sRem('badge_receiving_user_'.$userId, $globalOrderId); # 移除用户待收货
// $redis->sRem('badge_finish_user_'.$userId, $globalOrderId); # 移除用户已完成
// $redis->sRem('badge_canceled_user_'.$userId, $globalOrderId); # 移除用户已取消
// $redis->sRem('badge_refund_user_'.$userId, $globalOrderId); # 移除用户退款售后
// $redis->sRem('badge_rejection_store_', $userId, $globalOrderId); # 移除用户拒单
// $redis->sAdd('badge_'.$badge.'_user_'.$userId, $globalOrderId); # 新增用户当前状态的值
} }
/** /**
@ -124,48 +185,101 @@ class BadgeService implements BadgeServiceInterface
public function sAddStoreOrder($badge, $storeId, $globalOrderId) public function sAddStoreOrder($badge, $storeId, $globalOrderId)
{ {
$redis = ApplicationContext::getContainer()->get(Redis::class); $redis = ApplicationContext::getContainer()->get(Redis::class);
$redis->sRem('badge_paid_store_'.$storeId, $globalOrderId); # 移除商户待接单
$redis->sRem('badge_delivery_store_'.$storeId, $globalOrderId); # 移除商户待送达
$redis->sRem('badge_finish_store_'.$storeId, $globalOrderId); # 移除商户已完成
$redis->sRem('badge_canceled_store_'.$storeId, $globalOrderId); # 移除商户已取消
$redis->sRem('badge_refund_store_'.$storeId, $globalOrderId); # 移除商户退款售后
$redis->sRem('badge_rejection_store_', $storeId, $globalOrderId); # 移除商户拒单
$redis->sAdd('badge_'.$badge.'_store_'.$storeId, $globalOrderId); # 新增用户当前状态的值
$redisHName = 'badge:store';
$redisHKey = 'store_id_'.$storeId;
// 取出当前用户的key的badge(key=>value json串)
$storeBadges = $redis->hGet($redisHName, $redisHKey);
$storeBadges = json_decode($storeBadges, true);
$storeBadges['paid'] = isset($storeBadges['paid']) ? array_diff($storeBadges['paid'], [$globalOrderId]) : []; # 移除商户待接单
$storeBadges['delivery'] = isset($storeBadges['delivery']) ? array_diff($storeBadges['delivery'], [$globalOrderId]) : []; # 移除商户待送达
$storeBadges['finish'] = isset($storeBadges['finish']) ? array_diff($storeBadges['finish'], [$globalOrderId]) : []; # 移除商户已完成
$storeBadges['canceled'] = isset($storeBadges['canceled']) ? array_diff($storeBadges['canceled'], [$globalOrderId]) : []; # 移除商户已取消
$storeBadges['refund'] = isset($storeBadges['refund']) ? array_diff($storeBadges['refund'], [$globalOrderId]) : []; # 移除商户退款售后
$storeBadges['rejection'] = isset($storeBadges['rejection']) ? array_diff($storeBadges['rejection'], [$globalOrderId]) : []; # 移除商户拒单
$storeBadges[$badge] = array_merge($storeBadges[$badge], [$globalOrderId]); # 新增商户当前状态的值
$redis->hSet($redisHName,$redisHKey,json_encode($storeBadges));
// $redis->sRem('badge_paid_store_'.$storeId, $globalOrderId); # 移除商户待接单
// $redis->sRem('badge_delivery_store_'.$storeId, $globalOrderId); # 移除商户待送达
// $redis->sRem('badge_finish_store_'.$storeId, $globalOrderId); # 移除商户已完成
// $redis->sRem('badge_canceled_store_'.$storeId, $globalOrderId); # 移除商户已取消
// $redis->sRem('badge_refund_store_'.$storeId, $globalOrderId); # 移除商户退款售后
// $redis->sRem('badge_rejection_store_', $storeId, $globalOrderId); # 移除商户拒单
// $redis->sAdd('badge_'.$badge.'_store_'.$storeId, $globalOrderId); # 新增用户当前状态的值
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function clearUserOrder($userId, $badge = 'all')
public function clearUserOrder($userId, $badge = 'all', $globalOrderId = '')
{ {
$redis = ApplicationContext::getContainer()->get(Redis::class); $redis = ApplicationContext::getContainer()->get(Redis::class);
$redisHName = 'badge:user';
$redisHKey = 'user_id_'.$userId;
// 取出当前用户的key的badge(key=>value json串)
$userBadges = $redis->hGet($redisHName, $redisHKey);
$userBadges = json_decode($userBadges, true);
if ($badge == 'all') { if ($badge == 'all') {
$redis->del('badge_unpaid_user_'.$userId); # 移除用户待付款
$redis->del('badge_receiving_user_'.$userId); # 移除用户待收货
$redis->del('badge_finish_user_'.$userId); # 移除用户已完成
$redis->del('badge_canceled_user_'.$userId); # 移除用户已取消
$redis->del('badge_refund_user_'.$userId); # 移除用户退款售后
$redis->del('badge_rejection_store_', $userId); # 移除用户拒单
$redis->hDel($redisHName, $redisHKey);
// $redis->del('badge_unpaid_user_'.$userId); # 移除用户待付款
// $redis->del('badge_receiving_user_'.$userId); # 移除用户待收货
// $redis->del('badge_finish_user_'.$userId); # 移除用户已完成
// $redis->del('badge_canceled_user_'.$userId); # 移除用户已取消
// $redis->del('badge_refund_user_'.$userId); # 移除用户退款售后
// $redis->del('badge_rejection_store_', $userId); # 移除用户拒单
} else { } else {
$redis->del('badge_'.$badge.'_user_'.$userId);
if ($globalOrderId) {
$userBadges[$badge] = isset($userBadges[$badge]) ? array_diff($userBadges[$badge], [$globalOrderId]) : []; # 移除当前状态里的某个值
} else {
unset($userBadges[$badge]);
}
$redis->hSet($redisHName,$redisHKey,json_encode($userBadges));
// $redis->del('badge_'.$badge.'_user_'.$userId);
} }
} }
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function clearStoreOrder($storeId, $badge = 'all')
public function clearStoreOrder($storeId, $badge = 'all', $globalOrderId = '')
{ {
$redis = ApplicationContext::getContainer()->get(Redis::class); $redis = ApplicationContext::getContainer()->get(Redis::class);
$redisHName = 'badge:store';
$redisHKey = 'store_id_'.$storeId;
// 取出当前用户的key的badge(key=>value json串)
$storeBadges = $redis->hGet($redisHName, $redisHKey);
$storeBadges = json_decode($storeBadges, true);
if ($badge == 'all') { if ($badge == 'all') {
$redis->del('badge_paid_store_'.$storeId); # 移除商户待付款
$redis->del('badge_delivery_store_'.$storeId); # 移除商户待收货
$redis->del('badge_finish_store_'.$storeId); # 移除商户已完成
$redis->del('badge_canceled_store_'.$storeId); # 移除商户已取消
$redis->del('badge_refund_store_'.$storeId); # 移除商户退款售后
$redis->del('badge_rejection_store_', $storeId); # 移除商户拒单
$redis->hDel($redisHName, $redisHKey);
// $redis->del('badge_paid_store_'.$storeId); # 移除商户待付款
// $redis->del('badge_delivery_store_'.$storeId); # 移除商户待收货
// $redis->del('badge_finish_store_'.$storeId); # 移除商户已完成
// $redis->del('badge_canceled_store_'.$storeId); # 移除商户已取消
// $redis->del('badge_refund_store_'.$storeId); # 移除商户退款售后
// $redis->del('badge_rejection_store_', $storeId); # 移除商户拒单
} else { } else {
$redis->del('badge_'.$badge.'_store_'.$storeId);
if ($globalOrderId) {
$storeBadges[$badge] = isset($storeBadges[$badge]) ? array_diff($storeBadges[$badge], [$globalOrderId]) : []; # 移除当前状态里的某个值
} else {
unset($storeBadges[$badge]);
}
$redis->hSet($redisHName,$redisHKey,json_encode($storeBadges));
// $redis->del('badge_'.$badge.'_store_'.$storeId);
} }
} }
} }

14
app/Service/v3/Implementations/GoodsActivityService.php

@ -8,6 +8,7 @@ use App\Constants\v3\ErrorCode;
use App\Constants\v3\LogLabel; use App\Constants\v3\LogLabel;
use App\Constants\v3\SsdbKeys; use App\Constants\v3\SsdbKeys;
use App\Service\v3\Interfaces\GoodsActivityServiceInterface; use App\Service\v3\Interfaces\GoodsActivityServiceInterface;
use App\Service\v3\Interfaces\GoodsInventoryServiceInterface;
use App\TaskWorker\SSDBTask; use App\TaskWorker\SSDBTask;
use App\Model\v3\GoodsActivity; use App\Model\v3\GoodsActivity;
use App\Model\v3\GoodsActivityBanner; use App\Model\v3\GoodsActivityBanner;
@ -24,6 +25,12 @@ class GoodsActivityService implements GoodsActivityServiceInterface
*/ */
protected $log; protected $log;
/**
* @Inject
* @var GoodsInventoryServiceInterface
*/
protected $goodsInventoryService;
public function do($goodsId) public function do($goodsId)
{ {
@ -32,9 +39,6 @@ class GoodsActivityService implements GoodsActivityServiceInterface
public function check(GoodsActivity $goods, $num, $userId) public function check(GoodsActivity $goods, $num, $userId)
{ {
$redis = ApplicationContext::getContainer()->get(Redis::class);
$inventoryKey = 'goods_inventory_sold_2_'.$goods->id; // 拼接activity_type和goods_id
if (empty($goods)) { if (empty($goods)) {
$message = ErrorCode::getMessage(ErrorCode::GOODS_ACTIVITY_NOT_EXISTS); $message = ErrorCode::getMessage(ErrorCode::GOODS_ACTIVITY_NOT_EXISTS);
$this->log->event(LogLabel::ERROR_CODE_EXCEPTION_LOG_DATA, ['message' => $message, 'buy_num' => $num, 'user_id' => $userId, 'logData' => json_encode($goods)]); $this->log->event(LogLabel::ERROR_CODE_EXCEPTION_LOG_DATA, ['message' => $message, 'buy_num' => $num, 'user_id' => $userId, 'logData' => json_encode($goods)]);
@ -64,11 +68,11 @@ class GoodsActivityService implements GoodsActivityServiceInterface
// 商品库存不足 // 商品库存不足
// 获取冻结的库存 // 获取冻结的库存
$inventoryFrozen = (int)$redis->get($inventoryKey);
$inventoryFrozen = $this->goodsInventoryService->getSold(2, $goods->id);
// $inventoryFrozen = 0; // $inventoryFrozen = 0;
if($goods->is_infinite != 1 && $goods->inventory < ($num+$inventoryFrozen)){ if($goods->is_infinite != 1 && $goods->inventory < ($num+$inventoryFrozen)){
$message = ErrorCode::getMessage(ErrorCode::GOODS_ACTIVITY_INVENTORY_ERROR); $message = ErrorCode::getMessage(ErrorCode::GOODS_ACTIVITY_INVENTORY_ERROR);
$this->log->event(LogLabel::ERROR_CODE_EXCEPTION_LOG_DATA, ['message' => $message, 'buy_num' => $num, 'inventoryKey' => $inventoryKey, 'inventoryFrozen' => $inventoryFrozen, 'user_id' => $userId, 'logData' => json_encode($goods)]);
$this->log->event(LogLabel::ERROR_CODE_EXCEPTION_LOG_DATA, ['message' => $message, 'buy_num' => $num, 'activity_type' => 2, 'inventoryFrozen' => $inventoryFrozen, 'user_id' => $userId, 'logData' => json_encode($goods)]);
return ErrorCode::GOODS_ACTIVITY_INVENTORY_ERROR; return ErrorCode::GOODS_ACTIVITY_INVENTORY_ERROR;
} }

47
app/Service/v3/Implementations/GoodsInventoryService.php

@ -0,0 +1,47 @@
<?php
namespace App\Service\v3\Implementations;
use App\Service\v3\Interfaces\GoodsInventoryServiceInterface;
use Hyperf\Redis\Redis;
use Hyperf\Utils\ApplicationContext;
class GoodsInventoryService implements GoodsInventoryServiceInterface
{
/**
* @inheritDoc
*/
public function doSold($activityType, $goodsId, $num)
{
$redis = ApplicationContext::getContainer()->get(Redis::class);
$hName = 'goods:inventory_sold_' . $activityType;
$hKey = 'goods_id_' . $goodsId;
$redis->hIncrBy($hName, $hKey, $num);
}
/**
* @inheritDoc
*/
public function undoSold($activityType, $goodsId, $num)
{
$redis = ApplicationContext::getContainer()->get(Redis::class);
$hName = 'goods:inventory_sold_' . $activityType;
$hKey = 'goods_id_' . $goodsId;
$redis->hIncrBy($hName, $hKey, -1*$num);
}
/**
* @inheritDoc
*/
public function getSold($activityType, $goodsId)
{
$redis = ApplicationContext::getContainer()->get(Redis::class);
$hName = 'goods:inventory_sold_' . $activityType;
$hKey = 'goods_id_' . $goodsId;
return $redis->hGet($hName, $hKey);
}
}

12
app/Service/v3/Implementations/GoodsService.php

@ -6,6 +6,7 @@ use App\Commons\Log;
use App\Constants\v3\ErrorCode; use App\Constants\v3\ErrorCode;
use App\Constants\v3\LogLabel; use App\Constants\v3\LogLabel;
use App\Exception\ErrorCodeException; use App\Exception\ErrorCodeException;
use App\Service\v3\Interfaces\GoodsInventoryServiceInterface;
use App\Service\v3\Interfaces\GoodsServiceInterface; use App\Service\v3\Interfaces\GoodsServiceInterface;
use App\Model\v3\Goods; use App\Model\v3\Goods;
use App\Model\v3\GoodsBanner; use App\Model\v3\GoodsBanner;
@ -20,6 +21,12 @@ class GoodsService implements GoodsServiceInterface
* @var Log * @var Log
*/ */
protected $log; protected $log;
/**
* @Inject
* @var GoodsInventoryServiceInterface
*/
protected $goodsInventoryService;
public function do($goodsId) public function do($goodsId)
{ {
@ -28,9 +35,6 @@ class GoodsService implements GoodsServiceInterface
public function check(Goods $goods,$num = 1) public function check(Goods $goods,$num = 1)
{ {
$redis = ApplicationContext::getContainer()->get(Redis::class);
$inventoryKey = 'goods_inventory_sold_1_'.$goods->id; // 拼接activity_type和goods_id
if (empty($goods)) { if (empty($goods)) {
$message = ErrorCode::getMessage(ErrorCode::GOODS_NOT_EXISTS); $message = ErrorCode::getMessage(ErrorCode::GOODS_NOT_EXISTS);
$this->log->event(LogLabel::ERROR_CODE_EXCEPTION_LOG_DATA, ['message' => $message, 'buy_num' => $num, 'logData' => json_encode($goods)]); $this->log->event(LogLabel::ERROR_CODE_EXCEPTION_LOG_DATA, ['message' => $message, 'buy_num' => $num, 'logData' => json_encode($goods)]);
@ -51,7 +55,7 @@ class GoodsService implements GoodsServiceInterface
} }
// 商品库存不足 // 商品库存不足
// 获取冻结的库存 // 获取冻结的库存
//$inventoryFrozen = (int)$redis->get($inventoryKey);
// $inventoryFrozen = $this->goodsInventoryService->getSold(1, $goods->id);
$inventoryFrozen = 0; $inventoryFrozen = 0;
if($goods->is_infinite != 1 && $goods->inventory < ($num+$inventoryFrozen)){ if($goods->is_infinite != 1 && $goods->inventory < ($num+$inventoryFrozen)){
$message = ErrorCode::getMessage(ErrorCode::GOODS_INVENTORY_ERROR); $message = ErrorCode::getMessage(ErrorCode::GOODS_INVENTORY_ERROR);

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

@ -24,6 +24,7 @@ use App\Service\v3\Interfaces\BadgeServiceInterface;
use App\Service\v3\Interfaces\CouponRecServiceInterface; use App\Service\v3\Interfaces\CouponRecServiceInterface;
use App\Service\v3\Interfaces\CouponServiceInterface; use App\Service\v3\Interfaces\CouponServiceInterface;
use App\Service\v3\Interfaces\GoodsActivityServiceInterface; use App\Service\v3\Interfaces\GoodsActivityServiceInterface;
use App\Service\v3\Interfaces\GoodsInventoryServiceInterface;
use App\Service\v3\Interfaces\GoodsServiceInterface; use App\Service\v3\Interfaces\GoodsServiceInterface;
use App\Service\v3\Interfaces\InitialDeliveryServiceInterface; use App\Service\v3\Interfaces\InitialDeliveryServiceInterface;
use App\Service\v3\Interfaces\PaymentServiceInterface; use App\Service\v3\Interfaces\PaymentServiceInterface;
@ -102,6 +103,12 @@ class OrderOnlineService implements OrderOnlineServiceInterface
*/ */
protected $initialDeliveryService; protected $initialDeliveryService;
/**
* @Inject
* @var GoodsInventoryServiceInterface
*/
protected $goodsInventoryService;
/** /**
* 下单 * 下单
* @param $marketId * @param $marketId
@ -224,12 +231,13 @@ class OrderOnlineService implements OrderOnlineServiceInterface
// 压redis库存 // 压redis库存
// redis记录当前商品的购买数量,压库存,下单失败、下单成功扣库存成功、订单取消的时候释放 // redis记录当前商品的购买数量,压库存,下单失败、下单成功扣库存成功、订单取消的时候释放
$inventoryKey = 'goods_inventory_sold_'.$cart->activity_type.'_'.$cart->goods_id; // 拼接activity_type和goods_id
if (!$redis->exists($inventoryKey)) {
$redis->set($inventoryKey, $cart->num);
} else {
$redis->incrBy($inventoryKey, intval($cart->num));
}
// $inventoryKey = 'goods_inventory_sold_'.$cart->activity_type.'_'.$cart->goods_id; // 拼接activity_type和goods_id
// if (!$redis->exists($inventoryKey)) {
// $redis->set($inventoryKey, $cart->num);
// } else {
// $redis->incrBy($inventoryKey, intval($cart->num));
// }
$this->goodsInventoryService->doSold($cart->activity_type, $cart->goods_id, $cart->num);
$isCacheInventory = true; $isCacheInventory = true;
if ($cart->activity_type == 2) { if ($cart->activity_type == 2) {
@ -404,14 +412,15 @@ class OrderOnlineService implements OrderOnlineServiceInterface
if ($isCacheInventory) { if ($isCacheInventory) {
// 释redis库存 // 释redis库存
foreach ($carts as $k => &$cart) { foreach ($carts as $k => &$cart) {
// 拼接activity_type和goods_id
$inventoryKey = 'goods_inventory_sold_'.$cart->activity_type.'_'.$cart->goods_id;
// redis记录当前商品的购买数量,压库存,下单失败、下单成功扣库存成功、订单取消的时候释放
if (!$redis->exists($inventoryKey)) {
$redis->set($inventoryKey, 0);
} else {
$redis->decrBy($inventoryKey, intval($cart->num));
}
// // 拼接activity_type和goods_id
// $inventoryKey = 'goods_inventory_sold_'.$cart->activity_type.'_'.$cart->goods_id;
// // redis记录当前商品的购买数量,压库存,下单失败、下单成功扣库存成功、订单取消的时候释放
// if (!$redis->exists($inventoryKey)) {
// $redis->set($inventoryKey, 0);
// } else {
// $redis->decrBy($inventoryKey, intval($cart->num));
// }
$this->goodsInventoryService->undoSold($cart->activity_type, $cart->goods_id, $cart->num);
} }
} }
$this->log->event(LogLabel::ORDER_ONLINE_LOG, ['msg' => $e->getMessage()]); $this->log->event(LogLabel::ORDER_ONLINE_LOG, ['msg' => $e->getMessage()]);
@ -477,14 +486,15 @@ class OrderOnlineService implements OrderOnlineServiceInterface
// 释redis库存 // 释redis库存
$redis = ApplicationContext::getContainer()->get(Redis::class); $redis = ApplicationContext::getContainer()->get(Redis::class);
foreach ($orderGoods as $k => &$goodsItem) { foreach ($orderGoods as $k => &$goodsItem) {
// 拼接activity_type和goods_id
$inventoryKey = 'goods_inventory_sold_'.$goodsItem['activity_type'].'_'.$goodsItem['goods_id'];
// redis记录当前商品的购买数量,压库存,下单失败、下单成功扣库存成功、订单取消的时候释放
if (!$redis->exists($inventoryKey)) {
$redis->set($inventoryKey, 0);
} else {
$redis->decrBy($inventoryKey, intval($goodsItem['number']));
}
// // 拼接activity_type和goods_id
// $inventoryKey = 'goods_inventory_sold_'.$goodsItem['activity_type'].'_'.$goodsItem['goods_id'];
// // redis记录当前商品的购买数量,压库存,下单失败、下单成功扣库存成功、订单取消的时候释放
// if (!$redis->exists($inventoryKey)) {
// $redis->set($inventoryKey, 0);
// } else {
// $redis->decrBy($inventoryKey, intval($goodsItem['number']));
// }
$this->goodsInventoryService->undoSold($goodsItem['activity_type'], $goodsItem['goods_id'], $goodsItem['number']);
} }
// 记录badge // 记录badge
@ -572,14 +582,15 @@ class OrderOnlineService implements OrderOnlineServiceInterface
// 释redis库存 // 释redis库存
$redis = ApplicationContext::getContainer()->get(Redis::class); $redis = ApplicationContext::getContainer()->get(Redis::class);
foreach ($orderGoods as $k => &$goodsItem) { foreach ($orderGoods as $k => &$goodsItem) {
// 拼接activity_type和goods_id
$inventoryKey = 'goods_inventory_sold_'.$goodsItem['activity_type'].'_'.$goodsItem['goods_id'];
// redis记录当前商品的购买数量,压库存,下单失败、下单成功扣库存成功、订单取消的时候释放
if (!$redis->exists($inventoryKey)) {
$redis->set($inventoryKey, 0);
} else {
$redis->decrBy($inventoryKey, intval($goodsItem['number']));
}
// // 拼接activity_type和goods_id
// $inventoryKey = 'goods_inventory_sold_'.$goodsItem['activity_type'].'_'.$goodsItem['goods_id'];
// // redis记录当前商品的购买数量,压库存,下单失败、下单成功扣库存成功、订单取消的时候释放
// if (!$redis->exists($inventoryKey)) {
// $redis->set($inventoryKey, 0);
// } else {
// $redis->decrBy($inventoryKey, intval($goodsItem['number']));
// }
$this->goodsInventoryService->undoSold($goodsItem['activity_type'], $goodsItem['goods_id'], $goodsItem['number']);
} }
// 月销流水 // 月销流水
@ -691,19 +702,6 @@ class OrderOnlineService implements OrderOnlineServiceInterface
$orderIds = Order::query()->where(['order_main_id' => $orderMain->global_order_id])->pluck('id'); $orderIds = Order::query()->where(['order_main_id' => $orderMain->global_order_id])->pluck('id');
$orderGoods = OrderGoods::query()->whereIn('order_id', $orderIds)->get()->toArray(); $orderGoods = OrderGoods::query()->whereIn('order_id', $orderIds)->get()->toArray();
// // 释redis库存
// $redis = ApplicationContext::getContainer()->get(Redis::class);
// foreach ($orderGoods as $k => &$goodsItem) {
// // 拼接activity_type和goods_id
// $inventoryKey = 'goods_inventory_sold_'.$goodsItem['activity_type'].'_'.$goodsItem['goods_id'];
// // redis记录当前商品的购买数量,压库存,下单失败、下单成功扣库存成功、订单取消的时候释放
// if (!$redis->exists($inventoryKey)) {
// $redis->set($inventoryKey, 0);
// } else {
// $redis->decrBy($inventoryKey, intval($goodsItem['number']));
// }
// }
// 微信退款 // 微信退款
if ($orderMain->pay_type == Payment::WECHAT) { if ($orderMain->pay_type == Payment::WECHAT) {
return $this->paymentService->undo($orderMain->global_order_id, $userId); return $this->paymentService->undo($orderMain->global_order_id, $userId);
@ -745,14 +743,15 @@ class OrderOnlineService implements OrderOnlineServiceInterface
// 释redis库存 // 释redis库存
$redis = ApplicationContext::getContainer()->get(Redis::class); $redis = ApplicationContext::getContainer()->get(Redis::class);
foreach ($orderGoods as $k => &$goodsItem) { foreach ($orderGoods as $k => &$goodsItem) {
// 拼接activity_type和goods_id
$inventoryKey = 'goods_inventory_sold_'.$goodsItem['activity_type'].'_'.$goodsItem['goods_id'];
// redis记录当前商品的购买数量,压库存,下单失败、下单成功扣库存成功、订单取消的时候释放
if (!$redis->exists($inventoryKey)) {
$redis->set($inventoryKey, 0);
} else {
$redis->decrBy($inventoryKey, intval($goodsItem['number']));
}
// // 拼接activity_type和goods_id
// $inventoryKey = 'goods_inventory_sold_'.$goodsItem['activity_type'].'_'.$goodsItem['goods_id'];
// // redis记录当前商品的购买数量,压库存,下单失败、下单成功扣库存成功、订单取消的时候释放
// if (!$redis->exists($inventoryKey)) {
// $redis->set($inventoryKey, 0);
// } else {
// $redis->decrBy($inventoryKey, intval($goodsItem['number']));
// }
$this->goodsInventoryService->undoSold($goodsItem['activity_type'], $goodsItem['goods_id'], $goodsItem['number']);
} }
// 记录badge // 记录badge

6
app/Service/v3/Interfaces/BadgeServiceInterface.php

@ -50,15 +50,17 @@ interface BadgeServiceInterface
* 清除用户角标 * 清除用户角标
* @param $userId * @param $userId
* @param string $badge * @param string $badge
* @param string $globalOrderId
* @return mixed * @return mixed
*/ */
public function clearUserOrder($userId, $badge = 'all');
public function clearUserOrder($userId, $badge = 'all', $globalOrderId = '');
/** /**
* 清除商户角标 * 清除商户角标
* @param $storeId * @param $storeId
* @param string $badge * @param string $badge
* @param string $globalOrderId
* @return mixed * @return mixed
*/ */
public function clearStoreOrder($storeId, $badge = 'all');
public function clearStoreOrder($storeId, $badge = 'all', $globalOrderId = '');
} }

33
app/Service/v3/Interfaces/GoodsInventoryServiceInterface.php

@ -0,0 +1,33 @@
<?php
namespace App\Service\v3\Interfaces;
interface GoodsInventoryServiceInterface
{
/**
* 压已售库存(冻结的)
* @param $activityType
* @param $goodsId
* @param $num
* @return mixed
*/
public function doSold($activityType, $goodsId, $num);
/**
* 释已售库存(冻结的)
* @param $activityType
* @param $goodsId
* @param $num
* @return mixed
*/
public function undoSold($activityType, $goodsId, $num);
/**
* 获取当前商品冻结库存
* @param $activityType
* @param $goodsId
* @return mixed
*/
public function getSold($activityType, $goodsId);
}

1
config/autoload/dependencies.php

@ -90,4 +90,5 @@ return [
\App\Service\v3\Interfaces\InitialDeliveryServiceInterface::class => \App\Service\v3\Implementations\InitialDeliveryService::class, \App\Service\v3\Interfaces\InitialDeliveryServiceInterface::class => \App\Service\v3\Implementations\InitialDeliveryService::class,
\App\Service\v3\Interfaces\ServiceEvaluateServiceInterface::class => \App\Service\v3\Implementations\ServiceEvaluateService::class, \App\Service\v3\Interfaces\ServiceEvaluateServiceInterface::class => \App\Service\v3\Implementations\ServiceEvaluateService::class,
\App\Service\v3\Interfaces\ParamsTokenServiceInterface::class => \App\Service\v3\Implementations\ParamsTokenSsdbService::class, \App\Service\v3\Interfaces\ParamsTokenServiceInterface::class => \App\Service\v3\Implementations\ParamsTokenSsdbService::class,
\App\Service\v3\Interfaces\GoodsInventoryServiceInterface::class => \App\Service\v3\Implementations\GoodsInventoryService::class,
]; ];
Loading…
Cancel
Save