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 65648daf..77224c7c 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 @@ -89,11 +89,141 @@ public class DcWarningServiceImpl implements IDcWarningService @Override public int insertDcWarning(DcWarning dcWarning) { - dcWarning.setCreateTime(DateUtils.getNowDate()); //设置事件Id UUID无下划线格式32 String uuid = IdUtils.fastSimpleUUID(); dcWarning.setId(uuid); - return dcWarningMapper.insertDcWarning(dcWarning); + 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(暂时未定义,定义后开发) + return dcWarningMapper.insertDcWarning(dcWarning);//未定义直接走新增; + } + HashMap redisValueTwo = redisWarningStrategy.get(redisKye+"2");//查看传入的事件类型是否配置策略2(延迟策略) + if (redisValueOne==null&&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 (redisValueOne==null&&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 (redisValueOne==null&&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);//加入缓存????存在问题会数据累计 + 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);//如果没有配置策略直接加入数据库; } @@ -170,13 +300,14 @@ public class DcWarningServiceImpl implements IDcWarningService } HashMap redisValueThree = redisWarningStrategy.get(redisKye+"3");//查看传入的事件类型是否配置策略3(时间窗口策略) if (redisValueOne==null&&redisValueTwo==null&&redisValueThree!=null){ //执行策略3,执行到这里说明1不存在或者2不存在或者1未满足过滤条件 - if (dataId==null){//如果不存在直接加入数据库,加入缓存,配置对应的过期时间(30分钟) + 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,30,TimeUnit.MINUTES);//加入缓存并设置延迟时间(单位分钟) + redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES);//加入缓存并设置延迟时间(单位分钟) return 1;//结束 } //redis存在数据,取出redis的id找对对应事件的配置,合成事件配置 @@ -185,7 +316,7 @@ public class DcWarningServiceImpl implements IDcWarningService redisCache.deleteObject(WARNINGDATA+key); dcWarningMapper.insertDcWarning(dcWarning); String id = dcWarning.getId(); - redisCache.setCacheObject(WARNINGDATA+key,id,30,TimeUnit.MINUTES); + redisCache.setCacheObject(WARNINGDATA+key,id,Integer.parseInt(strategyTime),TimeUnit.MINUTES); return 1; } String otherConfig=""; diff --git a/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml b/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml index 3b372a0b..2891c83f 100644 --- a/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcPerceivedEventsWarningMapper.xml @@ -451,7 +451,7 @@ SELECT '2-1' AS warning_subclass, '行人' AS subclass UNION ALL SELECT '6-4' AS warning_subclass, '抛洒物' AS subclass UNION ALL SELECT '5-6' AS warning_subclass, '变道' AS subclass UNION ALL - SELECT '99-1' AS warning_subclass, '机占非' AS subclass UNION ALL + SELECT '99-1' AS warning_subclass, '其它' AS subclass UNION ALL SELECT '6-3' AS warning_subclass, '路障' AS subclass UNION ALL SELECT '7-1' AS warning_subclass, '施工' AS subclass UNION ALL SELECT '4-10' AS warning_subclass, '停车' AS subclass UNION ALL