openatc-components 0.3.62 → 0.3.67

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 (30) hide show
  1. package/package/kisscomps/components/BoardCard/BoardCard.vue +11 -0
  2. package/package/kisscomps/components/DrawChannelization/drawsvg/iconSvg/motorwayIconSvg.vue +46 -145
  3. package/package/kisscomps/components/DrawChannelization/drawsvg/index.draw.vue +4 -4
  4. package/package/kisscomps/components/OptimizeKanban/index.js +2 -0
  5. package/package/kisscomps/components/OptimizeKanban/index.vue +369 -0
  6. package/package/kisscomps/components/PatternOptimize/PatternOptimize.vue +11 -2
  7. package/package/kisscomps/components/PatternStatus/PatternStatus.vue +83 -8
  8. package/package/kisscomps/components/SchemeConfig/SchemeConfig.vue +0 -7
  9. package/package/kisscomps/components/SchemeConfig/lockingPhaselControlModal/index.vue +9 -11
  10. package/package/kisscomps/components/SchemeConfig/manualControlModalNew/index.vue +1 -1
  11. package/package/kisscomps/components/patternList/patternList.vue +11 -0
  12. package/package/kissui.min.js +1 -1
  13. package/package.json +1 -1
  14. package/src/i18n/language/en.js +4 -2
  15. package/src/i18n/language/zh.js +4 -2
  16. package/src/kisscomps/components/BoardCard/BoardCard.vue +11 -0
  17. package/src/kisscomps/components/DrawChannelization/drawsvg/iconSvg/motorwayIconSvg.vue +46 -145
  18. package/src/kisscomps/components/DrawChannelization/drawsvg/index.draw.vue +4 -4
  19. package/src/kisscomps/components/PatternOptimize/PatternOptimize.vue +11 -2
  20. package/src/kisscomps/components/PatternStatus/PatternStatus.vue +83 -8
  21. package/src/kisscomps/components/SchemeConfig/SchemeConfig.vue +0 -7
  22. package/src/kisscomps/components/SchemeConfig/lockingPhaselControlModal/index.vue +9 -11
  23. package/src/kisscomps/components/SchemeConfig/manualControlModalNew/index.vue +1 -1
  24. package/src/kisscomps/components/patternList/patternList.vue +11 -0
  25. package/src/node_modules/.package_versions.json +1 -0
  26. package/static/styles/common.scss +3 -3
  27. package/static/styles/dark/theme/element-dark.scss +1 -1
  28. package/static/styles/intersection.scss +5 -15
  29. package/static/styles/light/theme/element-light.scss +1 -1
  30. package/static/styles/schemeconfig.scss +6 -3
