销售突然反映:用户导出企业客户数据,最多400条,并且都还一样??
APP里面用户可以选择的是100、200、300、500,结果选500的都是400条记录,且重复导出的数据竟然还一样!!
经查看分析:
企业客户导出问题归纳:
最多导出400条,是因为前端选择500,但实际请求是400,所以最大是400条
数据更新周期短,因此每天导出都是最新的400条,基本一样
解决方案:
由于前端APP目前不能新增分页,采取后台记录每个用户的搜索次数,达到可以循环获取该区域的所有数据。
++比如A用户,搜索上海市,第一次搜索获取1-400条,第二次搜索获取400-800条,依次,获取最后400条后,再次搜索,开始获取1-400条。++
客户搜索选择100,200,300,保持原有逻辑,获取最新的对应条数
客户选择500,后台强制每次给500条,按照类似分页,循环给出对应数据,以保证客户导出N次可以导出该区域的所有数据
最终效果
实现方法:
利用redis有序集合实现类分页数据查询,代码如下:
public function checkpage($mid,$city_id,$comp,$ismax){
$redis = new \Redis;
$redis->connect('127.0.0.1', '6379');
$redis->auth('test@test.com');
switch ($comp){
case '0':
$search = 0;
break;
case '电子商务':
$search = 1;
break;
case '实业':
$search = 2;
break;
case '贸易':
$search = 3;
break;
case '科技':
$search = 4;
break;
case '餐饮':
$search = 5;
break;
case '广告':
$search = 6;
break;
default:
$search = 0;
}
$name = "page_".$mid;
$v = "ser_".$city_id.$search."_ser";
if($ismax==1){
//重新赋值为 1
$redis->zAdd($name,1,$v);
$page = 1;
}else{
$is = $redis->exists($name);
if($is ==1){
//已经存在记录
$redis->zIncrBy($name,+1,$v);
$page = $redis->zScore($name,$v);
}else{
//第一次
$redis->zAdd($name,1,$v);
$page = 1;
}
}
return $page;
}
搜索次数和页数相结合,当返回的page大于总的页数时,要进行更新score的值
$is=0;
$page = $this->checkpage($mid,$city_id,$comp,$is);
//获取总页数
$total = Db::name('cuss')
->where($w)
->count('id');
$total_page = $total%500?$total/500+1:$total/500;
if($page==$total_page){
$page=$total_page;
}elseif ($page > $total_page){
//重新设置 页数为1
$is=1;
$this->checkpage($mid,$city_id,$comp,$is);
$page=1;
}
$offset=($page-1)*500;