您现在的位置是:网站首页> 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的用户。
很赞哦!()
上一篇:php处理流量单位的转换
下一篇:tp5分组查询取最新的一条记录