@ -8,6 +8,7 @@ import com.fasterxml.jackson.core.type.TypeReference;
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.zc.business.constant.DeviceFunctionIdConstants ;
import com.zc.business.constant.DeviceTypeConstants ;
import com.zc.business.controller.BroadcastController ;
@ -158,6 +159,227 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService {
}
}
/ * *
* 交通事件 - 情报板确认回显原始模板
* /
@Override
public Map < String , List < DcInfoBoardTemplate > > eventBoardConfirm ( DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans ) {
// 获取事件数据
DcEvent dcEvent = dcEventAnDcEmergencyPlans . getDcEvent ( ) ;
// 方向
String direction = dcEvent . getDirection ( ) ;
// 事件桩号
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 ] ) ;
}
DcExecuteAction executeAction = dcEventAnDcEmergencyPlans . getDcEmergencyPlans ( ) . getExecuteAction ( ) ;
List < DcDevice > dcDevices = ruleFiltering ( executeAction , markArray , direction ) ;
return getBoardTemplate ( dcDevices ) ;
}
/ * *
* 感知事件 - 情报板确认回显原始模板
* /
@Override
public Map < String , List < DcInfoBoardTemplate > > warningBoardConfirm ( DcEventAnDcEmergencyPlans dcEventAnDcEmergencyPlans ) {
// 获取事件数据
DcWarning dcWarning = dcEventAnDcEmergencyPlans . getDcWarning ( ) ;
// 方向
String direction = dcWarning . getDirection ( ) ;
// 事件桩号
dcWarning . setStakeMark ( dcWarning . getStakeMark ( ) . replace ( "K" , "" ) ) ;
String [ ] markArray = dcWarning . getStakeMark ( ) . split ( "\\+" ) ;
if ( markArray [ 1 ] . length ( ) < 3 ) {
// 不足三位 补零
markArray [ 1 ] = String . format ( "%0" + 3 + "d" , markArray [ 1 ] ) ;
}
DcExecuteAction executeAction = dcEventAnDcEmergencyPlans . getDcEmergencyPlans ( ) . getExecuteAction ( ) ;
List < DcDevice > dcDevices = ruleFiltering ( executeAction , markArray , direction ) ;
return getBoardTemplate ( dcDevices ) ;
}
/ * *
* 情报板设备执行3A功能 , 获取模板
* /
public Map < String , List < DcInfoBoardTemplate > > getBoardTemplate ( List < DcDevice > dcDevices ) {
Map < String , List < DcInfoBoardTemplate > > map = new HashMap < > ( ) ;
dcDevices . forEach ( dcDevice - > {
try {
if ( StringUtils . isEmpty ( dcDevice . getIotDeviceId ( ) ) ) {
return ;
}
AjaxResult ajaxResult = dcDeviceController . getDeviceRealtimeProperty ( dcDevice . getIotDeviceId ( ) , "3A" , new HashMap < > ( ) ) ;
if ( ajaxResult . get ( "code" ) . equals ( 200 ) ) {
JSONObject properties = JSON . parseObject ( JSON . parseObject ( ajaxResult . get ( "data" ) . toString ( ) ) . get ( "3A" ) . toString ( ) ) ;
JSONArray contentArray = JSONArray . parseArray ( properties . get ( "content" ) . toString ( ) ) ;
List < DcInfoBoardTemplate > list = new ArrayList < > ( ) ;
contentArray . forEach ( content - > {
DcInfoBoardTemplate dcInfoBoardTemplate = new DcInfoBoardTemplate ( ) ;
JSONObject jsonObject = JSON . parseObject ( content . toString ( ) ) ;
String displayAreaWidth = jsonObject . get ( "displayAreaWidth" ) . toString ( ) ;
String displayAreaHeight = jsonObject . get ( "displayAreaHeight" ) . toString ( ) ;
// 内容
dcInfoBoardTemplate . setContent ( jsonObject . get ( "textContent" ) . toString ( ) ) ;
// 前景颜色
dcInfoBoardTemplate . setFontColor ( jsonObject . get ( "foregroundColor" ) . toString ( ) ) ;
// 屏幕尺寸
dcInfoBoardTemplate . setScreenSize ( displayAreaWidth + "*" + displayAreaHeight ) ;
// 字号
dcInfoBoardTemplate . setFontSize ( jsonObject . get ( "fontSize" ) . toString ( ) ) ;
// 字体风格
dcInfoBoardTemplate . setFontType ( jsonObject . get ( "fontStyle" ) . toString ( ) ) ;
// 字距
dcInfoBoardTemplate . setFontSpacing ( jsonObject . get ( "fontSpacing" ) . toString ( ) ) ;
// 停留时间
dcInfoBoardTemplate . setStopTime ( jsonObject . get ( "residenceTime" ) . toString ( ) ) ;
// 入屏方式
dcInfoBoardTemplate . setInScreenMode ( jsonObject . get ( "screenEntryMethod" ) . toString ( ) ) ;
// 水平对齐
dcInfoBoardTemplate . setFormatStyle ( jsonObject . get ( "horizontalAlignment" ) . toString ( ) ) ;
list . add ( dcInfoBoardTemplate ) ;
} ) ;
map . put ( dcDevice . getDeviceName ( ) , list ) ;
}
} catch ( Exception e ) {
e . printStackTrace ( ) ;
}
} ) ;
return map ;
}
/ * *
* 执行操作中的规则筛选
* @param dcExecuteAction
* @param markArray
* @param direction
* @return
* /
public List < DcDevice > ruleFiltering ( DcExecuteAction dcExecuteAction , String [ ] markArray , String direction ) {
Integer searchRule = dcExecuteAction . getSearchRule ( ) ;
List < String > start = new ArrayList < > ( ) ;
List < String > end = new ArrayList < > ( ) ;
// 设备列表
List < DcDevice > dcDevices = new ArrayList < > ( ) ;
Map < String , Object > parameter = new HashMap < > ( ) ;
parameter . put ( "deviceType" , dcExecuteAction . getDeviceType ( ) ) ;
// 根据不同的检索规则条件 获取设备
if ( searchRule . equals ( 1 ) ) {
// 指定设备资源
// 根据设备id,获取设备集合
LambdaQueryWrapper < DcDevice > queryWrapper = new LambdaQueryWrapper < > ( ) ;
JSONObject otherConfig = JSON . parseObject ( dcExecuteAction . getOtherConfig ( ) ) ;
List < String > deviceList = ( List < String > ) otherConfig . get ( "deviceList" ) ;
queryWrapper . in ( DcDevice : : getIotDeviceId , deviceList ) ;
dcDevices = dcDeviceService . list ( queryWrapper ) ;
}
else if ( searchRule . equals ( 2 ) ) {
// 事件上游最近
if ( direction . equals ( "1" ) ) {
// 上行 取最大的几个
start . add ( "55" ) ;
start . add ( "379" ) ;
end . add ( markArray [ 0 ] ) ;
end . add ( markArray [ 1 ] ) ;
parameter . put ( "startStakeMark" , start ) ;
parameter . put ( "endStakeMark" , end ) ;
dcDevices = dcDeviceService . devicePileNumberQueryDevice ( parameter ) ;
Collections . sort ( dcDevices , new Comparator < DcDevice > ( ) {
@Override
public int compare ( DcDevice o1 , DcDevice o2 ) {
return o2 . getStakeMark ( ) . compareTo ( o1 . getStakeMark ( ) ) ;
}
} ) ;
if ( dcDevices . size ( ) > 0 ) {
dcDevices = dcDevices . subList ( 0 , dcExecuteAction . getNumber ( ) ) ;
}
} else {
// 下行 取最小的几个
start . add ( markArray [ 0 ] ) ;
start . add ( markArray [ 1 ] ) ;
end . add ( "208" ) ;
end . add ( "154" ) ;
parameter . put ( "startStakeMark" , start ) ;
parameter . put ( "endStakeMark" , end ) ;
dcDevices = dcDeviceService . devicePileNumberQueryDevice ( parameter ) ;
Collections . sort ( dcDevices , new Comparator < DcDevice > ( ) {
@Override
public int compare ( DcDevice o1 , DcDevice o2 ) {
return o1 . getStakeMark ( ) . compareTo ( o2 . getStakeMark ( ) ) ;
}
} ) ;
if ( dcDevices . size ( ) > 0 ) {
dcDevices = dcDevices . subList ( 0 , dcExecuteAction . getNumber ( ) ) ;
}
}
}
else if ( searchRule . equals ( 3 ) ) {
// 事件下游最近
if ( direction . equals ( "1" ) ) {
// 上行 取最大的几个
start . add ( markArray [ 0 ] ) ;
start . add ( markArray [ 1 ] ) ;
end . add ( "208" ) ;
end . add ( "154" ) ;
parameter . put ( "startStakeMark" , start ) ;
parameter . put ( "endStakeMark" , end ) ;
dcDevices = dcDeviceService . devicePileNumberQueryDevice ( parameter ) ;
Collections . sort ( dcDevices , new Comparator < DcDevice > ( ) {
@Override
public int compare ( DcDevice o1 , DcDevice o2 ) {
return o1 . getStakeMark ( ) . compareTo ( o2 . getStakeMark ( ) ) ;
}
} ) ;
if ( dcDevices . size ( ) > 0 ) {
dcDevices = dcDevices . subList ( 0 , dcExecuteAction . getNumber ( ) ) ;
}
} else {
// 下行 取最小的几个
start . add ( "55" ) ;
start . add ( "379" ) ;
end . add ( markArray [ 0 ] ) ;
end . add ( markArray [ 1 ] ) ;
parameter . put ( "startStakeMark" , start ) ;
parameter . put ( "endStakeMark" , end ) ;
dcDevices = dcDeviceService . devicePileNumberQueryDevice ( parameter ) ;
Collections . sort ( dcDevices , new Comparator < DcDevice > ( ) {
@Override
public int compare ( DcDevice o1 , DcDevice o2 ) {
return o2 . getStakeMark ( ) . compareTo ( o1 . getStakeMark ( ) ) ;
}
} ) ;
// 需要对查出的设备,按照桩号进行排序从小到大
if ( dcDevices . size ( ) > 0 ) {
dcDevices = dcDevices . subList ( 0 , dcExecuteAction . getNumber ( ) ) ;
}
}
}
else {
// 最近公里数
Integer kilometers = Integer . parseInt ( markArray [ 0 ] . replaceAll ( "K" , "" ) ) ;
// 根据事件桩号、公里数 计算出 桩号范围
start . add ( String . valueOf ( kilometers - dcExecuteAction . getNumber ( ) ) ) ;
start . add ( markArray [ 1 ] ) ;
end . add ( String . valueOf ( kilometers + dcExecuteAction . getNumber ( ) ) ) ;
end . add ( markArray [ 1 ] ) ;
// 构造查询条件
parameter . put ( "startStakeMark" , start ) ;
parameter . put ( "endStakeMark" , end ) ;
parameter . put ( "deviceType" , dcExecuteAction . getDeviceType ( ) ) ;
// 根据桩号范围,查询附近设备
dcDevices = dcDeviceService . devicePileNumberQueryDevice ( parameter ) ;
}
return dcDevices ;
}
/ * *
* 交通事件确定
@ -291,6 +513,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService {
// 存储所有设备的执行结果
JSONArray resultArray = new JSONArray ( ) ;
// 事件桩号
stakeMark = stakeMark . replace ( "K" , "" ) ;
String [ ] markArray = stakeMark . split ( "\\+" ) ;
if ( markArray [ 1 ] . length ( ) < 3 ) {
// 不足三位 补零
@ -304,95 +527,7 @@ public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService {
//获取事件预案中的 执行操作配置
dcEmergencyPlans . getDcExecuteAction ( )
. forEach ( dcExecuteAction - > {
Integer searchRule = dcExecuteAction . getSearchRule ( ) ;
List < String > start = new ArrayList < > ( ) ;
List < String > end = new ArrayList < > ( ) ;
// 设备列表
List < DcDevice > dcDevices = new ArrayList < > ( ) ;
Map < String , Object > parameter = new HashMap < > ( ) ;
parameter . put ( "deviceType" , dcExecuteAction . getDeviceType ( ) ) ;
// 根据不同的检索规则条件 获取设备
if ( searchRule . equals ( 1 ) ) {
// 指定设备资源
// 根据设备id,获取设备集合
LambdaQueryWrapper < DcDevice > queryWrapper = new LambdaQueryWrapper < > ( ) ;
JSONObject otherConfig = JSON . parseObject ( dcExecuteAction . getOtherConfig ( ) ) ;
List < String > deviceList = ( List < String > ) otherConfig . get ( "deviceList" ) ;
queryWrapper . in ( DcDevice : : getIotDeviceId , deviceList ) ;
dcDevices = dcDeviceService . list ( queryWrapper ) ;
}
else if ( searchRule . equals ( 2 ) ) {
// 事件上游最近
if ( direction . equals ( "1" ) ) {
// 上行 取最大的几个
start . add ( "55" ) ;
start . add ( "378.7" ) ;
end . add ( markArray [ 0 ] ) ;
end . add ( markArray [ 1 ] ) ;
parameter . put ( "startStakeMark" , start ) ;
parameter . put ( "endStakeMark" , end ) ;
dcDevices = dcDeviceService . devicePileNumberQueryDevice ( parameter ) ;
dcDevices = dcDevices . subList ( dcDevices . size ( ) - dcExecuteAction . getNumber ( ) , dcDevices . size ( ) ) ;
} else {
// 下行 取最小的几个
start . add ( markArray [ 0 ] ) ;
start . add ( markArray [ 1 ] ) ;
end . add ( "208" ) ;
end . add ( "153.4" ) ;
parameter . put ( "startStakeMark" , start ) ;
parameter . put ( "endStakeMark" , end ) ;
dcDevices = dcDeviceService . devicePileNumberQueryDevice ( parameter ) ;
dcDevices = dcDevices . subList ( 0 , dcExecuteAction . getNumber ( ) ) ;
}
// // 定义Comparator来比较DcDevice对象的stakeMark字段
// Comparator<DcDevice> comparator = Comparator.comparing(DcDevice::getStakeMark);
// // 对dcDevices进行升序排序
// Collections.sort(dcDevices, comparator);
// // 对dcDevices进行降序排序
// Collections.sort(dcDevices, comparator.reversed());
}
else if ( searchRule . equals ( 3 ) ) {
// 事件下游最近
if ( direction . equals ( "1" ) ) {
// 上行 取最大的几个
start . add ( markArray [ 0 ] ) ;
start . add ( markArray [ 1 ] ) ;
end . add ( "208" ) ;
end . add ( "153.4" ) ;
parameter . put ( "startStakeMark" , start ) ;
parameter . put ( "endStakeMark" , end ) ;
dcDevices = dcDeviceService . devicePileNumberQueryDevice ( parameter ) ;
dcDevices = dcDevices . subList ( 0 , dcExecuteAction . getNumber ( ) ) ;
} else {
// 下行 取最小的几个
start . add ( "55" ) ;
start . add ( "378.7" ) ;
end . add ( markArray [ 0 ] ) ;
end . add ( markArray [ 1 ] ) ;
parameter . put ( "startStakeMark" , start ) ;
parameter . put ( "endStakeMark" , end ) ;
dcDevices = dcDeviceService . devicePileNumberQueryDevice ( parameter ) ;
dcDevices = dcDevices . subList ( dcDevices . size ( ) - dcExecuteAction . getNumber ( ) , dcDevices . size ( ) ) ;
}
}
else {
// 最近公里数
Integer kilometers = Integer . parseInt ( markArray [ 0 ] . replaceAll ( "K" , "" ) ) ;
// 根据事件桩号、公里数 计算出 桩号范围
start . add ( String . valueOf ( kilometers - dcExecuteAction . getNumber ( ) ) ) ;
start . add ( markArray [ 1 ] ) ;
end . add ( String . valueOf ( kilometers + dcExecuteAction . getNumber ( ) ) ) ;
end . add ( markArray [ 1 ] ) ;
// 构造查询条件
parameter . put ( "startStakeMark" , start ) ;
parameter . put ( "endStakeMark" , end ) ;
parameter . put ( "deviceType" , dcExecuteAction . getDeviceType ( ) ) ;
// 根据桩号范围,查询附近设备
dcDevices = dcDeviceService . devicePileNumberQueryDevice ( parameter ) ;
}
List < DcDevice > dcDevices = ruleFiltering ( dcExecuteAction , markArray , direction ) ;
try {
// 根据不通设备类型,执行不通的功能操作