openatc-components 0.5.6 → 0.5.8

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 (421) 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 +120 -120
  15. package/build/webpack.dev.conf.js +95 -95
  16. package/build/webpack.prod.conf.js +149 -149
  17. package/config/prod.env.js +5 -5
  18. package/config/test.env.js +7 -7
  19. package/index.html +12 -12
  20. package/package/kisscomps/components/BoardCard/BoardCard.vue +8 -0
  21. package/package/kisscomps/components/ChannelRealtimeIntersection/ChannelRealtimeIntersection.vue +27 -3
  22. package/package/kisscomps/components/Channelization/Channelization.vue +585 -585
  23. package/package/kisscomps/components/ChannelizationFlowStatistic/ChannelizationFlowStatistic.vue +360 -360
  24. package/package/kisscomps/components/ChannelizationWithInterface/ChannelizationWithInterface.vue +518 -518
  25. package/package/kisscomps/components/CommonKanban/CommonKanban.vue +132 -132
  26. package/package/kisscomps/components/DirectionListConfiguration/DirectionListConfiguration.vue +2 -2
  27. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-east-bottom.vue +41 -41
  28. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-east-top.vue +60 -60
  29. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-ewped.vue +105 -105
  30. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-north-left.vue +60 -60
  31. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-north-right.vue +60 -60
  32. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-snped.vue +105 -105
  33. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-south-left.vue +60 -60
  34. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-south-right.vue +60 -60
  35. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-west-bottom.vue +60 -60
  36. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-west-top.vue +60 -60
  37. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-xlped.vue +30 -30
  38. package/package/kisscomps/components/DirectionListConfiguration/svg/ped-xrped.vue +30 -30
  39. package/package/kisscomps/components/DirectionListConfiguration/svg/pedSvg.vue +78 -78
  40. package/package/kisscomps/components/DrawChannelization/drawsvg/basicCoordInfo.vue +181 -181
  41. package/package/kisscomps/components/DrawChannelization/drawsvg/channelizationElements.vue +255 -255
  42. package/package/kisscomps/components/DrawChannelization/drawsvg/detectorAssociatedComponent.vue +152 -152
  43. package/package/kisscomps/components/DrawChannelization/drawsvg/drawElement/TextBox.vue +91 -91
  44. package/package/kisscomps/components/DrawChannelization/drawsvg/drawElement/crossMap.vue +194 -194
  45. package/package/kisscomps/components/DrawChannelization/drawsvg/drawElement/editText.vue +108 -108
  46. package/package/kisscomps/components/DrawChannelization/drawsvg/firstImportCrossmap.vue +51 -51
  47. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/countdownSvg.vue +236 -236
  48. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorChart.vue +247 -247
  49. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorIconSvg.vue +210 -210
  50. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/laneIcon.vue +72 -72
  51. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/motorwayIconSvg.vue +368 -368
  52. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/pedroadIconSvg.vue +230 -230
  53. package/package/kisscomps/components/DrawChannelization/drawsvg/importDialog.vue +74 -74
  54. package/package/kisscomps/components/DrawChannelization/drawsvg/index.draw.vue +64 -19
  55. package/package/kisscomps/components/DrawChannelization/drawsvg/index.vue +144 -144
  56. package/package/kisscomps/components/DrawChannelization/drawsvg/laneEditPanel.vue +707 -707
  57. package/package/kisscomps/components/DrawChannelization/drawsvg/overlapAssociatedComponent.vue +172 -172
  58. package/package/kisscomps/components/DrawChannelization/drawsvg/phaseAssociatedComponent.vue +2 -2
  59. package/package/kisscomps/components/DrawChannelization/drawsvg/table.vue +99 -99
  60. package/package/kisscomps/components/DrawChannelization/drawsvg/utils/loadutils.js +87 -87
  61. package/package/kisscomps/components/DrawChannelization/drawsvg/utils/phaseDataModel.js +32 -32
  62. package/package/kisscomps/components/DrawChannelization/drawsvg/utils/phasePos.json +20 -20
  63. package/package/kisscomps/components/DrawChannelization/phaseDataMgr.js +278 -278
  64. package/package/kisscomps/components/ExpendConfig/ExpendConfig.vue +118 -118
  65. package/package/kisscomps/components/FaultDetailModal/FaultDetailModal.vue +178 -178
  66. package/package/kisscomps/components/IntersectionDirectionSelection/IntersectionDirectionSelection.vue +13 -6
  67. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/CrossRoadsSvg.vue +629 -629
  68. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/CustomRoadsSvg.vue +46 -46
  69. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionEWSvg.vue +447 -447
  70. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionSNSvg.vue +341 -341
  71. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampEastSvg.vue +497 -497
  72. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampNorthSvg.vue +353 -353
  73. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampSouthSvg.vue +359 -359
  74. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampWestSvg.vue +443 -443
  75. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/SidewalkClickSvg.vue +4 -2
  76. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/SidewalkSvg.vue +1190 -1190
  77. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeEastRoadsSvg.vue +498 -498
  78. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeNorthRoadsSvg.vue +484 -484
  79. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeSouthRoadsSvg.vue +488 -488
  80. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeWestRoadsSvg.vue +566 -566
  81. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LCrossRoadsSvg.vue +640 -640
  82. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeEastRoadsSvg.vue +497 -497
  83. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeNorthRoadsSvg.vue +486 -486
  84. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeSouthRoadsSvg.vue +490 -490
  85. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeWestRoadsSvg.vue +575 -575
  86. package/package/kisscomps/components/IntersectionMap/crossDirection/baseImg/refreshSvg.vue +63 -63
  87. package/package/kisscomps/components/IntersectionMap/crossDirection/busIcon/busMapSvg.vue +50 -50
  88. package/package/kisscomps/components/IntersectionMap/crossDirection/busIcon/eastBusSvg.vue +167 -167
  89. package/package/kisscomps/components/IntersectionMap/crossDirection/busIcon/northBusSvg.vue +168 -168
  90. package/package/kisscomps/components/IntersectionMap/crossDirection/busIcon/southBusSvg.vue +168 -168
  91. package/package/kisscomps/components/IntersectionMap/crossDirection/busIcon/westBusSvg.vue +169 -169
  92. package/package/kisscomps/components/IntersectionMap/crossDirection/crossDiagram.vue +59 -18
  93. package/package/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/LphaseIconSvg.vue +197 -197
  94. package/package/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/rampPhaseIconSvg.vue +122 -122
  95. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.json +196 -196
  96. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.left.json +196 -196
  97. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.json +0 -16
  98. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.left.json +115 -115
  99. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/rampPos.json +52 -52
  100. package/package/kisscomps/components/IntersectionMap/crossDirection/posJson/sidePos.json +0 -16
  101. package/package/kisscomps/components/IntersectionMap/intersectionmap.vue +10 -0
  102. package/package/kisscomps/components/IntersectionWithInterface/IntersectionWithInterface.vue +534 -534
  103. package/package/kisscomps/components/KanBan/kanban.vue +231 -231
  104. package/package/kisscomps/components/MessageBox/index.vue +96 -96
  105. package/package/kisscomps/components/OverviewComponent/index.vue +40 -7
  106. package/package/kisscomps/components/PatternOptimize/PatternOptimize.vue +329 -329
  107. package/package/kisscomps/components/PatternStatus/PatternStatus.vue +203 -3
  108. package/package/kisscomps/components/PatternWalkSvg/PatternWalkSvg.vue +423 -423
  109. package/package/kisscomps/components/PhaseDirectionSelect/PhaseDirectionSelect.vue +126 -126
  110. package/package/kisscomps/components/PhaseDirectionText/PhaseDirectionText.vue +106 -106
  111. package/package/kisscomps/components/PhaseLegend/PhaseLegend.vue +286 -286
  112. package/package/kisscomps/components/PhaseMarker/index.js +6 -6
  113. package/package/kisscomps/components/PhaseMarker/phasemarker.vue +215 -215
  114. package/package/kisscomps/components/PhaseMarker/svg/patternSvg.vue +121 -121
  115. package/package/kisscomps/components/PhaseMarker/svg/phase.vue +60 -60
  116. package/package/kisscomps/components/PhaseMarker/svg/phaseCount.vue +62 -62
  117. package/package/kisscomps/components/PhaseMarker/svg/phaseCountCycle.vue +62 -62
  118. package/package/kisscomps/components/PhaseMarker/svg/phaseSvg.vue +117 -117
  119. package/package/kisscomps/components/PhasePedSelect/index.vue +206 -206
  120. package/package/kisscomps/components/SchemeConfig/SchemeConfig.vue +46 -7
  121. package/package/kisscomps/components/SchemeConfig/azimuthlocking/index.vue +365 -365
  122. package/package/kisscomps/components/SchemeConfig/azimuthlocking/utils.js +92 -92
  123. package/package/kisscomps/components/SchemeConfig/closePhaselControlModal/index.vue +214 -214
  124. package/package/kisscomps/components/SchemeConfig/lockingPhaselControlModal/index.vue +235 -235
  125. package/package/kisscomps/components/SchemeConfig/manualControlModal/index.vue +235 -235
  126. package/package/kisscomps/components/SchemeConfig/manualControlModalNew/controlModelGroup.vue +131 -131
  127. package/package/kisscomps/components/SchemeConfig/manualControlModalNew/index.vue +874 -871
  128. package/package/kisscomps/components/SchemeConfig/manualControlModalNew/othersIcon.vue +151 -151
  129. package/package/kisscomps/components/SchemeConfig/priorityControl/index.vue +215 -215
  130. package/package/kisscomps/components/SchemeConfig/priorityControl/utils.js +163 -163
  131. package/package/kisscomps/components/SchemeConfig/realtimeStatusModal/index.vue +308 -308
  132. package/package/kisscomps/components/SchemeConfig/tentativeplancontrolmodal/index.vue +19 -0
  133. package/package/kisscomps/components/SchemeConfig/utils/thirdPartypermission.js +95 -95
  134. package/package/kisscomps/components/SelectCrossPhase/index.vue +1 -1
  135. package/package/kisscomps/components/SelectCrossPhase/utils.js +142 -142
  136. package/package/kisscomps/components/StageOptimize/StageOptimize.vue +367 -367
  137. package/package/kisscomps/components/StageOptimize/index.js +2 -2
  138. package/package/kisscomps/components/StageStatus/StageStatus.vue +341 -341
  139. package/package/kisscomps/components/SvgIcon/SvgIcon.vue +53 -53
  140. package/package/kisscomps/components/XRDDirSelector/XRDDirSelector.vue +1041 -1041
  141. package/package/kisscomps/components/XiaoKanban/DirSelector.vue +356 -356
  142. package/package/kisscomps/components/XiaoKanban/index.vue +122 -122
  143. package/package/kisscomps/components/overView/index.vue +30 -7
  144. package/package/kisscomps/components/patternConfig/index.vue +12 -4
  145. package/package/kisscomps/components/patternConfig/pattern/planChart/model/coordinationModel.js +665 -665
  146. package/package/kisscomps/components/patternConfig/planContent.vue +604 -604
  147. package/package/kisscomps/components/patternConfig/planMenu.vue +329 -329
  148. package/package/kisscomps/components/patternConfig/utils.js +152 -84
  149. package/package/kisscomps/components/patternList/patternList.vue +8 -0
  150. package/package/kisscomps/index.js +2 -6
  151. package/package/kissui.min.js +1 -1
  152. package/package.json +1 -1
  153. package/src/App.vue +24 -20
  154. package/src/EdgeMgr/EdgeModelBase.js +16 -16
  155. package/src/EdgeMgr/controller/crossDiagramMgr.js +125 -125
  156. package/src/api/authapi.js +31 -31
  157. package/src/api/config.js +21 -21
  158. package/src/api/control.js +110 -110
  159. package/src/api/device.js +135 -135
  160. package/src/api/fault.js +66 -66
  161. package/src/api/index.js +24 -24
  162. package/src/api/login.js +46 -46
  163. package/src/api/optimize.js +72 -72
  164. package/src/api/param.js +165 -165
  165. package/src/api/passwdAssest.js +101 -101
  166. package/src/api/permission.js +33 -33
  167. package/src/api/route.js +171 -171
  168. package/src/api/template.js +27 -27
  169. package/src/assets/font/LICENSE.txt +202 -202
  170. package/src/assets/font/font.css +6 -6
  171. package/src/i18n/index.js +26 -26
  172. package/src/i18n/language/en.js +30 -114
  173. package/src/i18n/language/index.js +25 -31
  174. package/src/i18n/language/zh.js +31 -115
  175. package/src/icons/index.js +20 -20
  176. package/src/icons/svg/azimuthlocking.svg +26 -26
  177. package/src/icons/svg/bendi.svg +110 -110
  178. package/src/icons/svg/bujin.svg +36 -36
  179. package/src/icons/svg/connectBlue.svg +7 -7
  180. package/src/icons/svg/currentvolume.svg +0 -0
  181. package/src/icons/svg/custom-BRTlane.svg +40 -40
  182. package/src/icons/svg/custom-buslane.svg +40 -40
  183. package/src/icons/svg/custom-detector.svg +12 -12
  184. package/src/icons/svg/custom-east-bottom.svg +32 -32
  185. package/src/icons/svg/custom-east-top.svg +32 -32
  186. package/src/icons/svg/custom-ewped.svg +35 -35
  187. package/src/icons/svg/custom-nonmotorizedlane.svg +40 -40
  188. package/src/icons/svg/custom-north-left.svg +32 -32
  189. package/src/icons/svg/custom-north-right.svg +32 -32
  190. package/src/icons/svg/custom-peddetector.svg +17 -17
  191. package/src/icons/svg/custom-snped.svg +35 -35
  192. package/src/icons/svg/custom-south-left.svg +32 -32
  193. package/src/icons/svg/custom-south-right.svg +32 -32
  194. package/src/icons/svg/custom-tramlane.svg +40 -40
  195. package/src/icons/svg/custom-vehiclebranch.svg +40 -40
  196. package/src/icons/svg/custom-vehiclemainroad.svg +41 -41
  197. package/src/icons/svg/custom-west-bottom.svg +32 -32
  198. package/src/icons/svg/custom-west-top.svg +32 -32
  199. package/src/icons/svg/custom-xlped.svg +14 -14
  200. package/src/icons/svg/custom-xrped.svg +14 -14
  201. package/src/icons/svg/cutRed.svg +7 -7
  202. package/src/icons/svg/cycle.svg +0 -0
  203. package/src/icons/svg/dingzhouqi.svg +34 -34
  204. package/src/icons/svg/ganyingkongzhi.svg +30 -30
  205. package/src/icons/svg/guandeng.svg +81 -81
  206. package/src/icons/svg/huangshan.svg +71 -71
  207. package/src/icons/svg/maincontrol.svg +0 -0
  208. package/src/icons/svg/manualcontrolbackground.svg +51 -51
  209. package/src/icons/svg/manualcontrolbackground1.svg +62 -62
  210. package/src/icons/svg/manualcontrolbackgrounden.svg +62 -62
  211. package/src/icons/svg/model.svg +0 -0
  212. package/src/icons/svg/phasediff.svg +0 -0
  213. package/src/icons/svg/prioritycontrol.svg +21 -21
  214. package/src/icons/svg/quanhong.svg +86 -86
  215. package/src/icons/svg/shanghe.svg +11 -11
  216. package/src/icons/svg/shoudong.svg +103 -103
  217. package/src/icons/svg/tentativeplan.svg +28 -28
  218. package/src/icons/svg/time.svg +0 -0
  219. package/src/icons/svg/wuxianlan.svg +46 -46
  220. package/src/icons/svg/xiala.svg +11 -11
  221. package/src/icons/svg/xingrenguojie.svg +33 -33
  222. package/src/icons/svg/xitong.svg +89 -89
  223. package/src/icons/svg/youxian.svg +41 -41
  224. package/src/icons/svg/zizhukongzhi.svg +43 -43
  225. package/src/kisscomps/components/BoardCard/BoardCard.vue +8 -0
  226. package/src/kisscomps/components/ChannelRealtimeIntersection/ChannelRealtimeIntersection.vue +27 -3
  227. package/src/kisscomps/components/Channelization/Channelization.vue +585 -585
  228. package/src/kisscomps/components/ChannelizationFlowStatistic/ChannelizationFlowStatistic.vue +360 -360
  229. package/src/kisscomps/components/ChannelizationWithInterface/ChannelizationWithInterface.vue +518 -518
  230. package/src/kisscomps/components/CommonKanban/CommonKanban.vue +132 -132
  231. package/src/kisscomps/components/DirectionListConfiguration/DirectionListConfiguration.vue +2 -2
  232. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-east-bottom.vue +41 -41
  233. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-east-top.vue +60 -60
  234. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-ewped.vue +105 -105
  235. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-north-left.vue +60 -60
  236. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-north-right.vue +60 -60
  237. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-snped.vue +105 -105
  238. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-south-left.vue +60 -60
  239. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-south-right.vue +60 -60
  240. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-west-bottom.vue +60 -60
  241. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-west-top.vue +60 -60
  242. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-xlped.vue +30 -30
  243. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-xrped.vue +30 -30
  244. package/src/kisscomps/components/DirectionListConfiguration/svg/pedSvg.vue +78 -78
  245. package/src/kisscomps/components/DrawChannelization/drawsvg/basicCoordInfo.vue +181 -181
  246. package/src/kisscomps/components/DrawChannelization/drawsvg/channelizationElements.vue +255 -255
  247. package/src/kisscomps/components/DrawChannelization/drawsvg/detectorAssociatedComponent.vue +152 -152
  248. package/src/kisscomps/components/DrawChannelization/drawsvg/drawElement/TextBox.vue +91 -91
  249. package/src/kisscomps/components/DrawChannelization/drawsvg/drawElement/crossMap.vue +194 -194
  250. package/src/kisscomps/components/DrawChannelization/drawsvg/drawElement/editText.vue +108 -108
  251. package/src/kisscomps/components/DrawChannelization/drawsvg/firstImportCrossmap.vue +51 -51
  252. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/countdownSvg.vue +236 -236
  253. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorChart.vue +247 -247
  254. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorIconSvg.vue +210 -210
  255. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/laneIcon.vue +72 -72
  256. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/motorwayIconSvg.vue +368 -368
  257. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/pedroadIconSvg.vue +230 -230
  258. package/src/kisscomps/components/DrawChannelization/drawsvg/importDialog.vue +74 -74
  259. package/src/kisscomps/components/DrawChannelization/drawsvg/index.draw.vue +64 -19
  260. package/src/kisscomps/components/DrawChannelization/drawsvg/index.vue +144 -144
  261. package/src/kisscomps/components/DrawChannelization/drawsvg/laneEditPanel.vue +707 -707
  262. package/src/kisscomps/components/DrawChannelization/drawsvg/overlapAssociatedComponent.vue +172 -172
  263. package/src/kisscomps/components/DrawChannelization/drawsvg/phaseAssociatedComponent.vue +2 -2
  264. package/src/kisscomps/components/DrawChannelization/drawsvg/table.vue +99 -99
  265. package/src/kisscomps/components/DrawChannelization/drawsvg/utils/loadutils.js +87 -87
  266. package/src/kisscomps/components/DrawChannelization/drawsvg/utils/phaseDataModel.js +32 -32
  267. package/src/kisscomps/components/DrawChannelization/drawsvg/utils/phasePos.json +20 -20
  268. package/src/kisscomps/components/DrawChannelization/phaseDataMgr.js +278 -278
  269. package/src/kisscomps/components/ExpendConfig/ExpendConfig.vue +118 -118
  270. package/src/kisscomps/components/FaultDetailModal/FaultDetailModal.vue +178 -178
  271. package/src/kisscomps/components/IntersectionDirectionSelection/IntersectionDirectionSelection.vue +13 -6
  272. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/CrossRoadsSvg.vue +629 -629
  273. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/CustomRoadsSvg.vue +46 -46
  274. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionEWSvg.vue +447 -447
  275. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionSNSvg.vue +341 -341
  276. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampEastSvg.vue +497 -497
  277. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampNorthSvg.vue +353 -353
  278. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampSouthSvg.vue +359 -359
  279. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampWestSvg.vue +443 -443
  280. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/SidewalkClickSvg.vue +4 -2
  281. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/SidewalkSvg.vue +1190 -1190
  282. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeEastRoadsSvg.vue +498 -498
  283. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeNorthRoadsSvg.vue +484 -484
  284. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeSouthRoadsSvg.vue +488 -488
  285. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeWestRoadsSvg.vue +566 -566
  286. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LCrossRoadsSvg.vue +640 -640
  287. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeEastRoadsSvg.vue +497 -497
  288. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeNorthRoadsSvg.vue +486 -486
  289. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeSouthRoadsSvg.vue +490 -490
  290. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeWestRoadsSvg.vue +575 -575
  291. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/refreshSvg.vue +63 -63
  292. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/busMapSvg.vue +50 -50
  293. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/eastBusSvg.vue +167 -167
  294. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/northBusSvg.vue +168 -168
  295. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/southBusSvg.vue +168 -168
  296. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/westBusSvg.vue +169 -169
  297. package/src/kisscomps/components/IntersectionMap/crossDirection/crossDiagram.vue +59 -18
  298. package/src/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/LphaseIconSvg.vue +197 -197
  299. package/src/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/rampPhaseIconSvg.vue +122 -122
  300. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.json +196 -196
  301. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.left.json +196 -196
  302. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.json +0 -16
  303. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.left.json +115 -115
  304. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/rampPos.json +52 -52
  305. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/sidePos.json +0 -16
  306. package/src/kisscomps/components/IntersectionMap/intersectionmap.vue +10 -0
  307. package/src/kisscomps/components/IntersectionWithInterface/IntersectionWithInterface.vue +534 -534
  308. package/src/kisscomps/components/KanBan/kanban.vue +231 -231
  309. package/src/kisscomps/components/MessageBox/index.vue +96 -96
  310. package/src/kisscomps/components/OverviewComponent/index.vue +40 -7
  311. package/src/kisscomps/components/PatternOptimize/PatternOptimize.vue +329 -329
  312. package/src/kisscomps/components/PatternStatus/PatternStatus.vue +203 -3
  313. package/src/kisscomps/components/PatternWalkSvg/PatternWalkSvg.vue +423 -423
  314. package/src/kisscomps/components/PhaseDirectionSelect/PhaseDirectionSelect.vue +126 -126
  315. package/src/kisscomps/components/PhaseDirectionText/PhaseDirectionText.vue +106 -106
  316. package/src/kisscomps/components/PhaseLegend/PhaseLegend.vue +286 -286
  317. package/src/kisscomps/components/PhaseMarker/index.js +6 -6
  318. package/src/kisscomps/components/PhaseMarker/phasemarker.vue +215 -215
  319. package/src/kisscomps/components/PhaseMarker/svg/patternSvg.vue +121 -121
  320. package/src/kisscomps/components/PhaseMarker/svg/phase.vue +60 -60
  321. package/src/kisscomps/components/PhaseMarker/svg/phaseCount.vue +62 -62
  322. package/src/kisscomps/components/PhaseMarker/svg/phaseCountCycle.vue +62 -62
  323. package/src/kisscomps/components/PhaseMarker/svg/phaseSvg.vue +117 -117
  324. package/src/kisscomps/components/PhasePedSelect/index.vue +206 -206
  325. package/src/kisscomps/components/SchemeConfig/SchemeConfig.vue +46 -7
  326. package/src/kisscomps/components/SchemeConfig/azimuthlocking/index.vue +365 -365
  327. package/src/kisscomps/components/SchemeConfig/azimuthlocking/utils.js +92 -92
  328. package/src/kisscomps/components/SchemeConfig/closePhaselControlModal/index.vue +214 -214
  329. package/src/kisscomps/components/SchemeConfig/lockingPhaselControlModal/index.vue +235 -235
  330. package/src/kisscomps/components/SchemeConfig/manualControlModal/index.vue +235 -235
  331. package/src/kisscomps/components/SchemeConfig/manualControlModalNew/controlModelGroup.vue +131 -131
  332. package/src/kisscomps/components/SchemeConfig/manualControlModalNew/index.vue +874 -871
  333. package/src/kisscomps/components/SchemeConfig/manualControlModalNew/othersIcon.vue +151 -151
  334. package/src/kisscomps/components/SchemeConfig/priorityControl/index.vue +215 -215
  335. package/src/kisscomps/components/SchemeConfig/priorityControl/utils.js +163 -163
  336. package/src/kisscomps/components/SchemeConfig/realtimeStatusModal/index.vue +308 -308
  337. package/src/kisscomps/components/SchemeConfig/tentativeplancontrolmodal/index.vue +19 -0
  338. package/src/kisscomps/components/SchemeConfig/utils/thirdPartypermission.js +95 -95
  339. package/src/kisscomps/components/SelectCrossPhase/index.vue +1 -1
  340. package/src/kisscomps/components/SelectCrossPhase/utils.js +142 -142
  341. package/src/kisscomps/components/StageOptimize/StageOptimize.vue +367 -367
  342. package/src/kisscomps/components/StageOptimize/index.js +2 -2
  343. package/src/kisscomps/components/StageStatus/StageStatus.vue +341 -341
  344. package/src/kisscomps/components/SvgIcon/SvgIcon.vue +53 -53
  345. package/src/kisscomps/components/XRDDirSelector/XRDDirSelector.vue +1041 -1041
  346. package/src/kisscomps/components/XiaoKanban/DirSelector.vue +356 -356
  347. package/src/kisscomps/components/XiaoKanban/index.vue +122 -122
  348. package/src/kisscomps/components/overView/index.vue +30 -7
  349. package/src/kisscomps/components/patternConfig/index.vue +12 -4
  350. package/src/kisscomps/components/patternConfig/pattern/planChart/model/coordinationModel.js +665 -665
  351. package/src/kisscomps/components/patternConfig/planContent.vue +604 -604
  352. package/src/kisscomps/components/patternConfig/planMenu.vue +329 -329
  353. package/src/kisscomps/components/patternConfig/utils.js +152 -84
  354. package/src/kisscomps/components/patternList/patternList.vue +8 -0
  355. package/src/kisscomps/index.js +2 -6
  356. package/src/lib/publicjs/ArryListUtil.js +38 -38
  357. package/src/lib/publicjs/HttpurlMgr.js +45 -45
  358. package/src/lib/publicjs/KissApi.js +158 -158
  359. package/src/lib/publicjs/KissWSSub/Heartcheck.js +128 -128
  360. package/src/lib/publicjs/KissWSSub/KissWsSub.js +91 -91
  361. package/src/lib/publicjs/KissWSSub/KissWsSubByType.js +152 -152
  362. package/src/lib/publicjs/KissWSSub/SimuWsSubByType.js +44 -44
  363. package/src/lib/publicjs/KissWSSub/Sub.js +51 -51
  364. package/src/lib/publicjs/KissWSSub/SubChannel.js +119 -119
  365. package/src/lib/publicjs/basecomponents.js +65 -65
  366. package/src/lib/publicjs/localStorage.js +112 -112
  367. package/src/lib/publicjs/objdeepcopy.js +32 -32
  368. package/src/lib/publicjs/pageScroll.js +30 -30
  369. package/src/lib/publicjs/passwdAssest.js +101 -101
  370. package/src/lib/publicjs/styleclassfactory.js +32 -32
  371. package/src/router/index.js +63 -63
  372. package/src/store/index.js +26 -26
  373. package/src/store/modules/globalParam.js +67 -67
  374. package/src/utils/ControlFormat.js +36 -14
  375. package/src/utils/RingDataModel.js +335 -335
  376. package/src/utils/auth.js +199 -199
  377. package/src/utils/conflictList.js +87 -87
  378. package/src/utils/dateFormat.js +41 -41
  379. package/src/utils/fault.js +72 -20
  380. package/src/utils/faultcode.js +182 -130
  381. package/src/utils/index.js +69 -69
  382. package/src/utils/pedphasedesc.js +105 -80
  383. package/src/utils/phaseList.js +203 -203
  384. package/src/utils/phasedesc.js +115 -133
  385. package/src/utils/responseMessage.js +21 -24
  386. package/src/utils/validate.js +43 -43
  387. package/src/views/customchannelization.vue +6 -6
  388. package/src/views/home.1.vue +479 -479
  389. package/src/views/home.vue +93 -93
  390. package/src/views/intersection.vue +11 -5
  391. package/src/views/intersection2.vue +328 -328
  392. package/src/views/overView.vue +63 -63
  393. package/src/views/patternConfig.vue +2 -2
  394. package/src/views/schemeconfig.vue +3 -2
  395. package/static/styles/channelizatioon.scss +433 -433
  396. package/static/styles/common.scss +30 -30
  397. package/static/styles/commonkanban.scss +168 -168
  398. package/static/styles/dark/index.scss +2 -2
  399. package/static/styles/dark/theme/element-dark.scss +44 -44
  400. package/static/styles/index.scss +84 -84
  401. package/static/styles/intersection.scss +180 -180
  402. package/static/styles/light/index.scss +2 -2
  403. package/static/styles/light/theme/element-light.scss +44 -44
  404. package/static/styles/overview.scss +146 -146
  405. package/static/styles/patternConfig.scss +56 -56
  406. package/static/styles/phasePedSelect.scss +71 -71
  407. package/static/styles/stages.scss +57 -57
  408. package/static/styles/uiComponents.scss +57 -57
  409. package/static/styles/xiaokanban.scss +61 -61
  410. package/static/token.json +2 -2
  411. package/test/e2e/custom-assertions/elementCount.js +27 -27
  412. package/test/e2e/nightwatch.conf.js +46 -46
  413. package/test/e2e/runner.js +48 -48
  414. package/test/e2e/specs/test.js +19 -19
  415. package/test/unit/.eslintrc +7 -7
  416. package/test/unit/jest.conf.js +30 -30
  417. package/test/unit/setup.js +3 -3
  418. package/test/unit/specs/HelloWorld.spec.js +11 -11
  419. package/package/kissui.js +0 -216608
  420. package/pnpm-lock.yaml +0 -16362
  421. package/src/i18n/language/ru.js +0 -1563
