fire_point/src/main/java/com/xkrs/straw/utils/FirePointQueryManager.java

164 lines
10 KiB
Java
Raw Normal View History

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;
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;
import com.xkrs.utils.DateTimeUtils;
import com.xkrs.utils.FirePointCodeUtils;
import org.apache.hc.core5.util.TextUtils;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Component;
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 {
@Resource
private FirePointOrdinaryDao firePointOrdinaryDao;
@Resource
private FirePointPreciseDao firePointPreciseDao;
public FirePointQueryResultBean queryFirePointBelongToUser(SysUserEntity sysUserEntity, String startTime, String endTime, String satelliteType, String landType) {
String mNoRedundantUserCode = null;
final List<VipTimeRangeBean.VipTimeRangeItemBean> mVipTimeRangeItemList = new ArrayList<>();
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();
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);
} catch (Exception e) {
e.printStackTrace();
return new FirePointQueryResultBean(false, e.getMessage(), null);
}
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 + "%"));
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);
}
}