openatc-components 0.4.28 → 0.4.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (446) hide show
  1. package/.babelrc +18 -18
  2. package/.editorconfig +9 -9
  3. package/.eslintignore +5 -5
  4. package/.eslintrc.js +31 -31
  5. package/.postcssrc.js +10 -10
  6. package/README.md +30 -30
  7. package/build/build.js +41 -41
  8. package/build/check-versions.js +54 -54
  9. package/build/package.config.js +58 -58
  10. package/build/package.dev.config.js +107 -107
  11. package/build/package.prod.config.js +160 -160
  12. package/build/utils.js +101 -101
  13. package/build/vue-loader.conf.js +22 -22
  14. package/build/webpack.base.conf.js +114 -114
  15. package/build/webpack.dev.conf.js +95 -95
  16. package/build/webpack.prod.conf.js +149 -149
  17. package/config/dev.env.js +8 -8
  18. package/config/index.js +94 -94
  19. package/config/prod.env.js +5 -5
  20. package/config/test.env.js +7 -7
  21. package/index.html +12 -12
  22. package/package/kisscomps/components/BoardCard/BoardCard.vue +133 -133
  23. package/package/kisscomps/components/ChannelRealtimeIntersection/ChannelRealtimeIntersection.vue +123 -123
  24. package/package/kisscomps/components/Channelization/Channelization.vue +584 -584
  25. package/package/kisscomps/components/ChannelizationFlowStatistic/ChannelizationFlowStatistic.vue +360 -360
  26. package/package/kisscomps/components/ChannelizationWithInterface/ChannelizationWithInterface.vue +518 -518
  27. package/package/kisscomps/components/CommonKanban/CommonKanban.vue +132 -132
  28. package/package/kisscomps/components/DirectionListConfiguration/DirectionListConfiguration.vue +456 -456
  29. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-east-bottom.vue +41 -41
  30. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-east-top.vue +60 -60
  31. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-ewped.vue +105 -105
  32. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-north-left.vue +60 -60
  33. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-north-right.vue +60 -60
  34. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-snped.vue +105 -105
  35. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-south-left.vue +60 -60
  36. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-south-right.vue +60 -60
  37. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-west-bottom.vue +60 -60
  38. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-west-top.vue +60 -60
  39. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-xlped.vue +30 -30
  40. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-xrped.vue +30 -30
  41. package/package/kisscomps/components/DirectionListConfiguration/svg/pedSvg.vue +78 -78
  42. package/package/kisscomps/components/DrawChannelization/drawsvg/basicCoordInfo.vue +181 -181
  43. package/package/kisscomps/components/DrawChannelization/drawsvg/channelizationElements.vue +255 -255
  44. package/package/kisscomps/components/DrawChannelization/drawsvg/detectorAssociatedComponent.vue +152 -152
  45. package/package/kisscomps/components/DrawChannelization/drawsvg/drawElement/TextBox.vue +91 -91
  46. package/package/kisscomps/components/DrawChannelization/drawsvg/drawElement/crossMap.vue +194 -194
  47. package/package/kisscomps/components/DrawChannelization/drawsvg/drawElement/editText.vue +108 -108
  48. package/package/kisscomps/components/DrawChannelization/drawsvg/firstImportCrossmap.vue +51 -51
  49. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/countdownSvg.vue +236 -236
  50. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorChart.vue +247 -247
  51. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorIconSvg.vue +210 -210
  52. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/laneIcon.vue +72 -72
  53. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/motorwayIconSvg.vue +368 -368
  54. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/pedroadIconSvg.vue +230 -230
  55. package/package/kisscomps/components/DrawChannelization/drawsvg/importDialog.vue +74 -74
  56. package/package/kisscomps/components/DrawChannelization/drawsvg/index.draw.vue +1005 -1005
  57. package/package/kisscomps/components/DrawChannelization/drawsvg/index.vue +110 -110
  58. package/package/kisscomps/components/DrawChannelization/drawsvg/laneEditPanel.vue +707 -707
  59. package/package/kisscomps/components/DrawChannelization/drawsvg/overlapAssociatedComponent.vue +172 -172
  60. package/package/kisscomps/components/DrawChannelization/drawsvg/phaseAssociatedComponent.vue +172 -172
  61. package/package/kisscomps/components/DrawChannelization/drawsvg/table.vue +99 -99
  62. package/package/kisscomps/components/DrawChannelization/drawsvg/utils/loadutils.js +87 -87
  63. package/package/kisscomps/components/DrawChannelization/drawsvg/utils/phaseDataModel.js +32 -32
  64. package/package/kisscomps/components/DrawChannelization/drawsvg/utils/phasePos.json +20 -20
  65. package/package/kisscomps/components/DrawChannelization/phaseDataMgr.js +278 -278
  66. package/package/kisscomps/components/ExpendConfig/ExpendConfig.vue +118 -118
  67. package/package/kisscomps/components/FaultDetailModal/FaultDetailModal.vue +178 -178
  68. package/package/kisscomps/components/IntersectionDirectionSelection/IntersectionDirectionSelection.vue +158 -158
  69. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/CrossRoadsSvg.vue +629 -629
  70. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/CustomRoadsSvg.vue +46 -46
  71. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionEWSvg.vue +447 -447
  72. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionSNSvg.vue +341 -341
  73. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampEastSvg.vue +497 -497
  74. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampNorthSvg.vue +353 -353
  75. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampSouthSvg.vue +359 -359
  76. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampWestSvg.vue +443 -443
  77. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/SidewalkClickSvg.vue +1302 -1302
  78. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/SidewalkSvg.vue +1190 -1190
  79. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeEastRoadsSvg.vue +498 -498
  80. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeNorthRoadsSvg.vue +484 -484
  81. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeSouthRoadsSvg.vue +488 -488
  82. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeWestRoadsSvg.vue +566 -566
  83. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LCrossRoadsSvg.vue +640 -640
  84. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeEastRoadsSvg.vue +497 -497
  85. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeNorthRoadsSvg.vue +486 -486
  86. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeSouthRoadsSvg.vue +490 -490
  87. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeWestRoadsSvg.vue +575 -575
  88. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/refreshSvg.vue +63 -63
  89. package/package/kisscomps/components/IntersectionMap/crossDirection/busIcon/busMapSvg.vue +50 -50
  90. package/package/kisscomps/components/IntersectionMap/crossDirection/busIcon/eastBusSvg.vue +167 -167
  91. package/package/kisscomps/components/IntersectionMap/crossDirection/busIcon/northBusSvg.vue +168 -168
  92. package/package/kisscomps/components/IntersectionMap/crossDirection/busIcon/southBusSvg.vue +168 -168
  93. package/package/kisscomps/components/IntersectionMap/crossDirection/busIcon/westBusSvg.vue +169 -169
  94. package/package/kisscomps/components/IntersectionMap/crossDirection/crossDiagram.vue +1514 -1511
  95. package/package/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/LphaseIconSvg.vue +197 -197
  96. package/package/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/phaseIconSvg.vue +196 -196
  97. package/package/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/rampPhaseIconSvg.vue +122 -122
  98. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.json +196 -196
  99. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.left.json +196 -196
  100. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.json +115 -115
  101. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.left.json +115 -115
  102. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/rampPos.json +52 -52
  103. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/sidePos.json +219 -219
  104. package/package/kisscomps/components/IntersectionMap/crossDirection/utils.js +84 -84
  105. package/package/kisscomps/components/IntersectionMap/intersectionmap.vue +220 -220
  106. package/package/kisscomps/components/IntersectionWithInterface/IntersectionWithInterface.vue +534 -534
  107. package/package/kisscomps/components/KanBan/kanban.vue +231 -231
  108. package/package/kisscomps/components/MessageBox/index.vue +96 -96
  109. package/package/kisscomps/components/OverLap/OverLap.vue +237 -237
  110. package/package/kisscomps/components/OverviewComponent/index.vue +798 -798
  111. package/package/kisscomps/components/PatternOptimize/PatternOptimize.vue +329 -329
  112. package/package/kisscomps/components/PatternStatus/PatternStatus.vue +1776 -1776
  113. package/package/kisscomps/components/PatternWalkSvg/PatternWalkSvg.vue +423 -423
  114. package/package/kisscomps/components/PhaseDirectionSelect/PhaseDirectionSelect.vue +126 -126
  115. package/package/kisscomps/components/PhaseDirectionText/PhaseDirectionText.vue +106 -106
  116. package/package/kisscomps/components/PhaseLegend/PhaseLegend.vue +286 -286
  117. package/package/kisscomps/components/PhaseMarker/index.js +6 -6
  118. package/package/kisscomps/components/PhaseMarker/phasemarker.vue +215 -215
  119. package/package/kisscomps/components/PhaseMarker/svg/patternSvg.vue +121 -121
  120. package/package/kisscomps/components/PhaseMarker/svg/phase.vue +60 -60
  121. package/package/kisscomps/components/PhaseMarker/svg/phaseCount.vue +62 -62
  122. package/package/kisscomps/components/PhaseMarker/svg/phaseCountCycle.vue +62 -62
  123. package/package/kisscomps/components/PhaseMarker/svg/phaseSvg.vue +117 -117
  124. package/package/kisscomps/components/PhasePedSelect/index.vue +206 -206
  125. package/package/kisscomps/components/SchemeConfig/SchemeConfig.vue +1011 -1011
  126. package/package/kisscomps/components/SchemeConfig/azimuthlocking/index.vue +365 -365
  127. package/package/kisscomps/components/SchemeConfig/azimuthlocking/utils.js +92 -92
  128. package/package/kisscomps/components/SchemeConfig/closePhaselControlModal/index.vue +214 -214
  129. package/package/kisscomps/components/SchemeConfig/lockingPhaselControlModal/index.vue +235 -235
  130. package/package/kisscomps/components/SchemeConfig/manualControlModal/index.vue +235 -235
  131. package/package/kisscomps/components/SchemeConfig/manualControlModalNew/controlModelGroup.vue +131 -131
  132. package/package/kisscomps/components/SchemeConfig/manualControlModalNew/icon.vue +470 -470
  133. package/package/kisscomps/components/SchemeConfig/manualControlModalNew/index.vue +871 -871
  134. package/package/kisscomps/components/SchemeConfig/manualControlModalNew/othersIcon.vue +151 -151
  135. package/package/kisscomps/components/SchemeConfig/priorityControl/index.vue +215 -215
  136. package/package/kisscomps/components/SchemeConfig/priorityControl/utils.js +163 -163
  137. package/package/kisscomps/components/SchemeConfig/realtimeStatusModal/index.vue +308 -308
  138. package/package/kisscomps/components/SchemeConfig/tentativeplancontrolmodal/index.vue +1293 -1293
  139. package/package/kisscomps/components/SchemeConfig/utils/thirdPartypermission.js +95 -95
  140. package/package/kisscomps/components/SelectCrossPhase/index.vue +418 -418
  141. package/package/kisscomps/components/SelectCrossPhase/utils.js +142 -142
  142. package/package/kisscomps/components/StageBord/StageBord.vue +303 -303
  143. package/package/kisscomps/components/StageOptimize/StageOptimize.vue +367 -367
  144. package/package/kisscomps/components/StageOptimize/index.js +2 -2
  145. package/package/kisscomps/components/StageOptimize/index.vue +310 -0
  146. package/package/kisscomps/components/StageStatus/StageStatus.vue +341 -341
  147. package/package/kisscomps/components/Stages/index.vue +319 -319
  148. package/package/kisscomps/components/SvgIcon/SvgIcon.vue +53 -53
  149. package/package/kisscomps/components/XRDDirSelector/XRDDirSelector.vue +1041 -1041
  150. package/package/kisscomps/components/XiaoKanban/DirSelector.vue +356 -356
  151. package/package/kisscomps/components/XiaoKanban/index.vue +122 -122
  152. package/package/kisscomps/components/overView/index.vue +676 -676
  153. package/package/kisscomps/components/patternConfig/index.vue +798 -798
  154. package/package/kisscomps/components/patternConfig/pattern/patternTable.vue +599 -599
  155. package/package/kisscomps/components/patternConfig/pattern/planChart/model/coordinationModel.js +665 -665
  156. package/package/kisscomps/components/patternConfig/planContent.vue +604 -604
  157. package/package/kisscomps/components/patternConfig/planMenu.vue +329 -329
  158. package/package/kisscomps/components/patternConfig/utils.js +152 -152
  159. package/package/kisscomps/components/patternList/patternList.vue +606 -606
  160. package/package/kisscomps/index.js +131 -131
  161. package/package/kissui.min.js +1 -1
  162. package/package.json +126 -126
  163. package/src/App.vue +24 -24
  164. package/src/EdgeMgr/EdgeModelBase.js +16 -16
  165. package/src/EdgeMgr/controller/crossDiagramMgr.js +125 -125
  166. package/src/api/authapi.js +31 -31
  167. package/src/api/config.js +21 -21
  168. package/src/api/control.js +110 -110
  169. package/src/api/cross.js +49 -49
  170. package/src/api/device.js +135 -135
  171. package/src/api/fault.js +66 -66
  172. package/src/api/index.js +24 -24
  173. package/src/api/login.js +46 -46
  174. package/src/api/optimize.js +72 -72
  175. package/src/api/param.js +165 -165
  176. package/src/api/passwdAssest.js +101 -101
  177. package/src/api/permission.js +33 -33
  178. package/src/api/route.js +171 -171
  179. package/src/api/template.js +27 -27
  180. package/src/assets/font/LICENSE.txt +202 -202
  181. package/src/assets/font/font.css +6 -6
  182. package/src/i18n/index.js +26 -26
  183. package/src/i18n/language/en.js +1474 -1474
  184. package/src/i18n/language/index.js +25 -25
  185. package/src/i18n/language/zh.js +1474 -1474
  186. package/src/icons/demo_index.html +8445 -8445
  187. package/src/icons/iconfont.css +1451 -1451
  188. package/src/icons/iconfont.json +2522 -2522
  189. package/src/icons/index.js +20 -20
  190. package/src/icons/svg/azimuthlocking.svg +26 -26
  191. package/src/icons/svg/bendi.svg +110 -110
  192. package/src/icons/svg/bujin.svg +36 -36
  193. package/src/icons/svg/connectBlue.svg +7 -7
  194. package/src/icons/svg/currentvolume.svg +0 -0
  195. package/src/icons/svg/custom-BRTlane.svg +40 -40
  196. package/src/icons/svg/custom-buslane.svg +40 -40
  197. package/src/icons/svg/custom-detector.svg +12 -12
  198. package/src/icons/svg/custom-east-bottom.svg +32 -32
  199. package/src/icons/svg/custom-east-top.svg +32 -32
  200. package/src/icons/svg/custom-ewped.svg +35 -35
  201. package/src/icons/svg/custom-nonmotorizedlane.svg +40 -40
  202. package/src/icons/svg/custom-north-left.svg +32 -32
  203. package/src/icons/svg/custom-north-right.svg +32 -32
  204. package/src/icons/svg/custom-peddetector.svg +17 -17
  205. package/src/icons/svg/custom-snped.svg +35 -35
  206. package/src/icons/svg/custom-south-left.svg +32 -32
  207. package/src/icons/svg/custom-south-right.svg +32 -32
  208. package/src/icons/svg/custom-tramlane.svg +40 -40
  209. package/src/icons/svg/custom-vehiclebranch.svg +40 -40
  210. package/src/icons/svg/custom-vehiclemainroad.svg +41 -41
  211. package/src/icons/svg/custom-west-bottom.svg +32 -32
  212. package/src/icons/svg/custom-west-top.svg +32 -32
  213. package/src/icons/svg/custom-xlped.svg +14 -14
  214. package/src/icons/svg/custom-xrped.svg +14 -14
  215. package/src/icons/svg/cutRed.svg +7 -7
  216. package/src/icons/svg/cycle.svg +0 -0
  217. package/src/icons/svg/dingzhouqi.svg +34 -34
  218. package/src/icons/svg/ganyingkongzhi.svg +30 -30
  219. package/src/icons/svg/guandeng.svg +81 -81
  220. package/src/icons/svg/huangshan.svg +71 -71
  221. package/src/icons/svg/maincontrol.svg +0 -0
  222. package/src/icons/svg/manualcontrolbackground.svg +51 -51
  223. package/src/icons/svg/manualcontrolbackground1.svg +62 -62
  224. package/src/icons/svg/manualcontrolbackgrounden.svg +62 -62
  225. package/src/icons/svg/model.svg +0 -0
  226. package/src/icons/svg/phasediff.svg +0 -0
  227. package/src/icons/svg/prioritycontrol.svg +21 -21
  228. package/src/icons/svg/quanhong.svg +86 -86
  229. package/src/icons/svg/shanghe.svg +11 -11
  230. package/src/icons/svg/shoudong.svg +103 -103
  231. package/src/icons/svg/tentativeplan.svg +28 -28
  232. package/src/icons/svg/time.svg +0 -0
  233. package/src/icons/svg/wuxianlan.svg +46 -46
  234. package/src/icons/svg/xiala.svg +11 -11
  235. package/src/icons/svg/xingrenguojie.svg +33 -33
  236. package/src/icons/svg/xitong.svg +89 -89
  237. package/src/icons/svg/youxian.svg +41 -41
  238. package/src/icons/svg/zizhukongzhi.svg +43 -43
  239. package/src/kisscomps/components/BoardCard/BoardCard.vue +133 -133
  240. package/src/kisscomps/components/ChannelRealtimeIntersection/ChannelRealtimeIntersection.vue +123 -123
  241. package/src/kisscomps/components/Channelization/Channelization.vue +584 -584
  242. package/src/kisscomps/components/ChannelizationFlowStatistic/ChannelizationFlowStatistic.vue +360 -360
  243. package/src/kisscomps/components/ChannelizationWithInterface/ChannelizationWithInterface.vue +518 -518
  244. package/src/kisscomps/components/CommonKanban/CommonKanban.vue +132 -132
  245. package/src/kisscomps/components/DirectionListConfiguration/DirectionListConfiguration.vue +456 -456
  246. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-east-bottom.vue +41 -41
  247. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-east-top.vue +60 -60
  248. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-ewped.vue +105 -105
  249. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-north-left.vue +60 -60
  250. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-north-right.vue +60 -60
  251. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-snped.vue +105 -105
  252. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-south-left.vue +60 -60
  253. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-south-right.vue +60 -60
  254. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-west-bottom.vue +60 -60
  255. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-west-top.vue +60 -60
  256. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-xlped.vue +30 -30
  257. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-xrped.vue +30 -30
  258. package/src/kisscomps/components/DirectionListConfiguration/svg/pedSvg.vue +78 -78
  259. package/src/kisscomps/components/DrawChannelization/drawsvg/basicCoordInfo.vue +181 -181
  260. package/src/kisscomps/components/DrawChannelization/drawsvg/channelizationElements.vue +255 -255
  261. package/src/kisscomps/components/DrawChannelization/drawsvg/detectorAssociatedComponent.vue +152 -152
  262. package/src/kisscomps/components/DrawChannelization/drawsvg/drawElement/TextBox.vue +91 -91
  263. package/src/kisscomps/components/DrawChannelization/drawsvg/drawElement/crossMap.vue +194 -194
  264. package/src/kisscomps/components/DrawChannelization/drawsvg/drawElement/editText.vue +108 -108
  265. package/src/kisscomps/components/DrawChannelization/drawsvg/firstImportCrossmap.vue +51 -51
  266. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/countdownSvg.vue +236 -236
  267. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorChart.vue +247 -247
  268. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorIconSvg.vue +210 -210
  269. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/laneIcon.vue +72 -72
  270. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/motorwayIconSvg.vue +368 -368
  271. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/pedroadIconSvg.vue +230 -230
  272. package/src/kisscomps/components/DrawChannelization/drawsvg/importDialog.vue +74 -74
  273. package/src/kisscomps/components/DrawChannelization/drawsvg/index.draw.vue +1005 -1005
  274. package/src/kisscomps/components/DrawChannelization/drawsvg/index.vue +110 -110
  275. package/src/kisscomps/components/DrawChannelization/drawsvg/laneEditPanel.vue +707 -707
  276. package/src/kisscomps/components/DrawChannelization/drawsvg/overlapAssociatedComponent.vue +172 -172
  277. package/src/kisscomps/components/DrawChannelization/drawsvg/phaseAssociatedComponent.vue +172 -172
  278. package/src/kisscomps/components/DrawChannelization/drawsvg/table.vue +99 -99
  279. package/src/kisscomps/components/DrawChannelization/drawsvg/utils/loadutils.js +87 -87
  280. package/src/kisscomps/components/DrawChannelization/drawsvg/utils/phaseDataModel.js +32 -32
  281. package/src/kisscomps/components/DrawChannelization/drawsvg/utils/phasePos.json +20 -20
  282. package/src/kisscomps/components/DrawChannelization/phaseDataMgr.js +278 -278
  283. package/src/kisscomps/components/ExpendConfig/ExpendConfig.vue +118 -118
  284. package/src/kisscomps/components/FaultDetailModal/FaultDetailModal.vue +178 -178
  285. package/src/kisscomps/components/IntersectionDirectionSelection/IntersectionDirectionSelection.vue +158 -158
  286. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/CrossRoadsSvg.vue +629 -629
  287. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/CustomRoadsSvg.vue +46 -46
  288. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionEWSvg.vue +447 -447
  289. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionSNSvg.vue +341 -341
  290. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampEastSvg.vue +497 -497
  291. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampNorthSvg.vue +353 -353
  292. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampSouthSvg.vue +359 -359
  293. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampWestSvg.vue +443 -443
  294. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/SidewalkClickSvg.vue +1302 -1302
  295. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/SidewalkSvg.vue +1190 -1190
  296. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeEastRoadsSvg.vue +498 -498
  297. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeNorthRoadsSvg.vue +484 -484
  298. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeSouthRoadsSvg.vue +488 -488
  299. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeWestRoadsSvg.vue +566 -566
  300. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LCrossRoadsSvg.vue +640 -640
  301. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeEastRoadsSvg.vue +497 -497
  302. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeNorthRoadsSvg.vue +486 -486
  303. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeSouthRoadsSvg.vue +490 -490
  304. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeWestRoadsSvg.vue +575 -575
  305. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/refreshSvg.vue +63 -63
  306. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/busMapSvg.vue +50 -50
  307. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/eastBusSvg.vue +167 -167
  308. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/northBusSvg.vue +168 -168
  309. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/southBusSvg.vue +168 -168
  310. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/westBusSvg.vue +169 -169
  311. package/src/kisscomps/components/IntersectionMap/crossDirection/crossDiagram.vue +1514 -1511
  312. package/src/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/LphaseIconSvg.vue +197 -197
  313. package/src/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/phaseIconSvg.vue +196 -196
  314. package/src/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/rampPhaseIconSvg.vue +122 -122
  315. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.json +196 -196
  316. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.left.json +196 -196
  317. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.json +115 -115
  318. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.left.json +115 -115
  319. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/rampPos.json +52 -52
  320. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/sidePos.json +219 -219
  321. package/src/kisscomps/components/IntersectionMap/crossDirection/utils.js +84 -84
  322. package/src/kisscomps/components/IntersectionMap/intersectionmap.vue +220 -220
  323. package/src/kisscomps/components/IntersectionWithInterface/IntersectionWithInterface.vue +534 -534
  324. package/src/kisscomps/components/KanBan/kanban.vue +231 -231
  325. package/src/kisscomps/components/MessageBox/index.vue +96 -96
  326. package/src/kisscomps/components/OverLap/OverLap.vue +237 -237
  327. package/src/kisscomps/components/OverviewComponent/index.vue +798 -798
  328. package/src/kisscomps/components/PatternOptimize/PatternOptimize.vue +329 -329
  329. package/src/kisscomps/components/PatternStatus/PatternStatus.vue +1776 -1776
  330. package/src/kisscomps/components/PatternWalkSvg/PatternWalkSvg.vue +423 -423
  331. package/src/kisscomps/components/PhaseDirectionSelect/PhaseDirectionSelect.vue +126 -126
  332. package/src/kisscomps/components/PhaseDirectionText/PhaseDirectionText.vue +106 -106
  333. package/src/kisscomps/components/PhaseLegend/PhaseLegend.vue +286 -286
  334. package/src/kisscomps/components/PhaseMarker/index.js +6 -6
  335. package/src/kisscomps/components/PhaseMarker/phasemarker.vue +215 -215
  336. package/src/kisscomps/components/PhaseMarker/svg/patternSvg.vue +121 -121
  337. package/src/kisscomps/components/PhaseMarker/svg/phase.vue +60 -60
  338. package/src/kisscomps/components/PhaseMarker/svg/phaseCount.vue +62 -62
  339. package/src/kisscomps/components/PhaseMarker/svg/phaseCountCycle.vue +62 -62
  340. package/src/kisscomps/components/PhaseMarker/svg/phaseSvg.vue +117 -117
  341. package/src/kisscomps/components/PhasePedSelect/index.vue +206 -206
  342. package/src/kisscomps/components/SchemeConfig/SchemeConfig.vue +1011 -1011
  343. package/src/kisscomps/components/SchemeConfig/azimuthlocking/index.vue +365 -365
  344. package/src/kisscomps/components/SchemeConfig/azimuthlocking/utils.js +92 -92
  345. package/src/kisscomps/components/SchemeConfig/closePhaselControlModal/index.vue +214 -214
  346. package/src/kisscomps/components/SchemeConfig/lockingPhaselControlModal/index.vue +235 -235
  347. package/src/kisscomps/components/SchemeConfig/manualControlModal/index.vue +235 -235
  348. package/src/kisscomps/components/SchemeConfig/manualControlModalNew/controlModelGroup.vue +131 -131
  349. package/src/kisscomps/components/SchemeConfig/manualControlModalNew/icon.vue +470 -470
  350. package/src/kisscomps/components/SchemeConfig/manualControlModalNew/index.vue +871 -871
  351. package/src/kisscomps/components/SchemeConfig/manualControlModalNew/othersIcon.vue +151 -151
  352. package/src/kisscomps/components/SchemeConfig/priorityControl/index.vue +215 -215
  353. package/src/kisscomps/components/SchemeConfig/priorityControl/utils.js +163 -163
  354. package/src/kisscomps/components/SchemeConfig/realtimeStatusModal/index.vue +308 -308
  355. package/src/kisscomps/components/SchemeConfig/tentativeplancontrolmodal/index.vue +1293 -1293
  356. package/src/kisscomps/components/SchemeConfig/utils/thirdPartypermission.js +95 -95
  357. package/src/kisscomps/components/SelectCrossPhase/index.vue +418 -418
  358. package/src/kisscomps/components/SelectCrossPhase/utils.js +142 -142
  359. package/src/kisscomps/components/StageBord/StageBord.vue +303 -303
  360. package/src/kisscomps/components/StageOptimize/StageOptimize.vue +367 -367
  361. package/src/kisscomps/components/StageOptimize/index.js +2 -2
  362. package/src/kisscomps/components/StageStatus/StageStatus.vue +341 -341
  363. package/src/kisscomps/components/Stages/index.vue +319 -319
  364. package/src/kisscomps/components/SvgIcon/SvgIcon.vue +53 -53
  365. package/src/kisscomps/components/XRDDirSelector/XRDDirSelector.vue +1041 -1041
  366. package/src/kisscomps/components/XiaoKanban/DirSelector.vue +356 -356
  367. package/src/kisscomps/components/XiaoKanban/index.vue +122 -122
  368. package/src/kisscomps/components/overView/index.vue +676 -676
  369. package/src/kisscomps/components/patternConfig/index.vue +798 -798
  370. package/src/kisscomps/components/patternConfig/pattern/patternTable.vue +599 -599
  371. package/src/kisscomps/components/patternConfig/pattern/planChart/model/coordinationModel.js +665 -665
  372. package/src/kisscomps/components/patternConfig/planContent.vue +604 -604
  373. package/src/kisscomps/components/patternConfig/planMenu.vue +329 -329
  374. package/src/kisscomps/components/patternConfig/utils.js +152 -152
  375. package/src/kisscomps/components/patternList/patternList.vue +606 -606
  376. package/src/kisscomps/index.js +131 -131
  377. package/src/lib/publicjs/ArryListUtil.js +38 -38
  378. package/src/lib/publicjs/HttpurlMgr.js +45 -45
  379. package/src/lib/publicjs/KissApi.js +158 -158
  380. package/src/lib/publicjs/KissWSSub/Heartcheck.js +128 -128
  381. package/src/lib/publicjs/KissWSSub/KissWsSub.js +91 -91
  382. package/src/lib/publicjs/KissWSSub/KissWsSubByType.js +152 -152
  383. package/src/lib/publicjs/KissWSSub/SimuWsSubByType.js +44 -44
  384. package/src/lib/publicjs/KissWSSub/Sub.js +51 -51
  385. package/src/lib/publicjs/KissWSSub/SubChannel.js +119 -119
  386. package/src/lib/publicjs/basecomponents.js +65 -65
  387. package/src/lib/publicjs/localStorage.js +112 -112
  388. package/src/lib/publicjs/objdeepcopy.js +32 -32
  389. package/src/lib/publicjs/pageScroll.js +30 -30
  390. package/src/lib/publicjs/passwdAssest.js +101 -101
  391. package/src/lib/publicjs/styleclassfactory.js +32 -32
  392. package/src/main.js +51 -51
  393. package/src/router/index.js +63 -63
  394. package/src/store/index.js +26 -26
  395. package/src/store/modules/globalParam.js +67 -67
  396. package/src/utils/ControlFormat.js +68 -68
  397. package/src/utils/RingDataModel.js +335 -335
  398. package/src/utils/auth.js +199 -199
  399. package/src/utils/conflct.js +268 -268
  400. package/src/utils/conflictList.js +87 -87
  401. package/src/utils/dateFormat.js +41 -41
  402. package/src/utils/errorcode.js +231 -231
  403. package/src/utils/fault.js +196 -196
  404. package/src/utils/faultcode.js +209 -209
  405. package/src/utils/index.js +69 -69
  406. package/src/utils/pedphasedesc.js +119 -119
  407. package/src/utils/phaseList.js +203 -203
  408. package/src/utils/phasedesc.js +144 -144
  409. package/src/utils/responseMessage.js +21 -21
  410. package/src/utils/validate.js +43 -43
  411. package/src/views/customchannelization.vue +49 -49
  412. package/src/views/home.1.vue +479 -479
  413. package/src/views/home.vue +93 -93
  414. package/src/views/intersection.vue +522 -522
  415. package/src/views/intersection2.vue +328 -328
  416. package/src/views/overView.vue +63 -63
  417. package/src/views/patternConfig.vue +14792 -14792
  418. package/src/views/schemeconfig.vue +206 -206
  419. package/static/apiconfig.json +461 -461
  420. package/static/styles/channelizatioon.scss +433 -433
  421. package/static/styles/common.scss +30 -30
  422. package/static/styles/commonkanban.scss +168 -168
  423. package/static/styles/dark/index.scss +2 -2
  424. package/static/styles/dark/theme/element-dark.scss +44 -44
  425. package/static/styles/index.scss +84 -84
  426. package/static/styles/intersection.scss +180 -180
  427. package/static/styles/light/index.scss +2 -2
  428. package/static/styles/light/theme/element-light.scss +44 -44
  429. package/static/styles/overview.scss +146 -146
  430. package/static/styles/patternConfig.scss +56 -56
  431. package/static/styles/phasePedSelect.scss +71 -71
  432. package/static/styles/schemeconfig.scss +553 -553
  433. package/static/styles/stages.scss +57 -57
  434. package/static/styles/uiComponents.scss +57 -57
  435. package/static/styles/xiaokanban.scss +61 -61
  436. package/static/token.json +2 -2
  437. package/test/e2e/custom-assertions/elementCount.js +27 -27
  438. package/test/e2e/nightwatch.conf.js +46 -46
  439. package/test/e2e/runner.js +48 -48
  440. package/test/e2e/specs/test.js +19 -19
  441. package/test/unit/.eslintrc +7 -7
  442. package/test/unit/jest.conf.js +30 -30
  443. package/test/unit/setup.js +3 -3
  444. package/test/unit/specs/HelloWorld.spec.js +11 -11
  445. package/package/kissui.js +0 -216608
  446. package/pnpm-lock.yaml +0 -16362
