diff --git a/src/main/java/com/xkrs/straw/utils/FirePointQueryManager.java b/src/main/java/com/xkrs/straw/utils/FirePointQueryManager.java index d9ef2f9..05f97cc 100644 --- a/src/main/java/com/xkrs/straw/utils/FirePointQueryManager.java +++ b/src/main/java/com/xkrs/straw/utils/FirePointQueryManager.java @@ -4,6 +4,8 @@ import com.xkrs.straw.dao.FirePointOrdinaryDao; import com.xkrs.straw.dao.FirePointPreciseDao; import com.xkrs.straw.model.bean.FirePointQueryResultBean; import com.xkrs.straw.model.bean.VipTimeRangeBean; +import com.xkrs.straw.model.entity.FirePointOrdinaryEntity; +import com.xkrs.straw.model.entity.FirePointPreciseEntity; import com.xkrs.straw.model.entity.SysUserEntity; import com.xkrs.straw.model.vo.AllFirePointVo; import com.xkrs.utils.DateTimeUtil; @@ -12,14 +14,17 @@ import com.xkrs.utils.FirePointCodeUtils; import org.apache.hc.core5.util.TextUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import javax.persistence.criteria.Predicate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; @Component public class FirePointQueryManager { @@ -105,107 +110,112 @@ public class FirePointQueryManager { e.printStackTrace(); return new FirePointQueryResultBean(false, e.getMessage(), null); } - final String commonSql = "SELECT t.id AS id, t.fire_code AS fireCode, t.county_code AS countyCode, t.county_name AS countyName, t.satellite_time AS satelliteTime, t.longitude AS longitude, t.latitude AS latitude, t.satellite_type AS satelliteType, t.land_type AS landType, t.confidence AS confidence, t.fire_image AS fireImage, t.satellite_image AS satelliteImage, t.town_code AS townCode, t.town_name AS townName, t.add_time AS addTime, t.fire_point_address AS firePointAddress, t.remark AS remark"; - StringBuilder ordinaryBuilder = new StringBuilder(commonSql); - ordinaryBuilder.append(" FROM fire_point_ordinary AS t"); - ordinaryBuilder.append(" WHERE (t.town_code LIKE '" + mNoRedundantUserCode + "%')"); - ordinaryBuilder.append(" AND ("); - for (int i = 0; i < mVipTimeRangeItemList.size(); i++) { - VipTimeRangeBean.VipTimeRangeItemBean vipTimeRangeItem = mVipTimeRangeItemList.get(i); - String userStartTime = vipTimeRangeItem.getStartTime(); - String userEndTime = vipTimeRangeItem.getEndTime(); - //早于(不包含)VIP开始时间,或者晚于(不包含)VIP结束时间 - if (i > 0) { - ordinaryBuilder.append(" AND "); - } - ordinaryBuilder.append("(t.satellite_time<'" + userStartTime + "' OR t.satellite_time>'" + userEndTime + "')"); - } - ordinaryBuilder.append(")"); - ordinaryBuilder.append(" ORDER BY t.satellite_time DESC"); - String ordinarySql = ordinaryBuilder.toString(); - log.info(sysUserEntity.getCountyName() + ":ordinarySql:" + ordinarySql); -// List voList1 = firePointOrdinaryDao.customQuery(ordinarySql); - - StringBuilder preciseBuilder = new StringBuilder(commonSql); - preciseBuilder.append(" FROM fire_point_precise AS t"); - preciseBuilder.append(" WHERE (t.town_code LIKE '" + mNoRedundantUserCode + "%')"); - preciseBuilder.append(" AND ("); - for (int i = 0; i < mVipTimeRangeItemList.size(); i++) { - VipTimeRangeBean.VipTimeRangeItemBean vipTimeRangeItem = mVipTimeRangeItemList.get(i); - String userStartTime = vipTimeRangeItem.getStartTime(); - String userEndTime = vipTimeRangeItem.getEndTime(); - //晚于(包含)VIP开始时间,并且早于(包含)VIP结束时间 - if (i > 0) { - preciseBuilder.append(" OR "); - } - preciseBuilder.append("(t.satellite_time>='" + userStartTime + "' AND t.satellite_time<='" + userEndTime + "')"); - } - preciseBuilder.append(")"); - preciseBuilder.append(" ORDER BY t.satellite_time DESC"); - String preciseSql = preciseBuilder.toString(); - log.info(sysUserEntity.getCountyName() + ":preciseSql:" + preciseSql); -// List voList2 = firePointPreciseDao.customQuery(preciseSql); +// { +// final String commonSql = "SELECT t.id AS id, t.fire_code AS fireCode, t.county_code AS countyCode, t.county_name AS countyName, t.satellite_time AS satelliteTime, t.longitude AS longitude, t.latitude AS latitude, t.satellite_type AS satelliteType, t.land_type AS landType, t.confidence AS confidence, t.fire_image AS fireImage, t.satellite_image AS satelliteImage, t.town_code AS townCode, t.town_name AS townName, t.add_time AS addTime, t.fire_point_address AS firePointAddress, t.remark AS remark"; // -// //将两种数据来源的火点合并到一起 -// List resultList = new ArrayList<>(); -// resultList.addAll(voList1); -// resultList.addAll(voList2); -// //对合并后的结果进行排序 -// resultList.sort(Comparator.comparing(AllFirePointVo::getSatelliteTime)); -// -// return new FirePointQueryResultBean(true, "", resultList); - -// //查询未审核的普通火点 -// Specification specificationOrdinary = (root, criteriaQuery, criteriaBuilder) -> { -// List predicateList = new ArrayList<>(); -// //添加区划编码的过滤 -// predicateList.add(criteriaBuilder.like(root.get("townCode").as(String.class), finalMNoRedundantUserCode + "%")); -// for (VipTimeRangeBean.VipTimeRangeItemBean vipTimeRangeItem : mVipTimeRangeItemList) { +// StringBuilder ordinaryBuilder = new StringBuilder(commonSql); +// ordinaryBuilder.append(" FROM fire_point_ordinary AS t"); +// ordinaryBuilder.append(" WHERE (t.town_code LIKE '" + mNoRedundantUserCode + "%')"); +// ordinaryBuilder.append(" AND ("); +// for (int i = 0; i < mVipTimeRangeItemList.size(); i++) { +// VipTimeRangeBean.VipTimeRangeItemBean vipTimeRangeItem = mVipTimeRangeItemList.get(i); // String userStartTime = vipTimeRangeItem.getStartTime(); // String userEndTime = vipTimeRangeItem.getEndTime(); -// //早于(不包含)VIP开始时间 -// Predicate beforeStartTimePredicate = criteriaBuilder.lessThan(root.get("satelliteTime").as(String.class), userStartTime); -// //晚于(不包含)VIP结束时间 -// Predicate afterEndTimePredicate = criteriaBuilder.greaterThan(root.get("satelliteTime").as(String.class), userEndTime); -// predicateList.add(criteriaBuilder.or(beforeStartTimePredicate, afterEndTimePredicate)); +// //早于(不包含)VIP开始时间,或者晚于(不包含)VIP结束时间 +// if (i > 0) { +// ordinaryBuilder.append(" AND "); +// } +// ordinaryBuilder.append("(t.satellite_time<'" + userStartTime + "' OR t.satellite_time>'" + userEndTime + "')"); // } -// return criteriaBuilder.and(predicateList.toArray(new Predicate[predicateList.size()])); -// }; -// //未审核的普通火点列表 -// List firePointOrdinaryList = firePointOrdinaryDao.findAll(specificationOrdinary, Sort.by(Sort.Direction.DESC, "satelliteTime")); +// ordinaryBuilder.append(")"); +// ordinaryBuilder.append(" ORDER BY t.satellite_time DESC"); +// String ordinarySql = ordinaryBuilder.toString(); +// log.info(sysUserEntity.getCountyName() + ":ordinarySql:" + ordinarySql); +// List voList1 = firePointOrdinaryDao.customQuery(ordinarySql); // -// -// //查询审核通过的精准火点 -// Specification specificationPrecise = (root, criteriaQuery, criteriaBuilder) -> { -// List predicateList = new ArrayList<>(); -// //添加区划编码的过滤 -// predicateList.add(criteriaBuilder.like(root.get("townCode").as(String.class), finalMNoRedundantUserCode + "%")); -// for (VipTimeRangeBean.VipTimeRangeItemBean vipTimeRangeItem : mVipTimeRangeItemList) { +// StringBuilder preciseBuilder = new StringBuilder(commonSql); +// preciseBuilder.append(" FROM fire_point_precise AS t"); +// preciseBuilder.append(" WHERE (t.town_code LIKE '" + mNoRedundantUserCode + "%')"); +// preciseBuilder.append(" AND ("); +// for (int i = 0; i < mVipTimeRangeItemList.size(); i++) { +// VipTimeRangeBean.VipTimeRangeItemBean vipTimeRangeItem = mVipTimeRangeItemList.get(i); // String userStartTime = vipTimeRangeItem.getStartTime(); // String userEndTime = vipTimeRangeItem.getEndTime(); -// //晚于(包含)VIP开始时间 -// Predicate beforeStartTimePredicate = criteriaBuilder.greaterThanOrEqualTo(root.get("satelliteTime").as(String.class), userStartTime); -// //早于(包含)VIP结束时间 -// Predicate afterEndTimePredicate = criteriaBuilder.lessThanOrEqualTo(root.get("satelliteTime").as(String.class), userEndTime); -// predicateList.add(criteriaBuilder.and(beforeStartTimePredicate, afterEndTimePredicate)); +// //晚于(包含)VIP开始时间,并且早于(包含)VIP结束时间 +// if (i > 0) { +// preciseBuilder.append(" OR "); +// } +// preciseBuilder.append("(t.satellite_time>='" + userStartTime + "' AND t.satellite_time<='" + userEndTime + "')"); // } -// return criteriaBuilder.and(predicateList.toArray(new Predicate[predicateList.size()])); -// }; -// //审核通过的精准火点列表 -// List firePointPreciseList = firePointPreciseDao.findAll(specificationPrecise, Sort.by(Sort.Direction.DESC, "satelliteTime")); +// preciseBuilder.append(")"); +// preciseBuilder.append(" ORDER BY t.satellite_time DESC"); +// String preciseSql = preciseBuilder.toString(); +// log.info(sysUserEntity.getCountyName() + ":preciseSql:" + preciseSql); +// List voList2 = firePointPreciseDao.customQuery(preciseSql); +// +// //将两种数据来源的火点合并到一起 +// List resultList = new ArrayList<>(); +// resultList.addAll(voList1); +// resultList.addAll(voList2); +// //对合并后的结果进行排序 +// resultList.sort(Comparator.comparing(AllFirePointVo::getSatelliteTime)); +// +// return new FirePointQueryResultBean(true, "", resultList); // -// //将两种数据来源的火点合并到一起 -// List resultList = new ArrayList<>(); -// for (FirePointOrdinaryEntity firePointOrdinaryEntity : firePointOrdinaryList) { -// resultList.add(FirePointConvertUtils.convert(firePointOrdinaryEntity)); // } -// for (FirePointPreciseEntity firePointPreciseEntity : firePointPreciseList) { -// resultList.add(FirePointConvertUtils.convert(firePointPreciseEntity)); -// } -// //对合并后的结果进行排序 -// List sortedResultList = resultList.stream().sorted(Comparator.comparing(AllFirePointVo::getSatelliteTime)).collect(Collectors.toList()); -// return new FirePointQueryResultBean(true, "", sortedResultList); + + final String finalMNoRedundantUserCode = mNoRedundantUserCode; + //查询未审核的普通火点 + Specification specificationOrdinary = (root, criteriaQuery, criteriaBuilder) -> { + List predicateList = new ArrayList<>(); + //添加区划编码的过滤 + predicateList.add(criteriaBuilder.like(root.get("townCode").as(String.class), finalMNoRedundantUserCode + "%")); + for (VipTimeRangeBean.VipTimeRangeItemBean vipTimeRangeItem : mVipTimeRangeItemList) { + String userStartTime = vipTimeRangeItem.getStartTime(); + String userEndTime = vipTimeRangeItem.getEndTime(); + //早于(不包含)VIP开始时间 + Predicate beforeStartTimePredicate = criteriaBuilder.lessThan(root.get("satelliteTime").as(String.class), userStartTime); + //晚于(不包含)VIP结束时间 + Predicate afterEndTimePredicate = criteriaBuilder.greaterThan(root.get("satelliteTime").as(String.class), userEndTime); + predicateList.add(criteriaBuilder.or(beforeStartTimePredicate, afterEndTimePredicate)); + } + return criteriaBuilder.and(predicateList.toArray(new Predicate[predicateList.size()])); + }; + //未审核的普通火点列表 + List firePointOrdinaryList = firePointOrdinaryDao.findAll(specificationOrdinary, Sort.by(Sort.Direction.DESC, "satelliteTime")); + + + //查询审核通过的精准火点 + Specification specificationPrecise = (root, criteriaQuery, criteriaBuilder) -> { + List predicateList = new ArrayList<>(); + //添加区划编码的过滤 + predicateList.add(criteriaBuilder.like(root.get("townCode").as(String.class), finalMNoRedundantUserCode + "%")); + for (VipTimeRangeBean.VipTimeRangeItemBean vipTimeRangeItem : mVipTimeRangeItemList) { + String userStartTime = vipTimeRangeItem.getStartTime(); + String userEndTime = vipTimeRangeItem.getEndTime(); + //晚于(包含)VIP开始时间 + Predicate beforeStartTimePredicate = criteriaBuilder.greaterThanOrEqualTo(root.get("satelliteTime").as(String.class), userStartTime); + //早于(包含)VIP结束时间 + Predicate afterEndTimePredicate = criteriaBuilder.lessThanOrEqualTo(root.get("satelliteTime").as(String.class), userEndTime); + predicateList.add(criteriaBuilder.and(beforeStartTimePredicate, afterEndTimePredicate)); + } + return criteriaBuilder.and(predicateList.toArray(new Predicate[predicateList.size()])); + }; + //审核通过的精准火点列表 + List firePointPreciseList = firePointPreciseDao.findAll(specificationPrecise, Sort.by(Sort.Direction.DESC, "satelliteTime")); + + //将两种数据来源的火点合并到一起 + List resultList = new ArrayList<>(); + for (FirePointOrdinaryEntity firePointOrdinaryEntity : firePointOrdinaryList) { + resultList.add(FirePointConvertUtils.convert(firePointOrdinaryEntity)); + } + for (FirePointPreciseEntity firePointPreciseEntity : firePointPreciseList) { + resultList.add(FirePointConvertUtils.convert(firePointPreciseEntity)); + } + //对合并后的结果进行排序 + List sortedResultList = resultList.stream().sorted(Comparator.comparing(AllFirePointVo::getSatelliteTime)).collect(Collectors.toList()); + return new FirePointQueryResultBean(true, "", sortedResultList); } }