diff --git a/addon/fenxiao/config/event.php b/addon/fenxiao/config/event.php index d7488f0..2581163 100644 --- a/addon/fenxiao/config/event.php +++ b/addon/fenxiao/config/event.php @@ -77,6 +77,9 @@ return [ //统计写入 'AddStat' => [ 'addon\fenxiao\event\AddStat', + ], + 'NodeParent'=>[ + 'addon\fenxiao\event\NodeParent', ] ], diff --git a/addon/fenxiao/event/NodeParent.php b/addon/fenxiao/event/NodeParent.php new file mode 100644 index 0000000..c2df47d --- /dev/null +++ b/addon/fenxiao/event/NodeParent.php @@ -0,0 +1,26 @@ +getInfo(['fenxiao_id' => $param['parent']], 'fenxiao_id,fenxiao_name,parent,chain,depth_level'); + if ($parentInfo) { + $Parent['chain'] = $parentInfo['chain'] . $param['fenxiao_id'] . ','; + $Parent['depth_level'] = $parentInfo['depth_level'] + 1; + } else { + $Parent['chain'] = $param['fenxiao_id'] . ','; + $Parent['depth_level'] = 1; + } + return $Parent; + } + if (isset($param['fenxiao_id'])) { + $Parent['chain'] = $param['fenxiao_id'] . ','; + $Parent['depth_level'] = 1; + return $Parent; + } + return []; + } +} diff --git a/addon/fenxiao/model/Config.php b/addon/fenxiao/model/Config.php index 2c96f26..3e1cad8 100644 --- a/addon/fenxiao/model/Config.php +++ b/addon/fenxiao/model/Config.php @@ -75,7 +75,6 @@ class Config extends BaseModel { $config = new ConfigModel(); $res = $config->getConfig([ [ 'site_id', '=', $site_id ], [ 'app_module', '=', 'shop' ], [ 'config_key', '=', 'FENXIAO_BASICS_CONFIG' ] ]); - if (empty($res[ 'data' ][ 'value' ])) { $res[ 'data' ][ 'value' ] = [ 'level' => 2,//分销层级 diff --git a/addon/fenxiao/model/Fenxiao.php b/addon/fenxiao/model/Fenxiao.php index 587bd12..952e238 100644 --- a/addon/fenxiao/model/Fenxiao.php +++ b/addon/fenxiao/model/Fenxiao.php @@ -14,6 +14,7 @@ use app\model\BaseModel; use app\model\member\Member; use app\model\order\OrderCommon; use app\model\system\Stat; +use think\facade\Db; use think\facade\Queue; /** @@ -61,6 +62,10 @@ class Fenxiao extends BaseModel ]); } $res = model('fenxiao')->add($data); + $nodeInfo = event('NodeParent', $data, true); + if ($nodeInfo) { + model('fenxiao')->update($nodeInfo, [['fenxiao_id', '=', $res]]); + } //修改会员信息 model('member')->update([ 'fenxiao_id' => $res, 'is_fenxiao' => 1 ], [ [ 'member_id', '=', $data[ 'member_id' ] ] ]); $stat_model = new Stat(); @@ -361,6 +366,7 @@ class Fenxiao extends BaseModel $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ], [ 'site_id', '=', $site_id ], [ 'is_delete', '=', 0 ] ], 'order_num,order_complete_num,order_money,order_complete_money,is_fenxiao'); if (empty($member_info)) return $this->error('', '未查询到会员信息'); $fenxiao_info = $this->getFenxiaoDetailInfo([ [ 'f.member_id', '=', $member_id ] ])[ 'data' ]; + if (!empty($fenxiao_info) && $member_info[ 'is_fenxiao' ]) return $this->error('', '已经是分销商'); try { $config = new Config(); @@ -410,7 +416,6 @@ class Fenxiao extends BaseModel //获取用户信息 $member_field = 'member_id,site_id,source_member,fenxiao_id,nickname,headimg,mobile,reg_time,order_money,order_complete_money,order_num,order_complete_num'; $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ] ], $member_field); - if (!empty($member_info)) { $parent = 0; if (!empty($member_info[ 'source_member' ])) { @@ -524,25 +529,41 @@ class Fenxiao extends BaseModel 'f.site_id' ]; $fenxiao_info = model('fenxiao')->getInfo($where, $field, 'f', $join); + if (!empty($fenxiao_info)) { $level_list = model('fenxiao_level')->getList([ ['site_id','=',$fenxiao_info['site_id']], ['level_num','>',$fenxiao_info['level_num']] ],'*','level_num asc,one_rate asc'); + if (!empty($level_list)) { $upgrade_level = null; foreach ($level_list as $item) { // 判断:是否需要判断购买指定商品之一升级 $goodsReach = true;// 默认条件达成 $goodsIds = $item['goods_ids'] ?? ''; - $goodsIdsArr = $goodsIds ? explode(',', $goodsIds) : []; + $goodsIdsArr = $goodsIds && $orderId > 0 ? explode(',', $goodsIds) : []; if($orderId > 0 && count($goodsIdsArr) > 0){ + $isBuy = (int)model('order_goods')->getValue([ ['order_id', '=', $orderId], ['goods_id', 'in', $goodsIdsArr], ],'order_goods_id'); + $goodsReach = $isBuy > 0; } + if($item['one_child_fenxiao_equal']){ + $equal_where = [ + ['f.chain', 'like', '%' . $fenxiao_id . ',' . '%' ], + ['f.status','=',1], + ['f.is_delete','=',0], + ['fl.level_num','>=',$fenxiao_info['level_num']], + ]; + //查询用户下线中是否有相同等级或更高的 + $one_child_fenxiao_equal_num = model('fenxiao')->getCount($equal_where, '*', 'f', $join); + }else{ + $one_child_fenxiao_equal_num = 0; + } // 判断:是否升级 if ($item[ 'upgrade_type' ] == 2) { // 需要满足全部条件 @@ -552,7 +573,7 @@ class Fenxiao extends BaseModel && $fenxiao_info[ 'one_fenxiao_total_order' ] >= $item[ 'one_fenxiao_total_order' ] && $fenxiao_info[ 'one_fenxiao_order_money' ] >= $item[ 'one_fenxiao_order_money' ] && $fenxiao_info[ 'one_child_num' ] >= $item[ 'one_child_num' ] - && $fenxiao_info[ 'one_child_fenxiao_num' ] >= $item[ 'one_child_fenxiao_num' ] + && (($fenxiao_info[ 'one_child_fenxiao_num' ] >= $item[ 'one_child_fenxiao_num' ] && $item['one_child_fenxiao_equal'] == 0) || ($item['one_child_fenxiao_equal'] == 1 && $one_child_fenxiao_equal_num >= $item[ 'one_child_fenxiao_num' ])) && $goodsReach ) { $upgrade_level = $item; @@ -567,9 +588,11 @@ class Fenxiao extends BaseModel || ( $fenxiao_info[ 'one_fenxiao_order_money' ] >= $item[ 'one_fenxiao_order_money' ] && $item[ 'one_fenxiao_order_money' ] > 0 ) || ( $fenxiao_info[ 'one_fenxiao_total_order' ] >= $item[ 'one_fenxiao_total_order' ] && $item[ 'one_fenxiao_total_order' ] > 0 ) || ( $fenxiao_info[ 'one_child_num' ] >= $item[ 'one_child_num' ] && $item[ 'one_child_num' ] > 0 ) - || ( $fenxiao_info[ 'one_child_fenxiao_num' ] >= $item[ 'one_child_fenxiao_num' ] && $item[ 'one_child_fenxiao_num' ] > 0 ) + || ( $fenxiao_info[ 'one_child_fenxiao_num' ] >= $item[ 'one_child_fenxiao_num' ] && $item[ 'one_child_fenxiao_num' ] > 0 && $item['one_child_fenxiao_equal'] == 0 ) + || ( $fenxiao_info[ 'one_child_fenxiao_num' ] >= $item[ 'one_child_fenxiao_num' ] && $item[ 'one_child_fenxiao_num' ] > 0 && $item['one_child_fenxiao_equal'] == 1 && $one_child_fenxiao_equal_num >= $item[ 'one_child_fenxiao_num' ]) || ( $goodsReach && count($goodsIdsArr) > 0) ) { + $upgrade_level = $item; break; } @@ -638,15 +661,57 @@ class Fenxiao extends BaseModel try { $fenxiao_info = model('fenxiao')->getInfo([ [ 'fenxiao_id', '=', $member_info[ 'fenxiao_id' ] ], [ 'is_delete', '=', 0 ] ], 'parent'); if ($member_info[ 'is_fenxiao' ] == 1 && $fenxiao_info) {//是分销商 + $fenxiao_info = model('fenxiao')->getInfo([['fenxiao_id', '=', $member_info['fenxiao_id']], ['is_delete', '=', 0]], 'parent,chain'); //修改原有上级分销商团队人数 - if ($fenxiao_info[ 'parent' ] > 0) { + if ($fenxiao_info['parent'] > 0) { //获取原有上级分销商信息 - model('fenxiao')->setDec([ [ 'fenxiao_id', '=', $fenxiao_info[ 'parent' ] ] ], 'one_child_fenxiao_num'); + model('fenxiao')->setDec([['fenxiao_id', '=', $fenxiao_info['parent']]], 'one_child_fenxiao_num'); + $like = '%' . $fenxiao_info['chain'] . '%'; + //修改下级的上上级id + model('fenxiao')->update( + ['grand_parent' => $parent], + [['parent', '=', $member_info['fenxiao_id']], ['parent', '=', $fenxiao_info['parent']]] + ); + } else { + $like = '%' . $member_info['fenxiao_id'] . ',%'; } + $old_chain = str_replace('%', '', $like); + $old_count = $this->getExplodeArrFilterCount($old_chain); //修改变更后的上级分销商团队人数 model('fenxiao')->setInc([ [ 'fenxiao_id', '=', $parent ] ], 'one_child_fenxiao_num'); //修改上级分销商 - model('fenxiao')->update([ 'parent' => $parent, 'grand_parent' => $parent_info[ 'parent' ] ], [ [ 'fenxiao_id', '=', $member_info[ 'fenxiao_id' ] ] ]); + $chain = $parent_info['chain'] ? $parent_info['chain'] . ',' . $member_info['fenxiao_id'] . ',' : $parent . ',' . $member_info['fenxiao_id'] . ','; + $count = $this->getExplodeArrFilterCount($chain); + model('fenxiao')->update( + ['parent' => $parent, + 'grand_parent' => $parent_info['parent'], + 'chain' => $chain, + 'depth_level' => $parent_info['depth_level'] + 1, + ], + [['fenxiao_id', '=', $member_info['fenxiao_id']]] + ); + + $member_info_id = $member_info['fenxiao_id']; + + //先修改下级节点深度 + if ($old_count > $count) { + //如果旧的节点深度 > 新的节点深度,那么下级的节点深度统统减少 + $sub = $old_count - $count; + model('fenxiao')->setDec([['chain', 'like', $like], ['fenxiao_id', '<>', $member_info_id]], 'depth_level', $sub); + } else if ($old_count < $count) { + //如果旧节点深度 < 新的节点深度,那么下级的节点深度都要增加 + $add = $count - $old_count; + model('fenxiao')->setInc([['chain', 'like', $like], ['fenxiao_id', '<>', $member_info_id]], 'depth_level', $add); + } + //节点深度相同不作处理 + + //修改下级路由节点 + $table = 'tk_fenxiao'; + // $old_chain = $old_chain.','; + //修改fenxiao表,匹配chain字段是否有$old_chain字段中的值,替换成$chain,查询条件变换 + $sql = "UPDATE `{$table}` SET chain = REPLACE(chain,'$old_chain','$chain') WHERE chain LIKE '$like' AND fenxiao_id <> '$member_info_id'"; + Db::query($sql); + } else {//不是分销商 //修改上级分销商 model('member')->update([ 'fenxiao_id' => $parent ], [ [ 'member_id', '=', $member_id ] ]); @@ -682,18 +747,37 @@ class Fenxiao extends BaseModel } model('fenxiao')->startTrans(); try { - if ($member_info[ 'is_fenxiao' ] == 1) {//是分销商 + if ($member_info['is_fenxiao'] == 1) {//是分销商 $fenxiao_info = model('fenxiao')->getInfo( - [ [ 'fenxiao_id', '=', $member_info[ 'fenxiao_id' ] ], [ 'is_delete', '=', 0 ] ], - 'parent' + [['fenxiao_id', '=', $member_info['fenxiao_id']], ['is_delete', '=', 0]], ); //修改原有上级分销商团队人数 - if ($fenxiao_info[ 'parent' ] > 0) { + if ($fenxiao_info['parent'] > 0) { //获取原有上级分销商信息 - model('fenxiao')->setDec([ [ 'fenxiao_id', '=', $fenxiao_info[ 'parent' ] ] ], 'one_child_fenxiao_num'); + model('fenxiao')->setDec([['fenxiao_id', '=', $fenxiao_info['parent']]], 'one_child_fenxiao_num'); + $like = '%' . $fenxiao_info['chain'] . '%'; + } else { + $like = '%,' . $member_info['fenxiao_id'] . ',%'; } + $old_chain = str_replace('%', '', $like); + $old_count = $this->getExplodeArrFilterCount($old_chain); + $chain = ''; //修改上级分销商和路由节点 - model('fenxiao')->update([ 'parent' => '0', 'chain' => null,'depth_level' => 1 ], [ [ 'fenxiao_id', '=', $member_info[ 'fenxiao_id' ] ] ]); + model('fenxiao')->update(['parent' => '0', 'grand_parent' => '0', 'chain' => $chain, 'depth_level' => 1], [['fenxiao_id', '=', $member_info['fenxiao_id']]]); + + //先修改下级节点深度 + $member_info_id = $member_info['fenxiao_id']; + //下级的节点深度统统减少 + $sub = $old_count - 1; + model('fenxiao')->setDec([['chain', 'like', $like], ['fenxiao_id', '<>', $member_info_id]], 'depth_level', $sub); + + //修改下级路由节点 + $chain = ',' . $member_info_id . ','; + $table = 'tk_fenxiao'; + //修改fenxiao表,匹配chain字段是否有$old_chain字段中的值,替换成$chain,查询条件变换 + $sql = "UPDATE `{$table}` SET chain = REPLACE(chain,'$old_chain','$chain') WHERE chain LIKE '$like' AND fenxiao_id <> '$member_info_id'"; + Db::query($sql); + } model('fenxiao')->commit(); return $this->success(); @@ -900,4 +984,21 @@ class Fenxiao extends BaseModel } + /** + * @param $data + * @param $explode + * @return int + * 获取分割后去除空白值的数组长度 + */ + protected function getExplodeArrFilterCount($data, $explode = ',') + { + $data = explode($explode, $data); + $data = array_filter($data, function ($value) { + return !empty($value); + }); + $count = count($data); + return $count; + } + + } diff --git a/addon/fenxiao/model/FenxiaoAccount.php b/addon/fenxiao/model/FenxiaoAccount.php index 661dab1..a5bb3d8 100644 --- a/addon/fenxiao/model/FenxiaoAccount.php +++ b/addon/fenxiao/model/FenxiaoAccount.php @@ -47,7 +47,8 @@ class FenxiaoAccount extends BaseModel ); $res = model('fenxiao_account')->add($data); - model('fenxiao')->setInc([ [ 'fenxiao_id', '=', $fenxiao_id ] ], 'account', $money); + $member_id = model('fenxiao')->getValue([ [ 'fenxiao_id', '=', $fenxiao_id ] ],'member_id'); + model('fenxiao')->setInc([ [ 'member_id', '=', $member_id ] ], 'point', $money); return $this->success($res); } @@ -103,4 +104,4 @@ class FenxiaoAccount extends BaseModel $res = model('fenxiao_account')->add($data); return $this->success($res); } -} \ No newline at end of file +} diff --git a/addon/fenxiao/model/FenxiaoOrder.php b/addon/fenxiao/model/FenxiaoOrder.php index 9830f26..2926bb5 100644 --- a/addon/fenxiao/model/FenxiaoOrder.php +++ b/addon/fenxiao/model/FenxiaoOrder.php @@ -28,10 +28,10 @@ class FenxiaoOrder extends BaseModel //获取分销基础配置 $config_model = new Config(); $fenxiao_basic_config = $config_model->getFenxiaoBasicsConfig($order[ 'site_id' ])[ 'data' ][ 'value' ]; + if (!$fenxiao_basic_config['level']) return $this->success(); // //检测分销商上级关系 $member_info = model("member")->getInfo([ [ 'member_id', '=', $order[ 'member_id' ] ] ], 'fenxiao_id,is_fenxiao,nickname,mobile'); - // 本人是分销商 触发购买指定商品升级 if($member_info['is_fenxiao'] == 1 && $member_info['fenxiao_id'] > 0){ event('FenxiaoUpgrade', [ @@ -82,6 +82,7 @@ class FenxiaoOrder extends BaseModel 'wholesale_commission' => 0, 'wholesale_fenxiao_detail' => [], ]; + $goods_info = model('goods')->getInfo([['goods_id','=',$v['goods_id']]],'is_fenxiao, fenxiao_type'); //参与了分销商品,有直推间推奖励 if($goods_info['is_fenxiao']){ @@ -89,7 +90,7 @@ class FenxiaoOrder extends BaseModel } $order_fenxiao_data = $this->getWholesaleFenXiaoCommission($fenxiao_info,$v,$order_fenxiao_data); - + // dump($order_fenxiao_data);die; $data = [ 'order_id' => $order['order_id'], 'order_no' => $order['order_no'], @@ -125,8 +126,7 @@ class FenxiaoOrder extends BaseModel ]; model("fenxiao_order")->add($data); } - - + $fenxiao_info = model("fenxiao")->getInfo([ [ 'fenxiao_id', '=', $fenxiao_id ], [ 'is_delete', '=', 0 ] ]); // // 分销商检测升级 event('FenxiaoUpgrade', [ 'fenxiao_id' => $member_info[ 'fenxiao_id' ] @@ -147,9 +147,9 @@ class FenxiaoOrder extends BaseModel $two_rate = $config['indirect_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') : []; - if ($fenxiao_info[ 'status' ] == 1) { + $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') : []; + if (!empty($parent_fenxiao_info) && $parent_fenxiao_info[ 'status' ] == 1) { 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; @@ -157,10 +157,11 @@ class FenxiaoOrder extends BaseModel $order_fenxiao_data['commission_rate'] += $order_fenxiao_data[ 'one_rate' ] = round($one_money * $v[ 'num' ] / $v[ 'real_goods_money' ], 2); $order_fenxiao_data['commission'] += $order_fenxiao_data[ 'one_commission' ] = $one_money * $v[ 'num' ]; } - $order_fenxiao_data['one_fenxiao_id'] = $fenxiao_info['fenxiao_id']; - $order_fenxiao_data['one_fenxiao_name'] = $fenxiao_info['fenxiao_name']; + $order_fenxiao_data['one_fenxiao_id'] = $parent_fenxiao_info['fenxiao_id']; + $order_fenxiao_data['one_fenxiao_name'] = $parent_fenxiao_info['fenxiao_name']; } - if (!empty($parent_fenxiao_info) && $parent_fenxiao_info[ 'status' ] == 1) { + if (!empty($g_parent_fenxiao_info) && $g_parent_fenxiao_info[ 'status' ] == 1) { + 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; @@ -168,9 +169,10 @@ class FenxiaoOrder extends BaseModel $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' ]; } - $order_fenxiao_data['two_fenxiao_id'] = $parent_fenxiao_info['fenxiao_id']; - $order_fenxiao_data['two_fenxiao_name'] = $fenxiao_info['fenxiao_name']; + $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; } diff --git a/addon/fenxiao/shop/controller/Level.php b/addon/fenxiao/shop/controller/Level.php index c14b450..34e6e93 100644 --- a/addon/fenxiao/shop/controller/Level.php +++ b/addon/fenxiao/shop/controller/Level.php @@ -82,6 +82,7 @@ class Level extends BaseShop 'child_fenxiao_num' => input('child_fenxiao_num',''), 'one_child_num' => input('one_child_num',''), 'one_child_fenxiao_num' => input('one_child_fenxiao_num',''), + 'one_child_fenxiao_equal' => input('one_child_fenxiao_equal',0), 'goods_ids' => input('goods_ids',''), ]; $res = $model->addLevel($data); @@ -128,6 +129,7 @@ class Level extends BaseShop 'child_fenxiao_num' => input('child_fenxiao_num',''), 'one_child_num' => input('one_child_num',''), 'one_child_fenxiao_num' => input('one_child_fenxiao_num',''), + 'one_child_fenxiao_equal' => input('one_child_fenxiao_equal',0), 'goods_ids' => input('goods_ids',''), ]; $level_id = input('level_id', ''); @@ -172,4 +174,4 @@ class Level extends BaseShop $res = $model->deleteLevel($level_id, $this->site_id); return $res; } -} \ No newline at end of file +} diff --git a/addon/fenxiao/shop/view/level/add.html b/addon/fenxiao/shop/view/level/add.html index 9b65707..e59ab2c 100644 --- a/addon/fenxiao/shop/view/level/add.html +++ b/addon/fenxiao/shop/view/level/add.html @@ -137,7 +137,7 @@ - +