775 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			775 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| 
 | |
| namespace app\api\logic;
 | |
| 
 | |
| use app\admin\logic\distribution\DistributionLevelLogic;
 | |
| use app\common\basics\Logic;
 | |
| use app\common\enum\NoticeEnum;
 | |
| use app\common\enum\OrderEnum;
 | |
| use app\common\enum\PayEnum;
 | |
| use app\common\logic\GoodsVirtualLogic;
 | |
| use app\common\logic\IntegralLogic;
 | |
| use app\common\logic\PayNotifyLogic;
 | |
| use app\common\model\Client_;
 | |
| use app\common\model\distribution\DistributionGoods;
 | |
| use app\common\model\distribution\DistributionLevel;
 | |
| use app\common\model\distribution\DistributionOrderGoods;
 | |
| use app\common\model\goods\Goods;
 | |
| use app\common\model\AccountLog;
 | |
| use app\common\logic\AccountLogLogic;
 | |
| use app\common\model\integral\IntegralOrder;
 | |
| use app\common\model\order\OrderGoods;
 | |
| use app\common\model\order\OrderTrade;
 | |
| use app\common\model\order\Order;
 | |
| use app\common\model\RechargeOrder;
 | |
| use app\common\model\shop\Shop;
 | |
| use app\common\model\user\User;
 | |
| use app\common\server\JsonServer;
 | |
| use app\common\server\WeChatPayServer;
 | |
| use app\common\server\ConfigServer;
 | |
| use think\Exception;
 | |
| use think\facade\Db;
 | |
| use app\common\server\AliPayServer;
 | |
| 
 | |
| /**
 | |
|  * Class PayLogic
 | |
|  * @package app\api\logic
 | |
|  */
 | |
| class PayLogic extends Logic
 | |
