航班查询与预订系统——day3

service层部分先把所有查到的数据放在一个list对象集合中,再将这个集合转化为DTO对象集合。但我写的部分没有用Result以及工具类,这些都是后来队友整合后加上去的。

复制代码
package com.kdfus.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.kdfus.dto.FlightInfoDTO;
import com.kdfus.dto.Result;
import com.kdfus.mapper.QueryFlightMapper;
import com.kdfus.pojo.FlightInfo;
import com.kdfus.service.IQueryService;
import com.kdfus.utils.DateUtils;
import com.kdfus.utils.IdGenerator;
import com.kdfus.utils.InfoUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import static com.kdfus.utils.RedisConstants.FLIGHT_INFO_KEY;
import static com.kdfus.utils.RedisConstants.FLIGHT_INFO_TTL;

/**
 * @version 1.0
 * @Author: wuyi
 * @date 2022/4/30 10:36
 */

/**
 * @version 2.0
 * @Author: Cra2iTeT
 * @date 2022/5/6 16:37
 */
@Slf4j
@Service("IQueryService")
public class QueryServiceImpl extends ServiceImpl<QueryFlightMapper, FlightInfo> implements IQueryService {
    @Autowired
    private QueryFlightMapper queryFlightMapper;
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Resource
    private IdGenerator idGenerator;

    @Override
    public Result getFlightInfoByDateWithNo(Map map) {
        String startTime = (String) map.get("startTime");
        String isStartTimeValid = DateUtils.verifyDate(startTime);
        if (isStartTimeValid != null) {
            return Result.fail(isStartTimeValid);
        }
        startTime = DateUtils.dateFormat(startTime, "yyyy-MM-dd");

        Set<String> keys = stringRedisTemplate.keys(FLIGHT_INFO_KEY + startTime);
        List<String> values = stringRedisTemplate.opsForValue().multiGet(keys);
        String no = (String) map.get("no");
        if (no == null || no.equals("")) {
            return Result.fail("航班号信息有误");
        }
        FlightInfoDTO flightInfoDTO = new FlightInfoDTO();
        for (String value : values) {
            flightInfoDTO = JSON.parseObject(value, FlightInfoDTO.class);
            if (flightInfoDTO.getNo().equals(no)) {
                return Result.ok(flightInfoDTO);
            }
        }
        //  刷新缓存
        QueryWrapper<FlightInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.apply("date_format(start_time,'%Y-%m-%d') = '" + startTime + "'");
        List<FlightInfo> flightInfoList = queryFlightMapper.selectList(queryWrapper);
        flightInfoDTO = new FlightInfoDTO();
        boolean isExist = false;
        for (int i = 0; !isExist && i < flightInfoList.size(); i++) {
            if (flightInfoList.get(i).getNo().equals(no)) {
                flightInfoDTO = BeanUtil.copyProperties(flightInfoList.get(i), FlightInfoDTO.class);
                isExist = true;
            }
        }
        if (isExist) {
            stringRedisTemplate.expire(FLIGHT_INFO_KEY + startTime + ":" + flightInfoDTO.getId(),
                    FLIGHT_INFO_TTL, TimeUnit.MINUTES);
        } else {
            flightInfoDTO.setNo(no);
            databaseFromPenetration(startTime, flightInfoDTO);
        }
        return Result.ok(flightInfoDTO);
    }

    @Override
    public Result getFlightInfoByDateWithCities(Map map) {
        //  验证信息
        String isInfoValid = verifyInfo(map);
        if (isInfoValid != null) {
            return Result.fail(isInfoValid);
        }
        String startTime = DateUtils.dateFormat((String) map.get("startTime"), "yyyy-MM-dd");
        String origin = (String) map.get("origin");
        String destination = (String) map.get("destination");

        Set<String> keys = stringRedisTemplate.keys(FLIGHT_INFO_KEY + startTime);
        List<String> values = stringRedisTemplate.opsForValue().multiGet(keys);
        List<FlightInfoDTO> flightInfoDTOList = new ArrayList<>();
        for (String value : values) {
            FlightInfoDTO tempFlightInfoDTO = JSON.parseObject(value, FlightInfoDTO.class);
            if (tempFlightInfoDTO.getOrigin().equals(origin) && tempFlightInfoDTO.getDestination().equals(destination)) {
                flightInfoDTOList.add(tempFlightInfoDTO);
            }
        }
        if (flightInfoDTOList.size() != 0) {
            return Result.ok(flightInfoDTOList);
        }

        QueryWrapper<FlightInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.apply("date_format(start_time,'%Y-%m-%d') = '" + startTime + "'");
        queryWrapper.eq("origin", origin);
        queryWrapper.eq("destination", destination);
        List<FlightInfo> flightInfoList = queryFlightMapper.selectList(queryWrapper);
        for (FlightInfo flightInfo : flightInfoList) {
            flightInfoDTOList.add(BeanUtil.copyProperties(flightInfo, FlightInfoDTO.class));
        }
        if (flightInfoDTOList.size() == 0) {
            FlightInfoDTO flightInfoDTO = new FlightInfoDTO();
            databaseFromPenetration(startTime, flightInfoDTO);
        } else {
            for (FlightInfoDTO flightInfoDTO : flightInfoDTOList) {
                stringRedisTemplate.opsForValue()
                        .set(FLIGHT_INFO_KEY + startTime + ":" + flightInfoDTO.getId(),
                                JSON.toJSONString(flightInfoDTO), FLIGHT_INFO_TTL, TimeUnit.MINUTES);
            }
        }

        return Result.ok(flightInfoDTOList);
    }

    private String verifyInfo(Map map) {
        String startTime = (String) map.get("startTime");
        String isStartTimeValid = DateUtils.verifyDate(startTime);
        if (isStartTimeValid != null) {
            return isStartTimeValid;
        }
        String isInfoValid = InfoUtils.verifyInfo(map);
        if (isInfoValid != null) {
            return isInfoValid;
        }
        return null;
    }

    private void databaseFromPenetration(String startTime, FlightInfoDTO flightInfoDTO) {
        flightInfoDTO.setId(idGenerator.nextId(FLIGHT_INFO_KEY + startTime + ":"));
        stringRedisTemplate.opsForValue()
                .set(FLIGHT_INFO_KEY + startTime + ":" + flightInfoDTO.getId(),
                        JSON.toJSONString(flightInfoDTO), FLIGHT_INFO_TTL, TimeUnit.MINUTES);
    }
}
复制代码

 

posted @   无衣123  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示