您现在的位置是:网站首页> 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分组查询取最新的一条记录




