旧方法比较笨拙
protected $workTimeSlot = [1 => '全天', 2 => '上午', 3 => '下午'];
$weeks = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];
$q_v_date = [];
$nlist = [];
//两天内数据
$day = 2;
for($i=0;$i<7;$i++){
$v_time = time() + (86400 * $i);
$v_date = date("Y-m-d", $v_time);
$q_v_date[$i] = date("Y-m-d", $v_time);
$list = (new stmodel())
->alias('st')
->where('st.work_time', '>', date('Y-m-d', $v_time))
->where('st.work_time', '<=', date('Y-m-d', $v_time+$day*86400))
->where('st.work_slot', '<>', 0)
->where('do.open', '=', 1)
->join('dooo do', 'st.dooo_id = do.id')
->order('st.work_time asc')
->select()->toArray();
//统计用户数据
foreach ($list as $k => $v) {
$work_time = $v['work_time'];
$v['work_slot'] = $this->workTimeSlot[$v['work_slot']];
$workTime = ['id'=>$v['sid'],'day'=>$work_time,'work_slot'=>$v['work_slot']];
if (isset($nlist[$v_date][$v['did']])) {
$nlist[$v_date][$v['did']]['work_time'][] = $workTime;
} else {
$v['work_time'] = [$workTime];
$nlist[$v_date][$v['did']] = $v;
}
}
}
//日期与星期转换
$q_v_dates = [];
foreach ($q_v_date as $key => $value) {
$q_v_dates[$key]['day'] = date("m-d", strtotime($value));
$weekss = date('w', strtotime($value));
$q_v_dates[$key]['week'] = $weeks[$weekss];
}
新方法存redis库,两天清除一次,记得配置redis配置信息
protected $prefix = 'docker:slot';
protected $workTimeSlot = [1 => '全天', 2 => '上午', 3 => '下午'];
/**
* 获取redis连接对象
* @return Redis
*/
protected function getRedis()
{
$redis = (new Redis([
'host' => Env::get('redis.host'),
'port' => Env::get('redis.port'),
'password' => Env::get('redis.password')
]));
return $redis;
}
/**
* 获取缓存
*/
public function getCache()
{
$redis = $this->getRedis();
$key = sprintf("%s:%s", $this->prefix, date("Ymd"));
//无缓存,则生成缓存
if (!$redis->has($key)) {
$this->setCache();
}
$data = $redis->get($key);
$data = json_decode($data, true);
return $data;
}
/**
* 更新缓存
* @return bool
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public function setCache()
{
$redis = $this->getRedis();
$key = sprintf("%s:%s", $this->prefix, date("Ymd"));
//查询数据
$data = $this->getData();
//存储缓存并设置有效期
$data = $redis->set($key, json_encode($data), 86400 * 2);
return $key;
}
/**
* 侯建缓存数据结构
* @return array
* @throws DataNotFoundException
* @throws ModelNotFoundException
* @throws DbException
*/
protected function getData()
{
//1. 获取查询范围时间段
$startTime = time();
$endTime = $startTime + (86400 * 7);
$list = (new stmodel())
->alias('st')
->where('st.work_time', '>', date('Y-m-d', $startTime))
->where('st.work_time', '<=', date('Y-m-d', $endTime))
->where('st.work_slot', '<>', 0)
->where('do.switch', '=', 1)
->join('dooo do', 'st.dooo_id = do.id')
->order('st.work_time asc')
->select()->toArray();
$nlist = [];
//两天内数据
$day = 2;
for ($i = 0; $i < 7; $i++) {
$v_time = time() + (86400 * $i);
$eTime = date('Y-m-d', $v_time + $day * 86400);
$vTime = date("Y-m-d", $v_time);
$nlist[$vTime] = [];
//数据分组
foreach ($list as $k => $v) {
if ($v['work_time'] > $vTime && $v['work_time'] <= $eTime) {
$workTime = ['id' => $v['sid'], 'day' => $v['work_time'], 'work_slot' => $this->workTimeSlot[$v['work_slot']]];
if (isset($nlist[$vTime][$v['did']])) {
$nlist[$vTime][$v['did']]['work_time'][] = $workTime;
} else {
$v['work_time'] = [$workTime];
unset($v['sid']);
$nlist[$vTime][$v['did']] = $v;
}
}
}
}
return $nlist;
}