Main.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2017~2024 https://www.yiovo.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
  8. // +----------------------------------------------------------------------
  9. // | Author: 萤火科技 <admin@yiovo.com>
  10. // +----------------------------------------------------------------------
  11. declare (strict_types=1);
  12. namespace app\api\service\order\source\checkout;
  13. use app\api\service\Order as OrderService;
  14. use app\common\enum\order\OrderSource as OrderSourceEnum;
  15. /**
  16. * 订单结算台-普通商品扩展类
  17. * Class Main
  18. * @package app\api\service\order\source\checkout
  19. */
  20. class Main extends Basics
  21. {
  22. /**
  23. * 验证商品列表
  24. * @return bool
  25. */
  26. public function validateGoodsList(): bool
  27. {
  28. // 验证商品是否下架
  29. if (!$this->validateGoodsStatus()) {
  30. return false;
  31. }
  32. // 判断商品库存
  33. if (!$this->validateGoodsSeckillStock()) {
  34. return false;
  35. }
  36. // 验证商品限购
  37. if (!$this->validateLimitNum()) {
  38. return false;
  39. }
  40. return true;
  41. }
  42. /**
  43. * 判断商品是否下架
  44. * @return bool
  45. */
  46. private function validateGoodsStatus(): bool
  47. {
  48. foreach ($this->goodsList as $goods) {
  49. if ($goods['is_delete'] || $goods['status'] == 20) {
  50. $this->error = "很抱歉,商品 [{$goods['goods_name']}] 已下架";
  51. return false;
  52. }
  53. }
  54. return true;
  55. }
  56. /**
  57. * 判断商品库存数量
  58. * @return bool
  59. */
  60. private function validateGoodsSeckillStock(): bool
  61. {
  62. foreach ($this->goodsList as $goods) {
  63. if ($goods['total_num'] > $goods['skuInfo']['stock_num']) {
  64. $this->error = "很抱歉,商品 [{$goods['goods_name']}] 库存不足";
  65. return false;
  66. }
  67. }
  68. return true;
  69. }
  70. /**
  71. * 验证商品限购
  72. * @return bool
  73. */
  74. public function validateLimitNum(): bool
  75. {
  76. foreach ($this->goodsList as $goods) {
  77. // 不限购
  78. if (!$goods['is_restrict']) return true;
  79. // 商品单次限购数量
  80. if ($goods['total_num'] > $goods['restrict_single']) {
  81. $this->error = "很抱歉,商品 [{$goods['goods_name']}] 限购{$goods['restrict_single']}件,请修改购买数量";
  82. return false;
  83. }
  84. // 获取用户已下单的件数(未取消 订单来源)
  85. $alreadyBuyNum = OrderService::getGoodsBuyNum($this->user['user_id'], $goods['goods_id'], OrderSourceEnum::MAIN);
  86. // 情况1: 已购买0件, 实际想购买5件
  87. if ($alreadyBuyNum == 0 && $goods['total_num'] > $goods['restrict_total']) {
  88. $this->error = "很抱歉,商品 [{$goods['goods_name']}] 限购{$goods['restrict_total']}件,请修改购买数量";
  89. return false;
  90. }
  91. // 情况2: 已购买3件, 实际想购买1件
  92. if ($alreadyBuyNum >= $goods['restrict_total']) {
  93. $this->error = "很抱歉,商品 [{$goods['goods_name']}] 限购{$goods['restrict_total']}件,您已购买过{$alreadyBuyNum}件";
  94. return false;
  95. }
  96. // 情况3: 已购买2件, 实际想购买2件
  97. if (($alreadyBuyNum + $goods['total_num']) > $goods['restrict_total']) {
  98. $diffNum = ($alreadyBuyNum + $goods['total_num']) - $goods['restrict_total'];
  99. $this->error = "很抱歉,商品 [{$goods['goods_name']}] 限购{$goods['restrict_total']}件,您最多能再购买{$diffNum}件";
  100. return false;
  101. }
  102. }
  103. return true;
  104. }
  105. }