WarningService.java 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578
  1. package com.iden.bms.service;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.iden.common.entity.*;
  6. import com.iden.common.enums.*;
  7. import com.iden.common.exception.BDException;
  8. import com.iden.common.service.*;
  9. import com.iden.common.util.DateUtils;
  10. import org.apache.commons.lang3.StringUtils;
  11. import org.springframework.stereotype.Service;
  12. import javax.annotation.Resource;
  13. import java.util.ArrayList;
  14. import java.util.Date;
  15. import java.util.List;
  16. import java.util.Map;
  17. /**
  18. *
  19. * @author makejava
  20. * @since 2021-05-21 00:08:38
  21. */
  22. @Service
  23. public class WarningService {
  24. @Resource
  25. private IdenFaceImageService idenFaceImageService;
  26. @Resource
  27. private IdenCameraService idenCameraService;
  28. @Resource
  29. private IdenCommunityService idenCommunityService;
  30. @Resource
  31. private IdenWarningEventService idenWarningEventService;
  32. @Resource
  33. private IdenWarningPersonService idenWarningPersonService;
  34. @Resource
  35. private IdenWarningPersonHisService idenWarningPersonHisService;
  36. @Resource
  37. private IdenWarningPersonTraceService idenWarningPersonTraceService;
  38. @Resource
  39. private IdenWarningStaService idenWarningStaService;
  40. @Resource
  41. private IdenWarningRuleStrangerService idenWarningRuleStrangerService;
  42. @Resource
  43. private IdenWarningRuleResidentService idenWarningRuleResidentService;
  44. @Resource
  45. private IdenWarningRuleEveningCommingService idenWarningRuleEveningCommingService;
  46. @Resource
  47. private IdenPersonService idenPersonService;
  48. /**
  49. * 实时处理轨迹、重点人员预警等
  50. * @return
  51. */
  52. public void handleActualTimeWarning() throws BDException {
  53. //查询没有处理过的人脸图像数据
  54. QueryWrapper<IdenFaceImage> queryWrapper = new QueryWrapper<>();
  55. queryWrapper.lambda().eq(IdenFaceImage::getHandleWarningStatus, HandleWarningStatusEnum.NO_HANDLE.getValue())
  56. .last("limit 5000"); //每次处理5000条
  57. List<IdenFaceImage> idenFaceImageList = idenFaceImageService.list(queryWrapper);
  58. if (CollUtil.isEmpty(idenFaceImageList)) {
  59. return;
  60. }
  61. for (IdenFaceImage idenFaceImage : idenFaceImageList) {
  62. //生成轨迹
  63. IdenWarningPersonTrace idenWarningPersonTrace = new IdenWarningPersonTrace();
  64. BeanUtil.copyProperties(idenFaceImage,idenWarningPersonTrace,"id");
  65. this.idenWarningPersonTraceService.save(idenWarningPersonTrace);
  66. String type = idenFaceImage.getType();
  67. //重点人员
  68. if (StringUtils.isNotEmpty(type) && type.contains(PersonTypeEnum.KEYNOTE.getValue())) {
  69. handleKeynote(idenFaceImage);
  70. }
  71. IdenFaceImage idenFaceImageUpdate = new IdenFaceImage();
  72. idenFaceImageUpdate.setId(idenFaceImage.getId());
  73. idenFaceImageUpdate.setHandleWarningStatus(HandleWarningStatusEnum.HANDLED.getValue());
  74. this.idenFaceImageService.updateById(idenFaceImageUpdate);
  75. }
  76. }
  77. /**
  78. * 每天处理陌生人预警、常驻人员预警、昼伏夜出预警, 凌晨0点10分开始处理昨天数据
  79. * @return
  80. */
  81. public void handleDayWarning() throws BDException {
  82. //常住人员识别预警
  83. handleResident();
  84. //查询昨天的人脸图像数据
  85. QueryWrapper<IdenFaceImage> queryWrapper = new QueryWrapper<>();
  86. queryWrapper.lambda().eq(IdenFaceImage::getDataDate, DateUtils.getYestodayYyyyMMddDate()).orderByDesc(IdenFaceImage::getPhotographTime);
  87. List<IdenFaceImage> idenFaceImageList = idenFaceImageService.list(queryWrapper);
  88. if (CollUtil.isEmpty(idenFaceImageList)) {
  89. return;
  90. }
  91. for (IdenFaceImage idenFaceImage : idenFaceImageList) {
  92. String type = idenFaceImage.getType();
  93. if (StringUtils.isNotEmpty(type) && type.contains(PersonTypeEnum.STRANGER.getValue())) { //陌生人员
  94. handleStranger(idenFaceImage);//陌生人员识别预警
  95. }
  96. handleEveningComming(idenFaceImage);//昼伏夜出人员识别预警
  97. }
  98. //按小区统昨天的数据
  99. staCommunity();
  100. }
  101. //陌生人员识别预警
  102. private void handleStranger(IdenFaceImage idenFaceImage) {
  103. Long communityId = idenFaceImage.getCommunityId();
  104. if (communityId == null) {
  105. return;
  106. }
  107. //查询此人1月内在该小区出现天次
  108. QueryWrapper<IdenFaceImage> queryWrapper = new QueryWrapper<>();
  109. queryWrapper.select("distinct data_date dataDate ") ;
  110. queryWrapper.lambda().eq(IdenFaceImage::getUid,idenFaceImage.getUid()).eq(IdenFaceImage::getCommunityId,communityId)
  111. .orderByAsc(IdenFaceImage::getDataDate);
  112. 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')");
  113. int strangerDayFrequency = 0;
  114. //1月内7天出现情况
  115. List<IdenFaceImage> listDataDate = this.idenFaceImageService.list(queryWrapper);
  116. if(listDataDate != null){
  117. strangerDayFrequency = listDataDate.size();
  118. }
  119. QueryWrapper<IdenWarningRuleStranger> queryWrapper3 = new QueryWrapper<>();
  120. IdenWarningRuleStranger idenWarningRuleStranger = idenWarningRuleStrangerService.getOne(queryWrapper3);
  121. int strangerFrequencyRule = 15;
  122. int strangerDays = 7;
  123. if (idenWarningRuleStranger != null){
  124. strangerFrequencyRule = idenWarningRuleStranger.getStrangerFrequency();
  125. strangerDays = idenWarningRuleStranger.getStrangerDays();
  126. }
  127. String isContinue = getIsContinue(listDataDate,strangerDays);
  128. boolean isWarning = false;
  129. String strangerType = null;
  130. //此人1月出现频次少于15次及7内天每天未连续出现,视为陌生人
  131. if(strangerDayFrequency < strangerFrequencyRule && IsContinueEnum.NO.getValue().equals(isContinue)) {
  132. isWarning = true;
  133. strangerType = StrangerTypeEnum.STRANGER.getValue();
  134. //此人出现频次1月内大于15天次或连续7天每天都出现,标注为疑似未登记住户
  135. } else if(strangerDayFrequency >= strangerFrequencyRule || IsContinueEnum.YES.getValue().equals(isContinue)) {
  136. isWarning = true;
  137. strangerType = StrangerTypeEnum.NO_REGISTER.getValue();
  138. }
  139. if(isWarning) {
  140. //查询是不是已经有预警人员数据了
  141. QueryWrapper<IdenWarningPerson> queryWrapper0 = new QueryWrapper<>();
  142. queryWrapper0.lambda()
  143. .eq(IdenWarningPerson::getCommunityId,communityId)
  144. .eq(IdenWarningPerson::getUid,idenFaceImage.getUid())
  145. .eq(IdenWarningPerson::getType,WarningTypeEnum.STRANGER.getValue());
  146. IdenWarningPerson idenWarningPerson = this.idenWarningPersonService.getOne(queryWrapper0);
  147. if (idenWarningPerson != null) {
  148. idenWarningPerson.setAppearFrequency(strangerDayFrequency);
  149. idenWarningPerson.setStrangerType(strangerType);
  150. idenWarningPerson.setHandleStatus(HandleWarningStatusEnum.NO_HANDLE.getValue());
  151. idenWarningPerson.setModifyTime(new Date());
  152. this.idenWarningPersonService.updateById(idenWarningPerson);
  153. } else {
  154. idenWarningPerson = new IdenWarningPerson();
  155. idenWarningPerson.setStrangerType(strangerType);
  156. idenWarningPerson.setUid(idenFaceImage.getUid());
  157. idenWarningPerson.setDataDate(idenFaceImage.getDataDate());
  158. idenWarningPerson.setImage(idenFaceImage.getImage());
  159. idenWarningPerson.setFeatPtr(idenFaceImage.getFeatPtr());
  160. Long cameraId = idenFaceImage.getCameraId();
  161. if(cameraId != null) {
  162. IdenCamera idenCamera = this.idenCameraService.getById(cameraId);
  163. idenWarningPerson.setDistrict(idenCamera.getDistrict());
  164. idenWarningPerson.setSubdistrict(idenCamera.getSubdistrict());
  165. }
  166. IdenCommunity idenCommunity = this.idenCommunityService.getById(communityId);
  167. if (idenCommunity != null) {
  168. idenWarningPerson.setCommunityId(communityId);
  169. idenWarningPerson.setCommunityCode(idenCommunity.getCode());
  170. idenWarningPerson.setCommunityName(idenCommunity.getName());
  171. }
  172. idenWarningPerson.setAppearFrequency(strangerDayFrequency);
  173. idenWarningPerson.setIsContinue(isContinue);
  174. //查询此人在该小区最早出现时间
  175. QueryWrapper<IdenFaceImage> queryWrapper1 = new QueryWrapper<>();
  176. queryWrapper1.lambda().eq(IdenFaceImage::getCommunityId,communityId)
  177. .orderByAsc(IdenFaceImage::getPhotographTime);
  178. queryWrapper1.last("limit 1");
  179. IdenFaceImage idenFaceImage1 = this.idenFaceImageService.getOne(queryWrapper1);
  180. if(idenFaceImage1 != null){
  181. idenWarningPerson.setEarliestAppearTime(idenFaceImage1.getPhotographTime());
  182. }
  183. idenWarningPerson.setType(WarningTypeEnum.STRANGER.getValue());
  184. idenWarningPerson.setCreateTime(idenFaceImage.getCreateTime());
  185. this.idenWarningPersonService.save(idenWarningPerson);
  186. }
  187. IdenWarningPersonHis idenWarningPersonHis = new IdenWarningPersonHis();
  188. BeanUtil.copyProperties(idenWarningPerson,idenWarningPersonHis,"id");
  189. idenWarningPersonHisService.save(idenWarningPersonHis);
  190. IdenWarningEvent idenWarningEvent = new IdenWarningEvent();
  191. idenWarningEvent.setWarningPersonId(idenWarningPerson.getId());
  192. idenWarningEvent.setUid(idenWarningPerson.getUid());
  193. idenWarningEvent.setDataTime(idenFaceImage.getPhotographTime());
  194. idenWarningEvent.setImage(idenFaceImage.getImage());
  195. idenWarningEvent.setCommunityId(idenWarningPerson.getCommunityId());
  196. idenWarningEvent.setCommunityCode(idenWarningPerson.getCommunityCode());
  197. idenWarningEvent.setCommunityName(idenWarningPerson.getCommunityName());
  198. idenWarningEvent.setDistrict(idenWarningPerson.getDistrict());
  199. idenWarningEvent.setSubdistrict(idenWarningPerson.getSubdistrict());
  200. idenWarningEvent.setAppearTime(idenFaceImage.getPhotographTime());
  201. idenWarningEvent.setType(WarningTypeEnum.STRANGER.getValue());
  202. idenWarningEvent.setCreateTime(idenFaceImage.getCreateTime());
  203. this.idenWarningEventService.save(idenWarningEvent);
  204. }
  205. }
  206. //重点人员识别预警
  207. private void handleKeynote(IdenFaceImage idenFaceImage){
  208. Long communityId = idenFaceImage.getCommunityId();
  209. if(communityId == null) {
  210. return;
  211. }
  212. //查询是不是已经有预警人员数据了
  213. QueryWrapper<IdenWarningPerson> queryWrapper = new QueryWrapper<>();
  214. queryWrapper.lambda()
  215. .eq(IdenWarningPerson::getCommunityId,communityId)
  216. .eq(IdenWarningPerson::getPersonId,idenFaceImage.getPersonId())
  217. .eq(IdenWarningPerson::getType,WarningTypeEnum.KEYNOTE.getValue());
  218. IdenWarningPerson idenWarningPerson = this.idenWarningPersonService.getOne(queryWrapper);
  219. if (idenWarningPerson != null) {
  220. idenWarningPerson.setAppearFrequency(idenWarningPerson.getAppearFrequency() + 1);
  221. idenWarningPerson.setHandleStatus(HandleWarningStatusEnum.NO_HANDLE.getValue());
  222. idenWarningPerson.setModifyTime(new Date());
  223. this.idenWarningPersonService.updateById(idenWarningPerson);
  224. } else {
  225. idenWarningPerson = new IdenWarningPerson();
  226. idenWarningPerson.setUid(idenFaceImage.getUid());
  227. idenWarningPerson.setImage(idenFaceImage.getImage());
  228. idenWarningPerson.setFeatPtr(idenFaceImage.getFeatPtr());
  229. idenWarningPerson.setDataDate(idenFaceImage.getDataDate());
  230. Long cameraId = idenFaceImage.getCameraId();
  231. if(cameraId != null) {
  232. IdenCamera idenCamera = this.idenCameraService.getById(cameraId);
  233. idenWarningPerson.setDistrict(idenCamera.getDistrict());
  234. idenWarningPerson.setSubdistrict(idenCamera.getSubdistrict());
  235. }
  236. IdenCommunity idenCommunity = this.idenCommunityService.getById(communityId);
  237. if (idenCommunity != null) {
  238. idenWarningPerson.setCommunityId(communityId);
  239. idenWarningPerson.setCommunityCode(idenCommunity.getCode());
  240. idenWarningPerson.setCommunityName(idenCommunity.getName());
  241. }
  242. idenWarningPerson.setAppearFrequency(1);
  243. //查询此人在该小区最早出现时间
  244. QueryWrapper<IdenFaceImage> queryWrapper1 = new QueryWrapper<>();
  245. queryWrapper1.lambda().eq(IdenFaceImage::getCommunityId,communityId)
  246. .orderByAsc(IdenFaceImage::getPhotographTime);
  247. queryWrapper1.last("limit 1");
  248. IdenFaceImage idenFaceImage1 = this.idenFaceImageService.getOne(queryWrapper1);
  249. if(idenFaceImage1 != null){
  250. idenWarningPerson.setEarliestAppearTime(idenFaceImage1.getPhotographTime());
  251. }
  252. idenWarningPerson.setType(WarningTypeEnum.KEYNOTE.getValue());
  253. idenWarningPerson.setPersonId(idenFaceImage.getPersonId());
  254. idenWarningPerson.setCreateTime(idenFaceImage.getCreateTime());
  255. this.idenWarningPersonService.save(idenWarningPerson);
  256. }
  257. IdenWarningPersonHis idenWarningPersonHis = new IdenWarningPersonHis();
  258. BeanUtil.copyProperties(idenWarningPerson,idenWarningPersonHis,"id");
  259. idenWarningPersonHisService.save(idenWarningPersonHis);
  260. IdenWarningEvent idenWarningEvent = new IdenWarningEvent();
  261. idenWarningEvent.setWarningPersonId(idenWarningPerson.getId());
  262. idenWarningEvent.setUid(idenWarningPerson.getUid());
  263. idenWarningEvent.setDataTime(idenFaceImage.getPhotographTime());
  264. idenWarningEvent.setImage(idenFaceImage.getImage());
  265. idenWarningEvent.setCommunityId(idenWarningPerson.getCommunityId());
  266. idenWarningEvent.setCommunityCode(idenWarningPerson.getCommunityCode());
  267. idenWarningEvent.setCommunityName(idenWarningPerson.getCommunityName());
  268. idenWarningEvent.setDistrict(idenWarningPerson.getDistrict());
  269. idenWarningEvent.setSubdistrict(idenWarningPerson.getSubdistrict());
  270. idenWarningEvent.setAppearTime(idenFaceImage.getPhotographTime());
  271. idenWarningEvent.setType(WarningTypeEnum.KEYNOTE.getValue());
  272. idenWarningEvent.setPersonId(idenFaceImage.getPersonId());
  273. idenWarningEvent.setCreateTime(idenFaceImage.getCreateTime());
  274. this.idenWarningEventService.save(idenWarningEvent);
  275. }
  276. //常住人员识别预警,小区人脸库内7天内未被命中人员或标记为独居老人或老人带小孩的7天内未被命中人员视为预警对象
  277. private void handleResident() {
  278. //查询全部小区人员
  279. QueryWrapper<IdenPerson> queryWrapper = new QueryWrapper<>();
  280. queryWrapper.lambda().like(IdenPerson::getType, PersonTypeEnum.COMMUNITY.getValue());
  281. List<IdenPerson> listPerson = this.idenPersonService.list(queryWrapper);
  282. if(CollUtil.isEmpty(listPerson)){
  283. return;
  284. }
  285. //遍历小区人员
  286. for (IdenPerson idenPerson :listPerson ) {
  287. QueryWrapper<IdenFaceImage> queryWrapper1 = new QueryWrapper<>();
  288. queryWrapper1.lambda().eq(IdenFaceImage::getPersonId, idenPerson.getId())
  289. .orderByDesc(IdenFaceImage::getPhotographTime);
  290. queryWrapper1.last("limit 1");
  291. IdenFaceImage idenFaceImage = this.idenFaceImageService.getOne(queryWrapper1);
  292. int continueDisappearDaysRule = 7;
  293. QueryWrapper<IdenWarningRuleResident> queryWrapper2 = new QueryWrapper<>();
  294. IdenWarningRuleResident idenWarningRuleResident = this.idenWarningRuleResidentService.getOne(queryWrapper2);
  295. if(idenWarningRuleResident != null) {
  296. continueDisappearDaysRule = idenWarningRuleResident.getContinueDisappearDays();
  297. }
  298. if (idenFaceImage == null){
  299. idenFaceImage = new IdenFaceImage();
  300. idenFaceImage.setPhotographTime(DateUtils.getBeforeDates(100)); //设定一个假时间
  301. }
  302. int continueDisappearDays = DateUtils.getDaysGap(idenFaceImage.getPhotographTime(), new Date()) - 1;
  303. //超过7天没出现, 满足预警
  304. if ( continueDisappearDays > continueDisappearDaysRule ) {
  305. //查询是不是已经有预警人员数据了
  306. QueryWrapper<IdenWarningPerson> queryWrapper0 = new QueryWrapper<>();
  307. queryWrapper0.lambda()
  308. .eq(IdenWarningPerson::getCommunityId,idenPerson.getCommunityId())
  309. .eq(IdenWarningPerson::getPersonId,idenPerson.getId())
  310. .eq(IdenWarningPerson::getType,WarningTypeEnum.RESIDENT.getValue());
  311. IdenWarningPerson idenWarningPerson = this.idenWarningPersonService.getOne(queryWrapper0);
  312. if (idenWarningPerson != null) {
  313. idenWarningPerson.setContinueDisappearDays(continueDisappearDays);
  314. idenWarningPerson.setModifyTime(new Date());
  315. idenWarningPerson.setHandleStatus(HandleWarningStatusEnum.NO_HANDLE.getValue());
  316. this.idenWarningPersonService.updateById(idenWarningPerson);
  317. } else {
  318. //生成预警数据
  319. idenWarningPerson = new IdenWarningPerson();
  320. idenWarningPerson.setUid(idenPerson.getUid());
  321. idenWarningPerson.setImage(idenPerson.getImage());
  322. idenWarningPerson.setFeatPtr(idenFaceImage.getFeatPtr());
  323. idenWarningPerson.setDataDate(DateUtils.getYestodayYyyyMMddDate());
  324. Long communityId = idenPerson.getCommunityId();
  325. IdenCommunity idenCommunity = this.idenCommunityService.getById(communityId);
  326. if (idenCommunity != null) {
  327. idenWarningPerson.setCommunityId(communityId);
  328. idenWarningPerson.setCommunityCode(idenCommunity.getCode());
  329. idenWarningPerson.setCommunityName(idenCommunity.getName());
  330. idenWarningPerson.setSubdistrict(idenCommunity.getSubdistrict());
  331. idenWarningPerson.setDistrict(idenCommunity.getDistrict());
  332. }
  333. idenWarningPerson.setContinueDisappearDays(continueDisappearDays);
  334. //此人在该小区最晚出现时间
  335. idenWarningPerson.setLatestAppearTime(idenFaceImage.getPhotographTime());
  336. idenWarningPerson.setType(WarningTypeEnum.RESIDENT.getValue());
  337. idenWarningPerson.setCreateTime(DateUtils.strToDate(DateUtils.getYestodayYyyyMMddDate(),"yyyyMMdd"));
  338. this.idenWarningPersonService.save(idenWarningPerson);
  339. }
  340. IdenWarningPersonHis idenWarningPersonHis = new IdenWarningPersonHis();
  341. BeanUtil.copyProperties(idenWarningPerson,idenWarningPersonHis,"id");
  342. idenWarningPersonHisService.save(idenWarningPersonHis);
  343. IdenWarningEvent idenWarningEvent = new IdenWarningEvent();
  344. idenWarningEvent.setWarningPersonId(idenWarningPerson.getId());
  345. idenWarningEvent.setUid(idenWarningPerson.getUid());
  346. idenWarningEvent.setDataTime(idenWarningPerson.getLatestAppearTime());
  347. idenWarningEvent.setImage(idenWarningPerson.getImage());
  348. idenWarningEvent.setCommunityId(idenWarningPerson.getCommunityId());
  349. idenWarningEvent.setCommunityCode(idenWarningPerson.getCommunityCode());
  350. idenWarningEvent.setCommunityName(idenWarningPerson.getCommunityName());
  351. idenWarningEvent.setDistrict(idenWarningPerson.getDistrict());
  352. idenWarningEvent.setSubdistrict(idenWarningPerson.getSubdistrict());
  353. idenWarningEvent.setAppearTime(idenWarningPerson.getLatestAppearTime());
  354. idenWarningEvent.setType(WarningTypeEnum.RESIDENT.getValue());
  355. idenWarningEvent.setCreateTime(idenWarningPerson.getCreateTime());
  356. this.idenWarningEventService.save(idenWarningEvent);
  357. }
  358. }
  359. }
  360. //昼伏夜出人员识别预警
  361. private void handleEveningComming(IdenFaceImage idenFaceImage) {
  362. Long communityId = idenFaceImage.getCommunityId();
  363. if (communityId == null) {
  364. return;
  365. }
  366. //设置默认
  367. List<IdenWarningRuleEveningComming> idenWarningRuleEveningCommings = new ArrayList<>();
  368. IdenWarningRuleEveningComming idenWarningRuleEveningComming = new IdenWarningRuleEveningComming();
  369. idenWarningRuleEveningComming.setStartTime("23:00:00");
  370. idenWarningRuleEveningComming.setEndTime("04:00:00");
  371. idenWarningRuleEveningComming.setStatus(AppearStatusEnum.APPEAR.getValue());
  372. idenWarningRuleEveningComming.setContinueDays(7);
  373. idenWarningRuleEveningCommings.add(idenWarningRuleEveningComming);
  374. idenWarningRuleEveningComming.setStartTime("08:00:00");
  375. idenWarningRuleEveningComming.setEndTime("23:00:00");
  376. idenWarningRuleEveningComming.setStatus(AppearStatusEnum.DISAPPEAR.getValue());
  377. idenWarningRuleEveningComming.setContinueDays(7);
  378. idenWarningRuleEveningCommings.add(idenWarningRuleEveningComming);
  379. QueryWrapper<IdenWarningRuleEveningComming> queryWrapper3 = new QueryWrapper<>();
  380. List<IdenWarningRuleEveningComming> idenWarningRuleEveningCommingsDb = idenWarningRuleEveningCommingService.list(queryWrapper3);
  381. if (CollUtil.isNotEmpty(idenWarningRuleEveningCommingsDb)) {
  382. idenWarningRuleEveningCommings = idenWarningRuleEveningCommingsDb;
  383. }
  384. int continueDays = idenWarningRuleEveningCommings.get(0).getContinueDays();
  385. String beforeDate = DateUtils.formatToDateStr(DateUtils.getBeforeDates(continueDays + 1),"yyyyMMdd");
  386. String yestoday = DateUtils.getYestodayYyyyMMddDate();
  387. //查询此人长期晚上某时段出现(时间期间可设)且白天未出现,视为昼伏夜出人员,进行预警
  388. QueryWrapper<IdenFaceImage> queryWrapper = new QueryWrapper<>();
  389. queryWrapper.select("distinct data_date dataDate ") ;
  390. queryWrapper.lambda().eq(IdenFaceImage::getUid,idenFaceImage.getUid())
  391. .eq(IdenFaceImage::getCommunityId,communityId)
  392. .ge(IdenFaceImage::getDataDate,beforeDate)
  393. .le(IdenFaceImage::getDataDate,yestoday);
  394. for(IdenWarningRuleEveningComming idenWarningRuleEveningComming1 : idenWarningRuleEveningCommings) {
  395. String startTime = idenWarningRuleEveningComming1.getStartTime();
  396. String endTime = idenWarningRuleEveningComming1.getEndTime();
  397. Map<String, String> map = DateUtils.convertDate(startTime,endTime);
  398. String startDate = map.get("startDate");
  399. String endDate = map.get("endDate");
  400. if (AppearStatusEnum.APPEAR.getValue().equals(idenWarningRuleEveningComming1.getStatus())) {
  401. queryWrapper.apply(" photograph_time > '" + startDate + "' and photograph_time < '" + endDate + "'");
  402. } else if (AppearStatusEnum.DISAPPEAR.getValue().equals(idenWarningRuleEveningComming1.getStatus())) {
  403. queryWrapper.apply(" not exists (select 1 from iden_face_image a where a.data_date = iden_face_image.data_date" +
  404. " and a.photograph_time > '" + startDate + "' and a.photograph_time < '" + endDate + "') ");
  405. }
  406. }
  407. int count = 0;
  408. List<IdenFaceImage> idenFaceImageList = this.idenFaceImageService.list(queryWrapper);
  409. if(idenFaceImageList != null){
  410. count = idenFaceImageList.size();
  411. }
  412. if (count >= continueDays) { //连续超过7天,满足预警
  413. //查询是不是已经有预警人员数据了
  414. QueryWrapper<IdenWarningPerson> queryWrapper0 = new QueryWrapper<>();
  415. queryWrapper0.lambda()
  416. .eq(IdenWarningPerson::getCommunityId,communityId)
  417. .eq(IdenWarningPerson::getUid,idenFaceImage.getUid())
  418. .eq(IdenWarningPerson::getType,WarningTypeEnum.EVENING_COMMING.getValue());
  419. IdenWarningPerson idenWarningPerson = this.idenWarningPersonService.getOne(queryWrapper0);
  420. if (idenWarningPerson != null) {
  421. idenWarningPerson.setAppearFrequency(count);
  422. idenWarningPerson.setHandleStatus(HandleWarningStatusEnum.NO_HANDLE.getValue());
  423. idenWarningPerson.setModifyTime(new Date());
  424. this.idenWarningPersonService.updateById(idenWarningPerson);
  425. } else {
  426. idenWarningPerson = new IdenWarningPerson();
  427. idenWarningPerson.setUid(idenFaceImage.getUid());
  428. idenWarningPerson.setDataDate(idenFaceImage.getDataDate());
  429. idenWarningPerson.setImage(idenFaceImage.getImage());
  430. idenWarningPerson.setFeatPtr(idenFaceImage.getFeatPtr());
  431. Long cameraId = idenFaceImage.getCameraId();
  432. if(cameraId != null) {
  433. IdenCamera idenCamera = this.idenCameraService.getById(cameraId);
  434. idenWarningPerson.setDistrict(idenCamera.getDistrict());
  435. idenWarningPerson.setSubdistrict(idenCamera.getSubdistrict());
  436. }
  437. IdenCommunity idenCommunity = this.idenCommunityService.getById(communityId);
  438. if (idenCommunity != null) {
  439. idenWarningPerson.setCommunityId(communityId);
  440. idenWarningPerson.setCommunityCode(idenCommunity.getCode());
  441. idenWarningPerson.setCommunityName(idenCommunity.getName());
  442. }
  443. idenWarningPerson.setAppearFrequency(count);
  444. //查询此人在该小区最早出现时间
  445. QueryWrapper<IdenFaceImage> queryWrapper1 = new QueryWrapper<>();
  446. queryWrapper1.lambda().eq(IdenFaceImage::getCommunityId,communityId)
  447. .orderByAsc(IdenFaceImage::getPhotographTime);
  448. queryWrapper1.last("limit 1");
  449. IdenFaceImage idenFaceImage1 = this.idenFaceImageService.getOne(queryWrapper1);
  450. if(idenFaceImage1 != null){
  451. idenWarningPerson.setEarliestAppearTime(idenFaceImage1.getPhotographTime());
  452. }
  453. idenWarningPerson.setType(WarningTypeEnum.EVENING_COMMING.getValue());
  454. idenWarningPerson.setCreateTime(idenFaceImage.getCreateTime());
  455. this.idenWarningPersonService.save(idenWarningPerson);
  456. }
  457. IdenWarningPersonHis idenWarningPersonHis = new IdenWarningPersonHis();
  458. BeanUtil.copyProperties(idenWarningPerson,idenWarningPersonHis,"id");
  459. idenWarningPersonHisService.save(idenWarningPersonHis);
  460. IdenWarningEvent idenWarningEvent = new IdenWarningEvent();
  461. idenWarningEvent.setWarningPersonId(idenWarningPerson.getId());
  462. idenWarningEvent.setUid(idenWarningPerson.getUid());
  463. idenWarningEvent.setDataTime(idenFaceImage.getPhotographTime());
  464. idenWarningEvent.setImage(idenFaceImage.getImage());
  465. idenWarningEvent.setCommunityId(idenWarningPerson.getCommunityId());
  466. idenWarningEvent.setCommunityCode(idenWarningPerson.getCommunityCode());
  467. idenWarningEvent.setCommunityName(idenWarningPerson.getCommunityName());
  468. idenWarningEvent.setDistrict(idenWarningPerson.getDistrict());
  469. idenWarningEvent.setSubdistrict(idenWarningPerson.getSubdistrict());
  470. idenWarningEvent.setAppearTime(idenFaceImage.getPhotographTime());
  471. idenWarningEvent.setType(WarningTypeEnum.EVENING_COMMING.getValue());
  472. idenWarningEvent.setCreateTime(idenFaceImage.getCreateTime());
  473. this.idenWarningEventService.save(idenWarningEvent);
  474. }
  475. }
  476. //按小区统计
  477. private void staCommunity() {
  478. idenWarningStaService.insertWarningPersonRateSta();
  479. }
  480. //是否有连续7天情况
  481. private String getIsContinue(List<IdenFaceImage> listDataDate,int strangerDays) {
  482. if(CollUtil.isEmpty(listDataDate)){
  483. return IsContinueEnum.NO.getValue();
  484. }
  485. List<String> dataDateList = new ArrayList<>();
  486. for(IdenFaceImage idenFaceImage : listDataDate) {
  487. dataDateList.add(idenFaceImage.getDataDate());
  488. }
  489. String minDataDate = listDataDate.get(0).getDataDate();
  490. String maxDataDate = listDataDate.get(listDataDate.size() - 1).getDataDate();
  491. List<String> list = DateUtils.getBetweenDates(minDataDate,maxDataDate);
  492. int cnt = 0;
  493. for (String date : list) {
  494. if(dataDateList.contains(date)){
  495. cnt++;
  496. } else {
  497. cnt = 0;
  498. }
  499. if(cnt >= strangerDays) {
  500. return IsContinueEnum.YES.getValue();
  501. }
  502. }
  503. return IsContinueEnum.NO.getValue();
  504. }
  505. }