You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

829 lines
26 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="control-view">
<!-- 主要内容 -->
<div class="main-content">
<!-- 顶部状态栏 -->
<div class="header-status">
<div class="time-info">
<span>{{ currentTime }} {{ week }}</span>
</div>
<div class="page-title">
<h1>参数设置</h1>
</div>
<div class="system-status">
<!-- <span>系统已运行{{ systemRuntime }}</span> -->
</div>
</div>
<!-- 主体区域 -->
<div class="control-content">
<div class="main_item">
<div class="main_title">
主控器设置
</div>
<div class="main_content">
<div class="line">
<div class="item">
<div class="key">设备时间</div>
<el-date-picker value-format="YYYY-MM-DD HH:mm:ss" style="flex: 1;" v-model="deviceTime" type="datetime" placeholder="请选择时间" />
</div>
</div>
<div class="line">
<div class="item">
<div class="key">大地经度</div>
<!-- <el-input v-model="formField.lat" style="width: 100px" placeholder="请输入" :formatter="(value) => `${value}˚`" :parser="(value) => value.replace(/˚/g, '')" /> -->
<el-input-number :min="0" :max="180" v-model="formField.lat" style="width: 100px" placeholder="请输入" :controls="false" />
</div>
<div class="item">
<div class="key">大地纬度</div>
<!-- <el-input v-model="formField.lgn" style="width: 100px" placeholder="请输入" :formatter="(value) => `${value}˚`" :parser="(value) => value.replace(/˚/g, '')" /> -->
<el-input-number :min="0" :max="90" v-model="formField.lgn" style="width: 100px" placeholder="请输入" :controls="false" />
</div>
</div>
<div class="line">
<div class="item">
<div class="key">经纬开灯偏差</div>
<!-- <el-input readonly v-model="formField.rise" style="width: 100px" placeholder="请输入" :formatter="(value) => `${value}分`" :parser="(value) => value.replace(/分/g, '')" /> -->
<el-select v-model="formField.rise" placeholder="请选择">
<el-option v-for="item in RiseSetOption" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</div>
<div class="line">
<div class="item">
<div class="key">经纬关灯偏差</div>
<!-- <el-input readonly v-model="formField.set" style="width: 100px" placeholder="请输入" :formatter="(value) => `${value}分`" :parser="(value) => value.replace(/分/g, '')" /> -->
<el-select v-model="formField.set" placeholder="请选择">
<el-option v-for="item in RiseSetOption" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
<!-- <div class="item"></div> -->
</div>
<div class="line">
<div class="item">
<div class="key">控制回路数</div>
<div class="value" style="min-width: 100px;">{{ subLoopParameter.subLoopData?.length || 0 }}</div>
</div>
<div class="item"></div>
</div>
<div class="line">
<div class="item">
<div class="key">在线升级固件</div>
<div class="button disabled">禁用</div>
</div>
<div class="item"></div>
</div>
<div class="buttonBox">
<div class="button save" @click="save">掉电保存</div>
<div class="button restart" @click="restartSystem">重启</div>
</div>
</div>
</div>
<div class="main_item">
<div class="main_title">
稳压分控器
</div>
<div class="main_content energy_meter subLoopParame" style="width:235px">
<div class="subLoopParameter_item" v-for="item in subLoopParameter.subLoopData">
<div class="item">
<div class="key">回路地址</div>
<div class="value">{{ item.LoopAddress }}</div>
</div>
<div class="item">
<div class="key">子模块数量</div>
<div class="value">{{ item.Modules?.length || 0 }}</div>
</div>
<div class="item">
<div class="key">调光幅度</div>
<div class="value">{{ item.DimmingValue ? item.DimmingValue + '%' : item.DimmingValue }}</div>
</div>
<div class="buttonBox" v-if="item.Modules?.length">
<div class="button save" style="width: 100px;" @click="openDialog(item)">查看子模块</div>
</div>
</div>
</div>
</div>
<div class="main_item">
<div class="main_title">
电能表
</div>
<div class="main_content energy_meter" style="width:235px">
<!-- <div class="line">
<div class="item">
<div class="key">主控器地址</div>
<div class="value"> </div>
</div>
</div> -->
<div class="line">
<div class="item">
<div class="key">电能表型号</div>
<div class="value">ADL400</div>
<!-- <el-input v-model="formField.g" style="width: 100px" placeholder="请输入" /> -->
</div>
</div>
<div class="line">
<div class="item">
<div class="key">电能表地址</div>
<div class="value">{{ address }}</div>
<!-- <el-input v-model="formField.f" style="width: 100px" placeholder="请输入" /> -->
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 底部信息 -->
<div class="bottom-info">
<div style="color:#fff">
设备号:{{ commit_uid }}
</div>
<div class="bottom_item">
<!-- <div class="time-item">
<span>日出时间:{{ sunriseTime }}</span>
</div>
<div class="time-item">
<span>日落时间:{{ sunsetTime }}</span>
</div> -->
</div>
<div class="bottom_item">
<!-- <el-button class="restart-button" @click="restartSystem">
<el-icon>
<RefreshRight />
</el-icon>
远程重启
</el-button> -->
<el-button class="back-button" @click="goBack">
<el-icon>
<HomeFilled />
</el-icon>
返回主界面
</el-button>
</div>
</div>
<TableDialog v-if="isShowDialog" @closed="isShowDialog = false" :tableData="currentTableData" :title="currentTitle"></TableDialog>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue'
import { useRouter } from 'vue-router'
import RPC from '@/utils/rpc';
import TableDialog from './TableDialog.vue';
const router = useRouter()
const currentTime = ref('')
const systemRuntime = ref('38分钟')
const formField = ref({})
const deviceTime = ref('')
const subLoopParameter = ref([])
const commit_uid = localStorage.getItem('central_control_comm_uid')
const RiseSetOption = [
{ label: '0', value: 0 },
{ label: '提前60分钟', value: 60 },
{ label: '提前50分钟', value: 50 },
{ label: '提前40分钟', value: 40 },
{ label: '提前30分钟', value: 30 },
{ label: '提前20分钟', value: 20 },
{ label: '提前10分钟', value: 10 },
{ label: '延后10分钟', value: -10 },
{ label: '延后20分钟', value: -20 },
{ label: '延后30分钟', value: -30 },
{ label: '延后40分钟', value: -40 },
{ label: '延后50分钟', value: -50 },
{ label: '延后60分钟', value: -60 },
]
RPC.post('/m9z/getLgnLatData', { comm_uid: commit_uid }).then(res => {
formField.value.lat = res.lat
formField.value.lgn = res.lgn
formField.value.loc = res.loc
})
RPC.post('/m9z/getSunRiseSet', { comm_uid: commit_uid }).then(res => {
formField.value.rise = res.rise
formField.value.set = res.set
})
RPC.post('/m9z/getDeviceTime', { comm_uid: commit_uid }).then(res => {
deviceTime.value = res.deviceTime
})
RPC.post('/m9z/getAllSubLoopParameter', { comm_uid: commit_uid }).then(res => {
subLoopParameter.value = res
// subLoopParameter.value = {
// "subLoopData": [
// {
// "DCVoltage": 0.5,
// "DCCurrent": 0,
// "DimmingValue": 70,
// "AlarmStatus": 9,
// "AlarmCode": "09 01",
// "RelayStatus": 1,
// "LoopAddress": "0x1",
// "SubModuleCount": 1,
// "Reserved": [
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0
// ],
// "Modules": [
// {
// "OutputVoltage": 0,
// "OutputCurrent": 0,
// "CurrentPWMDuty": 0,
// "VoltagePWMDuty": 0,
// "DeviceAddress": "0x0",
// "ModuleLoopAddress": "0x0",
// "CurrentLimitPct": 0,
// "OperatingMode": 0,
// "ModuleVersion": 0,
// "RatedVoltageDuty": 0,
// "RatedCurrentDuty": 0,
// "RatedOutputVoltage": 0,
// "RatedOutputCurrent": 0
// }
// ]
// },
// {
// "DCVoltage": 0,
// "DCCurrent": 0,
// "DimmingValue": 0,
// "AlarmStatus": 0,
// "AlarmCode": "",
// "RelayStatus": 0,
// "LoopAddress": "0x1",
// "SubModuleCount": 0,
// "Reserved": [
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0
// ],
// "Modules": null
// },
// {
// "DCVoltage": 0,
// "DCCurrent": 0,
// "DimmingValue": 0,
// "AlarmStatus": 0,
// "AlarmCode": "",
// "RelayStatus": 0,
// "LoopAddress": "0x2",
// "SubModuleCount": 0,
// "Reserved": [
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0
// ],
// "Modules": null
// },
// {
// "DCVoltage": 0,
// "DCCurrent": 0,
// "DimmingValue": 0,
// "AlarmStatus": 0,
// "AlarmCode": "00 00",
// "RelayStatus": 0,
// "LoopAddress": "0x0",
// "SubModuleCount": 0,
// "Reserved": [
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0
// ],
// "Modules": []
// },
// {
// "DCVoltage": 0,
// "DCCurrent": 0,
// "DimmingValue": 0,
// "AlarmStatus": 0,
// "AlarmCode": "",
// "RelayStatus": 0,
// "LoopAddress": "0x4",
// "SubModuleCount": 0,
// "Reserved": [
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0
// ],
// "Modules": null
// },
// {
// "DCVoltage": 0,
// "DCCurrent": 0,
// "DimmingValue": 0,
// "AlarmStatus": 0,
// "AlarmCode": "00 00",
// "RelayStatus": 0,
// "LoopAddress": "0x0",
// "SubModuleCount": 0,
// "Reserved": [
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0
// ],
// "Modules": []
// },
// {
// "DCVoltage": 0,
// "DCCurrent": 0,
// "DimmingValue": 0,
// "AlarmStatus": 0,
// "AlarmCode": "00 00",
// "RelayStatus": 0,
// "LoopAddress": "0x0",
// "SubModuleCount": 0,
// "Reserved": [
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0
// ],
// "Modules": []
// },
// {
// "DCVoltage": 0,
// "DCCurrent": 0,
// "DimmingValue": 0,
// "AlarmStatus": 0,
// "AlarmCode": "00 00",
// "RelayStatus": 0,
// "LoopAddress": "0x0",
// "SubModuleCount": 0,
// "Reserved": [
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0
// ],
// "Modules": []
// },
// {
// "DCVoltage": 0,
// "DCCurrent": 0,
// "DimmingValue": 0,
// "AlarmStatus": 0,
// "AlarmCode": "00 00",
// "RelayStatus": 0,
// "LoopAddress": "0x0",
// "SubModuleCount": 0,
// "Reserved": [
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0
// ],
// "Modules": []
// },
// {
// "DCVoltage": 0,
// "DCCurrent": 0,
// "DimmingValue": 0,
// "AlarmStatus": 0,
// "AlarmCode": "00 00",
// "RelayStatus": 0,
// "LoopAddress": "0x0",
// "SubModuleCount": 0,
// "Reserved": [
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0,
// 0
// ],
// "Modules": []
// }
// ],
// "totalP": 0
// }
})
const address = ref('')
RPC.post('/adl400/getMsgAddress', { comm_uid: commit_uid }).then(res => {
address.value = res
})
const week = ref('')
const weekDays = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
// 更新时间
const updateTime = () => {
const now = new Date()
const year = now.getFullYear()
const month = String(now.getMonth() + 1).padStart(2, '0')
const day = String(now.getDate()).padStart(2, '0')
const hours = String(now.getHours()).padStart(2, '0')
const minutes = String(now.getMinutes()).padStart(2, '0')
const seconds = String(now.getSeconds()).padStart(2, '0')
week.value = weekDays[now.getDay()]
currentTime.value = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
}
const restartSystem = () => {
ElMessageBox.confirm(
`此操作将远程重启,是否继续?`,
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}
).then(() => {
RPC.post('/m9z/setRestart', { comm_uid: commit_uid }).then(res => {
ElMessage.success('远程重启成功')
getInfo()
})
})
}
const save = () => {
ElMessageBox.confirm(
`此操作将保存配置,是否继续?`,
'提示',
{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}
).then(() => {
const params = {
"comm_uid": commit_uid,
"lat": Number(formField.value.lat),
"lgn": Number(formField.value.lgn),
"loc_str": formField.value.loc,
"rise": Number(formField.value.rise),
"set": Number(formField.value.set)
}
Promise.all(RPC.post('/m9z/setDeviceLgnLatAndSunRsTime', params), RPC.post('/m9z/setDeviceTime', { "comm_uid": commit_uid, device_time: deviceTime.value })).then(res => {
ElMessage.success('操作成功')
})
})
}
const currentTableData = ref([])
const currentTitle = ref('')
const isShowDialog = ref(false)
const openDialog = item => {
isShowDialog.value = true
currentTableData.value = item.Modules
currentTitle.value = item.LoopAddress
}
// 返回主界面
const goBack = () => {
router.push('/')
}
let timeInterval = null
onMounted(() => {
updateTime()
timeInterval = setInterval(updateTime, 1000)
})
onUnmounted(() => {
if (timeInterval) {
clearInterval(timeInterval)
}
})
</script>
<style scoped lang="scss">
.control-view {
width: 100vw;
height: 100vh;
box-sizing: border-box;
position: relative;
overflow: auto;
background: center / cover url('@/assets/images/handle_control_bg.png') no-repeat;
}
.main-content {
position: relative;
z-index: 2;
width: 100%;
height: 100%;
padding: 10px 20px;
box-sizing: border-box;
}
.header-status {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
color: rgba(255, 255, 255, 0.9);
}
.time-info {
font-size: 18px;
font-weight: 300;
width: 270px;
}
.page-title h1 {
font-size: 30px;
font-weight: bold;
margin: 0;
color: #ffffff;
text-shadow: 0 0 10px rgba(255, 255, 255, 0.3);
}
.system-status {
min-width: 200px;
font-size: 18px;
font-weight: 300;
width: 270px;
}
.control-content {
display: flex;
width: 100%;
gap: 20px;
overflow: hidden;
box-sizing: border-box;
.main_item {
border: .5px solid #ddd;
display: flex;
flex-direction: column;
height: 450px;
.main_title {
display: flex;
justify-content: center;
align-items: center;
height: 50px;
font-size: 16px;
background-color: #21232A;
color: #8088AA;
border-bottom: .5px solid #ddd;
}
.main_content {
padding: 20px;
font-size: 14px;
background-color: #282d36;
flex: 1;
&.energy_meter {
.value {
width: 100px;
}
}
&.subLoopParame {
overflow-y: auto;
}
.key {
color: #fff;
margin-right: 10px;
flex-shrink: 0;
}
.value {
text-align: center;
background-color: #21232A;
color: #8088AA;
padding: 5px 10px;
min-height: 32px;
box-sizing: border-box;
border-radius: 5px;
// border: 1px solid #ccc;
}
.subLoopParameter_item {
border-radius: 10px;
border: 1px solid #fff;
padding: 15px;
margin-bottom: 20px;
.item {
display: flex;
justify-content: space-between;
&:not(:last-child) {
margin-bottom: 10px;
}
}
}
.line {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20px;
margin-bottom: 20px;
.item {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
}
}
.button {
width: 50px;
height: 30px;
background-color: #939393;
color: #fff;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
}
.buttonBox {
display: flex;
justify-content: center;
.button {
width: 70px;
margin: 0 10px;
&.save {
background-color: #61c24b;
}
&.restart {
background-color: #d42d1f;
}
}
}
}
}
}
.bottom-info {
display: flex;
justify-content: space-between;
align-items: center;
border-top: 1px solid #eee;
width: 100vw;
padding: 0 30px;
height: 50px;
position: fixed;
bottom: 0;
left: 0;
z-index: 999;
box-sizing: border-box;
.bottom_item {
display: flex;
align-items: center;
}
.time-item {
color: rgba(255, 255, 255, 0.7);
font-size: 16px;
margin: 0 20px;
}
.back-button,
.restart-button {
width: 100%;
height: 38px;
border-radius: 19px;
font-size: 16px;
font-weight: 500;
transition: all 0.3s ease;
}
.back-button {
background-color: #000;
color: #fff;
border: #000;
}
}
.el-input {
background-color: #21232A;
}
:deep(.el-input__wrapper) {
background-color: #212329 !important;
box-shadow: none;
border: 1px soild #3B3D45;
input {
color: #8088AA;
}
}
:deep(.el-select__wrapper) {
background-color: #212329 !important;
box-shadow: none;
border: 1px soild #3B3D45;
.el-select__placeholder {
color: #8088AA;
}
}
</style>