您现在的位置是:网站首页> php专栏 常见问题

php实现根据用户权重值分配订单

亦然2019-10-22 09:57:37常见问题人已围观

简介实现需求:根据用户的权重分配相应的订单。常用于分配客户、分配订单等。

一:前言

        最近项目中要实现crm中按权重分配客户订单,在此记录一下实现过程,有更好的方法可以留言交流。

二:实现思路

       要实现根据权重分配,首先要统计用户的总权重,订单数/总权重 = 单个权重对应的订单数。最后就可以根据对应的订单数乘以权重值就可以了。另外还需注意一种情况,订单数除总权重有余数,这时候需要根据余数轮询分配数据。

三:实现代码

public function dispense(){
        //分配条数
        $num = input('num');
        //防止重复分配
        $map['sale_id'] = 0;
        $map['isdelete'] = 0;
        $yu_num = 0;
        //用户列表
        $user['id'] = ['<>',1];
        $sale_list = Db::name('user')->field('id,realname,weight')->where($user)->order('weight desc')->select();
        //根据数量分配给用户
        if($num != '' && $num != 0){
           $count = (int)$num;
        }else{
           $count = Db::name('invin')->where($map)->count();
        }
        //总权重
        $count_weight = $this->sum($sale_list);
        //单个订单数
        $order_num = intval(floor($count / $count_weight)); 
        //余数
        $yu_num = $count % $count_weight;
            //根据权重分配
            foreach ($sale_list as $value) {
                $num = $value['weight'] * $order_num;
                $nums = Db::name('invin')
                    ->where($map)
                    ->order('id desc')
                    ->limit($num)
                    ->update(['sale_id'=>$value['id'],'dispense_time'=>time()]);
                Db::name('user')->where('id',$value['id'])->setInc('order_nums',$num);
            } 
        }
       
        $num = 0;
        //轮询余数
        if($yu_num != 0 || $type = 3){
            $num = 1;//初始化一个变量为1
            for($i = 1; $i <= $yu_num; $i++)//这个是看你要轮询多个订单,然后循环
            {
                foreach ($sale_list as $vv) {
                    if($num > $yu_num){
                        return json(['code'=>1,'msg'=>'订单分配成功']);
                    }
                    Db::name('invin')->where($map)->order('id desc')->limit(1)->update(['sale_id'=>$vv['id'],'dispense_time'=>time()]);
                    Db::name('user')->where('id',$vv['id'])->setInc('order_nums',1);
                    $num++;
                }
            }
        }
        return json(['code'=>0,'msg'=>'订单分配失败']);
    }
    //计算总权重
    function sum($arr)
    {
        $total = 0;
        foreach ($arr as $value) {
            $total += $value['weight'];
        }
        return $total;
    }

效果如下:

分配1061条给3个权重都为1的用户。

很赞哦!()

亦然

亦然(共32篇文章)

愿你我既可以朝九晚五,也可以浪迹天涯;愿你我既可以拈花把酒,也能围炉诗书茶。