From 4425982fb1165e61da9556f02da6f18bb5b21698 Mon Sep 17 00:00:00 2001 From: liqianjin <949671634@qq.com> Date: Fri, 28 Mar 2025 17:21:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=B9=B3=E7=BA=A7=E5=A5=96?= =?UTF-8?q?=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=9E=81=E5=B7=AE=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- addon/fenxiao/api/controller/Order.php | 4 +- addon/fenxiao/model/Config.php | 3 + addon/fenxiao/model/FenxiaoOrder.php | 80 ++++++++++++++----- addon/fenxiao/shop/controller/Config.php | 1 + addon/fenxiao/shop/view/config/basics.html | 10 +++ .../fenxiao/shop/view/public/js/order_list.js | 2 +- app/api/controller/Cart.php | 5 +- app/model/order/OrderCreate.php | 16 ++-- app/pay/controller/Test.php | 2 +- 9 files changed, 89 insertions(+), 34 deletions(-) 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 @@ +
+ +
+
+ + +
+
+
分销商上级的佣金比例减去当前等级佣金比例为最终上级佣金计算比例
+
diff --git a/addon/fenxiao/shop/view/public/js/order_list.js b/addon/fenxiao/shop/view/public/js/order_list.js index 5c36a20..48def3d 100644 --- a/addon/fenxiao/shop/view/public/js/order_list.js +++ b/addon/fenxiao/shop/view/public/js/order_list.js @@ -111,7 +111,7 @@ Order.prototype.cols = [ if(i == 0){ html += '
进货分佣:'+ (array_detail[i].commission > 0 ? array_detail[i].name +' ¥' + array_detail[i].commission : '--') +'
'; }else{ - html += '
'+ (array_detail[i].commission > 0 ? array_detail[i].name +' ¥' + array_detail[i].commission : '--') +'
'; + html += '
'+ (array_detail[i].commission > 0 ? array_detail[i].name +' ¥' + array_detail[i].commission + (array_detail[i].is_sideways == 1 ? '(平级奖)' : '') : '--') +'
'; } } }else{ diff --git a/app/api/controller/Cart.php b/app/api/controller/Cart.php index ec61fb3..f0629ce 100644 --- a/app/api/controller/Cart.php +++ b/app/api/controller/Cart.php @@ -109,7 +109,6 @@ class Cart extends BaseApi { $token = $this->checkToken(); if ($token[ 'code' ] < 0) return $this->response($token); - $this->initStoreData(); $goods = new Goods(); @@ -120,8 +119,8 @@ class Cart extends BaseApi ]; $field = 'ngc.cart_id, ngc.site_id, ngc.member_id, ngc.sku_id, ngc.num, ngs.sku_name,ngs.goods_id, ngs.sku_no, ngs.sku_spec_format,ngs.price,ngs.market_price, ngs.goods_spec_format, - ngs.discount_price, ngs.promotion_type, ngs.start_time, ngs.end_time, ngs.stock, - ngs.sku_image, ngs.sku_images, ngs.goods_state, ngs.goods_stock_alarm, ngs.is_virtual, ngs.goods_name, ngs.is_consume_discount, ngs.discount_config, , ngs.discount_method, + ngs.discount_price, ngs.promotion_type, ngs.start_time, ngs.end_time, ngs.stock, + ngs.sku_image, ngs.sku_images, ngs.goods_state, ngs.goods_stock_alarm, ngs.is_virtual, ngs.goods_name, ngs.is_consume_discount, ngs.discount_config, ngs.discount_method, ngs.virtual_indate, ngs.is_free_shipping, ngs.shipping_template, ngs.unit, ngs.introduction,ngs.sku_spec_format, ngs.keywords, ngs.max_buy, ngs.min_buy, ns.site_name, ngs.is_limit, ngs.limit_type'; $join = [ [ 'goods_cart ngc', 'ngc.sku_id = ngs.sku_id', 'inner' ], diff --git a/app/model/order/OrderCreate.php b/app/model/order/OrderCreate.php index 53a6fe9..26b812a 100644 --- a/app/model/order/OrderCreate.php +++ b/app/model/order/OrderCreate.php @@ -772,7 +772,13 @@ class OrderCreate extends BaseModel ] ]; $jielong_id = $data['jielong_id'] ?? 0; - if (!empty($cart_ids)) { + if (!empty($sku_array)) { + $sku_array = json_decode($sku_array,true); + $sku_ids = array_column($sku_array,'sku_id'); + $condition[] = [ + ['ngs.sku_id' ,'in' ,$sku_ids] + ]; + } else if(!empty($cart_ids)) { $field .= ',ngc.member_id, ngc.sku_id, ngc.num'; if ($jielong_id > 0) { $join[] = [ @@ -790,12 +796,6 @@ class OrderCreate extends BaseModel } $condition[] = ['ngc.cart_id', 'in', $cart_ids]; $condition[] = ['ngc.member_id', '=', $member_id]; - } else if(!empty($sku_array)) { - $sku_array = json_decode($sku_array,true); - $sku_ids = array_column($sku_array,'sku_id'); - $condition[] = [ - ['ngs.sku_id' ,'in' ,$sku_ids] - ]; }else{ $num = $data['num']; $field .= ',' . $num . ' as num'; @@ -811,7 +811,7 @@ class OrderCreate extends BaseModel if (!empty($goods_list)) { $express_type_list = (new \app\model\express\Config())->getExpressTypeList($data['site_id']); foreach ($goods_list as $k => $v) { - if ((!empty($cart_ids) || !empty($sku_id) && empty($sku_array)) && $v['num'] < 1) { + if (((!empty($cart_ids) || !empty($sku_id)) && empty($sku_array)) && $v['num'] < 1) { $this->setError(1, '商品项的购买数量不能小于1'); } if(!empty($sku_array)){ diff --git a/app/pay/controller/Test.php b/app/pay/controller/Test.php index 61d0ed1..c086a0d 100644 --- a/app/pay/controller/Test.php +++ b/app/pay/controller/Test.php @@ -24,7 +24,7 @@ class Test{ // public function test(){ - $orderId = 95; + $orderId = 101; $order_info = model('order')->getInfo(['order_id' => $orderId]); // $fenxiao_order = new OrderPay(); // $res = $fenxiao_order->handle($order_info);