@@ -212,8 +212,8 @@ export default {
212
212
  Detector: [], // 管理所有检测器
213
213
  DetectorChart: [], // 管理所有检测器统计图
214
214
  motorwayicon: '',
215
- IconLengh: 60,
216
- IconWdith: 134,
215
+ IconLengh: 33,
216
+ IconWdith: 109,
217
217
  textareaW: 200,
218
218
  textareaH: 100,
219
219
  pedW: 206,
@@ -389,8 +389,8 @@ export default {
389
389
  h: this.IconWdith,
390
390
  angle: 0
391
391
  }
392
- this.IconLengh = 60
393
- this.IconWdith = 134
392
+ this.IconLengh = 33
393
+ this.IconWdith = 109
394
394
  let Motorwaysitem = {
395
395
  index: this.index,
396
396
  id: this.motorid,
@@ -0,0 +1,2 @@
1
+ import OptimizeKanban from './OptimizeKanban.vue'
2
+ export default OptimizeKanban
@@ -0,0 +1,369 @@
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="kanbanOptimize">
14
+ <div v-if="this.nowNumber === 1" class="optimizetype">
15
+ <span>{{$t('openatccomponents.pattern.optimizetype')}}</span>
16
+ <el-select v-model="value" clearable :placeholder="$t('openatccomponents.common.select')">
17
+ <el-option
18
+ v-for="item in typeOptions"
19
+ :key="item.value"
20
+ :label="$t('openatccomponents.overview.type' + item.value)"
21
+ :value="item.value"
22
+ >
23
+ </el-option>
24
+ </el-select>
25
+ <span class="optimiNum">{{$t('openatccomponents.pattern.optimizecycle')}}</span>
26
+ <el-input v-model="optimizecycle" clearable :placeholder="$t('openatccomponents.common.enter')"></el-input>
27
+ <!-- <el-button type="primary" @click="onOptimizeClick()">{{$t('openatccomponents.pattern.inoptimize')}}</el-button> -->
28
+ </div>
29
+ <div class="common-board-column" :style="{marginTop:this.nowNumber === 1 ? 0 : '50px',marginLeft:this.nowNumber === 1 ? 0 : 0}">
30
+ <div class="common-board-column-header">
31
+ {{headerText}}
32
+ </div>
33
+ <div class="openatccomponents-board-table-header">
34
+ <el-row :gutter="13">
35
+ <el-col :span="4">{{this.$t('openatccomponents.overview.phase')}}
36
+ </el-col>
37
+ <el-col :span="10">{{this.$t('openatccomponents.overview.flow')}}
38
+ </el-col>
39
+ <el-col :span="10">{{this.$t('openatccomponents.overview.saturationflow')}}
40
+ </el-col>
41
+ </el-row>
42
+ </div>
43
+ <draggable
44
+ class="common-board-column-content"
45
+ :list="list"
46
+ :options="options">
47
+ <div class="common-board-item" v-for="element in list" :key="element.id">
48
+ <el-row :gutter="13">
49
+ <el-col :span="4">
50
+ <el-tooltip class="item" effect="dark" placement="left">
51
+ <div slot="content">{{element.name}}</div>
52
+ <div class="common-phase-description">
53
+ <xdrdirselector Width="70px" Height="70px" Widths="58px" Heights="58px" :Datas="styles" :Data="showStyle" :showlist="element.desc" :ISActiveMask="ISActiveMask" :MaskColor="MaskColor"></xdrdirselector>
54
+ </div>
55
+ </el-tooltip>
56
+ </el-col>
57
+ <el-col :span="10">
58
+ <el-input-number :controls="false" class="col-content" size="small" :step="1" v-model.number="element.flowperhour" ref="type" :disabled="element.mode === 7"></el-input-number>
59
+ </el-col>
60
+ <el-col :span="10">
61
+ <el-input-number :controls="false" class="col-content" size="small" :step="1" v-model.number="element.saturation" ref="types" :disabled="element.mode === 7"></el-input-number>
62
+ </el-col>
63
+ </el-row>
64
+ </div>
65
+ </draggable>
66
+ </div>
67
+ </div>
68
+ </template>
69
+ <script>
70
+ import draggable from 'vuedraggable'
71
+ import { getDuration } from '@/api/cross'
72
+ import xdrdirselector from '@/components/XRDDirSelector'
73
+
74
+ export default {
75
+ name: 'patternOptimize',
76
+ components: {
77
+ draggable,
78
+ xdrdirselector
79
+ },
80
+ data () {
81
+ return {
82
+ showStyle: {
83
+ left: '7px',
84
+ top: '0px'
85
+ },
86
+ styles: {
87
+ left: '7px',
88
+ top: '0px'
89
+ },
90
+ typeOptions: [{
91
+ value: 'flow-split-opt'
92
+ }, {
93
+ value: 'cycle-opt'
94
+ }],
95
+ value: 'flow-split-opt',
96
+ optimizecycle: 0
97
+ }
98
+ },
99
+ props: {
100
+ headerText: {
101
+ type: String,
102
+ default: 'Header'
103
+ },
104
+ id: {
105
+ type: Number
106
+ },
107
+ rings: {
108
+ type: Array
109
+ },
110
+ nowNumber: {
111
+ type: Number
112
+ },
113
+ phaseList: {
114
+ type: Array
115
+ },
116
+ options: {
117
+ type: Object,
118
+ default () {
119
+ return {}
120
+ }
121
+ },
122
+ list: {
123
+ type: Array,
124
+ default () {
125
+ return []
126
+ }
127
+ },
128
+ // index: {
129
+ // type: Number
130
+ // },
131
+ ISActiveMask: {
132
+ type: Boolean,
133
+ default: true
134
+ },
135
+ // 当phase的描述为空时,显示的图形颜色。
136
+ MaskColor: {
137
+ type: String,
138
+ default: '#000000'
139
+ }
140
+ },
141
+ created () {
142
+ // this.addMinSplit()
143
+ this.addMin()
144
+ },
145
+ computed () {
146
+
147
+ },
148
+ watch: {
149
+ list: {
150
+ handler: function () {
151
+ // let list = this.$refs.type
152
+ // let flow = this.$refs.types
153
+ // console.log(this.list, 'list')
154
+ // let cycle = 0
155
+ // let n = this.index
156
+ // for (let i = 0; i < list.length; i++) {
157
+ // cycle = cycle + Number(list[i].currentValue)
158
+ // }
159
+ // const globalParamModel = this.$store.getters.globalParamModel
160
+ // // let MaxCycle = globalParamModel.getParamsByType('patternList')[n].cycle
161
+ // let pattern = globalParamModel.getParamsByType('patternList')[n]
162
+ // globalParamModel.getParamsByType('patternList')[n].cycle = this.getMaxCycle(pattern)
163
+ // this.addMinSplit()
164
+ // this.$emit('handleSplit', n)
165
+ },
166
+ deep: true
167
+ }
168
+ },
169
+ methods: {
170
+ onOptimizeClick () {
171
+ let msg = this.$t('openatccomponents.pattern.algorithmEngineOptimization')
172
+ const loading = this.$loading({
173
+ lock: true,
174
+ text: msg,
175
+ spinner: 'el-icon-loading',
176
+ background: 'rgba(0, 0, 0, 0.7)'
177
+ })
178
+ setTimeout(() => {
179
+ loading.close()
180
+ this.handeleOptimizeClick()
181
+ }, 1000)
182
+ },
183
+ handeleOptimizeClick () {
184
+ let newPha = []
185
+ for (let i = 0; i < this.rings.length; i++) {
186
+ newPha.push(...this.rings[i])
187
+ }
188
+ let phaseData = newPha.map(item => {
189
+ return {
190
+ id: item.id,
191
+ flowperhour: item.flowperhour,
192
+ saturation: item.saturation
193
+ }
194
+ })
195
+ let patternList = this.$store.state.globalParam.tscParam.patternList
196
+ let pattern = patternList.filter((item) => item.id === this.id)[0]
197
+ let reqData = {
198
+ 'type': this.value,
199
+ 'optcycle': this.optimizecycle ? this.optimizecycle : 0,
200
+ 'phaseList': this.phaseList,
201
+ 'pattern': pattern,
202
+ 'phases': phaseData
203
+ }
204
+ let isValidata = []
205
+ for (let j = 0; j < newPha.length; j++) {
206
+ let comNum = (newPha[j].length / 4) * 1700 * 0.8
207
+ isValidata.push(newPha[j].flowperhour > comNum)
208
+ }
209
+ if (isValidata.includes(true)) {
210
+ this.$confirm(this.$t('openatccomponents.overview.maxFlow'),
211
+ this.$t('openatccomponents.common.alarm'), {
212
+ confirmButtonText: this.$t('eopenatccomponentsdge.common.confirm'),
213
+ cancelButtonText: this.$t('openatccomponents.common.cancel'),
214
+ type: 'warning'
215
+ }).then(() => {
216
+ getDuration(reqData).then(data => {
217
+ if (data.data.success) {
218
+ this.$message({
219
+ type: 'success',
220
+ message: this.$t('openatccomponents.pattern.success')
221
+ })
222
+ for (let i = 0; i < this.rings.length; i++) {
223
+ for (let j = 0; j < this.rings[i].length; j++) {
224
+ for (let h = 0; h < data.data.data.phase.length; h++) {
225
+ if (this.rings[i][j].id === data.data.data.phase[h].id) {
226
+ this.rings[i][j].value = data.data.data.phase[h].duration
227
+ // this.rings[i][j].cycle = data.data.data.phase[h].cycle
228
+ }
229
+ }
230
+ }
231
+ }
232
+ }
233
+ }).catch(error => {
234
+ console.log(error)
235
+ })
236
+ }).catch(() => {
237
+ })
238
+ } else {
239
+ getDuration(reqData).then(data => {
240
+ if (data.data.success) {
241
+ this.$message({
242
+ type: 'success',
243
+ message: this.$t('openatccomponents.pattern.success')
244
+ })
245
+ for (let i = 0; i < this.rings.length; i++) {
246
+ for (let j = 0; j < this.rings[i].length; j++) {
247
+ for (let h = 0; h < data.data.data.phase.length; h++) {
248
+ if (this.rings[i][j].id === data.data.data.phase[h].id) {
249
+ this.rings[i][j].value = data.data.data.phase[h].duration
250
+ // this.rings[i][j].cycle = data.data.data.phase[h].cycle
251
+ }
252
+ }
253
+ }
254
+ }
255
+ }
256
+ }).catch(error => {
257
+ console.log(error)
258
+ })
259
+ }
260
+ },
261
+ addMin () {
262
+ for (let i of this.list) {
263
+ if (!i.flowperhour || !i.saturation) {
264
+ i.length = this.list.length
265
+ i.flowperhour = 0
266
+ i.saturation = 1700
267
+ }
268
+ }
269
+ }
270
+ // addMinSplit () {
271
+ // const globalParamModel = this.$store.getters.globalParamModel
272
+ // let phaseList = globalParamModel.getParamsByType('phaseList')
273
+ // for (let ls of this.list) {
274
+ // let phase = phaseList.filter((item) => {
275
+ // return item.id === ls.id
276
+ // })[0]
277
+ // if (!phase.redyellow) {
278
+ // phase.redyellow = 0
279
+ // }
280
+ // if (!phase.yellow) {
281
+ // phase.yellow = 0
282
+ // }
283
+ // if (!phase.redclear) {
284
+ // phase.redclear = 0
285
+ // }
286
+ // if (!phase.flashgreen) {
287
+ // phase.flashgreen = 0
288
+ // }
289
+ // if (!phase.phasewalk) {
290
+ // phase.phasewalk = 0
291
+ // }
292
+ // if (!phase.pedclear) {
293
+ // phase.pedclear = 0
294
+ // }
295
+ // // let temp1 = phase.redyellow + phase.yellow + phase.redclear + phase.flashgreen // 绿信比的最小值要大于最小绿+黄灯+全红+绿闪
296
+ // // let temp2 = phase.phasewalk + phase.pedclear
297
+ // // if (temp1 > temp2) {
298
+ // // ls.minSplit = temp1
299
+ // // } else {
300
+ // // ls.minSplit = temp2
301
+ // // }
302
+ // // if (ls.mode !== 7 && ls.value < ls.minSplit) {
303
+ // // ls.value = ls.minSplit
304
+ // // }
305
+ // // let temp1 = phase.yellow + phase.redclear + phase.flashgreen // 绿信比的最小值要大于最小绿+黄灯+全红+绿闪
306
+ // let temp1 = phase.yellow + phase.redclear + phase.mingreen
307
+ // let temp2 = phase.yellow + phase.redclear + phase.phasewalk + phase.pedclear
308
+ // ls.minSplit = temp1 > temp2 ? temp1 : temp2
309
+ // if (ls.mode !== 7 && ls.value < ls.minSplit) {
310
+ // ls.value = ls.minSplit
311
+ // this.$message.error(this.$t('openatccomponents.pattern.splitCheckMsg'))
312
+ // }
313
+ // }
314
+ // },
315
+ // getMaxCycle (pattern) {
316
+ // let rings = pattern.rings
317
+ // let maxCycle = 0
318
+ // for (let ring of rings) {
319
+ // if (ring.length === 0) continue
320
+ // let cycle = 0
321
+ // for (let r of ring) {
322
+ // if (r.mode === 7) { // 忽略相位不计周期
323
+ // continue
324
+ // }
325
+ // cycle = cycle + r.value
326
+ // }
327
+ // if (cycle > maxCycle) {
328
+ // maxCycle = cycle
329
+ // }
330
+ // }
331
+ // return maxCycle
332
+ // },
333
+ // doChange (val) {
334
+ // // if (val.mode === 7) {
335
+ // // val.value = 0
336
+ // // } else {
337
+ // // val.value = 30
338
+ // // }
339
+ // }
340
+ }
341
+ }
342
+ </script>
343
+ <style lang="scss" scoped>
344
+ .col-content {
345
+ width: 100%;
346
+ }
347
+ .kanbanOptimize {
348
+ .common-board-column {
349
+ max-width: unset !important;
350
+ }
351
+ }
352
+ .optimizetype{
353
+ // float: left;
354
+ font-size: 14PX;
355
+ margin:0 0 10PX 0;
356
+ .el-input {
357
+ width: 80PX;
358
+ }
359
+ .el-select{
360
+ width: 145PX;
361
+ }
362
+ .el-button {
363
+ margin-left: 10PX;
364
+ }
365
+ .optimiNum {
366
+ padding-left: 10PX;
367
+ }
368
+ }
369
+ </style>
@@ -50,7 +50,7 @@
50
50
  <el-tooltip class="item" effect="dark" placement="left">
51
51
  <div slot="content">{{element.name}}</div>
52
52
  <div class="common-phase-description">
53
- <xdrdirselector Width="70px" Height="70px" Widths="50px" Heights="50px" :Data="styles" :showlist="element.desc" :ISActiveMask="ISActiveMask" :MaskColor="MaskColor"></xdrdirselector>
53
+ <xdrdirselector Width="70px" Height="70px" Widths="58px" Heights="58px" :Datas="styles" :Data="showStyle" :showlist="element.desc" :ISActiveMask="ISActiveMask" :MaskColor="MaskColor"></xdrdirselector>
54
54
  </div>
55
55
  </el-tooltip>
56
56
  </el-col>
@@ -79,9 +79,13 @@ export default {
79
79
  },
80
80
  data () {
81
81
  return {
82
+ showStyle: {
83
+ left: '2px',
84
+ top: '0px'
85
+ },
82
86
  styles: {
83
87
  left: '1px',
84
- top: '0'
88
+ top: '0px'
85
89
  },
86
90
  typeOptions: [{
87
91
  value: 'flow-split-opt'
@@ -97,6 +101,9 @@ export default {
97
101
  type: String,
98
102
  default: 'Header'
99
103
  },
104
+ id: {
105
+ type: Number
106
+ },
100
107
  rings: {
101
108
  type: Object
102
109
  },
@@ -209,6 +216,7 @@ export default {
209
216
  }
210
217
  }
211
218
  }
219
+ this.$emit('optimizesucess', this.id)
212
220
  }
213
221
  }).catch(error => {
214
222
  console.log(error)
@@ -232,6 +240,7 @@ export default {
232
240
  }
233
241
  }
234
242
  }
243
+ this.$emit('optimizesucess', this.id)
235
244
  }
