Sharp.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. <?php
  2. /**
  3. *
  4. * @copyright ©2020 点小铺
  5. * @author hanj
  6. * @link: https://dyuit.com
  7. * Created by VSCode
  8. */
  9. namespace app\api\service\order\source\checkout;
  10. use app\api\service\sharp\Order as SharpOrderService;
  11. /**
  12. * 订单结算台-秒杀商品扩展类
  13. * Class Sharp
  14. * @package app\api\service\order\source\checkout
  15. */
  16. class Sharp extends Basics
  17. {
  18. /**
  19. * 验证商品列表
  20. * @return bool
  21. */
  22. public function validateGoodsList()
  23. {
  24. // 验证商品是否下架
  25. if (!$this->validateGoodsStatus()) {
  26. return false;
  27. }
  28. // 验证商品限购
  29. if (!$this->validateLimitNum()) {
  30. return false;
  31. }
  32. // 判断商品库存
  33. if (!$this->validateGoodsSeckillStock()) {
  34. return false;
  35. }
  36. return true;
  37. }
  38. /**
  39. * 判断商品是否下架
  40. * @return bool
  41. */
  42. private function validateGoodsStatus()
  43. {
  44. foreach ($this->goodsList as $goods) {
  45. if ($goods['is_delete'] || !$goods['status']) {
  46. $this->error = "很抱歉,商品 [{$goods['goods_name']}] 已下架";
  47. return false;
  48. }
  49. }
  50. return true;
  51. }
  52. /**
  53. * 判断商品是否下架
  54. * @return bool
  55. */
  56. private function validateGoodsSeckillStock()
  57. {
  58. foreach ($this->goodsList as $goods) {
  59. if ($goods['total_num'] > $goods['goods_sku']['seckill_stock']) {
  60. $this->error = "很抱歉,商品 [{$goods['goods_name']}] 库存不足";
  61. return false;
  62. }
  63. }
  64. return true;
  65. }
  66. /**
  67. * 验证商品限购
  68. * @return bool
  69. */
  70. public function validateLimitNum()
  71. {
  72. foreach ($this->goodsList as $goods) {
  73. // 不限购
  74. if ($goods['limit_num'] <= 0) return true;
  75. // 获取用户已下单的件数(未取消 订单来源)
  76. $alreadyBuyNum = SharpOrderService::getAlreadyBuyNum($this->user['user_id'], $goods['goods_id']);
  77. // 情况1: 已购买0件, 实际想购买5件
  78. if ($alreadyBuyNum == 0 && $goods['total_num'] > $goods['limit_num']) {
  79. $this->error = "很抱歉,该商品限购{$goods['limit_num']}件,请修改购买数量";
  80. return false;
  81. }
  82. // 情况2: 已购买3件, 实际想购买1件
  83. if ($alreadyBuyNum >= $goods['limit_num']) {
  84. $this->error = "很抱歉,该商品限购{$goods['limit_num']}件,您当前已下单{$alreadyBuyNum}件,无法购买";
  85. return false;
  86. }
  87. // 情况3: 已购买2件, 实际想购买2件
  88. if (($alreadyBuyNum + $goods['total_num']) > $goods['limit_num']) {
  89. $diffNum = ($alreadyBuyNum + $goods['total_num']) - $goods['limit_num'];
  90. $this->error = "很抱歉,该商品限购{$goods['limit_num']}件,您最多能再购买{$diffNum}件";
  91. return false;
  92. }
  93. }
  94. return true;
  95. }
  96. }