openatc-components 0.1.100 → 0.1.102

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.1.100",
3
+ "version": "0.1.102",
4
4
  "description": "A Vue.js project",
5
5
  "author": "openatc developer",
6
6
  "private": false,
package/src/api/cross.js CHANGED
@@ -16,6 +16,11 @@ export const saveChannelizatonChart = (data) => {
16
16
  return api.Send({}, data, [])
17
17
  }
18
18
 
19
+ export const getDuration = (data) => {
20
+ let api = new Authapi('gettimeplan')
21
+ return api.Send({}, data, [])
22
+ }
23
+
19
24
  export const getChannelizatonChart = (agentid) => {
20
25
  let api = new Authapi('getChannelizatonChart')
21
26
  return api.Send({}, {}, [agentid])
@@ -29,5 +34,6 @@ export const getDetectorStatus = (agentid) => {
29
34
  export default {
30
35
  saveChannelizatonChart,
31
36
  getChannelizatonChart,
32
- getDetectorStatus
37
+ getDetectorStatus,
38
+ getDuration
33
39
  }
@@ -108,6 +108,11 @@ const en = {
108
108
  'divicestate': 'Device Status',
109
109
  'protocoltype': 'Protocol',
110
110
  'signalID': 'Intersection ID',
111
+ 'flow': 'Average lane flow (h)low',
112
+ 'saturationflow': 'Planned lane saturation Flow (h)',
113
+ 'typeflow-split-opt': 'Flow Split Op',
114
+ 'maxFlow': 'The average lane flow is too large. Is it further optimized?',
115
+ 'typecycle-opt': 'Cycle Opt',
111
116
  'signalIP': 'Signal IP',
112
117
  'faultinfo': 'Fault Information',
113
118
  'platform': 'platform',
@@ -125,7 +130,7 @@ const en = {
125
130
  'mode': 'Mode',
126
131
  'stage': 'Stage',
127
132
  'specialcontrol': 'Special Control',
128
- 'phaseclosecontrol': 'Phase Close Control',
133
+ 'phaseclosecontrol': 'Phase release Control',
129
134
  'phaseclose': 'Close Phase',
130
135
  'phaselocking': 'Priority Control',
131
136
  'tentativeplan': 'Tentative Plan',
@@ -407,6 +412,11 @@ const en = {
407
412
  'parameters': 'Parameters',
408
413
  'overLap': 'Over Lap',
409
414
  'plan': 'Plan',
415
+ 'patternOptimize': 'Pattern Optimize',
416
+ 'optimizetype': 'Optimize Type',
417
+ 'inoptimize': 'In Optimize',
418
+ 'success': 'Success',
419
+ 'optimizecycle': 'Optimize Cycle',
410
420
  'ringConfig': 'Ring Config',
411
421
  'stage': 'Stage',
412
422
  'phase': 'Phase',
@@ -857,6 +867,7 @@ const en = {
857
867
  'alarm': 'Alarm',
858
868
  'none': 'none',
859
869
  'weak': 'weak',
870
+ 'enter': 'Please enter the content',
860
871
  'normal': 'normal',
861
872
  'strong': 'strong',
862
873
  'name': 'Name',
@@ -104,6 +104,11 @@ const zh = {
104
104
  },
105
105
  'overview': {
106
106
  'crossinfo': '路口信息',
107
+ 'flow': '车道平均流量(h)',
108
+ 'saturationflow': '车道规划饱和流量(h)',
109
+ 'typeflow-split-opt': '饱和绿信比优化',
110
+ 'maxFlow': '车道平均流量过大,是否继续优化?',
111
+ 'typecycle-opt': '周期优化',
107
112
  'crossname': '路口名称',
108
113
  'divicestate': '设备状态',
109
114
  'protocoltype': '协议类型',
@@ -125,7 +130,7 @@ const zh = {
125
130
  'mode': '控制方式',
126
131
  'stage': '阶段(驻留)',
127
132
  'specialcontrol': '特殊控制',
128
- 'phaseclosecontrol': '相位关断控制',
133
+ 'phaseclosecontrol': '相位放行控制',
129
134
  'phaseclose': '相位关断',
130
135
  'phaselocking': '相位锁定',
131
136
  'tentativeplan': '临时方案',
@@ -405,6 +410,11 @@ const zh = {
405
410
  'parameters': '扩展参数配置',
406
411
  'overLap': '跟随相位',
407
412
  'plan': '方案',
413
+ 'patternOptimize': '方案优化',
414
+ 'optimizecycle': '优化周期',
415
+ 'success': '优化成功',
416
+ 'optimizetype': '优化算法类型',
417
+ 'inoptimize': '优化',
408
418
  'ringConfig': '环配置',
409
419
  'stage': '阶段',
410
420
  'phase': '相位',
@@ -851,6 +861,7 @@ const zh = {
851
861
  'clone': '克隆',
852
862
  'deleteall': '全部删除',
853
863
  'update': '修改',
864
+ 'enter': '请输入',
854
865
  'search': '搜索',
855
866
  'alarm': '警告',
856
867
  'none': '无',
@@ -117,7 +117,7 @@ export default {
117
117
  }
118
118
  },
119
119
  created () {
120
- this.addMinSplit()
120
+ // this.addMinSplit()
121
121
  // console.log(this.list, 'list')
122
122
  },
123
123
  watch: {
@@ -134,7 +134,7 @@ export default {
134
134
  // let MaxCycle = globalParamModel.getParamsByType('patternList')[n].cycle
135
135
  // let pattern = globalParamModel.getParamsByType('patternList')[n]
136
136
  // globalParamModel.getParamsByType('patternList')[n].cycle = this.getMaxCycle(pattern)
137
- this.addMinSplit()
137
+ // this.addMinSplit()
138
138
  this.$emit('handleSplit', n, newList)
139
139
  },
140
140
  deep: true
@@ -0,0 +1,272 @@
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>
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="optimize()">{{$t('openatccomponents.pattern.inoptimize')}}</el-button>
28
+ </div>
29
+ <div class="common-board-column" :style="{marginTop:this.nowNumber === 1 ? 0 : '50px'}">
30
+ <div class="common-board-column-header">
31
+ {{headerText}}
32
+ </div>
33
+ <div class="common-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="40px" Height="40px" :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 '../XRDDirSelector/XRDDirSelector'
73
+
74
+ export default {
75
+ name: 'patternOptimize',
76
+ components: {
77
+ draggable,
78
+ xdrdirselector
79
+ },
80
+ data () {
81
+ return {
82
+ showStyle: {
83
+ left: '8px',
84
+ top: '3px'
85
+ },
86
+ typeOptions: [{
87
+ value: 'flow-split-opt'
88
+ }, {
89
+ value: 'cycle-opt'
90
+ }],
91
+ value: '',
92
+ optimizecycle: 0
93
+ }
94
+ },
95
+ props: {
96
+ headerText: {
97
+ type: String,
98
+ default: 'Header'
99
+ },
100
+ rings: {
101
+ type: Object
102
+ },
103
+ nowNumber: {
104
+ type: Number
105
+ },
106
+ phaseList: {
107
+ type: Array
108
+ },
109
+ options: {
110
+ type: Object,
111
+ default () {
112
+ return {}
113
+ }
114
+ },
115
+ list: {
116
+ type: Array,
117
+ default () {
118
+ return []
119
+ }
120
+ },
121
+ // index: {
122
+ // type: Number
123
+ // },
124
+ ISActiveMask: {
125
+ type: Boolean,
126
+ default: true
127
+ },
128
+ // 当phase的描述为空时,显示的图形颜色。
129
+ MaskColor: {
130
+ type: String,
131
+ default: '#000000'
132
+ }
133
+ },
134
+ created () {
135
+ // this.addMinSplit()
136
+ this.addMin()
137
+ },
138
+ watch: {
139
+ list: {
140
+ handler: function () {
141
+ this.addMin()
142
+ // let list = this.$refs.type
143
+ // let flow = this.$refs.types
144
+ // console.log(this.list, 'list')
145
+ // let cycle = 0
146
+ // let n = this.index
147
+ // for (let i = 0; i < list.length; i++) {
148
+ // cycle = cycle + Number(list[i].currentValue)
149
+ // }
150
+ // const globalParamModel = this.$store.getters.globalParamModel
151
+ // // let MaxCycle = globalParamModel.getParamsByType('patternList')[n].cycle
152
+ // let pattern = globalParamModel.getParamsByType('patternList')[n]
153
+ // globalParamModel.getParamsByType('patternList')[n].cycle = this.getMaxCycle(pattern)
154
+ // this.addMinSplit()
155
+ // this.$emit('handleSplit', n)
156
+ },
157
+ deep: true
158
+ }
159
+ },
160
+ methods: {
161
+ optimize () {
162
+ let _that = this
163
+ let newPha = []
164
+ for (let i = 0; i < _that.rings.rings.length; i++) {
165
+ newPha.push(..._that.rings.rings[i])
166
+ }
167
+ let phaseData = newPha.map(item => {
168
+ return {
169
+ id: item.id,
170
+ flowperhour: item.flowperhour,
171
+ saturation: item.saturation
172
+ }
173
+ })
174
+ // let patternList = _that.$store.state.globalParam.tscParam.patternList
175
+ // console.log(patternList, 'patternList')
176
+ let pattern = _that.rings
177
+ let reqData = {
178
+ 'type': _that.value,
179
+ 'optcycle': _that.optimizecycle,
180
+ 'phaseList': _that.phaseList,
181
+ 'pattern': pattern,
182
+ 'phases': phaseData
183
+ }
184
+ let isValidata = []
185
+ for (let j = 0; j < newPha.length; j++) {
186
+ let comNum = (newPha[j].length / 4) * 1700 * 0.8
187
+ isValidata.push(newPha[j].flowperhour > comNum)
188
+ }
189
+ if (isValidata.includes(true)) {
190
+ this.$confirm(this.$t('openatccomponents.overview.maxFlow'),
191
+ this.$t('openatccomponents.common.alarm'), {
192
+ confirmButtonText: this.$t('openatccomponents.common.confirm'),
193
+ cancelButtonText: this.$t('openatccomponents.common.cancel'),
194
+ type: 'warning'
195
+ }).then(() => {
196
+ getDuration(reqData).then(data => {
197
+ if (data.data.success) {
198
+ _that.$message({
199
+ type: 'success',
200
+ message: _that.$t('openatccomponents.pattern.success')
201
+ })
202
+ for (let i = 0; i < _that.rings.rings.length; i++) {
203
+ for (let j = 0; j < _that.rings.rings[i].length; j++) {
204
+ for (let h = 0; h < data.data.data.phase.length; h++) {
205
+ if (_that.rings.rings[i][j].id === data.data.data.phase[h].id) {
206
+ _that.rings.rings[i][j].value = data.data.data.phase[h].duration
207
+ // _that.rings[i][j].cycle = data.data.data.phase[h].cycle
208
+ }
209
+ }
210
+ }
211
+ }
212
+ }
213
+ }).catch(error => {
214
+ console.log(error)
215
+ })
216
+ }).catch(() => {
217
+ })
218
+ } else {
219
+ getDuration(reqData).then(data => {
220
+ if (data.data.success) {
221
+ _that.$message({
222
+ type: 'success',
223
+ message: _that.$t('openatccomponents.pattern.success')
224
+ })
225
+ for (let i = 0; i < _that.rings.rings.length; i++) {
226
+ for (let j = 0; j < _that.rings.rings[i].length; j++) {
227
+ for (let h = 0; h < data.data.data.phase.length; h++) {
228
+ if (_that.rings.rings[i][j].id === data.data.data.phase[h].id) {
229
+ _that.rings.rings[i][j].value = data.data.data.phase[h].duration
230
+ // _that.rings[i][j].cycle = data.data.data.phase[h].cycle
231
+ }
232
+ }
233
+ }
234
+ }
235
+ }
236
+ }).catch(error => {
237
+ console.log(error)
238
+ })
239
+ }
240
+ },
241
+ addMin () {
242
+ for (let i of this.list) {
243
+ if (!i.flowperhour || !i.saturation) {
244
+ i.flowperhour = 0
245
+ i.saturation = 1700
246
+ i.length = this.list.length
247
+ }
248
+ }
249
+ }
250
+ }
251
+ }
252
+ </script>
253
+ <style lang="scss" scoped>
254
+ .col-content {
255
+ width: 100%;
256
+ }
257
+ .optimizetype{
258
+ margin:0 0 10PX 0;
259
+ .el-input {
260
+ width: 80PX;
261
+ }
262
+ .el-select{
263
+ width: 145PX;
264
+ }
265
+ .el-button {
266
+ margin-left: 10PX;
267
+ }
268
+ .optimiNum {
269
+ padding-left: 10PX;
270
+ }
271
+ }
272
+ </style>
@@ -0,0 +1,2 @@
1
+ import PatternOptimize from './PatternOptimize.vue'
2
+ export default PatternOptimize
@@ -139,6 +139,21 @@
139
139
  </el-col>
140
140
  </el-row>
141
141
  </el-tab-pane>
142
+ <el-tab-pane :label="$t('openatccomponents.pattern.patternOptimize')" name="patternOptimize">
143
+ <pattern-optimize
144
+ v-for="n in optimizes"
145
+ :key="n" class="expendkanban"
146
+ :list="patternOne.length===0?planPattern.rings[n-1]:patternOne[0].rings[n-1]"
147
+ :rings="patternOne.length===0?planPattern:patternOne[0]"
148
+ :phaseList="phaseList"
149
+ :options="options"
150
+ :header-text="$t('openatccomponents.pattern.ring')+n"
151
+ :index="n"
152
+ :nowNumber="n"
153
+ @handleSplit="handleSplit"
154
+ >
155
+ </pattern-optimize>
156
+ </el-tab-pane>
142
157
  </el-tabs>
143
158
  </el-row>
144
159
  <div class="footer" v-if="realtimeStatusModalvisible">
@@ -209,6 +224,8 @@ export default {
209
224
  activeList: 'ring',
210
225
  ringCount: 1,
211
226
  ringCounts: 1,
227
+ barriers: [],
228
+ optimizes: 1,
212
229
  coordphaseOption: [],
213
230
  patternOne: [],
214
231
  planPattern: {},
@@ -230,6 +247,188 @@ export default {
230
247
  this.initData()
231
248
  },
232
249
  methods: {
250
+ tranform (arr) { // 分barrier
251
+ let newMap = new Map()
252
+ arr.forEach(({id, current}) => {
253
+ const find = newMap.get(current.join())
254
+ if (find) newMap.get(current.join()).push(id)
255
+ else newMap.set(current.join(), [id])
256
+ })
257
+ let ret = []
258
+ newMap.forEach((value, key) => {
259
+ ret.push(Array.from(new Set(key.split(',').map(Number).concat(value))))
260
+ })
261
+ const result = []
262
+ for (const a of ret) {
263
+ let merged = false
264
+ for (const r of result) {
265
+ if (this.check([...r], a)) {
266
+ a.forEach(item => r.add(item))
267
+ merged = true
268
+ }
269
+ }
270
+ if (!merged) {
271
+ result.push(new Set(a))
272
+ }
273
+ merged = false
274
+ }
275
+ return result.map(s => [...s])
276
+ },
277
+ check (arr1, arr2) {
278
+ return arr1.some(a1 => arr2.some(a2 => a1 === a2))
279
+ },
280
+ handleCurrentChange (val) { // 两个ring的数据
281
+ if (val === null || val.length === 0) return
282
+ // 按环序分组
283
+ let ringlength = []
284
+ let ringsequence = val.map(item => {
285
+ if (item.length === 0) return
286
+ ringlength.push(item.length)
287
+ return item.map(k => {
288
+ return k.id
289
+ })
290
+ })
291
+ let newRings = ringsequence.filter(item => item)
292
+ let minLength = Math.min(...ringlength)
293
+ let resultArrs = [] // 环1分组
294
+ let resultArr = [] // 环2分组
295
+ for (let j = 0; j < ringsequence[0].length; j += minLength) {
296
+ resultArrs.push(ringsequence[0].slice(j, j + minLength))
297
+ if (ringsequence[0].length === minLength) {
298
+ resultArrs.push([])
299
+ }
300
+ }
301
+ if (newRings.length > 1) {
302
+ for (let i = 0; i < ringsequence[1].length; i += minLength) {
303
+ resultArr.push(ringsequence[1].slice(i, i + minLength))
304
+ }
305
+ }
306
+ // this.patternInfo = []
307
+ // this.barrierList = []
308
+ let currentArr = []
309
+ let newPattern = []
310
+ val.map(i => {
311
+ newPattern.push(...i)
312
+ })
313
+ if (this.phaseList.length === 0) return
314
+ for (let patternStatus of val[0]) {
315
+ // if (patternStatus.mode !== 7) {
316
+ let concurrent = this.phaseList.filter((item) => {
317
+ return item.id === patternStatus.id // patternStatus.id当前相位id concurrent当前相位的并发相位
318
+ })[0].concurrent// 当前相位的并发相位
319
+ if (concurrent) {
320
+ let obj = {
321
+ id: patternStatus.id,
322
+ current: concurrent.sort()
323
+ }
324
+ currentArr.push(obj)
325
+ }
326
+ // }
327
+ }
328
+ if (currentArr.length !== 0) {
329
+ let newCurrent = this.tranform(currentArr)
330
+ // 取没个环与环关系的并集
331
+ let barrierRing1 = []
332
+ let barrierRing2 = []
333
+ let ring1 = [] // 环1与关系1的并集
334
+ for (let h = 0; h < newCurrent.length; h++) {
335
+ let adds = [...new Set(resultArrs[0])].filter(item => newCurrent[h].includes(item))
336
+ ring1.push(adds)
337
+ }
338
+ let ring1s = [] // 环1与关系2的并集
339
+ for (let h = 0; h < newCurrent.length; h++) {
340
+ let addRing1 = [...new Set(resultArrs[1])].filter(item => newCurrent[h].includes(item))
341
+ ring1s.push(addRing1)
342
+ }
343
+ barrierRing1.push(...ring1, ...ring1s)
344
+ let resultList = []
345
+ if (newRings.length > 1) {
346
+ let ring2s = [] // 环2与关系1的并集
347
+ for (let h = 0; h < newCurrent.length; h++) {
348
+ let addRing2 = [...new Set(resultArr[1])].filter(item => newCurrent[h].includes(item))
349
+ ring2s.push(addRing2)
350
+ }
351
+ let ring2 = [] // 环2与关系1的并集
352
+ for (let h = 0; h < newCurrent.length; h++) {
353
+ let add = [...new Set(resultArr[0])].filter(item => newCurrent[h].includes(item))
354
+ ring2.push(add)
355
+ }
356
+ barrierRing2.push(...ring2, ...ring2s)
357
+ for (let k = 0; k < barrierRing1.length; k++) {
358
+ resultList.push(barrierRing1[k].concat(barrierRing2[k]))
359
+ }
360
+ }
361
+ let resultLists = resultList.filter(item => item.length !== 0)
362
+ let ringArr = []
363
+ for (let l = 0; l < resultLists.length; l++) {
364
+ for (let d = 0; d < newCurrent.length; d++) {
365
+ if (newCurrent[d].filter(item => resultLists[l].includes(item)).length > 0) {
366
+ ringArr.push({
367
+ data: resultLists[l],
368
+ id: d + 1,
369
+ index: l
370
+ })
371
+ }
372
+ }
373
+ }
374
+ for (var i = 0; i < ringArr.length; i++) {
375
+ for (var j = i + 1; j < ringArr.length; j++) {
376
+ if (ringArr[i].id === ringArr[j].id && ringArr[i].index + 1 === ringArr[j].index) {
377
+ ringArr[i].data = ringArr[i].data.concat(ringArr[j].data)
378
+ ringArr.splice(ringArr.indexOf(ringArr[j].id), 1)
379
+ }
380
+ }
381
+ }
382
+ let resArr = ringArr.map(item => item.data)
383
+ let ringTeam = this.step1(this.phaseList, resArr)
384
+ let ringTeams = ringTeam.filter(item => item.length !== 0)
385
+ return this.setBarrier(ringTeams, val)
386
+ }
387
+ },
388
+ setBarrier (ringTeam, val) {
389
+ const patternObjs = {}
390
+ val.forEach(l => {
391
+ l.map(k => {
392
+ patternObjs[k.id] = k.value
393
+ })
394
+ })
395
+ let ret = ringTeam.map((y, index) => {
396
+ if (!y || y.length === 0) return
397
+ y.map(n => {
398
+ n.length = n.data.length > 1 ? n.data.reduce((pre, cur) => pre + patternObjs[cur], 0) : patternObjs[n.data[0]]
399
+ })
400
+ return {
401
+ barrier: index + 1,
402
+ length: y[0].length,
403
+ items: y.map(j => {
404
+ return {
405
+ ring: j.ring,
406
+ data: j.data
407
+ }
408
+ })
409
+ }
410
+ })
411
+ return ret
412
+ },
413
+ step1 (list, arr) { // 各个环包含的相位
414
+ const ret = []
415
+ const listObj = {}
416
+ list.forEach(l => {
417
+ listObj[l.id] = l.ring
418
+ })
419
+ arr.forEach(a => {
420
+ const retItem = []
421
+ a.forEach(b => {
422
+ if (listObj[b]) {
423
+ const find = retItem.find(r => r.ring === listObj[b])
424
+ if (find) find.data.push(b)
425
+ else retItem.push({ring: listObj[b], data: [b]})
426
+ }
427
+ })
428
+ ret.push(retItem)
429
+ })
430
+ return ret
431
+ },
233
432
  patternPlan () {
234
433
  let Pattern = {
235
434
  offset: 0,
@@ -257,6 +456,8 @@ export default {
257
456
  newPattern.rings[3].push(ring)
258
457
  }
259
458
  }
459
+ let barrier = this.handleCurrentChange(newPattern.rings)
460
+ newPattern.barriers = barrier
260
461
  this.planPattern = newPattern
261
462
  },
262
463
  getCycle () {
@@ -540,6 +741,8 @@ export default {
540
741
  this.ringCount = this.ringCount.sort(this.sortNumbers) // 把数组中的值按照从小到大的顺序重新排序
541
742
  this.ringCounts = Array.from(new Set(rings)) // 去除数组重复的元素
542
743
  this.ringCounts = this.ringCounts.sort(this.sortNumbers) // 把数组中的值按照从小到大的顺序重新排序
744
+ this.optimizes = Array.from(new Set(rings)) // 去除数组重复的元素
745
+ this.optimizes = this.optimizes.sort(this.sortNumbers) // 把数组中的值按照从小到大的顺序重新排序
543
746
  // this.increaseId()
544
747
  // this.getCycle()
545
748
  // this.updatePhaseDescription()
@@ -51,7 +51,7 @@
51
51
  <el-input
52
52
  v-if="this.contrloType === 'ring' || !this.contrloType"
53
53
  size="small"
54
- :value="stage.stageKanban.join(',')"
54
+ :value="stage.stageKanban?stage.stageKanban.join(','):''"
55
55
  ref="type"
56
56
  :disabled="true">
57
57
  </el-input>
@@ -14,6 +14,7 @@ import PatternStatus from './components/PatternStatus/index'
14
14
  import BoardCard from './components/BoardCard/index'
15
15
  import StageStatus from './components/StageStatus/index'
16
16
  import OverLap from './components/OverLap/index'
17
+ import PatternOptimize from './components/PatternOptimize/index'
17
18
  import Stages from './components/Stages/index'
18
19
  import PhaseMarker from './components/PhaseMarker/index'
19
20
  import overView from './components/overView/index'
@@ -48,6 +49,7 @@ const components = {
48
49
  patternList,
49
50
  CommonKanban,
50
51
  Stages,
52
+ PatternOptimize,
51
53
  PhaseMarker,
52
54
  overView,
53
55
  KanBan,
@@ -104,6 +104,11 @@
104
104
  "url": "/devs",
105
105
  "method": "get"
106
106
  },
107
+ {
108
+ "key": "gettimeplan",
109
+ "url": "/fixedtimeplan",
110
+ "method": "post"
111
+ },
107
112
  {
108
113
  "key": "getTscCurrentVolume",
109
114
  "url": "/devs/message",
@@ -411,7 +411,7 @@
411
411
  .model-label, .stage-label {
412
412
  color: $--color-text-secondary;
413
413
  }
414
- .expendkanban {
414
+ .expendkanban .common-board-column{
415
415
  width: 77% !important;
416
416
  margin: 0 auto;
417
417
  margin-bottom: 13PX;