diff --git a/addon/fenxiao/api/controller/Order.php b/addon/fenxiao/api/controller/Order.php index 29519f9..ede9bbe 100644 --- a/addon/fenxiao/api/controller/Order.php +++ b/addon/fenxiao/api/controller/Order.php @@ -130,6 +130,7 @@ class Order extends BaseApi $search = array_search($fenxiao_info['data']['fenxiao_id'],$ids); if($search !== false){ $list['data']['list'][$k]['wholesale_point'] = $detail[$search]['commission']; + $list['data']['list'][$k]['wholesale_is_sideways'] = isset($detail[$search]['is_sideways']) && $detail[$search]['is_sideways'] == 1 ? 1 : 0; } $ids = json_decode($item['founder_fenxiao_id'],true); $detail = json_decode($item['founder_fenxiao_detail'],true); @@ -137,9 +138,6 @@ class Order extends BaseApi if($search !== false){ $list['data']['list'][$k]['founder_point'] = $detail[$search]['commission']; } - // if($item['fenxiao_order_id'] == 150){ - // dump($list['data']['list'][$k]); - // } } } return $this->response($list); diff --git a/addon/fenxiao/model/Config.php b/addon/fenxiao/model/Config.php index 8b1eaac..feeddc9 100644 --- a/addon/fenxiao/model/Config.php +++ b/addon/fenxiao/model/Config.php @@ -41,6 +41,7 @@ class Config extends BaseModel 'is_apply' => $data[ 'is_apply' ],//是否开启分销申请 'is_commission_money' => $data[ 'is_commission_money' ],//是否开启商品详情一级佣金 'is_support_cashier' => $data[ 'is_support_cashier' ],//是否开启商品详情一级佣金 + 'is_range' => (int)$data['is_range'],//是否极差计算佣金 'direct_rate' => $data[ 'direct_rate' ],//默认直推 'indirect_rate' => $data[ 'indirect_rate' ],//默认间推 'founder_rate' => $data[ 'founder_rate' ],//创始人分红比例 @@ -88,6 +89,7 @@ class Config extends BaseModel if (empty($res[ 'data' ][ 'value' ])) { $res[ 'data' ][ 'value' ] = [ 'level' => 2,//分销层级 + 'is_range' => 0,//极差 'return' => 1,//分红返还 'internal_buy' => 0,//分销内购 'is_examine' => 0,//是否需要审核 @@ -104,6 +106,7 @@ class Config extends BaseModel $res[ 'data' ][ 'value' ][ 'is_commission_money' ] = $res[ 'data' ][ 'value' ][ 'is_commission_money' ] ?? 1; $res[ 'data' ][ 'value' ][ 'self_purchase_rebate' ] = $res[ 'data' ][ 'value' ][ 'self_purchase_rebate' ] ?? 1; $res[ 'data' ][ 'value' ][ 'is_apply' ] = $res[ 'data' ][ 'value' ][ 'is_apply' ] ?? 1; + $res[ 'data' ][ 'value' ][ 'is_range' ] = $res[ 'data' ][ 'value' ][ 'is_range' ] ?? 0; $res[ 'data' ][ 'value' ][ 'level' ] = $res[ 'data' ][ 'value' ][ 'level' ] == 3 ? 2 : $res[ 'data' ][ 'value' ][ 'level' ]; $res[ 'data' ][ 'value' ][ 'is_support_cashier' ] = $res[ 'data' ][ 'value' ][ 'is_support_cashier' ] ?? 0; $res[ 'data' ][ 'value' ][ 'direct_rate' ] = $res[ 'data' ][ 'value' ][ 'direct_rate' ] ?? 0; diff --git a/addon/fenxiao/model/FenxiaoOrder.php b/addon/fenxiao/model/FenxiaoOrder.php index 5168fcb..f75e9ff 100644 --- a/addon/fenxiao/model/FenxiaoOrder.php +++ b/addon/fenxiao/model/FenxiaoOrder.php @@ -81,6 +81,11 @@ class FenxiaoOrder extends BaseModel 'founder_rate' => 0, 'founder_commission' => 0, 'founder_fenxiao_detail' => [], + + 'sideways_fenxiao_id' => [], + 'sideways_rate' => 0, + 'sideways_commission' => 0, + 'sideways_fenxiao_detail' => [], 'weight_money' => 0, // 'weight_fenxiao_id' => [], 'is_weight' => 0 @@ -91,7 +96,7 @@ class FenxiaoOrder extends BaseModel if($goods_info['goods_kind_id']){ $order_fenxiao_data = $this->getPushFenXiaoCommission($fenxiao_info,$v,$order_fenxiao_data,$goods_info['fenxiao_type'],$fenxiao_basic_config); } - + //计算进货佣金 $order_fenxiao_data = $this->getWholesaleFenXiaoCommission($fenxiao_info,$v,$order_fenxiao_data,$fenxiao_basic_config,$goods_info['goods_kind_id'],$goods_info['fenxiao_type']); if(($order_fenxiao_data['commission'] && $order_fenxiao_data['commission_rate']) || $order_fenxiao_data['wholesale_rate'] || $order_fenxiao_data['founder_rate']){ $data = [ @@ -129,6 +134,11 @@ class FenxiaoOrder extends BaseModel 'founder_rate' => $order_fenxiao_data['founder_rate'], 'founder_commission' => $order_fenxiao_data['founder_commission'], 'founder_fenxiao_detail' => json_encode($order_fenxiao_data['founder_fenxiao_detail']), + + 'sideways_fenxiao_id' => json_encode($order_fenxiao_data['sideways_fenxiao_id']), + '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_weight' => $order_fenxiao_data['is_weight'], // 'weight_fenxiao_id' => json_encode($order_fenxiao_data['weight_fenxiao_id']), 'weight_money' => $order_fenxiao_data['weight_money'], @@ -155,17 +165,25 @@ 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']; $one_money = $two_money = 0; - $parent_fenxiao_info = $fenxiao_info['parent'] > 0 ? model('fenxiao')->getInfo([ [ 'fenxiao_id', '=', $fenxiao_info[ 'parent' ] ], [ 'is_delete', '=', 0 ] ], 'fenxiao_id, fenxiao_name, status, parent,level_id') : []; - $g_parent_fenxiao_info = $fenxiao_info['grand_parent'] > 0 ? model('fenxiao')->getInfo([ [ 'fenxiao_id', '=', $fenxiao_info[ 'grand_parent' ] ], [ 'is_delete', '=', 0 ] ], 'fenxiao_id, fenxiao_name, status, parent,level_id') : []; - + $join = [ + ['fenxiao_level fl','f.level_id = fl.level_id','right'] + ]; + $parent_fenxiao_info = $fenxiao_info['parent'] > 0 ? model('fenxiao')->getInfo([ [ 'f.fenxiao_id', '=', $fenxiao_info[ 'parent' ] ], [ 'f.is_delete', '=', 0 ] ], 'f.fenxiao_id, f.fenxiao_name, f.status, f.parent,f.level_id,fl.level_num','f',$join) : []; + $g_parent_fenxiao_info = $fenxiao_info['grand_parent'] > 0 ? model('fenxiao')->getInfo([ [ 'f.fenxiao_id', '=', $fenxiao_info[ 'grand_parent' ] ], [ 'f.is_delete', '=', 0 ] ], 'f.fenxiao_id, f.fenxiao_name, f.status, f.parent,f.level_id,fl.level_num','f',$join) : []; + //直推 if (!empty($parent_fenxiao_info) && $parent_fenxiao_info[ 'status' ] == 1) { + if($type == 2){ $fenxiao_level = model('fenxiao_goods_sku')->getInfo([ [ 'goods_id', '=', $v[ 'goods_id' ] ], [ 'sku_id', '=', $v[ 'sku_id' ] ], [ 'level_id', '=', $parent_fenxiao_info[ 'level_id' ] ] ]); if (empty($fenxiao_level)) return false; + $one_rate = $fenxiao_level['direct_rate']; $one_money = $fenxiao_level['direct_money']; } + if ($one_rate > 0) { $order_fenxiao_data['commission_rate'] += $order_fenxiao_data[ 'one_rate' ] = $one_rate; $order_fenxiao_data['commission'] += $order_fenxiao_data[ 'one_commission' ] = $one_rate * $v[ 'real_goods_money' ] / 100; @@ -176,24 +194,34 @@ class FenxiaoOrder extends BaseModel $order_fenxiao_data['one_fenxiao_id'] = $parent_fenxiao_info['fenxiao_id']; $order_fenxiao_data['one_fenxiao_name'] = $parent_fenxiao_info['fenxiao_name']; } + //间退 if (!empty($g_parent_fenxiao_info) && $g_parent_fenxiao_info[ 'status' ] == 1) { + 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; - $order_fenxiao_data['commission'] += $order_fenxiao_data[ 'two_commission' ] = $two_rate * $v[ 'real_goods_money' ] / 100; + $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); - $order_fenxiao_data['commission'] += $order_fenxiao_data[ 'two_commission' ] = $two_money * $v[ 'num' ]; + $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; } @@ -220,7 +248,6 @@ class FenxiaoOrder extends BaseModel unset($chain[$count - 1]); $chain = array_values($chain); $chain = array_reverse($chain); - $nodeUser = Db::name('fenxiao') ->where('f.is_delete', '=', 0) ->alias('f') @@ -230,6 +257,7 @@ class FenxiaoOrder extends BaseModel ->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->getWholesaleCommission($nodeUser,$v,$order_fenxiao_data,$chain,$config,$goods_kind,$fenxiao_type); } @@ -244,28 +272,43 @@ class FenxiaoOrder extends BaseModel $max_level_num = (int)model('fenxiao_level')->stat([['site_id' ,'=' , $v['site_id']]],'max','level_num'); $one_fenxiao_id = $order_fenxiao_data['one_fenxiao_id']; $two_fenxiao_id = $order_fenxiao_data['two_fenxiao_id']; + $level_num = 0; + $sideways_rate = $config['sideways_rate']; + $is_range = $config['is_range']; foreach($chain as $k => $value){ + $commission = 0; $key = array_search($value,$fenxiao_user_id); - $user = $nodeUser[$key]; - + $user = $key !== false ? $nodeUser[$key] : []; $rank = $goods_kind ? count($order_fenxiao_data['wholesale_fenxiao_id']) + 1 : count($order_fenxiao_data['wholesale_fenxiao_id']); //直推和间推也需要计算 - if(!empty($user) && $rank < $user['rank'] && $rank <= 4){ + if(!empty($user) && $rank < $user['rank'] && $rank <= 4 && $user['level_num'] >= $level_num){ $rate = $this->getLevelRate($rank,$v['site_id'],$v['goods_id'],$v[ 'sku_id' ],$user['level_id'],$config,$fenxiao_type); if($user['rank'] == 1 && ($one_fenxiao_id != $user['fenxiao_id'] && $two_fenxiao_id != $user['fenxiao_id'])){ - $order_fenxiao_data['wholesale_fenxiao_id'][] = $user['fenxiao_id']; $order_fenxiao_data['commission_rate'] += $order_fenxiao_data[ 'wholesale_rate' ] += $rate; $commission = $rate * $v[ 'goods_money' ] / 100; - $order_fenxiao_data['commission'] += $order_fenxiao_data[ 'wholesale_commission' ] += $commission; - $order_fenxiao_data['wholesale_fenxiao_detail'][] = ['name' => $user['fenxiao_name'], 'commission' => $commission]; }else if($user['rank'] > 1){ - $order_fenxiao_data['wholesale_fenxiao_id'][] = $user['fenxiao_id']; $order_fenxiao_data['commission_rate'] += $order_fenxiao_data[ 'wholesale_rate' ] += $rate; $commission = $rate * $v[ 'goods_money' ] / 100; - $order_fenxiao_data['commission'] += $order_fenxiao_data[ 'wholesale_commission' ] += $commission; - $order_fenxiao_data['wholesale_fenxiao_detail'][] = ['name' => $user['fenxiao_name'], 'commission' => $commission]; } + $is_sideways = 0; + if($commission > 0){ + //等级相同并且开启了极差 + if($level_num == $user['level_num'] && $is_range){ + $is_sideways = 1; + $last_key = count($order_fenxiao_data['wholesale_fenxiao_id']) - 1; + if($last_key >= 0){ + $commission = $sideways_rate * bcsub($order_fenxiao_data['wholesale_fenxiao_detail'][$last_key]['commission'],$commission,2) / 100; + } + } + $order_fenxiao_data['wholesale_fenxiao_id'][] = $user['fenxiao_id']; + + $order_fenxiao_data['commission'] += $order_fenxiao_data[ 'wholesale_commission' ] += $commission; + $order_fenxiao_data['wholesale_fenxiao_detail'][] = ['name' => $user['fenxiao_name'], 'commission' => sprintf("%.2f", $commission),'is_sideways' => $is_sideways]; + } + $level_num = $user['level_num']; } + + //联合创始人分红 if(isset($user) && !empty($user) && $max_level_num == $user['level_num'] && $config['founder_rate'] && $goods_kind === 0){ $order_fenxiao_data['founder_fenxiao_id'][] = $user['fenxiao_id']; @@ -289,6 +332,8 @@ class FenxiaoOrder extends BaseModel } + + protected function getLevelRate($rank,$site_id,$goods_id,$sku_id,$level_id,$config,$fenxiao_type){ if($fenxiao_type == 2){ $fenxiao_level = model('fenxiao_goods_sku')->getInfo([ [ 'goods_id', '=', $goods_id ], [ 'sku_id', '=', $sku_id ], [ 'level_id', '=', $level_id ] ]); @@ -307,7 +352,6 @@ class FenxiaoOrder extends BaseModel $config['four_rate'] ?? 0, ]; } - return $rates[$rank]; } diff --git a/addon/fenxiao/shop/controller/Config.php b/addon/fenxiao/shop/controller/Config.php index 2d66d8c..7b8ef90 100644 --- a/addon/fenxiao/shop/controller/Config.php +++ b/addon/fenxiao/shop/controller/Config.php @@ -48,6 +48,7 @@ class Config extends BaseShop 'child_condition' => input('child_condition', ''),//成为下线条件 'is_apply' => input('is_apply', ''),//是否开启分销申请(0关闭 1开启) 'is_commission_money' => input('is_commission_money', ''),//是否开启商品详情一级佣金(0关闭 1开启) + 'is_range' => input('is_range', 0),//极差 'one_rate' => input('one_rate', 0.00), 'two_rate' => input('two_rate', 0.00), 'three_rate' => input('three_rate', 0.00), diff --git a/addon/fenxiao/shop/view/config/basics.html b/addon/fenxiao/shop/view/config/basics.html index ec22bac..3468339 100644 --- a/addon/fenxiao/shop/view/config/basics.html +++ b/addon/fenxiao/shop/view/config/basics.html @@ -19,6 +19,16 @@ +