修改极差问题

This commit is contained in:
liqianjin 2025-03-31 20:05:16 +08:00
parent d97311b349
commit e6885ed7de
5 changed files with 198 additions and 32 deletions

View File

@ -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);
}

View File

@ -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);

View File

@ -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

View File

@ -104,7 +104,18 @@ Order.prototype.cols = [
merge : false,
template : function(orderitem,order){
var html = '<div>直推分佣:'+ (orderitem.one_fenxiao_id > 0 ? orderitem.one_fenxiao_name +' ¥' + orderitem.one_commission : '--') +'</div>';
html += '<div>间推分佣:'+ (orderitem.two_fenxiao_id > 0 ? orderitem.two_fenxiao_name +' ¥' + orderitem.two_commission : '--') +'</div>';
if(orderitem.is_range > 0){
var array_detail = $.parseJSON(orderitem.sideways_fenxiao_detail);
for(var i=0;i<array_detail.length;i++){
if(i == 0){
html += '<div>间推分佣:'+ (array_detail[i].commission > 0 ? array_detail[i].name +' ¥' + array_detail[i].commission : '--') +'</div>';
}else{
html += '<div style="padding-left: 24%">'+ (array_detail[i].commission > 0 ? array_detail[i].name +' ¥' + array_detail[i].commission + (array_detail[i].is_sideways == 1 ? '(平级奖)' : '') : '--') +'</div>';
}
}
}else{
html += '<div>间推分佣:'+ (orderitem.two_fenxiao_id > 0 ? orderitem.two_fenxiao_name +' ¥' + orderitem.two_commission : '--') +'</div>';
}
if(orderitem.wholesale_commission > 0){
var array_detail = $.parseJSON(orderitem.wholesale_fenxiao_detail);
for(var i=0;i<array_detail.length;i++){

View File

@ -24,16 +24,16 @@ class Test{
//
public function test(){
$orderId = 108;
$orderId = 111;
$order_info = model('order')->getInfo(['order_id' => $orderId]);
$fenxiao_order = new OrderPay();
// $fenxiao_order = new OrderPay();
// $res = $fenxiao_order->handle($order_info);
// $fenxiao_order = new WeightOrder();
// $res = $fenxiao_order->calculate(1);
// $fenxiao_order_model = new FenxiaoOrder();
$res = $fenxiao_order->handle($order_info);
// $fenxiao_order_model = new FenxiaoOrder();
// $res = $fenxiao_order_model->calculate($order_info);
// $res = $fenxiao_order->handle($order_info);
$fenxiao_order_model = new FenxiaoOrder();
$res = $fenxiao_order_model->calculate($order_info);
// $res = $fenxiao_order_model->settlement($orderId);
dump($res);die;
$fenxiao_id = 195;