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;
|
|
|
|
|
//查询未审核的普通火点
|
|
|
|
|
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"));
|
2023-02-23 17:23:55 +08:00
|
|
|
|
|
2023-02-24 17:15:38 +08:00
|
|
|
|
//将两种数据来源的火点合并到一起
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|