236
245
  }).catch(error => {
237
246
  console.log(error)
@@ -14,8 +14,9 @@
14
14
  <!-- 环模式true -->
15
15
  <div v-if="this.contrloType === 'ring' || !this.contrloType">
16
16
  <div class="ring-first" v-for="(list, index1) in patternInfo" :key="index1">
17
- <div style="position: relative;" :style="{'height': '34px','float':'left','width':((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100) + '%'}" v-for="(item,index2) in list" :key="index2" :class="item.mode===7?'direction': ''">
18
- <div class="first-1" :class="item.mode === 8 ? 'mask' : item.mode === 9 ? 'yellowClass' : ''" :style="{'width':Number(item.greenWidth.replace('%', ''))/Number((((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100) + '%').replace('%', ''))*100+'%','height':'34px','background':'#7ccc66'}">
17
+ <draggable :move="move" @end="endDrag(index1)" :disabled="isMove" :list="list">
18
+ <div style="position: relative;" :style="{'height': '34px','float':'left','width':((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100) + '%'}" v-for="(item,index2) in list" :key="index2" :class="item.mode===7?'direction': ''">
19
+ <div class="first-1" :class="item.mode === 8 ? 'mask' : item.mode === 9 ? 'yellowClass' : ''" :style="{'width':Number(item.greenWidth.replace('%', ''))/Number((((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100) + '%').replace('%', ''))*100+'%','height':'34px','background':'#7ccc66'}">
19
20
  <el-tooltip placement="top-start" effect="light">
20
21
  <div slot="content">{{$t('openatccomponents.phase.phase')}}{{item.id}}:{{item.split}}</div>
21
22
  <div style="cursor:pointer;">
@@ -25,7 +26,18 @@
25
26
  </div>
26
27
  <div v-if="isShowTip" class="box" style="position: absolute; left:40px; width:40px; top: -1px;">
27
28
  <div class="ring-nums">{{$t('openatccomponents.phase.phase')}}{{item.id}}</div>
28
- <div class="ring-nums">{{item.split}}</div>
29
+ <div v-if="isMove" class="ring-nums">{{item.split}}</div>
30
+ <el-input-number
31
+ v-if="!isMove"
32
+ class="ring-nums"
33
+ size="small"
34
+ :controls="false"
35
+ :min="0"
36
+ :step="1"
37
+ v-model.number="item.split"
38
+ @change="handleEdit(item)"
39
+ style="width: 24px"
40
+ ></el-input-number>
29
41
  </div>
30
42
  </div>
31
43
  </el-tooltip>
@@ -41,7 +53,8 @@
41
53
  <div class="first-1" :class="item.mode === 8 ? 'mask' : item.mode === 9 ? 'yellowClass' : ''" :style="{'width':Number(item.flashgreen.replace('%', ''))/Number((((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100).toFixed(3) + '%').replace('%', ''))*100+'%','height':'34px','float':'left','background': 'linear-gradient(to right, #ffffff 50%, #7ccc66 0)','background-size': '4px 100%'}"></div>
42
54
  <div class="first-1" :class="item.mode === 8 ? 'mask' : item.mode === 9 ? 'yellowClass' : ''" :style="{'width':Number(item.yellowWidth.replace('%', ''))/Number((((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100) + '%').replace('%', ''))*100+'%','height':'34px','background':'#f9dc6a'}"></div>
43
55
  <div class="first-1" :class="item.mode === 8 ? 'mask' : item.mode === 9 ? 'yellowClass' : ''" :style="{'width':Number(item.redWidth.replace('%', ''))/Number((((item.split+(item.sum?item.sum:0)) / (max?max:item.cycle) * 100).toFixed(3) + '%').replace('%', ''))*100+'%','height':'34px','background':'#f27979'}"></div>
44
- </div>
56
+ </div>
57
+ </draggable>
45
58
  </div>
46
59
  <div v-if="showBarrier">
47
60
  <div v-for="(item, index) in barrierList" :key="index + '1'">
@@ -100,6 +113,7 @@
100
113
  <script>
101
114
  // import patternwalksvg from '../PatternWalkSvg/PatternWalkSvg'
102
115
  import xdrdirselector from '../XRDDirSelector/XRDDirSelector'
116
+ import draggable from 'vuedraggable'
103
117
  // import PatternWalkSvg from '../IntersectionMap/crossDirection/baseImg/PatternWalkSvg'
104
118
  import PhaseDataModel from '../IntersectionMap/crossDirection/utils.js'
105
119
  import CrossDiagramMgr from '../../../EdgeMgr/controller/crossDiagramMgr.js'
@@ -107,6 +121,7 @@ export default {
107
121
  name: 'pattern-list',
108
122
  components: {
109
123
  // patternwalksvg,
124
+ draggable,
110
125
  xdrdirselector
111
126
  },
112
127
  data () {
@@ -114,6 +129,7 @@ export default {
114
129
  barrierHeight: '',
115
130
  stageCycle: '',
116
131
  barrierList: [],
132
+ barrierArr: [],
117
133
  newCycle: this.cycles,
118
134
  patternIds: this.patternId,
119
135
  newPatterns: [],
@@ -142,6 +158,10 @@ export default {
142
158
  stagesChange: {
143
159
  type: Array
144
160
  },
161
+ isMove: {
162
+ type: Boolean,
163
+ default: true
164
+ },
145
165
  controlPhase: {
146
166
  type: Object
147
167
  },
@@ -343,11 +363,11 @@ export default {
343
363
  handler: function (val, oldVal) {
344
364
  this.handleBarrierHeight() // 计算屏障高度
345
365
  if (this.patternStatusList && this.newCycle) {
346
- setTimeout(() => {
347
- this.handleCurrentChange(this.patternStatusList)
348
- this.handleBarrierHeight()
349
- }, 10)
366
+ // setTimeout(() => {
367
+ this.handleCurrentChange(this.patternStatusList)
350
368
  this.handleBarrierHeight()
369
+ // }, 10)
370
+ // this.handleBarrierHeight()
351
371
  }
352
372
  },
353
373
  // 深度观察监听
@@ -375,6 +395,60 @@ export default {
375
395
  }
376
396
  },
377
397
  methods: {
398
+ move (e) {
399
+ // 这里的e表示即将停靠的元素。
400
+ let result = this.barrierArr.filter(item => item.includes(e.relatedContext.element.id))[0]
401
+ if (!result.includes(e.draggedContext.element.id)) {
402
+ return false
403
+ }
404
+ },
405
+ endDrag (index) {
406
+ // 拖动后对原数据排序
407
+ const idIndexMap = {}
408
+ this.patternInfo.forEach((subArray, subArrayIndex) => {
409
+ subArray.forEach((item, index) => {
410
+ idIndexMap[item.id] = { subArrayIndex, index }
411
+ })
412
+ })
413
+ this.patternStatusList.forEach((subArray, subArrayIndex) => {
414
+ if (subArray.length > 0) {
415
+ subArray.sort((aItem, bItem) => {
416
+ const aIndex = idIndexMap[aItem.id] ? idIndexMap[aItem.id].index : Infinity
417
+ const bIndex = idIndexMap[bItem.id] ? idIndexMap[bItem.id].index : Infinity
418
+ return aIndex - bIndex
419
+ })
420
+ }
421
+ })
422
+ },
423
+ handleEdit (val) {
424
+ this.patternStatusList.map(d => {
425
+ d.map(r => {
426
+ if (r.id === val.id) {
427
+ r.value = val.split
428
+ }
429
+ })
430
+ })
431
+ // this.handleCurrentChange(this.patternStatusList)
432
+ this.$emit('handleSplitMove', this.patternId)
433
+ },
434
+ getMaxCycle (pattern) {
435
+ // let rings = pattern.rings
436
+ let maxCycle = 0
437
+ for (let ring of pattern) {
438
+ if (ring.length === 0) continue
439
+ let cycle = 0
440
+ for (let r of ring) {
441
+ if (r.mode === 7) { // 忽略相位不计周期
442
+ continue
443
+ }
444
+ cycle = cycle + r.value
445
+ }
446
+ if (cycle > maxCycle) {
447
+ maxCycle = cycle
448
+ }
449
+ }
450
+ return maxCycle
451
+ },
378
452
  getPed (data) {
379
453
  let ped = []
380
454
  for (let stg of data) {
@@ -1179,6 +1253,7 @@ export default {
1179
1253
  }
1180
1254
  }
1181
1255
  let resArr = ringArr.map(item => item.data)
1256
+ this.barrierArr = resArr
1182
1257
  let ringTeam = this.step1(this.phaseList, resArr)
1183
1258
  let ringTeams = ringTeam.filter(item => item.length !== 0)
1184
1259
  if (this.patternList) {
@@ -510,7 +510,6 @@ export default {
510
510
  this.changeStatus()
511
511
  }
512
512
  this.setPropsToken(this.Token)
513
- this.hiddenPartControl()
514
513
  // await this.getPhase()
515
514
  this.getFault()
516
515
  this.initData()
@@ -942,12 +941,6 @@ export default {
942
941
  if (token && token !== '') {
943
942
  setToken(token)
944
943
  }
945
- },
946
- hiddenPartControl () {
947
- // 保存的面板,不显示方位锁定的功能
948
- if (this.isShowImplement === false) {
949
- this.residentControlList = this.residentControlList.filter(item => item.id !== 25)
950
- }
951
944
  }
952
945
  },
953
946
  destroyed () {
@@ -20,10 +20,10 @@
20
20
  :model="manualInfo"
21
21
  label-width="90px">
22
22
  <el-form-item
23
- :label="$t('openatccomponents.overview.greenclear')"
24
- prop="intersection">
25
- <el-input-number :min="0" :max="65535" :precision="0" :step="1" :controls="false" v-model.number="manualInfo.tempGreenflash" size="small"></el-input-number>
26
- </el-form-item>
23
+ :label="$t('openatccomponents.overview.duration')"
24
+ prop="count">
25
+ <el-input-number :min="0" :max="65535" :precision="0" :step="1" :controls="false" v-model.number="manualInfo.tempDuration" size="small"></el-input-number>
26
+ </el-form-item>
27
27
 
28
28
  <el-form-item
29
29
  :label="$t('openatccomponents.overview.yellowflash')"
@@ -44,13 +44,11 @@
44
44
  label-position="left"
45
45
  :model="manualInfo"
46
46
  label-width="90px">
47
-
48
- <el-form-item
49
- :label="$t('openatccomponents.overview.duration')"
50
- prop="count">
51
- <el-input-number :min="0" :max="65535" :precision="0" :step="1" :controls="false" v-model.number="manualInfo.tempDuration" size="small"></el-input-number>
52
- </el-form-item>
53
-
47
+ <el-form-item
48
+ :label="$t('openatccomponents.overview.greenclear')"
49
+ prop="intersection">
50
+ <el-input-number :min="0" :max="65535" :precision="0" :step="1" :controls="false" v-model.number="manualInfo.tempGreenflash" size="small"></el-input-number>
51
+ </el-form-item>
54
52
  <el-form-item
55
53
  :label="$t('openatccomponents.overview.allred')"
56
54
  prop="intersection">
@@ -62,7 +62,7 @@
62
62
  @toAutoControl="toAutoControl" />
63
63
 
64
64
  <AzimuthLocking
65
- v-if="preselecttype === '方向锁定' && isShowImplement"
65
+ v-if="preselecttype === '方向锁定'"
66
66
  :realtimeStatusModalvisible="realtimeStatusModalvisible"
67
67
  :phaseList="phaseList"
68
68
  :patternStatus="statusData"