openatc-components 0.4.97 → 0.4.98

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 (419) 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 +0 -4
  21. package/package/kisscomps/components/ChannelRealtimeIntersection/ChannelRealtimeIntersection.vue +3 -27
  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 +19 -64
  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 +6 -13
  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 +2 -4
  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 +18 -59
  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 +16 -0
  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 +16 -0
  101. package/package/kisscomps/components/IntersectionMap/intersectionmap.vue +0 -10
  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 +7 -33
  106. package/package/kisscomps/components/PatternOptimize/PatternOptimize.vue +329 -329
  107. package/package/kisscomps/components/PatternStatus/PatternStatus.vue +1 -81
  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 +7 -30
  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 +871 -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 +0 -19
  133. package/package/kisscomps/components/SchemeConfig/utils/thirdPartypermission.js +95 -95
  134. package/package/kisscomps/components/SelectCrossPhase/index.vue +418 -418
  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 +7 -30
  144. package/package/kisscomps/components/patternConfig/pattern/planChart/model/coordinationModel.js +665 -665
  145. package/package/kisscomps/components/patternConfig/planContent.vue +604 -604
  146. package/package/kisscomps/components/patternConfig/planMenu.vue +329 -329
  147. package/package/kisscomps/components/patternConfig/utils.js +152 -152
  148. package/package/kisscomps/components/patternList/patternList.vue +0 -4
  149. package/package/kisscomps/index.js +6 -2
  150. package/package/kissui.js +216608 -0
  151. package/package/kissui.min.js +1 -1
  152. package/package.json +1 -1
  153. package/pnpm-lock.yaml +16362 -0
  154. package/src/App.vue +20 -24
  155. package/src/EdgeMgr/EdgeModelBase.js +16 -16
  156. package/src/EdgeMgr/controller/crossDiagramMgr.js +125 -125
  157. package/src/api/authapi.js +31 -31
  158. package/src/api/config.js +21 -21
  159. package/src/api/control.js +110 -110
  160. package/src/api/device.js +135 -135
  161. package/src/api/fault.js +66 -66
  162. package/src/api/index.js +24 -24
  163. package/src/api/login.js +46 -46
  164. package/src/api/optimize.js +72 -72
  165. package/src/api/param.js +165 -165
  166. package/src/api/passwdAssest.js +101 -101
  167. package/src/api/permission.js +33 -33
  168. package/src/api/route.js +171 -171
  169. package/src/api/template.js +27 -27
  170. package/src/assets/font/LICENSE.txt +202 -202
  171. package/src/assets/font/font.css +6 -6
  172. package/src/i18n/index.js +26 -26
  173. package/src/i18n/language/en.js +106 -30
  174. package/src/i18n/language/index.js +31 -25
  175. package/src/i18n/language/ru.js +1555 -0
  176. package/src/i18n/language/zh.js +107 -31
  177. package/src/icons/index.js +20 -20
  178. package/src/icons/svg/azimuthlocking.svg +26 -26
  179. package/src/icons/svg/bendi.svg +110 -110
  180. package/src/icons/svg/bujin.svg +36 -36
  181. package/src/icons/svg/connectBlue.svg +7 -7
  182. package/src/icons/svg/currentvolume.svg +0 -0
  183. package/src/icons/svg/custom-BRTlane.svg +40 -40
  184. package/src/icons/svg/custom-buslane.svg +40 -40
  185. package/src/icons/svg/custom-detector.svg +12 -12
  186. package/src/icons/svg/custom-east-bottom.svg +32 -32
  187. package/src/icons/svg/custom-east-top.svg +32 -32
  188. package/src/icons/svg/custom-ewped.svg +35 -35
  189. package/src/icons/svg/custom-nonmotorizedlane.svg +40 -40
  190. package/src/icons/svg/custom-north-left.svg +32 -32
  191. package/src/icons/svg/custom-north-right.svg +32 -32
  192. package/src/icons/svg/custom-peddetector.svg +17 -17
  193. package/src/icons/svg/custom-snped.svg +35 -35
  194. package/src/icons/svg/custom-south-left.svg +32 -32
  195. package/src/icons/svg/custom-south-right.svg +32 -32
  196. package/src/icons/svg/custom-tramlane.svg +40 -40
  197. package/src/icons/svg/custom-vehiclebranch.svg +40 -40
  198. package/src/icons/svg/custom-vehiclemainroad.svg +41 -41
  199. package/src/icons/svg/custom-west-bottom.svg +32 -32
  200. package/src/icons/svg/custom-west-top.svg +32 -32
  201. package/src/icons/svg/custom-xlped.svg +14 -14
  202. package/src/icons/svg/custom-xrped.svg +14 -14
  203. package/src/icons/svg/cutRed.svg +7 -7
  204. package/src/icons/svg/cycle.svg +0 -0
  205. package/src/icons/svg/dingzhouqi.svg +34 -34
  206. package/src/icons/svg/ganyingkongzhi.svg +30 -30
  207. package/src/icons/svg/guandeng.svg +81 -81
  208. package/src/icons/svg/huangshan.svg +71 -71
  209. package/src/icons/svg/maincontrol.svg +0 -0
  210. package/src/icons/svg/manualcontrolbackground.svg +51 -51
  211. package/src/icons/svg/manualcontrolbackground1.svg +62 -62
  212. package/src/icons/svg/manualcontrolbackgrounden.svg +62 -62
  213. package/src/icons/svg/model.svg +0 -0
  214. package/src/icons/svg/phasediff.svg +0 -0
  215. package/src/icons/svg/prioritycontrol.svg +21 -21
  216. package/src/icons/svg/quanhong.svg +86 -86
  217. package/src/icons/svg/shanghe.svg +11 -11
  218. package/src/icons/svg/shoudong.svg +103 -103
  219. package/src/icons/svg/tentativeplan.svg +28 -28
  220. package/src/icons/svg/time.svg +0 -0
  221. package/src/icons/svg/wuxianlan.svg +46 -46
  222. package/src/icons/svg/xiala.svg +11 -11
  223. package/src/icons/svg/xingrenguojie.svg +33 -33
  224. package/src/icons/svg/xitong.svg +89 -89
  225. package/src/icons/svg/youxian.svg +41 -41
  226. package/src/icons/svg/zizhukongzhi.svg +43 -43
  227. package/src/kisscomps/components/BoardCard/BoardCard.vue +0 -4
  228. package/src/kisscomps/components/ChannelRealtimeIntersection/ChannelRealtimeIntersection.vue +3 -27
  229. package/src/kisscomps/components/Channelization/Channelization.vue +585 -585
  230. package/src/kisscomps/components/ChannelizationFlowStatistic/ChannelizationFlowStatistic.vue +360 -360
  231. package/src/kisscomps/components/ChannelizationWithInterface/ChannelizationWithInterface.vue +518 -518
  232. package/src/kisscomps/components/CommonKanban/CommonKanban.vue +132 -132
  233. package/src/kisscomps/components/DirectionListConfiguration/DirectionListConfiguration.vue +2 -2
  234. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-east-bottom.vue +41 -41
  235. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-east-top.vue +60 -60
  236. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-ewped.vue +105 -105
  237. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-north-left.vue +60 -60
  238. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-north-right.vue +60 -60
  239. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-snped.vue +105 -105
  240. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-south-left.vue +60 -60
  241. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-south-right.vue +60 -60
  242. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-west-bottom.vue +60 -60
  243. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-west-top.vue +60 -60
  244. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-xlped.vue +30 -30
  245. package/src/kisscomps/components/DirectionListConfiguration/svg/ped-xrped.vue +30 -30
  246. package/src/kisscomps/components/DirectionListConfiguration/svg/pedSvg.vue +78 -78
  247. package/src/kisscomps/components/DrawChannelization/drawsvg/basicCoordInfo.vue +181 -181
  248. package/src/kisscomps/components/DrawChannelization/drawsvg/channelizationElements.vue +255 -255
  249. package/src/kisscomps/components/DrawChannelization/drawsvg/detectorAssociatedComponent.vue +152 -152
  250. package/src/kisscomps/components/DrawChannelization/drawsvg/drawElement/TextBox.vue +91 -91
  251. package/src/kisscomps/components/DrawChannelization/drawsvg/drawElement/crossMap.vue +194 -194
  252. package/src/kisscomps/components/DrawChannelization/drawsvg/drawElement/editText.vue +108 -108
  253. package/src/kisscomps/components/DrawChannelization/drawsvg/firstImportCrossmap.vue +51 -51
  254. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/countdownSvg.vue +236 -236
  255. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorChart.vue +247 -247
  256. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/detectorIconSvg.vue +210 -210
  257. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/laneIcon.vue +72 -72
  258. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/motorwayIconSvg.vue +368 -368
  259. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/pedroadIconSvg.vue +230 -230
  260. package/src/kisscomps/components/DrawChannelization/drawsvg/importDialog.vue +74 -74
  261. package/src/kisscomps/components/DrawChannelization/drawsvg/index.draw.vue +19 -64
  262. package/src/kisscomps/components/DrawChannelization/drawsvg/index.vue +144 -144
  263. package/src/kisscomps/components/DrawChannelization/drawsvg/laneEditPanel.vue +707 -707
  264. package/src/kisscomps/components/DrawChannelization/drawsvg/overlapAssociatedComponent.vue +172 -172
  265. package/src/kisscomps/components/DrawChannelization/drawsvg/phaseAssociatedComponent.vue +2 -2
  266. package/src/kisscomps/components/DrawChannelization/drawsvg/table.vue +99 -99
  267. package/src/kisscomps/components/DrawChannelization/drawsvg/utils/loadutils.js +87 -87
  268. package/src/kisscomps/components/DrawChannelization/drawsvg/utils/phaseDataModel.js +32 -32
  269. package/src/kisscomps/components/DrawChannelization/drawsvg/utils/phasePos.json +20 -20
  270. package/src/kisscomps/components/DrawChannelization/phaseDataMgr.js +278 -278
  271. package/src/kisscomps/components/ExpendConfig/ExpendConfig.vue +118 -118
  272. package/src/kisscomps/components/FaultDetailModal/FaultDetailModal.vue +178 -178
  273. package/src/kisscomps/components/IntersectionDirectionSelection/IntersectionDirectionSelection.vue +6 -13
  274. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/CrossRoadsSvg.vue +629 -629
  275. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/CustomRoadsSvg.vue +46 -46
  276. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionEWSvg.vue +447 -447
  277. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/PedSectionSNSvg.vue +341 -341
  278. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampEastSvg.vue +497 -497
  279. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampNorthSvg.vue +353 -353
  280. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampSouthSvg.vue +359 -359
  281. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/RampWestSvg.vue +443 -443
  282. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/SidewalkClickSvg.vue +2 -4
  283. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/SidewalkSvg.vue +1190 -1190
  284. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeEastRoadsSvg.vue +498 -498
  285. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeNorthRoadsSvg.vue +484 -484
  286. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeSouthRoadsSvg.vue +488 -488
  287. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/TShapeWestRoadsSvg.vue +566 -566
  288. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LCrossRoadsSvg.vue +640 -640
  289. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeEastRoadsSvg.vue +497 -497
  290. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeNorthRoadsSvg.vue +486 -486
  291. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeSouthRoadsSvg.vue +490 -490
  292. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/leftroad/LTShapeWestRoadsSvg.vue +575 -575
  293. package/src/kisscomps/components/IntersectionMap/crossDirection/baseImg/refreshSvg.vue +63 -63
  294. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/busMapSvg.vue +50 -50
  295. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/eastBusSvg.vue +167 -167
  296. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/northBusSvg.vue +168 -168
  297. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/southBusSvg.vue +168 -168
  298. package/src/kisscomps/components/IntersectionMap/crossDirection/busIcon/westBusSvg.vue +169 -169
  299. package/src/kisscomps/components/IntersectionMap/crossDirection/crossDiagram.vue +18 -59
  300. package/src/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/LphaseIconSvg.vue +197 -197
  301. package/src/kisscomps/components/IntersectionMap/crossDirection/phaseIcon/rampPhaseIconSvg.vue +122 -122
  302. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.json +196 -196
  303. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/busPos.left.json +196 -196
  304. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.json +16 -0
  305. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/phasePos.left.json +115 -115
  306. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/rampPos.json +52 -52
  307. package/src/kisscomps/components/IntersectionMap/crossDirection/posJson/sidePos.json +16 -0
  308. package/src/kisscomps/components/IntersectionMap/intersectionmap.vue +0 -10
  309. package/src/kisscomps/components/IntersectionWithInterface/IntersectionWithInterface.vue +534 -534
  310. package/src/kisscomps/components/KanBan/kanban.vue +231 -231
  311. package/src/kisscomps/components/MessageBox/index.vue +96 -96
  312. package/src/kisscomps/components/OverviewComponent/index.vue +7 -33
  313. package/src/kisscomps/components/PatternOptimize/PatternOptimize.vue +329 -329
  314. package/src/kisscomps/components/PatternStatus/PatternStatus.vue +1 -81
  315. package/src/kisscomps/components/PatternWalkSvg/PatternWalkSvg.vue +423 -423
  316. package/src/kisscomps/components/PhaseDirectionSelect/PhaseDirectionSelect.vue +126 -126
  317. package/src/kisscomps/components/PhaseDirectionText/PhaseDirectionText.vue +106 -106
  318. package/src/kisscomps/components/PhaseLegend/PhaseLegend.vue +286 -286
  319. package/src/kisscomps/components/PhaseMarker/index.js +6 -6
  320. package/src/kisscomps/components/PhaseMarker/phasemarker.vue +215 -215
  321. package/src/kisscomps/components/PhaseMarker/svg/patternSvg.vue +121 -121
  322. package/src/kisscomps/components/PhaseMarker/svg/phase.vue +60 -60
  323. package/src/kisscomps/components/PhaseMarker/svg/phaseCount.vue +62 -62
  324. package/src/kisscomps/components/PhaseMarker/svg/phaseCountCycle.vue +62 -62
  325. package/src/kisscomps/components/PhaseMarker/svg/phaseSvg.vue +117 -117
  326. package/src/kisscomps/components/PhasePedSelect/index.vue +206 -206
  327. package/src/kisscomps/components/SchemeConfig/SchemeConfig.vue +7 -30
  328. package/src/kisscomps/components/SchemeConfig/azimuthlocking/index.vue +365 -365
  329. package/src/kisscomps/components/SchemeConfig/azimuthlocking/utils.js +92 -92
  330. package/src/kisscomps/components/SchemeConfig/closePhaselControlModal/index.vue +214 -214
  331. package/src/kisscomps/components/SchemeConfig/lockingPhaselControlModal/index.vue +235 -235
  332. package/src/kisscomps/components/SchemeConfig/manualControlModal/index.vue +235 -235
  333. package/src/kisscomps/components/SchemeConfig/manualControlModalNew/controlModelGroup.vue +131 -131
  334. package/src/kisscomps/components/SchemeConfig/manualControlModalNew/index.vue +871 -871
  335. package/src/kisscomps/components/SchemeConfig/manualControlModalNew/othersIcon.vue +151 -151
  336. package/src/kisscomps/components/SchemeConfig/priorityControl/index.vue +215 -215
  337. package/src/kisscomps/components/SchemeConfig/priorityControl/utils.js +163 -163
  338. package/src/kisscomps/components/SchemeConfig/realtimeStatusModal/index.vue +308 -308
  339. package/src/kisscomps/components/SchemeConfig/tentativeplancontrolmodal/index.vue +0 -19
  340. package/src/kisscomps/components/SchemeConfig/utils/thirdPartypermission.js +95 -95
  341. package/src/kisscomps/components/SelectCrossPhase/index.vue +418 -418
  342. package/src/kisscomps/components/SelectCrossPhase/utils.js +142 -142
  343. package/src/kisscomps/components/StageOptimize/StageOptimize.vue +367 -367
  344. package/src/kisscomps/components/StageOptimize/index.js +2 -2
  345. package/src/kisscomps/components/StageStatus/StageStatus.vue +341 -341
  346. package/src/kisscomps/components/SvgIcon/SvgIcon.vue +53 -53
  347. package/src/kisscomps/components/XRDDirSelector/XRDDirSelector.vue +1041 -1041
  348. package/src/kisscomps/components/XiaoKanban/DirSelector.vue +356 -356
  349. package/src/kisscomps/components/XiaoKanban/index.vue +122 -122
  350. package/src/kisscomps/components/overView/index.vue +7 -30
  351. package/src/kisscomps/components/patternConfig/pattern/planChart/model/coordinationModel.js +665 -665
  352. package/src/kisscomps/components/patternConfig/planContent.vue +604 -604
  353. package/src/kisscomps/components/patternConfig/planMenu.vue +329 -329
  354. package/src/kisscomps/components/patternConfig/utils.js +152 -152
  355. package/src/kisscomps/components/patternList/patternList.vue +0 -4
  356. package/src/kisscomps/index.js +6 -2
  357. package/src/lib/publicjs/ArryListUtil.js +38 -38
  358. package/src/lib/publicjs/HttpurlMgr.js +45 -45
  359. package/src/lib/publicjs/KissApi.js +158 -158
  360. package/src/lib/publicjs/KissWSSub/Heartcheck.js +128 -128
  361. package/src/lib/publicjs/KissWSSub/KissWsSub.js +91 -91
  362. package/src/lib/publicjs/KissWSSub/KissWsSubByType.js +152 -152
  363. package/src/lib/publicjs/KissWSSub/SimuWsSubByType.js +44 -44
  364. package/src/lib/publicjs/KissWSSub/Sub.js +51 -51
  365. package/src/lib/publicjs/KissWSSub/SubChannel.js +119 -119
  366. package/src/lib/publicjs/basecomponents.js +65 -65
  367. package/src/lib/publicjs/localStorage.js +112 -112
  368. package/src/lib/publicjs/objdeepcopy.js +32 -32
  369. package/src/lib/publicjs/pageScroll.js +30 -30
  370. package/src/lib/publicjs/passwdAssest.js +101 -101
  371. package/src/lib/publicjs/styleclassfactory.js +32 -32
  372. package/src/router/index.js +63 -63
  373. package/src/store/index.js +26 -26
  374. package/src/store/modules/globalParam.js +67 -67
  375. package/src/utils/ControlFormat.js +14 -36
  376. package/src/utils/RingDataModel.js +335 -335
  377. package/src/utils/auth.js +199 -199
  378. package/src/utils/conflictList.js +87 -87
  379. package/src/utils/dateFormat.js +41 -41
  380. package/src/utils/fault.js +20 -72
  381. package/src/utils/faultcode.js +130 -182
  382. package/src/utils/index.js +69 -69
  383. package/src/utils/pedphasedesc.js +119 -119
  384. package/src/utils/phaseList.js +203 -203
  385. package/src/utils/phasedesc.js +144 -144
  386. package/src/utils/responseMessage.js +24 -21
  387. package/src/utils/validate.js +43 -43
  388. package/src/views/customchannelization.vue +6 -6
  389. package/src/views/home.1.vue +479 -479
  390. package/src/views/home.vue +93 -93
  391. package/src/views/intersection.vue +5 -11
  392. package/src/views/intersection2.vue +328 -328
  393. package/src/views/overView.vue +63 -63
  394. package/src/views/patternConfig.vue +2 -2
  395. package/src/views/schemeconfig.vue +1 -1
  396. package/static/styles/channelizatioon.scss +433 -433
  397. package/static/styles/common.scss +30 -30
  398. package/static/styles/commonkanban.scss +168 -168
  399. package/static/styles/dark/index.scss +2 -2
  400. package/static/styles/dark/theme/element-dark.scss +44 -44
  401. package/static/styles/index.scss +84 -84
  402. package/static/styles/intersection.scss +180 -180
  403. package/static/styles/light/index.scss +2 -2
  404. package/static/styles/light/theme/element-light.scss +44 -44
  405. package/static/styles/overview.scss +146 -146
  406. package/static/styles/patternConfig.scss +56 -56
  407. package/static/styles/phasePedSelect.scss +71 -71
  408. package/static/styles/stages.scss +57 -57
  409. package/static/styles/uiComponents.scss +57 -57
  410. package/static/styles/xiaokanban.scss +61 -61
  411. package/static/token.json +2 -2
  412. package/test/e2e/custom-assertions/elementCount.js +27 -27
  413. package/test/e2e/nightwatch.conf.js +46 -46
  414. package/test/e2e/runner.js +48 -48
  415. package/test/e2e/specs/test.js +19 -19
  416. package/test/unit/.eslintrc +7 -7
  417. package/test/unit/jest.conf.js +30 -30
  418. package/test/unit/setup.js +3 -3
  419. package/test/unit/specs/HelloWorld.spec.js +11 -11
@@ -1,871 +1,871 @@
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="(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>