PickupService.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. <?php
  2. namespace addons\Store\common\services;
  3. use addons\Store\common\models\Store;
  4. use addons\Store\common\models\StoreOrder;
  5. use addons\Store\common\models\StoreOrderPickup;
  6. use Yii;
  7. /**
  8. * 自提码
  9. * @package addons\Store\common\services
  10. */
  11. class PickupService extends BaseService
  12. {
  13. /**
  14. * 自提码前缀
  15. */
  16. const PREFIX = 'A';
  17. /**
  18. * 自提码最大数(默认位数,超过之后自动增加)
  19. */
  20. const MAX = 9999;
  21. /**
  22. * @var string
  23. */
  24. protected $stage;
  25. /**
  26. * 创建订单自提
  27. *
  28. * @param string $order_id 门店订单ID
  29. * @param string $mall_order_id 主商城订单ID
  30. * @return boolean
  31. */
  32. public function createOrderPickup(int $order_id, int $mall_order_id)
  33. {
  34. /**
  35. * @var StoreOrder|null
  36. */
  37. $order = StoreOrder::getOrderByOrderId($this->mall_id, $order_id);
  38. if (empty($order)) return true;
  39. $store_id = $order->store_id;
  40. // 是否自提订单
  41. if (!$order->isPuckup()) return true;
  42. // 查看店铺是否开启
  43. if (!$this->isOpenPickup($store_id)) return true;
  44. $code = $this->getPickupCode($store_id);
  45. if (
  46. StoreOrderPickup::addPickup(
  47. $this->mall_id, $store_id, $order_id, $mall_order_id, $this->getStage(), $code
  48. )
  49. ) {
  50. return true;
  51. }
  52. return false;
  53. }
  54. /**
  55. * 店铺是否开启自提码
  56. *
  57. * @param integer $store_id
  58. * @return boolean
  59. */
  60. public function isOpenPickup(int $store_id)
  61. {
  62. $key = sprintf('pickup_setting:%s', $store_id);
  63. if ($pickup = Yii::$app->redis->get($key)) {
  64. $pickup = json_decode($pickup, true);
  65. } else {
  66. $pickup = Store::getStorePickup($store_id);
  67. Yii::$app->redis->setex($key, 5, json_encode($pickup));
  68. }
  69. if (empty($pickup)) return false;
  70. return ($pickup['status'] ?? 0) == 1;
  71. }
  72. /**
  73. * 获取自提号
  74. *
  75. * @param integer $store_id
  76. * @return string
  77. */
  78. protected function getPickupCode(int $store_id) : string
  79. {
  80. $stage = $this->getStage();
  81. /* $count = StoreOrderPickup::getStoreCount($store_id, $stage);
  82. return static::PREFIX . ($count <= static::MAX
  83. ? str_pad(++$count, strlen(static::MAX), '0', STR_PAD_LEFT)
  84. : ++$count); */
  85. // 使用redis自增
  86. $key = sprintf('getPickupCode:%s:%s', $store_id, $stage);
  87. Yii::$app->redis->incr($key);
  88. $count = Yii::$app->redis->get($key);
  89. return static::PREFIX . ($count <= static::MAX
  90. ? str_pad($count, strlen(static::MAX), '0', STR_PAD_LEFT)
  91. : $count);
  92. }
  93. /**
  94. * 获取期数
  95. *
  96. * @return string
  97. */
  98. protected function getStage() :string
  99. {
  100. return $this->stage ?? $this->stage = date('Ymd');
  101. }
  102. }