fire_point/src/main/java/com/xkrs/service/impl/FirePointServiceImpl.java

513 lines
21 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.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
*/
@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
*/
@Override
public FirePointEntity insertFirePoint(FirePointQo firePointQo) {
FirePointEntity firePointEntity = new FirePointEntity();
if(firePointQo.getLandtype().equals("水体")){
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
*/
@Override
public List<FirePointEntity> selectTodayFirePoint(String countyCode) {
String addTime = DateTimeUtil.dateToString(LocalDate.now());
if("0000".equals(countyCode.substring(2))){
List<CityEntity> 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<CountyEntity> 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
*/
@Override
public List<FirePointEntity> selectFirePoint(String proCode,String cityCode, String satelliteType, String landType, String startTime, String endTime) {
List<CityEntity> byProCode = cityDao.findByProCode(proCode);
String proName = byProCode.get(0).getProName();
return query.selectFirePointByPro(proName,cityCode, satelliteType, landType, startTime, endTime);
}
/**
* 动态多条件查询火点信息(市)
* @param cityCodeOne 市编码
* @param cityCode 县编码
* @param satelliteType
* @param landType
* @param startTime
* @param endTime
* @return
*/
@Override
public List<FirePointEntity> selectFirePointByCity(String cityCodeOne, String cityCode, String satelliteType, String landType, String startTime, String endTime) {
//List<CityEntity> byCityCode = cityDao.findByCityCode(cityCodeOne.substring(0,3));
List<CountyEntity> byCityCode = countyDao.findByCityCode(cityCodeOne);
String cityName = byCityCode.get(0).getCityName();
return query.selectFirePointByCity(cityName,cityCode,satelliteType,landType,startTime,endTime);
}
/**
* 动态多条件查询火点信息(县)
* @param cityCode 县编码
* @param satelliteType
* @param landType
* @param startTime
* @param endTime
* @return
*/
@Override
public List<FirePointEntity> selectFirePointByCounty(String cityCode, String satelliteType, String landType, String startTime, String endTime) {
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<FireTaskPhoto> fireTaskPhotos = PhotoUtil.uploadImage(files, appTaskBodyVo.getFireCode());
List<FireTaskPhoto> 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<Object[]> photoPath = fireTaskPhotoDao.findPhotoPath(fireCode);
List<AppPhotoVo> appPhotoVos = ObjectToBeanUtils.objectToBean(photoPath, AppPhotoVo.class);
appTaskBodyVo.setTaskFirePhoto(appPhotoVos);
return outputEncapsulationObject(PromptMessageEnum.SUCCESS,appTaskBodyVo,locale);
}
/**
* 查询近一周的火点信息
* @return
*/
@Override
public List<FirePointEntity> 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
*/
@Override
public List<FirePointEntity> 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<CityEntity> 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<CountyEntity> byCityCode = countyDao.findByCityCode(countyCode);
String cityName = byCityCode.get(0).getCityName();
return query.selectFirePointByMonthCity(cityName,startTime,endTime);
}else {
return query.selectFirePointByMonthCounty(countyCode,startTime,endTime);
}
}
/**
* 查询近一个月的火点数量
* @return
*/
@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<Map<String, Object>> maps = firePointDao.selectNumByLandType(startTime, endTime);
map.put("land",maps);
// 查询近一个月各地区火点数量
List<Map<String, Object>> maps1 = firePointDao.selectNumByArea(startTime, endTime);
map.put("area",maps1);
return outputEncapsulationObject(PromptMessageEnum.SUCCESS,map,locale);
}
/**
* 查询近一天的火点数量
* @return
*/
@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<Map<String, Object>> maps = firePointDao.selectNumByLandType(startTime, endTime);
map.put("land",maps);
// 查询近一个月各地区火点数量
List<Map<String, Object>> maps1 = firePointDao.selectNumByArea(startTime, endTime);
map.put("area",maps1);
return outputEncapsulationObject(PromptMessageEnum.SUCCESS,map,locale);
}
/**
* 查询近一周的火点数量
* @return
*/
@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<Map<String, Object>> maps = firePointDao.selectNumByLandType(startTime, endTime);
map.put("land",maps);
// 查询近一个月各地区火点数量
List<Map<String, Object>> maps1 = firePointDao.selectNumByArea(startTime, endTime);
map.put("area",maps1);
return outputEncapsulationObject(PromptMessageEnum.SUCCESS,map,locale);
}
/**
* 查询该省所有的市
* @param code
* @return
*/
@Override
public List<Map<String, Object>> selectCityName(String code) {
return cityDao.selectCityName(code);
}
/**
* 查询市包含的区县和编码
* @param code
* @return
*/
@Override
public List<Map<String, Object>> 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<Map<String, String>> maps = importUtil.readExcelContent();
//导入订单详情表
List<Nationwide> 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<FirePoint> selectTodayFire(String countyCode) {
String addTime = DateTimeUtil.dateToString(LocalDate.now());
if("0000".equals(countyCode.substring(2))){
List<CityEntity> 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<CountyEntity> byCityCode = countyDao.findByCityCode(countyCode);
String cityName = byCityCode.get(0).getCityName();
return fireDao.selectTodayFire(addTime,cityName);
}else {
return fireDao.selectTodayFireOne(addTime,countyCode);
}
}
}