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
2dde54a3
Commit
2dde54a3
authored
Nov 16, 2024
by
zhouleilei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
计划数据-计划信息、时段信息 静态数据查询
parent
eac82065
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
486 additions
and
54 deletions
+486
-54
HisensePersonEntranceAndExitEnum.java
.../utc/hisense/common/HisensePersonEntranceAndExitEnum.java
+32
-0
RingPhaseDTO.java
...ain/java/net/wanji/utc/hisense/pojo/dto/RingPhaseDTO.java
+37
-0
StagePhaseDTO.java
...in/java/net/wanji/utc/hisense/pojo/dto/StagePhaseDTO.java
+21
-0
StaticInfoServiceImpl.java
...wanji/utc/hisense/service/impl/StaticInfoServiceImpl.java
+336
-52
CommonUtils.java
...src/main/java/net/wanji/utc/hisense/util/CommonUtils.java
+59
-1
StaticInfoController.java
...n/java/net/wanji/utc/controller/StaticInfoController.java
+1
-1
No files found.
signal-utc-hisense-service/src/main/java/net/wanji/utc/hisense/common/HisensePersonEntranceAndExitEnum.java
0 → 100644
View file @
2dde54a3
package
net
.
wanji
.
utc
.
hisense
.
common
;
import
lombok.AllArgsConstructor
;
import
lombok.Getter
;
import
java.util.Objects
;
/**
* @author zhouleilei
* @date 2024/11/15 23:29
*/
@Getter
@AllArgsConstructor
public
enum
HisensePersonEntranceAndExitEnum
{
// '车道转向:1左转;2直行;3右转;4掉头;5直左;6直右;7左直右;8左右;9左转掉头;10直行掉头;
// 11右转掉头;12左直掉头;13直右掉头;14左直右掉头;15左右掉头', 0 默认没有匹配
PERSON_1
(
11
,
1
,
"入口行人"
),
PERSON_2
(
12
,
2
,
"出口行人"
),
PERSON_3
(
13
,
3
,
"出入口行人"
);
private
Integer
hisensePerson
;
private
Integer
wjPerson
;
private
String
desc
;
public
static
Integer
getWjperson
(
Integer
hisensePerson
)
{
for
(
HisensePersonEntranceAndExitEnum
value
:
HisensePersonEntranceAndExitEnum
.
values
())
{
if
(
Objects
.
equals
(
hisensePerson
,
value
.
getHisensePerson
()))
{
return
value
.
getWjPerson
();
}
}
return
0
;
}
}
signal-utc-hisense-service/src/main/java/net/wanji/utc/hisense/pojo/dto/RingPhaseDTO.java
0 → 100644
View file @
2dde54a3
package
net
.
wanji
.
utc
.
hisense
.
pojo
.
dto
;
import
lombok.Data
;
/**
* @ClassName RingPhasesDTO
* @Description 获取方案环图,环对应相位的DTO
* @Author zhouleilei
* @Date 2024/11/14 17:05
*/
@Data
public
class
RingPhaseDTO
{
//相位号
private
Integer
phaseId
;
//相位时间
private
Integer
phaseTime
;
//相位红灯时间
private
Integer
redTime
;
//相位黄灯时间
private
Integer
yellowTime
;
//相位绿灯时间
private
Integer
greenTime
;
//最小绿时间
private
Integer
minGTime
;
//最大绿时间
private
Integer
maxGTime
;
//相位状态
private
Integer
phaseStatus
;
}
\ No newline at end of file
signal-utc-hisense-service/src/main/java/net/wanji/utc/hisense/pojo/dto/StagePhaseDTO.java
0 → 100644
View file @
2dde54a3
package
net
.
wanji
.
utc
.
hisense
.
pojo
.
dto
;
import
lombok.Data
;
import
java.util.List
;
/**
* @ClassName StagePhaseDTO
* @Description 阶段相位对应表
* @Author zhouleilei
* @Date 2024/11/15 15:33
*/
@Data
public
class
StagePhaseDTO
{
//阶段号
private
Integer
stageId
;
//阶段时长
private
Integer
stageTime
;
//阶段对应的相位列表
List
<
RingPhaseDTO
>
ringPhaseList
;
}
signal-utc-hisense-service/src/main/java/net/wanji/utc/hisense/service/impl/StaticInfoServiceImpl.java
View file @
2dde54a3
package
net
.
wanji
.
utc
.
hisense
.
service
.
impl
;
import
cn.hutool.core.collection.CollectionUtil
;
import
com.alibaba.fastjson.JSONObject
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
lombok.RequiredArgsConstructor
;
import
lombok.extern.slf4j.Slf4j
;
import
net.wanji.common.utils.tool.ScheduleUtil
;
import
net.wanji.common.utils.tool.StringUtils
;
import
net.wanji.databus.dao.entity.CrossLightsPO
;
import
net.wanji.databus.dao.entity.CrossPlanPO
;
import
net.wanji.databus.dao.entity.CrossSchedulesPO
;
import
net.wanji.databus.dao.entity.CrossSectionPO
;
import
net.wanji.databus.dao.entity.*
;
import
net.wanji.databus.dao.mapper.CrossInfoMapper
;
import
net.wanji.databus.dao.mapper.ManufacturerInfoMapper
;
...
...
@@ -19,12 +16,11 @@ import net.wanji.databus.po.CrossInfoPOExt;
import
net.wanji.databus.vo.PlanSectionVO
;
import
net.wanji.databus.vo.SchemePhaseLightsVO
;
import
net.wanji.utc.hisense.cache.CrossInfoCache
;
import
net.wanji.utc.hisense.common.ChannelControlEnum
;
import
net.wanji.utc.hisense.common.HisenseTurnEnum
;
import
net.wanji.utc.hisense.common.HiseseDirEnum
;
import
net.wanji.utc.hisense.common.OperationBaseDom
;
import
net.wanji.utc.hisense.common.*
;
import
net.wanji.utc.hisense.common.constants.HttpConstants
;
import
net.wanji.utc.hisense.mapper.*
;
import
net.wanji.utc.hisense.pojo.dto.RingPhaseDTO
;
import
net.wanji.utc.hisense.pojo.dto.StagePhaseDTO
;
import
net.wanji.utc.hisense.pojo.result.CoordinationStatus
;
import
net.wanji.utc.hisense.pojo.result.CrossSchemeRings
;
import
net.wanji.utc.hisense.pojo.view.VIntersectionView
;
...
...
@@ -32,6 +28,7 @@ import net.wanji.utc.hisense.pojo.view.VNtcipChannelPhaseDTO;
import
net.wanji.utc.hisense.pojo.view.VNtcipTimeBaseDayplanDTO
;
import
net.wanji.utc.hisense.pojo.view.VNtcipTimeBaseScheduleView
;
import
net.wanji.utc.hisense.service.StaticInfoService
;
import
net.wanji.utc.hisense.util.CommonUtils
;
import
net.wanji.utc.hisense.util.OkHttpClientUtil
;
import
org.dom4j.Document
;
import
org.dom4j.DocumentHelper
;
...
...
@@ -44,6 +41,7 @@ import org.springframework.util.CollectionUtils;
import
javax.annotation.Resource
;
import
java.util.*
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.stream.Collectors
;
/**
...
...
@@ -72,7 +70,6 @@ public class StaticInfoServiceImpl implements StaticInfoService {
@Resource
private
VNtcipChannelViewMapper
vNtcipChannelViewMapper
;
@Override
public
List
<
CrossInfoPO
>
crossBasicInfo
(
CrossInfoDTO
crossInfoDTO
)
throws
Exception
{
Integer
id
=
manufacturerInfoMapper
.
selectIdByCode
(
crossInfoDTO
.
getManufacturerCode
());
...
...
@@ -104,48 +101,321 @@ public class StaticInfoServiceImpl implements StaticInfoService {
@Override
public
SchemePhaseLightsVO
schemePhaseLights
(
SchemePhaseLightsDTO
schemePhaseLightsDTO
)
throws
Exception
{
String
crossId
=
schemePhaseLightsDTO
.
getCrossId
();
Map
<
String
,
CrossInfoPO
>
crossInfoCache
=
CrossInfoCache
.
getCrossInfoCache
();
CrossInfoPO
crossInfoPO
=
crossInfoCache
.
get
(
crossId
);
SchemePhaseLightsVO
phaseLightsVO
=
new
SchemePhaseLightsVO
();
List
<
CrossLightsPO
>
crossLightsList
=
new
ArrayList
<>();
List
<
CrossPhasePO
>
crossPhaseList
=
new
ArrayList
<>();
List
<
CrossPhaseLightsPO
>
crossPhaseLightsPOList
=
new
ArrayList
<>();
List
<
CrossSchemePO
>
crossSchemeList
=
new
ArrayList
<>();
//查询当前运行的方案
CoordinationStatus
coordinationStatus
=
crossPlan
(
crossId
);
if
(
Optional
.
ofNullable
(
coordinationStatus
).
isPresent
())
{
CrossSchemeRingsDTO
crossSchemeRingsDTO
=
new
CrossSchemeRingsDTO
();
crossSchemeRingsDTO
.
setCrossId
(
crossId
);
crossSchemeRingsDTO
.
setPattern
(
coordinationStatus
.
getCoordPatternStatus
());
//查询方案环图请求
CrossSchemeRings
crossSchemeRings
=
crossSchemeRings
(
crossSchemeRingsDTO
);
if
(
Optional
.
ofNullable
(
crossSchemeRings
).
isPresent
())
{
//环数
int
ringCount
=
Integer
.
parseInt
(
crossSchemeRings
.
getRingCount
());
//周期长度
String
cycleLen
=
crossSchemeRings
.
getCycleLen
();
JSONObject
cycleJSONObject
=
crossSchemeRings
.
getCycleList
();
List
<
VNtcipChannelPhaseDTO
>
vNtcipChannelPhaseDTOS
=
vNtcipChannelViewMapper
.
selectChannelPhaseList
(
crossInfoPO
.
getCode
());
if
(!
CollectionUtils
.
isEmpty
(
vNtcipChannelPhaseDTOS
))
{
for
(
VNtcipChannelPhaseDTO
vNtcipChannelPhaseDTO
:
vNtcipChannelPhaseDTOS
)
{
// 1灯组信息
// 通道号
Integer
nChannelControlType
=
vNtcipChannelPhaseDTO
.
getNChannelControlType
();
Integer
nChannelNumber
=
vNtcipChannelPhaseDTO
.
getNChannelNumber
();
Integer
nChannelDim
=
vNtcipChannelPhaseDTO
.
getNChannelDim
();
CrossLightsPO
crossLightsPO
=
getCrossLights
(
crossId
,
nChannelControlType
,
nChannelNumber
,
nChannelDim
);
crossLightsList
.
add
(
crossLightsPO
);;
crossLightsList
.
add
(
crossLightsPO
);;
//相位差
String
offset
=
crossSchemeRings
.
getOffset
();
int
cycle
=
Integer
.
valueOf
(
cycleLen
);
CrossSchemePO
crossSchemePO
=
new
CrossSchemePO
();
//方案号
int
schemeNo
=
(
Integer
.
valueOf
(
crossSchemeRings
.
getPattern
())
+
2
)
/
3
;
crossSchemePO
.
setSchemeNo
(
schemeNo
+
""
);
crossSchemePO
.
setName
(
"海信方案:"
+
schemeNo
);
crossSchemePO
.
setCrossId
(
crossId
);
crossSchemePO
.
setCycle
(
cycle
);
//协调相位id先默认给1
crossSchemePO
.
setCoordPhase
(
1
);
crossSchemePO
.
setOffset
(
Integer
.
valueOf
(
offset
));
//来源默认信号机
crossSchemePO
.
setSource
(
1
);
//默认给0
crossSchemePO
.
setIsDeleted
(
0
);
//默认给0
crossSchemePO
.
setStatus
(
0
);
crossSchemePO
.
setGmtCreate
(
null
);
crossSchemePO
.
setGmtModified
(
null
);
crossSchemeList
.
add
(
crossSchemePO
);
List
<
CrossSchemeRings
.
Phase
>
phaseList
=
crossSchemeRings
.
getPhaseList
();
CrossSchemeRings
.
Phase
phase
=
phaseList
.
get
(
0
);
//16 个相位的红灯时间(单位秒),中间用空格隔开,不存在的相位置 0。
String
[]
redTime
=
phase
.
getRedTime
().
split
(
" "
);
//16 个相位的绿灯时间(单位秒),中间用空格隔开,不存在的相位置 0。
String
[]
greenTime
=
phase
.
getGreenTime
().
split
(
" "
);
//16 个相位的黄灯时间(单位秒),中间用空格隔开,不存在的相位置 0。
String
[]
yellowTime
=
phase
.
getYellowTime
().
split
(
" "
);
//16 个相位的最小绿时间(单位秒),中间用空格隔开,不存在的相位置 0。
String
[]
minGTime
=
phase
.
getMinGTime
().
split
(
" "
);
//16 个相位的最大绿时间(单位秒),中间用空格隔开,不存在的相位置 0。
String
[]
maxGTime
=
phase
.
getMaxGTime
().
split
(
" "
);
//封装环和环上相位数据
Map
<
Integer
,
List
<
RingPhaseDTO
>>
ringPhasesMap
=
getRingPhasesMap
(
ringCount
,
cycleJSONObject
,
redTime
,
greenTime
,
yellowTime
,
minGTime
,
maxGTime
);
//16 个相位的放行方向,每个相位由 8 字节整型值存储(最多支持 7 个放行方向),每个字节表示一个放行方向,
String
[]
channelDim
=
phase
.
getChannelDim
().
split
(
" "
);
//数据处理
getStagesByRings
(
cycle
,
ringCount
,
crossId
,
schemeNo
,
ringPhasesMap
,
crossLightsList
,
crossPhaseList
,
crossPhaseLightsPOList
,
channelDim
);
}
}
phaseLightsVO
.
setCrossPhaseLightsPOList
(
crossPhaseLightsPOList
);
phaseLightsVO
.
setCrossLightsList
(
crossLightsList
);
phaseLightsVO
.
setCrossSchemeList
(
crossSchemeList
);
phaseLightsVO
.
setCrossPhaseList
(
crossPhaseList
);
return
phaseLightsVO
;
}
// 环相位信息
Integer
nPhaseConCurrency
=
vNtcipChannelPhaseDTO
.
getNPhaseConCurrency
();
String
format
=
String
.
format
(
"%16s"
,
Integer
.
toBinaryString
(
nPhaseConCurrency
)).
replace
(
' '
,
'0'
);
/**
* @return java.util.Map<java.lang.Integer, java.util.List < net.wanji.utc.hisense.pojo.dto.RingPhaseDTO>>
* @Description 封装环和环上相位数据
* @Param ringCount 环的数量
* @Param cycleJSONObject 环数据
* @Param redTime 红
* @Param greenTime 绿
* @Param yellowTime 黄
**/
private
Map
<
Integer
,
List
<
RingPhaseDTO
>>
getRingPhasesMap
(
int
ringCount
,
JSONObject
cycleJSONObject
,
String
[]
redTime
,
String
[]
greenTime
,
String
[]
yellowTime
,
String
[]
minGTime
,
String
[]
maxGTime
)
{
Map
<
Integer
,
List
<
RingPhaseDTO
>>
map
=
new
HashMap
<>();
for
(
int
i
=
1
;
i
<=
ringCount
;
i
++)
{
//取出环中的数据,并去掉空格和_,得到相位
String
ringPhases
=
cycleJSONObject
.
getString
(
"Cycle"
+
i
)
.
replaceAll
(
" "
,
""
).
replaceAll
(
"_"
,
""
);
List
<
RingPhaseDTO
>
ringPhaseDTOS
=
new
ArrayList
<>();
char
[]
charArray
=
ringPhases
.
toCharArray
();
for
(
int
i1
=
0
;
i1
<
charArray
.
length
;
i1
++)
{
RingPhaseDTO
ringPhase
=
new
RingPhaseDTO
();
int
phaseId
=
Character
.
getNumericValue
(
charArray
[
i1
]);
int
red
=
Integer
.
valueOf
(
redTime
[
phaseId
-
1
]);
int
green
=
Integer
.
valueOf
(
greenTime
[
phaseId
-
1
]);
int
yellow
=
Integer
.
valueOf
(
yellowTime
[
phaseId
-
1
]);
int
minG
=
Integer
.
valueOf
(
minGTime
[
phaseId
-
1
]);
int
maxG
=
Integer
.
valueOf
(
maxGTime
[
phaseId
-
1
]);
ringPhase
.
setPhaseId
(
phaseId
);
ringPhase
.
setPhaseStatus
(
0
);
ringPhase
.
setRedTime
(
red
);
ringPhase
.
setGreenTime
(
green
);
ringPhase
.
setYellowTime
(
yellow
);
ringPhase
.
setMaxGTime
(
maxG
);
ringPhase
.
setMinGTime
(
minG
);
ringPhase
.
setPhaseTime
(
red
+
green
+
yellow
);
ringPhaseDTOS
.
add
(
ringPhase
);
}
map
.
put
(
i
,
ringPhaseDTOS
);
}
return
map
;
}
// 2相位灯组信息
CrossPhaseLightsPO
crossPhaseLightsPO
=
getCrossPhaseLightsPO
(
crossId
,
vNtcipChannelPhaseDTO
,
nChannelNumber
);
crossPhaseLightsPOList
.
add
(
crossPhaseLightsPO
);
/**
* @return null
* @Description 数据处理
* @Param ringPhaseMap 环包含的相位
* @Param phasesTime 各个相位的红绿黄时间和
**/
private
void
getStagesByRings
(
int
cycle
,
int
ringCount
,
String
crossId
,
int
schemeNo
,
Map
<
Integer
,
List
<
RingPhaseDTO
>>
ringPhasesMap
,
List
<
CrossLightsPO
>
crossLightsList
,
List
<
CrossPhasePO
>
crossPhaseList
,
List
<
CrossPhaseLightsPO
>
crossPhaseLightsPOList
,
String
[]
channelDim
)
{
//已经计算的阶段时长
int
stageTime
=
0
;
//循环次数,也代表阶段号
int
count
=
1
;
//阶段对应的相位
List
<
StagePhaseDTO
>
stagePhaseList
=
new
ArrayList
<>();
while
(
stageTime
<
cycle
)
{
int
firstPhaseTime
=
0
;
RingPhaseDTO
firstRingPhaseDTO
=
null
;
//key为环号,value为该数据在List<RingPhaseDTO>的序号,为了更新List<RingPhaseDTO>的status
Map
<
Integer
,
Integer
>
minStageMap
=
new
HashMap
<>();
List
<
RingPhaseDTO
>
stageList
=
new
ArrayList
<>();
StagePhaseDTO
stagePhase
=
new
StagePhaseDTO
();
//第一个阶段
if
(
count
==
1
)
{
for
(
int
i
=
1
;
i
<=
ringCount
;
i
++)
{
//第i个环上的数据
List
<
RingPhaseDTO
>
ringPhaseDTOS
=
ringPhasesMap
.
get
(
i
);
//第一个相位的数据
RingPhaseDTO
ringPhaseDTO
=
ringPhaseDTOS
.
get
(
0
);
Integer
phaseTime
=
ringPhaseDTO
.
getPhaseTime
();
if
(
firstPhaseTime
==
0
)
{
firstPhaseTime
=
phaseTime
;
firstRingPhaseDTO
=
ringPhaseDTO
;
minStageMap
.
put
(
i
,
0
);
}
else
if
(
phaseTime
<=
firstPhaseTime
)
{
if
(
phaseTime
<
firstPhaseTime
)
{
//清空缓存
minStageMap
.
clear
();
}
firstPhaseTime
=
phaseTime
;
firstRingPhaseDTO
=
ringPhaseDTO
;
minStageMap
.
put
(
i
,
0
);
}
//每个环的第一个相位一定在第一个阶段
stageList
.
add
(
ringPhaseDTO
);
}
}
else
{
for
(
int
i
=
1
;
i
<=
ringCount
;
i
++)
{
//第i个环上的数据
List
<
RingPhaseDTO
>
ringPhaseDTOS
=
ringPhasesMap
.
get
(
i
);
//如果该环上相位都没有执行,则取第0个相位,否则取状态最后一次出现的1的下一个相位
List
<
RingPhaseDTO
>
collect
=
ringPhaseDTOS
.
stream
().
filter
(
x
->
x
.
getPhaseStatus
()
==
1
).
collect
(
Collectors
.
toList
());
if
(
CollectionUtil
.
isNotEmpty
(
collect
))
{
//取最后一位
RingPhaseDTO
phaseDTO
=
collect
.
get
(
collect
.
size
()
-
1
);
//状态最后一次出现的1的下一个相位
int
index
=
ringPhaseDTOS
.
lastIndexOf
(
phaseDTO
)
+
1
;
RingPhaseDTO
ringPhaseDTO
=
ringPhaseDTOS
.
get
(
index
);
//计算该相位及走过的所有时间
int
totalTime
=
ringPhaseDTOS
.
stream
().
filter
(
x
->
ringPhaseDTOS
.
indexOf
(
x
)
<=
index
).
mapToInt
(
RingPhaseDTO:
:
getPhaseTime
).
sum
();
//totalTime - stageTime 为该相位剩余时间
Integer
phaseTime
=
totalTime
-
stageTime
;
if
(
firstPhaseTime
==
0
)
{
firstPhaseTime
=
phaseTime
;
firstRingPhaseDTO
=
ringPhaseDTO
;
minStageMap
.
put
(
i
,
index
);
}
else
{
if
(
phaseTime
<=
firstPhaseTime
)
{
if
(
phaseTime
<
firstPhaseTime
)
{
//清空缓存
minStageMap
.
clear
();
}
firstPhaseTime
=
phaseTime
;
firstRingPhaseDTO
=
ringPhaseDTO
;
minStageMap
.
put
(
i
,
index
);
}
}
stageList
.
add
(
ringPhaseDTO
);
}
else
{
//在第一个相位
RingPhaseDTO
ringPhaseDTO
=
ringPhaseDTOS
.
get
(
0
);
//该相位一定会走
stageList
.
add
(
ringPhaseDTO
);
//第一个相位的时间减去走过的时长,则为剩余时长,和其他时间做比较
Integer
phaseTime
=
ringPhaseDTO
.
getPhaseTime
()
-
stageTime
;
if
(
firstPhaseTime
==
0
)
{
//第一次进入循环
firstPhaseTime
=
phaseTime
;
firstRingPhaseDTO
=
ringPhaseDTO
;
minStageMap
.
put
(
i
,
0
);
}
else
if
(
phaseTime
<=
firstPhaseTime
)
{
if
(
phaseTime
<
firstPhaseTime
)
{
if
(!
minStageMap
.
isEmpty
())
{
//清空缓存
minStageMap
.
clear
();
}
}
firstPhaseTime
=
phaseTime
;
firstRingPhaseDTO
=
ringPhaseDTO
;
minStageMap
.
put
(
i
,
0
);
}
}
}
}
// 3
CrossSchemePO
crossSchemePO
=
new
CrossSchemePO
();
crossSchemePO
.
setCrossId
(
crossId
);
crossSchemePO
.
setSchemeNo
(
null
);
crossSchemePO
.
setName
(
null
);
crossSchemePO
.
setCycle
(
null
);
crossSchemePO
.
setCoordPhase
(
null
);
crossSchemePO
.
setOffset
(
null
);
crossSchemePO
.
setSource
(
2
);
crossSchemePO
.
setStatus
(
0
);
stageTime
+=
firstPhaseTime
;
Set
<
Integer
>
keySet
=
minStageMap
.
keySet
();
for
(
Integer
integer
:
keySet
)
{
Integer
no
=
minStageMap
.
get
(
integer
);
//更新ringPhasesMap状态
ringPhasesMap
.
get
(
integer
).
get
(
no
).
setPhaseStatus
(
1
);
}
stagePhase
.
setStageId
(
count
);
stagePhase
.
setRingPhaseList
(
stageList
);
stagePhase
.
setStageTime
(
firstPhaseTime
);
stagePhaseList
.
add
(
stagePhase
);
count
++;
}
if
(
CollectionUtil
.
isNotEmpty
(
stagePhaseList
))
{
//将结果组装到结果集
doView
(
cycle
,
ringCount
,
crossId
,
schemeNo
,
stagePhaseList
,
crossLightsList
,
crossPhaseList
,
crossPhaseLightsPOList
,
channelDim
);
}
}
/**
* @return void
* @Description 组装结果集
* @Param [cycle, ringCount, crossId, schemeNo, crossLightsList, crossPhaseList, crossPhaseLightsPOList, channelDim]
**/
private
void
doView
(
int
cycle
,
int
ringCount
,
String
crossId
,
int
schemeNo
,
List
<
StagePhaseDTO
>
stagePhaseList
,
List
<
CrossLightsPO
>
crossLightsList
,
List
<
CrossPhasePO
>
crossPhaseList
,
List
<
CrossPhaseLightsPO
>
crossPhaseLightsPOList
,
String
[]
channelDim
)
{
AtomicInteger
phaseNum
=
new
AtomicInteger
(
0
);
AtomicInteger
lightNum
=
new
AtomicInteger
(
0
);
//遍历阶段
for
(
StagePhaseDTO
stagePhaseDTO
:
stagePhaseList
)
{
Integer
stageId
=
stagePhaseDTO
.
getStageId
();
Integer
stageTime
=
stagePhaseDTO
.
getStageTime
();
//遍历相位
List
<
RingPhaseDTO
>
ringPhaseList
=
stagePhaseDTO
.
getRingPhaseList
();
//相位
CrossPhasePO
crossPhasePO
=
new
CrossPhasePO
();
crossPhasePO
.
setPhaseNo
(
stageId
+
""
);
crossPhasePO
.
setName
(
"相位"
+
stageId
);
crossPhasePO
.
setSort
(
phaseNum
.
getAndIncrement
());
crossPhasePO
.
setCrossId
(
crossId
);
crossPhasePO
.
setPlanId
(
schemeNo
);
crossPhasePO
.
setAccompanyPhaseNo
(
"1"
);
crossPhasePO
.
setRingNo
(
1
);
crossPhasePO
.
setGroupNo
(
1
);
crossPhasePO
.
setPhaseType
(
1
);
if
(
schemeNo
==
85
)
{
//黃闪
crossPhasePO
.
setControlMode
(
7
);
}
else
{
crossPhasePO
.
setControlMode
(
1
);
}
crossPhasePO
.
setPhaseTime
(
stageTime
);
crossPhasePO
.
setGreenTime
(
ringPhaseList
.
get
(
0
).
getGreenTime
());
crossPhasePO
.
setGreenFlashTime
(
0
);
crossPhasePO
.
setYellowFlashTime
(
0
);
crossPhasePO
.
setRedFlashTime
(
0
);
crossPhasePO
.
setPedFlashTime
(
0
);
crossPhasePO
.
setYellowTime
(
ringPhaseList
.
get
(
0
).
getYellowTime
());
crossPhasePO
.
setRedTime
(
ringPhaseList
.
get
(
0
).
getRedTime
());
crossPhasePO
.
setMinGreenTime
(
ringPhaseList
.
get
(
0
).
getMinGTime
());
crossPhasePO
.
setMaxGreenTime
(
ringPhaseList
.
get
(
0
).
getMaxGTime
());
crossPhasePO
.
setGmtCreate
(
null
);
crossPhasePO
.
setGmtModified
(
null
);
crossPhaseList
.
add
(
crossPhasePO
);
for
(
RingPhaseDTO
phaseDTO
:
ringPhaseList
)
{
Integer
phaseId
=
phaseDTO
.
getPhaseId
();
long
channe
=
Long
.
valueOf
(
channelDim
[
phaseId
-
1
]);
String
binaryString
=
Long
.
toBinaryString
(
channe
);
//获取方向转向分组
List
<
String
>
binaryList
=
CommonUtils
.
groupStringFromRight
(
binaryString
);
for
(
String
readUtf8Line
:
binaryList
)
{
String
dir
=
readUtf8Line
.
substring
(
0
,
3
);
// 高三位 方向
String
turn
=
readUtf8Line
.
substring
(
3
);
// 低五位 转向
Integer
wjLightsDir
=
HiseseDirEnum
.
getWjLightsDir
(
Integer
.
parseInt
(
dir
,
2
));
Integer
wjLightsTurn
=
HisenseTurnEnum
.
getWjLightsTurn
(
Integer
.
parseInt
(
turn
,
2
));
Integer
wjPerson
=
HisensePersonEntranceAndExitEnum
.
getWjperson
(
Integer
.
parseInt
(
turn
,
2
));
//灯组
CrossLightsPO
crossLightsPO
=
new
CrossLightsPO
();
lightNum
.
getAndIncrement
();
crossLightsPO
.
setLightsNo
(
lightNum
.
get
()+
""
);
crossLightsPO
.
setName
(
"灯组"
+
lightNum
.
get
());
//默认0
crossLightsPO
.
setType
(
0
);
crossLightsPO
.
setDir
(
wjLightsDir
);
crossLightsPO
.
setTurn
(
wjLightsTurn
);
crossLightsPO
.
setCrossId
(
crossId
);
crossLightsPO
.
setInOutType
(
wjPerson
);
crossLightsPO
.
setGmtCreate
(
null
);
crossLightsPO
.
setGmtModified
(
null
);
crossLightsList
.
add
(
crossLightsPO
);
//灯组与相位关系
CrossPhaseLightsPO
crossPhaseLightsPO
=
new
CrossPhaseLightsPO
();
crossPhaseLightsPO
.
setLightsId
(
lightNum
.
get
());
crossPhaseLightsPO
.
setPhaseId
(
phaseNum
.
get
());
crossPhaseLightsPO
.
setCrossId
(
crossId
);
crossPhaseLightsPO
.
setGmtCreate
(
null
);
crossPhaseLightsPO
.
setGmtModified
(
null
);
crossPhaseLightsPOList
.
add
(
crossPhaseLightsPO
);
}
}
}
log
.
error
(
"======"
+
crossLightsList
);
return
null
;
}
@NotNull
...
...
@@ -160,6 +430,21 @@ public class StaticInfoServiceImpl implements StaticInfoService {
return
crossPhaseLightsPO
;
}
public
static
void
main
(
String
[]
args
)
{
int
l
=
6442253
;
String
binaryString
=
Integer
.
toBinaryString
(
l
);
String
dirTurn
=
String
.
format
(
"%8s"
,
Integer
.
toBinaryString
(
6442253
)).
replace
(
' '
,
'0'
);
if
(
StringUtils
.
isNotBlank
(
dirTurn
))
{
String
dir
=
dirTurn
.
substring
(
0
,
3
);
// 高三位 方向
String
turn
=
dirTurn
.
substring
(
3
);
// 低五位 转向
Integer
wjLightsDir
=
HiseseDirEnum
.
getWjLightsDir
(
Integer
.
parseInt
(
dir
,
2
));
Integer
wjLightsTurn
=
HisenseTurnEnum
.
getWjLightsTurn
(
Integer
.
parseInt
(
turn
,
2
));
System
.
out
.
println
(
"wjLightsDir "
+
wjLightsDir
);
System
.
out
.
println
(
"wjLightsTurn "
+
wjLightsTurn
);
}
}
private
static
CrossLightsPO
getCrossLights
(
String
crossId
,
Integer
nChannelControlType
,
Integer
nChannelNumber
,
Integer
nChannelDim
)
{
CrossLightsPO
crossLightsPO
=
new
CrossLightsPO
();
crossLightsPO
.
setLightsNo
(
String
.
valueOf
(
nChannelNumber
));
...
...
@@ -186,10 +471,10 @@ public class StaticInfoServiceImpl implements StaticInfoService {
String
crossId
=
planSectionDTO
.
getCrossId
();
//从缓存中拿路口信息
CrossInfoPO
crossInfoPO
=
CrossInfoCache
.
getCrossInfoCache
().
get
(
crossId
);
if
(
Optional
.
ofNullable
(
planSectionDTO
).
isPresent
()){
if
(
Optional
.
ofNullable
(
planSectionDTO
).
isPresent
())
{
String
code
=
crossInfoPO
.
getCode
();
List
<
VNtcipTimeBaseDayplanDTO
>
vNtcipTimeBaseDayplanDTOS
=
vNtcipTimeBaseDayplanMapper
.
listByCrossIdAndDayPlanId
(
code
,
planSectionDTO
.
getPlanNo
());
if
(!
CollectionUtils
.
isEmpty
(
vNtcipTimeBaseDayplanDTOS
)){
if
(!
CollectionUtils
.
isEmpty
(
vNtcipTimeBaseDayplanDTOS
))
{
List
<
PlanSectionVO
>
list
=
new
ArrayList
<>();
//根据时段表号分组
Map
<
Integer
,
List
<
VNtcipTimeBaseDayplanDTO
>>
collect
=
vNtcipTimeBaseDayplanDTOS
.
stream
().
collect
(
Collectors
.
groupingBy
(
VNtcipTimeBaseDayplanDTO:
:
getNDayPlanNumber
));
...
...
@@ -206,28 +491,27 @@ public class StaticInfoServiceImpl implements StaticInfoService {
CrossSectionPO
crossSectionPO
=
new
CrossSectionPO
();
crossPlan
.
setCrossId
(
crossId
);
//计划号-取的是时段表号
crossPlan
.
setPlanNo
(
dayplanDTO
.
getNDayPlanNumber
()
+
""
);
crossPlan
.
setName
(
"海信信号机-时段表号:"
+
dayplanDTO
.
getNDayPlanNumber
());
crossPlan
.
setPlanNo
(
dayplanDTO
.
getNDayPlanNumber
()
+
""
);
crossPlan
.
setName
(
"海信信号机-时段表号:"
+
dayplanDTO
.
getNDayPlanNumber
());
crossSectionPO
.
setCrossId
(
crossId
);
//时段号 - 取的是时段序号
crossSectionPO
.
setSectionNo
(
dayplanDTO
.
getNDayPlanEventNumber
()+
""
);
//TODO 开始时间 - 拼接小时和分钟
crossSectionPO
.
setStartTime
(
dayplanDTO
.
getNDayPlanHour
()+
":"
+
dayplanDTO
.
getNDayPlanMinute
());
if
(
i1
==
dayplanDTOS
.
size
()-
1
){
crossSectionPO
.
setSectionNo
(
dayplanDTO
.
getNDayPlanEventNumber
()
+
""
);
crossSectionPO
.
setStartTime
(
dayplanDTO
.
getNDayPlanHour
()
+
":"
+
dayplanDTO
.
getNDayPlanMinute
());
if
(
i1
==
dayplanDTOS
.
size
()
-
1
)
{
crossSectionPO
.
setEndTime
(
"23:59"
);
}
else
{
}
else
{
VNtcipTimeBaseDayplanDTO
dto
=
dayplanDTOS
.
get
(
i1
+
1
);
crossSectionPO
.
setEndTime
(
dto
.
getNDayPlanHour
()
+
":"
+
dto
.
getNDayPlanMinute
());
crossSectionPO
.
setEndTime
(
dto
.
getNDayPlanHour
()
+
":"
+
dto
.
getNDayPlanMinute
());
}
// 计划ID - 取的是时段表号
crossSectionPO
.
setPlanId
(
dayplanDTO
.
getNDayPlanNumber
());
//方案号
Integer
pattern
=
dayplanDTO
.
getNTimebaseAscPattern
();
if
(
pattern
==
85
){
if
(
pattern
==
85
)
{
//黃闪
crossSectionPO
.
setControlMode
(
3
);
}
else
{
}
else
{
//定周期
crossSectionPO
.
setControlMode
(
1
);
}
...
...
signal-utc-hisense-service/src/main/java/net/wanji/utc/hisense/util/CommonUtils.java
View file @
2dde54a3
...
...
@@ -2,6 +2,12 @@ package net.wanji.utc.hisense.util;
import
cn.hutool.core.util.HexUtil
;
import
freemarker.template.utility.StringUtil
;
import
net.wanji.common.utils.tool.ScheduleUtil
;
import
net.wanji.utc.hisense.common.HisenseTurnEnum
;
import
net.wanji.utc.hisense.common.HiseseDirEnum
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* @author duanruiming
...
...
@@ -120,8 +126,60 @@ public class CommonUtils {
return
dir
;
}
/**
* @Description 将字符串分成八个一组,不够的最前面补0
* @Param [input]
* @return java.util.List<java.lang.String>
**/
public
static
List
<
String
>
groupStringFromRight
(
String
input
)
{
List
<
String
>
list
=
new
ArrayList
<>();
if
(
input
==
null
||
input
.
isEmpty
())
{
return
null
;
}
// 计算需要多少个完整的8字符组
int
fullGroups
=
input
.
length
()
/
8
;
// 计算最后一个组中的字符数
int
lastGroupSize
=
input
.
length
()
%
8
;
StringBuilder
result
=
new
StringBuilder
(
input
);
String
str
=
""
;
if
(
lastGroupSize
>
0
)
{
// 计算需要补多少个0
int
padding
=
8
-
lastGroupSize
;
for
(
int
i
=
0
;
i
<
padding
;
i
++)
{
str
=
str
+
"0"
;
}
}
input
=
str
+
result
.
toString
();
int
size
=
input
.
length
()/
8
;
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
String
substring
=
input
.
substring
(
i
*
8
,
(
i
+
1
)
*
8
);
list
.
add
(
substring
);
}
return
list
;
}
public
static
void
main
(
String
[]
args
)
{
System
.
err
.
println
(
get4BinaryInteger
(
4
));
int
l
=
6442253
;
String
binaryString
=
Integer
.
toBinaryString
(
l
);
List
<
String
>
readUtf8Lines
=
groupStringFromRight
(
binaryString
);
System
.
out
.
println
(
readUtf8Lines
.
size
());
for
(
String
readUtf8Line
:
readUtf8Lines
)
{
System
.
out
.
println
(
readUtf8Line
);
String
dir
=
readUtf8Line
.
substring
(
0
,
3
);
// 高三位 方向
String
turn
=
readUtf8Line
.
substring
(
3
);
// 低五位 转向
System
.
out
.
println
(
ScheduleUtil
.
binaryIntToDecimalism
(
dir
)+
"_"
+
ScheduleUtil
.
binaryIntToDecimalism
(
turn
));
Integer
wjLightsDir
=
HiseseDirEnum
.
getWjLightsDir
(
Integer
.
parseInt
(
dir
,
2
));
Integer
wjLightsTurn
=
HisenseTurnEnum
.
getWjLightsTurn
(
Integer
.
parseInt
(
turn
,
2
));
System
.
out
.
println
(
"wjLightsDir "
+
wjLightsDir
);
System
.
out
.
println
(
"wjLightsTurn "
+
wjLightsTurn
);
System
.
out
.
println
(
"======================================"
);
}
}
}
signal-utc-service/src/main/java/net/wanji/utc/controller/StaticInfoController.java
View file @
2dde54a3
...
...
@@ -74,7 +74,7 @@ public class StaticInfoController {
})
public
JsonViewObject
schemePhaseLights
(
@RequestBody
@Validated
SchemePhaseLightsDTO
schemePhaseLightsDTO
)
throws
Exception
{
// 更新数据库
//
staticInfoService.schemePhaseLights(schemePhaseLightsDTO);
staticInfoService
.
schemePhaseLights
(
schemePhaseLightsDTO
);
// 构造返回值
SchemePhaseLightsVO
schemePhaseLightsVO
=
staticInfoService
.
buildSchemePhaseLightsResponse
(
schemePhaseLightsDTO
);
JsonViewObject
jsonViewObject
=
JsonViewObject
.
newInstance
();
...
...
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