123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- <?php
- namespace addons\shopro\controller;
- use addons\shopro\model\LmtUserQuota;
- use think\Db;
- use addons\shopro\model\LmtUserLevel;
- use addons\shopro\model\Order;
- use addons\shopro\model\User;
- use addons\shopro\model\OrderItem;
- use addons\shopro\model\LmtUserLevelLog;
- use app\common\model\MoneyLog;
- /**
- * 亮幕堂等级管理
- * @author qc
- * Class LmtLevel
- * @package addons\shopro\controller
- * http://lmt.hdlkeji.com/addons/shopro/Lmt_level/index
- */
- class LmtLevel extends Base
- {
- protected $noNeedLogin = ['*'];
- protected $noNeedRight = ['*'];
- protected $upgrade = [0,10,3,3,3,3,3];// 升级条件
- protected $lev_set = [];
- protected $special_goods = [1,2];// 特殊商品id
- function _initialize(){
- // 等级升级条件以及折扣设置
- $lev_set = LmtUserLevel::getLevSet();
- $this->lev_set = array_column($lev_set,null,'id');
- $this->lev_set[0] = ['discount'=>10,'name'=>'游客','price'=>'399.00'];
- }
- /**
- * 测试方法
- */
- public function index(){
- }
- /**
- *订单回调接口调用
- */
- function orderNotify($order_id,$order_info = []){
- // 订单详情
- if(!$order_info) $order_info =Order::get($order_id)->toArray();
- // 会员详情
- $user_info = User::find( $order_info['user_id'])->toArray();
- // 订单商品列表
- $goods_arr = OrderItem::getOrderGoods($order_id);
- // 特殊商品赠送名额 start
- $quota = [];
- $special_goods = 0;
- foreach ($goods_arr as $gv) {
- // 购买身份商品
- if(in_array($gv['goods_id'],$this->special_goods)) {
- $q_num = $gv['goods_id'] == $this->special_goods[0] ? 1:10;
- $special_goods = $this->special_goods[0] ? 1:10;
- $q_num = $q_num * $gv['goods_num'];// 赠送数量
- $quota[]=[
- 'user_id' => $order_info['user_id'],
- 'order_id' => $order_info['id'],
- 'goods_id' => $gv['goods_id'],
- 'num' => $q_num ,
- 'base_num' => $q_num,
- 'create_time' => date('Y-m-d H:i:s'),
- 'desc' => '购买'
- ];
- $clevel = $gv['goods_id'] == $this->special_goods[0] ? 1 : 2 ;// 购买等级身份
- // 购买v1身份
- if($clevel == 1) {
- if($user_info['level'] == 0) {
- // 更新身份
- User::update(['level'=>$clevel,'level_update'=>time()],['id'=>$user_info['id']]);
- $user_info['level'] = $clevel;
- LmtUserLevelLog::createLevelLog($user_info['id'],1,1,'恭喜亲晋级'.$this->lev_set[$clevel]['name'],$user_info['id']);
- $this->userLevelChange($user_info['id']);
- }
- }else {
- if($clevel > $user_info['level']) {
- if($gv['lmt_type'] == 1){//名额
- // 更新身份 && 名额
- User::update(['level'=>$clevel,'level_update'=>time(),'quota_num'=>$user_info['quota_num']+$q_num],['id'=>$user_info['id']]);
- OrderItem::update(['dispatch_status'=>2],['id'=>$gv['id']]);
- Order::update(['status'=>2],['id'=>$gv['order_id']]);
- }else{
- // 更新身份
- User::update(['level'=>$clevel,'level_update'=>time()],['id'=>$user_info['id']]);
- }
- $user_info['level'] = $clevel;
- LmtUserLevelLog::createLevelLog($user_info['id'],1,1,'恭喜亲晋级'.$this->lev_set[$clevel]['name'],$user_info['id']);
- $this->userLevelChange($user_info['id']);
- }else{
- if($gv['lmt_type'] == 1){//名额
- // 更新身份 && 名额
- User::update(['quota_num'=>$user_info['quota_num']+$q_num],['id'=>$user_info['id']]);
- OrderItem::update(['dispatch_status'=>2],['id'=>$gv['id']]);
- Order::update(['status'=>2],['id'=>$gv['order_id']]);
- }
- }
- }
- }
- }
- if(!empty($quota)) (new LmtUserQuota())->saveAll($quota);
- // 递归增加业绩
- $this->savePerformance($user_info['id'],$order_info['total_fee']);
- // 推荐线奖励 start
- if($user_info['pid'] > 0)
- {
- // 获取推荐线能分红的会员
- $recom_list = $this->getRecommend($user_info['pid']);
- $current_lev = $user_info['level']; // 当前等级
- foreach ($recom_list as $ck=>$cv) {
- // 推荐线奖励条件
- if($cv['level'] > $current_lev ){
- if($special_goods) {
- $qf_money = bcsub($this->lev_set[$current_lev]['price'],$this->lev_set[$cv['level']]['price'],2) * $special_goods;
- }else{
- // 等级差率
- $rate = bcsub($this->lev_set[$current_lev]['discount'],$this->lev_set[$cv['level']]['discount'],2);
- $cl_rete = $rate > 0 ? $rate : 0;
- $qf_money = bcmul($order_info['total_fee'],$cl_rete/10,2);
- }
- $current_lev = $ck;
- if($qf_money > 0){
- $res = User::money($qf_money, $cv['id'], 'recommend', 0 , '推荐线奖励',['order_id'=>$order_id,'from_user'=>$user_info['id']]);
- }
- }
- }
- }
- }
- /***
- * 递归查询获取推荐线封顶5级
- */
- public function getRecommend($pid){
- global $recom_list ;
- $user_info = User::get(function ($query)use ($pid){
- $query->field("id,pid,level")->where('id',$pid);
- })->toArray();
- if(!isset($recom_list[$user_info['level']])) $recom_list[$user_info['level']]= $user_info;
- if( $user_info['pid'] > 0 && $user_info['level'] < 5){
- $this->getRecommend($user_info['pid']);
- }
- return $recom_list;
- }
- /**
- * 递归增加业绩
- * @param $user_id
- * @param $performance
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- public function savePerformance($user_id,$performance)
- {
- $user_info = User::find($user_id);
- $user_info->performance = bcadd($performance,$user_info->performance,2);
- $user_info->save();
- if($user_info->pid > 0) $this->savePerformance($user_info->pid,$performance);
- }
- /**
- * 会员推荐线等级变更
- * @param $user_id
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\ModelNotFoundException
- * @throws \think\exception\DbException
- */
- function userLevelChange($user_id)
- {
- $field = 'id,pid,level';
- $user_info = User::find($user_id)->toArray();
- // 会员有推荐人
- if($user_info['pid'] > 0) {
- // 推荐人信息
- $parent_info = User::get(function ($query) use ($field,$user_info){
- $query->field($field)->where('id',$user_info['pid']);
- })->toArray();
- $upgrade_num = $this->upgrade[$parent_info['level']];
- // 等级大于0(游客之能购买升级)
- if($parent_info['level'] == 1) {
- $children_num = $this->getRecommendNum([$parent_info['id']]);
- if($children_num >= $upgrade_num) {
- // 推荐人会员等级升级
- User::update(['level'=> $parent_info['level']+1,'level_update'=>time()],['id'=>$parent_info['id']]);
- $parent_info['level'] = $parent_info['level']+1;
- // 等级变更日志
- LmtUserLevelLog::createLevelLog($parent_info['id'],$parent_info['level'],3,'恭喜亲晋级'.$this->lev_set[$parent_info['level']]['name'],$user_id);
- // 递归处理会员推荐线
- $this->userLevelChange($parent_info['id']);
- // 连续升级
- $this->userLevelChange($user_id);
- }
- }else if($parent_info['level'] < 6) {
- // 查询当前等级以上的下级会员(分组查询)
- $children_arr = User::all(function ($query)use ($parent_info){
- $query ->field('level,count(id) as num')->where('level','>=',$parent_info['level'])
- ->where('pid','=',$parent_info['id'])
- ->group('level');
- })->toArray();
- $children_num = array_sum(array_column($children_arr,'num'));// 当前等级及以上的所有下级
- if($children_num >= $upgrade_num && $parent_info['level'] < 6) {
- $parent_info['level'] = $parent_info['level']+1;
- // 推荐人会员等级升级
- User::update(['level'=> $parent_info['level'],'level_update'=>time()],['id'=>$parent_info['id']]);
- // 等级变更日志
- LmtUserLevelLog::createLevelLog($parent_info['id'],$parent_info['level'],3,'恭喜亲晋级'.$this->lev_set[$parent_info['level']]['name'],$user_id);
- // 递归处理会员推荐线
- $this->userLevelChange($parent_info['id']);
- }
- // 是否多次递归
- if($children_num >= $upgrade_num && $parent_info['level'] < 6) {
- foreach ($children_arr as $k=>$val) {
- if($parent_info['level'] < $val['level'] && $this->upgrade[$val['level']] <= $val['num'] && $parent_info['level'] < 6) {
- // 推荐人会员等级升级;
- $parent_info['level'] = $parent_info['level']+1;
- User::update(['level'=> $parent_info['level'],'level_update'=>time()],['id'=>$parent_info['id']]);
- // 等级变更日志
- LmtUserLevelLog::createLevelLog($parent_info['id'],$parent_info['level'],3,'恭喜亲晋级'.$this->lev_set[$parent_info['level']]['name'],$user_id);
- // 递归
- $this->userLevelChange($parent_info['id']);
- }
- }
- }
- }
- }
- }
- /**
- *
- * @param array $user_ids
- * @return mixed
- * @throws \think\exception\DbException
- */
- public function getRecommendNum($user_ids = [])
- {
- global $num ;
- $child_ren = User::all(function ($query)use ($user_ids){
- $query ->field('id,level,pid')
- ->where('pid','in',implode(',',$user_ids))
- ->where('pid','>','0');
- })->toArray();
- if(!empty($child_ren)) {
- foreach ($child_ren as $rv) {
- if($rv['level'] == 1) $num++;
- }
- $this->getRecommendNum(array_column($child_ren,'id'));
- }
- return $num;
- }
- }
|