重构:兑换码使用流程

增加:会员卡支持余额支付
This commit is contained in:
wuhui_zzw 2024-06-19 12:00:07 +08:00
parent fb7e051be9
commit d5fbab7a1d
6 changed files with 197 additions and 39 deletions

View File

@ -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');

View File

@ -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' => '系统减少余额',

View File

@ -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]);
}
}

View File

@ -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([

View File

@ -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;
}
}

View File

@ -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 () {