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
c14b0c0c
Commit
c14b0c0c
authored
Nov 26, 2024
by
duanruiming
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/master'
parents
5b7ce9e5
eeed6c73
Changes
15
Show whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
445 additions
and
37 deletions
+445
-37
signal-web-service-1.0.0.sh
...-control-service/src/main/bin/signal-web-service-1.0.0.sh
+2
-2
MybatisPlusGenerator.java
...ice/src/main/java/net/wanji/web/MybatisPlusGenerator.java
+12
-6
GreenwaveInducesController.java
...nji/opt/controller/induce/GreenwaveInducesController.java
+1
-0
InduceSendController.java
...net/wanji/opt/controller/induce/InduceSendController.java
+89
-4
StrategyGreenOptHistMapper.java
.../net/wanji/opt/dao/mapper/StrategyGreenOptHistMapper.java
+5
-0
EventAlarmMapper.java
...java/net/wanji/opt/dao/mapper/trend/EventAlarmMapper.java
+4
-2
InduceDTO.java
...ice/src/main/java/net/wanji/opt/dto/induce/InduceDTO.java
+2
-0
MessageParam.java
.../src/main/java/net/wanji/opt/dto/induce/MessageParam.java
+1
-1
GreenwaveInduces.java
.../src/main/java/net/wanji/opt/entity/GreenwaveInduces.java
+12
-0
GreenwaveInducesHist.java
.../main/java/net/wanji/opt/entity/GreenwaveInducesHist.java
+0
-10
EventAlarmPO.java
...ce/src/main/java/net/wanji/opt/po/trend/EventAlarmPO.java
+6
-0
InduceSendServiceImpl.java
.../wanji/opt/service/induce/impl/InduceSendServiceImpl.java
+21
-10
InducesMonitorTask.java
.../src/main/java/net/wanji/opt/task/InducesMonitorTask.java
+269
-0
signal-optimize-service-1.0.0.sh
...e/src/main/resources/bin/signal-optimize-service-1.0.0.sh
+19
-0
induce_down.xml
...mize-service/src/main/resources/templates/induce_down.xml
+2
-2
No files found.
signal-control-service/src/main/bin/signal-web-service-1.0.0.sh
View file @
c14b0c0c
#!/bin/bash
jarName
=
"signal-control-service-
1.0.0
.jar"
jarName
=
"signal-control-service-
0.2.1
.jar"
NR
=
$(
ps
-ef
|
grep
"
${
jarName
}
"
|
grep
-v
grep
|
wc
-l
)
if
[
${
NR
}
!=
0
]
...
...
@@ -16,4 +16,4 @@ sleep 2
echo
"重启Java程序进程..."
nohup
java
-Xms2048m
-Xmx2048m
-
jar
-XX
:+HeapDumpOnOutOfMemoryError
-XX
:HeapDumpPath
=
/home/javaApp/heapdump.hprof
-agentlib
:jdwp
=
transport
=
dt_socket,server
=
y,suspend
=
n,address
=
15115
-Djava
.rmi.server.hostname
=
10.100.1.87
-Dcom
.sun.management.jmxremote
-Dcom
.sun.management.jmxremote.port
=
12345
-Dcom
.sun.management.jmxremote.ssl
=
false
-Dcom
.sun.management.jmxremote.authenticate
=
false
signal-control-service-1.0.0.jar
--spring
.profiles.active
=
dev
>
/dev/null 2>&1 &
nohup
java
-Xms2048m
-Xmx2048m
-
XX
:+HeapDumpOnOutOfMemoryError
-XX
:HeapDumpPath
=
/home/javaApp/heapdump.hprof
-agentlib
:jdwp
=
transport
=
dt_socket,server
=
y,suspend
=
n,address
=
15115
-Dcom
.sun.management.jmxremote.ssl
=
false
-Dcom
.sun.management.jmxremote.authenticate
=
false
-jar
../lib/
$jarName
--spring
.profiles.active
=
docker
>
/dev/null 2>&1 &
\ No newline at end of file
signal-control-service/src/main/java/net/wanji/web/MybatisPlusGenerator.java
View file @
c14b0c0c
...
...
@@ -14,18 +14,24 @@ import java.util.Collections;
public
class
MybatisPlusGenerator
{
private
static
final
String
PROJECT_PATH
=
System
.
getProperty
(
"user.dir"
);
private
static
final
String
OUTPUT_DIR
=
"signal-
control
-service/src/main/java"
;
private
static
final
String
AUTHOR
=
"
wj
"
;
private
static
final
String
URL
=
"jdbc:mysql://106.120.201.126:14726/
t_signal_control
?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&sessionVariables=sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'&useSSL=false&useCursorFetch=true"
;
private
static
final
String
OUTPUT_DIR
=
"signal-
optimize
-service/src/main/java"
;
private
static
final
String
AUTHOR
=
"
guoliang.dong
"
;
private
static
final
String
URL
=
"jdbc:mysql://106.120.201.126:14726/
wjdit_ecosystem_db_v1.0.0
?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&sessionVariables=sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'&useSSL=false&useCursorFetch=true"
;
private
static
final
String
DRIVER_NAME
=
"com.mysql.cj.jdbc.Driver"
;
private
static
final
String
USERNAME
=
"root"
;
private
static
final
String
PASSWORD
=
"Wanji300552"
;
private
static
final
String
[]
TABLES
=
{
"t_
base_area_info
"
"t_
device_induces
"
};
/**
* t_greenwave_induces
* t_greenwave_induces_hist
* t_induce_hist
* t_induce_template
*/
private
static
final
String
TEMPLATE_PATH
=
"/templates/mapper.xml.ftl"
;
private
static
final
String
MAPPER_PATH
=
"signal-
control
-service/src/main/resources/mapper/"
;
private
static
final
String
PARENT
=
"net.wanji.
web
"
;
private
static
final
String
MAPPER_PATH
=
"signal-
optimize
-service/src/main/resources/mapper/"
;
private
static
final
String
PARENT
=
"net.wanji.
opt
"
;
public
static
void
main
(
String
[]
args
)
{
...
...
signal-optimize-service/src/main/java/net/wanji/opt/controller/induce/GreenwaveInducesController.java
View file @
c14b0c0c
...
...
@@ -90,6 +90,7 @@ public class GreenwaveInducesController {
induceDTO
.
setRidDir
(
deviceInduces
.
get
(
0
).
getRidDir
());
induceDTO
.
setResolutionWidth
(
deviceInduces
.
get
(
0
).
getResolutionWidth
());
induceDTO
.
setResolutionHeight
(
deviceInduces
.
get
(
0
).
getResolutionHeight
());
induceDTO
.
setWkt
(
deviceInduces
.
get
(
0
).
getWkt
());
}
//获取上屏状态
induceDTO
.
setStatus
(
o
.
getStatus
());
...
...
signal-optimize-service/src/main/java/net/wanji/opt/controller/induce/InduceSendController.java
View file @
c14b0c0c
package
net
.
wanji
.
opt
.
controller
.
induce
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
freemarker.template.TemplateException
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
net.wanji.common.framework.Constants
;
import
net.wanji.common.framework.rest.JsonViewObject
;
import
net.wanji.common.utils.tool.DateUtil
;
import
net.wanji.opt.entity.GreenwaveInduces
;
import
net.wanji.opt.entity.InduceHist
;
import
net.wanji.opt.entity.InduceTemplate
;
import
net.wanji.opt.dto.induce.MessageParam
;
import
net.wanji.opt.service.induce.GreenwaveInducesService
;
import
net.wanji.opt.service.induce.InduceHistService
;
import
net.wanji.opt.service.induce.InduceSendService
;
import
net.wanji.opt.service.induce.InduceTemplateService
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -15,8 +23,11 @@ import org.springframework.http.HttpStatus;
import
org.springframework.http.ResponseEntity
;
import
org.springframework.web.bind.annotation.*
;
import
javax.ws.rs.core.MediaType
;
import
java.io.IOException
;
import
java.nio.charset.StandardCharsets
;
import
java.util.Date
;
import
java.util.List
;
@Api
(
value
=
"InduceSendController"
,
description
=
"诱导屏-下发消息接口(对接易华录)"
)
@RestController
...
...
@@ -27,10 +38,16 @@ public class InduceSendController {
@Autowired
private
InduceSendService
induceSendService
;
@Autowired
private
InduceHistService
induceHistService
;
@Autowired
private
InduceTemplateService
induceTemplateService
;
@Autowired
private
GreenwaveInducesService
greenwaveInducesService
;
@ApiOperation
(
value
=
"发送诱导信息"
,
notes
=
"发送诱导信息"
,
response
=
JsonViewObject
.
class
,
produces
=
MediaType
.
APPLICATION_JSON
)
@PostMapping
(
"/send"
)
public
JsonViewObject
send
(
@RequestBody
MessageParam
param
)
{
JsonViewObject
jsonView
=
JsonViewObject
.
newInstance
();
...
...
@@ -39,30 +56,98 @@ public class InduceSendController {
return
jsonView
.
success
();
}
catch
(
Exception
e
)
{
log
.
info
(
e
.
getMessage
());
return
jsonView
.
fail
(
"发送失败"
);
return
jsonView
.
fail
(
"发送诱导信息失败"
);
}
}
@ApiOperation
(
value
=
"按绿波带编号批量发送诱导信息"
,
notes
=
"按绿波带编号批量发送诱导信息"
,
response
=
JsonViewObject
.
class
,
produces
=
MediaType
.
APPLICATION_JSON
)
@PostMapping
(
"/batchSend"
)
public
JsonViewObject
batchSend
(
@RequestBody
MessageParam
param
)
{
JsonViewObject
jsonView
=
JsonViewObject
.
newInstance
();
try
{
//查询绿波带信息,关联绿波路口,根据绿波路口查询关联诱导屏下发
LambdaQueryWrapper
<
GreenwaveInduces
>
greenwaveInducesQueryWrapper
=
new
LambdaQueryWrapper
<>();
greenwaveInducesQueryWrapper
.
eq
(
GreenwaveInduces:
:
getGreenId
,
param
.
getGreenId
());
List
<
GreenwaveInduces
>
greenwaveInducesList
=
greenwaveInducesService
.
list
(
greenwaveInducesQueryWrapper
);
for
(
GreenwaveInduces
greenwaveInduces:
greenwaveInducesList
)
{
LambdaQueryWrapper
<
InduceTemplate
>
induceTemplateQueryWrapper
=
new
LambdaQueryWrapper
<>();
induceTemplateQueryWrapper
.
eq
(
InduceTemplate:
:
getEquipCode
,
greenwaveInduces
.
getEquipCode
());
List
<
InduceTemplate
>
induceTemplateList
=
induceTemplateService
.
list
(
induceTemplateQueryWrapper
);
for
(
InduceTemplate
induceTemplate:
induceTemplateList
)
{
param
.
setTemplateId
(
induceTemplate
.
getId
());
param
.
setInduceId
(
greenwaveInduces
.
getId
());
param
.
setEquipCode
(
greenwaveInduces
.
getEquipCode
());
param
.
setPlayorder
(
induceTemplateList
.
size
());
param
.
setDuration
(
greenwaveInduces
.
getDuration
());
param
.
setStartTime
(
DateUtil
.
format
(
new
Date
(),
Constants
.
DATE_FORMAT
.
E_DATE_FORMAT_SECOND
));
param
.
setEndTime
(
DateUtil
.
format
(
System
.
currentTimeMillis
()
+
1000
*
30
,
Constants
.
DATE_FORMAT
.
E_DATE_FORMAT_SECOND
));
induceSendService
.
send
(
param
);
}
}
return
jsonView
.
success
();
}
catch
(
Exception
e
)
{
log
.
info
(
e
.
getMessage
());
return
jsonView
.
fail
(
"批量发布诱导信息失败"
);
}
}
/**
* 获取诱导发布图片
*/
@ApiOperation
(
value
=
"根据设备编号获取诱导发布图片"
,
notes
=
"根据设备编号获取诱导发布图片"
)
@GetMapping
(
value
=
"/fileCode"
)
public
ResponseEntity
<
byte
[]>
ftpFileByCode
(
@RequestParam
(
"equipCode"
)
String
equipCode
)
{
// 根据 equipCode 获取文件名
LambdaQueryWrapper
<
InduceHist
>
InduceHistQueryWrapper
=
new
LambdaQueryWrapper
<>();
InduceHistQueryWrapper
.
eq
(
InduceHist:
:
getEquipCode
,
equipCode
);
InduceHistQueryWrapper
.
orderByDesc
(
InduceHist:
:
getCreateTime
);
InduceHist
pictureFile
=
this
.
induceHistService
.
getOne
(
InduceHistQueryWrapper
,
false
);
if
(
pictureFile
==
null
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
OK
)
.
body
(
"无效的文件ID"
.
getBytes
(
StandardCharsets
.
UTF_8
));
}
try
{
// 获取ftp服务器图片
byte
[]
imageBytes
=
this
.
induceSendService
.
downloadImage
(
pictureFile
.
getFilePath
());
if
(
imageBytes
!=
null
&&
imageBytes
.
length
>
0
)
{
// 设置响应头
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
set
(
"Content-Type"
,
"image/jpeg"
);
// 图片类型
headers
.
set
(
"Content-Length"
,
String
.
valueOf
(
imageBytes
.
length
));
// 设置内容长度
headers
.
set
(
"Content-Disposition"
,
"inline; filename=\""
+
pictureFile
.
getSourceId
()
+
".bmp\""
);
// 设置文件名
// 返回响应
return
new
ResponseEntity
<>(
imageBytes
,
headers
,
HttpStatus
.
OK
);
}
else
{
return
ResponseEntity
.
status
(
HttpStatus
.
OK
)
.
body
(
"未查询到对应文件"
.
getBytes
(
StandardCharsets
.
UTF_8
));
}
}
catch
(
IOException
e
)
{
log
.
error
(
"ftp文件下载失败: "
,
e
.
getMessage
());
return
ResponseEntity
.
status
(
HttpStatus
.
OK
)
.
body
(
"程序查询错误请联系管理员"
.
getBytes
(
StandardCharsets
.
UTF_8
));
}
}
/**
* 获取ftp图片
*/
@GetMapping
(
value
=
"/file"
)
public
ResponseEntity
<
byte
[]>
ftpFile
(
@RequestParam
(
"fileId"
)
Long
fileId
)
{
// 根据 fileId 获取文件名
Induce
Template
pictureFile
=
this
.
induceTemplate
Service
.
getById
(
fileId
);
Induce
Hist
pictureFile
=
this
.
induceHist
Service
.
getById
(
fileId
);
if
(
pictureFile
==
null
)
{
return
ResponseEntity
.
status
(
HttpStatus
.
OK
)
.
body
(
"无效的文件ID"
.
getBytes
(
StandardCharsets
.
UTF_8
));
}
try
{
// 获取ftp服务器图片
byte
[]
imageBytes
=
this
.
induceSendService
.
downloadImage
(
pictureFile
.
getFile
Name
());
byte
[]
imageBytes
=
this
.
induceSendService
.
downloadImage
(
pictureFile
.
getFile
Path
());
if
(
imageBytes
!=
null
&&
imageBytes
.
length
>
0
)
{
// 设置响应头
HttpHeaders
headers
=
new
HttpHeaders
();
headers
.
set
(
"Content-Type"
,
"image/jpeg"
);
// 图片类型
headers
.
set
(
"Content-Length"
,
String
.
valueOf
(
imageBytes
.
length
));
// 设置内容长度
headers
.
set
(
"Content-Disposition"
,
"inline; filename=\""
+
pictureFile
.
get
FileName
()
+
"
\""
);
// 设置文件名
headers
.
set
(
"Content-Disposition"
,
"inline; filename=\""
+
pictureFile
.
get
SourceId
()
+
".bmp
\""
);
// 设置文件名
// 返回响应
return
new
ResponseEntity
<>(
imageBytes
,
headers
,
HttpStatus
.
OK
);
}
else
{
...
...
signal-optimize-service/src/main/java/net/wanji/opt/dao/mapper/StrategyGreenOptHistMapper.java
View file @
c14b0c0c
...
...
@@ -3,10 +3,15 @@ package net.wanji.opt.dao.mapper;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
net.wanji.opt.po.StrategyGreenOptHistEntity
;
import
java.util.List
;
/**
* @author duanruiming
* @date 2024/11/19 18:02
* @description 神思推送绿波时序图信息
*/
public
interface
StrategyGreenOptHistMapper
extends
BaseMapper
<
StrategyGreenOptHistEntity
>
{
List
<
StrategyGreenOptHistEntity
>
selectByGreenId
(
String
greenId
);
}
signal-optimize-service/src/main/java/net/wanji/opt/dao/mapper/trend/EventAlarmMapper.java
View file @
c14b0c0c
package
net
.
wanji
.
opt
.
dao
.
mapper
.
trend
;
//import com.baomidou.dynamic.datasource.annotation.DS;
import
net.wanji.opt.po.trend.EventAlarmPO
;
import
org.apache.ibatis.annotations.Param
;
import
org.springframework.stereotype.Repository
;
//
import org.springframework.stereotype.Repository;
import
java.util.Date
;
import
java.util.List
;
@Repository
//@Repository
//@DS("webService")
public
interface
EventAlarmMapper
{
List
<
EventAlarmPO
>
selectByTodayTime
(
@Param
(
"todayTime"
)
Date
todayTime
);
}
\ No newline at end of file
signal-optimize-service/src/main/java/net/wanji/opt/dto/induce/InduceDTO.java
View file @
c14b0c0c
...
...
@@ -33,6 +33,8 @@ public class InduceDTO {
@ApiModelProperty
(
name
=
"屏幕分辨率高度"
)
private
BigDecimal
resolutionHeight
;
@ApiModelProperty
(
name
=
"设备坐标"
)
private
String
wkt
;
@ApiModelProperty
(
name
=
"关联绿波信息"
)
private
List
<
GreenwaveDTO
>
greenwaveList
;
...
...
signal-optimize-service/src/main/java/net/wanji/opt/dto/induce/MessageParam.java
View file @
c14b0c0c
...
...
@@ -39,7 +39,7 @@ public class MessageParam {
// private MultipartFile file;
@ApiModelProperty
(
value
=
"开始时间,格式 2024-11-07 00:00:00"
)
@JsonFormat
(
shape
=
JsonFormat
.
Shape
.
STRING
,
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
private
String
star
Tt
ime
=
""
;
private
String
star
tT
ime
=
""
;
@ApiModelProperty
(
value
=
"结束时间,格式 2024-11-07 00:00:00"
)
@JsonFormat
(
shape
=
JsonFormat
.
Shape
.
STRING
,
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
...
...
signal-optimize-service/src/main/java/net/wanji/opt/entity/GreenwaveInduces.java
View file @
c14b0c0c
...
...
@@ -76,6 +76,18 @@ public class GreenwaveInduces implements Serializable {
@TableField
(
"status"
)
private
Integer
status
;
/**
* 节目顺序号 顺着往下排
*/
@TableField
(
"playorder"
)
private
Integer
playorder
;
/**
* 为每一屏的停留时间
*/
@TableField
(
"duration"
)
private
Integer
duration
;
/**
* 创建时间
*/
...
...
signal-optimize-service/src/main/java/net/wanji/opt/entity/GreenwaveInducesHist.java
View file @
c14b0c0c
...
...
@@ -105,17 +105,7 @@ public class GreenwaveInducesHist implements Serializable {
@TableField
(
"control_opt_times"
)
private
String
controlOptTimes
;
/**
* 节目顺序号 顺着往下排
*/
@TableField
(
"playorder"
)
private
Integer
playorder
;
/**
* 为每一屏的停留时间
*/
@TableField
(
"duration"
)
private
Integer
duration
;
}
signal-optimize-service/src/main/java/net/wanji/opt/po/trend/EventAlarmPO.java
View file @
c14b0c0c
package
net
.
wanji
.
opt
.
po
.
trend
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
org.springframework.data.annotation.Id
;
import
java.util.Date
;
@Data
@EqualsAndHashCode
(
callSuper
=
false
)
@TableName
(
"t_event_data"
)
@ApiModel
(
value
=
"EventAlarmPO"
,
description
=
"交通事件表"
)
public
class
EventAlarmPO
{
/** 主键 */
@Id
...
...
signal-optimize-service/src/main/java/net/wanji/opt/service/induce/impl/InduceSendServiceImpl.java
View file @
c14b0c0c
package
net
.
wanji
.
opt
.
service
.
induce
.
impl
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
freemarker.template.Configuration
;
import
freemarker.template.Template
;
import
freemarker.template.TemplateException
;
import
lombok.extern.slf4j.Slf4j
;
import
net.wanji.opt.entity.DeviceInduces
;
import
net.wanji.opt.entity.GreenwaveInduces
;
import
net.wanji.opt.entity.InduceHist
;
import
net.wanji.opt.entity.InduceTemplate
;
import
net.wanji.opt.dto.induce.MessageParam
;
import
net.wanji.opt.service.DeviceInducesService
;
import
net.wanji.opt.service.induce.*
;
import
org.apache.commons.net.ftp.FTP
;
import
org.apache.commons.net.ftp.FTPClient
;
...
...
@@ -44,6 +47,9 @@ public class InduceSendServiceImpl implements InduceSendService {
@Autowired
private
GreenwaveInducesService
greenwaveInducesService
;
@Autowired
private
DeviceInducesService
deviceInducesService
;
@Autowired
private
Configuration
freemarkerConfig
;
...
...
@@ -78,16 +84,22 @@ public class InduceSendServiceImpl implements InduceSendService {
GreenwaveInduces
greenwaveinduces
=
greenwaveInducesService
.
getById
(
param
.
getInduceId
());
// 读取图片模板参数
InduceTemplate
induceTemplate
=
induceTemplateService
.
getById
(
param
.
getTemplateId
());
if
(
param
.
getFlg
()==
1
)
{
LambdaQueryWrapper
<
DeviceInduces
>
deviceQueryWrapper
=
new
LambdaQueryWrapper
<>();
deviceQueryWrapper
.
eq
(
DeviceInduces:
:
getEquipCode
,
induceTemplate
.
getEquipCode
());
DeviceInduces
deviceInduces
=
deviceInducesService
.
getOne
(
deviceQueryWrapper
);
param
.
setResolutionWidth
(
deviceInduces
.
getResolutionWidth
().
intValue
());
param
.
setResolutionHeight
(
deviceInduces
.
getResolutionHeight
().
intValue
());
}
// 获取图片字节数组
byte
[]
imageBytes
=
induceTemplate
.
getFileContent
();
if
(
imageBytes
!=
null
||
imageBytes
.
length
>
0
)
{
// 将字节数组转换为字节对象
BufferedImage
image
=
ImageIO
.
read
(
new
ByteArrayInputStream
(
imageBytes
));
// 修改图像中文字
addTextToImage
(
image
,
param
.
getContents
(),
induceTemplate
.
getTextX
(),
induceTemplate
.
getTextY
(),
induceTemplate
.
getTextSize
(),
induceTemplate
.
getTextSign
());
// 测试阶段保存图片到本地
//ImageIO.write(image, "bmp", new File("
/Users/shen/Desktop/" + pictureFil
e.getFileName()));
//ImageIO.write(image, "bmp", new File("
D:\\tmp\\" + induceTemplat
e.getFileName()));
// 上传文件至ftp
if
(
param
.
getFlg
()
==
1
)
{
String
dirName
=
LocalDate
.
now
().
format
(
DateTimeFormatter
.
ofPattern
(
"yyyyMMdd"
));
...
...
@@ -95,6 +107,7 @@ public class InduceSendServiceImpl implements InduceSendService {
String
filePath
=
uploadFile
(
image
,
dirName
,
fileName
);
param
.
setFtpPath
(
filePath
);
induceHist
.
setFilePath
(
PATH
+
dirName
+
"/"
+
fileName
);
greenwaveinduces
.
setSourceId
(
PATH
+
dirName
+
"/"
+
fileName
);
}
log
.
info
(
"上传文件至ftp-filePath:{}"
,
param
.
getFtpPath
());
// //如果已发布,则调用下屏服务
...
...
@@ -121,25 +134,23 @@ public class InduceSendServiceImpl implements InduceSendService {
// 可以去掉反斜杠
// message = message.replace("\\", "");
// 创建MessageProperties并设置内容类型
MessageProperties
messageProperties
=
new
MessageProperties
();
messageProperties
.
setContentType
(
"text/plain"
);
// 设置内容类型为text/plain
//
MessageProperties messageProperties = new MessageProperties();
//
messageProperties.setContentType("text/plain"); // 设置内容类型为text/plain
// 创建Message并设置内容
Message
messageSend
=
new
Message
(
message
.
getBytes
(),
messageProperties
);
rabbitTemplate
.
convertAndSend
(
""
,
queueName
,
messageSend
);
log
.
info
(
"mqtt发送信息-topic:{},queueName:{},message:{}"
,
queueName
,
message
Send
);
//
Message messageSend = new Message(message.getBytes(), messageProperties);
//rabbitTemplate.convertAndSend("",queueName, message
);
log
.
info
(
"mqtt发送信息-topic:{},queueName:{},message:{}"
,
queueName
,
message
);
//1、增加下发记录log 2、计数 3、标记已发布状体
induceHist
.
setEquipCode
(
induceTemplate
.
getEquipCode
());
induceHist
.
setGreenId
(
param
.
getGreenId
());
induceHistService
.
save
(
induceHist
);
//保存
旅游
诱导状态信息
//保存诱导状态信息
greenwaveinduces
.
setInducesCount
(
Objects
.
isNull
(
greenwaveinduces
.
getInducesCount
())
?
0
:
greenwaveinduces
.
getInducesCount
()+
1
);
greenwaveinduces
.
setStatus
(
1
);
greenwaveinduces
.
setSourceId
(
messageId
);
greenwaveInducesService
.
saveOrUpdate
(
greenwaveinduces
);
}
}
@Override
public
String
uploadFile
(
BufferedImage
image
,
String
directoryName
,
String
fileName
)
{
ByteArrayInputStream
inputStream
=
null
;
...
...
signal-optimize-service/src/main/java/net/wanji/opt/task/InducesMonitorTask.java
0 → 100644
View file @
c14b0c0c
package
net
.
wanji
.
opt
.
task
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
com.fasterxml.jackson.core.type.TypeReference
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
net.wanji.common.utils.tool.JacksonUtils
;
import
net.wanji.databus.dao.entity.GreenwaveCrossPOExt
;
import
net.wanji.databus.dao.mapper.CrossDataRealtimeMapper
;
import
net.wanji.databus.dao.mapper.GreenwaveCrossMapper
;
import
net.wanji.databus.dao.mapper.GreenwaveInfoMapper
;
import
net.wanji.opt.dao.mapper.StrategyDailyPlanInfoMapper
;
import
net.wanji.opt.dao.mapper.StrategyGreenOptHistMapper
;
import
net.wanji.opt.dao.mapper.StrategyPlanInfoMapper
;
import
net.wanji.opt.dto.induce.MessageParam
;
import
net.wanji.opt.entity.GreenwaveInduces
;
import
net.wanji.opt.entity.GreenwaveInducesHist
;
import
net.wanji.opt.po.StrategyGreenOptHistEntity
;
import
net.wanji.databus.dao.entity.GreenwaveInfoPO
;
import
net.wanji.opt.service.induce.GreenwaveInducesHistService
;
import
net.wanji.opt.service.induce.GreenwaveInducesService
;
import
net.wanji.opt.service.induce.InduceSendService
;
import
net.wanji.opt.synthesis.pojo.StrategyControlDetailList
;
import
net.wanji.opt.synthesis.pojo.StrategyDailyPlanInfoEntity
;
import
net.wanji.opt.synthesis.pojo.StrategyPlanInfoEntity
;
import
net.wanji.opt.vo.GreenBeltInfoVO
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.CollectionUtils
;
import
java.time.LocalDate
;
import
java.time.LocalTime
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.concurrent.atomic.AtomicBoolean
;
import
java.util.concurrent.atomic.AtomicLong
;
import
java.util.stream.Collectors
;
/**
* @author guoliang.dong
* @date 2024/11/21 19:18
* @desc 诱导信息下发监测
*/
@RequiredArgsConstructor
@Component
@Slf4j
public
class
InducesMonitorTask
{
@Autowired
private
final
GreenwaveInfoMapper
greenwaveInfoMapper
;
@Autowired
private
final
GreenwaveCrossMapper
greenwaveCrossMapper
;
@Autowired
private
final
StrategyPlanInfoMapper
strategyPlanInfoMapper
;
@Autowired
private
final
StrategyDailyPlanInfoMapper
strategyDailyPlanInfoMapper
;
@Autowired
private
StrategyGreenOptHistMapper
strategyGreenOptHistMapper
;
@Autowired
private
final
CrossDataRealtimeMapper
crossDataRealtimeMapper
;
@Autowired
private
final
GreenwaveInducesHistService
greenwaveInducesHistService
;
@Autowired
private
final
GreenwaveInducesService
greenwaveInducesService
;
@Autowired
private
InduceSendService
induceSendService
;
/**
* #绿波调度计划扫描周期
* 5 分钟 300000
*/
//@Scheduled(fixedRate = 30000)
public
void
refresh
()
throws
Exception
{
long
start
=
System
.
currentTimeMillis
();
AtomicLong
synCount
=
new
AtomicLong
();
try
{
log
.
info
(
"每5分钟刷新绿波优化下发数据..................."
);
// List<GreenwaveInfoPO> greenwaveInfoPOList=greenwaveInfoMapper.selectAll();
// for(GreenwaveInfoPO greenwaveInfoPO :greenwaveInfoPOList) {
//1、查询所有绿波带路口信息,获取路口下的绿波策略计划
List
<
GreenwaveCrossPOExt
>
greenwaveCrossList
=
greenwaveCrossMapper
.
selectAllGreeenCross
();
greenwaveCrossList
.
stream
().
forEach
(
o
->
{
//System.out.println("绿波路口--->"+o.getGreenwaveName()+"=="+o.getCrossId());
AtomicBoolean
flag
=
new
AtomicBoolean
(
false
);
//是否已发布优化
//创建路口策略列表
List
<
StrategyPlanInfoEntity
>
strategyPlanInfoEntityList
=
strategyPlanInfoMapper
.
selectByCrossId
(
o
.
getCrossId
());
//strategyPlanInfoEntityList.stream().filter(x->Objects.nonNull(x.getCrossId()) && x.getCrossId().equals(o.getCrossId()) ).forEach(x->
for
(
StrategyPlanInfoEntity
strategyPlanInfoEntity
:
strategyPlanInfoEntityList
)
{
//System.out.println("策略计划--->"+x.getCrossId()+"=="+x.getPlanDetails());
//2、检查绿波时段,判断是否在绿波时段内,如果不在,则判断是否执行过上屏操作,如果执行过,则调用下屏服务(此出屏幕自动处理,无需逻辑)
//[{"dailyPlanId":1,"weeks":[1,2,3,4,5]}]
List
<
StrategyControlDetailList
.
ExecutePlan
.
PlanDetail
>
planDetails
=
new
ArrayList
<>();
try
{
planDetails
=
JacksonUtils
.
getInstance
().
readValue
(
strategyPlanInfoEntity
.
getPlanDetails
(),
new
TypeReference
<
List
<
StrategyControlDetailList
.
ExecutePlan
.
PlanDetail
>>()
{
});
}
catch
(
JsonProcessingException
e
)
{
log
.
error
(
"策略周计划详情转换失败:"
+
strategyPlanInfoEntity
.
getPlanId
()
+
"---"
+
e
.
getMessage
());
}
//处理日计划的时间拼合处理
if
(!
CollectionUtils
.
isEmpty
(
planDetails
))
{
for
(
StrategyControlDetailList
.
ExecutePlan
.
PlanDetail
planDetail
:
planDetails
)
{
Integer
dailyPlanId
=
planDetail
.
getDailyPlanId
();
List
<
Integer
>
weeks
=
planDetail
.
getWeeks
();
//获取当前周几,判断是否在时间范围内
if
(
weeks
.
contains
(
LocalDate
.
now
().
getDayOfWeek
().
getValue
()))
{
LambdaQueryWrapper
<
StrategyDailyPlanInfoEntity
>
dailyPlanQueryWrapper
=
new
LambdaQueryWrapper
<>();
dailyPlanQueryWrapper
.
eq
(
StrategyDailyPlanInfoEntity:
:
getCrossId
,
strategyPlanInfoEntity
.
getCrossId
());
dailyPlanQueryWrapper
.
eq
(
StrategyDailyPlanInfoEntity:
:
getDailyPlanId
,
dailyPlanId
);
List
<
StrategyDailyPlanInfoEntity
>
dailyPlanInfoEntities
=
strategyDailyPlanInfoMapper
.
selectList
(
dailyPlanQueryWrapper
);
dailyPlanInfoEntities
.
stream
().
forEach
(
p
->
{
System
.
out
.
println
(
"plan detail->"
+
p
.
getDailyPlanDetails
());
List
<
StrategyControlDetailList
.
DailyPlan
.
DailyPlanDetail
>
dailyPlanDetails
=
new
ArrayList
<>();
try
{
dailyPlanDetails
=
JacksonUtils
.
getInstance
().
readValue
(
p
.
getDailyPlanDetails
(),
new
TypeReference
<
List
<
StrategyControlDetailList
.
DailyPlan
.
DailyPlanDetail
>>()
{
});
}
catch
(
JsonProcessingException
e
)
{
log
.
error
(
"策略日计划详情转换失败:"
+
p
.
getDailyPlanId
()
+
"---"
+
e
.
getMessage
());
}
for
(
StrategyControlDetailList
.
DailyPlan
.
DailyPlanDetail
dailyPlanDetail
:
dailyPlanDetails
)
{
//[{"strategy":1,"times":["00:00","20:00"]},{"strategy":2,"times":["20:00","23:59"]}]
if
(!
CollectionUtils
.
isEmpty
(
dailyPlanDetail
.
getTimes
()))
{
LocalTime
startTime
=
LocalTime
.
parse
(
dailyPlanDetail
.
getTimes
().
get
(
0
));
LocalTime
endTime
=
LocalTime
.
parse
(
dailyPlanDetail
.
getTimes
().
get
(
1
));
// 判断当前时间是否在范围内
if
(
LocalTime
.
now
().
isAfter
(
startTime
)
&&
LocalTime
.
now
().
isBefore
(
endTime
))
{
System
.
out
.
println
(
"当前时间在范围内: "
+
LocalTime
.
now
());
//3、如果在绿波时段内,未上屏,则获取固定配时绿波信息
//4、获取优化绿波方案,如果不存在,则执行固定绿波方案
List
<
StrategyGreenOptHistEntity
>
strategyGreenOptHistEntitiesList
=
strategyGreenOptHistMapper
.
selectByGreenId
(
String
.
valueOf
(
o
.
getGreenId
())).
stream
().
distinct
().
collect
(
Collectors
.
toList
());
if
(
Objects
.
nonNull
(
strategyGreenOptHistEntitiesList
))
{
for
(
StrategyGreenOptHistEntity
greenOptHistEntity
:
strategyGreenOptHistEntitiesList
)
{
LambdaQueryWrapper
<
GreenwaveInducesHist
>
greenwaveInducesHistQueryWrapper
=
new
LambdaQueryWrapper
<>();
greenwaveInducesHistQueryWrapper
.
eq
(
GreenwaveInducesHist:
:
getGreenId
,
o
.
getGreenId
());
greenwaveInducesHistQueryWrapper
.
eq
(
GreenwaveInducesHist:
:
getDir
,
getDir
(
greenOptHistEntity
.
getDir
()));
GreenwaveInducesHist
greenwaveInducesHist
=
greenwaveInducesHistService
.
getOne
(
greenwaveInducesHistQueryWrapper
);
if
(
Objects
.
isNull
(
greenwaveInducesHist
))
{
greenwaveInducesHist
=
new
GreenwaveInducesHist
();
greenwaveInducesHist
.
setCreateTime
(
new
Date
());
greenwaveInducesHist
.
setGreenId
(
o
.
getGreenId
());
greenwaveInducesHist
.
setDir
(
getDir
(
greenOptHistEntity
.
getDir
()));
}
greenwaveInducesHist
.
setStrategyId
(
strategyPlanInfoEntity
.
getPlanId
());
greenwaveInducesHist
.
setStrategyName
(
o
.
getGreenwaveName
());
//当前策略名称
greenwaveInducesHist
.
setControlOptTimes
(
greenOptHistEntity
.
getControlTime
());
//执行时段
greenwaveInducesHist
.
setType
(
strategyPlanInfoEntity
.
getType
());
// 执行策略
greenwaveInducesHist
.
setMinSpeed
(
greenOptHistEntity
.
getMinSpeed
());
greenwaveInducesHist
.
setMaxSpeed
(
greenOptHistEntity
.
getMaxSpeed
());
greenwaveInducesHist
.
setDir
(
greenOptHistEntity
.
getDirType
());
//5、获取绿波信息,调用上屏服务;发布互联网诱导方案
flag
.
set
(
true
);
//[{"crossId":"13MOD0B5SI0","phaseStartTime":32.0,"phaseEndTime":122.0,"greenStartTime":35.0,"speed":"39.71","offset":208.0,"travelTime":57.0,"distance":"628.81"},{"crossId":"13MQJ0B5SI0","phaseStartTime":43.0,"phaseEndTime":158.0,"greenStartTime":0.0,"speed":"35.54","offset":69.0,"travelTime":42.0,"distance":"414.62"},{"crossId":"13MS20B5SI0","phaseStartTime":32.0,"phaseEndTime":142.0,"greenStartTime":8.0,"speed":"22.72","offset":114.0,"travelTime":116.0,"distance":"732.00"},{"crossId":"13MUK0B5SH0","phaseStartTime":0.0,"phaseEndTime":135.0,"greenStartTime":0.0,"speed":"42.33","offset":50.0,"travelTime":45.0,"distance":"529.16"},{"crossId":"13N0F0B5SH0","phaseStartTime":25.0,"phaseEndTime":156.0,"greenStartTime":70.0,"speed":"40.67","offset":0.0,"travelTime":40.0,"distance":"451.89"},{"crossId":"13N200B5SH0","phaseStartTime":23.0,"phaseEndTime":150.0,"greenStartTime":0.0,"speed":"-1.00","offset":112.0,"travelTime":-1.0,"distance":"-1.00"}]
List
<
GreenBeltInfoVO
.
CrossGreenDetail
>
crossGreenDetailList
=
new
ArrayList
<>();
try
{
crossGreenDetailList
=
JacksonUtils
.
getInstance
().
readValue
(
greenOptHistEntity
.
getCrossGreenDetail
(),
new
TypeReference
<
List
<
GreenBeltInfoVO
.
CrossGreenDetail
>>()
{
});
}
catch
(
JsonProcessingException
e
)
{
log
.
error
(
"绿波详情转换失败:"
+
greenOptHistEntity
.
getGreenId
()
+
"---"
+
e
.
getMessage
());
}
greenwaveInducesHist
.
setStatus
(
1
);
greenwaveInducesHistService
.
saveOrUpdate
(
greenwaveInducesHist
);
synCount
.
getAndIncrement
();
log
.
info
(
"同步绿波状态信息成功->"
+
o
.
getPlanName
());
}
}
}
}
}
});
}
}
}
}
//如果没有绿波方案则调用下屏服务
if
(!
flag
.
get
())
{
LambdaQueryWrapper
<
GreenwaveInducesHist
>
greenwaveInducesHistQueryWrapper
=
new
LambdaQueryWrapper
<>();
greenwaveInducesHistQueryWrapper
.
eq
(
GreenwaveInducesHist:
:
getGreenId
,
o
.
getGreenId
());
List
<
GreenwaveInducesHist
>
greenwaveInducesHistList
=
greenwaveInducesHistService
.
list
(
greenwaveInducesHistQueryWrapper
);
greenwaveInducesHistList
.
stream
().
forEach
(
n
->
{
//调用下屏
try
{
if
(
n
.
getStatus
()
==
1
)
{
MessageParam
messageParam
=
new
MessageParam
();
messageParam
.
setFlg
(
2
);
LambdaQueryWrapper
<
GreenwaveInduces
>
greenwaveInducesQueryWrapper
=
new
LambdaQueryWrapper
<>();
greenwaveInducesQueryWrapper
.
eq
(
GreenwaveInduces:
:
getGreenId
,
o
.
getGreenId
());
List
<
GreenwaveInduces
>
greenwaveInducesList
=
greenwaveInducesService
.
list
(
greenwaveInducesQueryWrapper
);
greenwaveInducesList
.
stream
().
forEach
(
v
->
{
messageParam
.
setEquipCode
(
v
.
getEquipCode
());
messageParam
.
setSourceId
(
v
.
getSourceId
());
messageParam
.
setType
(
"TFMH"
);
//induceSendService.send(messageParam);//临时屏蔽此处功能,因为上屏的时候可以设置生效时间
log
.
info
(
"发送下屏信息成功."
);
});
}
}
catch
(
Exception
e
)
{
log
.
error
(
"发送下屏信息失败"
);
}
//保存绿波状态
n
.
setStatus
(
0
);
//greenwaveInducesHistService.saveOrUpdate(n);
log
.
info
(
"同步绿波状态信息(下屏)->"
+
o
.
getPlanName
());
synCount
.
getAndIncrement
();
});
}
});
//}
}
catch
(
Exception
e
)
{
throw
new
Exception
(
"每5分钟刷新绿波下发状态失败"
,
e
);
}
finally
{
log
.
info
(
"当前运行同步绿波下发状态数据,耗时:{}ms,共同步{}条数据。"
,
System
.
currentTimeMillis
()
-
start
,
synCount
);
}
}
/**
* 根据角度获取方向
* @param dirType
* 路段走向:1 南向北
* 2 西向东
* 3 北向南
* 4 东向西
* @return
*/
private
Integer
getDir
(
String
dirType
)
{
if
(
dirType
==
"e2w"
)
{
//东
return
4
;
}
else
if
(
dirType
==
"s2n"
)
{
//南
return
1
;
}
else
if
(
dirType
==
"w2e"
)
{
//西
return
2
;
}
else
if
(
dirType
==
"n2s"
)
{
//北
return
3
;
}
return
null
;
}
public
static
void
main
(
String
[]
args
){
// 获取当前时间
LocalTime
now
=
LocalTime
.
now
();
List
<
String
>
timesList
=
new
ArrayList
();
timesList
.
add
(
"00:00"
);
timesList
.
add
(
"23:59"
);
// 定义时间范围
LocalTime
startTime
=
LocalTime
.
parse
(
timesList
.
get
(
0
));
LocalTime
endTime
=
LocalTime
.
parse
(
timesList
.
get
(
1
));
// 判断当前时间是否在范围内
if
(
now
.
isAfter
(
startTime
)
&&
now
.
isBefore
(
endTime
))
{
System
.
out
.
println
(
"当前时间在范围内: "
+
now
);
}
else
if
(
now
.
equals
(
startTime
)
||
now
.
equals
(
endTime
))
{
System
.
out
.
println
(
"当前时间恰好在范围边界: "
+
now
);
}
else
{
System
.
out
.
println
(
"当前时间不在范围内: "
+
now
);
}
}
}
signal-optimize-service/src/main/resources/bin/signal-optimize-service-1.0.0.sh
0 → 100644
View file @
c14b0c0c
#!/bin/bash
jarName
=
"signal-control-service-0.2.1.jar"
NR
=
$(
ps
-ef
|
grep
"
${
jarName
}
"
|
grep
-v
grep
|
wc
-l
)
if
[
${
NR
}
!=
0
]
then
ps
-ef
|
grep
-v
grep
|
grep
"
${
jarName
}
"
|
while
read
u p o
do
echo
"结束Java程序进程..."
kill
-9
$p
done
fi
sleep
2
echo
"重启Java程序进程..."
nohup
java
-Xms2048m
-Xmx2048m
-XX
:+HeapDumpOnOutOfMemoryError
-XX
:HeapDumpPath
=
/home/javaApp/heapdump.hprof
-agentlib
:jdwp
=
transport
=
dt_socket,server
=
y,suspend
=
n,address
=
15115
-Dcom
.sun.management.jmxremote.ssl
=
false
-Dcom
.sun.management.jmxremote.authenticate
=
false
-jar
../lib/
$jarName
--spring
.profiles.active
=
docker
>
/dev/null 2>&1 &
\ No newline at end of file
signal-optimize-service/src/main/resources/templates/induce_down.xml
View file @
c14b0c0c
...
...
@@ -3,7 +3,7 @@
<systemtype>
VMS
</systemtype>
<messagetype>
CONTROL
</messagetype>
<!--token-->
<sourceIP>
${source
i
d}
</sourceIP>
<sourceIP>
${source
I
d}
</sourceIP>
<targetIP></targetIP>
<user></user>
<password></password>
...
...
@@ -11,7 +11,7 @@
<tasktype>
deletelistandfile
</tasktype>
<taskdetail>
<!--屏体ID 由现场提供-->
<ledid>
${
vmsid
}
</ledid>
<ledid>
${
equipCode
}
</ledid>
</taskdetail>
<!--节目类型 TFM 路况 TFMH 独占 TAM 交通事件-->
<senderinfo>
${type}
</senderinfo>
...
...
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