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 968fa59f..49f634f9 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 @@ -6,6 +6,7 @@ import com.ruoyi.common.core.page.TableDataInfo; import com.zc.business.domain.DcEmergencyPlans; import com.zc.business.domain.DcEvent; import com.zc.business.domain.DcEventAnDcEmergencyPlans; +import com.zc.business.domain.DcWarning; import com.zc.business.service.DcEmergencyPlansService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -54,9 +55,9 @@ public class DcEmergencyPlansController extends BaseController { } /** - * 根据事件数据查询事件预案列表 + * 交通事件-根据事件数据查询事件预案列表 */ - @ApiOperation("根据事件数据查询事件预案列表") + @ApiOperation("交通事件-根据事件数据查询事件预案列表") @PreAuthorize("@ss.hasPermi('business:plans:list')") @PostMapping("/list/event/type") public AjaxResult listByEventType(@RequestBody DcEvent dcEvent) { @@ -66,15 +67,55 @@ public class DcEmergencyPlansController extends BaseController { } /** - * 事件确定 + * 感知事件-根据事件数据查询事件预案列表 */ - @ApiOperation("事件确认") + @ApiOperation("感知事件-根据事件数据查询事件预案列表") + @PreAuthorize("@ss.hasPermi('business:plans:list')") + @PostMapping("/list/warning/type") + public AjaxResult listByEventType(@RequestBody DcWarning dcWarning) { + + List dcEmergencyPlansList = dcEmergencyPlansService.selectDcEmergencyPlansByWarningType(dcWarning); + return AjaxResult.success(dcEmergencyPlansList); + } + + /** + * 感知事件-情报板自动生成文字 + */ + @ApiOperation("感知事件-情报板自动生成文字") + @PostMapping("/warning/automatic") + public AjaxResult warningAutomaticGeneration(@RequestBody DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { + return AjaxResult.success(dcEmergencyPlansService.warningAutomaticGeneration(dcEventAnDcEmergencyPlans)); + } + + /** + * 交通事件-情报板自动生成文字 + */ + @ApiOperation("交通事件-情报板自动生成文字") + @PostMapping("/event/automatic") + public AjaxResult eventAutomaticGeneration(@RequestBody DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { + return AjaxResult.success(dcEmergencyPlansService.eventAutomaticGeneration(dcEventAnDcEmergencyPlans)); + } + + /** + * 交通事件确定 + */ + @ApiOperation("交通事件确定") @PreAuthorize("@ss.hasPermi('business:plans:edit')") @PostMapping("/event/confirm") - public AjaxResult EventConfirm(@RequestBody DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { + public AjaxResult eventConfirm(@RequestBody DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { return toAjax(dcEmergencyPlansService.executionEventConfirmation(dcEventAnDcEmergencyPlans)); } + /** + * 感知事件确定 + */ + @ApiOperation("感知事件确认") + @PreAuthorize("@ss.hasPermi('business:plans:edit')") + @PostMapping("/warning/confirm") + public AjaxResult warningConfirm(@RequestBody DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { + return toAjax(dcEmergencyPlansService.executionWarningConfirmation(dcEventAnDcEmergencyPlans)); + } + /** * 新增事件预案 */ @@ -95,17 +136,6 @@ public class DcEmergencyPlansController extends BaseController { return toAjax(dcEmergencyPlansService.updateDcEmergencyPlans(dcEmergencyPlans)); } - /** - * 批量修改事件预案 - */ -// @ApiOperation("修改预案") -// @PreAuthorize("@ss.hasPermi('business:plans:edit')") -// @Log(title = "事件预案", businessType = BusinessType.UPDATE) - @PutMapping("/batch") - public AjaxResult updateBatch(@RequestBody List dcEmergencyPlansList) { - return toAjax(dcEmergencyPlansService.updateBatchDcEmergencyPlans(dcEmergencyPlansList)); - } - /** * 批量删除事件预案 */ diff --git a/zc-business/src/main/java/com/zc/business/domain/DcEmergencyPlans.java b/zc-business/src/main/java/com/zc/business/domain/DcEmergencyPlans.java index ace7707a..771d60b1 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcEmergencyPlans.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcEmergencyPlans.java @@ -75,6 +75,12 @@ public class DcEmergencyPlans { @ApiModelProperty("控制指令") private String controlCommand; + /** + * 事件分类 + */ + @ApiModelProperty("事件分类") + private int eventCategory; + /** * 执行操作 */ diff --git a/zc-business/src/main/java/com/zc/business/domain/DcEventAnDcEmergencyPlans.java b/zc-business/src/main/java/com/zc/business/domain/DcEventAnDcEmergencyPlans.java index 98d8cb32..24d8ffb0 100644 --- a/zc-business/src/main/java/com/zc/business/domain/DcEventAnDcEmergencyPlans.java +++ b/zc-business/src/main/java/com/zc/business/domain/DcEventAnDcEmergencyPlans.java @@ -20,17 +20,29 @@ import lombok.NoArgsConstructor; public class DcEventAnDcEmergencyPlans { /** - * 事件数据 + * 交通事件数据 */ - @ApiModelProperty("事件数据") + @ApiModelProperty("交通事件数据") private DcEvent dcEvent; + /** + * 感知事件数据 + */ + @ApiModelProperty("感知事件数据") + private DcWarning dcWarning; + /** * 事件预案数据 */ @ApiModelProperty("事件预案数据") private DcEmergencyPlans dcEmergencyPlans; + /** + * 情报板模板数据 + */ + @ApiModelProperty("情报板模板数据") + private DcInfoBoardTemplate dcInfoBoardTemplate; + /** * 操作类型 1-执行操作 2-恢复操作 */ diff --git a/zc-business/src/main/java/com/zc/business/enums/ClassifyEnum.java b/zc-business/src/main/java/com/zc/business/enums/ClassifyEnum.java new file mode 100644 index 00000000..4dffbf1b --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/enums/ClassifyEnum.java @@ -0,0 +1,42 @@ +package com.zc.business.enums; + +/** + * 事件分类枚举 + * @author wangjiabao + */ +public enum ClassifyEnum { + REAR_END_COLLISION(1, "主线封闭","前方主线封闭"), + ROLLOVER(2, "主线限行","前方主线限行"), + COLLISION_WITH_GUARDRAIL(6, "收费站封闭","前方收费站封闭"), + NATURAL(7, "收费站限行","前方收费站限行"), + OTHER_ACCIDENTS(10, "匝道立交封闭","前方匝道立交封闭"), + VEHICLE_MALFUNCTION(11, "匝道立交限行","前方匝道立交限行"), + ROAD_CONGESTION(14, "服务区封闭","前方服务区封闭"); + + private final int code; + private final String info; + + private final String text; + + ClassifyEnum(int code, String info, String text) + { + this.code = code; + this.info = info; + this.text = text; + } + + public int getCode() + { + return code; + } + + public String getInfo() + { + return info; + } + + public String getText() + { + return text; + } +} 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 new file mode 100644 index 00000000..061e773d --- /dev/null +++ b/zc-business/src/main/java/com/zc/business/enums/EventSubclassEnum.java @@ -0,0 +1,67 @@ +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", "服务区其他异常","服务区设备停用"), + RAIN("10-1", "雨","雨天请谨慎驾驶"), + SNOW("10-2", "雪","雪天路滑请谨慎驾驶"), + HEAVY_FOG("10-3", "大雾","大雾天气请谨慎驾驶"), + GALE("10-4", "大风","大风天气请谨慎驾驶"), + LOW_TEMPERATURE_COLD_WAVE("10-5", "低温寒潮","低温寒潮天气请谨慎驾驶"), + SNOW_ON_ROAD_SURFACE("10-6", "路面积雪","路面积雪请谨慎驾驶"), + ROAD_ICING("10-7", "路面结冰","路面结冰请谨慎驾驶"), + ROAD_SURFACE_WATER_LOGGING("10-8", "路面积水","路面积水请谨慎驾驶"), + OTHER_ABNORMAL_WEATHER("10-9", "其他异常天气","天气异常请谨慎驾驶"); + + + private final String code; + private final String info; + + private final String text; + + EventSubclassEnum(String code, String info, String text) + { + this.code = code; + this.info = info; + this.text = text; + } + + public String getCode() + { + return code; + } + + public String getInfo() + { + return info; + } + + public String getText() + { + return text; + } +} diff --git a/zc-business/src/main/java/com/zc/business/mapper/DcEmergencyPlansMapper.java b/zc-business/src/main/java/com/zc/business/mapper/DcEmergencyPlansMapper.java index 79f994d0..c753344a 100644 --- a/zc-business/src/main/java/com/zc/business/mapper/DcEmergencyPlansMapper.java +++ b/zc-business/src/main/java/com/zc/business/mapper/DcEmergencyPlansMapper.java @@ -31,13 +31,21 @@ public interface DcEmergencyPlansMapper { DcEmergencyPlans selectDcEmergencyPlans(Integer id); /** - * 根据事件类型查询事件预案 + * 交通事件-根据事件类型查询事件预案 * * @param event 事件预案 * @return 结果 */ List selectDcEmergencyPlansByEventType(DcEvent event); + /** + * 感知事件-根据事件类型查询事件预案 + * + * @param eventType 事件预案 + * @return 结果 + */ + List selectDcEmergencyPlansByWarningType(int eventType); + /** * 新增事件预案 * 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 8001d3b3..a6583053 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,8 +1,7 @@ package com.zc.business.service; -import com.zc.business.domain.DcEmergencyPlans; -import com.zc.business.domain.DcEvent; -import com.zc.business.domain.DcEventAnDcEmergencyPlans; +import com.zc.business.domain.*; + import java.util.List; /** @@ -31,21 +30,51 @@ public interface DcEmergencyPlansService { DcEmergencyPlans selectDcEmergencyPlans(Integer id); /** - * 根据事件类型查询事件预案 + * 交通事件-根据事件类型查询事件预案 * - * @param event 事件 + * @param event 交通事件 * @return 结果 */ List selectDcEmergencyPlansByEventType(DcEvent event); /** - * 事件确定 + * 感知事件-根据事件类型查询事件预案 + * + * @param dcWarning 感知事件 + * @return 结果 + */ + List selectDcEmergencyPlansByWarningType(DcWarning dcWarning); + + /** + * 交通事件确定 * * @param dcEventAnDcEmergencyPlans 事件数据 和 事件预案数据 * @return 结果 */ int executionEventConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans); + /** + * 感知事件确定 + * + * @param dcEventAnDcEmergencyPlans 事件数据 和 事件预案数据 + * @return 结果 + */ + int executionWarningConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans); + + /** + * 感知事件-情报板自动生成 + * @param dcEventAnDcEmergencyPlans + * @return + */ + DcInfoBoardTemplate warningAutomaticGeneration(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans); + + /** + * 交通事件-情报板自动生成 + * @param dcEventAnDcEmergencyPlans + * @return + */ + DcInfoBoardTemplate eventAutomaticGeneration(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans); + /** * 新增事件预案 * 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 625b4637..bdbc39fd 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 @@ -12,21 +12,17 @@ import com.zc.business.constant.DeviceFunctionIdConstants; import com.zc.business.constant.DeviceTypeConstants; import com.zc.business.controller.DcDeviceController; import com.zc.business.domain.*; -import com.zc.business.enums.EventTypeEnum; +import com.zc.business.enums.*; import com.zc.business.mapper.DcEmergencyPlansMapper; 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.common.core.httpclient.exception.HttpException; -import org.apache.commons.lang3.StringEscapeUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; -import javax.script.ScriptException; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.*; @@ -70,9 +66,9 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { } /** - * 根据事件类型查询事件预案 + * 交通事件 - 根据事件类型查询事件预案 * - * @param event 事件 + * @param event 交通事件 * @return 结果 */ @Override @@ -81,175 +77,226 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { int eventType = Integer.parseInt(event.getEventType().toString()); - if (eventType == EventTypeEnum.TRAFFIC_ACCIDENT.getCode()) { + if (eventType == EventTypeEnum.TRAFFIC_ACCIDENT.getCode() || + eventType == EventTypeEnum.ABNORMAL_WEATHER.getCode() || + eventType == EventTypeEnum.ILLEGAL_ROAD_USE.getCode() || + eventType == EventTypeEnum.TRAFFIC_JAM.getCode() || + eventType == EventTypeEnum.SERVICE_AREA_ABNORMALITY.getCode() || + eventType == EventTypeEnum.ROADBLOCK_CLEARANCE.getCode()) { return dcEmergencyPlansList.stream() .filter(dcEmergencyPlans -> { String triggerMechanism = dcEmergencyPlans.getTriggerMechanism(); JSONObject triggerJson = JSONObject.parseObject(triggerMechanism); - int eventLevel = Integer.parseInt(triggerJson.get("eventLevel").toString()); - return eventLevel == event.getEventLevel(); + String eventSubclass = triggerJson.get("eventSubclass").toString(); + return eventSubclass.equals(event.getEventSubclass()); }) .collect(Collectors.toList()); } else if (eventType == EventTypeEnum.VEHICLE_MALFUNCTION.getCode()) { + // 车辆故障 return dcEmergencyPlansList.stream() .filter(dcEmergencyPlans -> { String triggerMechanism = dcEmergencyPlans.getTriggerMechanism(); JSONObject triggerJson = JSONObject.parseObject(triggerMechanism); - String[] lane = event.getLang().split(","); - int[] intArray = Arrays.stream(lane) - .mapToInt(Integer::parseInt) - .toArray(); - JSONArray eventLevel = JSONArray.parseArray(triggerJson.get("roadOccupancy").toString()); - return Arrays.stream(intArray).anyMatch(Arrays.asList(eventLevel.toArray())::contains); + String locationType = triggerJson.get("locationType").toString(); + DcEventVehicleAccident dcEventVehicleAccident = event.getDcEventVehicleAccident(); + String eventLocationType =dcEventVehicleAccident.getLocationType().toString(); + return locationType.equals(eventLocationType); }) .collect(Collectors.toList()); } else if (eventType == EventTypeEnum.TRAFFIC_CONTROL.getCode()) { + // 交通管制 return dcEmergencyPlansList.stream() .filter(dcEmergencyPlans -> { String triggerMechanism = dcEmergencyPlans.getTriggerMechanism(); JSONObject triggerJson = JSONObject.parseObject(triggerMechanism); - // 管制分类 - Integer controlType = Integer.parseInt(triggerJson.get("controlType").toString()); // 分类 Integer classify = Integer.parseInt(triggerJson.get("classify").toString()); - // 分类原因 - Integer controlCause = Integer.parseInt(triggerJson.get("controlCause").toString()); // 事件--交通管制数据 DcEventTrafficControl dcEventTrafficControl = event.getDcEventTrafficControl(); - Integer eventControlType = Integer.parseInt(dcEventTrafficControl.getControlType().toString()); Integer eventClassify = Integer.parseInt(dcEventTrafficControl.getClassify().toString()); - Integer eventControlCause = Integer.parseInt(dcEventTrafficControl.getControlCause().toString()); - return controlType.equals(eventControlType) && classify.equals(eventClassify) && controlCause.equals(eventControlCause); - }) - .collect(Collectors.toList()); - } else if (eventType == EventTypeEnum.TRAFFIC_JAM.getCode()) { - return dcEmergencyPlansList.stream() - .filter(dcEmergencyPlans -> { - String triggerMechanism = dcEmergencyPlans.getTriggerMechanism(); - JSONObject triggerJson = JSONObject.parseObject(triggerMechanism); - // 拥堵原因 - Integer congestionCause = Integer.parseInt(triggerJson.get("congestionCause").toString()); - // 详细原因 - Integer detailedReasons = Integer.parseInt(triggerJson.get("detailedReasons").toString()); - // 事件--交通拥堵数据 - DcEventTrafficCongestion dcEventTrafficCongestion = event.getDcEventTrafficCongestion(); - Integer eventCongestionCause = Integer.parseInt(dcEventTrafficCongestion.getCongestionCause().toString()); - Integer eventDetailedReasons = Integer.parseInt(dcEventTrafficCongestion.getDetailedReasons().toString()); - return congestionCause.equals(eventCongestionCause) && detailedReasons.equals(eventDetailedReasons); + return classify.equals(eventClassify); }) .collect(Collectors.toList()); - } else if (eventType == EventTypeEnum.ILLEGAL_ROAD_USE.getCode() || eventType == EventTypeEnum.ROADBLOCK_CLEARANCE.getCode()) { + } else { + // 施工建设 + return dcEmergencyPlansList; + } + + } + + /** + * 感知事件 - 根据事件类型查询事件预案 + * + * @param dcWarning 感知事件 + * @return 结果 + */ + @Override + public List selectDcEmergencyPlansByWarningType(DcWarning dcWarning) { + int eventType = ValueConverter.convertValueHost(dcWarning.getWarningType()); + List dcEmergencyPlansList = dcEmergencyPlansMapper.selectDcEmergencyPlansByWarningType(eventType); + + int warningType = Integer.parseInt(dcWarning.getWarningType().toString()); + + if (warningType == WarningTypeEnum.UNUSUAL_WEATHER.getCode()) { return dcEmergencyPlansList.stream() .filter(dcEmergencyPlans -> { String triggerMechanism = dcEmergencyPlans.getTriggerMechanism(); JSONObject triggerJson = JSONObject.parseObject(triggerMechanism); String eventSubclass = triggerJson.get("eventSubclass").toString(); - // 事件--非法上路/路障清除 数据 - String subclass = event.getEventSubclass(); - return eventSubclass.equals(subclass); - }) - .collect(Collectors.toList()); - } else if (eventType == EventTypeEnum.CONSTRUCTION_AND_CONSTRUCTION.getCode()) { - return dcEmergencyPlansList.stream() - .filter(dcEmergencyPlans -> { - String triggerMechanism = dcEmergencyPlans.getTriggerMechanism(); - JSONObject triggerJson = JSONObject.parseObject(triggerMechanism); - String subclass = triggerJson.get("eventSubclass").toString(); - Integer controlMode = Integer.parseInt(triggerJson.get("controlMode").toString()); - JSONArray lane = JSONArray.parseArray(triggerJson.get("lane").toString()); - // 事件--施工建设数据 - DcEventConstruction dcEventConstruction = event.getDcEventConstruction(); - String eventSubclass = event.getEventSubclass(); - Integer eventControlMode = Integer.parseInt(dcEventConstruction.getControlMode().toString()); - String[] eventLane = event.getLang().split(","); - int[] eventLaneInt = Arrays.stream(eventLane) - .mapToInt(Integer::parseInt) - .toArray(); - return subclass.equals(eventSubclass) && controlMode.equals(eventControlMode) - && Arrays.stream(eventLaneInt).anyMatch(Arrays.asList(lane.toArray())::contains); - }) - .collect(Collectors.toList()); - } else if (eventType == EventTypeEnum.SERVICE_AREA_ABNORMALITY.getCode()) { - return dcEmergencyPlansList.stream() - .filter(dcEmergencyPlans -> { - String triggerMechanism = dcEmergencyPlans.getTriggerMechanism(); - JSONObject triggerJson = JSONObject.parseObject(triggerMechanism); - Integer facilityId = Integer.parseInt(triggerJson.get("facilityId").toString()); - Integer disableFacility = Integer.parseInt(triggerJson.get("disableFacility").toString()); - - // 事件--服务区异常数据 - DcEventServiceArea dcEventServiceArea = event.getDcEventServiceArea(); - Integer eventFacilityId = Integer.parseInt(dcEventServiceArea.getFacilityId().toString()); - Integer eventDisableFacility = Integer.parseInt(dcEventServiceArea.getDisableFacility().toString()); - return facilityId.equals(eventFacilityId) && disableFacility.equals(eventDisableFacility); - }) - .collect(Collectors.toList()); - } else if (eventType == EventTypeEnum.ABNORMAL_WEATHER.getCode()) { - return dcEmergencyPlansList.stream() - .filter(dcEmergencyPlans -> { - String triggerMechanism = dcEmergencyPlans.getTriggerMechanism(); - JSONObject triggerJson = JSONObject.parseObject(triggerMechanism); - String unusualWeather = triggerJson.get("unusualWeather").toString(); - // 条件 - JSONArray conditions = JSON.parseArray(triggerJson.get("conditions").toString()); // 事件--异常天气数据 - DcEventAbnormalWeather dcEventAbnormalWeather = event.getDcEventAbnormalWeather(); - String weatherSituation = dcEventAbnormalWeather.getWeatherSituation(); - // 异常天气数据 - Integer numericalValue = Integer.parseInt(dcEventAbnormalWeather.getNumericalValue()); - String conditionString = conditions.stream().map(condition -> { - JSONObject conditionJSON = JSON.parseObject(condition.toString()); - String comparisonOperator = StringEscapeUtils.unescapeXml(conditionJSON.get("comparisonOperator").toString()); - String thresholdValue = conditionJSON.get("thresholdValue").toString(); - return numericalValue + comparisonOperator + thresholdValue; - }).collect(Collectors.joining(" && ")); - - ScriptEngineManager manager = new ScriptEngineManager(); - ScriptEngine engine = manager.getEngineByName("js"); - boolean result = false; - try { - result = (boolean) engine.eval(conditionString); - } catch (ScriptException e) { - e.printStackTrace(); - } + String warningSubclass = ValueConverter.convertValueSon(dcWarning.getWarningSubclass()); - return unusualWeather.equals(weatherSituation) && result; + return eventSubclass.equals(warningSubclass); }) .collect(Collectors.toList()); } else { - return null; + return dcEmergencyPlansList; } - } /** - * 事件确定 + * 交通事件确定 * * @param dcEventAnDcEmergencyPlans 事件数据 和 事件预案数据 * @return 结果 */ @Override public int executionEventConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { + // 获取事件数据 + DcEvent dcEvent = dcEventAnDcEmergencyPlans.getDcEvent(); + // 方向 + String direction = dcEvent.getDirection(); + // 事件编号 + String id = dcEvent.getId(); + return executionConfirmation(dcEventAnDcEmergencyPlans,dcEvent.getStakeMark(),direction,id); + } + /** + * 感知事件-情报板自动生成 + * @param dcEventAnDcEmergencyPlans + * @return + */ + @Override + public DcInfoBoardTemplate warningAutomaticGeneration(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { + // 根据感知事件类型等、生成情报板的内容 + DcWarning dcWarning = dcEventAnDcEmergencyPlans.getDcWarning(); + DcInfoBoardTemplate dcInfoBoardTemplate = dcEventAnDcEmergencyPlans.getDcInfoBoardTemplate(); + Integer warningType = dcWarning.getWarningType(); + if (warningType.equals(WarningTypeEnum.TRAFFIC_JAM.getCode())) { + // 交通拥堵 + dcInfoBoardTemplate.setContent("前方"+WarningTypeEnum.TRAFFIC_JAM.getInfo()+"请谨慎驾驶"); + }else if (warningType.equals(WarningTypeEnum.NON_MOTOR_VEHICLE.getCode())) { + dcInfoBoardTemplate.setContent("前方出现"+WarningTypeEnum.NON_MOTOR_VEHICLE.getInfo()+"请注意避让"); + }else if (warningType.equals(WarningTypeEnum.PEDESTRIAN.getCode())) { + dcInfoBoardTemplate.setContent("前方出现"+WarningTypeEnum.PEDESTRIAN.getInfo()+"请注意避让"); + }else if (warningType.equals(WarningTypeEnum.FIREWORKS.getCode())) { + dcInfoBoardTemplate.setContent("前方出现"+WarningTypeEnum.FIREWORKS.getInfo()+"请注意避让"); + }else if (warningType.equals(WarningTypeEnum.OUTFALL.getCode())) { + dcInfoBoardTemplate.setContent("前方出现"+WarningTypeEnum.OUTFALL.getInfo()+"请注意避让"); + } else if (warningType.equals(WarningTypeEnum.VEHICLE_CONVERSE_RUNNING.getCode())) { + dcInfoBoardTemplate.setContent("前方出现"+WarningTypeEnum.OUTFALL.getInfo()+"请注意避让"); + } + + return dcInfoBoardTemplate; + } + + /** + * 交通事件-情报板自动生成 + * @return + */ + @Override + public DcInfoBoardTemplate eventAutomaticGeneration(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { + // 根据交通事件的事件类型,生成相应的情报板内容 + DcEvent dcEvent = dcEventAnDcEmergencyPlans.getDcEvent(); + DcInfoBoardTemplate dcInfoBoardTemplate = dcEventAnDcEmergencyPlans.getDcInfoBoardTemplate(); + int eventType = Integer.parseInt(dcEvent.getEventType().toString()); + if (eventType == EventTypeEnum.ABNORMAL_WEATHER.getCode() || + eventType == EventTypeEnum.TRAFFIC_ACCIDENT.getCode() || + eventType == EventTypeEnum.ILLEGAL_ROAD_USE.getCode() || + eventType == EventTypeEnum.TRAFFIC_JAM.getCode() || + eventType == EventTypeEnum.SERVICE_AREA_ABNORMALITY.getCode() || + eventType == EventTypeEnum.ROADBLOCK_CLEARANCE.getCode()) { + + String content = Arrays.stream(EventSubclassEnum.values()) + .filter(eventSubclassEnum -> eventSubclassEnum.getCode().equals(dcEvent.getEventSubclass())) + .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()); + if (locationType == 1) { + dcInfoBoardTemplate.setContent("高速主线发生车辆故障"); + } else if (locationType == 2) { + dcInfoBoardTemplate.setContent("服务区发生车辆故障"); + } else if (locationType == 3) { + dcInfoBoardTemplate.setContent("立交桥发生车辆故障"); + } else if (locationType == 4) { + dcInfoBoardTemplate.setContent("收费站发生车辆故障"); + } + + } else if (eventType == EventTypeEnum.TRAFFIC_CONTROL.getCode()) { + // 交通管制 + DcEventTrafficControl dcEventTrafficControl = dcEvent.getDcEventTrafficControl(); + int classify = Integer.parseInt(dcEventTrafficControl.getClassify().toString()); + String content = Arrays.stream(ClassifyEnum.values()) + .filter(eventSubclassEnum -> eventSubclassEnum.getCode() == classify) + .findFirst() + .map(ClassifyEnum::getText) + .orElse("前方存在限行或关闭"); + dcInfoBoardTemplate.setContent(content); + + }else { + // 施工建设 + dcInfoBoardTemplate.setContent("前方施工请注意驾驶"); + } + return dcInfoBoardTemplate; + } + + /** + * 感知事件确认 + * @param dcEventAnDcEmergencyPlans 事件数据 和 事件预案数据 + * @return + */ + @Override + public int executionWarningConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans) { + // 获取事件数据 + DcWarning dcWarning = dcEventAnDcEmergencyPlans.getDcWarning(); + + // 方向 + String direction = dcWarning.getDirection(); + // 事件编号 + String id = dcWarning.getId(); + return executionConfirmation(dcEventAnDcEmergencyPlans,dcWarning.getStakeMark(),direction,id); + } + + /** + * 事件确认 + * @param dcEventAnDcEmergencyPlans 事件数据 和 事件预案数据 + * @return + */ + public int executionConfirmation(DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans, + String stakeMark, + String direction, + String id) { // 存储所有设备id StringBuilder deviceIds = new StringBuilder(); // 存储所有设备的执行结果 JSONArray resultArray = new JSONArray(); - - // 获取事件数据 - DcEvent dcEvent = dcEventAnDcEmergencyPlans.getDcEvent(); - // 获取事件预案数据 - DcEmergencyPlans dcEmergencyPlans = dcEventAnDcEmergencyPlans.getDcEmergencyPlans(); // 事件桩号 - String[] markArray = dcEvent.getStakeMark().split("\\+"); + String[] markArray = stakeMark.split("\\+"); if (markArray[1].length() < 3) { // 不足三位 补零 markArray[1] = String.format("%0" + 3 + "d", markArray[1]); } - // 方向 - String direction = dcEvent.getDirection(); + + // 获取事件预案数据 + DcEmergencyPlans dcEmergencyPlans = dcEventAnDcEmergencyPlans.getDcEmergencyPlans(); + //获取事件预案中的 执行操作配置 dcEmergencyPlans.getDcExecuteAction().stream() @@ -363,7 +410,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { // 创建一个 预案事件关联对象 EventPlanAssoc eventPlanAssoc = new EventPlanAssoc(); // 事件编号 - eventPlanAssoc.setEventId(dcEvent.getId()); + eventPlanAssoc.setEventId(id); // 区分是执行操作 还是 恢复操作 if (dcEventAnDcEmergencyPlans.getOperationType().equals(1)) { @@ -380,7 +427,6 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { selectEventPlanAssoc.setRecoveredControlResult(resultArray.toJSONString()); return eventPlanAssocMapper.updateEventPlanAssoc(selectEventPlanAssoc); } - } /** @@ -389,10 +435,10 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { public void invokedFunction(List dcDevices, JSONObject otherConfig, JSONArray resultArray) throws HttpException, IOException { String iotDeviceId = ""; String functionId = ""; - HashMap props = new HashMap<>(); for (DcDevice device : dcDevices) { iotDeviceId = device.getIotDeviceId(); + HashMap props = new HashMap<>(); if (device.getDeviceType().equals(DeviceTypeConstants.DRIVING_GUIDANCE)) { // 行车诱导 @@ -415,10 +461,13 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { props.put("mode", "02"); } - } else if (device.getDeviceType().equals(DeviceTypeConstants.VARIABLE_INFORMATION_FLAG)) { + } + else if (device.getDeviceType().equals(DeviceTypeConstants.VARIABLE_INFORMATION_FLAG)) { // 可变信息标志 functionId = DeviceFunctionIdConstants.VARIABLE_INFORMATION_FLAG; - } else { +// props.put("") + } + else { break; } @@ -496,6 +545,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService { .filter(dcExecuteAction -> dcExecuteAction.getId() == null) .collect(Collectors.toList()); if (insertDcExecuteActionList.size() > 0) { + insertDcExecuteActionList.forEach(dcExecuteAction -> dcExecuteAction.setCreateTime(DateUtils.getNowDate())); dcExecuteActionService.insertDcExecuteActionBatch(insertDcExecuteActionList); } diff --git a/zc-business/src/main/resources/mapper/business/DcEmergencyPlansMapper.xml b/zc-business/src/main/resources/mapper/business/DcEmergencyPlansMapper.xml index bf5f50a5..63d9a33a 100644 --- a/zc-business/src/main/resources/mapper/business/DcEmergencyPlansMapper.xml +++ b/zc-business/src/main/resources/mapper/business/DcEmergencyPlansMapper.xml @@ -15,6 +15,7 @@ + @@ -42,6 +43,7 @@ triggering_condition, controllable_device, control_command, + event_category, #{planName}, @@ -53,6 +55,7 @@ #{triggeringCondition}, #{controllableDevice}, #{controlCommand}, + #{eventCategory}, @@ -65,7 +68,8 @@ device_type = #{deviceType}, triggering_condition = #{triggeringCondition}, controllable_device = #{controllableDevice}, - control_command = #{controlCommand} + control_command = #{controlCommand}, + event_category = #{eventCategory} where id = #{id} @@ -86,6 +90,7 @@ t1.triggering_condition, t1.controllable_device, t1.control_command, + t1.event_category, t2.id as action_id, t2.emergency_plans_id as action_emergency_plans_id, t2.device_type as action_device_type, @@ -110,7 +115,8 @@ t1.device_type, t1.triggering_condition, t1.controllable_device, - t1.control_command + t1.control_command, + t1.event_category from dc_emergency_plans t1 @@ -121,7 +127,12 @@ + +