查询最近7天的数据,再关联最近两天的数据,并返回最近七天日期加星期

旧方法比较笨拙

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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时间轴-小文同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值