package com.xkrs.service.impl; import com.xkrs.common.encapsulation.PromptMessageEnum; import com.xkrs.common.tool.TokenUtil; import com.xkrs.dao.*; import com.xkrs.model.entity.*; import com.xkrs.model.qo.FirePointQo; import com.xkrs.model.vo.AppPhotoVo; import com.xkrs.model.vo.AppTaskBodyVo; import com.xkrs.service.FirePointService; import com.xkrs.utils.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; import org.springframework.cglib.beans.BeanCopier; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.transaction.Transactional; import java.io.IOException; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; import static com.xkrs.common.encapsulation.OutputEncapsulation.outputEncapsulationObject; /** * @author XinYi Song */ @CacheConfig(cacheNames = "FirePointServiceCache") @Service public class FirePointServiceImpl implements FirePointService { public static Logger log = LoggerFactory.getLogger(FirePointServiceImpl.class); @Resource private FirePointDao firePointDao; @Resource private Query query; @Resource private SysUserDao sysUserDao; @Resource private FireAndRangerDao fireAndRangerDao; @Resource private ForestRangerDao forestRangerDao; @Resource private FireTaskDao fireTaskDao; @Resource private JdbcUtils jdbcUtils; @Resource private FireTaskPhotoDao fireTaskPhotoDao; @Resource private CityDao cityDao; @Resource private CountyDao countyDao; @Resource private FireDao fireDao; @Resource private NationwideDao nationwideDao; /** * 添加火点信息 * @param firePointQo * @return */ @CacheEvict(value = "FirePointServiceCache",allEntries = true) @Override public FirePointEntity insertFirePoint(FirePointQo firePointQo) { FirePointEntity firePointEntity = new FirePointEntity(); if(firePointQo.getLandtype().equals("水体")){ return null; }else if("Himawari 8".equals(firePointQo.getSatelliteType()) && "L".equals(firePointQo.getConfidence())){ return null; }else if("Himawari 8".equals(firePointQo.getSatelliteType()) && "N".equals(firePointQo.getConfidence())){ return null; }else { firePointEntity.setFireCode(firePointQo.getFireCode()); firePointEntity.setCountyCode(firePointQo.getCountyCode().toString()); firePointEntity.setCountyName(firePointQo.getCountyName()); firePointEntity.setSatelliteTime(DateTimeUtil.timeMillisToString(firePointQo.getSatelliteTimeTs().longValue())); firePointEntity.setLongitude(firePointQo.getLongitude()); firePointEntity.setLatitude(firePointQo.getLatitude()); firePointEntity.setFirePointAddress(AddressUtils.getLocal(firePointQo.getLatitude().toString(),firePointQo.getLongitude().toString())); firePointEntity.setSatelliteType(firePointQo.getSatelliteType()); firePointEntity.setLandType(firePointQo.getLandtype()); firePointEntity.setConfidence(firePointQo.getConfidence()); firePointEntity.setAddTime(DateTimeUtil.dateTimeToString(LocalDateTime.now())); firePointEntity.setFireType("0"); firePointEntity.setFireImage(firePointQo.getFireImage()); firePointEntity.setSatelliteImage(firePointQo.getSatelliteImage()); log.info("-------发现新火点"); /*log.info("---------------开始进行实时通讯,将检测到的火点传给前端"); Map map = new HashMap(3); map.put("countyCode",firePointQo.getCountyCode()); map.put("countyName",firePointQo.getCountyName()); map.put("fireCode",firePointQo.getFireCode()); map.put("latitude",firePointQo.getLatitude()); map.put("longitude",firePointQo.getLongitude()); map.put("satelliteTime",DateTimeUtil.timeMillisToString(firePointQo.getSatelliteTimeTs().longValue())); map.put("satelliteType",firePointQo.getSatelliteType()); map.put("addTime",DateTimeUtil.dateTimeToString(LocalDateTime.now())); map.put("detailedAddress",AddressUtils.getLatAndLng(firePointQo.getLatitude().toString(),firePointQo.getLongitude().toString())); Map map1 = new HashMap(3); map1.put("fire",map); String websocket = JSON.toJSONString(map1); // 将监测到的火点信息返给前端 WebSocketServer.broadInfo(websocket);*/ return firePointDao.save(firePointEntity); } } /** * 查询今天的火点信息 * @param * @return */ @Cacheable(keyGenerator = "keyGenerator", unless="#result == null") @Override public List selectTodayFirePoint(String countyCode) { String addTime = DateTimeUtil.dateToString(LocalDate.now()); if("0000".equals(countyCode.substring(2))){ List byProCode = cityDao.findByProCode(countyCode); String proName = byProCode.get(0).getProName(); return firePointDao.selectTodayFirePoint(addTime,proName); }else if("00".equals(countyCode.substring(4)) && !"0000".equals(countyCode.substring(2))){ List byCityCode = countyDao.findByCityCode(countyCode); String cityName = byCityCode.get(0).getCityName(); return firePointDao.selectTodayFirePoint(addTime,cityName); }else { return firePointDao.selectTodayFirePointOne(addTime,countyCode); } } /** * 动态多条件查询火点信息(省) * @param cityCode * @param satelliteType * @param landType * @param startTime * @param endTime * @return */ @Cacheable(keyGenerator = "keyGenerator", unless="#result == null") @Override public List selectFirePoint(String proCode,String cityCode, String satelliteType, String landType, String startTime, String endTime) { List byProCode = cityDao.findByProCode(proCode); String proName = byProCode.get(0).getProName(); if(!"".equals(startTime) && !"".equals(endTime)){ LocalDate localDate = DateTimeUtil.stringToDate(endTime); // 结束时间 LocalDate localDate1 = localDate.plusDays(1); String dateToString = DateTimeUtil.dateToString(localDate1); return query.selectFirePointByPro(proName,cityCode, satelliteType, landType, startTime, dateToString); } return query.selectFirePointByPro(proName,cityCode, satelliteType, landType, startTime, endTime); } /** * 动态多条件查询火点信息(市) * @param cityCodeOne 市编码 * @param cityCode 县编码 * @param satelliteType * @param landType * @param startTime * @param endTime * @return */ @Cacheable(keyGenerator = "keyGenerator", unless="#result == null") @Override public List selectFirePointByCity(String cityCodeOne, String cityCode, String satelliteType, String landType, String startTime, String endTime) { //List byCityCode = cityDao.findByCityCode(cityCodeOne.substring(0,3)); List byCityCode = countyDao.findByCityCode(cityCodeOne); String cityName = byCityCode.get(0).getCityName(); if(!"".equals(startTime) && !"".equals(endTime)){ LocalDate localDate = DateTimeUtil.stringToDate(endTime); // 结束时间 LocalDate localDate1 = localDate.plusDays(1); String dateToString = DateTimeUtil.dateToString(localDate1); return query.selectFirePointByCity(cityName,cityCode,satelliteType,landType,startTime,dateToString); } return query.selectFirePointByCity(cityName,cityCode,satelliteType,landType,startTime,endTime); } /** * 动态多条件查询火点信息(县) * @param cityCode 县编码 * @param satelliteType * @param landType * @param startTime * @param endTime * @return */ @Cacheable(keyGenerator = "keyGenerator", unless="#result == null") @Override public List selectFirePointByCounty(String cityCode, String satelliteType, String landType, String startTime, String endTime) { if(!"".equals(startTime) && !"".equals(endTime)){ LocalDate localDate = DateTimeUtil.stringToDate(endTime); // 结束时间 LocalDate localDate1 = localDate.plusDays(1); String dateToString = DateTimeUtil.dateToString(localDate1); return query.selectFirePointByCounty(cityCode,satelliteType,landType,startTime,dateToString); } return query.selectFirePointByCounty(cityCode,satelliteType,landType,startTime,endTime); } /** * 根据火点编码修改火点的状态(预警) * @param fireCode * @param fireType * @param token * @return */ @Transactional(rollbackOn = Exception.class) @Override public String updateTypeByFireCode(String fireCode, String fireType, String token) { // 获取区域信息 Locale locale = LocaleContextHolder.getLocale(); String tokenUserName = TokenUtil.getTokenUserName(token); SysUserEntity sysUserEntity = sysUserDao.selectByUserName(tokenUserName); FirePointEntity byFireCode = firePointDao.findByFireCode(fireCode); if ("3".equals(byFireCode.getFireType()) || "-1".equals(byFireCode.getFireType())) { return outputEncapsulationObject(PromptMessageEnum.PROCESS_FAIL,"该火点已经结案,请勿进行有关状态操作",locale); } if (fireType.equals(byFireCode.getFireType())) { return outputEncapsulationObject(PromptMessageEnum.PROCESS_FAIL,"您正处于当前的状态,请勿进行该操作",locale); } firePointDao.updateFireTypeByFireCode(fireCode, fireType); if ("1".equals(fireType)) { FirePointEntity byFireCode1 = firePointDao.findByFireCode(fireCode); // 预警 return outputEncapsulationObject(PromptMessageEnum.SUCCESS,byFireCode1,locale); } else if ("2".equals(fireType)){ FirePointEntity byFireCode3 = firePointDao.findByFireCode(fireCode); // 核查 return outputEncapsulationObject(PromptMessageEnum.SUCCESS,byFireCode3,locale); } else { String rangerType = "0"; FireAndRanger byFireCode1 = fireAndRangerDao.findByFireCode(fireCode); if (byFireCode1 == null) { FirePointEntity byFireCode4 = firePointDao.findByFireCode(fireCode); String time = DateTimeUtil.dateTimeToString(LocalDateTime.now()); FireAndRanger fireAndRanger = new FireAndRanger(); fireAndRanger.setFireCode(fireCode); // 由于测试阶段先用用户账号代替,后期换成getReallyName(用户真实姓名) fireAndRanger.setHandler(sysUserEntity.getReallyName()); fireAndRanger.setEndTime(time); fireAndRangerDao.save(fireAndRanger); // 结案 return outputEncapsulationObject(PromptMessageEnum.SUCCESS,byFireCode4,locale); } // 火点结案,将护林员的状态修改为0 表示该护林员没有在执行任务,处于空闲状态 forestRangerDao.updateRangerTypeByPhone(byFireCode1.getRangerName(), rangerType); String time = DateTimeUtil.dateTimeToString(LocalDateTime.now()); fireAndRangerDao.updateEndTimeByFireCode(fireCode, time); fireAndRangerDao.updateProgressTypeByFireCode(fireCode, "0"); return outputEncapsulationObject(PromptMessageEnum.SUCCESS,"结案",locale); } } /** * 提交核查任务 * @param files * @param appTaskBodyVo * @return */ @Transactional(rollbackOn = Exception.class) @Override public String insertAppTask(MultipartFile[] files, AppTaskBodyVo appTaskBodyVo) throws IOException { // 获取区域信息 Locale locale = LocaleContextHolder.getLocale(); FirePointEntity byFireCode = firePointDao.findByFireCode(appTaskBodyVo.getFireCode()); if(byFireCode == null){ return outputEncapsulationObject(PromptMessageEnum.DATA_WRONG,"火点编码错误,请重新输入",locale); } FireTask byTaskFireCode = fireTaskDao.findByTaskFireCode(appTaskBodyVo.getFireCode()); if(byTaskFireCode != null){ return outputEncapsulationObject(PromptMessageEnum.PROCESS_FAIL,"该火点的任务已经提交,请勿重复提交",locale); } String s = DateTimeUtil.dateTimeToString(LocalDateTime.now()); FireTask fireTask = new FireTask(); fireTask.setTaskFireCode(appTaskBodyVo.getFireCode()); fireTask.setTaskInformation(appTaskBodyVo.getTaskInformation()); fireTask.setTaskTime(s); FireTask save = fireTaskDao.save(fireTask); if(save == null){ return outputEncapsulationObject(PromptMessageEnum.PROCESS_FAIL,"任务提交失败",locale); } List fireTaskPhotos = PhotoUtil.uploadImage(files, appTaskBodyVo.getFireCode()); List fireTaskPhotos1 = fireTaskPhotoDao.saveAll(fireTaskPhotos); if(fireTaskPhotos1 == null || fireTaskPhotos1.size() == 0){ return outputEncapsulationObject(PromptMessageEnum.PROCESS_FAIL,"图片上传失败,任务提交失败",locale); } return outputEncapsulationObject(PromptMessageEnum.SUCCESS,"任务提交成功",locale); } /** * 根据火点编码查询任务信息 * @param fireCode * @return * @throws Exception */ @Override public String selectAppTask(String fireCode) throws Exception { // 获取区域信息 Locale locale = LocaleContextHolder.getLocale(); FireTask byTaskFireCode = fireTaskDao.findByTaskFireCode(fireCode); if(byTaskFireCode == null){ return outputEncapsulationObject(PromptMessageEnum.DATA_NONE,"暂时还没有该火点的任务信息",locale); } AppTaskBodyVo appTaskBodyVo = new AppTaskBodyVo(); // 做映射,返回vo类对象 BeanCopier beanCopier = BeanCopier.create(FireTask.class, AppTaskBodyVo.class, false); beanCopier.copy(byTaskFireCode,appTaskBodyVo,null); List photoPath = fireTaskPhotoDao.findPhotoPath(fireCode); List appPhotoVos = ObjectToBeanUtils.objectToBean(photoPath, AppPhotoVo.class); appTaskBodyVo.setTaskFirePhoto(appPhotoVos); return outputEncapsulationObject(PromptMessageEnum.SUCCESS,appTaskBodyVo,locale); } /** * 查询近一周的火点信息 * @return */ @Cacheable(keyGenerator = "keyGenerator", unless="#result == null") @Override public List selectFirePointBetweenSeven() { LocalDateTime localDateTime = LocalDateTime.now(); String endTime = DateTimeUtil.dateTimeToString(localDateTime); // 当前时间减7 LocalDateTime localDateTime1 = localDateTime.minusDays(7); String startTime = DateTimeUtil.dateTimeToString(localDateTime1); return query.selectFirePointBetweenThree(startTime, endTime); } /** * 查询近一个月的火点信息 * @return */ @Cacheable(keyGenerator = "keyGenerator", unless="#result == null") @Override public List selectFirePointByMonth(String countyCode) { LocalDateTime localDateTime = LocalDateTime.now(); String endTime = DateTimeUtil.dateTimeToString(localDateTime); // 当前时间减7 LocalDateTime localDateTime1 = localDateTime.minusDays(31); String startTime = DateTimeUtil.dateTimeToString(localDateTime1); if("0000".equals(countyCode.substring(2))){ List byProCode = cityDao.findByProCode(countyCode); String proName = byProCode.get(0).getProName(); return query.selectFirePointByMonth(proName,startTime,endTime); }else if("00".equals(countyCode.substring(4)) && !"0000".equals(countyCode.substring(2))){ List byCityCode = countyDao.findByCityCode(countyCode); String cityName = byCityCode.get(0).getCityName(); return query.selectFirePointByMonthCity(cityName,startTime,endTime); }else { return query.selectFirePointByMonthCounty(countyCode,startTime,endTime); } } /** * 查询近一个月的火点数量 * @return */ @Cacheable(keyGenerator = "keyGenerator", unless="#result == null") @Override public String selectFirePointNumMonth() { // 获取区域信息 Locale locale = LocaleContextHolder.getLocale(); Map map = new HashMap(3); LocalDateTime localDateTime = LocalDateTime.now(); LocalDateTime localDateTime2 = localDateTime.plusDays(1); String endTime = DateTimeUtil.dateTimeToString(localDateTime2); // 当前时间减30 LocalDateTime localDateTime1 = localDateTime.minusDays(30); String startTime = DateTimeUtil.dateTimeToString(localDateTime1); // 查询近一个月各植被类型的火点数量 List> maps = firePointDao.selectNumByLandType(startTime, endTime); map.put("land",maps); // 查询近一个月各地区火点数量 List> maps1 = firePointDao.selectNumByArea(startTime, endTime); map.put("area",maps1); return outputEncapsulationObject(PromptMessageEnum.SUCCESS,map,locale); } /** * 查询近一天的火点数量 * @return */ @Cacheable(keyGenerator = "keyGenerator", unless="#result == null") @Override public String selectFirePointNumDay() { // 获取区域信息 Locale locale = LocaleContextHolder.getLocale(); Map map = new HashMap(3); LocalDateTime localDateTime = LocalDateTime.now(); LocalDateTime localDateTime2 = localDateTime.plusDays(1); String endTime = DateTimeUtil.dateTimeToString(localDateTime2); // 当前时间减1 LocalDateTime localDateTime1 = localDateTime.minusDays(1); String startTime = DateTimeUtil.dateTimeToString(localDateTime1); // 查询近一个月各植被类型的火点数量 List> maps = firePointDao.selectNumByLandType(startTime, endTime); map.put("land",maps); // 查询近一个月各地区火点数量 List> maps1 = firePointDao.selectNumByArea(startTime, endTime); map.put("area",maps1); return outputEncapsulationObject(PromptMessageEnum.SUCCESS,map,locale); } /** * 查询近一周的火点数量 * @return */ @Cacheable(keyGenerator = "keyGenerator", unless="#result == null") @Override public String selectFirePointNumWeek() { // 获取区域信息 Locale locale = LocaleContextHolder.getLocale(); Map map = new HashMap(3); LocalDateTime localDateTime = LocalDateTime.now(); LocalDateTime localDateTime2 = localDateTime.plusDays(1); String endTime = DateTimeUtil.dateTimeToString(localDateTime2); // 当前时间减7 LocalDateTime localDateTime1 = localDateTime.minusDays(7); String startTime = DateTimeUtil.dateTimeToString(localDateTime1); // 查询近一个月各植被类型的火点数量 List> maps = firePointDao.selectNumByLandType(startTime, endTime); map.put("land",maps); // 查询近一个月各地区火点数量 List> maps1 = firePointDao.selectNumByArea(startTime, endTime); map.put("area",maps1); return outputEncapsulationObject(PromptMessageEnum.SUCCESS,map,locale); } /** * 查询该省所有的市 * @param code * @return */ @Override public List> selectCityName(String code) { return cityDao.selectCityName(code); } /** * 查询市包含的区县和编码 * @param code * @return */ @Override public List> selectCountyName(String code) { return countyDao.selectCountyName(code); } /** * 测试插入火点信息 * @param firePointQo * @return */ @Override public FirePoint insertFireTest(FirePointQo firePointQo) { FirePoint firePoint = new FirePoint(); firePoint.setFireCode(firePointQo.getFireCode()); firePoint.setCountyCode(firePointQo.getCountyCode().toString()); firePoint.setCountyName(firePointQo.getCountyName()); firePoint.setSatelliteTime(DateTimeUtil.timeMillisToString(firePointQo.getSatelliteTimeTs().longValue())); firePoint.setLongitude(firePointQo.getLongitude()); firePoint.setLatitude(firePointQo.getLatitude()); firePoint.setFirePointAddress(AddressUtils.getLocal(firePointQo.getLatitude().toString(),firePointQo.getLongitude().toString())); firePoint.setSatelliteType(firePointQo.getSatelliteType()); firePoint.setLandType(firePointQo.getLandtype()); firePoint.setConfidence(firePointQo.getConfidence()); firePoint.setAddTime(DateTimeUtil.dateTimeToString(LocalDateTime.now())); firePoint.setFireType("0"); firePoint.setFireImage(firePointQo.getFireImage()); firePoint.setSatelliteImage(firePointQo.getSatelliteImage()); log.info("-------发现新火点"); return fireDao.save(firePoint); } /** * 导入全国省市区 * @param file * @throws Exception */ @Transactional(rollbackOn = Exception.class) @Override public void importCityExcel(MultipartFile file) throws Exception { //调用封装好的工具 ExcelImportUtil importUtil = new ExcelImportUtil(file); //调用导入的方法,获取sheet表的内容 List> maps = importUtil.readExcelContent(); //导入订单详情表 List orderDetails = maps.stream().filter(Objects::nonNull).map(map -> { Nationwide nationwide = new Nationwide(); nationwide.setProName(map.get("pro_name")); nationwide.setProCode(map.get("pro_code")); nationwide.setCityName(map.get("city_name")); nationwide.setCityCode(map.get("city_code")); nationwide.setCountyName(map.get("town_name")); nationwide.setCountyCode(map.get("town_code")); return nationwide; }).collect(Collectors.toList()); //批量添加到订单详情 nationwideDao.saveAll(orderDetails); } /** * 查询今日的火点信息(测试) * @param countyCode * @return */ @Override public List selectTodayFire(String countyCode) { String addTime = DateTimeUtil.dateToString(LocalDate.now()); if("0000".equals(countyCode.substring(2))){ List byProCode = cityDao.findByProCode(countyCode); String proName = byProCode.get(0).getProName(); return fireDao.selectTodayFire(addTime,proName); }else if("00".equals(countyCode.substring(4)) && !"0000".equals(countyCode.substring(2))){ List byCityCode = countyDao.findByCityCode(countyCode); String cityName = byCityCode.get(0).getCityName(); return fireDao.selectTodayFire(addTime,cityName); }else { return fireDao.selectTodayFireOne(addTime,countyCode); } } }