| | |
| | | <!DOCTYPE html> |
| | | <html> |
| | | |
| | | <head> |
| | | <meta charset="utf-8"> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> |
| | | <meta name="renderer" content="webkit"> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> |
| | | <link rel="icon" href="/favicon.ico"> |
| | | <meta charset="utf-8" /> |
| | | <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> |
| | | <meta name="renderer" content="webkit" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" /> |
| | | <link rel="icon" href="/logo.png" /> |
| | | <title>管çç³»ç»</title> |
| | | <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]--> |
| | | <!--[if lt IE 11 |
| | | ]><script> |
| | | window.location.href = "/html/ie.html" |
| | | </script><! |
| | | [endif]--> |
| | | <style> |
| | | html, |
| | | body, |
| | |
| | | margin: -75px 0 0 -75px; |
| | | border-radius: 50%; |
| | | border: 3px solid transparent; |
| | | border-top-color: #FFF; |
| | | border-top-color: #fff; |
| | | -webkit-animation: spin 2s linear infinite; |
| | | -ms-animation: spin 2s linear infinite; |
| | | -moz-animation: spin 2s linear infinite; |
| | |
| | | bottom: 5px; |
| | | border-radius: 50%; |
| | | border: 3px solid transparent; |
| | | border-top-color: #FFF; |
| | | border-top-color: #fff; |
| | | -webkit-animation: spin 3s linear infinite; |
| | | -moz-animation: spin 3s linear infinite; |
| | | -o-animation: spin 3s linear infinite; |
| | |
| | | bottom: 15px; |
| | | border-radius: 50%; |
| | | border: 3px solid transparent; |
| | | border-top-color: #FFF; |
| | | border-top-color: #fff; |
| | | -moz-animation: spin 1.5s linear infinite; |
| | | -o-animation: spin 1.5s linear infinite; |
| | | -ms-animation: spin 1.5s linear infinite; |
| | | -webkit-animation: spin 1.5s linear infinite; |
| | | animation: spin 1.5s linear infinite; |
| | | } |
| | | |
| | | |
| | | @-webkit-keyframes spin { |
| | | 0% { |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | #loader-wrapper .loader-section { |
| | | position: fixed; |
| | | top: 0; |
| | | width: 51%; |
| | | height: 100%; |
| | | background: #7171C6; |
| | | background: #7171c6; |
| | | z-index: 1000; |
| | | -webkit-transform: translateX(0); |
| | | -ms-transform: translateX(0); |
| | |
| | | right: 0; |
| | | } |
| | | |
| | | |
| | | .loaded #loader-wrapper .loader-section.section-left { |
| | | -webkit-transform: translateX(-100%); |
| | | -ms-transform: translateX(-100%); |
| | | transform: translateX(-100%); |
| | | -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000); |
| | | transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000); |
| | | -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); |
| | | transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); |
| | | } |
| | | |
| | | .loaded #loader-wrapper .loader-section.section-right { |
| | | -webkit-transform: translateX(100%); |
| | | -ms-transform: translateX(100%); |
| | | transform: translateX(100%); |
| | | -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000); |
| | | transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000); |
| | | -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); |
| | | transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1); |
| | | } |
| | | |
| | | .loaded #loader { |
| | |
| | | } |
| | | |
| | | #loader-wrapper .load_title { |
| | | font-family: 'Open Sans'; |
| | | color: #FFF; |
| | | font-family: "Open Sans"; |
| | | color: #fff; |
| | | font-size: 19px; |
| | | width: 100%; |
| | | text-align: center; |
| | |
| | | font-weight: normal; |
| | | font-style: italic; |
| | | font-size: 13px; |
| | | color: #FFF; |
| | | color: #fff; |
| | | opacity: 0.5; |
| | | } |
| | | </style> |
| | |
| | | </div> |
| | | <script type="module" src="/src/main.js"></script> |
| | | </body> |
| | | |
| | | </html> |
| | |
| | | "type": "module", |
| | | "scripts": { |
| | | "dev": "vite", |
| | | "build:prod": "vite build", |
| | | "build": "vite build", |
| | | "build:stage": "vite build --mode staging", |
| | | "preview": "vite preview" |
| | | }, |
¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from "@/utils/request" |
| | | |
| | | // ä¿®æ¹ç»æå¾ |
| | | export function updateEquipmentfile(data) { |
| | | return request({ |
| | | url: "/basicSetup/equipmentfile", |
| | | method: "put", |
| | | data: data, |
| | | }) |
| | | } |
| | | |
| | | export function getAllCollectTag(data) { |
| | | return request({ |
| | | url: "/basicsetting/energyindex/filter", |
| | | method: "get", |
| | | params: data, |
| | | }) |
| | | } |
| | | |
| | | export function saveSettingApi(nodeId, data) { |
| | | return request({ |
| | | url: "/basicSetup/equipmentfile/setting/" + nodeId, |
| | | method: "put", |
| | | data: data, |
| | | }) |
| | | } |
| | | |
| | | export function getConfigure(nodeId) { |
| | | return request({ |
| | | url: "/basicSetup/equipmentfile/configure/" + nodeId, |
| | | method: "get", |
| | | }) |
| | | } |
| | | |
| | | export function getLiveData(tagCodes) { |
| | | return request({ |
| | | url: "/rtdb/retrieve/" + tagCodes, |
| | | method: "get", |
| | | }) |
| | | } |
| | |
| | | :headers="headers" |
| | | class="upload-file-uploader" |
| | | ref="fileUpload" |
| | | :drag="draggable" |
| | | > |
| | | <!-- ä¸ä¼ æé® --> |
| | | <el-button type="primary">éåæä»¶</el-button> |
| | | <el-button v-if="!draggable" type="primary">éåæä»¶</el-button> |
| | | <div v-else> |
| | | <el-icon class="el-icon--upload"><upload-filled /></el-icon> |
| | | <div class="el-upload__text">å°æä»¶æå°æ¤å¤ï¼æ<em>ç¹å»ä¸ä¼ </em></div> |
| | | </div> |
| | | </el-upload> |
| | | <!-- ä¸ä¼ æç¤º --> |
| | | <div class="el-upload__tip" v-if="showTip"> |
| | |
| | | type: Boolean, |
| | | default: true, |
| | | }, |
| | | // æ¯å¦ææ½ä¸ä¼ |
| | | draggable: { |
| | | type: Boolean, |
| | | default: false, |
| | | }, |
| | | }) |
| | | |
| | | const { proxy } = getCurrentInstance() |
| | |
| | | right: "5%", |
| | | itemWidth: 14, |
| | | itemHeight: 14, |
| | | itemGap: 60, |
| | | itemGap: 16, |
| | | textStyle: { |
| | | align: "left", |
| | | verticalAlign: "middle", |
| | |
| | | right: "10%", |
| | | itemWidth: 14, |
| | | itemHeight: 14, |
| | | itemGap: 50, |
| | | itemGap: 16, |
| | | textStyle: { |
| | | align: "left", |
| | | verticalAlign: "middle", |
| | |
| | | <div class="middle-view"> |
| | | <div class="left-wrapper"> |
| | | <div class="login-font">{{ systemInfo.systemName || "" }}</div> |
| | | <img src="@/assets/images/font01.png" alt="" style="width: 406px" /> |
| | | <img src="@/assets/images/img_logo.png" alt="" style="width: 200px; margin-top: 20px" /> |
| | | <img src="@/assets/images/font01.png" alt="" style="width: 380px" /> |
| | | <img src="@/assets/images/img_logo.png" alt="" style="width: 180px; margin-top: 20px" /> |
| | | </div> |
| | | <div class="right-wrapper"> |
| | | <div class="header"> |
| | |
| | | size="large" |
| | | auto-complete="off" |
| | | placeholder="éªè¯ç " |
| | | style="width: 266px" |
| | | style="width: 230px" |
| | | @keyup.enter="handleLogin" |
| | | > |
| | | <!-- <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template> --> |
| | |
| | | display: flex; |
| | | align-items: center; |
| | | height: 100%; |
| | | background-image: url("@/assets/images/login-background.png"); |
| | | background-image: url("@/assets/images/login-background.jpg"); |
| | | background-repeat: no-repeat; |
| | | background-size: cover; |
| | | flex-direction: column; |
| | |
| | | flex-direction: column; |
| | | } |
| | | .login-font { |
| | | font-size: 34px; |
| | | font-size: 32px; |
| | | font-weight: 700; |
| | | color: #d5f8ff; |
| | | margin-bottom: 12px; |
| | | margin-bottom: 10px; |
| | | } |
| | | } |
| | | |
| | | .right-wrapper { |
| | | border-radius: 23px; |
| | | background: #ffffff; |
| | | width: 480px; |
| | | width: 410px; |
| | | position: relative; |
| | | .header { |
| | | height: 70px; |
| | | line-height: 70px; |
| | | height: 56px; |
| | | line-height: 56px; |
| | | border-bottom: 1px solid #f1f1f1; |
| | | color: #3b3b3b; |
| | | font-size: 22px; |
| | | font-size: 18px; |
| | | margin-bottom: 22px; |
| | | span { |
| | | display: inline-block; |
| | | height: 70px; |
| | | line-height: 70px; |
| | | border-bottom: 6px solid #3a83fc; |
| | | margin-left: 50px; |
| | | height: 56px; |
| | | line-height: 62px; |
| | | border-bottom: 4px solid #3a83fc; |
| | | margin-left: 32px; |
| | | } |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | .login-form { |
| | | padding: 0 50px 30px; |
| | | padding: 0 32px 20px; |
| | | |
| | | .submit-btn { |
| | | width: 382px; |
| | | height: 54px; |
| | | width: 360px; |
| | | height: 44px; |
| | | background: #3a83fc; |
| | | border-radius: 3px; |
| | | font-size: 20px; |
| | | font-size: 18px; |
| | | box-shadow: 1px 2px 5px #3a83fc; |
| | | border: none; |
| | | border-radius: 6px; |
| | |
| | | text-align: center; |
| | | color: #fff; |
| | | font-family: Arial; |
| | | font-size: 16px; |
| | | font-size: 14px; |
| | | letter-spacing: 1px; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <div slot="header" class="clearfix"> |
| | | <el-button |
| | | style="float: right; padding: 8px; margin-left: 8px" |
| | | type="text" |
| | | icon="el-icon-setting" |
| | | @click="saveSetting" |
| | | > |
| | | ä¿åé
ç½® |
| | | </el-button> |
| | | <el-button |
| | | style="float: right; padding: 8px; margin-left: 8px" |
| | | type="text" |
| | | icon="el-icon-setting" |
| | | @click="reset()" |
| | | > |
| | | éæ°éæ©åºå¾ |
| | | </el-button> |
| | | </div> |
| | | <el-row> |
| | | <el-col :span="18"> |
| | | <!-- v-if="filePath === '空èç¹'" --> |
| | | <div style="text-align: center; margin-left: 12px" v-if="filePath === '空èç¹'"> |
| | | <FileUpload |
| | | :modelValue="fileList" |
| | | @update:modelValue="fileUploadChange" |
| | | :isShowTip="false" |
| | | :limit="1" |
| | | :fileSize="20" |
| | | :fileType="[]" |
| | | :draggable="true" |
| | | /> |
| | | </div> |
| | | |
| | | <div id="svgHtml" v-if="filePath !== '空èç¹'"> |
| | | <div v-html="svgHtml" /> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="6" style="height: calc(100vh - 165px); overflow: auto"> |
| | | <el-table :data="tags" border> |
| | | <el-table-column label="åæ°" align="center" prop="param" /> |
| | | <el-table-column label="ééç¹" align="center" prop="tag"> |
| | | <template #default="scope"> |
| | | <el-autocomplete |
| | | popper-class="my-autocomplete" |
| | | v-model="scope.row['tag']" |
| | | :fetch-suggestions="querySearch" |
| | | placeholder="请è¾å
¥ææ ç¼ç " |
| | | placement="bottom-end" |
| | | > |
| | | <template #default="{ item }"> |
| | | <div class="">{{ item.value }}</div> |
| | | <span class="" style="color: #409eff; display: block">{{ item.name }}</span> |
| | | </template> |
| | | </el-autocomplete> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { getAllCollectTag, getConfigure, saveSettingApi, updateEquipmentfile } from "@/api/svg/equipmentfile" |
| | | const { proxy } = getCurrentInstance() |
| | | let props = defineProps(["types"]) |
| | | const emit = defineEmits(["getList"]) |
| | | const currentNode = ref({}) |
| | | const filePath = ref("空èç¹") |
| | | const svgHtml = ref("") |
| | | const form = ref({ |
| | | nodeId: "", |
| | | fileName: "", |
| | | svgType: "", |
| | | }) |
| | | const tags = ref([]) |
| | | const fileList = ref([]) |
| | | |
| | | function changeModelNode(modelNode) { |
| | | currentNode.value = modelNode |
| | | filePath.value = "空èç¹" |
| | | getConfigure(modelNode.id).then((response) => { |
| | | tags.value = [] |
| | | svgHtml.value = "" |
| | | if (response.code === 200) { |
| | | if (response.data) { |
| | | filePath.value = response.data.filePath |
| | | tags.value = response.data.infoList |
| | | getSvg() |
| | | } |
| | | } else { |
| | | proxy.$modal.msgError(response.msg) |
| | | } |
| | | }) |
| | | } |
| | | // åå§åsvg |
| | | function getSvg() { |
| | | /* å建xhr对象 */ |
| | | const xhr = new XMLHttpRequest() |
| | | xhr.open("GET", filePath.value, true) |
| | | xhr.send() |
| | | /* çå¬xhr对象 */ |
| | | xhr.addEventListener("load", () => { |
| | | svgHtml.value = xhr.responseText |
| | | let values = xhr.responseXML.getElementsByTagName("text") |
| | | let tagTemps = [] |
| | | for (let i = 0; i < values.length; i++) { |
| | | if (values[i].getAttribute("id") != undefined) |
| | | tagTemps.push({ |
| | | param: values[i].textContent, |
| | | tag: "", |
| | | tagType: "COLLECT", |
| | | }) |
| | | } |
| | | console.log(tags.value.length, tagTemps.length) |
| | | if (tags.value.length === 0 || tags.value.length != tagTemps.length) { |
| | | tags.value = [] |
| | | tags.value = tagTemps |
| | | console.log("222", tags.value.length, tagTemps.length) |
| | | } |
| | | }) |
| | | } |
| | | //ä¸ä¼ æåå |
| | | function fileUploadChange(val) { |
| | | if (val.length) { |
| | | // this.$refs.upload.clearFiles() |
| | | form.value.nodeId = currentNode.value.id |
| | | form.value.filePath = val[0].fullUrl |
| | | form.value.svgType = "COLLECT" |
| | | updateEquipmentfile(form.value).then((result) => { |
| | | if (result.code === 200) { |
| | | filePath.value = response.msg |
| | | tags.value = [] |
| | | getSvg() |
| | | } else { |
| | | proxy.$modal.msgError(result.msg) |
| | | } |
| | | }) |
| | | } else { |
| | | proxy.$modal.msgError(response.msg) |
| | | } |
| | | } |
| | | |
| | | function querySearch(queryString, cb) { |
| | | if (queryString) { |
| | | getAllCollectTag({ |
| | | codeOrName: queryString, |
| | | indexType: "COLLECT", |
| | | }).then((response) => { |
| | | // è°ç¨ callback è¿å建议åè¡¨çæ°æ® |
| | | let result = response.data |
| | | let values = [] |
| | | result.forEach((item) => { |
| | | values.push({ |
| | | value: item.code, |
| | | name: item.name, |
| | | }) |
| | | }) |
| | | cb(values) |
| | | }) |
| | | } |
| | | } |
| | | function saveSetting() { |
| | | saveSettingApi(currentNode.value.id, tags.value).then((response) => { |
| | | if (response.code === 200) { |
| | | proxy.$modal.msgSuccess(response.msg) |
| | | } else { |
| | | proxy.$modal.msgError(response.msg) |
| | | } |
| | | }) |
| | | } |
| | | function reset() { |
| | | filePath.value = "空èç¹" |
| | | } |
| | | |
| | | defineExpose({ changeModelNode }) |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .el-autocomplete { |
| | | width: 100%; |
| | | } |
| | | |
| | | .my-autocomplete li { |
| | | line-height: normal; |
| | | padding: 7px; |
| | | } |
| | | |
| | | .my-autocomplete li .name { |
| | | text-overflow: ellipsis; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .my-autocomplete li .addr { |
| | | font-size: 12px; |
| | | color: #b4b4b4; |
| | | } |
| | | |
| | | .my-autocomplete li .highlighted .addr { |
| | | color: #ddd; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <div v-if="filePath" v-html="svgHtml" /> |
| | | <div v-else>ææªä¸ä¼ </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { getConfigure, getLiveData } from "@/api/svg/equipmentfile" |
| | | import { onMounted } from "vue" |
| | | const { proxy } = getCurrentInstance() |
| | | let props = defineProps(["nodeId"]) |
| | | const emit = defineEmits(["getList"]) |
| | | const currentNode = ref({}) |
| | | const filePath = ref("") |
| | | const svgHtml = ref("") |
| | | const form = ref({ |
| | | nodeId: "", |
| | | fileName: "", |
| | | svgType: "", |
| | | }) |
| | | const tags = ref([]) |
| | | const tagCodes = ref([]) |
| | | const valueItems = ref(null) |
| | | const timer = ref(null) |
| | | |
| | | function show(nodeId) { |
| | | console.log(nodeId) |
| | | tagCodes.value = [] |
| | | filePath.value = "" |
| | | getConfigure(nodeId).then((response) => { |
| | | tags.value = [] |
| | | svgHtml.value = "" |
| | | if (response.code === 200) { |
| | | if (response.data) { |
| | | filePath.value = response.data.filePath |
| | | tags.value = response.data.infoList |
| | | getSvg() |
| | | refresh() |
| | | } |
| | | } else { |
| | | proxy.$modal.msgError(response.msg) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | function refresh() { |
| | | if (tagCodes.value.length === 0) { |
| | | return |
| | | } |
| | | getLiveData(tagCodes.value).then((response) => { |
| | | if (response.code === 200) { |
| | | if (response.data) { |
| | | response.data.forEach((tagValue) => { |
| | | let value = "" |
| | | if (tagValue.value) { |
| | | value = parseFloat(tagValue.value).toFixed(2) |
| | | } else { |
| | | value = "0" |
| | | } |
| | | |
| | | let el = document.getElementById(tagValue.tagCode) |
| | | if (el) { |
| | | el.textContent = value |
| | | } |
| | | }) |
| | | //è¿åæ¯åç¬å ç ç¨æ¥å¤ç æ²¡æææ æè
ææ æ²¡æç»æç é½è®¾ç½®0 |
| | | let allText = document.getElementsByTagName("text") |
| | | for (let i = 0; i < allText.length; i++) { |
| | | // console.log(i + "textContent=" + allText[i].textContent); |
| | | if (allText[i].textContent == null || allText[i].textContent == "") { |
| | | allText[i].textContent = "0" |
| | | } |
| | | } |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | |
| | | function refreshData() { |
| | | timer.value = setInterval(() => { |
| | | refresh() |
| | | }, 3000) |
| | | } |
| | | |
| | | onMounted(() => { |
| | | refreshData() |
| | | }) |
| | | |
| | | onBeforeUnmount(() => { |
| | | clearInterval(timer.value) |
| | | }) |
| | | |
| | | // åå§åsvg |
| | | function getSvg() { |
| | | /* å建xhr对象 */ |
| | | const xhr = new XMLHttpRequest() |
| | | xhr.open("GET", filePath.value, true) |
| | | xhr.send() |
| | | /* çå¬xhr对象 */ |
| | | xhr.addEventListener("load", () => { |
| | | const resXML = xhr.responseXML |
| | | let svgDom = resXML.documentElement.cloneNode(true) |
| | | let values = svgDom.getElementsByTagName("text") |
| | | for (let i = 0; i < values.length; i++) { |
| | | let tag = tags.value.filter((f) => f.param === values[i].textContent) |
| | | if (tag && tag.length > 0) { |
| | | let tagCode = tag[0].tag |
| | | values[i].textContent = "" |
| | | if (tagCode) { |
| | | values[i].setAttribute("id", tagCode) |
| | | tagCodes.value.push(tagCode) |
| | | } |
| | | } |
| | | } |
| | | let oSerializer = new XMLSerializer() |
| | | svgHtml.value = oSerializer.serializeToString(svgDom) |
| | | }) |
| | | } |
| | | |
| | | defineExpose({ show }) |
| | | </script> |
| | | |
| | | <style lang="scss" scoped></style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="page"> |
| | | <div class="page-container"> |
| | | <div class="page-container-left"> |
| | | <LeftTree ref="leftTreeRef" @handleNodeClick="handleNodeClick" /> |
| | | </div> |
| | | <div class="page-container-right"> |
| | | <BaseCard :title="queryParams.nodeName"> |
| | | <ConfigureChartView ref="ConfigureChartViewRef" /> |
| | | </BaseCard> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | <script setup name="energy-real-time-monitor"> |
| | | import ConfigureChartView from "../components/configureView.vue" |
| | | import { listEnergyRealTimeMonitor } from "@/api/realTimeMonitor/realTimeMonitor" |
| | | import { getConfigure } from "@/api/svg/equipmentfile" |
| | | const { proxy } = getCurrentInstance() |
| | | import { useRoute } from "vue-router" |
| | | import useSettingsStore from "@/store/modules/settings" |
| | | const settingsStore = useSettingsStore() |
| | | watch( |
| | | () => settingsStore.sideTheme, |
| | | (val) => { |
| | | // getList() |
| | | } |
| | | ) |
| | | const loading = ref(false) |
| | | const data = reactive({ |
| | | queryParams: { |
| | | nodeId: null, |
| | | nodeName: null, |
| | | energyType: null, |
| | | }, |
| | | query: { ...useRoute().query }, |
| | | }) |
| | | const { queryParams, query } = toRefs(data) |
| | | const ConfigureChartViewRef = ref() |
| | | /** èç¹åå»äºä»¶ */ |
| | | function handleNodeClick(data) { |
| | | queryParams.value.nodeId = data.id |
| | | queryParams.value.nodeName = data.label |
| | | if (!data.id) { |
| | | return |
| | | } |
| | | getConfigure(data.id).then((response) => { |
| | | if (response.code === 200) { |
| | | let tagCodes = [] |
| | | if (response.data) { |
| | | response.data.infoList.forEach((tag) => { |
| | | tagCodes.push(tag.tag) |
| | | }) |
| | | } else { |
| | | tagCodes = [] |
| | | } |
| | | ConfigureChartViewRef.value.show(data.id) |
| | | } else { |
| | | proxy.$modal.msgError(response.msg) |
| | | } |
| | | }) |
| | | } |
| | | </script> |
| | | <style scoped lang="scss"> |
| | | @import "@/assets/styles/page.scss"; |
| | | |
| | | .themeDark { |
| | | .card-box { |
| | | margin: 0 18px; |
| | | padding: 10px 18px; |
| | | box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.12); |
| | | border-radius: 8px 8px 8px 8px; |
| | | border: 1px solid #22408c; |
| | | margin-bottom: 20px; |
| | | |
| | | &-title { |
| | | // margin: 10px 0 10px; |
| | | color: rgba(255, 255, 255, 0.8); |
| | | text-align: left; |
| | | font-weight: bold; |
| | | font-family: OPPOSans, OPPOSans; |
| | | font-weight: 500; |
| | | font-size: 16px; |
| | | font-style: normal; |
| | | text-transform: none; |
| | | } |
| | | |
| | | &-ul { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | } |
| | | |
| | | &-li { |
| | | width: 18%; |
| | | margin: 1%; |
| | | border-radius: 5px; |
| | | border: 1px solid #22408c; |
| | | margin-bottom: 5px; |
| | | background: #1a235d; |
| | | box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.12); |
| | | border-radius: 8px 8px 8px 8px; |
| | | padding: 0 10px; |
| | | |
| | | .title { |
| | | font-size: 14px; |
| | | color: rgba(255, 255, 255, 0.8); |
| | | font-family: OPPOSans, OPPOSans; |
| | | font-weight: 500; |
| | | font-size: 16px; |
| | | line-height: 19px; |
| | | text-align: left; |
| | | font-style: normal; |
| | | text-transform: none; |
| | | } |
| | | |
| | | .num { |
| | | font-size: 22px; |
| | | color: #36d3ff; |
| | | font-family: OPPOSans, OPPOSans; |
| | | font-weight: 800; |
| | | font-size: 32px; |
| | | text-align: left; |
| | | font-style: normal; |
| | | text-transform: none; |
| | | } |
| | | |
| | | .time { |
| | | color: rgba(255, 253, 253, 0.7); |
| | | font-family: Poppins, Poppins; |
| | | font-weight: 400; |
| | | text-align: left; |
| | | font-style: normal; |
| | | text-transform: none; |
| | | } |
| | | } |
| | | |
| | | dd { |
| | | padding: 0; |
| | | margin-left: 5px; |
| | | margin-bottom: 10px; |
| | | } |
| | | } |
| | | |
| | | .hamburger { |
| | | display: inline-block; |
| | | vertical-align: middle; |
| | | width: 20px; |
| | | height: 20px; |
| | | } |
| | | |
| | | .hamburger.is-active { |
| | | transform: rotate(180deg); |
| | | } |
| | | |
| | | .item-box { |
| | | display: flex; |
| | | justify-items: center; |
| | | align-items: center; |
| | | flex-wrap: wrap; |
| | | margin: 10px 18px; |
| | | |
| | | .item-tag { |
| | | // width: 13%; |
| | | text-align: center; |
| | | margin: 5px 8px; |
| | | border-radius: 8px; |
| | | padding: 7px 10px; |
| | | font-family: OPPOSans, OPPOSans; |
| | | font-weight: 500; |
| | | font-size: 16px; |
| | | color: #ffffff; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .themeLight { |
| | | .card-box { |
| | | margin: 0 18px; |
| | | padding: 10px 18px; |
| | | box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.12); |
| | | border-radius: 8px 8px 8px 8px; |
| | | margin-bottom: 20px; |
| | | |
| | | &-title { |
| | | // margin: 10px 0 10px; |
| | | text-align: left; |
| | | font-weight: bold; |
| | | font-family: OPPOSans, OPPOSans; |
| | | font-weight: 500; |
| | | font-size: 16px; |
| | | font-style: normal; |
| | | text-transform: none; |
| | | } |
| | | |
| | | &-ul { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | } |
| | | |
| | | &-li { |
| | | width: 240px; |
| | | margin-right: 10px; |
| | | margin-top: 16px; |
| | | border-radius: 5px; |
| | | border: 1px solid #ebebeb; |
| | | margin-bottom: 5px; |
| | | background: #fff; |
| | | // box-shadow: 0px 4px 10px 0px rgba(0, 0, 0, 0.12); |
| | | border-radius: 8px 8px 8px 8px; |
| | | padding: 0 10px; |
| | | |
| | | .title { |
| | | font-size: 14px; |
| | | color: #676767; |
| | | font-family: OPPOSans, OPPOSans; |
| | | font-weight: 500; |
| | | font-size: 16px; |
| | | line-height: 19px; |
| | | text-align: left; |
| | | font-style: normal; |
| | | text-transform: none; |
| | | } |
| | | |
| | | .num { |
| | | font-size: 22px; |
| | | color: #3271eb; |
| | | font-family: OPPOSans, OPPOSans; |
| | | font-weight: 800; |
| | | font-size: 32px; |
| | | text-align: left; |
| | | font-style: normal; |
| | | text-transform: none; |
| | | } |
| | | |
| | | .time { |
| | | color: #676767; |
| | | font-family: Poppins, Poppins; |
| | | font-weight: 400; |
| | | text-align: left; |
| | | font-style: normal; |
| | | text-transform: none; |
| | | } |
| | | } |
| | | |
| | | dd { |
| | | padding: 0; |
| | | margin-left: 5px; |
| | | margin-bottom: 10px; |
| | | } |
| | | } |
| | | |
| | | .hamburger { |
| | | display: inline-block; |
| | | vertical-align: middle; |
| | | width: 20px; |
| | | height: 20px; |
| | | } |
| | | |
| | | .hamburger.is-active { |
| | | transform: rotate(180deg); |
| | | } |
| | | |
| | | .item-box { |
| | | display: flex; |
| | | justify-items: center; |
| | | align-items: center; |
| | | flex-wrap: wrap; |
| | | margin: 10px 18px; |
| | | |
| | | .item-tag { |
| | | // width: 13%; |
| | | text-align: center; |
| | | margin: 5px 8px; |
| | | border-radius: 8px; |
| | | padding: 7px 3px; |
| | | font-family: OPPOSans, OPPOSans; |
| | | font-weight: 500; |
| | | font-size: 16px; |
| | | color: #ffffff; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .scrollbar-flex-content { |
| | | display: flex; |
| | | margin: 10px 18px; |
| | | } |
| | | .scrollbar-demo-item { |
| | | flex-shrink: 0; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | // width: 100px; |
| | | // height: 50px; |
| | | // margin: 10px; |
| | | text-align: center; |
| | | border-radius: 4px; |
| | | background: var(--el-color-danger-light-9); |
| | | color: var(--el-color-danger); |
| | | } |
| | | |
| | | .item-tag { |
| | | // width: 13%; |
| | | text-align: center; |
| | | margin: 5px 8px; |
| | | border-radius: 8px; |
| | | padding: 7px 10px; |
| | | font-family: OPPOSans, OPPOSans; |
| | | font-weight: 500; |
| | | font-size: 16px; |
| | | color: #ffffff; |
| | | cursor: pointer; |
| | | } |
| | | </style> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="page"> |
| | | <div class="page-container"> |
| | | <div class="page-container-left"> |
| | | <div class="tree page-box"> |
| | | <div class="select-box mb20"> |
| | | æ°æ®æ¨¡åï¼ |
| | | <el-select |
| | | style="width: 180px" |
| | | v-model="modelData" |
| | | placeholder="è¯·éæ©æ¨¡å" |
| | | filterable |
| | | @change="changeModel" |
| | | > |
| | | <el-option |
| | | v-for="model in modelInfoOptions" |
| | | :key="model.modelCode" |
| | | :label="model.modelName" |
| | | :value="model.modelCode" |
| | | /> |
| | | </el-select> |
| | | </div> |
| | | <div class="tree-box" v-loading="treeLoading"> |
| | | <el-tree |
| | | ref="treeRef" |
| | | :props="defaultProps" |
| | | :data="treeData" |
| | | node-key="id" |
| | | highlight-current |
| | | :filter-node-method="filterNode" |
| | | :default-expanded-keys="treeExpandData" |
| | | :expand-on-click-node="false" |
| | | @node-click="changeNode" |
| | | accordion |
| | | > |
| | | <template #default="{ node, data }"> |
| | | <span> |
| | | <el-tooltip |
| | | v-if="node.label.length > 16" |
| | | class="item" |
| | | effect="dark" |
| | | :content="node.label" |
| | | placement="top-end" |
| | | > |
| | | <span>{{ node.label.slice(0, 16) + "..." }}</span> |
| | | </el-tooltip> |
| | | <span v-else id="b">{{ node.label }}</span> |
| | | </span> |
| | | </template> |
| | | </el-tree> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="page-container-right"> |
| | | <BaseCard :title="currentNode ? currentNode.label + '--èç¹é
ç½®' : 'ææ èç¹é
ç½®'"> |
| | | <div class="content-box"> |
| | | <ConfigureView ref="configureViewRef" /> |
| | | </div> |
| | | </BaseCard> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { listModel } from "@/api/modelConfiguration/businessModel" |
| | | import { treeList } from "@/api/modelConfiguration/indexWarehouse" |
| | | import ConfigureView from "../components/configure.vue" |
| | | import { nextTick } from "vue" |
| | | import { useRoute } from "vue-router" |
| | | let { proxy } = getCurrentInstance() |
| | | let treeLoading = ref(true) |
| | | let modelData = ref(null) |
| | | let modelInfoOptions = ref([]) //䏿å表 |
| | | const configureViewRef = ref() |
| | | //è·å䏿å表 |
| | | function searchList(flag) { |
| | | listModel({ isShow: 1 }).then((response) => { |
| | | modelInfoOptions.value = response.data |
| | | if (flag) { |
| | | if (modelInfoOptions.value.length > 0) { |
| | | if (proxy.$route.query.modelCode) { |
| | | modelData.value = proxy.$route.query.modelCode |
| | | } else { |
| | | modelData.value = modelInfoOptions.value[0].modelCode |
| | | } |
| | | getTreeList(modelData.value) |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | |
| | | searchList(true) |
| | | |
| | | //䏿éä¸è§¦åæ å表 |
| | | function changeModel(item) { |
| | | // console.log('changeModel', item) |
| | | getTreeList(item) |
| | | } |
| | | |
| | | let treeRef = ref(null) |
| | | let treeData = ref([]) |
| | | |
| | | const defaultProps = ref({ |
| | | children: "children", |
| | | label: "label", |
| | | }) |
| | | |
| | | //æ£ç´¢æ |
| | | let filterText = ref("") |
| | | |
| | | const filterNode = (value, data) => { |
| | | if (!value) return true |
| | | return data.label.includes(value) |
| | | } |
| | | watch(filterText, (val) => { |
| | | // æ£æ¥treeRef.valueæ¯å¦æ¯ä¸ä¸ªææçElTreeå®ä¾ |
| | | if (treeRef.value && typeof treeRef.value.filter === "function") { |
| | | // è°ç¨filteræ¹æ³ |
| | | treeRef.value.filter(val) |
| | | } else { |
| | | // treeRef.valueæ æï¼å¤çé误 |
| | | console.error("error") |
| | | } |
| | | }) |
| | | |
| | | let currentNode = ref(null) |
| | | let treeExpandData = ref([]) |
| | | let isFirstLeafNode = ref(false) |
| | | let deviceConfigRef = ref(null) |
| | | let collectIndicatorsRef = ref(null) |
| | | let statisticalIndicatorsRef = ref(null) |
| | | |
| | | //è·åæ å表 |
| | | function getTreeList(modelCode) { |
| | | treeLoading.value = true |
| | | treeList({ modelCode }).then((res) => { |
| | | treeLoading.value = false |
| | | let { data } = res |
| | | treeData.value = data |
| | | let chooseNode = null |
| | | if (data.length > 0) { |
| | | if (data[0].children && data[0].children.length !== 0 && isFirstLeafNode.value) { |
| | | if (data[0].children[0].children && data[0].children[0].children.length !== 0) { |
| | | chooseNode = data[0].children[0].children[0] |
| | | } else { |
| | | chooseNode = data[0].children[0] |
| | | } |
| | | } else { |
| | | chooseNode = data[0] |
| | | } |
| | | currentNode.value = chooseNode |
| | | changeNode(currentNode.value) |
| | | treeExpandData.value.push(chooseNode.id) |
| | | nextTick(() => { |
| | | treeRef.value.setCurrentKey(chooseNode.id) |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | //æ ç¹å» |
| | | function changeNode(data, node, ev) { |
| | | console.log("æ ç¹å»", data) |
| | | currentNode.value = data |
| | | configureViewRef.value.changeModelNode(data) |
| | | } |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | @import "@/assets/styles/page.scss"; |
| | | |
| | | .page-box { |
| | | height: calc(100vh - 145px); |
| | | padding-top: 12px; |
| | | |
| | | .tree-box { |
| | | height: calc(100% - 70px); |
| | | overflow-y: auto !important; |
| | | } |
| | | |
| | | .select-box { |
| | | display: flex; |
| | | align-items: center; |
| | | color: #3371eb; |
| | | margin-left: 10px; |
| | | |
| | | :deep .el-icon { |
| | | color: #fff; |
| | | margin: 0 10px 0 15px; |
| | | font-size: 14px; |
| | | } |
| | | } |
| | | |
| | | .node-opt { |
| | | flex: 1; |
| | | text-align: right; |
| | | margin-right: 5px; |
| | | |
| | | :deep .el-icon { |
| | | color: #fff; |
| | | margin-right: 5px; |
| | | } |
| | | } |
| | | } |
| | | |
| | | :deep .el-tabs__nav-wrap:after { |
| | | background: transparent; |
| | | } |
| | | |
| | | :deep .el-tabs__item { |
| | | color: #fff; |
| | | font-size: 20px; |
| | | padding: 0 20px; |
| | | |
| | | &.is-active, |
| | | &:hover { |
| | | color: #999 !important; |
| | | } |
| | | } |
| | | |
| | | .tab-box { |
| | | display: flex; |
| | | align-items: center; |
| | | color: #fff; |
| | | border-bottom: 1px solid #3371eb; |
| | | margin-right: 20px; |
| | | |
| | | .tab-li { |
| | | cursor: pointer; |
| | | border: 1px solid #3371eb; |
| | | padding: 10px 25px; |
| | | border-radius: 5px 5px 0 0; |
| | | } |
| | | |
| | | .is-tab { |
| | | background: #3371eb; |
| | | } |
| | | } |
| | | |
| | | .content-box { |
| | | height: calc(100vh - 206px) !important; |
| | | } |
| | | </style> |