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.

360 lines
9.9 KiB

<template>
<div class="safe-monitor-setting-page">
<TopBackTitle :showBackBtn="false"></TopBackTitle>
<div class="container-box flex p-16">
<div class="tree-box">
<el-input v-model="filterText" placeholder="请输入关键字"></el-input>
<el-tree
class="filter-tree mt-10"
highlight-current
:data="treeData"
:props="defaultProps"
lazy
:load="loadTree"
:filter-node-method="filterNode"
@node-click="handleClickTree"
ref="tree"
>
</el-tree>
</div>
<div class="content-box" ref="contentRef">
<div class="flex items-center">
<span>测点编码</span>
<el-input
class="w-200"
size="small"
v-model="searchCode"
placeholder="请输入"
></el-input>
<span class="ml-24">测点类型</span>
<el-select size="small" class="w-200" v-model="searchType">
<el-option label="全部" value=""></el-option>
<el-option
v-for="item in searchTypeOptions"
:label="item.dictLabel"
:value="item.dictValue"
6 months ago
:key="item.dictValue"
></el-option>
</el-select>
</div>
<el-table
class="mt-12"
:data="tableData"
border
style="width: 100%"
:height="tableHeight"
>
<el-table-column type="index" label="序号" width="60">
</el-table-column>
<el-table-column prop="name" label="测点名称"> </el-table-column>
<el-table-column prop="code" label="测站编码"> </el-table-column>
<el-table-column prop="type" label="测站类型"> </el-table-column>
<el-table-column prop="code" label="采集方式"> </el-table-column>
<el-table-column prop="source" label="数据来源"> </el-table-column>
<el-table-column label="操作" width="100">
<template slot-scope="scope">
<el-button type="text" @click="handleSetForm(scope.row)"
>配置</el-button
>
</template>
</el-table-column>
</el-table>
<div class="mt-24 flex justify-end">
<el-pagination
background
layout="prev, pager, next"
:page-size="params.pageSize"
:total="params.total"
>
</el-pagination>
</div>
<div class="bottom-box">
<div class="flex items-center">
<div class="w-180 text-right flex-shrink-0">预警类型</div>
<el-select class="w-200" v-model="currentForm.warnType">
<el-option label="日降雨" value="1"></el-option>
<el-option label="x小时累计降雨" value="2"></el-option>
</el-select>
<div class="ml-10">日降雨指本日8时至次日8时</div>
</div>
<div v-for="(item, index) in currentForm.noticeList" :key="index">
<div class="flex items-center mt-10">
<div class="w-180 text-right flex-shrink-0">设置预警值</div>
<el-input
class="w-200"
v-model="item.warnValue"
placeholder="请输入"
></el-input>
<div class="ml-10">mm/d</div>
<i
v-if="
currentForm.noticeList.length > 1 &&
index != currentForm.noticeList.length - 1
"
class="el-icon-remove ml-18 font-18 cursor-pointer"
@click="handleRemoveNoticeItem(index)"
></i>
<i
v-else
class="el-icon-circle-plus ml-18 font-18 cursor-pointer"
@click="handleAddNoticeItem"
></i>
</div>
<div class="flex items-center mt-10">
<div class="w-180 text-right flex-shrink-0">预警通知人</div>
<el-select
class="w-200"
filterable
v-model="item.userId"
remote
:remote-method="searchUser"
value-key="id"
placeholder="请输入关键词搜索用户"
>
<el-option
v-for="item in userList"
:key="item.id"
:label="item.name"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
<div class="flex items-start mt-10">
<div class="w-180 text-right flex-shrink-0">通知模板</div>
<el-input
class=""
type="textarea"
placeholder="请输入"
:rows="4"
v-model="currentForm.notifyText"
></el-input>
</div>
<div class="flex justify-end mt-16">
<el-button type="primary" @click="handleSaveRowForm"
>保存</el-button
>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import TopBackTitle from "@/components/TopBackTitle";
import { getAreasData } from "@/api/areas/index";
import { getDicts } from "@/api/management";
import { listUser } from "@/api/system/user";
export default {
components: { TopBackTitle },
data() {
return {
filterText: "",
treeData: [],
defaultProps: {
children: "children",
label: "label",
isLeaf: "leaf",
},
params: {
pageSize: 20,
pageNum: 1,
total: 0,
},
searchCode: "",
searchType: "",
searchTypeOptions: [],
userList: [],
tableData: [{}, {}],
currentForm: {
noticeList: [
{
warnType: "",
userId: "",
},
],
notifyText: `{通知人name}同志,现发生【水库名称】【测站点编码】{预警类型name},预警数值【监测值、监测日期时间】,请您严格履行责任人防汛职责,(核对水库数据,提交相关水行政主管单位、联系仪器厂商校准仪器),保证水库数据准确。【广东省水利厅】`,
},
tableHeight: null,
};
},
watch: {
filterText(val) {
this.$refs.tree.filter(val);
},
},
created() {
this.getTreeData();
this.searchUser("");
// 获取巡查类型
getDicts("measurement_point_type").then((res) => {
if (res.data && Array.isArray(res.data)) {
this.searchTypeOptions = res.data;
}
});
},
mounted() {
let h = this.$refs.contentRef.offsetHeight - 418 - 30;
this.tableHeight = h > 0 ? h : 300;
},
methods: {
// 获取行政区数据
getTreeData() {
getAreasData().then((items) => {
let res = [];
let getChildren = (res, pid) => {
for (const i of items.data) {
if (i.parentid === pid) {
const newItem = {
label: i.name,
value: i.id,
};
if (i.layer != 3) newItem.children = [];
res.push(newItem);
getChildren(newItem.children, newItem.value);
}
}
};
getChildren(res, items.data[0].parentid);
this.treeData = res;
});
},
// 获取人员列表信息
searchUser(e) {
listUser({
data: {
timeView: {
timeField: "create_time",
},
},
cv: {
name: "nickName",
type: "like",
value: e,
},
pageSize: 100,
pageNum: 1,
}).then((res) => {
this.userList =
res.records?.map((v) => {
return {
id: v.id,
name: v.nickName,
uid: v.uuid,
};
}) || [];
});
},
filterNode(value, data) {
if (!value) return true;
return data.label.indexOf(value) !== -1;
},
loadTree(node, resolve) {
console.log("node >>>>> ", node);
if (node.level === 0) {
return resolve(node.data);
} else {
if (node.data.isEnd) {
return resolve([]);
} else if (node.data.children?.length) {
return resolve(node.data.children);
} else if (!node.isLeaf) {
setTimeout(() => {
resolve([
{
id: 111,
label: "xxx水库",
isEnd: true,
leaf: true,
},
]);
}, 800);
} else {
resolve();
}
}
},
handleClickTree(data, node) {
console.log("handleClickTree >>>>> ", data, node);
if (node.isLeaf) {
console.log("点击叶子节点----加载水库列表 >>>> ");
}
},
handleAddNoticeItem() {
this.currentForm.noticeList.push({
warnValue: "",
userId: "",
});
},
handleRemoveNoticeItem(index) {
this.currentForm.noticeList.splice(index, 1);
},
handleSetForm(row) {
this.currentForm = {
noticeList: row.noticeList || [
{
warnValue: "",
userId: "",
},
],
warnType: row.warnType,
notifyText: row.notifyText || "",
};
},
handleSaveRowForm() {},
},
};
</script>
<style scoped lang="scss">
.safe-monitor-setting-page {
position: relative;
font-size: 14px;
height: 100%;
.container-box {
height: calc(100% - 56px);
}
.tree-box {
flex-shrink: 0;
width: 240px;
padding: 12px;
background: #fff;
border-radius: 2px;
}
.content-box {
flex: 1;
background: #fff;
margin-left: 10px;
padding: 12px;
overflow: auto;
}
.bottom-box {
border: 1px solid #ccc;
padding: 10px;
margin-top: 16px;
background: #f4f5f7;
}
.w-100 {
width: 100px;
}
.w-180 {
width: 180px;
}
.w-200 {
width: 200px;
}
}
</style>