@@ -1,1776 +1,1776 @@
1
- /**
2
- * Copyright (c) 2020 kedacom
3
- * OpenATC is licensed under Mulan PSL v2.
4
- * You can use this software according to the terms and conditions of the Mulan PSL v2.
5
- * You may obtain a copy of Mulan PSL v2 at:
6
- * http://license.coscl.org.cn/MulanPSL2
7
- * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8
- * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9
- * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10
- * See the Mulan PSL v2 for more details.
11
- **/
12
- <template>
13
- <div class="main-patternstatus">
14
- <!-- 环模式true -->
15
- <div v-if="this.contrloType === 'ring' || !this.contrloType">
16
- <div class="ring-first" v-for="(list, index1) in patternInfo" :key="index1">
17
- <draggable :move="move" @end="endDrag(index1)" :disabled="isMove" :list="list">
18
- <div style="position: relative;" :style="{'height': '35px','float':'left','width':((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100) + '%'}" v-for="(item,index2) in list" :key="index2" :class="item.mode === 7 ? 'direction' : isBorder ? 'hovercell' : ''">
19
- <div class="first-1" :class="item.mode === 8 ? 'mask' : item.mode === 9 ? 'yellowClass' : ''" :style="{'width':Number(item.greenWidth.replace('%', ''))/Number((((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100) + '%').replace('%', ''))*100+'%','height':'34px','background':'#7ccc66'}">
20
- <el-tooltip placement="top-start" effect="light">
21
- <div slot="content">{{$t('openatccomponents.phase.phase')}}{{item.id}}:{{item.split}}</div>
22
- <div style="cursor:pointer;">
23
- <div class="ring-phase">
24
- <!-- <patternwalksvg :showWalk="item.peddirection" :Width="'32'" :Height="'34'"></patternwalksvg> -->
25
- <xdrdirselector Width="60px" Height="60px" Widths="50px" Heights="50px" :showlist="item.direction"></xdrdirselector>
26
- </div>
27
- <div v-if="isShowTip" class="box" style="position: absolute; left:40px; width:40px; top: -1px;z-index:999">
28
- <div @click="focusInput(item.id)" class="ring-nums">{{$t('openatccomponents.phase.phase')}}{{item.id}}</div>
29
- <div v-if="isMove" class="ring-nums">{{item.split}}</div>
30
- <el-input-number
31
- v-if="!isMove"
32
- class="ring-nums"
33
- :ref="'inputNumbers' + item.id"
34
- size="small"
35
- :controls="false"
36
- :min="0"
37
- :step="1"
38
- v-model.number="item.split"
39
- @change="handleEdit(item)"
40
- style="width: 42px"
41
- ></el-input-number>
42
- </div>
43
- </div>
44
- </el-tooltip>
45
- <div style="width:50px;" v-for="(bus,index3) in busPhaseData" :key="index3">
46
- <i class="iconfont icon-lukouzhilu" style="position: absolute;top: 8px;left:70px;font-size:12px;color:#454545;" v-if="bus.controltype === 1 && bus.phaseid===item.id"></i>
47
- <i class="iconfont icon-BRT" style="position: absolute;top: 8px;left:70px;font-size:12px;color:#454545;" v-if="bus.controltype === 4 && bus.phaseid===item.id"></i>
48
- <i class="iconfont icon-xuxiangwei-xin" style="position: absolute;top: 8px;left:70px;font-size:12px;color:#454545;" v-if="bus.controltype === 99 && bus.phaseid===item.id"></i>
49
- <i class="iconfont icon-feijidongche" style="position: absolute;top: 8px;left:70px;font-size:12px;color:#454545;" v-if="bus.controltype === 6 && bus.phaseid===item.id"></i>
50
- <i class="iconfont icon-gongjiaoche" style="position: absolute;top: 8px;left:70px;font-size:12px;color:#454545;" v-if="bus.controltype === 3 && bus.phaseid===item.id"></i>
51
- <i class="iconfont icon-youguidianche" style="position: absolute;top: 8px;left:70px;font-size:12px;color:#454545;" v-if="bus.controltype === 5 && bus.phaseid===item.id"></i>
52
- </div>
53
- </div>
54
- <div class="first-1" :class="item.mode === 8 ? 'mask' : item.mode === 9 ? 'yellowClass' : ''" :style="{'width':Number(item.flashgreen.replace('%', ''))/Number((((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100).toFixed(3) + '%').replace('%', ''))*100+'%','height':'34px','float':'left','background': 'linear-gradient(to right, #ffffff 50%, #7ccc66 0)','background-size': '4px 100%'}"></div>
55
- <div class="first-1" :class="item.mode === 8 ? 'mask' : item.mode === 9 ? 'yellowClass' : ''" :style="{'width':Number(item.yellowWidth.replace('%', ''))/Number((((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100) + '%').replace('%', ''))*100+'%','height':'34px','background':'#f9dc6a'}"></div>
56
- <div class="first-1" :class="item.mode === 8 ? 'mask' : item.mode === 9 ? 'yellowClass' : ''" :style="{'width':Number(item.redWidth.replace('%', ''))/Number((((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100).toFixed(3) + '%').replace('%', ''))*100+'%','height':'34px','background':'#f27979'}"></div>
57
- </div>
58
- </draggable>
59
- </div>
60
- <div v-if="showBarrier">
61
- <div v-for="(item, index) in barrierList" :key="index + '1'">
62
- <div class="divider" :style="{'left':item, 'height':barrierHeight}"></div>
63
- </div>
64
- </div>
65
- <div v-show="(this.controlData && this.controlData.curTime && cycle && cycle>0 && this.isControl) || (this.controlData && newCycle && newCycle>0 && this.isControl)">
66
- <div class="curTimeDiv" :style="{'left':paddingLeft }">{{ timeNumDevide }}</div>
67
- <div class="curTimeLine" :style="{'left':paddingLeft, 'height':barrierHeight}"></div>
68
- </div>
69
- </div>
70
- <div v-if="this.contrloType === 'stage'" class="ring-first">
71
- <div v-for="(list, index1) in stageLists" :key="index1">
72
- <!-- <div> -->
73
- <div class="first-1" :style="{'width':list.greenWidth,'height':'34px','position':'relative','background':'#7ccc66'}">
74
- <el-tooltip placement="top-start" effect="light">
75
- <div slot="content">
76
- <span class="ring-nums" v-for="(pha,index) in list.phases" :key="index">
77
- {{$t('openatccomponents.phase.phase')}}{{pha}}
78
- </span>
79
- </div>
80
- <div style="cursor:pointer;">
81
- <div class="ring-phase">
82
- <!-- <patternwalksvg :showWalk="list.peddirection" :Width="'32'" :Height="'34'"></patternwalksvg> -->
83
- <xdrdirselector v-if="list.direction&&list.direction.length>0" Width="60px" Height="60px" Widths="50px" Heights="50px" :showlist="list.direction"></xdrdirselector>
84
- </div>
85
- <div class="box" style="position: absolute; left:41px; width:40px; top:-1px;">
86
- <div class="ring-nums">{{$t('openatccomponents.phase.stage')}}{{list.key+1}}</div>
87
- <div class="ring-nums">{{list.stageSplit}}</div>
88
- </div>
89
- <!-- <div class="box" style="line-height:28px">
90
- <span class="ring-nums" v-for="(pha,index) in list.phases" :key="index">
91
- P:{{pha}}
92
- </span>
93
- </div> -->
94
- </div>
95
- </el-tooltip>
96
- </div>
97
- <!-- <div class="first-1" :style="{'width':item.flashgreen,'height':'34px','float':'left','background': 'linear-gradient(to right, #ffffff 50%, #7ccc66 0)','background-size': '4px 100%'}"></div> -->
98
- <div class="first-1" :style="{'width':list.yellowWidth,'height':'34px','background':'#f9dc6a'}"></div>
99
- <div class="first-1" :style="{'width':list.redWidth,'height':'34px','background':'#f27979'}"></div>
100
- </div>
101
- <div v-if="this.controlData && this.controlData.curTime">
102
- <div class="curTimeDiv" :style="{ left: paddingLefts }">
103
- {{ timeNumDevides }}
104
- </div>
105
- <div
106
- class="curTimeLine"
107
- :style="{ left: paddingLefts, height: '56px' }"
108
- ></div>
109
- </div>
110
- </div>
111
- <!-- </div> -->
112
- </div>
113
- </template>
114
- <script>
115
- // import patternwalksvg from '../PatternWalkSvg/PatternWalkSvg'
116
- import xdrdirselector from '../XRDDirSelector/XRDDirSelector'
117
- import draggable from 'vuedraggable'
118
- // import PatternWalkSvg from '../IntersectionMap/crossDirection/baseImg/PatternWalkSvg'
119
- import PhaseDataModel from '../IntersectionMap/crossDirection/utils.js'
120
- import CrossDiagramMgr from '../../../EdgeMgr/controller/crossDiagramMgr.js'
121
- export default {
122
- name: 'pattern-list',
123
- components: {
124
- // patternwalksvg,
125
- draggable,
126
- xdrdirselector
127
- },
128
- data () {
129
- return {
130
- barrierHeight: '',
131
- stageCycle: '',
132
- barrierList: [],
133
- barrierArr: [],
134
- newCycle: this.cycles,
135
- patternIds: this.patternId,
136
- newPatterns: [],
137
- newList: [],
138
- isControl: true,
139
- contrloCycle: 0,
140
- sidewalkPhaseData: [],
141
- // controlDatas: this.controlData,
142
- max: '',
143
- fixCycle: '',
144
- curtime: 0,
145
- stageLists: [],
146
- busPhaseData: [], // 公交相位数据
147
- patternInfo: []
148
- }
149
- },
150
- props: {
151
- isBorder: {
152
- type: Boolean,
153
- default: false
154
- },
155
- isShowTip: {
156
- type: Boolean,
157
- default: true
158
- },
159
- cycleChange: {
160
- type: Boolean,
161
- default: true
162
- },
163
- stagesChange: {
164
- type: Array
165
- },
166
- isMove: {
167
- type: Boolean,
168
- default: true
169
- },
170
- controlPhase: {
171
- type: Object
172
- },
173
- contrloType: {
174
- type: String
175
- },
176
- phaseList: {
177
- type: Array
178
- },
179
- patternList: {
180
- type: Array
181
- },
182
- showBarrier: {
183
- type: Boolean,
184
- default: false
185
- },
186
- allPatternList: {
187
- type: Array
188
- },
189
- localPatternList: {
190
- type: Array
191
- },
192
- controlData: {
193
- type: Object
194
- },
195
- showCondition: {
196
- type: Boolean,
197
- default: false
198
- },
199
- cycle: {
200
- type: Number
201
- },
202
- agentId: {
203
- type: String
204
- },
205
- cycles: {
206
- type: Number
207
- },
208
- patternId: {
209
- type: Number
210
- },
211
- patternStatusList: {
212
- type: Array
213
- },
214
- syncTime: {
215
- type: Number
216
- }
217
- },
218
- computed: {
219
- paddingLefts () {
220
- let res = '0%'
221
- let curPercent = this.curtime / this.stageCycle
222
- if (curPercent >= 1) {
223
- curPercent = 1
224
- }
225
- res = curPercent * 100 + '%'
226
- return res
227
- },
228
- timeNumDevides () {
229
- let res = this.curtime
230
- return res
231
- },
232
- paddingLeft () {
233
- let res = '0%'
234
- if (this.contrloCycle > 0) {
235
- let curPercent = this.curtime / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.contrloCycle)
236
- if (curPercent >= 1) {
237
- curPercent = 1
238
- }
239
- res = curPercent * 100 + '%'
240
- }
241
- if (this.cycles > 0) {
242
- let curPercent = this.curtime / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.contrloCycle)
243
- if (curPercent >= 1) {
244
- curPercent = 1
245
- }
246
- res = curPercent * 100 + '%'
247
- }
248
- return res
249
- },
250
- timeNumDevide () {
251
- if (this.contrloCycle > 0) {
252
- // let res = (this.contrloCycle - this.syncTime) + '/' + this.contrloCycle
253
- // let res = this.curtime + '/' + (this.fixCycle ? this.fixCycle : this.max ? this.max : this.contrloCycle)
254
- let res = this.curtime
255
- return res
256
- }
257
- if (this.cycles > 0) {
258
- // let res = (this.cycles - this.syncTime) + '/' + this.cycles
259
- // let res = this.curtime + '/' + (this.fixCycle ? this.fixCycle : this.max ? this.max : this.contrloCycle)
260
- let res = this.curtime
261
- return res
262
- }
263
- }
264
- },
265
- watch: {
266
- controlPhase: {
267
- handler: function (val, oldVal) {
268
- if ((val && val.curTime) || val.curTime === 0) {
269
- this.curtime = val.curTime
270
- if (val.control === 4 || val.control === 16 || val.control === 22) {
271
- this.isControl = false
272
- } else {
273
- this.isControl = true
274
- }
275
- }
276
- },
277
- // 深度观察监听
278
- deep: true
279
- },
280
- controlData: {
281
- handler: function (val, oldVal) {
282
- if (this.contrloType === 'stage') {
283
- this.getIndexStage()
284
- }
285
- // this.controlDatas = this.controlData
286
- this.getPedPhasePos()
287
- if (this.localPatternList) {
288
- this.max = ''
289
- let idPattern = this.localPatternList.filter(item => item.id === this.controlData.patternid)
290
- if (idPattern.length === 0 || (this.controlData && this.showCondition)) {
291
- this.handleTentivePatternData()
292
- } else {
293
- this.handlePatternData()
294
- }
295
- this.handleBarrierHeight()
296
- }
297
- if ((val && val.curTime) || val.curTime === 0) {
298
- this.curtime = val.curTime
299
- if (val.control === 4 || val.control === 16 || val.control === 22) {
300
- this.isControl = false
301
- } else {
302
- this.isControl = true
303
- }
304
- }
305
- },
306
- // 深度观察监听
307
- deep: true
308
- },
309
- cycleChange: {
310
- handler: function (val, oldVal) {
311
- this.getStage()
312
- this.handleCurrentChange(this.patternStatusList)
313
- this.handleBarrierHeight()
314
- },
315
- // 深度观察监听
316
- deep: true
317
- },
318
- phaseList: {
319
- handler: function (val, oldVal) {
320
- this.getPedPhasePos()
321
- this.getBusPos()
322
- this.getStage()
323
- // this.handlePatternData()
324
- },
325
- // 深度观察监听
326
- deep: true
327
- },
328
- agentId: {
329
- handler: function (val, oldVal) {
330
- this.getBusPos()
331
- },
332
- // 深度观察监听
333
- deep: true
334
- },
335
- patternId: {
336
- handler: function (val, oldVal) {
337
- this.patternIds = this.patternId
338
- },
339
- // 深度观察监听
340
- deep: true
341
- },
342
- cycles: {
343
- handler: function (val, oldVal) {
344
- this.newCycle = this.cycles
345
- },
346
- // 深度观察监听
347
- deep: true
348
- },
349
- contrloType: {
350
- handler: function (val, oldVal) {
351
- if (this.contrloType === 'stage') {
352
- this.getStage()
353
- }
354
- },
355
- // 深度观察监听
356
- deep: true
357
- },
358
- stagesChange: {
359
- handler: function (val, oldVal) {
360
- if (this.contrloType === 'stage') {
361
- this.getStage()
362
- }
363
- },
364
- // 深度观察监听
365
- deep: true
366
- },
367
- patternStatusList: {
368
- handler: function (val, oldVal) {
369
- this.handleBarrierHeight() // 计算屏障高度
370
- if (this.patternStatusList && this.newCycle) {
371
- // setTimeout(() => {
372
- this.handleCurrentChange(this.patternStatusList)
373
- this.handleBarrierHeight()
374
- // }, 10)
375
- // this.handleBarrierHeight()
376
- }
377
- },
378
- // 深度观察监听
379
- deep: true
380
- }
381
- },
382
- created () {
383
- this.globalParamModel = this.$store.getters.globalParamModel
384
- if (this.patternStatusList && this.newCycle && !this.controlData) {
385
- setTimeout(() => {
386
- this.handleCurrentChange(this.patternStatusList)
387
- this.handleBarrierHeight()
388
- }, 400)
389
- } else if ((this.controlData && this.controlData.patternid === 109) || (this.controlData && this.showCondition) || (this.controlData && this.localPatternList.length === 0)) {
390
- this.handleTentivePatternData()
391
- } else {
392
- this.handlePatternData()
393
- }
394
- this.PhaseDataModel = new PhaseDataModel()
395
- this.CrossDiagramMgr = new CrossDiagramMgr()
396
- this.getPedPhasePos()
397
- this.getBusPos()
398
- if (this.contrloType === 'stage') {
399
- this.getStage()
400
- }
401
- },
402
- methods: {
403
- move (e) {
404
- // 这里的e表示即将停靠的元素。
405
- let result = this.barrierArr.filter(item => item.includes(e.relatedContext.element.id))[0]
406
- if (!result.includes(e.draggedContext.element.id)) {
407
- return false
408
- }
409
- },
410
- endDrag (index) {
411
- // 拖动后对原数据排序
412
- const idIndexMap = {}
413
- this.patternInfo.forEach((subArray, subArrayIndex) => {
414
- subArray.forEach((item, index) => {
415
- idIndexMap[item.id] = { subArrayIndex, index }
416
- })
417
- })
418
- this.patternStatusList.forEach((subArray, subArrayIndex) => {
419
- if (subArray.length > 0) {
420
- subArray.sort((aItem, bItem) => {
421
- const aIndex = idIndexMap[aItem.id] ? idIndexMap[aItem.id].index : Infinity
422
- const bIndex = idIndexMap[bItem.id] ? idIndexMap[bItem.id].index : Infinity
423
- return aIndex - bIndex
424
- })
425
- }
426
- })
427
- },
428
- focusInput (id) {
429
- if (!this.isMove) {
430
- this.$refs['inputNumbers' + id][0].focus()
431
- }
432
- },
433
- handleEdit (val) {
434
- this.patternStatusList.map(d => {
435
- d.map(r => {
436
- if (r.id === val.id) {
437
- r.value = val.split
438
- }
439
- })
440
- })
441
- // this.handleCurrentChange(this.patternStatusList)
442
- this.$emit('handleSplitMove', this.patternId)
443
- },
444
- getMaxCycle (pattern) {
445
- // let rings = pattern.rings
446
- let maxCycle = 0
447
- for (let ring of pattern) {
448
- if (ring.length === 0) continue
449
- let cycle = 0
450
- for (let r of ring) {
451
- if (r.mode === 7) { // 忽略相位不计周期
452
- continue
453
- }
454
- cycle = cycle + r.value
455
- }
456
- if (cycle > maxCycle) {
457
- maxCycle = cycle
458
- }
459
- }
460
- return maxCycle
461
- },
462
- getPed (data) {
463
- let ped = []
464
- for (let stg of data) {
465
- let peddirections = []
466
- let currPhase = this.phaseList.filter((item) => {
467
- return item.id === stg
468
- })[0]
469
- if (!currPhase) return
470
- if (!currPhase.peddirection) return
471
- for (let walk of this.sidewalkPhaseData) {
472
- for (let ped of currPhase.peddirection) {
473
- if (stg === walk.phaseid) {
474
- let obj = {}
475
- obj.name = walk.name
476
- obj.id = walk.id
477
- if (ped === walk.id) {
478
- peddirections.push(obj)
479
- peddirections = Array.from(new Set(peddirections))
480
- }
481
- }
482
- }
483
- }
484
- ped.push(...peddirections)
485
- }
486
- return ped
487
- },
488
- handleStageData (data) {
489
- if (!data) return
490
- let peddirections = this.getPed(data)
491
- let stagesTemp = []
492
- let tempList = []
493
- for (let stg of data) {
494
- let directionList = []
495
- let currPhase = this.phaseList.filter((item) => {
496
- return item.id === stg
497
- })[0]
498
- if (currPhase !== undefined) {
499
- directionList.push(...currPhase.direction)
500
- directionList = Array.from(new Set(directionList))
501
- }
502
- if (directionList.length === 0) {
503
- tempList.push({
504
- id: '',
505
- color: '#454545',
506
- peddirection: peddirections
507
- })
508
- } else {
509
- tempList = directionList.map(dir => ({
510
- id: dir,
511
- color: '#454545',
512
- peddirection: peddirections
513
- }))
514
- }
515
- let newTemp = tempList.filter(item => item.id !== '')
516
- stagesTemp.push(...newTemp)
517
- }
518
- return stagesTemp
519
- },
520
- getIndexStage () {
521
- if (this.localPatternList.length === 0) return
522
- for (let i = 0; i < this.localPatternList.length; i++) {
523
- if (this.controlData.patternid === this.localPatternList[i].id) {
524
- if (!this.localPatternList[i].stagesList) return
525
- let stageCycleList = this.localPatternList[i].stagesList.map(item => {
526
- return item.stageSplit ? item.stageSplit : 0
527
- })
528
- let stageMaxCyle = stageCycleList.reduce((a, b) => {
529
- return a + b
530
- }, 0)
531
- this.stageCycle = stageMaxCyle
532
- this.stageLists = this.localPatternList[i].stagesList.map(item => {
533
- return {
534
- ...item,
535
- // peddirection: this.getPed(item.phases ? item.phases : item.stages),
536
- direction: this.handleStageData(item.phases ? item.phases : item.stages),
537
- greenWidth: ((item.stageSplit - item.yellow - item.red) / stageMaxCyle * 100).toFixed(3) + '%',
538
- yellowWidth: (item.yellow / stageMaxCyle * 100).toFixed(3) + '%',
539
- redWidth: (item.red / stageMaxCyle * 100).toFixed(3) + '%'
540
- }
541
- })
542
- }
543
- }
544
- },
545
- getStage () {
546
- if (!this.stagesChange) return
547
- const globalParamModel = this.$store.getters.globalParamModel
548
- let pattern = this.allPatternList ? this.allPatternList : globalParamModel.getParamsByType('patternList')
549
- let mapAdd = pattern.map(item => item.stagesList).map(item => {
550
- return item.map(val => {
551
- return val.stageSplit ? val.stageSplit : val.split
552
- })
553
- })
554
- let maxCycle = mapAdd.length > 0 ? mapAdd.map(item => {
555
- return item.length > 0 ? item.reduce((a, b) => {
556
- return a + b
557
- }) : 0
558
- }) : 0
559
- let stageMaxCyle = Math.max(...maxCycle)// 每个环的周期最大值
560
- if (!this.cycleChange) {
561
- let stageCycleList = this.stagesChange.map(item => {
562
- return item.stageSplit ? item.stageSplit : 0
563
- })
564
- stageMaxCyle = stageCycleList.reduce((a, b) => {
565
- return a + b
566
- }, 0)
567
- }
568
- this.stageLists = this.stagesChange.map(item => {
569
- return {
570
- ...item,
571
- // peddirection: this.getPed(item.phases ? item.phases : item.stages),
572
- direction: this.handleStageData(item.phases ? item.phases : item.stages),
573
- greenWidth: ((item.stageSplit - item.yellow - item.red) / stageMaxCyle * 100).toFixed(3) + '%',
574
- yellowWidth: (item.yellow / stageMaxCyle * 100).toFixed(3) + '%',
575
- redWidth: (item.red / stageMaxCyle * 100).toFixed(3) + '%'
576
- }
577
- })
578
- },
579
- getBusPos () {
580
- // 公交相位信息
581
- this.busPhaseData = []
582
- this.phaseList.forEach((ele, i) => {
583
- // if (ele.controltype >= 3 && ele.controltype <= 5) {
584
- // ele.direction.forEach((dir, index) => {
585
- // 车道相位
586
- this.busPhaseData.push({
587
- phaseid: ele.id, // 相位did,用于对应相位状态
588
- // id: dir, // 接口返回的dir字段,对应前端定义的相位方向id,唯一标识
589
- // name: this.PhaseDataModel.getBusPhasePos(dir).name,
590
- controltype: ele.controltype
591
- })
592
- // })
593
- // }
594
- })
595
- let result = []
596
- let obj = {}
597
- for (var i = 0; i < this.busPhaseData.length; i++) {
598
- if (!obj[this.busPhaseData[i].phaseid]) {
599
- result.push(this.busPhaseData[i])
600
- obj[this.busPhaseData[i].phaseid] = true
601
- }
602
- }
603
- this.busPhaseData = result
604
- },
605
- getPedPhasePos () {
606
- // 行人相位信息
607
- this.sidewalkPhaseData = []
608
- this.phaseList.forEach((ele, i) => {
609
- if (ele.peddirection) {
610
- ele.peddirection.forEach((dir, index) => {
611
- // 行人相位
612
- if (this.PhaseDataModel.getSidePos(dir)) {
613
- this.sidewalkPhaseData.push({
614
- key: this.CrossDiagramMgr.getUniqueKey('pedphase'),
615
- phaseid: ele.id, // 相位id,用于对应相位状态
616
- id: dir,
617
- name: this.PhaseDataModel.getSidePos(dir).name
618
- })
619
- }
620
- })
621
- }
622
- })
623
- },
624
- handleTentivePatternData () {
625
- if (!this.controlData) return
626
- this.newList = []
627
- if (Object.keys(this.controlData).length === 0 || this.phaseList.length === 0) return
628
- if (!this.controlData.phase) return
629
- // let cycle = this.controlData.cycle
630
- if (!this.controlData.rings) return
631
- let newValue = []
632
- for (let rings of this.controlData.rings) {
633
- let phase = this.controlData.phase
634
- // let list = []
635
- let obj = {}
636
- for (let key in rings.sequence) {
637
- obj[key] = rings.sequence[key]
638
- }
639
- let newObj = Object.keys(obj).map(val => ({
640
- id: obj[val]
641
- }))
642
- newValue.push(newObj)
643
- for (let sequ of rings.sequence) {
644
- let obj = {}
645
- obj.id = sequ
646
- let split = phase.filter((item) => {
647
- return item.id === sequ
648
- })[0].split
649
- let mode = phase.filter((item) => {
650
- return item.id === sequ
651
- })[0].mode
652
- newValue.map(d => {
653
- d.map(r => {
654
- if (r.id === sequ) {
655
- r.value = split
656
- if (mode === 1) {
657
- r.mode = 8
658
- } else if (mode === 2) {
659
- r.mode = 7
660
- } else if (mode === 3) {
661
- r.mode = 9
662
- } else {
663
- r.mode = 2
664
- }
665
- }
666
- })
667
- })
668
- }
669
- }
670
- this.handleTentative(newValue)
671
- },
672
- handleTentative (val) {
673
- if (val === null || val.length === 0) return
674
- // 周期以实际的绿信比来计算
675
- let valSplit = val.map(item => {
676
- return item.map(val => {
677
- return val.value + (val.sum ? val.sum : 0)
678
- })
679
- })
680
- let splitCycle = valSplit.length > 0 ? valSplit.map(item => {
681
- return item.length > 0 ? item.reduce((a, b) => {
682
- return a + b
683
- }) : 0
684
- }) : 0
685
- let cycle = Math.max(...splitCycle)// 每个环的周期最大值
686
- this.contrloCycle = cycle
687
- // 按环序分组
688
- let ringlength = []
689
- let ringsequence = val.map(item => {
690
- if (item.length === 0) return
691
- ringlength.push(item.length)
692
- return item.map(k => {
693
- return k.id
694
- })
695
- })
696
- let newRings = ringsequence.filter(item => item)
697
- let minLength = Math.min(...ringlength)
698
- let resultArrs = [] // 环1分组
699
- let resultArr = [] // 环2分组
700
- for (let j = 0; j < ringsequence[0].length; j += minLength) {
701
- resultArrs.push(ringsequence[0].slice(j, j + minLength))
702
- if (ringsequence[0].length === minLength) {
703
- resultArrs.push([])
704
- }
705
- }
706
- if (newRings.length > 1) {
707
- for (let i = 0; i < ringsequence[1].length; i += minLength) {
708
- resultArr.push(ringsequence[1].slice(i, i + minLength))
709
- }
710
- }
711
- this.patternInfo = []
712
- let currentArr = []
713
- let newPattern = []
714
- val.map(i => {
715
- newPattern.push(...i)
716
- })
717
- if (this.phaseList.length === 0) return
718
- for (let patternStatus of val[0]) {
719
- // if (patternStatus.mode !== 7) {
720
- let concurrent = this.phaseList.filter((item) => {
721
- return item.id === patternStatus.id // patternStatus.id当前相位id concurrent当前相位的并发相位
722
- })[0].concurrent// 当前相位的并发相位
723
- if (concurrent) {
724
- let obj = {
725
- id: patternStatus.id,
726
- current: concurrent.sort()
727
- }
728
- currentArr.push(obj)
729
- }
730
- // }
731
- }
732
- if (currentArr.length !== 0) {
733
- let newCurrent = this.tranform(currentArr)
734
- // 取没个环与环关系的并集
735
- let barrierRing1 = []
736
- let barrierRing2 = []
737
- let ring1 = [] // 环1与关系1的并集
738
- for (let h = 0; h < newCurrent.length; h++) {
739
- let adds = [...new Set(resultArrs[0])].filter(item => newCurrent[h].includes(item))
740
- ring1.push(adds)
741
- }
742
- let ring1s = [] // 环1与关系2的并集
743
- for (let h = 0; h < newCurrent.length; h++) {
744
- let addRing1 = [...new Set(resultArrs[1])].filter(item => newCurrent[h].includes(item))
745
- ring1s.push(addRing1)
746
- }
747
- barrierRing1.push(...ring1, ...ring1s)
748
- let resultList = []
749
- if (newRings.length > 1) {
750
- let ring2s = [] // 环2与关系1的并集
751
- for (let h = 0; h < newCurrent.length; h++) {
752
- let addRing2 = [...new Set(resultArr[1])].filter(item => newCurrent[h].includes(item))
753
- ring2s.push(addRing2)
754
- }
755
- let ring2 = [] // 环2与关系1的并集
756
- for (let h = 0; h < newCurrent.length; h++) {
757
- let add = [...new Set(resultArr[0])].filter(item => newCurrent[h].includes(item))
758
- ring2.push(add)
759
- }
760
- barrierRing2.push(...ring2, ...ring2s)
761
- for (let k = 0; k < barrierRing1.length; k++) {
762
- resultList.push(barrierRing1[k].concat(barrierRing2[k]))
763
- }
764
- }
765
- let resultLists = resultList.filter(item => item.length !== 0)
766
- let ringArr = []
767
- for (let l = 0; l < resultLists.length; l++) {
768
- for (let d = 0; d < newCurrent.length; d++) {
769
- if (newCurrent[d].filter(item => resultLists[l].includes(item)).length > 0) {
770
- ringArr.push({
771
- data: resultLists[l],
772
- id: d + 1,
773
- index: l
774
- })
775
- }
776
- }
777
- }
778
- // let ringObj = {}
779
- // ringArr.forEach(item => {
780
- // ringObj[item.index] = {
781
- // id: item.id,
782
- // index: item.index
783
- // }
784
- // })
785
- for (var i = 0; i < ringArr.length; i++) {
786
- for (var j = i + 1; j < ringArr.length; j++) {
787
- if (ringArr[i].id === ringArr[j].id && ringArr[i].index + 1 === ringArr[j].index) {
788
- ringArr[i].data = ringArr[i].data.concat(ringArr[j].data)
789
- ringArr.splice(ringArr.indexOf(ringArr[j].id), 1)
790
- }
791
- }
792
- }
793
- let resArr = ringArr.map(item => item.data)
794
- // this.barrierArr = resArr
795
- let ringTeam = this.step1(this.phaseList, resArr)
796
- let ringTeams = ringTeam.filter(item => item.length !== 0)
797
- this.setBarriers(ringTeams, val)
798
- this.fillGap(ringTeam, val)
799
- let newPattern = []
800
- val.map(i => {
801
- newPattern.push(...i)
802
- })
803
- let barrier = this.step2(ringTeams, newPattern)
804
- let barrierLeft = barrier.map(item => item)
805
- this.barrierList = barrierLeft.map(j => {
806
- return ((j / cycle) * 100) + '%'
807
- })
808
- }
809
- // let cycle = this.controlData.cycle
810
- for (let rings of val) {
811
- if (rings.length === 0) continue
812
- let list = []
813
- for (let ring of rings) {
814
- if (ring.value === 0) continue
815
- let obj = {}
816
- let split = ring.value
817
- obj.id = ring.id
818
- // obj.split = split
819
- let currPhase = this.phaseList.filter((item) => {
820
- if (item.id === ring.id && item.controltype === 99) {
821
- obj.controltype = item.controltype
822
- }
823
- return item.id === ring.id
824
- })[0]
825
- if (!currPhase) return
826
- let peddirections = []
827
- for (let walk of this.sidewalkPhaseData) {
828
- if (currPhase.peddirection) {
829
- for (let ped of currPhase.peddirection) {
830
- // if (stg === walk.phaseid) {
831
- let objs = {}
832
- objs.name = walk.name
833
- objs.color = 'rgba(48,49,51,0.6)'
834
- objs.id = walk.id
835
- if (ped === walk.id) {
836
- peddirections.push(objs)
837
- peddirections = Array.from(new Set(peddirections))
838
- }
839
- // }
840
- }
841
- } else {
842
- peddirections = []
843
- }
844
- }
845
- if (ring.desc && ring.desc.length > 0) {
846
- obj.direction = ring.desc.map(item => { // 虚相位desc为空
847
- return {
848
- id: item.id,
849
- color: '#303133'
850
- }
851
- })
852
- } else {
853
- if (currPhase.direction && currPhase.direction.length > 0) {
854
- obj.direction = currPhase.direction.map(item => {
855
- return {
856
- id: item,
857
- peddirection: peddirections,
858
- color: '#303133'
859
- }
860
- })
861
- } else {
862
- obj.direction = [
863
- {
864
- id: '',
865
- color: '#303133',
866
- peddirection: peddirections
867
- }
868
- ]
869
- }
870
- }
871
- obj.split = split
872
- obj.cycle = cycle
873
- if (ring.sum) {
874
- obj.sum = ring.sum
875
- obj.redWidth = ((currPhase.redclear + ring.sum) / (this.max ? this.max : cycle) * 100) + '%'
876
- } else {
877
- obj.redWidth = (currPhase.redclear / (this.max ? this.max : cycle) * 100) + '%'
878
- }
879
- obj.flashgreen = (currPhase.flashgreen / (this.max ? this.max : cycle) * 100) + '%'
880
- obj.yellowWidth = (currPhase.yellow / (this.max ? this.max : cycle) * 100) + '%'
881
- obj.greenWidth = ((split - currPhase.redclear - currPhase.yellow - currPhase.flashgreen) / (this.max ? this.max : cycle) * 100) + '%'
882
- // 忽略相位不显示
883
- // let mode = ring.mode
884
- // if (mode !== 7) { // 忽略相位不显示
885
- list.push(obj)
886
- // }
887
- }
888
- this.patternInfo.push(list)
889
- }
890
- },
891
- handlePatternData () {
892
- if (!this.controlData) return
893
- // this.newList = []
894
- if (Object.keys(this.controlData).length === 0 || this.phaseList.length === 0) return
895
- if (!this.controlData.phase) return
896
- if (!this.controlData.rings) return
897
- let nowPattern = this.localPatternList.filter(item => {
898
- return item.id === this.controlData.patternid
899
- })[0].rings
900
- // 信号机忽略相位,更新最新的相位信息
901
- let filterPattern = []
902
- for (let i of nowPattern) {
903
- for (let j of this.controlData.rings) {
904
- let filterSequence = i.filter(item => j.sequence.includes(item.id))
905
- if (filterSequence.length > 0) {
906
- filterPattern.push(filterSequence)
907
- }
908
- }
909
- }
910
- for (let rings of this.controlData.rings) {
911
- for (let sequ of rings.sequence) {
912
- let split = this.controlData.phase.filter((item) => {
913
- return item.id === sequ
914
- })[0].split
915
- filterPattern.map(d => {
916
- return d.map(r => {
917
- if (r.id === sequ) {
918
- r.value = split
919
- }
920
- })
921
- })
922
- }
923
- }
924
- this.handleOverViewChange(filterPattern)
925
- },
926
- handleBarrierHeight () { // 屏障高度
927
- if (!this.patternInfo) return
928
- let patternLength = this.patternInfo.length
929
- this.barrierHeight = (patternLength * 35 + 21) + 'px'
930
- },
931
- handleOverViewChange (val) {
932
- if (val === null || val.length === 0) return
933
- // 周期以实际的绿信比来计算
934
- let valSplit = val.map(item => {
935
- return item.map(val => {
936
- return val.value + (val.sum ? val.sum : 0)
937
- })
938
- })
939
- let splitCycle = valSplit.length > 0 ? valSplit.map(item => {
940
- return item.length > 0 ? item.reduce((a, b) => {
941
- return a + b
942
- }) : 0
943
- }) : 0
944
- let cycle = Math.max(...splitCycle)// 每个环的周期最大值
945
- this.contrloCycle = cycle
946
- // 按环序分组
947
- let ringlength = []
948
- let ringsequence = val.map(item => {
949
- if (item.length === 0) return
950
- ringlength.push(item.length)
951
- return item.map(k => {
952
- return k.id
953
- })
954
- })
955
- let newRings = ringsequence.filter(item => item)
956
- let minLength = Math.min(...ringlength)
957
- let resultArrs = [] // 环1分组
958
- let resultArr = [] // 环2分组
959
- for (let j = 0; j < ringsequence[0].length; j += minLength) {
960
- resultArrs.push(ringsequence[0].slice(j, j + minLength))
961
- if (ringsequence[0].length === minLength) {
962
- resultArrs.push([])
963
- }
964
- }
965
- if (newRings.length > 1) {
966
- for (let i = 0; i < ringsequence[1].length; i += minLength) {
967
- resultArr.push(ringsequence[1].slice(i, i + minLength))
968
- }
969
- }
970
- this.patternInfo = []
971
- let currentArr = []
972
- let newPattern = []
973
- val.map(i => {
974
- newPattern.push(...i)
975
- })
976
- if (this.phaseList.length === 0) return
977
- for (let patternStatus of val[0]) {
978
- // if (patternStatus.mode !== 7) {
979
- let concurrent = this.phaseList.filter((item) => {
980
- return item.id === patternStatus.id // patternStatus.id当前相位id concurrent当前相位的并发相位
981
- })[0].concurrent// 当前相位的并发相位
982
- if (concurrent) {
983
- let obj = {
984
- id: patternStatus.id,
985
- current: concurrent.sort()
986
- }
987
- currentArr.push(obj)
988
- }
989
- // }
990
- }
991
- if (currentArr.length !== 0) {
992
- let newCurrent = this.tranform(currentArr)
993
- // 取没个环与环关系的并集
994
- let barrierRing1 = []
995
- let barrierRing2 = []
996
- let ring1 = [] // 环1与关系1的并集
997
- for (let h = 0; h < newCurrent.length; h++) {
998
- let adds = [...new Set(resultArrs[0])].filter(item => newCurrent[h].includes(item))
999
- ring1.push(adds)
1000
- }
1001
- let ring1s = [] // 环1与关系2的并集
1002
- for (let h = 0; h < newCurrent.length; h++) {
1003
- let addRing1 = [...new Set(resultArrs[1])].filter(item => newCurrent[h].includes(item))
1004
- ring1s.push(addRing1)
1005
- }
1006
- barrierRing1.push(...ring1, ...ring1s)
1007
- let resultList = []
1008
- if (newRings.length > 1) {
1009
- let ring2s = [] // 环2与关系1的并集
1010
- for (let h = 0; h < newCurrent.length; h++) {
1011
- let addRing2 = [...new Set(resultArr[1])].filter(item => newCurrent[h].includes(item))
1012
- ring2s.push(addRing2)
1013
- }
1014
- let ring2 = [] // 环2与关系1的并集
1015
- for (let h = 0; h < newCurrent.length; h++) {
1016
- let add = [...new Set(resultArr[0])].filter(item => newCurrent[h].includes(item))
1017
- ring2.push(add)
1018
- }
1019
- barrierRing2.push(...ring2, ...ring2s)
1020
- for (let k = 0; k < barrierRing1.length; k++) {
1021
- resultList.push(barrierRing1[k].concat(barrierRing2[k]))
1022
- }
1023
- }
1024
- let resultLists = resultList.filter(item => item.length !== 0)
1025
- let ringArr = []
1026
- for (let l = 0; l < resultLists.length; l++) {
1027
- for (let d = 0; d < newCurrent.length; d++) {
1028
- if (newCurrent[d].filter(item => resultLists[l].includes(item)).length > 0) {
1029
- ringArr.push({
1030
- data: resultLists[l],
1031
- id: d + 1,
1032
- index: l
1033
- })
1034
- }
1035
- }
1036
- }
1037
- for (var i = 0; i < ringArr.length; i++) {
1038
- for (var j = i + 1; j < ringArr.length; j++) {
1039
- if (ringArr[i].id === ringArr[j].id && ringArr[i].index + 1 === ringArr[j].index) {
1040
- ringArr[i].data = ringArr[i].data.concat(ringArr[j].data)
1041
- ringArr.splice(ringArr.indexOf(ringArr[j].id), 1)
1042
- }
1043
- }
1044
- }
1045
- let resArr = ringArr.map(item => item.data)
1046
- let ringTeam = this.step1(this.phaseList, resArr)
1047
- let ringTeams = ringTeam.filter(item => item.length !== 0)
1048
- this.fillGap(ringTeams, val)
1049
- // 总览添加屏障
1050
- let newPattern = []
1051
- val.map(i => {
1052
- newPattern.push(...i)
1053
- })
1054
- let barrier = this.step2(ringTeams, newPattern)
1055
- let barrierLeft = barrier.map(item => item)
1056
- this.barrierList = barrierLeft.map(j => {
1057
- return (j / (this.max ? this.max : this.contrloCycle) * 100) + '%'
1058
- })
1059
- }
1060
- // let cycle = this.controlData.cycle
1061
- for (let rings of val) {
1062
- if (rings.length === 0) continue
1063
- let list = []
1064
- for (let ring of rings) {
1065
- if (ring.value === 0) continue
1066
- let obj = {}
1067
- let split = ring.value
1068
- obj.id = ring.id
1069
- obj.mode = ring.mode
1070
- // obj.split = split
1071
- let currPhase = this.phaseList.filter((item) => {
1072
- if (item.id === ring.id && item.controltype === 99) {
1073
- obj.controltype = item.controltype
1074
- }
1075
- return item.id === ring.id
1076
- })[0]
1077
- if (!currPhase) return
1078
- let peddirections = []
1079
- for (let walk of this.sidewalkPhaseData) {
1080
- if (currPhase.peddirection) {
1081
- for (let ped of currPhase.peddirection) {
1082
- // if (stg === walk.phaseid) {
1083
- let objs = {}
1084
- objs.name = walk.name
1085
- objs.id = walk.id
1086
- objs.color = 'rgba(48,49,51,0.6)'
1087
- if (ped === walk.id) {
1088
- peddirections.push(objs)
1089
- peddirections = Array.from(new Set(peddirections))
1090
- }
1091
- // }
1092
- }
1093
- } else {
1094
- peddirections = []
1095
- }
1096
- }
1097
- if (ring.desc && ring.desc.length > 0) {
1098
- obj.direction = ring.desc.map(item => { // 虚相位desc为空
1099
- return {
1100
- id: item.id,
1101
- color: '#303133'
1102
- }
1103
- })
1104
- } else {
1105
- if (currPhase.direction && currPhase.direction.length > 0) {
1106
- obj.direction = currPhase.direction.map(item => {
1107
- return {
1108
- id: item,
1109
- peddirection: peddirections,
1110
- color: '#303133'
1111
- }
1112
- })
1113
- } else {
1114
- obj.direction = [
1115
- {
1116
- id: '',
1117
- color: '#303133',
1118
- peddirection: peddirections
1119
- }
1120
- ]
1121
- }
1122
- }
1123
- obj.split = split
1124
- obj.cycle = cycle
1125
- if (ring.sum) {
1126
- obj.sum = ring.sum
1127
- obj.redWidth = ((currPhase.redclear + ring.sum) / (this.max ? this.max : cycle) * 100) + '%'
1128
- } else {
1129
- obj.redWidth = (currPhase.redclear / (this.max ? this.max : cycle) * 100) + '%'
1130
- }
1131
- obj.flashgreen = (currPhase.flashgreen / (this.max ? this.max : cycle) * 100) + '%'
1132
- obj.yellowWidth = (currPhase.yellow / (this.max ? this.max : cycle) * 100) + '%'
1133
- obj.greenWidth = ((split - currPhase.redclear - currPhase.yellow - currPhase.flashgreen) / (this.max ? this.max : cycle) * 100) + '%'
1134
- // 忽略相位不显示
1135
- // let mode = ring.mode
1136
- // if (mode !== 7) { // 忽略相位不显示
1137
- list.push(obj)
1138
- // }
1139
- }
1140
- this.patternInfo.push(list)
1141
- }
1142
- },
1143
- handleCurrentChange (val) { // 两个ring的数据
1144
- this.patternInfo = []
1145
- if (val === null || val.length === 0) return
1146
- if (this.controlPhase && this.controlPhase.phase && this.controlPhase.phase[0].split) {
1147
- val.map(i => {
1148
- i.map(j => {
1149
- j.value = this.controlPhase.phase.filter(item => item.id === j.id)[0].split
1150
- })
1151
- })
1152
- let valSplit = val.map(item => {
1153
- return item.map(val => {
1154
- return val.value + (val.sum ? val.sum : 0)
1155
- })
1156
- })
1157
- let splitCycle = valSplit.length > 0 ? valSplit.map(item => {
1158
- return item.length > 0 ? item.reduce((a, b) => {
1159
- return a + b
1160
- }) : 0
1161
- }) : 0
1162
- this.fixCycle = Math.max(...splitCycle)// 每个环的周期最大值
1163
- }
1164
- // 按环序分组
1165
- let ringlength = []
1166
- let ringsequence = val.map(item => {
1167
- if (item.length === 0) return
1168
- ringlength.push(item.length)
1169
- return item.map(k => {
1170
- return k.id
1171
- })
1172
- })
1173
- let valSplit = val.map(item => {
1174
- return item.map(val => {
1175
- return val.value + (val.sum ? val.sum : 0)
1176
- })
1177
- })
1178
- let splitCycle = valSplit.length > 0 ? valSplit.map(item => {
1179
- return item.length > 0 ? item.reduce((a, b) => {
1180
- return a + b
1181
- }) : 0
1182
- }) : 0
1183
- let cycle = Math.max(...splitCycle)// 每个环的周期最大值
1184
- let newRings = ringsequence.filter(item => item)
1185
- let minLength = Math.min(...ringlength)
1186
- let resultArrs = [] // 环1分组
1187
- let resultArr = [] // 环2分组
1188
- for (let j = 0; j < ringsequence[0].length; j += minLength) {
1189
- resultArrs.push(ringsequence[0].slice(j, j + minLength))
1190
- if (ringsequence[0].length === minLength) {
1191
- resultArrs.push([])
1192
- }
1193
- }
1194
- if (newRings.length > 1) {
1195
- for (let i = 0; i < ringsequence[1].length; i += minLength) {
1196
- resultArr.push(ringsequence[1].slice(i, i + minLength))
1197
- }
1198
- }
1199
- this.patternInfo = []
1200
- this.barrierList = []
1201
- let currentArr = []
1202
- let newPattern = []
1203
- val.map(i => {
1204
- newPattern.push(...i)
1205
- })
1206
- if (this.phaseList.length === 0) return
1207
- for (let patternStatus of val[0]) {
1208
- // if (patternStatus.mode !== 7) {
1209
- let concurrent = this.phaseList.filter((item) => {
1210
- return item.id === patternStatus.id // patternStatus.id当前相位id concurrent当前相位的并发相位
1211
- })[0].concurrent// 当前相位的并发相位
1212
- if (concurrent) {
1213
- let obj = {
1214
- id: patternStatus.id,
1215
- current: concurrent.sort()
1216
- }
1217
- currentArr.push(obj)
1218
- }
1219
- // }
1220
- }
1221
- if (currentArr.length !== 0) {
1222
- let newCurrent = this.tranform(currentArr)
1223
- // 取没个环与环关系的并集
1224
- let barrierRing1 = []
1225
- let barrierRing2 = []
1226
- let ring1 = [] // 环1与关系1的并集
1227
- for (let h = 0; h < newCurrent.length; h++) {
1228
- let adds = [...new Set(resultArrs[0])].filter(item => newCurrent[h].includes(item))
1229
- ring1.push(adds)
1230
- }
1231
- let ring1s = [] // 环1与关系2的并集
1232
- for (let h = 0; h < newCurrent.length; h++) {
1233
- let addRing1 = [...new Set(resultArrs[1])].filter(item => newCurrent[h].includes(item))
1234
- ring1s.push(addRing1)
1235
- }
1236
- barrierRing1.push(...ring1, ...ring1s)
1237
- let resultList = []
1238
- if (newRings.length >= 1) {
1239
- let ring2s = [] // 环2与关系1的并集
1240
- for (let h = 0; h < newCurrent.length; h++) {
1241
- let addRing2 = [...new Set(resultArr[1])].filter(item => newCurrent[h].includes(item))
1242
- ring2s.push(addRing2)
1243
- }
1244
- let ring2 = [] // 环2与关系1的并集
1245
- for (let h = 0; h < newCurrent.length; h++) {
1246
- let add = [...new Set(resultArr[0])].filter(item => newCurrent[h].includes(item))
1247
- ring2.push(add)
1248
- }
1249
- barrierRing2.push(...ring2, ...ring2s)
1250
- for (let k = 0; k < barrierRing1.length; k++) {
1251
- resultList.push(barrierRing1[k].concat(barrierRing2[k]))
1252
- }
1253
- }
1254
- let resultLists = resultList.filter(item => item.length !== 0)
1255
- let ringArr = []
1256
- for (let l = 0; l < resultLists.length; l++) {
1257
- for (let d = 0; d < newCurrent.length; d++) {
1258
- if (newCurrent[d].filter(item => resultLists[l].includes(item)).length > 0) {
1259
- ringArr.push({
1260
- data: resultLists[l],
1261
- id: d + 1,
1262
- index: l
1263
- })
1264
- }
1265
- }
1266
- }
1267
- for (var i = 0; i < ringArr.length; i++) {
1268
- for (var j = i + 1; j < ringArr.length; j++) {
1269
- if (ringArr[i].id === ringArr[j].id && ringArr[i].index + 1 === ringArr[j].index) {
1270
- ringArr[i].data = ringArr[i].data.concat(ringArr[j].data)
1271
- ringArr.splice(ringArr.indexOf(ringArr[j].id), 1)
1272
- }
1273
- }
1274
- }
1275
- let resArr = ringArr.map(item => item.data)
1276
- this.barrierArr = resArr
1277
- let ringTeam = this.step1(this.phaseList, resArr)
1278
- let ringTeams = ringTeam.filter(item => item.length !== 0)
1279
- if (this.patternList) {
1280
- this.setBarrier(ringTeams, val)
1281
- }
1282
- if (newRings.length > 1) {
1283
- this.fillGap(ringTeams, val)
1284
- }
1285
- if (this.cycleChange) {
1286
- const globalParamModel = this.$store.getters.globalParamModel
1287
- let pattern = globalParamModel.getParamsByType('patternList')
1288
- const allCycle = pattern.map(item => item.cycle)
1289
- let cycle = Math.max(...allCycle)
1290
- this.max = cycle
1291
- } else {
1292
- this.max = ''
1293
- }
1294
- let barrier = this.step2(ringTeams, newPattern)
1295
- let barrierLeft = barrier.map(item => item)// 屏障左移显示出人行横道
1296
- this.barrierList = barrierLeft.map(j => {
1297
- return (j / (this.max ? this.max : cycle) * 100) + '%'
1298
- })
1299
- // this.barrierList.unshift(0)
1300
- }
1301
- for (let rings of val) {
1302
- if (rings.length === 0) continue
1303
- let list = []
1304
- for (let ring of rings) {
1305
- if (ring.value === 0) continue
1306
- let obj = {}
1307
- let split = ring.value
1308
- obj.id = ring.id
1309
- // obj.split = split
1310
- let currPhase = this.phaseList.filter((item) => {
1311
- if (item.id === ring.id && item.controltype === 99) {
1312
- obj.controltype = item.controltype
1313
- }
1314
- return item.id === ring.id
1315
- })[0]
1316
- if (!currPhase) return
1317
- let peddirections = []
1318
- for (let walk of this.sidewalkPhaseData) {
1319
- if (currPhase.peddirection) {
1320
- for (let ped of currPhase.peddirection) {
1321
- // if (stg === walk.phaseid) {
1322
- let objs = {}
1323
- objs.name = walk.name
1324
- objs.id = walk.id
1325
- objs.color = 'rgba(48,49,51,0.6)'
1326
- if (ped === walk.id) {
1327
- peddirections.push(objs)
1328
- peddirections = Array.from(new Set(peddirections))
1329
- }
1330
- // }
1331
- }
1332
- } else {
1333
- peddirections = []
1334
- }
1335
- }
1336
- if (ring.desc && ring.desc.length > 0) {
1337
- obj.direction = ring.desc.map(item => { // 虚相位desc为空
1338
- return {
1339
- id: item.id,
1340
- color: '#303133',
1341
- peddirection: peddirections
1342
- }
1343
- })
1344
- } else {
1345
- if (currPhase.direction && currPhase.direction.length > 0) {
1346
- obj.direction = currPhase.direction.map(item => {
1347
- return {
1348
- id: item,
1349
- color: '#303133',
1350
- peddirection: peddirections
1351
- }
1352
- })
1353
- } else {
1354
- obj.direction = [
1355
- {
1356
- id: '',
1357
- color: '#303133',
1358
- peddirection: peddirections
1359
- }
1360
- ]
1361
- }
1362
- }
1363
- obj.split = split
1364
- obj.cycle = this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle
1365
- const isZero = split - currPhase.redclear - currPhase.yellow - currPhase.flashgreen
1366
- const allAdd = split + currPhase.redclear + currPhase.yellow + currPhase.flashgreen
1367
- if (isZero <= 0) {
1368
- if (ring.sum) {
1369
- obj.sum = ring.sum
1370
- obj.redWidth = ((((currPhase.redclear + ring.sum) / allAdd) / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle)) * 100) + '%'
1371
- } else {
1372
- obj.redWidth = (((currPhase.redclear / allAdd) / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle)) * 100) + '%'
1373
- }
1374
- obj.greenWidth = (((split - (currPhase.redclear / allAdd) - (currPhase.yellow / allAdd) - (currPhase.flashgreen / allAdd)) / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle)) * 100) + '%'
1375
- obj.yellowWidth = (((currPhase.yellow / allAdd) / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle)) * 100) + '%'
1376
- obj.flashgreen = (((currPhase.flashgreen / allAdd) / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle)) * 100) + '%'
1377
- } else {
1378
- if (ring.sum) {
1379
- obj.sum = ring.sum
1380
- obj.redWidth = ((currPhase.redclear + ring.sum) / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle) * 100) + '%'
1381
- } else {
1382
- obj.redWidth = (currPhase.redclear / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle) * 100) + '%'
1383
- }
1384
- obj.mode = ring.mode
1385
- obj.greenWidth = ((split - currPhase.redclear - currPhase.yellow - currPhase.flashgreen) / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle) * 100) + '%'
1386
- obj.flashgreen = (currPhase.flashgreen / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle) * 100) + '%'
1387
- obj.yellowWidth = (currPhase.yellow / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle) * 100) + '%'
1388
- }
1389
- // 忽略相位不显示
1390
- // let mode = ring.mode
1391
- // if (mode !== 7) { // 忽略相位不显示
1392
- list.push(obj)
1393
- // }
1394
- }
1395
- this.patternInfo.push(list)
1396
- }
1397
- },
1398
- setBarriers (ringTeam, val) { // 临时方案添加特征参数barrier
1399
- this.localPatternList.map(item => {
1400
- // if (item.id === this.patternIds) {
1401
- const patternObjs = {}
1402
- val.forEach(l => {
1403
- l.map(k => {
1404
- patternObjs[k.id] = k.value
1405
- })
1406
- })
1407
- let ret = ringTeam.map((y, index) => {
1408
- if (!y || y.length === 0) return
1409
- y.map(n => {
1410
- n.length = n.data.length > 1 ? n.data.reduce((pre, cur) => pre + patternObjs[cur], 0) : patternObjs[n.data[0]]
1411
- })
1412
- return {
1413
- barrier: index + 1,
1414
- length: y[0].length,
1415
- items: y.map(j => {
1416
- return {
1417
- ring: j.ring,
1418
- data: j.data
1419
- }
1420
- })
1421
- }
1422
- })
1423
- item.barriers = ret
1424
- // }
1425
- })
1426
- },
1427
- setBarrier (ringTeam, val) { // 添加特征参数barrier
1428
- this.patternList.map(item => {
1429
- if (item.id === this.patternIds) {
1430
- const patternObjs = {}
1431
- val.forEach(l => {
1432
- l.map(k => {
1433
- patternObjs[k.id] = k.value
1434
- })
1435
- })
1436
- let ret = ringTeam.map((y, index) => {
1437
- if (!y || y.length === 0) return
1438
- y.map(n => {
1439
- n.length = n.data.length > 1 ? n.data.reduce((pre, cur) => pre + patternObjs[cur], 0) : patternObjs[n.data[0]]
1440
- })
1441
- return {
1442
- barrier: index + 1,
1443
- length: y[0].length,
1444
- items: y.map(j => {
1445
- return {
1446
- ring: j.ring,
1447
- data: j.data
1448
- }
1449
- })
1450
- }
1451
- })
1452
- item.barriers = ret
1453
- }
1454
- })
1455
- },
1456
- tranform (arr) { // 分barrier
1457
- let newMap = new Map()
1458
- arr.forEach(({id, current}) => {
1459
- const find = newMap.get(current.join())
1460
- if (find) newMap.get(current.join()).push(id)
1461
- else newMap.set(current.join(), [id])
1462
- })
1463
- let ret = []
1464
- newMap.forEach((value, key) => {
1465
- ret.push(Array.from(new Set(key.split(',').map(Number).concat(value))))
1466
- })
1467
- const result = []
1468
- for (const a of ret) {
1469
- let merged = false
1470
- for (const r of result) {
1471
- if (this.check([...r], a)) {
1472
- a.forEach(item => r.add(item))
1473
- merged = true
1474
- }
1475
- }
1476
- if (!merged) {
1477
- result.push(new Set(a))
1478
- }
1479
- merged = false
1480
- }
1481
- return result.map(s => [...s])
1482
- },
1483
- check (arr1, arr2) {
1484
- return arr1.some(a1 => arr2.some(a2 => a1 === a2))
1485
- },
1486
- step1 (list, arr) { // 各个环包含的相位
1487
- const ret = []
1488
- const listObj = {}
1489
- list.forEach(l => {
1490
- listObj[l.id] = l.ring
1491
- })
1492
- arr.forEach(a => {
1493
- const retItem = []
1494
- a.forEach(b => {
1495
- if (listObj[b]) {
1496
- const find = retItem.find(r => r.ring === listObj[b])
1497
- if (find) find.data.push(b)
1498
- else retItem.push({ring: listObj[b], data: [b]})
1499
- }
1500
- })
1501
- ret.push(retItem)
1502
- })
1503
- return ret
1504
- },
1505
- step2 (newArr, pattern) { // 不同环并发相位做比较
1506
- let ret = []
1507
- let max = 0
1508
- const patternObj = {}
1509
- pattern.forEach(l => {
1510
- // if (l.mode !== 7) {
1511
- patternObj[l.id] = l.value
1512
- // }
1513
- })
1514
- let barrierCycle = newArr.map(item => {
1515
- return Math.max.apply(Math, item.map(k => { return k.length }))
1516
- })
1517
- barrierCycle.forEach((b, index) => {
1518
- if (index === 0) {
1519
- ret.push(barrierCycle[index])
1520
- } else {
1521
- if (max) {
1522
- max = barrierCycle[index] + max
1523
- } else {
1524
- max = barrierCycle[index] + barrierCycle[index - 1]
1525
- }
1526
- ret.push(max)
1527
- }
1528
- })
1529
- return ret
1530
- },
1531
- fillGap (newArr, pattern) {
1532
- this.newPatterns = []
1533
- const patternObj = {}
1534
- pattern.forEach(l => {
1535
- l.map(k => {
1536
- // if (k.mode !== 7) {
1537
- patternObj[k.id] = k.value
1538
- // }
1539
- })
1540
- })
1541
- let newMax = []
1542
- let newMin = []
1543
- newArr.forEach((na, index) => {
1544
- if (!na || na.length === 0) return
1545
- na.map(n => {
1546
- n.length = n.data.length > 1 ? n.data.reduce((pre, cur) => pre + patternObj[cur], 0) : patternObj[n.data[0]]
1547
- })
1548
- let maxNum = Math.max.apply(Math, na.map(item => { return item.length }))
1549
- let minNum = Math.min.apply(Math, na.map(item => { return item.length }))
1550
- newMax.push(maxNum)
1551
- newMin.push(minNum)
1552
- let newmaxNum = Math.max.apply(Math, newMax)// 每组最大值
1553
- let newminNum = Math.min.apply(Math, newMin)
1554
- if (newArr.length > 1) {
1555
- this.newCycle = newmaxNum + newminNum
1556
- }
1557
- if (newmaxNum === newminNum) {
1558
- this.max = newmaxNum + newminNum
1559
- pattern.map(d => {
1560
- d.map(r => {
1561
- if (r.sum) {
1562
- delete r.sum
1563
- }
1564
- })
1565
- })
1566
- }
1567
- if (maxNum === minNum) {
1568
- na.map(n => {
1569
- pattern.map(h => {
1570
- h.map(d => {
1571
- if (d.id === n.data[1] && d.sum) {
1572
- delete d.sum
1573
- }
1574
- })
1575
- })
1576
- })
1577
- } else {
1578
- na.map(n => {
1579
- if (n.length === maxNum) {
1580
- pattern.map(h => {
1581
- h.map(d => {
1582
- if (n.data.length > 1) {
1583
- if (d.id === n.data[1]) {
1584
- delete d.sum
1585
- }
1586
- } else {
1587
- if (d.id === n.data[0]) {
1588
- delete d.sum
1589
- }
1590
- }
1591
- })
1592
- })
1593
- }
1594
- })
1595
- }
1596
- na.forEach((value, index, array) => {
1597
- if (value.length !== maxNum) {
1598
- let newNa = []
1599
- newNa.push(value)
1600
- newNa.forEach(m => {
1601
- let sum = Number(maxNum - m.length)
1602
- pattern.filter((i) => {
1603
- i.map(j => {
1604
- if (m.data.length > 1) {
1605
- if (j.id === m.data[1]) {
1606
- j.sum = sum
1607
- }
1608
- } else {
1609
- if (j.id === m.data[0]) {
1610
- j.sum = sum
1611
- }
1612
- }
1613
- })
1614
- })
1615
- })
1616
- }
1617
- let mapAdd = pattern.map(item => {
1618
- return item.map(val => {
1619
- return val.value + (val.sum ? val.sum : 0)
1620
- })
1621
- })
1622
- let maxCycle = mapAdd.length > 0 ? mapAdd.map(item => {
1623
- return item.length > 0 ? item.reduce((a, b) => {
1624
- return a + b
1625
- }) : 0
1626
- }) : 0
1627
- this.max = Math.max(...maxCycle)// 每个环的周期最大值
1628
- })
1629
- })
1630
- }
1631
- }
1632
- }
1633
- </script>
1634
- <style lang="scss">
1635
- // el-tooltip样式
1636
- .el-tooltip__popper.is-light {
1637
- background: #299BCC !important;
1638
- border: 1px solid #299BCC !important;
1639
- color: #FFFFFF !important;
1640
- }
1641
- .el-tooltip__popper.is-light[x-placement^="top"] .popper__arrow {
1642
- border-top-color: #299BCC !important;
1643
- }
1644
- .el-tooltip__popper.is-light[x-placement^="top"] .popper__arrow::after {
1645
- border-top-color: #299BCC !important;
1646
- }
1647
- </style>
1648
- <style lang="scss" scoped>
1649
- .main-patternstatus {
1650
- position: relative;
1651
- /* margin-bottom: 20px; */
1652
- }
1653
- .main-patternstatus {
1654
- position: relative;
1655
- .ring-first {
1656
- margin-top: 1px;
1657
- width: 100%;
1658
- height: 35px;
1659
- .hovercell {
1660
- box-sizing: border-box;
1661
- border: 1PX solid transparent;
1662
- }
1663
- .hovercell:hover {
1664
- margin-top: 1PX;
1665
- border: 1PX solid rgb(242, 121, 121);
1666
- }
1667
- }
1668
- .first-1 {
1669
- float: left;
1670
- // text-align: center;
1671
- }
1672
- // .ring-num {
1673
- // float: left;
1674
- // margin-top:7px;
1675
- // margin-left: 5px;
1676
- // font-size: 14px;
1677
- // font-weight: normal;
1678
- // font-stretch: normal;
1679
- // line-height: 22px;
1680
- // letter-spacing: 0px;
1681
- // color: #ffffff;
1682
- // }
1683
- .box {
1684
- text-align: center;
1685
- // float: left;
1686
- // margin-left: 6px;
1687
- // margin-right: 10px;
1688
- }
1689
- .ring-nums {
1690
- // float: left;
1691
- // margin-top:7px;
1692
- // margin-left: 5px;
1693
- font-size: 12px;
1694
- height: 14px;
1695
- font-weight: normal;
1696
- font-stretch: normal;
1697
- // line-height: 22px;
1698
- letter-spacing: 0px;
1699
- color: #333333;
1700
- }
1701
- .ring-phase {
1702
- position: relative;
1703
- float: left;
1704
- // margin-left: 5px;
1705
- height: 34px;
1706
- width: 36px;
1707
- z-index: 999;
1708
- background: rgba(30, 96, 12, 0.2);
1709
- // margin-top:1px;
1710
- }
1711
- .ring-phase::after {
1712
- position: absolute;
1713
- display: block;
1714
- content: '';
1715
- height: 0;
1716
- width: 0;
1717
- top: 11px;
1718
- left: 36px;
1719
- border: 5px solid transparent;
1720
- border-left-color: rgba(30, 96, 12, 0.2);
1721
- }
1722
- // .divider {
1723
- // position: absolute;
1724
- // top: -10px;
1725
- // // left: 370px;
1726
- // width: 2px;
1727
- // // height: 99px;
1728
- // z-index: 999;
1729
- // background-color:#B9BABF;
1730
- // }
1731
- // .curTimeLine {
1732
- // position: absolute;
1733
- // top: -10px;
1734
- // width: 4px;
1735
- // background-color: black;
1736
- // }
1737
- // .curTimeDiv {
1738
- // position: absolute;
1739
- // z-index:50;
1740
- // top: -21px;
1741
- // margin-left: -10px;
1742
- // text-align:center;
1743
- // vertical-align: middle;
1744
- // width: 60px;
1745
- // height: 19px;
1746
- // color:black;
1747
- // // background-color: black;
1748
- // }
1749
- }
1750
- .ring-first {
1751
- margin-top: 1px;
1752
- width: 100%;
1753
- height: 35px;
1754
- .hovercell {
1755
- box-sizing: border-box;
1756
- border: 1PX solid transparent;
1757
- }
1758
- .hovercell:hover {
1759
- margin-top: 1PX;
1760
- border: 1PX solid rgb(242, 121, 121);
1761
- }
1762
- }
1763
- .direction {
1764
- filter: brightness(70%);
1765
- }
1766
- .mask {
1767
- background: rgb(242, 121, 121) !important;
1768
- }
1769
- .yellowClass {
1770
- background: #f9dc6a !important;
1771
- }
1772
- .first-1 {
1773
- float: left;
1774
- // text-align: center;
1775
- }
1776
- </style>
1
+ /**
2
+ * Copyright (c) 2020 kedacom
3
+ * OpenATC is licensed under Mulan PSL v2.
4
+ * You can use this software according to the terms and conditions of the Mulan PSL v2.
5
+ * You may obtain a copy of Mulan PSL v2 at:
6
+ * http://license.coscl.org.cn/MulanPSL2
7
+ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8
+ * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9
+ * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10
+ * See the Mulan PSL v2 for more details.
11
+ **/
12
+ <template>
13
+ <div class="main-patternstatus">
14
+ <!-- 环模式true -->
15
+ <div v-if="this.contrloType === 'ring' || !this.contrloType">
16
+ <div class="ring-first" v-for="(list, index1) in patternInfo" :key="index1">
17
+ <draggable :move="move" @end="endDrag(index1)" :disabled="isMove" :list="list">
18
+ <div style="position: relative;" :style="{'height': '35px','float':'left','width':((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100) + '%'}" v-for="(item,index2) in list" :key="index2" :class="item.mode === 7 ? 'direction' : isBorder ? 'hovercell' : ''">
19
+ <div class="first-1" :class="item.mode === 8 ? 'mask' : item.mode === 9 ? 'yellowClass' : ''" :style="{'width':Number(item.greenWidth.replace('%', ''))/Number((((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100) + '%').replace('%', ''))*100+'%','height':'34px','background':'#7ccc66'}">
20
+ <el-tooltip placement="top-start" effect="light">
21
+ <div slot="content">{{$t('openatccomponents.phase.phase')}}{{item.id}}:{{item.split}}</div>
22
+ <div style="cursor:pointer;">
23
+ <div class="ring-phase">
24
+ <!-- <patternwalksvg :showWalk="item.peddirection" :Width="'32'" :Height="'34'"></patternwalksvg> -->
25
+ <xdrdirselector Width="60px" Height="60px" Widths="50px" Heights="50px" :showlist="item.direction"></xdrdirselector>
26
+ </div>
27
+ <div v-if="isShowTip" class="box" style="position: absolute; left:40px; width:40px; top: -1px;z-index:999">
28
+ <div @click="focusInput(item.id)" class="ring-nums">{{$t('openatccomponents.phase.phase')}}{{item.id}}</div>
29
+ <div v-if="isMove" class="ring-nums">{{item.split}}</div>
30
+ <el-input-number
31
+ v-if="!isMove"
32
+ class="ring-nums"
33
+ :ref="'inputNumbers' + item.id"
34
+ size="small"
35
+ :controls="false"
36
+ :min="0"
37
+ :step="1"
38
+ v-model.number="item.split"
39
+ @change="handleEdit(item)"
40
+ style="width: 42px"
41
+ ></el-input-number>
42
+ </div>
43
+ </div>
44
+ </el-tooltip>
45
+ <div style="width:50px;" v-for="(bus,index3) in busPhaseData" :key="index3">
46
+ <i class="iconfont icon-lukouzhilu" style="position: absolute;top: 8px;left:70px;font-size:12px;color:#454545;" v-if="bus.controltype === 1 && bus.phaseid===item.id"></i>
47
+ <i class="iconfont icon-BRT" style="position: absolute;top: 8px;left:70px;font-size:12px;color:#454545;" v-if="bus.controltype === 4 && bus.phaseid===item.id"></i>
48
+ <i class="iconfont icon-xuxiangwei-xin" style="position: absolute;top: 8px;left:70px;font-size:12px;color:#454545;" v-if="bus.controltype === 99 && bus.phaseid===item.id"></i>
49
+ <i class="iconfont icon-feijidongche" style="position: absolute;top: 8px;left:70px;font-size:12px;color:#454545;" v-if="bus.controltype === 6 && bus.phaseid===item.id"></i>
50
+ <i class="iconfont icon-gongjiaoche" style="position: absolute;top: 8px;left:70px;font-size:12px;color:#454545;" v-if="bus.controltype === 3 && bus.phaseid===item.id"></i>
51
+ <i class="iconfont icon-youguidianche" style="position: absolute;top: 8px;left:70px;font-size:12px;color:#454545;" v-if="bus.controltype === 5 && bus.phaseid===item.id"></i>
52
+ </div>
53
+ </div>
54
+ <div class="first-1" :class="item.mode === 8 ? 'mask' : item.mode === 9 ? 'yellowClass' : ''" :style="{'width':Number(item.flashgreen.replace('%', ''))/Number((((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100).toFixed(3) + '%').replace('%', ''))*100+'%','height':'34px','float':'left','background': 'linear-gradient(to right, #ffffff 50%, #7ccc66 0)','background-size': '4px 100%'}"></div>
55
+ <div class="first-1" :class="item.mode === 8 ? 'mask' : item.mode === 9 ? 'yellowClass' : ''" :style="{'width':Number(item.yellowWidth.replace('%', ''))/Number((((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100) + '%').replace('%', ''))*100+'%','height':'34px','background':'#f9dc6a'}"></div>
56
+ <div class="first-1" :class="item.mode === 8 ? 'mask' : item.mode === 9 ? 'yellowClass' : ''" :style="{'width':Number(item.redWidth.replace('%', ''))/Number((((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100).toFixed(3) + '%').replace('%', ''))*100+'%','height':'34px','background':'#f27979'}"></div>
57
+ </div>
58
+ </draggable>
59
+ </div>
60
+ <div v-if="showBarrier">
61
+ <div v-for="(item, index) in barrierList" :key="index + '1'">
62
+ <div class="divider" :style="{'left':item, 'height':barrierHeight}"></div>
63
+ </div>
64
+ </div>
65
+ <div v-show="(this.controlData && this.controlData.curTime && cycle && cycle>0 && this.isControl) || (this.controlData && newCycle && newCycle>0 && this.isControl)">
66
+ <div class="curTimeDiv" :style="{'left':paddingLeft }">{{ timeNumDevide }}</div>
67
+ <div class="curTimeLine" :style="{'left':paddingLeft, 'height':barrierHeight}"></div>
68
+ </div>
69
+ </div>
70
+ <div v-if="this.contrloType === 'stage'" class="ring-first">
71
+ <div v-for="(list, index1) in stageLists" :key="index1">
72
+ <!-- <div> -->
73
+ <div class="first-1" :style="{'width':list.greenWidth,'height':'34px','position':'relative','background':'#7ccc66'}">
74
+ <el-tooltip placement="top-start" effect="light">
75
+ <div slot="content">
76
+ <span class="ring-nums" v-for="(pha,index) in list.phases" :key="index">
77
+ {{$t('openatccomponents.phase.phase')}}{{pha}}
78
+ </span>
79
+ </div>
80
+ <div style="cursor:pointer;">
81
+ <div class="ring-phase">
82
+ <!-- <patternwalksvg :showWalk="list.peddirection" :Width="'32'" :Height="'34'"></patternwalksvg> -->
83
+ <xdrdirselector v-if="list.direction&&list.direction.length>0" Width="60px" Height="60px" Widths="50px" Heights="50px" :showlist="list.direction"></xdrdirselector>
84
+ </div>
85
+ <div class="box" style="position: absolute; left:41px; width:40px; top:-1px;">
86
+ <div class="ring-nums">{{$t('openatccomponents.phase.stage')}}{{list.key+1}}</div>
87
+ <div class="ring-nums">{{list.stageSplit}}</div>
88
+ </div>
89
+ <!-- <div class="box" style="line-height:28px">
90
+ <span class="ring-nums" v-for="(pha,index) in list.phases" :key="index">
91
+ P:{{pha}}
92
+ </span>
93
+ </div> -->
94
+ </div>
95
+ </el-tooltip>
96
+ </div>
97
+ <!-- <div class="first-1" :style="{'width':item.flashgreen,'height':'34px','float':'left','background': 'linear-gradient(to right, #ffffff 50%, #7ccc66 0)','background-size': '4px 100%'}"></div> -->
98
+ <div class="first-1" :style="{'width':list.yellowWidth,'height':'34px','background':'#f9dc6a'}"></div>
99
+ <div class="first-1" :style="{'width':list.redWidth,'height':'34px','background':'#f27979'}"></div>
100
+ </div>
101
+ <div v-if="this.controlData && this.controlData.curTime">
102
+ <div class="curTimeDiv" :style="{ left: paddingLefts }">
103
+ {{ timeNumDevides }}
104
+ </div>
105
+ <div
106
+ class="curTimeLine"
107
+ :style="{ left: paddingLefts, height: '56px' }"
108
+ ></div>
109
+ </div>
110
+ </div>
111
+ <!-- </div> -->
112
+ </div>
113
+ </template>
114
+ <script>
115
+ // import patternwalksvg from '../PatternWalkSvg/PatternWalkSvg'
116
+ import xdrdirselector from '../XRDDirSelector/XRDDirSelector'
117
+ import draggable from 'vuedraggable'
118
+ // import PatternWalkSvg from '../IntersectionMap/crossDirection/baseImg/PatternWalkSvg'
119
+ import PhaseDataModel from '../IntersectionMap/crossDirection/utils.js'
120
+ import CrossDiagramMgr from '../../../EdgeMgr/controller/crossDiagramMgr.js'
121
+ export default {
122
+ name: 'pattern-list',
123
+ components: {
124
+ // patternwalksvg,
125
+ draggable,
126
+ xdrdirselector
127
+ },
128
+ data () {
129
+ return {
130
+ barrierHeight: '',
131
+ stageCycle: '',
132
+ barrierList: [],
133
+ barrierArr: [],
134
+ newCycle: this.cycles,
135
+ patternIds: this.patternId,
136
+ newPatterns: [],
137
+ newList: [],
138
+ isControl: true,
139
+ contrloCycle: 0,
140
+ sidewalkPhaseData: [],
141
+ // controlDatas: this.controlData,
142
+ max: '',
143
+ fixCycle: '',
144
+ curtime: 0,
145
+ stageLists: [],
146
+ busPhaseData: [], // 公交相位数据
147
+ patternInfo: []
148
+ }
149
+ },
150
+ props: {
151
+ isBorder: {
152
+ type: Boolean,
153
+ default: false
154
+ },
155
+ isShowTip: {
156
+ type: Boolean,
157
+ default: true
158
+ },
159
+ cycleChange: {
160
+ type: Boolean,
161
+ default: true
162
+ },
163
+ stagesChange: {
164
+ type: Array
165
+ },
166
+ isMove: {
167
+ type: Boolean,
168
+ default: true
169
+ },
170
+ controlPhase: {
171
+ type: Object
172
+ },
173
+ contrloType: {
174
+ type: String
175
+ },
176
+ phaseList: {
177
+ type: Array
178
+ },
179
+ patternList: {
180
+ type: Array
181
+ },
182
+ showBarrier: {
183
+ type: Boolean,
184
+ default: false
185
+ },
186
+ allPatternList: {
187
+ type: Array
188
+ },
189
+ localPatternList: {
190
+ type: Array
191
+ },
192
+ controlData: {
193
+ type: Object
194
+ },
195
+ showCondition: {
196
+ type: Boolean,
197
+ default: false
198
+ },
199
+ cycle: {
200
+ type: Number
201
+ },
202
+ agentId: {
203
+ type: String
204
+ },
205
+ cycles: {
206
+ type: Number
207
+ },
208
+ patternId: {
209
+ type: Number
210
+ },
211
+ patternStatusList: {
212
+ type: Array
213
+ },
214
+ syncTime: {
215
+ type: Number
216
+ }
217
+ },
218
+ computed: {
219
+ paddingLefts () {
220
+ let res = '0%'
221
+ let curPercent = this.curtime / this.stageCycle
222
+ if (curPercent >= 1) {
223
+ curPercent = 1
224
+ }
225
+ res = curPercent * 100 + '%'
226
+ return res
227
+ },
228
+ timeNumDevides () {
229
+ let res = this.curtime
230
+ return res
231
+ },
232
+ paddingLeft () {
233
+ let res = '0%'
234
+ if (this.contrloCycle > 0) {
235
+ let curPercent = this.curtime / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.contrloCycle)
236
+ if (curPercent >= 1) {
237
+ curPercent = 1
238
+ }
239
+ res = curPercent * 100 + '%'
240
+ }
241
+ if (this.cycles > 0) {
242
+ let curPercent = this.curtime / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.contrloCycle)
243
+ if (curPercent >= 1) {
244
+ curPercent = 1
245
+ }
246
+ res = curPercent * 100 + '%'
247
+ }
248
+ return res
249
+ },
250
+ timeNumDevide () {
251
+ if (this.contrloCycle > 0) {
252
+ // let res = (this.contrloCycle - this.syncTime) + '/' + this.contrloCycle
253
+ // let res = this.curtime + '/' + (this.fixCycle ? this.fixCycle : this.max ? this.max : this.contrloCycle)
254
+ let res = this.curtime
255
+ return res
256
+ }
257
+ if (this.cycles > 0) {
258
+ // let res = (this.cycles - this.syncTime) + '/' + this.cycles
259
+ // let res = this.curtime + '/' + (this.fixCycle ? this.fixCycle : this.max ? this.max : this.contrloCycle)
260
+ let res = this.curtime
261
+ return res
262
+ }
263
+ }
264
+ },
265
+ watch: {
266
+ controlPhase: {
267
+ handler: function (val, oldVal) {
268
+ if ((val && val.curTime) || val.curTime === 0) {
269
+ this.curtime = val.curTime
270
+ if (val.control === 4 || val.control === 16 || val.control === 22) {
271
+ this.isControl = false
272
+ } else {
273
+ this.isControl = true
274
+ }
275
+ }
276
+ },
277
+ // 深度观察监听
278
+ deep: true
279
+ },
280
+ controlData: {
281
+ handler: function (val, oldVal) {
282
+ if (this.contrloType === 'stage') {
283
+ this.getIndexStage()
284
+ }
285
+ // this.controlDatas = this.controlData
286
+ this.getPedPhasePos()
287
+ if (this.localPatternList) {
288
+ this.max = ''
289
+ let idPattern = this.localPatternList.filter(item => item.id === this.controlData.patternid)
290
+ if (idPattern.length === 0 || (this.controlData && this.showCondition)) {
291
+ this.handleTentivePatternData()
292
+ } else {
293
+ this.handlePatternData()
294
+ }
295
+ this.handleBarrierHeight()
296
+ }
297
+ if ((val && val.curTime) || val.curTime === 0) {
298
+ this.curtime = val.curTime
299
+ if (val.control === 4 || val.control === 16 || val.control === 22) {
300
+ this.isControl = false
301
+ } else {
302
+ this.isControl = true
303
+ }
304
+ }
305
+ },
306
+ // 深度观察监听
307
+ deep: true
308
+ },
309
+ cycleChange: {
310
+ handler: function (val, oldVal) {
311
+ this.getStage()
312
+ this.handleCurrentChange(this.patternStatusList)
313
+ this.handleBarrierHeight()
314
+ },
315
+ // 深度观察监听
316
+ deep: true
317
+ },
318
+ phaseList: {
319
+ handler: function (val, oldVal) {
320
+ this.getPedPhasePos()
321
+ this.getBusPos()
322
+ this.getStage()
323
+ // this.handlePatternData()
324
+ },
325
+ // 深度观察监听
326
+ deep: true
327
+ },
328
+ agentId: {
329
+ handler: function (val, oldVal) {
330
+ this.getBusPos()
331
+ },
332
+ // 深度观察监听
333
+ deep: true
334
+ },
335
+ patternId: {
336
+ handler: function (val, oldVal) {
337
+ this.patternIds = this.patternId
338
+ },
339
+ // 深度观察监听
340
+ deep: true
341
+ },
342
+ cycles: {
343
+ handler: function (val, oldVal) {
344
+ this.newCycle = this.cycles
345
+ },
346
+ // 深度观察监听
347
+ deep: true
348
+ },
349
+ contrloType: {
350
+ handler: function (val, oldVal) {
351
+ if (this.contrloType === 'stage') {
352
+ this.getStage()
353
+ }
354
+ },
355
+ // 深度观察监听
356
+ deep: true
357
+ },
358
+ stagesChange: {
359
+ handler: function (val, oldVal) {
360
+ if (this.contrloType === 'stage') {
361
+ this.getStage()
362
+ }
363
+ },
364
+ // 深度观察监听
365
+ deep: true
366
+ },
367
+ patternStatusList: {
368
+ handler: function (val, oldVal) {
369
+ this.handleBarrierHeight() // 计算屏障高度
370
+ if (this.patternStatusList && this.newCycle) {
371
+ // setTimeout(() => {
372
+ this.handleCurrentChange(this.patternStatusList)
373
+ this.handleBarrierHeight()
374
+ // }, 10)
375
+ // this.handleBarrierHeight()
376
+ }
377
+ },
378
+ // 深度观察监听
379
+ deep: true
380
+ }
381
+ },
382
+ created () {
383
+ this.globalParamModel = this.$store.getters.globalParamModel
384
+ if (this.patternStatusList && this.newCycle && !this.controlData) {
385
+ setTimeout(() => {
386
+ this.handleCurrentChange(this.patternStatusList)
387
+ this.handleBarrierHeight()
388
+ }, 400)
389
+ } else if ((this.controlData && this.controlData.patternid === 109) || (this.controlData && this.showCondition) || (this.controlData && this.localPatternList.length === 0)) {
390
+ this.handleTentivePatternData()
391
+ } else {
392
+ this.handlePatternData()
393
+ }
394
+ this.PhaseDataModel = new PhaseDataModel()
395
+ this.CrossDiagramMgr = new CrossDiagramMgr()
396
+ this.getPedPhasePos()
397
+ this.getBusPos()
398
+ if (this.contrloType === 'stage') {
399
+ this.getStage()
400
+ }
401
+ },
402
+ methods: {
403
+ move (e) {
404
+ // 这里的e表示即将停靠的元素。
405
+ let result = this.barrierArr.filter(item => item.includes(e.relatedContext.element.id))[0]
406
+ if (!result.includes(e.draggedContext.element.id)) {
407
+ return false
408
+ }
409
+ },
410
+ endDrag (index) {
411
+ // 拖动后对原数据排序
412
+ const idIndexMap = {}
413
+ this.patternInfo.forEach((subArray, subArrayIndex) => {
414
+ subArray.forEach((item, index) => {
415
+ idIndexMap[item.id] = { subArrayIndex, index }
416
+ })
417
+ })
418
+ this.patternStatusList.forEach((subArray, subArrayIndex) => {
419
+ if (subArray.length > 0) {
420
+ subArray.sort((aItem, bItem) => {
421
+ const aIndex = idIndexMap[aItem.id] ? idIndexMap[aItem.id].index : Infinity
422
+ const bIndex = idIndexMap[bItem.id] ? idIndexMap[bItem.id].index : Infinity
423
+ return aIndex - bIndex
424
+ })
425
+ }
426
+ })
427
+ },
428
+ focusInput (id) {
429
+ if (!this.isMove) {
430
+ this.$refs['inputNumbers' + id][0].focus()
431
+ }
432
+ },
433
+ handleEdit (val) {
434
+ this.patternStatusList.map(d => {
435
+ d.map(r => {
436
+ if (r.id === val.id) {
437
+ r.value = val.split
438
+ }
439
+ })
440
+ })
441
+ // this.handleCurrentChange(this.patternStatusList)
442
+ this.$emit('handleSplitMove', this.patternId)
443
+ },
444
+ getMaxCycle (pattern) {
445
+ // let rings = pattern.rings
446
+ let maxCycle = 0
447
+ for (let ring of pattern) {
448
+ if (ring.length === 0) continue
449
+ let cycle = 0
450
+ for (let r of ring) {
451
+ if (r.mode === 7) { // 忽略相位不计周期
452
+ continue
453
+ }
454
+ cycle = cycle + r.value
455
+ }
456
+ if (cycle > maxCycle) {
457
+ maxCycle = cycle
458
+ }
459
+ }
460
+ return maxCycle
461
+ },
462
+ getPed (data) {
463
+ let ped = []
464
+ for (let stg of data) {
465
+ let peddirections = []
466
+ let currPhase = this.phaseList.filter((item) => {
467
+ return item.id === stg
468
+ })[0]
469
+ if (!currPhase) return
470
+ if (!currPhase.peddirection) return
471
+ for (let walk of this.sidewalkPhaseData) {
472
+ for (let ped of currPhase.peddirection) {
473
+ if (stg === walk.phaseid) {
474
+ let obj = {}
475
+ obj.name = walk.name
476
+ obj.id = walk.id
477
+ if (ped === walk.id) {
478
+ peddirections.push(obj)
479
+ peddirections = Array.from(new Set(peddirections))
480
+ }
481
+ }
482
+ }
483
+ }
484
+ ped.push(...peddirections)
485
+ }
486
+ return ped
487
+ },
488
+ handleStageData (data) {
489
+ if (!data) return
490
+ let peddirections = this.getPed(data)
491
+ let stagesTemp = []
492
+ let tempList = []
493
+ for (let stg of data) {
494
+ let directionList = []
495
+ let currPhase = this.phaseList.filter((item) => {
496
+ return item.id === stg
497
+ })[0]
498
+ if (currPhase !== undefined) {
499
+ directionList.push(...currPhase.direction)
500
+ directionList = Array.from(new Set(directionList))
501
+ }
502
+ if (directionList.length === 0) {
503
+ tempList.push({
504
+ id: '',
505
+ color: '#454545',
506
+ peddirection: peddirections
507
+ })
508
+ } else {
509
+ tempList = directionList.map(dir => ({
510
+ id: dir,
511
+ color: '#454545',
512
+ peddirection: peddirections
513
+ }))
514
+ }
515
+ let newTemp = tempList.filter(item => item.id !== '')
516
+ stagesTemp.push(...newTemp)
517
+ }
518
+ return stagesTemp
519
+ },
520
+ getIndexStage () {
521
+ if (this.localPatternList.length === 0) return
522
+ for (let i = 0; i < this.localPatternList.length; i++) {
523
+ if (this.controlData.patternid === this.localPatternList[i].id) {
524
+ if (!this.localPatternList[i].stagesList) return
525
+ let stageCycleList = this.localPatternList[i].stagesList.map(item => {
526
+ return item.stageSplit ? item.stageSplit : 0
527
+ })
528
+ let stageMaxCyle = stageCycleList.reduce((a, b) => {
529
+ return a + b
530
+ }, 0)
531
+ this.stageCycle = stageMaxCyle
532
+ this.stageLists = this.localPatternList[i].stagesList.map(item => {
533
+ return {
534
+ ...item,
535
+ // peddirection: this.getPed(item.phases ? item.phases : item.stages),
536
+ direction: this.handleStageData(item.phases ? item.phases : item.stages),
537
+ greenWidth: ((item.stageSplit - item.yellow - item.red) / stageMaxCyle * 100).toFixed(3) + '%',
538
+ yellowWidth: (item.yellow / stageMaxCyle * 100).toFixed(3) + '%',
539
+ redWidth: (item.red / stageMaxCyle * 100).toFixed(3) + '%'
540
+ }
541
+ })
542
+ }
543
+ }
544
+ },
545
+ getStage () {
546
+ if (!this.stagesChange) return
547
+ const globalParamModel = this.$store.getters.globalParamModel
548
+ let pattern = this.allPatternList ? this.allPatternList : globalParamModel.getParamsByType('patternList')
549
+ let mapAdd = pattern.map(item => item.stagesList).map(item => {
550
+ return item.map(val => {
551
+ return val.stageSplit ? val.stageSplit : val.split
552
+ })
553
+ })
554
+ let maxCycle = mapAdd.length > 0 ? mapAdd.map(item => {
555
+ return item.length > 0 ? item.reduce((a, b) => {
556
+ return a + b
557
+ }) : 0
558
+ }) : 0
559
+ let stageMaxCyle = Math.max(...maxCycle)// 每个环的周期最大值
560
+ if (!this.cycleChange) {
561
+ let stageCycleList = this.stagesChange.map(item => {
562
+ return item.stageSplit ? item.stageSplit : 0
563
+ })
564
+ stageMaxCyle = stageCycleList.reduce((a, b) => {
565
+ return a + b
566
+ }, 0)
567
+ }
568
+ this.stageLists = this.stagesChange.map(item => {
569
+ return {
570
+ ...item,
571
+ // peddirection: this.getPed(item.phases ? item.phases : item.stages),
572
+ direction: this.handleStageData(item.phases ? item.phases : item.stages),
573
+ greenWidth: ((item.stageSplit - item.yellow - item.red) / stageMaxCyle * 100).toFixed(3) + '%',
574
+ yellowWidth: (item.yellow / stageMaxCyle * 100).toFixed(3) + '%',
575
+ redWidth: (item.red / stageMaxCyle * 100).toFixed(3) + '%'
576
+ }
577
+ })
578
+ },
579
+ getBusPos () {
580
+ // 公交相位信息
581
+ this.busPhaseData = []
582
+ this.phaseList.forEach((ele, i) => {
583
+ // if (ele.controltype >= 3 && ele.controltype <= 5) {
584
+ // ele.direction.forEach((dir, index) => {
585
+ // 车道相位
586
+ this.busPhaseData.push({
587
+ phaseid: ele.id, // 相位did,用于对应相位状态
588
+ // id: dir, // 接口返回的dir字段,对应前端定义的相位方向id,唯一标识
589
+ // name: this.PhaseDataModel.getBusPhasePos(dir).name,
590
+ controltype: ele.controltype
591
+ })
592
+ // })
593
+ // }
594
+ })
595
+ let result = []
596
+ let obj = {}
597
+ for (var i = 0; i < this.busPhaseData.length; i++) {
598
+ if (!obj[this.busPhaseData[i].phaseid]) {
599
+ result.push(this.busPhaseData[i])
600
+ obj[this.busPhaseData[i].phaseid] = true
601
+ }
602
+ }
603
+ this.busPhaseData = result
604
+ },
605
+ getPedPhasePos () {
606
+ // 行人相位信息
607
+ this.sidewalkPhaseData = []
608
+ this.phaseList.forEach((ele, i) => {
609
+ if (ele.peddirection) {
610
+ ele.peddirection.forEach((dir, index) => {
611
+ // 行人相位
612
+ if (this.PhaseDataModel.getSidePos(dir)) {
613
+ this.sidewalkPhaseData.push({
614
+ key: this.CrossDiagramMgr.getUniqueKey('pedphase'),
615
+ phaseid: ele.id, // 相位id,用于对应相位状态
616
+ id: dir,
617
+ name: this.PhaseDataModel.getSidePos(dir).name
618
+ })
619
+ }
620
+ })
621
+ }
622
+ })
623
+ },
624
+ handleTentivePatternData () {
625
+ if (!this.controlData) return
626
+ this.newList = []
627
+ if (Object.keys(this.controlData).length === 0 || this.phaseList.length === 0) return
628
+ if (!this.controlData.phase) return
629
+ // let cycle = this.controlData.cycle
630
+ if (!this.controlData.rings) return
631
+ let newValue = []
632
+ for (let rings of this.controlData.rings) {
633
+ let phase = this.controlData.phase
634
+ // let list = []
635
+ let obj = {}
636
+ for (let key in rings.sequence) {
637
+ obj[key] = rings.sequence[key]
638
+ }
639
+ let newObj = Object.keys(obj).map(val => ({
640
+ id: obj[val]
641
+ }))
642
+ newValue.push(newObj)
643
+ for (let sequ of rings.sequence) {
644
+ let obj = {}
645
+ obj.id = sequ
646
+ let split = phase.filter((item) => {
647
+ return item.id === sequ
648
+ })[0].split
649
+ let mode = phase.filter((item) => {
650
+ return item.id === sequ
651
+ })[0].mode
652
+ newValue.map(d => {
653
+ d.map(r => {
654
+ if (r.id === sequ) {
655
+ r.value = split
656
+ if (mode === 1) {
657
+ r.mode = 8
658
+ } else if (mode === 2) {
659
+ r.mode = 7
660
+ } else if (mode === 3) {
661
+ r.mode = 9
662
+ } else {
663
+ r.mode = 2
664
+ }
665
+ }
666
+ })
667
+ })
668
+ }
669
+ }
670
+ this.handleTentative(newValue)
671
+ },
672
+ handleTentative (val) {
673
+ if (val === null || val.length === 0) return
674
+ // 周期以实际的绿信比来计算
675
+ let valSplit = val.map(item => {
676
+ return item.map(val => {
677
+ return val.value + (val.sum ? val.sum : 0)
678
+ })
679
+ })
680
+ let splitCycle = valSplit.length > 0 ? valSplit.map(item => {
681
+ return item.length > 0 ? item.reduce((a, b) => {
682
+ return a + b
683
+ }) : 0
684
+ }) : 0
685
+ let cycle = Math.max(...splitCycle)// 每个环的周期最大值
686
+ this.contrloCycle = cycle
687
+ // 按环序分组
688
+ let ringlength = []
689
+ let ringsequence = val.map(item => {
690
+ if (item.length === 0) return
691
+ ringlength.push(item.length)
692
+ return item.map(k => {
693
+ return k.id
694
+ })
695
+ })
696
+ let newRings = ringsequence.filter(item => item)
697
+ let minLength = Math.min(...ringlength)
698
+ let resultArrs = [] // 环1分组
699
+ let resultArr = [] // 环2分组
700
+ for (let j = 0; j < ringsequence[0].length; j += minLength) {
701
+ resultArrs.push(ringsequence[0].slice(j, j + minLength))
702
+ if (ringsequence[0].length === minLength) {
703
+ resultArrs.push([])
704
+ }
705
+ }
706
+ if (newRings.length > 1) {
707
+ for (let i = 0; i < ringsequence[1].length; i += minLength) {
708
+ resultArr.push(ringsequence[1].slice(i, i + minLength))
709
+ }
710
+ }
711
+ this.patternInfo = []
712
+ let currentArr = []
713
+ let newPattern = []
714
+ val.map(i => {
715
+ newPattern.push(...i)
716
+ })
717
+ if (this.phaseList.length === 0) return
718
+ for (let patternStatus of val[0]) {
719
+ // if (patternStatus.mode !== 7) {
720
+ let concurrent = this.phaseList.filter((item) => {
721
+ return item.id === patternStatus.id // patternStatus.id当前相位id concurrent当前相位的并发相位
722
+ })[0].concurrent// 当前相位的并发相位
723
+ if (concurrent) {
724
+ let obj = {
725
+ id: patternStatus.id,
726
+ current: concurrent.sort()
727
+ }
728
+ currentArr.push(obj)
729
+ }
730
+ // }
731
+ }
732
+ if (currentArr.length !== 0) {
733
+ let newCurrent = this.tranform(currentArr)
734
+ // 取没个环与环关系的并集
735
+ let barrierRing1 = []
736
+ let barrierRing2 = []
737
+ let ring1 = [] // 环1与关系1的并集
738
+ for (let h = 0; h < newCurrent.length; h++) {
739
+ let adds = [...new Set(resultArrs[0])].filter(item => newCurrent[h].includes(item))
740
+ ring1.push(adds)
741
+ }
742
+ let ring1s = [] // 环1与关系2的并集
743
+ for (let h = 0; h < newCurrent.length; h++) {
744
+ let addRing1 = [...new Set(resultArrs[1])].filter(item => newCurrent[h].includes(item))
745
+ ring1s.push(addRing1)
746
+ }
747
+ barrierRing1.push(...ring1, ...ring1s)
748
+ let resultList = []
749
+ if (newRings.length > 1) {
750
+ let ring2s = [] // 环2与关系1的并集
751
+ for (let h = 0; h < newCurrent.length; h++) {
752
+ let addRing2 = [...new Set(resultArr[1])].filter(item => newCurrent[h].includes(item))
753
+ ring2s.push(addRing2)
754
+ }
755
+ let ring2 = [] // 环2与关系1的并集
756
+ for (let h = 0; h < newCurrent.length; h++) {
757
+ let add = [...new Set(resultArr[0])].filter(item => newCurrent[h].includes(item))
758
+ ring2.push(add)
759
+ }
760
+ barrierRing2.push(...ring2, ...ring2s)
761
+ for (let k = 0; k < barrierRing1.length; k++) {
762
+ resultList.push(barrierRing1[k].concat(barrierRing2[k]))
763
+ }
764
+ }
765
+ let resultLists = resultList.filter(item => item.length !== 0)
766
+ let ringArr = []
767
+ for (let l = 0; l < resultLists.length; l++) {
768
+ for (let d = 0; d < newCurrent.length; d++) {
769
+ if (newCurrent[d].filter(item => resultLists[l].includes(item)).length > 0) {
770
+ ringArr.push({
771
+ data: resultLists[l],
772
+ id: d + 1,
773
+ index: l
774
+ })
775
+ }
776
+ }
777
+ }
778
+ // let ringObj = {}
779
+ // ringArr.forEach(item => {
780
+ // ringObj[item.index] = {
781
+ // id: item.id,
782
+ // index: item.index
783
+ // }
784
+ // })
785
+ for (var i = 0; i < ringArr.length; i++) {
786
+ for (var j = i + 1; j < ringArr.length; j++) {
787
+ if (ringArr[i].id === ringArr[j].id && ringArr[i].index + 1 === ringArr[j].index) {
788
+ ringArr[i].data = ringArr[i].data.concat(ringArr[j].data)
789
+ ringArr.splice(ringArr.indexOf(ringArr[j].id), 1)
790
+ }
791
+ }
792
+ }
793
+ let resArr = ringArr.map(item => item.data)
794
+ // this.barrierArr = resArr
795
+ let ringTeam = this.step1(this.phaseList, resArr)
796
+ let ringTeams = ringTeam.filter(item => item.length !== 0)
797
+ this.setBarriers(ringTeams, val)
798
+ this.fillGap(ringTeam, val)
799
+ let newPattern = []
800
+ val.map(i => {
801
+ newPattern.push(...i)
802
+ })
803
+ let barrier = this.step2(ringTeams, newPattern)
804
+ let barrierLeft = barrier.map(item => item)
805
+ this.barrierList = barrierLeft.map(j => {
806
+ return ((j / cycle) * 100) + '%'
807
+ })
808
+ }
809
+ // let cycle = this.controlData.cycle
810
+ for (let rings of val) {
811
+ if (rings.length === 0) continue
812
+ let list = []
813
+ for (let ring of rings) {
814
+ if (ring.value === 0) continue
815
+ let obj = {}
816
+ let split = ring.value
817
+ obj.id = ring.id
818
+ // obj.split = split
819
+ let currPhase = this.phaseList.filter((item) => {
820
+ if (item.id === ring.id && item.controltype === 99) {
821
+ obj.controltype = item.controltype
822
+ }
823
+ return item.id === ring.id
824
+ })[0]
825
+ if (!currPhase) return
826
+ let peddirections = []
827
+ for (let walk of this.sidewalkPhaseData) {
828
+ if (currPhase.peddirection) {
829
+ for (let ped of currPhase.peddirection) {
830
+ // if (stg === walk.phaseid) {
831
+ let objs = {}
832
+ objs.name = walk.name
833
+ objs.color = 'rgba(48,49,51,0.6)'
834
+ objs.id = walk.id
835
+ if (ped === walk.id) {
836
+ peddirections.push(objs)
837
+ peddirections = Array.from(new Set(peddirections))
838
+ }
839
+ // }
840
+ }
841
+ } else {
842
+ peddirections = []
843
+ }
844
+ }
845
+ if (ring.desc && ring.desc.length > 0) {
846
+ obj.direction = ring.desc.map(item => { // 虚相位desc为空
847
+ return {
848
+ id: item.id,
849
+ color: '#303133'
850
+ }
851
+ })
852
+ } else {
853
+ if (currPhase.direction && currPhase.direction.length > 0) {
854
+ obj.direction = currPhase.direction.map(item => {
855
+ return {
856
+ id: item,
857
+ peddirection: peddirections,
858
+ color: '#303133'
859
+ }
860
+ })
861
+ } else {
862
+ obj.direction = [
863
+ {
864
+ id: '',
865
+ color: '#303133',
866
+ peddirection: peddirections
867
+ }
868
+ ]
869
+ }
870
+ }
871
+ obj.split = split
872
+ obj.cycle = cycle
873
+ if (ring.sum) {
874
+ obj.sum = ring.sum
875
+ obj.redWidth = ((currPhase.redclear + ring.sum) / (this.max ? this.max : cycle) * 100) + '%'
876
+ } else {
877
+ obj.redWidth = (currPhase.redclear / (this.max ? this.max : cycle) * 100) + '%'
878
+ }
879
+ obj.flashgreen = (currPhase.flashgreen / (this.max ? this.max : cycle) * 100) + '%'
880
+ obj.yellowWidth = (currPhase.yellow / (this.max ? this.max : cycle) * 100) + '%'
881
+ obj.greenWidth = ((split - currPhase.redclear - currPhase.yellow - currPhase.flashgreen) / (this.max ? this.max : cycle) * 100) + '%'
882
+ // 忽略相位不显示
883
+ // let mode = ring.mode
884
+ // if (mode !== 7) { // 忽略相位不显示
885
+ list.push(obj)
886
+ // }
887
+ }
888
+ this.patternInfo.push(list)
889
+ }
890
+ },
891
+ handlePatternData () {
892
+ if (!this.controlData) return
893
+ // this.newList = []
894
+ if (Object.keys(this.controlData).length === 0 || this.phaseList.length === 0) return
895
+ if (!this.controlData.phase) return
896
+ if (!this.controlData.rings) return
897
+ let nowPattern = this.localPatternList.filter(item => {
898
+ return item.id === this.controlData.patternid
899
+ })[0].rings
900
+ // 信号机忽略相位,更新最新的相位信息
901
+ let filterPattern = []
902
+ for (let i of nowPattern) {
903
+ for (let j of this.controlData.rings) {
904
+ let filterSequence = i.filter(item => j.sequence.includes(item.id))
905
+ if (filterSequence.length > 0) {
906
+ filterPattern.push(filterSequence)
907
+ }
908
+ }
909
+ }
910
+ for (let rings of this.controlData.rings) {
911
+ for (let sequ of rings.sequence) {
912
+ let split = this.controlData.phase.filter((item) => {
913
+ return item.id === sequ
914
+ })[0].split
915
+ filterPattern.map(d => {
916
+ return d.map(r => {
917
+ if (r.id === sequ) {
918
+ r.value = split
919
+ }
920
+ })
921
+ })
922
+ }
923
+ }
924
+ this.handleOverViewChange(filterPattern)
925
+ },
926
+ handleBarrierHeight () { // 屏障高度
927
+ if (!this.patternInfo) return
928
+ let patternLength = this.patternInfo.length
929
+ this.barrierHeight = (patternLength * 35 + 21) + 'px'
930
+ },
931
+ handleOverViewChange (val) {
932
+ if (val === null || val.length === 0) return
933
+ // 周期以实际的绿信比来计算
934
+ let valSplit = val.map(item => {
935
+ return item.map(val => {
936
+ return val.value + (val.sum ? val.sum : 0)
937
+ })
938
+ })
939
+ let splitCycle = valSplit.length > 0 ? valSplit.map(item => {
940
+ return item.length > 0 ? item.reduce((a, b) => {
941
+ return a + b
942
+ }) : 0
943
+ }) : 0
944
+ let cycle = Math.max(...splitCycle)// 每个环的周期最大值
945
+ this.contrloCycle = cycle
946
+ // 按环序分组
947
+ let ringlength = []
948
+ let ringsequence = val.map(item => {
949
+ if (item.length === 0) return
950
+ ringlength.push(item.length)
951
+ return item.map(k => {
952
+ return k.id
953
+ })
954
+ })
955
+ let newRings = ringsequence.filter(item => item)
956
+ let minLength = Math.min(...ringlength)
957
+ let resultArrs = [] // 环1分组
958
+ let resultArr = [] // 环2分组
959
+ for (let j = 0; j < ringsequence[0].length; j += minLength) {
960
+ resultArrs.push(ringsequence[0].slice(j, j + minLength))
961
+ if (ringsequence[0].length === minLength) {
962
+ resultArrs.push([])
963
+ }
964
+ }
965
+ if (newRings.length > 1) {
966
+ for (let i = 0; i < ringsequence[1].length; i += minLength) {
967
+ resultArr.push(ringsequence[1].slice(i, i + minLength))
968
+ }
969
+ }
970
+ this.patternInfo = []
971
+ let currentArr = []
972
+ let newPattern = []
973
+ val.map(i => {
974
+ newPattern.push(...i)
975
+ })
976
+ if (this.phaseList.length === 0) return
977
+ for (let patternStatus of val[0]) {
978
+ // if (patternStatus.mode !== 7) {
979
+ let concurrent = this.phaseList.filter((item) => {
980
+ return item.id === patternStatus.id // patternStatus.id当前相位id concurrent当前相位的并发相位
981
+ })[0].concurrent// 当前相位的并发相位
982
+ if (concurrent) {
983
+ let obj = {
984
+ id: patternStatus.id,
985
+ current: concurrent.sort()
986
+ }
987
+ currentArr.push(obj)
988
+ }
989
+ // }
990
+ }
991
+ if (currentArr.length !== 0) {
992
+ let newCurrent = this.tranform(currentArr)
993
+ // 取没个环与环关系的并集
994
+ let barrierRing1 = []
995
+ let barrierRing2 = []
996
+ let ring1 = [] // 环1与关系1的并集
997
+ for (let h = 0; h < newCurrent.length; h++) {
998
+ let adds = [...new Set(resultArrs[0])].filter(item => newCurrent[h].includes(item))
999
+ ring1.push(adds)
1000
+ }
1001
+ let ring1s = [] // 环1与关系2的并集
1002
+ for (let h = 0; h < newCurrent.length; h++) {
1003
+ let addRing1 = [...new Set(resultArrs[1])].filter(item => newCurrent[h].includes(item))
1004
+ ring1s.push(addRing1)
1005
+ }
1006
+ barrierRing1.push(...ring1, ...ring1s)
1007
+ let resultList = []
1008
+ if (newRings.length > 1) {
1009
+ let ring2s = [] // 环2与关系1的并集
1010
+ for (let h = 0; h < newCurrent.length; h++) {
1011
+ let addRing2 = [...new Set(resultArr[1])].filter(item => newCurrent[h].includes(item))
1012
+ ring2s.push(addRing2)
1013
+ }
1014
+ let ring2 = [] // 环2与关系1的并集
1015
+ for (let h = 0; h < newCurrent.length; h++) {
1016
+ let add = [...new Set(resultArr[0])].filter(item => newCurrent[h].includes(item))
1017
+ ring2.push(add)
1018
+ }
1019
+ barrierRing2.push(...ring2, ...ring2s)
1020
+ for (let k = 0; k < barrierRing1.length; k++) {
1021
+ resultList.push(barrierRing1[k].concat(barrierRing2[k]))
1022
+ }
1023
+ }
1024
+ let resultLists = resultList.filter(item => item.length !== 0)
1025
+ let ringArr = []
1026
+ for (let l = 0; l < resultLists.length; l++) {
1027
+ for (let d = 0; d < newCurrent.length; d++) {
1028
+ if (newCurrent[d].filter(item => resultLists[l].includes(item)).length > 0) {
1029
+ ringArr.push({
1030
+ data: resultLists[l],
1031
+ id: d + 1,
1032
+ index: l
1033
+ })
1034
+ }
1035
+ }
1036
+ }
1037
+ for (var i = 0; i < ringArr.length; i++) {
1038
+ for (var j = i + 1; j < ringArr.length; j++) {
1039
+ if (ringArr[i].id === ringArr[j].id && ringArr[i].index + 1 === ringArr[j].index) {
1040
+ ringArr[i].data = ringArr[i].data.concat(ringArr[j].data)
1041
+ ringArr.splice(ringArr.indexOf(ringArr[j].id), 1)
1042
+ }
1043
+ }
1044
+ }
1045
+ let resArr = ringArr.map(item => item.data)
1046
+ let ringTeam = this.step1(this.phaseList, resArr)
1047
+ let ringTeams = ringTeam.filter(item => item.length !== 0)
1048
+ this.fillGap(ringTeams, val)
1049
+ // 总览添加屏障
1050
+ let newPattern = []
1051
+ val.map(i => {
1052
+ newPattern.push(...i)
1053
+ })
1054
+ let barrier = this.step2(ringTeams, newPattern)
1055
+ let barrierLeft = barrier.map(item => item)
1056
+ this.barrierList = barrierLeft.map(j => {
1057
+ return (j / (this.max ? this.max : this.contrloCycle) * 100) + '%'
1058
+ })
1059
+ }
1060
+ // let cycle = this.controlData.cycle
1061
+ for (let rings of val) {
1062
+ if (rings.length === 0) continue
1063
+ let list = []
1064
+ for (let ring of rings) {
1065
+ if (ring.value === 0) continue
1066
+ let obj = {}
1067
+ let split = ring.value
1068
+ obj.id = ring.id
1069
+ obj.mode = ring.mode
1070
+ // obj.split = split
1071
+ let currPhase = this.phaseList.filter((item) => {
1072
+ if (item.id === ring.id && item.controltype === 99) {
1073
+ obj.controltype = item.controltype
1074
+ }
1075
+ return item.id === ring.id
1076
+ })[0]
1077
+ if (!currPhase) return
1078
+ let peddirections = []
1079
+ for (let walk of this.sidewalkPhaseData) {
1080
+ if (currPhase.peddirection) {
1081
+ for (let ped of currPhase.peddirection) {
1082
+ // if (stg === walk.phaseid) {
1083
+ let objs = {}
1084
+ objs.name = walk.name
1085
+ objs.id = walk.id
1086
+ objs.color = 'rgba(48,49,51,0.6)'
1087
+ if (ped === walk.id) {
1088
+ peddirections.push(objs)
1089
+ peddirections = Array.from(new Set(peddirections))
1090
+ }
1091
+ // }
1092
+ }
1093
+ } else {
1094
+ peddirections = []
1095
+ }
1096
+ }
1097
+ if (ring.desc && ring.desc.length > 0) {
1098
+ obj.direction = ring.desc.map(item => { // 虚相位desc为空
1099
+ return {
1100
+ id: item.id,
1101
+ color: '#303133'
1102
+ }
1103
+ })
1104
+ } else {
1105
+ if (currPhase.direction && currPhase.direction.length > 0) {
1106
+ obj.direction = currPhase.direction.map(item => {
1107
+ return {
1108
+ id: item,
1109
+ peddirection: peddirections,
1110
+ color: '#303133'
1111
+ }
1112
+ })
1113
+ } else {
1114
+ obj.direction = [
1115
+ {
1116
+ id: '',
1117
+ color: '#303133',
1118
+ peddirection: peddirections
1119
+ }
1120
+ ]
1121
+ }
1122
+ }
1123
+ obj.split = split
1124
+ obj.cycle = cycle
1125
+ if (ring.sum) {
1126
+ obj.sum = ring.sum
1127
+ obj.redWidth = ((currPhase.redclear + ring.sum) / (this.max ? this.max : cycle) * 100) + '%'
1128
+ } else {
1129
+ obj.redWidth = (currPhase.redclear / (this.max ? this.max : cycle) * 100) + '%'
1130
+ }
1131
+ obj.flashgreen = (currPhase.flashgreen / (this.max ? this.max : cycle) * 100) + '%'
1132
+ obj.yellowWidth = (currPhase.yellow / (this.max ? this.max : cycle) * 100) + '%'
1133
+ obj.greenWidth = ((split - currPhase.redclear - currPhase.yellow - currPhase.flashgreen) / (this.max ? this.max : cycle) * 100) + '%'
1134
+ // 忽略相位不显示
1135
+ // let mode = ring.mode
1136
+ // if (mode !== 7) { // 忽略相位不显示
1137
+ list.push(obj)
1138
+ // }
1139
+ }
1140
+ this.patternInfo.push(list)
1141
+ }
1142
+ },
1143
+ handleCurrentChange (val) { // 两个ring的数据
1144
+ this.patternInfo = []
1145
+ if (val === null || val.length === 0) return
1146
+ if (this.controlPhase && this.controlPhase.phase && this.controlPhase.phase[0].split) {
1147
+ val.map(i => {
1148
+ i.map(j => {
1149
+ j.value = this.controlPhase.phase.filter(item => item.id === j.id)[0].split
1150
+ })
1151
+ })
1152
+ let valSplit = val.map(item => {
1153
+ return item.map(val => {
1154
+ return val.value + (val.sum ? val.sum : 0)
1155
+ })
1156
+ })
1157
+ let splitCycle = valSplit.length > 0 ? valSplit.map(item => {
1158
+ return item.length > 0 ? item.reduce((a, b) => {
1159
+ return a + b
1160
+ }) : 0
1161
+ }) : 0
1162
+ this.fixCycle = Math.max(...splitCycle)// 每个环的周期最大值
1163
+ }
1164
+ // 按环序分组
1165
+ let ringlength = []
1166
+ let ringsequence = val.map(item => {
1167
+ if (item.length === 0) return
1168
+ ringlength.push(item.length)
1169
+ return item.map(k => {
1170
+ return k.id
1171
+ })
1172
+ })
1173
+ let valSplit = val.map(item => {
1174
+ return item.map(val => {
1175
+ return val.value + (val.sum ? val.sum : 0)
1176
+ })
1177
+ })
1178
+ let splitCycle = valSplit.length > 0 ? valSplit.map(item => {
1179
+ return item.length > 0 ? item.reduce((a, b) => {
1180
+ return a + b
1181
+ }) : 0
1182
+ }) : 0
1183
+ let cycle = Math.max(...splitCycle)// 每个环的周期最大值
1184
+ let newRings = ringsequence.filter(item => item)
1185
+ let minLength = Math.min(...ringlength)
1186
+ let resultArrs = [] // 环1分组
1187
+ let resultArr = [] // 环2分组
1188
+ for (let j = 0; j < ringsequence[0].length; j += minLength) {
1189
+ resultArrs.push(ringsequence[0].slice(j, j + minLength))
1190
+ if (ringsequence[0].length === minLength) {
1191
+ resultArrs.push([])
1192
+ }
1193
+ }
1194
+ if (newRings.length > 1) {
1195
+ for (let i = 0; i < ringsequence[1].length; i += minLength) {
1196
+ resultArr.push(ringsequence[1].slice(i, i + minLength))
1197
+ }
1198
+ }
1199
+ this.patternInfo = []
1200
+ this.barrierList = []
1201
+ let currentArr = []
1202
+ let newPattern = []
1203
+ val.map(i => {
1204
+ newPattern.push(...i)
1205
+ })
1206
+ if (this.phaseList.length === 0) return
1207
+ for (let patternStatus of val[0]) {
1208
+ // if (patternStatus.mode !== 7) {
1209
+ let concurrent = this.phaseList.filter((item) => {
1210
+ return item.id === patternStatus.id // patternStatus.id当前相位id concurrent当前相位的并发相位
1211
+ })[0].concurrent// 当前相位的并发相位
1212
+ if (concurrent) {
1213
+ let obj = {
1214
+ id: patternStatus.id,
1215
+ current: concurrent.sort()
1216
+ }
1217
+ currentArr.push(obj)
1218
+ }
1219
+ // }
1220
+ }
1221
+ if (currentArr.length !== 0) {
1222
+ let newCurrent = this.tranform(currentArr)
1223
+ // 取没个环与环关系的并集
1224
+ let barrierRing1 = []
1225
+ let barrierRing2 = []
1226
+ let ring1 = [] // 环1与关系1的并集
1227
+ for (let h = 0; h < newCurrent.length; h++) {
1228
+ let adds = [...new Set(resultArrs[0])].filter(item => newCurrent[h].includes(item))
1229
+ ring1.push(adds)
1230
+ }
1231
+ let ring1s = [] // 环1与关系2的并集
1232
+ for (let h = 0; h < newCurrent.length; h++) {
1233
+ let addRing1 = [...new Set(resultArrs[1])].filter(item => newCurrent[h].includes(item))
1234
+ ring1s.push(addRing1)
1235
+ }
1236
+ barrierRing1.push(...ring1, ...ring1s)
1237
+ let resultList = []
1238
+ if (newRings.length >= 1) {
1239
+ let ring2s = [] // 环2与关系1的并集
1240
+ for (let h = 0; h < newCurrent.length; h++) {
1241
+ let addRing2 = [...new Set(resultArr[1])].filter(item => newCurrent[h].includes(item))
1242
+ ring2s.push(addRing2)
1243
+ }
1244
+ let ring2 = [] // 环2与关系1的并集
1245
+ for (let h = 0; h < newCurrent.length; h++) {
1246
+ let add = [...new Set(resultArr[0])].filter(item => newCurrent[h].includes(item))
1247
+ ring2.push(add)
1248
+ }
1249
+ barrierRing2.push(...ring2, ...ring2s)
1250
+ for (let k = 0; k < barrierRing1.length; k++) {
1251
+ resultList.push(barrierRing1[k].concat(barrierRing2[k]))
1252
+ }
1253
+ }
1254
+ let resultLists = resultList.filter(item => item.length !== 0)
1255
+ let ringArr = []
1256
+ for (let l = 0; l < resultLists.length; l++) {
1257
+ for (let d = 0; d < newCurrent.length; d++) {
1258
+ if (newCurrent[d].filter(item => resultLists[l].includes(item)).length > 0) {
1259
+ ringArr.push({
1260
+ data: resultLists[l],
1261
+ id: d + 1,
1262
+ index: l
1263
+ })
1264
+ }
1265
+ }
1266
+ }
1267
+ for (var i = 0; i < ringArr.length; i++) {
1268
+ for (var j = i + 1; j < ringArr.length; j++) {
1269
+ if (ringArr[i].id === ringArr[j].id && ringArr[i].index + 1 === ringArr[j].index) {
1270
+ ringArr[i].data = ringArr[i].data.concat(ringArr[j].data)
1271
+ ringArr.splice(ringArr.indexOf(ringArr[j].id), 1)
1272
+ }
1273
+ }
1274
+ }
1275
+ let resArr = ringArr.map(item => item.data)
1276
+ this.barrierArr = resArr
1277
+ let ringTeam = this.step1(this.phaseList, resArr)
1278
+ let ringTeams = ringTeam.filter(item => item.length !== 0)
1279
+ if (this.patternList) {
1280
+ this.setBarrier(ringTeams, val)
1281
+ }
1282
+ if (newRings.length > 1) {
1283
+ this.fillGap(ringTeams, val)
1284
+ }
1285
+ if (this.cycleChange) {
1286
+ const globalParamModel = this.$store.getters.globalParamModel
1287
+ let pattern = globalParamModel.getParamsByType('patternList')
1288
+ const allCycle = pattern.map(item => item.cycle)
1289
+ let cycle = Math.max(...allCycle)
1290
+ this.max = cycle
1291
+ } else {
1292
+ this.max = ''
1293
+ }
1294
+ let barrier = this.step2(ringTeams, newPattern)
1295
+ let barrierLeft = barrier.map(item => item)// 屏障左移显示出人行横道
1296
+ this.barrierList = barrierLeft.map(j => {
1297
+ return (j / (this.max ? this.max : cycle) * 100) + '%'
1298
+ })
1299
+ // this.barrierList.unshift(0)
1300
+ }
1301
+ for (let rings of val) {
1302
+ if (rings.length === 0) continue
1303
+ let list = []
1304
+ for (let ring of rings) {
1305
+ if (ring.value === 0) continue
1306
+ let obj = {}
1307
+ let split = ring.value
1308
+ obj.id = ring.id
1309
+ // obj.split = split
1310
+ let currPhase = this.phaseList.filter((item) => {
1311
+ if (item.id === ring.id && item.controltype === 99) {
1312
+ obj.controltype = item.controltype
1313
+ }
1314
+ return item.id === ring.id
1315
+ })[0]
1316
+ if (!currPhase) return
1317
+ let peddirections = []
1318
+ for (let walk of this.sidewalkPhaseData) {
1319
+ if (currPhase.peddirection) {
1320
+ for (let ped of currPhase.peddirection) {
1321
+ // if (stg === walk.phaseid) {
1322
+ let objs = {}
1323
+ objs.name = walk.name
1324
+ objs.id = walk.id
1325
+ objs.color = 'rgba(48,49,51,0.6)'
1326
+ if (ped === walk.id) {
1327
+ peddirections.push(objs)
1328
+ peddirections = Array.from(new Set(peddirections))
1329
+ }
1330
+ // }
1331
+ }
1332
+ } else {
1333
+ peddirections = []
1334
+ }
1335
+ }
1336
+ if (ring.desc && ring.desc.length > 0) {
1337
+ obj.direction = ring.desc.map(item => { // 虚相位desc为空
1338
+ return {
1339
+ id: item.id,
1340
+ color: '#303133',
1341
+ peddirection: peddirections
1342
+ }
1343
+ })
1344
+ } else {
1345
+ if (currPhase.direction && currPhase.direction.length > 0) {
1346
+ obj.direction = currPhase.direction.map(item => {
1347
+ return {
1348
+ id: item,
1349
+ color: '#303133',
1350
+ peddirection: peddirections
1351
+ }
1352
+ })
1353
+ } else {
1354
+ obj.direction = [
1355
+ {
1356
+ id: '',
1357
+ color: '#303133',
1358
+ peddirection: peddirections
1359
+ }
1360
+ ]
1361
+ }
1362
+ }
1363
+ obj.split = split
1364
+ obj.cycle = this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle
1365
+ const isZero = split - currPhase.redclear - currPhase.yellow - currPhase.flashgreen
1366
+ const allAdd = split + currPhase.redclear + currPhase.yellow + currPhase.flashgreen
1367
+ if (isZero <= 0) {
1368
+ if (ring.sum) {
1369
+ obj.sum = ring.sum
1370
+ obj.redWidth = ((((currPhase.redclear + ring.sum) / allAdd) / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle)) * 100) + '%'
1371
+ } else {
1372
+ obj.redWidth = (((currPhase.redclear / allAdd) / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle)) * 100) + '%'
1373
+ }
1374
+ obj.greenWidth = (((split - (currPhase.redclear / allAdd) - (currPhase.yellow / allAdd) - (currPhase.flashgreen / allAdd)) / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle)) * 100) + '%'
1375
+ obj.yellowWidth = (((currPhase.yellow / allAdd) / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle)) * 100) + '%'
1376
+ obj.flashgreen = (((currPhase.flashgreen / allAdd) / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle)) * 100) + '%'
1377
+ } else {
1378
+ if (ring.sum) {
1379
+ obj.sum = ring.sum
1380
+ obj.redWidth = ((currPhase.redclear + ring.sum) / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle) * 100) + '%'
1381
+ } else {
1382
+ obj.redWidth = (currPhase.redclear / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle) * 100) + '%'
1383
+ }
1384
+ obj.mode = ring.mode
1385
+ obj.greenWidth = ((split - currPhase.redclear - currPhase.yellow - currPhase.flashgreen) / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle) * 100) + '%'
1386
+ obj.flashgreen = (currPhase.flashgreen / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle) * 100) + '%'
1387
+ obj.yellowWidth = (currPhase.yellow / (this.fixCycle ? this.fixCycle : this.max ? this.max : this.newCycle) * 100) + '%'
1388
+ }
1389
+ // 忽略相位不显示
1390
+ // let mode = ring.mode
1391
+ // if (mode !== 7) { // 忽略相位不显示
1392
+ list.push(obj)
1393
+ // }
1394
+ }
1395
+ this.patternInfo.push(list)
1396
+ }
1397
+ },
1398
+ setBarriers (ringTeam, val) { // 临时方案添加特征参数barrier
1399
+ this.localPatternList.map(item => {
1400
+ // if (item.id === this.patternIds) {
1401
+ const patternObjs = {}
1402
+ val.forEach(l => {
1403
+ l.map(k => {
1404
+ patternObjs[k.id] = k.value
1405
+ })
1406
+ })
1407
+ let ret = ringTeam.map((y, index) => {
1408
+ if (!y || y.length === 0) return
1409
+ y.map(n => {
1410
+ n.length = n.data.length > 1 ? n.data.reduce((pre, cur) => pre + patternObjs[cur], 0) : patternObjs[n.data[0]]
1411
+ })
1412
+ return {
1413
+ barrier: index + 1,
1414
+ length: y[0].length,
1415
+ items: y.map(j => {
1416
+ return {
1417
+ ring: j.ring,
1418
+ data: j.data
1419
+ }
1420
+ })
1421
+ }
1422
+ })
1423
+ item.barriers = ret
1424
+ // }
1425
+ })
1426
+ },
1427
+ setBarrier (ringTeam, val) { // 添加特征参数barrier
1428
+ this.patternList.map(item => {
1429
+ if (item.id === this.patternIds) {
1430
+ const patternObjs = {}
1431
+ val.forEach(l => {
1432
+ l.map(k => {
1433
+ patternObjs[k.id] = k.value
1434
+ })
1435
+ })
1436
+ let ret = ringTeam.map((y, index) => {
1437
+ if (!y || y.length === 0) return
1438
+ y.map(n => {
1439
+ n.length = n.data.length > 1 ? n.data.reduce((pre, cur) => pre + patternObjs[cur], 0) : patternObjs[n.data[0]]
1440
+ })
1441
+ return {
1442
+ barrier: index + 1,
1443
+ length: y[0].length,
1444
+ items: y.map(j => {
1445
+ return {
1446
+ ring: j.ring,
1447
+ data: j.data
1448
+ }
1449
+ })
1450
+ }
1451
+ })
1452
+ item.barriers = ret
1453
+ }
1454
+ })
1455
+ },
1456
+ tranform (arr) { // 分barrier
1457
+ let newMap = new Map()
1458
+ arr.forEach(({id, current}) => {
1459
+ const find = newMap.get(current.join())
1460
+ if (find) newMap.get(current.join()).push(id)
1461
+ else newMap.set(current.join(), [id])
1462
+ })
1463
+ let ret = []
1464
+ newMap.forEach((value, key) => {
1465
+ ret.push(Array.from(new Set(key.split(',').map(Number).concat(value))))
1466
+ })
1467
+ const result = []
1468
+ for (const a of ret) {
1469
+ let merged = false
1470
+ for (const r of result) {
1471
+ if (this.check([...r], a)) {
1472
+ a.forEach(item => r.add(item))
1473
+ merged = true
1474
+ }
1475
+ }
1476
+ if (!merged) {
1477
+ result.push(new Set(a))
1478
+ }
1479
+ merged = false
1480
+ }
1481
+ return result.map(s => [...s])
1482
+ },
1483
+ check (arr1, arr2) {
1484
+ return arr1.some(a1 => arr2.some(a2 => a1 === a2))
1485
+ },
1486
+ step1 (list, arr) { // 各个环包含的相位
1487
+ const ret = []
1488
+ const listObj = {}
1489
+ list.forEach(l => {
1490
+ listObj[l.id] = l.ring
1491
+ })
1492
+ arr.forEach(a => {
1493
+ const retItem = []
1494
+ a.forEach(b => {
1495
+ if (listObj[b]) {
1496
+ const find = retItem.find(r => r.ring === listObj[b])
1497
+ if (find) find.data.push(b)
1498
+ else retItem.push({ring: listObj[b], data: [b]})
1499
+ }
1500
+ })
1501
+ ret.push(retItem)
1502
+ })
1503
+ return ret
1504
+ },
1505
+ step2 (newArr, pattern) { // 不同环并发相位做比较
1506
+ let ret = []
1507
+ let max = 0
1508
+ const patternObj = {}
1509
+ pattern.forEach(l => {
1510
+ // if (l.mode !== 7) {
1511
+ patternObj[l.id] = l.value
1512
+ // }
1513
+ })
1514
+ let barrierCycle = newArr.map(item => {
1515
+ return Math.max.apply(Math, item.map(k => { return k.length }))
1516
+ })
1517
+ barrierCycle.forEach((b, index) => {
1518
+ if (index === 0) {
1519
+ ret.push(barrierCycle[index])
1520
+ } else {
1521
+ if (max) {
1522
+ max = barrierCycle[index] + max
1523
+ } else {
1524
+ max = barrierCycle[index] + barrierCycle[index - 1]
1525
+ }
1526
+ ret.push(max)
1527
+ }
1528
+ })
1529
+ return ret
1530
+ },
1531
+ fillGap (newArr, pattern) {
1532
+ this.newPatterns = []
1533
+ const patternObj = {}
1534
+ pattern.forEach(l => {
1535
+ l.map(k => {
1536
+ // if (k.mode !== 7) {
1537
+ patternObj[k.id] = k.value
1538
+ // }
1539
+ })
1540
+ })
1541
+ let newMax = []
1542
+ let newMin = []
1543
+ newArr.forEach((na, index) => {
1544
+ if (!na || na.length === 0) return
1545
+ na.map(n => {
1546
+ n.length = n.data.length > 1 ? n.data.reduce((pre, cur) => pre + patternObj[cur], 0) : patternObj[n.data[0]]
1547
+ })
1548
+ let maxNum = Math.max.apply(Math, na.map(item => { return item.length }))
1549
+ let minNum = Math.min.apply(Math, na.map(item => { return item.length }))
1550
+ newMax.push(maxNum)
1551
+ newMin.push(minNum)
1552
+ let newmaxNum = Math.max.apply(Math, newMax)// 每组最大值
1553
+ let newminNum = Math.min.apply(Math, newMin)
1554
+ if (newArr.length > 1) {
1555
+ this.newCycle = newmaxNum + newminNum
1556
+ }
1557
+ if (newmaxNum === newminNum) {
1558
+ this.max = newmaxNum + newminNum
1559
+ pattern.map(d => {
1560
+ d.map(r => {
1561
+ if (r.sum) {
1562
+ delete r.sum
1563
+ }
1564
+ })
1565
+ })
1566
+ }
1567
+ if (maxNum === minNum) {
1568
+ na.map(n => {
1569
+ pattern.map(h => {
1570
+ h.map(d => {
1571
+ if (d.id === n.data[1] && d.sum) {
1572
+ delete d.sum
1573
+ }
1574
+ })
1575
+ })
1576
+ })
1577
+ } else {
1578
+ na.map(n => {
1579
+ if (n.length === maxNum) {
1580
+ pattern.map(h => {
1581
+ h.map(d => {
1582
+ if (n.data.length > 1) {
1583
+ if (d.id === n.data[1]) {
1584
+ delete d.sum
1585
+ }
1586
+ } else {
1587
+ if (d.id === n.data[0]) {
1588
+ delete d.sum
1589
+ }
1590
+ }
1591
+ })
1592
+ })
1593
+ }
1594
+ })
1595
+ }
1596
+ na.forEach((value, index, array) => {
1597
+ if (value.length !== maxNum) {
1598
+ let newNa = []
1599
+ newNa.push(value)
1600
+ newNa.forEach(m => {
1601
+ let sum = Number(maxNum - m.length)
1602
+ pattern.filter((i) => {
1603
+ i.map(j => {
1604
+ if (m.data.length > 1) {
1605
+ if (j.id === m.data[1]) {
1606
+ j.sum = sum
1607
+ }
1608
+ } else {
1609
+ if (j.id === m.data[0]) {
1610
+ j.sum = sum
1611
+ }
1612
+ }
1613
+ })
1614
+ })
1615
+ })
1616
+ }
1617
+ let mapAdd = pattern.map(item => {
1618
+ return item.map(val => {
1619
+ return val.value + (val.sum ? val.sum : 0)
1620
+ })
1621
+ })
1622
+ let maxCycle = mapAdd.length > 0 ? mapAdd.map(item => {
1623
+ return item.length > 0 ? item.reduce((a, b) => {
1624
+ return a + b
1625
+ }) : 0
1626
+ }) : 0
1627
+ this.max = Math.max(...maxCycle)// 每个环的周期最大值
1628
+ })
1629
+ })
1630
+ }
1631
+ }
1632
+ }
1633
+ </script>
1634
+ <style lang="scss">
1635
+ // el-tooltip样式
1636
+ .el-tooltip__popper.is-light {
1637
+ background: #299BCC !important;
1638
+ border: 1px solid #299BCC !important;
1639
+ color: #FFFFFF !important;
1640
+ }
1641
+ .el-tooltip__popper.is-light[x-placement^="top"] .popper__arrow {
1642
+ border-top-color: #299BCC !important;
1643
+ }
1644
+ .el-tooltip__popper.is-light[x-placement^="top"] .popper__arrow::after {
1645
+ border-top-color: #299BCC !important;
1646
+ }
1647
+ </style>
1648
+ <style lang="scss" scoped>
1649
+ .main-patternstatus {
1650
+ position: relative;
1651
+ /* margin-bottom: 20px; */
1652
+ }
1653
+ .main-patternstatus {
1654
+ position: relative;
1655
+ .ring-first {
1656
+ margin-top: 1px;
1657
+ width: 100%;
1658
+ height: 35px;
1659
+ .hovercell {
1660
+ box-sizing: border-box;
1661
+ border: 1PX solid transparent;
1662
+ }
1663
+ .hovercell:hover {
1664
+ margin-top: 1PX;
1665
+ border: 1PX solid rgb(242, 121, 121);
1666
+ }
1667
+ }
1668
+ .first-1 {
1669
+ float: left;
1670
+ // text-align: center;
1671
+ }
1672
+ // .ring-num {
1673
+ // float: left;
1674
+ // margin-top:7px;
1675
+ // margin-left: 5px;
1676
+ // font-size: 14px;
1677
+ // font-weight: normal;
1678
+ // font-stretch: normal;
1679
+ // line-height: 22px;
1680
+ // letter-spacing: 0px;
1681
+ // color: #ffffff;
1682
+ // }
1683
+ .box {
1684
+ text-align: center;
1685
+ // float: left;
1686
+ // margin-left: 6px;
1687
+ // margin-right: 10px;
1688
+ }
1689
+ .ring-nums {
1690
+ // float: left;
1691
+ // margin-top:7px;
1692
+ // margin-left: 5px;
1693
+ font-size: 12px;
1694
+ height: 14px;
1695
+ font-weight: normal;
1696
+ font-stretch: normal;
1697
+ // line-height: 22px;
1698
+ letter-spacing: 0px;
1699
+ color: #333333;
1700
+ }
1701
+ .ring-phase {
1702
+ position: relative;
1703
+ float: left;
1704
+ // margin-left: 5px;
1705
+ height: 34px;
1706
+ width: 36px;
1707
+ z-index: 999;
1708
+ background: rgba(30, 96, 12, 0.2);
1709
+ // margin-top:1px;
1710
+ }
1711
+ .ring-phase::after {
1712
+ position: absolute;
1713
+ display: block;
1714
+ content: '';
1715
+ height: 0;
1716
+ width: 0;
1717
+ top: 11px;
1718
+ left: 36px;
1719
+ border: 5px solid transparent;
1720
+ border-left-color: rgba(30, 96, 12, 0.2);
1721
+ }
1722
+ // .divider {
1723
+ // position: absolute;
1724
+ // top: -10px;
1725
+ // // left: 370px;
1726
+ // width: 2px;
1727
+ // // height: 99px;
1728
+ // z-index: 999;
1729
+ // background-color:#B9BABF;
1730
+ // }
1731
+ // .curTimeLine {
1732
+ // position: absolute;
1733
+ // top: -10px;
1734
+ // width: 4px;
1735
+ // background-color: black;
1736
+ // }
1737
+ // .curTimeDiv {
1738
+ // position: absolute;
1739
+ // z-index:50;
1740
+ // top: -21px;
1741
+ // margin-left: -10px;
1742
+ // text-align:center;
1743
+ // vertical-align: middle;
1744
+ // width: 60px;
1745
+ // height: 19px;
1746
+ // color:black;
1747
+ // // background-color: black;
1748
+ // }
1749
+ }
1750
+ .ring-first {
1751
+ margin-top: 1px;
1752
+ width: 100%;
1753
+ height: 35px;
1754
+ .hovercell {
1755
+ box-sizing: border-box;
1756
+ border: 1PX solid transparent;
1757
+ }
1758
+ .hovercell:hover {
1759
+ margin-top: 1PX;
1760
+ border: 1PX solid rgb(242, 121, 121);
1761
+ }
1762
+ }
1763
+ .direction {
1764
+ filter: brightness(70%);
1765
+ }
1766
+ .mask {
1767
+ background: rgb(242, 121, 121) !important;
1768
+ }
1769
+ .yellowClass {
1770
+ background: #f9dc6a !important;
1771
+ }
1772
+ .first-1 {
1773
+ float: left;
1774
+ // text-align: center;
1775
+ }
1776
+ </style>