| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- <?php
- namespace addons\Store\common\services;
- use addons\Store\common\models\Store;
- use addons\Store\common\models\StoreOrder;
- use addons\Store\common\models\StoreOrderPickup;
- use Yii;
- /**
- * 自提码
- * @package addons\Store\common\services
- */
- class PickupService extends BaseService
- {
- /**
- * 自提码前缀
- */
- const PREFIX = 'A';
- /**
- * 自提码最大数(默认位数,超过之后自动增加)
- */
- const MAX = 9999;
- /**
- * @var string
- */
- protected $stage;
- /**
- * 创建订单自提
- *
- * @param string $order_id 门店订单ID
- * @param string $mall_order_id 主商城订单ID
- * @return boolean
- */
- public function createOrderPickup(int $order_id, int $mall_order_id)
- {
- /**
- * @var StoreOrder|null
- */
- $order = StoreOrder::getOrderByOrderId($this->mall_id, $order_id);
- if (empty($order)) return true;
- $store_id = $order->store_id;
- // 是否自提订单
- if (!$order->isPuckup()) return true;
- // 查看店铺是否开启
- if (!$this->isOpenPickup($store_id)) return true;
- $code = $this->getPickupCode($store_id);
- if (
- StoreOrderPickup::addPickup(
- $this->mall_id, $store_id, $order_id, $mall_order_id, $this->getStage(), $code
- )
- ) {
- return true;
- }
- return false;
- }
- /**
- * 店铺是否开启自提码
- *
- * @param integer $store_id
- * @return boolean
- */
- public function isOpenPickup(int $store_id)
- {
- $key = sprintf('pickup_setting:%s', $store_id);
- if ($pickup = Yii::$app->redis->get($key)) {
- $pickup = json_decode($pickup, true);
- } else {
- $pickup = Store::getStorePickup($store_id);
- Yii::$app->redis->setex($key, 5, json_encode($pickup));
- }
- if (empty($pickup)) return false;
- return ($pickup['status'] ?? 0) == 1;
- }
- /**
- * 获取自提号
- *
- * @param integer $store_id
- * @return string
- */
- protected function getPickupCode(int $store_id) : string
- {
- $stage = $this->getStage();
- /* $count = StoreOrderPickup::getStoreCount($store_id, $stage);
- return static::PREFIX . ($count <= static::MAX
- ? str_pad(++$count, strlen(static::MAX), '0', STR_PAD_LEFT)
- : ++$count); */
- // 使用redis自增
- $key = sprintf('getPickupCode:%s:%s', $store_id, $stage);
- Yii::$app->redis->incr($key);
- $count = Yii::$app->redis->get($key);
- return static::PREFIX . ($count <= static::MAX
- ? str_pad($count, strlen(static::MAX), '0', STR_PAD_LEFT)
- : $count);
- }
- /**
- * 获取期数
- *
- * @return string
- */
- protected function getStage() :string
- {
- return $this->stage ?? $this->stage = date('Ymd');
- }
- }
|