From c5e01958fc1af228ec6b4ea35bcf4a3176a5b115 Mon Sep 17 00:00:00 2001 From: wangsixiang <2970484253@qq.com> Date: Wed, 10 Apr 2024 08:35:12 +0800 Subject: [PATCH 01/18] =?UTF-8?q?=E7=AD=96=E7=95=A5=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E7=BB=93=E6=9D=9F,=E4=BA=BA=E5=91=98=E5=88=86=E9=85=8D?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DcWarningController.java | 5 + .../com/zc/business/domain/DcEmployees.java | 22 ++ .../com/zc/business/domain/DcWarning.java | 2 +- .../zc/business/mapper/DcWarningMapper.java | 8 +- .../business/service/IDcWarningService.java | 3 + .../service/impl/DcWarningServiceImpl.java | 355 +++++++++--------- .../mapper/business/DcEmployeesMapper.xml | 13 +- .../mapper/business/DcWarningMapper.xml | 16 +- 8 files changed, 246 insertions(+), 178 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java b/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java index 29c9a7c9..c1c34e59 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java @@ -136,4 +136,9 @@ public class DcWarningController extends BaseController return dcWarningService.batchConvert(dcWarningBatchConvert); } + //定时任务,定时结束部分事件 + @PostMapping("/endSection") + public AjaxResult updateEndSection(){ + return toAjax(dcWarningService.updateEndSection()); + } } diff --git a/zc-business/src/main/java/com/zc/business/domain/DcEmployees.java b/zc-business/src/main/java/com/zc/business/domain/DcEmployees.java index a5fe4c71..ef714391 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcEmployees.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcEmployees.java @@ -49,6 +49,27 @@ public class DcEmployees extends BaseEntity private String organizationName; private Long parentId; + //人员类型1为路管人员2为应急人员 + @Excel(name = "人员类型 1-路管人员 2-应急人员") + private Long employeesType; + //类型参数 + private String type; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public Long getEmployeesType() { + return employeesType; + } + + public void setEmployeesType(Long employeesType) { + this.employeesType = employeesType; + } public Long getParentId() { return parentId; @@ -130,6 +151,7 @@ public class DcEmployees extends BaseEntity .append("contactNumber", getContactNumber()) .append("createTime", getCreateTime()) .append("updateTime", getUpdateTime()) + .append("employeesType", getEmployeesType()) .toString(); } } diff --git a/zc-business/src/main/java/com/zc/business/domain/DcWarning.java b/zc-business/src/main/java/com/zc/business/domain/DcWarning.java index e67f7faa..311ca679 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcWarning.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcWarning.java @@ -98,7 +98,7 @@ public class DcWarning extends BaseEntity //事件原因 private String eventCause; //完结时间 - @JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8") private Date endTime; //操作员 private String userName; diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java index 431af111..322a0dd7 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java @@ -1,5 +1,6 @@ package com.zc.business.mapper; +import java.util.Date; import java.util.HashMap; import java.util.List; @@ -83,5 +84,10 @@ public interface DcWarningMapper public List selectDcWaringStrategyList(@Param("warningSource")String warningSource,@Param ("warningType")String warningType,@Param("warningSubclass")String warningSubclass,@Param("strategy")Integer strategy); //修改配置 - public Integer updateOtherConfig(@Param("id")String id,@Param("otherConfig")String otherConfig); + public Integer updateOtherConfig(@Param("id")String id,@Param("otherConfig")String otherConfig,@Param("endTime") Date endTime ); + + //定时结束部分事件 + public Integer updateEndSection(@Param("dcWarningList") List dcWarningList); + //查询当天全部可以结束的事件 + public List selectEndSection(); } diff --git a/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java b/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java index d046a7ef..54c65999 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java @@ -6,6 +6,7 @@ import java.util.List; import com.ruoyi.common.core.domain.AjaxResult; import com.zc.business.domain.DcWarning; import com.zc.business.domain.DcWarningBatchConvert; +import org.apache.ibatis.annotations.Param; import org.springframework.web.bind.annotation.RequestBody; /** @@ -81,4 +82,6 @@ public interface IDcWarningService */ AjaxResult batchConvert(DcWarningBatchConvert dcWarningBatchConvert); + //定时结束部分事件 + Integer updateEndSection(); } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java index 25747caa..c2203f31 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java @@ -120,7 +120,8 @@ public class DcWarningServiceImpl implements IDcWarningService HashMap redisValueTwo = redisWarningStrategy.get(redisKye+"2");//查看传入的事件类型是否配置策略2(延迟策略) if (redisValueTwo!=null){ //执行策略2, String strategyTime = redisValueTwo.get("strategyTime").toString();//策略时长 - if (dataId==null){//如果不存在直接加入数据库,加入缓存,配置对应的过期时间 + dcWarning.setEndTime(DateUtils.getObtainDateAfter(Integer.parseInt(strategyTime)));//注入过期时间 + if (dataId==null){//如果不存在直接加入数据库,加入缓存,配置对应的缓存过期时间以及数据库过期时间 int insertDcWarning = dcWarningMapper.insertDcWarning(dcWarning);//加入数据库 if (insertDcWarning==0){ return 0; @@ -131,7 +132,7 @@ public class DcWarningServiceImpl implements IDcWarningService } //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置,重新定义延迟时间 HashMap map = dcWarningMapper.selectDcWarningById(dataId); - if (map==null||(map.get("warningState")!=null&&!map.get("warningState").toString().equals("1"))){//redis中有id但是数据库中没有这条数据,或则数据库中有数据但是状态不为上报,那就删除这条redis数据,新数据加入到数据库,并加入到redis + if (map==null||(map.get("warningState")!=null&&map.get("warningState").toString().equals("4"))){//redis中有id但是数据库中没有这条数据,或则数据库中有数据但是状态不为结束,那就删除这条redis数据,新数据加入到数据库,并加入到redis redisCache.deleteObject(WARNINGDATA+key); String id = dcWarning.getId(); redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES); @@ -156,185 +157,185 @@ public class DcWarningServiceImpl implements IDcWarningService jsonObjectOne.put("videoList",videoList); } redisCache.setCacheObject(WARNINGDATA+key,dataId,Integer.parseInt(strategyTime),TimeUnit.MINUTES);//重新设置延迟时间 - return dcWarningMapper.updateOtherConfig(dataId,jsonObjectOne.toString());//修改数据库配置 + return dcWarningMapper.updateOtherConfig(dataId,jsonObjectOne.toString(),dcWarning.getEndTime());//修改数据库配置 } DcWarningServiceImpl dcWarningService = new DcWarningServiceImpl();//合成工具类 JSONObject jsonObject = dcWarningService.mergeJsonObjects(jsonObjectOne, jsonObjectTwo); redisCache.setCacheObject(WARNINGDATA+key,dataId,Integer.parseInt(strategyTime),TimeUnit.MINUTES);//重新设置延迟时间 - return dcWarningMapper.updateOtherConfig(dataId, jsonObject.toString());//修改数据库配置 + return dcWarningMapper.updateOtherConfig(dataId, jsonObject.toString(),dcWarning.getEndTime());//修改数据库配置 } return dcWarningMapper.insertDcWarning(dcWarning);//如果没有配置策略直接加入数据库; } //优先级策略(还差优先级策略需要配置) - public int priority(DcWarning dcWarning){ - dcWarning.setCreateTime(DateUtils.getNowDate()); - //设置事件Id UUID无下划线格式32 - String uuid = IdUtils.fastSimpleUUID(); - dcWarning.setId(uuid); - if (StringUtils.isBlank(dcWarning.getStakeMark())||dcWarning.getWarningSource()==null||dcWarning.getWarningType()==null|| - StringUtils.isBlank(dcWarning.getWarningSubclass())||StringUtils.isBlank(dcWarning.getDirection())){ - return 0; - } - String redisKye=dcWarning.getWarningSource().toString()+dcWarning.getWarningType().toString()+dcWarning.getWarningSubclass();//配置数据的key 事件源+事件类型+策略 - Map redisWarningStrategy = redisCache.getCacheMap(WARNINGSTRATEGY);//获取缓存全部的配置数据 - if (redisWarningStrategy==null||redisWarningStrategy.size()==0){//如果缓存为空,查询数据重新加入缓存 - Map redisMap = new HashMap<>(); - List dcWaringStrategies = dcWarningMapper.selectDcWaringStrategyList();//数据库全部配置数据 - for (DcWaringStrategy waringStrategy : dcWaringStrategies) { - String key = waringStrategy.getWarningSource().toString() + waringStrategy.getWarningType().toString() - + waringStrategy.getWarningSubclass()+waringStrategy.getStrategy().toString();//redis配置数据key - JSONObject jsonObject = new JSONObject(); - jsonObject.put("strategy", waringStrategy.getStrategy());//策略模式 - jsonObject.put("strategyTime", waringStrategy.getStrategyTime());//模式时长,单位为分钟 - jsonObject.put("priority", waringStrategy.getPriority());//优先级 - redisMap.put(key, jsonObject); - } - redisCache.setCacheMap(WARNINGSTRATEGY, redisMap);//数据库配置数据加入缓存中 - redisWarningStrategy = redisCache.getCacheMap(WARNINGSTRATEGY);//缓存数据为空重新加入到缓存在取出缓存的配置 - } - String key=dcWarning.getStakeMark()+dcWarning.getDirection()+dcWarning.getWarningSource(). - toString()+dcWarning.getWarningType().toString()+dcWarning.getWarningSubclass();//key,redis存储事件的key(桩号+方向+事件源+类型) - String dataId = redisCache.getCacheObject(WARNINGDATA + key);//查看redis是否存在数据(id的值) - HashMap redisValueOne = redisWarningStrategy.get(redisKye+"1");//查看传入的事件类型是否配置策略1(优先级策略) - if(redisValueOne!=null){//执行策略1(暂时未定义,定义后开发) - String priority = redisValueOne.get("priority").toString();//全部的优先等级 - String[] split = priority.split(","); - for (int i = 0; i < split.length; i++){ - String priorityValue=split[i];//取出当前循环的优先级类型 - String keys=dcWarning.getStakeMark()+dcWarning.getDirection()+dcWarning.getWarningSource(). - toString()+dcWarning.getWarningType().toString()+priorityValue;//redis存储事件的key - String dataIds = redisCache.getCacheObject(WARNINGDATA + keys);//查看redis是否存在数据(id的值) - if (dataIds==null){ //没有对应的优先级类型的id值,结束当前循环 - continue; - } - //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置 - HashMap map = dcWarningMapper.selectDcWarningById(dataId); - if (map==null){//redis中有id但是数据库中没有这条数据,那就直接新增这个事件 - return dcWarningMapper.insertDcWarning(dcWarning); - } - String warningState = map.get("warningState").toString();//事件上报状态 - if ("1".equals(warningState)==false){ //状态不为上报,不用合成事件,删除之前的redis数据 - redisCache.deleteObject(WARNINGDATA+keys); - continue; - } - String otherConfig=""; - if (map.get("otherConfig")!=null){ - otherConfig = map.get("otherConfig").toString(); //取出原id的配置信息 - } - String otherConfigString = dcWarning.getOtherConfig();//新增的配置信息 - JSONObject jsonObjectOne = new JSONObject(otherConfig); - JSONObject jsonObjectTwo = new JSONObject(otherConfigString); - DcWarningServiceImpl dcWarningService = new DcWarningServiceImpl();//合成新的json - JSONObject jsonObject = dcWarningService.mergeJsonObjects(jsonObjectOne, jsonObjectTwo); - return dcWarningMapper.updateOtherConfig(dataId, jsonObject.toString());//修改数据库配置 - } - } - HashMap redisValueTwo = redisWarningStrategy.get(redisKye+"2");//查看传入的事件类型是否配置策略2(延迟策略) - if (redisValueTwo!=null){ //执行策略2,执行到这里说明1不存在或者1未满足过滤条件 - String strategyTime = redisValueTwo.get("strategyTime").toString();//策略时长 - if (dataId==null){//如果不存在直接加入数据库,加入缓存,配置对应的过期时间 - int insertDcWarning = dcWarningMapper.insertDcWarning(dcWarning);//加入数据库 - if (insertDcWarning==0){ - return 0; - } - String id = dcWarning.getId();//取出加入后的id作为value - redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES);//加入缓存并设置延迟时间(单位分钟) - return 1;//结束 - } - //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置,重新定义延迟时间 - HashMap map = dcWarningMapper.selectDcWarningById(dataId); - if (map==null){//redis中有id但是数据库中没有这条数据,那就删除这条redis数据,新数据加入到数据库,并加入到redis - redisCache.deleteObject(WARNINGDATA+key); - dcWarningMapper.insertDcWarning(dcWarning); - String id = dcWarning.getId(); - redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES); - return 1; - } - String otherConfig=""; - if (map.get("otherConfig")!=null){ - otherConfig = map.get("otherConfig").toString(); //取出原id的配置信息 - } - String otherConfigString = dcWarning.getOtherConfig();//新增的配置信息 - JSONObject jsonObjectOne = new JSONObject(otherConfig); - JSONObject jsonObjectTwo = new JSONObject(otherConfigString); - DcWarningServiceImpl dcWarningService = new DcWarningServiceImpl();//合成新的json - JSONObject jsonObject = dcWarningService.mergeJsonObjects(jsonObjectOne, jsonObjectTwo); - Integer integer = dcWarningMapper.updateOtherConfig(dataId, jsonObject.toString());//修改数据库配置 - redisCache.setCacheObject(WARNINGDATA+key,dataId,Integer.parseInt(strategyTime),TimeUnit.MINUTES);//重新设置延迟时间 - if (integer==0){ - return 0; - } - return 1; - } - HashMap redisValueThree = redisWarningStrategy.get(redisKye+"3");//查看传入的事件类型是否配置策略3(时间窗口策略) - if (redisValueTwo==null&&redisValueThree!=null){ //执行策略3,执行到这里说明1不存在或者2不存在或者1未满足过滤条件 - String strategyTime = redisValueThree.get("strategyTime").toString();//策略时长 - if (dataId==null){//如果不存在直接加入数据库,加入缓存,配置对应的过期时间 - int insertDcWarning = dcWarningMapper.insertDcWarning(dcWarning);//加入数据库 - if (insertDcWarning==0){ - return 0; - } - String id = dcWarning.getId();//取出加入后的id作为value - redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES);//加入缓存并设置延迟时间(单位分钟) - return 1;//结束 - } - //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置 - HashMap map = dcWarningMapper.selectDcWarningById(dataId); - if (map==null){//redis中有id但是数据库中没有这条数据,那就删除这条redis数据,新数据加入到数据库,并加入到redis - redisCache.deleteObject(WARNINGDATA+key); - dcWarningMapper.insertDcWarning(dcWarning); - String id = dcWarning.getId(); - redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES); - return 1; - } - String otherConfig=""; - otherConfig = map.get("otherConfig").toString();//取出原id的配置信息 - String otherConfigString = dcWarning.getOtherConfig();//新增的配置信息 - JSONObject jsonObjectOne = new JSONObject(otherConfig); - JSONObject jsonObjectTwo = new JSONObject(otherConfigString); - JSONObject jsonObject = new DcWarningServiceImpl().mergeJsonObjects(jsonObjectOne, jsonObjectTwo);//合成新的json - Integer integer = dcWarningMapper.updateOtherConfig(dataId, jsonObject.toString());//修改数据库配置 - if (integer==0){ - return 0; - } - return 1; - } - HashMap redisValueFour = redisWarningStrategy.get(redisKye+"4");//查看传入的事件类型是否配置策略3(自动结束策略) - if (redisValueTwo==null&&redisValueThree==null&&redisValueFour!=null){ //执行策略4,执行到这里说明1不存在或者2、3不存在或者1未满足过滤条件 - if (dataId==null){//如果不存在直接加入数据库,加入缓存 - int insertDcWarning = dcWarningMapper.insertDcWarning(dcWarning);//加入数据库 - if (insertDcWarning==0){ - return 0; - } - String id = dcWarning.getId();//取出加入后的id作为value - redisCache.setCacheObject(WARNINGDATA+key,id,24,TimeUnit.HOURS);//加入缓存,防止redis数据累计,这里也要设置过期时间,设置为24小时 - return 1;//结束 - } - //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置 - HashMap map = dcWarningMapper.selectDcWarningById(dataId); - if (map==null){//redis中有id但是数据库中没有这条数据,那就删除这条redis数据,新数据加入到数据库,并加入到redis - redisCache.deleteObject(WARNINGDATA+key); - dcWarningMapper.insertDcWarning(dcWarning); - String id = dcWarning.getId(); - redisCache.setCacheObject(WARNINGDATA+key,id); - return 1; - } - String otherConfig=""; - otherConfig = map.get("otherConfig").toString();//取出原id的配置信息 - String otherConfigString = dcWarning.getOtherConfig();//新增的配置信息 - JSONObject jsonObjectOne = new JSONObject(otherConfig); - JSONObject jsonObjectTwo = new JSONObject(otherConfigString); - JSONObject jsonObject = new DcWarningServiceImpl().mergeJsonObjects(jsonObjectOne, jsonObjectTwo);//合成新的json - Integer integer = dcWarningMapper.updateOtherConfig(dataId, jsonObject.toString());//修改数据库配置 - redisCache.deleteObject(WARNINGDATA + key);//删除redis存储的数据 - if (integer==0){ - return 0; - } - return 1; - } - return dcWarningMapper.insertDcWarning(dcWarning);//如果没有配置策略直接加入数据库; - } +// public int priority(DcWarning dcWarning){ +// dcWarning.setCreateTime(DateUtils.getNowDate()); +// //设置事件Id UUID无下划线格式32 +// String uuid = IdUtils.fastSimpleUUID(); +// dcWarning.setId(uuid); +// if (StringUtils.isBlank(dcWarning.getStakeMark())||dcWarning.getWarningSource()==null||dcWarning.getWarningType()==null|| +// StringUtils.isBlank(dcWarning.getWarningSubclass())||StringUtils.isBlank(dcWarning.getDirection())){ +// return 0; +// } +// String redisKye=dcWarning.getWarningSource().toString()+dcWarning.getWarningType().toString()+dcWarning.getWarningSubclass();//配置数据的key 事件源+事件类型+策略 +// Map redisWarningStrategy = redisCache.getCacheMap(WARNINGSTRATEGY);//获取缓存全部的配置数据 +// if (redisWarningStrategy==null||redisWarningStrategy.size()==0){//如果缓存为空,查询数据重新加入缓存 +// Map redisMap = new HashMap<>(); +// List dcWaringStrategies = dcWarningMapper.selectDcWaringStrategyList();//数据库全部配置数据 +// for (DcWaringStrategy waringStrategy : dcWaringStrategies) { +// String key = waringStrategy.getWarningSource().toString() + waringStrategy.getWarningType().toString() +// + waringStrategy.getWarningSubclass()+waringStrategy.getStrategy().toString();//redis配置数据key +// JSONObject jsonObject = new JSONObject(); +// jsonObject.put("strategy", waringStrategy.getStrategy());//策略模式 +// jsonObject.put("strategyTime", waringStrategy.getStrategyTime());//模式时长,单位为分钟 +// jsonObject.put("priority", waringStrategy.getPriority());//优先级 +// redisMap.put(key, jsonObject); +// } +// redisCache.setCacheMap(WARNINGSTRATEGY, redisMap);//数据库配置数据加入缓存中 +// redisWarningStrategy = redisCache.getCacheMap(WARNINGSTRATEGY);//缓存数据为空重新加入到缓存在取出缓存的配置 +// } +// String key=dcWarning.getStakeMark()+dcWarning.getDirection()+dcWarning.getWarningSource(). +// toString()+dcWarning.getWarningType().toString()+dcWarning.getWarningSubclass();//key,redis存储事件的key(桩号+方向+事件源+类型) +// String dataId = redisCache.getCacheObject(WARNINGDATA + key);//查看redis是否存在数据(id的值) +// HashMap redisValueOne = redisWarningStrategy.get(redisKye+"1");//查看传入的事件类型是否配置策略1(优先级策略) +// if(redisValueOne!=null){//执行策略1(暂时未定义,定义后开发) +// String priority = redisValueOne.get("priority").toString();//全部的优先等级 +// String[] split = priority.split(","); +// for (int i = 0; i < split.length; i++){ +// String priorityValue=split[i];//取出当前循环的优先级类型 +// String keys=dcWarning.getStakeMark()+dcWarning.getDirection()+dcWarning.getWarningSource(). +// toString()+dcWarning.getWarningType().toString()+priorityValue;//redis存储事件的key +// String dataIds = redisCache.getCacheObject(WARNINGDATA + keys);//查看redis是否存在数据(id的值) +// if (dataIds==null){ //没有对应的优先级类型的id值,结束当前循环 +// continue; +// } +// //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置 +// HashMap map = dcWarningMapper.selectDcWarningById(dataId); +// if (map==null){//redis中有id但是数据库中没有这条数据,那就直接新增这个事件 +// return dcWarningMapper.insertDcWarning(dcWarning); +// } +// String warningState = map.get("warningState").toString();//事件上报状态 +// if ("1".equals(warningState)==false){ //状态不为上报,不用合成事件,删除之前的redis数据 +// redisCache.deleteObject(WARNINGDATA+keys); +// continue; +// } +// String otherConfig=""; +// if (map.get("otherConfig")!=null){ +// otherConfig = map.get("otherConfig").toString(); //取出原id的配置信息 +// } +// String otherConfigString = dcWarning.getOtherConfig();//新增的配置信息 +// JSONObject jsonObjectOne = new JSONObject(otherConfig); +// JSONObject jsonObjectTwo = new JSONObject(otherConfigString); +// DcWarningServiceImpl dcWarningService = new DcWarningServiceImpl();//合成新的json +// JSONObject jsonObject = dcWarningService.mergeJsonObjects(jsonObjectOne, jsonObjectTwo); +// return dcWarningMapper.updateOtherConfig(dataId, jsonObject.toString());//修改数据库配置 +// } +// } +// HashMap redisValueTwo = redisWarningStrategy.get(redisKye+"2");//查看传入的事件类型是否配置策略2(延迟策略) +// if (redisValueTwo!=null){ //执行策略2,执行到这里说明1不存在或者1未满足过滤条件 +// String strategyTime = redisValueTwo.get("strategyTime").toString();//策略时长 +// if (dataId==null){//如果不存在直接加入数据库,加入缓存,配置对应的过期时间 +// int insertDcWarning = dcWarningMapper.insertDcWarning(dcWarning);//加入数据库 +// if (insertDcWarning==0){ +// return 0; +// } +// String id = dcWarning.getId();//取出加入后的id作为value +// redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES);//加入缓存并设置延迟时间(单位分钟) +// return 1;//结束 +// } +// //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置,重新定义延迟时间 +// HashMap map = dcWarningMapper.selectDcWarningById(dataId); +// if (map==null){//redis中有id但是数据库中没有这条数据,那就删除这条redis数据,新数据加入到数据库,并加入到redis +// redisCache.deleteObject(WARNINGDATA+key); +// dcWarningMapper.insertDcWarning(dcWarning); +// String id = dcWarning.getId(); +// redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES); +// return 1; +// } +// String otherConfig=""; +// if (map.get("otherConfig")!=null){ +// otherConfig = map.get("otherConfig").toString(); //取出原id的配置信息 +// } +// String otherConfigString = dcWarning.getOtherConfig();//新增的配置信息 +// JSONObject jsonObjectOne = new JSONObject(otherConfig); +// JSONObject jsonObjectTwo = new JSONObject(otherConfigString); +// DcWarningServiceImpl dcWarningService = new DcWarningServiceImpl();//合成新的json +// JSONObject jsonObject = dcWarningService.mergeJsonObjects(jsonObjectOne, jsonObjectTwo); +// Integer integer = dcWarningMapper.updateOtherConfig(dataId, jsonObject.toString());//修改数据库配置 +// redisCache.setCacheObject(WARNINGDATA+key,dataId,Integer.parseInt(strategyTime),TimeUnit.MINUTES);//重新设置延迟时间 +// if (integer==0){ +// return 0; +// } +// return 1; +// } +// HashMap redisValueThree = redisWarningStrategy.get(redisKye+"3");//查看传入的事件类型是否配置策略3(时间窗口策略) +// if (redisValueTwo==null&&redisValueThree!=null){ //执行策略3,执行到这里说明1不存在或者2不存在或者1未满足过滤条件 +// String strategyTime = redisValueThree.get("strategyTime").toString();//策略时长 +// if (dataId==null){//如果不存在直接加入数据库,加入缓存,配置对应的过期时间 +// int insertDcWarning = dcWarningMapper.insertDcWarning(dcWarning);//加入数据库 +// if (insertDcWarning==0){ +// return 0; +// } +// String id = dcWarning.getId();//取出加入后的id作为value +// redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES);//加入缓存并设置延迟时间(单位分钟) +// return 1;//结束 +// } +// //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置 +// HashMap map = dcWarningMapper.selectDcWarningById(dataId); +// if (map==null){//redis中有id但是数据库中没有这条数据,那就删除这条redis数据,新数据加入到数据库,并加入到redis +// redisCache.deleteObject(WARNINGDATA+key); +// dcWarningMapper.insertDcWarning(dcWarning); +// String id = dcWarning.getId(); +// redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES); +// return 1; +// } +// String otherConfig=""; +// otherConfig = map.get("otherConfig").toString();//取出原id的配置信息 +// String otherConfigString = dcWarning.getOtherConfig();//新增的配置信息 +// JSONObject jsonObjectOne = new JSONObject(otherConfig); +// JSONObject jsonObjectTwo = new JSONObject(otherConfigString); +// JSONObject jsonObject = new DcWarningServiceImpl().mergeJsonObjects(jsonObjectOne, jsonObjectTwo);//合成新的json +// Integer integer = dcWarningMapper.updateOtherConfig(dataId, jsonObject.toString());//修改数据库配置 +// if (integer==0){ +// return 0; +// } +// return 1; +// } +// HashMap redisValueFour = redisWarningStrategy.get(redisKye+"4");//查看传入的事件类型是否配置策略3(自动结束策略) +// if (redisValueTwo==null&&redisValueThree==null&&redisValueFour!=null){ //执行策略4,执行到这里说明1不存在或者2、3不存在或者1未满足过滤条件 +// if (dataId==null){//如果不存在直接加入数据库,加入缓存 +// int insertDcWarning = dcWarningMapper.insertDcWarning(dcWarning);//加入数据库 +// if (insertDcWarning==0){ +// return 0; +// } +// String id = dcWarning.getId();//取出加入后的id作为value +// redisCache.setCacheObject(WARNINGDATA+key,id,24,TimeUnit.HOURS);//加入缓存,防止redis数据累计,这里也要设置过期时间,设置为24小时 +// return 1;//结束 +// } +// //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置 +// HashMap map = dcWarningMapper.selectDcWarningById(dataId); +// if (map==null){//redis中有id但是数据库中没有这条数据,那就删除这条redis数据,新数据加入到数据库,并加入到redis +// redisCache.deleteObject(WARNINGDATA+key); +// dcWarningMapper.insertDcWarning(dcWarning); +// String id = dcWarning.getId(); +// redisCache.setCacheObject(WARNINGDATA+key,id); +// return 1; +// } +// String otherConfig=""; +// otherConfig = map.get("otherConfig").toString();//取出原id的配置信息 +// String otherConfigString = dcWarning.getOtherConfig();//新增的配置信息 +// JSONObject jsonObjectOne = new JSONObject(otherConfig); +// JSONObject jsonObjectTwo = new JSONObject(otherConfigString); +// JSONObject jsonObject = new DcWarningServiceImpl().mergeJsonObjects(jsonObjectOne, jsonObjectTwo);//合成新的json +// Integer integer = dcWarningMapper.updateOtherConfig(dataId, jsonObject.toString());//修改数据库配置 +// redisCache.deleteObject(WARNINGDATA + key);//删除redis存储的数据 +// if (integer==0){ +// return 0; +// } +// return 1; +// } +// return dcWarningMapper.insertDcWarning(dcWarning);//如果没有配置策略直接加入数据库; +// } private JSONObject mergeJsonObjects(JSONObject jsonObjectOne, JSONObject jsonObjectTwo){ // 合并videoList if (jsonObjectTwo.has("videoList")) { @@ -532,4 +533,14 @@ public class DcWarningServiceImpl implements IDcWarningService return AjaxResult.success("批量操作成功"); } + //定时结束部分事件 + @Override + public Integer updateEndSection() { + List dcWarnings = dcWarningMapper.selectEndSection();//全部应该结束事件的id + if (dcWarnings.size()==0){ + return 1; + } + return dcWarningMapper.updateEndSection(dcWarnings); + } + } diff --git a/zc-business/src/main/resources/mapper/business/DcEmployeesMapper.xml b/zc-business/src/main/resources/mapper/business/DcEmployeesMapper.xml index df1b2dd0..3462b34c 100644 --- a/zc-business/src/main/resources/mapper/business/DcEmployeesMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcEmployeesMapper.xml @@ -14,13 +14,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + - select employees.id, employees.post_id, employees.organization_id, + select employees.employees_type,employees.id, employees.post_id, employees.organization_id, organization.organization_name,post.post_name, employees.name, employees.contact_number, - employees.create_time, employees.update_time from dc_employees as employees + employees.create_time, employees.update_time, + CASE + WHEN employees.employees_type = 1 THEN '路管人员' + WHEN employees.employees_type = 2 THEN '应急人员' + END AS type + from dc_employees as employees left join dc_organization as organization on organization.id=employees.organization_id left join sys_post as post on post.post_id=employees.post_id @@ -50,6 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" contact_number, create_time, update_time, + employees_type, #{id}, @@ -59,6 +66,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{contactNumber}, #{createTime}, #{updateTime}, + #{employeesType}, @@ -71,6 +79,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" contact_number = #{contactNumber}, create_time = #{createTime}, update_time = #{updateTime}, + employees_type = #{employeesType}, where id = #{id} diff --git a/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml b/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml index 9aa85077..7b3d8c07 100644 --- a/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml @@ -122,6 +122,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" other_config, lane, vehicle_type, + end_time, #{id}, @@ -142,6 +143,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{otherConfig}, #{lane}, #{vehicleType}, + #{endTime}, @@ -182,9 +184,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - update dc_warning set other_config=#{otherConfig},update_time=now() where id=#{id} + update dc_warning set other_config=#{otherConfig},update_time=now(),end_time=#{endTime} where id=#{id} + + + update dc_warning set warning_state = 4 + where id in + + #{item.id} + - delete from dc_warning where id = #{id} @@ -233,5 +242,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and strategy = #{strategy} + From 51e1b4dc0c0bb8c0312ad5fc4cfc44660107782e Mon Sep 17 00:00:00 2001 From: wangsixiang <2970484253@qq.com> Date: Wed, 10 Apr 2024 08:35:34 +0800 Subject: [PATCH 02/18] =?UTF-8?q?=E6=97=B6=E9=97=B4=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/ruoyi/common/utils/DateUtils.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java index b67b57b9..b6f7bd65 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java @@ -8,6 +8,7 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; import java.time.ZonedDateTime; +import java.util.Calendar; import java.util.Date; import org.apache.commons.lang3.time.DateFormatUtils; @@ -184,4 +185,15 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); return Date.from(zdt.toInstant()); } + /** + * 获取当前时间,time分钟后的时间 + */ + public static Date getObtainDateAfter(int time){ + Date now = new Date(); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(now); + calendar.add(Calendar.MINUTE, time); + Date fiveMinutesLater = calendar.getTime(); + return fiveMinutesLater; + } } From bb2011d9377b1101ca4c21576f2db02634858aba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E7=90=B3?= <1911390090@qq.com> Date: Wed, 10 Apr 2024 15:34:48 +0800 Subject: [PATCH 03/18] =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E4=BA=8B=E4=BB=B6id?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=8B=E4=BB=B6id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DcEventController.java | 8 +++ .../java/com/zc/business/domain/DcEvent.java | 4 +- .../domain/DcEventTrafficControl.java | 2 + .../com/zc/business/mapper/DcEventMapper.java | 2 + .../zc/business/service/IDcEventService.java | 2 + .../service/impl/DcEventServiceImpl.java | 63 ++++++++++++++++++- .../mapper/business/DcEventMapper.xml | 10 +++ 7 files changed, 87 insertions(+), 4 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/DcEventController.java b/zc-business/src/main/java/com/zc/business/controller/DcEventController.java index 6d5d060b..f075ffe3 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcEventController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcEventController.java @@ -161,5 +161,13 @@ public class DcEventController extends BaseController return map; } + @ApiOperation("根据事件id修改事件状态") + // @PreAuthorize("@ss.hasPermi('system:event:edit')") + @Log(title = "事件信息", businessType = BusinessType.UPDATE) + @PutMapping("/dcEventState/{id}/{state}") + public AjaxResult dcEventState(@PathVariable("id") String id,@PathVariable("state") int state) + { + return toAjax(dcEventService.updateDcEventState(id,state)); + } } diff --git a/zc-business/src/main/java/com/zc/business/domain/DcEvent.java b/zc-business/src/main/java/com/zc/business/domain/DcEvent.java index 172107f8..3d2c7750 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcEvent.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcEvent.java @@ -298,6 +298,6 @@ public class DcEvent { private String remark; private String subclass; - - +@ApiModelProperty("关联管制事件id") +private String linkId; } diff --git a/zc-business/src/main/java/com/zc/business/domain/DcEventTrafficControl.java b/zc-business/src/main/java/com/zc/business/domain/DcEventTrafficControl.java index 2b0cffc5..32c2b6fa 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcEventTrafficControl.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcEventTrafficControl.java @@ -97,4 +97,6 @@ public class DcEventTrafficControl extends BaseEntity @TableField(exist = false) private DcFacility dcFacility; + @TableField(exist = false) + private Long[] facilityIds; // 数组存储多个设备ID } diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcEventMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcEventMapper.java index c82f85ef..b4be7c31 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcEventMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcEventMapper.java @@ -4,6 +4,7 @@ package com.zc.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zc.business.domain.DcEvent; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; import java.util.Map; @@ -83,6 +84,7 @@ public interface DcEventMapper extends BaseMapper */ boolean batchInsertDcEvent(List eventList); + int updateDcEventState(@Param("id") String id,@Param("state") int state); } diff --git a/zc-business/src/main/java/com/zc/business/service/IDcEventService.java b/zc-business/src/main/java/com/zc/business/service/IDcEventService.java index ed7ce542..e97685fe 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcEventService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcEventService.java @@ -89,4 +89,6 @@ public interface IDcEventService Map selectCount(); List eventPileNumberQueryEvent(Map parameter); + + int updateDcEventState(String id, int state); } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java index 53846d7b..fb759fcc 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java @@ -6,6 +6,7 @@ import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.system.service.ISysDeptService; +import com.sun.xml.bind.v2.TODO; import com.zc.business.domain.*; import com.zc.business.mapper.*; import com.zc.business.service.IDcEventService; @@ -121,6 +122,10 @@ public class DcEventServiceImpl extends ServiceImpl impl */ @Override public int insertDcEvent(DcEvent dcEvent) { + + String dcEventId =dcEvent.getId(); + + //获取事件类型 int eventType = Math.toIntExact(dcEvent.getEventType()); @@ -196,8 +201,57 @@ public class DcEventServiceImpl extends ServiceImpl impl //交通管制 case 3: if (dcEvent.getDcEventTrafficControl() != null) { - dcEvent.getDcEventTrafficControl().setId(uuid); - int i6 = dcEventTrafficControlMapper.insertDcEventTrafficControl(dcEvent.getDcEventTrafficControl()); + //TODO 插入多个收费站 + if (dcEvent.getDcEventTrafficControl().getFacilityIds().length==1){//facilityIds==1 说明只选择了一个收费站 + dcEvent.getDcEventTrafficControl().setId(uuid); + dcEvent.getDcEventTrafficControl().setFacilityId(dcEvent.getDcEventTrafficControl().getFacilityIds()[0]);//取出数组字段赋值 设施id + int i6 = dcEventTrafficControlMapper.insertDcEventTrafficControl(dcEvent.getDcEventTrafficControl()); + }else { + dcEventMapper.deleteDcEventById(uuid);//删除添加的事件主类 + Map map = new HashMap<>(); + for (int i = 0; i < dcEvent.getDcEventTrafficControl().getFacilityIds().length; i++) { //设置事件Id UUID无下划线格式32 + String facilityUUID = IdUtils.fastSimpleUUID(); + map.put("facilityId"+i,facilityUUID);//每循环一次生成一个uuid + Long facilityId = dcEvent.getDcEventTrafficControl().getFacilityIds()[i]; + map.put(facilityUUID, String.valueOf(facilityId));//将uuid作为主键 设施id作为 值 存放map + } + for (int i = 0; i < dcEvent.getDcEventTrafficControl().getFacilityIds().length; i++) { + dcEvent.getDcEventTrafficControl().setId(map.get("facilityId"+i));//交通管制事件id + dcEvent.getDcEventTrafficControl().setFacilityId(dcEvent.getDcEventTrafficControl().getFacilityIds()[i]);//取出数组字段赋值 设施id + + //新增第一条数据 + dcEvent.setId(map.get("facilityId"+i)); + dcEvent.setEventState(0L); + dcEvent.setDeptId(SecurityUtils.getDeptId()); + dcEvent.setUserId(SecurityUtils.getUserId()); + dcEvent.setCreateTime(DateUtils.getNowDate()); + dcEvent.setEventNature(2L);//关联管制 + // 使用StringBuilder来构建逗号分隔的字符串 + StringBuilder sb = new StringBuilder(); + boolean isFirst = true; + // 迭代Map并过滤出不为1的键对应的值 + for (Map.Entry entry : map.entrySet()) { + if (entry.getKey() !="facilityId"+i) { + if (!isFirst) { + sb.append(","); + } + sb.append(entry.getValue()); + isFirst = false; + } + } + String linkId= sb.toString(); + dcEvent.setLinkId(linkId); + //交通管制 + if (eventType ==3 && dcEvent.getDcEventTrafficControl().getFacilityIds()[i] != null) { + String facilityId = String.valueOf(dcEvent.getDcEventTrafficControl().getFacilityIds()[i]); + dcEvent.setStakeMark( extracted(facilityId)); + } + dcEventMapper.insertDcEvent(dcEvent); + int i6 = dcEventTrafficControlMapper.insertDcEventTrafficControl(dcEvent.getDcEventTrafficControl()); + + } + } + } break; //交通拥堵 @@ -723,6 +777,11 @@ public class DcEventServiceImpl extends ServiceImpl impl return dcEvents; } + @Override + public int updateDcEventState(String id, int state) { + return dcEventMapper.updateDcEventState(id,state); + } + public static List castList(Object obj, Class clazz) { List result = new ArrayList(); if (obj instanceof List) { diff --git a/zc-business/src/main/resources/mapper/business/DcEventMapper.xml b/zc-business/src/main/resources/mapper/business/DcEventMapper.xml index 590b58bf..67dea91f 100644 --- a/zc-business/src/main/resources/mapper/business/DcEventMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcEventMapper.xml @@ -639,6 +639,7 @@ where id = #{id} + delete from dc_event where id = #{id} @@ -679,4 +680,13 @@ GROUP BY event_state ) t ON s.event_state = t.event_state; + + + + update dc_event + + event_state = #{state}, + + where id = #{id} + \ No newline at end of file From fd991eb61c8fe0666c4fff082dcf49189829f8cd Mon Sep 17 00:00:00 2001 From: lau572 <1010031226@qq.com> Date: Wed, 10 Apr 2024 15:37:50 +0800 Subject: [PATCH 04/18] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=BD=AE?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DcEventProcessController.java | 20 ++++--- .../zc/business/domain/DcEventProcess.java | 38 ++++++++++---- .../com/zc/business/enums/ValueConverter.java | 45 ++++++++++++++++ .../business/mapper/DcEventProcessMapper.java | 8 +++ .../service/IDcEventProcessService.java | 11 ++++ .../impl/DcEventProcessServiceImpl.java | 43 +++++++++++++++ .../service/impl/DcEventServiceImpl.java | 52 +++++++++++++++++-- .../mapper/business/DcEventProcessMapper.xml | 37 ++++++++++++- 8 files changed, 230 insertions(+), 24 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/DcEventProcessController.java b/zc-business/src/main/java/com/zc/business/controller/DcEventProcessController.java index 275ee8ce..79e0fcf7 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcEventProcessController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcEventProcessController.java @@ -47,9 +47,18 @@ public class DcEventProcessController extends BaseController * 查询事件处理流程列表 */ @ApiOperation("查询事件处理流程列表") - // @PreAuthorize("@ss.hasPermi('system:process:list')") @GetMapping("/list") - public TableDataInfo list(DcEventProcess dcEventProcess) + public List list(DcEventProcess dcEventProcess) + { + return dcEventProcessService.selectDcEventProcessList(dcEventProcess); + } + + /** + * 分页查询事件处理流程列表 + */ + @ApiOperation("分页查询事件处理流程列表") + @GetMapping("/page") + public TableDataInfo page(DcEventProcess dcEventProcess) { startPage(); List list = dcEventProcessService.selectDcEventProcessList(dcEventProcess); @@ -90,12 +99,7 @@ public class DcEventProcessController extends BaseController // @PreAuthorize("@ss.hasPermi('system:process:add')") @Log(title = "事件处理流程", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody DcEventProcess dcEventProcess) throws IOException, InvalidExtensionException { - //如果有文件传入 - if(!dcEventProcess.getFile().isEmpty()){ - String address =FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), dcEventProcess.getFile(), MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); - dcEventProcess.setContext(address); - } + public AjaxResult add(@RequestBody DcEventProcess dcEventProcess){ return toAjax(dcEventProcessService.insertDcEventProcess(dcEventProcess)); } diff --git a/zc-business/src/main/java/com/zc/business/domain/DcEventProcess.java b/zc-business/src/main/java/com/zc/business/domain/DcEventProcess.java index 4295717d..44b884af 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcEventProcess.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcEventProcess.java @@ -47,17 +47,13 @@ public class DcEventProcess private Integer source; /** 1-节点 - 2-信息发布 + 2-信息发布 + 3-设备管控 */ - @ApiModelProperty(value="流程类型") - @Excel(name = "1-节点 2-信息发布 ") + @ApiModelProperty(value="流程类型 1-节点,2-信息发布,3-设备管控") + @Excel(name = "流程类型") private Integer processType; - /** $column.columnComment */ - @ApiModelProperty("内容") - @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") - private String context; - /** $column.columnComment */ @ApiModelProperty("流程ID") @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") @@ -68,6 +64,20 @@ public class DcEventProcess @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") private String processName; + /** $column.columnComment */ + @ApiModelProperty("内容") + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private String context; + + /** $column.type */ + @ApiModelProperty("内容类型") + @Excel(name = "${type}", readConverterExp = "$column.readConverterExp()") + private String type; + + @ApiModelProperty("上传文件") + private MultipartFile file; + + public MultipartFile getFile() { return file; } @@ -76,9 +86,6 @@ public class DcEventProcess this.file = file; } - @ApiModelProperty("上传文件") - private MultipartFile file; - public void setId(Long id) { this.id = id; @@ -161,6 +168,14 @@ public class DcEventProcess return processName; } + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) @@ -173,6 +188,7 @@ public class DcEventProcess .append("context", getContext()) .append("processId", getProcessId()) .append("processName", getProcessName()) + .append("type", getType()) .toString(); } } diff --git a/zc-business/src/main/java/com/zc/business/enums/ValueConverter.java b/zc-business/src/main/java/com/zc/business/enums/ValueConverter.java index 8409dd4e..50512827 100644 --- a/zc-business/src/main/java/com/zc/business/enums/ValueConverter.java +++ b/zc-business/src/main/java/com/zc/business/enums/ValueConverter.java @@ -22,6 +22,11 @@ public class ValueConverter { private static final Map valueMappingSon = new HashMap<>(); // 静态映射,用于存储转换关系 事件源转换 private static final Map valueMappingSource = new HashMap<>(); + // 事件来源名称 + private static final Map eventSourceName = new HashMap<>(); + // 事件类型名称 + private static final Map eventTypeName = new HashMap<>(); + static { valueMappingSource.put(1,5); valueMappingSource.put(4,7); @@ -87,6 +92,26 @@ public class ValueConverter { valueMappingSon.put("11-2", "2-1"); valueMappingSon.put("11-3", "2-1"); valueMappingSon.put("99-1", "11-1"); + + eventSourceName.put("1","96659"); + eventSourceName.put("2","交警转接"); + eventSourceName.put("3","道路巡查"); + eventSourceName.put("4","视频巡查"); + eventSourceName.put("5","视频AI"); + eventSourceName.put("6","一键救援"); + eventSourceName.put("7","其他"); + + eventTypeName.put("1","交通事故"); + eventTypeName.put("2","车辆故障"); + eventTypeName.put("3","交通管制"); + eventTypeName.put("4","交通拥堵"); + eventTypeName.put("5","非法上路"); + eventTypeName.put("6","路障清除"); + eventTypeName.put("7","施工建设"); + eventTypeName.put("8","服务区异常"); + eventTypeName.put("9","设施设备隐患"); + eventTypeName.put("10","异常天气"); + eventTypeName.put("11","其他事件"); } } @@ -100,6 +125,14 @@ public class ValueConverter { public static Map getValueMappingSource() { return ValueMappingHolder.valueMappingSource; } + + public static Map getEventSourceName() { + return ValueMappingHolder.eventSourceName; + } + + public static Map getEventTypeName() { + return ValueMappingHolder.eventTypeName; + } /** * 根据输入值返回转换后的值 * 如果输入值不在映射中,则返回输入值本身 @@ -118,6 +151,18 @@ public class ValueConverter { Map mapping = getValueMappingSource(); return mapping.getOrDefault(inputValue, inputValue); } + + + public static String eventSourceName(String inputValue) { + Map mapping = getEventSourceName(); + return mapping.getOrDefault(inputValue, inputValue); + } + + public static String eventTypeName(String inputValue) { + Map mapping = getEventTypeName(); + return mapping.getOrDefault(inputValue, inputValue); + } + //测试 // @Test // public void text(){ diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcEventProcessMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcEventProcessMapper.java index 0e7668a1..042c50cb 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcEventProcessMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcEventProcessMapper.java @@ -35,6 +35,14 @@ public interface DcEventProcessMapper */ int insertDcEventProcess(DcEventProcess dcEventProcess); + /** + * 批量新增事件处理流程 + * + * @param dcEventProcessList 事件处理流程 + * @return 结果 + */ + boolean batchInsertDcEventProcess(List dcEventProcessList); + /** * 修改事件处理流程 * diff --git a/zc-business/src/main/java/com/zc/business/service/IDcEventProcessService.java b/zc-business/src/main/java/com/zc/business/service/IDcEventProcessService.java index bbe9c157..f0023517 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcEventProcessService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcEventProcessService.java @@ -1,6 +1,9 @@ package com.zc.business.service; +import java.io.IOException; import java.util.List; + +import com.ruoyi.common.exception.file.InvalidExtensionException; import com.zc.business.domain.DcEventProcess; /** @@ -35,6 +38,14 @@ public interface IDcEventProcessService */ int insertDcEventProcess(DcEventProcess dcEventProcess); + /** + * 批量新增事件处理流程 + * + * @param dcEventProcessList 事件处理流程 + * @return 结果 + */ + boolean batchInsertDcEventProcess(List dcEventProcessList); + /** * 修改事件处理流程 * diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEventProcessServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEventProcessServiceImpl.java index e5a2096c..d98b0a7f 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEventProcessServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEventProcessServiceImpl.java @@ -1,6 +1,12 @@ package com.zc.business.service.impl; +import java.io.IOException; import java.util.List; + +import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.exception.file.InvalidExtensionException; +import com.ruoyi.common.utils.file.FileUploadUtils; +import com.ruoyi.common.utils.file.MimeTypeUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.zc.business.mapper.DcEventProcessMapper; @@ -52,9 +58,46 @@ public class DcEventProcessServiceImpl implements IDcEventProcessService @Override public int insertDcEventProcess(DcEventProcess dcEventProcess) { + //如果有文件传入 + if(!dcEventProcess.getFile().isEmpty()){ + try { + String address = FileUploadUtils.upload(RuoYiConfig.getUploadPath(), dcEventProcess.getFile(), MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + dcEventProcess.setContext(address); + String type = address.split("\\.")[1]; + dcEventProcess.setType(type); + } catch (IOException | InvalidExtensionException e){ + e.printStackTrace(); + } + } return dcEventProcessMapper.insertDcEventProcess(dcEventProcess); } + /** + * 新增事件处理流程 + * + * @param dcEventProcessList 事件处理流程 + * @return 结果 + */ + @Override + public boolean batchInsertDcEventProcess(List dcEventProcessList) + { + dcEventProcessList.forEach(dcEventProcess -> { + //如果有文件传入 + if(!dcEventProcess.getFile().isEmpty()){ + try { + String address = FileUploadUtils.upload(RuoYiConfig.getUploadPath(), dcEventProcess.getFile(), MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); + dcEventProcess.setContext(address); + String type = address.split("\\.")[1]; + dcEventProcess.setType(type); + } catch (IOException | InvalidExtensionException e){ + e.printStackTrace(); + } + } + }); + + return dcEventProcessMapper.batchInsertDcEventProcess(dcEventProcessList); + } + /** * 修改事件处理流程 * diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java index 53846d7b..38fdf51a 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java @@ -7,17 +7,16 @@ import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.system.service.ISysDeptService; import com.zc.business.domain.*; +import com.zc.business.enums.ValueConverter; import com.zc.business.mapper.*; +import com.zc.business.service.IDcEventProcessService; import com.zc.business.service.IDcEventService; import com.zc.business.service.IMiddleDatabaseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -67,6 +66,9 @@ public class DcEventServiceImpl extends ServiceImpl impl //查询路网信息 @Autowired private DcFacilityServiceImpl dcFacilityService; + //事件处置记录 + @Autowired + private IDcEventProcessService dcEventProcessService; /** @@ -342,6 +344,25 @@ public class DcEventServiceImpl extends ServiceImpl impl break; } + + //事件处置流程记录 + DcEventProcess dcEventProcess = new DcEventProcess(); + dcEventProcess.setEventId(dcEvent.getId()); + dcEventProcess.setOperationTime(new Date()); + dcEventProcess.setOperator(SecurityUtils.getUserId().toString()); + dcEventProcess.setSource(1); + List processConfigList = dcProcessConfigMapper.selectDcProcessConfigByEventType(dcEvent.getEventType().intValue()); + if (processConfigList != null && processConfigList.size() > 0){ + DcProcessConfig dcProcessConfig = processConfigList.get(0); + dcEventProcess.setProcessType(1); + dcEventProcess.setProcessId(Long.valueOf(dcProcessConfig.getNodeNode())); + dcEventProcess.setProcessName(dcProcessConfig.getProcessNode()); + } + String sourceName = ValueConverter.eventSourceName(dcEvent.getEventSource().toString()); + String typeName = ValueConverter.eventTypeName(dcEvent.getEventType().toString()); + dcEventProcess.setContext("由" + sourceName + "上报了一起" + typeName + "事件"); + dcEventProcessService.insertDcEventProcess(dcEventProcess); + return i7; } else { return -1; @@ -364,6 +385,8 @@ public class DcEventServiceImpl extends ServiceImpl impl if (flag) { //中间库 List mdEventList = new ArrayList<>(); + List dcEventProcessList = new ArrayList<>(); + for (DcEvent dcEvent : dcEventList) { MdEvent mdEvent = new MdEvent(dcEvent); mdEventList.add(mdEvent); @@ -433,8 +456,29 @@ public class DcEventServiceImpl extends ServiceImpl impl break; } + + //事件处置流程记录 + DcEventProcess dcEventProcess = new DcEventProcess(); + dcEventProcess.setEventId(dcEvent.getId()); + dcEventProcess.setOperationTime(new Date()); + dcEventProcess.setOperator(SecurityUtils.getUserId().toString()); + dcEventProcess.setSource(1); + List processConfigList = dcProcessConfigMapper.selectDcProcessConfigByEventType(dcEvent.getEventType().intValue()); + if (processConfigList != null && processConfigList.size() > 0){ + DcProcessConfig dcProcessConfig = processConfigList.get(0); + dcEventProcess.setProcessType(1); + dcEventProcess.setProcessId(Long.valueOf(dcProcessConfig.getNodeNode())); + dcEventProcess.setProcessName(dcProcessConfig.getProcessNode()); + } + String sourceName = ValueConverter.eventSourceName(dcEvent.getEventSource().toString()); + String typeName = ValueConverter.eventTypeName(dcEvent.getEventType().toString()); + dcEventProcess.setContext("由" + sourceName + "上报了一起" + typeName + "事件"); + dcEventProcessList.add(dcEventProcess); } middleDatabaseService.batchInsertMiddleDatabaseEvent(mdEventList); + + //批量插入事件流程记录表 + dcEventProcessService.batchInsertDcEventProcess(dcEventProcessList); } return flag; diff --git a/zc-business/src/main/resources/mapper/business/DcEventProcessMapper.xml b/zc-business/src/main/resources/mapper/business/DcEventProcessMapper.xml index d0a8053f..a4b4986a 100644 --- a/zc-business/src/main/resources/mapper/business/DcEventProcessMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcEventProcessMapper.xml @@ -14,10 +14,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + - select id, event_id, operation_time, operator, source, process_type, context, process_id, process_name from dc_event_process + select id, event_id, operation_time, operator, source, process_type, context, process_id, process_name, `type` from dc_event_process - - - and dept_id = #{deptId} - and stake_mark BETWEEN #{stakeMark} and #{endStakeMark} - and direction = #{direction} - and user_id = #{userId} - and start_time BETWEEN #{startTime} and #{endTime} - and estimated_end_time = #{estimatedEndTime} - and event_level = #{eventLevel} - and event_type = #{eventType} - and event_subclass = #{eventSubclass} - and event_cause = #{eventCause} - and description = #{description} - and event_state = #{eventState} - and event_source = #{eventSource} - and event_nature = #{eventNature} - and event_source_tips = #{eventSourceTips} - and in_tunnel = #{inTunnel} - and is_perceived = #{isPerceived} - - ORDER BY create_time desc - + dc_event_type.event_name AS event_name, + dc_process_config.node_node AS node_node, + dc_process_config.process_node AS process_node, + dc_process_config.common_phrases AS common_phrases, + dc_dispatch.id AS dc_dispatch_id, + dc_dispatch.organization_id, + dc_dispatch.dispatch_name, + dc_dispatch.dispatch_status, + dc_dispatch.remark AS dc_dispatch_remark, + dc_dispatch.end_time AS dc_dispatch_end_time, + dc_dispatch.start_time AS dc_dispatch_start_time, + dc_dispatch.event_id, + dc_organization.id AS dc_organization_id, + dc_organization.parent_id, + dc_organization.organization_type, + dc_organization.organization_name, + dc_organization.organization_address, + dc_organization.stake_mark AS dc_organization_stake_mark, + dc_organization.rescue_unit, + dc_organization.description AS dc_organization_description, + dc_vehicles.vehicle_plate, + dc_vehicles.vehicle_type, + dc_vehicles.vehicle_status, + dc_vehicles.remark AS dc_vehicles_remark, + dc_employees.post_id, + dc_employees.NAME, + dc_employees.contact_number + FROM dc_event - - - + + + + - - insert into dc_event - - id, - dept_id, - stake_mark, - direction, - user_id, - start_time, - end_time, - estimated_end_time, - event_level, - event_type, - event_subclass, - event_cause, - description, - event_state, - event_source, - event_nature, - remark, - create_time, - update_time, - event_source_tips, - in_tunnel, - road_id, - lang, - event_title, - occurrence_time, - is_perceived, - - - #{id}, - #{deptId}, - #{stakeMark}, - #{direction}, - #{userId}, - #{startTime}, - #{endTime}, - #{estimatedEndTime}, - #{eventLevel}, - #{eventType}, - #{eventSubclass}, - #{eventCause}, - #{description}, - #{eventState}, - #{eventSource}, - #{eventNature}, - #{remark}, - #{createTime}, - #{updateTime}, - #{eventSourceTips}, - #{inTunnel}, - #{roadId}, - #{lang}, - #{eventTitle}, - #{occurrenceTime}, - #{isPerceived}, - - - - + + insert into dc_event + + id, + dept_id, + stake_mark, + direction, + user_id, + start_time, + end_time, + estimated_end_time, + event_level, + event_type, + event_subclass, + event_cause, + description, + event_state, + event_source, + event_nature, + remark, + create_time, + update_time, + event_source_tips, + in_tunnel, + road_id, + lang, + event_title, + occurrence_time, + is_perceived, + dimension, + longitude, + + + #{id}, + #{deptId}, + #{stakeMark}, + #{direction}, + #{userId}, + #{startTime}, + #{endTime}, + #{estimatedEndTime}, + #{eventLevel}, + #{eventType}, + #{eventSubclass}, + #{eventCause}, + #{description}, + #{eventState}, + #{eventSource}, + #{eventNature}, + #{remark}, + #{createTime}, + #{updateTime}, + #{eventSourceTips}, + #{inTunnel}, + #{roadId}, + #{lang}, + #{eventTitle}, + #{occurrenceTime}, + #{isPerceived}, + #{dimension}, + #{longitude}, + + + + insert into dc_event id, @@ -575,6 +590,8 @@ event_title, occurrence_time, is_perceived, + dimension, + longitude, #{dcEvent.id}, @@ -603,71 +620,76 @@ #{dcEvent.eventTitle}, #{dcEvent.occurrenceTime}, #{dcEvent.isPerceived}, + #{dcEvent.dimension}, + #{dcEvent.longitude}, - update dc_event - - dept_id = #{deptId}, - stake_mark = #{stakeMark}, - direction = #{direction}, - user_id = #{userId}, - start_time = #{startTime}, - end_time = #{endTime}, - estimated_end_time = #{estimatedEndTime}, - event_level = #{eventLevel}, - event_type = #{eventType}, - event_subclass = #{eventSubclass}, - event_cause = #{eventCause}, - description = #{description}, - event_state = #{eventState}, - event_source = #{eventSource}, - event_nature = #{eventNature}, - remark = #{remark}, - create_time = #{createTime}, - update_time = #{updateTime}, - event_source_tips = #{eventSourceTips}, - in_tunnel = #{inTunnel}, - road_id = #{roadId}, - road_id = #{lang}, - event_title = #{eventTitle}, - occurrence_time = #{occurrenceTime}, - is_perceived = #{isPerceived}, - - where id = #{id} - + update dc_event + + dept_id = #{deptId}, + stake_mark = #{stakeMark}, + direction = #{direction}, + user_id = #{userId}, + start_time = #{startTime}, + end_time = #{endTime}, + estimated_end_time = #{estimatedEndTime}, + event_level = #{eventLevel}, + event_type = #{eventType}, + event_subclass = #{eventSubclass}, + event_cause = #{eventCause}, + description = #{description}, + event_state = #{eventState}, + event_source = #{eventSource}, + event_nature = #{eventNature}, + remark = #{remark}, + create_time = #{createTime}, + update_time = #{updateTime}, + event_source_tips = #{eventSourceTips}, + in_tunnel = #{inTunnel}, + road_id = #{roadId}, + road_id = #{lang}, + event_title = #{eventTitle}, + occurrence_time = #{occurrenceTime}, + is_perceived = #{isPerceived}, + dimension = #{dimension}, + longitude = #{longitude}, + + where id = #{id} + - - delete from dc_event where id = #{id} - + + delete + from dc_event + where id = #{id} + - - delete from dc_event where id in - - #{id} - - + + delete from dc_event where id in + + #{id} + + - + - + - + SELECT s.status, + COALESCE(t.count, 0) AS count FROM ( SELECT 0 AS event_state, 'state0Count' AS status UNION ALL SELECT 1 AS event_state, 'state1Count' AS status UNION ALL @@ -675,10 +697,11 @@ SELECT 3 AS event_state, 'state3Count' AS status ) s LEFT JOIN ( - SELECT event_state, COUNT(*) AS count + SELECT event_state, COUNT (*) AS count FROM dc_event GROUP BY event_state - ) t ON s.event_state = t.event_state; + ) t + ON s.event_state = t.event_state; From 8ef4cfb354d9688aa5b77d16a706ac5598154d02 Mon Sep 17 00:00:00 2001 From: "Mr.Wang" Date: Wed, 10 Apr 2024 18:30:28 +0800 Subject: [PATCH 06/18] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4=E3=80=81=E6=A0=B9=E6=8D=AE=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E9=A2=84=E6=A1=88=E5=86=85=E5=AE=B9=E7=AD=89?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DcEmergencyPlansController.java | 15 +- .../zc/business/enums/EventSubclassEnum.java | 44 ++-- .../service/DcEmergencyPlansService.java | 19 +- .../impl/DcEmergencyPlansServiceImpl.java | 228 ++++++++++++++---- .../mapper/business/EventPlanAssocMapper.xml | 2 +- 5 files changed, 221 insertions(+), 87 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/DcEmergencyPlansController.java b/zc-business/src/main/java/com/zc/business/controller/DcEmergencyPlansController.java index f260969a..9f5b213f 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcEmergencyPlansController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcEmergencyPlansController.java @@ -63,13 +63,14 @@ public class DcEmergencyPlansController extends BaseController { public AjaxResult listByEventType(@RequestBody DcEvent dcEvent) { List dcEmergencyPlansList = dcEmergencyPlansService.selectDcEmergencyPlansByEventType(dcEvent); + dcEmergencyPlansService.dispositionDeviceContent(dcEmergencyPlansList,dcEvent); return AjaxResult.success(dcEmergencyPlansList); } /** * 感知事件-根据事件数据查询事件预案列表 */ - @ApiOperation("感知事件-根据事件数据查询事件预案列表") +// @ApiOperation("感知事件-根据事件数据查询事件预案列表") @PreAuthorize("@ss.hasPermi('business:plans:list')") @PostMapping("/list/warning/type") public AjaxResult listByEventType(@RequestBody DcWarning dcWarning) { @@ -91,7 +92,7 @@ public class DcEmergencyPlansController extends BaseController { /** * 感知事件-情报板确认回显原始模板 */ - @ApiOperation("感知事件-情报板确认回显原始模板") +// @ApiOperation("感知事件-情报板确认回显原始模板") @PreAuthorize("@ss.hasPermi('business:plans:list')") @PostMapping("/warning/board/confirm") public AjaxResult warningBoardConfirm(@RequestBody DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { @@ -101,7 +102,7 @@ public class DcEmergencyPlansController extends BaseController { /** * 感知事件-情报板自动生成文字 */ - @ApiOperation("感知事件-情报板自动生成文字") +// @ApiOperation("感知事件-情报板自动生成文字") @PostMapping("/warning/automatic") public AjaxResult warningAutomaticGeneration(@RequestBody DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { return AjaxResult.success(dcEmergencyPlansService.warningAutomaticGeneration(dcEventAnDcEmergencyPlans)); @@ -110,7 +111,7 @@ public class DcEmergencyPlansController extends BaseController { /** * 交通事件-情报板自动生成文字 */ - @ApiOperation("交通事件-情报板自动生成文字") +// @ApiOperation("交通事件-情报板自动生成文字") @PostMapping("/event/automatic") public AjaxResult eventAutomaticGeneration(@RequestBody DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { return AjaxResult.success(dcEmergencyPlansService.eventAutomaticGeneration(dcEventAnDcEmergencyPlans)); @@ -138,7 +139,7 @@ public class DcEmergencyPlansController extends BaseController { /** * 感知事件确定 */ - @ApiOperation("感知事件确认") +// @ApiOperation("感知事件确认") @PreAuthorize("@ss.hasPermi('business:plans:edit')") @PostMapping("/warning/confirm") public AjaxResult warningConfirm(@RequestBody DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { @@ -149,7 +150,7 @@ public class DcEmergencyPlansController extends BaseController { * 新增事件预案 */ @ApiOperation("新增预案") -// @PreAuthorize("@ss.hasPermi('business:plans:add')") + @PreAuthorize("@ss.hasPermi('business:plans:add')") @PostMapping public AjaxResult add(@RequestBody DcEmergencyPlans dcEmergencyPlans) { return toAjax(dcEmergencyPlansService.insertDcEmergencyPlans(dcEmergencyPlans)); @@ -159,7 +160,7 @@ public class DcEmergencyPlansController extends BaseController { * 修改事件预案 */ @ApiOperation("修改预案") -// @PreAuthorize("@ss.hasPermi('business:plans:edit')") + @PreAuthorize("@ss.hasPermi('business:plans:edit')") @PutMapping public AjaxResult update(@RequestBody DcEmergencyPlans dcEmergencyPlans) { return toAjax(dcEmergencyPlansService.updateDcEmergencyPlans(dcEmergencyPlans)); diff --git a/zc-business/src/main/java/com/zc/business/enums/EventSubclassEnum.java b/zc-business/src/main/java/com/zc/business/enums/EventSubclassEnum.java index 061e773d..0a36b980 100644 --- a/zc-business/src/main/java/com/zc/business/enums/EventSubclassEnum.java +++ b/zc-business/src/main/java/com/zc/business/enums/EventSubclassEnum.java @@ -5,28 +5,28 @@ package com.zc.business.enums; * @author wangjiabao */ public enum EventSubclassEnum { - REAR_END_COLLISION("1-1", "追尾","前方发生追尾 注意避让"), - ROLLOVER("1-2", "侧翻","前方发生侧翻 注意避让"), - COLLISION_WITH_GUARDRAIL("1-3", "撞护栏","前方车撞击护栏注意避让"), - NATURAL("1-4", "自然","前方发生自然现象请注意"), - OTHER_ACCIDENTS("1-5", "其他事故","前方发生事故谨慎驾驶"), - VEHICLE_MALFUNCTION("2-1", "车辆故障","前方发生故障注意避让"), - ROAD_CONGESTION("4-1", "道路拥堵","前方道路拥堵"), - OVERPASS_CONGESTION("4-2", "立交拥堵","前方立交拥堵"), - TOLL_STATION_CONGESTION("4-3", "收费站拥堵","前方收费站拥堵"), - SERVICE_AREA_CONGESTION("4-4", "服务区拥堵","前方服务区拥堵"), - PEDESTRIAN("5-1", "行人","有行人穿行请注意"), - NON_MOTOR_VEHICLES("5-2", "非机动车","有非机动车上路请注意"), - MOTORCYCLE("5-3", "摩托车","有摩托车上路请注意"), - OTHER("5-4", "其他","有非法上路车辆"), - SMOKE("6-1", "烟雾","烟雾道路请注意驾驶"), - FALLEN_TREES("6-2", "倒伏树木","有倒伏树木请注意"), - SCATTERED_MATERIALS("6-3", "洒落物","有洒落物请注意"), - ANIMAL("6-4", "动物","有动物请注意"), - OTHER_OBSTACLES("6-5", "其他障碍","有不明障碍请注意"), - CLOSED_OR_SUSPENDED_OPERATIONS("8-1", "封闭、暂停营业","服务区封闭、暂停营业"), - SHUTDOWN_OF_IMPORTANT_FACILITIES("8-2", "重要设施停用","服务区重要设施停用"), - OTHER_ABNORMALITIES_IN_THE_SERVICE_AREA("8-3", "服务区其他异常","服务区设备停用"), + REAR_END_COLLISION("1-1", "追尾","前方*发生追尾 注意避让"), + ROLLOVER("1-2", "侧翻","前方*发生侧翻 注意避让"), + COLLISION_WITH_GUARDRAIL("1-3", "撞护栏","前方*车撞击护栏注意避让"), + NATURAL("1-4", "自然","前方*发生自然现象请注意"), + OTHER_ACCIDENTS("1-5", "其他事故","前方*发生事故谨慎驾驶"), + VEHICLE_MALFUNCTION("2-1", "车辆故障","前方*发生故障注意避让"), + ROAD_CONGESTION("4-1", "道路拥堵","前方*道路拥堵"), + OVERPASS_CONGESTION("4-2", "立交拥堵","前方*立交拥堵"), + TOLL_STATION_CONGESTION("4-3", "收费站拥堵","前方*收费站拥堵"), + SERVICE_AREA_CONGESTION("4-4", "服务区拥堵","前方*服务区拥堵"), + PEDESTRIAN("5-1", "行人","前方*有行人穿行请注意"), + NON_MOTOR_VEHICLES("5-2", "非机动车","前方*有非机动车上路请注意"), + MOTORCYCLE("5-3", "摩托车","前方*有摩托车上路请注意"), + OTHER("5-4", "其他","前方*有非法上路车辆"), + SMOKE("6-1", "烟雾","前方*烟雾道路请注意驾驶"), + FALLEN_TREES("6-2", "倒伏树木","前方*有倒伏树木请注意"), + SCATTERED_MATERIALS("6-3", "洒落物","前方*有洒落物请注意"), + ANIMAL("6-4", "动物","前方*有动物请注意"), + OTHER_OBSTACLES("6-5", "其他障碍","前方*有不明障碍请注意"), + CLOSED_OR_SUSPENDED_OPERATIONS("8-1", "封闭、暂停营业","前方*服务区封闭、暂停营业"), + SHUTDOWN_OF_IMPORTANT_FACILITIES("8-2", "重要设施停用","前方*服务区重要设施停用"), + OTHER_ABNORMALITIES_IN_THE_SERVICE_AREA("8-3", "服务区其他异常","前方*服务区设备停用"), RAIN("10-1", "雨","雨天请谨慎驾驶"), SNOW("10-2", "雪","雪天路滑请谨慎驾驶"), HEAVY_FOG("10-3", "大雾","大雾天气请谨慎驾驶"), diff --git a/zc-business/src/main/java/com/zc/business/service/DcEmergencyPlansService.java b/zc-business/src/main/java/com/zc/business/service/DcEmergencyPlansService.java index de8faf8e..02d4d32a 100644 --- a/zc-business/src/main/java/com/zc/business/service/DcEmergencyPlansService.java +++ b/zc-business/src/main/java/com/zc/business/service/DcEmergencyPlansService.java @@ -1,6 +1,6 @@ package com.zc.business.service; -import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.zc.business.domain.*; import java.util.List; @@ -39,6 +39,11 @@ public interface DcEmergencyPlansService { */ List selectDcEmergencyPlansByEventType(DcEvent event); + /** + * 处置设备智能发布的内容 + */ + void dispositionDeviceContent(List list, DcEvent dcEvent); + /** * 感知事件-根据事件类型查询事件预案 * @@ -63,7 +68,7 @@ public interface DcEmergencyPlansService { * @param dcEventAnDcEmergencyPlans 事件数据 和 事件预案数据 * @return 结果 */ - JSONArray executionEventConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans); + JSONObject executionEventConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans); /** * 根据事件id-查询预案事件关联表 @@ -79,7 +84,7 @@ public interface DcEmergencyPlansService { * @param dcEventAnDcEmergencyPlans 事件数据 和 事件预案数据 * @return 结果 */ - JSONArray executionWarningConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans); + JSONObject executionWarningConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans); /** * 感知事件-情报板自动生成 @@ -111,14 +116,6 @@ public interface DcEmergencyPlansService { */ int updateDcEmergencyPlans(DcEmergencyPlans dcEmergencyPlans); - /** - * 批量修改事件预案 - * - * @param dcEmergencyPlansList 事件预案 - * @return 结果 - */ - int updateBatchDcEmergencyPlans(List dcEmergencyPlansList); - /** * 批量删除事件预案 * diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java index bf54a4b8..15140ea4 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java @@ -20,6 +20,7 @@ import com.zc.business.mapper.EventPlanAssocMapper; import com.zc.business.service.DcEmergencyPlansService; import com.zc.business.service.DcExecuteActionService; import com.zc.business.service.IDcDeviceService; +import com.zc.business.service.IDcFacilityService; import com.zc.common.core.httpclient.exception.HttpException; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @@ -50,6 +51,9 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { @Resource private EventPlanAssocMapper eventPlanAssocMapper; + @Resource + private IDcFacilityService dcFacilityService; + @Resource private ThreadPoolTaskExecutor threadPoolTaskExecutor; @@ -110,8 +114,6 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { return dcEmergencyPlansList.stream() .filter(dcEmergencyPlans -> { String triggerMechanism = dcEmergencyPlans.getTriggerMechanism(); -// JSONObject triggerJson = JSONObject.parseObject(triggerMechanism); -// String eventSubclass = triggerJson.get("eventSubclass").toString(); return triggerMechanism.equals(event.getSubclass()); }) .collect(Collectors.toList()); @@ -120,8 +122,6 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { return dcEmergencyPlansList.stream() .filter(dcEmergencyPlans -> { String triggerMechanism = dcEmergencyPlans.getTriggerMechanism(); -// JSONObject triggerJson = JSONObject.parseObject(triggerMechanism); -// String locationType = triggerJson.get("locationType").toString(); DcEventVehicleAccident dcEventVehicleAccident = event.getDcEventVehicleAccident(); String eventLocationType = dcEventVehicleAccident.getLocationType().toString(); return triggerMechanism.equals(eventLocationType); @@ -132,9 +132,6 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { return dcEmergencyPlansList.stream() .filter(dcEmergencyPlans -> { String triggerMechanism = dcEmergencyPlans.getTriggerMechanism(); -// JSONObject triggerJson = JSONObject.parseObject(triggerMechanism); - // 分类 -// Integer classify = Integer.parseInt(triggerJson.get("classify").toString()); // 事件--交通管制数据 DcEventTrafficControl dcEventTrafficControl = event.getDcEventTrafficControl(); Integer eventClassify = Integer.parseInt(dcEventTrafficControl.getClassify().toString()); @@ -148,6 +145,94 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { } + /** + * 处置设备智能发布的内容 + */ + @Override + public void dispositionDeviceContent(List list, DcEvent dcEvent) { + // 事件桩号 + dcEvent.setStakeMark(dcEvent.getStakeMark().replace("K", "")); + String[] markArray = dcEvent.getStakeMark().split("\\+"); + if (markArray[1].length() < 3) { + // 不足三位 补零 + markArray[1] = String.format("%0" + 3 + "d", markArray[1]); + } + + // 情报板 语音广播 + list.forEach(dcEmergencyPlans -> { + List dcExecuteActions = dcEmergencyPlans.getDcExecuteAction(); + dcExecuteActions.forEach(dcExecuteAction -> { + JSONObject executeConfig = JSON.parseObject(dcExecuteAction.getExecuteConfig()); + if (dcExecuteAction.getDeviceType() == DeviceTypeEnum.ROAD_SECTION_VOICE_BROADCASTING.getCode() + && executeConfig.get("operationType").equals("2")) { + // 执行操作中智能发布语音广播 + String content = intelligentPublishingOfInformation(dcEvent); + updateIntelligentPublishingContent(dcExecuteAction,markArray,dcEvent,content); + } else if (dcExecuteAction.getDeviceType() == DeviceTypeEnum.VARIABLE_INFORMATION_FLAG.getCode() + && executeConfig.get("operationType").equals("2")) { + // 执行操作中智能发布情报板 + String content = intelligentPublishingOfInformation(dcEvent); + updateIntelligentPublishingContent(dcExecuteAction,markArray,dcEvent,content); + } + }); + }); + } + + /** + * 更改智能发布中的发布内容-计算公里数 + */ + public void updateIntelligentPublishingContent(DcExecuteAction dcExecuteAction, String[] markArray, DcEvent dcEvent,String content) { + List deviceList = ruleFiltering(dcExecuteAction, markArray, dcEvent.getDirection()); + JSONObject executeConfig = JSON.parseObject(dcExecuteAction.getExecuteConfig()); + List> contentList = new ArrayList<>(); + deviceList.forEach(dcDevice -> { + Map map = new HashMap<>(); + map.put("dcDeviceId",dcDevice.getId()); + map.put("deviceName",dcDevice.getDeviceName()); + // 公里数 + int kilometers = 0; + // 米数 + int meters = 0; + dcDevice.setStakeMark(dcDevice.getStakeMark().replace("K", "")); + String[] deviceMarkArray = dcDevice.getStakeMark().split("\\+"); + if (deviceMarkArray[1].length() < 3) { + // 不足三位 补零 + deviceMarkArray[1] = String.format("%0" + 3 + "d", deviceMarkArray[1]); + } + kilometers = Math.abs(Integer.parseInt(deviceMarkArray[0]) - Integer.parseInt(markArray[0])); + meters = Math.abs(Integer.parseInt(deviceMarkArray[1]) - Integer.parseInt(markArray[1])); + double roundedDistance = Math.round((kilometers + meters / 1000.0) * 10.0) / 10.0; + if (roundedDistance < 1) { + map.put("content",content.replace("*",(int) (roundedDistance * 1000)+"米")); + }else { + map.put("content",content.replace("*",roundedDistance+"公里")); + } + + if (dcExecuteAction.getDeviceType() == DeviceTypeEnum.VARIABLE_INFORMATION_FLAG.getCode()) { + // 情报板 + // stopTime + map.put("stopTime", "50"); + // inScreenMode + map.put("inScreenMode", "1"); + // fontSpacing + map.put("fontSpacing", "0"); + // fontColor + map.put("fontColor", "ffff00"); + // fontType + map.put("fontType", "1"); + // fontSize + map.put("fontSize", "36"); + // screenSize 768*64 宽度和高度 + map.put("screenSize", "768*64"); + // formatStyle + map.put("formatStyle", "2"); + } + contentList.add(map); + }); + executeConfig.put("contentList",contentList); + dcExecuteAction.setExecuteConfig(executeConfig.toJSONString()); + } + /** * 感知事件 - 根据事件类型查询事件预案 * @@ -196,8 +281,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { markArray[1] = String.format("%0" + 3 + "d", markArray[1]); } DcExecuteAction executeAction = dcEventAnDcEmergencyPlans.getDcEmergencyPlans().getExecuteAction(); - Integer operationType = dcEventAnDcEmergencyPlans.getOperationType(); - List dcDevices = ruleFiltering(executeAction, markArray, direction, operationType); + List dcDevices = ruleFiltering(executeAction, markArray, direction); return getBoardTemplate(dcDevices); } @@ -218,8 +302,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { markArray[1] = String.format("%0" + 3 + "d", markArray[1]); } DcExecuteAction executeAction = dcEventAnDcEmergencyPlans.getDcEmergencyPlans().getExecuteAction(); - Integer operationType = dcEventAnDcEmergencyPlans.getOperationType(); - List dcDevices = ruleFiltering(executeAction, markArray, direction, operationType); + List dcDevices = ruleFiltering(executeAction, markArray, direction); return getBoardTemplate(dcDevices); } @@ -289,12 +372,9 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { * @param direction * @return */ - public List ruleFiltering(DcExecuteAction dcExecuteAction, String[] markArray, String direction, Integer operationType) { + public List ruleFiltering(DcExecuteAction dcExecuteAction, String[] markArray, String direction) { Integer searchRule = dcExecuteAction.getSearchRule(); - // 区分执行操作还是恢复操作 - JSONObject otherConfig = operationType.equals(1)? - JSON.parseObject(dcExecuteAction.getExecuteConfig()): JSON.parseObject(dcExecuteAction.getRecoverConfig()); List start = new ArrayList<>(); List end = new ArrayList<>(); // 设备列表 @@ -306,7 +386,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { // 指定设备资源 // 根据设备id,获取设备集合 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - List deviceList = (List) otherConfig.get("deviceList"); + String[] deviceList = dcExecuteAction.getDeviceList().split(","); queryWrapper.in(DcDevice::getIotDeviceId, deviceList); dcDevices = dcDeviceService.list(queryWrapper); } else if (searchRule.equals(2)) { @@ -418,7 +498,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { * @return 结果 */ @Override - public JSONArray executionEventConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { + public JSONObject executionEventConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { // 获取事件数据 DcEvent dcEvent = dcEventAnDcEmergencyPlans.getDcEvent(); // 方向 @@ -478,8 +558,17 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { @Override public DcInfoBoardTemplate eventAutomaticGeneration(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { // 根据交通事件的事件类型,生成相应的情报板内容 - DcEvent dcEvent = dcEventAnDcEmergencyPlans.getDcEvent(); DcInfoBoardTemplate dcInfoBoardTemplate = dcEventAnDcEmergencyPlans.getDcInfoBoardTemplate(); + DcEvent dcEvent = dcEventAnDcEmergencyPlans.getDcEvent(); + dcInfoBoardTemplate.setContent(intelligentPublishingOfInformation(dcEvent)); + return dcInfoBoardTemplate; + } + + /** + * 智能发布信息匹配 + */ + public String intelligentPublishingOfInformation(DcEvent dcEvent) { + String content = "请注意前方危险"; int eventType = Integer.parseInt(dcEvent.getEventType().toString()); if (eventType == EventTypeEnum.ABNORMAL_WEATHER.getCode() || eventType == EventTypeEnum.TRAFFIC_ACCIDENT.getCode() || @@ -488,42 +577,41 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { eventType == EventTypeEnum.SERVICE_AREA_ABNORMALITY.getCode() || eventType == EventTypeEnum.ROADBLOCK_CLEARANCE.getCode()) { - String content = Arrays.stream(EventSubclassEnum.values()) + content = Arrays.stream(EventSubclassEnum.values()) .filter(eventSubclassEnum -> eventSubclassEnum.getCode().equals(dcEvent.getSubclass())) .findFirst() .map(EventSubclassEnum::getText) .orElse("请注意前方危险"); - dcInfoBoardTemplate.setContent(content); } else if (eventType == EventTypeEnum.VEHICLE_MALFUNCTION.getCode()) { // 车辆故障 DcEventVehicleAccident dcEventVehicleAccident = dcEvent.getDcEventVehicleAccident(); int locationType = Integer.parseInt(dcEventVehicleAccident.getLocationType().toString()); + // 路广设施id + Integer facilityId = dcEventVehicleAccident.getFacilityId(); + DcFacility facility = dcFacilityService.getFacility(facilityId.toString()); + String facilityName = facility.getFacilityName(); if (locationType == 1) { - dcInfoBoardTemplate.setContent("高速主线发生车辆故障"); - } else if (locationType == 2) { - dcInfoBoardTemplate.setContent("服务区发生车辆故障"); - } else if (locationType == 3) { - dcInfoBoardTemplate.setContent("立交桥发生车辆故障"); - } else if (locationType == 4) { - dcInfoBoardTemplate.setContent("收费站发生车辆故障"); + content = "前方*高速主线发生车辆故障"; + } else if (locationType == 2 || locationType == 3 || locationType == 4) { + // 服务区、立交、收费站 + content = "前方*"+facilityName+"发生车辆故障"; } } else if (eventType == EventTypeEnum.TRAFFIC_CONTROL.getCode()) { // 交通管制 DcEventTrafficControl dcEventTrafficControl = dcEvent.getDcEventTrafficControl(); int classify = Integer.parseInt(dcEventTrafficControl.getClassify().toString()); - String content = Arrays.stream(ClassifyEnum.values()) + content = Arrays.stream(ClassifyEnum.values()) .filter(eventSubclassEnum -> eventSubclassEnum.getCode() == classify) .findFirst() .map(ClassifyEnum::getText) - .orElse("前方存在限行或关闭"); - dcInfoBoardTemplate.setContent(content); + .orElse("前方*存在限行或关闭"); } else { // 施工建设 - dcInfoBoardTemplate.setContent("前方施工请注意驾驶"); + content = "前方*施工请注意驾驶"; } - return dcInfoBoardTemplate; + return content; } /** @@ -533,7 +621,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { * @return */ @Override - public JSONArray executionWarningConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { + public JSONObject executionWarningConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { // 获取事件数据 DcWarning dcWarning = dcEventAnDcEmergencyPlans.getDcWarning(); @@ -550,7 +638,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { * @param dcEventAnDcEmergencyPlans 事件数据 和 事件预案数据 * @return */ - public JSONArray executionConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans, + public JSONObject executionConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans, String stakeMark, String direction, String id) { @@ -574,7 +662,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { //获取事件预案中的操作配置 dcEmergencyPlans.getDcExecuteAction() .forEach(dcExecuteAction -> { - List dcDevices = ruleFiltering(dcExecuteAction, markArray, direction, operationType); + List dcDevices = ruleFiltering(dcExecuteAction, markArray, direction); JSONObject otherConfig = operationType.equals(1)? JSON.parseObject(dcExecuteAction.getExecuteConfig()): JSON.parseObject(dcExecuteAction.getRecoverConfig()); try { @@ -600,23 +688,26 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { }); // 创建一个 预案事件关联对象 EventPlanAssoc eventPlanAssoc = new EventPlanAssoc(); + JSONObject resultObject = new JSONObject(); // 事件编号 eventPlanAssoc.setEventId(id); EventPlanAssoc selectEventPlanAssoc = eventPlanAssocMapper.selectByEventId(eventPlanAssoc); // 区分是执行操作 还是 恢复操作 - if (dcEventAnDcEmergencyPlans.getOperationType().equals(1) && StringUtils.isEmpty(selectEventPlanAssoc.getId())) { + if (dcEventAnDcEmergencyPlans.getOperationType().equals(1) && selectEventPlanAssoc == null) { // 首次执行操作 eventPlanAssoc.setEmergencyPlansId(dcEmergencyPlans.getId()); eventPlanAssoc.setExecutingControlDevice(deviceIds.toString().replaceFirst(";", "")); eventPlanAssoc.setExecutingControlResult(resultArray.toJSONString()); eventPlanAssoc.setCreateTime(DateUtils.getNowDate()); - eventPlanAssocMapper.insertEventPlanAssoc(eventPlanAssoc); + int eventPlanAssocId = eventPlanAssocMapper.insertEventPlanAssoc(eventPlanAssoc); + resultObject.put("eventPlanAssocId",eventPlanAssocId); } else if (StringUtils.isNotEmpty(selectEventPlanAssoc.getId()) && dcEventAnDcEmergencyPlans.getOperationType().equals(1)) { // 多次执行操作 selectEventPlanAssoc.setExecutingControlResult(resultArray.toJSONString()); selectEventPlanAssoc.setUpdateTime(DateUtils.getNowDate()); eventPlanAssocMapper.updateEventPlanAssoc(selectEventPlanAssoc); + resultObject.put("eventPlanAssocId",selectEventPlanAssoc.getId()); } else { // 恢复操作 未执行的事件不能进行恢复操作 @@ -624,8 +715,10 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { selectEventPlanAssoc.setRecoveredControlDevice(deviceIds.toString().replaceFirst(";", "")); selectEventPlanAssoc.setRecoveredControlResult(resultArray.toJSONString()); eventPlanAssocMapper.updateEventPlanAssoc(selectEventPlanAssoc); + resultObject.put("eventPlanAssocId",selectEventPlanAssoc.getId()); } - return resultArray; + resultObject.put("deviceOperationResult",resultArray); + return resultObject; } /** @@ -635,7 +728,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { List dcDevices, JSONObject otherConfig, JSONArray resultArray) { - + CountDownLatch latch = new CountDownLatch(dcDevices.size()); for (DcDevice device : dcDevices) { @@ -673,7 +766,28 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { else if (device.getDeviceType().equals(DeviceTypeConstants.VARIABLE_INFORMATION_FLAG.toString())) { if (operationType == 1) { // 情报板发布全流程 - boardReleaseProcess(props, iotDeviceId, otherConfig, device, resultArray); + if (otherConfig.get("operationType").equals("2")) { + JSONArray contentList = JSON.parseArray(otherConfig.get("contentList").toString()); + JSONObject foundContent = contentList.stream() + .map(content -> JSON.parseObject(content.toString())) + .filter(jsonObject -> + Integer.parseInt(jsonObject.get("dcDeviceId").toString()) == device.getId()) + .findFirst() + .orElse(null); + if (foundContent == null) { + // 说明没有匹配到设备 + JSONObject errorResult = new JSONObject(); + errorResult.put("device",device.getId()); + errorResult.put("errorMessage","未匹配到对应的模板内容"); + resultArray.add(errorResult); + } + JSONObject jsonObject = new JSONObject(); + jsonObject.put("dcInfoBoardTemplate",foundContent); + boardReleaseProcess(props, iotDeviceId, jsonObject, device, resultArray); + }else { + boardReleaseProcess(props, iotDeviceId, otherConfig, device, resultArray); + } + } else { // 恢复操作 if (otherConfig.get("operationType").equals("2")) { @@ -702,7 +816,26 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { params.put("name", "task-event"); params.put("outVVol", "8"); params.put("priority", "1"); - params.put("text", otherConfig.get("content")); + if (otherConfig.get("operationType").equals("2")) { + // 智能发布 + JSONArray contentList = JSON.parseArray(otherConfig.get("contentList").toString()); + JSONObject foundContent = contentList.stream() + .map(content -> JSON.parseObject(content.toString())) + .filter(jsonObject -> + Integer.parseInt(jsonObject.get("dcDeviceId").toString()) == device.getId()) + .findFirst() + .orElse(null); + if (foundContent == null) { + // 说明没有匹配到设备 + JSONObject errorResult = new JSONObject(); + errorResult.put("device",device.getId()); + errorResult.put("errorMessage","未匹配到对应的广播内容"); + resultArray.add(errorResult); + } + params.put("text", foundContent.get("content")); + }else { + params.put("text", otherConfig.get("content")); + } params.put("repeatTimes", "3"); params.put("functionType", "startPaTts"); JSONArray termList = new JSONArray(); @@ -743,10 +876,18 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { } catch (HttpException | IOException e) { log.error(e.toString()); throw new RuntimeException(e); + } finally { + latch.countDown(); // 确保在异常情况下也能减少CountDownLatch计数 } }); } + try { + latch.await(); // 等待所有线程执行完毕 + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } /** @@ -889,11 +1030,6 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { return dcExecuteActionService.updateDcExecuteActionBatch(dcExecuteActionList); } - @Override - public int updateBatchDcEmergencyPlans(List dcEmergencyPlansList) { - return 0; - } - /** * 批量删除事件预案 * diff --git a/zc-business/src/main/resources/mapper/business/EventPlanAssocMapper.xml b/zc-business/src/main/resources/mapper/business/EventPlanAssocMapper.xml index 82941ea3..cc6ed173 100644 --- a/zc-business/src/main/resources/mapper/business/EventPlanAssocMapper.xml +++ b/zc-business/src/main/resources/mapper/business/EventPlanAssocMapper.xml @@ -4,7 +4,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + insert into event_plan_assoc event_id, From cebdf8ede82a9b3e4f320ba515fde25bf1b71252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E7=90=B3?= <1911390090@qq.com> Date: Wed, 10 Apr 2024 19:34:30 +0800 Subject: [PATCH 07/18] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BA=A4=E9=80=9A?= =?UTF-8?q?=E7=AE=A1=E5=88=B6=20=E6=94=B6=E8=B4=B9=E7=AB=99=E8=AE=BE?= =?UTF-8?q?=E6=96=BD=20=E7=AD=89=20=E5=A4=9A=E9=80=89=20=E6=8F=92=E5=85=A5?= =?UTF-8?q?=20=E3=80=82=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=BD=AE=20=E6=94=B6?= =?UTF-8?q?=E8=B4=B9=E7=AB=99=E5=A4=9A=E9=80=89=E6=8F=92=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zc/business/mapper/DcEventMapper.java | 9 ++ .../zc/business/service/IDcEventService.java | 5 + .../service/impl/DcEventServiceImpl.java | 132 ++++++++++++++---- .../mapper/business/DcEventMapper.xml | 42 ++++++ 4 files changed, 163 insertions(+), 25 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcEventMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcEventMapper.java index b4be7c31..32391683 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcEventMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcEventMapper.java @@ -51,6 +51,15 @@ public interface DcEventMapper extends BaseMapper */ int updateDcEvent(DcEvent dcEvent); + + /** + * 修改事件性质 关联管制事件id + * + * @param dcEvent 事件信息 + * @return 结果 + */ + int updateDcEventLinkId(DcEvent dcEvent); + /** * 删除事件信息 * diff --git a/zc-business/src/main/java/com/zc/business/service/IDcEventService.java b/zc-business/src/main/java/com/zc/business/service/IDcEventService.java index e97685fe..51eed49d 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcEventService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcEventService.java @@ -57,6 +57,11 @@ public interface IDcEventService */ public int updateDcEvent(DcEvent dcEvent); + /** + * @param dcEvent + * @return int + */ + /** * 批量删除事件信息 * diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java index ed6bc7b9..9a789863 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java @@ -11,6 +11,7 @@ import com.zc.business.domain.*; import com.zc.business.mapper.*; import com.zc.business.service.IDcEventService; import com.zc.business.service.IMiddleDatabaseService; +import org.apache.poi.ss.formula.functions.T; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -137,9 +138,11 @@ public class DcEventServiceImpl extends ServiceImpl impl dcEvent.setId(uuid); dcEvent.setEventState(0L); //获取部门信息 - dcEvent.setDeptId(SecurityUtils.getDeptId()); + //dcEvent.setDeptId(SecurityUtils.getDeptId()); + dcEvent.setDeptId(1l); //用户 - dcEvent.setUserId(SecurityUtils.getUserId()); + // dcEvent.setUserId(SecurityUtils.getUserId()); + dcEvent.setUserId(1l); dcEvent.setCreateTime(DateUtils.getNowDate()); @@ -180,9 +183,9 @@ public class DcEventServiceImpl extends ServiceImpl impl if (i7 > 0) { - //中间库 + /* //中间库 MdEvent mdEvent = new MdEvent(dcEvent); - middleDatabaseService.insertMiddleDatabaseEvent(mdEvent); + middleDatabaseService.insertMiddleDatabaseEvent(mdEvent);*/ switch (eventType) { //交通事故 case 1: @@ -207,57 +210,134 @@ public class DcEventServiceImpl extends ServiceImpl impl //TODO 插入多个收费站 if (dcEvent.getDcEventTrafficControl().getFacilityIds().length==1){//facilityIds==1 说明只选择了一个收费站 - if (dcEventId !=null){ + if (dcEventId !=null){//不等于空 事件处置页面 修改 dcEventMapper.deleteDcEventById(uuid);//删除添加的事件主类 - + DcEvent dcEvent1 = new DcEvent(); + dcEvent1.setId(dcEventId);//事件id + dcEvent1.setEventNature(1l);//首发事件 + dcEvent1.setLinkId(uuid);//关联管制事件id + dcEventMapper.updateDcEventLinkId(dcEvent1);//修改事件性质 + dcEvent.getDcEventTrafficControl().setId(uuid); + dcEvent.getDcEventTrafficControl().setFacilityId(dcEvent.getDcEventTrafficControl().getFacilityIds()[0]);//取出数组字段赋值 设施id + int i6 = dcEventTrafficControlMapper.insertDcEventTrafficControl(dcEvent.getDcEventTrafficControl());// + }else { + + dcEvent.getDcEventTrafficControl().setId(uuid); + dcEvent.getDcEventTrafficControl().setFacilityId(dcEvent.getDcEventTrafficControl().getFacilityIds()[0]);//取出数组字段赋值 设施id + int i6 = dcEventTrafficControlMapper.insertDcEventTrafficControl(dcEvent.getDcEventTrafficControl()); } - dcEvent.getDcEventTrafficControl().setId(uuid); - dcEvent.getDcEventTrafficControl().setFacilityId(dcEvent.getDcEventTrafficControl().getFacilityIds()[0]);//取出数组字段赋值 设施id - int i6 = dcEventTrafficControlMapper.insertDcEventTrafficControl(dcEvent.getDcEventTrafficControl()); - }else { + }else if (dcEvent.getDcEventTrafficControl().getFacilityIds().length>1){//facilityIds1=1 说明只选择了多个收费站 + + if (dcEventId !=null){//不等于空 事件处置页面 修改 + dcEventMapper.deleteDcEventById(uuid);//删除添加的事件主类 + DcEvent dcEvent1 = new DcEvent(); + dcEvent1.setId(dcEventId);//事件id + dcEvent1.setEventNature(1l);//首发事件 + Map map = new HashMap<>(); + for (int i = 0; i < dcEvent.getDcEventTrafficControl().getFacilityIds().length; i++) { //设置事件Id UUID无下划线格式32 + String facilityUUID = IdUtils.fastSimpleUUID(); + map.put("facilityId"+i,facilityUUID);//每循环一次生成一个uuid + } + StringBuilder sb2 = new StringBuilder(); + // 遍历map, + int a = 0; + for (Map.Entry entry : map.entrySet()) { + sb2.append(entry.getValue()); + if (dcEvent.getDcEventTrafficControl().getFacilityIds().length-a !=1){ + sb2.append(","); + } + a++; + } + String linkId2 = sb2.toString(); + dcEvent1.setLinkId(linkId2);//关联管制事件id + + dcEventMapper.updateDcEventLinkId(dcEvent1);//修改事件性质 + + for (int i = 0; i < dcEvent.getDcEventTrafficControl().getFacilityIds().length; i++) { + + dcEvent.getDcEventTrafficControl().setId(map.get("facilityId"+i));//交通管制事件id + dcEvent.getDcEventTrafficControl().setFacilityId(dcEvent.getDcEventTrafficControl().getFacilityIds()[i]);//取出数组字段赋值 设施id + // 使用StringBuilder来构建逗号分隔的字符串 + + //新增第一条数据 + dcEvent.setId(map.get("facilityId" + i)); + dcEvent.setEventState(0L); + dcEvent.setDeptId(1l); + dcEvent.setUserId(1l); + dcEvent.setCreateTime(DateUtils.getNowDate()); + dcEvent.setEventNature(2L);//关联管制 + + StringBuilder sb = new StringBuilder(); + // 遍历map,排除与当前索引i对应的键 + for (Map.Entry entry : map.entrySet()) { + if (!entry.getKey().equals("facilityId" + i)) { + if (sb.length() > 0) { + sb.append(","); + } + sb.append(entry.getValue()); + } + } + String linkId = sb.toString(); + dcEvent.setLinkId(linkId); + + //交通管制 + if (eventType == 3 && dcEvent.getDcEventTrafficControl().getFacilityIds()[i] != null) { + String facilityId = String.valueOf(dcEvent.getDcEventTrafficControl().getFacilityIds()[i]); + dcEvent.setStakeMark(extracted(facilityId)); + } + dcEventMapper.insertDcEvent(dcEvent); + int i6 = dcEventTrafficControlMapper.insertDcEventTrafficControl(dcEvent.getDcEventTrafficControl()); + + } + }else { + + dcEventMapper.deleteDcEventById(uuid);//删除添加的事件主类 Map map = new HashMap<>(); for (int i = 0; i < dcEvent.getDcEventTrafficControl().getFacilityIds().length; i++) { //设置事件Id UUID无下划线格式32 String facilityUUID = IdUtils.fastSimpleUUID(); map.put("facilityId"+i,facilityUUID);//每循环一次生成一个uuid - Long facilityId = dcEvent.getDcEventTrafficControl().getFacilityIds()[i]; - map.put(facilityUUID, String.valueOf(facilityId));//将uuid作为主键 设施id作为 值 存放map } for (int i = 0; i < dcEvent.getDcEventTrafficControl().getFacilityIds().length; i++) { - dcEvent.getDcEventTrafficControl().setId(map.get("facilityId"+i));//交通管制事件id + + + dcEvent.getDcEventTrafficControl().setId(map.get("facilityId" + i));//交通管制事件id dcEvent.getDcEventTrafficControl().setFacilityId(dcEvent.getDcEventTrafficControl().getFacilityIds()[i]);//取出数组字段赋值 设施id //新增第一条数据 - dcEvent.setId(map.get("facilityId"+i)); + dcEvent.setId(map.get("facilityId" + i)); dcEvent.setEventState(0L); - dcEvent.setDeptId(SecurityUtils.getDeptId()); - dcEvent.setUserId(SecurityUtils.getUserId()); + dcEvent.setDeptId(1l); + dcEvent.setUserId(1l); dcEvent.setCreateTime(DateUtils.getNowDate()); dcEvent.setEventNature(2L);//关联管制 + // 使用StringBuilder来构建逗号分隔的字符串 StringBuilder sb = new StringBuilder(); - boolean isFirst = true; - // 迭代Map并过滤出不为1的键对应的值 + + // 遍历map,排除与当前索引i对应的键 for (Map.Entry entry : map.entrySet()) { - if (entry.getKey() !="facilityId"+i) { - if (!isFirst) { + if (!entry.getKey().equals("facilityId" + i)) { + if (sb.length() > 0) { sb.append(","); } sb.append(entry.getValue()); - isFirst = false; } } - String linkId= sb.toString(); + + String linkId = sb.toString(); dcEvent.setLinkId(linkId); + System.out.println(linkId); + //交通管制 - if (eventType ==3 && dcEvent.getDcEventTrafficControl().getFacilityIds()[i] != null) { + if (eventType == 3 && dcEvent.getDcEventTrafficControl().getFacilityIds()[i] != null) { String facilityId = String.valueOf(dcEvent.getDcEventTrafficControl().getFacilityIds()[i]); - dcEvent.setStakeMark( extracted(facilityId)); + dcEvent.setStakeMark(extracted(facilityId)); } dcEventMapper.insertDcEvent(dcEvent); int i6 = dcEventTrafficControlMapper.insertDcEventTrafficControl(dcEvent.getDcEventTrafficControl()); - + } } } @@ -574,6 +654,8 @@ public class DcEventServiceImpl extends ServiceImpl impl } + + /** * 批量删除事件信息 * diff --git a/zc-business/src/main/resources/mapper/business/DcEventMapper.xml b/zc-business/src/main/resources/mapper/business/DcEventMapper.xml index dd3fbddd..1b9d8aa3 100644 --- a/zc-business/src/main/resources/mapper/business/DcEventMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcEventMapper.xml @@ -35,6 +35,7 @@ + @@ -81,6 +82,7 @@ + @@ -164,6 +166,7 @@ longitude, dimension, event_title, + link_id, is_perceived, CASE event_type WHEN '1' THEN '交通事故' @@ -268,6 +271,7 @@ select dc_event.id AS id, dc_event.stake_mark, + dc_event.link_id, dc_event.dimension, dc_event.longitude, dc_event.direction, @@ -373,6 +377,7 @@ /*详情可以调用事件处理流程*/ SELECT dc_event.id AS id, dc_event.stake_mark, + dc_event.link_id, CASE dc_event.direction WHEN '1' THEN '菏泽方向' WHEN '3' THEN '济南方向' @@ -528,6 +533,7 @@ is_perceived, dimension, longitude, + link_id, #{id}, @@ -558,6 +564,7 @@ #{isPerceived}, #{dimension}, #{longitude}, + #{linkId}, @@ -656,6 +663,41 @@ is_perceived = #{isPerceived}, dimension = #{dimension}, longitude = #{longitude}, + link_id = #{linkId}, + + where id = #{id} + + + update dc_event + + dept_id = #{deptId}, + stake_mark = #{stakeMark}, + direction = #{direction}, + user_id = #{userId}, + start_time = #{startTime}, + end_time = #{endTime}, + estimated_end_time = #{estimatedEndTime}, + event_level = #{eventLevel}, + event_type = #{eventType}, + event_subclass = #{eventSubclass}, + event_cause = #{eventCause}, + description = #{description}, + event_state = #{eventState}, + event_source = #{eventSource}, + remark = #{remark}, + create_time = #{createTime}, + update_time = #{updateTime}, + event_source_tips = #{eventSourceTips}, + in_tunnel = #{inTunnel}, + road_id = #{roadId}, + road_id = #{lang}, + event_title = #{eventTitle}, + occurrence_time = #{occurrenceTime}, + is_perceived = #{isPerceived}, + dimension = #{dimension}, + + event_nature = #{eventNature}, + link_id = #{linkId}, where id = #{id} From e3de7818ef71ed85e5e557eddd7d78c538d0bf8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E7=90=B3?= <1911390090@qq.com> Date: Wed, 10 Apr 2024 19:50:09 +0800 Subject: [PATCH 08/18] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E4=BA=A4=E9=80=9A?= =?UTF-8?q?=E7=AE=A1=E5=88=B6=20=E6=94=B6=E8=B4=B9=E7=AB=99=E8=AE=BE?= =?UTF-8?q?=E6=96=BD=20=E7=AD=89=20=E5=A4=9A=E9=80=89=20=E6=8F=92=E5=85=A5?= =?UTF-8?q?=20=E3=80=82=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=BD=AE=20=E6=94=B6?= =?UTF-8?q?=E8=B4=B9=E7=AB=99=E5=A4=9A=E9=80=89=E6=8F=92=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/DcEventServiceImpl.java | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java index 9a789863..84128e87 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java @@ -125,9 +125,7 @@ public class DcEventServiceImpl extends ServiceImpl impl public int insertDcEvent(DcEvent dcEvent) { String dcEventId =dcEvent.getId(); - if (dcEventId ==null){ - } //获取事件类型 @@ -138,11 +136,9 @@ public class DcEventServiceImpl extends ServiceImpl impl dcEvent.setId(uuid); dcEvent.setEventState(0L); //获取部门信息 - //dcEvent.setDeptId(SecurityUtils.getDeptId()); - dcEvent.setDeptId(1l); + dcEvent.setDeptId(SecurityUtils.getDeptId()); //用户 - // dcEvent.setUserId(SecurityUtils.getUserId()); - dcEvent.setUserId(1l); + dcEvent.setUserId(SecurityUtils.getUserId()); dcEvent.setCreateTime(DateUtils.getNowDate()); @@ -183,9 +179,11 @@ public class DcEventServiceImpl extends ServiceImpl impl if (i7 > 0) { - /* //中间库 - MdEvent mdEvent = new MdEvent(dcEvent); - middleDatabaseService.insertMiddleDatabaseEvent(mdEvent);*/ +if (dcEvent.getDcEventTrafficControl().getFacilityIds().length<1 &&dcEventId == null){//非 事件处置 和收费站等多条数据添加 + //中间库 + MdEvent mdEvent = new MdEvent(dcEvent); + middleDatabaseService.insertMiddleDatabaseEvent(mdEvent); +} switch (eventType) { //交通事故 case 1: @@ -221,6 +219,9 @@ public class DcEventServiceImpl extends ServiceImpl impl dcEvent.getDcEventTrafficControl().setFacilityId(dcEvent.getDcEventTrafficControl().getFacilityIds()[0]);//取出数组字段赋值 设施id int i6 = dcEventTrafficControlMapper.insertDcEventTrafficControl(dcEvent.getDcEventTrafficControl());// }else { + //中间库 + MdEvent mdEvent = new MdEvent(dcEvent); + middleDatabaseService.insertMiddleDatabaseEvent(mdEvent); dcEvent.getDcEventTrafficControl().setId(uuid); dcEvent.getDcEventTrafficControl().setFacilityId(dcEvent.getDcEventTrafficControl().getFacilityIds()[0]);//取出数组字段赋值 设施id @@ -251,11 +252,8 @@ public class DcEventServiceImpl extends ServiceImpl impl } String linkId2 = sb2.toString(); dcEvent1.setLinkId(linkId2);//关联管制事件id - dcEventMapper.updateDcEventLinkId(dcEvent1);//修改事件性质 - for (int i = 0; i < dcEvent.getDcEventTrafficControl().getFacilityIds().length; i++) { - dcEvent.getDcEventTrafficControl().setId(map.get("facilityId"+i));//交通管制事件id dcEvent.getDcEventTrafficControl().setFacilityId(dcEvent.getDcEventTrafficControl().getFacilityIds()[i]);//取出数组字段赋值 设施id // 使用StringBuilder来构建逗号分隔的字符串 @@ -263,8 +261,8 @@ public class DcEventServiceImpl extends ServiceImpl impl //新增第一条数据 dcEvent.setId(map.get("facilityId" + i)); dcEvent.setEventState(0L); - dcEvent.setDeptId(1l); - dcEvent.setUserId(1l); + dcEvent.setDeptId(SecurityUtils.getDeptId()); + dcEvent.setUserId(SecurityUtils.getUserId()); dcEvent.setCreateTime(DateUtils.getNowDate()); dcEvent.setEventNature(2L);//关联管制 @@ -287,12 +285,15 @@ public class DcEventServiceImpl extends ServiceImpl impl dcEvent.setStakeMark(extracted(facilityId)); } dcEventMapper.insertDcEvent(dcEvent); + //中间库 + MdEvent mdEvent = new MdEvent(dcEvent); + middleDatabaseService.insertMiddleDatabaseEvent(mdEvent); + int i6 = dcEventTrafficControlMapper.insertDcEventTrafficControl(dcEvent.getDcEventTrafficControl()); } }else { - dcEventMapper.deleteDcEventById(uuid);//删除添加的事件主类 Map map = new HashMap<>(); for (int i = 0; i < dcEvent.getDcEventTrafficControl().getFacilityIds().length; i++) { //设置事件Id UUID无下划线格式32 @@ -301,15 +302,14 @@ public class DcEventServiceImpl extends ServiceImpl impl } for (int i = 0; i < dcEvent.getDcEventTrafficControl().getFacilityIds().length; i++) { - dcEvent.getDcEventTrafficControl().setId(map.get("facilityId" + i));//交通管制事件id dcEvent.getDcEventTrafficControl().setFacilityId(dcEvent.getDcEventTrafficControl().getFacilityIds()[i]);//取出数组字段赋值 设施id //新增第一条数据 dcEvent.setId(map.get("facilityId" + i)); dcEvent.setEventState(0L); - dcEvent.setDeptId(1l); - dcEvent.setUserId(1l); + dcEvent.setDeptId(SecurityUtils.getDeptId()); + dcEvent.setUserId(SecurityUtils.getUserId()); dcEvent.setCreateTime(DateUtils.getNowDate()); dcEvent.setEventNature(2L);//关联管制 @@ -335,7 +335,12 @@ public class DcEventServiceImpl extends ServiceImpl impl String facilityId = String.valueOf(dcEvent.getDcEventTrafficControl().getFacilityIds()[i]); dcEvent.setStakeMark(extracted(facilityId)); } + //中间库 + MdEvent mdEvent = new MdEvent(dcEvent); + middleDatabaseService.insertMiddleDatabaseEvent(mdEvent); + dcEventMapper.insertDcEvent(dcEvent); + int i6 = dcEventTrafficControlMapper.insertDcEventTrafficControl(dcEvent.getDcEventTrafficControl()); } } From 0ccf315ec8f83bbdc79a5f90a8a9908d11308081 Mon Sep 17 00:00:00 2001 From: "Mr.Wang" Date: Thu, 11 Apr 2024 10:37:09 +0800 Subject: [PATCH 09/18] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E5=8F=91=E5=B8=83=E4=B8=AD=E7=9A=84=E5=8F=91=E5=B8=83=E5=86=85?= =?UTF-8?q?=E5=AE=B9-=E8=AE=A1=E7=AE=97=E5=85=AC=E9=87=8C=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/DcEmergencyPlansServiceImpl.java | 59 +++++++++++++++---- 1 file changed, 48 insertions(+), 11 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java index 15140ea4..110cb4e1 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java @@ -167,12 +167,12 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { && executeConfig.get("operationType").equals("2")) { // 执行操作中智能发布语音广播 String content = intelligentPublishingOfInformation(dcEvent); - updateIntelligentPublishingContent(dcExecuteAction,markArray,dcEvent,content); + updateIntelligentPublishingContent(dcExecuteAction,markArray,dcEvent,content,dcEvent.getDirection()); } else if (dcExecuteAction.getDeviceType() == DeviceTypeEnum.VARIABLE_INFORMATION_FLAG.getCode() && executeConfig.get("operationType").equals("2")) { // 执行操作中智能发布情报板 String content = intelligentPublishingOfInformation(dcEvent); - updateIntelligentPublishingContent(dcExecuteAction,markArray,dcEvent,content); + updateIntelligentPublishingContent(dcExecuteAction,markArray,dcEvent,content,dcEvent.getDirection()); } }); }); @@ -181,7 +181,11 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { /** * 更改智能发布中的发布内容-计算公里数 */ - public void updateIntelligentPublishingContent(DcExecuteAction dcExecuteAction, String[] markArray, DcEvent dcEvent,String content) { + public void updateIntelligentPublishingContent(DcExecuteAction dcExecuteAction, + String[] markArray, + DcEvent dcEvent, + String content, + String direction) { List deviceList = ruleFiltering(dcExecuteAction, markArray, dcEvent.getDirection()); JSONObject executeConfig = JSON.parseObject(dcExecuteAction.getExecuteConfig()); List> contentList = new ArrayList<>(); @@ -199,13 +203,25 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { // 不足三位 补零 deviceMarkArray[1] = String.format("%0" + 3 + "d", deviceMarkArray[1]); } - kilometers = Math.abs(Integer.parseInt(deviceMarkArray[0]) - Integer.parseInt(markArray[0])); - meters = Math.abs(Integer.parseInt(deviceMarkArray[1]) - Integer.parseInt(markArray[1])); + if (direction.equals("菏泽方向") || direction.equals("1")) { + kilometers = Math.abs(Integer.parseInt(markArray[0]) - Integer.parseInt(deviceMarkArray[0])); + meters = Integer.parseInt(markArray[1]) - Integer.parseInt(deviceMarkArray[1]); + }else { + kilometers = Math.abs(Integer.parseInt(deviceMarkArray[0]) - Integer.parseInt(markArray[0])); + meters = Integer.parseInt(deviceMarkArray[1]) - Integer.parseInt(markArray[1]); + } + double roundedDistance = Math.round((kilometers + meters / 1000.0) * 10.0) / 10.0; if (roundedDistance < 1) { map.put("content",content.replace("*",(int) (roundedDistance * 1000)+"米")); }else { - map.put("content",content.replace("*",roundedDistance+"公里")); + if (roundedDistance % 1 == 0) { + // 去除掉1.0公里的情况 + map.put("content",content.replace("*",(int)roundedDistance+"公里")); + }else { + map.put("content",content.replace("*",roundedDistance+"公里")); + } + } if (dcExecuteAction.getDeviceType() == DeviceTypeEnum.VARIABLE_INFORMATION_FLAG.getCode()) { @@ -392,7 +408,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { } else if (searchRule.equals(2)) { // 事件上游最近 - if (direction.equals("菏泽方向")) { + if (direction.equals("菏泽方向") || direction.equals("1")) { // 上行 取最大的几个 start.add("55"); start.add("379"); @@ -431,8 +447,8 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { } } else if (searchRule.equals(3)) { - // 事件下游最近 - if (direction.equals("菏泽方向")) { + // 事件下游最近 没有这个类型 + if (direction.equals("菏泽方向") || direction.equals("1")) { // 上行 取最大的几个 start.add(markArray[0]); start.add(markArray[1]); @@ -486,8 +502,29 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { // 根据桩号范围,查询附近设备 dcDevices = dcDeviceService.devicePileNumberQueryDevice(parameter); } - - return dcDevices; + //将0公里和负数的设备去掉 + return dcDevices.stream() + .filter(device -> { + device.setStakeMark(device.getStakeMark().replace("K", "")); + String[] deviceMarkArray = device.getStakeMark().split("\\+"); + if (deviceMarkArray[1].length() < 3) { + deviceMarkArray[1] = String.format("%0" + 3 + "d", deviceMarkArray[1]); + } + int kilometers = 0; + int meters = 0; + if (direction.equals("菏泽方向") || direction.equals("1")) { + // 菏泽方向 桩号增大 设备桩号要小于事件桩号 + kilometers = Integer.parseInt(markArray[0]) - Integer.parseInt(deviceMarkArray[0]); + meters = Integer.parseInt(markArray[1]) - Integer.parseInt(deviceMarkArray[1]); + }else { + // 济南方向 桩号减小 设备桩号要大于事件桩号 + kilometers = Integer.parseInt(deviceMarkArray[0]) - Integer.parseInt(markArray[0]); + meters = Integer.parseInt(deviceMarkArray[1]) - Integer.parseInt(markArray[1]); + } + double roundedDistance = Math.round((kilometers + meters / 1000.0) * 10.0) / 10.0; + return kilometers >= 0 && roundedDistance > 0; + }) + .collect(Collectors.toList()); } From 50a56fed325ad20cf77bdd278419b0c6c5334a72 Mon Sep 17 00:00:00 2001 From: lau572 <1010031226@qq.com> Date: Thu, 11 Apr 2024 15:51:11 +0800 Subject: [PATCH 10/18] =?UTF-8?q?1.=E4=BA=8B=E4=BB=B6=E5=A4=84=E7=BD=AE?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=202.=E6=AF=94=E5=AF=B9=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DcEventController.java | 44 ++ .../com/zc/business/enums/ValueConverter.java | 119 +++++ .../com/zc/business/mapper/DcEventMapper.java | 21 + .../business/mapper/DcEventProcessMapper.java | 2 + .../zc/business/service/IDcEventService.java | 31 ++ .../impl/DcEventProcessServiceImpl.java | 10 + .../service/impl/DcEventServiceImpl.java | 504 +++++++++++++++++- .../zc/business/utils/diff/AlgorithmEnum.java | 82 +++ .../java/com/zc/business/utils/diff/Diff.java | 208 ++++++++ .../algorithm/AbstractObjectAndArray.java | 49 ++ .../algorithm/AbstractPrimitiveAndOther.java | 34 ++ .../utils/diff/algorithm/AlgorithmModule.java | 66 +++ .../utils/diff/algorithm/Comparator.java | 9 + .../diff/algorithm/array/AbstractArray.java | 22 + .../diff/algorithm/array/ArrayComparator.java | 43 ++ .../array/SimilarArrayComparator.java | 252 +++++++++ .../array/SimpleArrayComparator.java | 62 +++ .../nulls/DefaultNullComparator.java | 27 + .../diff/algorithm/nulls/NullComparator.java | 25 + .../diff/algorithm/object/AbstractObject.java | 128 +++++ .../object/LeftJoinObjectComparator.java | 30 ++ .../algorithm/object/ObjectComparator.java | 40 ++ .../object/SimpleObjectComparator.java | 33 ++ .../other/DefaultOtherComparator.java | 38 ++ .../diff/algorithm/other/OtherComparator.java | 24 + .../primitive/DefaultPrimitiveComparator.java | 39 ++ .../primitive/PrimitiveComparator.java | 23 + .../business/utils/diff/model/Constants.java | 20 + .../utils/diff/model/DiffContext.java | 61 +++ .../business/utils/diff/model/PathModule.java | 122 +++++ .../zc/business/utils/diff/model/Result.java | 71 +++ .../utils/diff/model/ResultConvertUtil.java | 66 +++ .../diff/model/SingleNodeDifference.java | 69 +++ .../mapper/business/DcEventMapper.xml | 14 + .../mapper/business/DcEventProcessMapper.xml | 6 + 35 files changed, 2393 insertions(+), 1 deletion(-) create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/AlgorithmEnum.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/Diff.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/AbstractObjectAndArray.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/AbstractPrimitiveAndOther.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/AlgorithmModule.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/Comparator.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/AbstractArray.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/ArrayComparator.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/SimilarArrayComparator.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/SimpleArrayComparator.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/nulls/DefaultNullComparator.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/nulls/NullComparator.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/AbstractObject.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/LeftJoinObjectComparator.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/ObjectComparator.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/SimpleObjectComparator.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/other/DefaultOtherComparator.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/other/OtherComparator.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/primitive/DefaultPrimitiveComparator.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/algorithm/primitive/PrimitiveComparator.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/model/Constants.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/model/DiffContext.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/model/PathModule.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/model/Result.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/model/ResultConvertUtil.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/diff/model/SingleNodeDifference.java diff --git a/zc-business/src/main/java/com/zc/business/controller/DcEventController.java b/zc-business/src/main/java/com/zc/business/controller/DcEventController.java index f075ffe3..d42626b4 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcEventController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcEventController.java @@ -170,4 +170,48 @@ public class DcEventController extends BaseController return toAjax(dcEventService.updateDcEventState(id,state)); } + + + + /** + * @Description 查询事件流程状态 + * + * @author liuwenge + * @date 2024/4/11 11:19 + * @param eventId 事件id + * @return com.ruoyi.common.core.domain.AjaxResult + */ + @ApiOperation("查询事件流程状态") + @GetMapping( "/getProcessNode/{eventId}") + public AjaxResult getProcessNode(@ApiParam(name = "eventId", value = "事件id", required = true) @PathVariable("eventId") String eventId){ + return dcEventService.getProcessNode(eventId); + } + + /** + * @Description 解除事件 + * + * @author liuwenge + * @date 2024/4/11 14:12 + * @param eventId + * @return com.ruoyi.common.core.domain.AjaxResult + */ + @ApiOperation("解除事件") + @PostMapping("/completeEvent") + public AjaxResult completeEvent(String eventId){ + return dcEventService.completeEvent(eventId); + } + + /** + * @Description 解除事件 + * + * @author liuwenge + * @date 2024/4/11 14:12 + * @param eventId + * @return com.ruoyi.common.core.domain.AjaxResult + */ + @ApiOperation("无需清障") + @PostMapping("/skipClear") + public AjaxResult skipClear(String eventId){ + return dcEventService.skipClear(eventId); + } } diff --git a/zc-business/src/main/java/com/zc/business/enums/ValueConverter.java b/zc-business/src/main/java/com/zc/business/enums/ValueConverter.java index 50512827..5af2c2d5 100644 --- a/zc-business/src/main/java/com/zc/business/enums/ValueConverter.java +++ b/zc-business/src/main/java/com/zc/business/enums/ValueConverter.java @@ -26,6 +26,8 @@ public class ValueConverter { private static final Map eventSourceName = new HashMap<>(); // 事件类型名称 private static final Map eventTypeName = new HashMap<>(); + // 事件字段 + private static final Map eventLabel = new HashMap<>(); static { valueMappingSource.put(1,5); @@ -112,6 +114,115 @@ public class ValueConverter { eventTypeName.put("9","设施设备隐患"); eventTypeName.put("10","异常天气"); eventTypeName.put("11","其他事件"); + + eventLabel.put("id","事件编号"); + eventLabel.put("deptId","所属部门"); + eventLabel.put("stakeMark","桩号"); + eventLabel.put("direction","方向"); + eventLabel.put("userId","处理人员"); + eventLabel.put("startTime","开始时间"); + eventLabel.put("endTime","结束时间"); + eventLabel.put("estimatedEndTime","预计解除时间"); + eventLabel.put("eventLevel","事件等级"); +// eventLabel.put("eventType","事件类型"); + eventLabel.put("eventCause","事件原因"); + eventLabel.put("description","描述"); + eventLabel.put("eventState","状态"); + eventLabel.put("eventSource","来源"); +// eventLabel.put("eventNature","事件性质"); + eventLabel.put("eventSourceTips","来源补充说明"); + eventLabel.put("occurrenceTime","发生时间"); +// eventLabel.put("isPerceived","是否感知事件"); + eventLabel.put("lang","影响车道"); + eventLabel.put("roadName","高速名称"); + eventLabel.put("eventTitle","时间标题"); + eventLabel.put("remark","备注"); + eventLabel.put("dcEventAbnormalWeather.weatherSituation","天气情况"); + eventLabel.put("dcEventAbnormalWeather.emergencyLevel","紧急级别"); + eventLabel.put("dcEventAbnormalWeather.endStakeMark","终止桩号"); + eventLabel.put("dcEventAbnormalWeather.numericalValue","异常天气数值"); + eventLabel.put("dcEventAccident.reporterName","报警人姓名"); + eventLabel.put("dcEventAccident.reporterPhoneNumber","报警人电话"); + eventLabel.put("dcEventAccident.locationType","地点"); + eventLabel.put("dcEventAccident.trafficJam","压车(公里)"); + eventLabel.put("dcEventAccident.weatherCondition","天气情况"); + eventLabel.put("dcEventAccident.impactLevel","影响"); + eventLabel.put("dcEventAccident.isReverseCargo","是否倒货"); + eventLabel.put("dcEventAccident.isMaintenance","是否养护事故"); + eventLabel.put("dcEventAccident.policeContact","交警电话"); + eventLabel.put("dcEventAccident.towingServiceContact","清障电话"); + eventLabel.put("dcEventAccident.congestionAhead","前方是否拥堵"); + eventLabel.put("dcEventAccident.atIntersection","是否分岔口"); + eventLabel.put("dcEventAccident.onCurve","是否处在弯道"); + eventLabel.put("dcEventAccident.spillageItem","洒落物名称"); + eventLabel.put("dcEventAccident.vehicleOwnerPhone","车主电话"); + eventLabel.put("dcEventAccident.smallCar","小型车(辆)"); + eventLabel.put("dcEventAccident.trucks","货车(辆)"); + eventLabel.put("dcEventAccident.buses","客车(辆)"); + eventLabel.put("dcEventAccident.tankers","罐车(辆)"); + eventLabel.put("dcEventAccident.minorInjuries","轻伤(人)"); + eventLabel.put("dcEventAccident.seriousInjuries","重伤(人)"); + eventLabel.put("dcEventAccident.fatalities","死亡(人)"); + eventLabel.put("dcEventAccident.isPrivate","私密事件"); + eventLabel.put("dcEventAccident.facilityId","设施关联"); + eventLabel.put("dcEventAccident.rampId","匝道id"); + eventLabel.put("dcEventAccident.location","地点"); + eventLabel.put("dcEventConstruction.controlMode","管制方式"); + eventLabel.put("dcEventConstruction.locationType","地点类型"); + eventLabel.put("dcEventConstruction.specialPlaceDescription","特殊地点描述"); + eventLabel.put("dcEventConstruction.specialConstruction","专项施工"); + eventLabel.put("dcEventConstruction.otherConstructionName","其他施工名称"); + eventLabel.put("dcEventConstruction.constructionMeasurement","施工措施"); + eventLabel.put("dcEventConstruction.facilityId","设施id"); + eventLabel.put("dcEventConstruction.exitsInlets","出入口"); + eventLabel.put("dcEventConstruction.laneOccupancy","占用车道"); + eventLabel.put("dcEventConstruction.trafficCondition","通行情况"); + eventLabel.put("dcEventConstruction.constructionMethod","施工方式"); + eventLabel.put("dcEventConstruction.localRoadName","地方道路名称"); + eventLabel.put("dcEventConstruction.endStakeMark","结束桩号"); + eventLabel.put("dcEventConstruction.location","地点"); + eventLabel.put("dcEventServiceArea.exitsInlets","出入口"); + eventLabel.put("dcEventServiceArea.facilityId","服务区"); + eventLabel.put("dcEventServiceArea.disableFacility","停用设施"); + eventLabel.put("dcEventTrafficCongestion.congestionMileage","拥堵里程(公里)"); + eventLabel.put("dcEventTrafficCongestion.maxCongestionMileage","最大拥堵里程(公里)"); + eventLabel.put("dcEventTrafficCongestion.congestionCause","拥堵原因"); + eventLabel.put("dcEventTrafficCongestion.facilityId","设施id"); + eventLabel.put("dcEventTrafficCongestion.rampId","匝道"); + eventLabel.put("dcEventTrafficCongestion.location","地点"); + eventLabel.put("dcEventTrafficCongestion.detailedReasons","详细原因"); + eventLabel.put("dcEventTrafficCongestion.locationType","地点类型"); + eventLabel.put("dcEventTrafficCongestion.locationDescription","地点描述"); + eventLabel.put("dcEventTrafficCongestion.endStakeMark","终止桩号"); + eventLabel.put("dcEventVehicleAccident.reporterName","报警人姓名"); + eventLabel.put("dcEventVehicleAccident.reporterPhoneNumber","报警人电话"); + eventLabel.put("dcEventVehicleAccident.locationType","地点方式"); + eventLabel.put("dcEventVehicleAccident.trafficJam","压车(公里)"); + eventLabel.put("dcEventVehicleAccident.weatherCondition","天气情况"); + eventLabel.put("dcEventVehicleAccident.congestionAhead","前方是否拥堵"); + eventLabel.put("dcEventVehicleAccident.atIntersection","是否分岔口"); + eventLabel.put("dcEventVehicleAccident.onCurve","是否处在弯道"); + eventLabel.put("dcEventVehicleAccident.smallCar","小型车(辆)"); + eventLabel.put("dcEventVehicleAccident.trucks","货车(辆)"); + eventLabel.put("dcEventVehicleAccident.buses","客车(辆)"); + eventLabel.put("dcEventVehicleAccident.tankers","罐车(辆)"); + eventLabel.put("dcEventVehicleAccident.minorInjuries","轻伤(人)"); + eventLabel.put("dcEventVehicleAccident.seriousInjuries","重伤(人)"); + eventLabel.put("dcEventVehicleAccident.fatalities","死亡(人)"); + eventLabel.put("dcEventVehicleAccident.isPrivate","私密事件"); + eventLabel.put("dcEventVehicleAccident.facilityId","设施id"); + eventLabel.put("dcEventVehicleAccident.rampId","匝道"); + eventLabel.put("dcEventVehicleAccident.location","地点"); + eventLabel.put("dcEventTrafficControl.controlType","管制分类"); + eventLabel.put("dcEventTrafficControl.controlCause","管制原因"); + eventLabel.put("dcEventTrafficControl.exitsInlets","出入口"); + eventLabel.put("dcEventTrafficControl.facilityId","设施id"); + eventLabel.put("dcEventTrafficControl.rampId","匝道"); + eventLabel.put("dcEventTrafficControl.causeType","原因类型"); + eventLabel.put("dcEventTrafficControl.measure","措施"); + eventLabel.put("dcEventTrafficControl.classify","分类"); + eventLabel.put("dcEventTrafficControl.limitedType","限制类型"); +// eventLabel.put("dcEventTrafficControl.vehicleType","车辆类型"); } } @@ -133,6 +244,10 @@ public class ValueConverter { public static Map getEventTypeName() { return ValueMappingHolder.eventTypeName; } + + public static Map getEventLabel() { + return ValueMappingHolder.eventLabel; + } /** * 根据输入值返回转换后的值 * 如果输入值不在映射中,则返回输入值本身 @@ -162,6 +277,10 @@ public class ValueConverter { Map mapping = getEventTypeName(); return mapping.getOrDefault(inputValue, inputValue); } + public static String eventLabel(String inputValue) { + Map mapping = getEventLabel(); + return mapping.getOrDefault(inputValue, inputValue); + } //测试 // @Test diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcEventMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcEventMapper.java index b4be7c31..ab62a6d7 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcEventMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcEventMapper.java @@ -6,6 +6,7 @@ import com.zc.business.domain.DcEvent; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.Date; import java.util.List; import java.util.Map; @@ -85,6 +86,26 @@ public interface DcEventMapper extends BaseMapper boolean batchInsertDcEvent(List eventList); int updateDcEventState(@Param("id") String id,@Param("state") int state); + + /** + * @Description 查询事件流程状态 + * + * @author liuwenge + * @date 2024/4/11 11:19 + * @param eventId 事件id + * @return com.ruoyi.common.core.domain.AjaxResult + */ + List> getProcessNode(@Param("eventId") String eventId); + + /** + * @Description 解除事件 + * + * @author liuwenge + * @date 2024/4/11 14:15 + * @param eventId + * @return boolean + */ + boolean completeEvent(@Param("eventId") String eventId); } diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcEventProcessMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcEventProcessMapper.java index 042c50cb..d512e150 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcEventProcessMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcEventProcessMapper.java @@ -73,4 +73,6 @@ public interface DcEventProcessMapper * @return */ List selectDcDispatchByEventId(String id); + + int selectFinalNode(String eventId); } diff --git a/zc-business/src/main/java/com/zc/business/service/IDcEventService.java b/zc-business/src/main/java/com/zc/business/service/IDcEventService.java index e97685fe..1740155f 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcEventService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcEventService.java @@ -1,6 +1,7 @@ package com.zc.business.service; +import com.ruoyi.common.core.domain.AjaxResult; import com.zc.business.domain.DcEvent; import java.util.List; @@ -91,4 +92,34 @@ public interface IDcEventService List eventPileNumberQueryEvent(Map parameter); int updateDcEventState(String id, int state); + + /** + * @Description 查询事件流程状态 + * + * @author liuwenge + * @date 2024/4/11 11:19 + * @param eventId 事件id + * @return com.ruoyi.common.core.domain.AjaxResult + */ + AjaxResult getProcessNode(String eventId); + + /** + * @Description 解除事件 + * + * @author liuwenge + * @date 2024/4/11 14:13 + * @param eventId + * @return com.ruoyi.common.core.domain.AjaxResult + */ + AjaxResult completeEvent(String eventId); + + /** + * @Description 无需清障 + * + * @author liuwenge + * @date 2024/4/11 14:13 + * @param eventId + * @return com.ruoyi.common.core.domain.AjaxResult + */ + AjaxResult skipClear(String eventId); } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEventProcessServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEventProcessServiceImpl.java index d98b0a7f..4c91278c 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEventProcessServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEventProcessServiceImpl.java @@ -7,6 +7,7 @@ import com.ruoyi.common.config.RuoYiConfig; import com.ruoyi.common.exception.file.InvalidExtensionException; import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.file.MimeTypeUtils; +import com.zc.business.domain.DcEvent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.zc.business.mapper.DcEventProcessMapper; @@ -24,6 +25,8 @@ public class DcEventProcessServiceImpl implements IDcEventProcessService { @Autowired private DcEventProcessMapper dcEventProcessMapper; + @Autowired + private DcEventServiceImpl dcEventService; /** * 查询事件处理流程 @@ -69,6 +72,13 @@ public class DcEventProcessServiceImpl implements IDcEventProcessService e.printStackTrace(); } } + //判断是否最后一个节点 + if (dcEventProcess.getProcessType() != null && dcEventProcess.getProcessType() == 1){ + int finalNode = dcEventProcessMapper.selectFinalNode(dcEventProcess.getEventId()); + if (finalNode == dcEventProcess.getProcessId()){ + dcEventService.updateDcEventState(dcEventProcess.getEventId(),2); + } + } return dcEventProcessMapper.insertDcEventProcess(dcEventProcess); } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java index 3ec6c9eb..a1f75d48 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java @@ -1,9 +1,13 @@ package com.zc.business.service.impl; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.system.service.ISysDeptService; import com.sun.xml.bind.v2.TODO; @@ -13,10 +17,14 @@ import com.zc.business.mapper.*; import com.zc.business.service.IDcEventProcessService; import com.zc.business.service.IDcEventService; import com.zc.business.service.IMiddleDatabaseService; +import com.zc.business.utils.diff.Diff; +import com.zc.business.utils.diff.model.Result; +import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.text.SimpleDateFormat; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -546,10 +554,24 @@ public class DcEventServiceImpl extends ServiceImpl impl */ @Override public int updateDcEvent(DcEvent dcEvent) { + DcEvent oldEvent = selectEventSubclassById(dcEvent.getEventType().intValue(),dcEvent.getId()); + dcEvent.setUpdateTime(DateUtils.getNowDate()); int i7 = dcEventMapper.updateDcEvent(dcEvent); if (i7 > 0) { + String context = comparisonInfo(oldEvent,dcEvent); + + //事件处置流程记录 + DcEventProcess dcEventProcess = new DcEventProcess(); + dcEventProcess.setEventId(dcEvent.getId()); + dcEventProcess.setOperationTime(new Date()); + dcEventProcess.setOperator(SecurityUtils.getUserId().toString()); + dcEventProcess.setSource(1); + dcEventProcess.setContext(context); + dcEventProcessService.insertDcEventProcess(dcEventProcess); + + //中间库 MdEvent mdEvent = new MdEvent(dcEvent); middleDatabaseService.updateMiddleDatabaseEvent(mdEvent); @@ -823,7 +845,29 @@ public class DcEventServiceImpl extends ServiceImpl impl @Override public int updateDcEventState(String id, int state) { - return dcEventMapper.updateDcEventState(id,state); + int i = dcEventMapper.updateDcEventState(id,state); + if (i > 0){ + DcEvent dcEvent = dcEventMapper.selectDcEventById(id); + + //事件处置流程记录 + DcEventProcess dcEventProcess = new DcEventProcess(); + dcEventProcess.setEventId(dcEvent.getId()); + dcEventProcess.setOperationTime(new Date()); + dcEventProcess.setOperator(SecurityUtils.getUserId().toString()); + dcEventProcess.setSource(1); + List processConfigList = dcProcessConfigMapper.selectDcProcessConfigByEventType(dcEvent.getEventType().intValue()); + if (processConfigList != null && processConfigList.size() > 0){ + DcProcessConfig dcProcessConfig = processConfigList.get(0); + dcEventProcess.setProcessType(1); + dcEventProcess.setProcessId(Long.valueOf(dcProcessConfig.getNodeNode())); + dcEventProcess.setProcessName(dcProcessConfig.getProcessNode()); + } + String sourceName = ValueConverter.eventSourceName(dcEvent.getEventSource().toString()); + String typeName = ValueConverter.eventTypeName(dcEvent.getEventType().toString()); + dcEventProcess.setContext("由" + sourceName + "上报了一起" + typeName + "事件"); + dcEventProcessService.insertDcEventProcess(dcEventProcess); + } + return i; } public static List castList(Object obj, Class clazz) { @@ -836,4 +880,462 @@ public class DcEventServiceImpl extends ServiceImpl impl } return null; } + + /** + * @Description 事件信息比对 + * + * @author liuwenge + * @date 2024/4/10 16:24 + * @param oldEvent 旧数据 + * @param newEvent 新数据 + * @return java.lang.String + */ + public String comparisonInfo(DcEvent oldEvent,DcEvent newEvent){ + String context = ""; + if (oldEvent == null || newEvent == null){ + return context; + } + Diff diff = new Diff(); + List diffList = diff.diff(JSON.toJSON(oldEvent).toString(),JSON.toJSON(newEvent).toString()); + for (Result result : diffList) { + if ("ADD".equals(result.getDiffType()) || "MODIFY".equals(result.getDiffType())){ + if ("startTime".equals(result.getRightPath()) + || "endTime".equals(result.getRightPath()) + || "estimatedEndTime".equals(result.getRightPath()) + || "occurrenceTime".equals(result.getRightPath())){ + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + Date date = new Date(); + date.setTime(Long.parseLong(result.getRight().toString())); + result.setRight(df.format(date));; + } catch (Exception e){ + e.printStackTrace(); + } + } else if ("direction".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("上行"); + } else if ("2".equals(result.getRight())){ + result.setRight("中"); + } else if ("3".equals(result.getRight())){ + result.setRight("下行"); + } + } else if ("eventState".equals(result.getRightPath())){ + if ("0".equals(result.getRight())){ + result.setRight("待确认"); + } else if ("1".equals(result.getRight())){ + result.setRight("处理中"); + } else if ("2".equals(result.getRight())){ + result.setRight("已完成"); + } + } else if ("eventSource".equals(result.getRightPath())){ + result.setRight(ValueConverter.eventSourceName(result.getRight().toString())); + } else if ("lang".equals(result.getRightPath())){ + String langStr = ""; + String langArr[] = result.getRight().toString().split(","); + for (String lang : langArr) { + if ("1".equals(lang)){ + langStr = langStr + "行1,"; + } else if ("2".equals(lang)){ + langStr = langStr + "行2,"; + } else if ("3".equals(lang)){ + langStr = langStr + "行3,"; + } else if ("4".equals(lang)){ + langStr = langStr + "行4,"; + } else if ("0".equals(lang)){ + langStr = langStr + "应急车道,"; + } + } + if (langStr.length() > 0){ + langStr = langStr.substring(0,langStr.length() -1); + } + result.setRight(langStr); + } else if ("dcEventAbnormalWeather.weatherSituation".equals(result.getRightPath())){ + if ("1-1".equals(result.getRight())){ + result.setRight("雨雾"); + } else if ("1-2".equals(result.getRight())){ + result.setRight("雨雪"); + } else if ("1-3".equals(result.getRight())){ + result.setRight("中雨"); + } else if ("1-4".equals(result.getRight())){ + result.setRight("小雨"); + } else if ("1-5".equals(result.getRight())){ + result.setRight("大雨"); + } else if ("1-6".equals(result.getRight())){ + result.setRight("暴雨"); + } else if ("2-1".equals(result.getRight())){ + result.setRight("小雪"); + } else if ("2-2".equals(result.getRight())){ + result.setRight("中雪"); + } else if ("2-3".equals(result.getRight())){ + result.setRight("大雪"); + } else if ("2-4".equals(result.getRight())){ + result.setRight("暴雪"); + } else if ("2-5".equals(result.getRight())){ + result.setRight("大暴雪"); + } else if ("2-6".equals(result.getRight())){ + result.setRight("特大暴雪"); + } else if ("3-1".equals(result.getRight())){ + result.setRight("轻雾"); + } else if ("3-2".equals(result.getRight())){ + result.setRight("大雾"); + } else if ("3-3".equals(result.getRight())){ + result.setRight("浓雾"); + } else if ("3-4".equals(result.getRight())){ + result.setRight("强浓雾"); + } else if ("3-5".equals(result.getRight())){ + result.setRight("团雾"); + } + } else if ("dcEventAbnormalWeather.emergencyLevel".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("一般"); + } else if ("2".equals(result.getRight())){ + result.setRight("紧急"); + } + } else if ("dcEventAccident.locationType".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("高速主线"); + } else if ("2".equals(result.getRight())){ + result.setRight("服务区"); + } else if ("3".equals(result.getRight())){ + result.setRight("立交桥"); + } else if ("4".equals(result.getRight())){ + result.setRight("收费站"); + } + } else if ("dcEventAccident.weatherCondition".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("晴"); + } else if ("2".equals(result.getRight())){ + result.setRight("雨"); + } else if ("3".equals(result.getRight())){ + result.setRight("雪"); + } else if ("4".equals(result.getRight())){ + result.setRight("雾"); + } else if ("5".equals(result.getRight())){ + result.setRight("其他"); + } + } else if ("dcEventAccident.impactLevel".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("无"); + } else if ("2".equals(result.getRight())){ + result.setRight("危化品泄漏"); + } else if ("3".equals(result.getRight())){ + result.setRight("整车自燃"); + } else if ("4".equals(result.getRight())){ + result.setRight("车辆复燃"); + } else if ("5".equals(result.getRight())){ + result.setRight("散装人工倒货"); + } + } else if ("dcEventAccident.isReverseCargo".equals(result.getRightPath()) + || "dcEventAccident.isMaintenance".equals(result.getRightPath()) + || "dcEventAccident.congestionAhead".equals(result.getRightPath()) + || "dcEventAccident.atIntersection".equals(result.getRightPath()) + || "dcEventAccident.onCurve".equals(result.getRightPath()) + || "dcEventAccident.isPrivate".equals(result.getRightPath()) + || "dcEventVehicleAccident.congestionAhead".equals(result.getRightPath()) + || "dcEventVehicleAccident.atIntersection".equals(result.getRightPath()) + || "dcEventVehicleAccident.onCurve".equals(result.getRightPath()) + || "dcEventVehicleAccident.isPrivate".equals(result.getRightPath())){ + if ("0".equals(result.getRight())){ + result.setRight("否"); + } else if ("1".equals(result.getRight())){ + result.setRight("是"); + } + } else if ("dcEventConstruction.controlMode".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("封闭"); + } else if ("2".equals(result.getRight())){ + result.setRight("不封闭"); + } + } else if ("dcEventConstruction.locationType".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("单点"); + } else if ("2".equals(result.getRight())){ + result.setRight("多点"); + } + } else if ("dcEventConstruction.specialConstruction".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("专项工程施工"); + } else if ("2".equals(result.getRight())){ + result.setRight("改扩建专项工程施工"); + } else if ("3".equals(result.getRight())){ + result.setRight("桥梁专项工程施工"); + } else if ("4".equals(result.getRight())){ + result.setRight("其他专项工程施工"); + } + } else if ("dcEventConstruction.constructionMeasurement".equals(result.getRightPath())){ + if ("0".equals(result.getRight())){ + result.setRight("无"); + } else if ("1".equals(result.getRight())){ + result.setRight("并道行驶"); + } else if ("2".equals(result.getRight())){ + result.setRight("临时保通"); + } else if ("3".equals(result.getRight())){ + result.setRight("借路侧服务区通行"); + } + } else if ("dcEventConstruction.exitsInlets".equals(result.getRightPath()) + || "dcEventServiceArea.exitsInlets".equals(result.getRightPath()) + || "dcEventTrafficControl.exitsInlets".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("出口"); + } else if ("2".equals(result.getRight())){ + result.setRight("入口"); + } + } else if ("dcEventConstruction.trafficCondition".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("通行正常"); + } else if ("2".equals(result.getRight())){ + result.setRight("通行受阻"); + } + } else if ("dcEventServiceArea.disableFacility".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("卫生间"); + } else if ("2".equals(result.getRight())){ + result.setRight("餐厅"); + } else if ("3".equals(result.getRight())){ + result.setRight("停车场"); + } else if ("4".equals(result.getRight())){ + result.setRight("加油站"); + } else if ("5".equals(result.getRight())){ + result.setRight("充电桩"); + } + } else if ("dcEventTrafficCongestion.congestionCause".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("车流量大"); + } else if ("2".equals(result.getRight())){ + result.setRight("交通事故"); + } else if ("3".equals(result.getRight())){ + result.setRight("恶劣天气"); + } else if ("4".equals(result.getRight())){ + result.setRight("施工"); + } else if ("5".equals(result.getRight())){ + result.setRight("其他"); + } + } else if ("dcEventTrafficCongestion.location".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("入口"); + } else if ("2".equals(result.getRight())){ + result.setRight("出口"); + } else if ("3".equals(result.getRight())){ + result.setRight("入口内广场"); + } else if ("4".equals(result.getRight())){ + result.setRight("出口内广场"); + } else if ("5".equals(result.getRight())){ + result.setRight("外广场"); + } else if ("6".equals(result.getRight())){ + result.setRight("入口车道"); + } else if ("7".equals(result.getRight())){ + result.setRight("出口车道"); + } else if ("8".equals(result.getRight())){ + result.setRight("入口匝道"); + } else if ("9".equals(result.getRight())){ + result.setRight("出口匝道"); + } + } else if ("dcEventTrafficCongestion.locationType".equals(result.getRightPath()) + || "dcEventVehicleAccident.locationType".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("高速主线"); + } else if ("2".equals(result.getRight())){ + result.setRight("服务区"); + } else if ("3".equals(result.getRight())){ + result.setRight("立交桥"); + } else if ("4".equals(result.getRight())){ + result.setRight("收费站"); + } + } else if ("dcEventTrafficCongestion.weatherCondition".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("晴"); + } else if ("2".equals(result.getRight())){ + result.setRight("雨"); + } else if ("3".equals(result.getRight())){ + result.setRight("雪"); + } else if ("4".equals(result.getRight())){ + result.setRight("雾"); + } else if ("5".equals(result.getRight())){ + result.setRight("其他"); + } + } else if ("dcEventTrafficControl.controlType".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("封闭"); + } else if ("2".equals(result.getRight())){ + result.setRight("限行"); + } + } else if ("dcEventTrafficControl.controlCause".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("车流量大"); + } else if ("2".equals(result.getRight())){ + result.setRight("交通事故"); + } else if ("3".equals(result.getRight())){ + result.setRight("恶劣天气"); + } else if ("4".equals(result.getRight())){ + result.setRight("施工"); + } else if ("5".equals(result.getRight())){ + result.setRight("警备任务"); + } else if ("6".equals(result.getRight())){ + result.setRight("其他"); + } + } else if ("dcEventTrafficControl.causeType".equals(result.getRightPath())){ + if ("3-1".equals(result.getRight())){ + result.setRight("雨"); + } else if ("3-2".equals(result.getRight())){ + result.setRight("雪"); + } else if ("3-3".equals(result.getRight())){ + result.setRight("雾"); + } else if ("3-4".equals(result.getRight())){ + result.setRight("道路积水"); + } else if ("3-5".equals(result.getRight())){ + result.setRight("道路湿滑"); + } else if ("3-6".equals(result.getRight())){ + result.setRight("道路结冰"); + } else if ("3-7".equals(result.getRight())){ + result.setRight("沙尘暴"); + } else if ("4-1".equals(result.getRight())){ + result.setRight("专项工程施工"); + } else if ("4-2".equals(result.getRight())){ + result.setRight("改扩建工程施工"); + } else if ("4-3".equals(result.getRight())){ + result.setRight("其他施工"); + } + } else if ("dcEventTrafficControl.measure".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("临时关闭"); + } else if ("2".equals(result.getRight())){ + result.setRight("限行车辆"); + } else if ("3".equals(result.getRight())){ + result.setRight("限行车道"); + } else if ("4".equals(result.getRight())){ + result.setRight("限行车道且限行车辆"); + } else if ("5".equals(result.getRight())){ + result.setRight("间隔放行"); + } else if ("6".equals(result.getRight())){ + result.setRight("并道行驶"); + } else if ("7".equals(result.getRight())){ + result.setRight("限速"); + } + } else if ("dcEventTrafficControl.classify".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("主线关闭"); + } else if ("2".equals(result.getRight())){ + result.setRight("主线限行"); + } else if ("3".equals(result.getRight())){ + result.setRight("主线间隔放行"); + } else if ("4".equals(result.getRight())){ + result.setRight("主线并道"); + } else if ("5".equals(result.getRight())){ + result.setRight("主线限速"); + } + } else if ("dcEventTrafficControl.limitedType".equals(result.getRightPath())){ + if ("1".equals(result.getRight())){ + result.setRight("只允许"); + } else if ("2".equals(result.getRight())){ + result.setRight("禁止"); + } + } + String label = ValueConverter.eventLabel(result.getRightPath()); + context = context + label + "修改为:" + result.getRight() + ","; + } + } + + if (context.length() > 0){ + context = context.substring(0,context.length() -1); + } + + + return context; + } + + + /** + * @Description 查询事件流程状态 + * + * @author liuwenge + * @date 2024/4/11 11:19 + * @param eventId 事件id + * @return com.ruoyi.common.core.domain.AjaxResult + */ + @Override + public AjaxResult getProcessNode(String eventId){ + List> processNode = dcEventMapper.getProcessNode(eventId); + return AjaxResult.success(processNode); + } + + /** + * @Description 解除事件 + * + * @author liuwenge + * @date 2024/4/11 14:13 + * @param eventId + * @return com.ruoyi.common.core.domain.AjaxResult + */ + @Override + public AjaxResult completeEvent(String eventId){ + boolean flag = dcEventMapper.completeEvent(eventId); + if (flag){ + DcEvent dcEvent = dcEventMapper.selectDcEventById(eventId); + + String datePoor = getDatePoor(dcEvent.getEndTime(),dcEvent.getStartTime()); + + //事件处置流程记录 + DcEventProcess dcEventProcess = new DcEventProcess(); + dcEventProcess.setEventId(eventId); + dcEventProcess.setOperationTime(new Date()); + dcEventProcess.setOperator(SecurityUtils.getUserId().toString()); + dcEventProcess.setSource(1); + + dcEventProcess.setContext("事件解除,处置完毕,处置时长:" + datePoor); + dcEventProcessService.insertDcEventProcess(dcEventProcess); + return AjaxResult.success("解除事件成功"); + } + return AjaxResult.error("解除事件失败"); + } + + /** + * @Description 无需清障 + * + * @author liuwenge + * @date 2024/4/11 14:13 + * @param eventId + * @return com.ruoyi.common.core.domain.AjaxResult + */ + @Override + public AjaxResult skipClear(String eventId){ + + //事件处置流程记录 + DcEventProcess dcEventProcess = new DcEventProcess(); + dcEventProcess.setEventId(eventId); + dcEventProcess.setOperationTime(new Date()); + dcEventProcess.setOperator(SecurityUtils.getUserId().toString()); + dcEventProcess.setSource(1); + dcEventProcess.setProcessType(1); + dcEventProcess.setProcessId(6L); + dcEventProcess.setProcessName("清障结束"); + + dcEventProcess.setContext("选择不需要清障"); + dcEventProcessService.insertDcEventProcess(dcEventProcess); + return AjaxResult.success("无需清障成功"); + } + + //时间比对 + public static String getDatePoor(Date endDate, Date nowDate) { + + long nd = 1000 * 24 * 60 * 60; + long nh = 1000 * 60 * 60; + long nm = 1000 * 60; + long ns = 1000; + + // 获得两个时间的毫秒时间差异 + long diff = endDate.getTime() - nowDate.getTime(); + + // 计算差多少天 + long day = diff / nd; + // 计算差多少小时 + long hour = diff % nd / nh; + // 计算差多少分钟 + long min = diff % nd % nh / nm; + // 计算差多少秒//输出结果 + long sec = diff % nd % nh % nm / ns; + + return day + "天" + hour + "小时" + min + "分钟" + sec + "秒"; + + } + } diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/AlgorithmEnum.java b/zc-business/src/main/java/com/zc/business/utils/diff/AlgorithmEnum.java new file mode 100644 index 00000000..f9391273 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/AlgorithmEnum.java @@ -0,0 +1,82 @@ +package com.zc.business.utils.diff; + +import com.zc.business.utils.diff.algorithm.AlgorithmModule; +import com.zc.business.utils.diff.algorithm.array.SimilarArrayComparator; +import com.zc.business.utils.diff.algorithm.array.SimpleArrayComparator; +import com.zc.business.utils.diff.algorithm.nulls.DefaultNullComparator; +import com.zc.business.utils.diff.algorithm.object.LeftJoinObjectComparator; +import com.zc.business.utils.diff.algorithm.object.SimpleObjectComparator; +import com.zc.business.utils.diff.algorithm.other.DefaultOtherComparator; +import com.zc.business.utils.diff.algorithm.primitive.DefaultPrimitiveComparator; + +/** + * 算法模型枚举类:提供一些默认实现的算法模型 + * @Author JingWei + * @create 2022/3/2 + */ +public enum AlgorithmEnum { + + /** + * 默认的比较算法模型 + */ + DEFAULT(defaultAlgorithmModule()), + + /** + * 数组比较采用Simple,对象比较采用Simple + */ + SIMPLE_ARRAY_AND_SIMPLE_OBJECT(simpleAndSimpleAlgorithmModule()), + + /** + * 数组比较采用Simple,对象比较采用LeftJoin + */ + SIMPLE_ARRAY_AND_LEFTJOIN_OBJECT(simpleAndLeftJoinAlgorithmModule()), + + /** + * 数组比较采用Similar,对象比较采用LeftJoin + */ + SIMLAR_ARRAY_AND_LEFTJOIN_OBJECT(similarAndLeftJoinAlgorithmModule()), + + /** + * 数组比较采用Similar,对象比较采用Simple + */ + MOST_COMMONLY_USED(similarAndSimpleAlgorithmModule()); + + final private AlgorithmModule algorithmModule; + + AlgorithmEnum(AlgorithmModule algorithmModule) { + this.algorithmModule = algorithmModule; + } + + + public AlgorithmModule getAlgorithmModule() { + return algorithmModule; + } + + private static AlgorithmModule defaultAlgorithmModule() { + return new AlgorithmModule(new SimpleObjectComparator(), new SimilarArrayComparator(), + new DefaultPrimitiveComparator(), new DefaultNullComparator(), new DefaultOtherComparator()); + + } + + private static AlgorithmModule simpleAndSimpleAlgorithmModule() { + return new AlgorithmModule(new SimpleObjectComparator(), new SimpleArrayComparator(), + new DefaultPrimitiveComparator(), new DefaultNullComparator(), new DefaultOtherComparator()); + } + + + private static AlgorithmModule simpleAndLeftJoinAlgorithmModule() { + return new AlgorithmModule(new LeftJoinObjectComparator(), new SimpleArrayComparator(), + new DefaultPrimitiveComparator(), new DefaultNullComparator(), new DefaultOtherComparator()); + } + + private static AlgorithmModule similarAndLeftJoinAlgorithmModule() { + return new AlgorithmModule(new LeftJoinObjectComparator(), new SimilarArrayComparator(), + new DefaultPrimitiveComparator(), new DefaultNullComparator(), new DefaultOtherComparator()); + } + + private static AlgorithmModule similarAndSimpleAlgorithmModule() { + return new AlgorithmModule(new SimpleObjectComparator(), new SimilarArrayComparator(), + new DefaultPrimitiveComparator(), new DefaultNullComparator(), new DefaultOtherComparator()); + } + +} \ No newline at end of file diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/Diff.java b/zc-business/src/main/java/com/zc/business/utils/diff/Diff.java new file mode 100644 index 00000000..638b8ee9 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/Diff.java @@ -0,0 +1,208 @@ +package com.zc.business.utils.diff; + +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; +import com.zc.business.utils.diff.algorithm.AlgorithmModule; +import com.zc.business.utils.diff.algorithm.array.ArrayComparator; +import com.zc.business.utils.diff.algorithm.array.SimilarArrayComparator; +import com.zc.business.utils.diff.algorithm.nulls.DefaultNullComparator; +import com.zc.business.utils.diff.algorithm.nulls.NullComparator; +import com.zc.business.utils.diff.algorithm.object.ObjectComparator; +import com.zc.business.utils.diff.algorithm.object.SimpleObjectComparator; +import com.zc.business.utils.diff.algorithm.other.DefaultOtherComparator; +import com.zc.business.utils.diff.algorithm.other.OtherComparator; +import com.zc.business.utils.diff.algorithm.primitive.DefaultPrimitiveComparator; +import com.zc.business.utils.diff.algorithm.primitive.PrimitiveComparator; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; +import com.zc.business.utils.diff.model.Result; +import com.zc.business.utils.diff.model.ResultConvertUtil; + +import java.util.List; + +/** + * DIFF入口,用于比较两个Json字符串 + * @Author JingWei + * @create 2022/2/25 + */ +public class Diff { + /** + * 算法模型。根据传入的算法模型使用该算法模型进行diff比较。 + */ + private AlgorithmEnum algorithmEnum; + /** + * 特殊路径集合。当前路径符合特殊路径且特殊路径下比较结果相同,会在返回结果中做额外标识标识。 + */ + private List specialPath; + /** + * 噪音字段集合。如果当前路径符合噪音字段路径,则不会比较。 + */ + private List noisePahList; + /** + * 以下为5种可以自定义的比较器,条件是algorithmEnum为空(如果algorithmEnum有值,直接使用algorithmEnum对应算法模型,比较器不生效) + */ + private ObjectComparator objectComparator; + private ArrayComparator arrayComparator; + private PrimitiveComparator primitiveComparator; + private NullComparator nullComparator; + private OtherComparator otherComparator; + + + /** + * @param a 要比较的第一个JsonElement + * @param b 要比较的第二个JsonElement + * @return 用来展示的diff结果 + */ + public List diffElement(JsonElement a, JsonElement b) { + DiffContext diffContext; + //用噪音路径和自定义路径构造路径模型 + PathModule pathModule = new PathModule(noisePahList, specialPath); + //如果有算法模型直接使用算法模型 + if(algorithmEnum != null){ + diffContext = algorithmEnum.getAlgorithmModule().diffElement(a, b, pathModule); + }//如果也没有比较器,直接用默认算法模型 + else if(objectComparator == null && arrayComparator == null && primitiveComparator == null && nullComparator == null && otherComparator == null){ + diffContext = AlgorithmEnum.DEFAULT.getAlgorithmModule().diffElement(a, b, pathModule); + }//如果有比较器,为空的比较器用默认替换,然后构造算法模型, + else { + constrcutDefaultComparator(); + diffContext = new AlgorithmModule(objectComparator, arrayComparator, primitiveComparator, nullComparator, otherComparator).diffElement(a, b, pathModule); + } + return ResultConvertUtil.constructResult(diffContext); + } + + /** + * @param strA 要比较的第一个字符串 + * @param strB 要比较的第二个字符串 + * @return 用来展示的diff结果 + */ + public List diff(String strA, String strB) { + return diffElement(new JsonParser().parse(strA), new JsonParser().parse(strB)); + } + + public Diff() { + } + + /** + * 没有初始的比较器替换成默认的 + */ + private void constrcutDefaultComparator() { + //如果没有初始化算法,则采用默认的算法。 + if(objectComparator == null){ + objectComparator = defaultObjectComparator(); + } + if(arrayComparator == null){ + arrayComparator = defaultArrayComparator(); + } + if(primitiveComparator == null){ + primitiveComparator = defaultPrimitiveComparator(); + } + if(nullComparator == null){ + nullComparator = defaultNullComparator(); + } + if(otherComparator == null){ + otherComparator = defaultOtherComparator(); + } + } + + private ObjectComparator defaultObjectComparator() { + return new SimpleObjectComparator(); + } + + private ArrayComparator defaultArrayComparator() { + return new SimilarArrayComparator(); + } + + private PrimitiveComparator defaultPrimitiveComparator() { + return new DefaultPrimitiveComparator(); + } + + private NullComparator defaultNullComparator() { + return new DefaultNullComparator(); + } + + private OtherComparator defaultOtherComparator() { + return new DefaultOtherComparator(); + } + + /** + * 选择算法模型 + * @param algorithmEnum 算法模型枚举类 + * @return 对象本身 + */ + public Diff withAlgorithmEnum(AlgorithmEnum algorithmEnum){ + this.algorithmEnum = algorithmEnum; + return this; + } + + /** + * 设置自定义路径 + * @param specialPath 自定义路径列表 + * @return 对象本身 + */ + public Diff withSpecialPath(List specialPath){ + this.specialPath = specialPath; + return this; + } + + /** + * 设置噪音路径 + * @param noisePahList 噪音路径列表 + * @return 对象本身 + */ + public Diff withNoisePahList(List noisePahList){ + this.noisePahList = noisePahList; + return this; + } + + /** + * 自定义对象比较器 + * @param objectComparator 对象比较器 + * @return 对象本身 + */ + public Diff withObjectComparator(ObjectComparator objectComparator) { + this.objectComparator = objectComparator; + return this; + } + + /** + * 自定义数组比较器 + * @param arrayComparator 数组比较器 + * @return 对象本身 + */ + public Diff withArrayComparator(ArrayComparator arrayComparator) { + this.arrayComparator = arrayComparator; + return this; + } + + + /** + * 自定义基本类型比较器 + * @param primitiveComparator 基本类型比较器 + * @return 对象本身 + */ + public Diff withPrimitiveAlgorithm(PrimitiveComparator primitiveComparator) { + this.primitiveComparator = primitiveComparator; + return this; + } + + /** + * 自定义空类型比较器 + * @param nullComparator 空类型比较器 + * @return 对象本身 + */ + public Diff withNullComparator(NullComparator nullComparator) { + this.nullComparator = nullComparator; + return this; + } + + /** + * 自定义其他类型比较器 + * @param otherComparator 其他类型比较器 + * @return 对象本身 + */ + public Diff withOtheComparator(OtherComparator otherComparator) { + this.otherComparator = otherComparator; + return this; + } +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/AbstractObjectAndArray.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/AbstractObjectAndArray.java new file mode 100644 index 00000000..64670d1c --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/AbstractObjectAndArray.java @@ -0,0 +1,49 @@ +package com.zc.business.utils.diff.algorithm; + +import com.google.gson.JsonElement; +import com.zc.business.utils.diff.model.Constants; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; +import com.zc.business.utils.diff.model.SingleNodeDifference; + +/** + * 数组和对象比较的公有方法抽象类 + * @Author JingWei + * @create 2022/3/1 + */ +public abstract class AbstractObjectAndArray { + protected AlgorithmModule algorithmModule; + + /** + * diff算法比较核心方法,比较2个JsonElement的入口。 + * @param a 比较的第一个JsonElement + * @param b 比较的第二个JsonElement + * @param pathModule 路径模型 + * @return 不同的比较结果 + */ + public DiffContext diffElement(JsonElement a, JsonElement b, PathModule pathModule) { + return algorithmModule.diffElement(a, b, pathModule); + } + + /** + * 构造算法模型,比如使用对象和数组类型算法比较时,内部会用到其他类型的算法。 + * @param algorithmModule 算法模型 + */ + public void constructAlgorithmModule(AlgorithmModule algorithmModule) { + this.algorithmModule = algorithmModule; + } + + /** + * 如果下层diff结果不同,会把下层diff结果加入到上层diff结果中去。 + * @param parentResult 上层结果 + * @param childResult 下层结果 + */ + public void parentContextAddChildContext(DiffContext parentResult, DiffContext childResult) { + if(childResult.isSame() == Constants.DIFFERENT) { + for (SingleNodeDifference singleNodeDifference : childResult.getDiffResultModels()) { + parentResult.getDiffResultModels().add(singleNodeDifference); + } + parentResult.setSame(false); + } + } +} \ No newline at end of file diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/AbstractPrimitiveAndOther.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/AbstractPrimitiveAndOther.java new file mode 100644 index 00000000..62a564be --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/AbstractPrimitiveAndOther.java @@ -0,0 +1,34 @@ +package com.zc.business.utils.diff.algorithm; + +import com.google.gson.JsonElement; + +/** + * 基本类型和其它类型比较的公有方法抽象类 + * @Author JingWei + * @create 2022/1/11 + */ +public abstract class AbstractPrimitiveAndOther { + /** + * 将比较的元素转换成String类型方便结果展示 + * @param element 元素 + * @return 元素转换成的字符串 + */ + protected static String jsonElement2Str(JsonElement element){ + //该对象不存在的情况 + if(element == null){ + return null; + } else if (element.isJsonObject()) { + return "{省略内部字段}"; + } else if (element.isJsonArray()) { + return "[省略内部元素]"; + } else if (element.isJsonPrimitive()) { + return element.getAsJsonPrimitive().getAsString(); + } else if (element.isJsonNull()) { + return "null"; + }else{ + throw new RuntimeException("异常"); + } + } + + +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/AlgorithmModule.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/AlgorithmModule.java new file mode 100644 index 00000000..440313fe --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/AlgorithmModule.java @@ -0,0 +1,66 @@ +package com.zc.business.utils.diff.algorithm; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonNull; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import com.zc.business.utils.diff.algorithm.array.ArrayComparator; +import com.zc.business.utils.diff.algorithm.nulls.NullComparator; +import com.zc.business.utils.diff.algorithm.object.ObjectComparator; +import com.zc.business.utils.diff.algorithm.other.OtherComparator; +import com.zc.business.utils.diff.algorithm.primitive.PrimitiveComparator; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; + +/** + * 算法模型 + * 算法模型包含5种比较器,对象、数组、基本类型、空类型、其他类型比较器。 + * 当2个JsonElement的子类同时为对象、数组、基本类型、空类型,使用前4种比较器。当2个JsonElement的子类类型不相同时,使用其它类型比较器。 + * @Author JingWei + * @create 2022/1/13 + */ +public class AlgorithmModule{ + protected ObjectComparator objectAlgorithm; + protected ArrayComparator arrayAlgorithm; + protected PrimitiveComparator primitiveComparator; + protected NullComparator nullComparator; + protected OtherComparator otherComparator; + + public AlgorithmModule(ObjectComparator objectAlgorithm, ArrayComparator arrayAlgorithm, + PrimitiveComparator primitiveComparator, NullComparator nullComparator, OtherComparator otherComparator) { + this.arrayAlgorithm = arrayAlgorithm; + this.objectAlgorithm = objectAlgorithm; + this.primitiveComparator = primitiveComparator; + this.nullComparator = nullComparator; + this.otherComparator = otherComparator; + objectAlgorithm.constructAlgorithmModule(this); + arrayAlgorithm.constructAlgorithmModule(this); + } + + /** + * 判断要比较的两个JsonElement的类型,并根据类型调用对应的算法进行比较 + * @param a 要比较的第一个元素 + * @param b 要比较的第二个元素 + * @param pathModule 路径模型 + * @return 返回比较结果 + */ + public DiffContext diffElement(JsonElement a, JsonElement b, PathModule pathModule) { + if (a instanceof JsonObject && b instanceof JsonObject) { + return objectAlgorithm.diff( (JsonObject) a, (JsonObject) b, pathModule); + } else if (a instanceof JsonArray && b instanceof JsonArray) { + return arrayAlgorithm.diffArray((JsonArray) a, (JsonArray) b, pathModule); + } else if (a instanceof JsonPrimitive && b instanceof JsonPrimitive) { + return primitiveComparator.diff((JsonPrimitive) a, (JsonPrimitive) b, pathModule); + } else if (a instanceof JsonNull && b instanceof JsonNull) { + return nullComparator.diff((JsonNull) a, (JsonNull) b, pathModule); + } else { + return otherComparator.diff(a, b, pathModule); + } + } + + public ArrayComparator getArrayAlgorithm() { + return arrayAlgorithm; + } + +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/Comparator.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/Comparator.java new file mode 100644 index 00000000..530ea2e4 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/Comparator.java @@ -0,0 +1,9 @@ +package com.zc.business.utils.diff.algorithm; + +/** + * 比较器最顶层的接口,逻辑意义 + * @Author JingWei + * @create 2022/3/2 + */ +public interface Comparator { +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/AbstractArray.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/AbstractArray.java new file mode 100644 index 00000000..2aa87a37 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/AbstractArray.java @@ -0,0 +1,22 @@ +package com.zc.business.utils.diff.algorithm.array; + +import com.zc.business.utils.diff.algorithm.AbstractObjectAndArray; + +/** + * 数组比较的公有方法抽象类 + * @Author JingWei + * @create 2022/3/1 + */ +public abstract class AbstractArray extends AbstractObjectAndArray implements ArrayComparator { + /** + * 数组索引号加一个中括号表示数组路径 + * @param i 数组元素的索引号 + * @return 索引号增加中括号 + */ + protected String constructArrayPath(Integer i){ + if(i == null || i < 0 ){ + throw new RuntimeException("数组索引号入参为空或者为负。 入参:" + i); + } + return "[" + i + "]"; + } +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/ArrayComparator.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/ArrayComparator.java new file mode 100644 index 00000000..160dccb2 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/ArrayComparator.java @@ -0,0 +1,43 @@ +package com.zc.business.utils.diff.algorithm.array; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.zc.business.utils.diff.algorithm.AlgorithmModule; +import com.zc.business.utils.diff.algorithm.Comparator; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; + + +/** + * 数组类型比较器接口,用于2个JsonElement均为数组时对2个元素进行比较。 + * @Author JingWei + * @create 2022/2/23 + */ +public interface ArrayComparator extends Comparator { + /** + * 对两个JsonArray进行比较的方法 + * @param a 要比较的第一个JsonArray + * @param b 要比较的第二个JsonArray + * @param pathModule 路径模型 + * @return 返回不相等的结果 + */ + DiffContext diffArray(JsonArray a, JsonArray b, PathModule pathModule) ; + + /** + * 对象内部包含其他非数组类型,对这些类型比较需要使用JsonElement比较方法 + * @param a 要比较的第一个JsonElement + * @param b 要比较的第一个JsonElement + * @param pathModule 路径模型 + * @return 返回不相等的结果 + */ + DiffContext diffElement(JsonElement a, JsonElement b, PathModule pathModule); + + /** + * 构造算法模型,数组中元素比较需要使用到其他非数组算法 + * @param algorithmModule 算法模型:包含对象、数组、基本类型、空类型、其他类型算法 + */ + void constructAlgorithmModule(AlgorithmModule algorithmModule); + + + +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/SimilarArrayComparator.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/SimilarArrayComparator.java new file mode 100644 index 00000000..1406790b --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/SimilarArrayComparator.java @@ -0,0 +1,252 @@ +package com.zc.business.utils.diff.algorithm.array; + +import com.google.gson.JsonArray; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; +import com.zc.business.utils.diff.model.SingleNodeDifference; + +import java.util.LinkedList; +import java.util.List; +import java.util.Objects; + +/** + * 相似度数组算法比较器:当数组进行比较找不到相等元素时,通过算法优先找最接近的元素进行匹配 + * + * 举例: + *"[{\"a\":7,\"b\":5,\"c\":6},{\"a\":6,\"b\":2,\"c\":3}]"和 + *"[{\"a\":1,\"b\":2,\"c\":3},{\"a\":4,\"b\":5,\"c\":6},{\"a\":7,\"b\":8,\"c\":9}]"比较 + * 数组一中第一个元素依次和数组二中元素比较,分别有3组不同,1组不同,2组不同 + * 数组一中第二个元素依次和数组二中元素比较,分别有1组不同,3组不同,3组不同 + * 一、得到相似矩阵如下 + * 3 1 2 + * 1 3 3 + * 二、遍历矩阵所有元素,找到值最小的元素,并且行和列的其他元素不能再被使用。行和列即为要比较的2个元素在各自数组中的索引号 + * 第一次找到1,第二次找到另外一个1. + * 三、遍历矩阵中未使用所有列,列索引号为多余的元素在数组中的位置。 + * 只有第三列可以使用 ,第二组中第3个元素为新增元素。 + * + * @Author JingWei + * @create 2022/2/24 + */ +public class SimilarArrayComparator extends AbstractArray { + /** + * USEABLE表示当前位置可以使用 + */ + private final boolean USEABLE = false; + + /** + * USED表示当前位置已经被使用过 + */ + private final boolean USED = true; + + + /** + * @param a 要比较的第一个数组 + * @param b 要比较的第二个数组 + * @param pathModule 路径模型 + * @return 返回不相等的结果 + */ + @Override + public DiffContext diffArray(JsonArray a, JsonArray b, PathModule pathModule) { + DiffContext diffContext; + //a数组长度小于等于b,直接使用diff数组比较算法 + if(a.size() <= b.size()){ + diffContext = diff(a, b, pathModule); + } + //当a数组长度大于b时,需要交换pathModule中a和b路径, 并交换数组a和b,再使用diff数组比较算法 + else { + exchangeLeftAndRightPath(pathModule); + diffContext = diff(b, a, pathModule); + exchangeLeftAndRightPath(pathModule); + exchangeResult(diffContext); + } + return diffContext; + } + + /** + * 交换返回结果中每一个路径和结果 + * @param diffContext 返回结果 + */ + private void exchangeResult(DiffContext diffContext) { + List singleNodeDifferences = diffContext.getDiffResultModels(); + for(SingleNodeDifference singleNodeDifference : singleNodeDifferences){ + exchangePathAndResult(singleNodeDifference); + } + } + + /** + * 交换返回结果中的路径和结果 + * @param singleNodeDifference 返回结果 + */ + private void exchangePathAndResult(SingleNodeDifference singleNodeDifference) { + String tempStringA = singleNodeDifference.getLeftPath(); + Object tempLeft = singleNodeDifference.getLeft(); + singleNodeDifference.setLeftPath(singleNodeDifference.getRightPath()); + singleNodeDifference.setRightPath(tempStringA); + singleNodeDifference.setLeft(singleNodeDifference.getRight()); + singleNodeDifference.setRight(tempLeft); + } + + + /** + * 将路径模型中a和b的路径交换 + * @param pathModule 路径模型 + */ + private void exchangeLeftAndRightPath(PathModule pathModule) { + LinkedList tempA = pathModule.getLeftPath(); + pathModule.setLeftPath(pathModule.getRightPath()); + pathModule.setRightPath(tempA); + } + + + /** + * 数组比较核心算法,支持数组a长度小于b长度时使用 + */ + DiffContext diff(JsonArray a, JsonArray b, PathModule pathModule ) { + int rowlength = a.size(); + int linelength = b.size(); + //a数组中m个元素,与b数组中n个元素比较,共比较m*n次,所有比较结果会得组成一个矩阵,矩阵中的数字用来存储比较结果。 + int [][] similarMatrix = new int[rowlength][linelength]; + //创建一个行和列数组 用来判断当前行和列是否被使用过 + boolean []row = new boolean[rowlength]; + boolean []line = new boolean[linelength]; + for (int i = 0; i < rowlength; i++) { + pathModule.addLeftPath(constructArrayPath(i)); + //a数组中m个元素,与b数组中n个元素比较,比较结果生成一个m*n的矩阵 + constructSimilarMatrix(a, b, i, pathModule, similarMatrix, row, line); + pathModule.removeLastLeftPath(); + } + return obtainDiffResult(a, b, pathModule, row, line, similarMatrix); + } + + + /** + * 通过相似度矩阵,获取比较结果。 第一步在矩阵找到最小的数字,即找到最接近的几对结果。 第二步找剩余未使用的列数,即多余的元素 + */ + private DiffContext obtainDiffResult(JsonArray a, JsonArray b, PathModule pathModule, boolean[] row, boolean[] line, int[][] similarMatrix) { + DiffContext arrayDiffContext = new DiffContext(); + //找到a和b都有的结果,并且是最接近的几对结果 + obtainModifyDiffResult(a,b,pathModule,row,line,similarMatrix, arrayDiffContext); + //a没有b有的结果,即新增的结果 + obtainAddDiffResult(b,pathModule,line, arrayDiffContext); + + return arrayDiffContext; + } + + + /** + * 得到新增的结果。由于b数组长度大于a,会有几个元素多余。在选出a和b最接近的几对元素后,剩下的几个元素被认为是新增的。 + */ + private void obtainAddDiffResult(JsonArray b, PathModule pathModule, boolean[] line, DiffContext arrayDiffContext) { + for (int j = 0; j < line.length; j++) { + if (line[j] == USED) { + continue; + } + DiffContext addOrDeleteDiffContext = constructAddContext(b, j, pathModule); + parentContextAddChildContext(arrayDiffContext, addOrDeleteDiffContext); + } + } + + /** + * 从m*n的矩阵中选出最接近的几组结果,矩阵中的数字越小,说明2个元素比较时结果相差越少 + */ + private void obtainModifyDiffResult(JsonArray a, JsonArray b, PathModule pathModule, boolean[] row, boolean[] line, int[][] similarMatrix, DiffContext arrayDiffContext) { + int counts = 0; + //找到还未使用行的数量(行数小于列数) + for (boolean value : row) { + if (Objects.equals(USEABLE, value)) { + counts++; + } + } + //不同结果对数等于未使用的行数 + for (int n = 0; n < counts; n++) { + int bestLineIndex = 0; + int bestRowIndex = 0; + int minDiffPair = Integer.MAX_VALUE; + //遍历矩阵中所有元素,找最小的数字,矩阵中的数字越小,说明2个元素比较时结果相差越少 + for (int i = 0; i < row.length; i++) { + for (int j = 0; j < line.length; j++) { + //如果行或列被使用,跳过该行 + if (row[i] == USED || line[j] == USED) { + continue; + } + //如果当前元素数字更小,那么把当前行和列保存下来,数字更新为当前最优结果 + if (similarMatrix[i][j] < minDiffPair) { + bestRowIndex = i; + bestLineIndex = j; + minDiffPair = similarMatrix[i][j]; + } + } + } + //将找到的最优结果添加到返回结果中 + DiffContext modifyDiffContext = constructModifyContext(a, b, bestRowIndex, bestLineIndex, pathModule); + row[bestRowIndex] = USED; + line[bestLineIndex] = USED; + parentContextAddChildContext(arrayDiffContext, modifyDiffContext); + } + } + + /** + * 此时a数组没有该元素,b数组有元素,结果为新增 + * @param b 数组 + * @param index 索引号 + * @param pathModule 路径模型 + * @return 生成的不同结果 + */ + private DiffContext constructAddContext(JsonArray b, int index, PathModule pathModule) { + pathModule.addAllpath(constructArrayPath(index)); + DiffContext diffContext = diffElement(null, b.get(index), pathModule); + pathModule.removeAllLastPath(); + return diffContext; + } + + /** + * 返回两个数组对应索引号元素比较结果 + * @param a 数组a + * @param b 数组b + * @param i 数组a中元素的索引号 + * @param bestLineIndex 数组b中元素的索引号,即找到的和a中元素接接近的元素索引号。 + * @param pathModule 路径模型 + * @return 返回不同的结果 + */ + private DiffContext constructModifyContext(JsonArray a, JsonArray b, int i, int bestLineIndex, PathModule pathModule) { + pathModule.addLeftPath(constructArrayPath(i)); + pathModule.addRightPath(constructArrayPath(bestLineIndex)); + DiffContext diffContext = diffElement(a.get(i), b.get(bestLineIndex), pathModule); + pathModule.removeAllLastPath(); + return diffContext; + } + + /** + * 用数组a的一个元素与数组b中所有元素分别比较,会得到n次比较结果,结果为不相等的结果对数,在矩阵中更新n次结果。 + */ + private void constructSimilarMatrix(JsonArray arrayA, JsonArray arrayB, int rowIndex, PathModule pathModule, int [][]similarArray, boolean[] row, boolean[] line) { + if(rowIndex < 0 || rowIndex >= arrayB.size()){ + throw new RuntimeException("索引号入参超出数组长度。 索引号:" + rowIndex +" 数组B:" + arrayB); + } + + for (int j = 0; j < arrayB.size(); j++) { + if (line[j] == USEABLE) { + pathModule.addRightPath(constructArrayPath(j)); + DiffContext diffContext = diffElement(arrayA.get(rowIndex), arrayB.get(j), pathModule); + pathModule.removeLastRightPath(); + if (diffContext.isSame()) { + row[rowIndex] = USED; + line[j] = USED; + return; + } else if(existSpecialPath(diffContext.getSpecialPathResult())){ + similarArray[rowIndex][j] = 0 ; + } else { + similarArray[rowIndex][j] = diffContext.getDiffResultModels().size(); + } + } + } + } + + /** + * 判断比较结果是否有特殊路径 + */ + private boolean existSpecialPath(LinkedList specialPathResult) { + return specialPathResult != null && !specialPathResult.isEmpty(); + } +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/SimpleArrayComparator.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/SimpleArrayComparator.java new file mode 100644 index 00000000..36a3d791 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/array/SimpleArrayComparator.java @@ -0,0 +1,62 @@ +package com.zc.business.utils.diff.algorithm.array; + +import com.google.gson.JsonArray; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; + +/** + * 简单数组比较器:数组对比时按照索引号顺序依次进行比较 + * 例:[A,B,C] 与 [C,B,A]比较时,依次找索引号为0、为1、为2进行比较,相同结果对为 ,不同结果 会加入到返回结果中。 + * @Author JingWei + * @create 2022/1/14 + */ +public class SimpleArrayComparator extends AbstractArray { + /** + * 对两个JsonArray进行比较的方法。 + * @param a 要比较的第一个数组 + * @param b 要比较的第二个数组 + * @param pathModule 路径模型 + * @return 返回不相等的比较结果 + */ + @Override + public DiffContext diffArray(JsonArray a, JsonArray b, PathModule pathModule) { + DiffContext arrayDiffContext = new DiffContext(); + int maxLength = Math.max(a.size(), b.size()); + //根据数组a和b长度的大的值进行遍历 + for (int i = 0; i < maxLength; i++) { + pathModule.addAllpath(constructArrayPath(i)); + DiffContext diffContext = generateDiffResult(a,b,i,pathModule); + parentContextAddChildContext(arrayDiffContext, diffContext); + } + return arrayDiffContext; + } + + /** + * 生成比较结果,分以下3种情况考虑 + * i < a.size() && i < b.size() + * a.size() <= i + * b.size() <= i + * @param a 数组a + * @param b 数组b + * @param i 数组a和b中正在比较的元素索引号 + * @param pathModule 路径模型 + * @return 返回不相等的比较结果 + */ + private DiffContext generateDiffResult(JsonArray a, JsonArray b, int i, PathModule pathModule) { + if(i >= a.size() && i >= b.size()){ + throw new RuntimeException("数组索引号入参超过数组长度。 索引号:" + i + " 数组a:" + a + "数组b:" + b); + } + DiffContext diffContext; + if(i < a.size() && i < b.size()){ + diffContext = diffElement(a.get(i), b.get(i), pathModule); + }else if (i >= a.size()){ + diffContext = diffElement(null, b.get(i), pathModule); + }else{ + diffContext = diffElement(a.get(i), null, pathModule); + } + return diffContext; + } + + +} + diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/nulls/DefaultNullComparator.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/nulls/DefaultNullComparator.java new file mode 100644 index 00000000..06bab025 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/nulls/DefaultNullComparator.java @@ -0,0 +1,27 @@ +package com.zc.business.utils.diff.algorithm.nulls; + +import com.google.gson.JsonNull; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; + +/** + * 当要比较的两个JsonElement都为空类型时,默认实现的算法比较器 + * @Author JingWei + * @create 2022/1/10 + */ +public class DefaultNullComparator implements NullComparator { + + /** + * 当要比较的两个JsonElement是空类型时,默认比较方法 + * @param a 第一个空类型 + * @param b 第二个空类型 + * @param pathModule 路径模型 + * @return 返回结果 + */ + @Override + public DiffContext diff(JsonNull a, JsonNull b, PathModule pathModule){ + return new DiffContext(); + } + + +} \ No newline at end of file diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/nulls/NullComparator.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/nulls/NullComparator.java new file mode 100644 index 00000000..4d90e34d --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/nulls/NullComparator.java @@ -0,0 +1,25 @@ +package com.zc.business.utils.diff.algorithm.nulls; + +import com.google.gson.JsonNull; +import com.zc.business.utils.diff.algorithm.Comparator; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; + +/** + * 空类型比较器接口,用于2个JsonElement均为JsonNull时对2个元素进行比较。 + * @Author JingWei + * @create 2022/2/23 + */ +public interface NullComparator extends Comparator { + + /** + * 对两个JsonNull进行比较时,需要实现此方法。 + * @param a 要比较的第一个JsonNull + * @param b 要比较的第二个JsonNull + * @param pathModule 路径模型 + * @return 返回不同的比较结果 + */ + DiffContext diff(JsonNull a, JsonNull b, PathModule pathModule); + + +} \ No newline at end of file diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/AbstractObject.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/AbstractObject.java new file mode 100644 index 00000000..b8305829 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/AbstractObject.java @@ -0,0 +1,128 @@ +package com.zc.business.utils.diff.algorithm.object; + +import com.google.common.base.Joiner; +import com.google.gson.JsonObject; +import com.zc.business.utils.diff.algorithm.AbstractObjectAndArray; +import com.zc.business.utils.diff.model.Constants; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; + +import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 对象比较的一些公有方法抽象类 + * @Author JingWei + * @create 2022/2/24 + */ +public abstract class AbstractObject extends AbstractObjectAndArray implements ObjectComparator { + + /** + * 对两个对象进行比较:遍历keySet中的所有key, 在a和b对象中找对应的value值进行比较 + * @param a 要比较的第一个对象 + * @param b 要比较的第二个对象 + * @param keySet key的集合 + * @param pathModule 路径模型 + * @return 不同的比较结果 + */ + protected DiffContext diffValueByKey(JsonObject a, JsonObject b, Set keySet, PathModule pathModule) { + DiffContext objectDiffContext = new DiffContext(); + LinkedList specialPathResult = new LinkedList<>(); + for (String key : keySet) { + //更新a和b当前路径 + pathModule.addAllpath(key); + //如果对象当前路径在噪音路径集合中,直接跳过比较 + if (!needDiff(pathModule.getNoisePahList(), pathModule.getLeftPath())) { + pathModule.removeAllLastPath(); + continue; + } + //生成比较结果 + DiffContext diffContext = diffElement(a.get(key), b.get(key), pathModule); + parentContextAddChildContext(objectDiffContext, diffContext); + //特殊路径处理 + specialPathHandle(diffContext.isSame(), specialPathResult, pathModule); + pathModule.removeAllLastPath(); + + } + objectDiffContext.setSpecialPathResult(specialPathResult); + return objectDiffContext; + } + + /** + * 如果比较的路径为特殊路径并且比较相等,特殊路径会被标识,添加到返回结果中。 + * @param isSame 比较结果是否相等 + * @param specialPathResult 返回的特殊路径结果 + * @param pathModule 路径模型 + */ + private void specialPathHandle(boolean isSame,LinkedList specialPathResult, PathModule pathModule) { + //如果比较结果不等,直接返回。 + if (!isSame){ + return; + } + //如果存在特殊路径,将特殊路径加入到集合中 + String specialPath = getSpecialPath(pathModule); + if( existPath(specialPath)){ + specialPathResult.add(specialPath); + } + } + + /** + * 校验路径是否存在,即路径是否为空 + * @param specialPath 特殊路径 + * @return 特殊路径是否为空 + */ + private boolean existPath(String specialPath) { + return specialPath != null; + } + + /** + * 判断当前路径是否在特殊路径集合中,如果在,则返回特殊路径。 + * @param pathModule 路径模型 + * @return 返回的特殊路径字符串 + */ + protected String getSpecialPath(PathModule pathModule) { + if(pathModule == null || pathModule.getSpecialPath() == null || pathModule.getSpecialPath().isEmpty()){ + return null; + } + String currentPath = listJoin(pathModule.getLeftPath()); + if(pathModule.getSpecialPath().contains(currentPath)){ + return currentPath; + } + return null; + } + + /** + * 判断当前字段是否需要diff,如果在噪音字段集合中,则不需要diff,返回false。 + * @param noisePahList 噪音路径列表 + * @param pathList 当前路径 + * @return 当前路径是否在噪音路径中 + */ + protected boolean needDiff(List noisePahList, LinkedList pathList) { + if(noisePahList == null || pathList == null || noisePahList.isEmpty() || pathList.isEmpty()){ + return true; + } + String path = listJoin(pathList); + if(noisePahList.contains(path)){ + return false; + } + return true; + } + + /** + * 将path路径列表改为字符串 + * @param path 当前路径 + * @return 当前路径字符串 + */ + protected String listJoin(LinkedList path) { + if(path == null){ + throw new RuntimeException("当前路径不能为空"); + } + List collect = path.stream().filter(e -> e.charAt(0) != '[').collect(Collectors.toList()); + return Joiner.on(Constants.MERGE_PATH).join(collect); + } + + + +} \ No newline at end of file diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/LeftJoinObjectComparator.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/LeftJoinObjectComparator.java new file mode 100644 index 00000000..e87b3e07 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/LeftJoinObjectComparator.java @@ -0,0 +1,30 @@ +package com.zc.business.utils.diff.algorithm.object; + +import com.google.gson.JsonObject; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; + +/** + * 左匹配对象比较器:当对两个JsonObject进行比较时,只对第一个对象中keySet中存在keyValue值进行比较。 + * + * 举例: + * {"a":1,"b":2,"c":3}和{"a":1,"b":4,"c":3,"d":4}进行比较 + * 只会比较第一个对象中有的字段,即比较第一个对象中有的"a","b","c"3个字段,第二个对象中的"d"字段没有被比较 + * + * @Author JingWei + * @create 2022/2/18 + */ +public class LeftJoinObjectComparator extends AbstractObject { + /** + * @param a 要比较的第一个JsonObject + * @param b 要比较的第二个JsonObject + * @param pathModule 路径模型 + * @return 不同的比较结果 + */ + @Override + public DiffContext diff(JsonObject a, JsonObject b, PathModule pathModule){ + //用a的keySet作为遍历集合。 + return diffValueByKey(a, b, a.keySet(), pathModule); + } + +} \ No newline at end of file diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/ObjectComparator.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/ObjectComparator.java new file mode 100644 index 00000000..86571d1e --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/ObjectComparator.java @@ -0,0 +1,40 @@ +package com.zc.business.utils.diff.algorithm.object; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.zc.business.utils.diff.algorithm.AlgorithmModule; +import com.zc.business.utils.diff.algorithm.Comparator; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; + +/** + * 对象类型比较器接口,用于2个JsonElement均为JsonObject时对2个元素进行比较。 + * @Author JingWei + * @create 2022/2/23 + */ +public interface ObjectComparator extends Comparator { + + /** + * 对两个JsonObject进行比较时,需要实现此方法。 + * @param a 要比较的第一个JsonObject + * @param b 要比较的第二个JsonObject + * @param pathModule 路径模型 + * @return 返回不同的比较结果 + */ + DiffContext diff(JsonObject a, JsonObject b, PathModule pathModule); + + /** + * 对象内部包含其他非JsonObject类型,对这些类型比较需要使用JsonElement比较方法 + * @param a 元素a + * @param b 元素b + * @param pathModule 路径模型 + * @return 返回不同的比较结果 + */ + DiffContext diffElement(JsonElement a, JsonElement b, PathModule pathModule); + + /** + * 构造算法模型,对象比较时,内部元素比较需要使用到其他非数组算法 + * @param algorithmModule 算法模型:包含对象、数组、基本类型、空类型、其他类型算法 + */ + void constructAlgorithmModule(AlgorithmModule algorithmModule); +} \ No newline at end of file diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/SimpleObjectComparator.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/SimpleObjectComparator.java new file mode 100644 index 00000000..c61551f3 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/object/SimpleObjectComparator.java @@ -0,0 +1,33 @@ +package com.zc.business.utils.diff.algorithm.object; + +import com.google.common.collect.Sets; +import com.google.gson.JsonObject; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; + +import java.util.Set; + +/** + * 简单对象比较器:当对两个JsonObject进行比较时,两个对象所有keySet中key对应的Value都会被比较。 + * 举例: + * {"b":2,"c":3}和{"a":1,"d":4}进行比较 + * 会比较两个对象中所有的字段,即比较两个对象中并集"a","b","c","d"4个字段 + * @Author JingWei + * @create 2022/2/16 + */ +public class SimpleObjectComparator extends AbstractObject { + /** + * @param a 要比较的第一个JsonObject + * @param b 要比较的第二个JsonObject + * @param pathModule 路径模型 + * @return 不同的比较结果 + */ + @Override + public DiffContext diff(JsonObject a, JsonObject b, PathModule pathModule) { + Set unionSet = Sets.union(a.keySet(), b.keySet()); + //用a和b的keySet的并集作为遍历集合。 + return diffValueByKey(a, b, unionSet, pathModule); + } + + +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/other/DefaultOtherComparator.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/other/DefaultOtherComparator.java new file mode 100644 index 00000000..dc43f4d3 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/other/DefaultOtherComparator.java @@ -0,0 +1,38 @@ +package com.zc.business.utils.diff.algorithm.other; + +import com.google.common.base.Joiner; +import com.google.gson.JsonElement; +import com.zc.business.utils.diff.algorithm.AbstractPrimitiveAndOther; +import com.zc.business.utils.diff.model.Constants; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; +import com.zc.business.utils.diff.model.SingleNodeDifference; + +import java.util.ArrayList; +import java.util.List; + +/** + * 当要比较的两个JsonElement的不同时为对象、组数、空、基本类型时,默认实现的比较器。 + * @Author JingWei + * @create 2022/1/10 + */ +public class DefaultOtherComparator extends AbstractPrimitiveAndOther implements OtherComparator { + + /** + * @param a 要比较的第一个JsonElement + * @param b 要比较的第二个JsonElement + * @param pathModule 路径模型 + * @return 不同的比较结果 + */ + @Override + public DiffContext diff(JsonElement a, JsonElement b, PathModule pathModule){ + //比较结果一定会不同,因为要比较的a和b类型不同才会调用该方法。 + DiffContext otherDiffContext = new DiffContext(Constants.DIFFERENT); + List singleNodeDifferences = new ArrayList<>(); + singleNodeDifferences.add(new SingleNodeDifference(Joiner.on(Constants.MERGE_PATH).join(pathModule.getLeftPath()), Joiner.on(Constants.MERGE_PATH).join(pathModule.getRightPath()), jsonElement2Str(a), jsonElement2Str(b))); + otherDiffContext.setDiffResultModels(singleNodeDifferences); + return otherDiffContext; + } + + +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/other/OtherComparator.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/other/OtherComparator.java new file mode 100644 index 00000000..ffe7e628 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/other/OtherComparator.java @@ -0,0 +1,24 @@ +package com.zc.business.utils.diff.algorithm.other; + +import com.google.gson.JsonElement; +import com.zc.business.utils.diff.algorithm.Comparator; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; + +/** + * 其他类型比较器接口,用于2个JsonElement不同时为对象、数组、空、基本类型时对2个元素进行比较。 + * + * 举例:第一个要比较类型为对象类型,第二个要比较类型为数组类型。 + * @Author JingWei + * @create 2022/2/23 + */ +public interface OtherComparator extends Comparator { + /** + * 对两个JsonElement进行比较并且两个JsonElement的类型不相等时,需要实现此方法。 + * @param a 要比较的第一个JsonElement + * @param b 要比较的第二个JsonElement + * @return 不同的比较结果 + */ + DiffContext diff(JsonElement a, JsonElement b, PathModule pathModule); + +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/primitive/DefaultPrimitiveComparator.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/primitive/DefaultPrimitiveComparator.java new file mode 100644 index 00000000..b6c2e8ee --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/primitive/DefaultPrimitiveComparator.java @@ -0,0 +1,39 @@ +package com.zc.business.utils.diff.algorithm.primitive; + +import com.google.common.base.Joiner; +import com.google.gson.JsonPrimitive; +import com.zc.business.utils.diff.algorithm.AbstractPrimitiveAndOther; +import com.zc.business.utils.diff.model.Constants; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; +import com.zc.business.utils.diff.model.SingleNodeDifference; + +import java.util.ArrayList; +import java.util.List; + +/** + * 当要比较的两个JsonElement是基本类型时,默认实现的比较器。 + * @Author JingWei + * @create 2022/1/10 + */ +public class DefaultPrimitiveComparator extends AbstractPrimitiveAndOther implements PrimitiveComparator { + /** + * @param a 要比较的第一个JsonPrimitive + * @param b 要比较的第二个JsonPrimitive + * @param pathModule 路径模型 + * @return 不同的比较结果 + */ + @Override + public DiffContext diff(JsonPrimitive a, JsonPrimitive b, PathModule pathModule){ + DiffContext primitiveDiffContext = new DiffContext(); + //如果a和b不相等,返回a和b的比较结果。 + if(Constants.DIFFERENT == a.equals(b)) { + List singleNodeDifferences = new ArrayList<>(); + singleNodeDifferences.add(new SingleNodeDifference(Joiner.on(Constants.MERGE_PATH).join(pathModule.getLeftPath()), Joiner.on(Constants.MERGE_PATH).join(pathModule.getRightPath()), jsonElement2Str(a), jsonElement2Str(b))); + primitiveDiffContext.setDiffResultModels(singleNodeDifferences); + primitiveDiffContext.setSame(Constants.DIFFERENT); + } + return primitiveDiffContext; + } + +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/primitive/PrimitiveComparator.java b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/primitive/PrimitiveComparator.java new file mode 100644 index 00000000..cfcdc0be --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/algorithm/primitive/PrimitiveComparator.java @@ -0,0 +1,23 @@ +package com.zc.business.utils.diff.algorithm.primitive; + +import com.google.gson.JsonPrimitive; +import com.zc.business.utils.diff.algorithm.Comparator; +import com.zc.business.utils.diff.model.DiffContext; +import com.zc.business.utils.diff.model.PathModule; + +/** + * 基本类型比较器接口,用于2个JsonElement均为基本类型的时对2个元素进行比较。 + * @Author JingWei + * @create 2022/2/23 + */ +public interface PrimitiveComparator extends Comparator { + /** + * 对两个基本类型进行比较时,需要实现此方法。 + * @param a 要比较的第一个JsonPrimitive + * @param b 要比较的第二个JsonPrimitive + * @param pathModule 路径模型 + * @return 不同的比较结果 + */ + DiffContext diff(JsonPrimitive a, JsonPrimitive b, PathModule pathModule); + +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/model/Constants.java b/zc-business/src/main/java/com/zc/business/utils/diff/model/Constants.java new file mode 100644 index 00000000..c5380e3b --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/model/Constants.java @@ -0,0 +1,20 @@ +package com.zc.business.utils.diff.model; + + +/** + * 常量 + * @Author JingWei + * @create 2022/3/2 + */ +public class Constants { + /** + * 描述比较结果不同 + */ + public static final boolean DIFFERENT = false; + /** + * 描述比较结果相同 + */ + public static final boolean SAME = true; + public static final String SPLIT_PATH = "\\."; + public static final String MERGE_PATH = "."; +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/model/DiffContext.java b/zc-business/src/main/java/com/zc/business/utils/diff/model/DiffContext.java new file mode 100644 index 00000000..9a0977ed --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/model/DiffContext.java @@ -0,0 +1,61 @@ +package com.zc.business.utils.diff.model; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +/** + * diff比较上下文 + * @Author JingWei + * @create 2022/3/2 + */ +public class DiffContext { + /** + * 比较结果是否相同 + */ + private boolean isSame; + + /** + * 比较结果不同时,存储所有不同的结果对 + */ + private List singleNodeDifferences; + + /** + * 比较结果中,出现了特殊路径下值相等的情况,会存储该特殊路径。 + */ + private LinkedList specialPathResult; + + public DiffContext(boolean isSame) { + this.isSame = isSame; + this.singleNodeDifferences = new ArrayList<>(); + } + + public boolean isSame() { + return isSame; + } + + public void setSame(boolean same) { + isSame = same; + } + + public List getDiffResultModels() { + return singleNodeDifferences; + } + + public void setDiffResultModels(List singleNodeDifferences) { + this.singleNodeDifferences = singleNodeDifferences; + } + + public DiffContext() { + this.isSame = true; + this.singleNodeDifferences = new ArrayList<>(); + } + + public LinkedList getSpecialPathResult() { + return specialPathResult; + } + + public void setSpecialPathResult(LinkedList specialPathResult) { + this.specialPathResult = specialPathResult; + } +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/model/PathModule.java b/zc-business/src/main/java/com/zc/business/utils/diff/model/PathModule.java new file mode 100644 index 00000000..1a95e509 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/model/PathModule.java @@ -0,0 +1,122 @@ +package com.zc.business.utils.diff.model; + +import java.util.LinkedList; +import java.util.List; + +/** + * 路径模型 + * A和B比较时,实时更新当前正在进行比较的元素路径。 + * + * @Author JingWei + * @create 2022/2/15 + */ +public class PathModule { + /** + * 对象A当前遍历到的路径 + */ + private LinkedList leftPath; + /** + * 对象B当前遍历到的路径 + */ + private LinkedList rightPath; + /** + * 特殊路径集合。当前路径符合特殊路径且特殊路径下比较结果相同,会在返回结果中做额外标识标识。 + */ + private List specialPath; + /** + * 噪音字段集合。如果当前路径符合噪音字段路径,则不会比较。 + */ + private List noisePahList; + + public PathModule() { + this.leftPath = new LinkedList<>(); + this.rightPath = new LinkedList<>(); + } + + public PathModule(List noisePahList) { + this.leftPath = new LinkedList<>(); + this.rightPath = new LinkedList<>(); + this.noisePahList = noisePahList; + } + + public PathModule(List noisePahList, List specialPath) { + this.leftPath = new LinkedList<>(); + this.rightPath = new LinkedList<>(); + this.noisePahList = noisePahList; + this.specialPath = specialPath; + } + + public List getNoisePahList() { + return noisePahList; + } + + public void setNoisePahList(List noisePahList) { + this.noisePahList = noisePahList; + } + + public List getSpecialPath() { + return specialPath; + } + + public void setSpecialPath(LinkedList specialPath) { + this.specialPath = specialPath; + } + + public LinkedList getLeftPath() { + return leftPath; + } + + public void setLeftPath(LinkedList leftPath) { + this.leftPath = leftPath; + } + + public LinkedList getRightPath() { + return rightPath; + } + + public void setRightPath(LinkedList rightPath) { + this.rightPath = rightPath; + } + + /** + * 同时在A和B路径列表最后加上一个Path路径 + */ + public void addAllpath(String lastPath) { + leftPath.add(lastPath); + rightPath.add(lastPath); + } + + public void addLeftPath(String lastPath) { + leftPath.add(lastPath); + } + + public void addRightPath(String lastPath) { + rightPath.add(lastPath); + } + + + /** + * 同时移除A和B路径列表中最后的一个路径 + */ + public void removeAllLastPath() { + leftPath.removeLast(); + rightPath.removeLast(); + } + + /** + * 移除A路径列表中最后的一个路径 + */ + public void removeLastLeftPath() { + leftPath.removeLast(); + } + + /** + * 移除B路径列表中最后的一个路径 + */ + public void removeLastRightPath() { + rightPath.removeLast(); + } + + +} + diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/model/Result.java b/zc-business/src/main/java/com/zc/business/utils/diff/model/Result.java new file mode 100644 index 00000000..0e55470a --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/model/Result.java @@ -0,0 +1,71 @@ +package com.zc.business.utils.diff.model; + +import java.io.Serializable; + +/** + * diff比较最终结果 + * @Author JingWei + * @create 2022/3/2 + */ +public class Result implements Serializable { + /** + * 第一个对象路径 + */ + private String leftPath; + /** + * 第二个对象路径 + */ + private String rightPath; + /** + * 第一个对象值 + */ + private Object left; + /** + * 第二个对象值 + */ + private Object right; + /** + * 比较结果 + */ + private String diffType; + + public String getLeftPath() { + return leftPath; + } + + public String getRightPath() { + return rightPath; + } + + public void setLeftPath(String leftPath) { + this.leftPath = leftPath; + } + + public void setRightPath(String rightPath) { + this.rightPath = rightPath; + } + + public Object getLeft() { + return left; + } + + public void setLeft(Object left) { + this.left = left; + } + + public Object getRight() { + return right; + } + + public void setRight(Object right) { + this.right = right; + } + + public String getDiffType() { + return diffType; + } + + public void setDiffType(String diffType) { + this.diffType = diffType; + } +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/model/ResultConvertUtil.java b/zc-business/src/main/java/com/zc/business/utils/diff/model/ResultConvertUtil.java new file mode 100644 index 00000000..ecc86d5b --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/model/ResultConvertUtil.java @@ -0,0 +1,66 @@ +package com.zc.business.utils.diff.model; + +import java.util.ArrayList; +import java.util.Objects; + +/** + * 结果转换工具:将diff上下文转换成diff最终结果 + * @Author JingWei + * @create 2022/2/25 + */ +public class ResultConvertUtil { + public static final String OBJECT_NULL = null; + //diff结果类型分为修改、新增、删除 + public static final String TYPE_MODIFY = "MODIFY"; + public static final String TYPE_ADD = "ADD"; + public static final String TYPE_DELETE = "DELETE"; + + /** + * 将diff上下文转换成diff最终结果 + * @param diffContext diff比较的直接结果 + * @return diff展示的结果 + */ + public static ArrayList constructResult(DiffContext diffContext) { + ArrayList list = new ArrayList<>(); + for (SingleNodeDifference resultModel : diffContext.getDiffResultModels()) { + Result printModel = convert(resultModel); + boolean leftAndRightBothNull = (Objects.equals(OBJECT_NULL,resultModel.getLeft())) + && Objects.equals(OBJECT_NULL,resultModel.getRight()) ; + //判断两个对象是否同时为空 + if (leftAndRightBothNull) { + printModel.setDiffType(TYPE_MODIFY); + } + //这种情况为对象A中keySet没这个key,或者A数组长度小于B 数组中没这个元素。 + else if (Objects.equals(OBJECT_NULL,resultModel.getLeft()) ) { + printModel.setDiffType(TYPE_ADD); + printModel.setLeftPath(null); + } + //这种情况为对象B中keySet没这个key,或者B数组长度小于A 数组中没这个元素。 + else if (Objects.equals(OBJECT_NULL,resultModel.getRight()) ) { + printModel.setDiffType(TYPE_DELETE); + printModel.setRightPath(null); + } + //其他情况 + else { + printModel.setDiffType(TYPE_MODIFY); + } + list.add(printModel); + } + return list; + } + + + /** + * 数据模型转换,增加类型字段。 + * @param resultModel 比较结果 + * @return 展示模型 + */ + private static Result convert(SingleNodeDifference resultModel) { + Result printModel = new Result(); + printModel.setLeft(resultModel.getLeft()); + printModel.setRight(resultModel.getRight()); + printModel.setLeftPath(resultModel.getLeftPath()); + printModel.setRightPath(resultModel.getRightPath()); + return printModel; + } +} diff --git a/zc-business/src/main/java/com/zc/business/utils/diff/model/SingleNodeDifference.java b/zc-business/src/main/java/com/zc/business/utils/diff/model/SingleNodeDifference.java new file mode 100644 index 00000000..da9e9b40 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/diff/model/SingleNodeDifference.java @@ -0,0 +1,69 @@ +package com.zc.business.utils.diff.model; + +import java.io.Serializable; + +/** + * 单对元素比较结果 + * @Author JingWei + * @create 2022/3/2 + */ +public class SingleNodeDifference implements Serializable { + /** + * 第一个对象路径 + */ + private String leftPath; + /** + * 第二个对象路径 + */ + private String rightPath; + /** + * 第一个对象值 + */ + private Object left; + /** + * 第二个对象值 + */ + private Object right; + /** + * 比较结果 + */ + + public SingleNodeDifference(String leftPath, String rightPath, Object left, Object right) { + this.leftPath = leftPath; + this.rightPath = rightPath; + this.left = left; + this.right = right; + } + + public String getLeftPath() { + return leftPath; + } + + public void setLeftPath(String leftPath) { + this.leftPath = leftPath; + } + + public String getRightPath() { + return rightPath; + } + + public void setRightPath(String rightPath) { + this.rightPath = rightPath; + } + + public Object getLeft() { + return left; + } + + public void setLeft(Object left) { + this.left = left; + } + + public Object getRight() { + return right; + } + + public void setRight(Object right) { + this.right = right; + } +} \ No newline at end of file diff --git a/zc-business/src/main/resources/mapper/business/DcEventMapper.xml b/zc-business/src/main/resources/mapper/business/DcEventMapper.xml index 67dea91f..a2e7280c 100644 --- a/zc-business/src/main/resources/mapper/business/DcEventMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcEventMapper.xml @@ -681,6 +681,15 @@ ) t ON s.event_state = t.event_state; + + update dc_event @@ -689,4 +698,9 @@ where id = #{id} + + + update dc_event set end_time = now(),event_state = '2' + where id = #{eventId} + \ No newline at end of file diff --git a/zc-business/src/main/resources/mapper/business/DcEventProcessMapper.xml b/zc-business/src/main/resources/mapper/business/DcEventProcessMapper.xml index a4b4986a..28e045e5 100644 --- a/zc-business/src/main/resources/mapper/business/DcEventProcessMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcEventProcessMapper.xml @@ -131,5 +131,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where event_id = #{id} ORDER BY operation_time ASC; + \ No newline at end of file From f8a33d539b5249a746f47aebde43e5c29edeca4f Mon Sep 17 00:00:00 2001 From: "Mr.Wang" Date: Thu, 11 Apr 2024 16:18:26 +0800 Subject: [PATCH 11/18] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4=E6=8E=A5=E5=8F=A3=E4=B8=AD=E7=9A=84=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E5=8E=86=E5=8F=B2=E8=A1=A8=E5=AD=98=E5=82=A8=E7=BB=93?= =?UTF-8?q?=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zc/business/domain/EventPlanAssoc.java | 21 +++--- .../impl/DcEmergencyPlansServiceImpl.java | 68 +++++++++++-------- .../mapper/business/EventPlanAssocMapper.xml | 39 +++++------ 3 files changed, 65 insertions(+), 63 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/domain/EventPlanAssoc.java b/zc-business/src/main/java/com/zc/business/domain/EventPlanAssoc.java index 162d32e4..d41b8c5d 100644 --- a/zc-business/src/main/java/com/zc/business/domain/EventPlanAssoc.java +++ b/zc-business/src/main/java/com/zc/business/domain/EventPlanAssoc.java @@ -36,16 +36,17 @@ public class EventPlanAssoc { private Integer emergencyPlansId; /** - * 执行控制设备 (设备id用逗号隔开) + * 控制类型 1执行此操作 2恢复操作 */ - @ApiModelProperty("执行控制设备") - private String executingControlDevice; + @ApiModelProperty("控制类型") + private Integer operationType; /** - * 恢复控制设备 (设备id用逗号隔开) + * 控制设备 (设备id用逗号隔开) */ - @ApiModelProperty("恢复控制设备") - private String recoveredControlDevice; + @ApiModelProperty("控制设备") + private String controlDevice; + @ApiModelProperty("创建时间") private Date createTime; @@ -56,11 +57,5 @@ public class EventPlanAssoc { * 执行操作结果 */ @ApiModelProperty("执行操作结果") - private String executingControlResult; - - /** - * 恢复操作结果 - */ - @ApiModelProperty("恢复操作结果") - private String recoveredControlResult; + private String controlResult; } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java index 110cb4e1..f38ee2c4 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.uuid.IdUtils; import com.zc.business.constant.DeviceFunctionIdConstants; import com.zc.business.constant.DeviceTypeConstants; import com.zc.business.controller.BroadcastController; @@ -728,33 +729,28 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { JSONObject resultObject = new JSONObject(); // 事件编号 eventPlanAssoc.setEventId(id); + eventPlanAssoc.setOperationType(dcEventAnDcEmergencyPlans.getOperationType()); EventPlanAssoc selectEventPlanAssoc = eventPlanAssocMapper.selectByEventId(eventPlanAssoc); - // 区分是执行操作 还是 恢复操作 - if (dcEventAnDcEmergencyPlans.getOperationType().equals(1) && selectEventPlanAssoc == null) { - // 首次执行操作 + + if (selectEventPlanAssoc == null) { + // 执行新增 eventPlanAssoc.setEmergencyPlansId(dcEmergencyPlans.getId()); - eventPlanAssoc.setExecutingControlDevice(deviceIds.toString().replaceFirst(";", "")); - eventPlanAssoc.setExecutingControlResult(resultArray.toJSONString()); + eventPlanAssoc.setControlDevice(deviceIds.toString().replaceFirst(";", "")); + eventPlanAssoc.setControlResult(resultArray.toJSONString()); eventPlanAssoc.setCreateTime(DateUtils.getNowDate()); - int eventPlanAssocId = eventPlanAssocMapper.insertEventPlanAssoc(eventPlanAssoc); - resultObject.put("eventPlanAssocId",eventPlanAssocId); - } - else if (StringUtils.isNotEmpty(selectEventPlanAssoc.getId()) && dcEventAnDcEmergencyPlans.getOperationType().equals(1)) { - // 多次执行操作 - selectEventPlanAssoc.setExecutingControlResult(resultArray.toJSONString()); - selectEventPlanAssoc.setUpdateTime(DateUtils.getNowDate()); - eventPlanAssocMapper.updateEventPlanAssoc(selectEventPlanAssoc); - resultObject.put("eventPlanAssocId",selectEventPlanAssoc.getId()); - } - else { - // 恢复操作 未执行的事件不能进行恢复操作 + // IdUtils.fastSimpleUUID() + eventPlanAssoc.setId(IdUtils.fastSimpleUUID()); + eventPlanAssocMapper.insertEventPlanAssoc(eventPlanAssoc); + resultObject.put("eventPlanAssocId",eventPlanAssoc.getId()); + }else { + // 执行修改操作 selectEventPlanAssoc.setUpdateTime(DateUtils.getNowDate()); - selectEventPlanAssoc.setRecoveredControlDevice(deviceIds.toString().replaceFirst(";", "")); - selectEventPlanAssoc.setRecoveredControlResult(resultArray.toJSONString()); + selectEventPlanAssoc.setControlDevice(deviceIds.toString().replaceFirst(";", "")); + selectEventPlanAssoc.setControlResult(resultArray.toJSONString()); eventPlanAssocMapper.updateEventPlanAssoc(selectEventPlanAssoc); resultObject.put("eventPlanAssocId",selectEventPlanAssoc.getId()); } - resultObject.put("deviceOperationResult",resultArray); + resultObject.put("deviceOperationResult",resultArray); return resultObject; } @@ -783,18 +779,24 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { props.put("onWorkStatus", otherConfig.get("state").toString()); props.put("inWorkStatus", otherConfig.get("state").toString()); props.put("mode", controlModel); + JSONObject result = new JSONObject(); if (controlModel.equals("01")) { String startTime = otherConfig.get("startTime").toString(); String endTime = otherConfig.get("endTime").toString(); props.put("mode", "01"); props.put("startDisplayTime", startTime); props.put("endDisplayTime", endTime); - } + result.put("content","时间自动"); + } else if (controlModel.equals("00")) { + result.put("content","手动"); + }else { + result.put("content","万年历"); + } AjaxResult ajaxResult = dcDeviceController.invokedFunction(iotDeviceId, functionId, props); // 将调用结果存入到 resultArray(操作结果) 中 - JSONObject result = new JSONObject(); result.put("device", device.getId()); + result.put("deviceName",device.getDeviceName()); result.put("result", ajaxResult); resultArray.add(result); @@ -831,12 +833,12 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { // 还原上次 props.put("fileId", "10"); functionId = DeviceFunctionIdConstants.VARIABLE_INFORMATION_FLAG_1B; - AjaxResult ajaxResult1B; - - ajaxResult1B = dcDeviceController.invokedFunction(iotDeviceId, functionId, props); + AjaxResult ajaxResult1B = dcDeviceController.invokedFunction(iotDeviceId, functionId, props); JSONObject result = new JSONObject(); result.put("device", device.getId()); + result.put("deviceName",device.getDeviceName()); + result.put("content","还原上次"); result.put("result", ajaxResult1B); resultArray.add(result); }else { @@ -866,6 +868,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { // 说明没有匹配到设备 JSONObject errorResult = new JSONObject(); errorResult.put("device",device.getId()); + errorResult.put("deviceName",device.getDeviceName()); errorResult.put("errorMessage","未匹配到对应的广播内容"); resultArray.add(errorResult); } @@ -882,6 +885,8 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { JSONObject returnResult = broadcastController.nearCamListDistance(params); JSONObject result = new JSONObject(); result.put("device", device.getId()); + result.put("deviceName",device.getDeviceName()); + result.put("content",params.get("text")); result.put("result", returnResult); resultArray.add(result); @@ -894,6 +899,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { AjaxResult ajaxResultState = dcDeviceController.invokedFunction(iotDeviceId, functionId, new HashMap<>()); JSONObject result = new JSONObject(); result.put("device", device.getId()); + result.put("deviceName",device.getDeviceName()); result.put("result", ajaxResultState); resultArray.add(result); @@ -906,6 +912,8 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { AjaxResult ajaxResult = dcDeviceController.invokedFunction(iotDeviceId, functionId, propsTime); JSONObject resultTime = new JSONObject(); resultTime.put("device", device.getId()); + resultTime.put("deviceName",device.getDeviceName()); + resultTime.put("content","操作时长"+otherConfig.get("operationDuration")); resultTime.put("result", ajaxResult); resultArray.add(resultTime); @@ -943,8 +951,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { functionId = DeviceFunctionIdConstants.VARIABLE_INFORMATION_FLAG_11; props.put("fileName", "play011.lst"); props.put("size", "65535"); - AjaxResult ajaxResult11; - ajaxResult11 = dcDeviceController.invokedFunction(iotDeviceId, functionId, props); + AjaxResult ajaxResult11 = dcDeviceController.invokedFunction(iotDeviceId, functionId, props); if (ajaxResult11.get("code").equals(200)) { // 2:执行13功能码 HashMap props11 = new HashMap<>(); @@ -975,8 +982,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { parameters.put("formatStyle", dcInfoBoardTemplate.getFormatStyle()); list.add(parameters); props11.put("parameters", list); - AjaxResult ajaxResult13 = null; - ajaxResult13 = dcDeviceController.invokedFunction(iotDeviceId, functionId, props11); + AjaxResult ajaxResult13 = dcDeviceController.invokedFunction(iotDeviceId, functionId, props11); JSONObject result = new JSONObject(); if (ajaxResult13.get("code").equals(200)) { HashMap props1B = new HashMap<>(); @@ -985,11 +991,15 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { props1B.put("fileId", "11"); AjaxResult ajaxResult1B = dcDeviceController.invokedFunction(iotDeviceId, functionId, props1B); result.put("device", device.getId()); + result.put("deviceName",device.getDeviceName()); + result.put("content",dcInfoBoardTemplate.getContent()); result.put("result", ajaxResult1B); resultArray.add(result); } else { result.put("device", device.getId()); + result.put("deviceName",device.getDeviceName()); + result.put("content","发布失败"); result.put("result", ajaxResult13); resultArray.add(result); } diff --git a/zc-business/src/main/resources/mapper/business/EventPlanAssocMapper.xml b/zc-business/src/main/resources/mapper/business/EventPlanAssocMapper.xml index cc6ed173..58efcd2c 100644 --- a/zc-business/src/main/resources/mapper/business/EventPlanAssocMapper.xml +++ b/zc-business/src/main/resources/mapper/business/EventPlanAssocMapper.xml @@ -4,39 +4,39 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + insert into event_plan_assoc + id, event_id, emergency_plans_id, - executing_control_device, - recovered_control_device, + control_device, + operation_type, create_time, update_time, - executing_control_result, - recovered_control_result, + control_result, + #{id}, #{eventId}, #{emergencyPlansId}, - #{executingControlDevice}, - #{recoveredControlDevice}, + #{controlDevice}, + #{operationType}, #{createTime}, #{updateTime}, - #{executingControlResult}, - #{recoveredControlResult} + #{controlResult}, - select id,event_id,emergency_plans_id,executing_control_device,recovered_control_device,create_time,update_time, - executing_control_result,recovered_control_result + select id,event_id,emergency_plans_id,control_device,create_time,update_time, + control_result,operation_type from event_plan_assoc @@ -44,18 +44,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" event_id = #{eventId}, emergency_plans_id = #{emergencyPlansId}, - - executing_control_device = #{executingControlDevice}, + + control_device = #{controlDevice}, - - recovered_control_device = #{recoveredControlDevice}, + + operation_type = #{operationType}, update_time = #{updateTime}, - - executing_control_result = #{executingControlResult}, - - - recovered_control_result = #{recoveredControlResult}, + + control_result = #{controlResult}, where id = #{id} From 8e13acabbf4a5cb74b3323d3f64527519a052681 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E7=90=B3?= <1911390090@qq.com> Date: Fri, 12 Apr 2024 12:45:54 +0800 Subject: [PATCH 12/18] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=20=E4=B8=BB=E9=A1=B5?= =?UTF-8?q?=E6=8E=A8=E9=80=81=20=20WebSocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DcEventController.java | 4 +-- .../zc/business/enums/EventSubclassEnum.java | 6 ++++ .../business/enums/WarningSubclassEnum.java | 2 +- .../service/impl/DcEventServiceImpl.java | 34 ++++++++++++++++-- .../service/impl/DcWarningServiceImpl.java | 36 ++++++++++++++++++- 5 files changed, 76 insertions(+), 6 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/DcEventController.java b/zc-business/src/main/java/com/zc/business/controller/DcEventController.java index d42626b4..7a2899a7 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcEventController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcEventController.java @@ -6,6 +6,7 @@ import javax.servlet.http.HttpServletResponse; import com.zc.business.domain.DcEvent; import com.zc.business.service.IDcEventService; +import com.zc.common.core.websocket.WebSocketService; import io.swagger.annotations.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -94,6 +95,7 @@ public class DcEventController extends BaseController @GetMapping(value = "/{id}") public AjaxResult getInfo(@PathVariable("id") String id) { + DcEvent dcEvent = dcEventService.selectDcEventById(id); return AjaxResult.success(dcEvent); } @@ -122,10 +124,8 @@ public class DcEventController extends BaseController //@PreAuthorize("@ss.hasPermi('system:event:add')") @Log(title = "事件信息", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody DcEvent dcEvent) { - return toAjax(dcEventService.insertDcEvent(dcEvent)); } diff --git a/zc-business/src/main/java/com/zc/business/enums/EventSubclassEnum.java b/zc-business/src/main/java/com/zc/business/enums/EventSubclassEnum.java index 0a36b980..68e8059b 100644 --- a/zc-business/src/main/java/com/zc/business/enums/EventSubclassEnum.java +++ b/zc-business/src/main/java/com/zc/business/enums/EventSubclassEnum.java @@ -11,6 +11,12 @@ public enum EventSubclassEnum { NATURAL("1-4", "自然","前方*发生自然现象请注意"), OTHER_ACCIDENTS("1-5", "其他事故","前方*发生事故谨慎驾驶"), VEHICLE_MALFUNCTION("2-1", "车辆故障","前方*发生故障注意避让"), + THE_MAIN_LINE_IS_CLOSED_AND_RESTRICTED("3-1", "主线封闭和限行","前方*主线封闭和限行"), + TOLL_BOOTHS_ARE_CLOSED_AND_RESTRICTED("3-2", "收费站封闭和限行","前方*收费站封闭和限行"), + THE_INTERCHANGE_IS_CLOSED_AND_RESTRICTED("3-3", "立交封闭和限行","前方*立交封闭和限行"), + THE_SERVICE_AREA_IS_CLOSED_AND_RESTRICTED("3-4", "服务区封闭和限行","前方*服务区封闭和限行"), + + ROAD_CONGESTION("4-1", "道路拥堵","前方*道路拥堵"), OVERPASS_CONGESTION("4-2", "立交拥堵","前方*立交拥堵"), TOLL_STATION_CONGESTION("4-3", "收费站拥堵","前方*收费站拥堵"), diff --git a/zc-business/src/main/java/com/zc/business/enums/WarningSubclassEnum.java b/zc-business/src/main/java/com/zc/business/enums/WarningSubclassEnum.java index 6a3e4c19..02bbb6ec 100644 --- a/zc-business/src/main/java/com/zc/business/enums/WarningSubclassEnum.java +++ b/zc-business/src/main/java/com/zc/business/enums/WarningSubclassEnum.java @@ -27,7 +27,7 @@ public enum WarningSubclassEnum { EMERGENCY_LANE_BLOCKED("4-7", "应急车道被占用", "发生"), VEHICLE_EXIT_EMERGENCY_LANE("4-8", "车离开应急车道", "发生"), OTHER_CONDITION("4-9", "其他", "发生停车"), - OTHER_UNKNOWN("4-10", "未知车俩", "发生停车"), + OTHER_UNKNOWN("4-10", "未知车辆", "发生停车"), REVERSING_OR_GOING_BACKWARDS("5-1", "倒车/逆行", "发生"), LINEBALL("5-2", "压线", "发生压线"), TURNROUND("5-3", "掉头", "发生掉头"), diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java index cc1291e5..8bf77a32 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java @@ -12,6 +12,7 @@ import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.system.service.ISysDeptService; import com.sun.xml.bind.v2.TODO; import com.zc.business.domain.*; +import com.zc.business.enums.EventSubclassEnum; import com.zc.business.enums.ValueConverter; import com.zc.business.mapper.*; import com.zc.business.service.IDcEventProcessService; @@ -19,6 +20,7 @@ import com.zc.business.service.IDcEventService; import com.zc.business.service.IMiddleDatabaseService; import com.zc.business.utils.diff.Diff; import com.zc.business.utils.diff.model.Result; +import com.zc.common.core.websocket.WebSocketService; import org.junit.Test; import org.apache.poi.ss.formula.functions.T; import org.springframework.beans.factory.annotation.Autowired; @@ -80,7 +82,9 @@ public class DcEventServiceImpl extends ServiceImpl impl @Autowired private IDcEventProcessService dcEventProcessService; - + private final String HAPPEN = "发生"; + private final String EVENT = "事件"; + private final String SUBEVENT = "0"; /** * 查询事件信息 * @@ -187,6 +191,9 @@ public class DcEventServiceImpl extends ServiceImpl impl int i7 = dcEventMapper.insertDcEvent(dcEvent); + if (i7>0 && eventType != 3){ + extracted(dcEvent);//事件推送到 首页 + } if (i7 > 0) { if (dcEvent.getDcEventTrafficControl().getFacilityIds().length<1 &&dcEventId == null){//非 事件处置 和收费站等多条数据添加 @@ -295,6 +302,7 @@ if (dcEvent.getDcEventTrafficControl().getFacilityIds().length<1 &&dcEventId == dcEvent.setStakeMark(extracted(facilityId)); } dcEventMapper.insertDcEvent(dcEvent); + extracted(dcEvent); //中间库 MdEvent mdEvent = new MdEvent(dcEvent); middleDatabaseService.insertMiddleDatabaseEvent(mdEvent); @@ -350,7 +358,7 @@ if (dcEvent.getDcEventTrafficControl().getFacilityIds().length<1 &&dcEventId == middleDatabaseService.insertMiddleDatabaseEvent(mdEvent); dcEventMapper.insertDcEvent(dcEvent); - + extracted(dcEvent); int i6 = dcEventTrafficControlMapper.insertDcEventTrafficControl(dcEvent.getDcEventTrafficControl()); } } @@ -411,6 +419,28 @@ if (dcEvent.getDcEventTrafficControl().getFacilityIds().length<1 &&dcEventId == } } + /** + * 推送 事件信息 + * @param dcEvent + */ + private void extracted(DcEvent dcEvent) { + String direction = "";// 方向 + String EventSubclass = "";// 事件类型 + if (dcEvent.getDirection().equals("1")) { + direction="菏泽方向"; + }else { + direction="济南方向"; + } + for (EventSubclassEnum eventSubclass : EventSubclassEnum.values()) { + if (eventSubclass.getCode().equals(dcEvent.getEventSubclass())) { + EventSubclass=eventSubclass.getInfo(); + break; + } + } + String content= direction+" " + dcEvent.getStakeMark()+" "+HAPPEN+EventSubclass+EVENT ; + WebSocketService.broadcast(SUBEVENT, content); //推送事件消息 0不是感知事件 + } + //根据路网设施查询桩号 private String extracted(String facilityId) { DcFacility facility = dcFacilityService.getFacility(facilityId); diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java index c2203f31..b3a74e17 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java @@ -12,10 +12,12 @@ import com.zc.business.domain.DcWaringStrategy; import com.zc.business.domain.DcWarning; import com.zc.business.domain.DcWarningBatchConvert; import com.zc.business.enums.ValueConverter; +import com.zc.business.enums.WarningSubclassEnum; import com.zc.business.mapper.DcEventMapper; import com.zc.business.mapper.DcWarningMapper; import com.zc.business.service.IDcEventService; import com.zc.business.service.IDcWarningService; +import com.zc.common.core.websocket.WebSocketService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -47,7 +49,9 @@ public class DcWarningServiceImpl implements IDcWarningService private IDcEventService dcEventService; @Resource private RedisCache redisCache; - + private final String HAPPEN = "发生"; + private final String EVENT = "事件"; + private final String SUBEVENT = "1"; private static final String WARNINGSTRATEGY = "warningStrategy";//redis策略缓存的key private static final String WARNINGDATA = "warningData:";//redis事件缓存的key private static String JUDGE = "1"; //自定义判断参数,1为满足0为不满足 @@ -123,6 +127,10 @@ public class DcWarningServiceImpl implements IDcWarningService dcWarning.setEndTime(DateUtils.getObtainDateAfter(Integer.parseInt(strategyTime)));//注入过期时间 if (dataId==null){//如果不存在直接加入数据库,加入缓存,配置对应的缓存过期时间以及数据库过期时间 int insertDcWarning = dcWarningMapper.insertDcWarning(dcWarning);//加入数据库 + //事件推送至 Websocket + extracted(dcWarning); + + if (insertDcWarning==0){ return 0; } @@ -136,6 +144,8 @@ public class DcWarningServiceImpl implements IDcWarningService redisCache.deleteObject(WARNINGDATA+key); String id = dcWarning.getId(); redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES); + //事件推送至 Websocket + extracted(dcWarning); return dcWarningMapper.insertDcWarning(dcWarning); } String otherConfig=""; @@ -164,9 +174,33 @@ public class DcWarningServiceImpl implements IDcWarningService redisCache.setCacheObject(WARNINGDATA+key,dataId,Integer.parseInt(strategyTime),TimeUnit.MINUTES);//重新设置延迟时间 return dcWarningMapper.updateOtherConfig(dataId, jsonObject.toString(),dcWarning.getEndTime());//修改数据库配置 } + //事件推送至 Websocket + extracted(dcWarning); return dcWarningMapper.insertDcWarning(dcWarning);//如果没有配置策略直接加入数据库; } + /** + * 事件推送至 Websocket + * @param dcWarning + */ + private void extracted(DcWarning dcWarning) { + String direction = "";// 方向 + String EventSubclass = "";// 事件类型 + if (dcWarning.getDirection().equals("1")) { + direction="菏泽方向"; + }else { + direction="济南方向"; + } + for (WarningSubclassEnum eventSubclass : WarningSubclassEnum.values()) { + if (eventSubclass.getCode().equals(dcWarning.getWarningSubclass())) { + EventSubclass=eventSubclass.getInfo(); + break; + } + } + String content= direction+" " + dcWarning.getStakeMark()+" "+HAPPEN+EventSubclass+EVENT ; + WebSocketService.broadcast(SUBEVENT, content); //推送事件消息 0不是感知事件 + } + //优先级策略(还差优先级策略需要配置) // public int priority(DcWarning dcWarning){ // dcWarning.setCreateTime(DateUtils.getNowDate()); From 0293432f2f80098cce5f5c072a30c928f48e05b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=85=B4=E7=90=B3?= <1911390090@qq.com> Date: Fri, 12 Apr 2024 12:47:21 +0800 Subject: [PATCH 13/18] =?UTF-8?q?=E4=BA=8B=E4=BB=B6=20=E4=B8=BB=E9=A1=B5?= =?UTF-8?q?=E6=8E=A8=E9=80=81=20=20WebSocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/zc/business/service/impl/DcEventServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java index 8bf77a32..d1411627 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEventServiceImpl.java @@ -239,6 +239,7 @@ if (dcEvent.getDcEventTrafficControl().getFacilityIds().length<1 &&dcEventId == //中间库 MdEvent mdEvent = new MdEvent(dcEvent); middleDatabaseService.insertMiddleDatabaseEvent(mdEvent); + extracted(dcEvent);//事件推送到 首页 dcEvent.getDcEventTrafficControl().setId(uuid); dcEvent.getDcEventTrafficControl().setFacilityId(dcEvent.getDcEventTrafficControl().getFacilityIds()[0]);//取出数组字段赋值 设施id From 56eba8e75bf073cd1c1a60514e35f896ef86faca Mon Sep 17 00:00:00 2001 From: wangsixiang <2970484253@qq.com> Date: Fri, 12 Apr 2024 16:13:34 +0800 Subject: [PATCH 14/18] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=8E=A8=E9=80=81?= =?UTF-8?q?=EF=BC=8C=E7=9F=AD=E4=BF=A1=E6=8E=A8=E9=80=81=EF=BC=8C=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E7=B1=BB=E5=9E=8B=EF=BC=8Chttp=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zc-business/pom.xml | 12 ++ .../controller/DcWarningController.java | 24 ++- .../zc/business/controller/MsmController.java | 38 ++++ .../com/zc/business/domain/DcEmployees.java | 2 +- .../zc/business/mapper/DcWarningMapper.java | 12 ++ .../business/service/IDcWarningService.java | 2 + .../com/zc/business/service/IMsmService.java | 21 ++ .../service/impl/DcWarningServiceImpl.java | 38 +++- .../business/service/impl/MsmServiceImpl.java | 201 ++++++++++++++++++ .../java/com/zc/business/utils/HttpUtil.java | 83 ++++++++ .../mapper/business/DcEmployeesMapper.xml | 2 +- .../mapper/business/DcWarningMapper.xml | 18 ++ 12 files changed, 444 insertions(+), 9 deletions(-) create mode 100644 zc-business/src/main/java/com/zc/business/controller/MsmController.java create mode 100644 zc-business/src/main/java/com/zc/business/service/IMsmService.java create mode 100644 zc-business/src/main/java/com/zc/business/service/impl/MsmServiceImpl.java create mode 100644 zc-business/src/main/java/com/zc/business/utils/HttpUtil.java diff --git a/zc-business/pom.xml b/zc-business/pom.xml index 6b870a73..6f82f0b0 100644 --- a/zc-business/pom.xml +++ b/zc-business/pom.xml @@ -71,6 +71,18 @@ poi-tl 1.9.1 + + + com.aliyun + aliyun-java-sdk-core + 4.6.3 + + + + com.aliyun + aliyun-java-sdk-dysmsapi + 2.2.1 + com.zc diff --git a/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java b/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java index c1c34e59..a102cdca 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java @@ -1,5 +1,6 @@ package com.zc.business.controller; +import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.uuid.IdUtils; import com.zc.business.domain.DcWarningBatchConvert; import com.zc.business.service.IDcWarningService; @@ -10,12 +11,16 @@ import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.poi.ExcelUtil; import com.zc.business.domain.DcWarning; +import com.zc.business.service.IDeviceService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; @@ -29,6 +34,7 @@ import java.util.List; * @date 2024-01-26 */ @Api(tags = "感知事件") +@Component @RestController @RequestMapping("/business/warning") public class DcWarningController extends BaseController @@ -36,6 +42,11 @@ public class DcWarningController extends BaseController @Autowired private IDcWarningService dcWarningService; + //定时任务,定时结束部分事件 + public void updateEndSection(){ + IDcWarningService ben = SpringUtils.getBean(IDcWarningService.class); + ben.updateEndSection(); + } /** * 查询预警信息列表 */ @@ -136,9 +147,14 @@ public class DcWarningController extends BaseController return dcWarningService.batchConvert(dcWarningBatchConvert); } - //定时任务,定时结束部分事件 - @PostMapping("/endSection") - public AjaxResult updateEndSection(){ - return toAjax(dcWarningService.updateEndSection()); + + //指挥调度 + @PostMapping("/commandAndDispatch") + public AjaxResult commandAndDispatch(@RequestBody DcWarning dcWarning){ + if (StringUtils.isBlank(dcWarning.getStakeMark())){ + return AjaxResult.error("参数错误"); + } + return (dcWarningService.commandAndDispatch(dcWarning)); } + } diff --git a/zc-business/src/main/java/com/zc/business/controller/MsmController.java b/zc-business/src/main/java/com/zc/business/controller/MsmController.java new file mode 100644 index 00000000..128bd52f --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/controller/MsmController.java @@ -0,0 +1,38 @@ +package com.zc.business.controller; + +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.zc.business.domain.DcWarning; +import com.zc.business.service.IMsmService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; + +/** + * 王思祥 + * 推送业务 + */ +@RestController +@RequestMapping("/business/sms") +public class MsmController extends BaseController { + @Autowired + private IMsmService msmService; + + /** + * 短信推送业务,阿里云短信业务 + */ + @PostMapping("/push") + public Boolean alibabaCloudSms() + { + return msmService.send("19806114248"); + } + //调用微信推送 + @PostMapping("/wenXinPush") + public AjaxResult commandAndDispatch(){ + return AjaxResult.success(msmService.wenXinSend("wx9ee0e3babfd8d2af","de2ecb80b30d63135918ba3ae6ffb711")); + } +} \ No newline at end of file diff --git a/zc-business/src/main/java/com/zc/business/domain/DcEmployees.java b/zc-business/src/main/java/com/zc/business/domain/DcEmployees.java index ef714391..ef2635f2 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcEmployees.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcEmployees.java @@ -50,7 +50,7 @@ public class DcEmployees extends BaseEntity private Long parentId; //人员类型1为路管人员2为应急人员 - @Excel(name = "人员类型 1-路管人员 2-应急人员") + @Excel(name = "人员类型 1-路管人员 2-交警人员") private Long employeesType; //类型参数 private String type; diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java index 322a0dd7..174f24dd 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java @@ -5,9 +5,11 @@ import java.util.HashMap; import java.util.List; import cn.hutool.core.lang.hash.Hash; +import com.zc.business.domain.DcRoadSection; import com.zc.business.domain.DcWaringStrategy; import com.zc.business.domain.DcWarning; import org.apache.ibatis.annotations.Param; +import org.springframework.security.core.parameters.P; /** * 预警信息Mapper接口 @@ -90,4 +92,14 @@ public interface DcWarningMapper public Integer updateEndSection(@Param("dcWarningList") List dcWarningList); //查询当天全部可以结束的事件 public List selectEndSection(); + //依据桩号返回驻点id + public Long selectSectionId(@Param("stakeMark")String stakeMark,@Param("direction")String direction); + //依据桩号获取最近距离的驻点 + public List> selectRecentlySection(); + //查询某个机构的全部应急人员信息 + public List> selectOrganizationEmployees(@Param("organizationId")Long organizationId); + //查询某个机构当天的值班信息 + public List> selectShifts(@Param("station") Long station); + //查询某个机构的车辆信息 + public List> selectVehicles(@Param("organizationId")Long organizationId); } diff --git a/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java b/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java index 54c65999..33a68e4e 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java @@ -84,4 +84,6 @@ public interface IDcWarningService //定时结束部分事件 Integer updateEndSection(); + //指挥调度 + AjaxResult commandAndDispatch(DcWarning dcWarning); } diff --git a/zc-business/src/main/java/com/zc/business/service/IMsmService.java b/zc-business/src/main/java/com/zc/business/service/IMsmService.java new file mode 100644 index 00000000..5dc10cdf --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/service/IMsmService.java @@ -0,0 +1,21 @@ +package com.zc.business.service; + +import com.alibaba.fastjson.JSONArray; +import com.ruoyi.common.core.domain.AjaxResult; + +public interface IMsmService { + /** + * 发送短信 + * + * @param phone 手机号 + * @return + */ + public boolean send(String phone); + /** + * 微信推送 + * + * @return + */ + JSONArray wenXinSend(String appId, String appSecret); + +} \ No newline at end of file diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java index c2203f31..db0e0729 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java @@ -1,7 +1,6 @@ package com.zc.business.service.impl; - import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.DateUtils; @@ -16,19 +15,22 @@ import com.zc.business.mapper.DcEventMapper; import com.zc.business.mapper.DcWarningMapper; import com.zc.business.service.IDcEventService; import com.zc.business.service.IDcWarningService; +import com.zc.business.utils.StakeMarkUtils; import org.apache.commons.lang3.StringUtils; +import org.json.JSONArray; +import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; +import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; -import org.json.JSONObject; -import org.json.JSONArray; +import java.util.stream.Collectors; /** * 预警信息Service业务层处理 * @@ -543,4 +545,34 @@ public class DcWarningServiceImpl implements IDcWarningService return dcWarningMapper.updateEndSection(dcWarnings); } + @Override + public AjaxResult commandAndDispatch(DcWarning dcWarning) { + //逻辑,调用全部的机构信息,计算传入的桩号与机构桩号的距离作为排序使用,使用机构的id调出车辆,人员,值班等信息 + List> mapList = dcWarningMapper.selectRecentlySection();//全部机构的桩号和名称 + ArrayList> hashMaps = new ArrayList<>(); + for (HashMap map:mapList){ + if (StringUtils.isBlank(map.get("stakeMark").toString())){ + continue; + } + String stakeMark = map.get("stakeMark").toString(); + StakeMarkUtils stakeMarkUtils = new StakeMarkUtils(); + Integer itselfStakeMark = stakeMarkUtils.stakeMarkToInt(stakeMark);//桩号本身的米数 + Integer afferentStakeMark = stakeMarkUtils.stakeMarkToInt(dcWarning.getStakeMark());//传入的桩号米数 + Integer difference =Math.abs(afferentStakeMark-itselfStakeMark); //计算距离绝对值 + map.put("difference",difference/1000.0);//米转公里加入到map + Long id = (Long) map.get("id");//机构的id,用户获取人员、值班、车辆等信息 + List> employeesMap = dcWarningMapper.selectOrganizationEmployees(id);//人员map + List> shiftsMap = dcWarningMapper.selectShifts(id);//值班map + List> vehiclesMap = dcWarningMapper.selectVehicles(id);//车辆map + map.put("employeesMap",employeesMap); + map.put("shiftsMap",shiftsMap); + map.put("vehiclesMap",vehiclesMap); + hashMaps.add(map); + } + List> sortedHashMaps = hashMaps.stream().sorted(Comparator.comparing(map -> { + return (Double) map.get("difference"); })).collect(Collectors.toList()); + return AjaxResult.success(sortedHashMaps); + } + + } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/MsmServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/MsmServiceImpl.java new file mode 100644 index 00000000..fef5b2a4 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/service/impl/MsmServiceImpl.java @@ -0,0 +1,201 @@ +package com.zc.business.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.aliyuncs.DefaultAcsClient; +import com.aliyuncs.IAcsClient; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; +import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; +import com.aliyuncs.profile.DefaultProfile; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.spring.SpringUtils; +import com.zc.business.service.IMsmService; +import com.zc.business.utils.HttpUtil; +import org.apache.commons.lang3.StringUtils; +import org.json.JSONObject; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.InputStream; + +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 短信业务实现类 + */ +@Service +public class MsmServiceImpl implements IMsmService { + private static final String WEIXINTUISONTOKEN = "weixintuisontoken";//redis策略缓存的key + + /** + * 发送短信 + * + * @param phone 手机号 + * @return + */ + public boolean send(String phone) { + //地域节点、阿里云的id、秘钥 + DefaultProfile profile = DefaultProfile.getProfile("cn-qingdao", + "LTAI5tENd3j1tP5t2fF4fxaX", "i86Yenj13XRd2aeZMtybpKxsqI1VRU"); + IAcsClient client = new DefaultAcsClient(profile); + SendSmsRequest request = new SendSmsRequest(); + request.setSysRegionId("cn-qingdao");//地域节点 + request.putQueryParameter("PhoneNumbers", phone); //手机号,要填绑定测试的手机号码 + request.putQueryParameter("SignName", "阿里云短信测试"); //阿里云签名名称 + request.putQueryParameter("TemplateCode", "SMS_154950909"); //阿里云模板code + String code = String.format("%04d", new Random().nextInt(10000));//验证码 + HashMap map = new HashMap<>(); + map.put("code", code); //参数加入到map + JSONObject json = new JSONObject(map); //map参数转为JSON传入到模板即可 + request.putQueryParameter("TemplateParam", json); + try { + SendSmsResponse response = client.getAcsResponse(request); + if (response != null && response.getCode() != null && response.getCode().equals("OK")) { + return true; + } + return false; + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + //测试短信推送 +// public static void main(String[] args) { +// MsmServiceImpl msmService = new MsmServiceImpl(); +// boolean send = msmService.send("19806114248"); +// System.out.println(send); +// } + //微信推送 + @Override + public JSONArray wenXinSend(String appId, String appSecret) { + MsmServiceImpl msmService = new MsmServiceImpl(); + return msmService.sendTemp(appId, appSecret); + } + + //获取微信token + public static com.alibaba.fastjson.JSONObject getAccessToken(String appId, String appSecret) { + String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret; + String accessToken = null; + com.alibaba.fastjson.JSONObject jsonObj = null; + try { + URL urlGet = new URL(url); + HttpURLConnection http = (HttpURLConnection) urlGet.openConnection(); + http.setRequestMethod("GET"); // 必须是get方式请求 + http.setDoInput(true); + http.connect(); + InputStream is = http.getInputStream(); + int size = is.available(); + byte[] jsonBytes = new byte[size]; + is.read(jsonBytes); + accessToken = new String(jsonBytes, "UTF-8"); + System.err.println(accessToken); + jsonObj = com.alibaba.fastjson.JSONObject.parseObject(accessToken); + is.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return jsonObj; + } + + //执行微信推送 + public JSONArray sendTemp(String appId, String appSecret) { + JSONArray objects = new JSONArray(); + ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(100); + MsmServiceImpl msmService = new MsmServiceImpl(); + RedisCache redisCache = SpringUtils.getBean(RedisCache.class); + String accessToken = redisCache.getCacheObject(WEIXINTUISONTOKEN); + if (StringUtils.isBlank(accessToken)) { + accessToken = msmService.getAccessToken(appId, appSecret).getString("access_token");//获取到了access_token + String expiresIn = msmService.getAccessToken(appId, appSecret).getString("expires_in");//token有效秒数 + redisCache.setCacheObject(WEIXINTUISONTOKEN, accessToken, Integer.parseInt(expiresIn), TimeUnit.SECONDS);//把token存入到redis中,并设置过期时间(时间来自于微信接口返回) + } + JSONArray userListOpenid = msmService.getUserListOpenid(accessToken); + CountDownLatch latch = new CountDownLatch(userListOpenid.size()); + for (Object openid : userListOpenid) { + String token = accessToken; + executor.execute(() -> { + // 封装要发送的json + Map map = new HashMap(); + map.put("template_id", "D_yBiN7aDl2pw3bhSqU_Fbi0D8BHXL0qeBjhusWVO68");//模板消息id + map.put("touser", openid.toString());//这里的openid是全部关注公众号的openid + // 封装data + com.alibaba.fastjson.JSONObject data = new com.alibaba.fastjson.JSONObject(); + com.alibaba.fastjson.JSONObject name = new com.alibaba.fastjson.JSONObject(); + name.put("value", "做一个身体和心灵都勇敢的人,趁着身体未老,心灵还透明。晚安!"); + data.put("name", name); + com.alibaba.fastjson.JSONObject weather = new com.alibaba.fastjson.JSONObject(); + weather.put("value", "阴天 19°c"); + data.put("weather", weather); + com.alibaba.fastjson.JSONObject birthday = new com.alibaba.fastjson.JSONObject(); + birthday.put("value", "53 天"); + data.put("birthday", birthday); + map.put("data", data); + String r = HttpUtil.getJsonData(com.alibaba.fastjson.JSONObject.parseObject(JSON.toJSONString(map)), + "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + token); //发送模板消息 + System.out.println("-->" + r); + try { + JSONObject jsonObject = new JSONObject(r); + String errmsg = jsonObject.getString("errmsg"); + Object errcode = jsonObject.get("errcode"); + objects.add(errcode); + } catch (Exception e) { + e.printStackTrace(); + } finally { + latch.countDown(); + } + }); + } + try { + latch.await(); // 等待所有线程执行完毕 + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } finally { + executor.shutdown(); + } + return objects; + //map.put("url","https://www.vipkes.cn");//用户点击模板消息,要跳转的地址 + // 封装miniprogram 跳转小程序用,不跳不要填 +// Map mapA = new HashMap<>(); +// mapA.put("appid", ""); //小程序appid +// mapA.put("pagepath", ""); //小程序页面pagepath +// map.put("miniprogram", mapA); + } + + //获取微信公众号全部关注人的openid + public static JSONArray getUserListOpenid(String accessToken) { + String url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken; + ; + com.alibaba.fastjson.JSONObject jsonObj = null; + try { + URL urlGet = new URL(url); + HttpURLConnection http = (HttpURLConnection) urlGet.openConnection(); + http.setRequestMethod("GET"); // 必须是get方式请求 + http.setDoInput(true); + http.connect(); + InputStream is = http.getInputStream(); + int size = is.available(); + byte[] jsonBytes = new byte[size]; + is.read(jsonBytes); + String userOpenid = new String(jsonBytes, "UTF-8"); + jsonObj = com.alibaba.fastjson.JSONObject.parseObject(userOpenid); + is.close(); + } catch (Exception e) { + e.printStackTrace(); + } + com.alibaba.fastjson.JSONObject data = jsonObj.getJSONObject("data"); + return data.getJSONArray("openid"); + } +} \ No newline at end of file diff --git a/zc-business/src/main/java/com/zc/business/utils/HttpUtil.java b/zc-business/src/main/java/com/zc/business/utils/HttpUtil.java new file mode 100644 index 00000000..cb2d25bc --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/utils/HttpUtil.java @@ -0,0 +1,83 @@ +package com.zc.business.utils; + + +import com.alibaba.fastjson.JSONObject; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.net.HttpURLConnection; +import java.net.URL; + +public class HttpUtil { + + public static String getJsonData(JSONObject jsonParam, String urls) { + StringBuffer sb = new StringBuffer(); + try { + // 创建url资源 + URL url = new URL(urls); + // 建立http连接 + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + // 设置允许输出 + conn.setDoOutput(true); + // 设置允许输入 + conn.setDoInput(true); + // 设置不用缓存 + conn.setUseCaches(false); + // 设置传递方式 + conn.setRequestMethod("POST"); + // 设置维持长连接 + conn.setRequestProperty("Connection", "Keep-Alive"); + // 设置文件字符集: + conn.setRequestProperty("Charset", "UTF-8"); + // 转换为字节数组 + byte[] data = (jsonParam.toString()).getBytes(); + // 设置文件长度 + conn.setRequestProperty("Content-Length", String.valueOf(data.length)); + // 设置文件类型: + conn.setRequestProperty("contentType", "application/json"); + // 开始连接请求 + conn.connect(); + //OutputStream out = new DataOutputStream(conn.getOutputStream()) ; + //防止消息乱码 + OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream(), "utf-8"); + // 写入请求的字符串 + out.write(jsonParam.toString()); + out.flush(); + out.close(); + + System.out.println(conn.getResponseCode()); + + // 请求返回的状态 + if (HttpURLConnection.HTTP_OK == conn.getResponseCode()) { + System.out.println("连接成功"); + // 请求返回的数据 + InputStream in1 = conn.getInputStream(); + try { + String readLine = new String(); + BufferedReader responseReader = new BufferedReader(new InputStreamReader(in1, "UTF-8")); + while ((readLine = responseReader.readLine()) != null) { + sb.append(readLine).append("\n"); + } + responseReader.close(); + System.out.println(sb.toString()); + + } catch (Exception e1) { + e1.printStackTrace(); + } + } else { + System.out.println("error++"); + + } + + } catch (Exception e) { + + } + + return sb.toString(); + + } + + +} \ No newline at end of file diff --git a/zc-business/src/main/resources/mapper/business/DcEmployeesMapper.xml b/zc-business/src/main/resources/mapper/business/DcEmployeesMapper.xml index 3462b34c..5b64de76 100644 --- a/zc-business/src/main/resources/mapper/business/DcEmployeesMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcEmployeesMapper.xml @@ -24,7 +24,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" employees.create_time, employees.update_time, CASE WHEN employees.employees_type = 1 THEN '路管人员' - WHEN employees.employees_type = 2 THEN '应急人员' + WHEN employees.employees_type = 2 THEN '交警人员' END AS type from dc_employees as employees left join dc_organization as organization on organization.id=employees.organization_id diff --git a/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml b/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml index 7b3d8c07..750d9bdc 100644 --- a/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml @@ -245,5 +245,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + + From 43cc5bd69d396bb7369ff1acfdb8c59befd45117 Mon Sep 17 00:00:00 2001 From: lau572 <1010031226@qq.com> Date: Mon, 15 Apr 2024 08:45:22 +0800 Subject: [PATCH 15/18] =?UTF-8?q?=E9=87=8D=E8=A6=81=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E6=96=87=E6=A1=A3=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DcEventImportantController.java | 98 ++++++++ .../DcEventImportantFileController.java | 165 +++++++++++++ .../zc/business/domain/DcEventImportant.java | 183 +++++++++++++++ .../business/domain/DcEventImportantFile.java | 173 ++++++++++++++ .../zc/business/domain/DcEventProcess.java | 3 +- .../mapper/DcEventImportantFileMapper.java | 61 +++++ .../mapper/DcEventImportantMapper.java | 61 +++++ .../service/IDcEventImportantFileService.java | 61 +++++ .../service/IDcEventImportantService.java | 61 +++++ .../impl/DcEventImportantFileServiceImpl.java | 120 ++++++++++ .../impl/DcEventImportantServiceImpl.java | 93 ++++++++ .../java/com/zc/business/utils/PoiUtil.java | 216 +++++++++++++++++- .../business/DcEventImportantFileMapper.xml | 101 ++++++++ .../business/DcEventImportantMapper.xml | 121 ++++++++++ .../wordTemplate/importantTemplate.docx | Bin 0 -> 18141 bytes 15 files changed, 1510 insertions(+), 7 deletions(-) create mode 100644 zc-business/src/main/java/com/zc/business/controller/DcEventImportantController.java create mode 100644 zc-business/src/main/java/com/zc/business/controller/DcEventImportantFileController.java create mode 100644 zc-business/src/main/java/com/zc/business/domain/DcEventImportant.java create mode 100644 zc-business/src/main/java/com/zc/business/domain/DcEventImportantFile.java create mode 100644 zc-business/src/main/java/com/zc/business/mapper/DcEventImportantFileMapper.java create mode 100644 zc-business/src/main/java/com/zc/business/mapper/DcEventImportantMapper.java create mode 100644 zc-business/src/main/java/com/zc/business/service/IDcEventImportantFileService.java create mode 100644 zc-business/src/main/java/com/zc/business/service/IDcEventImportantService.java create mode 100644 zc-business/src/main/java/com/zc/business/service/impl/DcEventImportantFileServiceImpl.java create mode 100644 zc-business/src/main/java/com/zc/business/service/impl/DcEventImportantServiceImpl.java create mode 100644 zc-business/src/main/resources/mapper/business/DcEventImportantFileMapper.xml create mode 100644 zc-business/src/main/resources/mapper/business/DcEventImportantMapper.xml create mode 100644 zc-business/src/main/resources/wordTemplate/importantTemplate.docx diff --git a/zc-business/src/main/java/com/zc/business/controller/DcEventImportantController.java b/zc-business/src/main/java/com/zc/business/controller/DcEventImportantController.java new file mode 100644 index 00000000..f1fb84bc --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/controller/DcEventImportantController.java @@ -0,0 +1,98 @@ +package com.zc.business.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.zc.business.domain.DcEventImportant; +import com.zc.business.service.IDcEventImportantService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 事件侧重要素Controller + * + * @author ruoyi + * @date 2024-04-11 + */ +@RestController +@RequestMapping("/business/eventImportant") +public class DcEventImportantController extends BaseController +{ + @Autowired + private IDcEventImportantService dcEventImportantService; + + /** + * 查询事件侧重要素列表 + */ + @GetMapping("/list") + public TableDataInfo list(DcEventImportant dcEventImportant) + { + startPage(); + List list = dcEventImportantService.selectDcEventImportantList(dcEventImportant); + return getDataTable(list); + } + + /** + * 导出事件侧重要素列表 + */ + @Log(title = "事件侧重要素", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, DcEventImportant dcEventImportant) + { + List list = dcEventImportantService.selectDcEventImportantList(dcEventImportant); + ExcelUtil util = new ExcelUtil<>(DcEventImportant.class); + util.exportExcel(response, list, "事件侧重要素数据"); + } + + /** + * 获取事件侧重要素详细信息 + */ + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return AjaxResult.success(dcEventImportantService.selectDcEventImportantByEventId(id)); + } + + /** + * 新增事件侧重要素 + */ + @Log(title = "事件侧重要素", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody DcEventImportant dcEventImportant) + { + return toAjax(dcEventImportantService.insertDcEventImportant(dcEventImportant)); + } + + /** + * 修改事件侧重要素 + */ + @Log(title = "事件侧重要素", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody DcEventImportant dcEventImportant) + { + return toAjax(dcEventImportantService.updateDcEventImportant(dcEventImportant)); + } + + /** + * 删除事件侧重要素 + */ + @Log(title = "事件侧重要素", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) + { + return toAjax(dcEventImportantService.deleteDcEventImportantByEventIds(ids)); + } +} diff --git a/zc-business/src/main/java/com/zc/business/controller/DcEventImportantFileController.java b/zc-business/src/main/java/com/zc/business/controller/DcEventImportantFileController.java new file mode 100644 index 00000000..e72348a5 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/controller/DcEventImportantFileController.java @@ -0,0 +1,165 @@ +package com.zc.business.controller; + +import java.io.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.servlet.http.HttpServletResponse; + +import com.zc.business.utils.PoiUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.zc.business.domain.DcEventImportantFile; +import com.zc.business.service.IDcEventImportantFileService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; + +/** + * 重要事件文件内容Controller + * + * @author ruoyi + * @date 2024-04-12 + */ +@Api(tags = "重要事件文件内容") +@RestController +@RequestMapping("/business/eventImportantFile") +public class DcEventImportantFileController extends BaseController +{ + @Autowired + private IDcEventImportantFileService dcEventImportantFileService; + + /** + * 分页查询重要事件文件内容 + */ + @ApiOperation("分页查询重要事件文件内容") + @GetMapping("/page") + public TableDataInfo page(DcEventImportantFile dcEventImportantFile) + { + startPage(); + List list = dcEventImportantFileService.selectDcEventImportantFileList(dcEventImportantFile); + return getDataTable(list); + } + + /** + * 无分页查询重要事件文件内容列表 + */ + @ApiOperation("无分页查询重要事件文件内容列表") + @GetMapping("/list") + public List list(DcEventImportantFile dcEventImportantFile) + { + return dcEventImportantFileService.selectDcEventImportantFileList(dcEventImportantFile); + } + + /** + * 导出重要事件文件内容列表 + */ + @Log(title = "重要事件文件内容", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, DcEventImportantFile dcEventImportantFile) + { + List list = dcEventImportantFileService.selectDcEventImportantFileList(dcEventImportantFile); + ExcelUtil util = new ExcelUtil<>(DcEventImportantFile.class); + util.exportExcel(response, list, "重要事件文件内容数据"); + } + + /** + * 下载重要事件文件 + */ + @ApiOperation("下载重要事件文件") + @Log(title = "下载重要事件文件", businessType = BusinessType.EXPORT) + @PostMapping("/download") + public void download(HttpServletResponse response, DcEventImportantFile dcEventImportantFile) + { + InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("wordTemplate/importantTemplate.docx"); + + XWPFDocument document = null; + try { + + + //获取docx解析对象 + document = new XWPFDocument(inputStream); + Map textMap = new HashMap<>(); + textMap.put("${fromDept}",dcEventImportantFile.getFromDept()); + textMap.put("${createTime}",dcEventImportantFile.getCreateTime()); + textMap.put("${title}",dcEventImportantFile.getTitle()); + textMap.put("${toDept}",dcEventImportantFile.getToDept()); + textMap.put("${content}",dcEventImportantFile.getContent()); + textMap.put("${createName}",dcEventImportantFile.getCreateName()); + textMap.put("${phoneNumber}",dcEventImportantFile.getPhoneNumber()); + textMap.put("${issued}",dcEventImportantFile.getIssued()); + + //解析替换文本段落对象 + PoiUtil.changeText(document, textMap); + + document.write(response.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); + }finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + /** + * 获取重要事件文件内容详细信息 + */ + @ApiOperation("获取重要事件文件内容详细信息") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") String id) + { + return AjaxResult.success(dcEventImportantFileService.selectDcEventImportantFileByEventId(id)); + } + + /** + * 新增重要事件文件内容 + */ + @ApiOperation("新增重要事件文件内容") + @Log(title = "重要事件文件内容", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody DcEventImportantFile dcEventImportantFile) + { + return toAjax(dcEventImportantFileService.insertDcEventImportantFile(dcEventImportantFile)); + } + + /** + * 修改重要事件文件内容 + */ + @ApiOperation("修改重要事件文件内容") + @Log(title = "重要事件文件内容", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody DcEventImportantFile dcEventImportantFile) + { + return toAjax(dcEventImportantFileService.updateDcEventImportantFile(dcEventImportantFile)); + } + + /** + * 删除重要事件文件内容 + */ + @ApiOperation("删除重要事件文件内容") + @Log(title = "重要事件文件内容", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable String[] ids) + { + return toAjax(dcEventImportantFileService.deleteDcEventImportantFileByEventIds(ids)); + } +} diff --git a/zc-business/src/main/java/com/zc/business/domain/DcEventImportant.java b/zc-business/src/main/java/com/zc/business/domain/DcEventImportant.java new file mode 100644 index 00000000..39a73626 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/domain/DcEventImportant.java @@ -0,0 +1,183 @@ +package com.zc.business.domain; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.List; +import java.util.Map; + +/** + * @Description 事件侧重要素 + * + * @author liuwenge + * @date 2024/4/11 18:28 + */ +@ApiModel("事件侧重要素") +public class DcEventImportant +{ + + @ApiModelProperty(value = "事件id") + private String id; + + @ApiModelProperty(value = "事件id") + private String eventId; + + @ApiModelProperty(value = "车型及车牌号") + private String plateNumber; + + @ApiModelProperty(value = "分流点名称及桩号") + private String diversionPoint; + + @ApiModelProperty(value = "目前进度") + private String currentProgress; + + @ApiModelProperty(value = "已采取措施") + private String takeSteps; + + @ApiModelProperty(value = "是否启动预案") + private Integer planStatus; + + @ApiModelProperty(value = "交警是否到达") + private Integer trafficPoliceStatus; + + @ApiModelProperty(value = "医疗是否到达") + private Integer medicalStatus; + + @ApiModelProperty(value = "消防是否到达") + private Integer fireStatus; + + @ApiModelProperty(value = "是否做好情报板提示工作") + private Integer boardStatus; + + @ApiModelProperty(value = "是否有危化品泄漏") + private Integer chemicalsStatus; + + @ApiModelProperty(value = "预案等级") + private String planLevel; + + @ApiModelProperty(value = "危化品名称") + private String chemicalsName; + + @ApiModelProperty(value = "危化品泄露程度") + private String leakageLevel; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getEventId() { + return eventId; + } + + public void setEventId(String eventId) { + this.eventId = eventId; + } + + public String getPlateNumber() { + return plateNumber; + } + + public void setPlateNumber(String plateNumber) { + this.plateNumber = plateNumber; + } + + public String getDiversionPoint() { + return diversionPoint; + } + + public void setDiversionPoint(String diversionPoint) { + this.diversionPoint = diversionPoint; + } + + public String getCurrentProgress() { + return currentProgress; + } + + public void setCurrentProgress(String currentProgress) { + this.currentProgress = currentProgress; + } + + public String getTakeSteps() { + return takeSteps; + } + + public void setTakeSteps(String takeSteps) { + this.takeSteps = takeSteps; + } + + public Integer getPlanStatus() { + return planStatus; + } + + public void setPlanStatus(Integer planStatus) { + this.planStatus = planStatus; + } + + public Integer getTrafficPoliceStatus() { + return trafficPoliceStatus; + } + + public void setTrafficPoliceStatus(Integer trafficPoliceStatus) { + this.trafficPoliceStatus = trafficPoliceStatus; + } + + public Integer getMedicalStatus() { + return medicalStatus; + } + + public void setMedicalStatus(Integer medicalStatus) { + this.medicalStatus = medicalStatus; + } + + public Integer getFireStatus() { + return fireStatus; + } + + public void setFireStatus(Integer fireStatus) { + this.fireStatus = fireStatus; + } + + public Integer getBoardStatus() { + return boardStatus; + } + + public void setBoardStatus(Integer boardStatus) { + this.boardStatus = boardStatus; + } + + public Integer getChemicalsStatus() { + return chemicalsStatus; + } + + public void setChemicalsStatus(Integer chemicalsStatus) { + this.chemicalsStatus = chemicalsStatus; + } + + public String getPlanLevel() { + return planLevel; + } + + public void setPlanLevel(String planLevel) { + this.planLevel = planLevel; + } + + public String getChemicalsName() { + return chemicalsName; + } + + public void setChemicalsName(String chemicalsName) { + this.chemicalsName = chemicalsName; + } + + public String getLeakageLevel() { + return leakageLevel; + } + + public void setLeakageLevel(String leakageLevel) { + this.leakageLevel = leakageLevel; + } +} diff --git a/zc-business/src/main/java/com/zc/business/domain/DcEventImportantFile.java b/zc-business/src/main/java/com/zc/business/domain/DcEventImportantFile.java new file mode 100644 index 00000000..400dbb98 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/domain/DcEventImportantFile.java @@ -0,0 +1,173 @@ +package com.zc.business.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 重要事件文件内容对象 dc_event_important_file + * + * @author ruoyi + * @date 2024-04-12 + */ +public class DcEventImportantFile +{ + private static final long serialVersionUID = 1L; + + private Long id; + + /** 事件id */ + private String eventId; + + /** 报送单位 */ + @Excel(name = "报送单位") + private String fromDept; + + /** 报送时间 */ + @Excel(name = "报送时间") + private String createTime; + + /** 标题 */ + @Excel(name = "标题") + private String title; + + /** 发至单位 */ + @Excel(name = "发至单位") + private String toDept; + + /** 内容 */ + @Excel(name = "内容") + private String content; + + /** 填报人 */ + @Excel(name = "填报人") + private String createName; + + /** 联系电话 */ + @Excel(name = "联系电话") + private String phoneNumber; + + /** 签发人 */ + @Excel(name = "签发人") + private String issued; + + /** 类型 1:初报,2续报,3终报 */ + @Excel(name = "类型 1:初报,2续报,3终报") + private String type; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public void setEventId(String eventId) + { + this.eventId = eventId; + } + + public String getEventId() + { + return eventId; + } + public void setFromDept(String fromDept) + { + this.fromDept = fromDept; + } + + public String getFromDept() + { + return fromDept; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public void setTitle(String title) + { + this.title = title; + } + + public String getTitle() + { + return title; + } + public void setToDept(String toDept) + { + this.toDept = toDept; + } + + public String getToDept() + { + return toDept; + } + public void setContent(String content) + { + this.content = content; + } + + public String getContent() + { + return content; + } + public void setCreateName(String createName) + { + this.createName = createName; + } + + public String getCreateName() + { + return createName; + } + public void setPhoneNumber(String phoneNumber) + { + this.phoneNumber = phoneNumber; + } + + public String getPhoneNumber() + { + return phoneNumber; + } + public void setIssued(String issued) + { + this.issued = issued; + } + + public String getIssued() + { + return issued; + } + public void setType(String type) + { + this.type = type; + } + + public String getType() + { + return type; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("eventId", getEventId()) + .append("fromDept", getFromDept()) + .append("createTime", getCreateTime()) + .append("title", getTitle()) + .append("toDept", getToDept()) + .append("content", getContent()) + .append("createName", getCreateName()) + .append("phoneNumber", getPhoneNumber()) + .append("issued", getIssued()) + .append("type", getType()) + .toString(); + } +} diff --git a/zc-business/src/main/java/com/zc/business/domain/DcEventProcess.java b/zc-business/src/main/java/com/zc/business/domain/DcEventProcess.java index 44b884af..be0ab666 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcEventProcess.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcEventProcess.java @@ -49,8 +49,9 @@ public class DcEventProcess /** 1-节点 2-信息发布 3-设备管控 + 4-文件生成 */ - @ApiModelProperty(value="流程类型 1-节点,2-信息发布,3-设备管控") + @ApiModelProperty(value="流程类型 1-节点,2-信息发布,3-设备管控,4-文件生成") @Excel(name = "流程类型") private Integer processType; diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcEventImportantFileMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcEventImportantFileMapper.java new file mode 100644 index 00000000..af094b3b --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/mapper/DcEventImportantFileMapper.java @@ -0,0 +1,61 @@ +package com.zc.business.mapper; + +import java.util.List; +import com.zc.business.domain.DcEventImportantFile; + +/** + * 重要事件文件内容Mapper接口 + * + * @author ruoyi + * @date 2024-04-12 + */ +public interface DcEventImportantFileMapper +{ + /** + * 查询重要事件文件内容 + * + * @param id 重要事件文件内容主键 + * @return 重要事件文件内容 + */ + public DcEventImportantFile selectDcEventImportantFileByEventId(String id); + + /** + * 查询重要事件文件内容列表 + * + * @param dcEventImportantFile 重要事件文件内容 + * @return 重要事件文件内容集合 + */ + List selectDcEventImportantFileList(DcEventImportantFile dcEventImportantFile); + + /** + * 新增重要事件文件内容 + * + * @param dcEventImportantFile 重要事件文件内容 + * @return 结果 + */ + int insertDcEventImportantFile(DcEventImportantFile dcEventImportantFile); + + /** + * 修改重要事件文件内容 + * + * @param dcEventImportantFile 重要事件文件内容 + * @return 结果 + */ + int updateDcEventImportantFile(DcEventImportantFile dcEventImportantFile); + + /** + * 删除重要事件文件内容 + * + * @param id 重要事件文件内容主键 + * @return 结果 + */ + int deleteDcEventImportantFileByEventId(String id); + + /** + * 批量删除重要事件文件内容 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + int deleteDcEventImportantFileByEventIds(String[] ids); +} diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcEventImportantMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcEventImportantMapper.java new file mode 100644 index 00000000..1aa5d2bf --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/mapper/DcEventImportantMapper.java @@ -0,0 +1,61 @@ +package com.zc.business.mapper; + +import java.util.List; +import com.zc.business.domain.DcEventImportant; + +/** + * 事件侧重要素Mapper接口 + * + * @author ruoyi + * @date 2024-04-11 + */ +public interface DcEventImportantMapper +{ + /** + * 查询事件侧重要素 + * + * @param id 事件侧重要素主键 + * @return 事件侧重要素 + */ + public DcEventImportant selectDcEventImportantByEventId(String id); + + /** + * 查询事件侧重要素列表 + * + * @param dcEventImportant 事件侧重要素 + * @return 事件侧重要素集合 + */ + List selectDcEventImportantList(DcEventImportant dcEventImportant); + + /** + * 新增事件侧重要素 + * + * @param dcEventImportant 事件侧重要素 + * @return 结果 + */ + int insertDcEventImportant(DcEventImportant dcEventImportant); + + /** + * 修改事件侧重要素 + * + * @param dcEventImportant 事件侧重要素 + * @return 结果 + */ + int updateDcEventImportant(DcEventImportant dcEventImportant); + + /** + * 删除事件侧重要素 + * + * @param id 事件侧重要素主键 + * @return 结果 + */ + int deleteDcEventImportantByEventId(String id); + + /** + * 批量删除事件侧重要素 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + int deleteDcEventImportantByEventIds(String[] ids); +} diff --git a/zc-business/src/main/java/com/zc/business/service/IDcEventImportantFileService.java b/zc-business/src/main/java/com/zc/business/service/IDcEventImportantFileService.java new file mode 100644 index 00000000..f67f2899 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/service/IDcEventImportantFileService.java @@ -0,0 +1,61 @@ +package com.zc.business.service; + +import java.util.List; +import com.zc.business.domain.DcEventImportantFile; + +/** + * 重要事件文件内容Service接口 + * + * @author ruoyi + * @date 2024-04-12 + */ +public interface IDcEventImportantFileService +{ + /** + * 查询重要事件文件内容 + * + * @param id 重要事件文件内容主键 + * @return 重要事件文件内容 + */ + public DcEventImportantFile selectDcEventImportantFileByEventId(String id); + + /** + * 查询重要事件文件内容列表 + * + * @param dcEventImportantFile 重要事件文件内容 + * @return 重要事件文件内容集合 + */ + List selectDcEventImportantFileList(DcEventImportantFile dcEventImportantFile); + + /** + * 新增重要事件文件内容 + * + * @param dcEventImportantFile 重要事件文件内容 + * @return 结果 + */ + int insertDcEventImportantFile(DcEventImportantFile dcEventImportantFile); + + /** + * 修改重要事件文件内容 + * + * @param dcEventImportantFile 重要事件文件内容 + * @return 结果 + */ + int updateDcEventImportantFile(DcEventImportantFile dcEventImportantFile); + + /** + * 批量删除重要事件文件内容 + * + * @param ids 需要删除的重要事件文件内容主键集合 + * @return 结果 + */ + int deleteDcEventImportantFileByEventIds(String[] ids); + + /** + * 删除重要事件文件内容信息 + * + * @param id 重要事件文件内容主键 + * @return 结果 + */ + int deleteDcEventImportantFileByEventId(String id); +} diff --git a/zc-business/src/main/java/com/zc/business/service/IDcEventImportantService.java b/zc-business/src/main/java/com/zc/business/service/IDcEventImportantService.java new file mode 100644 index 00000000..b212e772 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/service/IDcEventImportantService.java @@ -0,0 +1,61 @@ +package com.zc.business.service; + +import java.util.List; +import com.zc.business.domain.DcEventImportant; + +/** + * 事件侧重要素Service接口 + * + * @author ruoyi + * @date 2024-04-11 + */ +public interface IDcEventImportantService +{ + /** + * 查询事件侧重要素 + * + * @param id 事件侧重要素主键 + * @return 事件侧重要素 + */ + public DcEventImportant selectDcEventImportantByEventId(String id); + + /** + * 查询事件侧重要素列表 + * + * @param dcEventImportant 事件侧重要素 + * @return 事件侧重要素集合 + */ + List selectDcEventImportantList(DcEventImportant dcEventImportant); + + /** + * 新增事件侧重要素 + * + * @param dcEventImportant 事件侧重要素 + * @return 结果 + */ + int insertDcEventImportant(DcEventImportant dcEventImportant); + + /** + * 修改事件侧重要素 + * + * @param dcEventImportant 事件侧重要素 + * @return 结果 + */ + int updateDcEventImportant(DcEventImportant dcEventImportant); + + /** + * 批量删除事件侧重要素 + * + * @param ids 需要删除的事件侧重要素主键集合 + * @return 结果 + */ + int deleteDcEventImportantByEventIds(String[] ids); + + /** + * 删除事件侧重要素信息 + * + * @param id 事件侧重要素主键 + * @return 结果 + */ + int deleteDcEventImportantByEventId(String id); +} diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEventImportantFileServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEventImportantFileServiceImpl.java new file mode 100644 index 00000000..586619f6 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEventImportantFileServiceImpl.java @@ -0,0 +1,120 @@ +package com.zc.business.service.impl; + +import java.util.Date; +import java.util.List; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.SecurityUtils; +import com.zc.business.domain.DcEventProcess; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.zc.business.mapper.DcEventImportantFileMapper; +import com.zc.business.domain.DcEventImportantFile; +import com.zc.business.service.IDcEventImportantFileService; + +/** + * 重要事件文件内容Service业务层处理 + * + * @author ruoyi + * @date 2024-04-12 + */ +@Service +public class DcEventImportantFileServiceImpl implements IDcEventImportantFileService +{ + @Autowired + private DcEventImportantFileMapper dcEventImportantFileMapper; + @Autowired + private DcEventProcessServiceImpl dcEventProcessService; + + /** + * 查询重要事件文件内容 + * + * @param id 重要事件文件内容主键 + * @return 重要事件文件内容 + */ + @Override + public DcEventImportantFile selectDcEventImportantFileByEventId(String id) + { + return dcEventImportantFileMapper.selectDcEventImportantFileByEventId(id); + } + + /** + * 查询重要事件文件内容列表 + * + * @param dcEventImportantFile 重要事件文件内容 + * @return 重要事件文件内容 + */ + @Override + public List selectDcEventImportantFileList(DcEventImportantFile dcEventImportantFile) + { + return dcEventImportantFileMapper.selectDcEventImportantFileList(dcEventImportantFile); + } + + /** + * 新增重要事件文件内容 + * + * @param dcEventImportantFile 重要事件文件内容 + * @return 结果 + */ + @Override + public int insertDcEventImportantFile(DcEventImportantFile dcEventImportantFile) + { + int i = dcEventImportantFileMapper.insertDcEventImportantFile(dcEventImportantFile); + if (i > 0){ + DcEventProcess dcEventProcess = new DcEventProcess(); + dcEventProcess.setEventId(dcEventImportantFile.getEventId()); + dcEventProcess.setOperationTime(new Date()); + dcEventProcess.setOperator(SecurityUtils.getUserId().toString()); + dcEventProcess.setSource(1); + dcEventProcess.setProcessType(4); + dcEventProcess.setProcessId(dcEventImportantFile.getId()); + String context = "重要事件"; + if ("1".equals(dcEventImportantFile.getType())){ + context = "重要事件初报"; + } else if ("2".equals(dcEventImportantFile.getType())){ + context = "重要事件续报"; + } else if ("3".equals(dcEventImportantFile.getType())){ + context = "重要事件终报"; + } + dcEventProcess.setContext(context); + dcEventProcessService.insertDcEventProcess(dcEventProcess); + + } + return i; + } + + /** + * 修改重要事件文件内容 + * + * @param dcEventImportantFile 重要事件文件内容 + * @return 结果 + */ + @Override + public int updateDcEventImportantFile(DcEventImportantFile dcEventImportantFile) + { + return dcEventImportantFileMapper.updateDcEventImportantFile(dcEventImportantFile); + } + + /** + * 批量删除重要事件文件内容 + * + * @param ids 需要删除的重要事件文件内容主键 + * @return 结果 + */ + @Override + public int deleteDcEventImportantFileByEventIds(String[] ids) + { + return dcEventImportantFileMapper.deleteDcEventImportantFileByEventIds(ids); + } + + /** + * 删除重要事件文件内容信息 + * + * @param eventId 重要事件文件内容主键 + * @return 结果 + */ + @Override + public int deleteDcEventImportantFileByEventId(String id) + { + return dcEventImportantFileMapper.deleteDcEventImportantFileByEventId(id); + } +} diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEventImportantServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEventImportantServiceImpl.java new file mode 100644 index 00000000..f828a8c2 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEventImportantServiceImpl.java @@ -0,0 +1,93 @@ +package com.zc.business.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.zc.business.mapper.DcEventImportantMapper; +import com.zc.business.domain.DcEventImportant; +import com.zc.business.service.IDcEventImportantService; + +/** + * 事件侧重要素Service业务层处理 + * + * @author ruoyi + * @date 2024-04-11 + */ +@Service +public class DcEventImportantServiceImpl implements IDcEventImportantService +{ + @Autowired + private DcEventImportantMapper dcEventImportantMapper; + + /** + * 查询事件侧重要素 + * + * @param id 事件侧重要素主键 + * @return 事件侧重要素 + */ + @Override + public DcEventImportant selectDcEventImportantByEventId(String id) + { + return dcEventImportantMapper.selectDcEventImportantByEventId(id); + } + + /** + * 查询事件侧重要素列表 + * + * @param dcEventImportant 事件侧重要素 + * @return 事件侧重要素 + */ + @Override + public List selectDcEventImportantList(DcEventImportant dcEventImportant) + { + return dcEventImportantMapper.selectDcEventImportantList(dcEventImportant); + } + + /** + * 新增事件侧重要素 + * + * @param dcEventImportant 事件侧重要素 + * @return 结果 + */ + @Override + public int insertDcEventImportant(DcEventImportant dcEventImportant) + { + return dcEventImportantMapper.insertDcEventImportant(dcEventImportant); + } + + /** + * 修改事件侧重要素 + * + * @param dcEventImportant 事件侧重要素 + * @return 结果 + */ + @Override + public int updateDcEventImportant(DcEventImportant dcEventImportant) + { + return dcEventImportantMapper.updateDcEventImportant(dcEventImportant); + } + + /** + * 批量删除事件侧重要素 + * + * @param ids 需要删除的事件侧重要素主键 + * @return 结果 + */ + @Override + public int deleteDcEventImportantByEventIds(String[] ids) + { + return dcEventImportantMapper.deleteDcEventImportantByEventIds(ids); + } + + /** + * 删除事件侧重要素信息 + * + * @param id 事件侧重要素主键 + * @return 结果 + */ + @Override + public int deleteDcEventImportantByEventId(String id) + { + return dcEventImportantMapper.deleteDcEventImportantByEventId(id); + } +} diff --git a/zc-business/src/main/java/com/zc/business/utils/PoiUtil.java b/zc-business/src/main/java/com/zc/business/utils/PoiUtil.java index e799f2ef..5727021c 100644 --- a/zc-business/src/main/java/com/zc/business/utils/PoiUtil.java +++ b/zc-business/src/main/java/com/zc/business/utils/PoiUtil.java @@ -5,6 +5,7 @@ import com.google.common.base.Strings; import org.apache.poi.openxml4j.opc.OPCPackage; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellReference; +import org.apache.poi.util.Units; import org.apache.poi.xddf.usermodel.chart.XDDFChartData; import org.apache.poi.xddf.usermodel.chart.XDDFDataSource; import org.apache.poi.xddf.usermodel.chart.XDDFDataSourcesFactory; @@ -18,10 +19,8 @@ import org.springframework.util.StringUtils; import java.io.*; import java.math.BigInteger; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.Map.Entry; /** * @author : LCheng @@ -30,8 +29,6 @@ import java.util.Map; */ public class PoiUtil { - public static int headingCount1 = 1; - public static int headingCount2 = 1; /** * 根据word模板导出 针对图表(柱状图,折线图,饼图等)的处理 @@ -365,5 +362,212 @@ public class PoiUtil { tocField.setInstr(tocFieldCode); tocField.setDirty(STOnOff.TRUE); } + + + /** + * 替换段落文本 + * @param document docx解析对象 + * @param textMap 需要替换的信息集合 + */ + public static void changeText(XWPFDocument document, Map textMap){ + //获取段落集合 + + + // 获取段落集合 + Iterator iterator = document.getParagraphsIterator(); + XWPFParagraph paragraph = null; + while (iterator.hasNext()) { + paragraph = iterator.next(); + // 判断此段落是否需要替换 + if (checkText(paragraph.getText())) { + replaceValue(paragraph, textMap); + } + } + } + + /*** + * @Description :检查文本中是否包含指定的字符(此处为“$”) + * @param text + * @return boolean + * @Date 2022/11/17 17:22 + */ + public static boolean checkText(String text) { + boolean check = false; + if (text.contains("$")) { + check = true; + } + return check; + } + + /** + * 替换图片 + * + * @param document + * @param picData + * @throws Exception + */ + + public static void changePic(XWPFDocument document, Map picData) throws Exception { + // 获取段落集合 + Iterator iterator = document.getParagraphsIterator(); + XWPFParagraph paragraph; + while (iterator.hasNext()) { + paragraph = iterator.next(); + // 判断此段落是否需要替换 + String text = paragraph.getText(); + if (checkText(text)) { + replacePicValue(paragraph, picData); + } + } + } + + /*** + * @Description :替换表格内的文字 + * @param document + * @param data + * @return void + * @Date 2022/11/18 11:29 + */ + public static void changeTableText(XWPFDocument document, Map data) { + // 获取文件的表格 + Iterator tableList = document.getTablesIterator(); + XWPFTable table; + List rows; + List cells; + // 循环所有需要进行替换的文本,进行替换 + while (tableList.hasNext()) { + table = tableList.next(); + if (checkText(table.getText())) { + rows = table.getRows(); + // 遍历表格,并替换模板 + for (XWPFTableRow row : rows) { + cells = row.getTableCells(); + for (XWPFTableCell cell : cells) { + // 判断单元格是否需要替换 + if (checkText(cell.getText())) { + List paragraphs = cell.getParagraphs(); + for (XWPFParagraph paragraph : paragraphs) { + replaceValue(paragraph, data); + } + } + } + } + } + } + } + + /*** + * @Description :替换表格内图片 + * @param document + * @param picData + * @return void + * @Date 2022/11/18 11:29 + */ + public static void changeTablePic(XWPFDocument document, Map picData) throws Exception { + // 获取文件的表格 + Iterator tableList = document.getTablesIterator(); + XWPFTable table; + List rows; + List cells; + // 循环所有需要进行替换的文本,进行替换 + while (tableList.hasNext()) { + table = tableList.next(); + if (checkText(table.getText())) { + rows = table.getRows(); + // 遍历表格,并替换模板 + for (XWPFTableRow row : rows) { + cells = row.getTableCells(); + for (XWPFTableCell cell : cells) { + // 判断单元格是否需要替换 + if (checkText(cell.getText())) { + List paragraphs = cell.getParagraphs(); + for (XWPFParagraph paragraph : paragraphs) { + replacePicValue(paragraph, picData); + } + } + } + } + } + } + } + + /*** + * @Description :替换内容 + * @param paragraph + * @param textMap + * @return void + * @Date 2022/11/18 11:33 + */ + public static void replaceValue(XWPFParagraph paragraph, Map textMap) { + XWPFRun run, nextRun; + String runsText; + List runs = paragraph.getRuns(); + for (int i = 0; i < runs.size(); i++) { + run = runs.get(i); + runsText = run.getText(0); + if (runsText.contains("${") || (runsText.contains("$") && runs.get(i + 1).getText(0).substring(0, 1).equals("{"))) { + while (!runsText.contains("}")) { + nextRun = runs.get(i + 1); + runsText = runsText + nextRun.getText(0); + //删除该节点下的数据 + paragraph.removeRun(i + 1); + } + Object value = changeValue(runsText, textMap); + //判断key在Map中是否存在 + if (textMap.containsKey(runsText)) { + if (value != null) { + run.setText(value.toString(), 0); + } else { + run.setText("", 0); + } + } else { + //如果匹配不到,则不修改 + run.setText(runsText, 0); + } + } + } + } + + /*** + * @Description :替换图片内容 + * @param paragraph + * @param picData + * @return void + * @Date 2022/11/18 11:33 + */ + public static void replacePicValue(XWPFParagraph paragraph, Map picData) throws Exception { + List runs = paragraph.getRuns(); + for (XWPFRun run : runs) { + Object value = changeValue(run.toString(), picData); + if (picData.containsKey(run.toString())) { + //清空内容 + run.setText("", 0); + FileInputStream is = new FileInputStream((String) value); + //图片宽度、高度 + int width = Units.toEMU(100), height = Units.toEMU(100); + //添加图片信息,段落高度需要在模板中自行调整 + run.addPicture(is, XWPFDocument.PICTURE_TYPE_PNG, (String) value, width, height); + } + } + } + + /*** + * @Description :匹配参数 + * @param value + * @param textMap + * @return java.lang.Object + * @Date 2022/11/18 11:33 + */ + public static Object changeValue(String value, Map textMap) { + Object valu = ""; + for (Map.Entry textSet : textMap.entrySet()) { + // 匹配模板与替换值 格式${key} + String key = textSet.getKey(); + if (value.contains(key)) { + valu = textSet.getValue(); + } + } + return valu; + } } diff --git a/zc-business/src/main/resources/mapper/business/DcEventImportantFileMapper.xml b/zc-business/src/main/resources/mapper/business/DcEventImportantFileMapper.xml new file mode 100644 index 00000000..5d16abf7 --- /dev/null +++ b/zc-business/src/main/resources/mapper/business/DcEventImportantFileMapper.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + select id,event_id, from_dept, create_time, title, to_dept, content, create_name, phone_number, issued, type from dc_event_important_file + + + + + + + + insert into dc_event_important_file + + event_id, + from_dept, + create_time, + title, + to_dept, + content, + create_name, + phone_number, + issued, + type, + + + #{eventId}, + #{fromDept}, + #{createTime}, + #{title}, + #{toDept}, + #{content}, + #{createName}, + #{phoneNumber}, + #{issued}, + #{type}, + + + + + update dc_event_important_file + + event_id = #{eventId}, + from_dept = #{fromDept}, + from_dept = #{fromDept}, + create_time = #{createTime}, + title = #{title}, + to_dept = #{toDept}, + content = #{content}, + create_name = #{createName}, + phone_number = #{phoneNumber}, + issued = #{issued}, + type = #{type}, + + where id = #{id} + + + + delete from dc_event_important_file where id = #{id} + + + + delete from dc_event_important_file where id in + + #{id} + + + \ No newline at end of file diff --git a/zc-business/src/main/resources/mapper/business/DcEventImportantMapper.xml b/zc-business/src/main/resources/mapper/business/DcEventImportantMapper.xml new file mode 100644 index 00000000..2e61910a --- /dev/null +++ b/zc-business/src/main/resources/mapper/business/DcEventImportantMapper.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + select id, event_id, plate_number, diversion_point, current_progress, take_steps, plan_status, traffic_police_status, medical_status, fire_status, board_status, chemicals_status, plan_level, chemicals_name, leakage_level from dc_event_important + + + + + + + + insert into dc_event_important + + event_id, + plate_number, + diversion_point, + current_progress, + take_steps, + plan_status, + traffic_police_status, + medical_status, + fire_status, + board_status, + chemicals_status, + plan_level, + chemicals_name, + leakage_level, + + + #{eventId}, + #{plateNumber}, + #{diversionPoint}, + #{currentProgress}, + #{takeSteps}, + #{planStatus}, + #{trafficPoliceStatus}, + #{medicalStatus}, + #{fireStatus}, + #{boardStatus}, + #{chemicalsStatus}, + #{planLevel}, + #{chemicalsName}, + #{leakageLevel}, + + + + + update dc_event_important + + event_id = #{eventId}, + plate_number = #{plateNumber}, + diversion_point = #{diversionPoint}, + current_progress = #{currentProgress}, + take_steps = #{takeSteps}, + plan_status = #{planStatus}, + traffic_police_status = #{trafficPoliceStatus}, + medical_status = #{medicalStatus}, + fire_status = #{fireStatus}, + board_status = #{boardStatus}, + chemicals_status = #{chemicalsStatus}, + plan_level = #{planLevel}, + chemicals_name = #{chemicalsName}, + leakage_level = #{leakageLevel}, + + where id = #{id} + + + + delete from dc_event_important where id = #{id} + + + + delete from dc_event_important where id in + + #{id} + + + \ No newline at end of file diff --git a/zc-business/src/main/resources/wordTemplate/importantTemplate.docx b/zc-business/src/main/resources/wordTemplate/importantTemplate.docx new file mode 100644 index 0000000000000000000000000000000000000000..c389ddbd2d2ea167d5acab4df06c3c8a853db509 GIT binary patch literal 18141 zcmeI4gL`Mm^6+C#Y}>YN+sVYqB$;Sp+Y{TiZQGjIHYRrRW_RzsyE}K^zu zcAsgTEiLeKK!C`z0DwNq|8My}{08dcM`e5I;YIGnUxapPBv)(rAz03Q2N5Y1c)RM! z$^#6w?rv`HrBj#%i);nxg5Tp2L0xCBEMTaGOuPH%j}-9wZ_U^?hl%(ux#79XtI)ERQB2JqxT zU$r@+_U%Wef@8(y;U`c9iyfqCuaE#r8j5*tsU8_g{<&^S5q0ctIhPn$Cov@6d=Vmb zwu8b#@5!89;*K|UsAI}3KqX#4xLHeH{M}kxUYnztQX)CMfurXrR8Y$FHa-r>|i3$EaGw1Fs0$dpJ25^eqiO@ptZ5gYd>{>RehocVm`2n-sfeb`_ z4ym{M5!^0In1O9-5F7JE79vjud@Q>!G(EuC!FK&|V)7@b*Ze zF~rE@?lo&U6l&JGc8@ZLYBHkIGQ$7*RnFw)qguYd0|Utat->a&c!IutXyMjJef;!M zVRdbdE$rxMe_Q{rqW&MQoqu`svKSdDUV1~WWbk^yk1S28ELB*TM?`uMMcI6EcO*7R>C z{5<+4<;D0`<0wV@@DIoh)+++n?F(F^vJu=qZD@{x~#&0<+Z)igr-^&h| zuFL&nBQ-jK|Ean>W#rm1g98BIiUR;3e7qwkYg;2aBWptk%a2a(x8ChkTkHFZD7pvT z4IldSLil-t(Kbv6t;?Z-tqX1K%%UQdnLo46MFDb5A-^C*z8P?Upp=BJkc1JU;C!c^-%3j^ABt&}$ zBXz6Fk=2el9i?PNZ=bIKSj|-jRaOTGhJ5~NO#o_ zd13ZczbkmF1&pnglk^HD%ZH+ieAD@(sfxla2Yxb6CcXZ2J7ztQ!qPDrBxmAdPS-ux zNfF+~8i{amHLB=!MJO$APsHhIA!jHjK`zU$t_C+!%;pRyMi~tOVV_-Z#C?@7z2Pd5 zl1CLw3s_DpN$X-1V3kS{-x0nBj6sHDsRZuqCXhpoXBR`ZW?37iAif6VJL6>H0>K^j z0oqntDqwn}nZb2D zUT;1|K6mo+KD@oXeGdwvJ3nuK3?&qT-_+FeF>CbC;;f0zjGMO#iibt=~XcL{qRA114_8jYbBJ()M=#mfOg; zw&Hecb8#z`;+?x2>{GT+oKIU+LK*orB5@>K)$fPN5AC#>>;g=((G*sVz$~dekx<-` zs*zxYJLOm#@Iz-s?q{h>JxdUzC6hD^+q%B4jPHkV( z2@jI7c?1f<;WFA=-K^iI7u>9IU+)(h4HZf7a(haPW8^D?G+i&$lZr1qZ(Lw85tRn{ zFqO*W88*h@U4x_s z4kBV2?Ed{rLOmf09Vi5m6ktzI0+3a72YejsR+c?5M;DG+2_!{bbwrBL&+@i#Qi&ze z?-mkD@)2^LIh{6h1(c8X=dm1bcI0K$rM|1kUw5F8RN~cE1lMm1qu;n?^k0hlc3ntV z2fnmexaP@O`5TTicra$d%hsb~P?(r=&W%e`CA)ys9zJTX`#iY^YckR-_Bfi5)6FvS zR>(zA)KE8!N(x~{QuwMLG^wU*9(<=5ltmdR%~&2F1&2($RACh^Bp@-C$DY7Y0z+CM zQCH$sdPhUDo-ns{Mzzpm77A-#?MZ5xZ3%5js#Ad)^0^Yf@vKLlbpenyCP(~?s|mM#Pd!pPQj=RKa6#6AXDTioX{W>qWY zYTqola6x1xHe#Tnoe6XTqEGbB3w{y|_FjXw&qa8`DnDJ>%v8Wt0uNZ8R&e_8Y;{!o zn<8{B4EcQ+t`61Ib6J=+j+6Vo=mA>QU!@3fuAFHj^)SEN`8kJ}}~%15Xnc85B&Vu+HTCojVD&}4Wvc2M1> z>E%%Vz<+`%1QkOL<`b8ilP%e;)zIt$vZbz+ttC{X#}9sT^JISOTW-?1dtBhu(;B5D z&vY-R*wQv2+d6b3{+7qw@Z(fWYgp&tqD8PdcqhM32~J#&yT3tRud$yd*y8XK(OM}% zCSsCw!%5toRM2z#93}a6FRgK|K~R+*f#?F_ihD>%9R9BL;kymGSD#UYK0-|Q>sJHi zefXFx2<|#|Q1&sq%h9OIe1eIaiuATVg%rOgI7lDms4cTkxr{+JXbs@KUg!}s5Cn3( z?oTlPq)yHAyC|g}&W*<>006{)TWluQ*7jD`_QrOe@5y1%cq{yybU*Udf9ylH=+Q{;GYpUJltuR!R()gylf;CE6KXLL|7Fa$v$ zqc~F4p^u>;_`PoxzB@`hCQM!#3MIGey1j%f9$)$E;!mo5va&Tyv56hi>K+mZtxc$C zWGbOaoZd`mja(Y2pe#Kw2x{mT0&@Y$>q;3;eW7^(FmYC2J52MiG{3Rq+#@xv^ z-;;vPI>N9*7n=jN6=*t5_sWl_RXVIRAyXn(P#abVU0Iu1!^<#tT1y`UqI?ysC@Tp> z?0)8Ma*i8m;Vf!nN*BQF-edsFQd`f*&)_ASzf)QUeMRToM87>*tbQqZd=}ooLXi1x zN-|LN^FAY-6k67%@sfJsCha7WnimEi9e~w8qKz6;RGkU_sAk2sCfaPyrb3}Qt<0{B zuLi6`wE#T$yF{?w(xE;U)wb$24 zVFE7AJBDRLH65wvLM9&-vM-%_hmjQ5aR!hoiP49bLjgUL9Ht<}`}_^;Dj=s=u<4d1 zv^;7%tn&>>Xc6U_=NmQRFU5>cQUyat~+rPV41r`tX!E;UW01F6Oz0Gs!+)Sd&)PPO}&DS zT~<^tM32~D@O@Lm(B|rY-YlbEz-alN`87Tr@$*@GXN&4u4txF7RLK&GUAx}Zbm><&tIiC9vpn+?C|(npLPm0~Xl=Hd0^nHnsEHMo!*EzP1U+0>@- z^=Yp`8bYp_Uf2z_+d)yX4KSI3(MNtKj6TmAyhyoOxD2G4|>fKd9!|4_8@klktn4>2vH$a8<-tl@-%=N+&}?5lyFg+?Aj9W z6geP`QrEnG<{7RDn!@NFUNe?(Nh~N7#pr;v`_*=yg5L|Je^M*wR$1Y z9@!i$Uq){dVZapLIJ*f;%^|5J#gJ5^LgIE6mgW1vkVDDpJ?D?pkA_8b*~)!)dlTwM z%LzD=wNph)1N+ViHz2j?dt^{pio~sU$eSjLEJ}e>C2M0ffH^#oy@^Is?!HHeE9U(aB@_j8MZE1u%wcBy4QMQ1?^B)_4F>y0QBLi`iwRQ zbM*UIfVXK|ae`o_O9SnePzJL<>-qVx{48fs^R7b=fXE$yU0{Dikt!q|AJ|Ia@s<4! zJrZRVJAg3E4vt21K31_!1D7dPf+vYwlRG^*joW&q*@BmjP{zqo`6=)%jbRcars0?| zjT^T~{*a^*bxHZ!qQQ9%wyBlJzM{BgS2?`3-7&rHr}iAs$~oUS6_Q;-LT-pK6h^i; zjxCuds`7;dRT`Pq`7|t8w?TbyE=Q5*nc7s-w2B8u@#`1qOxCXZ&b6Q|POBhCqsY)z z?Q!Ls%n=q%LJOR_i~ZREj0>b24+{VQ<=@S>y{WOKG2QQLhTolT zjd3d^G3-vYW3I3}*ajpnVg%Sw94t);;gIZYcAZG4pt18ZlL5$%Y@4##63TK{a>W%X zIF%J~`CFh1y$k{x6)6&(?DyogdZ$xJ^q3OmO+P1I&-aVS^y*37CLD%3G5Td7t*Ul;d#DoxshRvZTIz`Ggnv@cF z3Dw-ANQk{UncpF(l0vg)k(}`!M9b>rY3bq#r48Zw*?}5zFGM@TaKmAz>pe4{`m{zL z8`0hSC67TfLvY5^cZD~2InZ$;a3gUeU^7>JE)AVM%}w1}QC_2jmW+VT^i}Wq?ISOo zhAj680`q;tThv(bD(f6Om`M$e(U*ZfuedX|gk?3h>KzJC;UK9l&&Ate8NPva%~Ds) znX_ocGw=a-b-*PQwjfu}-Pz_xUsHR}Y*AmBG^hN9L`;D<9Id}(>PXX=sfoS; zl~G=Mrtg+#MjE;nlG=H`63Jv?8_^~=OjPPD;BF3#|HU)s38$m+y(zdl_@ zvudN>_If|s*}(NW2P+}`d6XFB#m(*hG)Lz3W-|$>i`Jy&?_?@W+#-25%^KN79|SOi zQYktO$v~r6Ht5sGFwYEYFBO3LbPQih&52qeU;(!dKZU5>_1#Y^p@%CQo%|R;2bSnl z(=f+Zo2|N|ngo@b9(>rz5Tl2#6sjd^^Z)rlW7fq{LBcHaetzVRF6M6K_% z`m+yNDVjez#6I~-t*af9ioi&x(|(Kt#LFP%NHP01L4Sr4Y@^w*Sm%eC&^~1w$_V!_ z=^E>gp&t!LyX4;*DrSgKM{ofxoyy;xkbg+%&G!`t_y0C~j6m_3d7*Dg@t!eoeHZ$f z6ibvM-1uhfhr%SU&LsM_L&W?9J^S+axvbHKc_Rl=9Y-{$Z z+Bb)(8+L3z@z)8X_AfNgTN9pH8&-FYUDidpj>`8R((qznI!(`!>@pb}as$J(qYI>@ z=yMhVMVJ_*2f*)${q;%Ldq9Cw84$HSgjJf5wn6$-!~FS8%78-A1u!LF)) z7x^}4*ta*$B@t%}7E6A_nL#Ory24Zkr#Xjej(hb@@&3uC$X7oOfUg(}(L_M|-aS6~ zYQ`Xgbum35{;C>Gix81u4lF@m(zt<<5LNC*w@9TPPj(PMj4eg(d;i{uS5bfqvXIo1 z$9AcqD(Mf4NH}B!E`4h}hb4Xs!zryo%EceKi0cHT3pc|20Vz01OYxa1-8UC(8V-61 z{_H0bEy8x6l$tOi9q4O)U3Zq^&MVDADIS#=^OFXwlPNguw$NJ_e+c14fC3Sv=Q>1w zLa{v*ln{Sy@b>eM26ZJM|5T1>@C0sNPPLSJQyv#YLC&67WQmC{ko}`r9=;}@kxRFy zEXJX~jFC}PBNL;PD)wfH#LeHq{+8D4nFo1)jo8k=TLyeQ!#HSV9s zh=NL`YDqLHwJpXh_H`-O+d*sCHn*AeBr%_dESp?euiufpd>9Y_UrU#PecX74fNoU3hHCyTX{D9w zce#a2M)kD%&x)2YITbZ?+YDdPI@_L}H+0r@>ogX+Ywn)c8;@wI zV(&!SCn*6M9h69M+F02RjAvGH??&rr?xTCr4E8Aj(Hva4TC!}TrFBv_R(sb*q$_}w* zpX9-NenJx-Sxi;D!@wTBLq{(4@?V@y@p(Jw2+TcdF6=G6_Va#K6z3t=@TZ<|(}Nii z#Id_=ZE59XmhmWJ?KFX$dP9ylX-VB2j~m6q#LxFo@s_EPf#qVx-}O-8rgfDBEtIbH z+%speY#VME&OWS&y;V`W(4YPc#5zNazE$#OQ#5l@e7jGjcts2i4St(De%p`V)xy%nuPH7x}9ft@W~H_xr2xG^Jze zegAJ|+qsYY8t+v>qTlLA8`lQQ{AyS=P_rgwYC0!yTP9r^vBtjn^VTQJElWnGi z;pOGC)==|6aW8X9Wm)<(o_^w@Eke+!4j?}whvCnup6n*uywl@bCl{QjdZvlxMU& zK)xNq044S&4U99=B^UAxvt1V=PpqscOc01ZMcWt6Pyan*P<^1Mm^F=1$IO@rI)o)U zfhZU`O^OIXxR+;E>OgZ6`ivpS0hj?KtnAxW9yx@`fKYf`QT%oG0zf|i;~qjs zLt#Jqkkj6xEM<&7tFRGo7iuZ=aGV1M1BC&heo&#dac6ACgDA;v;nO6CNfHAE zQU?%;Ff)9fy-gJmg`O#S{Kww7uzF%~R>pkxE#%rFTUpoHc}T0H{-maWEDS!z;QdHcFf@KTkTH*6BVbRM!fVU7Z9|-%M~oHI;N9G zC&$&FXJFMs9>vp-C#mj=8XBZ;$Nxr?=F1p5=e#92$)j3I%#b3CIgJ^Gu1Sx$fVfOb zj5Z+jnHpr?kE9mrn8ko?m^;h^bH`^(hAC9IZI?2~>aB)Tq|O+Dl}G~D219R&yg3$r zc~K%8-#lbIL{T1cIN%aut7uO=OfnltpD0g93c^M54hj3pW#HWrXd|i=;wA-L=&16ZU+cg z?HThU2sOvjUysn|M+M;x63GN}=D)lf)n>5^&)@6^t%YB=GS(rZ>|^HuoFng2x7`>vFb0 zmN=@uW(Py?y+zyu8pL3IrmDEZpLj6{`u8O$u>FhnD=ty$X@ z3SU~~?Mz$Ep~EzY@5A8#6^0285nPl1>=Sg%CryQii5>%R_##3?uHqb6Fl*%$81X)Y z%pS3XfVVI+nDm7H#f5BGQ)o-r%LZ6{H^NgadGJ6;=4}T(Ly>CsDf#~3{^KInDQrUv z+o?@CoGhIx)=ffwMs(hHK}@}RwH5S0Z-C+|Z*-FCr-JN61&XRz(E&w4hVKK>bB<#% z*9hji?bLKn@4PpOwmVANYHJ!Cw!#w4R#&^HHSh0zE}aHztIKUEmktf(siz#a4(gMe zwj4l~$;cwB#7EH31+;XmF0D>Wj?T2SvHSbvPMXtMvoZ~@XA-Jj(WxwzsZUjS)6b+! zkxuT{hz}1L?AIl3sfkSOJY|(86_jSUnF2xP*KZXVr}oT~uOf}3BV~<~D@INASo5qw zdxLVlujlqi&6@6OG`UVZX6e>fj}A6sn#^ji>7N~wPw#i;Hl6}2P(?gzPfRCgx>rce ztb!76VN&T?^(^`V6N%3zVM_~xh{DI~zMMQr?}()&nQe>5GRfeYnHLmiG`OvPk%?Ao zEbaecD7P^$qOkELRX6g%DQ_C$jCSdZRoi1AK$%#NJ<58<+GiuUHS=lREV_whj}D61 zptp()7!rHU&(LhGWMAFNbldpir#1{H?lZ~8gb>|xrM!qT_u;G5BKMx0Gv5r9+lE%o zDObp3X69ZUj=WzDyNV9!*f;nqx__XT_t>B{S69eCf{Y@(HQMV4hUZGb_1-ATPb5t7 zy~IG~0HHoXnD2WPD5t-Femd^_N9Ps>-yS%@4+OT<{zXck;eG5J0tarR0ST4*G3@ za{)&V@WQFP+i^R)d2~3i|C|Zy1B7&ujs%Zn#&Lg{zVE!>dR0i_31q$n!IzCBe0Qdw ztm&V=b3C3j6P|&4@EtHX2qQxn?pxS3;UXNi>{z^Vsl&%et%)*@TxsRv+VL46{!H%9 zYRKy`@yea^tzg8Oj2T%Nx6rOZTx!_^ZJ9^TSER=yr66ZoLH#FT&o+rk6F5J@HB!cv z#+{F8SVgp8$aXKzEd`XCw+FT!8o&UrM;8Mui=kFrnXS6_PFNx~sxrG{d@+D8cEBP| z{B4w%(IpfWOpRVdZ#<^uXbmxuUCczOaOl^~H^h7N;kSsF+(b48xglm`Vts)OdLTKU zz0MrEJ-pj!-lDS_$SXh7MX{b%pmV-LrkEfN%1%PA(VsUv(5+g&Go27iO+oPTDnpUZqeP-8{ugF&G31UzZ?nHMR(LbH} zcgh=MIiJ_uPfiuBQfm04Bx+bVqCp!SRK9n{gHb1JgzA>pt3K5HJe5Gu>(k+M>wne4 zlxD2najqhQBVq0EaEYhS2*$VNcD|FgPMZq;T!o+YZ7=9D4fLj#BYdNPS>5veMjI5U zz5Bq0nl}=5K=Pxn(&2uvC+H1b#EKQieo{n**sHW_;B2CN`+>+h>oKqFDH{@2zHWn) zT@opH%1U@uUr+*^-IROZw-!q>6UsU6G4;;>Ea#AQsf2U5Sqy9cpbV~SY^mOs8;|XJKzzEq8jF5RCVWA z(M{=Q2cx>2+Uf#QwPOYQ;J7+|xfapNk+$-UP0X6>d|xm802PViBHyN#{p8G;X`(ji z%k1c(kXp*ZH)4Wn{L)=SA!|G!v+bss8sIdc@90HAr|V~TAx|AvoNEUY$P3YP4tQL;+MSl}TN=0|6A3$T7YrHq=?!u>;;Fn!PVM!#4VfRPE$H%59ACe zcBYP9ns*%2qp@{dRy+v}Y57f7tmX~1!PeU@A#Y+e3*)5Amu}Bqb>xT;pu&8q(|}6V zt5GvjQns`(8rB@c_T3S~%PpH07mXRgY{}Akh67H>Qx4dvPa@%G&wL4OXDRW~?iF25 ze_EdOo+OL#y?#ksLYJEiYCD!a3Li}sc7 zYewmQ0{6n%StgV@E}RSFsE`wmI#Bwp9;E$z0QXofyTg(}zulrn-F_vX+s?Q`Z;lioWxa~iv7?_ChqH2^ z`y&&`WAW(}NmN`)^lFZ*uIJNB($c!-YcR~;L~}vq#IFt^9trc<`nqk+ z1X?8@q}TVlcebIdz{Q&la5&Q}(Ad=oy+jKqN=P+mPxkaY;`|8?B2<@Efg>n2G(=au z8mbp>(?nmHZc3vb>?eA?Nv)QNV-AOXAFODXo07k*8+CBg$)9CkP7K7zpm~I`;Z;dQ zURp_2FEH!5D61l`8#CZK&_SP9qF-3jwxt-)N}fAWLq>9}YumE;Rm5{2sw3iFR~bs! z6b?0wt7XLQHcZ3AE}wo$e#Z#A$Qln#2*83{F%ch)ks)=SG7(`>yOed;%~10`w!g-( zd$gJ`q>a2JWCGohHIe+%$w;(}eG1cVXgli!5Bg(-1^vVUy;#Gk5aoxQoeuT$!i1Vb zC+KN@l372+Z9oO_zC=89))l!0t&%YEC8Y|S5x*myuTb9Me)x=B^risVgY;K zKG+p@%DlyoUlz_^89|U`1p=VGqO7L)TtTScw$F;-eH@h?aPxw4d#>0&V9O7Q7Jrla z2lQJ(TV?sx5d{L!KcJ7BE#Vwo>{ZZrN&A3VBcLdL`~7iue?q@K)h|z2w^YbmYu2Lb z6|DQrtaDeX+T5~6t*m@3bL;t&(tH+2WqxGr*i)#N;-FDyM<$FY-rC-;%511fvxqe< zywY|q9=Yf`KQpaH-aRh1BU>=t9Q0><1xa_xh)(LTnv^fGb>;X>DM@#kT_w$v zs+6z3O(o4CWhZr|F+wi_`6{XjWk68iw&iq-BDUi}pV&MpE%J2}_CrddV~b<&xvymK0T(nX*e=O$602 z#zEpTM4@%mnV`z6Fg|XHR?9qQd0k-~q-?gyVwn85{dmkontI9b(S$L@otk{o;txJ{ z_O5$L`r|SGbw)FPz*x%Uk26gc#S-S)4YR}!lYmRX)rtQu^H=&`WsKtfeexd#d|aII zx9k3Xvi!G;FXTYj*&K`$6H4qiyB)5AN*rJudFk%1uxC@iU6^h*TOLy>Q#D?EtsIN7 zxOL>ce3rgRb`NviE6C4sPALN`!RtUK&RKUQq1rlP^EgWUT-6yBEzY)pAInyTFa626PE5I^TVu#i-oY8DBO@ZH6hU_+UdVy|=n z)2ZY>ndSWQM_J8d9O%bH30-)L#a_hAMc!g`2UX*_d9Cb5`f$lygUUu=!mgI}x@xI< z2Y$J!+2a$_+$fg41|?y-Iefc=fUufw29d{n>cd3xTV^}>gdoed6ka!ViI|laf0i9L0%a(u%vBJ z_yT$+>WqW3ov@dAO!?hX3*AeO(YAw|h`!xG;^kM3%Zp^*C?qx3n;G20{5dX^sMk8) z1zc2pwaI$8c$k!f<-?Qnb;AIBLvO6`3xG`b`FyAXlAVW@y5_|P~P<@$dyPsc=MTcbZCVFB;=GjV}>a6 zKb$!GB#>e~3j$?%pv{>y!N%re%)8;@v;!5t=O*Z*dZ<&FEbSJug~cM8IKDNPJD`@s#n135KvR2fWNy}< zphFu-NDbp*npIsk4l9nJHzB&)vwO#_N%Ma)GnDbT)lELE#LP?SP-*ZWS@jfxRkIM1 z-B2@-9d~SVz0}LCX>qJ5)3|@Zk*SG|TBD96D$q7a*dw#ZPJ>#K=aUm*&m6)llarfN zzeIjuit*+pzjv`EtGI22ky353ye-zIsa#o!ejj~Ox#l!0DlI!t>DNeJYCQ=gkY4I| z8Kvud+g8){x{R!RyIb&jef$!r!fgl#-D%8&ZyhLUkWwsidfP$ngetY_7%??|)lGTv z_~>dqmiPr3>U>5_c##~as#OPpfhW6{^g!ONEjz$E31-L3H5`RxxI!al?OjSSK5sIV zOfn`~BWBu3I>vhB$?!WdNCw8sQzPH|{YA&mj;9^#x5uE3#uA0p_=K(2A7wYKTy|yo zfHXL|>w2y0&wFYR_hK5syQm%*TY>zikU;I;3JTpU{gilTTmR1qh&%L%#_WM8^X4FS)smPYHpg}P1~Pbo9d$e`B_2NGcHQ(J6Pp* z5*(%)H-CL8UUH6_QXr7+alYKyp?c43Gjwy6BR4yCsS0)dp|ZOYpGG;{5lJa2u*(c` z*HkUwp@sv(^sz=W&1dLmJ0n>2Iax09ZG~s3z7mSP!kgUpe;hjinHfLg`v}}i|Cq2r z{`c5{ld*x)UuI>}X2z|0=%K-XKIgRy#dGCV`N)fGG0H5vtN{D>4>?rfQQYdVP+yAChD}3rB;jS8jogBcO4)L{3UnA<84~a+sIgkHU1X| z{vJwMmn1tep8iXXb+w8|VALJ&N0_Qv8|*J-6M?(CQ`IJEwQZd9&}r{1OaNp0$P8XB zH_-{mc>{30<>O^LeuT;WB@oWaURmG3!uYo^im~`f>mT&UgBRj2 zaH{88X*Yv4=4*8hRQTCunu8e4AuH;Aj>cq`PCElWz=Gmw(dqjK_BGsC;*3!q0)NG)6g;yeGdxT(O;n?)eQGZ1dN+rA`#ISrw zi;$OoA|||SJ`-H5W5lQqg~Edlj)ZH@lpizLvHpZjAu?ekF3PBuT9(7QMTic0Zb+dr z!7O=8PG~{8GmGX=ehHfB4sTszR1+K)XX})OF>OjaRYbZ;3&HHcU0$$djM;ESeH@jQ zB5PM5x*7k;>^D7chlF=;qmX*~6* zoJ?o{^jJ(%LIqx41R$*HO@;b)9Qty0(E-Xe3vp#U<&(4~w8Ea3D0#vrx?C4UVQ?}i zQD0MEgeH@y!iq0vA!%7RSXpUhsi?!~{HIrV$dG#V7WjgFz#L-E$?~4Vln{iFSNg`t zXnf8fd&!vW6mcWGhH@f^Y`57n&EkGDEga*eD@^d@{<%rU%(F4YRE?~L2hqV72SuEX z!?F3IFUu4mpo9x(m6aVGO!)H1cvM=r-y)}UVhU@zh7`iG40d+aD2OUG1|UcnD*cCy zve)~tqfcDcxL*kg3m?IS9oma9b6`Wob)!i7XIMmXDqDKCR4Gw82ozPR5?nQ^n{Lb9 zC=y_Epg=SQ1skQ7SzA0xqSY%c^=id)&dm{-zLRcETz91RIf@|4xriIs1P=yh6O4rJ z+=KN9MRbSYQ&;dCNZ5fmd&dkx(1eHFRMQ8s9TJd^3NEWL=U(a6fa#pom%+UeqDU2nxNCwA(#Y1gp4 zH@TO7d2=14=~J%Rn!qYtM84jCnzLOAOx04gs3;w^rhGk!gk4S9N!ZJz9YUn!NoiQ% zP9cY@B6sruX6)})l;0N~=69L0koiRRBi%={2B#1`<=(gZM|2B#zXc=#+H3IFB)d%bJjPnVEaMbID@bDCM$l4fxnv`IM#p(fD z&#-Pe1UgR4K@KEb@H1e!2tM0rVf3f*r2s92y;lL*NDm>YZYJqPZ0VrS=OU!X`9_Yk zFzn&OV+%n-)zv16BI~Myi!QaI1@49_&p5EGicD^a`-q<>H;;1L<;bz&gwFlF?PBl8hJ%ej!K>vhT?L;XeRLu;Edi`iz#%$?~v( zE+@nYW7b9xYsA{hk^%ZS^>DYc`_H5I04KpB9v`|m`=N{Qf7L~O8=K#{ga4`GhaP?` zX^OumDz_0`!YQ1W|9~RTDyLEg!FEC$_VN>ewc7<+!f;HyXTW$p zZ+8;odrh}$A4NTl10|YfG(=!ZbIA-MUAnvFG$|`xC{o}BWVs;ArJvq9RYqt2dnhFt zm)B+Ss>{rdyunGh_|QeG1d|GFeHR$2WTHQX!*_Qbcs~5aU`(P+z>`nTjshaQd|>lx zRaV0Aj0(Q)j>0z(y#e>4QqkmEo`uFX(<&5h4~%IJ*Iff*-U*92?l7EZ>`UlEO>+%w zGiXNC!JH5qr)w|}4T|X6Kc3nUNeQd)faWW1d(Iymrtn1RP(LxY6}DjMZ0FLg8KVt* z-m!5k-)R(@oCKUor>BMA<2vX`QB!If{bYo<5qc+0lFc-+3_pGz+Yn9MReBdcYA_Sn zP_y5_2BmMqefx;k`S0cvlE&Dz;zMQCK!5+dz+akA2RnOf%l~QZ9~%4Hx@}hABdY-& zZ1Xwq6?~UV4;m!co6^T9mDMahW?!>e5Ao|jgGDS&`qRbD6`NizcK*T(&S5tM3WW zX;`$<#=>~Sjk=p-(n_>!5iZt>vX-trj-@zFN;cW*14K{A2J~|9dOY2?%{aETRIhLg z5xcbX^)k4b{rE?_hwdX+p%tK)@|}_jL-bbDXca2}zvk2cjqM&}L1wWz##9`Y#$X=P%2ltkkynKmIWFuo$s5G$UW^x!X*bbW;zxK+ zOtaQTsu}3elrI^gduH`_`)f_kyB*8c1?YR7_VvB)Qp-rLWFS;rW6Ul&nJE{6a-uJT z)9uk;6%2)F0mz8j%;|~Z!&?ASIFKIj*T7&a}+fwPr_)B1)(wj%^ULjgw5sGkRA5+F6L+Z-uGx zK9ufQz~A%w|0vNdDd*pB Date: Mon, 15 Apr 2024 10:48:13 +0800 Subject: [PATCH 16/18] =?UTF-8?q?=E9=99=84=E8=BF=91=E7=9B=B8=E6=9C=BA?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DcEventImportantFileController.java | 9 +++++++++ .../zc/business/controller/VideoController.java | 13 +++++++++++-- .../com/zc/business/mapper/DcDeviceMapper.java | 4 +++- .../mapper/DcEventImportantFileMapper.java | 10 ++++++++++ .../zc/business/service/IDcDeviceService.java | 2 ++ .../service/IDcEventImportantFileService.java | 10 ++++++++++ .../service/impl/DcDeviceServiceImpl.java | 5 +++++ .../impl/DcEventImportantFileServiceImpl.java | 17 ++++++++++++++++- .../mapper/business/DcDeviceMapper.xml | 11 +++++++++++ .../business/DcEventImportantFileMapper.xml | 7 ++++++- 10 files changed, 83 insertions(+), 5 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/DcEventImportantFileController.java b/zc-business/src/main/java/com/zc/business/controller/DcEventImportantFileController.java index e72348a5..2ea37c94 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcEventImportantFileController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcEventImportantFileController.java @@ -162,4 +162,13 @@ public class DcEventImportantFileController extends BaseController { return toAjax(dcEventImportantFileService.deleteDcEventImportantFileByEventIds(ids)); } + + /** + * 获取重要事件状态 + */ + @ApiOperation("获取重要事件状态") + @GetMapping("/getImportantFileStatus/{eventId}") + public AjaxResult getImportantFileStatus(@PathVariable("eventId") String eventId){ + return dcEventImportantFileService.getImportantFileStatus(eventId); + } } diff --git a/zc-business/src/main/java/com/zc/business/controller/VideoController.java b/zc-business/src/main/java/com/zc/business/controller/VideoController.java index 7c374ad6..9365d7f6 100644 --- a/zc-business/src/main/java/com/zc/business/controller/VideoController.java +++ b/zc-business/src/main/java/com/zc/business/controller/VideoController.java @@ -401,7 +401,7 @@ public class VideoController extends BaseController { public Object nearCamPileNum(@ApiParam(value = "桩号", name = "pileNum", required = true) String pileNum) throws HttpException, IOException { // 获取济菏运管中心相机信息 - JSONObject camInfo = getCamByDept("1301730"); + /*JSONObject camInfo = getCamByDept("1301730"); if (!camInfo.containsKey("data")) { return camInfo; @@ -435,8 +435,17 @@ public class VideoController extends BaseController { .filter(item -> "1".equals(item.get("camOrientation")) && Integer.parseInt(item.get("distance").toString()) < 2000) .sorted(comparing(item -> Integer.parseInt(item.get("distance").toString()))) .collect(Collectors.toList()); - result.put("downCamera",downCameraList); + result.put("downCamera",downCameraList);*/ + + Map result = new HashMap<>(); + Integer pileNumDistance = pileNumTransformMetre(pileNum); + String startMileage = String.valueOf(pileNumDistance - 2000); + String endMileage = String.valueOf(pileNumDistance + 2000); + List upCameraList = iDcDeviceService.selectNearCamPile("1",startMileage,endMileage); + List downCameraList = iDcDeviceService.selectNearCamPile("3",startMileage,endMileage); + result.put("upCamera",upCameraList); + result.put("downCamera",downCameraList); return AjaxResult.success(result); } diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcDeviceMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcDeviceMapper.java index 13576c48..3caf756f 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcDeviceMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcDeviceMapper.java @@ -3,8 +3,10 @@ package com.zc.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zc.business.domain.DcDevice; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Map; /** * 设备Mapper接口 @@ -18,5 +20,5 @@ public interface DcDeviceMapper extends BaseMapper { List numberOfDevicesByType(DcDevice dcDevice); List numberOfDevicesByType(); - + List selectNearCamPile(@Param("direction") String direction,@Param("startMileage") String startMileage,@Param("endMileage") String endMileage); } diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcEventImportantFileMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcEventImportantFileMapper.java index af094b3b..56e388eb 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcEventImportantFileMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcEventImportantFileMapper.java @@ -1,6 +1,8 @@ package com.zc.business.mapper; import java.util.List; + +import com.ruoyi.common.core.domain.AjaxResult; import com.zc.business.domain.DcEventImportantFile; /** @@ -58,4 +60,12 @@ public interface DcEventImportantFileMapper * @return 结果 */ int deleteDcEventImportantFileByEventIds(String[] ids); + + /** + * 获取重要事件状态 + * + * @param eventId 事件id + * @return 结果 + */ + int getImportantFileStatus(String eventId); } diff --git a/zc-business/src/main/java/com/zc/business/service/IDcDeviceService.java b/zc-business/src/main/java/com/zc/business/service/IDcDeviceService.java index 5144990d..b3eb5f00 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcDeviceService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcDeviceService.java @@ -81,4 +81,6 @@ public interface IDcDeviceService extends IService { List numberOfDevicesByType(DcDevice dcDevice); List numberOfDevicesByType(); + + List selectNearCamPile(String direction,String startMileage,String endMileage); } diff --git a/zc-business/src/main/java/com/zc/business/service/IDcEventImportantFileService.java b/zc-business/src/main/java/com/zc/business/service/IDcEventImportantFileService.java index f67f2899..223b11de 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcEventImportantFileService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcEventImportantFileService.java @@ -1,6 +1,8 @@ package com.zc.business.service; import java.util.List; + +import com.ruoyi.common.core.domain.AjaxResult; import com.zc.business.domain.DcEventImportantFile; /** @@ -58,4 +60,12 @@ public interface IDcEventImportantFileService * @return 结果 */ int deleteDcEventImportantFileByEventId(String id); + + /** + * 获取重要事件状态 + * + * @param eventId 事件id + * @return 结果 + */ + AjaxResult getImportantFileStatus(String eventId); } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcDeviceServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcDeviceServiceImpl.java index 77460775..f6e446e3 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcDeviceServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcDeviceServiceImpl.java @@ -467,5 +467,10 @@ public class DcDeviceServiceImpl extends ServiceImpl i } return null; } + + @Override + public List selectNearCamPile(String direction,String startMileage,String endMileage){ + return dcDeviceMapper.selectNearCamPile(direction,startMileage,endMileage); + } } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcEventImportantFileServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcEventImportantFileServiceImpl.java index 586619f6..07fae61e 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcEventImportantFileServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcEventImportantFileServiceImpl.java @@ -2,6 +2,8 @@ package com.zc.business.service.impl; import java.util.Date; import java.util.List; + +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.zc.business.domain.DcEventProcess; @@ -109,7 +111,7 @@ public class DcEventImportantFileServiceImpl implements IDcEventImportantFileSer /** * 删除重要事件文件内容信息 * - * @param eventId 重要事件文件内容主键 + * @param id 重要事件文件内容主键 * @return 结果 */ @Override @@ -117,4 +119,17 @@ public class DcEventImportantFileServiceImpl implements IDcEventImportantFileSer { return dcEventImportantFileMapper.deleteDcEventImportantFileByEventId(id); } + + /** + * 获取重要事件状态 + * + * @param eventId 事件id + * @return 结果 + */ + @Override + public AjaxResult getImportantFileStatus(String eventId){ + int num = dcEventImportantFileMapper.getImportantFileStatus(eventId); + return AjaxResult.success(num); + } + } diff --git a/zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml b/zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml index fcf49c66..28b3fc01 100644 --- a/zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml @@ -118,4 +118,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" GROUP BY device_type, child_type; + + diff --git a/zc-business/src/main/resources/mapper/business/DcEventImportantFileMapper.xml b/zc-business/src/main/resources/mapper/business/DcEventImportantFileMapper.xml index 5d16abf7..42c51df5 100644 --- a/zc-business/src/main/resources/mapper/business/DcEventImportantFileMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcEventImportantFileMapper.xml @@ -41,7 +41,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where id = #{id} - + + insert into dc_event_important_file From 4c094f21329f4c7e3c6d3d844530b76c2100d238 Mon Sep 17 00:00:00 2001 From: wangsixiang <2970484253@qq.com> Date: Mon, 15 Apr 2024 14:41:15 +0800 Subject: [PATCH 17/18] =?UTF-8?q?=E6=8E=A8=E9=80=81=E6=95=B4=E5=92=8C,?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E7=BB=91=E5=AE=9A=E8=B0=83=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DcWarningController.java | 13 ++- .../zc/business/controller/MsmController.java | 71 +++++++++++++- .../zc/business/controller/WeiboAuthUtil.java | 95 +++++++++++++++++++ .../com/zc/business/domain/DcDispatch.java | 36 +++++++ .../business/domain/DcDispatchResource.java | 79 +++++++++++++++ .../com/zc/business/domain/DcVehicles.java | 2 +- .../zc/business/mapper/DcWarningMapper.java | 6 ++ .../business/service/IDcWarningService.java | 6 ++ .../service/impl/DcWarningServiceImpl.java | 72 +++++++++++++- .../business/service/impl/MsmServiceImpl.java | 1 - .../mapper/business/DcWarningMapper.xml | 39 +++++++- 11 files changed, 412 insertions(+), 8 deletions(-) create mode 100644 zc-business/src/main/java/com/zc/business/controller/WeiboAuthUtil.java create mode 100644 zc-business/src/main/java/com/zc/business/domain/DcDispatchResource.java diff --git a/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java b/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java index a102cdca..aa45c5f4 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcWarningController.java @@ -2,6 +2,8 @@ package com.zc.business.controller; import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.uuid.IdUtils; +import com.zc.business.domain.DcDispatch; +import com.zc.business.domain.DcDispatchResource; import com.zc.business.domain.DcWarningBatchConvert; import com.zc.business.service.IDcWarningService; import com.ruoyi.common.annotation.Log; @@ -156,5 +158,14 @@ public class DcWarningController extends BaseController } return (dcWarningService.commandAndDispatch(dcWarning)); } - + //指挥调度记录新增 + @PostMapping("/insertDispatch") + public AjaxResult insertDispatch(@RequestBody DcDispatch dcDispatch){ + return AjaxResult.success(dcWarningService.insertDispatch(dcDispatch)); + } + //指挥调度资源新增 + @PostMapping("/insertSource") + public AjaxResult insertDispatchSource(@RequestBody DcDispatchResource dcDispatchResource){ + return toAjax(dcWarningService.insertDispatchSource(dcDispatchResource)); + } } diff --git a/zc-business/src/main/java/com/zc/business/controller/MsmController.java b/zc-business/src/main/java/com/zc/business/controller/MsmController.java index 128bd52f..10a3070d 100644 --- a/zc-business/src/main/java/com/zc/business/controller/MsmController.java +++ b/zc-business/src/main/java/com/zc/business/controller/MsmController.java @@ -1,15 +1,22 @@ package com.zc.business.controller; +import com.alibaba.fastjson.JSONArray; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.zc.business.domain.DcWarning; import com.zc.business.service.IMsmService; +import com.zc.business.utils.HttpUtil; +import org.apache.commons.lang3.StringUtils; +import org.omg.CORBA.INTERNAL; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.lang.reflect.Array; +import java.rmi.MarshalledObject; +import java.util.ArrayList; import java.util.HashMap; /** @@ -26,13 +33,71 @@ public class MsmController extends BaseController { * 短信推送业务,阿里云短信业务 */ @PostMapping("/push") - public Boolean alibabaCloudSms() + public Boolean alibabaCloudSms(@RequestBody HashMap map) { - return msmService.send("19806114248"); + String type = map.get("type").toString(); + if (map==null|| StringUtils.isBlank(map.get("phone").toString())){ + return false; + } + String string = map.get("phone").toString(); + return msmService.send(string); } + //调用微信推送 @PostMapping("/wenXinPush") - public AjaxResult commandAndDispatch(){ + public AjaxResult commandAndDispatch(@RequestBody HashMap map){ return AjaxResult.success(msmService.wenXinSend("wx9ee0e3babfd8d2af","de2ecb80b30d63135918ba3ae6ffb711")); } + //整合推送 + @PostMapping("/pushAll") + public AjaxResult pushAll(@RequestBody HashMap map) + { + if (map == null || StringUtils.isBlank(map.get("type").toString())) { + return AjaxResult.error("参数错误"); + } + ArrayList array = (ArrayList) map.get("type"); + Boolean send = null; + Integer data = null; + String weiXin = "微信推送失败"; // 初始化为成功状态 + String message = "短信推送失败"; // 初始化为失败状态 + for (String type : array) { + if ("1".equals(type)) { //短信 + if (map == null || StringUtils.isBlank(map.get("phone").toString())) { + return AjaxResult.error("手机号为空"); + } + String string = map.get("phone").toString(); + send = msmService.send(string); + continue; + } + if ("2".equals(type)) { //微信 + JSONArray objects = msmService.wenXinSend("wx9ee0e3babfd8d2af", "de2ecb80b30d63135918ba3ae6ffb711"); + data = (Integer) objects.get(0); + continue; + } + } + if (send==null){ + message=null; + }else if (send){ + message = "短信推送成功"; // 如果 send 为 true,则短信推送成功 + } + if (data==null){ + weiXin=null; + }else if (data==0){ + weiXin = "微信推送成功"; // 如果所有 dateValue 都为0,则微信推送成功 + } + if (message!=null&&"短信推送成功".equals(message) &&weiXin!=null&&"微信推送成功".equals(weiXin)) { + return AjaxResult.success(message +","+ weiXin); + } else if (message==null&&weiXin!=null&&"微信推送成功".equals(weiXin)){ + return AjaxResult.success(weiXin); + }else if (message!=null&&"短信推送成功".equals(message)&&weiXin==null){ + return AjaxResult.success(message); + }else if (message!=null&&"短信推送失败".equals(message)&&weiXin==null){ + return AjaxResult.error(message); + }else if (message==null&&"微信推送失败".equals(weiXin)){ + return AjaxResult.error(weiXin); + }else { + return AjaxResult.error(message +","+ weiXin); + } + } + } \ No newline at end of file diff --git a/zc-business/src/main/java/com/zc/business/controller/WeiboAuthUtil.java b/zc-business/src/main/java/com/zc/business/controller/WeiboAuthUtil.java new file mode 100644 index 00000000..d1d03258 --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/controller/WeiboAuthUtil.java @@ -0,0 +1,95 @@ +package com.zc.business.controller; + + +import com.alibaba.fastjson.JSONObject; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +/** + * @author 王思祥 + * @ClassName DcWarningPush 微博推送 + */ + +public class WeiboAuthUtil { + //1.登录传入重定向的url,用户授权后返回授权的code,2.使用code取得认证权限token 3.调用接口参数 + //1.登录获取用户的回调code + private static final String APP_KEY = "你的App Key"; + private static final String AUTH_URL = "https://api.weibo.com/oauth2/authorize"; + private static final String APP_SECRET = "你的App Secret"; + private static final String REDIRECT_URI = "你的回调URL"; + //获取授权后的code + public String tokenCode(){ + String url="https://api.weibo.com/oauth2/authorize?client_id="+APP_KEY+"&redirect_uri="+AUTH_URL; + String token=null; + try { + URL urlGet = new URL(url); //创建链接 + HttpURLConnection http = (HttpURLConnection) urlGet.openConnection(); + http.setRequestMethod("GET"); + http.setDoInput(true); //打开获取返回数据 + http.connect(); //发送链接 + InputStream is = http.getInputStream(); // + int size = is.available(); + byte[] jsonBytes = new byte[size]; + is.read(jsonBytes); + token = new String(jsonBytes, "UTF-8"); + System.err.println(token); + JSONObject jsonObject = JSONObject.parseObject(token); + is.close(); + return jsonObject.get("code").toString(); + }catch (Exception e){ + e.printStackTrace(); + } + return ""; + } + //获取toke + public String token(String code)throws IOException { + HttpClient httpClient = HttpClients.createDefault(); + String tokenUrl = REDIRECT_URI + "?client_id=" + APP_KEY + + "&client_secret=" + APP_SECRET + + "&grant_type=authorization_code" + + "&code=" + code + + "&redirect_uri=" + URLEncoder.encode(REDIRECT_URI, "UTF-8"); + HttpGet httpGet = new HttpGet(tokenUrl); + HttpResponse response = httpClient.execute(httpGet); + HttpEntity entity = response.getEntity(); + if (entity != null) { + String responseBody = EntityUtils.toString(entity, "UTF-8"); + org.json.JSONObject jsonObject = new org.json.JSONObject(responseBody); + return jsonObject.optString("access_token"); + } + return null; + } + + //执行调用推送api + public static void main(String[] args) throws Exception { + WeiboAuthUtil weiboAuthUtil = new WeiboAuthUtil(); + String code = weiboAuthUtil.tokenCode(); + String accessToken = weiboAuthUtil.token(code);//认证后的code放入,获取token + // 创建HttpClient实例 + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + // 构建请求URL,这里以获取用户信息为例 + String url = "https://api.weibo.com/2/users/show.json?access_token=" + accessToken + "&uid=用户UID"; + // 创建HttpGet请求 + HttpGet httpGet = new HttpGet(url); + // 执行请求并获取响应 + try (CloseableHttpResponse response = httpClient.execute(httpGet)) { + HttpEntity entity = response.getEntity(); + if (entity != null) { + // 读取响应内容 + String responseString = EntityUtils.toString(entity, "UTF-8"); + System.out.println(responseString); + } + } + } + } +} \ No newline at end of file diff --git a/zc-business/src/main/java/com/zc/business/domain/DcDispatch.java b/zc-business/src/main/java/com/zc/business/domain/DcDispatch.java index c128c2e5..6a2e9ed8 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcDispatch.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcDispatch.java @@ -52,6 +52,42 @@ private String organizationName; private Date endTime; + /** 1-人员2-车辆 */ + @Excel(name = "1-人员 2-车辆") + private Integer dispatchType; + + /** $column.columnComment */ + @Excel(name = "资源id", readConverterExp = "$column.readConverterExp()") + private Long resourceId; + + /** $column.columnComment */ + @Excel(name = "调度记录id", readConverterExp = "$column.readConverterExp()") + private Long dispatchId; + + public Integer getDispatchType() { + return dispatchType; + } + + public void setDispatchType(Integer dispatchType) { + this.dispatchType = dispatchType; + } + + public Long getResourceId() { + return resourceId; + } + + public void setResourceId(Long resourceId) { + this.resourceId = resourceId; + } + + public Long getDispatchId() { + return dispatchId; + } + + public void setDispatchId(Long dispatchId) { + this.dispatchId = dispatchId; + } + public String getOrganizationName() { return organizationName; } diff --git a/zc-business/src/main/java/com/zc/business/domain/DcDispatchResource.java b/zc-business/src/main/java/com/zc/business/domain/DcDispatchResource.java new file mode 100644 index 00000000..7f9f318d --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/domain/DcDispatchResource.java @@ -0,0 +1,79 @@ +package com.zc.business.domain; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 调度信息记录对象 dc_dispatch_resource + * + * @author ruoyi + * @date 2024-04-15 + */ +public class DcDispatchResource extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** $column.columnComment */ + private Long id; + + /** 1-人员2-车辆 */ + @Excel(name = "1-人员 2-车辆") + private Integer dispatchType; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Long resourceId; + + /** $column.columnComment */ + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") + private Long dispatchId; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setDispatchType(Integer dispatchType) + { + this.dispatchType = dispatchType; + } + + public Integer getDispatchType() + { + return dispatchType; + } + public void setResourceId(Long resourceId) + { + this.resourceId = resourceId; + } + + public Long getResourceId() + { + return resourceId; + } + public void setDispatchId(Long dispatchId) + { + this.dispatchId = dispatchId; + } + + public Long getDispatchId() + { + return dispatchId; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("dispatchType", getDispatchType()) + .append("resourceId", getResourceId()) + .append("dispatchId", getDispatchId()) + .toString(); + } +} diff --git a/zc-business/src/main/java/com/zc/business/domain/DcVehicles.java b/zc-business/src/main/java/com/zc/business/domain/DcVehicles.java index db198893..14b314e7 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcVehicles.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcVehicles.java @@ -27,7 +27,7 @@ public class DcVehicles extends BaseEntity private String vehiclePlate; /** 车辆类型 */ - @Excel(name = "车辆类型") + @Excel(name = "车辆类型",readConverterExp = "1=吊车,2=清障车,3=高空作业车,4=水车,5=除雪车") private Integer vehicleType; /** 1-可用2-使用中 */ diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java index 174f24dd..f1ddd947 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcWarningMapper.java @@ -5,6 +5,8 @@ import java.util.HashMap; import java.util.List; import cn.hutool.core.lang.hash.Hash; +import com.zc.business.domain.DcDispatch; +import com.zc.business.domain.DcDispatchResource; import com.zc.business.domain.DcRoadSection; import com.zc.business.domain.DcWaringStrategy; import com.zc.business.domain.DcWarning; @@ -102,4 +104,8 @@ public interface DcWarningMapper public List> selectShifts(@Param("station") Long station); //查询某个机构的车辆信息 public List> selectVehicles(@Param("organizationId")Long organizationId); + //新增调度资源信息 + public Integer insertDispatchResource(DcDispatchResource dcDispatchResource); + //新增调度记录信息 + public Integer insertDcDispatch(DcDispatch dcDispatch); } diff --git a/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java b/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java index 33a68e4e..c406e471 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcWarningService.java @@ -4,6 +4,8 @@ import java.util.HashMap; import java.util.List; import com.ruoyi.common.core.domain.AjaxResult; +import com.zc.business.domain.DcDispatch; +import com.zc.business.domain.DcDispatchResource; import com.zc.business.domain.DcWarning; import com.zc.business.domain.DcWarningBatchConvert; import org.apache.ibatis.annotations.Param; @@ -86,4 +88,8 @@ public interface IDcWarningService Integer updateEndSection(); //指挥调度 AjaxResult commandAndDispatch(DcWarning dcWarning); + //新增指挥调度资源记录 + public DcDispatch insertDispatch(DcDispatch dcDispatch); + //新增指挥调度资源记录 + public Integer insertDispatchSource(DcDispatchResource dcDispatchResource); } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java index f50f740a..d784f5a3 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcWarningServiceImpl.java @@ -7,6 +7,8 @@ import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.uuid.IdUtils; +import com.zc.business.domain.DcDispatch; +import com.zc.business.domain.DcDispatchResource; import com.zc.business.domain.DcEvent; import com.zc.business.domain.DcWaringStrategy; import com.zc.business.domain.DcWarning; @@ -22,6 +24,7 @@ import com.zc.common.core.websocket.WebSocketService; import org.apache.commons.lang3.StringUtils; import org.json.JSONArray; import org.json.JSONObject; +import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -444,14 +447,16 @@ public class DcWarningServiceImpl implements IDcWarningService StringUtils.isBlank(dcWarning.getDirection())){ return AjaxResult.error("参数错误"); } + ArrayList> hashMaps = new ArrayList<>(); dcWarning.setUserId(SecurityUtils.getUserId()); int updateState = dcWarningMapper.updateState(dcWarning);//感知事件状态改变为已完成 if (updateState==0){ return AjaxResult.error("操作失败"); } + String stakeMark = dcWarning.getStakeMark(); DcEvent dcEvent = new DcEvent(); dcEvent.setId(dcWarning.getId());//id - dcEvent.setStakeMark(dcWarning.getStakeMark());//桩号 + dcEvent.setStakeMark(stakeMark);//桩号 dcEvent.setDirection(dcWarning.getDirection());//方向 dcEvent.setDeptId(dcWarning.getDeptId());//部门 dcEvent.setOccurrenceTime(dcWarning.getWarningTime());//预警时间 @@ -480,6 +485,32 @@ public class DcWarningServiceImpl implements IDcWarningService dcEvent.setCreateTime(DateUtils.getNowDate());//创建时间 dcEvent.setUserId(SecurityUtils.getUserId());//处置人员 int insertDcEvent = dcEventService.insertDcEventWarning(dcEvent); + + List> mapList = dcWarningMapper.selectRecentlySection();//全部机构的桩号和名称 + for (HashMap map:mapList){ + if (StringUtils.isBlank(map.get("stakeMark").toString())){ + continue; + } + Long id = (Long) map.get("id");//机构的id + String stakeMarkNew = map.get("stakeMark").toString();//机构桩号 + StakeMarkUtils stakeMarkUtils = new StakeMarkUtils(); + Integer itselfStakeMark = stakeMarkUtils.stakeMarkToInt(stakeMarkNew);//机构本身的米数 + Integer afferentStakeMark = stakeMarkUtils.stakeMarkToInt(stakeMark);//传入的桩号米数 + Integer difference =Math.abs(afferentStakeMark-itselfStakeMark); //计算距离绝对值 + map.put("difference",difference/1000.0);//米转公里加入到map + map.put("id",id); + hashMaps.add(map); + } + List> sortedHashMaps = hashMaps.stream().sorted(Comparator.comparing(map -> { + return (Double) map.get("difference"); })).collect(Collectors.toList()); + HashMap map = sortedHashMaps.get(0); + Long id = (Long) map.get("id");//取出最近的机构id + if (id!=null){ + DcDispatch dcDispatch = new DcDispatch(); + dcDispatch.setEventId(dcWarning.getId()); + dcDispatch.setOrganizationId(id); + dcWarningMapper.insertDcDispatch(dcDispatch);//事件绑定记录 + } if (insertDcEvent==0){ return AjaxResult.error("操作失败"); } @@ -604,10 +635,49 @@ public class DcWarningServiceImpl implements IDcWarningService map.put("vehiclesMap",vehiclesMap); hashMaps.add(map); } + List> sortedHashMaps = hashMaps.stream().sorted(Comparator.comparing(map -> { return (Double) map.get("difference"); })).collect(Collectors.toList()); return AjaxResult.success(sortedHashMaps); } + @Override + public DcDispatch insertDispatch(DcDispatch dcDispatch) { + dcWarningMapper.insertDcDispatch(dcDispatch); + return dcDispatch; + } + + @Override + public Integer insertDispatchSource(DcDispatchResource dcDispatchResource) { + return dcWarningMapper.insertDispatchResource(dcDispatchResource); + } + //依据桩号计算出记录最近的机构id + public AjaxResult stake(DcWarning dcWarning){ + String stakeMark = dcWarning.getStakeMark(); + ArrayList> hashMaps = new ArrayList<>(); + List> mapList = dcWarningMapper.selectRecentlySection();//全部机构的桩号和名称 + for (HashMap map:mapList){ + if (StringUtils.isBlank(map.get("stakeMark").toString())){ + continue; + } + Long id = (Long) map.get("id");//机构的id + String stakeMarkNew = map.get("stakeMark").toString();//机构桩号 + StakeMarkUtils stakeMarkUtils = new StakeMarkUtils(); + Integer itselfStakeMark = stakeMarkUtils.stakeMarkToInt(stakeMarkNew);//机构本身的米数 + Integer afferentStakeMark = stakeMarkUtils.stakeMarkToInt(stakeMark);//传入的桩号米数 + Integer difference =Math.abs(afferentStakeMark-itselfStakeMark); //计算距离绝对值 + map.put("difference",difference/1000.0);//米转公里加入到map + map.put("id",id); + hashMaps.add(map); + } + List> sortedHashMaps = hashMaps.stream().sorted(Comparator.comparing(map -> { + return (Double) map.get("difference"); })).collect(Collectors.toList()); + if (!sortedHashMaps.isEmpty()){ + HashMap map = sortedHashMaps.get(0); + Long id = (Long) map.get("id"); + return AjaxResult.success(id); + } + return null; + } } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/MsmServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/MsmServiceImpl.java index fef5b2a4..aa151b06 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/MsmServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/MsmServiceImpl.java @@ -148,7 +148,6 @@ public class MsmServiceImpl implements IMsmService { System.out.println("-->" + r); try { JSONObject jsonObject = new JSONObject(r); - String errmsg = jsonObject.getString("errmsg"); Object errcode = jsonObject.get("errcode"); objects.add(errcode); } catch (Exception e) { diff --git a/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml b/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml index 750d9bdc..7a2d46e2 100644 --- a/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcWarningMapper.xml @@ -146,7 +146,44 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{endTime}, - + + insert into dc_dispatch_resource + + id, + dispatch_type, + resource_id, + dispatch_id, + + + #{id}, + #{dispatchType}, + #{resourceId}, + #{dispatchId}, + + + + insert into dc_dispatch + + id, + organization_id, + event_id, + dispatch_name, + dispatch_status, + start_time, + end_time, + remark, + + + #{id}, + #{organizationId}, + #{eventId}, + #{dispatchName}, + #{dispatchStatus}, + #{startTime}, + #{endTime}, + #{remark}, + + update dc_warning From 63c1ff4a7cd1b7135ab3e18aa94f4da334e36d0b Mon Sep 17 00:00:00 2001 From: lau572 <1010031226@qq.com> Date: Mon, 15 Apr 2024 14:50:37 +0800 Subject: [PATCH 18/18] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E4=BA=8B=E5=8F=91?= =?UTF-8?q?=E5=9C=B0=E4=B8=8A=E6=B8=B810=E5=85=AC=E9=87=8C=E5=86=85?= =?UTF-8?q?=E7=9A=84=E6=83=85=E6=8A=A5=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/DcDeviceController.java | 18 +++++++++++++ .../zc/business/mapper/DcDeviceMapper.java | 2 ++ .../zc/business/service/IDcDeviceService.java | 6 +++++ .../service/impl/DcDeviceServiceImpl.java | 27 +++++++++++++++++++ .../mapper/business/DcDeviceMapper.xml | 10 +++++++ .../mapper/business/DcEventMapper.xml | 7 ++--- 6 files changed, 67 insertions(+), 3 deletions(-) diff --git a/zc-business/src/main/java/com/zc/business/controller/DcDeviceController.java b/zc-business/src/main/java/com/zc/business/controller/DcDeviceController.java index 9a4b4312..475c8e84 100644 --- a/zc-business/src/main/java/com/zc/business/controller/DcDeviceController.java +++ b/zc-business/src/main/java/com/zc/business/controller/DcDeviceController.java @@ -19,6 +19,7 @@ import com.zc.common.core.httpclient.exception.HttpException; import com.zc.common.core.httpclient.request.RequestParams; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; import io.swagger.v3.oas.annotations.Parameter; import okhttp3.Response; import org.springframework.beans.factory.annotation.Value; @@ -575,4 +576,21 @@ public class DcDeviceController extends BaseController { return JSON.parseObject(response.body().string(), AjaxResult.class); } + + + /** + * @Description 查询上游10公里内的情报板 + * + * @author liuwenge + * @date 2024/4/15 14:22 + * @param stakeMark + * @param direction + * @return com.ruoyi.common.core.domain.AjaxResult + */ + @ApiOperation("查询上游10公里内的情报板") + @PostMapping("/selectNearBoard") + public AjaxResult selectNearBoard(@ApiParam(value="桩号", name="stakeMark", required=true) @RequestParam ("stakeMark") String stakeMark, + @ApiParam(value="方向", name="direction", required=true) @RequestParam ("direction") String direction){ + return dcDeviceService.selectNearBoard(stakeMark,direction); + } } diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcDeviceMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcDeviceMapper.java index 3caf756f..83ec034d 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcDeviceMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcDeviceMapper.java @@ -21,4 +21,6 @@ public interface DcDeviceMapper extends BaseMapper { List numberOfDevicesByType(); List selectNearCamPile(@Param("direction") String direction,@Param("startMileage") String startMileage,@Param("endMileage") String endMileage); + + List selectNearBoard(@Param("direction") String direction,@Param("startMileage") Integer startMileage,@Param("endMileage") Integer endMileage); } diff --git a/zc-business/src/main/java/com/zc/business/service/IDcDeviceService.java b/zc-business/src/main/java/com/zc/business/service/IDcDeviceService.java index b3eb5f00..26644f00 100644 --- a/zc-business/src/main/java/com/zc/business/service/IDcDeviceService.java +++ b/zc-business/src/main/java/com/zc/business/service/IDcDeviceService.java @@ -2,6 +2,7 @@ package com.zc.business.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.ruoyi.common.core.domain.AjaxResult; import com.zc.business.domain.DcDevice; import com.zc.business.domain.DcStakeMark; @@ -83,4 +84,9 @@ public interface IDcDeviceService extends IService { List numberOfDevicesByType(); List selectNearCamPile(String direction,String startMileage,String endMileage); + + /** + * 查询上游10公里内的情报板 + */ + AjaxResult selectNearBoard(String stakeMark, String direction); } diff --git a/zc-business/src/main/java/com/zc/business/service/impl/DcDeviceServiceImpl.java b/zc-business/src/main/java/com/zc/business/service/impl/DcDeviceServiceImpl.java index f6e446e3..c70a0fac 100644 --- a/zc-business/src/main/java/com/zc/business/service/impl/DcDeviceServiceImpl.java +++ b/zc-business/src/main/java/com/zc/business/service/impl/DcDeviceServiceImpl.java @@ -3,9 +3,11 @@ package com.zc.business.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.constant.HttpStatus; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.PageUtils; +import com.ruoyi.common.utils.StakeMarkUtils; import com.zc.business.constant.RedisKeyConstants; import com.zc.business.domain.DcDevice; import com.zc.business.domain.DcProduct; @@ -472,5 +474,30 @@ public class DcDeviceServiceImpl extends ServiceImpl i public List selectNearCamPile(String direction,String startMileage,String endMileage){ return dcDeviceMapper.selectNearCamPile(direction,startMileage,endMileage); } + + /** + * @Description 获取事发地上游10公里内的情报板 + * + * @author liuwenge + * @date 2024/4/15 14:18 + * @param stakeMark 桩号 + * @param direction 方向 + * @return com.ruoyi.common.core.domain.AjaxResult + */ + @Override + public AjaxResult selectNearBoard(String stakeMark, String direction){ + + Integer mileage = Integer.valueOf(StakeMarkUtils.formatMetre(stakeMark)); + + List boardList = new ArrayList<>(); + if ("1".equals(direction)){ + Integer start = mileage - 10000; + boardList = dcDeviceMapper.selectNearBoard(direction,start,mileage); + } else if ("3".equals(direction)){ + Integer end = mileage + 10000; + boardList = dcDeviceMapper.selectNearBoard(direction,mileage,end); + } + return AjaxResult.success(boardList); + } } diff --git a/zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml b/zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml index 28b3fc01..fe6f24c5 100644 --- a/zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml @@ -128,5 +128,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where !ISNULL(t1.iot_device_id) and t1.device_type = '1' and t1.direction = #{direction} and t2.mileage >= #{startMileage} and t2.mileage <= #{endMileage} + diff --git a/zc-business/src/main/resources/mapper/business/DcEventMapper.xml b/zc-business/src/main/resources/mapper/business/DcEventMapper.xml index 97fb7fe1..10718b22 100644 --- a/zc-business/src/main/resources/mapper/business/DcEventMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcEventMapper.xml @@ -667,7 +667,8 @@ where id = #{id} - + + update dc_event dept_id = #{deptId}, @@ -747,11 +748,11 @@