setName('distribution_order') ->setDescription('结算分销订单'); } protected function execute(Input $input, Output $output) { Db::startTrans(); try { // 1、获取结算时间 $time = time(); $afterSaleTime = ConfigServer::get('distribution', 'settlement_days', 7); $afterSaleTime = intval($afterSaleTime * 24 * 60 * 60); //2.查询所有未分销结算的订单,推荐人提成计算 //无相增加 $promotionOrders = Order::alias('O') ->field(['O.id','O.order_sn','O.total_amount','U.first_leader','U.second_leader','U.third_leader','S.id as sid','U.id as uid','S.trade_promotion_fee','S.promotion_buy_fee','S.team_first_fee','S.team_second_fee','S.team_third_fee']) ->join('shop S','O.shop_id = S.id') ->join('shop_admin SA','O.shop_id = SA.shop_id') ->join('shop_apply SAP','SAP.account = SA.account') ->join('procurement U','SAP.user_id = U.id') ->whereRaw("O.confirm_take_time+$afterSaleTime < $time") ->where([['O.confirm_take_time', '>', 0],['O.promotion_settle',"=",0],['S.type','=',2]]) //已确认收货且没有结算的订单,商家为入驻商家 ->limit(100) ->select()->toArray(); foreach ($promotionOrders as &$order) { // 增加用户佣金,推广者如果是个人,就直接返推广点,否者按推广层级进行返点 // 商家钱包金额 $wallet = Shop::where('id', $order['sid'])->value('wallet'); //商家减去佣金 //先执行推荐购买返点 $buyer = User::where('id', $order['user_id'])->find(); //购买者 $earnings_buy = User::where('id', $buyer['first_leader'])->value('earnings'); if($earnings_buy){ //如果购买者有推荐人,就发推荐奖励 $money_buy = $order['total_amount'] * $order['promotion_buy_fee'] / 100; User::update([ 'earnings' => $earnings_buy + $money_buy, 'update_time' => $time, 'id' => $buyer['first_leader'] ]); Shop::update([ 'wallet' => $wallet - $money_buy, 'update_time' => $time, 'id' => $order['sid'] ]); // 记录流水 AccountLog::create([ 'log_sn' => createSn('account_log', 'log_sn', '', 4), 'user_id' => $buyer['first_leader'], 'source_type' => AccountLog::distribution_inc_earnings, 'source_id' => $order['id'], 'source_sn' => $order['order_sn'], 'change_amount' => $money_buy, 'left_amount' => $earnings_buy+$money_buy, 'change_type' => 1, 'remark' => '推广佣金增加' ]); // 记录流水 AccountLog::create([ 'log_sn' => createSn('account_log', 'log_sn', '', 4), 'user_id' => $order['uid'], 'source_type' => AccountLog::shop_reduce_wallet, 'source_id' => $order['id'], 'source_sn' => $order['order_sn'], 'change_amount' => $money_buy, 'left_amount' => $wallet - $money_buy, 'change_type' => 1, 'remark' => '商铺钱包余额减少' ]); } //获取店铺 $promoter = User::where('id', $order['first_leader'])->find(); //查询推广者 if($promoter){ if(!$promoter["is_team"]){ //不是团队就直接分账 $earnings = User::where('id', $order['first_leader'])->value('earnings'); //给推广者增加佣金 $money = $order['total_amount'] * $order['trade_promotion_fee'] / 100; User::update([ 'earnings' => $earnings + $money, 'update_time' => $time, 'id' => $order['first_leader'] ]); Shop::update([ 'wallet' => $wallet - $money, 'update_time' => $time, 'id' => $order['sid'] ]); // 记录流水 AccountLog::create([ 'log_sn' => createSn('account_log', 'log_sn', '', 4), 'user_id' => $order['first_leader'], 'source_type' => AccountLog::distribution_inc_earnings, 'source_id' => $order['id'], 'source_sn' => $order['order_sn'], 'change_amount' => $money, 'left_amount' => $earnings+$money, 'change_type' => 1, 'remark' => '推广佣金增加' ]); // 记录流水 AccountLog::create([ 'log_sn' => createSn('account_log', 'log_sn', '', 4), 'user_id' => $order['uid'], 'source_type' => AccountLog::shop_reduce_wallet, 'source_id' => $order['id'], 'source_sn' => $order['order_sn'], 'change_amount' => $money, 'left_amount' => $wallet - $money, 'change_type' => 1, 'remark' => '商铺钱包余额减少' ]); }else{ //如果是团队需要按三级分成 //一级 $earnings = User::where('id', $order['first_leader'])->value('earnings'); //给推广者增加佣金 $money = $order['total_amount'] * $order['team_first_fee'] / 100; User::update([ 'earnings' => $earnings + $money, 'update_time' => $time, 'id' => $order['first_leader'] ]); Shop::update([ 'wallet' => $wallet - $money, 'update_time' => $time, 'id' => $order['sid'] ]); // 记录流水 AccountLog::create([ 'log_sn' => createSn('account_log', 'log_sn', '', 4), 'user_id' => $order['first_leader'], 'source_type' => AccountLog::distribution_inc_earnings, 'source_id' => $order['id'], 'source_sn' => $order['order_sn'], 'change_amount' => $money, 'left_amount' => $earnings+$money, 'change_type' => 1, 'remark' => '推广佣金增加' ]); // 记录流水 AccountLog::create([ 'log_sn' => createSn('account_log', 'log_sn', '', 4), 'user_id' => $order['uid'], 'source_type' => AccountLog::shop_reduce_wallet, 'source_id' => $order['id'], 'source_sn' => $order['order_sn'], 'change_amount' => $money, 'left_amount' => $wallet - $money, 'change_type' => 1, 'remark' => '商铺钱包余额减少' ]); //二级 // $promoter_2 = User::where('id', $order['second_leader'])->find(); //给推广者增加佣金 // if($promoter_2){ // $earnings = User::where('id', $order['second_leader'])->value('earnings'); //给推广者增加佣金 // $money = $order['total_amount'] * $order['team_second_fee'] / 100; // User::update([ // 'earnings' => $earnings + $money, // 'update_time' => $time, // 'id' => $order['second_leader'] // ]); // // // Shop::update([ // 'wallet' => $wallet - $money, // 'update_time' => $time, // 'id' => $order['sid'] // ]); // // // 记录流水 // AccountLog::create([ // 'log_sn' => createSn('account_log', 'log_sn', '', 4), // 'user_id' => $order['second_leader'], // 'source_type' => AccountLog::distribution_inc_earnings, // 'source_id' => $order['id'], // 'source_sn' => $order['order_sn'], // 'change_amount' => $money, // 'left_amount' => $earnings+$money, // 'change_type' => 1, // 'remark' => '推广佣金增加' // ]); // // 记录流水 // AccountLog::create([ // 'log_sn' => createSn('account_log', 'log_sn', '', 4), // 'user_id' => $order['uid'], // 'source_type' => AccountLog::shop_reduce_wallet, // 'source_id' => $order['id'], // 'source_sn' => $order['order_sn'], // 'change_amount' => $money, // 'left_amount' => $wallet - $money, // 'change_type' => 1, // 'remark' => '商铺钱包余额减少' // ]); // } // //三级 // $promoter_3 = User::where('id', $order['third_leader'])->find(); //给推广者增加佣金 // if($promoter_3){ // $earnings = User::where('id', $order['third_leader'])->value('earnings'); //给推广者增加佣金 // $money = $order['total_amount'] * $order['team_third_fee'] / 100; // User::update([ // 'earnings' => $earnings + $money, // 'update_time' => $time, // 'id' => $order['third_leader'] // ]); // // // Shop::update([ // 'wallet' => $wallet - $money, // 'update_time' => $time, // 'id' => $order['sid'] // ]); // // // 记录流水 // AccountLog::create([ // 'log_sn' => createSn('account_log', 'log_sn', '', 4), // 'user_id' => $order['third_leader'], // 'source_type' => AccountLog::distribution_inc_earnings, // 'source_id' => $order['id'], // 'source_sn' => $order['order_sn'], // 'change_amount' => $money, // 'left_amount' => $earnings+$money, // 'change_type' => 1, // 'remark' => '推广佣金增加' // ]); // // 记录流水 // AccountLog::create([ // 'log_sn' => createSn('account_log', 'log_sn', '', 4), // 'user_id' => $order['uid'], // 'source_type' => AccountLog::shop_reduce_wallet, // 'source_id' => $order['id'], // 'source_sn' => $order['order_sn'], // 'change_amount' => $money, // 'left_amount' => $wallet - $money, // 'change_type' => 1, // 'remark' => '商铺钱包余额减少' // ]); // } } } //更新订单推广状态 Order::update([ 'promotion_settle' => 1, 'update_time' => $time, 'id' => $order['id'] ]); } // 3、查询可以结算的订单 $model = new DistributionOrderGoods(); $orders = $model->alias('DOG')->field([ 'O.id as order_id, O.order_status, O.confirm_take_time', 'DOG.id as distribution_id, DOG.sn, DOG.money', 'DOG.user_id, DOG.order_goods_id' ]) ->join('order_goods OG', 'OG.id = DOG.order_goods_id') ->join('order O', 'O.id = OG.order_id') ->whereRaw("O.confirm_take_time+$afterSaleTime < $time") ->where([ ['DOG.status', '=', DistributionOrderGoodsEnum::STATUS_WAIT_HANDLE], ]) ->limit(100) ->select()->toArray(); foreach ($orders as &$order) { //当前分佣订单是否可结算 if (false === self::isSettle($order)) { continue; } // 增加用户佣金 $earnings = User::where('id', $order['user_id'])->value('earnings'); User::update([ 'earnings' => $earnings + $order['money'], 'update_time' => $time, 'id' => $order['user_id'] ]); // 记录流水 AccountLog::create([ 'log_sn' => createSn('account_log', 'log_sn', '', 4), 'user_id' => $order['user_id'], 'source_type' => AccountLog::distribution_inc_earnings, 'source_id' => $order['distribution_id'], 'source_sn' => $order['sn'], 'change_amount' => $order['money'], 'left_amount' => $earnings+$order['money'], 'change_type' => 1, 'remark' => '分销佣金增加' ]); // 更新分销订单状态 DistributionOrderGoods::update([ 'status' => DistributionOrderGoodsEnum::STATUS_SUCCESS, 'update_time' => $time, 'settlement_time' => $time, 'id'=>$order['distribution_id'] ]); // 更新订单分销佣金 $orderModel = Order::findOrEmpty($order['order_id']); $orderModel->distribution_money = $orderModel->distribution_money + $order['money']; $orderModel->update_time = $time; $orderModel->save(); // 更新分销会员等级 DistributionLevelLogic::updateDistributionLevel($order['user_id']); } Db::commit(); } catch (\Exception $e) { Db::rollback(); Log::write('分销结算异常:'.$e->getMessage()); } } /** * @Notes: 是否可以结算分佣订单 (检查是否有售后记录 没有则可结算, 有则需要检查售后记录状态) * @Author: 张无忌 * @param $order * @return bool */ protected function isSettle($order) { // 订单是否在售后(正在退款或已退款) $check = (new AfterSale())->where([ 'order_id' => $order['order_id'], 'order_goods_id' => $order['order_goods_id'], 'del'=>0 ])->findOrEmpty()->toArray(); if (!$check) { return true; } // 有售后订单记录且状态 $no_settlement中的 不结算分佣订单 $no_settlement = [ AfterSale::STATUS_APPLY_REFUND, //申请退款 AfterSale::STATUS_WAIT_RETURN_GOODS, //商品待退货 AfterSale::STATUS_WAIT_RECEIVE_GOODS, //商家待收货 ]; // 不结算且分佣订单改为已失效 $set_fail = [ AfterSale::STATUS_WAIT_REFUND, //等待退款 AfterSale::STATUS_SUCCESS_REFUND, //退款成功 ]; // 售后情况不明 不结算 if (in_array($check['status'], $no_settlement)) { return false; } // 分佣订单更新为已失效 不结算 if (in_array($check['status'], $set_fail)) { DistributionOrderGoods::update([ 'status' => DistributionOrderGoodsEnum::STATUS_ERROR, 'update_time' => time() ], ['id'=>$order['distribution_id']]); return false; } return true; } }