openatc-components 0.3.38 → 0.3.41

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openatc-components",
3
- "version": "0.3.38",
3
+ "version": "0.3.41",
4
4
  "description": "A Vue.js project",
5
5
  "author": "openatc developer",
6
6
  "private": false,
@@ -465,6 +465,7 @@ const zh = {
465
465
  'ringConfig': '环配置',
466
466
  'stage': '阶段',
467
467
  'phase': '相位',
468
+ 'algorithmEngineOptimization': '算法引擎优化中!',
468
469
  'agentidError': '获取设备ID失败!',
469
470
  'splitCheckMsg': '绿信比需大于相位过渡时间或绿信比需大于行人过街+行人过渡时间!',
470
471
  'pattern': '方案',
@@ -14,6 +14,16 @@
14
14
  <div class="board-column-header">
15
15
  {{headerText}}
16
16
  </div>
17
+ <div class="board-table-header" v-if="isSingleCrossMode">
18
+ <el-row :gutter="13">
19
+ <el-col :span="4">{{this.$t('openatccomponents.overview.phase')}}
20
+ </el-col>
21
+ <el-col :span="10">{{this.$t('openatccomponents.overview.flow')}}
22
+ </el-col>
23
+ <el-col :span="10">{{this.$t('openatccomponents.overview.saturationflow')}}
24
+ </el-col>
25
+ </el-row>
26
+ </div>
17
27
  <draggable
18
28
  class="board-column-content"
19
29
  :list="list"
@@ -21,15 +31,21 @@
21
31
  <div class="board-item" v-for="element in list" :key="element.id">
22
32
  <el-row :gutter="25">
23
33
  <el-col :span="4">
24
- <el-tooltip class="item" effect="dark" placement="left">
25
- <div slot="content">{{$t('openatccomponents.pattern.phase') + ' ' + element.id}}</div>
26
- <div class="phase-description">
27
- <DirSelector Width="40px" Height="40px" :showlist="element.desc" :ISActiveMask="ISActiveMask" :MaskColor="MaskColor"></DirSelector>
28
- </div>
29
- </el-tooltip>
34
+ <el-tooltip class="item" effect="dark" placement="left">
35
+ <div slot="content">{{$t('openatccomponents.pattern.phase') + ' ' + element.id}}</div>
36
+ <div class="phase-description">
37
+ <DirSelector Width="40px" Height="40px" :showlist="element.desc" :ISActiveMask="ISActiveMask" :MaskColor="MaskColor"></DirSelector>
38
+ </div>
39
+ </el-tooltip>
40
+ </el-col>
41
+ <el-col :span="19" v-show="!isSingleCrossMode">
42
+ <el-input-number controls-position="right" :min="0" :max="255" :step="1" v-model.number="element.value" ref="type"></el-input-number>
30
43
  </el-col>
31
- <el-col :span="19">
32
- <el-input-number controls-position="right" :min="0" :max="255" :step="1" v-model.number="element.value" ref="type"></el-input-number>
44
+ <el-col :span="10" v-if="isSingleCrossMode">
45
+ <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>
46
+ </el-col>
47
+ <el-col :span="10" v-if="isSingleCrossMode">
48
+ <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>
33
49
  </el-col>
34
50
  </el-row>
35
51
  </div>
@@ -47,6 +63,10 @@ export default {
47
63
  DirSelector
48
64
  },
49
65
  props: {
66
+ isSingleCrossMode: {
67
+ type: Boolean,
68
+ default: false
69
+ },
50
70
  headerText: {
51
71
  type: String,
52
72
  default: 'Header'
@@ -76,17 +96,14 @@ export default {
76
96
  default: '#000000'
77
97
  }
78
98
  },
79
- created () {
80
- console.log('list', this.list)
81
- },
82
99
  watch: {
83
100
  list: {
84
- handler: function () {
85
- let list = this.$refs.type
101
+ handler: function (val) {
102
+ let list = val
86
103
  let cycle = 0
87
104
  let n = this.index
88
105
  for (let i = 0; i < list.length; i++) {
89
- cycle = cycle + Number(list[i].currentValue)
106
+ cycle = cycle + Number(list[i].value)
90
107
  }
91
108
  let obj = {}
92
109
  obj.index = n
@@ -95,6 +112,9 @@ export default {
95
112
  },
96
113
  deep: true
97
114
  }
115
+ },
116
+ created () {
117
+ console.log('list', this.list)
98
118
  }
99
119
  }
100
120
  </script>
@@ -38,6 +38,9 @@
38
38
  </div>
39
39
  <div style="height: 94%;" class="table-container">
40
40
  <PatternTable ref="patterntable"
41
+ :isSingleCrossMode="isSingleCrossMode"
42
+ :isShowTableHeader="isShowTableHeader"
43
+ :tableColums="tableColums"
41
44
  :devicesData="devicesData"
42
45
  :maxTableHeight="maxTableHeight"
43
46
  :opt="item.devs"
@@ -56,8 +59,11 @@
56
59
  </el-container>
57
60
  <div v-if="isShowSingle" style="height: 94%;" class="table-container">
58
61
  <PatternTable ref="patterntable"
62
+ :isSingleCrossMode="isSingleCrossMode"
63
+ :isShowTableHeader="isShowTableHeader"
64
+ :tableColums="tableColums"
59
65
  :devicesData="devicesData"
60
- :opt="opt.optPatternList[0].devs"
66
+ :opt="opt.optPatternList && opt.optPatternList.length > 0 ? opt.optPatternList[0].devs : {}"
61
67
  :isAllowedExpand="isAllowedExpand"
62
68
  :maxTableHeight="maxTableHeight"
63
69
  @onNewPatternListChange="onNewPatternListChange"/>
@@ -97,6 +103,18 @@ export default {
97
103
  type: Object,
98
104
  default: () => null
99
105
  },
106
+ isShowTableHeader: {
107
+ type: Boolean,
108
+ default: true
109
+ },
110
+ isSingleCrossMode: {
111
+ type: Boolean,
112
+ default: false
113
+ },
114
+ tableColums: {
115
+ type: Array,
116
+ default: () => ['no', 'agentid', 'name', 'isused', 'patternid', 'offset', 'cycle', 'pattern']
117
+ },
100
118
  isOnlyOneTab: {
101
119
  type: Boolean,
102
120
  default: true
@@ -255,7 +273,7 @@ export default {
255
273
  for (let opt of optPatternList) {
256
274
  if (opt.devs && opt.devs.length > 0) {
257
275
  for (let dev of opt.devs) {
258
- if (!dev.feature || dev.feature.patternList) {
276
+ if (!dev.feature || !dev.feature.patternList) {
259
277
  resetFlag = true
260
278
  break
261
279
  }
@@ -11,30 +11,57 @@
11
11
  **/
12
12
  <template>
13
13
  <div class="app-container" ref="pattern-container">
14
- <el-table :data="newPatternList" :max-height="tableHeight" id="footerBtn">
14
+ <el-table :data="newPatternList" :max-height="tableHeight" id="footerBtn" :show-header="isShowTableHeader">
15
15
  <el-table-column type="expand" v-if="isAllowedExpand">
16
16
  <template slot-scope="scope">
17
+ <div v-if="isAllowedExpand && isSingleCrossMode" class="optimizetype">
18
+ <span>{{$t('openatccomponents.pattern.optimizetype')}}</span>
19
+ <el-select v-model="value" clearable :placeholder="$t('openatccomponents.common.select')">
20
+ <el-option
21
+ v-for="item in typeOptions"
22
+ :key="item.value"
23
+ :label="$t('openatccomponents.overview.type' + item.value)"
24
+ :value="item.value"
25
+ >
26
+ </el-option>
27
+ </el-select>
28
+ <span class="optimiNum">{{$t('openatccomponents.pattern.optimizecycle')}}</span>
29
+ <el-input v-model="optimizecycle" clearable :placeholder="$t('openatccomponents.common.enter')"></el-input>
30
+ <el-button type="primary" @click="onOptimizeClick(scope.row, scope.$index)">{{$t('openatccomponents.pattern.inoptimize')}}</el-button>
31
+ </div>
17
32
  <div class="components-container board">
18
- <XiaoKanBan v-for="n in scope.row.ringCount" :key="n" class="kanban todo" :list="scope.row.rings[n-1]" :header-text="$t('openatccomponents.pattern.ring') +' '+n" :index="scope.$index" @fatherMethod="fatherMethod"/>
33
+ <XiaoKanBan v-for="n in scope.row.ringCount"
34
+ :key="n"
35
+ :isSingleCrossMode="isSingleCrossMode"
36
+ class="kanban todo"
37
+ :list="scope.row.rings[n-1]"
38
+ :header-text="$t('openatccomponents.pattern.ring') +' '+n"
39
+ :index="scope.$index"
40
+ @fatherMethod="fatherMethod"/>
19
41
  </div>
20
42
  </template>
21
43
  </el-table-column>
22
- <el-table-column align="center" label="No" width="45" minWidth="40">
44
+ <el-table-column align="center" label="No" width="45" minWidth="40" v-if="isShowColumn('no')">
23
45
  <template slot-scope="scope">
24
46
  <span>{{scope.$index+1}}</span>
25
47
  </template>
26
48
  </el-table-column>
27
- <el-table-column align="center" :label="$t('openatccomponents.greenwaveoptimize.deviceid')" width="100" minWidth="40">
49
+ <el-table-column align="center" :label="$t('openatccomponents.greenwaveoptimize.deviceid')" width="100" minWidth="40" v-if="isShowColumn('agentid')">
28
50
  <template slot-scope="scope">
29
51
  <span>{{scope.row.agentid}}</span>
30
52
  </template>
31
53
  </el-table-column>
32
- <el-table-column align="center" :label="$t('openatccomponents.overview.crossname')" width="120" minWidth="40">
54
+ <el-table-column align="center" :label="$t('openatccomponents.greenwaveoptimize.period')" width="100" minWidth="40" v-if="isShowColumn('period')">
55
+ <template slot-scope="scope">
56
+ <span>{{getPeriod(scope.row)}}</span>
57
+ </template>
58
+ </el-table-column>
59
+ <el-table-column align="center" :label="$t('openatccomponents.overview.crossname')" width="120" minWidth="40" v-if="isShowColumn('name')">
33
60
  <template slot-scope="scope">
34
61
  <span>{{getDevName(scope.row)}}</span>
35
62
  </template>
36
63
  </el-table-column>
37
- <el-table-column property="isValid" :label="$t('openatccomponents.token.isValid')" align="center" width="80" prop="isused">
64
+ <el-table-column property="isValid" :label="$t('openatccomponents.token.isValid')" align="center" width="80" prop="isused" v-if="isShowColumn('isused')">
38
65
  <template slot-scope="scope">
39
66
  <el-switch
40
67
  style="padding-left: 5px;"
@@ -46,7 +73,8 @@
46
73
  <el-table-column
47
74
  :label="$t('openatccomponents.greenwaveoptimize.pattern')"
48
75
  width="120"
49
- align="center">
76
+ align="center"
77
+ v-if="isShowColumn('patternid')">
50
78
  <template slot-scope="scope">
51
79
  <el-select
52
80
  v-model="scope.row.patternid"
@@ -64,7 +92,7 @@
64
92
  <span></span>
65
93
  </template>
66
94
  </el-table-column>
67
- <el-table-column align="center" :label="$t('openatccomponents.greenwaveoptimize.offset')" width="70" prop="offset">
95
+ <el-table-column align="center" :label="$t('openatccomponents.greenwaveoptimize.offset')" width="85" prop="offset" v-if="isShowColumn('offset')">
68
96
  <template slot-scope="scope">
69
97
  <el-input-number v-if="isAllowedExpand" :controls="false" :min="0" :step="1" v-model.number="scope.row.offset" size="small" style="width:70%;"></el-input-number>
70
98
  <span v-else>
@@ -72,18 +100,11 @@
72
100
  </span>
73
101
  </template>
74
102
  </el-table-column>
75
- <el-table-column align="center" :label="$t('openatccomponents.greenwaveoptimize.cycle')" width="60" prop="cycle">
103
+ <el-table-column align="center" :label="$t('openatccomponents.greenwaveoptimize.cycle')" width="60" prop="cycle" v-if="isShowColumn('cycle')">
76
104
  </el-table-column>
77
- <el-table-column align="center" :label="$t('openatccomponents.pattern.plan')">
105
+ <el-table-column align="center" :label="$t('openatccomponents.pattern.plan')" v-if="isShowColumn('pattern')">
78
106
  <template slot-scope="scope">
79
107
  <div class="pattern-figure">
80
- <!-- <pattern-list
81
- :patternStatusList="scope.row.rings"
82
- :cycles="scope.row.cycle"
83
- :phaseList="scope.row.currPhase"
84
- :contrloType="getControlType(scope.row)"
85
- >
86
- </pattern-list> -->
87
108
  <pattern-list
88
109
  v-if="getControlType(scope.row) === 'ring'"
89
110
  :patternStatusList="scope.row.rings"
@@ -115,10 +136,11 @@
115
136
  </template>
116
137
 
117
138
  <script>
118
- import XiaoKanBan from '../../XiaoKanBan'
139
+ import XiaoKanBan from '../../XiaoKanBan/index.vue'
119
140
  // import { getPatternList } from '../../../../api/route'
120
141
  import { getIntersectionInfo } from '../../../../api/template'
121
142
  import { getMessageByCode } from '../../../../utils/responseMessage'
143
+ import { getDuration } from '../../../../api/cross'
122
144
  // import { getDirName } from '../../../components/SelectCrossPhase/utils.js'
123
145
  export default {
124
146
  name: 'PatternTable',
@@ -133,10 +155,26 @@ export default {
133
155
  optList: {
134
156
  type: Array
135
157
  },
158
+ isSingleCrossMode: {
159
+ type: Boolean,
160
+ default: false
161
+ },
162
+ tableColums: {
163
+ type: Array,
164
+ default: () => []
165
+ },
136
166
  isAllowedExpand: {
137
167
  type: Boolean,
138
168
  default: true
139
169
  },
170
+ isShowGenerateButton: {
171
+ type: Boolean,
172
+ default: true
173
+ },
174
+ isShowTableHeader: {
175
+ type: Boolean,
176
+ default: true
177
+ },
140
178
  maxTableHeight: {
141
179
  type: Number,
142
180
  default: 200
@@ -144,6 +182,13 @@ export default {
144
182
  },
145
183
  data () {
146
184
  return {
185
+ typeOptions: [{
186
+ value: 'flow-split-opt'
187
+ }, {
188
+ value: 'cycle-opt'
189
+ }],
190
+ value: 'flow-split-opt',
191
+ optimizecycle: 0,
147
192
  controlType: 'stage',
148
193
  loading: true,
149
194
  tableHeight: 460,
@@ -181,6 +226,113 @@ export default {
181
226
  })
182
227
  },
183
228
  methods: {
229
+ onOptimizeClick (row, index) {
230
+ let msg = this.$t('openatccomponents.pattern.algorithmEngineOptimization')
231
+ const loading = this.$loading({
232
+ lock: true,
233
+ text: msg,
234
+ spinner: 'el-icon-loading',
235
+ background: 'rgba(0, 0, 0, 0.7)'
236
+ })
237
+ setTimeout(() => {
238
+ loading.close()
239
+ this.handeleOptimizeClick(row, index)
240
+ }, 1000)
241
+ },
242
+ handeleOptimizeClick (row, index) {
243
+ let newPha = []
244
+ for (let i = 0; i < row.rings.length; i++) {
245
+ newPha.push(...row.rings[i])
246
+ }
247
+ let phaseData = newPha.map(item => {
248
+ return {
249
+ id: item.id,
250
+ flowperhour: item.flowperhour,
251
+ saturation: item.saturation
252
+ }
253
+ })
254
+ let patternList = row.allPatterns
255
+ if (row.feature && row.feature.patternList && row.feature.patternList.length > 0) {
256
+ patternList = row.feature.patternList
257
+ }
258
+ let pattern = patternList.filter((item) => item.id === row.patternid)[0]
259
+ let phaseList = row.currPhase
260
+ let reqData = {
261
+ 'type': this.value,
262
+ 'optcycle': this.optimizecycle ? this.optimizecycle : 0,
263
+ 'phaseList': phaseList,
264
+ 'pattern': pattern,
265
+ 'phases': phaseData
266
+ }
267
+ let isValidata = []
268
+ for (let j = 0; j < newPha.length; j++) {
269
+ let comNum = (newPha[j].length / 4) * 1700 * 0.8
270
+ isValidata.push(newPha[j].flowperhour > comNum)
271
+ }
272
+ if (isValidata.includes(true)) {
273
+ this.$confirm(this.$t('openatccomponents.overview.maxFlow'),
274
+ this.$t('openatccomponents.common.alarm'), {
275
+ confirmButtonText: this.$t('openatccomponents.common.confirm'),
276
+ cancelButtonText: this.$t('openatccomponents.common.cancel'),
277
+ type: 'warning'
278
+ }).then(() => {
279
+ this.doOptimize(row, index, reqData)
280
+ }).catch(() => {})
281
+ } else {
282
+ this.doOptimize(row, index, reqData)
283
+ }
284
+ },
285
+ doOptimize (row, index, reqData) {
286
+ // let _this = this
287
+ getDuration(reqData).then(data => {
288
+ if (data.data.success) {
289
+ this.$message({
290
+ type: 'success',
291
+ message: this.$t('openatccomponents.pattern.success')
292
+ })
293
+ // let cycle = 0
294
+ for (let i = 0; i < row.rings.length; i++) {
295
+ for (let j = 0; j < row.rings[i].length; j++) {
296
+ for (let h = 0; h < data.data.data.phase.length; h++) {
297
+ if (row.rings[i][j].id === data.data.data.phase[h].id) {
298
+ row.rings[i][j].value = data.data.data.phase[h].duration
299
+ // cycle = cycle + row.rings[i][j].value
300
+ }
301
+ }
302
+ }
303
+ }
304
+ // row.cycle = cycle
305
+ // let newPattern = _this.newPatternList[index]
306
+ // newPattern.cycle = cycle
307
+ // newPattern.rings = row.rings
308
+ // _this.newPatternList[index] = newPattern
309
+ // if (row.feature && row.feature.patternList && row.feature.patternList.length > 0) {
310
+ // let pattern = row.feature.patternList.find((item) => item.id === row.patternid)
311
+ // if (pattern) {
312
+ // pattern.cycle = cycle
313
+ // pattern.rings = row.rings
314
+ // }
315
+ // }
316
+ }
317
+ }).catch(error => {
318
+ console.log(error)
319
+ })
320
+ },
321
+ isShowColumn (colum) {
322
+ let res = true
323
+ if (this.tableColums && this.tableColums.length > 0) {
324
+ res = this.tableColums.find(item => item === colum)
325
+ }
326
+ return res
327
+ },
328
+ getPeriod (row) {
329
+ let period = row.period
330
+ let res = ''
331
+ if (period && period.length > 0) {
332
+ res = period[0] + '-' + period[1]
333
+ }
334
+ return res
335
+ },
184
336
  getDevName (row) {
185
337
  let res = row.name ? row.name : ''
186
338
  if (this.devicesData) {
@@ -258,7 +410,9 @@ export default {
258
410
  if (ring.length === 0) continue
259
411
  for (let rr of ring) {
260
412
  rr.desc = []
261
- let direction = currPhase.filter(curp => curp.id === rr.id)[0].direction // 相位方向集合
413
+ let targetPhase = currPhase.filter(curp => curp.id === rr.id)[0]
414
+ if (!targetPhase) continue
415
+ let direction = targetPhase.direction // 相位方向集合
262
416
  let phaseRing = currPhase.filter(curp => curp.id === rr.id)[0].ring
263
417
  count.push(phaseRing)
264
418
  for (let dir of direction) {
@@ -405,17 +559,30 @@ export default {
405
559
  <style lang="scss">
406
560
  .board {
407
561
  width: 100%;
408
- margin-left: 10px;
562
+ margin-left: 10PX;
409
563
  display: flex;
410
- justify-content: space-around;
411
- flex-direction: row;
564
+ justify-content: flex-start;
565
+ gap: 10PX;
412
566
  align-items: flex-start;
413
567
  }
414
- // .kanban {
415
- // &.todo {
416
- // .board-column-header {
417
- // background: $--color-primary;
418
- // }
419
- // }
420
- // }
568
+ .optimizetype{
569
+ font-size: 14PX;
570
+ display: flex;
571
+ justify-content: flex-start;
572
+ align-items: center;
573
+ gap: 10PX;
574
+ padding-left: 20PX;
575
+ .el-input {
576
+ width: 120PX;
577
+ }
578
+ // .el-select{
579
+ // width: 170PX;
580
+ // }
581
+ // .el-button {
582
+ // margin-left: 10PX;
583
+ // }
584
+ .optimiNum {
585
+ padding-left: 10PX;
586
+ }
587
+ }
421
588
  </style>
@@ -119,7 +119,7 @@ export default {
119
119
  let res = []
120
120
  let devs = tab.devs
121
121
  for (let dev of devs) {
122
- if (!dev.patternList || dev.patternList.length === 0) {
122
+ if (!dev.feature || !dev.feature.patternList || dev.feature.patternList.length === 0) {
123
123
  res = list
124
124
  return res
125
125
  }
@@ -127,9 +127,7 @@ export default {
127
127
  let devPatternList = devs.map(item => {
128
128
  let pattern = {
129
129
  agentid: item.agentid,
130
- feature: {
131
- patternList: item.patternList
132
- }
130
+ feature: item.feature
133
131
  }
134
132
  return pattern
135
133
  })