|
|
@@ -613,11 +613,20 @@ class OrderController extends BaseController
|
|
|
util::fail('请选择规格');
|
|
|
}
|
|
|
$stock = $goodsInfo->stock ?? 0;
|
|
|
- if ($stock <= 0) {
|
|
|
- util::fail('库存不足');
|
|
|
- }
|
|
|
$saleGoodsId = $specGoodsId > 0 ? $specGoodsId : $goodsId;
|
|
|
$activityType = strval($post['activityType'] ?? '');
|
|
|
+ if (bccomp($goodsNum, floatval($stock), 2) > 0) {
|
|
|
+ // 库存不足返回商品标识,供结算页红框高亮(与限购超限同形态)
|
|
|
+ $this->failStockExceed([
|
|
|
+ 'productId' => $saleGoodsId,
|
|
|
+ 'goodsId' => $goodsId,
|
|
|
+ 'specGoodsId' => $specGoodsId,
|
|
|
+ 'property' => 0,
|
|
|
+ 'activityType' => $activityType,
|
|
|
+ 'stock' => $stock,
|
|
|
+ 'num' => $goodsNum,
|
|
|
+ ]);
|
|
|
+ }
|
|
|
|
|
|
//事务处理
|
|
|
$connection = Yii::$app->db;
|
|
|
@@ -669,14 +678,27 @@ class OrderController extends BaseController
|
|
|
}
|
|
|
$seckillStock = floatval($seckillRow['stock'] ?? 0);
|
|
|
$soldCount = HomePageModuleClass::getSeckillSoldCount($mainId, $seckillActivityGoodsId);
|
|
|
- if (bcadd($soldCount, $goodsNum, 2) > $seckillStock) {
|
|
|
- util::fail('秒杀库存不足,请重新选择');
|
|
|
+ $seckillRemain = bcsub($seckillStock, $soldCount, 2);
|
|
|
+ if (bccomp($seckillRemain, '0', 2) < 0) {
|
|
|
+ $seckillRemain = '0';
|
|
|
+ }
|
|
|
+ if (bccomp($goodsNum, $seckillRemain, 2) > 0) {
|
|
|
+ $this->failStockExceed([
|
|
|
+ 'productId' => $saleGoodsId,
|
|
|
+ 'goodsId' => $goodsId,
|
|
|
+ 'specGoodsId' => $specGoodsId,
|
|
|
+ 'property' => 0,
|
|
|
+ 'activityType' => 'seckill',
|
|
|
+ 'stock' => $seckillRemain,
|
|
|
+ 'num' => $goodsNum,
|
|
|
+ ]);
|
|
|
}
|
|
|
$seckillLimit = floatval($seckillRow['limit'] ?? 0);
|
|
|
if ($seckillLimit > 0) {
|
|
|
$boughtCount = HomePageModuleClass::getSeckillCustomBoughtCount($mainId, $seckillActivityGoodsId, $customId);
|
|
|
if (bcadd($boughtCount, $goodsNum, 2) > $seckillLimit) {
|
|
|
- util::fail("秒杀商品每人限购{$seckillLimit}件,已超出可购买数量");
|
|
|
+ // 返回超限商品,供结算页红框高亮;code=-1 与花材限购错误对齐
|
|
|
+ HomePageModuleClass::failSeckillLimitExceed($saleGoodsId, $goodsId, $specGoodsId, $seckillLimit, $boughtCount, $goodsNum);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -1062,6 +1084,19 @@ class OrderController extends BaseController
|
|
|
util::fail('有花材信息没有找到');
|
|
|
}
|
|
|
$num = $element['num'] ?? 0;
|
|
|
+ $itemStock = floatval($product['stock'] ?? 0);
|
|
|
+ if (bccomp(floatval($num), $itemStock, 2) > 0) {
|
|
|
+ // 花材库存不足也返回 productId,确认页/购物车按限购同款红框提示超出量
|
|
|
+ $this->failStockExceed([
|
|
|
+ 'productId' => $productId,
|
|
|
+ 'goodsId' => 0,
|
|
|
+ 'specGoodsId' => 0,
|
|
|
+ 'property' => 1,
|
|
|
+ 'activityType' => '',
|
|
|
+ 'stock' => $itemStock,
|
|
|
+ 'num' => $num,
|
|
|
+ ]);
|
|
|
+ }
|
|
|
$limitKey = \bizHd\product\classes\ProductClass::LIMIT_BUY_KEY . $productId;
|
|
|
$hasBuyNum = Yii::$app->redis->executeCommand('HGET', [$limitKey, $hdCustomId]);
|
|
|
$hasBuyNum = $num + ($hasBuyNum == null ? 0 : $hasBuyNum);
|
|
|
@@ -1138,8 +1173,16 @@ class OrderController extends BaseController
|
|
|
}
|
|
|
$stock = $goodsInfo->stock;
|
|
|
$stockSet = $goodsInfo->stockSet;
|
|
|
- if ($stockSet == 1 && $stock <= 0) {
|
|
|
- util::fail('花束库存不足');
|
|
|
+ if ($stockSet == 1 && bccomp($goodsNum, floatval($stock), 2) > 0) {
|
|
|
+ $this->failStockExceed([
|
|
|
+ 'productId' => $saleGoodsId,
|
|
|
+ 'goodsId' => $goodsId,
|
|
|
+ 'specGoodsId' => $specGoodsId,
|
|
|
+ 'property' => 0,
|
|
|
+ 'activityType' => strval($element['activityType'] ?? ''),
|
|
|
+ 'stock' => $stock,
|
|
|
+ 'num' => $goodsNum,
|
|
|
+ ]);
|
|
|
}
|
|
|
|
|
|
// 秒杀商品:不信任前端传的价格,独立回查秒杀配置核实活动状态/库存/限购后再核价
|
|
|
@@ -1156,14 +1199,27 @@ class OrderController extends BaseController
|
|
|
}
|
|
|
$seckillStock = floatval($seckillRow['stock']);
|
|
|
$soldCount = HomePageModuleClass::getSeckillSoldCount($mainId, $seckillActivityGoodsId);
|
|
|
- if (bcadd($soldCount, $goodsNum, 2) > $seckillStock) {
|
|
|
- util::fail('秒杀库存不足,请重新选择');
|
|
|
+ $seckillRemain = bcsub($seckillStock, $soldCount, 2);
|
|
|
+ if (bccomp($seckillRemain, '0', 2) < 0) {
|
|
|
+ $seckillRemain = '0';
|
|
|
+ }
|
|
|
+ if (bccomp($goodsNum, $seckillRemain, 2) > 0) {
|
|
|
+ $this->failStockExceed([
|
|
|
+ 'productId' => $saleGoodsId,
|
|
|
+ 'goodsId' => $goodsId,
|
|
|
+ 'specGoodsId' => $specGoodsId,
|
|
|
+ 'property' => 0,
|
|
|
+ 'activityType' => 'seckill',
|
|
|
+ 'stock' => $seckillRemain,
|
|
|
+ 'num' => $goodsNum,
|
|
|
+ ]);
|
|
|
}
|
|
|
$seckillLimit = floatval($seckillRow['limit'] ?? 0);
|
|
|
if ($seckillLimit > 0) {
|
|
|
$boughtCount = HomePageModuleClass::getSeckillCustomBoughtCount($mainId, $seckillActivityGoodsId, $hdCustomId); // TODO 同一个商品,如果缓存没有合理清除,就会一直限购
|
|
|
if (bcadd($boughtCount, $goodsNum, 2) > $seckillLimit) {
|
|
|
- util::fail("秒杀商品每人限购{$seckillLimit}件,已超出可购买数量");
|
|
|
+ // 返回超限商品,供混合结算页/购物车红框高亮;code=-1 与花材限购错误对齐
|
|
|
+ HomePageModuleClass::failSeckillLimitExceed($saleGoodsId, $goodsId, $specGoodsId, $seckillLimit, $boughtCount, $goodsNum);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -2103,6 +2159,48 @@ class OrderController extends BaseController
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 库存不足:以 code=-1 返回商品标识、剩余库存与超出数量。
|
|
|
+ * 与限购超限同形态,供混合结算页/购物车红框高亮对应商品并提示超出多少。
|
|
|
+ *
|
|
|
+ * @param array $opts productId/goodsId/specGoodsId/property/activityType/stock/num
|
|
|
+ */
|
|
|
+ protected function failStockExceed($opts)
|
|
|
+ {
|
|
|
+ $productId = intval($opts['productId'] ?? 0);
|
|
|
+ $goodsId = intval($opts['goodsId'] ?? 0);
|
|
|
+ $specGoodsId = intval($opts['specGoodsId'] ?? 0);
|
|
|
+ $property = intval($opts['property'] ?? 0);
|
|
|
+ $activityType = strval($opts['activityType'] ?? '');
|
|
|
+ $stock = floatval($opts['stock'] ?? 0);
|
|
|
+ $num = floatval($opts['num'] ?? 0);
|
|
|
+ if (bccomp($stock, '0', 2) < 0) {
|
|
|
+ $stock = 0;
|
|
|
+ }
|
|
|
+ $exceed = bcsub($num, $stock, 2);
|
|
|
+ if (bccomp($exceed, '0', 2) < 0) {
|
|
|
+ $exceed = '0';
|
|
|
+ }
|
|
|
+ $stockShow = rtrim(rtrim(sprintf('%.2f', $stock), '0'), '.');
|
|
|
+ if ($stockShow === '') {
|
|
|
+ $stockShow = '0';
|
|
|
+ }
|
|
|
+ $msg = $activityType === 'seckill'
|
|
|
+ ? "秒杀商品库存不足,剩余{$stockShow}"
|
|
|
+ : "商品库存不足,剩余{$stockShow}";
|
|
|
+ util::error(-1, $msg, [
|
|
|
+ 'productId' => $productId,
|
|
|
+ 'goodsId' => $goodsId,
|
|
|
+ 'specGoodsId' => $specGoodsId,
|
|
|
+ 'property' => $property,
|
|
|
+ 'activityType' => $activityType,
|
|
|
+ 'reason' => 'stock',
|
|
|
+ 'stock' => floatval($stock),
|
|
|
+ 'num' => $num,
|
|
|
+ 'exceed' => floatval($exceed),
|
|
|
+ ]);
|
|
|
+ }
|
|
|
+
|
|
|
//获取详情 ssh 20220512
|
|
|
public function actionInfo()
|
|
|
{
|