suntianwu 3 лет назад
Родитель
Сommit
07adecb46a

+ 3 - 0
src/main/java/com/iden/bms/controller/PersonController.java

@@ -236,6 +236,9 @@ public class PersonController {
     public Result<Object> addPerson(HttpServletRequest request,@RequestHeader("token") String token,
                                    @RequestBody PersonVO vo){
         try {
+            if(StringUtils.isEmpty(vo.getType())){
+                return Result.error("类型不能为空!");
+            }
             UserLoginedConvertVO loginUser = WebPageUtils.getCurrentLoginedUser(request);
             this.personService.createPerson(vo,loginUser);
             return  Result.success("新增成功!");

+ 0 - 1
src/main/java/com/iden/bms/controller/WarningStaController.java

@@ -38,7 +38,6 @@ public class WarningStaController {
     private WarningStaService warningStaService;
 
 
-
     @GetMapping("/countCommunity")
     @ApiOperation(value = "当前小区个数查询")
     @ApiImplicitParams(value = {

+ 4 - 4
src/main/java/com/iden/bms/schedule/WarningSchedule.java

@@ -35,7 +35,7 @@ public class WarningSchedule {
     public void handleActualTimeWarning() {
         String key = RedisKeyConstant.HANDLE_KEYNOTE_WARNING;
         String requestId = UUID.randomUUID().toString();
-        boolean result = redisUtil.tryLock(key,requestId,5 * 60);
+        boolean result = redisUtil.tryLock(key,requestId,10 * 60);
         try {
             if (result) {
                 warningService.handleActualTimeWarning();
@@ -48,14 +48,14 @@ public class WarningSchedule {
     }
 
     /**
-     * 每天处理陌生人预警、常驻人员预警、昼伏夜出预警, 凌晨0点10分开始处理昨天数据
+     *  5分钟处理一次,处理前一个月的、按天的陌生人预警、常驻人员预警、昼伏夜出预警数据
      */
     @Async
-    @Scheduled(cron = "0 10 0 * * ?")
+    @Scheduled(cron = "50 0/5 * * * ?")
     public void handleDayWarning() {
         String key = RedisKeyConstant.HANDLE_DAY_WARNING;
         String requestId = UUID.randomUUID().toString();
-        boolean result = redisUtil.tryLock(key,requestId,5 * 60);
+        boolean result = redisUtil.tryLock(key,requestId,10 * 60);
         try {
             if (result) {
                 warningService.handleDayWarning();

+ 6 - 0
src/main/java/com/iden/bms/service/FaceIdenService.java

@@ -87,6 +87,9 @@ public class FaceIdenService {
 
                 for (int i = 0; i < idenPersonList.size(); i++) {
                     IdenPerson idenPerson = idenPersonList.get(i);
+                    if(idenPerson.getUid() == null || StringUtils.isEmpty(idenPerson.getFeatPtr())){
+                        continue;
+                    }
                     FaceModel faceModel = new FaceModel();
                     faceModel.setPersonId(idenPerson.getUid().intValue());
                     faceModel.setName(String.valueOf(idenPerson.getUid()));
@@ -104,6 +107,9 @@ public class FaceIdenService {
 
                 for (int i = 0; i < idenPersonStrangerList.size(); i++) {
                     IdenPersonStranger idenPersonStranger = idenPersonStrangerList.get(i);
+                    if(idenPersonStranger.getUid() == null || StringUtils.isEmpty(idenPersonStranger.getFeatPtr())){
+                        continue;
+                    }
                     FaceModel faceModel = new FaceModel();
                     faceModel.setPersonId(idenPersonStranger.getUid().intValue());
                     faceModel.setName(String.valueOf(idenPersonStranger.getUid()));

+ 8 - 4
src/main/java/com/iden/bms/service/TraceService.java

@@ -88,12 +88,16 @@ public class TraceService {
                     throw new BDException("图像文件必须是图片格式!");
                 }
                 //验证文件名是否合格
-                if (fileName.contains("_")) {
-                    throw new BDException("图像文件名称不能有下划线!");
+                if (fileName.contains("__")) {
+                    throw new BDException("图像文件名称不能有二个连续下划线!");
                 }
                 String saveFileName = DateUtils.getCurrYyyyMMddHHmmssDate() + "_" + UUID.randomUUID().toString()  + fileName.substring(fileName.lastIndexOf("."));
-                String picFullFileName = idenRoot + "data/final/trace/" + saveFileName;
-                FileOutputStream fos = new FileOutputStream(picFullFileName);
+                File saveDirFile = new File(idenRoot + "data/final/trace");
+                if(!saveDirFile.exists()){
+                    saveDirFile.mkdirs();
+                }
+                File picFullFile =  new File(saveDirFile.getAbsolutePath(), saveFileName);
+                FileOutputStream fos = new FileOutputStream(picFullFile);
                 fos.write(file.getBytes());
                 imageUrl = fileUrl + "trace/" + saveFileName;
             } else {

+ 270 - 190
src/main/java/com/iden/bms/service/WarningService.java

@@ -4,6 +4,8 @@ package com.iden.bms.service;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.iden.common.cache.RedisKeyConstant;
+import com.iden.common.cache.RedisUtil;
 import com.iden.common.entity.*;
 import com.iden.common.enums.*;
 import com.iden.common.exception.BDException;
@@ -12,6 +14,7 @@ import com.iden.common.exception.BDException;
 import com.iden.common.service.*;
 import com.iden.common.util.DateUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -52,9 +55,16 @@ public class WarningService {
     private IdenWarningRuleResidentService idenWarningRuleResidentService;
     @Resource
     private IdenWarningRuleEveningCommingService idenWarningRuleEveningCommingService;
-
+    @Resource
+    private RedisUtil redisUtil;
     @Resource
     private IdenPersonService idenPersonService;
+    @Resource
+    private IdenPersonStrangerService idenPersonStrangerService;
+
+    @Value("${sta.before.days:#{null}}")
+    private String staBeforeDays;
+
     /**
      * 实时处理轨迹、重点人员预警等
      * @return
@@ -91,158 +101,6 @@ public class WarningService {
 
     }
 
-    /**
-     * 每天处理陌生人预警、常驻人员预警、昼伏夜出预警, 凌晨0点10分开始处理昨天数据
-     * @return
-     */
-    public void handleDayWarning() throws BDException {
-        //常住人员识别预警
-        handleResident();
-
-        //查询昨天的人脸图像数据
-        QueryWrapper<IdenFaceImage> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(IdenFaceImage::getDataDate, DateUtils.getYestodayYyyyMMddDate()).orderByDesc(IdenFaceImage::getPhotographTime);
-        List<IdenFaceImage> idenFaceImageList = idenFaceImageService.list(queryWrapper);
-        if (CollUtil.isEmpty(idenFaceImageList)) {
-            return;
-        }
-
-        for (IdenFaceImage idenFaceImage : idenFaceImageList) {
-            String type = idenFaceImage.getType();
-
-            if (StringUtils.isNotEmpty(type) && type.contains(PersonTypeEnum.STRANGER.getValue())) { //陌生人员
-                handleStranger(idenFaceImage);//陌生人员识别预警
-            }
-
-            handleEveningComming(idenFaceImage);//昼伏夜出人员识别预警
-        }
-
-        //按小区统昨天的数据
-        staCommunity();
-    }
-
-    //陌生人员识别预警
-    private void handleStranger(IdenFaceImage idenFaceImage) {
-        Long communityId = idenFaceImage.getCommunityId();
-        if (communityId == null) {
-            return;
-        }
-
-        //查询此人1月内在该小区出现天次
-        QueryWrapper<IdenFaceImage> queryWrapper = new QueryWrapper<>();
-        queryWrapper.select("distinct data_date dataDate ") ;
-        queryWrapper.lambda().eq(IdenFaceImage::getUid,idenFaceImage.getUid()).eq(IdenFaceImage::getCommunityId,communityId)
-                .orderByAsc(IdenFaceImage::getDataDate);
-        queryWrapper.apply(" data_date >= date_format(DATE_SUB(CURDATE(), INTERVAL 30 DAY),'%Y%m%d')  and  data_date <= date_format(DATE_SUB(CURDATE(), INTERVAL 1 DAY),'%Y%m%d')");
-
-        int strangerDayFrequency = 0;
-        //1月内7天出现情况
-        List<IdenFaceImage> listDataDate =  this.idenFaceImageService.list(queryWrapper);
-        if(listDataDate != null){
-            strangerDayFrequency = listDataDate.size();
-        }
-
-        QueryWrapper<IdenWarningRuleStranger> queryWrapper3 = new QueryWrapper<>();
-        IdenWarningRuleStranger idenWarningRuleStranger = idenWarningRuleStrangerService.getOne(queryWrapper3);
-        int strangerFrequencyRule = 15;
-        int strangerDays = 7;
-        if (idenWarningRuleStranger != null){
-            strangerFrequencyRule = idenWarningRuleStranger.getStrangerFrequency();
-            strangerDays = idenWarningRuleStranger.getStrangerDays();
-        }
-        String isContinue = getIsContinue(listDataDate,strangerDays);
-
-        boolean isWarning = false;
-        String strangerType = null;
-
-        //此人1月出现频次少于15次及7内天每天未连续出现,视为陌生人
-        if(strangerDayFrequency < strangerFrequencyRule &&  IsContinueEnum.NO.getValue().equals(isContinue)) {
-            isWarning = true;
-            strangerType = StrangerTypeEnum.STRANGER.getValue();
-            //此人出现频次1月内大于15天次或连续7天每天都出现,标注为疑似未登记住户
-        } else if(strangerDayFrequency >= strangerFrequencyRule ||  IsContinueEnum.YES.getValue().equals(isContinue)) {
-            isWarning = true;
-            strangerType = StrangerTypeEnum.NO_REGISTER.getValue();
-        }
-        if(isWarning) {
-            //查询是不是已经有预警人员数据了
-            QueryWrapper<IdenWarningPerson> queryWrapper0 = new QueryWrapper<>();
-            queryWrapper0.lambda()
-                    .eq(IdenWarningPerson::getCommunityId,communityId)
-                    .eq(IdenWarningPerson::getUid,idenFaceImage.getUid())
-                    .eq(IdenWarningPerson::getType,WarningTypeEnum.STRANGER.getValue());
-            IdenWarningPerson idenWarningPerson = this.idenWarningPersonService.getOne(queryWrapper0);
-
-            if (idenWarningPerson != null) {
-                idenWarningPerson.setAppearFrequency(strangerDayFrequency);
-                idenWarningPerson.setStrangerType(strangerType);
-                idenWarningPerson.setHandleStatus(HandleWarningStatusEnum.NO_HANDLE.getValue());
-                idenWarningPerson.setModifyTime(new Date());
-                this.idenWarningPersonService.updateById(idenWarningPerson);
-            } else {
-                idenWarningPerson = new IdenWarningPerson();
-                idenWarningPerson.setStrangerType(strangerType);
-                idenWarningPerson.setUid(idenFaceImage.getUid());
-                idenWarningPerson.setPersonId(idenFaceImage.getPersonId());
-                idenWarningPerson.setDataDate(idenFaceImage.getDataDate());
-                idenWarningPerson.setImage(idenFaceImage.getImage());
-                idenWarningPerson.setFeatPtr(idenFaceImage.getFeatPtr());
-
-                Long cameraId = idenFaceImage.getCameraId();
-                if(cameraId != null) {
-                    IdenCamera idenCamera = this.idenCameraService.getById(cameraId);
-                    idenWarningPerson.setDistrict(idenCamera.getDistrict());
-                    idenWarningPerson.setSubdistrict(idenCamera.getSubdistrict());
-                }
-
-                IdenCommunity idenCommunity = this.idenCommunityService.getById(communityId);
-                if (idenCommunity != null) {
-                    idenWarningPerson.setCommunityId(communityId);
-                    idenWarningPerson.setCommunityCode(idenCommunity.getCode());
-                    idenWarningPerson.setCommunityName(idenCommunity.getName());
-                }
-                idenWarningPerson.setAppearFrequency(strangerDayFrequency);
-                idenWarningPerson.setIsContinue(isContinue);
-
-                //查询此人在该小区最早出现时间
-                QueryWrapper<IdenFaceImage> queryWrapper1 = new QueryWrapper<>();
-                queryWrapper1.lambda().eq(IdenFaceImage::getCommunityId,communityId)
-                        .orderByAsc(IdenFaceImage::getPhotographTime);
-                queryWrapper1.last("limit 1");
-                IdenFaceImage idenFaceImage1 = this.idenFaceImageService.getOne(queryWrapper1);
-                if(idenFaceImage1 != null){
-                    idenWarningPerson.setEarliestAppearTime(idenFaceImage1.getPhotographTime());
-                }
-
-                idenWarningPerson.setType(WarningTypeEnum.STRANGER.getValue());
-                idenWarningPerson.setCreateTime(idenFaceImage.getCreateTime());
-                this.idenWarningPersonService.save(idenWarningPerson);
-
-            }
-
-            IdenWarningPersonHis idenWarningPersonHis = new IdenWarningPersonHis();
-            BeanUtil.copyProperties(idenWarningPerson,idenWarningPersonHis,"id");
-            idenWarningPersonHisService.save(idenWarningPersonHis);
-
-            IdenWarningEvent idenWarningEvent = new IdenWarningEvent();
-            idenWarningEvent.setWarningPersonId(idenWarningPerson.getId());
-            idenWarningEvent.setUid(idenWarningPerson.getUid());
-            idenWarningEvent.setPersonId(idenWarningPerson.getPersonId());
-            idenWarningEvent.setDataTime(idenFaceImage.getPhotographTime());
-            idenWarningEvent.setImage(idenFaceImage.getImage());
-            idenWarningEvent.setCommunityId(idenWarningPerson.getCommunityId());
-            idenWarningEvent.setCommunityCode(idenWarningPerson.getCommunityCode());
-            idenWarningEvent.setCommunityName(idenWarningPerson.getCommunityName());
-            idenWarningEvent.setDistrict(idenWarningPerson.getDistrict());
-            idenWarningEvent.setSubdistrict(idenWarningPerson.getSubdistrict());
-            idenWarningEvent.setAppearTime(idenFaceImage.getPhotographTime());
-            idenWarningEvent.setType(WarningTypeEnum.STRANGER.getValue());
-            idenWarningEvent.setCreateTime(idenFaceImage.getCreateTime());
-            this.idenWarningEventService.save(idenWarningEvent);
-        }
-
-    }
-
     //重点人员识别预警
     private void handleKeynote(IdenFaceImage idenFaceImage){
         Long communityId = idenFaceImage.getCommunityId();
@@ -253,7 +111,7 @@ public class WarningService {
         QueryWrapper<IdenWarningPerson> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda()
                 .eq(IdenWarningPerson::getCommunityId,communityId)
-                .eq(IdenWarningPerson::getPersonId,idenFaceImage.getPersonId())
+                .eq(IdenWarningPerson::getUid,idenFaceImage.getUid())
                 .eq(IdenWarningPerson::getType,WarningTypeEnum.KEYNOTE.getValue());
         IdenWarningPerson idenWarningPerson = this.idenWarningPersonService.getOne(queryWrapper);
         if (idenWarningPerson != null) {
@@ -285,7 +143,7 @@ public class WarningService {
 
             //查询此人在该小区最早出现时间
             QueryWrapper<IdenFaceImage> queryWrapper1 = new QueryWrapper<>();
-            queryWrapper1.lambda().eq(IdenFaceImage::getCommunityId,communityId)
+            queryWrapper1.lambda().eq(IdenFaceImage::getCommunityId,communityId).eq(IdenFaceImage::getUid,idenFaceImage.getUid())
                     .orderByAsc(IdenFaceImage::getPhotographTime);
             queryWrapper1.last("limit 1");
             IdenFaceImage idenFaceImage1 = this.idenFaceImageService.getOne(queryWrapper1);
@@ -301,12 +159,13 @@ public class WarningService {
                     idenWarningPerson.setPersonName(idenPerson.getName());
                 }
             }
-            idenWarningPerson.setCreateTime(idenFaceImage.getCreateTime());
+            idenWarningPerson.setCreateTime(new Date());
             this.idenWarningPersonService.save(idenWarningPerson);
 
         }
         IdenWarningPersonHis idenWarningPersonHis = new IdenWarningPersonHis();
         BeanUtil.copyProperties(idenWarningPerson,idenWarningPersonHis,"id");
+        idenWarningPersonHis.setCreateTime(new Date());
         idenWarningPersonHisService.save(idenWarningPersonHis);
 
         IdenWarningEvent idenWarningEvent = new IdenWarningEvent();
@@ -323,13 +182,183 @@ public class WarningService {
         idenWarningEvent.setAppearTime(idenFaceImage.getPhotographTime());
         idenWarningEvent.setType(WarningTypeEnum.KEYNOTE.getValue());
         idenWarningEvent.setPersonId(idenFaceImage.getPersonId());
-        idenWarningEvent.setCreateTime(idenFaceImage.getCreateTime());
+        idenWarningEvent.setCreateTime(new Date());
         this.idenWarningEventService.save(idenWarningEvent);
 
     }
 
+    /**
+     * 5分钟处理一次,处理前一个月的、按天的陌生人预警、常驻人员预警、昼伏夜出预警数据
+     * @return
+     */
+    public void handleDayWarning() throws BDException {
+        int staBeforeDayNums = Integer.parseInt(staBeforeDays);
+
+        handleResident();//常住人员识别预警
+        handleStranger();//陌生人员识别预警
+        handleEveningComming();//昼伏夜出人员识别预警
+
+        staCommunity(staBeforeDayNums);//按小区统n天前的数据
+    }
+
+    //陌生人员识别预警
+    private void handleStranger() {
+        //先看今天是否运行过程序,若运行过,则返回
+        String strangerDate = (String)redisUtil.hget(RedisKeyConstant.HANDLE_WARNING_DATE,"stranger");
+        if(StringUtils.isNotEmpty(strangerDate) && strangerDate.equals(DateUtils.getCurrYyyyMMddDate())) {
+            return;
+        }
+        redisUtil.hset(RedisKeyConstant.HANDLE_WARNING_DATE,"stranger",DateUtils.getCurrYyyyMMddDate());
+
+        List<IdenCommunity>  idenCommunityList = this.idenCommunityService.list();
+        if(CollUtil.isEmpty(idenCommunityList)){
+            return;
+        }
+        for (IdenCommunity idenCommunity : idenCommunityList) {
+            Long communityId = idenCommunity.getId();
+            //遍历所有陌生人
+            List<IdenPersonStranger>  idenPersonStrangerList = this.idenPersonStrangerService.list();
+            if(CollUtil.isEmpty(idenPersonStrangerList)){
+                return;
+            }
+
+            for (IdenPersonStranger idenPersonStranger : idenPersonStrangerList) {
+
+                //查询此人1月内在该小区出现天次
+                QueryWrapper<IdenFaceImage> queryWrapper = new QueryWrapper<>();
+                queryWrapper.select("distinct data_date dataDate ") ;
+                queryWrapper.lambda().eq(IdenFaceImage::getUid,idenPersonStranger.getUid()).eq(IdenFaceImage::getCommunityId,communityId)
+                        .orderByAsc(IdenFaceImage::getDataDate);
+                queryWrapper.apply(" data_date >= date_format(DATE_SUB(CURDATE(), INTERVAL 30 DAY),'%Y%m%d')  and  data_date <= date_format(DATE_SUB(CURDATE(), INTERVAL 1 DAY),'%Y%m%d')");
+
+                int strangerDayFrequency = 0;
+                //1月内7天出现情况
+                List<IdenFaceImage> listDataDate =  this.idenFaceImageService.list(queryWrapper);
+                if(listDataDate == null){
+                    continue;
+                } else {
+                    strangerDayFrequency = listDataDate.size();
+                }
+
+                QueryWrapper<IdenWarningRuleStranger> queryWrapper3 = new QueryWrapper<>();
+                IdenWarningRuleStranger idenWarningRuleStranger = idenWarningRuleStrangerService.getOne(queryWrapper3);
+                int strangerFrequencyRule = 15;
+                int strangerDays = 7;
+                if (idenWarningRuleStranger != null){
+                    strangerFrequencyRule = idenWarningRuleStranger.getStrangerFrequency();
+                    strangerDays = idenWarningRuleStranger.getStrangerDays();
+                }
+                String isContinue = getIsContinue(listDataDate,strangerDays);
+
+                boolean isWarning = false;
+                String strangerType = null;
+
+                //此人1月出现频次少于15次及7内天每天未连续出现,视为陌生人
+                if(strangerDayFrequency < strangerFrequencyRule &&  IsContinueEnum.NO.getValue().equals(isContinue)) {
+                    isWarning = true;
+                    strangerType = StrangerTypeEnum.STRANGER.getValue();
+                    //此人出现频次1月内大于15天次或连续7天每天都出现,标注为疑似未登记住户
+                } else if(strangerDayFrequency >= strangerFrequencyRule ||  IsContinueEnum.YES.getValue().equals(isContinue)) {
+                    isWarning = true;
+                    strangerType = StrangerTypeEnum.NO_REGISTER.getValue();
+                }
+                if(isWarning) {
+                    //查询是不是已经有预警人员数据了
+                    QueryWrapper<IdenWarningPerson> queryWrapper0 = new QueryWrapper<>();
+                    queryWrapper0.lambda()
+                            .eq(IdenWarningPerson::getCommunityId,communityId)
+                            .eq(IdenWarningPerson::getUid,idenPersonStranger.getUid())
+                            .eq(IdenWarningPerson::getType,WarningTypeEnum.STRANGER.getValue());
+                    IdenWarningPerson idenWarningPerson = this.idenWarningPersonService.getOne(queryWrapper0);
+
+                    if (idenWarningPerson != null) {
+                        idenWarningPerson.setAppearFrequency(strangerDayFrequency);
+                        idenWarningPerson.setStrangerType(strangerType);
+                        idenWarningPerson.setHandleStatus(HandleWarningStatusEnum.NO_HANDLE.getValue());
+                        idenWarningPerson.setModifyTime(new Date());
+                        this.idenWarningPersonService.updateById(idenWarningPerson);
+                    } else {
+                        idenWarningPerson = new IdenWarningPerson();
+                        idenWarningPerson.setType(WarningTypeEnum.STRANGER.getValue());
+                        idenWarningPerson.setStrangerType(strangerType);
+                        idenWarningPerson.setUid(idenPersonStranger.getUid());
+                        idenWarningPerson.setDataDate(DateUtils.getYestodayYyyyMMddDate());
+                        idenWarningPerson.setImage(idenPersonStranger.getImage());
+                        idenWarningPerson.setFeatPtr(idenPersonStranger.getFeatPtr());
+
+                        idenWarningPerson.setCommunityId(communityId);
+                        idenWarningPerson.setCommunityCode(idenCommunity.getCode());
+                        idenWarningPerson.setCommunityName(idenCommunity.getName());
+                        idenWarningPerson.setSubdistrict(idenCommunity.getSubdistrict());
+                        idenWarningPerson.setDistrict(idenCommunity.getDistrict());
+
+                        idenWarningPerson.setAppearFrequency(strangerDayFrequency);
+                        idenWarningPerson.setIsContinue(isContinue);
+
+                        //查询此人在该小区最早出现时间
+                        QueryWrapper<IdenFaceImage> queryWrapper1 = new QueryWrapper<>();
+                        queryWrapper1.lambda().eq(IdenFaceImage::getCommunityId,communityId).eq(IdenFaceImage::getUid,idenPersonStranger.getUid())
+                                .orderByAsc(IdenFaceImage::getPhotographTime);
+                        queryWrapper1.last("limit 1");
+
+                        IdenFaceImage idenFaceImage1 = this.idenFaceImageService.getOne(queryWrapper1);
+                        if(idenFaceImage1 != null){
+                            idenWarningPerson.setEarliestAppearTime(idenFaceImage1.getPhotographTime());
+                        }
+
+                        idenWarningPerson.setCreateTime(new Date());
+                        this.idenWarningPersonService.save(idenWarningPerson);
+
+                    }
+
+                    IdenWarningPersonHis idenWarningPersonHis = new IdenWarningPersonHis();
+                    BeanUtil.copyProperties(idenWarningPerson,idenWarningPersonHis,"id");
+                    idenWarningPersonHis.setCreateTime(new Date());
+                    idenWarningPersonHisService.save(idenWarningPersonHis);
+
+                    IdenWarningEvent idenWarningEvent = new IdenWarningEvent();
+                    idenWarningEvent.setWarningPersonId(idenWarningPerson.getId());
+                    idenWarningEvent.setUid(idenWarningPerson.getUid());
+                    idenWarningEvent.setPersonId(idenWarningPerson.getPersonId());
+
+                    //查询此人在该小区最晚出现时间
+                    QueryWrapper<IdenFaceImage> queryWrapper2 = new QueryWrapper<>();
+                    queryWrapper2.lambda().eq(IdenFaceImage::getCommunityId,communityId).eq(IdenFaceImage::getUid,idenPersonStranger.getUid())
+                            .orderByDesc(IdenFaceImage::getPhotographTime);
+                    queryWrapper2.last("limit 1");
+                    IdenFaceImage idenFaceImage2 = this.idenFaceImageService.getOne(queryWrapper2);
+                    if(idenFaceImage2 != null){
+                        idenWarningEvent.setDataTime(idenFaceImage2.getPhotographTime());
+                        idenWarningEvent.setImage(idenFaceImage2.getImage());
+                        idenWarningEvent.setAppearTime(idenFaceImage2.getPhotographTime());
+                    }
+
+                    idenWarningEvent.setCommunityId(idenWarningPerson.getCommunityId());
+                    idenWarningEvent.setCommunityCode(idenWarningPerson.getCommunityCode());
+                    idenWarningEvent.setCommunityName(idenWarningPerson.getCommunityName());
+                    idenWarningEvent.setDistrict(idenWarningPerson.getDistrict());
+                    idenWarningEvent.setSubdistrict(idenWarningPerson.getSubdistrict());
+                    idenWarningEvent.setType(WarningTypeEnum.STRANGER.getValue());
+                    idenWarningEvent.setCreateTime(new Date());
+                    this.idenWarningEventService.save(idenWarningEvent);
+                }
+
+            }
+
+        }
+
+    }
+
+
     //常住人员识别预警,小区人脸库内7天内未被命中人员或标记为独居老人或老人带小孩的7天内未被命中人员视为预警对象
     private void handleResident() {
+        //先看今天是否运行过程序,若运行过,则返回
+        String residentDate = (String)redisUtil.hget(RedisKeyConstant.HANDLE_WARNING_DATE,"resident");
+        if(StringUtils.isNotEmpty(residentDate) && residentDate.equals(DateUtils.getCurrYyyyMMddDate())) {
+            return;
+        }
+        redisUtil.hset(RedisKeyConstant.HANDLE_WARNING_DATE,"resident",DateUtils.getCurrYyyyMMddDate());
+
         //查询全部小区人员
         QueryWrapper<IdenPerson> queryWrapper = new QueryWrapper<>();
         queryWrapper.lambda().like(IdenPerson::getType, PersonTypeEnum.COMMUNITY.getValue());
@@ -342,7 +371,7 @@ public class WarningService {
             QueryWrapper<IdenFaceImage> queryWrapper1 = new QueryWrapper<>();
             queryWrapper1.lambda().eq(IdenFaceImage::getPersonId, idenPerson.getId())
                     .orderByDesc(IdenFaceImage::getPhotographTime);
-            queryWrapper1.last("limit 1");
+            queryWrapper1.last("limit 1"); //查询最后一次拍照
 
             IdenFaceImage idenFaceImage = this.idenFaceImageService.getOne(queryWrapper1);
 
@@ -357,6 +386,7 @@ public class WarningService {
                 idenFaceImage = new IdenFaceImage();
                 idenFaceImage.setPhotographTime(DateUtils.getBeforeDates(100)); //设定一个假时间
             }
+            //最后一次拍照时间和昨天的相差几天
             int continueDisappearDays = DateUtils.getDaysGap(idenFaceImage.getPhotographTime(), new Date()) - 1;
             //超过7天没出现, 满足预警
             if ( continueDisappearDays > continueDisappearDaysRule ) {
@@ -396,11 +426,13 @@ public class WarningService {
                     idenWarningPerson.setLatestAppearTime(idenFaceImage.getPhotographTime());
 
                     idenWarningPerson.setType(WarningTypeEnum.RESIDENT.getValue());
-                    idenWarningPerson.setCreateTime(DateUtils.strToDate(DateUtils.getYestodayYyyyMMddDate(),"yyyyMMdd"));
+                    idenWarningPerson.setCreateTime(new Date());
                     this.idenWarningPersonService.save(idenWarningPerson);
                 }
+
                 IdenWarningPersonHis idenWarningPersonHis = new IdenWarningPersonHis();
                 BeanUtil.copyProperties(idenWarningPerson,idenWarningPersonHis,"id");
+                idenWarningPersonHis.setCreateTime(new Date());
                 idenWarningPersonHisService.save(idenWarningPersonHis);
 
                 IdenWarningEvent idenWarningEvent = new IdenWarningEvent();
@@ -417,7 +449,7 @@ public class WarningService {
                 idenWarningEvent.setSubdistrict(idenWarningPerson.getSubdistrict());
                 idenWarningEvent.setAppearTime(idenWarningPerson.getLatestAppearTime());
                 idenWarningEvent.setType(WarningTypeEnum.RESIDENT.getValue());
-                idenWarningEvent.setCreateTime(idenWarningPerson.getCreateTime());
+                idenWarningEvent.setCreateTime(new Date());
                 this.idenWarningEventService.save(idenWarningEvent);
             }
         }
@@ -425,9 +457,16 @@ public class WarningService {
     }
 
     //昼伏夜出人员识别预警
-    private void handleEveningComming(IdenFaceImage idenFaceImage) {
-        Long communityId = idenFaceImage.getCommunityId();
-        if (communityId == null) {
+    private void handleEveningComming() {
+        //先看今天是否运行过程序,若运行过,则返回
+        String eveningCommingDate = (String)redisUtil.hget(RedisKeyConstant.HANDLE_WARNING_DATE,"eveningComming");
+        if(StringUtils.isNotEmpty(eveningCommingDate) && eveningCommingDate.equals(DateUtils.getCurrYyyyMMddDate())) {
+            return;
+        }
+        redisUtil.hset(RedisKeyConstant.HANDLE_WARNING_DATE,"eveningComming",DateUtils.getCurrYyyyMMddDate());
+
+        List<IdenCommunity>  idenCommunityList = this.idenCommunityService.list();
+        if(CollUtil.isEmpty(idenCommunityList)){
             return;
         }
 
@@ -446,19 +485,55 @@ public class WarningService {
         idenWarningRuleEveningComming.setContinueDays(7);
         idenWarningRuleEveningCommings.add(idenWarningRuleEveningComming);
 
+        //查询数据库配置,若设置了值,则替换默认
         QueryWrapper<IdenWarningRuleEveningComming> queryWrapper3 = new QueryWrapper<>();
         List<IdenWarningRuleEveningComming> idenWarningRuleEveningCommingsDb = idenWarningRuleEveningCommingService.list(queryWrapper3);
         if (CollUtil.isNotEmpty(idenWarningRuleEveningCommingsDb)) {
             idenWarningRuleEveningCommings = idenWarningRuleEveningCommingsDb;
         }
 
+        //持续多少天
         int continueDays = idenWarningRuleEveningCommings.get(0).getContinueDays();
+        //n天前
         String beforeDate = DateUtils.formatToDateStr(DateUtils.getBeforeDates(continueDays + 1),"yyyyMMdd");
+
         String yestoday = DateUtils.getYestodayYyyyMMddDate();
+
+        for (IdenCommunity idenCommunity : idenCommunityList) {
+
+            //查询全部小区人员
+            QueryWrapper<IdenPerson> queryWrapper = new QueryWrapper<>();
+            queryWrapper.lambda().like(IdenPerson::getType, PersonTypeEnum.COMMUNITY.getValue());
+            List<IdenPerson> listPerson = this.idenPersonService.list(queryWrapper);
+            if(CollUtil.isNotEmpty(listPerson)){
+                //遍历小区人员
+                for (IdenPerson idenPerson :listPerson ) {
+                    handleEveningCommingSub(continueDays,beforeDate,yestoday,idenPerson.getUid(),
+                            idenCommunity,idenWarningRuleEveningCommings,idenPerson.getId(),idenPerson.getImage(),idenPerson.getFeatPtr());
+                }
+            }
+
+            //遍历所有陌生人
+            List<IdenPersonStranger>  idenPersonStrangerList = this.idenPersonStrangerService.list();
+            if(CollUtil.isNotEmpty(idenPersonStrangerList)){
+                for (IdenPersonStranger idenPersonStranger : idenPersonStrangerList ) {
+                    handleEveningCommingSub(continueDays,beforeDate,yestoday,idenPersonStranger.getUid(),
+                            idenCommunity,idenWarningRuleEveningCommings,null,idenPersonStranger.getImage(),idenPersonStranger.getFeatPtr());
+                }
+            }
+
+        }
+
+    }
+
+    private void handleEveningCommingSub(int continueDays,String beforeDate,String yestoday,Long uid,
+                                         IdenCommunity idenCommunity, List<IdenWarningRuleEveningComming>  idenWarningRuleEveningCommings,
+                                         Long personId,String image,String featPtr){
+        Long communityId = idenCommunity.getId();
         //查询此人长期晚上某时段出现(时间期间可设)且白天未出现,视为昼伏夜出人员,进行预警
         QueryWrapper<IdenFaceImage> queryWrapper = new QueryWrapper<>();
         queryWrapper.select("distinct data_date dataDate ") ;
-        queryWrapper.lambda().eq(IdenFaceImage::getUid,idenFaceImage.getUid())
+        queryWrapper.lambda().eq(IdenFaceImage::getUid,uid)
                 .eq(IdenFaceImage::getCommunityId,communityId)
                 .ge(IdenFaceImage::getDataDate,beforeDate)
                 .le(IdenFaceImage::getDataDate,yestoday);
@@ -479,7 +554,9 @@ public class WarningService {
 
         int count = 0;
         List<IdenFaceImage> idenFaceImageList = this.idenFaceImageService.list(queryWrapper);
-        if(idenFaceImageList != null){
+        if(idenFaceImageList == null){
+           return;
+        } else {
             count = idenFaceImageList.size();
         }
         if (count >= continueDays) { //连续超过7天,满足预警
@@ -488,7 +565,7 @@ public class WarningService {
             QueryWrapper<IdenWarningPerson> queryWrapper0 = new QueryWrapper<>();
             queryWrapper0.lambda()
                     .eq(IdenWarningPerson::getCommunityId,communityId)
-                    .eq(IdenWarningPerson::getUid,idenFaceImage.getUid())
+                    .eq(IdenWarningPerson::getUid,uid)
                     .eq(IdenWarningPerson::getType,WarningTypeEnum.EVENING_COMMING.getValue());
             IdenWarningPerson idenWarningPerson = this.idenWarningPersonService.getOne(queryWrapper0);
             if (idenWarningPerson != null) {
@@ -498,36 +575,31 @@ public class WarningService {
                 this.idenWarningPersonService.updateById(idenWarningPerson);
 
             } else {
-                 idenWarningPerson = new IdenWarningPerson();
-                idenWarningPerson.setUid(idenFaceImage.getUid());
-                idenWarningPerson.setPersonId(idenFaceImage.getPersonId());
+                idenWarningPerson = new IdenWarningPerson();
+                idenWarningPerson.setUid(uid);
+                idenWarningPerson.setPersonId(personId);
                 if(idenWarningPerson.getPersonId() != null){
                     IdenPerson idenPerson = this.idenPersonService.getById(idenWarningPerson.getPersonId());
                     if(idenPerson != null){
                         idenWarningPerson.setPersonName(idenPerson.getName());
                     }
                 }
-                idenWarningPerson.setDataDate(idenFaceImage.getDataDate());
-                idenWarningPerson.setImage(idenFaceImage.getImage());
-                idenWarningPerson.setFeatPtr(idenFaceImage.getFeatPtr());
-                Long cameraId = idenFaceImage.getCameraId();
-                if(cameraId != null) {
-                    IdenCamera idenCamera = this.idenCameraService.getById(cameraId);
-                    idenWarningPerson.setDistrict(idenCamera.getDistrict());
-                    idenWarningPerson.setSubdistrict(idenCamera.getSubdistrict());
-                }
+                idenWarningPerson.setDataDate(DateUtils.getYestodayYyyyMMddDate());
+                idenWarningPerson.setImage(image);
+                idenWarningPerson.setFeatPtr(featPtr);
+
+                idenWarningPerson.setDistrict(idenCommunity.getDistrict());
+                idenWarningPerson.setSubdistrict(idenCommunity.getSubdistrict());
+
+                idenWarningPerson.setCommunityId(communityId);
+                idenWarningPerson.setCommunityCode(idenCommunity.getCode());
+                idenWarningPerson.setCommunityName(idenCommunity.getName());
 
-                IdenCommunity idenCommunity = this.idenCommunityService.getById(communityId);
-                if (idenCommunity != null) {
-                    idenWarningPerson.setCommunityId(communityId);
-                    idenWarningPerson.setCommunityCode(idenCommunity.getCode());
-                    idenWarningPerson.setCommunityName(idenCommunity.getName());
-                }
                 idenWarningPerson.setAppearFrequency(count);
 
                 //查询此人在该小区最早出现时间
                 QueryWrapper<IdenFaceImage> queryWrapper1 = new QueryWrapper<>();
-                queryWrapper1.lambda().eq(IdenFaceImage::getCommunityId,communityId)
+                queryWrapper1.lambda().eq(IdenFaceImage::getCommunityId,communityId).eq(IdenFaceImage::getUid,uid)
                         .orderByAsc(IdenFaceImage::getPhotographTime);
                 queryWrapper1.last("limit 1");
                 IdenFaceImage idenFaceImage1 = this.idenFaceImageService.getOne(queryWrapper1);
@@ -536,18 +608,27 @@ public class WarningService {
                 }
 
                 idenWarningPerson.setType(WarningTypeEnum.EVENING_COMMING.getValue());
-                idenWarningPerson.setCreateTime(idenFaceImage.getCreateTime());
+                idenWarningPerson.setCreateTime(new Date());
                 this.idenWarningPersonService.save(idenWarningPerson);
 
             }
             IdenWarningPersonHis idenWarningPersonHis = new IdenWarningPersonHis();
             BeanUtil.copyProperties(idenWarningPerson,idenWarningPersonHis,"id");
+            idenWarningPersonHis.setCreateTime(new Date());
             idenWarningPersonHisService.save(idenWarningPersonHis);
 
             IdenWarningEvent idenWarningEvent = new IdenWarningEvent();
             idenWarningEvent.setWarningPersonId(idenWarningPerson.getId());
             idenWarningEvent.setUid(idenWarningPerson.getUid());
             idenWarningEvent.setPersonId(idenWarningPerson.getPersonId());
+
+            QueryWrapper<IdenFaceImage> queryWrapper1 = new QueryWrapper<>();
+            queryWrapper1.lambda().eq(IdenFaceImage::getUid, uid).eq(IdenFaceImage::getCommunityId,communityId)
+                    .orderByDesc(IdenFaceImage::getPhotographTime);
+            queryWrapper1.last("limit 1"); //查询最后一次拍照
+
+            IdenFaceImage idenFaceImage = this.idenFaceImageService.getOne(queryWrapper1);
+
             idenWarningEvent.setDataTime(idenFaceImage.getPhotographTime());
             idenWarningEvent.setImage(idenFaceImage.getImage());
             idenWarningEvent.setCommunityId(idenWarningPerson.getCommunityId());
@@ -557,15 +638,14 @@ public class WarningService {
             idenWarningEvent.setSubdistrict(idenWarningPerson.getSubdistrict());
             idenWarningEvent.setAppearTime(idenFaceImage.getPhotographTime());
             idenWarningEvent.setType(WarningTypeEnum.EVENING_COMMING.getValue());
-            idenWarningEvent.setCreateTime(idenFaceImage.getCreateTime());
+            idenWarningEvent.setCreateTime(new Date());
             this.idenWarningEventService.save(idenWarningEvent);
         }
-
     }
 
     //按小区统计
-    private void staCommunity() {
-        idenWarningStaService.insertWarningPersonRateSta();
+    private void staCommunity(int staBeforeDayNums) {
+        idenWarningStaService.insertWarningPersonRateSta(staBeforeDayNums);
     }
 
     //是否有连续7天情况

+ 5 - 1
src/main/java/com/iden/common/cache/RedisKeyConstant.java

@@ -12,7 +12,7 @@ import lombok.Data;
 public class RedisKeyConstant {
 
 
-    // 后台登录信息 6 小时
+    // 后台登录信息 24 小时
     public static final String BACK_LOGIN_INFO = "BACK:LOGIN";
     public static final int BACK_LOGIN_INFO_TIME = 3600 * 24;
 
@@ -32,4 +32,8 @@ public class RedisKeyConstant {
     public static final String PERSON_UPDATE = "PERSON:UPDATE";
 
     public static final String UID_KEY = "UID_KEY";
+
+    //24小时
+    public static final String HANDLE_WARNING_DATE = "HANDLE:WARNING_DATE";
+    public static final int HANDLE_WARNING_DATE_TIME = 3600 * 24;
 }

+ 1 - 0
src/main/java/com/iden/common/facetool/FaceIdenTool.java

@@ -6,6 +6,7 @@ import com.face.monitor.model.FaceModel;
 import com.face.monitor.model.FaceRecogRetrieveResult;
 import com.iden.common.cache.FaceMoniterCache;
 import com.iden.common.constant.Constants;
+
 import com.iden.common.facetool.pool.MyFaceMonitor;
 import com.iden.common.facetool.pool.ResourcePoolableObjectFactory;
 import com.iden.common.util.ByteUtil;

+ 2 - 1
src/main/java/com/iden/common/mapper/IdenWarningStaMapper.java

@@ -3,6 +3,7 @@ package com.iden.common.mapper;
 import com.iden.common.entity.IdenWarningSta;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.iden.common.vo.HomePageWarningStaVO;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -16,5 +17,5 @@ import java.util.List;
 public interface IdenWarningStaMapper extends BaseMapper<IdenWarningSta> {
     List<HomePageWarningStaVO> queryWarningPersonRateSta();
 
-    void insertWarningPersonRateSta();
+    void insertWarningPersonRateSta(@Param("staBeforeDayNums") int staBeforeDayNums);
 }

+ 1 - 1
src/main/java/com/iden/common/service/IdenWarningStaService.java

@@ -14,5 +14,5 @@ import java.util.List;
  */
 public interface IdenWarningStaService extends IService<IdenWarningSta> {
     List<HomePageWarningStaVO> queryWarningPersonRateSta();
-    void insertWarningPersonRateSta();
+    void insertWarningPersonRateSta(int staBeforeDayNums);
 }

+ 2 - 2
src/main/java/com/iden/common/service/impl/IdenWarningStaServiceImpl.java

@@ -23,7 +23,7 @@ public class IdenWarningStaServiceImpl extends ServiceImpl<IdenWarningStaMapper,
     }
 
     @Override
-    public void insertWarningPersonRateSta(){
-        this.baseMapper.insertWarningPersonRateSta();
+    public void insertWarningPersonRateSta(int staBeforeDayNums){
+        this.baseMapper.insertWarningPersonRateSta(staBeforeDayNums);
     }
 }

+ 13 - 0
src/main/java/com/iden/common/util/DateUtils.java

@@ -193,6 +193,19 @@ public class DateUtils {
         return yyyyMMdd.format(new Date());
     }
 
+    /**
+     * 获取几天前的日期并格式化为:yyyyMMdd格式
+     *
+     * @return 返回yyyyMMdd格式的时间字符串
+     * @throws Exception
+     */
+    public static String getBeforeDayYyyyMMddDate(int days) {
+        Calendar cal =  Calendar.getInstance();
+        cal.add(Calendar.DATE,-days);
+        String beforeDay = yyyyMMdd.format(cal.getTime());
+        return beforeDay;
+    }
+
     /**
      * 获取昨天并格式化为:yyyyMMdd格式
      *

+ 2 - 0
src/main/resources/application-dev.properties

@@ -40,3 +40,5 @@ init.face.dataset=1
 #视频编辑程序所在路径
 ffmpeg.path=/data/iden/ffmpeg/ffmpeg-git-20211217-amd64-static/ffmpeg
 
+#统计几天前的数据,默认应该是1也就昨天,更多天是为了测试
+sta.before.days = 10;

+ 4 - 1
src/main/resources/application-prod.properties

@@ -41,4 +41,7 @@ image.url=http://124.70.58.209:17778/
 init.face.dataset=1
 
 #视频编辑程序所在路径
-ffmpeg.path=/data/iden/ffmpeg/ffmpeg-git-20211217-amd64-static/ffmpeg
+ffmpeg.path=/data/iden/ffmpeg/ffmpeg-git-20211217-amd64-static/ffmpeg
+
+#统计几天前的数据,默认应该是1也就昨天,更多天是为了测试
+sta.before.days = 10;

+ 1 - 1
src/main/resources/application.properties

@@ -5,7 +5,7 @@ spring.profiles.active=dev
 server.port=13456
 
 #优雅关闭
-server.shutdown=graceful
+#server.shutdown=graceful
 
 ### spring配置
 # 配置服务名称

+ 1 - 1
src/main/resources/mybatis/IdenWarningStaMapper.xml

@@ -19,7 +19,7 @@
         max(t.subdistrict) subdistrict,
         count(1) total
         from iden_warning_person t
-        where t.data_date = DATE_FORMAT(DATE_SUB(curdate(),INTERVAL 1 DAY),'%Y%m%d')
+        where t.data_date >= DATE_FORMAT(DATE_SUB(curdate(),INTERVAL #{staBeforeDayNums} DAY),'%Y%m%d')
         group by t.data_date,t.community_id,t.type
          on duplicate key update
         community_code=values(community_code),