@@ -1,871 +1,874 @@
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="manual-control-modal-new">
14
- <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
15
- <el-tab-pane :label="$t('openatccomponents.overview.residentcontrol')" name="residentcontrol"
16
- v-if="(funcSort === 'allFunc' || (funcSort === 'thirdPartyFunc'&& thirdPartyControlMenu.indexOf('residentcontrol') !== -1))">
17
- <ControlModelGroup
18
- v-if="activeName === 'residentcontrol'"
19
- ref="ControlModelGroup"
20
- className="residentcontrol"
21
- :controlList="residentControlList"
22
- :funcSort="funcSort"
23
- :thirdPartyControl="thirdPartyControl"
24
- @selectModel="selectModel"
25
- />
26
-
27
- <div class="common-config" v-if="activeName === 'residentcontrol' && preselecttype !== '相位锁定' && preselecttype !== '方向锁定'">
28
- <el-form
29
- v-if="isHasPermission('configer:manual:dwell')"
30
- ref="manual"
31
- label-position="left"
32
- :model="manualInfo"
33
- label-width="90px">
34
- <el-form-item
35
- :label="$t('openatccomponents.overview.duration')"
36
- prop="count">
37
- <el-input-number style="width: 170px;" v-model="manualInfo.tempDuration" :controls="false" :max="65535" :min="0" :precision="0" :step="1" :placeholder="$t('openatccomponents.common.input')" size="small"></el-input-number>
38
- </el-form-item>
39
- </el-form>
40
- </div>
41
-
42
- <div class="stage-part" v-if="preselecttype === '阶段锁定'">
43
- <div class="stage-label">{{$t('openatccomponents.overview.stage')}}</div>
44
- <div style="width: 100%; height: auto;overflow: hidden;" v-if="isHasPermission('configer:manual:dwell')">
45
- <Stages :crossStatusData="manuals?manualsStage:realtimeStage"
46
- :phaseList="phaseList"
47
- :preselectStages="preselectStages"
48
- :preselectModel="preselectModel"
49
- :isShowCurrentStage="false"
50
- @onSelectStages="selectStages"></Stages>
51
- </div>
52
- </div>
53
-
54
- <LockingPhaseControlModal
55
- v-if="preselecttype === '相位锁定'"
56
- :roadDirection="roadDirection"
57
- :phaseList="phaseList"
58
- :patternStatus="statusData"
59
- :isShowBack="isShowBack"
60
- :isShowRecovery="isShowRecovery"
61
- :isShowImplement="isShowImplement"
62
- @closePhaseBack="handleClose"
63
- @closePhaseControl="closePhaseControl"
64
- @toAutoControl="toAutoControl" />
65
-
66
- <AzimuthLocking
67
- v-if="preselecttype === '方向锁定' && isShowImplement"
68
- :realtimeStatusModalvisible="realtimeStatusModalvisible"
69
- :phaseList="phaseList"
70
- :patternStatus="statusData"
71
- :isShowBack="isShowBack"
72
- :isShowRecovery="isShowRecovery"
73
- :isShowImplement="isShowImplement"
74
- @closePhaseBack="handleClose"
75
- @toAutoControl="toAutoControl"
76
- />
77
-
78
- <div class="footer" v-if="((activeName === 'residentcontrol' && preselecttype !== '相位锁定' && preselecttype !== '方向锁定') || activeName === 'specialcontrol' || activeName === 'schemeselection')">
79
- <el-button v-if="isShowBack && realtimeStatusModalvisible" @click="handleClose()">{{$t('openatccomponents.button.Back')}}</el-button>
80
- <el-button v-if="isShowRecovery && isHasPermission('configer:manual:renew')" @click="toAutoControl()">{{$t('openatccomponents.overview.recovery')}}</el-button>
81
- <el-button v-if="isShowImplement" type="primary" @click="handleManualControl()">{{$t('openatccomponents.overview.implement')}}</el-button>
82
- <el-button v-if="!isShowImplement" type="primary" @click="handleManualControl()">{{$t('openatccomponents.overview.comfirm')}}</el-button>
83
- </div>
84
- </el-tab-pane>
85
- <el-tab-pane :label="$t('openatccomponents.overview.specialcontrol')" name="specialcontrol"
86
- v-if="(funcSort === 'allFunc' || (funcSort === 'thirdPartyFunc'&& thirdPartyControlMenu.indexOf('specialcontrol') !== -1))">
87
- <ControlModelGroup
88
- v-if="activeName === 'specialcontrol'"
89
- ref="ControlModelGroup"
90
- className="specialcontrol"
91
- :controlList="specialControlList"
92
- :funcSort="funcSort"
93
- :thirdPartyControl="thirdPartyControl"
94
- @selectModel="selectModel"
95
- />
96
-
97
- <div class="common-config" v-if="isHasPermission('configer:manual:senior')">
98
- <el-form
99
- ref="manual"
100
- label-position="left"
101
- :model="manualInfo"
102
- label-width="90px">
103
- <el-form-item
104
- :label="$t('openatccomponents.overview.duration')"
105
- prop="count">
106
- <el-input-number style="width: 170px;" v-model="manualInfo.tempDuration" :controls="false" :max="65535" :min="0" :precision="0" :step="1" :placeholder="$t('openatccomponents.common.input')" size="small"></el-input-number>
107
- </el-form-item>
108
- </el-form>
109
- </div>
110
-
111
- <div class="footer" v-if="((activeName === 'residentcontrol' && preselecttype !== '相位锁定' && preselecttype !== '方向锁定') || activeName === 'specialcontrol' || activeName === 'schemeselection')">
112
- <el-button v-if="isShowBack && realtimeStatusModalvisible" @click="handleClose()">{{$t('openatccomponents.button.Back')}}</el-button>
113
- <el-button v-if="isShowRecovery && isHasPermission('configer:manual:renew')" @click="toAutoControl()">{{$t('openatccomponents.overview.recovery')}}</el-button>
114
- <el-button v-if="isShowImplement" type="primary" @click="handleManualControl()">{{$t('openatccomponents.overview.implement')}}</el-button>
115
- <el-button v-if="!isShowImplement" type="primary" @click="handleManualControl()">{{$t('openatccomponents.overview.comfirm')}}</el-button>
116
- </div>
117
-
118
- </el-tab-pane>
119
- <el-tab-pane :label="$t('openatccomponents.overview.schemeselection')" name="schemeselection"
120
- v-if="(funcSort === 'allFunc' || (funcSort === 'thirdPartyFunc'&& thirdPartyControlMenu.indexOf('schemeselection') !== -1))">
121
- <ControlModelGroup
122
- v-if="activeName === 'schemeselection'"
123
- ref="ControlModelGroup"
124
- className="otherscontrol"
125
- :controlList="patternChooseControlList"
126
- :funcSort="funcSort"
127
- :thirdPartyControl="thirdPartyControl"
128
- @selectModel="selectModel"
129
- @selectSpecialModel="selectSpecialModel" />
130
-
131
- <div class="common-config" v-if="activeName === 'schemeselection' && isHasPermission('configer:manual:base')">
132
- <el-form
133
- ref="manual"
134
- label-position="left"
135
- :model="manualInfo"
136
- label-width="90px">
137
- <el-form-item
138
- :label="$t('openatccomponents.overview.duration')"
139
- prop="count">
140
- <el-input-number style="width: 170px;" v-model="manualInfo.tempDuration" :controls="false" :max="65535" :min="0" :precision="0" :step="1" :placeholder="$t('openatccomponents.common.input')" size="small"></el-input-number>
141
- </el-form-item>
142
- <el-form-item
143
- :label="$t('openatccomponents.overview.controlnumber')"
144
- prop="shape">
145
- <el-select style="width: 170px;" v-model="manualInfo.tempPatternid" @change="handleSelectPatternOption" class="col-inner" size="small" :placeholder="$t('openatccomponents.common.select')">
146
- <el-option
147
- v-for="item in patternSelect"
148
- :key="item.value"
149
- :label="item.label"
150
- :value="item.value">
151
- </el-option>
152
- </el-select>
153
- </el-form-item>
154
- </el-form>
155
-
156
- <div>
157
- <pattern-list
158
- :key="keyChange"
159
- :allPatternList="allPatternList"
160
- :contrloType="!this.isRing ? 'ring' : 'stage'"
161
- :stagesChange="
162
- patternOne.length === 0
163
- ? planPattern.stagesList
164
- : patternOne[0].stagesList
165
- "
166
- :patternList="patternOne.length === 0 ? planPattern.rings : patternOne"
167
- :patternStatusList="
168
- patternOne.length === 0 ? planPattern.rings : patternOne[0].rings
169
- "
170
- :cycles="
171
- patternOne.length === 0 ? planPattern.cycle : patternOne[0].cycle
172
- "
173
- :phaseList="phaseList"
174
- >
175
- </pattern-list>
176
- </div>
177
- </div>
178
-
179
- <div class="footer" v-if="((activeName === 'residentcontrol' && preselecttype !== '相位锁定' && preselecttype !== '方向锁定') || activeName === 'specialcontrol' || activeName === 'schemeselection')">
180
- <el-button v-if="isShowBack && realtimeStatusModalvisible" @click="handleClose()">{{$t('openatccomponents.button.Back')}}</el-button>
181
- <el-button v-if="isShowRecovery && isHasPermission('configer:manual:renew')" @click="toAutoControl()">{{$t('openatccomponents.overview.recovery')}}</el-button>
182
- <el-button v-if="isShowImplement" type="primary" @click="handleManualControl()">{{$t('openatccomponents.overview.implement')}}</el-button>
183
- <el-button v-if="!isShowImplement" type="primary" @click="handleManualControl()">{{$t('openatccomponents.overview.comfirm')}}</el-button>
184
- </div>
185
- </el-tab-pane>
186
- <el-tab-pane :label="$t('openatccomponents.overview.others')" name="others"
187
- v-if="(funcSort === 'allFunc' || (funcSort === 'thirdPartyFunc'&& thirdPartyControlMenu.indexOf('others') !== -1))">
188
- <ControlModelGroup
189
- v-if="activeName === 'others'"
190
- ref="ControlModelGroup"
191
- className="otherscontrol"
192
- othersControl
193
- :controlList="othersControlList"
194
- :funcSort="funcSort"
195
- :thirdPartyControl="thirdPartyControl"
196
- @selectModel="selectModel"
197
- @selectSpecialModel="selectSpecialModel"
198
- />
199
- <ClosePhaseControlModal
200
- v-if="preselecttype === '相位关断'"
201
- :controlData="controlData"
202
- :closePhaseRings="closePhaseRings"
203
- :sidewalkPhaseData="sidewalkPhaseData"
204
- :realtimeStatusModalvisible="realtimeStatusModalvisible"
205
- :roadDirection="roadDirection"
206
- :isShowBack="isShowBack"
207
- :isShowRecovery="isShowRecovery"
208
- :isShowImplement="isShowImplement"
209
- @closePhaseBack="handleClose"
210
- @closePhaseControl="closePhaseControl"
211
- @toAutoControl="toAutoControl" />
212
- <TentativePlanControlModal
213
- v-if="preselecttype === '临时方案'"
214
- :realtimeStatusModalvisible="realtimeStatusModalvisible"
215
- :controlData="controlData"
216
- :phaseList="phaseList"
217
- :overlap="overlap"
218
- :patternSelect="patternSelect"
219
- :allPatternList="allPatternList"
220
- :isShowBack="isShowBack"
221
- :isShowRecovery="isShowRecovery"
222
- :isShowImplement="isShowImplement"
223
- @closePhaseBack="handleClose"
224
- @closePhaseControl="closePhaseControl"
225
- @toAutoControl="toAutoControl"
226
- />
227
- <PriorityControl
228
- v-if="preselecttype === '优先控制'"
229
- :realtimeStatusModalvisible="realtimeStatusModalvisible"
230
- :phaseList="phaseList"
231
- :isShowBack="isShowBack"
232
- :isShowRecovery="isShowRecovery"
233
- :isShowImplement="isShowImplement"
234
- @closePhaseBack="handleClose"
235
- @closePhaseControl="closePhaseControl"
236
- @toAutoControl="toAutoControl"
237
- />
238
- </el-tab-pane>
239
- </el-tabs>
240
- </div>
241
- </template>
242
-
243
- <script>
244
- import xdrdirselector from '../../XRDDirSelector/XRDDirSelector'
245
- import Stages from '../../Stages/index'
246
- import { hasPermission } from '../../../../utils/auth'
247
- import LockingPhaseControlModal from '../lockingPhaselControlModal'
248
- import AzimuthLocking from '../azimuthlocking'
249
- import ControlModelGroup from './controlModelGroup'
250
- import ClosePhaseControlModal from '../closePhaselControlModal'
251
- import TentativePlanControlModal from '../tentativeplancontrolmodal'
252
- import PriorityControl from '../priorityControl'
253
-
254
- export default {
255
- name: 'manualControl',
256
- components: {
257
- xdrdirselector,
258
- Stages,
259
- LockingPhaseControlModal,
260
- AzimuthLocking,
261
- ControlModelGroup,
262
- ClosePhaseControlModal,
263
- TentativePlanControlModal,
264
- PriorityControl
265
- },
266
- props: {
267
- patternAll: {
268
- type: Array
269
- },
270
- crossStatusData: {
271
- type: Object,
272
- default: () => {}
273
- },
274
- phaseList: {
275
- type: Array,
276
- default () {
277
- return []
278
- }
279
- },
280
- Visible: {
281
- type: Boolean
282
- },
283
- controlData: {
284
- type: Object
285
- },
286
- modelList: {
287
- type: Array
288
- },
289
- residentControlList: {
290
- type: Array
291
- },
292
- // stagesList: {
293
- // type: Array
294
- // },
295
- patternSelect: {
296
- type: Array
297
- },
298
- currModel: {
299
- type: Number
300
- },
301
- preselectModel: {
302
- type: Number
303
- },
304
- currentStage: {
305
- type: Number
306
- },
307
- preselectStages: {
308
- type: Number
309
- },
310
- specialcontrolList: {
311
- type: Array
312
- },
313
- realtimeStatusModalvisible: { // 区分是保存方案还是提交方案,保存方案没有路口实时信息
314
- type: Boolean,
315
- default: true
316
- },
317
- funcSort: {
318
- type: String,
319
- default: 'allFunc'
320
- },
321
- roadDirection: {
322
- type: String
323
- },
324
- statusData: {
325
- type: Object
326
- },
327
- specialControlList: {
328
- type: Array
329
- },
330
- othersControlList: {
331
- type: Array
332
- },
333
- closePhaseRings: {
334
- type: Array
335
- },
336
- sidewalkPhaseData: {
337
- type: Array
338
- },
339
- overlap: {
340
- type: Array
341
- },
342
- allPatternList: {
343
- type: Array
344
- },
345
- patternChooseControlList: {
346
- type: Array
347
- },
348
- isShowBack: {
349
- type: Boolean,
350
- default: true
351
- },
352
- isShowRecovery: {
353
- type: Boolean,
354
- default: true
355
- },
356
- isShowImplement: {
357
- type: Boolean,
358
- default: true
359
- },
360
- thirdPartyControlMenu: {
361
- type: Array
362
- },
363
- thirdPartyControl: {
364
- type: Array
365
- }
366
- },
367
- watch: {
368
- patternSelect: {
369
- handler: function (val) {
370
- this.manualInfo.tempPatternid = this.crossStatusData.patternid
371
- },
372
- // 深度观察监听
373
- deep: true
374
- },
375
- crossStatusData: {
376
- handler: function (val) {
377
- this.manualInfo.tempPatternid = this.manualInfo.tempPatternid ? this.manualInfo.tempPatternid : val.patternid
378
- this.realtimeStage = JSON.parse(JSON.stringify(this.crossStatusData))
379
- },
380
- // 深度观察监听
381
- deep: true
382
- }
383
- },
384
- data () {
385
- return {
386
- visible: this.Visible,
387
- manuals: false,
388
- realtimeStage: {},
389
- manualsStage: {},
390
- manualInfo: {
391
- tempPatternid: '', // 控制方式手动操作的情况下的控制编号的临时值。
392
- // tempDelay: 0, // 控制方式手动操作的情况下的延迟时间的临时值。
393
- tempDuration: 300 // 控制方式手动操作的情况下的持续时间的临时值。
394
- },
395
- activeName: 'residentcontrol',
396
- preselecttype: '',
397
- keyChange: false,
398
- isRing: false,
399
- patternOne: [],
400
- planPattern: {}
401
- }
402
- },
403
- methods: {
404
- handleClick (tab, event) {
405
- this.$nextTick(() => {
406
- this.init(tab)
407
- })
408
- },
409
- isHasPermission (path) {
410
- let res = hasPermission(path)
411
- return res
412
- },
413
- handleSelectPatternOption (value) {
414
- if (value === '') {
415
- this.manualInfo.tempPatternid = 0
416
- return
417
- }
418
- this.changeStage(value)
419
- this.selectPattern()
420
- },
421
- selectPattern () {
422
- this.manualInfo.offset = 0
423
- let selectId = Number(this.manualInfo.tempPatternid)
424
- this.patternOne = this.allPatternList.filter(item => {
425
- return item.id === selectId
426
- })
427
- this.manualInfo.offset = this.offset
428
- for (let rings of this.patternOne[0].rings) {
429
- if (rings.length === 0) continue
430
- for (let ring of rings) {
431
- if (ring.value === 0) continue
432
- let currPhase = this.phaseList.filter((item) => {
433
- return item.id === ring.id
434
- })[0]
435
- ring.desc = currPhase.direction.map(item => {
436
- return {
437
- id: item,
438
- color: '#454545'
439
- }
440
- })
441
- }
442
- }
443
- this.handleStageData(this.patternOne[0].rings)
444
- },
445
- handleStageData (rings) { // stagesList
446
- if (!rings) return
447
- for (let i = 0; i < rings.length; i++) {
448
- if (rings[i].length > 0) {
449
- let phaseList = []
450
- let stagesList = []
451
- // rings = JSON.parse(JSON.stringify(rings))
452
- let mapAdd = rings.map(item => {
453
- return item.map(val => {
454
- // if (val.mode !== 7) {
455
- return val.value + (val.sum ? val.sum : 0)
456
- // } else {
457
- // return 0
458
- // }
459
- })
460
- })
461
- let maxCycle = mapAdd.length > 0 ? mapAdd.map(item => {
462
- return item.length > 0 ? item.reduce((a, b) => {
463
- return a + b
464
- }) : 0
465
- }) : 0
466
- this.max = Math.max(...maxCycle)// 每个环的周期最大值
467
- this.stateList = [0]
468
- this.narr = []
469
- let currentIds = ''
470
- let lastCurrentIds = ''
471
- for (let j = 0; j <= this.max; j++) { // 指针长度
472
- for (let i = 0; i < rings.length; i++) { // 环列表
473
- let ring = rings[i]// 每个环对象
474
- let sum = 0
475
- for (let n = 0; n < ring.length; n++) { // 相位累计长度
476
- // if (ring[n].mode !== 7) {
477
- sum = sum + ring[n].value + (ring[n].sum ? ring[n].sum : 0)
478
- if (j < sum) {
479
- let phaseId = ring[n].id
480
- currentIds = currentIds + '-' + phaseId
481
- break
482
- }
483
- // }
484
- }
485
- }
486
- if (lastCurrentIds !== currentIds && lastCurrentIds !== '') { // 当前相位id和上一个相比不同说明相位变化了
487
- phaseList.push(lastCurrentIds)
488
- this.stateList.push(j)// 阶段累计长度的集合
489
- }
490
- lastCurrentIds = currentIds
491
- currentIds = ''
492
- }
493
- let newPhaselist = []
494
- phaseList.forEach(i => {
495
- let rangeArr = i.split('-').map(Number)
496
- if (rangeArr.length > 2) {
497
- newPhaselist.push([
498
- JSON.parse(JSON.stringify(rangeArr[1])),
499
- JSON.parse(JSON.stringify(rangeArr[2]))
500
- ])
501
- } else {
502
- newPhaselist.push([
503
- JSON.parse(JSON.stringify(rangeArr[1]))
504
- ])
505
- }
506
- })
507
- for (let i = this.stateList.length - 1; i >= 1; i--) {
508
- this.narr.push(this.stateList[i] - this.stateList[i - 1])
509
- }
510
- // newPhaselist
511
- this.narr.reverse()// 阶段差
512
- for (let i = 0; i < newPhaselist.length; i++) {
513
- let stage = JSON.parse(JSON.stringify(newPhaselist[i]))
514
- let newStage = []
515
- stage.map(item => {
516
- for (let ring of rings) {
517
- for (let ringItem of ring) {
518
- if (item === ringItem.id && (ringItem.mode !== 7 && ringItem.mode !== 8 && ringItem.mode !== 9)) {
519
- newStage.push(item)
520
- }
521
- }
522
- }
523
- })
524
- let stageItem = this.getStageItem(newStage, stage, rings, i)
525
- stagesList.push(JSON.parse(JSON.stringify(stageItem)))
526
- }
527
- this.overLapCycle = stagesList.reduce((prev, curr) => prev + parseInt(curr.split), 0)
528
- this.stagesList = JSON.parse(JSON.stringify(stagesList))
529
- }
530
- }
531
- },
532
- getCycle () {
533
- for (let rings of this.planPattern.rings) {
534
- let num = 0
535
- for (let i = 0; i < rings.length; i++) {
536
- if (rings[i].length !== 0) {
537
- if (rings[i].mode === 7) { // 忽略相位不计周期
538
- continue
539
- }
540
- num = num + Number(rings[i].value)
541
- }
542
- }
543
- if (num !== 0) {
544
- this.planPattern.cycle = num
545
- break
546
- }
547
- }
548
- },
549
- patternPlan () {
550
- let Pattern = {
551
- offset: 0,
552
- cycle: 0,
553
- stagesList: [],
554
- rings: [[], [], [], []]
555
- }
556
- var newPattern = JSON.parse(JSON.stringify(Pattern))
557
- for (let phase of this.phaseList) {
558
- let ring = {}
559
- ring.name = 'Phase ' + phase.id
560
- // ring.desc = this.getPhaseDescription(phase.direction)
561
- ring.id = phase.id
562
- ring.value = 30
563
- ring.mode = 2
564
- ring.options = []
565
- ring.delaystart = 0
566
- ring.advanceend = 0
567
- if (phase.ring === 1) {
568
- newPattern.rings[0].push(ring)
569
- } else if (phase.ring === 2) {
570
- newPattern.rings[1].push(ring)
571
- } else if (phase.ring === 3) {
572
- newPattern.rings[2].push(ring)
573
- } else if (phase.ring === 4) {
574
- newPattern.rings[3].push(ring)
575
- }
576
- }
577
- let barrier = this.handleCurrentChange(newPattern.rings)
578
- newPattern.barriers = barrier
579
- this.planPattern = newPattern
580
- },
581
- tranform (arr) { // 分barrier
582
- let newMap = new Map()
583
- arr.forEach(({ id, current }) => {
584
- const find = newMap.get(current.join())
585
- if (find) newMap.get(current.join()).push(id)
586
- else newMap.set(current.join(), [id])
587
- })
588
- let ret = []
589
- newMap.forEach((value, key) => {
590
- ret.push(Array.from(new Set(key.split(',').map(Number).concat(value))))
591
- })
592
- const result = []
593
- for (const a of ret) {
594
- let merged = false
595
- for (const r of result) {
596
- if (this.check([...r], a)) {
597
- a.forEach(item => r.add(item))
598
- merged = true
599
- }
600
- }
601
- if (!merged) {
602
- result.push(new Set(a))
603
- }
604
- merged = false
605
- }
606
- return result.map(s => [...s])
607
- },
608
- check (arr1, arr2) {
609
- return arr1.some(a1 => arr2.some(a2 => a1 === a2))
610
- },
611
- handleCurrentChange (val) { // 两个ring的数据
612
- if (val === null || val.length === 0) return
613
- // 按环序分组
614
- let ringlength = []
615
- let ringsequence = val.map(item => {
616
- if (item.length === 0) return
617
- ringlength.push(item.length)
618
- return item.map(k => {
619
- return k.id
620
- })
621
- })
622
- let newRings = ringsequence.filter(item => item)
623
- let minLength = Math.min(...ringlength)
624
- let resultArrs = [] // 环1分组
625
- let resultArr = [] // 环2分组
626
- for (let j = 0; j < ringsequence[0].length; j += minLength) {
627
- resultArrs.push(ringsequence[0].slice(j, j + minLength))
628
- if (ringsequence[0].length === minLength) {
629
- resultArrs.push([])
630
- }
631
- }
632
- if (newRings.length > 1) {
633
- for (let i = 0; i < ringsequence[1].length; i += minLength) {
634
- resultArr.push(ringsequence[1].slice(i, i + minLength))
635
- }
636
- }
637
- // this.patternInfo = []
638
- // this.barrierList = []
639
- let currentArr = []
640
- let newPattern = []
641
- val.map(i => {
642
- newPattern.push(...i)
643
- })
644
- if (this.phaseList.length === 0) return
645
- for (let patternStatus of val[0]) {
646
- // if (patternStatus.mode !== 7) {
647
- let concurrent = this.phaseList.filter((item) => {
648
- return item.id === patternStatus.id // patternStatus.id当前相位id concurrent当前相位的并发相位
649
- })[0].concurrent// 当前相位的并发相位
650
- if (concurrent) {
651
- let obj = {
652
- id: patternStatus.id,
653
- current: concurrent.sort()
654
- }
655
- currentArr.push(obj)
656
- }
657
- // }
658
- }
659
- if (currentArr.length !== 0) {
660
- let newCurrent = this.tranform(currentArr)
661
- // 取没个环与环关系的并集
662
- let barrierRing1 = []
663
- let barrierRing2 = []
664
- let ring1 = [] // 环1与关系1的并集
665
- for (let h = 0; h < newCurrent.length; h++) {
666
- let adds = [...new Set(resultArrs[0])].filter(item => newCurrent[h].includes(item))
667
- ring1.push(adds)
668
- }
669
- let ring1s = [] // 环1与关系2的并集
670
- for (let h = 0; h < newCurrent.length; h++) {
671
- let addRing1 = [...new Set(resultArrs[1])].filter(item => newCurrent[h].includes(item))
672
- ring1s.push(addRing1)
673
- }
674
- barrierRing1.push(...ring1, ...ring1s)
675
- let resultList = []
676
- if (newRings.length > 1) {
677
- let ring2s = [] // 环2与关系1的并集
678
- for (let h = 0; h < newCurrent.length; h++) {
679
- let addRing2 = [...new Set(resultArr[1])].filter(item => newCurrent[h].includes(item))
680
- ring2s.push(addRing2)
681
- }
682
- let ring2 = [] // 环2与关系1的并集
683
- for (let h = 0; h < newCurrent.length; h++) {
684
- let add = [...new Set(resultArr[0])].filter(item => newCurrent[h].includes(item))
685
- ring2.push(add)
686
- }
687
- barrierRing2.push(...ring2, ...ring2s)
688
- for (let k = 0; k < barrierRing1.length; k++) {
689
- resultList.push(barrierRing1[k].concat(barrierRing2[k]))
690
- }
691
- }
692
- let resultLists = resultList.filter(item => item.length !== 0)
693
- let ringArr = []
694
- for (let l = 0; l < resultLists.length; l++) {
695
- for (let d = 0; d < newCurrent.length; d++) {
696
- if (newCurrent[d].filter(item => resultLists[l].includes(item)).length > 0) {
697
- ringArr.push({
698
- data: resultLists[l],
699
- id: d + 1,
700
- index: l
701
- })
702
- }
703
- }
704
- }
705
- for (var i = 0; i < ringArr.length; i++) {
706
- for (var j = i + 1; j < ringArr.length; j++) {
707
- if (ringArr[i].id === ringArr[j].id && ringArr[i].index + 1 === ringArr[j].index) {
708
- ringArr[i].data = ringArr[i].data.concat(ringArr[j].data)
709
- ringArr.splice(ringArr.indexOf(ringArr[j].id), 1)
710
- }
711
- }
712
- }
713
- let resArr = ringArr.map(item => item.data)
714
- let ringTeam = this.step1(this.phaseList, resArr)
715
- let ringTeams = ringTeam.filter(item => item.length !== 0)
716
- return this.setBarrier(ringTeams, val)
717
- }
718
- },
719
- setBarrier (ringTeam, val) {
720
- const patternObjs = {}
721
- val.forEach(l => {
722
- l.map(k => {
723
- patternObjs[k.id] = k.value
724
- })
725
- })
726
- let ret = ringTeam.map((y, index) => {
727
- if (!y || y.length === 0) return
728
- y.map(n => {
729
- n.length = n.data.length > 1 ? n.data.reduce((pre, cur) => pre + patternObjs[cur], 0) : patternObjs[n.data[0]]
730
- })
731
- return {
732
- barrier: index + 1,
733
- length: y[0].length,
734
- items: y.map(j => {
735
- return {
736
- ring: j.ring,
737
- data: j.data
738
- }
739
- })
740
- }
741
- })
742
- return ret
743
- },
744
- step1 (list, arr) { // 各个环包含的相位
745
- const ret = []
746
- const listObj = {}
747
- list.forEach(l => {
748
- listObj[l.id] = l.ring
749
- })
750
- arr.forEach(a => {
751
- const retItem = []
752
- a.forEach(b => {
753
- if (listObj[b]) {
754
- const find = retItem.find(r => r.ring === listObj[b])
755
- if (find) find.data.push(b)
756
- else retItem.push({ ring: listObj[b], data: [b] })
757
- }
758
- })
759
- ret.push(retItem)
760
- })
761
- return ret
762
- },
763
- getStageItem (stageArr, stage, ringsList, i) {
764
- let res = {
765
- key: i,
766
- split: this.narr[i], // 阶段绿性比
767
- phases: stageArr,
768
- stageKanban: stage,
769
- delaystart: 0,
770
- advanceend: 0
771
- }
772
- // let splitArr = []
773
- let delaystartArr = []
774
- let advanceendArr = []
775
- for (let rings of ringsList) {
776
- for (let ring of rings) {
777
- if (stageArr.includes(ring.id)) {
778
- // let split = ring.value
779
- let delaystart = ring.delaystart
780
- let advanceend = ring.advanceend
781
- // splitArr.push(split)
782
- delaystartArr.push(delaystart)
783
- advanceendArr.push(advanceend)
784
- }
785
- }
786
- }
787
- // splitArr.sort(function (a, b) { return a - b })
788
- delaystartArr.sort(function (a, b) { return b - a })
789
- advanceendArr.sort(function (a, b) { return a - b })
790
- // res.split = splitArr.length > 0 ? splitArr[0] : 0
791
- res.delaystart = delaystartArr.length > 0 ? delaystartArr[0] : 0
792
- res.advanceend = advanceendArr.length > 0 ? advanceendArr[0] : 0
793
- return res
794
- },
795
- changeStage (value) {
796
- if (value) {
797
- this.manualsStage = {}
798
- this.manuals = true
799
- let stages = []
800
- let secletIds = isNaN(parseInt(value)) ? Number(value.replace(/[^0-9]/ig, '')) : value
801
- stages = this.patternAll.filter(item => {
802
- return item.id === secletIds
803
- })[0].stages
804
- this.manualsStage.stages = stages
805
- } else {
806
- this.manuals = false
807
- this.realtimeStage = JSON.parse(JSON.stringify(this.crossStatusData))
808
- }
809
- },
810
- handleClose () {
811
- this.$emit('closeManualModal')
812
- },
813
- handleManualControl () {
814
- this.$emit('patternCommit', this.manualInfo)
815
- },
816
- selectModel (item) {
817
- this.preselecttype = item.type
818
- this.manualInfo.fromControl = item.id
819
- if (item.iconClass === 'jieduansuoding') {
820
- this.manualInfo.fromControl = 40
821
- }
822
- this.$emit('selectModel', item.id)
823
- },
824
- selectStages (value) {
825
- this.$emit('selectStages', value)
826
- },
827
- selectSpecialModel () {
828
- this.$emit('selectSpecialModel')
829
- },
830
- init (tab) {
831
- this.$refs.ControlModelGroup.init()
832
- if (!tab) return
833
- if (this.controlData.patternid) {
834
- this.manualInfo.tempPatternid = this.controlData.patternid
835
- }
836
- if (this.controlData.tempDuration) {
837
- this.manualInfo.tempDuration = this.controlData.duration
838
- }
839
- if (tab.name === 'schemeselection') {
840
- this.initPattern()
841
- this.selectPattern()
842
- }
843
- },
844
- closePhaseBack () {
845
- this.$emit('closePhaseBack')
846
- },
847
- closePhaseControl (controldata) {
848
- this.$emit('closePhaseControl', controldata)
849
- },
850
- initPattern () {
851
- this.patternPlan()
852
- this.getCycle()
853
- if (this.patternOne.length === 0) {
854
- this.handleStageData(this.planPattern.rings)
855
- }
856
- },
857
- toAutoControl () {
858
- let autonomyControl = {
859
- id: 0,
860
- iconClass: 'zizhukongzhi',
861
- permission: 'configer:manual:renew',
862
- iconName: '自主控制'
863
- }
864
- this.$emit('selectModel', autonomyControl.id)
865
- this.handleManualControl()
866
- }
867
- },
868
- mounted () {
869
- }
870
- }
871
- </script>
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="manual-control-modal-new">
14
+ <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
15
+ <el-tab-pane :label="$t('openatccomponents.overview.residentcontrol')" name="residentcontrol"
16
+ v-if="(funcSort === 'allFunc' || (funcSort === 'thirdPartyFunc'&& thirdPartyControlMenu.indexOf('residentcontrol') !== -1))">
17
+ <ControlModelGroup
18
+ v-if="activeName === 'residentcontrol'"
19
+ ref="ControlModelGroup"
20
+ className="residentcontrol"
21
+ :controlList="residentControlList"
22
+ :funcSort="funcSort"
23
+ :thirdPartyControl="thirdPartyControl"
24
+ @selectModel="selectModel"
25
+ />
26
+
27
+ <div class="common-config" v-if="activeName === 'residentcontrol' && preselecttype !== '相位锁定' && preselecttype !== '方向锁定'">
28
+ <el-form
29
+ v-if="isHasPermission('configer:manual:dwell')"
30
+ ref="manual"
31
+ label-position="left"
32
+ :model="manualInfo"
33
+ label-width="90px">
34
+ <el-form-item
35
+ :label="$t('openatccomponents.overview.duration')"
36
+ prop="count">
37
+ <el-input-number style="width: 170px;" v-model="manualInfo.tempDuration" :controls="false" :max="65535" :min="0" :precision="0" :step="1" :placeholder="$t('openatccomponents.common.input')" size="small"></el-input-number>
38
+ </el-form-item>
39
+ </el-form>
40
+ </div>
41
+
42
+ <div class="stage-part" v-if="preselecttype === '阶段锁定'">
43
+ <div class="stage-label">{{$t('openatccomponents.overview.stage')}}</div>
44
+ <div style="width: 100%; height: auto;overflow: hidden;" v-if="isHasPermission('configer:manual:dwell')">
45
+ <Stages :crossStatusData="manuals?manualsStage:realtimeStage"
46
+ :phaseList="phaseList"
47
+ :preselectStages="preselectStages"
48
+ :preselectModel="preselectModel"
49
+ :isShowCurrentStage="false"
50
+ @onSelectStages="selectStages"></Stages>
51
+ </div>
52
+ </div>
53
+
54
+ <LockingPhaseControlModal
55
+ v-if="preselecttype === '相位锁定'"
56
+ :roadDirection="roadDirection"
57
+ :phaseList="phaseList"
58
+ :patternStatus="statusData"
59
+ :isShowBack="isShowBack"
60
+ :isShowRecovery="isShowRecovery"
61
+ :isShowImplement="isShowImplement"
62
+ @closePhaseBack="handleClose"
63
+ @closePhaseControl="closePhaseControl"
64
+ @toAutoControl="toAutoControl" />
65
+
66
+ <AzimuthLocking
67
+ v-if="preselecttype === '方向锁定' && isShowImplement"
68
+ :realtimeStatusModalvisible="realtimeStatusModalvisible"
69
+ :phaseList="phaseList"
70
+ :patternStatus="statusData"
71
+ :isShowBack="isShowBack"
72
+ :isShowRecovery="isShowRecovery"
73
+ :isShowImplement="isShowImplement"
74
+ @closePhaseBack="handleClose"
75
+ @toAutoControl="toAutoControl"
76
+ />
77
+
78
+ <div class="footer" v-if="((activeName === 'residentcontrol' && preselecttype !== '相位锁定' && preselecttype !== '方向锁定') || activeName === 'specialcontrol' || activeName === 'schemeselection')">
79
+ <el-button v-if="isShowBack && realtimeStatusModalvisible" @click="handleClose()">{{$t('openatccomponents.button.Back')}}</el-button>
80
+ <el-button v-if="isShowRecovery && isHasPermission('configer:manual:renew')" @click="toAutoControl()">{{$t('openatccomponents.overview.recovery')}}</el-button>
81
+ <el-button v-if="isShowImplement" type="primary" @click="handleManualControl()">{{$t('openatccomponents.overview.implement')}}</el-button>
82
+ <el-button v-if="!isShowImplement" type="primary" @click="handleManualControl()">{{$t('openatccomponents.overview.comfirm')}}</el-button>
83
+ </div>
84
+ </el-tab-pane>
85
+ <el-tab-pane :label="$t('openatccomponents.overview.specialcontrol')" name="specialcontrol"
86
+ v-if="(funcSort === 'allFunc' || (funcSort === 'thirdPartyFunc'&& thirdPartyControlMenu.indexOf('specialcontrol') !== -1))">
87
+ <ControlModelGroup
88
+ v-if="activeName === 'specialcontrol'"
89
+ ref="ControlModelGroup"
90
+ className="specialcontrol"
91
+ :controlList="specialControlList"
92
+ :funcSort="funcSort"
93
+ :thirdPartyControl="thirdPartyControl"
94
+ @selectModel="selectModel"
95
+ />
96
+
97
+ <div class="common-config" v-if="isHasPermission('configer:manual:senior')">
98
+ <el-form
99
+ ref="manual"
100
+ label-position="left"
101
+ :model="manualInfo"
102
+ label-width="90px">
103
+ <el-form-item
104
+ :label="$t('openatccomponents.overview.duration')"
105
+ prop="count">
106
+ <el-input-number style="width: 170px;" v-model="manualInfo.tempDuration" :controls="false" :max="65535" :min="0" :precision="0" :step="1" :placeholder="$t('openatccomponents.common.input')" size="small"></el-input-number>
107
+ </el-form-item>
108
+ </el-form>
109
+ </div>
110
+
111
+ <div class="footer" v-if="((activeName === 'residentcontrol' && preselecttype !== '相位锁定' && preselecttype !== '方向锁定') || activeName === 'specialcontrol' || activeName === 'schemeselection')">
112
+ <el-button v-if="isShowBack && realtimeStatusModalvisible" @click="handleClose()">{{$t('openatccomponents.button.Back')}}</el-button>
113
+ <el-button v-if="isShowRecovery && isHasPermission('configer:manual:renew')" @click="toAutoControl()">{{$t('openatccomponents.overview.recovery')}}</el-button>
114
+ <el-button v-if="isShowImplement" type="primary" @click="handleManualControl()">{{$t('openatccomponents.overview.implement')}}</el-button>
115
+ <el-button v-if="!isShowImplement" type="primary" @click="handleManualControl()">{{$t('openatccomponents.overview.comfirm')}}</el-button>
116
+ </div>
117
+
118
+ </el-tab-pane>
119
+ <el-tab-pane :label="$t('openatccomponents.overview.schemeselection')" name="schemeselection"
120
+ v-if="protocol !== 'rcp' && (funcSort === 'allFunc' || (funcSort === 'thirdPartyFunc'&& thirdPartyControlMenu.indexOf('schemeselection') !== -1))">
121
+ <ControlModelGroup
122
+ v-if="activeName === 'schemeselection'"
123
+ ref="ControlModelGroup"
124
+ className="otherscontrol"
125
+ :controlList="patternChooseControlList"
126
+ :funcSort="funcSort"
127
+ :thirdPartyControl="thirdPartyControl"
128
+ @selectModel="selectModel"
129
+ @selectSpecialModel="selectSpecialModel" />
130
+
131
+ <div class="common-config" v-if="activeName === 'schemeselection' && isHasPermission('configer:manual:base')">
132
+ <el-form
133
+ ref="manual"
134
+ label-position="left"
135
+ :model="manualInfo"
136
+ label-width="90px">
137
+ <el-form-item
138
+ :label="$t('openatccomponents.overview.duration')"
139
+ prop="count">
140
+ <el-input-number style="width: 170px;" v-model="manualInfo.tempDuration" :controls="false" :max="65535" :min="0" :precision="0" :step="1" :placeholder="$t('openatccomponents.common.input')" size="small"></el-input-number>
141
+ </el-form-item>
142
+ <el-form-item
143
+ :label="$t('openatccomponents.overview.controlnumber')"
144
+ prop="shape">
145
+ <el-select style="width: 170px;" v-model="manualInfo.tempPatternid" @change="handleSelectPatternOption" class="col-inner" size="small" :placeholder="$t('openatccomponents.common.select')">
146
+ <el-option
147
+ v-for="item in patternSelect"
148
+ :key="item.value"
149
+ :label="item.label"
150
+ :value="item.value">
151
+ </el-option>
152
+ </el-select>
153
+ </el-form-item>
154
+ </el-form>
155
+
156
+ <div>
157
+ <pattern-list
158
+ :key="keyChange"
159
+ :allPatternList="allPatternList"
160
+ :contrloType="!this.isRing ? 'ring' : 'stage'"
161
+ :stagesChange="
162
+ patternOne.length === 0
163
+ ? planPattern.stagesList
164
+ : patternOne[0].stagesList
165
+ "
166
+ :patternList="patternOne.length === 0 ? planPattern.rings : patternOne"
167
+ :patternStatusList="
168
+ patternOne.length === 0 ? planPattern.rings : patternOne[0].rings
169
+ "
170
+ :cycles="
171
+ patternOne.length === 0 ? planPattern.cycle : patternOne[0].cycle
172
+ "
173
+ :phaseList="phaseList"
174
+ >
175
+ </pattern-list>
176
+ </div>
177
+ </div>
178
+
179
+ <div class="footer" v-if="((activeName === 'residentcontrol' && preselecttype !== '相位锁定' && preselecttype !== '方向锁定') || activeName === 'specialcontrol' || activeName === 'schemeselection')">
180
+ <el-button v-if="isShowBack && realtimeStatusModalvisible" @click="handleClose()">{{$t('openatccomponents.button.Back')}}</el-button>
181
+ <el-button v-if="isShowRecovery && isHasPermission('configer:manual:renew')" @click="toAutoControl()">{{$t('openatccomponents.overview.recovery')}}</el-button>
182
+ <el-button v-if="isShowImplement" type="primary" @click="handleManualControl()">{{$t('openatccomponents.overview.implement')}}</el-button>
183
+ <el-button v-if="!isShowImplement" type="primary" @click="handleManualControl()">{{$t('openatccomponents.overview.comfirm')}}</el-button>
184
+ </div>
185
+ </el-tab-pane>
186
+ <el-tab-pane :label="$t('openatccomponents.overview.others')" name="others"
187
+ v-if="protocol !== 'rcp' && (funcSort === 'allFunc' || (funcSort === 'thirdPartyFunc'&& thirdPartyControlMenu.indexOf('others') !== -1))">
188
+ <ControlModelGroup
189
+ v-if="activeName === 'others'"
190
+ ref="ControlModelGroup"
191
+ className="otherscontrol"
192
+ othersControl
193
+ :controlList="othersControlList"
194
+ :funcSort="funcSort"
195
+ :thirdPartyControl="thirdPartyControl"
196
+ @selectModel="selectModel"
197
+ @selectSpecialModel="selectSpecialModel"
198
+ />
199
+ <ClosePhaseControlModal
200
+ v-if="preselecttype === '相位关断'"
201
+ :controlData="controlData"
202
+ :closePhaseRings="closePhaseRings"
203
+ :sidewalkPhaseData="sidewalkPhaseData"
204
+ :realtimeStatusModalvisible="realtimeStatusModalvisible"
205
+ :roadDirection="roadDirection"
206
+ :isShowBack="isShowBack"
207
+ :isShowRecovery="isShowRecovery"
208
+ :isShowImplement="isShowImplement"
209
+ @closePhaseBack="handleClose"
210
+ @closePhaseControl="closePhaseControl"
211
+ @toAutoControl="toAutoControl" />
212
+ <TentativePlanControlModal
213
+ v-if="preselecttype === '临时方案'"
214
+ :realtimeStatusModalvisible="realtimeStatusModalvisible"
215
+ :controlData="controlData"
216
+ :phaseList="phaseList"
217
+ :overlap="overlap"
218
+ :patternSelect="patternSelect"
219
+ :allPatternList="allPatternList"
220
+ :isShowBack="isShowBack"
221
+ :isShowRecovery="isShowRecovery"
222
+ :isShowImplement="isShowImplement"
223
+ @closePhaseBack="handleClose"
224
+ @closePhaseControl="closePhaseControl"
225
+ @toAutoControl="toAutoControl"
226
+ />
227
+ <PriorityControl
228
+ v-if="preselecttype === '优先控制'"
229
+ :realtimeStatusModalvisible="realtimeStatusModalvisible"
230
+ :phaseList="phaseList"
231
+ :isShowBack="isShowBack"
232
+ :isShowRecovery="isShowRecovery"
233
+ :isShowImplement="isShowImplement"
234
+ @closePhaseBack="handleClose"
235
+ @closePhaseControl="closePhaseControl"
236
+ @toAutoControl="toAutoControl"
237
+ />
238
+ </el-tab-pane>
239
+ </el-tabs>
240
+ </div>
241
+ </template>
242
+
243
+ <script>
244
+ import xdrdirselector from '../../XRDDirSelector/XRDDirSelector'
245
+ import Stages from '../../Stages/index'
246
+ import { hasPermission } from '../../../../utils/auth'
247
+ import LockingPhaseControlModal from '../lockingPhaselControlModal'
248
+ import AzimuthLocking from '../azimuthlocking'
249
+ import ControlModelGroup from './controlModelGroup'
250
+ import ClosePhaseControlModal from '../closePhaselControlModal'
251
+ import TentativePlanControlModal from '../tentativeplancontrolmodal'
252
+ import PriorityControl from '../priorityControl'
253
+
254
+ export default {
255
+ name: 'manualControl',
256
+ components: {
257
+ xdrdirselector,
258
+ Stages,
259
+ LockingPhaseControlModal,
260
+ AzimuthLocking,
261
+ ControlModelGroup,
262
+ ClosePhaseControlModal,
263
+ TentativePlanControlModal,
264
+ PriorityControl
265
+ },
266
+ props: {
267
+ patternAll: {
268
+ type: Array
269
+ },
270
+ crossStatusData: {
271
+ type: Object,
272
+ default: () => {}
273
+ },
274
+ phaseList: {
275
+ type: Array,
276
+ default () {
277
+ return []
278
+ }
279
+ },
280
+ Visible: {
281
+ type: Boolean
282
+ },
283
+ controlData: {
284
+ type: Object
285
+ },
286
+ modelList: {
287
+ type: Array
288
+ },
289
+ residentControlList: {
290
+ type: Array
291
+ },
292
+ // stagesList: {
293
+ // type: Array
294
+ // },
295
+ patternSelect: {
296
+ type: Array
297
+ },
298
+ currModel: {
299
+ type: Number
300
+ },
301
+ preselectModel: {
302
+ type: Number
303
+ },
304
+ currentStage: {
305
+ type: Number
306
+ },
307
+ preselectStages: {
308
+ type: Number
309
+ },
310
+ specialcontrolList: {
311
+ type: Array
312
+ },
313
+ realtimeStatusModalvisible: { // 区分是保存方案还是提交方案,保存方案没有路口实时信息
314
+ type: Boolean,
315
+ default: true
316
+ },
317
+ funcSort: {
318
+ type: String,
319
+ default: 'allFunc'
320
+ },
321
+ roadDirection: {
322
+ type: String
323
+ },
324
+ statusData: {
325
+ type: Object
326
+ },
327
+ specialControlList: {
328
+ type: Array
329
+ },
330
+ othersControlList: {
331
+ type: Array
332
+ },
333
+ closePhaseRings: {
334
+ type: Array
335
+ },
336
+ sidewalkPhaseData: {
337
+ type: Array
338
+ },
339
+ overlap: {
340
+ type: Array
341
+ },
342
+ allPatternList: {
343
+ type: Array
344
+ },
345
+ patternChooseControlList: {
346
+ type: Array
347
+ },
348
+ isShowBack: {
349
+ type: Boolean,
350
+ default: true
351
+ },
352
+ isShowRecovery: {
353
+ type: Boolean,
354
+ default: true
355
+ },
356
+ isShowImplement: {
357
+ type: Boolean,
358
+ default: true
359
+ },
360
+ thirdPartyControlMenu: {
361
+ type: Array
362
+ },
363
+ thirdPartyControl: {
364
+ type: Array
365
+ },
366
+ protocol: {
367
+ type: String
368
+ }
369
+ },
370
+ watch: {
371
+ patternSelect: {
372
+ handler: function (val) {
373
+ this.manualInfo.tempPatternid = this.crossStatusData.patternid
374
+ },
375
+ // 深度观察监听
376
+ deep: true
377
+ },
378
+ crossStatusData: {
379
+ handler: function (val) {
380
+ this.manualInfo.tempPatternid = this.manualInfo.tempPatternid ? this.manualInfo.tempPatternid : val.patternid
381
+ this.realtimeStage = JSON.parse(JSON.stringify(this.crossStatusData))
382
+ },
383
+ // 深度观察监听
384
+ deep: true
385
+ }
386
+ },
387
+ data () {
388
+ return {
389
+ visible: this.Visible,
390
+ manuals: false,
391
+ realtimeStage: {},
392
+ manualsStage: {},
393
+ manualInfo: {
394
+ tempPatternid: '', // 控制方式手动操作的情况下的控制编号的临时值。
395
+ // tempDelay: 0, // 控制方式手动操作的情况下的延迟时间的临时值。
396
+ tempDuration: 300 // 控制方式手动操作的情况下的持续时间的临时值。
397
+ },
398
+ activeName: 'residentcontrol',
399
+ preselecttype: '',
400
+ keyChange: false,
401
+ isRing: false,
402
+ patternOne: [],
403
+ planPattern: {}
404
+ }
405
+ },
406
+ methods: {
407
+ handleClick (tab, event) {
408
+ this.$nextTick(() => {
409
+ this.init(tab)
410
+ })
411
+ },
412
+ isHasPermission (path) {
413
+ let res = hasPermission(path)
414
+ return res
415
+ },
416
+ handleSelectPatternOption (value) {
417
+ if (value === '') {
418
+ this.manualInfo.tempPatternid = 0
419
+ return
420
+ }
421
+ this.changeStage(value)
422
+ this.selectPattern()
423
+ },
424
+ selectPattern () {
425
+ this.manualInfo.offset = 0
426
+ let selectId = Number(this.manualInfo.tempPatternid)
427
+ this.patternOne = this.allPatternList.filter(item => {
428
+ return item.id === selectId
429
+ })
430
+ this.manualInfo.offset = this.offset
431
+ for (let rings of this.patternOne[0].rings) {
432
+ if (rings.length === 0) continue
433
+ for (let ring of rings) {
434
+ if (ring.value === 0) continue
435
+ let currPhase = this.phaseList.filter((item) => {
436
+ return item.id === ring.id
437
+ })[0]
438
+ ring.desc = currPhase.direction.map(item => {
439
+ return {
440
+ id: item,
441
+ color: '#454545'
442
+ }
443
+ })
444
+ }
445
+ }
446
+ this.handleStageData(this.patternOne[0].rings)
447
+ },
448
+ handleStageData (rings) { // stagesList
449
+ if (!rings) return
450
+ for (let i = 0; i < rings.length; i++) {
451
+ if (rings[i].length > 0) {
452
+ let phaseList = []
453
+ let stagesList = []
454
+ // rings = JSON.parse(JSON.stringify(rings))
455
+ let mapAdd = rings.map(item => {
456
+ return item.map(val => {
457
+ // if (val.mode !== 7) {
458
+ return val.value + (val.sum ? val.sum : 0)
459
+ // } else {
460
+ // return 0
461
+ // }
462
+ })
463
+ })
464
+ let maxCycle = mapAdd.length > 0 ? mapAdd.map(item => {
465
+ return item.length > 0 ? item.reduce((a, b) => {
466
+ return a + b
467
+ }) : 0
468
+ }) : 0
469
+ this.max = Math.max(...maxCycle)// 每个环的周期最大值
470
+ this.stateList = [0]
471
+ this.narr = []
472
+ let currentIds = ''
473
+ let lastCurrentIds = ''
474
+ for (let j = 0; j <= this.max; j++) { // 指针长度
475
+ for (let i = 0; i < rings.length; i++) { // 环列表
476
+ let ring = rings[i]// 每个环对象
477
+ let sum = 0
478
+ for (let n = 0; n < ring.length; n++) { // 相位累计长度
479
+ // if (ring[n].mode !== 7) {
480
+ sum = sum + ring[n].value + (ring[n].sum ? ring[n].sum : 0)
481
+ if (j < sum) {
482
+ let phaseId = ring[n].id
483
+ currentIds = currentIds + '-' + phaseId
484
+ break
485
+ }
486
+ // }
487
+ }
488
+ }
489
+ if (lastCurrentIds !== currentIds && lastCurrentIds !== '') { // 当前相位id和上一个相比不同说明相位变化了
490
+ phaseList.push(lastCurrentIds)
491
+ this.stateList.push(j)// 阶段累计长度的集合
492
+ }
493
+ lastCurrentIds = currentIds
494
+ currentIds = ''
495
+ }
496
+ let newPhaselist = []
497
+ phaseList.forEach(i => {
498
+ let rangeArr = i.split('-').map(Number)
499
+ if (rangeArr.length > 2) {
500
+ newPhaselist.push([
501
+ JSON.parse(JSON.stringify(rangeArr[1])),
502
+ JSON.parse(JSON.stringify(rangeArr[2]))
503
+ ])
504
+ } else {
505
+ newPhaselist.push([
506
+ JSON.parse(JSON.stringify(rangeArr[1]))
507
+ ])
508
+ }
509
+ })
510
+ for (let i = this.stateList.length - 1; i >= 1; i--) {
511
+ this.narr.push(this.stateList[i] - this.stateList[i - 1])
512
+ }
513
+ // newPhaselist
514
+ this.narr.reverse()// 阶段差
515
+ for (let i = 0; i < newPhaselist.length; i++) {
516
+ let stage = JSON.parse(JSON.stringify(newPhaselist[i]))
517
+ let newStage = []
518
+ stage.map(item => {
519
+ for (let ring of rings) {
520
+ for (let ringItem of ring) {
521
+ if (item === ringItem.id && (ringItem.mode !== 7 && ringItem.mode !== 8 && ringItem.mode !== 9)) {
522
+ newStage.push(item)
523
+ }
524
+ }
525
+ }
526
+ })
527
+ let stageItem = this.getStageItem(newStage, stage, rings, i)
528
+ stagesList.push(JSON.parse(JSON.stringify(stageItem)))
529
+ }
530
+ this.overLapCycle = stagesList.reduce((prev, curr) => prev + parseInt(curr.split), 0)
531
+ this.stagesList = JSON.parse(JSON.stringify(stagesList))
532
+ }
533
+ }
534
+ },
535
+ getCycle () {
536
+ for (let rings of this.planPattern.rings) {
537
+ let num = 0
538
+ for (let i = 0; i < rings.length; i++) {
539
+ if (rings[i].length !== 0) {
540
+ if (rings[i].mode === 7) { // 忽略相位不计周期
541
+ continue
542
+ }
543
+ num = num + Number(rings[i].value)
544
+ }
545
+ }
546
+ if (num !== 0) {
547
+ this.planPattern.cycle = num
548
+ break
549
+ }
550
+ }
551
+ },
552
+ patternPlan () {
553
+ let Pattern = {
554
+ offset: 0,
555
+ cycle: 0,
556
+ stagesList: [],
557
+ rings: [[], [], [], []]
558
+ }
559
+ var newPattern = JSON.parse(JSON.stringify(Pattern))
560
+ for (let phase of this.phaseList) {
561
+ let ring = {}
562
+ ring.name = 'Phase ' + phase.id
563
+ // ring.desc = this.getPhaseDescription(phase.direction)
564
+ ring.id = phase.id
565
+ ring.value = 30
566
+ ring.mode = 2
567
+ ring.options = []
568
+ ring.delaystart = 0
569
+ ring.advanceend = 0
570
+ if (phase.ring === 1) {
571
+ newPattern.rings[0].push(ring)
572
+ } else if (phase.ring === 2) {
573
+ newPattern.rings[1].push(ring)
574
+ } else if (phase.ring === 3) {
575
+ newPattern.rings[2].push(ring)
576
+ } else if (phase.ring === 4) {
577
+ newPattern.rings[3].push(ring)
578
+ }
579
+ }
580
+ let barrier = this.handleCurrentChange(newPattern.rings)
581
+ newPattern.barriers = barrier
582
+ this.planPattern = newPattern
583
+ },
584
+ tranform (arr) { // 分barrier
585
+ let newMap = new Map()
586
+ arr.forEach(({ id, current }) => {
587
+ const find = newMap.get(current.join())
588
+ if (find) newMap.get(current.join()).push(id)
589
+ else newMap.set(current.join(), [id])
590
+ })
591
+ let ret = []
592
+ newMap.forEach((value, key) => {
593
+ ret.push(Array.from(new Set(key.split(',').map(Number).concat(value))))
594
+ })
595
+ const result = []
596
+ for (const a of ret) {
597
+ let merged = false
598
+ for (const r of result) {
599
+ if (this.check([...r], a)) {
600
+ a.forEach(item => r.add(item))
601
+ merged = true
602
+ }
603
+ }
604
+ if (!merged) {
605
+ result.push(new Set(a))
606
+ }
607
+ merged = false
608
+ }
609
+ return result.map(s => [...s])
610
+ },
611
+ check (arr1, arr2) {
612
+ return arr1.some(a1 => arr2.some(a2 => a1 === a2))
613
+ },
614
+ handleCurrentChange (val) { // 两个ring的数据
615
+ if (val === null || val.length === 0) return
616
+ // 按环序分组
617
+ let ringlength = []
618
+ let ringsequence = val.map(item => {
619
+ if (item.length === 0) return
620
+ ringlength.push(item.length)
621
+ return item.map(k => {
622
+ return k.id
623
+ })
624
+ })
625
+ let newRings = ringsequence.filter(item => item)
626
+ let minLength = Math.min(...ringlength)
627
+ let resultArrs = [] // 环1分组
628
+ let resultArr = [] // 环2分组
629
+ for (let j = 0; j < ringsequence[0].length; j += minLength) {
630
+ resultArrs.push(ringsequence[0].slice(j, j + minLength))
631
+ if (ringsequence[0].length === minLength) {
632
+ resultArrs.push([])
633
+ }
634
+ }
635
+ if (newRings.length > 1) {
636
+ for (let i = 0; i < ringsequence[1].length; i += minLength) {
637
+ resultArr.push(ringsequence[1].slice(i, i + minLength))
638
+ }
639
+ }
640
+ // this.patternInfo = []
641
+ // this.barrierList = []
642
+ let currentArr = []
643
+ let newPattern = []
644
+ val.map(i => {
645
+ newPattern.push(...i)
646
+ })
647
+ if (this.phaseList.length === 0) return
648
+ for (let patternStatus of val[0]) {
649
+ // if (patternStatus.mode !== 7) {
650
+ let concurrent = this.phaseList.filter((item) => {
651
+ return item.id === patternStatus.id // patternStatus.id当前相位id concurrent当前相位的并发相位
652
+ })[0].concurrent// 当前相位的并发相位
653
+ if (concurrent) {
654
+ let obj = {
655
+ id: patternStatus.id,
656
+ current: concurrent.sort()
657
+ }
658
+ currentArr.push(obj)
659
+ }
660
+ // }
661
+ }
662
+ if (currentArr.length !== 0) {
663
+ let newCurrent = this.tranform(currentArr)
664
+ // 取没个环与环关系的并集
665
+ let barrierRing1 = []
666
+ let barrierRing2 = []
667
+ let ring1 = [] // 环1与关系1的并集
668
+ for (let h = 0; h < newCurrent.length; h++) {
669
+ let adds = [...new Set(resultArrs[0])].filter(item => newCurrent[h].includes(item))
670
+ ring1.push(adds)
671
+ }
672
+ let ring1s = [] // 环1与关系2的并集
673
+ for (let h = 0; h < newCurrent.length; h++) {
674
+ let addRing1 = [...new Set(resultArrs[1])].filter(item => newCurrent[h].includes(item))
675
+ ring1s.push(addRing1)
676
+ }
677
+ barrierRing1.push(...ring1, ...ring1s)
678
+ let resultList = []
679
+ if (newRings.length > 1) {
680
+ let ring2s = [] // 环2与关系1的并集
681
+ for (let h = 0; h < newCurrent.length; h++) {
682
+ let addRing2 = [...new Set(resultArr[1])].filter(item => newCurrent[h].includes(item))
683
+ ring2s.push(addRing2)
684
+ }
685
+ let ring2 = [] // 环2与关系1的并集
686
+ for (let h = 0; h < newCurrent.length; h++) {
687
+ let add = [...new Set(resultArr[0])].filter(item => newCurrent[h].includes(item))
688
+ ring2.push(add)
689
+ }
690
+ barrierRing2.push(...ring2, ...ring2s)
691
+ for (let k = 0; k < barrierRing1.length; k++) {
692
+ resultList.push(barrierRing1[k].concat(barrierRing2[k]))
693
+ }
694
+ }
695
+ let resultLists = resultList.filter(item => item.length !== 0)
696
+ let ringArr = []
697
+ for (let l = 0; l < resultLists.length; l++) {
698
+ for (let d = 0; d < newCurrent.length; d++) {
699
+ if (newCurrent[d].filter(item => resultLists[l].includes(item)).length > 0) {
700
+ ringArr.push({
701
+ data: resultLists[l],
702
+ id: d + 1,
703
+ index: l
704
+ })
705
+ }
706
+ }
707
+ }
708
+ for (var i = 0; i < ringArr.length; i++) {
709
+ for (var j = i + 1; j < ringArr.length; j++) {
710
+ if (ringArr[i].id === ringArr[j].id && ringArr[i].index + 1 === ringArr[j].index) {
711
+ ringArr[i].data = ringArr[i].data.concat(ringArr[j].data)
712
+ ringArr.splice(ringArr.indexOf(ringArr[j].id), 1)
713
+ }
714
+ }
715
+ }
716
+ let resArr = ringArr.map(item => item.data)
717
+ let ringTeam = this.step1(this.phaseList, resArr)
718
+ let ringTeams = ringTeam.filter(item => item.length !== 0)
719
+ return this.setBarrier(ringTeams, val)
720
+ }
721
+ },
722
+ setBarrier (ringTeam, val) {
723
+ const patternObjs = {}
724
+ val.forEach(l => {
725
+ l.map(k => {
726
+ patternObjs[k.id] = k.value
727
+ })
728
+ })
729
+ let ret = ringTeam.map((y, index) => {
730
+ if (!y || y.length === 0) return
731
+ y.map(n => {
732
+ n.length = n.data.length > 1 ? n.data.reduce((pre, cur) => pre + patternObjs[cur], 0) : patternObjs[n.data[0]]
733
+ })
734
+ return {
735
+ barrier: index + 1,
736
+ length: y[0].length,
737
+ items: y.map(j => {
738
+ return {
739
+ ring: j.ring,
740
+ data: j.data
741
+ }
742
+ })
743
+ }
744
+ })
745
+ return ret
746
+ },
747
+ step1 (list, arr) { // 各个环包含的相位
748
+ const ret = []
749
+ const listObj = {}
750
+ list.forEach(l => {
751
+ listObj[l.id] = l.ring
752
+ })
753
+ arr.forEach(a => {
754
+ const retItem = []
755
+ a.forEach(b => {
756
+ if (listObj[b]) {
757
+ const find = retItem.find(r => r.ring === listObj[b])
758
+ if (find) find.data.push(b)
759
+ else retItem.push({ ring: listObj[b], data: [b] })
760
+ }
761
+ })
762
+ ret.push(retItem)
763
+ })
764
+ return ret
765
+ },
766
+ getStageItem (stageArr, stage, ringsList, i) {
767
+ let res = {
768
+ key: i,
769
+ split: this.narr[i], // 阶段绿性比
770
+ phases: stageArr,
771
+ stageKanban: stage,
772
+ delaystart: 0,
773
+ advanceend: 0
774
+ }
775
+ // let splitArr = []
776
+ let delaystartArr = []
777
+ let advanceendArr = []
778
+ for (let rings of ringsList) {
779
+ for (let ring of rings) {
780
+ if (stageArr.includes(ring.id)) {
781
+ // let split = ring.value
782
+ let delaystart = ring.delaystart
783
+ let advanceend = ring.advanceend
784
+ // splitArr.push(split)
785
+ delaystartArr.push(delaystart)
786
+ advanceendArr.push(advanceend)
787
+ }
788
+ }
789
+ }
790
+ // splitArr.sort(function (a, b) { return a - b })
791
+ delaystartArr.sort(function (a, b) { return b - a })
792
+ advanceendArr.sort(function (a, b) { return a - b })
793
+ // res.split = splitArr.length > 0 ? splitArr[0] : 0
794
+ res.delaystart = delaystartArr.length > 0 ? delaystartArr[0] : 0
795
+ res.advanceend = advanceendArr.length > 0 ? advanceendArr[0] : 0
796
+ return res
797
+ },
798
+ changeStage (value) {
799
+ if (value) {
800
+ this.manualsStage = {}
801
+ this.manuals = true
802
+ let stages = []
803
+ let secletIds = isNaN(parseInt(value)) ? Number(value.replace(/[^0-9]/ig, '')) : value
804
+ stages = this.patternAll.filter(item => {
805
+ return item.id === secletIds
806
+ })[0].stages
807
+ this.manualsStage.stages = stages
808
+ } else {
809
+ this.manuals = false
810
+ this.realtimeStage = JSON.parse(JSON.stringify(this.crossStatusData))
811
+ }
812
+ },
813
+ handleClose () {
814
+ this.$emit('closeManualModal')
815
+ },
816
+ handleManualControl () {
817
+ this.$emit('patternCommit', this.manualInfo)
818
+ },
819
+ selectModel (item) {
820
+ this.preselecttype = item.type
821
+ this.manualInfo.fromControl = item.id
822
+ if (item.iconClass === 'jieduansuoding') {
823
+ this.manualInfo.fromControl = 40
824
+ }
825
+ this.$emit('selectModel', item.id)
826
+ },
827
+ selectStages (value) {
828
+ this.$emit('selectStages', value)
829
+ },
830
+ selectSpecialModel () {
831
+ this.$emit('selectSpecialModel')
832
+ },
833
+ init (tab) {
834
+ this.$refs.ControlModelGroup.init()
835
+ if (!tab) return
836
+ if (this.controlData.patternid) {
837
+ this.manualInfo.tempPatternid = this.controlData.patternid
838
+ }
839
+ if (this.controlData.tempDuration) {
840
+ this.manualInfo.tempDuration = this.controlData.duration
841
+ }
842
+ if (tab.name === 'schemeselection') {
843
+ this.initPattern()
844
+ this.selectPattern()
845
+ }
846
+ },
847
+ closePhaseBack () {
848
+ this.$emit('closePhaseBack')
849
+ },
850
+ closePhaseControl (controldata) {
851
+ this.$emit('closePhaseControl', controldata)
852
+ },
853
+ initPattern () {
854
+ this.patternPlan()
855
+ this.getCycle()
856
+ if (this.patternOne.length === 0) {
857
+ this.handleStageData(this.planPattern.rings)
858
+ }
859
+ },
860
+ toAutoControl () {
861
+ let autonomyControl = {
862
+ id: 0,
863
+ iconClass: 'zizhukongzhi',
864
+ permission: 'configer:manual:renew',
865
+ iconName: '自主控制'
866
+ }
867
+ this.$emit('selectModel', autonomyControl.id)
868
+ this.handleManualControl()
869
+ }
870
+ },
871
+ mounted () {
872
+ }
873
+ }
874
+ </script>