From f249e6d434f65cc011051c9ddad11e71de2f5bc3 Mon Sep 17 00:00:00 2001 From: wuhui_zzw <1760308791@qq.com> Date: Wed, 3 Apr 2024 16:40:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=9A=E9=82=80=E8=AF=B7?= =?UTF-8?q?=E7=A0=81=E6=BF=80=E6=B4=BB=E5=8F=8A=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dao/store/order/StoreGroupOrderDao.php | 2 +- app/common/dao/user/UserInviteCodeDao.php | 10 +- .../order/StoreOrderCreateRepository.php | 2 +- .../store/order/StoreOrderRepository.php | 7 +- .../user/UserInviteCodeRepository.php | 1 + app/controller/api/user/Svip.php | 142 ++++++++++++++++++ .../exchangeQuota/OrderPaySuccessEvent.php | 24 +++ route/api.php | 17 ++- 8 files changed, 192 insertions(+), 13 deletions(-) diff --git a/app/common/dao/store/order/StoreGroupOrderDao.php b/app/common/dao/store/order/StoreGroupOrderDao.php index 40a63ef..2a5c737 100644 --- a/app/common/dao/store/order/StoreGroupOrderDao.php +++ b/app/common/dao/store/order/StoreGroupOrderDao.php @@ -51,7 +51,7 @@ class StoreGroupOrderDao extends BaseDao ->when(isset($where['paid']) && $where['paid'] !== '',function($query) use ($where){ $query->where('paid',$where['paid']); }) - ->whereNotIn('activity_type',[30,31,32,33]) + ->whereNotIn('activity_type',[30,31,32,33,34]) ->when(isset($where['paid']) && $where['paid'] !== '',function($query) use ($where){ $query->where('paid',$where['paid']); }) diff --git a/app/common/dao/user/UserInviteCodeDao.php b/app/common/dao/user/UserInviteCodeDao.php index 5bf1753..3588b9d 100644 --- a/app/common/dao/user/UserInviteCodeDao.php +++ b/app/common/dao/user/UserInviteCodeDao.php @@ -44,10 +44,16 @@ class UserInviteCodeDao extends BaseDao{ }) ->with([ 'vipInfo' => function($query){ - $query->field(['group_data_id','value','value as svip_name'])->withAttr('svip_name',function($val){ + $query->field(['group_data_id','value','value as svip_name','value as svip_price','value as svip_info'])->withAttr('svip_name',function($val){ $value = json_decode($val,TRUE); return $value['svip_name'] ?? ''; - })->bind(['svip_name']); + })->withAttr('svip_price',function($val){ + $value = json_decode($val,TRUE); + return $value['price'] ?? ''; + })->withAttr('svip_info',function($val){ + $value = json_decode($val,TRUE); + return $value ?? []; + })->bind(['svip_name','svip_price','svip_info']); }, 'activateUser' => function($query){ $query->field('uid,nickname,avatar'); diff --git a/app/common/repositories/store/order/StoreOrderCreateRepository.php b/app/common/repositories/store/order/StoreOrderCreateRepository.php index 701c3b1..404da96 100644 --- a/app/common/repositories/store/order/StoreOrderCreateRepository.php +++ b/app/common/repositories/store/order/StoreOrderCreateRepository.php @@ -3005,7 +3005,7 @@ class StoreOrderCreateRepository extends StoreOrderRepository{ // 整理订单数据 $orderList[] = [ 'cartInfo' => [], - 'activity_type' => $activityType,// 30=在线买单;32=代理入驻;33=参加活动支付 + 'activity_type' => $activityType,// 30=在线买单;32=代理入驻;33=参加活动支付;34=邀请码支付 'commission_rate' => 0, 'order_type' => 0, 'is_virtual' => 1, diff --git a/app/common/repositories/store/order/StoreOrderRepository.php b/app/common/repositories/store/order/StoreOrderRepository.php index dd14ff3..80d2a95 100644 --- a/app/common/repositories/store/order/StoreOrderRepository.php +++ b/app/common/repositories/store/order/StoreOrderRepository.php @@ -173,6 +173,9 @@ class StoreOrderRepository extends BaseRepository }else if($groupOrder['activity_type'] == 33){ $data['title'] = '用户参加活动'; $data['mark'] = '余额支付' . floatval($groupOrder['pay_price']) . '元'; + }else if($groupOrder['activity_type'] == 34){ + $data['title'] = '邀请码激活'; + $data['mark'] = '余额支付' . floatval($groupOrder['pay_price']) . '元'; }else if($groupOrder['activity_type'] == 35){ $merName = Merchant::where('mer_id',$groupOrder->with_goods_mer_id)->value('mer_name'); $data['title'] = '酒道馆['.$merName.']进货'; @@ -279,7 +282,7 @@ class StoreOrderRepository extends BaseRepository app()->make(ProductAssistSetRepository::class)->changStatus($order->orderProduct[0]['activity_id']); } if ($order->order_type == 1 && $order->status != 10) $order->verify_code = $this->verifyCode(); - if (!in_array($order->activity_type,[30,31,32,33]) && $order->orderProduct[0]->product->type == 2) { + if (!in_array($order->activity_type,[30,31,32,33,34]) && $order->orderProduct[0]->product->type == 2) { $order->status = 3;//2; todo 订单进入待评价改为已完成 $order->delivery_type = 6; $order->delivery_name = '自动发货'; @@ -287,7 +290,7 @@ class StoreOrderRepository extends BaseRepository $isPoints = true; } // 判断:是否为在线买单、酒道馆补差价 在线买单,订单支付则订单完成 - if(in_array($order->activity_type,[30,31,32,33])){ + if(in_array($order->activity_type,[30,31,32,33,34])){ $order->status = 3; } diff --git a/app/common/repositories/user/UserInviteCodeRepository.php b/app/common/repositories/user/UserInviteCodeRepository.php index 96cee7b..b513db1 100644 --- a/app/common/repositories/user/UserInviteCodeRepository.php +++ b/app/common/repositories/user/UserInviteCodeRepository.php @@ -235,4 +235,5 @@ class UserInviteCodeRepository extends BaseRepository{ } + } diff --git a/app/controller/api/user/Svip.php b/app/controller/api/user/Svip.php index adec9c8..f5495fc 100644 --- a/app/controller/api/user/Svip.php +++ b/app/controller/api/user/Svip.php @@ -5,24 +5,31 @@ namespace app\controller\api\user; +use app\common\dao\store\coupon\StoreCouponProductDao; +use app\common\model\user\UserInviteCode; use app\common\model\user\UserOrder; use app\common\model\user\UserVipExchangeCode; use app\common\repositories\store\coupon\StoreCouponRepository; +use app\common\repositories\store\order\StoreOrderCreateRepository; use app\common\repositories\store\order\StoreOrderRepository; use app\common\repositories\store\product\ProductRepository; use app\common\repositories\store\product\SpuRepository; use app\common\repositories\system\groupData\GroupDataRepository; use app\common\repositories\system\groupData\GroupRepository; +use app\common\repositories\system\merchant\MerchantRepository; use app\common\repositories\system\serve\ServeOrderRepository; use app\common\repositories\user\MemberinterestsRepository; use app\common\repositories\user\UserBillRepository; +use app\common\repositories\user\UserInviteCodeRepository; use app\common\repositories\user\UserOrderRepository; use app\common\repositories\user\UserRepository; use app\common\repositories\user\VipExchangeCodeRepository; use crmeb\basic\BaseController; use app\common\repositories\user\FeedbackRepository; +use crmeb\services\LockService; use think\App; use think\exception\ValidateException; +use think\facade\Db; class Svip extends BaseController { @@ -211,6 +218,141 @@ class Svip extends BaseController return app('json')->success(); } + /** + * Common: 兑换码信息获取 + * Author: wu-hui + * Time: 2024/04/03 11:33 + * @return mixed + */ + public function inviteCodeInfo(){ + // 参数获取 + $exchangeCode = $this->request->param('exchange_code'); + if(empty($exchangeCode)) throw new ValidateException('邀请码不存在!'); + // 获取兑换码信息 + $exchangeCodeInfo = app()->make(UserInviteCodeRepository::class) + ->getSearchModel(['exchange_code'=>$exchangeCode]) + ->findOrEmpty() + ->toArray(); + if(empty($exchangeCodeInfo)) throw new ValidateException('兑换码不存在!'); + + return app('json')->success($exchangeCodeInfo); + } + /** + * Common: 邀请码下单并且支付 + * Author: wu-hui + * Time: 2024/04/03 15:03 + * @param StoreOrderCreateRepository $orderCreateRepository + * @return mixed + */ + public function inviteCodePayment(StoreOrderCreateRepository $orderCreateRepository){ + // 参数获取 + $uid = $this->request->uid(); + $payInfo = $this->request->params(['pay_type', 'return_url', 'code']); + if (!in_array($payInfo['pay_type'], StoreOrderRepository::PAY_TYPE, true)) return app('json')->fail('请选择正确的支付方式'); + // 获取邀请码信息 + $exchangeCodeInfo = app()->make(UserInviteCodeRepository::class) + ->getSearchModel(['exchange_code'=>$payInfo['code']]) + ->findOrEmpty() + ->toArray(); + $payInfo['money'] = (float)$exchangeCodeInfo['svip_price'] ?? 0; + // 判断:是否需要支付 + if($payInfo['money'] <= 0){ + // 无需支付 直接激活 + UserInviteCode::where('exchange_code',$payInfo['code'])->update([ + 'activate_uid' => $uid, + 'activate' => date('Y-m-d H:i:s'), + 'status' => 1 + ]); + + return app('json')->success("激活成功"); + } + else{ + // 发起支付 + $groupOrder = app() + ->make(LockService::class) + ->exec('online_order.create',function() use ($payInfo,$orderCreateRepository){ + $payType = array_search($payInfo['pay_type'],StoreOrderRepository::PAY_TYPE); + + return $orderCreateRepository->onlinePayment($payType,$payInfo,$this->request->userInfo(),34); + }); + + // 记录订单信息 + $orderId = app()->make(StoreOrderRepository::class) + ->getSearch([]) + ->where('group_order_id',$groupOrder->group_order_id) + ->value('order_id'); + UserInviteCode::where('exchange_code',$payInfo['code'])->update([ + 'order_id' => $orderId, + ]); + + if ($groupOrder['pay_price'] == 0) { + app()->make(StoreOrderRepository::class)->paySuccess($groupOrder); + return app('json')->status('success', '支付成功', ['order_id' => $groupOrder['group_order_id']]); + } + try { + + return app()->make(StoreOrderRepository::class)->pay($payInfo['pay_type'], $this->request->userInfo(), $groupOrder, $payInfo['return_url'], $this->request->isApp()); + } catch (\Exception $e) { + + return app('json')->status('error', $e->getMessage(), ['order_id' => $groupOrder->group_order_id]); + } + } + } + /** + * Common: 邀请码使用 + * Author: wu-hui + * Time: 2024/04/03 16:25 + * @param GroupDataRepository $groupDataRepository + * @param UserOrderRepository $userOrderRepository + * @return mixed + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function inviteUse(GroupDataRepository $groupDataRepository,UserOrderRepository $userOrderRepository){ + // 参数获取 + $exchangeCode = $this->request->param('exchange_code'); + if(empty($exchangeCode)) throw new ValidateException('邀请码不存在!'); + $user = $this->request->userInfo(); + $uid = $this->request->uid(); + Db::transaction(function () use ($groupDataRepository, $userOrderRepository, $user, $uid, $exchangeCode) { + // 获取兑换码信息 + $exchangeCodeInfo = app()->make(UserInviteCodeRepository::class) + ->getSearchModel(['exchange_code'=>$exchangeCode]) + ->findOrEmpty() + ->toArray(); + if(empty($exchangeCodeInfo)) throw new ValidateException('邀请码不存在!'); + if($exchangeCodeInfo['status'] == 0) throw new ValidateException('邀请码未激活!'); + if($exchangeCodeInfo['status'] == 2) throw new ValidateException('邀请码已被使用,请勿重复使用!'); + if($exchangeCodeInfo['status'] == 3) throw new ValidateException('邀请码已作废!'); + // 使用 + $res = $groupDataRepository->getWhere(['group_data_id' => $exchangeCodeInfo['group_data_id'], 'status' => 1]); + if (!$res) throw new ValidateException('会员卡不存在!'); + if ($user->is_svip == 3) throw new ValidateException('您已经是终身会员!'); + if ($user->is_svip !== -1 && $res['value']['svip_type'] == 1) throw new ValidateException('兑换失败,您已开通该类型会员!'); + // 模拟下单 + $params['pay_type'] = 'free'; + $params['return_url'] = ''; + $params['is_app'] = $this->request->isApp(); + $params['bind_mer_id'] = $exchangeCodeInfo['mer_id'] ?? 0; + $params['bind_staff_id'] = $exchangeCodeInfo['staff_id'] ?? 0; + $params['exchange_code'] = $exchangeCode; + $params['exchange_code_id'] = $exchangeCodeInfo['id']; + $userOrderRepository->add($res, $user, $params); + // 开通成功 修改信息 + UserInviteCode::where('exchange_code',$exchangeCode)->update([ + 'use_user_id' => $uid, + 'use_time' => date('Y-m-d H:i:s'), + 'status' => 2 + ]); + // 绑定上下级关系 + app()->make(UserRepository::class)->bindSpread($user, intval($exchangeCodeInfo['activate_uid'])); + }); + + + return app('json')->success(); + } + } diff --git a/app/listener/exchangeQuota/OrderPaySuccessEvent.php b/app/listener/exchangeQuota/OrderPaySuccessEvent.php index 292f120..94d7f30 100644 --- a/app/listener/exchangeQuota/OrderPaySuccessEvent.php +++ b/app/listener/exchangeQuota/OrderPaySuccessEvent.php @@ -7,11 +7,13 @@ use app\common\model\user\ExchangeIntegralRecord; use app\common\model\user\ExchangeQuota; use app\common\model\user\ExchangeQuotaRecord; use app\common\model\user\User; +use app\common\model\user\UserInviteCode; use app\common\repositories\marketing\activity\RecordRepository; use app\common\repositories\marketing\AgentBrokerageRepository; use app\common\repositories\system\merchant\MerchantRepository; use app\common\repositories\user\ExchangePickupPointRepository; use app\common\repositories\user\ExchangeQuotaRepository; +use app\common\repositories\user\UserInviteCodeRepository; use crmeb\jobs\UserBrokerageLevelJob; use think\facade\Log; use think\facade\Queue; @@ -39,6 +41,9 @@ class OrderPaySuccessEvent{ }else if($groupOrder->activity_type == 33){ // 加入活动支付成功 $this->joinActivitySuccessHandle($groupOrder); + }else if($groupOrder->activity_type == 34){ + // 邀请码激活 + $this->inviteCodeActivation($groupOrder); }else{ // 其他订单 $this->orderPaySuccessHandle($groupOrder); @@ -66,6 +71,8 @@ class OrderPaySuccessEvent{ Log::info('支付成功 - 邀请代理人员奖励及免审核 - 错误: '.var_export($data,1)); }else if($groupOrder->activity_type == 33){ Log::info('支付成功 - 加入活动支付成功 - 错误: '.var_export($data,1)); + }else if($groupOrder->activity_type == 34){ + Log::info('支付成功 - 邀请码激活 - 错误: '.var_export($data,1)); }else{ Log::info('支付成功 - 赠送酒卡额度 - 错误: '.var_export($data,1)); } @@ -240,5 +247,22 @@ class OrderPaySuccessEvent{ return true; } + // 支付成功 - 邀请码激活 + public function inviteCodeActivation($groupOrder){ + foreach($groupOrder->orderList as $orderInfo){ + UserInviteCode::where('order_id',(int)$orderInfo->order_id)->update([ + 'activate_uid' => $orderInfo->uid, + 'activate' => date('Y-m-d H:i:s'), + 'status' => 1 + ]); + } + + return true; + } + + + + + } \ No newline at end of file diff --git a/route/api.php b/route/api.php index 3463de4..72703b0 100644 --- a/route/api.php +++ b/route/api.php @@ -332,14 +332,10 @@ Route::group('api/', function () { })->prefix('api.community.'); //请求频率 Route::group( function () { - //付费会员购买 Route::post('svip/pay/:id', 'api.user.Svip/createOrder'); - // 付费会员兑换 Route::post('sVip/vipExchangeCode', 'api.user.Svip/vipExchangeCode'); - - //订单检查 Route::group('order/v3', function () { Route::post('check', 'PointsOrder/beforCheck'); @@ -455,8 +451,6 @@ Route::group('api/', function () { Route::group(function () { // 商品兑换 Route::get('exchange/pointList', 'api.user.Exchange/getPointList'); - - // 付费会员 Route::group('svip', function () { //价格列表 @@ -465,8 +459,17 @@ Route::group('api/', function () { Route::get('coupon_lst', '/svipCoupon'); Route::get('product_lst', '/svipProductList'); Route::post('coupon_receive/:id', '/receiveCoupon'); - })->prefix('api.user.Svip'); + // 邀请码 + Route::get('getInviteInfo', '/inviteCodeInfo'); + Route::get('invitePayment', '/inviteCodePayment'); + Route::get('inviteUse', '/inviteUse'); + + + + + + })->prefix('api.user.Svip'); //社区 Route::group('community', function () { //社区文章列表