From e6885ed7de742a1db0844d7bd72be100557a504d Mon Sep 17 00:00:00 2001 From: liqianjin <949671634@qq.com> Date: Mon, 31 Mar 2025 20:05:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=9E=81=E5=B7=AE=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addon/fenxiao/api/controller/Fenxiao.php | 13 ++ addon/fenxiao/api/controller/Order.php | 11 +- addon/fenxiao/model/FenxiaoOrder.php | 183 +++++++++++++++--- .../fenxiao/shop/view/public/js/order_list.js | 13 +- app/pay/controller/Test.php | 10 +- 5 files changed, 198 insertions(+), 32 deletions(-) diff --git a/addon/fenxiao/api/controller/Fenxiao.php b/addon/fenxiao/api/controller/Fenxiao.php index a263204..97d65e2 100644 --- a/addon/fenxiao/api/controller/Fenxiao.php +++ b/addon/fenxiao/api/controller/Fenxiao.php @@ -108,11 +108,24 @@ class Fenxiao extends BaseApi } } } + $sideways_in_progress_commission = $fenxiao_order_model->getFenxiaoOrderList([ [ 'sideways_fenxiao_id', 'like', '%'.$info[ 'data' ][ 'fenxiao_id' ].'%' ], [ 'is_settlement', '=', 0 ], [ 'is_refund', '=', 0 ] ], 'sideways_fenxiao_id,sideways_fenxiao_detail'); + $sideways_money = 0; + if($sideways_in_progress_commission){ + foreach($sideways_in_progress_commission['data'] as $key => &$val){ + $ids = json_decode($val['sideways_fenxiao_id'],true); + $detail = json_decode($val['sideways_fenxiao_detail'],true); + $search = array_search($info[ 'data' ][ 'fenxiao_id' ],$ids); + if($search !== false){ + $sideways_money += $detail[$search]['commission']; + } + } + } if (!empty($one_in_progress_commission[ 'data' ][ 'commission' ])) $info[ 'data' ][ 'in_progress_money' ] += $one_in_progress_commission[ 'data' ][ 'commission' ]; if (!empty($two_in_progress_commission[ 'data' ][ 'commission' ])) $info[ 'data' ][ 'in_progress_money' ] += $two_in_progress_commission[ 'data' ][ 'commission' ]; if (!empty($three_in_progress_commission[ 'data' ][ 'commission' ])) $info[ 'data' ][ 'in_progress_money' ] += $three_in_progress_commission[ 'data' ][ 'commission' ]; if ($wholesale_money) $info[ 'data' ][ 'in_progress_money' ] += $wholesale_money; if ($founder_money) $info[ 'data' ][ 'in_progress_money' ] += $founder_money; + if ($sideways_money) $info[ 'data' ][ 'in_progress_money' ] += $sideways_money; } return $this->response($info); } diff --git a/addon/fenxiao/api/controller/Order.php b/addon/fenxiao/api/controller/Order.php index ede9bbe..935c9c8 100644 --- a/addon/fenxiao/api/controller/Order.php +++ b/addon/fenxiao/api/controller/Order.php @@ -82,12 +82,12 @@ class Order extends BaseApi $field = 'fo.fenxiao_order_id,fo.order_no,fo.site_id,fo.site_name,fo.sku_id,fo.sku_name,fo.sku_image,fo.price,fo.num,fo.real_goods_money,fo.member_name, fo.member_mobile,fo.one_fenxiao_name,fo.is_settlement,fo.commission,fo.is_refund, o.order_status_name,o.create_time,fo.one_fenxiao_id,fo.two_fenxiao_id,fo.three_fenxiao_id,fo.one_commission,fo.two_commission,fo.three_commission - ,fo.wholesale_fenxiao_id,fo.wholesale_fenxiao_detail,fo.founder_fenxiao_id,fo.founder_fenxiao_detail'; + ,fo.wholesale_fenxiao_id,fo.wholesale_fenxiao_detail,fo.founder_fenxiao_id,fo.founder_fenxiao_detail,fo.sideways_fenxiao_id,fo.sideways_fenxiao_detail'; $sql = Db::name('fenxiao_order')->alias('fo') ->field($field) ->join('order o','fo.order_id = o.order_id','inner') ->whereOr([['fo.one_fenxiao_id|fo.two_fenxiao_id|fo.three_fenxiao_id','=',$fenxiao_info['data']['fenxiao_id']] , - ['fo.wholesale_fenxiao_id|fo.founder_fenxiao_id','like','%'.$fenxiao_info['data']['fenxiao_id'].'%']]); + ['fo.wholesale_fenxiao_id|fo.founder_fenxiao_id|fo.sideways_fenxiao_id','like','%'.$fenxiao_info['data']['fenxiao_id'].'%']]); if (!empty($is_settlement)) { if ($is_settlement == 3) { $sql->where('fo.is_refund','=',1); @@ -138,6 +138,13 @@ class Order extends BaseApi if($search !== false){ $list['data']['list'][$k]['founder_point'] = $detail[$search]['commission']; } + $ids = json_decode($item['sideways_fenxiao_id'],true); + $detail = json_decode($item['sideways_fenxiao_detail'],true); + $search = array_search($fenxiao_info['data']['fenxiao_id'],$ids); + if($search !== false){ + $list['data']['list'][$k]['two_commission'] = $detail[$search]['commission']; + $list['data']['list'][$k]['is_sideways'] = isset($detail[$search]['is_sideways']) && $detail[$search]['is_sideways'] == 1 ? 1 : 0; + } } } return $this->response($list); diff --git a/addon/fenxiao/model/FenxiaoOrder.php b/addon/fenxiao/model/FenxiaoOrder.php index db2ecff..eb7fce0 100644 --- a/addon/fenxiao/model/FenxiaoOrder.php +++ b/addon/fenxiao/model/FenxiaoOrder.php @@ -11,6 +11,7 @@ namespace addon\fenxiao\model; use app\model\BaseModel; use app\model\message\Message; use app\model\system\Stat; +use think\db\Raw; use think\facade\Db; use addon\fenxiao\model\Config as ConfigModel; /** @@ -90,6 +91,7 @@ class FenxiaoOrder extends BaseModel 'sideways_rate' => 0, 'sideways_commission' => 0, 'sideways_fenxiao_detail' => [], + 'is_range' => $fenxiao_basic_config['is_range'], 'weight_money' => 0, // 'weight_fenxiao_id' => [], 'is_weight' => 0 @@ -146,6 +148,8 @@ class FenxiaoOrder extends BaseModel 'sideways_rate' => $order_fenxiao_data['sideways_rate'], 'sideways_commission' => $order_fenxiao_data['sideways_commission'], 'sideways_fenxiao_detail' => json_encode($order_fenxiao_data['sideways_fenxiao_detail']), + 'is_range' => $order_fenxiao_data['is_range'], + 'is_weight' => $order_fenxiao_data['is_weight'], // 'weight_fenxiao_id' => json_encode($order_fenxiao_data['weight_fenxiao_id']), 'weight_money' => $order_fenxiao_data['weight_money'], @@ -172,8 +176,8 @@ class FenxiaoOrder extends BaseModel private function getPushFenXiaoCommission($fenxiao_info,$v,&$order_fenxiao_data,$type,$config){ $one_rate = $config['direct_rate']; $two_rate = $config['indirect_rate']; - $is_range = $config['is_range']; $sideways_rate = $config['sideways_rate']; + $is_range = $config['is_range']; $one_money = $two_money = 0; $join = [ ['fenxiao_level fl','f.level_id = fl.level_id','right'] @@ -206,32 +210,67 @@ class FenxiaoOrder extends BaseModel } //间退 - if (!empty($g_parent_fenxiao_info) && $g_parent_fenxiao_info[ 'status' ] == 1) { + if (!empty($g_parent_fenxiao_info) && $g_parent_fenxiao_info[ 'status' ] == 1 && $order_fenxiao_data['one_fenxiao_id'] > 0) { - if($type == 2){ - $fenxiao_level = model('fenxiao_goods_sku')->getInfo([ [ 'goods_id', '=', $v[ 'goods_id' ] ], [ 'sku_id', '=', $v[ 'sku_id' ] ], [ 'level_id', '=', $g_parent_fenxiao_info[ 'level_id' ] ] ]); - if (empty($fenxiao_level)) return false; - $two_rate = $fenxiao_level['indirect_rate']; - $two_money = $fenxiao_level['indirect_money']; + //必须开启极差并且 + if($is_range && $type == 2){ + + //开启后需要计算所有分销用户 + if($fenxiao_info['chain']){ + $data = explode(',', $fenxiao_info['chain']); + $chain = array_filter($data, function ($value) { + return !empty($value); + }); + $chain = array_values($chain); + $count = count($chain); + //要删除最后一个数据,最后一个数据是自己的分销商ID + unset($chain[$count - 1]); + if($parent_fenxiao_info['fenxiao_id'] == $chain[0]) + unset($chain[0]);//删掉第一个用户,第一个用户拿的是直推奖励 + $chain = array_values($chain); + $chain = array_reverse($chain); + + if($chain){ + $nodeUser = Db::name('fenxiao') + ->where('f.is_delete', '=', 0) + ->alias('f') + ->join('fenxiao_level l', 'f.level_id = l.level_id', 'right') + ->where('f.fenxiao_id', '<>', $fenxiao_info['fenxiao_id']) + ->whereIn('f.fenxiao_id', $chain) + ->field('f.fenxiao_id,f.fenxiao_name,f.member_id,f.level_id,f.site_id,f.fenxiao_name,f.status,l.level_num,l.rank,l.is_weight') + ->select(); //获取上级用户 + $nodeUser = $nodeUser ? $nodeUser->toArray() : []; + if(count($nodeUser) > 0){ + $order_fenxiao_data = $this->getSidewaysCommission($nodeUser,$v,$order_fenxiao_data,$chain,$config,$parent_fenxiao_info['level_num']); + } + } + } + }else{ + if($type == 2){ + $fenxiao_level = model('fenxiao_goods_sku')->getInfo([ [ 'goods_id', '=', $v[ 'goods_id' ] ], [ 'sku_id', '=', $v[ 'sku_id' ] ], [ 'level_id', '=', $g_parent_fenxiao_info[ 'level_id' ] ] ]); + + if (empty($fenxiao_level)) return false; + $two_rate = $fenxiao_level['indirect_rate']; + $two_money = $fenxiao_level['indirect_money']; + } + if ($two_rate > 0) { + $order_fenxiao_data['commission_rate'] += $order_fenxiao_data[ 'two_rate' ] = $two_rate; + $commission = $two_rate * $v[ 'real_goods_money' ] / 100; + } else { + $order_fenxiao_data['commission_rate'] += $order_fenxiao_data[ 'two_rate' ] = round($two_money * $v[ 'num' ] / $v[ 'real_goods_money' ], 2); + $commission = $two_money * $v[ 'num' ]; + } + //计算极差 + if($parent_fenxiao_info['level_num'] == $g_parent_fenxiao_info['level_num']){ + $commission = bcsub($order_fenxiao_data['one_commission'],$commission,2); + $order_fenxiao_data[ 'two_commission' ] = $sideways_rate * $commission / 100; + $order_fenxiao_data['commission'] += $commission; + } + $order_fenxiao_data['two_fenxiao_id'] = $g_parent_fenxiao_info['fenxiao_id']; + $order_fenxiao_data['two_fenxiao_name'] = $g_parent_fenxiao_info['fenxiao_name']; } - if ($two_rate > 0) { - $order_fenxiao_data['commission_rate'] += $order_fenxiao_data[ 'two_rate' ] = $two_rate; - $commission = $two_rate * $v[ 'real_goods_money' ] / 100; - } else { - $order_fenxiao_data['commission_rate'] += $order_fenxiao_data[ 'two_rate' ] = round($two_money * $v[ 'num' ] / $v[ 'real_goods_money' ], 2); - $commission = $two_money * $v[ 'num' ]; - } - - //计算极差 - if($is_range && $order_fenxiao_data['one_fenxiao_id'] > 0 && $parent_fenxiao_info['level_num'] == $g_parent_fenxiao_info['level_num']){ - $commission = bcsub($order_fenxiao_data['one_commission'],$commission,2); - $order_fenxiao_data[ 'two_commission' ] = $sideways_rate * $commission / 100; - $order_fenxiao_data['commission'] += $commission; - } - $order_fenxiao_data['two_fenxiao_id'] = $g_parent_fenxiao_info['fenxiao_id']; - $order_fenxiao_data['two_fenxiao_name'] = $g_parent_fenxiao_info['fenxiao_name']; } return $order_fenxiao_data; } @@ -253,8 +292,8 @@ class FenxiaoOrder extends BaseModel $chain = array_filter($data, function ($value) { return !empty($value); }); + $chain = array_values($chain); $count = count($chain); - //要删除最后一个数据,最后一个数据是自己的分销商ID unset($chain[$count - 1]); $chain = array_values($chain); @@ -342,6 +381,49 @@ class FenxiaoOrder extends BaseModel return $order_fenxiao_data; } + protected function getSidewaysCommission($nodeUser,$v,&$order_fenxiao_data,$chain,$config,$level_num = 0){ + $fenxiao_user_id = array_column($nodeUser,'fenxiao_id'); + $sideways_rate = $config['sideways_rate']; + $last_commission = $order_fenxiao_data['one_commission']; + foreach($chain as $k => $value){ + $key = array_search($value,$fenxiao_user_id); + $user = $key !== false ? $nodeUser[$key] : []; + if($user){ + $commission = 0; + $is_sideways = 0; + //计算平级将奖 + if($level_num == $user['level_num']){ + $is_sideways = 1; + $compute_money = $this->getSidewaysFenxiao($user,$v,$last_commission); + $order_fenxiao_data['commission_rate'] += $order_fenxiao_data[ 'sideways_rate' ] = $sideways_rate; + $commission = $sideways_rate * $compute_money / 100; + }else if($user['level_num'] > $level_num){ + //必须要大于上一个等级的人才可以拿奖励 + $goods_config = model('fenxiao_goods_sku')->getInfo([ [ 'goods_id', '=', $v['goods_id'] ], [ 'sku_id', '=', $v['sku_id'] ], [ 'level_id', '=', $user['level_id'] ] ]); + + if ($goods_config['direct_rate'] > 0) { + $order_fenxiao_data['commission_rate'] += $order_fenxiao_data[ 'sideways_rate' ] = $goods_config['direct_rate']; + $commission = $goods_config['direct_rate'] * $v[ 'real_goods_money' ] / 100; + } else { + $order_fenxiao_data['commission_rate'] += $order_fenxiao_data[ 'sideways_rate' ] = round($goods_config['direct_money'] * $v[ 'num' ] / $v[ 'real_goods_money' ], 2); + $commission = $goods_config['direct_money'] * $v[ 'num' ]; + } + $commission = $commission - $last_commission; + + } + if($commission > 0){ + $level_num = $user['level_num']; + $last_commission = $commission; + $order_fenxiao_data['sideways_fenxiao_id'][] = $user['fenxiao_id']; + $order_fenxiao_data['commission'] += $order_fenxiao_data[ 'sideways_commission' ] += $commission; + $order_fenxiao_data['sideways_fenxiao_detail'][] = ['name' => $user['fenxiao_name'], 'commission' => $commission,'is_sideways' => $is_sideways]; + } + + } + } + return $order_fenxiao_data; + } + @@ -366,6 +448,59 @@ class FenxiaoOrder extends BaseModel return $rates[$rank]; } + protected function getSidewaysFenxiao($user,$v,$money){ + $commission = 0; + $fenxiao_info = model('fenxiao')->getInfo([ 'fenxiao_id' => $user['fenxiao_id'] ], 'parent,chain'); + if($fenxiao_info['chain'] && $fenxiao_info['parent'] > 0){ + //必须有关系链并且存在父级ID才继续执行 + $data = explode(',', $fenxiao_info['chain']); + $chain = array_filter($data, function ($value) { + return !empty($value); + }); + $chain = array_values($chain); + $count = count($chain); + + //要删除最后一个数据,最后一个数据是自己的分销商ID + unset($chain[$count - 1]); + $chain = array_values($chain); + $chain = array_reverse($chain); + + $nodeUser = Db::name('fenxiao') + ->where('f.is_delete', '=', 0) + ->alias('f') + ->join('fenxiao_level l', 'f.level_id = l.level_id', 'right') + ->where('f.fenxiao_id', '<>', $user['fenxiao_id']) + ->whereIn('f.fenxiao_id', $chain) + ->where('l.level_num' ,'>', $user['level_num']) + ->field('f.fenxiao_id,f.fenxiao_name,f.member_id,f.level_id,f.site_id,f.fenxiao_name,f.status,l.level_num,l.rank,l.is_weight') + ->select(); //获取上级用户 + $nodeUser = $nodeUser ? $nodeUser->toArray() : []; + usort($nodeUser, function($a, $b) use ($chain) { + $posA = array_search($a['fenxiao_id'], $chain); + $posB = array_search($b['fenxiao_id'], $chain); + + return $posA - $posB; + }); + + if($nodeUser){ + $nsUser = $nodeUser[0];//取顺位第一位 + $goods_config = model('fenxiao_goods_sku')->getInfo([ [ 'goods_id', '=', $v['goods_id'] ], [ 'sku_id', '=', $v['sku_id'] ], [ 'level_id', '=', $nsUser['level_id'] ] ]); + if ($goods_config['direct_rate'] > 0) { + $commission = $goods_config['direct_rate'] * $v[ 'real_goods_money' ] / 100; + } else { + $commission = $goods_config['direct_money'] * $v[ 'num' ]; + } + $commission = $commission - $money; + } + } + return $commission > 0 ? $commission : 0; + + } + // 定义比较函数 + protected function compareByAge($a, $b) { + return $a['age'] <=> $b['age']; // 使用太空船操作符(PHP 7+)进行比较 + } + /** * 订单退款 * @param $order_goods_id diff --git a/addon/fenxiao/shop/view/public/js/order_list.js b/addon/fenxiao/shop/view/public/js/order_list.js index 48def3d..54c8cae 100644 --- a/addon/fenxiao/shop/view/public/js/order_list.js +++ b/addon/fenxiao/shop/view/public/js/order_list.js @@ -104,7 +104,18 @@ Order.prototype.cols = [ merge : false, template : function(orderitem,order){ var html = '