From 309fdd97570a5f216d984d404c176af66f0c2622 Mon Sep 17 00:00:00 2001 From: wuhui_zzw <1760308791@qq.com> Date: Thu, 18 Jan 2024 11:25:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9A=E5=85=91=E6=8D=A2?= =?UTF-8?q?=E5=95=86=E5=93=81=E8=A1=A5=E9=BD=90=E5=B7=AE=E4=BB=B7=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=9C=A8=E7=BA=BF=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dao/store/order/StoreGroupOrderDao.php | 2 +- .../order/StoreOrderCreateRepository.php | 105 +++++++++++++++++- .../store/order/StoreOrderRepository.php | 10 +- .../user/ExchangePickupPointRepository.php | 60 +++++++++- app/controller/api/user/Exchange.php | 89 +++++++-------- .../exchangeQuota/OrderPaySuccessEvent.php | 17 ++- 6 files changed, 232 insertions(+), 51 deletions(-) diff --git a/app/common/dao/store/order/StoreGroupOrderDao.php b/app/common/dao/store/order/StoreGroupOrderDao.php index ffb5edc..db115c0 100644 --- a/app/common/dao/store/order/StoreGroupOrderDao.php +++ b/app/common/dao/store/order/StoreGroupOrderDao.php @@ -50,7 +50,7 @@ class StoreGroupOrderDao extends BaseDao $query = StoreGroupOrder::getDB()->when(isset($where['paid']) && $where['paid'] !== '', function ($query) use ($where) { $query->where('paid', $where['paid']); }) - ->where('activity_type', '<>',30) + ->whereNotIn('activity_type', [30,31]) ->when(isset($where['paid']) && $where['paid'] !== '', function ($query) use ($where) { $query->where('paid', $where['paid']); }) diff --git a/app/common/repositories/store/order/StoreOrderCreateRepository.php b/app/common/repositories/store/order/StoreOrderCreateRepository.php index 9752e56..99889a6 100644 --- a/app/common/repositories/store/order/StoreOrderCreateRepository.php +++ b/app/common/repositories/store/order/StoreOrderCreateRepository.php @@ -2808,7 +2808,7 @@ class StoreOrderCreateRepository extends StoreOrderRepository{ }*/ - /****** 在线买单 ************************************/ + // 在线买单 - 订单 public function onlinePayment($payType, $payInfo, $user){ $payMoney = abs((float)$payInfo['money']); $merId = (int)$payInfo['mer_id']; @@ -2912,7 +2912,110 @@ class StoreOrderCreateRepository extends StoreOrderRepository{ return $group; } + // 商品兑换 - 订单 + public function exchangeGoods($payType, $payInfo, $user){ + $payMoney = abs((float)$payInfo['money']); + $uid = $user->uid; + // 是否自购 + $isSelfBuy = $user->is_promoter && systemConfig('extension_self') ? 1 : 0; + if($isSelfBuy){ + $spreadUser = $user; + $topUser = $user->valid_spread; + }else{ + $spreadUser = $user->valid_spread; + $topUser = $user->valid_top; + } + // 整理订单数据 + $orderList[] = [ + 'cartInfo' => [], + 'activity_type' => 31,// 31=兑换商品差价订单 + 'commission_rate' => 0, + 'order_type' => 0, + 'is_virtual' => 1, + 'extension_one' => 0, + 'extension_two' => 0, + 'order_sn' => $this->getNewOrderId(StoreOrderRepository::TYPE_SN_ORDER).(0 + 1), + 'uid' => $uid, + 'spread_uid' => $spreadUser->uid ?? 0, + 'top_uid' => $topUser->uid ?? 0, + 'is_selfbuy' => $isSelfBuy, + 'real_name' => $user->real_name ?? '', + 'user_phone' => $user->phone ?? '', + 'user_address' => $user->addres ?? '', + 'cart_id' => '', + 'total_num' => 1, + 'total_price' => $payMoney, + 'total_postage' => 0, + 'pay_postage' => 0, + 'svip_discount' => 0, + 'pay_price' => $payMoney, + 'integral' => 0, + 'integral_price' => 0, + 'give_integral' => 0, + 'mer_id' => 0, + 'cost' => 0, + 'order_extend' => '', + 'coupon_id' => '', + 'mark' => '', + 'coupon_price' => '', + 'platform_coupon_price' => '', + 'pay_type' => $payType, + 'refund_switch' => 0, + 'pickup_record_id' => $payInfo['pickup_record_id'] + ]; + $groupOrder = [ + 'uid' => $uid, + 'group_order_sn' => count($orderList) === 1 ? $orderList[0]['order_sn'] : ($this->getNewOrderId(StoreOrderRepository::TYPE_SN_ORDER).'0'), + 'total_postage' => 0, + 'total_price' => $payMoney, + 'total_num' => 1, + 'real_name' => $user->real_name ?? '', + 'user_phone' => $user->phone ?? '', + 'user_address' => $user->addres ?? '', + 'pay_price' => $payMoney, + 'coupon_price' => 0, + 'pay_postage' => 0, + 'cost' => 0, + 'coupon_id' => '', + 'pay_type' => $payType, + 'give_coupon_ids' => '', + 'integral' => 0, + 'integral_price' => 0, + 'give_integral' => 0, + 'activity_type' => 31,// 31=兑换商品差价订单 + ]; + $group = Db::transaction(function() use ($user,$groupOrder,$orderList){ + $storeGroupOrderRepository = app()->make(StoreGroupOrderRepository::class); + $storeOrderStatusRepository = app()->make(StoreOrderStatusRepository::class); + //创建订单 + $groupOrder = $storeGroupOrderRepository->create($groupOrder); + foreach($orderList as $k => $order){ + $orderList[$k]['group_order_id'] = $groupOrder->group_order_id; + } + $orderStatus = []; + foreach($orderList as $order){ + $cartInfo = $order['cartInfo']; + unset($order['cartInfo']); + //创建子订单 + $_order = $this->dao->create($order); + $orderStatus[] = [ + 'order_id' => $_order->order_id, + 'order_sn' => $_order->order_sn, + 'type' => $storeOrderStatusRepository::TYPE_ORDER, + 'change_message' => '订单生成', + 'change_type' => $storeOrderStatusRepository::ORDER_STATUS_CREATE, + 'uid' => $user->uid, + 'nickname' => $user->nickname, + 'user_type' => $storeOrderStatusRepository::U_TYPE_USER, + ]; + } + $storeOrderStatusRepository->batchCreateLog($orderStatus); + return $groupOrder; + }); + + return $group; + } } diff --git a/app/common/repositories/store/order/StoreOrderRepository.php b/app/common/repositories/store/order/StoreOrderRepository.php index a288fee..011488a 100644 --- a/app/common/repositories/store/order/StoreOrderRepository.php +++ b/app/common/repositories/store/order/StoreOrderRepository.php @@ -147,7 +147,11 @@ class StoreOrderRepository extends BaseRepository if($groupOrder['activity_type'] == 30){ $data['title'] = '在线买单'; $data['mark'] = '余额支付' . floatval($groupOrder['pay_price']) . '元'; + }else if($groupOrder['activity_type'] == 31){ + $data['title'] = '酒道馆差价补齐'; + $data['mark'] = '余额支付' . floatval($groupOrder['pay_price']) . '元'; } + $userBillRepository->decBill($user['uid'], 'now_money', 'pay_product', $data); $this->paySuccess($groupOrder); }); @@ -248,15 +252,15 @@ 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 ($order->activity_type != 30 && $order->orderProduct[0]->product->type == 2) { + if (!in_array($order->activity_type,[30,31]) && $order->orderProduct[0]->product->type == 2) { $order->status = 2; $order->delivery_type = 6; $order->delivery_name = '自动发货'; $order->delivery_id = $this->sendCdkey($order); $isPoints = true; } - // 判断:是否为在线买单 在线买单,订单支付则订单完成 - if($order->activity_type == 30){ + // 判断:是否为在线买单、酒道馆补差价 在线买单,订单支付则订单完成 + if(in_array($order->activity_type,[30,31])){ $order->status = 3; } diff --git a/app/common/repositories/user/ExchangePickupPointRepository.php b/app/common/repositories/user/ExchangePickupPointRepository.php index 0e1ff14..c24a132 100644 --- a/app/common/repositories/user/ExchangePickupPointRepository.php +++ b/app/common/repositories/user/ExchangePickupPointRepository.php @@ -3,7 +3,13 @@ namespace app\common\repositories\user; use app\common\dao\user\ExchangePickupPointDao; +use app\common\model\user\ExchangeIntegralRecord; +use app\common\model\user\ExchangePickupRecord; +use app\common\model\user\ExchangeQuota; +use app\common\model\user\ExchangeQuotaRecord; +use app\common\model\user\User; use app\common\repositories\BaseRepository; +use think\facade\Db; class ExchangePickupPointRepository extends BaseRepository{ @@ -106,7 +112,59 @@ class ExchangePickupPointRepository extends BaseRepository{ return $count > 0 ? 1 : 0; } - + /** + * Common: 兑换成功处理 + * Author: wu-hui + * Time: 2024/01/18 10:03 + * @param $pickupRecordId + */ + public function exchangeSuccessHandle($pickupRecordId){ + $pickupRecordInfo = app()->make(ExchangePickupRecordRepository::class) + ->getSearch([]) + ->where('id',$pickupRecordId) + ->findOrEmpty(); + Db::transaction(function () use ($pickupRecordInfo) { + // 修改状态 + ExchangePickupRecord::update(['status'=>1],['id'=>$pickupRecordInfo['id']]); + // 积分&额度变更数量 + $changeNum = (float)sprintf("%.2f",$pickupRecordInfo['total_money'] - $pickupRecordInfo['diff_money_pay']); + // 变更额度 + $userHoldInfo = ExchangeQuota::where('uid',$pickupRecordInfo['uid'])->findOrEmpty(); + $changeFront = (float)$userHoldInfo->surplus_quota; + $userHoldInfo->use_quota += (float)$changeNum; + $userHoldInfo->surplus_quota -= (float)$changeNum; + $userHoldInfo->save(); + ExchangeQuotaRecord::insert([ + 'uid' => $pickupRecordInfo['uid'], + 'product_id' => 0, + 'order_id' => 0, + 'order_product_id' => 0, + 'change_type' => 0, + 'change_quantity' => (float)$changeNum, + 'change_front' => $changeFront, + 'change_after' => (float)$userHoldInfo->surplus_quota, + 'remark' => "兑换消费", + 'source' => 2, + ]); + // 变更积分 + $userInfo = User::where('uid',$pickupRecordInfo['uid'])->findOrEmpty(); + $integralChangeFront = (float)$userInfo->exchange_integral; + $userInfo->exchange_integral -= (float)$changeNum; + $userInfo->exchange_integral = $userInfo->exchange_integral > 0 ? $userInfo->exchange_integral : 0; + $userInfo->save(); + ExchangeIntegralRecord::insert([ + 'uid' => $pickupRecordInfo['uid'], + 'product_id' => 0, + 'order_id' => 0, + 'order_product_id' => 0, + 'change_type' => 0, + 'change_quantity' => (float)$changeNum, + 'change_front' => $integralChangeFront, + 'change_after' => (float)$userInfo->exchange_integral, + 'remark' => "兑换消费", + ]); + }); + } diff --git a/app/controller/api/user/Exchange.php b/app/controller/api/user/Exchange.php index 1039119..e4b11c7 100644 --- a/app/controller/api/user/Exchange.php +++ b/app/controller/api/user/Exchange.php @@ -8,6 +8,8 @@ use app\common\model\user\ExchangePickupRecord; use app\common\model\user\ExchangeQuota; use app\common\model\user\ExchangeQuotaRecord; use app\common\model\user\User; +use app\common\repositories\store\order\StoreOrderCreateRepository; +use app\common\repositories\store\order\StoreOrderRepository; use app\common\repositories\user\ExchangeIntegralRecordRepository; use app\common\repositories\user\ExchangePickupPointRepository; use app\common\repositories\user\ExchangePickupRecordRepository; @@ -15,6 +17,7 @@ use app\common\repositories\user\ExchangeQuotaRecordRepository; use app\common\repositories\user\ExchangeQuotaRepository; use app\common\repositories\user\UserRepository; use crmeb\basic\BaseController; +use crmeb\services\LockService; use crmeb\services\QrcodeService; use think\App; use think\facade\Db; @@ -75,7 +78,7 @@ class Exchange extends BaseController{ * Time: 2024/01/14 18:02 * @return mixed */ - public function exchangeHandle(){ + public function exchangeHandle(StoreOrderCreateRepository $orderCreateRepository){ // 参数获取 $uid = $this->request->uid(); $data = $this->request->params(['total_money','use_integral','diff_money','diff_money_pay','point_id','staff_uid','consume_uid']); @@ -85,11 +88,17 @@ class Exchange extends BaseController{ // 判断:是否存在指定消费者,不存在则使用当前登录用户 $uid = (int)$data['consume_uid'] > 0 ? (int)$data['consume_uid'] : $uid; if ($data['staff_uid'] == $uid) return app('json')->fail('操作员和消费用户不能是同一人!'); + // 支付信息 + $payInfo = $this->request->params(['pay_type', 'return_url']); + $payInfo['money'] = (float)$data['diff_money_pay']; + if((float)$payInfo['money'] > 0){ + if (!in_array($payInfo['pay_type'], StoreOrderRepository::PAY_TYPE, true)) return app('json')->fail('请选择正确的支付方式'); + } // 添加兑换记录 try{ - Db::transaction(function () use ($data, $uid) { + return Db::transaction(function () use ($data, $uid, $payInfo, $orderCreateRepository) { // 添加兑换记录 - ExchangePickupRecord::insert([ + $pickupRecordId = ExchangePickupRecord::insertGetId([ 'uid' => $uid, 'point_id' => $data['point_id'], 'staff_uid' => $data['staff_uid'], @@ -98,46 +107,37 @@ class Exchange extends BaseController{ 'diff_money' => $data['diff_money'], 'diff_money_pay' => $data['diff_money_pay'], ]); - // 积分&额度变更数量 - $changeNum = (float)sprintf("%.2f",$data['total_money'] - $data['diff_money_pay']); - // 变更额度 - $userHoldInfo = ExchangeQuota::where('uid',$uid)->findOrEmpty(); - $changeFront = (float)$userHoldInfo->surplus_quota; - $userHoldInfo->use_quota += (float)$changeNum; - $userHoldInfo->surplus_quota -= (float)$changeNum; - $userHoldInfo->save(); - ExchangeQuotaRecord::insert([ - 'uid' => $uid, - 'product_id' => 0, - 'order_id' => 0, - 'order_product_id' => 0, - 'change_type' => 0, - 'change_quantity' => (float)$changeNum, - 'change_front' => $changeFront, - 'change_after' => (float)$userHoldInfo->surplus_quota, - 'remark' => "兑换消费", - 'source' => 2, - ]); - // 变更积分 - $userInfo = User::where('uid',$uid)->findOrEmpty(); - $integralChangeFront = (float)$userInfo->exchange_integral; - $userInfo->exchange_integral -= (float)$changeNum; - $userInfo->exchange_integral = $userInfo->exchange_integral > 0 ? $userInfo->exchange_integral : 0; - $userInfo->save(); - ExchangeIntegralRecord::insert([ - 'uid' => $uid, - 'product_id' => 0, - 'order_id' => 0, - 'order_product_id' => 0, - 'change_type' => 0, - 'change_quantity' => (float)$changeNum, - 'change_front' => $integralChangeFront, - 'change_after' => (float)$userInfo->exchange_integral, - 'remark' => "兑换消费", - ]); - }); + // 判断:如果【差价应支付金额】大于0 生成支付订单 + if((float)$payInfo['money'] > 0){ + $userInfo = User::where('uid',$uid)->findOrEmpty(); + $payInfo['pickup_record_id'] = $pickupRecordId; + // 发起支付 + $groupOrder = app()->make(LockService::class) + ->exec('online_order.create',function() use ($payInfo,$orderCreateRepository, $userInfo){ + $payType = array_search($payInfo['pay_type'],StoreOrderRepository::PAY_TYPE); - return app('json')->success('success'); + return $orderCreateRepository->exchangeGoods($payType,$payInfo,$userInfo); + }); + + 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'], $userInfo, $groupOrder, $payInfo['return_url'], $this->request->isApp()); + } catch (\Exception $e) { + + return app('json')->status('error', $e->getMessage(), ['order_id' => $groupOrder->group_order_id]); + } + } + else{ + app()->make(ExchangePickupPointRepository::class)->exchangeSuccessHandle($pickupRecordId); + + return app('json')->success('success'); + } + }); }catch(\Exception $e){ return app('json')->fail($e->getMessage()); @@ -225,10 +225,11 @@ class Exchange extends BaseController{ public function siteQrCode(){ // 参数获取 $uid = $this->request->uid(); - $params = $this->request->params(['point_id']); + $params = $this->request->params(['point_id',['total_money',0]]); if((int)$params['point_id'] > 0){ try{ - $valueData = 'staff_uid=' . $uid . '&point_id=' . $params['point_id']; + // 由于微信长度限制问题 suid=staff_id;pid=point_id;tmy=total_money + $valueData = 'suid=' . $uid . '&pid=' . $params['point_id'] . '&tmy=' . $params['total_money']; $name = md5($valueData) . '.jpg'; // pages/users/online_payment/exchange/index $qrcode = app()->make(QrcodeService::class)->getRoutineQrcodePath($name, 'pages/users/online_payment/exchange/index', $valueData); diff --git a/app/listener/exchangeQuota/OrderPaySuccessEvent.php b/app/listener/exchangeQuota/OrderPaySuccessEvent.php index bcc3713..4c3119d 100644 --- a/app/listener/exchangeQuota/OrderPaySuccessEvent.php +++ b/app/listener/exchangeQuota/OrderPaySuccessEvent.php @@ -7,6 +7,7 @@ use app\common\model\user\ExchangeQuota; use app\common\model\user\ExchangeQuotaRecord; use app\common\model\user\User; use app\common\repositories\system\merchant\MerchantRepository; +use app\common\repositories\user\ExchangePickupPointRepository; use think\facade\Log; class OrderPaySuccessEvent{ @@ -15,10 +16,17 @@ class OrderPaySuccessEvent{ public function handle($groupOrder){ $groupOrder = $groupOrder['groupOrder']; try{ - // Log::info('支付成功 - 赠送酒卡额度 - 开始: '.var_export(['uid'=>$groupOrder->uid,'group_order_id'=>$groupOrder->group_order_id],1)); + // Log::info('支付成功 - 赠送酒卡额度 - 开始: '.var_export([ + // 'uid' => $groupOrder->uid, + // 'group_order_id' => $groupOrder->group_order_id, + // 'activity_type' => $groupOrder->activity_type + // ],1)); if($groupOrder->activity_type == 30){ // 在线支付订单 $this->giveExchangeIntegral($groupOrder); + }else if($groupOrder->activity_type == 31){ + // 在线支付订单 + $this->exchangeGoodsHandle($groupOrder); }else{ // 其他订单 $this->orderPaySuccessHandle($groupOrder); @@ -112,7 +120,14 @@ class OrderPaySuccessEvent{ return true; } + // 支付成功 - 兑换商品补差价处理 + public function exchangeGoodsHandle($groupOrder){ + foreach($groupOrder->orderList as $orderInfo){ + app()->make(ExchangePickupPointRepository::class)->exchangeSuccessHandle($orderInfo->pickup_record_id); + } + return true; + } } \ No newline at end of file