航班查询与预订系统——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); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?