123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705 |
- <template>
- <div class="main deviceClass">
- <el-card class="box-card-tree">
- <button class="btn green" style="margin-bottom:10px" @click="handleTreeAdd()"
- >新增</button
- >
- <button
- class="btn green"
- @click="handleTreeDel()"
- :disabled="state.isDel == ''"
- >删除</button
- >
- <el-tree
- :data="state.treedata"
- :props="state.defaultProps"
- node-key="id"
- highlight-current
- :default-expanded-keys="['23']"
- @node-click="handleNodeClick"
- />
- </el-card>
- <el-card class="box-card">
- <el-tabs type="card" class="tab">
- <el-tab-pane label="传感点">
- <el-row :gutter="24" align="middle">
- <el-col :span="2">
- <button
- class="btn green"
- style="margin-bottom: 10px"
- @click="handleEdit(state.addFormData)"
- :disabled='state.desc.code==""'
- >新增</button
- ></el-col
- >
- <el-col :span="5">
- <el-input
- v-model="state.SearchVal"
- placeholder="筛选"
- :prefix-icon="Search"
- @input="fifterSearch()"
- size="small"
- />
- </el-col>
- </el-row>
- <el-table
- :data="state.fifterSearchTableData"
- stripe
- style="width: 100%"
- height="700"
- >
- <el-table-column type="index" width="50" />
- <el-table-column
- prop="metriccode"
- label="测点编码"
- ></el-table-column>
- <el-table-column label="名称">
- <template #default="scope">
- <el-popover placement="right" :width="260" trigger="click">
- <template #reference>
- <el-button type="text" style="color: #B3BDC0" size="small">{{
- scope.row.name
- }}</el-button>
- </template>
- <el-table :data="scope.row.deviceModelMetrics" max-height="400px">
- <el-table-column
- property="devicemodel"
- label="机型"
- align="center"
- ></el-table-column>
- <el-table-column
- property="uniformcode"
- label="统一编码"
- align="center"
- ></el-table-column>
- <el-table-column
- property="multiplier"
- label="倍率"
- align="center"
- ></el-table-column>
- </el-table>
- </el-popover>
- </template>
- </el-table-column>
- <el-table-column prop="unitname" label="单位"></el-table-column>
- <el-table-column
- prop="categorydata"
- label="测点类型"
- ></el-table-column>
- <el-table-column
- prop="categorysci"
- label="物理类型"
- ></el-table-column>
- <el-table-column prop="description" label="描述"></el-table-column>
- <el-table-column label="操作" width="180" align="center">
- <template #default="scope">
- <el-button
- type="text"
- style="color: #B3BDC0"
- @click="handleEdit(scope.row)"
- >编辑</el-button
- >
- <el-button
- type="text"
- style="color: #B3BDC0"
- @click="handleDelete(scope.row)"
- >删除</el-button
- >
- </template>
- </el-table-column>
- </el-table>
- </el-tab-pane>
- <el-tab-pane label="故障模式">
- <faultmode />
- </el-tab-pane>
- <el-tab-pane label="基本信息" style="width: 50%">
- <el-form :model="state.desc" label-width="100px">
- <el-form-item label="结构编码">
- <el-input v-model="state.desc.code"></el-input>
- </el-form-item>
- <el-form-item label="上级节点">
- <el-cascader
- v-model="state.desc.parentcode"
- :options="state.cascaderdata"
- :props="{ checkStrictly: true, emitPath: false }"
- :show-all-levels="false"
- clearable
- />
- </el-form-item>
- <el-form-item label="设备ID">
- <el-input v-model="state.desc.deviceid" disabled></el-input>
- </el-form-item>
- <el-form-item label="结构名称">
- <el-input v-model="state.desc.name"></el-input>
- </el-form-item>
- <el-form-item label="结构英文名称">
- <el-input v-model="state.desc.enname"></el-input>
- </el-form-item>
- <el-form-item label="描述">
- <el-input
- v-model="state.desc.description"
- :rows="4"
- clearable
- type="textarea"
- ></el-input>
- </el-form-item>
- <el-form-item label="序号">
- <el-input v-model="state.desc.orderno"></el-input>
- </el-form-item>
- <el-form-item label="是否有效">
- <el-switch
- class="elswitch"
- v-model="state.desc.enabled"
- active-color="#13ce66"
- inactive-color="#ff4949"
- />
- </el-form-item>
- </el-form>
- <button
- style="float: right"
- class="btn green"
- @click="savedesc"
- :disabled="state.desc.code == ''"
- >保存</button
- >
- </el-tab-pane>
- </el-tabs>
- </el-card>
- <!-- 传感点编辑弹出框 -->
- <el-dialog v-model="editVisible" width="40%" custom-class="modal">
- <el-form :model="editFormData" label-width="80px">
- <el-form-item label="指标">
- <el-input v-model="editFormData.metriccode"></el-input>
- </el-form-item>
- <el-row :gutter="24">
- <el-col :span="12">
- <el-form-item label="名称">
- <el-input v-model="editFormData.name"></el-input>
- </el-form-item>
- </el-col>
- <el-col :span="12">
- <el-form-item label="英文名称">
- <el-input v-model="editFormData.enname"></el-input>
- </el-form-item> </el-col
- ></el-row>
- <el-row :gutter="24">
- <el-col :span="12">
- <el-form-item label="标准单位">
- <el-input
- v-model="editFormData.unitname"
- ></el-input> </el-form-item
- ></el-col>
- <el-col :span="12">
- <el-form-item label="单位名称">
- <el-input v-model="editFormData.unitnamecn"></el-input>
- </el-form-item> </el-col
- ></el-row>
- <el-form-item label="描述">
- <el-input
- v-model="editFormData.description"
- :rows="3"
- type="textarea"
- clearable
- ></el-input>
- </el-form-item>
- <el-row :gutter="24">
- <el-col :span="12">
- <el-form-item label="数据类型">
- <el-select
- v-model="editFormData.categorydata"
- placeholder="Select"
- >
- <el-option
- v-for="item in state.options"
- :key="item.value"
- :label="item.label"
- :value="item.value"
- ></el-option>
- </el-select> </el-form-item
- ></el-col>
- <el-col :span="12">
- <el-form-item label="结构">
- <el-cascader
- v-model="editFormData.structurecode"
- :options="state.cascaderdata"
- :props="{ checkStrictly: true ,emitPath:false}"
- clearable
- /> </el-form-item
- ></el-col>
- </el-row>
- <el-row :gutter="24">
- <el-col :span="12">
- <el-form-item label="科学类型">
- <el-input
- v-model="editFormData.categorysci"
- ></el-input> </el-form-item
- ></el-col>
- <el-col :span="12"
- ><el-form-item label="系统分类">
- <el-input
- v-model="editFormData.categorysys"
- ></el-input> </el-form-item
- ></el-col>
- </el-row>
- <el-form-item label="适配机型" class="deviceModelClass">
-
- <el-select
- v-model="state.deviceModelSel"
- style="margin-right: 20px"
- placeholder="新增机型"
- size="mini"
- >
- <el-option
- v-for="item in state.deviceModel"
- :key="item.code"
- :label="item.code"
- :value="item.code"
- >
- </el-option>
- </el-select>
- <button class="btn green" v-show="state.deviceModelSel !=''" size="mini" type="primary" @click="deviceModelAdd()"
- >新增机型</button
- >
- <el-table
- :data="editFormData.deviceModelMetrics"
- style="width: 100%"
- max-height="200px"
- >
- <el-table-column prop="devicemodel" label="机型" />
- <el-table-column label="倍率">
- <template #default="scope">
- <el-input v-model="scope.row.multiplier" size="mini" />
- </template>
- </el-table-column>
- <el-table-column label="统一编码">
- <template #default="scope">
- <el-input v-model="scope.row.uniformcode" size="mini" />
- </template>
- </el-table-column>
- </el-table>
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <button class="btn green" @click="editVisible = false">取 消</button>
- <button class="btn green" type="primary" @click="saveEdit">确 定</button>
- </span>
- </template>
- </el-dialog>
- <!-- tree add 弹出框 -->
- <el-dialog v-model="treeVisible" width="40%" custom-class="modal">
- <el-form :model="state.treeAddFormData" label-width="80px">
- <el-row :gutter="24">
- <el-col :span="12">
- <el-form-item label="结构编码">
- <el-input
- v-model="state.treeAddFormData.code"
- ></el-input> </el-form-item
- ></el-col>
- <el-col :span="12">
- <el-form-item label="上级节点" label-width="100px">
- <el-cascader
- v-model="state.treeAddFormData.parentcode"
- :options="state.cascaderdata"
- :props="{ checkStrictly: true, emitPath: false }"
- :show-all-levels="false"
- clearable
- /> </el-form-item
- ></el-col>
- </el-row>
- <el-row :gutter="24">
- <el-col :span="12">
- <el-form-item label="结构名称">
- <el-input
- v-model="state.treeAddFormData.name"
- ></el-input> </el-form-item
- ></el-col>
- <el-col :span="12">
- <el-form-item label="结构英文名称" label-width="100px">
- <el-input
- v-model="state.treeAddFormData.enname"
- ></el-input> </el-form-item
- ></el-col>
- </el-row>
- <el-row :gutter="24">
- <el-col :span="12"
- ><el-form-item label="序号">
- <el-input
- v-model="state.treeAddFormData.orderno"
- ></el-input> </el-form-item
- ></el-col>
- <el-col :span="4">
- <el-form-item label="是否有效">
- <el-switch
- v-model="state.treeAddFormData.enabled"
- class="elswitch"
- active-color="#13ce66"
- inactive-color="#ff4949"
- />
- </el-form-item
- ></el-col>
- <el-col :span="8">
- <el-form-item label="设备ID">
- <el-input
- v-model="state.treeAddFormData.deviceid"
- disabled
- ></el-input> </el-form-item
- ></el-col>
- </el-row>
- <el-form-item label="描述">
- <el-input
- v-model="state.treeAddFormData.description"
- :rows="4"
- clearable
- type="textarea"
- ></el-input>
- </el-form-item>
- </el-form>
- <template #footer>
- <span class="dialog-footer">
- <button class="btn green" @click="treeVisible = false">取 消</button>
- <button class="btn green" type="primary" @click="saveTreeAdd">确 定</button>
- </span>
- </template>
- </el-dialog>
- </div>
- </template>
- <script setup>
- import { ref, onMounted, reactive, provide, computed } from "vue";
- import { ElMessageBox, ElMessage, ElLoading } from "element-plus";
- import faultmode from "./faultmode.vue";
- import {
- tree,
- point,
- metrics,
- delmetrics,
- treeAdd,
- treeDel,
- device_list,
- } from "@/api/api.js";
- let editVisible = ref(false); //传感点
- let treeVisible = ref(false); //传感点
- let editFormData = ref({});
- onMounted(() => {
- getData();
- getDeviceModel();
- });
- let state = reactive({
- isDel: "", //是否能被删除
- SearchVal: "",
- treedata: [],
- cascaderdata: [],
- defaultProps: {
- children: "children",
- label: (a) => {
- return a.node.name;
- },
- },
- pointTableData: [],
- fifterSearchTableData: [],
- textarea: "",
- textarea1: "",
- treeCurClick: null,
- addFormData: {
- categorydata: "AI",
- categoryres1: null,
- categoryres2: null,
- categoryres3: null,
- categoryres4: null,
- categoryres5: null,
- categorysci: null,
- categorysys: null,
- description: null,
- deviceid: "windturbine",
- enname: null,
- id:null,
- metriccode: "",
- name: "",
- structurecode: "101010205",
- unitname: null,
- unitnamecn: null,
- deviceModelMetrics: [],
- },
- treeAddFormData: {
- code: "",
- parentcode: "",
- deviceid: "windturbine",
- name: "",
- enname: "",
- description: "",
- orderno: "",
- enabled: true,
- },
- options: [
- {
- value: "AI",
- label: "AI",
- },
- {
- value: "DI",
- label: "DI",
- },
- {
- value: "CI",
- label: "CI",
- },
- ],
- desc: {
- code: "",
- parentcode: "",
- deviceid: "",
- name: "",
- enname: "",
- description: "",
- orderno: "",
- enabled: true,
- },
- treeDelVal: "",
- deviceModel: [],
- deviceModelSel: "",
- });
- // 父子传参
- provide(
- "cascaderdata",
- computed(() => state.cascaderdata)
- );
- //fifterSearch
- const fifterSearch = () => {
- state.fifterSearchTableData = state.pointTableData.filter((e) => {
- return (
- e.name.includes(state.SearchVal) |
- e.categorydata.includes(state.SearchVal) |
- e.metriccode.includes(state.SearchVal)
- );
- });
- };
- // tree click
- const handleNodeClick = (data) => {
- console.log(data);
- state.isDel = data.children;
- state.desc = data.node;
- state.addFormData.structurecode = data.node.code
- getPoint(data.node);
- };
- // 测点 编辑
- const handleEdit = (row) => {
- editFormData.value = row;
- editVisible.value = true;
- };
- // tree add
- const handleTreeAdd = () => {
- treeVisible.value = true;
- };
- // tree Del
- const handleTreeDel = () => {
- console.warn(state.desc);
- if (state.isDel != null) {
- ElMessage.error(`不能删除该节点!!`);
- return;
- }
- ElMessageBox.confirm(`确定要删除 ${state.desc.name} 吗?`, "提示", {
- type: "warning",
- })
- .then(async () => {
- const res = await treeDel(state.desc.id);
- console.warn(res);
- if (res == 1) {
- ElMessage.success(`删除成功!`);
- getData();
- } else {
- ElMessage.warning(`删除失败!`);
- }
- })
- .catch(() => {});
- };
- // delTreeBtn
- const delTreeBtn = async () => {
- console.warn(state.treeDelVal);
- const res = await treeDel(state.treeDelVal);
- console.warn(res);
- if (res == 1) {
- ElMessage.success(`删除成功!`);
- getData();
- } else {
- ElMessage.warning(`删除失败!`);
- }
- state.treeDelVal = "";
- };
- //保存tree add
- const saveTreeAdd = async () => {
- const res = await treeAdd(state.treeAddFormData);
- console.warn(res);
- if (res.status == 20000) {
- ElMessage.success(`操作成功!`);
- treeVisible.value = false;
- getData();
- } else {
- ElMessage.warning(res.msg);
- }
- };
- // 测点 删除
- const handleDelete = (row) => {
- // 二次确认删除
- ElMessageBox.confirm("确定要删除吗?", "提示", {
- type: "warning",
- })
- .then(async () => {
- console.warn(row);
- const res = await delmetrics(row.id);
- console.warn(res);
- if (res == 1) {
- ElMessage.success(`删除成功!`);
- } else {
- ElMessage.success("删除失败");
- }
- getPoint(state.desc);
- })
- .catch(() => {});
- };
- // 保存编辑
- const saveEdit = async () => {
- postmetrics();
- };
- //测点 add
- const postmetrics = async () => {
- console.warn(editFormData.value);
- const res = await metrics(editFormData.value);
- console.warn(res);
- if (res.status == 20000) {
- ElMessage.success(`操作成功!`);
- editVisible.value = false;
- } else {
- ElMessage.success(res.msg);
- }
- getPoint(state.desc);
- };
- // getData
- const getData = async () => {
- const loading = ElLoading.service({
- lock: true,
- text: "数据加载中...",
- background: "rgba(0, 0, 0, 0.5)",
- });
- const res = await tree();
- loading.close();
- console.warn(res);
- state.treedata = res.children;
- state.cascaderdata = cascaderforEach(res);
- console.warn(state.cascaderdata);
- };
- //deviceModelAdd 新增机型
- const deviceModelAdd = async () => {
- if (state.deviceModelSel == "") return;
- console.warn();
- let obj = {
- deviceid: editFormData.value.deviceid,
- devicemodel: state.deviceModelSel,
- id: null,
- metriccode: editFormData.value.metriccode,
- multiplier: 0,
- uniformcode: "",
- };
- editFormData.value.deviceModelMetrics.push(obj);
- };
- //getDeviceModel
- const getDeviceModel = async () => {
- const res = await device_list();
- state.deviceModel = res;
- console.warn(res);
- };
- ///// 基本信息
- const savedesc = async () => {
- const res = await treeAdd(state.desc);
- console.warn(res);
- if (res.status == 20000) {
- ElMessage.success(`操作成功!`);
- } else {
- ElMessage.success(res.msg);
- }
- };
- ///// 基本信息
- // getPoint
- const getPoint = async (node) => {
- const res = await point(node.code);
- console.warn(res);
- state.pointTableData = res;
- fifterSearch();
- };
- // 递归解析基础数据
- const cascaderforEach = (val) => {
- if (val.children != null) {
- val.children.forEach((v) => {
- v["value"] = v.node.code;
- v["label"] = v.node.name;
- v["id"] = v.node.id;
- cascaderforEach(v);
- });
- return val.children;
- }
- };
- </script>
- <style lang="scss" scoped>
- .main {
- display: flex;
- width: 100%;
- height: 100%;
- box-sizing: border-box;
- justify-content: space-between;
- .box-card-tree {
- width: 20%;
- margin-right: 1%;
- overflow: auto;
- }
- .box-card {
- flex: 1;
- .desc {
- display: flex;
- margin-bottom: 30px;
- span {
- width: 100px;
- }
- }
- }
- }
- </style>
- <style lang="less" >
- .deviceModelClass {
- .el-table__header tr,
- .el-table__header th {
- padding: 0;
- height: 40px;
- }
- .el-table__body tr,
- .el-table__body td {
- padding: 0;
- height: 40px;
- }
- }
- .tab{
- .el-tabs__item.is-active{
- color:@green;
- }
- .el-tabs__item{
- color: #b7b7b7;
- }
- }
- .elswitch{
- .el-switch__input{
- position: absolute!important;
- }
- }
- .deviceClass{
- .el-row{
- margin-bottom: 16px;
- }
- }
- </style>
|