From d5fbab7a1dfa06956dc8e74d6a727514dd73faa5 Mon Sep 17 00:00:00 2001 From: wuhui_zzw <1760308791@qq.com> Date: Wed, 19 Jun 2024 12:00:07 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=EF=BC=9A=E5=85=91=E6=8D=A2?= =?UTF-8?q?=E7=A0=81=E4=BD=BF=E7=94=A8=E6=B5=81=E7=A8=8B=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=EF=BC=9A=E4=BC=9A=E5=91=98=E5=8D=A1=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E4=BD=99=E9=A2=9D=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/common/dao/user/VipExchangeCodeDao.php | 10 +- .../repositories/user/UserBillRepository.php | 1 + .../repositories/user/UserOrderRepository.php | 47 +++++++- app/controller/api/user/Svip.php | 108 +++++++++++++++--- .../exchangeQuota/OrderVipPayEvent.php | 44 +++++-- route/api.php | 26 +++-- 6 files changed, 197 insertions(+), 39 deletions(-) diff --git a/app/common/dao/user/VipExchangeCodeDao.php b/app/common/dao/user/VipExchangeCodeDao.php index f0eb965..a50ac2e 100644 --- a/app/common/dao/user/VipExchangeCodeDao.php +++ b/app/common/dao/user/VipExchangeCodeDao.php @@ -48,10 +48,16 @@ class VipExchangeCodeDao extends BaseDao{ $query->field(['mer_id','mer_name'])->bind(['mer_name']); }, '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']); }, 'user' => function($query){ $query->field('uid,nickname,avatar'); diff --git a/app/common/repositories/user/UserBillRepository.php b/app/common/repositories/user/UserBillRepository.php index 480f6c2..67a3654 100644 --- a/app/common/repositories/user/UserBillRepository.php +++ b/app/common/repositories/user/UserBillRepository.php @@ -57,6 +57,7 @@ class UserBillRepository extends BaseRepository 'mer_lock_money/order' => '商户佣金冻结', 'now_money/brokerage' => '佣金转入余额', 'now_money/pay_product' => '购买商品', + 'now_money/pay_vip' => '会员卡开通', 'now_money/presell' => '支付预售尾款', 'now_money/recharge' => '余额充值', 'now_money/sys_dec_money' => '系统减少余额', diff --git a/app/common/repositories/user/UserOrderRepository.php b/app/common/repositories/user/UserOrderRepository.php index 6fd9670..bbab71e 100644 --- a/app/common/repositories/user/UserOrderRepository.php +++ b/app/common/repositories/user/UserOrderRepository.php @@ -8,12 +8,12 @@ namespace app\common\repositories\user; use app\common\dao\user\LabelRuleDao; use app\common\dao\user\UserOrderDao; +use app\common\model\system\merchant\Merchant; +use app\common\model\user\User; use app\common\repositories\BaseRepository; use app\common\repositories\store\order\StoreOrderRepository; -use app\common\repositories\system\groupData\GroupDataRepository; use crmeb\jobs\SendSmsJob; use crmeb\services\PayService; -use FormBuilder\Factory\Elm; use think\exception\ValidateException; use think\facade\Db; use think\facade\Log; @@ -76,14 +76,13 @@ class UserOrderRepository extends BaseRepository 'bind_staff_id' => $params['bind_staff_id'] ?? '', 'exchange_code' => $params['exchange_code'] ?? '', 'exchange_code_id' => $params['exchange_code_id'] ?? 0, + 'source' => $params['source'] ?? 0, ]; - // 判断:兑换不需要支付 - if($data['exchange_code_id'] > 0 && !empty($data['exchange_code'])){ + if($data['source'] == 2){ $data['pay_price'] = 0; $data['pay_type'] = 'free'; } - $body = [ 'order_sn' => $order_sn, 'pay_price' => $data['pay_price'], @@ -99,8 +98,14 @@ class UserOrderRepository extends BaseRepository $info = $this->dao->create($data); if ($data['pay_price']){ try { + + // 余额支付 + if ($type === 'balance') return $this->payBalance($user, $data, $info->order_id); + + $service = new PayService($type,$body, 'user_order'); $config = $service->pay($user); + return app('json')->status($type, $config + ['order_id' => $info->order_id]); } catch (\Exception $e) { // 判断:兑换不需要支付 @@ -180,4 +185,36 @@ class UserOrderRepository extends BaseRepository if ($user->phone) Queue::push(SendSmsJob::class,['tempId' => 'SVIP_PAY_SUCCESS','id' => ['phone' => $user->phone, 'date' => $date]]); return ; } + + + // 余额支付 + public function payBalance(User $user, $data, $order_id){ + // 判断:是否开启余额支付 + if (!systemConfig('yue_pay_status')) throw new ValidateException('未开启余额支付'); + $balance = $user['now_money'] ?? 0; + if ($balance < $data['pay_price']) throw new ValidateException('余额不足,请更换支付方式'); + // 余额支付处理 + Db::transaction(function () use ($user, $data, $balance, $order_id) { + // 扣除用户余额 + $user->now_money = bcsub($user->now_money, $data['pay_price'], 2); + $user->save(); + // 余额变更记录 + $userBillData = [ + 'link_id' => $order_id, + 'status' => 1, + 'title' => '开通会员卡', + 'number' => $data['pay_price'], + 'mark' => '余额支付'.floatval($data['pay_price']).'元开通'.$data['title'], + 'balance' => $user->now_money + ]; + app()->make(UserBillRepository::class)->decBill($user['uid'], 'now_money', 'pay_vip', $data); + + $this->paySuccess($data); + }); + + return app('json')->status('success', '余额支付成功', ['order_id' => $order_id]); + } + + + } diff --git a/app/controller/api/user/Svip.php b/app/controller/api/user/Svip.php index 966ea09..ed4bcb2 100644 --- a/app/controller/api/user/Svip.php +++ b/app/controller/api/user/Svip.php @@ -169,8 +169,10 @@ class Svip extends BaseController } return app('json')->success($data ?? ['count' => 0,'list' => []]); } + + /** - * Common: 会员卡兑换 + * Common: 兑换码 - 使用 * Author: wu-hui * Time: 2024/03/02 18:46 * @param GroupDataRepository $groupDataRepository @@ -208,19 +210,98 @@ class Svip extends BaseController $params['bind_staff_id'] = $exchangeCodeInfo['staff_id'] ?? 0; $params['exchange_code'] = $exchangeCode; $params['exchange_code_id'] = $exchangeCodeInfo['id']; + $params['source'] = 1; $userOrderRepository->add($res, $user, $params); // 开通成功 修改信息 - UserVipExchangeCode::where('id',$exchangeCodeInfo['id']) - ->update([ - 'status' => 2, - 'use_time' => date("Y-m-d H:i:s",time()), - 'use_user_id' => $uid - ]); + UserVipExchangeCode::where('id',$exchangeCodeInfo['id'])->update([ + 'status' => 2, + 'use_time' => date("Y-m-d H:i:s",time()), + 'use_user_id' => $uid + ]); return app('json')->success(); } /** - * Common: 兑换码信息获取 + * Common: 兑换码 - 信息获取 + * Author: wu-hui + * Time: 2024/06/19 9:43 + * @param GroupDataRepository $groupDataRepository + * @return mixed + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function vipExchangeCodeInfo(GroupDataRepository $groupDataRepository){ + // 参数获取 + $exchangeCode = $this->request->param('exchange_code', ''); + $exchangeCodeInfo = $this->vipExchangeCodeGetInfo($exchangeCode); + + return app('json')->success($exchangeCodeInfo); + } + /** + * Common: 兑换码 - 获取兑换码信息 + * Author: wu-hui + * Time: 2024/06/19 10:42 + * @param $exchangeCode + * @return mixed + */ + protected function vipExchangeCodeGetInfo($exchangeCode){ + // 参数获取 + if(empty($exchangeCode)) throw new ValidateException('兑换码不存在!'); + $user = $this->request->userInfo(); + $uid = $this->request->uid(); + // 获取兑换码信息 + $exchangeCodeInfo = app()->make(VipExchangeCodeRepository::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 = app()->make(GroupDataRepository::class)->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('您已开通该类型会员!'); + + return $exchangeCodeInfo; + } + /** + * Common: 兑换码 - 支付并且开通 + * Author: wu-hui + * Time: 2024/06/19 11:42 + * @param StoreOrderCreateRepository $orderCreateRepository + * @return mixed + */ + public function vipExchangeCodePayment(StoreOrderCreateRepository $orderCreateRepository){ + // 参数获取 + $uid = $this->request->uid(); + $user = $this->request->userInfo(); + $payInfo = $this->request->params(['pay_type', 'return_url', 'code']); + if (!in_array($payInfo['pay_type'], StoreOrderRepository::PAY_TYPE, true)) return app('json')->fail('请选择正确的支付方式'); + // 兑换码信息 + $exchangeCodeInfo = $this->vipExchangeCodeGetInfo($payInfo['code']); + $payInfo['money'] = (float)$exchangeCodeInfo['svip_price'] ?? 0; + + return Db::transaction(function () use ($exchangeCodeInfo, $payInfo, $user) { + $res = app()->make(GroupDataRepository::class)->getWhere(['group_data_id' => $exchangeCodeInfo['group_data_id'], 'status' => 1]); + // 模拟下单 + $params['pay_type'] = $payInfo['pay_type'] ?? 'free'; + $params['return_url'] = $payInfo['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'] = $payInfo['code']; + $params['exchange_code_id'] = $exchangeCodeInfo['id']; + $params['source'] = 1; + return app()->make(UserOrderRepository::class)->add($res, $user, $params); + }); + } + + + /** + * Common: 邀请码 - 信息获取 * Author: wu-hui * Time: 2024/04/03 11:33 * @return mixed @@ -229,17 +310,17 @@ class Svip extends BaseController // 参数获取 $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('兑换码不存在!'); + if(empty($exchangeCodeInfo)) throw new ValidateException('邀请码不存在!'); return app('json')->success($exchangeCodeInfo); } /** - * Common: 邀请码下单并且支付 + * Common: 邀请码 - 下单并且支付 * Author: wu-hui * Time: 2024/04/03 15:03 * @param StoreOrderCreateRepository $orderCreateRepository @@ -300,7 +381,7 @@ class Svip extends BaseController } } /** - * Common: 邀请码使用 + * Common: 邀请码 - 使用 * Author: wu-hui * Time: 2024/04/03 16:25 * @param GroupDataRepository $groupDataRepository @@ -317,7 +398,7 @@ class Svip extends BaseController $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() @@ -339,6 +420,7 @@ class Svip extends BaseController $params['bind_staff_id'] = $exchangeCodeInfo['staff_id'] ?? 0; $params['exchange_code'] = $exchangeCode; $params['exchange_code_id'] = $exchangeCodeInfo['id']; + $params['source'] = 2; $userOrderRepository->add($res, $user, $params); // 开通成功 修改信息 UserInviteCode::where('exchange_code',$exchangeCode)->update([ diff --git a/app/listener/exchangeQuota/OrderVipPayEvent.php b/app/listener/exchangeQuota/OrderVipPayEvent.php index 51b9ddb..2058886 100644 --- a/app/listener/exchangeQuota/OrderVipPayEvent.php +++ b/app/listener/exchangeQuota/OrderVipPayEvent.php @@ -8,6 +8,7 @@ use app\common\model\marketing\AgentBrokerage; use app\common\model\store\service\StoreService; use app\common\model\system\merchant\Merchant; use app\common\model\user\ExchangeQuotaRecord; +use app\common\model\user\UserVipExchangeCode; use app\common\repositories\user\ExchangeQuotaRepository; use think\facade\Log; @@ -23,6 +24,9 @@ class OrderVipPayEvent{ $this->giveQuotaHandle($order, $vipInfo); // 会员卡开通成功 - 分佣操作 $this->agentBrokerageHandle($order, $vipInfo); + // 兑换码 - 支付开通成功处理 + $this->vipExchangeCodePaymentSuccessHandle($order, $vipInfo); + }catch(\Exception $e){ @@ -122,15 +126,11 @@ class OrderVipPayEvent{ ]; } - - - - if(count($insertData) > 0) ExchangeQuotaRecord::insertAll($insertData); } // 会员卡开通成功 - 分佣操作 private function agentBrokerageHandle($order, $vipInfo){ - Log::info('会员卡开通成功 - 分佣操作 - 开始: '.var_export($vipInfo,1)); + // Log::info('会员卡开通成功 - 分佣操作 - 开始: '.var_export($vipInfo,1)); // 获取用户各个角色信息 $bindStaffId = $order->bind_staff_id ?? 0; $bindMerId = $order->bind_mer_id ?? 0; @@ -152,9 +152,9 @@ class OrderVipPayEvent{ $deliveryAgentId = (int)Merchant::where('mer_id',$bindMerId)->value('agent_id'); $agent8 = Agent::where('id',$deliveryAgentId)->where('agent_type',8)->findOrEmpty(); $data = [ - 'user_order_id' => $order->order_id, - 'staff_uid' => $bindStaffId, - 'staff_id' => $serviceId, + 'user_order_id' => $order->order_id ?? 0, + 'staff_uid' => $bindStaffId ?? 0, + 'staff_id' => $serviceId ?? 0, 'staff_brokerage' => (float)$vipInfo['brokerage_staff'], 'store_uid' => $agent7->uid ?? 0, 'store_agent_id' => $agent7->id ?? 0, @@ -177,6 +177,34 @@ class OrderVipPayEvent{ AgentBrokerage::insert($data); } } + // 兑换码 - 支付开通成功处理 + public function vipExchangeCodePaymentSuccessHandle($order, $vipInfo){ + // Log::info('会员卡开通成功 - 兑换码-支付开通成功处理 - 开始: '.var_export([ + // 'order_id' => $order->order_id ?? '', + // 'uid' => $order->uid ?? '', + // 'source' => $order->source ?? '', + // 'exchange_code' => $order->exchange_code ?? '', + // 'exchange_code_id' => $order->exchange_code_id ?? '', + // ],1)); + // 这里仅处理兑换码 开通成功 + $source = $order->source ?? 0; + $exchange_code_id = $order->exchange_code_id ?? 0; + if($source != 1 || (int)$exchange_code_id <= 0) return false; + // 修改兑换码状态 + UserVipExchangeCode::where('id', (int)$exchange_code_id)->update([ + 'status' => 2, + 'use_time' => date("Y-m-d H:i:s",time()), + 'use_user_id' => $order->uid + ]); + + return true; + } + + + + + + } \ No newline at end of file diff --git a/route/api.php b/route/api.php index d21970d..267e222 100644 --- a/route/api.php +++ b/route/api.php @@ -342,8 +342,8 @@ Route::group('api/', function () { Route::group( function () { //付费会员购买 Route::post('svip/pay/:id', 'api.user.Svip/createOrder'); - // 付费会员兑换 - Route::post('sVip/vipExchangeCode', 'api.user.Svip/vipExchangeCode'); + // 付费会员兑换 已于2024-6-19 弃用 + // Route::post('sVip/vipExchangeCode', 'api.user.Svip/vipExchangeCode'); //订单检查 Route::group('order/v3', function () { Route::post('check', 'PointsOrder/beforCheck'); @@ -401,6 +401,19 @@ Route::group('api/', function () { Route::get('promote_qr_code', 'Merchant/promoteQrCode');// 推广二维码 Route::get('online_payment_qr_code', 'Merchant/onlinePaymentQrCode');// 买单二维码 })->prefix('api.store.merchant.'); + // 付费会员 + Route::group('svip', function () { + // 邀请码 + Route::get('getInviteInfo', '/inviteCodeInfo'); + Route::get('invitePayment', '/inviteCodePayment'); + Route::get('inviteUse', '/inviteUse'); + // 兑换码 + Route::get('vipExchangeCodeInfo', '/vipExchangeCodeInfo'); + Route::post('vipExchangeCodePayment', '/vipExchangeCodePayment'); + + + + })->prefix('api.user.Svip'); // 运营中心 - 公共 Route::group('agent', function () { Route::get('agent_list', 'agentList');// 我的代理身份列表 @@ -424,9 +437,6 @@ Route::group('api/', function () { Route::get('delivery/payment_record', 'Delivery/paymentRecord');// 缴费记录 Route::get('delivery/mer_list', 'Delivery/merList');// 绑定商户 Route::post('delivery/allocation_order', 'Delivery/allocationOrder');// 分配缴费记录 - - - })->prefix('api.marketing.agent.'); // 供应商相关 Route::group('supplier', function () { @@ -475,8 +485,6 @@ Route::group('api/', function () { Route::post('apply_join', 'applyJoin'); Route::post('apply_join_info', 'applyJoinInfo'); Route::post('list', 'getList'); - - })->prefix('api.store.merchant.Shareholder/'); @@ -495,10 +503,6 @@ Route::group('api/', function () { Route::get('coupon_lst', '/svipCoupon'); Route::get('product_lst', '/svipProductList'); Route::post('coupon_receive/:id', '/receiveCoupon'); - // 邀请码 - Route::get('getInviteInfo', '/inviteCodeInfo'); - Route::get('invitePayment', '/inviteCodePayment'); - Route::get('inviteUse', '/inviteUse'); })->prefix('api.user.Svip'); //社区 Route::group('community', function () {