Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
T
traffic-signal-platform
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
signal
traffic-signal-platform
Commits
aec32bae
Commit
aec32bae
authored
May 28, 2025
by
duanruiming
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[add] 海信临时方案下发
parent
b4048f1b
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
79 additions
and
66 deletions
+79
-66
RedisConfig.java
...rvice/src/main/java/net/wanji/utc/config/RedisConfig.java
+1
-1
ControlCommandStrategyServiceImpl.java
...rvice/control/impl/ControlCommandStrategyServiceImpl.java
+74
-61
HisenseSchemeRingTask.java
...c/main/java/net/wanji/utc/task/HisenseSchemeRingTask.java
+1
-1
SignalCommandSyncTask.java
...c/main/java/net/wanji/utc/task/SignalCommandSyncTask.java
+1
-1
SchemePhaseGreenTimeOptVO.java
...main/java/net/wanji/utc/vo/SchemePhaseGreenTimeOptVO.java
+1
-1
bootstrap-docker.yaml
signal-utc-service/src/main/resources/bootstrap-docker.yaml
+1
-1
No files found.
signal-utc-service/src/main/java/net/wanji/utc/config/RedisConfig.java
View file @
aec32bae
...
@@ -119,7 +119,7 @@ public class RedisConfig extends CachingConfigurerSupport {
...
@@ -119,7 +119,7 @@ public class RedisConfig extends CachingConfigurerSupport {
@Bean
@Bean
public
Jedis
jedis
()
{
public
Jedis
jedis
()
{
Jedis
jedis
=
new
Jedis
(
redisHost
,
redisPort
);
Jedis
jedis
=
new
Jedis
(
redisHost
,
redisPort
);
jedis
.
auth
(
password
);
jedis
.
auth
(
"Wanji@300552"
);
return
jedis
;
return
jedis
;
}
}
...
...
signal-utc-service/src/main/java/net/wanji/utc/service/control/impl/ControlCommandStrategyServiceImpl.java
View file @
aec32bae
...
@@ -49,7 +49,6 @@ import java.text.ParseException;
...
@@ -49,7 +49,6 @@ import java.text.ParseException;
import
java.text.SimpleDateFormat
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
import
java.util.*
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.stream.Collectors
;
/**
/**
* @author duanruiming
* @author duanruiming
...
@@ -79,7 +78,7 @@ public class ControlCommandStrategyServiceImpl implements ControlCommandStrategy
...
@@ -79,7 +78,7 @@ public class ControlCommandStrategyServiceImpl implements ControlCommandStrategy
private
final
CrossPhaseDirTurnCache
crossPhaseDirTurnCache
;
private
final
CrossPhaseDirTurnCache
crossPhaseDirTurnCache
;
private
final
CrossSchemePhaseTimeCountCache
crossSchemePhaseTimeCountCache
;
private
final
CrossSchemePhaseTimeCountCache
crossSchemePhaseTimeCountCache
;
@Resource
@Resource
WanJiCommonStaticInfoService
wanjiCommonStaticInfoService
;
private
WanJiCommonStaticInfoService
wanjiCommonStaticInfoService
;
@Override
@Override
...
@@ -687,42 +686,58 @@ public class ControlCommandStrategyServiceImpl implements ControlCommandStrategy
...
@@ -687,42 +686,58 @@ public class ControlCommandStrategyServiceImpl implements ControlCommandStrategy
@Override
@Override
public
JsonViewObject
schemePhaseGreenTimeOpt
(
SchemePhaseGreenTimeOptVO
vo
)
throws
Exception
{
public
JsonViewObject
schemePhaseGreenTimeOpt
(
SchemePhaseGreenTimeOptVO
vo
)
throws
Exception
{
ObjectMapper
mapper
=
JacksonUtils
.
get
Instance
();
JsonViewObject
result
=
JsonViewObject
.
new
Instance
();
try
{
try
{
ObjectMapper
mapper
=
JacksonUtils
.
getInstance
();
String
crossId
=
vo
.
getCrossId
();
String
crossId
=
vo
.
getCrossId
();
Integer
schemeId
=
vo
.
getScheme
Id
();
Integer
schemeId
=
vo
.
getScheme
No
();
Integer
offset
=
vo
.
getOffset
();
Integer
offset
=
vo
.
getOffset
();
Integer
cycle
=
vo
.
getCycle
();
Integer
cycle
=
vo
.
getCycle
();
List
<
SchemePhaseGreenTimeOptVO
.
PhaseOptTime
>
phaseOptTimeList
=
vo
.
getPhaseOptTimeList
();
List
<
SchemePhaseGreenTimeOptVO
.
PhaseOptTime
>
phaseOptTimeList
=
vo
.
getPhaseOptTimeList
();
// 获取方案环图中,将平台优化的相位阶段转化为海信相位时间
// 获取方案环图中,将环图中相位转化为阶段中相位对应关系
CrossSchemeRingsDTO
crossSchemeRingsDTO
=
new
CrossSchemeRingsDTO
();
CrossSchemeRingsDTO
crossSchemeRingsDTO
=
new
CrossSchemeRingsDTO
();
crossSchemeRingsDTO
.
setCrossId
(
crossId
);
crossSchemeRingsDTO
.
setCrossId
(
crossId
);
crossSchemeRingsDTO
.
setPattern
(
String
.
valueOf
(
schemeId
));
crossSchemeRingsDTO
.
setPattern
(
String
.
valueOf
(
schemeId
));
JsonViewObject
jsonViewObject
=
wanjiCommonStaticInfoService
.
selectCrossSchemeRingsToStages
(
crossSchemeRingsDTO
);
// 方案环图结果
if
(
Objects
.
nonNull
(
jsonViewObject
)
&&
Objects
.
equals
(
200
,
jsonViewObject
.
getCode
()))
{
CrossSchemeRingsToStagesPO
crossSchemeRingsToStagesPO
=
new
CrossSchemeRingsToStagesPO
();
String
contentStr
=
String
.
valueOf
(
jsonViewObject
.
getContent
());
try
{
CrossSchemeRingsToStagesPO
crossSchemeRingsToStagesPO
=
mapper
.
convertValue
(
contentStr
,
CrossSchemeRingsToStagesPO
.
class
);
JsonViewObject
res
=
wanjiCommonStaticInfoService
.
selectCrossSchemeRingsToStages
(
crossSchemeRingsDTO
);
Map
<
Integer
,
Integer
>
phaseTimeMap
=
new
HashMap
<>();
if
(
Objects
.
nonNull
(
res
)
&&
200
==
res
.
getCode
())
{
if
(
Objects
.
nonNull
(
crossSchemeRingsToStagesPO
))
{
Object
content
=
res
.
getContent
();
crossSchemeRingsToStagesPO
=
mapper
.
convertValue
(
content
,
CrossSchemeRingsToStagesPO
.
class
);
}
else
{
log
.
error
(
"平台临时方案下发-路口号查询方案号远程服务调用异常:{}"
,
res
);
result
.
fail
(
"根据路口号和方案号查询环图阶段远程服务调用异常"
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"平台临时方案下发-路口号查询方案号远程服务调用异常:"
,
e
);
return
result
.
fail
(
"根据路口号和方案号查询环图阶段远程服务调用异常"
);
}
Map
<
Integer
,
Integer
>
phaseTimeMap
=
new
TreeMap
<>();
// 将阶段中相位加减绿灯时间转化到环相位中
if
(!
CollectionUtils
.
isEmpty
(
phaseOptTimeList
))
{
for
(
SchemePhaseGreenTimeOptVO
.
PhaseOptTime
phaseOptTime
:
phaseOptTimeList
)
{
String
optPhaseNo
=
phaseOptTime
.
getPhaseNo
();
Integer
optTime
=
phaseOptTime
.
getOptTime
();
List
<
CrossSchemeRingsToStagesPO
.
Phase
>
phaseList
=
crossSchemeRingsToStagesPO
.
getPhaseList
();
List
<
CrossSchemeRingsToStagesPO
.
Phase
>
phaseList
=
crossSchemeRingsToStagesPO
.
getPhaseList
();
if
(!
CollectionUtils
.
isEmpty
(
phaseList
)
&&
!
CollectionUtils
.
isEmpty
(
phaseOptTimeList
))
{
String
oriPhaseTimeStr
=
crossSchemeRingsToStagesPO
.
getSplit
();
for
(
SchemePhaseGreenTimeOptVO
.
PhaseOptTime
phaseOptTime
:
phaseOptTimeList
)
{
if
(!
CollectionUtils
.
isEmpty
(
phaseList
)
&&
StringUtils
.
isNotEmpty
(
oriPhaseTimeStr
))
{
String
optPhaseNo
=
phaseOptTime
.
getPhaseNo
();
String
[]
oriHisensePhaseList
=
oriPhaseTimeStr
.
split
(
" "
);
Integer
optGreenTime
=
phaseOptTime
.
getOptGreenTime
();
for
(
CrossSchemeRingsToStagesPO
.
Phase
oriPhase
:
phaseList
)
{
for
(
CrossSchemeRingsToStagesPO
.
Phase
phase
:
phaseList
)
{
String
oriPhaseNo
=
oriPhase
.
getPhaseNo
();
String
oriPhaseNo
=
phase
.
getPhaseNo
();
String
oriPhaseList
=
oriPhase
.
getPhaseList
();
String
oriPhaseList
=
phase
.
getPhaseList
();
Integer
oriPhaseTime
=
oriPhase
.
getPhaseTime
();
if
(
StringUtils
.
equals
(
optPhaseNo
,
oriPhaseNo
))
{
if
(
StringUtils
.
equals
(
optPhaseNo
,
oriPhaseNo
))
{
if
(
StringUtils
.
isNotEmpty
(
oriPhaseList
))
{
if
(
StringUtils
.
isNotBlank
(
oriPhaseList
))
{
String
[]
split
=
oriPhaseList
.
split
(
","
);
for
(
String
s
:
oriPhaseList
.
split
(
","
))
{
for
(
String
hisensePhaseNoStr
:
split
)
{
Integer
hisensePhaseNo
=
Integer
.
valueOf
(
s
);
int
hisensePhaseNo
=
Integer
.
parseInt
(
hisensePhaseNoStr
);
if
(
phaseTimeMap
.
containsKey
(
hisensePhaseNo
))
{
int
oriHisensePhaseTime
=
Integer
.
parseInt
(
oriHisensePhaseList
[
hisensePhaseNo
-
1
]);
Integer
oriGreen
=
phaseTimeMap
.
get
(
hisensePhaseNo
);
if
(
phaseTimeMap
.
containsKey
(
hisensePhaseNo
))
{
phaseTimeMap
.
put
(
hisensePhaseNo
,
oriGreen
+
optGreenTime
);
phaseTimeMap
.
compute
(
hisensePhaseNo
,
(
k
,
tempPhaseTime
)
->
tempPhaseTime
+
optTime
);
}
else
{
}
else
{
phaseTimeMap
.
put
(
hisensePhaseNo
,
oriPhaseTime
+
optGreenTime
);
phaseTimeMap
.
put
(
hisensePhaseNo
,
oriHisensePhaseTime
+
optTime
);
}
}
}
}
}
}
}
...
@@ -730,44 +745,42 @@ public class ControlCommandStrategyServiceImpl implements ControlCommandStrategy
...
@@ -730,44 +745,42 @@ public class ControlCommandStrategyServiceImpl implements ControlCommandStrategy
}
}
}
}
}
}
// 将相位对应绿信比转成发送格式
}
String
splitSend
=
""
;
StringBuilder
sb
=
new
StringBuilder
();
if
(!
phaseTimeMap
.
isEmpty
())
{
for
(
int
i
=
1
;
i
<=
16
;
i
++)
{
LinkedHashMap
<
Integer
,
Integer
>
sortMap
=
phaseTimeMap
.
entrySet
().
stream
().
sorted
(
Integer
value
=
phaseTimeMap
.
get
(
i
);
Map
.
Entry
.
comparingByKey
()).
collect
(
Collectors
.
toMap
(
if
(
Objects
.
nonNull
(
value
))
{
Map
.
Entry
::
getKey
,
sb
.
append
(
value
).
append
(
" "
);
Map
.
Entry
::
getValue
,
}
else
{
(
oldValue
,
newValue
)
->
oldValue
,
sb
.
append
(
0
).
append
(
" "
);
LinkedHashMap:
:
new
));
List
<
Integer
>
hisensePhaseTimeList
=
new
ArrayList
<>(
16
);
for
(
Map
.
Entry
<
Integer
,
Integer
>
entry
:
sortMap
.
entrySet
())
{
hisensePhaseTimeList
.
add
(
entry
.
getValue
());
}
splitSend
=
hisensePhaseTimeList
.
stream
().
map
(
String:
:
valueOf
).
collect
(
Collectors
.
joining
(
","
));
}
}
// 下发临时方案
}
TempSchemeSendVO
tempSchemeSendVO
=
new
TempSchemeSendVO
();
log
.
debug
(
"平台临时方案下发相位信息:{}"
,
sb
.
substring
(
0
,
sb
.
length
()
-
1
).
toString
());
tempSchemeSendVO
.
setCrossId
(
crossId
);
log
.
debug
(
"平台临时方案下发相位信息-原始相位:{}"
,
mapper
.
writeValueAsString
(
crossSchemeRingsToStagesPO
));
tempSchemeSendVO
.
setPattern
(
String
.
valueOf
(
schemeId
));
// 下发临时方案
tempSchemeSendVO
.
setCycle
(
String
.
valueOf
(
cycle
));
TempSchemeSendVO
tempSchemeSendVO
=
new
TempSchemeSendVO
();
tempSchemeSendVO
.
setOffset
(
String
.
valueOf
(
offset
));
tempSchemeSendVO
.
setCrossId
(
crossId
);
tempSchemeSendVO
.
setType
(
"9"
);
tempSchemeSendVO
.
setCycle
(
String
.
valueOf
(
cycle
));
tempSchemeSendVO
.
setSplit
(
splitSend
);
tempSchemeSendVO
.
setType
(
"9"
);
JsonViewObject
jsonViewObject1
=
tempSchemeDetail
(
tempSchemeSendVO
);
tempSchemeSendVO
.
setPattern
(
String
.
valueOf
(
schemeId
));
if
(
Objects
.
nonNull
(
jsonViewObject1
)
&&
Objects
.
equals
(
200
,
jsonViewObject1
.
getCode
()))
{
tempSchemeSendVO
.
setOffset
(
crossSchemeRingsToStagesPO
.
getOffset
());
// todo 需要确认,是不是前端传。默认原方案
return
JsonViewObject
.
newInstance
().
success
(
"方案相位绿灯时间优化下发成功"
);
tempSchemeSendVO
.
setSplit
(
sb
.
substring
(
0
,
sb
.
length
()
-
1
).
toString
());
try
{
JsonViewObject
tempSchemeRes
=
this
.
tempSchemeDetail
(
tempSchemeSendVO
);
if
(
Objects
.
nonNull
(
tempSchemeRes
)
&&
200
==
tempSchemeRes
.
getCode
())
{
return
result
.
success
(
"平台临时方案下发"
);
}
else
{
}
else
{
log
.
error
(
"
方案相位绿灯时间优化下发异常:{}"
,
jsonViewObject1
);
log
.
error
(
"
平台临时方案下发-海信临时方案下发异常:{}"
,
tempSchemeRes
);
re
turn
JsonViewObject
.
newInstance
().
fail
(
"海信临时方案接口远程调用
异常"
);
re
sult
.
fail
(
"平台临时方案下发-海信临时方案下发
异常"
);
}
}
}
else
{
}
catch
(
Exception
e
)
{
log
.
error
(
"
根据路口号和方案号查询环转阶段异常:{}"
,
jsonViewObject
);
log
.
error
(
"
平台临时方案下发-海信临时方案下发异常:{}"
,
e
);
re
turn
JsonViewObject
.
newInstance
().
fail
(
"根据路口号和方案号查询环转阶段
异常"
);
re
sult
.
fail
(
"平台临时方案下发-海信临时方案下发
异常"
);
}
}
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
log
.
error
(
"
方案相位绿灯时间优化下发异常,异常信息:{}
"
,
e
);
log
.
error
(
"
平台临时方案下发异常:
"
,
e
);
throw
new
RuntimeException
(
e
);
throw
new
RuntimeException
(
e
);
}
}
return
result
.
fail
(
"平台临时方案下发异常"
);
}
}
}
}
signal-utc-service/src/main/java/net/wanji/utc/task/HisenseSchemeRingTask.java
View file @
aec32bae
...
@@ -31,7 +31,7 @@ import java.util.stream.Collectors;
...
@@ -31,7 +31,7 @@ import java.util.stream.Collectors;
* @date 2025/03/26 10:00
* @date 2025/03/26 10:00
* @description 每十分钟同步海信信号机方案环图请求
* @description 每十分钟同步海信信号机方案环图请求
*/
*/
@Component
//
@Component
@Slf4j
@Slf4j
@Profile
(
"docker"
)
@Profile
(
"docker"
)
public
class
HisenseSchemeRingTask
{
public
class
HisenseSchemeRingTask
{
...
...
signal-utc-service/src/main/java/net/wanji/utc/task/SignalCommandSyncTask.java
View file @
aec32bae
package
net
.
wanji
.
utc
.
task
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
lombok.extern.slf4j.Slf4j
;
import
net.wanji.common.utils.tool.BeanListUtils
;
import
net.wanji.databus.dao.entity.SignalCommandLogPO
;
import
net.wanji.databus.dao.entity.SignalCommandPO
;
import
net.wanji.databus.dao.mapper.SignalCommandLogPOMapper
;
import
net.wanji.databus.dao.mapper.SignalCommandPOMapper
;
import
net.wanji.utc.common.typeenum.DateStyle
;
import
net.wanji.utc.dto.LightStatusAlarmDTO
;
import
net.wanji.utc.kafka.ProducerHandler
;
import
net.wanji.utc.util.DateUtils
;
import
net.wanji.utc.util.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Profile
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.util.CollectionUtils
;
import
javax.annotation.Resource
;
import
java.util.*
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.stream.Collectors
;
/** * @author duanruiming * @date 2024/12/26 10:33 * @description 信号命令日志同步 */
@Component
@Slf4j
@Profile
(
"docker"
)
public
class
SignalCommandSyncTask
{
@Resource
private
SignalCommandPOMapper
signalCommandPOMapper
;
@Resource
SignalCommandLogPOMapper
signalCommandLogPOMapper
;
@Autowired
private
ProducerHandler
producerHandler
;
/** * 信号机状态控制模式缓存,更新数据库后查询 */
public
static
Map
<
String
,
SignalCommandPO
>
signalStatusRunModelMap
=
new
HashMap
<>();
@Scheduled
(
fixedRate
=
5
*
1000
,
initialDelay
=
30
*
1000
)
public
void
sync
()
{
try
{
ConcurrentHashMap
<
String
,
SignalCommandPO
>
crossLightsStatusMap
=
SignalStatusTask
.
crossLightsStatusMap
;
LambdaQueryWrapper
<
SignalCommandPO
>
lambdaQueryWrapper
=
new
LambdaQueryWrapper
();
List
<
SignalCommandPO
>
signalCommandPOS
=
signalCommandPOMapper
.
selectList
(
lambdaQueryWrapper
);
long
start
=
System
.
currentTimeMillis
();
if
(
Objects
.
nonNull
(
crossLightsStatusMap
)
&&
!
crossLightsStatusMap
.
isEmpty
())
{
List
<
SignalCommandPO
>
insertList
=
new
ArrayList
<>();
List
<
SignalCommandPO
>
updateList
=
new
ArrayList
<>();
for
(
Map
.
Entry
<
String
,
SignalCommandPO
>
entry
:
crossLightsStatusMap
.
entrySet
())
{
try
{
String
crossId
=
entry
.
getKey
();
SignalCommandPO
statusRunModelCache
=
entry
.
getValue
();
Integer
statusCache
=
statusRunModelCache
.
getStatus
();
String
runModeCache
=
statusRunModelCache
.
getRunMode
();
String
lampTime
=
statusRunModelCache
.
getLampTime
();
if
(!
CollectionUtils
.
isEmpty
(
signalCommandPOS
))
{
Map
<
String
,
SignalCommandPO
>
command4DBMap
=
signalCommandPOS
.
stream
().
collect
(
Collectors
.
toMap
(
SignalCommandPO:
:
getCrossId
,
signalCommandPO
->
signalCommandPO
));
if
(
command4DBMap
.
containsKey
(
crossId
))
{
SignalCommandPO
updatePO
=
command4DBMap
.
get
(
crossId
);
Integer
status4DB
=
updatePO
.
getStatus
();
String
runMode4DB
=
updatePO
.
getRunMode
();
if
(
Objects
.
equals
(
status4DB
,
statusCache
)
&&
StringUtils
.
equals
(
runMode4DB
,
runModeCache
))
{
// 路口编号 状态 控制模式相同,不更新 continue; } else { updatePO.setStatus(statusCache); updatePO.setRunMode(runModeCache); updatePO.setUpdateTime(new Date()); updatePO.setLampTime(lampTime); updateList.add(updatePO); } } else { // 表中没有当前路口插入数据 insertList.add(insertSignalCommandPO(crossId, statusCache, runModeCache, lampTime)); } } else { // 表中一条数据没有,插入路口 insertList.add(insertSignalCommandPO(crossId, statusCache, runModeCache, lampTime)); log.error("路口灯态缓存为空:{}", crossLightsStatusMap); } } catch (Exception e) { log.error("路口在线状态控制模式更新失败,路口编号信息:{}", entry, e); } } saveAndUpdate(insertList, updateList); LambdaQueryWrapper<SignalCommandPO> lambdaQueryWrapper2 = new LambdaQueryWrapper(); List<SignalCommandPO> listUpdated = signalCommandPOMapper.selectList(lambdaQueryWrapper2); if (!CollectionUtils.isEmpty(listUpdated)) { for (SignalCommandPO signalCommandPO : listUpdated) { String crossId = signalCommandPO.getCrossId(); signalStatusRunModelMap.put(crossId, signalCommandPO); } } sendAlarmKafka(listUpdated); } else { log.error("从路口灯态缓存获取控制模式在线离线状态为空:{}", crossLightsStatusMap); } long end = System.currentTimeMillis(); log.info("SignalCommandSyncTask 定时任务执行时间: {} ms",end - start); } catch (Exception e) { log.error("信号机状态同步异常:", e); } } @Transactional(rollbackFor = Exception.class) public void saveAndUpdate(List<SignalCommandPO> insertList, List<SignalCommandPO> updateList) { try { if (!CollectionUtils.isEmpty(insertList)) { signalCommandPOMapper.insertBatch(insertList); List<SignalCommandLogPO> signalCommandLogPOS = new ArrayList<>(insertList.size()); BeanListUtils.populateList(insertList, signalCommandLogPOS, SignalCommandLogPO.class); signalCommandLogPOMapper.insertBatch(signalCommandLogPOS); } if (!CollectionUtils.isEmpty(updateList)) { signalCommandPOMapper.updateBatch(updateList); List<SignalCommandLogPO> signalCommandLogPOS = new ArrayList<>(updateList.size()); BeanListUtils.populateList(updateList, signalCommandLogPOS, SignalCommandLogPO.class); signalCommandLogPOMapper.insertBatch(signalCommandLogPOS); log.info("路口状态控制模式变动,数据库更新成功:{}", updateList); } } catch (Exception e) { log.error("路口状态控制模式变动,数据库更新失败:", e); throw new RuntimeException(e); } } private static SignalCommandPO insertSignalCommandPO(String crossId, Integer statusCache, String runModeCache, String lampTime) { SignalCommandPO insertPO = new SignalCommandPO(); insertPO.setCrossId(crossId); insertPO.setStatus(statusCache); insertPO.setRunMode(runModeCache); insertPO.setInsertTime(new Date()); insertPO.setLampTime(lampTime); return insertPO; } private void sendAlarmKafka(List<SignalCommandPO> signalCommandPOS) throws Exception { List<LightStatusAlarmDTO> lightStatusAlarmDTOS = new ArrayList<>(); try { if (!CollectionUtils.isEmpty(signalCommandPOS)) { for (SignalCommandPO signalCommandPO : signalCommandPOS) { LightStatusAlarmDTO dto = new LightStatusAlarmDTO(); dto.setCrossId(signalCommandPO.getCrossId()); dto.setCommandMsg(signalCommandPO.getResultMessage()); dto.setCommandResult(signalCommandPO.getCommandResult()); dto.setCount(signalCommandPO.getUpdateCount()); dto.setStatus(signalCommandPO.getStatus()); dto.setRunMode(signalCommandPO.getRunMode()); dto.setMachineTimestamp(signalCommandPO.getLampTime()); Date date = DateUtils.stringToDate(signalCommandPO.getQueryTime(), DateStyle.YYYY_MM_DD_HH_MM_SS.getValue()); dto.setRequestTime(date); dto.setDbTime(signalCommandPO.getUpdateTime()); lightStatusAlarmDTOS.add(dto); } } producerHandler.send("light_status_alarm", lightStatusAlarmDTOS); } catch (Exception e) { log.error("灯态告警推送kafka失败:", e); throw new RuntimeException(e); } } }
package
net
.
wanji
.
utc
.
task
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
lombok.extern.slf4j.Slf4j
;
import
net.wanji.common.utils.tool.BeanListUtils
;
import
net.wanji.databus.dao.entity.SignalCommandLogPO
;
import
net.wanji.databus.dao.entity.SignalCommandPO
;
import
net.wanji.databus.dao.mapper.SignalCommandLogPOMapper
;
import
net.wanji.databus.dao.mapper.SignalCommandPOMapper
;
import
net.wanji.utc.common.typeenum.DateStyle
;
import
net.wanji.utc.dto.LightStatusAlarmDTO
;
import
net.wanji.utc.kafka.ProducerHandler
;
import
net.wanji.utc.util.DateUtils
;
import
net.wanji.utc.util.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.context.annotation.Profile
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.util.CollectionUtils
;
import
javax.annotation.Resource
;
import
java.util.*
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.stream.Collectors
;
/** * @author duanruiming * @date 2024/12/26 10:33 * @description 信号命令日志同步 */
//@Component @Slf4j @Profile("docker") public class SignalCommandSyncTask { @Resource private SignalCommandPOMapper signalCommandPOMapper; @Resource SignalCommandLogPOMapper signalCommandLogPOMapper; @Autowired private ProducerHandler producerHandler; /** * 信号机状态控制模式缓存,更新数据库后查询 */ public static Map<String, SignalCommandPO> signalStatusRunModelMap = new HashMap<>(); @Scheduled(fixedRate = 5 * 1000, initialDelay = 30 * 1000) public void sync() { try { ConcurrentHashMap<String, SignalCommandPO> crossLightsStatusMap = SignalStatusTask.crossLightsStatusMap; LambdaQueryWrapper<SignalCommandPO> lambdaQueryWrapper = new LambdaQueryWrapper(); List<SignalCommandPO> signalCommandPOS = signalCommandPOMapper.selectList(lambdaQueryWrapper); long start = System.currentTimeMillis(); if (Objects.nonNull(crossLightsStatusMap) && !crossLightsStatusMap.isEmpty()) { List<SignalCommandPO> insertList = new ArrayList<>(); List<SignalCommandPO> updateList = new ArrayList<>(); for (Map.Entry<String, SignalCommandPO> entry : crossLightsStatusMap.entrySet()) { try { String crossId = entry.getKey(); SignalCommandPO statusRunModelCache = entry.getValue(); Integer statusCache = statusRunModelCache.getStatus(); String runModeCache = statusRunModelCache.getRunMode(); String lampTime = statusRunModelCache.getLampTime(); if (!CollectionUtils.isEmpty(signalCommandPOS)) { Map<String, SignalCommandPO> command4DBMap = signalCommandPOS.stream().collect(Collectors.toMap(SignalCommandPO::getCrossId, signalCommandPO -> signalCommandPO)); if (command4DBMap.containsKey(crossId)) { SignalCommandPO updatePO = command4DBMap.get(crossId); Integer status4DB = updatePO.getStatus(); String runMode4DB = updatePO.getRunMode(); if (Objects.equals(status4DB, statusCache) && StringUtils.equals(runMode4DB, runModeCache)) { // 路口编号 状态 控制模式相同,不更新 continue; } else { updatePO.setStatus(statusCache); updatePO.setRunMode(runModeCache); updatePO.setUpdateTime(new Date()); updatePO.setLampTime(lampTime); updateList.add(updatePO); } } else { // 表中没有当前路口插入数据 insertList.add(insertSignalCommandPO(crossId, statusCache, runModeCache, lampTime)); } } else { // 表中一条数据没有,插入路口 insertList.add(insertSignalCommandPO(crossId, statusCache, runModeCache, lampTime)); log.error("路口灯态缓存为空:{}", crossLightsStatusMap); } } catch (Exception e) { log.error("路口在线状态控制模式更新失败,路口编号信息:{}", entry, e); } } saveAndUpdate(insertList, updateList); LambdaQueryWrapper<SignalCommandPO> lambdaQueryWrapper2 = new LambdaQueryWrapper(); List<SignalCommandPO> listUpdated = signalCommandPOMapper.selectList(lambdaQueryWrapper2); if (!CollectionUtils.isEmpty(listUpdated)) { for (SignalCommandPO signalCommandPO : listUpdated) { String crossId = signalCommandPO.getCrossId(); signalStatusRunModelMap.put(crossId, signalCommandPO); } } sendAlarmKafka(listUpdated); } else { log.error("从路口灯态缓存获取控制模式在线离线状态为空:{}", crossLightsStatusMap); } long end = System.currentTimeMillis(); log.info("SignalCommandSyncTask 定时任务执行时间: {} ms",end - start); } catch (Exception e) { log.error("信号机状态同步异常:", e); } } @Transactional(rollbackFor = Exception.class) public void saveAndUpdate(List<SignalCommandPO> insertList, List<SignalCommandPO> updateList) { try { if (!CollectionUtils.isEmpty(insertList)) { signalCommandPOMapper.insertBatch(insertList); List<SignalCommandLogPO> signalCommandLogPOS = new ArrayList<>(insertList.size()); BeanListUtils.populateList(insertList, signalCommandLogPOS, SignalCommandLogPO.class); signalCommandLogPOMapper.insertBatch(signalCommandLogPOS); } if (!CollectionUtils.isEmpty(updateList)) { signalCommandPOMapper.updateBatch(updateList); List<SignalCommandLogPO> signalCommandLogPOS = new ArrayList<>(updateList.size()); BeanListUtils.populateList(updateList, signalCommandLogPOS, SignalCommandLogPO.class); signalCommandLogPOMapper.insertBatch(signalCommandLogPOS); log.info("路口状态控制模式变动,数据库更新成功:{}", updateList); } } catch (Exception e) { log.error("路口状态控制模式变动,数据库更新失败:", e); throw new RuntimeException(e); } } private static SignalCommandPO insertSignalCommandPO(String crossId, Integer statusCache, String runModeCache, String lampTime) { SignalCommandPO insertPO = new SignalCommandPO(); insertPO.setCrossId(crossId); insertPO.setStatus(statusCache); insertPO.setRunMode(runModeCache); insertPO.setInsertTime(new Date()); insertPO.setLampTime(lampTime); return insertPO; } private void sendAlarmKafka(List<SignalCommandPO> signalCommandPOS) throws Exception { List<LightStatusAlarmDTO> lightStatusAlarmDTOS = new ArrayList<>(); try { if (!CollectionUtils.isEmpty(signalCommandPOS)) { for (SignalCommandPO signalCommandPO : signalCommandPOS) { LightStatusAlarmDTO dto = new LightStatusAlarmDTO(); dto.setCrossId(signalCommandPO.getCrossId()); dto.setCommandMsg(signalCommandPO.getResultMessage()); dto.setCommandResult(signalCommandPO.getCommandResult()); dto.setCount(signalCommandPO.getUpdateCount()); dto.setStatus(signalCommandPO.getStatus()); dto.setRunMode(signalCommandPO.getRunMode()); dto.setMachineTimestamp(signalCommandPO.getLampTime()); Date date = DateUtils.stringToDate(signalCommandPO.getQueryTime(), DateStyle.YYYY_MM_DD_HH_MM_SS.getValue()); dto.setRequestTime(date); dto.setDbTime(signalCommandPO.getUpdateTime()); lightStatusAlarmDTOS.add(dto); } } producerHandler.send("light_status_alarm", lightStatusAlarmDTOS); } catch (Exception e) { log.error("灯态告警推送kafka失败:", e); throw new RuntimeException(e); } } }
\ No newline at end of file
\ No newline at end of file
...
...
signal-utc-service/src/main/java/net/wanji/utc/vo/SchemePhaseGreenTimeOptVO.java
View file @
aec32bae
...
@@ -18,7 +18,7 @@ public class SchemePhaseGreenTimeOptVO {
...
@@ -18,7 +18,7 @@ public class SchemePhaseGreenTimeOptVO {
@ApiModelProperty
(
name
=
"路口ID"
,
notes
=
""
)
@ApiModelProperty
(
name
=
"路口ID"
,
notes
=
""
)
private
String
crossId
;
private
String
crossId
;
@ApiModelProperty
(
name
=
"原方案ID"
,
notes
=
""
)
@ApiModelProperty
(
name
=
"原方案ID"
,
notes
=
""
)
private
Integer
scheme
Id
;
private
Integer
scheme
No
;
@ApiModelProperty
(
value
=
"优化模式 0-信控调优平台优化"
)
@ApiModelProperty
(
value
=
"优化模式 0-信控调优平台优化"
)
private
Integer
optType
;
private
Integer
optType
;
@ApiModelProperty
(
value
=
"周期"
)
@ApiModelProperty
(
value
=
"周期"
)
...
...
signal-utc-service/src/main/resources/bootstrap-docker.yaml
View file @
aec32bae
...
@@ -15,4 +15,4 @@ spring:
...
@@ -15,4 +15,4 @@ spring:
password
:
Nacos@2025
password
:
Nacos@2025
inforsuite
:
inforsuite
:
license-path
:
D:\\license
license-path
:
/license
\ No newline at end of file
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment