From f5a0094e1d32e1d71f311c72d6a9a939a345548f Mon Sep 17 00:00:00 2001 From: luofei <604446095@qq.com> Date: Fri, 19 Jan 2024 14:43:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=B6=88=E8=B4=B9=E9=87=91?= =?UTF-8?q?=E5=8F=91=E6=94=BE=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dao/store/StoreActivityOrderDao.php | 1 - app/common/dao/store/StoreActivityUserDao.php | 5 +- .../consumption/StoreConsumptionUserDao.php | 167 ++++++++++++------ app/listener/paySuccess.php | 10 +- route/api.php | 1 + 5 files changed, 115 insertions(+), 69 deletions(-) diff --git a/app/common/dao/store/StoreActivityOrderDao.php b/app/common/dao/store/StoreActivityOrderDao.php index 0b11441c..9379782a 100644 --- a/app/common/dao/store/StoreActivityOrderDao.php +++ b/app/common/dao/store/StoreActivityOrderDao.php @@ -4,7 +4,6 @@ namespace app\common\dao\store; use app\common\dao\BaseDao; use app\common\model\store\StoreActivityOrder; -use think\facade\Db; class StoreActivityOrderDao extends BaseDao { diff --git a/app/common/dao/store/StoreActivityUserDao.php b/app/common/dao/store/StoreActivityUserDao.php index 2d6b8686..ad77c1df 100644 --- a/app/common/dao/store/StoreActivityUserDao.php +++ b/app/common/dao/store/StoreActivityUserDao.php @@ -75,7 +75,7 @@ class StoreActivityUserDao extends BaseDao */ public function getValue(int $userId, int $activityId = 1) { - $data = StoreActivityUser::where('user_id', $userId)->where('activity_id', $activityId)->find(); + $data = StoreActivityUser::where('user_id', $userId)->where('activity_id', $activityId)->where('status', 1)->find(); return $data->value ?? 0; } @@ -110,8 +110,7 @@ class StoreActivityUserDao extends BaseDao return ['target' => $target, 'allow_receive' => false, 'user_info' => $userInfo]; } $storeConsumptionUserDao = new StoreConsumptionUserDao(); - $storeConsumptionUserDao->consumption = $consumption; - $scope = $storeConsumptionUserDao->getScope($myOrder['total_amount']); + $scope = $storeConsumptionUserDao->getScope($consumption, $myOrder['total_amount']); $userInfo = User::where('spread_uid', $userId)->field('uid,nickname,avatar')->select()->toArray(); $orders = StoreActivityOrder::where('spread_id', $userId) ->whereIn('user_id', array_column($userInfo, 'uid')) diff --git a/app/common/dao/store/consumption/StoreConsumptionUserDao.php b/app/common/dao/store/consumption/StoreConsumptionUserDao.php index be5fc724..1f057fac 100644 --- a/app/common/dao/store/consumption/StoreConsumptionUserDao.php +++ b/app/common/dao/store/consumption/StoreConsumptionUserDao.php @@ -4,6 +4,7 @@ namespace app\common\dao\store\consumption; use app\common\dao\BaseDao; use app\common\dao\store\StoreActivityOrderDao; +use app\common\dao\store\StoreActivityUserDao; use app\common\model\store\consumption\StoreConsumption; use app\common\model\store\consumption\StoreConsumptionUser; use app\common\model\store\order\StoreGroupOrder; @@ -14,8 +15,6 @@ use think\facade\Db; class StoreConsumptionUserDao extends BaseDao { - public $consumption; - protected function getModel(): string { return StoreConsumptionUser::class; @@ -23,73 +22,123 @@ class StoreConsumptionUserDao extends BaseDao /** * 校验用户是否满足红包拉新活动条件 + * @param int $userId 用户id * @param int $groupOrderId 订单id * @return false|void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ - public function check(int $groupOrderId) + public function check(int $userId, int $groupOrderId) { - $groupOrder = StoreGroupOrder::where('group_order_id', $groupOrderId)->where('paid', 1)->where('pay_time', '>=', $this->consumption['start_time'])->find()->toArray(); - if (!empty($this->consumption['config'])) { - // 根据当前订单金额,计算是否满足消费金发放条件 - $scope = $this->getScope($groupOrder['pay_price']); - if ($scope['rate'] <= 0) { - return false; + $spreadUserId = User::where('uid', $userId)->value('spread_uid'); + $groupOrder = StoreGroupOrder::where('group_order_id', $groupOrderId)->find()->toArray(); + if (empty($spreadUserId)) { + $this->promoter($userId, $groupOrder, $spreadUserId); + } else { + $this->guest($userId, $groupOrder, $spreadUserId); + } + } + + /** + * 发起人活动校验 + * @param int $userId + * @param array $groupOrder + * @param int $spreadUserId + * @return bool + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function promoter(int $userId, array $groupOrder, int $spreadUserId) + { + $consumptionId = (new StoreActivityUserDao())->getValue($userId); + $consumption = StoreConsumption::where('coupon_id', $consumptionId)->where('status', 1)->find()->toArray(); + //用户没有参加 消费金活动 + if (!empty($consumption['config'])) { + return false; + } + $scope = $this->getScope($consumption, $groupOrder['pay_price']); + //用户没有达到 消费金活动 任一档次 + if ($scope['rate'] <= 0) { + return false; + } + Db::startTrans(); + try { + $isFirstOrder = $this->isFirstOrder($userId, $consumption['start_time']); + $storeActivityOrderDao = new StoreActivityOrderDao(); + $storeActivityOrderDao->save($groupOrder, $spreadUserId, $isFirstOrder); + if ($consumption['type'] == StoreConsumption::TYPE_OWNER_CONSUMPTION) { + $this->send($consumption, $scope['rate'], $userId, $groupOrder['group_order_id'], $groupOrder['pay_price'], StoreConsumptionUser::STATUS_UNUSED); + $storeActivityOrderDao->repeal($groupOrder['group_order_id']); } - Db::startTrans(); - try { - $isFirstOrder = $this->isFirstOrder($groupOrder['uid'], $groupOrderId, $this->consumption['start_time']); - $storeActivityOrderDao = new StoreActivityOrderDao(); - $spreadUserId = User::where('uid', $groupOrder['uid'])->value('spread_uid'); - $spreadUserId = empty($spreadUserId) ? 0 : $spreadUserId; - $storeActivityOrderDao->save($groupOrder, $spreadUserId, $isFirstOrder); - if ($this->consumption['type'] == StoreConsumption::TYPE_PULL_CONSUMPTION) { - // 拉新返消费金 - // 用户作为推荐人,是否满足任务条件 - $mineOrderIds = $this->isFinished($groupOrder['uid'], $scope); - if ($mineOrderIds !== false) { - $mineOrderIds = "{$groupOrder['group_order_id']}," . $mineOrderIds; - $this->send($scope['rate'], $groupOrder['uid'], $mineOrderIds, $groupOrder['pay_price']); - $storeActivityOrderDao->batchRepeal(explode(',', $mineOrderIds)); - } - // 用户作为受邀人且当前订单是首单 - if ($spreadUserId && $isFirstOrder) { - // 查询推荐人满足条件的订单 - $spreadGroupOrder = StoreActivityOrder::where('user_id', $spreadUserId)->where('status', StoreActivityOrder::STATUS_VALID)->find(); - if ($spreadGroupOrder) { - $spreadScope = $this->getScope($spreadGroupOrder['total_amount']); - if ($spreadScope['start'] == $scope['start']) { - $spreadOrderIds = $this->isFinished($spreadUserId, $scope); - if ($spreadOrderIds !== false) { - $spreadOrderIds = "{$spreadGroupOrder['group_order_id']}," . $spreadOrderIds; - $this->send($scope['rate'], $spreadUserId, $spreadOrderIds, $spreadGroupOrder['total_amount']); - $storeActivityOrderDao->batchRepeal(explode(',', $spreadOrderIds)); - } - } - } - } - } elseif ($this->consumption['type'] == StoreConsumption::TYPE_OWNER_CONSUMPTION) { - $this->send($scope['rate'], $groupOrder['uid'], $groupOrder['group_order_id'], $groupOrder['pay_price'], StoreConsumptionUser::STATUS_UNUSED); - $storeActivityOrderDao->repeal($groupOrder['group_order_id']); + Db::commit(); + } catch (\Exception $e) { + Db::rollback(); + } + return true; + } + + /** + * 受邀人活动校验 + * @param int $userId + * @param array $groupOrder + * @param int $spreadUserId + * @return bool|void + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function guest(int $userId, array $groupOrder, int $spreadUserId) + { + // 查询推荐人的消费金类型 + $spreadConsumptionId = (new StoreActivityUserDao())->getValue($spreadUserId); + $spreadConsumption = StoreConsumption::where('coupon_id', $spreadConsumptionId)->where('status', 1)->find()->toArray(); + // 查询推荐人满足条件的有效订单 + $spreadGroupOrderId = StoreActivityOrder::where('user_id', $spreadUserId)->where('status', StoreActivityOrder::STATUS_VALID)->value('group_order_id'); + $spreadGroupOrder = StoreGroupOrder::where('group_order_id', $spreadGroupOrderId)->where('paid', 1)->find()->toArray(); + if (empty($spreadGroupOrder) || empty($spreadConsumption['config'])) { + // 推荐人消费金数据或推荐人的有效订单为空,作为发起人参加活动 + return $this->promoter($userId, $groupOrder, 0); + } + $spreadScope = $this->getScope($spreadConsumption, $spreadGroupOrder['pay_price']); + if ($groupOrder['pay_price'] < $spreadScope['start']) { + // 当前用户的订单不在推荐人的档位区间,作为发起人参加活动 + return $this->promoter($userId, $groupOrder, 0); + } + Db::startTrans(); + try { + $isFirstOrder = $this->isFirstOrder($userId, $spreadConsumption['start_time']); + $storeActivityOrderDao = new StoreActivityOrderDao(); + $storeActivityOrderDao->save($groupOrder, $spreadUserId, $isFirstOrder); + if ($spreadConsumption['type'] == StoreConsumption::TYPE_PULL_CONSUMPTION && $isFirstOrder) { + // 推荐人消费金类型为拉新且当前用户为首单 + $spreadOrderIds = $this->isFinished($spreadUserId, $spreadScope); + if ($spreadOrderIds !== false) { + $spreadOrderIds = "{$spreadGroupOrder['group_order_id']}," . $spreadOrderIds; + $this->send($spreadConsumption, $spreadScope['rate'], $spreadUserId, $spreadOrderIds, $spreadGroupOrder['total_amount']); + $storeActivityOrderDao->batchRepeal(explode(',', $spreadOrderIds)); } - Db::commit(); - } catch (\Exception $e) { - Db::rollback(); } + Db::commit(); + } catch (\Exception $e) { + Db::rollback(); } } /** * 获取消费档位区间 + * @param array $consumption * @param float $amount * @return array|mixed */ - public function getScope(float $amount) + public function getScope(array $consumption, float $amount) { $scope = []; - foreach ($this->consumption['config'] as $item) { + foreach ($consumption['config'] as $k => $item) { + if (($k + 1) == count($consumption['config'])) { + $item['end'] = 100000000; + } if ($item['start'] <= $amount && $item['end'] >= $amount) { $item['rate'] = bcdiv($item['rate'], 100, 2); $scope = $item; @@ -110,7 +159,11 @@ class StoreConsumptionUserDao extends BaseDao */ public function isFinished(int $userId, array $scope) { - $groupOrders = StoreActivityOrder::where('spread_id', $userId)->where('is_first_order', StoreActivityOrder::IS_FIRST_ORDER)->where('total_amount', '>=', $scope['start'])->where('status', StoreActivityOrder::STATUS_VALID)->field('group_order_id,user_id,total_amount')->select()->toArray(); + $groupOrders = StoreActivityOrder::where('spread_id', $userId) + ->where('is_first_order', StoreActivityOrder::IS_FIRST_ORDER) + ->where('total_amount', '>=', $scope['start']) + ->where('status', StoreActivityOrder::STATUS_VALID) + ->field('group_order_id,user_id,total_amount')->select()->toArray(); $userOrders = []; foreach ($groupOrders as $groupOrder) { if (!isset($userOrders[$groupOrder['user_id']])) { @@ -125,6 +178,7 @@ class StoreConsumptionUserDao extends BaseDao /** * 发放消费金 + * @param array $consumption 消费金类型 * @param float $rate 红包发放比例 * @param int $userId 用户id * @param string $groupOrderIds 订单id集合 @@ -133,12 +187,12 @@ class StoreConsumptionUserDao extends BaseDao * @return void * @throws \Exception */ - public function send(float $rate, int $userId, string $groupOrderIds, float $amount, $status = -2) + public function send(array $consumption, float $rate, int $userId, string $groupOrderIds, float $amount, $status = -2) { $model = new StoreConsumptionUser(); - $model->coupon_id = $this->consumption['coupon_id']; + $model->coupon_id = $consumption['coupon_id']; $model->uid = $userId; - $model->coupon_title = $this->consumption['title']; + $model->coupon_title = $consumption['title']; $model->order_id_set = $groupOrderIds; $model->coupon_price = bcmul($amount, $rate, 2); $model->balance = $model->coupon_price; @@ -155,19 +209,18 @@ class StoreConsumptionUserDao extends BaseDao /** * 判断是否是首单 * @param int $userId 用户id - * @param int $groupOrderId 订单id * @param string $startTime 活动开始时间 * @return int * @throws \think\db\exception\DbException */ - public function isFirstOrder(int $userId, int $groupOrderId, string $startTime) + public function isFirstOrder(int $userId, string $startTime) { $isNewUser = User::where('uid', $userId)->where('create_time', '>=', $startTime)->count(); if ($isNewUser == 0) { return 0; } - $count = StoreGroupOrder::where('group_order_id', '<>', $groupOrderId)->where('paid', 1)->where('pay_time', '>=', $startTime)->count(); - return intval($count == 0); // 如果是0 则表示是首单 + $count = StoreGroupOrder::where('uid', $userId)->where('paid', 1)->where('pay_time', '>=', $startTime)->count(); + return intval($count == 1); } } \ No newline at end of file diff --git a/app/listener/paySuccess.php b/app/listener/paySuccess.php index 048cd3e2..be296e8c 100644 --- a/app/listener/paySuccess.php +++ b/app/listener/paySuccess.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace app\listener; -use app\common\dao\store\consumption\StoreConsumptionDao; use app\common\dao\store\consumption\StoreConsumptionUserDao; use app\common\dao\store\order\StoreCartDao; use app\common\dao\store\StoreActivityUserDao; @@ -35,13 +34,8 @@ class paySuccess { try { $orderList = $event['groupOrder']['orderList']; - $consumptionId = (new StoreActivityUserDao())->getValue($event['groupOrder']['uid']); - $consumption = (new StoreConsumptionDao())->getOne($consumptionId); - if (!empty($consumption)) { - $storeConsumptionUserDao = new StoreConsumptionUserDao(); - $storeConsumptionUserDao->consumption = $consumption; - $storeConsumptionUserDao->check($event['groupOrder']['group_order_id']); - } + $storeConsumptionUserDao = new StoreConsumptionUserDao(); + $storeConsumptionUserDao->check($event['groupOrder']['uid'], $event['groupOrder']['group_order_id']); foreach ($orderList as $k => $order) { $this->recordOrderAddr($order); diff --git a/route/api.php b/route/api.php index b7902f00..d8b2a647 100644 --- a/route/api.php +++ b/route/api.php @@ -463,6 +463,7 @@ Route::group('api/', function () { Route::post('choose', 'api.store.StoreActivity/choose'); //选择消费金类型 Route::get('status', 'api.store.StoreActivity/status'); //获取活动进度 Route::post('receive', 'api.store.StoreActivity/receive'); //领取活动红包 + Route::get('record', 'api.store.StoreActivity/record'); //活动红包使用记录 }); })->middleware(UserTokenMiddleware::class, true);