| {
 | |
|     /**
 | |
|      * @notes 检验支付状态
 | |
|      * @param $trade_id
 | |
|      * @return bool
 | |
|      * @throws \think\db\exception\DataNotFoundException
 | |
|      * @throws \think\db\exception\DbException
 | |
|      * @throws \think\db\exception\ModelNotFoundException
 | |
|      * @author suny
 | |
|      * @date 2021/7/13 6:24 下午
 | |
|      */
 | |
|     public static function checkPayStatus($trade_id)
 | |
|     {
 | |
| 
 | |
|         $where = [
 | |
|             'trade_id' => $trade_id,
 | |
|             'pay_status' => PayEnum::ISPAID,
 | |
|             'del' => 0
 | |
|         ];
 | |
| 
 | |
|         $check = Order::where($where)->find();
 | |
|         if ($check) {
 | |
|             return true;
 | |
|         }
 | |
|         return false;
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @notes 余额支付
 | |
|      * @param $order_id
 | |
|      * @param $form
 | |
|      * @return \think\response\Json
 | |
|      * @throws \think\db\exception\DataNotFoundException
 | |
|      * @throws \think\db\exception\DbException
 | |
|      * @throws \think\db\exception\ModelNotFoundException
 | |
|      * @throws \think\exception\PDOException
 | |
|      * @author suny
 | |
|      * @date 2021/7/13 6:24 下午
 | |
|      */
 | |
|     public static function balancePay($order_id, $form)
 | |
|     {
 | |
| 
 | |
|         switch ($form) {
 | |
|             case "trade":
 | |
|                 $order = OrderTrade::find($order_id);
 | |
|                 if (self::checkPayStatus($order_id)) {
 | |
|                     $order['pay_status'] = PayEnum::ISPAID;
 | |
|                 }
 | |
|                 break;
 | |
|             case "order":
 | |
|                 $order = Order::where([
 | |
|                     ['del', '=', 0],
 | |
|                     ['id', '=', $order_id]
 | |
|                 ])->find();
 | |
|                 break;
 | |
|             case "integral":
 | |
|                 $order = IntegralOrder::where(['del' => 0, 'id' => $order_id])->find();
 | |
|                 break;
 | |
|         }
 | |
|         if (empty($order)) {
 | |
|             return JsonServer::error('订单不存在');
 | |
|         }
 | |
|         if (isset($order['pay_status']) && $order['pay_status'] == PayEnum::ISPAID) {
 | |
|             return JsonServer::error('订单已支付');
 | |
|         }
 | |
|         $user_balance = User::where(['id' => $order['user_id']])->value('user_money');
 | |
|         if ($user_balance < $order['order_amount']) {
 | |
|             return JsonServer::error('余额不足');
 | |
|         }
 | |
| 
 | |
|         // 积分订单
 | |
|         if($form == 'integral') {
 | |
|             $result = self::payIntegralOrder($order);
 | |
|             if (true === $result) {
 | |
|                 return JsonServer::success('支付成功', [], 20001);
 | |
|             }
 | |
|             return JsonServer::error($result);
 | |
|         }
 | |
| 
 | |
|         try {
 | |
|             Db::startTrans();
 | |
|             $User = new User();
 | |
|             if ($order['order_amount'] != 0) {
 | |
|                 $user_balance_dec = User::where(['id' => $order['user_id']])
 | |
|                     ->dec('user_money', $order['order_amount'])
 | |
|                     ->update();
 | |
|                 if (!$user_balance_dec) {
 | |
|                     Db::rollback();
 | |
|                     return JsonServer::error('余额扣除失败');
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             //记录余额
 | |
|             $acountLogResult = AccountLogLogic::AccountRecord($order['user_id'], $order['order_amount'], 2, AccountLog::balance_pay_order);
 | |
|             if ($acountLogResult === false) {
 | |
|                 Db::rollback();
 | |
|                 return JsonServer::error('账户明细记录添加失败');
 | |
|             }
 | |
| 
 | |
|             if ($form == "trade") {
 | |
|                 $order_id = Order::where('trade_id', $order_id)->column('id');
 | |
|             }
 | |
|             $orderStatusChange = self::changOrderStatus($order_id);
 | |
|             if ($orderStatusChange == false) {
 | |
|                 Db::rollback();
 | |
|                 return JsonServer::error('子订单状态改变失败');
 | |
|             }
 | |
| 
 | |
|             // 生成分销订单
 | |
|             self::distributionOrderGoods($order_id);
 | |
|             // 更新分销会员等级
 | |
|             DistributionLevelLogic::updateDistributionLevel($order['user_id']);
 | |
| 
 | |
|             if($form == "trade"){
 | |
|                 $orders = Order::where([['id','in',$order_id]])->select();
 | |
|                 foreach ($orders as $item) {
 | |
|                     // 增加商品销量
 | |
|                     $order_goods = OrderGoods::where('order_id', $item['id'])->select()->toArray();
 | |
|                     foreach ($order_goods as $order_good) {
 | |
|                         Goods::where('id', $order_good['goods_id'])
 | |
|                             ->inc('sales_actual', $order_good['goods_num'])
 | |
|                             ->update();
 | |
|                     }
 | |
| 
 | |
|                     //修改用户消费累计额度
 | |
|                     $user = User::find($item['user_id']);
 | |
|                     $user->total_order_amount = ['inc', $item['order_amount']];
 | |
|                     $user->save();
 | |
| 
 | |
|                     //赠送成长值
 | |
|                     $growth_ratio = ConfigServer::get('transaction', 'money_to_growth', 0);
 | |
|                     if ($growth_ratio > 0) {
 | |
|                         $able_get_growth = floor($item['total_amount'] / $growth_ratio);
 | |
|                         $user->where('id', $item['user_id'])
 | |
|                             ->inc('user_growth', $able_get_growth)
 | |
|                             ->update();
 | |
|                         AccountLogLogic::AccountRecord($item['user_id'], $able_get_growth, 1, AccountLog::order_give_growth, '', $item['id'], $item['order_sn']);
 | |
|                     }
 | |
| 
 | |
| 
 | |
|                     //赠送积分
 | |
|                     $open_award = ConfigServer::get('order_award', 'open_award', 0);
 | |
|                     if ($open_award == 1) {
 | |
|                         $award_event = ConfigServer::get('order_award', 'award_event', 0);
 | |
|                         $award_ratio = ConfigServer::get('order_award', 'award_ratio', 0);
 | |
|                         if ($award_ratio > 0) {
 | |
|                             $award_integral = floor($item['order_amount'] * ($award_ratio / 100));
 | |
|                         }
 | |
|                     }
 | |
|                     Order::update(['award_integral_status' => $award_event ?? 0,'award_integral' => $award_integral ?? 0],['id'=>$item['id']]);
 | |
| 
 | |
|                     //通知用户
 | |
|                     event('Notice', [
 | |
|                         'scene' => NoticeEnum::ORDER_PAY_NOTICE,
 | |
|                         'mobile' => $user['mobile'],
 | |
|                         'params' => ['order_id' => $item['id'], 'user_id' => $item['user_id']]
 | |
|                     ]);
 | |
| 
 | |
|                     //通知商家
 | |
|                     if (!empty($item['shop']['mobile'])) {
 | |
|                         event('Notice', [
 | |
|                             'scene' => NoticeEnum::USER_PAID_NOTICE_SHOP,
 | |
|                             'mobile' => $item['shop']['mobile'],
 | |
|                             'params' => ['order_id' => $item['id'], 'user_id' => $item['user_id']]
 | |
|                         ]);
 | |
|                     }
 | |
|                     // 打印小票
 | |
|                     event('Printer', [
 | |
|                         'order_id' => $item['id'],
 | |
|                     ]);
 | |
|                 }
 | |
| 
 | |
|                 // 虚拟商品更新订单信息
 | |
|                 GoodsVirtualLogic::afterPayVirtualDelivery($order_id);
 | |
| 
 | |
|             } else{
 | |
|                 // 增加商品销量
 | |
|                 $order_goods = OrderGoods::where('order_id', $order['id'])->select();
 | |
|                 foreach ($order_goods as $order_good) {
 | |
|                     Goods::where('id', $order_good['goods_id'])
 | |
|                         ->inc('sales_actual', $order_good['goods_num'])
 | |
|                         ->update();
 | |
|                 }
 | |
| 
 | |
|                 //修改用户消费累计额度
 | |
|                 $user = User::find($order['user_id']);
 | |
|                 $user->total_order_amount = ['inc', $order['order_amount']];
 | |
|                 $user->save();
 | |
| 
 | |
|                 //赠送成长值
 | |
|                 $growth_ratio = ConfigServer::get('transaction', 'money_to_growth', 0);
 | |
|                 if ($growth_ratio > 0) {
 | |
|                     $able_get_growth = floor($order['total_amount'] / $growth_ratio);
 | |
|                     $user->where('id', $order['user_id'])
 | |
|                         ->inc('user_growth', $able_get_growth)
 | |
|                         ->update();
 | |
|                     AccountLogLogic::AccountRecord($order['user_id'], $able_get_growth, 1, AccountLog::order_give_growth, '', $order['id'], $order['order_sn']);
 | |
|                 }
 | |
| 
 | |
| 
 | |
|                 //赠送积分
 | |
|                 $open_award = ConfigServer::get('order_award', 'open_award', 0);
 | |
|                 if ($open_award == 1) {
 | |
|                     $award_event = ConfigServer::get('order_award', 'award_event', 0);
 | |
|                     $award_ratio = ConfigServer::get('order_award', 'award_ratio', 0);
 | |
|                     if ($award_ratio > 0) {
 | |
|                         $award_integral = floor($order['order_amount'] * ($award_ratio / 100));
 | |
|                     }
 | |
|                 }
 | |
|                 Order::update(['award_integral_status' => $award_event ?? 0,'award_integral' => $award_integral ?? 0],['id'=>$order['id']]);
 | |
| 
 | |
|                 // 虚拟商品更新订单信息
 | |
|                 GoodsVirtualLogic::afterPayVirtualDelivery($order['id']);
 | |
| 
 | |
|                 //通知用户
 | |
|                 event('Notice', [
 | |
|                     'scene' => NoticeEnum::ORDER_PAY_NOTICE,
 | |
|                     'mobile' => $user['mobile'],
 | |
|                     'params' => ['order_id' => $order['id'], 'user_id' => $order['user_id']]
 | |
|                 ]);
 | |
| 
 | |
|                 //通知商家
 | |
|                 if (!empty($order['shop']['mobile'])) {
 | |
|                     event('Notice', [
 | |
|                         'scene' => NoticeEnum::USER_PAID_NOTICE_SHOP,
 | |
|                         'mobile' => $order['shop']['mobile'],
 | |
|                         'params' => ['order_id' => $order['id'], 'user_id' => $order['user_id']]
 | |
|                     ]);
 | |
|                 }
 | |
| 
 | |
|                 // 打印小票
 | |
|                 event('Printer', [
 | |
|                     'order_id' => $order['id'],
 | |
|                 ]);
 | |
|             }
 | |
| 
 | |
|             Db::commit();
 | |
|             return JsonServer::success('支付成功', [], 20001);
 | |
|         } catch (\Exception $e) {
 | |
|             Db::rollback();
 | |
|             return JsonServer::error($e->getMessage());
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @notes 微信支付
 | |
|      * @param $order_id
 | |
|      * @param $form
 | |
|      * @param $client
 | |
|      * @return \think\response\Json
 | |
|      * @throws \EasyWeChat\Kernel\Exceptions\InvalidArgumentException
 | |
|      * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
 | |
|      * @throws \GuzzleHttp\Exception\GuzzleException
 | |
|      * @throws \think\db\exception\DataNotFoundException
 | |
|      * @throws \think\db\exception\DbException
 | |
|      * @throws \think\db\exception\ModelNotFoundException
 | |
|      * @author suny
 | |
|      * @date 2021/7/13 6:24 下午
 | |
|      */
 | |
|     public static function wechatPay($order_id, $form, $client, $openid = '')
 | |
|     {
 | |
|         switch ($form) {
 | |
|             case "trade":
 | |
|                 $order = OrderTrade::find($order_id);
 | |
|                 if (self::checkPayStatus($order_id)) {
 | |
|                     $order['pay_status'] = PayEnum::ISPAID;
 | |
|                 }
 | |
|                 break;
 | |
|             case "order":
 | |
|                 $order = Order::where([
 | |
|                     ['del', '=', 0],
 | |
|                     ['id', '=', $order_id]
 | |
|                 ])->find();
 | |
|                 break;
 | |
|             case "recharge":
 | |
|                 $order = RechargeOrder::where([
 | |
|                     ['id', '=', $order_id]
 | |
|                 ])->find();
 | |
|                 break;
 | |
|             case "integral":
 | |
|                 $order = IntegralOrder::where(['del' => 0, 'id' => $order_id])->find();
 | |
|                 break;
 | |
|         }
 | |
|         if (empty($order)) {
 | |
|             return JsonServer::error('订单不存在');
 | |
|         }
 | |
|         if (isset($order['pay_status']) && $order['pay_status'] == PayEnum::ISPAID) {
 | |
|             return JsonServer::error('订单已支付');
 | |
|         }
 | |
|         // 这里进行微信支付
 | |
|         $res = WeChatPayServer::unifiedOrder($form, $order, $client, $openid);
 | |
|         if (false === $res) {
 | |
|             return JsonServer::error(WeChatPayServer::getError());
 | |
|         }
 | |
|         if ((is_object($res) || is_string($res)) && $client != Client_::pc) {
 | |
|             $res = (array)($res);
 | |
|         }
 | |
|         if (is_string($res)) {
 | |
|             $data = [
 | |
|                 'code' => 1,
 | |
|                 'msg' => '微信支付发起成功',
 | |
|                 'show' => 0,
 | |
|                 'data' => $res
 | |
|             ];
 | |
|             return json($data);
 | |
|         }
 | |
|         return JsonServer::success('微信支付发起成功', $res, 1);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @notes 支付宝支付
 | |
|      * @param $order_id
 | |
|      * @param $from
 | |
|      * @param $client
 | |
|      * @return bool|string
 | |
|      * @author suny
 | |
|      * @date 2021/7/27 4:22 下午
 | |
|      */
 | |
|     public static function aliPay($order_id , $from , $client)
 | |
|     {
 | |
|         $aliPay = new AliPayServer();
 | |
|         $res = $aliPay->pay($from , $order_id , $client);
 | |
|         return $res;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * order表状态改变
 | |
|      */
 | |
|     public static function changOrderStatus($order_id)
 | |
|     {
 | |
|         $where = ['id', '=', $order_id];
 | |
|         if (is_array($order_id)) {
 | |
|             $where = ['id', 'in', $order_id];
 | |
|         }
 | |
| 
 | |
|         $orders = Order::where([ $where ])
 | |
|             ->update([
 | |
|                 'pay_status' => PayEnum::ISPAID,
 | |
|                 'order_status' => OrderEnum::ORDER_STATUS_DELIVERY,
 | |
|                 'pay_way' => OrderEnum::PAY_WAY_BALANCE,
 | |
|                 'pay_time' => time()
 | |
|             ]);
 | |
| 
 | |
|         if ($orders) {
 | |
|             return true;
 | |
|         }
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @notes 分销逻辑
 | |
|      * @param $order_id
 | |
|      * @param $user_id
 | |
|      * @author Tab
 | |
|      * @date 2021/9/2 10:48
 | |
|      */
 | |
|     public static function distributionOrderGoods($order_id)
 | |
|     {
 | |
|         if (is_array($order_id)) {
 | |
|             $orderIds = $order_id;
 | |
|         } else {
 | |
|             $orderIds = [$order_id];
 | |
|         }
 | |
| 
 | |
|         // 获取分销配置
 | |
|         $distributionConfig = [
 | |
|             'is_open' => ConfigServer::get('distribution', 'is_open', 0),
 | |
|             'level' => ConfigServer::get('distribution', 'level', 2),
 | |
|         ];
 | |
|         if(!$distributionConfig['is_open']) {
 | |
|             return false;
 | |
|         }
 | |
|         // 遍历订单
 | |
|         foreach($orderIds as $orderId) {
 | |
|             // 用户信息
 | |
|             $order = Order::where('id', $orderId)->findOrEmpty()->toArray();
 | |
|             $userInfo = self::userInfo($order['user_id']);
 | |
|             // 判断店铺是否开通分销
 | |
|             $isDistribution = Shop::where('id', $order['shop_id'])->value('is_distribution');
 | |
|             if(!$isDistribution) {
 | |
|                 // 未开通分销跳过
 | |
|                 continue;
 | |
|             }
 | |
| 
 | |
|             // 订单信息
 | |
|             $orderInfo = self::orderInfo($orderId);
 | |
|             // 遍历子订单
 | |
|             foreach($orderInfo as $item) {
 | |
|                 // 判断商品是否参与分销
 | |
|                 $goodsDistribution = self::checkGoodsDistribution($item['goods_id']);
 | |
|                 if(empty($goodsDistribution) || !$goodsDistribution['is_distribution']) {
 | |
|                     // 商品未参与分销
 | |
|                     continue;
 | |
|                 }
 | |
|                 // 分销层级
 | |
|                 switch($distributionConfig['level'])
 | |
|                 {
 | |
|                     case 1: // 一级分销
 | |
|                         self::firstLevelCommission($userInfo, $item, $goodsDistribution);
 | |
|                         break;
 | |
|                     case 2: // 一级、二级分销
 | |
|                         self::firstLevelCommission($userInfo, $item, $goodsDistribution);
 | |
|                         self::secondLevelCommission($userInfo, $item, $goodsDistribution);
 | |
|                         break;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @notes 用户信息
 | |
|      * @param $userId
 | |
|      * @return mixed
 | |
|      * @author Tab
 | |
|      * @date 2021/9/2 11:02
 | |
|      */
 | |
|     public static function userInfo($userId)
 | |
|     {
 | |
|         $userInfo = User::alias('u')
 | |
|             ->leftJoin('distribution d', 'd.user_id = u.id')
 | |
|             ->field('u.id,u.nickname,u.first_leader,u.second_leader,d.level_id,d.is_distribution,d.is_freeze')
 | |
|             ->where('u.id', $userId)
 | |
|             ->findOrEmpty()
 | |
|             ->toArray();
 | |
| 
 | |
|         return $userInfo;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @notes 订单信息
 | |
|      * @param $orderId
 | |
|      * @return mixed
 | |
|      * @author Tab
 | |
|      * @date 2021/9/2 11:05
 | |
|      */
 | |
|     public static function orderInfo($orderId)
 | |
|     {
 | |
|         $orderInfo = OrderGoods::alias('og')
 | |
|             ->leftJoin('order o', 'o.id = og.order_id')
 | |
|             ->field('og.id as order_goods_id,og.order_id,og.goods_id,og.item_id,og.goods_num,og.shop_id,og.total_pay_price,o.user_id')
 | |
|             ->where('og.order_id', $orderId)
 | |
|             ->select()
 | |
|             ->toArray();
 | |
|         return $orderInfo;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @notes 校验商品是否参与分销
 | |
|      * @param $goodsId
 | |
|      * @return array
 | |
|      * @author Tab
 | |
|      * @date 2021/9/2 11:08
 | |
|      */
 | |
|     public static function checkGoodsDistribution($goodsId)
 | |
|     {
 | |
|         $distributionGoods = DistributionGoods::field('goods_id,item_id,level_id,first_ratio,second_ratio,is_distribution,rule')
 | |
|             ->where('goods_id', $goodsId)
 | |
|             ->select()
 | |
|             ->toArray();
 | |
| 
 | |
|         if(empty($distributionGoods)) {
 | |
|             return [];
 | |
|         }
 | |
| 
 | |
|         return [
 | |
|             'goods_id' => $distributionGoods[0]['goods_id'],
 | |
|             'is_distribution' => $distributionGoods[0]['is_distribution'],
 | |
|             'rule' => $distributionGoods[0]['rule']
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @notes 一级分佣
 | |
|      * @param $userInfo
 | |
|      * @param $item
 | |
|      * @param $goodsDistribution
 | |
|      * @return false
 | |
|      * @author Tab
 | |
|      * @date 2021/9/2 11:12
 | |
|      */
 | |
|     public static function firstLevelCommission($userInfo, $item, $goodsDistribution)
 | |
|     {
 | |
|         if(!$userInfo['first_leader']) {
 | |
|             // 没有上级,无需分佣
 | |
|             return false;
 | |
|         }
 | |
|         $firstLeaderInfo = self::userInfo($userInfo['first_leader']);
 | |
|         if(!$firstLeaderInfo['is_distribution'] || $firstLeaderInfo['is_freeze']) {
 | |
|             // 上级不是分销会员 或 分销资格已冻结
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         $ratioArr = self::getRatio($goodsDistribution, $item, $firstLeaderInfo);
 | |
|         $firstLeaderInfo['ratio'] = $ratioArr['first_ratio'];
 | |
|         $firstLeaderInfo['level'] = 1;
 | |
|         self::addDistributionOrderGoods($item, $firstLeaderInfo);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @notes 获取分佣比例
 | |
|      * @param $goodsDistribution
 | |
|      * @param $item
 | |
|      * @param $userInfo
 | |
|      * @return array
 | |
|      * @author Tab
 | |
|      * @date 2021/9/2 11:14
 | |
|      */
 | |
|     public static function getRatio($goodsDistribution, $item, $userInfo)
 | |
|     {
 | |
|         // 按分销会员等级对应的比例
 | |
|         if($goodsDistribution['rule'] == 1) {
 | |
|             $ratioArr = DistributionLevel::field('first_ratio,second_ratio')
 | |
|                 ->where('id', $userInfo['level_id'])
 | |
|                 ->findOrEmpty()
 | |
|                 ->toArray();
 | |
|             return $ratioArr;
 | |
|         }
 | |
| 
 | |
|         // 单独设置的比例
 | |
|         if($goodsDistribution['rule'] == 2) {
 | |
|             $ratioArr = DistributionGoods::field('first_ratio,second_ratio')
 | |
|                 ->where([
 | |
|                     'goods_id' => $item['goods_id'],
 | |
|                     'item_id' => $item['item_id'],
 | |
|                     'level_id' => $userInfo['level_id']
 | |
|                 ])
 | |
|                 ->findOrEmpty()
 | |
|                 ->toArray();
 | |
|             return $ratioArr;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @notes 二级分佣
 | |
|      * @param $userInfo
 | |
|      * @param $item
 | |
|      * @param $goodsDistribution
 | |
|      * @return false
 | |
|      * @author Tab
 | |
|      * @date 2021/9/2 11:39
 | |
|      */
 | |
|     public static function secondLevelCommission($userInfo, $item, $goodsDistribution)
 | |
|     {
 | |
|         if(!$userInfo['second_leader']) {
 | |
|             // 没有上上级,无需分佣
 | |
|             return false;
 | |
|         }
 | |
|         $secondLeaderInfo = self::userInfo($userInfo['second_leader']);
 | |
|         if(!$secondLeaderInfo['is_distribution'] || $secondLeaderInfo['is_freeze']) {
 | |
|             // 上上级不是分销会员 或 分销资格已冻结
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         $ratioArr = self::getRatio($goodsDistribution, $item, $secondLeaderInfo);
 | |
|         $secondLeaderInfo['ratio'] = $ratioArr['second_ratio'];
 | |
|         $secondLeaderInfo['level'] = 2;
 | |
|         self::addDistributionOrderGoods($item, $secondLeaderInfo);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @notes 生成分销订单
 | |
|      * @param $item
 | |
|      * @param $userInfo
 | |
|      * @return false
 | |
|      * @author Tab
 | |
|      * @date 2021/9/2 11:17
 | |
|      */
 | |
|     public static function addDistributionOrderGoods($item, $userInfo)
 | |
|     {
 | |
|         $earnings = 0;
 | |
|         $earnings = self::calByPaymentAmount($item, $userInfo);
 | |
|         if($earnings < 0.01) {
 | |
|             return false;
 | |
|         }
 | |
|         $data = [
 | |
|             'sn' => createSn('distribution_order_goods', 'sn'),
 | |
|             'user_id' => $userInfo['id'],
 | |
|             'real_name' => $userInfo['nickname'],
 | |
|             'level_id' => $userInfo['level_id'],
 | |
|             'level' => $userInfo['level'],
 | |
|             'ratio' => $userInfo['ratio'],
 | |
|             'order_id' => $item['order_id'],
 | |
|             'order_goods_id' => $item['order_goods_id'],
 | |
|             'goods_id' => $item['goods_id'],
 | |
|             'goods_num' => $item['goods_num'],
 | |
|             'item_id' => $item['item_id'],
 | |
|             'shop_id' => $item['shop_id'],
 | |
|             'money' => $earnings,
 | |
|             'status' => 1
 | |
|         ];
 | |
| 
 | |
|         DistributionOrderGoods::create($data);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @notes 根据商品实际支付金额计算佣金
 | |
|      * @param $item
 | |
|      * @param $userInfo
 | |
|      * @return float
 | |
|      * @author Tab
 | |
|      * @date 2021/9/2 11:18
 | |
|      */
 | |
|     public static function calByPaymentAmount($item, $userInfo)
 | |
|     {
 | |
|         $earnings = round(($item['total_pay_price'] * $userInfo['ratio'] / 100), 2);
 | |
|         return $earnings;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @notes 分销商品记录
 | |
|      * @param $order_id
 | |
|      * @param $user_id
 | |
|      * @return bool
 | |
|      * @throws \think\db\exception\DataNotFoundException
 | |
|      * @throws \think\db\exception\DbException
 | |
|      * @throws \think\db\exception\ModelNotFoundException
 | |
|      * @throws \think\exception\DbException
 | |
|      * @author suny
 | |
|      * @date 2021/7/13 6:24 下午
 | |
|      */
 | |
|     public static function distributionOrderGoodsOld($order_id, $user_id)
 | |
|     {
 | |
|         $where = ['order_id', '=', $order_id];
 | |
|         if (is_array($order_id)) {
 | |
|             $where = ['order_id', 'in', $order_id];
 | |
|         }
 | |
| 
 | |
|         $goods = OrderGoods::where([ $where ])
 | |
|             ->field('id,goods_id,total_pay_price,goods_num,order_id,shop_id')
 | |
|             ->select()->toArray();
 | |
| 
 | |
|         $User = new User();
 | |
|         $Goods = new Goods();
 | |
|         $user_leader = $User->where('id', $user_id)->field('first_leader,second_leader,third_leader')->find()->toArray();
 | |
| 
 | |
|         foreach ($goods as $key => $value) {
 | |
|             // 商家是否开启分销
 | |
|             $shop_is_distribution = Shop::where('id', $value['shop_id'])->value('is_distribution');
 | |
| 
 | |
|             if (!$shop_is_distribution) continue;
 | |
|             // 商品是否开启分销
 | |
|             if ($Goods->where(['id' => $value['goods_id'], 'is_distribution' => 1])->find()) {
 | |
|                 $goods_distribution = $Goods->where(['id' => $value['goods_id']])->field('first_ratio,second_ratio,third_ratio')->find()->toArray();
 | |
| 
 | |
|                 if (!empty($user_leader['first_leader']) && !is_null($user_leader['first_leader'])) {
 | |
|                     DistributionOrderGoods::create([
 | |
|                         'sn' => createSn('distribution_order_goods', 'sn'),
 | |
|                         'user_id' => $user_leader['first_leader'],
 | |
|                         'real_name' => $User->where('id', $user_leader['first_leader'])->value('nickname') ?? '',
 | |
|                         'order_id' => $value['order_id'],
 | |
|                         'order_goods_id' => $value['id'],
 | |
|                         'goods_num' => $value['goods_num'],
 | |
|                         'money' => bcdiv(bcmul($value['total_pay_price'], $goods_distribution['first_ratio'], 2), 100, 2),
 | |
|                         'status' => 1,
 | |
|                         'shop_id' => $value['shop_id'],
 | |
|                         'create_time' => time()
 | |
|                     ]);
 | |
|                 }
 | |
| 
 | |
|                 if (!empty($user_leader['second_leader']) && !is_null($user_leader['second_leader'])) {
 | |
|                     DistributionOrderGoods::create([
 | |
|                         'sn' => createSn('distribution_order_goods', 'sn'),
 | |
|                         'user_id' => $user_leader['second_leader'],
 | |
|                         'real_name' => $User->where('id', $user_leader['second_leader'])->value('nickname') ?? '',
 | |
|                         'order_id' => $value['order_id'],
 | |
|                         'order_goods_id' => $value['id'],
 | |
|                         'goods_num' => $value['goods_num'],
 | |
|                         'money' => bcdiv(bcmul($value['total_pay_price'], $goods_distribution['second_ratio'], 2), 100, 2),
 | |
|                         'status' => 1,
 | |
|                         'shop_id' => $value['shop_id'],
 | |
|                         'create_time' => time()
 | |
|                     ]);
 | |
|                 }
 | |
| 
 | |
|                 if (!empty($user_leader['third_leader']) && !is_null($user_leader['third_leader'])) {
 | |
|                     DistributionOrderGoods::create([
 | |
|                         'sn' => createSn('distribution_order_goods', 'sn'),
 | |
|                         'user_id' => $user_leader['third_leader'],
 | |
|                         'real_name' => $User->where('id', $user_leader['third_leader'])->value('nickname') ?? '',
 | |
|                         'order_id' => $value['order_id'],
 | |
|                         'order_goods_id' => $value['id'],
 | |
|                         'goods_num' => $value['goods_num'],
 | |
|                         'money' => bcdiv(bcmul($value['total_pay_price'], $goods_distribution['third_ratio'], 2), 100, 2),
 | |
|                         'status' => 1,
 | |
|                         'shop_id' => $value['shop_id'],
 | |
|                         'create_time' => time()
 | |
|                     ]);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return true;
 | |
|     }
 | |
| 
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * @notes 余额支付积分订单
 | |
|      * @param $order
 | |
|      * @return bool|string
 | |
|      * @author 段誉
 | |
|      * @date 2022/3/1 15:02
 | |
|      */
 | |
|     public static function payIntegralOrder($order)
 | |
|     {
 | |
|         try {
 | |
|             if ($order['order_amount'] != 0) {
 | |
|                 User::where(['id' => $order['user_id']])
 | |
|                     ->dec('user_money', $order['order_amount'])
 | |
|                     ->update();
 | |
| 
 | |
|                 AccountLogLogic::AccountRecord(
 | |
|                     $order['user_id'],
 | |
|                     $order['order_amount'],
 | |
|                     2,
 | |
|                     AccountLog::integral_order_dec_balance,
 | |
|                     '',
 | |
|                     $order['id'],
 | |
|                     $order['order_sn']
 | |
|                 );
 | |
|             }
 | |
| 
 | |
|             $result = PayNotifyLogic::handle('integral', $order['order_sn']);
 | |
|             if (true !== $result) {
 | |
|                 throw new \Exception($result);
 | |
|             }
 | |
|             return true;
 | |
|         } catch (\Exception $e) {
 | |
|             return $e->getMessage();
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
| }
 |