From faa74c6b37a156153a6dccb1334773ce8f17b74f Mon Sep 17 00:00:00 2001 From: luofei <604446095@qq.com> Date: Thu, 18 Jan 2024 15:48:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8B=89=E6=96=B0=E7=BA=A2?= =?UTF-8?q?=E5=8C=85=E6=B4=BB=E5=8A=A8=E5=8F=91=E6=94=BE=E6=B6=88=E8=B4=B9?= =?UTF-8?q?=E9=87=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dao/store/StoreActivityOrderDao.php | 71 ++++++++ .../consumption/StoreConsumptionUserDao.php | 159 ++++++++++++++++++ app/common/model/store/StoreActivityOrder.php | 28 +++ .../consumption/StoreConsumptionUser.php | 24 +++ app/listener/paySuccess.php | 10 ++ 5 files changed, 292 insertions(+) create mode 100644 app/common/dao/store/StoreActivityOrderDao.php create mode 100644 app/common/dao/store/consumption/StoreConsumptionUserDao.php create mode 100644 app/common/model/store/StoreActivityOrder.php create mode 100644 app/common/model/store/consumption/StoreConsumptionUser.php diff --git a/app/common/dao/store/StoreActivityOrderDao.php b/app/common/dao/store/StoreActivityOrderDao.php new file mode 100644 index 00000000..0b11441c --- /dev/null +++ b/app/common/dao/store/StoreActivityOrderDao.php @@ -0,0 +1,71 @@ +activity_id = $activityId; + $model->user_id = $groupOrder['uid']; + $model->group_order_id = $groupOrder['group_order_id']; + $model->spread_id = $spreadId; + $model->total_amount = $groupOrder['pay_price']; + $model->is_first_order = $isFirstOrder; + if (!$model->save()) { + throw new \Exception('活动订单保存失败'); + } + } + + /** + * 活动订单撤销 + * @param int $groupOrderId + * @return void + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function repeal(int $groupOrderId) + { + $model = StoreActivityOrder::where('group_order_id', $groupOrderId)->find(); + $model->status = StoreActivityOrder::STATUS_INVALID; + if (!$model->save()) { + throw new \Exception('活动订单保存失败'); + } + } + + /** + * 活动订单批量撤销 + * @param array $groupOrderIds + * @return void + * @throws \Exception + */ + public function batchRepeal(array $groupOrderIds) + { + $count = StoreActivityOrder::whereIn('group_order_id', $groupOrderIds)->update(['status' => StoreActivityOrder::STATUS_INVALID]); + if ($count < count($groupOrderIds)) { + throw new \Exception('活动订单批量作废失败'); + } + } + +} diff --git a/app/common/dao/store/consumption/StoreConsumptionUserDao.php b/app/common/dao/store/consumption/StoreConsumptionUserDao.php new file mode 100644 index 00000000..0cc7f5bf --- /dev/null +++ b/app/common/dao/store/consumption/StoreConsumptionUserDao.php @@ -0,0 +1,159 @@ +where('paid', 1)->where('pay_time', '>=', $this->consumption['start_time'])->find()->toArray(); + if (!empty($this->consumption['config'])) { + $rate = 0; + $scope = []; + // 根据当前订单金额,计算是否满足消费金发放条件 + foreach ($this->consumption['config'] as $item) { + if ($item['start'] <= $groupOrder['pay_price'] && $item['end'] >= $groupOrder['pay_price']) { + $rate = bcdiv($item['rate'], 100, 2); + $scope = $item; + break; + } + } + if ($rate <= 0) { + return false; + } + 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($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)->whereBetween('total_amount', $scope['start'], $scope['end'])->find(); + if (empty($spreadGroupOrder)) { + return false; + } + $spreadOrderIds = $this->isFinished($spreadUserId, $scope); + if ($spreadOrderIds !== false) { + $spreadOrderIds = "{$spreadGroupOrder['group_order_id']}," . $spreadOrderIds; + $this->send($rate, $spreadUserId, $spreadOrderIds, $spreadGroupOrder['total_amount']); + $storeActivityOrderDao->batchRepeal(explode(',', $spreadOrderIds)); + } + } + } elseif ($this->consumption['type'] == StoreConsumption::TYPE_OWNER_CONSUMPTION) { + $this->send($rate, $groupOrder['uid'], $groupOrder['group_order_id'], $groupOrder['pay_price']); + $storeActivityOrderDao->repeal($groupOrder['group_order_id']); + } + Db::commit(); + } catch (\Exception $e) { + Db::rollback(); + } + } + } + + /** + * 判断用户是否满足条件 + * @param int $userId + * @param array $scope + * @return false|string + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + 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(); + $userOrders = []; + foreach ($groupOrders as $groupOrder) { + if (!isset($userOrders[$groupOrder['user_id']])) { + $userOrders[$groupOrder['user_id']] = $groupOrder; + } + } + if (count($userOrders) < 4) { + return false; + } + return implode(',', array_column($userOrders, 'group_order_id')); + } + + /** + * 发放消费金 + * @param float $rate + * @param int $userId + * @param string $groupOrderIds + * @param float $amount + * @return void + * @throws \Exception + */ + public function send(float $rate, int $userId, string $groupOrderIds, float $amount) + { + $model = new StoreConsumptionUser(); + $model->coupon_id = $this->consumption['coupon_id']; + $model->uid = $userId; + $model->coupon_title = $this->consumption['title']; + $model->order_id_set = $groupOrderIds; + $model->coupon_price = bcmul($amount, $rate, 2); + $model->balance = $model->coupon_price; + $model->create_time = date('Y-m-d H:i:s'); + $model->start_time = date('Y-m-d H:i:s', time() + 7 * 86400); + $model->end_time = date('Y-m-d H:i:s', time() + 7 * 86400 + 365 * 86400); + $model->type = 'send'; + if (!$model->save()) { + throw new \Exception('发放失败'); + } + } + + /** + * 判断是否是首单 + * @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) + { + $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 则表示是首单 + } + +} \ No newline at end of file diff --git a/app/common/model/store/StoreActivityOrder.php b/app/common/model/store/StoreActivityOrder.php new file mode 100644 index 00000000..04a50b78 --- /dev/null +++ b/app/common/model/store/StoreActivityOrder.php @@ -0,0 +1,28 @@ +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']); + } foreach ($orderList as $k => $order) { // $merchant = Merchant::find($order['mer_id']); //添加到代发订单表里