From 092801fa02c3e459805e533147171ba3ca2e7b88 Mon Sep 17 00:00:00 2001 From: luofei <604446095@qq.com> Date: Sun, 21 Jan 2024 13:52:51 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BA=A2=E5=8C=85=E4=BD=99?= =?UTF-8?q?=E9=A2=9D=E6=9F=A5=E8=AF=A2?= 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 | 44 ++++++++++++++----- .../dao/store/consumption/CommissionDao.php | 5 --- .../consumption/StoreConsumptionUserDao.php | 25 +++++++---- .../consumption/StoreConsumptionUser.php | 5 +++ app/controller/api/store/StoreActivity.php | 17 ++++++- route/api.php | 3 +- 7 files changed, 73 insertions(+), 27 deletions(-) diff --git a/app/common/dao/store/StoreActivityOrderDao.php b/app/common/dao/store/StoreActivityOrderDao.php index 26ea1dce..1d5f8c6e 100644 --- a/app/common/dao/store/StoreActivityOrderDao.php +++ b/app/common/dao/store/StoreActivityOrderDao.php @@ -33,6 +33,7 @@ class StoreActivityOrderDao extends BaseDao $model->spread_id = $spreadId; $model->pay_price = $groupOrder['pay_price']; $model->is_first_order = $isFirstOrder; + $model->status = StoreActivityOrder::STATUS_VALID; $consumptionDetail = StoreConsumptionDetail::where('group_order_id', $groupOrder['group_order_id']) ->field('group_order_id,sum(amount) amount,sum(pay_price) pay_price,coupon_user_id') ->find(); diff --git a/app/common/dao/store/StoreActivityUserDao.php b/app/common/dao/store/StoreActivityUserDao.php index b8ad3224..65d93a5f 100644 --- a/app/common/dao/store/StoreActivityUserDao.php +++ b/app/common/dao/store/StoreActivityUserDao.php @@ -9,6 +9,7 @@ use app\common\model\store\consumption\StoreConsumptionUser; use app\common\model\store\StoreActivityOrder; use app\common\model\store\StoreActivityUser; use app\common\model\user\User; +use app\common\model\user\UserBill; class StoreActivityUserDao extends BaseDao { @@ -168,24 +169,45 @@ class StoreActivityUserDao extends BaseDao /** * 红包获取记录 * @param int $userId + * @param int $type + * @param int $page + * @param int $limit * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ - public function record(int $userId) + public function record(int $userId, int $type, int $page, int $limit) { - $consumption = StoreConsumption::whereIn('type', [StoreConsumption::TYPE_OWNER_CONSUMPTION, StoreConsumption::TYPE_PULL_CONSUMPTION])->select()->toArray(); - $record = StoreConsumptionUser::where('uid', $userId) - ->whereIn('coupon_id', array_column($consumption, 'coupon_id')) - ->where('status', '>=', StoreConsumptionUser::STATUS_UNUSED) - ->field('coupon_price,order_amount,create_time') - ->select(); - $totalAmount = 0; - foreach ($record as $item) { - $totalAmount = bcadd($totalAmount, $item['coupon_price'], 2); + $totalAmount = StoreConsumptionUser::where('uid', $userId) + ->whereIn('type', $type) + ->where('status', StoreConsumptionUser::STATUS_UNUSED) + ->sum('balance'); + $query = UserBill::where('uid', $userId) + ->where('category', 'red_pack') + ->where('type', "red_pack_{$type}"); + $count = $query->count(); + $record = $query->page($page)->limit($limit)->select(); + return ['total_amount' => $totalAmount, 'count' => $count, 'record' => $record]; + } + + /** + * 红包余额统计 + * @param int $userId + * @return array + */ + public function total(int $userId) + { + $totalAmount = StoreConsumptionUser::where('uid', $userId) + ->whereIn('type', [StoreConsumptionUser::TYPE_ONE, StoreConsumptionUser::TYPE_TWO]) + ->where('status', StoreConsumptionUser::STATUS_UNUSED) + ->field('SUM(balance) as total_amount,type') + ->group('type') + ->select()->toArray(); + foreach ($totalAmount as &$item) { + $item['type_cn'] = StoreConsumptionUser::TYPE_MAP[$item['type']]; } - return ['total_amount' => $totalAmount, 'record' => $record]; + return $totalAmount; } } diff --git a/app/common/dao/store/consumption/CommissionDao.php b/app/common/dao/store/consumption/CommissionDao.php index 1a5f99e6..abc21656 100644 --- a/app/common/dao/store/consumption/CommissionDao.php +++ b/app/common/dao/store/consumption/CommissionDao.php @@ -56,11 +56,6 @@ class CommissionDao if ($redPack > 0) { $userId = Merchant::where('mer_id', $order['mer_id'])->value('uid'); $storeConsumptionDao->send($consumption, $consumption['config']['red_pack_rate'], $userId, $order['order_id'], $order['pay_price'], StoreConsumptionUser::STATUS_UNUSED, StoreConsumptionUser::TYPE_TWO); - $user = User::where('uid', $userId)->find(); - $user->red_pack_balance = bcadd($user->red_pack_balance, $redPack, 2); - if (!$user->save()) { - throw new \Exception('红包余额更新出错'); - } } $promotionCode = User::where('uid', $order['uid'])->value('promotion_code'); if (!empty($promotionCode)) { diff --git a/app/common/dao/store/consumption/StoreConsumptionUserDao.php b/app/common/dao/store/consumption/StoreConsumptionUserDao.php index a91a41ea..b14e6450 100644 --- a/app/common/dao/store/consumption/StoreConsumptionUserDao.php +++ b/app/common/dao/store/consumption/StoreConsumptionUserDao.php @@ -58,10 +58,10 @@ class StoreConsumptionUserDao extends BaseDao $activityUser = (new StoreActivityUserDao())->getOne($userId); $consumption = (new StoreConsumptionDao())->getOne($activityUser['value'] ?? 0); //用户没有参加 消费金活动 或 已超过任务完成时间 - if (empty($consumption['config']) || strtotime('+1 year', $activityUser['create_time']) < time()) { + $endTime = $this->getEndTime($activityUser['create_time'] ?? '2024-01-01 00:00:00'); + if (empty($consumption['config']) || $endTime < time()) { return false; } - $endTime = strtotime('+1 year', $activityUser['create_time']); $orderValidAmount = min($groupOrder['pay_price'], $this->maxAmount); $scope = $this->getScope($consumption, $orderValidAmount); //用户没有达到 消费金活动 任一档次 @@ -70,7 +70,7 @@ class StoreConsumptionUserDao extends BaseDao } Db::startTrans(); try { - $isFirstOrder = $this->isFirstOrder($userId, $consumption['start_time'], $endTime); + $isFirstOrder = $this->isFirstOrder($userId, $consumption['start_time'], date('Y-m-d H:i:s', $endTime)); $storeActivityOrderDao = new StoreActivityOrderDao(); $storeActivityOrder = $storeActivityOrderDao->save($groupOrder, $spreadUserId, $isFirstOrder); if ($consumption['type'] == StoreConsumption::TYPE_OWNER_CONSUMPTION && $storeActivityOrder['status'] == StoreActivityOrder::STATUS_VALID) { @@ -99,14 +99,14 @@ class StoreConsumptionUserDao extends BaseDao { // 查询推荐人的消费金类型 $spreadActivityUser = (new StoreActivityUserDao())->getOne($spreadUserId); + $endTime = $this->getEndTime($spreadActivityUser['create_time'] ?? '2024-01-01 00:00:00'); $spreadConsumption = (new StoreConsumptionDao())->getOne($spreadActivityUser['value'] ?? 0); // 查询推荐人满足条件的有效订单 $spreadGroupOrder = StoreActivityOrder::where('user_id', $spreadUserId)->where('status', StoreActivityOrder::STATUS_VALID)->find(); - if (empty($spreadGroupOrder) || empty($spreadConsumption['config']) || empty($spreadActivityUser) || strtotime('+1 year', $spreadActivityUser['create_time']) < time()) { + if (empty($spreadGroupOrder) || empty($spreadConsumption['config']) || empty($spreadActivityUser) || $endTime < time()) { // 推荐人消费金数据为空 或 推荐人的有效订单为空 或推荐人已超过任务完成时间,作为发起人参加活动 return $this->promoter($userId, $groupOrder, 0); } - $endTime = strtotime('+1 year', $spreadActivityUser['create_time']); // 订单有效金额为实付金额+红包金额 $orderValidAmount = bcadd($spreadGroupOrder['pay_price'], $spreadGroupOrder['red_pack'], 2); $orderValidAmount = min($orderValidAmount, $this->maxAmount); @@ -117,7 +117,7 @@ class StoreConsumptionUserDao extends BaseDao } Db::startTrans(); try { - $isFirstOrder = $this->isFirstOrder($userId, $spreadConsumption['start_time'], $endTime); + $isFirstOrder = $this->isFirstOrder($userId, $spreadConsumption['start_time'], date('Y-m-d H:i:s', $endTime)); $storeActivityOrderDao = new StoreActivityOrderDao(); $storeActivityOrder = $storeActivityOrderDao->save($groupOrder, $spreadUserId, $isFirstOrder); if ($spreadConsumption['type'] == StoreConsumption::TYPE_PULL_CONSUMPTION && $isFirstOrder && $storeActivityOrder['status'] == StoreActivityOrder::STATUS_VALID) { @@ -147,6 +147,7 @@ class StoreConsumptionUserDao extends BaseDao foreach ($consumption['config'] as $k => $item) { if ($item['start'] <= $amount && $item['end'] >= $amount) { $item['rate'] = bcdiv($item['rate'], 100, 2); + $item['rate_two'] = (isset($item['rate_two']) && $item['rate_two'] > 0) ? bcdiv($item['rate_two'], 100, 2) : 0; $scope = $item; break; } @@ -219,15 +220,16 @@ class StoreConsumptionUserDao extends BaseDao if (!$model->save()) { throw new \Exception('发放失败'); } + $title = $type == StoreConsumptionUser::TYPE_TWO ? '现金抵扣红包' : '无门槛实物通用红包'; // 写入红包日志 /** @var $userBillRepository UserBillRepository */ $userBillRepository = app()->make(UserBillRepository::class); $userBillRepository->incBill($userId, 'red_pack', "red_pack_{$type}", [ 'link_id' => $model['coupon_user_id'], 'status' => 1, - 'title' => '获得现金抵扣红包', + 'title' => '获得' . $title, 'number' => $couponPrice, - 'mark' => '获得现金抵扣红包' . $couponPrice, + 'mark' => '获得' . $title . $couponPrice, 'balance' => 0 ]); } @@ -247,7 +249,12 @@ class StoreConsumptionUserDao extends BaseDao return 0; } $count = StoreGroupOrder::where('uid', $userId)->where('paid', 1)->whereBetweenTime('pay_time', $startTime, $endTime)->count(); - return intval($count == 1); + return intval($count <= 1); + } + + public function getEndTime($datetime) + { + return strtotime('+1 year', strtotime($datetime)); } } \ No newline at end of file diff --git a/app/common/model/store/consumption/StoreConsumptionUser.php b/app/common/model/store/consumption/StoreConsumptionUser.php index 2cd1ee6f..94113933 100644 --- a/app/common/model/store/consumption/StoreConsumptionUser.php +++ b/app/common/model/store/consumption/StoreConsumptionUser.php @@ -15,6 +15,11 @@ class StoreConsumptionUser extends BaseModel const TYPE_ONE = 1; //实物通用红包 const TYPE_TWO = 2; //现金抵扣红包 + const TYPE_MAP = [ + self::TYPE_ONE => '无门槛实物通用红包', + self::TYPE_TWO => '现金抵扣红包', + ]; + public static function tablePk(): string { return 'coupon_user_id'; diff --git a/app/controller/api/store/StoreActivity.php b/app/controller/api/store/StoreActivity.php index 67eaa006..29efd9cb 100644 --- a/app/controller/api/store/StoreActivity.php +++ b/app/controller/api/store/StoreActivity.php @@ -80,7 +80,22 @@ class StoreActivity extends BaseController public function record(StoreActivityUserDao $dao) { $userId = $this->request->uid(); - $result = $dao->record($userId); + $type = $this->request->get('type', 1); + $page = $this->request->get('page', 1); + $limit = $this->request->get('limit', 10); + $result = $dao->record($userId, $type, $page, $limit); + return app('json')->success($result); + } + + /** + * 红包余额统计 + * @param StoreActivityUserDao $dao + * @return mixed + */ + public function total(StoreActivityUserDao $dao) + { + $userId = $this->request->uid(); + $result = $dao->total($userId); return app('json')->success($result); } diff --git a/route/api.php b/route/api.php index c6f85dc5..3c13de02 100644 --- a/route/api.php +++ b/route/api.php @@ -463,7 +463,8 @@ 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'); //活动红包使用记录 + Route::get('record', 'api.store.StoreActivity/record'); //活动红包获取记录 + Route::get('total', 'api.store.StoreActivity/total'); //活动红包统计 }); })->middleware(UserTokenMiddleware::class, true);