刘朋
8 months ago
51 changed files with 1463 additions and 655 deletions
After Width: | Height: | Size: 10 KiB |
@ -0,0 +1,111 @@ |
|||
<template> |
|||
<div class="boardPreview" ref="compBox"> |
|||
<div class="boardBox" :style="boardStyle" v-if="isReady"> |
|||
<p class="boardTxt" v-for="item,index in contentArr" :key="index" :style="boardTxtStyle" v-html="item" v-if="(index + 1) <= lineTotal"> |
|||
</p> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
<script> |
|||
export default { |
|||
name:"BoardPreview", |
|||
data(){ |
|||
return { |
|||
isReady: false, |
|||
boardStyle:null, |
|||
boardTxtStyle:null, |
|||
contentArr:{ |
|||
type:Array, |
|||
default:()=>[] |
|||
}, |
|||
lineTotal: 0 |
|||
} |
|||
}, |
|||
props:{ |
|||
tpl: { |
|||
type: Object, |
|||
default: ()=>{} |
|||
}, |
|||
}, |
|||
watch:{ |
|||
tpl:{ |
|||
handler(newV){ |
|||
this.contentArr = this.tpl.CONTENT.replaceAll(/\\\\n/g, '\n').replaceAll(/\\=/g, '=').replaceAll(/\\,/g, ',').replaceAll(/ /g, ' ').split('\n'); |
|||
this.setStyle(); |
|||
}, |
|||
deep:true, |
|||
immediate:true |
|||
} |
|||
}, |
|||
computed:{ |
|||
}, |
|||
mounted(){ |
|||
}, |
|||
methods:{ |
|||
setStyle() { |
|||
this.$nextTick(() => { |
|||
|
|||
let boxW = this.$refs["compBox"].clientWidth; |
|||
let boxH = this.$refs["compBox"].clientHeight; |
|||
let boardW = this.tpl.width; |
|||
let boardH = this.tpl.height; |
|||
let scale = 1; |
|||
if (boxH > 20) { //判断是否设置了显示高度,判断>0即可,20是为了兼容误差 |
|||
if (boardW / boardH > boxW / boxH) { |
|||
scale = boxW / boardW; |
|||
} else { |
|||
scale = boxH / boardH; |
|||
} |
|||
} else { |
|||
if (boardW > boxW) { |
|||
scale = boxW / boardW; |
|||
} |
|||
} |
|||
|
|||
this.boardStyle = { |
|||
width: `${boardW * scale}px`, |
|||
height: `${boardH * scale}px`, |
|||
"align-items" : ['flex-start', 'flex-end', 'center'][this.tpl.formatStyle] //模板的字段为为formatStyle |
|||
} |
|||
let fontSize = 0; |
|||
if (_.isString(this.tpl.FONT_SIZE)) { |
|||
fontSize = this.tpl.FONT_SIZE.replace('px', '') * 1; |
|||
} else { |
|||
fontSize = this.tpl.fontSize; |
|||
} |
|||
this.boardTxtStyle = { |
|||
"color": "#" + this.tpl.COLOR, //模板的字段为fontColor |
|||
"font-size": `${fontSize*scale}px`, |
|||
"font-family": this.fontTypeDic[this.tpl.FONT || '3'], //模板的字段为fontType |
|||
"min-height": `${fontSize * scale}px` |
|||
} |
|||
this.lineTotal = Math.floor(boardH / fontSize); |
|||
this.isReady = true; |
|||
|
|||
}) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style lang="scss" scoped> |
|||
.boardPreview{ |
|||
display: flex; |
|||
flex-direction: row; |
|||
justify-content: center; |
|||
align-items: center; |
|||
.boardBox { |
|||
background-color: #000; |
|||
display: flex; |
|||
overflow: hidden; |
|||
flex-direction: column; |
|||
justify-content: center; |
|||
.boardTxt{ |
|||
color: #f00; |
|||
line-height: 1; |
|||
margin-bottom: 0; |
|||
word-break: keep-all; |
|||
white-space: nowrap; |
|||
} |
|||
} |
|||
} |
|||
</style> |
After Width: | Height: | Size: 1.3 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 1.4 KiB |
@ -0,0 +1,55 @@ |
|||
<template> |
|||
<Dialog v-model="modelVisible" title="设备操作" width="550px"> |
|||
<div class="DeviceControlDialog"> |
|||
<DeviceParams :dialogData="dialogData" /> |
|||
</div> |
|||
</Dialog> |
|||
</template> |
|||
|
|||
<script> |
|||
import Dialog from "@screen/components/Dialog/index.vue"; |
|||
import DeviceParams from "./DeviceParams.vue"; |
|||
|
|||
export default { |
|||
name: "DeviceControlDialog", |
|||
components: { |
|||
Dialog, |
|||
DeviceParams, |
|||
}, |
|||
model: { |
|||
prop: "visible", |
|||
event: "update:value", |
|||
}, |
|||
props: { |
|||
visible: Boolean, |
|||
dialogData: { |
|||
type: Object, |
|||
default: () => ({}), |
|||
}, |
|||
}, |
|||
computed: { |
|||
modelVisible: { |
|||
get() { |
|||
return this.visible; |
|||
}, |
|||
set(val) { |
|||
this.$emit("update:value", val); |
|||
}, |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.DeviceControlDialog { |
|||
width: 510px; |
|||
display: flex; |
|||
flex-direction: column; |
|||
gap: 15px; |
|||
min-height: 360px; |
|||
|
|||
.tips { |
|||
font-size: 12px; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,167 @@ |
|||
<template> |
|||
<div class='DeviceParams'> |
|||
<div class="no-data" v-if="!devicesList.length" v-loading="secondLoading">暂无设备参数</div> |
|||
<Descriptions :list="devicesList" :data="devicesData" style="gap: 18px;" column="6"> |
|||
<template v-for="item in devicesList.slice(0, -1)" #[`content-${getSlotKey(item.key)}`]="{ data }"> |
|||
<span>{{ data.text }}</span> |
|||
<Switcher v-if="!disabled" class="switcher" :activeOption="activeOption" :value="data.state" |
|||
@change="(value) => handleSwitcherChange(value, data)" /> |
|||
<ElTag style="margin-left: 20px;" v-else effect="dark" :type="data.state ? '' : 'info'">{{ data.state ? '开' : |
|||
'关' }} |
|||
</ElTag> |
|||
</template> |
|||
</Descriptions> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import Descriptions from '@screen/components/Descriptions.vue'; |
|||
import Switcher from '@screen/pages/service/PublishingChannelManagement/components/Switcher.vue'; |
|||
import request from "@/utils/request"; |
|||
import { Message } from 'element-ui'; |
|||
import { confirm } from "@screen/utils/common"; |
|||
import { devicesFormList } from '../data.js'; |
|||
|
|||
export default { |
|||
name: 'DeviceParams', |
|||
components: { |
|||
Descriptions, |
|||
Switcher |
|||
}, |
|||
props: { |
|||
dialogData: { |
|||
type: Object, |
|||
default: () => ({}) |
|||
}, |
|||
disabled: Boolean |
|||
}, |
|||
data() { |
|||
return { |
|||
secondLoading: true, |
|||
devicesList: [], |
|||
devicesData: {}, |
|||
activeOption: { |
|||
active: { |
|||
text: "开" |
|||
}, |
|||
unActive: { |
|||
text: "关" |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
created() { |
|||
// this.devicesList = devicesFormList; |
|||
this.devicesList = []; |
|||
let devs = []; |
|||
// Promise.all([this.getAc('A1'), this.getAc('A2'), this.getAc('A3'), this.getAc('A4'), this.getAc('A5'), this.getAc('A6')]).then(res => { |
|||
Promise.all([this.getAc()]).then(res => { |
|||
console.log('res', res) |
|||
request({ |
|||
url: `/business/device/properties/latest/${this.dialogData.iotDeviceId}`, |
|||
method: "get", |
|||
}).then(result => { |
|||
if (result.code != 200) return Message.error("操作失败"); |
|||
result.data.forEach(item => { |
|||
devs.push({ |
|||
label: item.propertyName, |
|||
key: item.property, |
|||
gridColumn: 3, |
|||
}); |
|||
this.devicesData[item.property] = item.formatValue; |
|||
}); |
|||
this.devicesList = devs; |
|||
}) |
|||
|
|||
}) |
|||
}, |
|||
methods: { |
|||
getAc() { |
|||
return request({ |
|||
url: `/business/device/batchFunctions`, |
|||
method: "post", |
|||
data: { |
|||
devices: [{ |
|||
iotDeviceId: this.dialogData.iotDeviceId, |
|||
id: this.dialogData.id, |
|||
deviceType: 15 |
|||
}], |
|||
functions: [ |
|||
{ |
|||
functionId: "A1", |
|||
params: {} |
|||
}, { |
|||
functionId: "A2", |
|||
params: {} |
|||
}, { |
|||
functionId: "A3", |
|||
params: {} |
|||
}, { |
|||
functionId: "A4", |
|||
params: {} |
|||
}, { |
|||
functionId: "A5", |
|||
params: {} |
|||
}, { |
|||
functionId: "A6", |
|||
params: {} |
|||
} |
|||
], |
|||
// parameter: {} |
|||
} |
|||
}) |
|||
}, |
|||
async handleSwitcherChange(value, data) { |
|||
let str = data.state ? "关闭" : "开启"; |
|||
let deviceName = ""; |
|||
if (data.key.includes("fan")) { |
|||
str += "风扇?"; |
|||
deviceName = "fan_out_en"; |
|||
} else { |
|||
str += "该支路?" |
|||
deviceName = data.key.match(/^[a-z]+_out|[0-9]+/g).join("_") + "_en"; //dc_out_2_en ac_out_2_en; |
|||
} |
|||
data.state = value; |
|||
const isContinue = await confirm({ message: `${str}` }) |
|||
.catch(() => { |
|||
console.log(data.state, value, 333) |
|||
data.state = !value; |
|||
}); |
|||
|
|||
if (!isContinue) return; |
|||
|
|||
// https://www.yuque.com/dayuanzhong-ovjwn/gkht0m/ww776d5kzs72ilzh?singleDoc= |
|||
request({ |
|||
url: `/business/device/functions/${this.dialogData.iotDeviceId}/${102}`, |
|||
method: "POST", |
|||
data: { |
|||
deviceName, |
|||
// 开关:1=打开,0=关闭 |
|||
value: value ? 1 : 0 |
|||
} |
|||
}) |
|||
.then(result => { |
|||
if (result.code != 200) { |
|||
Message.error("操作失败"); |
|||
data.state = !value; |
|||
return; |
|||
}; |
|||
Message.success("操作成功"); |
|||
}) |
|||
.catch(() => { |
|||
data.state = !value; |
|||
Message.error("操作失败"); |
|||
}) |
|||
}, |
|||
getSlotKey(key) { |
|||
return key.includes('electricity') || key.includes('fan') ? key : '' |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang='scss' scoped> |
|||
.DeviceParams { |
|||
height: 100%; |
|||
} |
|||
</style> |
@ -0,0 +1,44 @@ |
|||
export const devicesFormList = [ |
|||
{ |
|||
label: "设备内温度过高", |
|||
key: `theInternalTemperatureOfTheDeviceOverheats`, |
|||
// text: "-",
|
|||
gridColumn: 2, |
|||
}, |
|||
{ |
|||
label: "阵列电压", |
|||
key: `arrayVoltage`, |
|||
// text: "-",
|
|||
gridColumn: 2, |
|||
}, |
|||
{ |
|||
label: "阵列电流", |
|||
key: `arrayCurrent`, |
|||
// text: "-",
|
|||
gridColumn: 2, |
|||
}, |
|||
{ |
|||
label: "发电功率L", |
|||
key: `generatingPowerL`, |
|||
text: "-", |
|||
gridColumn: 2, |
|||
}, |
|||
{ |
|||
label: "发电功率H", |
|||
key: `generatingPowerH`, |
|||
text: "-", |
|||
gridColumn: 2, |
|||
}, |
|||
{ |
|||
label: "负载电压", |
|||
key: `loadVoltage`, |
|||
text: "-", |
|||
gridColumn: 2, |
|||
}, |
|||
{ |
|||
label: "负载电流", |
|||
key: `loadCurrent`, |
|||
text: "-", |
|||
gridColumn: 2, |
|||
}, |
|||
]; |
@ -0,0 +1,197 @@ |
|||
<template> |
|||
<Dialog v-model="obverseVisible" title="太阳能板" width="550px"> |
|||
<Video class="video-stream" :pileNum="dialogData.stakeMark" /> |
|||
|
|||
<div class="SolarEnergy"> |
|||
<ElTabs v-model="activeName" class="tabs"> |
|||
<ElTabPane label="基本信息" name="first"> |
|||
<!-- {{ dialogData }} --> |
|||
<Descriptions :list="list" :data="data" style="gap: 18px" /> |
|||
</ElTabPane> |
|||
<ElTabPane label="设备参数" name="second"> |
|||
<DeviceParams disabled :dialogData="dialogData" /> |
|||
</ElTabPane> |
|||
<ElTabPane label="在线率统计" name="third"> |
|||
<LineChart v-if="activeName === 'third'" :productId="dialogData.id" style="height: 180px" /> |
|||
</ElTabPane> |
|||
</ElTabs> |
|||
</div> |
|||
<!-- <template #footer> |
|||
<Button v-if="activeName != 'first' && data.deviceState == '1'" @click.native="deviceControlVisible = true"> |
|||
设备操作 |
|||
</Button> |
|||
<Button v-else-if="activeName != 'first'" style="background-color: #bbb"> |
|||
设备离线 |
|||
</Button> |
|||
</template> --> |
|||
|
|||
<DeviceControlDialog v-model="deviceControlVisible" :dialogData="dialogData" /> |
|||
</Dialog> |
|||
</template> |
|||
|
|||
<script> |
|||
import Dialog from "@screen/components/Dialog/index.vue"; |
|||
import Button from "@screen/components/Buttons/Button.vue"; |
|||
import Descriptions from "@screen/components/Descriptions.vue"; |
|||
import Video from "@screen/components/Video"; |
|||
import LineChart from "../../LineChart/index.vue"; |
|||
import DeviceParams from "./components/DeviceParams.vue"; |
|||
import DeviceControlDialog from "./components/DeviceControlDialog.vue"; |
|||
|
|||
import request from "@/utils/request"; |
|||
|
|||
import { |
|||
getRoadInfoByStakeMark, |
|||
getProduct, |
|||
} from "@screen/pages/Home/components/RoadAndEvents/utils/httpList.js"; |
|||
import { dialogDelayVisible } from "./../mixin"; |
|||
import { resolve } from "@antv/x6/lib/registry/node-anchor/util"; |
|||
|
|||
// 太阳能板 |
|||
export default { |
|||
name: "SolarEnergy", |
|||
mixins: [dialogDelayVisible], |
|||
components: { |
|||
Dialog, |
|||
Descriptions, |
|||
LineChart, |
|||
Video, |
|||
Button, |
|||
DeviceParams, |
|||
DeviceControlDialog, |
|||
}, |
|||
data() { |
|||
return { |
|||
activeName: "first", |
|||
releaseVisible: false, |
|||
deviceControlVisible: false, |
|||
data: { |
|||
deviceName: "LH24", |
|||
roadName: "G35济泽高速", |
|||
stakeMark: "k094+079", |
|||
direction: "1", |
|||
organizationName: "山东高速济南发展公司", |
|||
brand: "XXX厂家", |
|||
deviceState: "0", |
|||
}, |
|||
list: [ |
|||
{ |
|||
label: "设备名称", |
|||
key: "deviceName", |
|||
}, |
|||
{ |
|||
label: "设备桩号", |
|||
key: "stakeMark", |
|||
}, |
|||
{ |
|||
label: "道路名称", |
|||
key: "roadName", |
|||
}, |
|||
{ |
|||
label: "设备方向", |
|||
key: "direction", |
|||
enum: "CameraDirectionEnum", |
|||
}, |
|||
{ |
|||
label: "设备状态", |
|||
key: "deviceState", |
|||
enum: "DeviceTypeEnum", |
|||
// visible: false, |
|||
}, |
|||
// { |
|||
// label: "设备状态", |
|||
// key: "deviceStateLiteral", |
|||
// }, |
|||
{ |
|||
label: "设备厂商", |
|||
key: "manufacturer", |
|||
}, |
|||
], |
|||
}; |
|||
}, |
|||
async created() { |
|||
// if (!this.dialogData.iotDeviceId) this.dialogData.iotDeviceId = '10.0.36.146-1883'; |
|||
|
|||
// let deviceInfo = await this.getDeviceInfo(); |
|||
this.data = { |
|||
...this.dialogData, |
|||
roadName: null, |
|||
// deviceStateLiteral: deviceInfo.data.formatValue.deviceState, |
|||
}; |
|||
|
|||
// console.log( |
|||
// "%c [ dialogData ]-103-「index.vue」", |
|||
// "font-size:15px; background:#36347c; color:#7a78c0;", |
|||
// this.dialogData, |
|||
// "+++========" |
|||
// ); |
|||
//厂商 |
|||
getProduct(this.dialogData.productId).then((data) => { |
|||
this.dialogData.brand = data.brand; |
|||
}); |
|||
|
|||
const roadInfo = await getRoadInfoByStakeMark(this.dialogData.stakeMark); |
|||
|
|||
if (roadInfo) this.data.roadName = roadInfo.roadName; |
|||
}, |
|||
methods: { |
|||
async getDeviceInfo() { |
|||
return request({ |
|||
url: `/business/device/properties/latest/${this.dialogData.iotDeviceId || "10.0.36.143-1883" |
|||
}/3`, |
|||
method: "get", |
|||
params: {}, |
|||
}); |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
div.switcher { |
|||
font-size: 12px; |
|||
padding: 2px; |
|||
} |
|||
</style> |
|||
<style lang="scss" scoped> |
|||
.SolarEnergy { |
|||
width: 510px; |
|||
// height: 240px; |
|||
color: #fff; |
|||
display: flex; |
|||
flex-direction: column; |
|||
|
|||
.camera-video { |
|||
flex: 1.5; |
|||
} |
|||
|
|||
.tabs { |
|||
flex: 1; |
|||
display: flex; |
|||
flex-direction: column; |
|||
|
|||
::v-deep { |
|||
.el-tabs__content { |
|||
flex: 1; |
|||
|
|||
.el-tab-pane { |
|||
height: 100%; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
|
|||
.bottom { |
|||
margin-top: 12px; |
|||
display: flex; |
|||
gap: 9px; |
|||
align-items: center; |
|||
justify-content: end; |
|||
|
|||
>div { |
|||
font-size: 16px; |
|||
padding: 6px 12px; |
|||
} |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,117 @@ |
|||
<template> |
|||
<div class="HomeVector"> |
|||
<el-tooltip effect="light" content="高速运营快报" placement="left"> |
|||
<Button |
|||
:class="['btn', { 'btn-active': activeIcon }]" |
|||
@click.native="handleClick('Vector')" |
|||
> |
|||
<div> |
|||
<img |
|||
src="@screen/images/home-Word/word.png" |
|||
style="width: 26px; height: 26px" |
|||
/> |
|||
</div> |
|||
</Button> |
|||
</el-tooltip> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import Button from "@screen/components/Buttons/Button.vue"; |
|||
import Form from "@screen/components/FormConfig"; |
|||
import { delay, exportFile, confirm } from "@screen/utils/common"; |
|||
import * as PresetFormItems from "@screen/pages/control/event/event/FormEvent/PresetFormItems.js"; |
|||
import { merge, cloneDeep } from "lodash"; |
|||
import { markerClusterIns } from "@screen/pages/Home/components/RoadAndEvents/utils/map.js"; |
|||
export default { |
|||
name: "HomeVector", |
|||
components: { |
|||
Button, |
|||
Form, |
|||
}, |
|||
data() { |
|||
return { |
|||
activeIcon: null, |
|||
}; |
|||
}, |
|||
created() { |
|||
this.activeIcon = window.showStakeText ? "Vector" : null; |
|||
}, |
|||
methods: { |
|||
handleClick(type) { |
|||
// this.activeIcon = this.activeIcon === type ? null : type; |
|||
// if (this.activeIcon) window.showStakeText = true; |
|||
// else window.showStakeText = false; |
|||
|
|||
exportFile({ |
|||
url: "/business/word/trafficSituationReport", |
|||
filename: "通行情况", |
|||
ext: "docx", |
|||
}); |
|||
}, |
|||
|
|||
filterEnd(data) { |
|||
this.activeIcon = null; |
|||
// this.filterData = data; |
|||
this.$parent.$refs.RoadAndEventsRef?.setFilterData?.(data); |
|||
}, |
|||
}, |
|||
}; |
|||
</script> |
|||
|
|||
<style lang="scss"> |
|||
div.el-popper.global-input-search-popover { |
|||
background: rgba(6, 66, 88, 0.8); |
|||
border: 1px solid rgba(42, 217, 253, 0.6); |
|||
position: relative; |
|||
padding-top: 36px; |
|||
transform: translateY(24px); |
|||
// margin-top: 6vh; |
|||
|
|||
.body { |
|||
.title { |
|||
background: linear-gradient( |
|||
90deg, |
|||
#237e9b 0%, |
|||
rgba(23, 145, 184, 0) 100% |
|||
); |
|||
padding: 3px 9px; |
|||
position: absolute; |
|||
top: 0; |
|||
left: 0; |
|||
width: 100%; |
|||
} |
|||
|
|||
.close { |
|||
padding: 3px 9px; |
|||
cursor: pointer; |
|||
position: absolute; |
|||
top: 0; |
|||
right: 0; |
|||
width: fit-content; |
|||
} |
|||
} |
|||
} |
|||
</style> |
|||
|
|||
<style lang="scss" scoped> |
|||
.image { |
|||
width: 50vw; |
|||
height: 65vh; |
|||
} |
|||
|
|||
.HomeVector { |
|||
.btn { |
|||
padding: 9px; |
|||
background: linear-gradient(180deg, #152e3c 0%, #163a45 100%); |
|||
border-radius: 4px; |
|||
overflow: hidden; |
|||
height: unset; |
|||
border: 1px solid rgba(40, 144, 167, 1); |
|||
} |
|||
|
|||
.btn-active { |
|||
background: linear-gradient(180deg, #005c79 0%, #009bcc 100%); |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,63 @@ |
|||
// import * as PresetFormItems from "@screen/pages/control/event/event/FormEvent/PresetFormItems.js";
|
|||
import * as PresetFormItems from "@screen/common/PresetFormItems.js"; |
|||
// import { merge, cloneDeep } from "lodash";
|
|||
|
|||
export const searchFormList = [ |
|||
{ |
|||
label: "时间范围:", |
|||
key: "daterange", |
|||
required: false, |
|||
type: "datePicker", |
|||
options: { |
|||
type: "daterange", |
|||
format: "yyyy-MM-dd HH:mm:ss", |
|||
valueFormat: "yyyy-MM-dd HH:mm:ss", |
|||
}, |
|||
}, |
|||
PresetFormItems.directionCreater("RadioGroup"), |
|||
{ |
|||
label: "发布状态:", |
|||
key: "releaseStatus", |
|||
type: "RadioGroup", |
|||
default: [], |
|||
options: { |
|||
options: [ |
|||
{ |
|||
key: "1", |
|||
label: "成功", |
|||
}, |
|||
{ |
|||
key: "0", |
|||
label: "失败", |
|||
}, |
|||
], |
|||
}, |
|||
}, |
|||
|
|||
// {
|
|||
// label: "内容:",
|
|||
// key: "releaseContent",
|
|||
// type: "input",
|
|||
// default: ""
|
|||
// },
|
|||
|
|||
// {
|
|||
// ...PresetFormItems.station,
|
|||
// label: "开始桩号:",
|
|||
// required: false,
|
|||
// },
|
|||
// merge(cloneDeep(PresetFormItems.station), {
|
|||
// options: {
|
|||
// options: [
|
|||
// {
|
|||
// key: "endStakeMark[0]",
|
|||
// },
|
|||
// {
|
|||
// key: "endStakeMark[1]",
|
|||
// },
|
|||
// ],
|
|||
// },
|
|||
// label: "结束桩号:",
|
|||
// required: false,
|
|||
// }),
|
|||
]; |
Loading…
Reference in new issue