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-03-01 16:18:46 +08:00
import com.xkrs.straw.model.entity.FirePointOrdinaryEntity ;
import com.xkrs.straw.model.entity.FirePointPreciseEntity ;
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-03-01 16:14:48 +08:00
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
2023-03-01 16:18:46 +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-03-01 16:18:46 +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-03-01 16:18:46 +08:00
import java.util.stream.Collectors ;
2023-02-23 17:23:55 +08:00
@Component
public class FirePointQueryManager {
2023-03-01 16:14:48 +08:00
public static Logger log = LoggerFactory . getLogger ( FirePointQueryManager . class ) ;
2023-02-23 17:23:55 +08:00
@Resource
private FirePointOrdinaryDao firePointOrdinaryDao ;
@Resource
private FirePointPreciseDao firePointPreciseDao ;
2023-03-02 14:25:04 +08:00
// public FirePointQueryResultBean queryFirePointBelongToUser(SysUserEntity sysUserEntity, String startTime, String endTime, String satelliteType, String landType) {
//
// }
public FirePointQueryResultBean queryFirePointBelongToUser ( String userCode , String vipTimeRangeJson , String startTime , String endTime , String satelliteType , String landType ) {
2023-02-23 17:23:55 +08:00
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 {
//如果用户注册的区划编码是空,就返回失败
if ( TextUtils . isEmpty ( userCode ) ) {
2023-03-02 11:13:44 +08:00
return new FirePointQueryResultBean ( " User CountyCode Error 1, userCode = " + userCode ) ;
2023-02-23 17:23:55 +08:00
}
//对用户区划编码进行格式化,获得没有冗余数据的区划编码
String noRedundantUserCode = FirePointCodeUtils . getFormatCutCode ( userCode ) ;
//如果格式化后的用户区划编码是空,就返回失败
if ( TextUtils . isEmpty ( noRedundantUserCode ) ) {
2023-03-02 11:13:44 +08:00
return new FirePointQueryResultBean ( " User CountyCode Error 2, userCode = " + userCode + " , noRedundantUserCode = " + noRedundantUserCode ) ;
2023-02-23 17:23:55 +08:00
}
//如果用户的VIP时间范围数据是空, 就返回失败
if ( TextUtils . isEmpty ( vipTimeRangeJson ) ) {
2023-03-02 11:13:44 +08:00
return new FirePointQueryResultBean ( " User VipTimeRangeJson Error 1, vipTimeRangeJson = " + vipTimeRangeJson ) ;
2023-02-23 17:23:55 +08:00
}
//反序列化用户的VIP时间范围, 得到对象
VipTimeRangeBean vipTimeRangeBean = JsonUtils . deserialize ( vipTimeRangeJson , VipTimeRangeBean . class ) ;
//用户注册时有初始VIP时间范围, 反序列化失败或无数据, 说明该用户的数据发生了异常, 返回失败
if ( vipTimeRangeBean = = null | | vipTimeRangeBean . getList ( ) = = null | | vipTimeRangeBean . getList ( ) . size ( ) = = 0 ) {
2023-03-02 11:13:44 +08:00
return new FirePointQueryResultBean ( " User VipTimeRangeJson Error 2, 已保存的VIP时间范围反序列化失败, vipTimeRangeJson = " + vipTimeRangeJson ) ;
2023-02-23 17:23:55 +08:00
}
//得到由<开始时间 + 结束时间>组成的集合
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 ( ) ) ) {
2023-03-02 11:13:44 +08:00
return new FirePointQueryResultBean ( " User VIP 开始时间格式不合法1, StartTime = " + vipTimeRangeItemA . getStartTime ( ) ) ;
2023-02-24 10:45:27 +08:00
}
//校验用户VIP结束时间合法性
if ( ! DateTimeUtil . isValidDateTime ( vipTimeRangeItemA . getEndTime ( ) ) ) {
2023-03-02 11:13:44 +08:00
return new FirePointQueryResultBean ( " User VIP 结束时间格式不合法2, EndTime = " + vipTimeRangeItemA . getEndTime ( ) ) ;
2023-02-24 10:45:27 +08:00
}
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 ( ) ) ) {
2023-03-02 11:13:44 +08:00
return new FirePointQueryResultBean ( " User VIP 开始时间格式不合法3, StartTime = " + vipTimeRangeItemB . getStartTime ( ) ) ;
2023-02-24 10:45:27 +08:00
}
//校验用户VIP结束时间合法性
if ( ! DateTimeUtil . isValidDateTime ( vipTimeRangeItemB . getEndTime ( ) ) ) {
2023-03-02 11:13:44 +08:00
return new FirePointQueryResultBean ( " User VIP 结束时间格式不合法4, EndTime = " + vipTimeRangeItemB . getEndTime ( ) ) ;
2023-02-24 10:45:27 +08:00
}
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 ) ) {
2023-03-02 11:13:44 +08:00
return new FirePointQueryResultBean ( " User VIP 开始结束时间格式不合法5, 存在交叉现象 " ) ;
2023-02-24 10:45:27 +08:00
}
if ( userStartLocalDateTimeB . isBefore ( userEndLocalDateTimeA ) & & userEndLocalDateTimeB . isAfter ( userEndLocalDateTimeA ) ) {
2023-03-02 11:13:44 +08:00
return new FirePointQueryResultBean ( " User VIP 开始结束时间格式不合法6, 存在交叉现象 " ) ;
2023-02-24 10:45:27 +08:00
}
}
}
}
mNoRedundantUserCode = noRedundantUserCode ;
mVipTimeRangeItemList . addAll ( vipTimeRangeItemList ) ;
2023-02-23 17:23:55 +08:00
} catch ( Exception e ) {
e . printStackTrace ( ) ;
2023-03-02 11:13:44 +08:00
return new FirePointQueryResultBean ( e . getMessage ( ) ) ;
2023-02-23 17:23:55 +08:00
}
2023-03-01 16:18:46 +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";
2023-03-01 16:14:48 +08:00
//
2023-03-01 16:18:46 +08:00
// 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);
2023-02-28 16:32:34 +08:00
// String userStartTime = vipTimeRangeItem.getStartTime();
// String userEndTime = vipTimeRangeItem.getEndTime();
2023-03-01 16:18:46 +08:00
// //早于( 不包含) VIP开始时间, 或者晚于( 不包含) VIP结束时间
// if (i > 0) {
// ordinaryBuilder.append(" AND ");
// }
// ordinaryBuilder.append("(t.satellite_time<'" + userStartTime + "' OR t.satellite_time>'" + userEndTime + "')");
2023-02-28 16:32:34 +08:00
// }
2023-03-01 16:18:46 +08:00
// ordinaryBuilder.append(")");
// ordinaryBuilder.append(" ORDER BY t.satellite_time DESC");
// String ordinarySql = ordinaryBuilder.toString();
// log.info(sysUserEntity.getCountyName() + ":ordinarySql:" + ordinarySql);
// List<AllFirePointVo> voList1 = firePointOrdinaryDao.customQuery(ordinarySql);
2023-02-28 16:32:34 +08:00
//
2023-03-01 16:18:46 +08:00
// 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);
2023-02-28 16:32:34 +08:00
// String userStartTime = vipTimeRangeItem.getStartTime();
// String userEndTime = vipTimeRangeItem.getEndTime();
2023-03-01 16:18:46 +08:00
// //晚于( 包含) VIP开始时间, 并且早于( 包含) VIP结束时间
// if (i > 0) {
// preciseBuilder.append(" OR ");
// }
// preciseBuilder.append("(t.satellite_time>='" + userStartTime + "' AND t.satellite_time<='" + userEndTime + "')");
2023-02-28 16:32:34 +08:00
// }
2023-03-01 16:18:46 +08:00
// preciseBuilder.append(")");
// preciseBuilder.append(" ORDER BY t.satellite_time DESC");
// String preciseSql = preciseBuilder.toString();
// log.info(sysUserEntity.getCountyName() + ":preciseSql:" + preciseSql);
// List<AllFirePointVo> voList2 = firePointPreciseDao.customQuery(preciseSql);
//
// //将两种数据来源的火点合并到一起
// List<AllFirePointVo> resultList = new ArrayList<>();
// resultList.addAll(voList1);
// resultList.addAll(voList2);
// //对合并后的结果进行排序
// resultList.sort(Comparator.comparing(AllFirePointVo::getSatelliteTime));
//
// return new FirePointQueryResultBean(true, "", resultList);
2023-02-28 16:32:34 +08:00
//
// }
2023-03-01 16:18:46 +08:00
final String finalMNoRedundantUserCode = mNoRedundantUserCode ;
//查询未审核的普通火点
Specification < FirePointOrdinaryEntity > specificationOrdinary = ( root , criteriaQuery , criteriaBuilder ) - > {
List < Predicate > predicateList = new ArrayList < > ( ) ;
//添加区划编码的过滤
predicateList . add ( criteriaBuilder . like ( root . get ( " townCode " ) . as ( String . class ) , finalMNoRedundantUserCode + " % " ) ) ;
2023-03-01 17:03:32 +08:00
//开始时间查询条件
if ( ! TextUtils . isEmpty ( startTime ) ) {
LocalDateTime startTime1 = DateTimeUtils . stringToLocalDateTime ( startTime ) ;
LocalDateTime startTime2 = LocalDateTime . of ( startTime1 . getYear ( ) , startTime1 . getMonth ( ) , startTime1 . getDayOfMonth ( ) , 0 , 0 , 0 , 0 ) ;
String startTimeString = DateTimeUtils . localDateTimeToString ( startTime2 ) ;
predicateList . add ( criteriaBuilder . greaterThanOrEqualTo ( root . get ( " satelliteTime " ) . as ( String . class ) , startTimeString ) ) ;
}
//结束时间查询条件
if ( ! TextUtils . isEmpty ( endTime ) ) {
LocalDateTime endTime1 = DateTimeUtils . stringToLocalDateTime ( endTime ) . plusDays ( 1 ) ;
LocalDateTime endTime2 = LocalDateTime . of ( endTime1 . getYear ( ) , endTime1 . getMonth ( ) , endTime1 . getDayOfMonth ( ) , 0 , 0 , 0 , 0 ) ;
String endTimeString = DateTimeUtils . localDateTimeToString ( endTime2 ) ;
predicateList . add ( criteriaBuilder . lessThanOrEqualTo ( root . get ( " satelliteTime " ) . as ( String . class ) , endTimeString ) ) ;
}
//卫星类型查询条件
if ( ! TextUtils . isEmpty ( satelliteType ) ) {
predicateList . add ( criteriaBuilder . equal ( root . get ( " satelliteType " ) . as ( String . class ) , satelliteType ) ) ;
}
//地物类型查询条件
if ( ! TextUtils . isEmpty ( landType ) ) {
predicateList . add ( criteriaBuilder . equal ( root . get ( " landType " ) . as ( String . class ) , landType ) ) ;
}
2023-03-01 16:18:46 +08:00
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 + " % " ) ) ;
2023-03-01 17:03:32 +08:00
//开始时间查询条件
if ( ! TextUtils . isEmpty ( startTime ) ) {
LocalDateTime startTime1 = DateTimeUtils . stringToLocalDateTime ( startTime ) ;
LocalDateTime startTime2 = LocalDateTime . of ( startTime1 . getYear ( ) , startTime1 . getMonth ( ) , startTime1 . getDayOfMonth ( ) , 0 , 0 , 0 , 0 ) ;
String startTimeString = DateTimeUtils . localDateTimeToString ( startTime2 ) ;
predicateList . add ( criteriaBuilder . greaterThanOrEqualTo ( root . get ( " satelliteTime " ) . as ( String . class ) , startTimeString ) ) ;
}
//结束时间查询条件
if ( ! TextUtils . isEmpty ( endTime ) ) {
LocalDateTime endTime1 = DateTimeUtils . stringToLocalDateTime ( endTime ) . plusDays ( 1 ) ;
LocalDateTime endTime2 = LocalDateTime . of ( endTime1 . getYear ( ) , endTime1 . getMonth ( ) , endTime1 . getDayOfMonth ( ) , 0 , 0 , 0 , 0 ) ;
String endTimeString = DateTimeUtils . localDateTimeToString ( endTime2 ) ;
predicateList . add ( criteriaBuilder . lessThanOrEqualTo ( root . get ( " satelliteTime " ) . as ( String . class ) , endTimeString ) ) ;
}
//卫星类型查询条件
if ( ! TextUtils . isEmpty ( satelliteType ) ) {
predicateList . add ( criteriaBuilder . equal ( root . get ( " satelliteType " ) . as ( String . class ) , satelliteType ) ) ;
}
//地物类型查询条件
if ( ! TextUtils . isEmpty ( landType ) ) {
predicateList . add ( criteriaBuilder . equal ( root . get ( " landType " ) . as ( String . class ) , landType ) ) ;
}
2023-03-01 16:58:46 +08:00
List < Predicate > subPredicateList = new ArrayList < > ( ) ;
2023-03-01 16:18:46 +08:00
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 ) ;
2023-03-01 16:58:46 +08:00
subPredicateList . add ( criteriaBuilder . and ( beforeStartTimePredicate , afterEndTimePredicate ) ) ;
}
if ( subPredicateList . size ( ) = = 0 ) {
} else if ( subPredicateList . size ( ) = = 1 ) {
predicateList . add ( subPredicateList . get ( 0 ) ) ;
} else {
Predicate orPredicate = null ;
for ( int i = 1 ; i < subPredicateList . size ( ) ; i + + ) {
if ( i = = 1 ) {
orPredicate = criteriaBuilder . or ( subPredicateList . get ( 0 ) , subPredicateList . get ( 1 ) ) ;
} else {
orPredicate = criteriaBuilder . or ( orPredicate , subPredicateList . get ( i ) ) ;
}
}
predicateList . add ( orPredicate ) ;
2023-03-01 16:18:46 +08:00
}
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 ( ) ) ;
2023-03-02 11:13:44 +08:00
return new FirePointQueryResultBean ( true , " " , sortedResultList , sortedResultList . size ( ) ) ;
2023-02-23 17:23:55 +08:00
}
}