From 59cc458a284c334c2eabe69ccff5f6d673720f45 Mon Sep 17 00:00:00 2001 From: Angel <1050374295@qq.com> Date: Fri, 15 Mar 2024 16:09:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AB=8C=E7=96=91=E4=BA=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/ModelSuspectedUserInfo.java | 126 ++++++++ .../ModelSuspectedUserInfoJudgement.java | 66 ++++ .../mapper/BasePlaceInfoMapper.java | 2 + .../mapper/BaseUserInfoMapper.java | 5 +- ...ModelSuspectedUserInfoJudgementMapper.java | 18 ++ .../mapper/ModelSuspectedUserInfoMapper.java | 34 ++ .../mapper/PoliceBacklogMapper.java | 49 +++ ...odelSuspectedUserInfoJudgementService.java | 13 + .../ModelSuspectedUserInfoService.java | 13 + ...SuspectedUserInfoJudgementServiceImpl.java | 22 ++ .../ModelSuspectedUserInfoServiceImpl.java | 24 ++ .../task/PersonSuspectedTask.java | 292 ++++++++++++++++++ .../task/UserAndVehicleRecordTask.java | 78 +++-- .../task/VehicleRecordTask.java | 45 +-- .../resources/mapper/BaseUserInfoMapper.xml | 12 +- .../resources/mapper/GoalPersonMapper.xml | 4 +- .../ModelSuspectedUserInfoJudgementMapper.xml | 24 ++ .../mapper/ModelSuspectedUserInfoMapper.xml | 118 +++++++ .../resources/mapper/PoliceBacklogMapper.xml | 192 ++++++++++++ 19 files changed, 1080 insertions(+), 57 deletions(-) create mode 100644 src/main/java/com/ssf/mysqloracletest/domain/ModelSuspectedUserInfo.java create mode 100644 src/main/java/com/ssf/mysqloracletest/domain/ModelSuspectedUserInfoJudgement.java create mode 100644 src/main/java/com/ssf/mysqloracletest/mapper/ModelSuspectedUserInfoJudgementMapper.java create mode 100644 src/main/java/com/ssf/mysqloracletest/mapper/ModelSuspectedUserInfoMapper.java create mode 100644 src/main/java/com/ssf/mysqloracletest/mapper/PoliceBacklogMapper.java create mode 100644 src/main/java/com/ssf/mysqloracletest/service/ModelSuspectedUserInfoJudgementService.java create mode 100644 src/main/java/com/ssf/mysqloracletest/service/ModelSuspectedUserInfoService.java create mode 100644 src/main/java/com/ssf/mysqloracletest/service/impl/ModelSuspectedUserInfoJudgementServiceImpl.java create mode 100644 src/main/java/com/ssf/mysqloracletest/service/impl/ModelSuspectedUserInfoServiceImpl.java create mode 100644 src/main/java/com/ssf/mysqloracletest/task/PersonSuspectedTask.java create mode 100644 src/main/resources/mapper/ModelSuspectedUserInfoJudgementMapper.xml create mode 100644 src/main/resources/mapper/ModelSuspectedUserInfoMapper.xml create mode 100644 src/main/resources/mapper/PoliceBacklogMapper.xml diff --git a/src/main/java/com/ssf/mysqloracletest/domain/ModelSuspectedUserInfo.java b/src/main/java/com/ssf/mysqloracletest/domain/ModelSuspectedUserInfo.java new file mode 100644 index 0000000..987a156 --- /dev/null +++ b/src/main/java/com/ssf/mysqloracletest/domain/ModelSuspectedUserInfo.java @@ -0,0 +1,126 @@ +package com.ssf.mysqloracletest.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + +/** + * 疑似小区住户信息表 + * @TableName model_suspected_user_info + */ +@TableName(value ="model_suspected_user_info") +@Data +public class ModelSuspectedUserInfo implements Serializable { + /** + * 主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 场所编码 + */ + private String placeCode; + + /** + * 场所名称 + */ + private String placeName; + + /** + * 档案编码 + */ + private String dossierCode; + + /** + * 人员姓名 + */ + private String userName; + + /** + * 人员照片 + */ + private String userPic; + + /** + * 证件号码 + */ + private String idCard; + + /** + * 联系电话 + */ + private String userPhone; + + /** + * 出现频次 + */ + private Integer appearTimes; + + /** + * 出现天数 + */ + private Integer appearDays; + + /** + * 统计任务开始时间 + */ + private String taskStartTime; + + /** + * 统计任务结束时间 + */ + private String taskEndTime; + + /** + * 任务统计天数 + */ + private String taskDay; + + /** + * 任务设置的频次阀值 + */ + private String taskAppearTimes; + + /** + * 任务设置的天数阀值 + */ + private String taskAppearDays; + + /** + * 是否实名档 + */ + private Integer isEntity; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 创建者 + */ + private Integer createBy; + + /** + * 更新时间 + */ + private Date updateTime; + + /** + * 更新者 + */ + private Integer updateBy; + + /** + * 0:不活跃,1:活跃 + */ + private Integer isActive; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/src/main/java/com/ssf/mysqloracletest/domain/ModelSuspectedUserInfoJudgement.java b/src/main/java/com/ssf/mysqloracletest/domain/ModelSuspectedUserInfoJudgement.java new file mode 100644 index 0000000..7c0c408 --- /dev/null +++ b/src/main/java/com/ssf/mysqloracletest/domain/ModelSuspectedUserInfoJudgement.java @@ -0,0 +1,66 @@ +package com.ssf.mysqloracletest.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.util.Date; +import lombok.Data; + +/** + * 疑似小区住户研判表 + * @TableName model_suspected_user_info_judgement + */ +@TableName(value ="model_suspected_user_info_judgement") +@Data +public class ModelSuspectedUserInfoJudgement implements Serializable { + /** + * 主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 小区编码 + */ + private String villageCode; + + /** + * 小区名称 + */ + private String villageName; + + /** + * 人员姓名 + */ + private String userName; + + /** + * 档案编号 + */ + private String dossierCode; + + /** + * 证件号码 + */ + private String idcard; + + /** + * 研判人 + */ + private String judgementUser; + + /** + * 研判结果 + */ + private Integer judgementStatus; + + /** + * 研判时间 + */ + private Date judgementTime; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/src/main/java/com/ssf/mysqloracletest/mapper/BasePlaceInfoMapper.java b/src/main/java/com/ssf/mysqloracletest/mapper/BasePlaceInfoMapper.java index f0c2f5e..aec2372 100644 --- a/src/main/java/com/ssf/mysqloracletest/mapper/BasePlaceInfoMapper.java +++ b/src/main/java/com/ssf/mysqloracletest/mapper/BasePlaceInfoMapper.java @@ -17,6 +17,8 @@ public interface BasePlaceInfoMapper extends BaseMapper { public List selectVillageBaseInfoList(BasePlaceInfo basePlaceInfo); + + } diff --git a/src/main/java/com/ssf/mysqloracletest/mapper/BaseUserInfoMapper.java b/src/main/java/com/ssf/mysqloracletest/mapper/BaseUserInfoMapper.java index c093ad8..027b3ee 100644 --- a/src/main/java/com/ssf/mysqloracletest/mapper/BaseUserInfoMapper.java +++ b/src/main/java/com/ssf/mysqloracletest/mapper/BaseUserInfoMapper.java @@ -15,7 +15,10 @@ import java.util.Map; */ @Mapper public interface BaseUserInfoMapper extends BaseMapper { - + /** + * 根据身份证号查询指定时间范围内记录 + */ + public List queryUserRecordsByIdCard(Map map); } diff --git a/src/main/java/com/ssf/mysqloracletest/mapper/ModelSuspectedUserInfoJudgementMapper.java b/src/main/java/com/ssf/mysqloracletest/mapper/ModelSuspectedUserInfoJudgementMapper.java new file mode 100644 index 0000000..9b2aae9 --- /dev/null +++ b/src/main/java/com/ssf/mysqloracletest/mapper/ModelSuspectedUserInfoJudgementMapper.java @@ -0,0 +1,18 @@ +package com.ssf.mysqloracletest.mapper; + +import com.ssf.mysqloracletest.domain.ModelSuspectedUserInfoJudgement; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author 10503 +* @description 针对表【model_suspected_user_info_judgement(疑似小区住户研判表)】的数据库操作Mapper +* @createDate 2024-03-15 16:01:17 +* @Entity com.ssf.mysqloracletest.domain.ModelSuspectedUserInfoJudgement +*/ +public interface ModelSuspectedUserInfoJudgementMapper extends BaseMapper { + +} + + + + diff --git a/src/main/java/com/ssf/mysqloracletest/mapper/ModelSuspectedUserInfoMapper.java b/src/main/java/com/ssf/mysqloracletest/mapper/ModelSuspectedUserInfoMapper.java new file mode 100644 index 0000000..ec4e5a2 --- /dev/null +++ b/src/main/java/com/ssf/mysqloracletest/mapper/ModelSuspectedUserInfoMapper.java @@ -0,0 +1,34 @@ +package com.ssf.mysqloracletest.mapper; + +import com.ssf.mysqloracletest.domain.ModelSuspectedUserInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** +* @author 10503 +* @description 针对表【model_suspected_user_info(疑似小区住户信息表)】的数据库操作Mapper +* @createDate 2024-03-15 14:30:00 +* @Entity com.ssf.mysqloracletest.domain.ModelSuspectedUserInfo +*/ +@Mapper +public interface ModelSuspectedUserInfoMapper extends BaseMapper { + + void cleanModelSuspectedUserInfo(); + + List queryModelSuspectedUserInfoExists(ModelSuspectedUserInfo modelSuspectedUserInfo); + + int addModelSuspectedUserInfo(ModelSuspectedUserInfo modelSuspectedUserInfo); + /** + * 修改疑似小区住户信息 + * + * @param modelSuspectedUserInfo 疑似小区住户信息 + * @return 结果 + */ + int updateModelSuspectedUserInfo(ModelSuspectedUserInfo modelSuspectedUserInfo); +} + + + + diff --git a/src/main/java/com/ssf/mysqloracletest/mapper/PoliceBacklogMapper.java b/src/main/java/com/ssf/mysqloracletest/mapper/PoliceBacklogMapper.java new file mode 100644 index 0000000..74b24ff --- /dev/null +++ b/src/main/java/com/ssf/mysqloracletest/mapper/PoliceBacklogMapper.java @@ -0,0 +1,49 @@ +package com.ssf.mysqloracletest.mapper; + +import com.ssf.mysqloracletest.domain.ModelSuspectedUserInfoJudgement; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface PoliceBacklogMapper { + +// List selectSuspectedUsers(ModelSuspectedUserInfo modelSuspectedUserInfo); +// +// int deleteVillageUserInfoJudgement(Map map); +// +// int insertVillageUserInfoJudgement(ModelSuspectedUserInfoJudgement modelSuspectedUserInfoJudgement); +// +// List selectSuspectedUsersJudgement(ModelSuspectedUserInfoJudgement modelSuspectedUserInfoJudgement); +// +// List selectSuspectedVehicles(ModelSuspectedVehicleInfo modelSuspectedVehicleInfo); +// +// int deleteVillageVehicleInfoJudgement(Map map); +// +// int insertVillageVehicleInfoJudgement(ModelSuspectedVehicleInfoJudgement modelSuspectedVehicleInfoJudgement); +// +// List selectSuspectedVehiclesJudgement(ModelSuspectedVehicleInfoJudgement modelSuspectedVehicleInfoJudgement); +// +// int selectSuspectedUserYesJudgement(); +// +// int selectSuspectedUserSumJudgement(); +// +// int selectSuspectedVehicleYesJudgement(); +// +// int selectSuspectedVehicleSumJudgement(); + + /** + * 查询研判表中是否已经研判过 + */ + List queryModelSuspectedUserInfoJudgementExists(ModelSuspectedUserInfoJudgement modelSuspectedUserInfoJudgement); + +// /** +// * 更新疑似人员记录表中的is_entity +// */ +// void updateIsEntityModelSuspectedUserInfo(Map map); +// +// /** +// * 更新信息到实名档案表,非实名档补充身份证号和姓名 +// */ +// void updateUserIdentity(Map map); +} diff --git a/src/main/java/com/ssf/mysqloracletest/service/ModelSuspectedUserInfoJudgementService.java b/src/main/java/com/ssf/mysqloracletest/service/ModelSuspectedUserInfoJudgementService.java new file mode 100644 index 0000000..f48e0f1 --- /dev/null +++ b/src/main/java/com/ssf/mysqloracletest/service/ModelSuspectedUserInfoJudgementService.java @@ -0,0 +1,13 @@ +package com.ssf.mysqloracletest.service; + +import com.ssf.mysqloracletest.domain.ModelSuspectedUserInfoJudgement; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author 10503 +* @description 针对表【model_suspected_user_info_judgement(疑似小区住户研判表)】的数据库操作Service +* @createDate 2024-03-15 16:01:17 +*/ +public interface ModelSuspectedUserInfoJudgementService extends IService { + +} diff --git a/src/main/java/com/ssf/mysqloracletest/service/ModelSuspectedUserInfoService.java b/src/main/java/com/ssf/mysqloracletest/service/ModelSuspectedUserInfoService.java new file mode 100644 index 0000000..8db19ba --- /dev/null +++ b/src/main/java/com/ssf/mysqloracletest/service/ModelSuspectedUserInfoService.java @@ -0,0 +1,13 @@ +package com.ssf.mysqloracletest.service; + +import com.ssf.mysqloracletest.domain.ModelSuspectedUserInfo; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author 10503 +* @description 针对表【model_suspected_user_info(疑似小区住户信息表)】的数据库操作Service +* @createDate 2024-03-15 14:30:00 +*/ +public interface ModelSuspectedUserInfoService extends IService { + +} diff --git a/src/main/java/com/ssf/mysqloracletest/service/impl/ModelSuspectedUserInfoJudgementServiceImpl.java b/src/main/java/com/ssf/mysqloracletest/service/impl/ModelSuspectedUserInfoJudgementServiceImpl.java new file mode 100644 index 0000000..448cf7b --- /dev/null +++ b/src/main/java/com/ssf/mysqloracletest/service/impl/ModelSuspectedUserInfoJudgementServiceImpl.java @@ -0,0 +1,22 @@ +package com.ssf.mysqloracletest.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ssf.mysqloracletest.domain.ModelSuspectedUserInfoJudgement; +import com.ssf.mysqloracletest.service.ModelSuspectedUserInfoJudgementService; +import com.ssf.mysqloracletest.mapper.ModelSuspectedUserInfoJudgementMapper; +import org.springframework.stereotype.Service; + +/** +* @author 10503 +* @description 针对表【model_suspected_user_info_judgement(疑似小区住户研判表)】的数据库操作Service实现 +* @createDate 2024-03-15 16:01:17 +*/ +@Service +public class ModelSuspectedUserInfoJudgementServiceImpl extends ServiceImpl + implements ModelSuspectedUserInfoJudgementService{ + +} + + + + diff --git a/src/main/java/com/ssf/mysqloracletest/service/impl/ModelSuspectedUserInfoServiceImpl.java b/src/main/java/com/ssf/mysqloracletest/service/impl/ModelSuspectedUserInfoServiceImpl.java new file mode 100644 index 0000000..fd7832d --- /dev/null +++ b/src/main/java/com/ssf/mysqloracletest/service/impl/ModelSuspectedUserInfoServiceImpl.java @@ -0,0 +1,24 @@ +package com.ssf.mysqloracletest.service.impl; + +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ssf.mysqloracletest.domain.ModelSuspectedUserInfo; +import com.ssf.mysqloracletest.service.ModelSuspectedUserInfoService; +import com.ssf.mysqloracletest.mapper.ModelSuspectedUserInfoMapper; +import org.springframework.stereotype.Service; + +/** +* @author 10503 +* @description 针对表【model_suspected_user_info(疑似小区住户信息表)】的数据库操作Service实现 +* @createDate 2024-03-15 14:30:00 +*/ +@Service +@DS("mysql") +public class ModelSuspectedUserInfoServiceImpl extends ServiceImpl + implements ModelSuspectedUserInfoService{ + +} + + + + diff --git a/src/main/java/com/ssf/mysqloracletest/task/PersonSuspectedTask.java b/src/main/java/com/ssf/mysqloracletest/task/PersonSuspectedTask.java new file mode 100644 index 0000000..8788962 --- /dev/null +++ b/src/main/java/com/ssf/mysqloracletest/task/PersonSuspectedTask.java @@ -0,0 +1,292 @@ +package com.ssf.mysqloracletest.task; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.ssf.mysqloracletest.domain.BasePlaceInfo; +import com.ssf.mysqloracletest.domain.BaseUserInfo; +import com.ssf.mysqloracletest.domain.ModelSuspectedUserInfo; +import com.ssf.mysqloracletest.domain.ModelSuspectedUserInfoJudgement; +import com.ssf.mysqloracletest.mapper.BaseUserInfoMapper; +import com.ssf.mysqloracletest.mapper.GoalPersonMapper; +import com.ssf.mysqloracletest.mapper.ModelSuspectedUserInfoMapper; +import com.ssf.mysqloracletest.mapper.PoliceBacklogMapper; +import com.ssf.mysqloracletest.service.BasePlaceInfoService; +import com.ssf.mysqloracletest.service.BaseUserInfoService; +import com.ssf.mysqloracletest.utils.DateTool; +import com.ssf.mysqloracletest.utils.safe.AESTools; +import com.ssf.mysqloracletest.utils.safe.AesConstant; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.*; + +@Component +@RequiredArgsConstructor +public class PersonSuspectedTask { + @Resource + DateTool dateTool; + private static final Logger logger = LoggerFactory.getLogger(PersonSuspectedTask.class); + + private final ModelSuspectedUserInfoMapper modelSuspectedUserInfoMapper; + private final BasePlaceInfoService basePlaceInfoService; + private final GoalPersonMapper goalPersonMapper; + + private final BaseUserInfoService baseUserInfoService; + private final BaseUserInfoMapper baseUserInfoMapper; + private final PoliceBacklogMapper policeBacklogMapper; + + + @Scheduled(initialDelay = 100, fixedDelay = 3000) + public void goalPersonSuspected(String nearlyDays, String appearDays, String appearTimes) { + nearlyDays = "30"; + appearDays = "20"; + appearTimes = "30"; + logger.info("goalPersonSuspected 人员分析 疑似小区住户 nearlyDays:" + nearlyDays + ", appearDays:" + appearDays + ", appearTimes" + appearTimes + ", threadName:" + Thread.currentThread().getName()); + modelSuspectedUserInfoMapper.cleanModelSuspectedUserInfo(); + // 1.查询近30天人脸抓拍数据 + // 2.出现天数大于20或者次数大于30 + if (StringUtils.isBlank(appearDays) || StringUtils.isBlank(appearTimes) || StringUtils.isBlank(nearlyDays)) { + return; + } + //入参校验 + try { + Integer.parseInt(appearDays.trim()); + Integer.parseInt(appearTimes.trim()); + Integer.parseInt(nearlyDays.trim()); + appearDays = appearDays.trim(); + appearTimes = appearTimes.trim(); + nearlyDays = nearlyDays.trim(); + } catch (Exception ex) { + return; + } + + //查询汇聚平台中小区编码 + List villageBaseInfos = basePlaceInfoService.queryVillageInfos(); + if (CollectionUtils.isEmpty(villageBaseInfos)) { + return; + } + String villageCode = ""; + // 4.清空临时结果表为入数据做准备 + for (BasePlaceInfo villageBaseInfo : villageBaseInfos) { + villageCode = villageBaseInfo.getPlaceCode(); + if (StringUtils.isBlank(villageCode)) { + //小区编码为空则跳过 + continue; + } + + //分别统计每个小区任务 + Map map = new HashMap<>(); + map.put("startTime", dateTool.getDayStart(Integer.parseInt(nearlyDays))); + map.put("endTime", dateTool.getDayEnd(1)); + map.put("villageCode", villageCode); + map.put("appearTimes", appearTimes); + map.put("appearDays", appearDays); + + // 注意:查询档案方式, 天数维度和次数维度求【交集】 + List appearTimesList = goalPersonMapper.queryUserRecordsByCountHz(map); + List appearDaysList = goalPersonMapper.queryUserRecordsByDayHz(map); + logger.info("villageCode=" + villageCode + ", appearTimesList=" + appearTimesList.size() + ", appearDaysList=" + appearDaysList.size()); +// if (CollectionUtils.isEmpty(appearTimesList)) { +// logger.info("villageCode=" + villageCode + ", appearTimesList null"); +// } else { +// logger.info("villageCode=" + villageCode + ", appearTimesList=" + appearTimesList.size()); +// } +// if (CollectionUtils.isEmpty(appearDaysList)) { +// logger.info("villageCode=" + villageCode + ", appearDaysList null"); +// } else { +// logger.info("villageCode=" + villageCode + ", appearDaysList=" + appearDaysList.size()); +// } + //临时档案缓存数据 + Map mapIdCardTmp = new HashMap<>(); + //结果档案交集数据 + Map mapIdCardRes = new HashMap<>(); + if (CollectionUtils.isNotEmpty(appearDaysList)) { + for (String day : appearDaysList) { + if (StringUtils.isNotBlank(day)) { + mapIdCardTmp.put(day, day); + } + } + appearDaysList.clear(); + } + + if (CollectionUtils.isNotEmpty(appearTimesList)) { + for (String time : appearTimesList) { + if (StringUtils.isNotBlank(time)) { + if (StringUtils.isNotBlank(mapIdCardTmp.get(time)) + && mapIdCardTmp.get(time).equals(time)) { + mapIdCardRes.put(time, time); + } + } + } + appearTimesList.clear(); + } +// logger.info("villageCode=" + villageCode + ", mapIdCardRes=" + mapIdCardRes.size()); + Map usersMap = queryUsers(villageCode); +// logger.info("villageCode=" + villageCode + ", usersMap=" + usersMap.size()); + List suspected = new ArrayList<>(); + List idCards = new ArrayList<>(); + for (Map.Entry entry : mapIdCardRes.entrySet()) { + if (StringUtils.isBlank(entry.getKey()) || idCards.contains(entry.getKey())) { + continue; + } + idCards.add(entry.getKey()); + } + logger.info("villageCode=" + villageCode + ", idCards=" + idCards.size()); + +// logger.info("villageCode=" + villageCode + ", idCards=" + idCards.size()); + + //没有满足条件的档案ID则跳过 + if (CollectionUtils.isEmpty(idCards)) { + usersMap.clear(); + mapIdCardTmp.clear(); + mapIdCardRes.clear(); + continue; + } + + for (String idCard : idCards) { + if (StringUtils.isNotBlank(idCard)) { + // 通过idCard查询记录 + map.put("idcard", idCard); + ModelSuspectedUserInfo suspectUserInfo = getSuspectUserInfo(baseUserInfoMapper.queryUserRecordsByIdCard(map)); + if (null != suspectUserInfo) { +// //判断这个推荐出来的人是否为本小区住户;两种情况1非实名,2实名 +// if (!queryInUserInfo(suspectUserInfo.getIdcard(), usersMap)) { +// suspectUserInfo.setC1("2");//未登记 +// } else { +// suspectUserInfo.setC1("1");//已登记 +// } + suspectUserInfo.setTaskStartTime(String.valueOf(map.get("startTime"))); + suspectUserInfo.setTaskEndTime(String.valueOf(map.get("endTime"))); + suspectUserInfo.setTaskDay(nearlyDays); + suspectUserInfo.setTaskAppearDays(String.valueOf(map.get("appearDays"))); + suspectUserInfo.setTaskAppearTimes(String.valueOf(map.get("appearTimes"))); +// suspectUserInfo.setIsEntity(Integer.parseInt(Constant.IS_ENTITY_1)); + suspectUserInfo.setDossierCode(""); + suspected.add(suspectUserInfo); + } + } + } +// logger.info("villageCode=" + villageCode + ", suspected=" + suspected.size()); + if (CollectionUtils.isNotEmpty(suspected)) { + for (ModelSuspectedUserInfo modelSuspectedUserInfo : suspected) { + try { +// //去住户表查询是否已经存在,关联手机号码,使用备用字段c3存储 +// VillageUserInfoMp one = villageUserInfoMpService.getOne(new LambdaQueryWrapper().eq(VillageUserInfoMp::getIdcard, modelSuspectedUserInfo.getIdcard()), false); + + //去实有人口表查询身份证对应手机号,使用c3存储 + String encryptIdcard = modelSuspectedUserInfo.getIdCard(); +// VillageActualUserInfoMp one = villageActualUserInfoMpService.getOne(new LambdaQueryWrapper().eq(VillageActualUserInfoMp::getIdcard, AESTools.decrypt(encryptIdcard, AesConstant.AES_ID_CARD)), false); +// +// Optional.ofNullable(one).ifPresent(e -> modelSuspectedUserInfo.setC3(e.getPhone())); + + //villageCode,idcard用于判断临时结果表【model_suspected_user_info】是否已经存在 + List modelSuspectedUserInfos = modelSuspectedUserInfoMapper.queryModelSuspectedUserInfoExists(modelSuspectedUserInfo); + if (CollectionUtils.isEmpty(modelSuspectedUserInfos)) { + modelSuspectedUserInfoMapper.addModelSuspectedUserInfo(modelSuspectedUserInfo); + logger.info("住户身份证为:{}", encryptIdcard); + logger.info("人员分析 疑似小区住户 新增推送 " + JSONObject.toJSONString(modelSuspectedUserInfo)); + } else { + //1.说明已经在临时表结果中出现过 + //2.先去研判表查询一下,判断是否研判过 + ModelSuspectedUserInfoJudgement modelSuspectedUserInfoJudgement = new ModelSuspectedUserInfoJudgement(); + modelSuspectedUserInfoJudgement.setVillageCode(villageCode); + modelSuspectedUserInfoJudgement.setIdcard(encryptIdcard); + modelSuspectedUserInfoJudgement.setDossierCode(""); + List modelSuspectedUserInfoJudgementExists = policeBacklogMapper.queryModelSuspectedUserInfoJudgementExists(modelSuspectedUserInfoJudgement); + //modelSuspectedUserInfoJudgementExists 大于0 说明研判表【model_suspected_user_info_judgement】已经存在,则丢掉 + if (CollectionUtils.isEmpty(modelSuspectedUserInfoJudgementExists)) { + //防止实名非实名状态被更新,需要设置is_entity为null;更新临时结果表中的信息保持最新同时不更新is_entity + modelSuspectedUserInfo.setIsEntity(null); + modelSuspectedUserInfo.setId(modelSuspectedUserInfos.get(0).getId()); + modelSuspectedUserInfoMapper.updateModelSuspectedUserInfo(modelSuspectedUserInfo); + logger.info("人员分析 疑似小区住户 更新已推送过记录保持最新一次 " + JSONObject.toJSONString(modelSuspectedUserInfo)); + } + } + } catch (Exception es) { + es.printStackTrace(); + logger.error("人员分析 疑似小区住户 异常 " + es.getMessage()); + } + } + } + idCards.clear(); + usersMap.clear(); + suspected.clear(); + mapIdCardTmp.clear(); + mapIdCardRes.clear(); + } + logger.info("goalPersonSuspected 人员分析 疑似小区住户 结束, 时间:" + dateTool.getDateTime(System.currentTimeMillis() / 1000)); + } + + private Map queryUsers(String villageCode) { + Map map = new HashMap<>(); + try { + List villageUserInfos = queryVillageUserInfos(villageCode); + for (BaseUserInfo userInfo : villageUserInfos) { + String idCard = userInfo.getIdCard(); + if (StringUtils.isBlank(idCard)) { + continue; + } + if (!map.containsKey(userInfo.getIdCard())) { + map.put(userInfo.getIdCard(), userInfo); + } + } + } catch (Exception e) { + return map; + } + return map; + } + /** + * 查询人员住户表 + */ + private List queryVillageUserInfos(String villageCode) { + BaseUserInfo villageUserInfo = new BaseUserInfo(); + villageUserInfo.setPlaceCode(villageCode); + List villageUserInfos = baseUserInfoService.lambdaQuery() + .isNotNull(BaseUserInfo::getIdCard) + .eq(BaseUserInfo::getPlaceCode,villageCode).list(); + if (CollectionUtils.isEmpty(villageUserInfos)) { + return new ArrayList<>(); + } + return villageUserInfos; + } + /** + * 组装疑似小区住户信息对象 + */ + private ModelSuspectedUserInfo getSuspectUserInfo(List villageUserRecords) { + List list = new ArrayList<>(); + if (null != villageUserRecords && villageUserRecords.size() > 0) { + BaseUserInfo villageUserRecord = villageUserRecords.get(0); + logger.info("getSuspectUserInfo=" + JSONObject.toJSONString(villageUserRecord)); + ModelSuspectedUserInfo modelSuspectedUserInfo = new ModelSuspectedUserInfo(); + modelSuspectedUserInfo.setPlaceCode(villageUserRecord.getPlaceCode()); + modelSuspectedUserInfo.setPlaceName(villageUserRecord.getPlaceName()); + modelSuspectedUserInfo.setUserName(villageUserRecord.getUserName()); + if (StringUtils.isNotBlank(villageUserRecord.getUserStandardPic())) { + modelSuspectedUserInfo.setUserPic(villageUserRecord.getUserStandardPic()); + } +// if (StringUtils.isBlank(modelSuspectedUserInfo.getUserPic())) { +// modelSuspectedUserInfo.setUserPic(villageUserRecord.getPersonPic()); +// } + modelSuspectedUserInfo.setIdCard(villageUserRecord.getIdCard()); +// modelSuspectedUserInfo.setIdentityType(villageUserRecord.getIdentityType()); + modelSuspectedUserInfo.setAppearTimes(villageUserRecords.size()); + +// for (BaseUserInfo userRecord : villageUserRecords) { +// String ymd = dateTool.getDayStr(userRecord.getPassTime()); +// if (StringUtils.isBlank(ymd) || list.contains(ymd)) { +// continue; +// } +// list.add(ymd); +// } + modelSuspectedUserInfo.setAppearDays(list.size()); + return modelSuspectedUserInfo; + } + return null; + } +} diff --git a/src/main/java/com/ssf/mysqloracletest/task/UserAndVehicleRecordTask.java b/src/main/java/com/ssf/mysqloracletest/task/UserAndVehicleRecordTask.java index 02cb028..5f98ab1 100644 --- a/src/main/java/com/ssf/mysqloracletest/task/UserAndVehicleRecordTask.java +++ b/src/main/java/com/ssf/mysqloracletest/task/UserAndVehicleRecordTask.java @@ -16,11 +16,10 @@ import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.TimeZone; +import java.util.*; +import java.util.stream.Collectors; /** @@ -37,43 +36,48 @@ public class UserAndVehicleRecordTask { private final DevopsDeviceInfoService devopsDeviceInfoService; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String maxTime = "2024-03-01 00:00:00"; - + String maxTime = "2024-03-02 00:00:00"; @Scheduled(initialDelay = 100, fixedDelay = 3000) public void setTransitUserRecordService() { if (!"true".equals(ConfigParam.UserAndVehicleSwitch)) { return; } - - try { dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); + // 获取最新的 partitionField 时间 LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); queryWrapper.orderByDesc(TransitUserRecord::getPartitionField); queryWrapper.last("LIMIT 1"); - TransitUserRecord one = transitUserRecordService.getOne(queryWrapper); - if (one != null) { - Date partitionField = one.getPartitionField(); + TransitUserRecord latestRecord = transitUserRecordService.getOne(queryWrapper); + if (latestRecord != null) { + Date partitionField = latestRecord.getPartitionField(); maxTime = dateFormat.format(partitionField); + }else { + maxTime = "2024-03-02 00:00:00"; } - List list = devopsDeviceInfoService.lambdaQuery().eq(DevopsDeviceInfo::getDeviceType, 1).list(); - ArrayList arrayList = new ArrayList<>(); - for (DevopsDeviceInfo devopsDeviceInfo : list) { - arrayList.add(devopsDeviceInfo.getGbsChannelNo()); - } - Integer count = tStrhEntityInfoKsService.lambdaQuery() - .in(TStrhEntityInfoKs::getCameraidx, arrayList) - .gt(TStrhEntityInfoKs::getCapturetime, maxTime).count(); - if (count > 0) { - int num = count / 1000; - Page page = new Page<>( 1, 1000); - for (int i = 0; i <= num; i++) { - page.setCurrent(i + 1); - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.in("cameraidx", arrayList); - wrapper.gt("capturetime", maxTime); - List records = tStrhEntityInfoKsService.page(page, wrapper).getRecords(); + // 获取设备信息列表 + List devopsDeviceInfoList = devopsDeviceInfoService.lambdaQuery() + .eq(DevopsDeviceInfo::getDeviceType, 1) + .list(); + List cameraIdxList = devopsDeviceInfoList.stream() + .map(DevopsDeviceInfo::getGbsChannelNo) + .collect(Collectors.toList()); + // 分页查询记录 + int pageSize = 1000; + int pageNum = 1; + int totalCount = tStrhEntityInfoKsService.lambdaQuery() + .in(TStrhEntityInfoKs::getCameraidx, cameraIdxList) + .gt(TStrhEntityInfoKs::getCapturetime, maxTime) + .count(); + if (totalCount > 0) { + int numPages = (int) Math.ceil((double) totalCount / pageSize); + for (int i = 0; i <= numPages; i++) { + Page page = new Page<>(pageNum++, pageSize); + QueryWrapper queryWrapperForPage = new QueryWrapper<>(); + queryWrapperForPage.in("cameraidx", cameraIdxList); + queryWrapperForPage.gt("capturetime", maxTime); + List records = tStrhEntityInfoKsService.page(page, queryWrapperForPage).getRecords(); for (TStrhEntityInfoKs tStrhEntityInfoKs : records) { TransitUserRecord transitUserRecord = new TransitUserRecord(); DevopsDeviceInfo devopsDeviceInfo = devopsDeviceInfoService.lambdaQuery().eq(DevopsDeviceInfo::getGbsChannelNo, tStrhEntityInfoKs.getCameraidx()).one(); @@ -88,10 +92,22 @@ public class UserAndVehicleRecordTask { transitUserRecord.setUserStandardPic(tStrhEntityInfoKs.getStoragepath()); transitUserRecord.setUserName(tStrhEntityInfoKs.getName()); transitUserRecord.setIdCard(tStrhEntityInfoKs.getIdentityid()); - if (tStrhEntityInfoKs.getCapturetime() != null) { - transitUserRecord.setPassTime(dateFormat.parse(tStrhEntityInfoKs.getCapturetime()).getTime() / 1000); - transitUserRecord.setPartitionField(dateFormat.parse(tStrhEntityInfoKs.getCapturetime())); + // 解析passtime字符串为Date对象 + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 假设passtime的格式是这种 + dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 假设passtime是以UTC存储的 + Date passtimeDate; + try { + passtimeDate = dateFormat.parse(tStrhEntityInfoKs.getCapturetime()); + } catch (ParseException e) { + e.printStackTrace(); + continue; } + Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai")); + calendar.setTime(passtimeDate); + calendar.add(Calendar.HOUR_OF_DAY, 8); + Date adjustedDate = calendar.getTime(); + transitUserRecord.setPassTime(adjustedDate.getTime() / 1000); + transitUserRecord.setPartitionField(adjustedDate); TransitUserRecord one1 = transitUserRecordService.lambdaQuery().eq(TransitUserRecord::getPersonPic, tStrhEntityInfoKs.getSmalimage()).one(); if (one1 == null) { boolean save = transitUserRecordService.save(transitUserRecord); diff --git a/src/main/java/com/ssf/mysqloracletest/task/VehicleRecordTask.java b/src/main/java/com/ssf/mysqloracletest/task/VehicleRecordTask.java index 8e9d84c..219b9d3 100644 --- a/src/main/java/com/ssf/mysqloracletest/task/VehicleRecordTask.java +++ b/src/main/java/com/ssf/mysqloracletest/task/VehicleRecordTask.java @@ -1,11 +1,13 @@ package com.ssf.mysqloracletest.task; -import cn.hutool.db.sql.Query; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.ssf.mysqloracletest.domain.*; +import com.ssf.mysqloracletest.domain.BoneVehicle; +import com.ssf.mysqloracletest.domain.DevopsDeviceInfo; +import com.ssf.mysqloracletest.domain.TMotorvehicle; +import com.ssf.mysqloracletest.domain.TransitVehicleRecord; import com.ssf.mysqloracletest.service.BoneVehicleService; import com.ssf.mysqloracletest.service.DevopsDeviceInfoService; import com.ssf.mysqloracletest.service.TMotorvehicleService; @@ -13,7 +15,6 @@ import com.ssf.mysqloracletest.service.TransitVehicleRecordService; import com.ssf.mysqloracletest.utils.ConfigParam; import com.ssf.mysqloracletest.utils.StringKit; import lombok.RequiredArgsConstructor; -import oracle.sql.TRANSDUMP; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; @@ -35,11 +36,9 @@ public class VehicleRecordTask { private final BoneVehicleService boneVehicleService; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); - String maxTime = "20240301000000"; - + String maxTimeStr = "20240301000000"; @Scheduled(initialDelay = 100, fixedDelay = 3000) public void setVehicleRecordTask() { - if (!"true".equals(ConfigParam.VehicleSwitch)) { return; } @@ -51,7 +50,12 @@ public class VehicleRecordTask { TransitVehicleRecord one = transitVehicleRecordService.getOne(transitVehicleRecordQueryWrapper); if (one != null){ Date partitionField = one.getPartitionField(); - maxTime = dateFormat.format(partitionField); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(partitionField); + calendar.add(Calendar.HOUR_OF_DAY, -8); // 减去八小时 + maxTimeStr = dateFormat.format(calendar.getTime()); + }else{ + maxTimeStr = "20240301000000"; } List list = devopsDeviceInfoService.lambdaQuery().eq(DevopsDeviceInfo::getDeviceType, 2).list(); ArrayList arrayList = new ArrayList<>(); @@ -60,7 +64,7 @@ public class VehicleRecordTask { } Integer count = tMotorvehicleService.lambdaQuery() .in(TMotorvehicle::getTollgateid, arrayList) - .gt(TMotorvehicle::getPasstime, maxTime).count(); + .gt(TMotorvehicle::getPasstime, maxTimeStr).count(); if (count > 0){ int num = count/1000; Page page = new Page<>(1,1000); @@ -68,7 +72,7 @@ public class VehicleRecordTask { page.setCurrent(i + 1); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.in("tollgateid",arrayList); - wrapper.gt("passtime",maxTime); + wrapper.gt("passtime",maxTimeStr); List records = tMotorvehicleService.page(page,wrapper).getRecords(); for (TMotorvehicle tMotorvehicle : records){ TransitVehicleRecord transitVehicleRecord = new TransitVehicleRecord(); @@ -87,22 +91,21 @@ public class VehicleRecordTask { transitVehicleRecord.setGlobalPic(tMotorvehicle.getStorageurl1()); transitVehicleRecord.setPlatePic(tMotorvehicle.getStorageurl2()); transitVehicleRecord.setDoorwayCode(tMotorvehicle.getTollgateid()); - // 解析passtime字符串为Date对象 - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); // 假设passtime的格式是这种 - dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 假设passtime是以UTC存储的 - Date passtimeDate; + //解析passtime字符串为Date对象 + //SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); // 假设passtime的格式是这种 + //dateFormat.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 假设passtime是以UTC存储的 try { - passtimeDate = dateFormat.parse(tMotorvehicle.getPasstime()); + Date passtimeDate = dateFormat.parse(tMotorvehicle.getPasstime()); + Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai")); + calendar.setTime(passtimeDate); + calendar.add(Calendar.HOUR_OF_DAY, 8); + Date adjustedDate = calendar.getTime(); + transitVehicleRecord.setPassTime(adjustedDate.getTime() / 1000); + transitVehicleRecord.setPartitionField(adjustedDate); } catch (ParseException e) { - e.printStackTrace(); + // 处理异常,记录日志或采取其他措施 continue; } - Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Asia/Shanghai")); - calendar.setTime(passtimeDate); - calendar.add(Calendar.HOUR_OF_DAY, 8); - Date adjustedDate = calendar.getTime(); - transitVehicleRecord.setPassTime(adjustedDate.getTime() / 1000); - transitVehicleRecord.setPartitionField(adjustedDate); TransitVehicleRecord vehicleRecord = transitVehicleRecordService.lambdaQuery().eq(TransitVehicleRecord::getGlobalPic, tMotorvehicle.getStorageurl1()).one(); if (vehicleRecord == null){ boolean save = transitVehicleRecordService.save(transitVehicleRecord); diff --git a/src/main/resources/mapper/BaseUserInfoMapper.xml b/src/main/resources/mapper/BaseUserInfoMapper.xml index dcc89be..9de91a7 100644 --- a/src/main/resources/mapper/BaseUserInfoMapper.xml +++ b/src/main/resources/mapper/BaseUserInfoMapper.xml @@ -42,7 +42,7 @@ - id,place_code,place_name, + SELECT id,place_code,place_name, grid_code,grid_name,building_code, building_name,unit_code,unit_name, home_code,home_name,user_name, @@ -53,7 +53,15 @@ caring_label,is_householder,householder_relation, user_home_rel,actual_population_flag,create_time, create_by,update_time,update_by, - is_active + is_active FROM base_user_info + + diff --git a/src/main/resources/mapper/GoalPersonMapper.xml b/src/main/resources/mapper/GoalPersonMapper.xml index 90d4b7b..f6c480d 100644 --- a/src/main/resources/mapper/GoalPersonMapper.xml +++ b/src/main/resources/mapper/GoalPersonMapper.xml @@ -40,12 +40,12 @@ diff --git a/src/main/resources/mapper/ModelSuspectedUserInfoJudgementMapper.xml b/src/main/resources/mapper/ModelSuspectedUserInfoJudgementMapper.xml new file mode 100644 index 0000000..b902f32 --- /dev/null +++ b/src/main/resources/mapper/ModelSuspectedUserInfoJudgementMapper.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + id,village_code,village_name, + user_name,dossier_code,idcard, + judgement_user,judgement_status,judgement_time + + diff --git a/src/main/resources/mapper/ModelSuspectedUserInfoMapper.xml b/src/main/resources/mapper/ModelSuspectedUserInfoMapper.xml new file mode 100644 index 0000000..b64675b --- /dev/null +++ b/src/main/resources/mapper/ModelSuspectedUserInfoMapper.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id,place_code,place_name, + dossier_code,user_name,user_pic, + id_card,user_phone,appear_times, + appear_days,task_start_time,task_end_time, + task_day,task_appear_times,task_appear_days, + is_entity,create_time,create_by, + update_time,update_by,is_active from model_suspected_user_info + + + + delete from model_suspected_user_info + + + + + + + insert into model_suspected_user_info + (place_code, + place_name, + user_name, + user_pic, + id_card, + appear_times, + appear_days, + task_start_time, + task_end_time, + task_day, + task_appear_times, + task_appear_days, + is_entity, + dossier_code + ) + values + (#{villageCode}, + #{villageName}, + #{userName}, + #{userPic}, + #{identityType}, + #{idCard}, + #{appearTimes}, + #{appearDays}, + #{taskStartTime}, + #{taskEndTime}, + #{taskDay}, + #{taskAppearTimes}, + #{taskAppearDays}, + #{isEntity}, + #{dossierCode}) + + + + update model_suspected_user_info + + place_code = #{placeCode}, + place_name = #{placeName}, + user_name = #{userName}, + user_pic = #{userPic}, + identity_type = #{identityType}, + id_card = #{idCard}, + dossier_code = #{dossierCode}, + appear_times = #{appearTimes}, + appear_days = #{appearDays}, + task_start_time = #{taskStartTime}, + task_end_time = #{taskEndTime}, + task_day = #{taskDay}, + task_appear_times = #{taskAppearTimes}, + task_appear_days = #{taskAppearDays}, + is_entity = #{isEntity}, + createby = #{createby}, + updatetime = #{updatetime}, + updateby = #{updateby}, + isactive = #{isactive}, + + where id = #{id} + + + diff --git a/src/main/resources/mapper/PoliceBacklogMapper.xml b/src/main/resources/mapper/PoliceBacklogMapper.xml new file mode 100644 index 0000000..be4cb8a --- /dev/null +++ b/src/main/resources/mapper/PoliceBacklogMapper.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +