2023-02-23 17:23:55 +08:00
package com.xkrs.straw.utils ;
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 ;
2023-02-24 17:15:38 +08:00
import com.xkrs.straw.model.entity.FirePointOrdinaryEntity ;
import com.xkrs.straw.model.entity.FirePointPreciseEntity ;
2023-02-23 17:23:55 +08:00
import com.xkrs.straw.model.entity.SysUserEntity ;
2023-02-24 17:15:38 +08:00
import com.xkrs.straw.model.vo.AllFirePointVo ;
2023-02-24 10:45:27 +08:00
import com.xkrs.utils.DateTimeUtil ;
import com.xkrs.utils.DateTimeUtils ;
2023-02-23 17:23:55 +08:00
import com.xkrs.utils.FirePointCodeUtils ;
import org.apache.hc.core5.util.TextUtils ;
2023-02-24 17:15:38 +08:00
import org.springframework.data.domain.Sort ;
import org.springframework.data.jpa.domain.Specification ;
2023-02-23 17:23:55 +08:00
import org.springframework.stereotype.Component ;
import javax.annotation.Resource ;
2023-02-24 17:15:38 +08:00
import javax.persistence.criteria.Predicate ;
2023-02-24 10:45:27 +08:00
import java.time.LocalDateTime ;
import java.util.ArrayList ;
2023-02-24 17:15:38 +08:00
import java.util.Comparator ;
2023-02-23 17:23:55 +08:00
import java.util.List ;
2023-02-24 17:15:38 +08:00
import java.util.stream.Collectors ;
2023-02-23 17:23:55 +08:00
@Component
public class FirePointQueryManager {
@Resource
private FirePointOrdinaryDao firePointOrdinaryDao ;
@Resource
private FirePointPreciseDao firePointPreciseDao ;
public FirePointQueryResultBean queryFirePointBelongToUser ( SysUserEntity sysUserEntity , String startTime , String endTime , String satelliteType , String landType ) {
2023-02-24 10:45:27 +08:00
String mNoRedundantUserCode = null ;
final List < VipTimeRangeBean . VipTimeRangeItemBean > mVipTimeRangeItemList = new ArrayList < > ( ) ;
2023-02-23 17:23:55 +08:00
try {
//获取用户注册的区划编码
String userCode = sysUserEntity . getCountyCode ( ) ;
//如果用户注册的区划编码是空,就返回失败
if ( TextUtils . isEmpty ( userCode ) ) {
return new FirePointQueryResultBean ( false , " User CountyCode Error 1, userCode = " + userCode , null ) ;
}
//对用户区划编码进行格式化,获得没有冗余数据的区划编码
String noRedundantUserCode = FirePointCodeUtils . getFormatCutCode ( userCode ) ;
//如果格式化后的用户区划编码是空,就返回失败
if ( TextUtils . isEmpty ( noRedundantUserCode ) ) {
return new FirePointQueryResultBean ( false , " User CountyCode Error 2, userCode = " + userCode + " , noRedundantUserCode = " + noRedundantUserCode , null ) ;
}
//获取用户的VIP时间范围
String vipTimeRangeJson = sysUserEntity . getVipTimeRangeJson ( ) ;
//如果用户的VIP时间范围数据是空, 就返回失败
if ( TextUtils . isEmpty ( vipTimeRangeJson ) ) {
return new FirePointQueryResultBean ( false , " User VipTimeRangeJson Error 1, vipTimeRangeJson = " + vipTimeRangeJson , null ) ;
}
//反序列化用户的VIP时间范围, 得到对象
VipTimeRangeBean vipTimeRangeBean = JsonUtils . deserialize ( vipTimeRangeJson , VipTimeRangeBean . class ) ;
//用户注册时有初始VIP时间范围, 反序列化失败或无数据, 说明该用户的数据发生了异常, 返回失败
if ( vipTimeRangeBean = = null | | vipTimeRangeBean . getList ( ) = = null | | vipTimeRangeBean . getList ( ) . size ( ) = = 0 ) {
return new FirePointQueryResultBean ( false , " User VipTimeRangeJson Error 2, 已保存的VIP时间范围反序列化失败, vipTimeRangeJson = " + vipTimeRangeJson , null ) ;
}
//得到由<开始时间 + 结束时间>组成的集合
List < VipTimeRangeBean . VipTimeRangeItemBean > vipTimeRangeItemList = vipTimeRangeBean . getList ( ) ;
2023-02-24 10:45:27 +08:00
for ( VipTimeRangeBean . VipTimeRangeItemBean vipTimeRangeItemA : vipTimeRangeItemList ) {
//校验用户VIP开始时间合法性
if ( ! DateTimeUtil . isValidDateTime ( vipTimeRangeItemA . getStartTime ( ) ) ) {
return new FirePointQueryResultBean ( false , " User VIP 开始时间格式不合法1, StartTime = " + vipTimeRangeItemA . getStartTime ( ) , null ) ;
}
//校验用户VIP结束时间合法性
if ( ! DateTimeUtil . isValidDateTime ( vipTimeRangeItemA . getEndTime ( ) ) ) {
return new FirePointQueryResultBean ( false , " User VIP 结束时间格式不合法2, EndTime = " + vipTimeRangeItemA . getEndTime ( ) , null ) ;
}
LocalDateTime userStartLocalDateTimeA = LocalDateTime . parse ( vipTimeRangeItemA . getStartTime ( ) , DateTimeUtils . DATE_TIME_FORMATTER_1 ) ;
LocalDateTime userEndLocalDateTimeA = LocalDateTime . parse ( vipTimeRangeItemA . getEndTime ( ) , DateTimeUtils . DATE_TIME_FORMATTER_1 ) ;
for ( VipTimeRangeBean . VipTimeRangeItemBean vipTimeRangeItemB : vipTimeRangeItemList ) {
if ( vipTimeRangeItemA ! = vipTimeRangeItemB ) {
//校验用户VIP开始时间合法性
if ( ! DateTimeUtil . isValidDateTime ( vipTimeRangeItemB . getStartTime ( ) ) ) {
return new FirePointQueryResultBean ( false , " User VIP 开始时间格式不合法3, StartTime = " + vipTimeRangeItemB . getStartTime ( ) , null ) ;
}
//校验用户VIP结束时间合法性
if ( ! DateTimeUtil . isValidDateTime ( vipTimeRangeItemB . getEndTime ( ) ) ) {
return new FirePointQueryResultBean ( false , " User VIP 结束时间格式不合法4, EndTime = " + vipTimeRangeItemB . getEndTime ( ) , null ) ;
}
LocalDateTime userStartLocalDateTimeB = LocalDateTime . parse ( vipTimeRangeItemB . getStartTime ( ) , DateTimeUtils . DATE_TIME_FORMATTER_1 ) ;
LocalDateTime userEndLocalDateTimeB = LocalDateTime . parse ( vipTimeRangeItemB . getEndTime ( ) , DateTimeUtils . DATE_TIME_FORMATTER_1 ) ;
//校验用户VIP开始结束时间是否存在交叉现象
if ( userStartLocalDateTimeB . isBefore ( userStartLocalDateTimeA ) & & userEndLocalDateTimeB . isAfter ( userStartLocalDateTimeA ) ) {
return new FirePointQueryResultBean ( false , " User VIP 开始结束时间格式不合法5, 存在交叉现象 " , null ) ;
}
if ( userStartLocalDateTimeB . isBefore ( userEndLocalDateTimeA ) & & userEndLocalDateTimeB . isAfter ( userEndLocalDateTimeA ) ) {
return new FirePointQueryResultBean ( false , " User VIP 开始结束时间格式不合法6, 存在交叉现象 " , null ) ;
}
}
}
}
mNoRedundantUserCode = noRedundantUserCode ;
mVipTimeRangeItemList . addAll ( vipTimeRangeItemList ) ;
2023-02-23 17:23:55 +08:00
} catch ( Exception e ) {
e . printStackTrace ( ) ;
return new FirePointQueryResultBean ( false , e . getMessage ( ) , null ) ;
}
2023-02-24 17:15:38 +08:00
final String finalMNoRedundantUserCode = mNoRedundantUserCode ;
2023-02-28 16:32:34 +08:00
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 ' " + finalMNoRedundantUserCode + " %') " ) ;
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 " ) ;
2023-02-24 17:15:38 +08:00
}
2023-02-28 16:32:34 +08:00
ordinaryBuilder . append ( " (t.satellite_time<' " + userStartTime + " ' OR t.satellite_time>' " + userEndTime + " ') " ) ;
2023-02-24 17:15:38 +08:00
}
2023-02-28 16:32:34 +08:00
ordinaryBuilder . append ( " ) " ) ;
ordinaryBuilder . append ( " ORDER BY t.satellite_time DESC " ) ;
String ordinarySql = ordinaryBuilder . toString ( ) ;
System . out . println ( " ordinarySql = " + ordinarySql ) ;
StringBuilder preciseBuilder = new StringBuilder ( commonSql ) ;
preciseBuilder . append ( " FROM fire_point_precise AS t " ) ;
preciseBuilder . append ( " WHERE (t.town_code LIKE ' " + finalMNoRedundantUserCode + " %') " ) ;
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 + " ') " ) ;
2023-02-24 17:15:38 +08:00
}
2023-02-28 16:32:34 +08:00
preciseBuilder . append ( " ) " ) ;
preciseBuilder . append ( " ORDER BY t.satellite_time DESC " ) ;
String preciseSql = preciseBuilder . toString ( ) ;
System . out . println ( " preciseSql = " + preciseSql ) ;
return new FirePointQueryResultBean ( true , " " , null ) ;
// //查询未审核的普通火点
// Specification<FirePointOrdinaryEntity> specificationOrdinary = (root, criteriaQuery, criteriaBuilder) -> {
// List<Predicate> 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<FirePointOrdinaryEntity> firePointOrdinaryList = firePointOrdinaryDao.findAll(specificationOrdinary, Sort.by(Sort.Direction.DESC, "satelliteTime"));
//
//
// //查询审核通过的精准火点
// Specification<FirePointPreciseEntity> specificationPrecise = (root, criteriaQuery, criteriaBuilder) -> {
// List<Predicate> 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<FirePointPreciseEntity> firePointPreciseList = firePointPreciseDao.findAll(specificationPrecise, Sort.by(Sort.Direction.DESC, "satelliteTime"));
//
// //将两种数据来源的火点合并到一起
// List<AllFirePointVo> resultList = new ArrayList<>();
// for (FirePointOrdinaryEntity firePointOrdinaryEntity : firePointOrdinaryList) {
// resultList.add(FirePointConvertUtils.convert(firePointOrdinaryEntity));
// }
// for (FirePointPreciseEntity firePointPreciseEntity : firePointPreciseList) {
// resultList.add(FirePointConvertUtils.convert(firePointPreciseEntity));
// }
// //对合并后的结果进行排序
// List<AllFirePointVo> sortedResultList = resultList.stream().sorted(Comparator.comparing(AllFirePointVo::getSatelliteTime)).collect(Collectors.toList());
// return new FirePointQueryResultBean(true, "", sortedResultList);
2023-02-23 17:23:55 +08:00
}
}