|
|
@@ -191,24 +191,34 @@ class OrderClass extends BaseClass
|
|
|
|
|
|
$book = $data['book'] ?? 0;
|
|
|
// skipShopMeetCut:前端已写入满减后金额时跳过,避免二次门店满减
|
|
|
- $skipShopMeetCut = !empty($data['skipShopMeetCut']);
|
|
|
- unset($data['skipShopMeetCut'], $data['skipMemberDiscount']);
|
|
|
+ // 拼团单不叠加门店满减(团购价已是优惠价)
|
|
|
+ $skipShopMeetCut = !empty($data['skipShopMeetCut']) || intval($data['groupBuyId'] ?? 0) > 0;
|
|
|
+ $seckillGoodsPrice = self::capSeckillExcludePrice($data['seckillGoodsPrice'] ?? 0, $data['actPrice'] ?? 0);
|
|
|
+ $seckillGoodsNum = is_numeric($data['seckillGoodsNum'] ?? 0) ? $data['seckillGoodsNum'] : 0;
|
|
|
+ unset($data['skipShopMeetCut'], $data['skipMemberDiscount'], $data['seckillGoodsPrice'], $data['seckillGoodsNum']);
|
|
|
if ($book == 0 && !$skipShopMeetCut) {
|
|
|
$actPrice = $data['actPrice'];
|
|
|
$meetNum = $shop->meetNum ?? 0;
|
|
|
$meetAmount = $shop->meetAmount ?? 0;
|
|
|
$cutOption = $shop->cutAmount ?? 0;
|
|
|
$cutStyle = $shop->cutStyle ?? 0;
|
|
|
+ // 满减金额门槛和折扣额按剔除秒杀后的应付算,避免秒杀价凑满减或被打折
|
|
|
+ $discountablePrice = bcsub($actPrice, $seckillGoodsPrice, 2);
|
|
|
+ // 满减件数门槛不含秒杀份数,最低消费数量仍用订单 bigNum
|
|
|
+ $meetBigNum = isset($data['bigNum']) ? bcsub($data['bigNum'], $seckillGoodsNum, 2) : 0;
|
|
|
+ if (bccomp($meetBigNum, '0', 2) < 0) {
|
|
|
+ $meetBigNum = 0;
|
|
|
+ }
|
|
|
|
|
|
if ($cutStyle == 0) {
|
|
|
$cutAmount = $cutOption;
|
|
|
} else {
|
|
|
$miniOption = bcsub(1, $cutOption, 2);
|
|
|
- $cutAmount = bcmul($actPrice, $miniOption, 2);
|
|
|
+ $cutAmount = bcmul($discountablePrice, $miniOption, 2);
|
|
|
}
|
|
|
if ($cutAmount > 0 && $meetNum >= 0 && $meetAmount > 0) {
|
|
|
- if (isset($data['bigNum']) && $data['bigNum'] >= $meetNum && $data['actPrice'] >= $meetAmount) {
|
|
|
- if ($cutAmount < $actPrice) {
|
|
|
+ if (bccomp($meetBigNum, $meetNum, 2) >= 0 && bccomp($discountablePrice, $meetAmount, 2) >= 0) {
|
|
|
+ if (bccomp($cutAmount, $discountablePrice, 2) < 0) {
|
|
|
$actPrice = bcsub($actPrice, $cutAmount, 2);
|
|
|
$data['orderReachDiscountPrice'] = $cutAmount;
|
|
|
$data['actPrice'] = $actPrice;
|
|
|
@@ -233,6 +243,27 @@ class OrderClass extends BaseClass
|
|
|
return self::add($data, true);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 将会员折/满减要剔除的秒杀金额限制在应付范围内。
|
|
|
+ * 红包把应付压到低于秒杀额时,不能用完整秒杀额去减,否则会抬高应付。
|
|
|
+ *
|
|
|
+ * @param mixed $seckillPrice 秒杀商品行合计
|
|
|
+ * @param mixed $payablePrice 当前应付(含运费包装、已减红包)
|
|
|
+ * @return string 不超过应付的秒杀剔除额
|
|
|
+ */
|
|
|
+ public static function capSeckillExcludePrice($seckillPrice, $payablePrice)
|
|
|
+ {
|
|
|
+ $seckillPrice = is_numeric($seckillPrice) ? $seckillPrice : 0;
|
|
|
+ $payablePrice = is_numeric($payablePrice) ? $payablePrice : 0;
|
|
|
+ if (bccomp($seckillPrice, '0', 2) <= 0 || bccomp($payablePrice, '0', 2) <= 0) {
|
|
|
+ return '0.00';
|
|
|
+ }
|
|
|
+ if (bccomp($seckillPrice, $payablePrice, 2) > 0) {
|
|
|
+ return bcadd($payablePrice, '0', 2);
|
|
|
+ }
|
|
|
+ return bcadd($seckillPrice, '0', 2);
|
|
|
+ }
|
|
|
+
|
|
|
public static function getByOrderSn($orderSn)
|
|
|
{
|
|
|
return self::getByCondition(['orderSn' => $orderSn]);
|