Browse Source

fix: 水库开发需求提交

sy-water-data-board-ui
panyuyi 4 months ago
parent
commit
48ee220013
  1. 105
      src/api/reservoir/index.js
  2. BIN
      src/assets/image/reservoir_big.png
  3. BIN
      src/assets/image/reservoir_normal.png
  4. BIN
      src/assets/image/reservoir_small.png
  5. 217
      src/views/aiSupervision/layerManage/resource/LayerDetails.vue
  6. 205
      src/views/reservoir/safeMonitorSetting/components/Form.vue
  7. 346
      src/views/reservoir/safeMonitorSetting/index.vue
  8. 494
      src/views/reservoir/safeMonitorSetting/js/index.js
  9. 40
      src/views/reservoir/safeOperation/components/BaseInfo.vue
  10. 200
      src/views/reservoir/safeOperation/components/EngineSafe.vue
  11. 166
      src/views/reservoir/safeOperation/components/EnvirQuality.vue
  12. 118
      src/views/reservoir/safeOperation/components/MonitorWarning.vue
  13. 35
      src/views/reservoir/safeOperation/components/ProjectDetail.vue
  14. 229
      src/views/reservoir/safeOperation/components/RealTimeMonitor.vue
  15. 157
      src/views/reservoir/safeOperation/components/WaterRain.vue
  16. 113
      src/views/reservoir/safeOperation/index.vue
  17. 138
      src/views/reservoir/safeOperation/js/initEcharts.js

105
src/api/reservoir/index.js

@ -28,6 +28,32 @@ export const getLayerData = async (sceneId) => {
});
};
// 获取水库基础列表
export const getReservoirBaseListData = (data) => {
return request({
url: `/sk/base/list`,
method: 'post',
data: data
})
}
// 获取水库测站基础列表
export const getReservoirCZListData = (data) => {
return request({
url: `/cz/base/list`,
method: 'post',
data: data
})
}
// 获取水库测站提交告警详情
export const getReservoirCZAlarmDetailsData = (id) => {
return request({
url: `/cz/base/${id}`,
method: 'get'
})
}
// 水库基础信息详情
export const getReservoirBaseDetailData = (id) =>{
return request({
@ -35,6 +61,13 @@ export const getReservoirBaseDetailData = (id) =>{
method: 'get'
})
}
// 获取水库代表站信息详情
export const getReservoirFlagCZData = (id) =>{
return request({
url: `/sk/base/stcd/${id}`,
method: 'get'
})
}
// 水库特征信息详情
export const getReservoirRsppDetailData = (id) =>{
return request({
@ -43,6 +76,76 @@ export const getReservoirRsppDetailData = (id) =>{
})
}
// 水库测站详情
export const getReservoirCZDetailData = (id) =>{
return request({
url: `/cz/base/${id}`,
method: 'get'
})
}
// 测站要素详情
export const getReservoirCZElementDetailData = (data) =>{
return request({
url: `/cz/monitor/water`,
method: 'post',
data
})
}
// 测站树结构
export const getReservoirTreeDetailData = (data) =>{
return request({
url: `/cd/base/tree`,
method: 'get',
params: data
})
}
// 获取测点列表
export const getReservoirCZPointListData = (data) =>{
return request({
url: `/cd/base/list`,
method: 'post',
data
})
}
// 获取水库测站echarts数据
export const getReservoirCZEchartsData = (data) =>{
return request({
url: `/cz/monitor/chart`,
method: 'post',
data
})
}
// 分页获取监测告警信息/cz/alarm/page
export const getReservoirCZAlarmPageData = (data) =>{
return request({
url: `/cz/alarm/page`,
method: 'post',
data
})
}
// 保存监测预警表单信息 /cz/monitor/config
export const saveReservoirCZMonitorConfigData = (data) =>{
return request({
url: `/cz/monitor/config`,
method: 'post',
data
})
}
// 获取监测预警表单信息 /cz/monitor/config/list/{stcd}
export const getReservoirCZMonitorConfigData = (stcd) =>{
return request({
url: `/cz/monitor/config/list/${stcd}`,
method: 'get'
})
}
// 水库实时监测--监测站树数据
export const getReservoirMonitorTreeData = (id) =>{
return request({
@ -58,3 +161,5 @@ export const getReservoirRainDetailData = (id) =>{
method: 'get'
})
}

BIN
src/assets/image/reservoir_big.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
src/assets/image/reservoir_normal.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
src/assets/image/reservoir_small.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

217
src/views/aiSupervision/layerManage/resource/LayerDetails.vue

@ -17,13 +17,23 @@
</div>
</div>
<div class="middle">
<el-button type="primary" plain @click="dialogFormVisible = true">添加图层</el-button>
<el-button type="primary" plain @click="dialogFormVisible = true"
>添加图层</el-button
>
<el-dialog :title="dialogTitle" :visible.sync="dialogFormVisible">
<el-tabs v-model="activeName" type="card">
<el-tab-pane label="基础字段" name="1">
<el-form :model="editDataInfoForm">
<el-form-item label="服务类型" style="font-size: 1rem" :label-width="'120px'">
<el-select style="width: 80%" v-model="editDataInfoForm.serviceType" placeholder="请选择">
<el-form-item
label="服务类型"
style="font-size: 1rem"
:label-width="'120px'"
>
<el-select
style="width: 80%"
v-model="editDataInfoForm.serviceType"
placeholder="请选择"
>
<el-option
v-for="item in serviceTypeOptions"
:key="item.value"
@ -33,17 +43,49 @@
</el-select>
</el-form-item>
<el-form-item label="服务名称" prop="serviceName" style="font-size: 1rem" :label-width="'120px'">
<el-input v-model.trim="editDataInfoForm.serviceName" style="width: 80%"></el-input>
<el-form-item
label="服务名称"
prop="serviceName"
style="font-size: 1rem"
:label-width="'120px'"
>
<el-input
v-model.trim="editDataInfoForm.serviceName"
style="width: 80%"
></el-input>
</el-form-item>
<el-form-item label="服务别名" prop="serviceNameAlias" style="font-size: 1rem" :label-width="'120px'">
<el-input v-model.trim="editDataInfoForm.serviceNameAlias" style="width: 80%"></el-input>
<el-form-item
label="服务别名"
prop="serviceNameAlias"
style="font-size: 1rem"
:label-width="'120px'"
>
<el-input
v-model.trim="editDataInfoForm.serviceNameAlias"
style="width: 80%"
></el-input>
</el-form-item>
<el-form-item label="服务地址" prop="serviceUrl" style="font-size: 1rem" :label-width="'120px'">
<el-input v-model.trim="editDataInfoForm.serviceUrl" style="width: 80%"></el-input>
<el-form-item
label="服务地址"
prop="serviceUrl"
style="font-size: 1rem"
:label-width="'120px'"
>
<el-input
v-model.trim="editDataInfoForm.serviceUrl"
style="width: 80%"
></el-input>
</el-form-item>
<el-form-item label="服务token" prop="serviceToken" style="font-size: 1rem" :label-width="'120px'">
<el-input v-model.trim="editDataInfoForm.serviceToken" style="width: 80%"></el-input>
<el-form-item
label="服务token"
prop="serviceToken"
style="font-size: 1rem"
:label-width="'120px'"
>
<el-input
v-model.trim="editDataInfoForm.serviceToken"
style="width: 80%"
></el-input>
</el-form-item>
<el-form-item
v-if="editDataInfoForm.serviceType === '030300'"
@ -52,7 +94,10 @@
style="font-size: 1rem"
:label-width="'120px'"
>
<el-input v-model="editDataInfoForm.serviceIndex" style="width: 80%"></el-input>
<el-input
v-model="editDataInfoForm.serviceIndex"
style="width: 80%"
></el-input>
</el-form-item>
<el-form-item
v-show="['030300'].includes(editDataInfoForm.serviceType)"
@ -70,7 +115,11 @@
}"
@click="handleLayerStyleTypeChange"
>
{{ editDataInfoForm.relationStyleName ? editDataInfoForm.relationStyleName : "点击选择样式" }}
{{
editDataInfoForm.relationStyleName
? editDataInfoForm.relationStyleName
: "点击选择样式"
}}
</el-tag>
<el-button
style="margin-left: 15px"
@ -93,24 +142,46 @@
</el-tab-pane>
<el-tab-pane label="扩展字段" name="2">
<div class="fn-btns">
<el-button type="primary" class="btn" @click="addRow">添加</el-button>
<el-button type="danger" class="btn" @click="deleteRow">删除</el-button>
<el-button type="primary" class="btn" @click="addRow"
>添加</el-button
>
<el-button type="danger" class="btn" @click="deleteRow"
>删除</el-button
>
</div>
<el-table max-height="400px" :data="extendTable" border @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center"></el-table-column>
<el-table
max-height="400px"
:data="extendTable"
border
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="50"
align="center"
></el-table-column>
<el-table-column prop="field" label="字段名称">
<template slot-scope="scope">
<el-input v-model="scope.row.field" :disabled="!scope.row.isEdit"></el-input>
<el-input
v-model="scope.row.field"
:disabled="!scope.row.isEdit"
></el-input>
</template>
</el-table-column>
<el-table-column prop="alias" label="别名">
<template slot-scope="scope">
<el-input v-model="scope.row.alias" :disabled="!scope.row.isEdit"></el-input>
<el-input
v-model="scope.row.alias"
:disabled="!scope.row.isEdit"
></el-input>
</template>
</el-table-column>
<el-table-column prop="value" label="字段值">
<template slot-scope="scope">
<el-input v-model="scope.row.value" :disabled="!scope.row.isEdit"></el-input>
<el-input
v-model="scope.row.value"
:disabled="!scope.row.isEdit"
></el-input>
</template>
</el-table-column>
<el-table-column label="操作" width="200">
@ -154,23 +225,43 @@
<el-tab-pane label="字段配置" v-if="showFieldExtend()" name="3">
<div class="field-box">
<div class="field-filter">
<el-input class="keyword-input" placeholder="请输入搜索字段" v-model="fieldValue" clearable>
<el-input
class="keyword-input"
placeholder="请输入搜索字段"
v-model="fieldValue"
clearable
>
</el-input>
<el-button class="search-btn">搜索</el-button>
</div>
</div>
<el-table max-height="400px" :data="fieldsTable" border>
<el-table-column type="index" width="50" align="center"></el-table-column>
<el-table-column prop="field" label="字段名称"> </el-table-column>
<el-table-column
type="index"
width="50"
align="center"
></el-table-column>
<el-table-column prop="field" label="字段名称">
</el-table-column>
<el-table-column prop="fieldName" label="字段别名">
<template slot-scope="scope">
<el-input v-model="scope.row.fieldName"></el-input>
</template>
</el-table-column>
<el-table-column prop="fieldType" label="字段类型"> </el-table-column>
<el-table-column prop="isShow" label="支持查询" width="80" align="center">
<el-table-column prop="fieldType" label="字段类型">
</el-table-column>
<el-table-column
prop="isShow"
label="支持查询"
width="80"
align="center"
>
<template slot-scope="scope">
<el-checkbox v-model="scope.row.isShow" :true-label="1" :false-label="0"></el-checkbox>
<el-checkbox
v-model="scope.row.isShow"
:true-label="1"
:false-label="0"
></el-checkbox>
</template>
</el-table-column>
</el-table>
@ -179,11 +270,19 @@
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false"> </el-button>
<el-button type="primary" @click="saveOrUpdateLayer"> </el-button>
<el-button type="primary" @click="saveOrUpdateLayer"
> </el-button
>
</div>
</el-dialog>
<div class="keyword-filter">
<el-input class="keyword-input" placeholder="请输入内容" v-model="keyword" clearable> </el-input>
<el-input
class="keyword-input"
placeholder="请输入内容"
v-model="keyword"
clearable
>
</el-input>
<el-button class="search-btn">搜索</el-button>
</div>
</div>
@ -191,19 +290,33 @@
<el-table :data="tableData" stripe style="width: 100%">
<el-table-column
type="index"
:index="(index) => index + (pageOptions.pageNum - 1) * pageOptions.pageSize + 1"
:index="
(index) =>
index + (pageOptions.pageNum - 1) * pageOptions.pageSize + 1
"
label="序号"
width="50"
header-align="center"
></el-table-column>
<el-table-column prop="id" label="图层资源目录编号" width="350"> </el-table-column>
<el-table-column prop="serviceNameAlias" label="图层资源名称"> </el-table-column>
<el-table-column prop="id" label="图层资源目录编号" width="350">
</el-table-column>
<el-table-column prop="serviceNameAlias" label="图层资源名称">
</el-table-column>
<el-table-column prop="pubDate" label="创建时间"> </el-table-column>
<el-table-column prop="createUser" label="创建人"> </el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button size="mini" @click="handleEdit(scope.$index, scope.row)">编辑</el-button>
<el-button size="mini" type="danger" @click="handleDelete(scope.row)">删除</el-button>
<el-button
size="mini"
@click="handleEdit(scope.$index, scope.row)"
>编辑</el-button
>
<el-button
size="mini"
type="danger"
@click="handleDelete(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
@ -308,7 +421,6 @@ export default {
"editDataInfoForm.serviceUrl"(val) {
if (val) {
if (!this.queryServiceUrlMap.has(val)) {
debugger;
this.queryLayerByUrl(val);
} else {
this.fieldsTable = this.queryServiceUrlMap.get(val);
@ -331,9 +443,13 @@ export default {
methods: {
searchField() {
if (this.fieldValue === "") {
this.fieldsTable = this.queryServiceUrlMap.get(this.editDataInfoForm.serviceUrl);
this.fieldsTable = this.queryServiceUrlMap.get(
this.editDataInfoForm.serviceUrl
);
} else {
this.fieldsTable = this.fieldsTable.filter((item) => item.field.includes(this.fieldValue));
this.fieldsTable = this.fieldsTable.filter((item) =>
item.field.includes(this.fieldValue)
);
}
},
goBack() {
@ -356,11 +472,15 @@ export default {
},
handleDelete(row) {
this.$confirm("删除图层将同时删除该图层资源以及关联的图层数据,删除后将不可恢复,是否继续删除?", "提示", {
this.$confirm(
"删除图层将同时删除该图层资源以及关联的图层数据,删除后将不可恢复,是否继续删除?",
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
}
)
.then(async () => {
const res = await deleteLayerApi(row.id);
if (res.success) {
@ -402,7 +522,8 @@ export default {
if (!reg.test(this.editDataInfoForm.serviceName)) {
this.$message({
type: "info",
message: "格式有误,目录名称仅支持中文、数字、字母、下划线、冒号,最大长度不超过100",
message:
"格式有误,目录名称仅支持中文、数字、字母、下划线、冒号,最大长度不超过100",
});
return;
}
@ -411,7 +532,10 @@ export default {
extendData: JSON.stringify(this.extendTable),
fields: this.fieldsTable,
};
this.queryServiceUrlMap.set(this.editDataInfoForm.serviceUrl, this.fieldsTable);
this.queryServiceUrlMap.set(
this.editDataInfoForm.serviceUrl,
this.fieldsTable
);
await saveOrUpdateLayerApi(params);
this.getLayerList();
this.dialogFormVisible = false;
@ -469,7 +593,9 @@ export default {
if (index !== undefined) {
this.extendTable.splice(index, 1);
} else {
this.extendTable = this.extendTable.filter((item) => !this.multipleSelection.includes(item));
this.extendTable = this.extendTable.filter(
(item) => !this.multipleSelection.includes(item)
);
}
})
.catch(() => {
@ -495,7 +621,9 @@ export default {
}
//
const name = this.extendTable[index].field;
const isRepeat = this.extendTable.some((item, i) => item.field === name && i !== index);
const isRepeat = this.extendTable.some(
(item, i) => item.field === name && i !== index
);
if (isRepeat) {
this.$message({
type: "info",
@ -509,10 +637,11 @@ export default {
this.multipleSelection = val;
},
showFieldExtend() {
return ["021102", "081100", "030300"].includes(this.editDataInfoForm.serviceType);
return ["021102", "081100", "030300"].includes(
this.editDataInfoForm.serviceType
);
},
queryLayerByUrl(url) {
debugger;
queryServiceInfoApi(url, {
type: this.editDataInfoForm.serviceType,
url: url,

205
src/views/reservoir/safeMonitorSetting/components/Form.vue

@ -0,0 +1,205 @@
<template>
<div class="form-comp">
<el-form
:disabled="disabled"
ref="formRef"
:model="formData"
label-position="right"
:rules="rules"
label-width="120px"
>
<el-form-item
:label="item.label"
v-for="item in formItems"
:key="item.key"
:prop="item.key"
>
<!-- 普通输入框 -->
<el-input
:disabled="item.disabled"
class="input-w"
v-if="item.type === 'input'"
v-model="formData[item.key]"
:placeholder="item.placeholder"
>
<template slot="append" v-if="item.unit || item.unitHtml">
<div v-if="item.unitHtml" v-html="item.unitHtml"></div>
<span v-else>{{ item.unit }}</span>
</template>
</el-input>
<template v-else-if="item.type === 'selectPerson'">
<el-select
class="input-w"
v-model="formData.tempUserList"
:placeholder="item.placeholder"
:multiple-limit="item.max"
multiple
filterable
remote
reserve-keyword
:remote-method="remoteMethod"
@change="handleChangeUserList"
>
<el-option
v-for="option in userList"
:key="option.id"
:label="option.nickName"
:value="option.id"
></el-option>
</el-select>
<el-checkbox-group
style="margin-left: 12px; display: inline-block"
v-model="formData.msgType"
>
<el-checkbox label="SITE_MSG">站内信通知</el-checkbox>
<el-checkbox label="SMS_MSG">短信通知</el-checkbox>
</el-checkbox-group>
</template>
<template v-else-if="item.type === 'rainCheckbox'">
<el-checkbox-group v-model="formData[item.key]">
<el-checkbox label="1">小雨</el-checkbox>
<el-checkbox label="2">中雨</el-checkbox>
<el-checkbox label="3">大雨</el-checkbox>
<el-checkbox label="4">暴雨</el-checkbox>
<el-checkbox label="5">大暴雨</el-checkbox>
<el-checkbox label="6">特大暴雨</el-checkbox>
</el-checkbox-group>
</template>
<template v-else-if="item.type === 'noticeInterval'">
<el-input
class="input-w"
v-model="formData[item.key]"
:placeholder="item.placeholder"
>
</el-input>
<el-select
style="width: 80px; margin-left: 12px"
v-model="formData.warnTimeUnit"
>
<el-option label="分钟" value="1"></el-option>
<el-option label="秒" value="2"></el-option>
<el-option label="小时" value="3"></el-option>
</el-select>
<el-tooltip
style="margin-left: 12px"
effect="dark"
content=""
placement="right"
>
<div style="max-width: 300px" slot="content">
a.默认执行规则执行数据对比后触发预警值后默认执行一次告警通知单次执行<br />
b.设置通知间隔最新一条预警触发后执行通知间隔条件循环执行关闭本次告警循环执行需在安全运行监测/水库信息/[监测告警]
[解除预警] 进行操作
</div>
<i class="el-icon-question"></i>
</el-tooltip>
</template>
<el-input
type="textarea"
style="max-width: 720px"
v-else-if="item.type === 'textarea'"
v-model="formData[item.key]"
maxlength="300"
:rows="5"
show-word-limit
></el-input>
</el-form-item>
</el-form>
<div class="flex justify-end mt-16">
<el-button :disabled="disabled" type="primary" @click="submit"
>保存</el-button
>
</div>
</div>
</template>
<script>
import { listUser } from "@/api/system/user";
export default {
props: {
disabled: {
type: Boolean,
default: false,
},
formData: {
type: Object,
default: () => ({}),
},
rules: {
type: Object,
default: () => ({}),
},
formItems: {
type: Array,
default: () => [],
},
},
data() {
return {
userList: [],
};
},
created() {},
methods: {
//
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 || [];
});
},
remoteMethod(query) {
this.searchUser(query);
},
handleChangeUserList(ids) {
console.log("handleChangeUserList >>>>> ", ids);
if (ids.length) {
let currentUer = this.userList.filter((item) => ids.includes(item.id));
if (
this.formData.warnOperator.filter((item) => ids.includes(item.id))
.length === 0
) {
this.formData.warnOperator.push(...currentUer);
}
// ids
this.formData.warnOperator = this.formData.warnOperator.filter((item) =>
ids.includes(item.id)
);
} else {
this.formData.tempUserList = [];
this.formData.warnOperator = [];
}
},
submit() {
console.log("提交数据 >>> ", this.formData);
this.$refs.formRef.validate((valid) => {
if (valid) {
console.log("提交通过 >>>>> ", this.formData);
this.$emit("submit", this.formData);
// this.$refs.formRef.resetFields();
}
});
},
},
};
</script>
<style scoped lang="scss">
.form-comp {
.input-w {
width: 360px;
}
}
</style>

346
src/views/reservoir/safeMonitorSetting/index.vue

@ -18,26 +18,6 @@
</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"
:key="item.dictValue"
></el-option>
</el-select>
</div>
<el-table
class="mt-12"
:data="tableData"
@ -47,15 +27,18 @@
>
<el-table-column type="index" label="序号" width="60">
</el-table-column>
<el-table-column prop="name" label="测名称"> </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="flag" 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 prop="typeNum" label="测站类型编码">
</el-table-column>
<el-table-column prop="me" label="监测要素"> </el-table-column>
<el-table-column prop="preview" label="测站概况"> </el-table-column>
<el-table-column label="操作" width="100">
<template slot-scope="scope">
<el-button type="text" @click="handleSetForm(scope.row)"
>配置</el-button
>告警配置</el-button
>
</template>
</el-table-column>
@ -71,74 +54,29 @@
</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-tabs
class="mt-12"
v-model="currentType"
type="border-card"
@tab-click="handleChangeTab"
>
<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
<el-tab-pane
lazy
v-for="tabItem in tabsList"
:key="tabItem.label"
:label="tabItem.label"
:name="tabItem.key"
>
</div>
</div>
<Form
:disabled="!currentResInfo"
v-if="formConfig[tabItem.key]"
:formData="formConfig[tabItem.key].formData"
:rules="formConfig[tabItem.key].rules"
:formItems="formConfig[tabItem.key].formItems"
@submit="handleSaveRowForm"
></Form>
</el-tab-pane>
</el-tabs>
</div>
</div>
</div>
@ -147,14 +85,52 @@
import TopBackTitle from "@/components/TopBackTitle";
import { getAreasData } from "@/api/areas/index";
import { getDicts } from "@/api/management";
import {
getReservoirBaseListData,
getReservoirCZListData,
saveReservoirCZMonitorConfigData,
getReservoirCZMonitorConfigData,
} from "@/api/reservoir";
import { listUser } from "@/api/system/user";
import { formConfig } from "./js";
import Form from "./components/Form.vue";
export default {
components: { TopBackTitle },
components: { TopBackTitle, Form },
data() {
return {
formConfig: JSON.parse(JSON.stringify(formConfig)),
currentType: "waterCase",
tabsList: [
{
label: "水情监测",
key: "waterCase",
},
{
label: "降雨监测",
key: "rainCase",
},
{
label: "渗流监测",
key: "vadoseCase",
},
{
label: "变形监测",
key: "distortedCase",
},
{
label: "应力监测",
key: "stressCase",
},
{
label: "应变监测",
key: "strainCase",
},
{
label: "水利学量监测",
key: "wccmCase",
},
],
filterText: "",
treeData: [],
defaultProps: {
@ -170,17 +146,8 @@ export default {
searchCode: "",
searchType: "",
searchTypeOptions: [],
userList: [],
tableData: [{}, {}],
currentForm: {
noticeList: [
{
warnType: "",
userId: "",
},
],
notifyText: `{通知人name}同志,现发生【水库名称】【测站点编码】{预警类型name},预警数值【监测值、监测日期时间】,请您严格履行责任人防汛职责,(核对水库数据,提交相关水行政主管单位、联系仪器厂商校准仪器),保证水库数据准确。【广东省水利厅】`,
},
tableData: [],
currentResInfo: null,
tableHeight: null,
};
},
@ -189,66 +156,23 @@ export default {
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;
}
});
},
computed: {},
created() {},
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({
getTableData() {
getReservoirCZListData({
pageSize: this.params.pageSize,
pageNum: this.params.pageNum,
data: {
timeView: {
timeField: "create_time",
},
prjcd: this.currentResInfo.resCode,
},
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,
};
}) || [];
this.tableData = res.records;
this.params.total = res.total;
});
},
filterNode(value, data) {
@ -256,58 +180,89 @@ export default {
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,
console.log("loadTree-node >>>>> ", node, node.isLeaf);
const { level, isLeaf, data } = node;
if (isLeaf || data.layer === 3) {
getReservoirBaseListData({
pageSize: 1000,
pageNum: 1,
data: {
adcd: data.value,
},
]);
}, 800);
} else {
resolve();
}).then((res) => {
if (res.records) {
resolve(
res.records.map((item) => {
return {
label: item.resName,
value: item.resCode,
resCode: item.resCode,
resName: item.resName,
layer: 2,
leaf: true,
};
})
);
}
resolve([]);
});
return;
}
//
getAreasData(data.value).then((res) => {
resolve(
res.data.map((item) => {
return {
label: item.name,
value: item.id,
parentid: item.parentid,
layer: item.layer,
leaf: item.layer < 3,
};
})
);
});
},
handleClickTree(data, node) {
console.log("handleClickTree >>>>> ", data, node);
if (node.isLeaf) {
if (node.leaf) {
console.log("点击叶子节点----加载水库列表 >>>> ");
this.tableData = [];
this.params.pageNum = 1;
this.getTableData();
}
},
handleAddNoticeItem() {
this.currentForm.noticeList.push({
warnValue: "",
userId: "",
handleSetForm(row) {
console.log("row >>>>> ", row);
this.currentResInfo = row;
getReservoirCZMonitorConfigData(row.id).then((res) => {
if (res.data?.length) {
let tempFormConfig = JSON.parse(JSON.stringify(this.formConfig));
res.data.forEach((item) => {
tempFormConfig[item.type].formData = item;
});
this.formConfig = tempFormConfig;
}
});
},
handleRemoveNoticeItem(index) {
this.currentForm.noticeList.splice(index, 1);
},
handleSetForm(row) {
this.currentForm = {
noticeList: row.noticeList || [
{
warnValue: "",
userId: "",
handleSaveRowForm() {
console.log("this.$refs.formRef >>>>> ", this.$refs.formRef);
this.$refs.formRef.submit().then((formData) => {
console.log("formData >>>>> ", formData);
saveReservoirCZMonitorConfigData(formData)
.then((res) => {
console.log("res >>>>> ", res);
this.$message.success("保存成功");
})
.catch((err) => {
console.log("err >>>>> ", err);
this.$message.error("保存失败");
});
});
},
],
warnType: row.warnType,
notifyText: row.notifyText || "",
};
handleChangeTab(tab) {
console.log("handleChangeTab >>>>> ", tab);
},
handleSaveRowForm() {},
},
};
</script>
@ -340,7 +295,6 @@ export default {
.bottom-box {
border: 1px solid #ccc;
padding: 10px;
margin-top: 16px;
background: #f4f5f7;
}

494
src/views/reservoir/safeMonitorSetting/js/index.js

@ -0,0 +1,494 @@
// 表单配置
export const formConfig = {
// 水情监测
waterCase: {
formData: {
warnType: '预警水位监测',
mpType: 'HMD007',
typeValue: '',
warnOperators: [],
msgType: ['SITE_MSG'],
warnInterval: '',
warnTimeUnit: '1',
msgTemplate: '{通知人name}同志,现发生【水库名称】【测站点编码】{预警类型name},预警数值【监测值、监测日期时间】,请您严格履行责任人防汛职责,(核对水库数据,提交相关水行政主管单位、联系仪器厂商校准仪器),保证水库数据准确。【广东省水利厅】'
},
rules:{
warnType: [
{ required: true, message: '请输入预警类型', trigger: 'blur' }
],
typeValue: [
{ required: true, message: '请输入设置预警值', trigger: 'blur' }
],
warnOperators: [
{ required: true, message: '请选择预警通知人', trigger: 'change' }
],
warnInterval: [
{ required: false, message: '请选择预警通知间隔', trigger: 'change' }
],
msgTemplate: [
{ required: false, message: '请输入通知模板', trigger: 'blur' }
]
},
formItems: [
{
label: '预警类型',
disabled: true,
key: 'warnType',
type: 'input',
placeholder: '请输入预警类型',
unit: null
},
{
label: '设置预警值',
key: 'typeValue',
type: 'input',
placeholder: '请输入设置预警值',
unit: '/m'
},
{
label: '预警通知人',
key: 'warnOperators',
type: 'selectPerson',
placeholder: '请选择预警通知人',
options: [],
max: 3,
unit: null
},
{
label: '预警通知间隔',
key: 'warnInterval',
type: 'noticeInterval',
placeholder: '请选择预警通知间隔',
unit: null,
},
{
label: '通知模板',
key: 'msgTemplate',
type: 'textarea',
placeholder: '请输入通知模板',
unit: null
}
]
},
// 降雨监测
rainCase: {
formData: {
warnType: '预警日降雨量监测',
mpType: 'HMD001',
typeValue: [],
warnOperators: [],
msgType: ['SITE_MSG'],
warnInterval: '',
warnTimeUnit: '1',
msgTemplate: '{通知人name}同志,现发生【水库名称】【测站点编码】{预警类型name},预警数值【监测值、监测日期时间】,请您严格履行责任人防汛职责,(核对水库数据,提交相关水行政主管单位、联系仪器厂商校准仪器),保证水库数据准确。【广东省水利厅】'
},
rules:{
warnType: [
{ required: true, message: '请输入预警类型', trigger: 'blur' }
],
typeValue: [
{ required: true, message: '请选择设置预警值', trigger: 'change' }
],
warnOperators: [
{ required: true, message: '请选择预警通知人', trigger: 'change' }
],
warnInterval: [
{ required: false, message: '请选择预警通知间隔', trigger: 'change' }
],
msgTemplate: [
{ required: false, message: '请输入通知模板', trigger: 'blur' }
]
},
formItems: [
{
label: '预警类型',
disabled: true,
key: 'warnType',
type: 'input',
placeholder: '请输入预警类型',
unit: null
},
{
label: '设置预警值',
key: 'typeValue',
type: 'rainCheckbox',
placeholder: '请选择设置预警值',
unit: null
},
{
label: '预警通知人',
key: 'warnOperators',
type: 'selectPerson',
placeholder: '请选择预警通知人',
options: [],
max: 3,
unit: null
},
{
label: '预警通知间隔',
key: 'warnInterval',
type: 'noticeInterval',
placeholder: '请选择预警通知间隔',
unit: null,
},
{
label: '通知模板',
key: 'msgTemplate',
type: 'textarea',
placeholder: '请输入通知模板',
unit: null
}
]
},
// 渗流监测
vadoseCase: {
formData: {
warnType: '预警渗流量监测',
mpType: 'DSM19',
typeValue: '',
warnOperators: [],
msgType: ['SITE_MSG'],
warnInterval: '',
warnTimeUnit: '1',
msgTemplate: '{通知人name}同志,现发生【水库名称】【测站点编码】{预警类型name},预警数值【监测值、监测日期时间】,请您严格履行责任人防汛职责,(核对水库数据,提交相关水行政主管单位、联系仪器厂商校准仪器),保证水库数据准确。【广东省水利厅】'
},
rules:{
warnType: [
{ required: true, message: '请输入预警类型', trigger: 'blur' }
],
typeValue: [
{ required: true, message: '请选择设置预警值', trigger: 'change' }
],
warnOperators: [
{ required: true, message: '请选择预警通知人', trigger: 'change' }
],
warnInterval: [
{ required: false, message: '请选择预警通知间隔', trigger: 'change' }
],
msgTemplate: [
{ required: false, message: '请输入通知模板', trigger: 'blur' }
]
},
formItems: [
{
label: '预警类型',
disabled: true,
key: 'warnType',
type: 'input',
placeholder: '请输入预警类型',
unit: null
},
{
label: '设置预警值',
key: 'typeValue',
type: 'input',
placeholder: '示例:100',
unit: 'L/s'
},
{
label: '预警通知人',
key: 'warnOperators',
type: 'selectPerson',
placeholder: '请选择预警通知人',
options: [],
max: 3,
unit: null
},
{
label: '预警通知间隔',
key: 'warnInterval',
type: 'noticeInterval',
placeholder: '请选择预警通知间隔',
unit: null,
},
{
label: '通知模板',
key: 'msgTemplate',
type: 'textarea',
placeholder: '请输入通知模板',
unit: null
}
]
},
// 变形监测
distortedCase: {
formData: {
warnType: '预警裂缝开合度',
mpType: 'DSM04',
typeValue: '',
warnOperators: [],
msgType: ['SITE_MSG'],
warnInterval: '',
warnTimeUnit: '1',
msgTemplate: '{通知人name}同志,现发生【水库名称】【测站点编码】{预警类型name},预警数值【监测值、监测日期时间】,请您严格履行责任人防汛职责,(核对水库数据,提交相关水行政主管单位、联系仪器厂商校准仪器),保证水库数据准确。【广东省水利厅】'
},
rules:{
warnType: [
{ required: true, message: '请输入预警类型', trigger: 'blur' }
],
typeValue: [
{ required: true, message: '请选择设置预警值', trigger: 'change' }
],
warnOperators: [
{ required: true, message: '请选择预警通知人', trigger: 'change' }
],
warnInterval: [
{ required: false, message: '请选择预警通知间隔', trigger: 'change' }
],
msgTemplate: [
{ required: false, message: '请输入通知模板', trigger: 'blur' }
]
},
formItems: [
{
label: '预警类型',
disabled: true,
key: 'warnType',
type: 'input',
placeholder: '请输入预警类型',
unit: null
},
{
label: '设置预警值',
key: 'typeValue',
type: 'input',
placeholder: '示例:100',
unit: 'mm'
},
{
label: '预警通知人',
key: 'warnOperators',
type: 'selectPerson',
placeholder: '请选择预警通知人',
options: [],
max: 3,
unit: null
},
{
label: '预警通知间隔',
key: 'warnInterval',
type: 'noticeInterval',
placeholder: '请选择预警通知间隔',
unit: null,
},
{
label: '通知模板',
key: 'msgTemplate',
type: 'textarea',
placeholder: '请输入通知模板',
unit: null
}
]
},
// 应力监测
stressCase: {
formData: {
warnType: '预警应力监测',
mpType: 'DSM05',
typeValue: '',
warnOperators: [],
msgType: ['SITE_MSG'],
warnInterval: '',
warnTimeUnit: '1',
msgTemplate: '{通知人name}同志,现发生【水库名称】【测站点编码】{预警类型name},预警数值【监测值、监测日期时间】,请您严格履行责任人防汛职责,(核对水库数据,提交相关水行政主管单位、联系仪器厂商校准仪器),保证水库数据准确。【广东省水利厅】'
},
rules:{
warnType: [
{ required: true, message: '请输入预警类型', trigger: 'blur' }
],
typeValue: [
{ required: true, message: '请选择设置预警值', trigger: 'change' }
],
warnOperators: [
{ required: true, message: '请选择预警通知人', trigger: 'change' }
],
warnInterval: [
{ required: false, message: '请选择预警通知间隔', trigger: 'change' }
],
msgTemplate: [
{ required: false, message: '请输入通知模板', trigger: 'blur' }
]
},
formItems: [
{
label: '预警类型',
disabled: true,
key: 'warnType',
type: 'input',
placeholder: '请输入预警类型',
unit: null
},
{
label: '设置预警值',
key: 'typeValue',
type: 'input',
placeholder: '示例:100',
unit: 'MPa'
},
{
label: '预警通知人',
key: 'warnOperators',
type: 'selectPerson',
placeholder: '请选择预警通知人',
options: [],
max: 3,
unit: null
},
{
label: '预警通知间隔',
key: 'warnInterval',
type: 'noticeInterval',
placeholder: '请选择预警通知间隔',
unit: null,
},
{
label: '通知模板',
key: 'msgTemplate',
type: 'textarea',
placeholder: '请输入通知模板',
unit: null
}
]
},
// 应变监测
strainCase: {
formData: {
warnType: '预警应变监测',
mpType: 'DSM06',
typeValue: '',
warnOperators: [],
msgType: ['SITE_MSG'],
warnInterval: '',
warnTimeUnit: '1',
msgTemplate: '{通知人name}同志,现发生【水库名称】【测站点编码】{预警类型name},预警数值【监测值、监测日期时间】,请您严格履行责任人防汛职责,(核对水库数据,提交相关水行政主管单位、联系仪器厂商校准仪器),保证水库数据准确。【广东省水利厅】'
},
rules:{
warnType: [
{ required: true, message: '请输入预警类型', trigger: 'blur' }
],
typeValue: [
{ required: true, message: '请选择设置预警值', trigger: 'change' }
],
warnOperators: [
{ required: true, message: '请选择预警通知人', trigger: 'change' }
],
warnInterval: [
{ required: false, message: '请选择预警通知间隔', trigger: 'change' }
],
msgTemplate: [
{ required: false, message: '请输入通知模板', trigger: 'blur' }
]
},
formItems: [
{
label: '预警类型',
disabled: true,
key: 'warnType',
type: 'input',
placeholder: '请输入预警类型',
unit: null
},
{
label: '设置预警值',
key: 'typeValue',
type: 'input',
placeholder: '示例:100',
unit: '10^6',
unitHtml: '10<sup>6</sup>'
},
{
label: '预警通知人',
key: 'warnOperators',
type: 'selectPerson',
placeholder: '请选择预警通知人',
options: [],
max: 3,
unit: null
},
{
label: '预警通知间隔',
key: 'warnInterval',
type: 'noticeInterval',
placeholder: '请选择预警通知间隔',
unit: null,
},
{
label: '通知模板',
key: 'msgTemplate',
type: 'textarea',
placeholder: '请输入通知模板',
unit: null
}
]
},
// 水利学量监测
wccmCase: {
formData: {
warnType: '预警入库流量监测',
mpType: 'DSM07',
typeValue: '',
warnOperators: [],
msgType: ['SITE_MSG'],
warnInterval: '',
warnTimeUnit: '1',
msgTemplate: '{通知人name}同志,现发生【水库名称】【测站点编码】{预警类型name},预警数值【监测值、监测日期时间】,请您严格履行责任人防汛职责,(核对水库数据,提交相关水行政主管单位、联系仪器厂商校准仪器),保证水库数据准确。【广东省水利厅】'
},
rules:{
warnType: [
{ required: true, message: '请输入预警类型', trigger: 'blur' }
],
typeValue: [
{ required: true, message: '请选择设置预警值', trigger: 'change' }
],
warnOperators: [
{ required: true, message: '请选择预警通知人', trigger: 'change' }
],
warnInterval: [
{ required: false, message: '请选择预警通知间隔', trigger: 'change' }
],
msgTemplate: [
{ required: false, message: '请输入通知模板', trigger: 'blur' }
]
},
formItems: [
{
label: '预警类型',
disabled: true,
key: 'warnType',
type: 'input',
placeholder: '请输入预警类型',
unit: null
},
{
label: '设置预警值',
key: 'typeValue',
type: 'input',
placeholder: '示例:100',
unit: '10³/s'
},
{
label: '预警通知人',
key: 'warnOperators',
type: 'selectPerson',
placeholder: '请选择预警通知人',
options: [],
max: 3,
unit: null
},
{
label: '预警通知间隔',
key: 'warnInterval',
type: 'noticeInterval',
placeholder: '请选择预警通知间隔',
unit: null,
},
{
label: '通知模板',
key: 'msgTemplate',
type: 'textarea',
placeholder: '请输入通知模板',
unit: null
}
]
},
}

40
src/views/reservoir/safeOperation/components/BaseInfo.vue

@ -554,6 +554,13 @@ import {
} from "@/api/reservoir";
export default {
props: {
resCode: {
type: String,
default: "",
},
},
emits: ["getResInfo"],
data() {
return {
myChart: null,
@ -578,21 +585,30 @@ export default {
],
};
},
created() {},
created() {
console.log("baseInfo-page created");
this.initData();
},
mounted() {
console.log("baseInfo-page mounted");
this.initData();
},
methods: {
initBaseInfo(code) {
getReservoirBaseDetailData(code).then((res) => {
initBaseInfo() {
console.log("this.resCode >>>>> ", this.resCode);
getReservoirBaseDetailData(this.resCode).then((res) => {
if (res?.data) {
console.log("getReservoirBaseDetailData >>>>> ", res.data);
this.form = {
...this.form,
...res.data,
};
this.$emit("getResInfo", res.data);
}
});
},
initRsppInfo(code) {
getReservoirRsppDetailData(code).then((res) => {
initRsppInfo() {
getReservoirRsppDetailData(this.resCode).then((res) => {
if (res?.data) {
Object.keys(res.data).forEach((key) => {
this.form[key] = res.data[key];
@ -601,16 +617,14 @@ export default {
});
},
initBaseAndRsppInfo(code) {
this.initBaseInfo(code);
this.initRsppInfo(code);
initBaseAndRsppInfo() {
this.initBaseInfo();
this.initRsppInfo();
},
initData(code) {
console.log("code >>>>> ", code);
this.code = code;
initData() {
this.activeName = "1";
this.initBaseAndRsppInfo(code);
this.initBaseAndRsppInfo();
},
initEchart() {
@ -729,7 +743,7 @@ export default {
option && this.myChart.setOption(option);
window.addEventListener("resize", function () {
myChart.resize();
this.myChart.resize();
});
},

200
src/views/reservoir/safeOperation/components/EngineSafe.vue

@ -1,15 +1,14 @@
<!-- 工程安全监测 -->
<template>
<div class="real-time-monitor-page">
<div class="flex">
<div class="tree-box">
<el-input placeholder="输入关键字进行过滤" v-model="filterText">
</el-input>
<el-tree
class="filter-tree"
:data="treeData"
:props="defaultProps"
default-expand-all
:load="loadTree"
lazy
:filter-node-method="filterNode"
@node-click="handleClickTreeNode"
ref="tree"
@ -17,8 +16,13 @@
</el-tree>
</div>
<div class="content-box">
<div class="flex items-center">
<el-select class="w-100" size="mini" v-model="dateRange">
<div class="flex flex-shrink-0 items-center">
<el-select
class="w-100"
size="mini"
v-model="dateRange"
@change="handleChangeDateRange"
>
<el-option label="近1月" value="0"></el-option>
<el-option label="近1日" value="1"></el-option>
<el-option label="近7日" value="2"></el-option>
@ -29,7 +33,8 @@
<el-date-picker
size="mini"
class="w-120"
v-model="paramsData.startDate"
v-model="paramsData.startTime"
value-format="yyyy-MM-dd 00:00:00"
type="date"
:picker-options="{
disabledDate: filterStartDate,
@ -41,7 +46,8 @@
<el-date-picker
size="mini"
class="w-120"
v-model="paramsData.endDate"
v-model="paramsData.endTime"
value-format="yyyy-MM-dd 23:59:59"
type="date"
:picker-options="{
disabledDate: filterEndDate,
@ -65,97 +71,110 @@
</div>
</div>
</div>
</div>
</template>
<script>
import * as echarts from "echarts";
import { initLineOptions, doubleYAxisOptions } from "../js/initEcharts";
import dayjs from "dayjs";
import { initLineOptions } from "../js/initEcharts";
import {
getReservoirMonitorTreeData,
getReservoirRainDetailData,
getReservoirCZEchartsData,
getReservoirTreeDetailData,
getReservoirCZPointListData,
} from "@/api/reservoir";
export default {
props: {
resCode: {
type: String,
default: "",
},
},
data() {
return {
dateRange: null,
resCode: null, //
filterText: "",
currentNode: null,
myChart: null,
treeData: [
{
label: "xxx水库",
value: "xxxreservoir",
children: [
{
label: "xx环境量",
value: "xxxenv1",
children: [
{
label: "xx雨量站",
value: "xxxrain1",
type: "1",
},
{
label: "xx水位站",
value: "xxxwater1",
type: "2",
},
],
},
],
},
],
treeData: [],
defaultProps: {
children: "children",
isLeaf: "leaf",
label: "label",
value: "key",
},
paramsData: {
startDate: "",
endDate: "",
startTime: "",
endTime: "",
},
};
},
created() {},
mounted() {},
watch: {
filterText(val) {
this.$refs.tree.filter(val);
},
},
mounted() {
this.initData();
},
methods: {
initData(code) {
console.log("请求数据 >>>>>> ", code);
this.resCode = code;
getReservoirMonitorTreeData(code).then((res) => {
this.treeData = res.data;
});
this.initChart();
},
filterStartDate(date) {
if (this.paramsData.endDate) {
if (this.paramsData.endTime) {
return (
(date && date.valueOf() > this.paramsData.endDate) ||
(date && date.valueOf() > this.paramsData.endTime) ||
date.valueOf() > Date.now()
);
}
return date && date.valueOf() > Date.now();
},
filterEndDate(date) {
if (this.paramsData.startDate) {
if (this.paramsData.startTime) {
return (
(date && date.valueOf() < this.paramsData.startDate) ||
(date && date.valueOf() < this.paramsData.startTime) ||
date.valueOf() > Date.now()
);
}
return date && date.valueOf() > Date.now();
},
handleChangeDateRange() {
switch (this.dateRange) {
case "0":
this.paramsData.startTime = dayjs()
.subtract(1, "month")
.format("YYYY-MM-DD 00:00:00");
this.paramsData.endTime = dayjs().format("YYYY-MM-DD 23:59:59");
break;
case "1":
this.paramsData.startTime = dayjs()
.subtract(1, "day")
.format("YYYY-MM-DD 00:00:00");
this.paramsData.endTime = dayjs().format("YYYY-MM-DD 23:59:59");
break;
case "2":
this.paramsData.startTime = dayjs()
.subtract(7, "day")
.format("YYYY-MM-DD 00:00:00");
this.paramsData.endTime = dayjs().format("YYYY-MM-DD 23:59:59");
break;
case "3":
this.paramsData.startTime = dayjs()
.subtract(3, "month")
.format("YYYY-MM-DD 00:00:00");
this.paramsData.endTime = dayjs().format("YYYY-MM-DD 23:59:59");
break;
case "4":
this.paramsData.startTime = dayjs()
.subtract(1, "year")
.format("YYYY-MM-DD 00:00:00");
this.paramsData.endTime = dayjs().format("YYYY-MM-DD 23:59:59");
break;
default:
break;
}
},
filterNode(value, data) {
if (!value) return true;
return data.label.indexOf(value) !== -1;
return data.label?.indexOf(value) !== -1;
},
initChart(data) {
// echarts
@ -166,25 +185,69 @@ export default {
this.myChart.dispose();
}
let options = initLineOptions(data);
console.log("options >>>>> ", options);
this.myChart = echarts.init(this.$refs.echartsRef);
options && this.myChart.setOption(options);
},
loadTree(node, resolve) {
console.log("node >>>>> ", node);
if (node.level === 0) {
getReservoirTreeDetailData(this.resCode).then((res) => {
resolve(res.data);
});
return;
}
if (node.level === 1) {
resolve(node.data.children || []);
return;
}
if (node.level === 2) {
getReservoirCZPointListData({
mpType: node.data.key,
resCode: this.resCode,
}).then((res) => {
resolve(
res.data.map((item) => ({
key: item.mpCd,
label: item.mpNm,
value: item.mpCd,
leaf: true,
stcd: item.stcd,
mpType: item.mpType,
}))
);
});
}
},
getTableData() {
if (!this.currentNode) {
return;
}
getReservoirCZEchartsData({
elementType: "WATER_LEVEL",
stcd: this.currentNode.stcd,
resCode: this.resCode,
startTime: this.paramsData.startTime,
endTime: this.paramsData.endTime,
}).then((res) => {
this.initChart(res.data);
});
},
//
handleSearch() {
this.initData();
this.getTableData();
},
handleReset() {
this.paramsData.startDate = "";
this.paramsData.endDate = "";
this.paramsData.startTime = "";
this.paramsData.endTime = "";
this.getTableData();
},
handleClickTreeNode(data, node) {
if (node.isLeaf && data.type) {
getReservoirRainDetailData({
resCode: this.resCode,
id: data.id,
}).then((res) => {
this.initChart(res.data, data.type);
});
if (node.isLeaf && data.value) {
this.currentNode = data;
this.getTableData();
}
},
},
@ -192,6 +255,9 @@ export default {
</script>
<style scoped lang="scss">
.real-time-monitor-page {
display: flex;
flex: 1;
overflow: hidden;
.tree-box {
flex-shrink: 0;
width: 240px;
@ -203,11 +269,13 @@ export default {
}
.content-box {
flex: 1;
overflow: hidden;
margin-left: 4px;
border: 1px solid #f4f5f7;
padding: 4px;
.echarts-box {
flex: 1;
width: 100%;
overflow: hidden;
border: 1px solid #f4f5f7;
border-radius: 2px;
background: #fff;

166
src/views/reservoir/safeOperation/components/EnvirQuality.vue

@ -1,9 +1,14 @@
<template>
<div class="water-rain-comp">
<div class="mb-12 font-16 font-700">监测站名称安全站</div>
<div class="mb-12 font-16 font-700">{{ czInfo && czInfo.name }}</div>
<div class="flex justify-between">
<div class="flex items-center">
<el-select class="w-150" size="mini" v-model="dateRange">
<el-select
class="w-150"
size="mini"
v-model="dateRange"
@change="handleChangeDate"
>
<el-option label="近1月" value="0"></el-option>
<el-option label="近1日" value="1"></el-option>
<el-option label="近7日" value="2"></el-option>
@ -41,44 +46,48 @@
</div>
<div class="flex mt-10">
<div class="w-50">
<div class="mb-8">水情</div>
<div class="mb-8">坝址气温</div>
<div class="flex">
<div class="mr-10">
<div>当前水位</div>
<div>22 m</div>
<div>当前气温</div>
<div>{{ (detailData && detailData.ssss) || "-" }} </div>
</div>
<div class="mr-10">
<div>当前蓄水位</div>
<div>22 m³</div>
<div>往年此时</div>
<div>{{ (detailData && detailData.ssss) || "-" }} </div>
</div>
<div class="mr-10">
<div>最高库水位</div>
<div>22 m</div>
<div>最高坝址气温</div>
<div>{{ (detailData && detailData.ssss) || "-" }} </div>
<div class="text-12">{{ detailData && detailData.maxRzTime }}</div>
</div>
<div class="mr-10">
<div>最低库水位</div>
<div>17 m</div>
</div>
<div>
<div>平均库水位</div>
<div>20 m</div>
<div>最低坝址气温</div>
<div>{{ (detailData && detailData.ssss) || "-" }} </div>
<div class="text-12">{{ detailData && detailData.maxRzTime }}</div>
</div>
</div>
</div>
<div class="w-50">
<div class="mb-8">雨情</div>
<div class="mb-8">库水温</div>
<div class="flex">
<div class="mr-10">
<div>日降雨量</div>
<div>22 mm</div>
<div>当前库水温</div>
<div>{{ (detailData && detailData.ssss) || "-" }} </div>
</div>
<div class="mr-10">
<div>最高日降雨量</div>
<div>22 mm</div>
<div>往年此时</div>
<div>{{ (detailData && detailData.ssss) || "-" }} </div>
</div>
<div class="mr-10">
<div>最高库水温</div>
<div>{{ (detailData && detailData.ssss) || "-" }} </div>
<div class="text-12">{{ detailData && detailData.maxRzTime }}</div>
</div>
<div>
<div>平均日降雨量</div>
<div>22 mm</div>
<div>最低库水温</div>
<div>{{ (detailData && detailData.ssss) || "-" }} </div>
<div class="text-12">{{ detailData && detailData.maxRzTime }}</div>
</div>
</div>
</div>
@ -92,32 +101,125 @@
</template>
<script>
import * as echarts from "echarts";
import dayjs from "dayjs";
import { initLineOptions } from "../js/initEcharts";
import {
getReservoirFlagCZData,
getReservoirCZDetailData,
getReservoirCZElementDetailData,
getReservoirCZEchartsData,
} from "@/api/reservoir";
import { initLineOptions, doubleYAxisOptions } from "../js/initEcharts";
export default {
props: {
resCode: {
type: String,
default: "",
},
},
data() {
return {
dateRange: "0",
startDate: dayjs().subtract(1, "month").format("YYYY-MM-DD HH:mm:ss"),
endDate: dayjs().format("YYYY-MM-DD HH:mm:ss"),
myChart: null,
dateRange: null,
startDate: null,
endDate: null,
czInfo: null,
detailData: null,
};
},
created() {},
mounted() {
setTimeout(() => {
this.initChart();
}, 30);
this.initData();
},
methods: {
initData() {},
handleSearch() {},
handleReset() {},
initData() {
getReservoirFlagCZData(this.resCode).then((res) => {
getReservoirCZDetailData(res.data.stcd).then((res2) => {
this.czInfo = res2.data;
this.getTableData();
});
});
},
getTableData() {
if (!this.czInfo) {
return;
}
getReservoirCZElementDetailData({
stcd: this.czInfo.stcd,
startDate: this.startDate,
endDate: this.endDate,
}).then((res3) => {
this.detailData = res3.data;
this.getEchartData();
});
},
getEchartData() {
getReservoirCZEchartsData({
elementType: "ENV",
stcd: this.czInfo.stcd,
resCode: this.resCode,
startTime: this.startDate,
endTime: this.endDate,
}).then((res) => {
this.initChart(res.data);
});
},
handleChangeDate(value) {
switch (value) {
case "0":
this.startDate = dayjs()
.subtract(1, "month")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
break;
case "1":
this.startDate = dayjs()
.subtract(1, "day")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
break;
case "2":
this.startDate = dayjs()
.subtract(7, "day")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
break;
case "3":
this.startDate = dayjs()
.subtract(3, "month")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
break;
case "4":
this.startDate = dayjs()
.subtract(1, "year")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
break;
default:
break;
}
},
handleSearch() {
this.getTableData();
},
handleReset() {
this.dateRange = "0";
this.startDate = dayjs()
.subtract(1, "month")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
this.getTableData();
},
initChart(data) {
// echarts
if (!this.$refs.echartsRef) {
return;
}
if (this.myChart) {
this.myChart.dispose();
}

118
src/views/reservoir/safeOperation/components/MonitorWarning.vue

@ -2,7 +2,12 @@
<div class="monitor-warning">
<div class="flex justify-between mt-12">
<div class="flex items-center">
<el-select class="w-150" size="mini" v-model="dateRange">
<el-select
class="w-150"
size="mini"
v-model="dateRange"
@change="handleChangeDate"
>
<el-option label="近1月" value="0"></el-option>
<el-option label="近1日" value="1"></el-option>
<el-option label="近7日" value="2"></el-option>
@ -40,69 +45,146 @@
</div>
<div class="mt-10">
<el-table :data="listData" border>
<el-table :data="tableData" border>
<el-table-column label="测站名称">
<template slot-scope="scope">
<span>{{ scope.row.name }}</span>
<span>{{ scope.row.stnm }}</span>
</template>
</el-table-column>
<el-table-column label="测站编码">
<template slot-scope="scope">
<span>{{ scope.row.name }}</span>
<span>{{ scope.row.stcd }}</span>
</template>
</el-table-column>
<el-table-column label="测站类型">
<template slot-scope="scope">
<span>{{ scope.row.name }}</span>
<span>{{ scope.row.sttp }}</span>
</template>
</el-table-column>
<el-table-column label="预警类型">
<template slot-scope="scope">
<span>{{ scope.row.name }}</span>
<span>{{ scope.row.alarmType }}</span>
</template>
</el-table-column>
<el-table-column label="监测数据">
<template slot-scope="scope">
<span>{{ scope.row.name }}</span>
<span>{{ scope.row.monitorData }}</span>
</template>
</el-table-column>
<el-table-column label="监测时间">
<template slot-scope="scope">
<span>{{ scope.row.time }}</span>
<span>{{ scope.row.monitorTime }}</span>
</template>
</el-table-column>
<el-table-column label="预警值" width="100">
<template slot-scope="scope">
<span>{{ scope.row.value }}</span>
<span>{{ scope.row.alarmValue }}</span>
</template>
</el-table-column>
<el-table-column label="预警时间">
<template slot-scope="scope">
<span>{{ scope.row.createTime }}</span>
<span>{{ scope.row.alarmTime }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="120">
<!-- <el-table-column label="操作" width="120">
<template slot-scope="scope">
<el-button type="text" size="mini">告警处置</el-button>
<el-button type="text" size="mini">解除本次预警</el-button>
</template>
</el-table-column>
</el-table-column> -->
</el-table>
</div>
</div>
</template>
<script>
import dayjs from "dayjs";
import { getReservoirCZAlarmPageData } from "@/api/reservoir";
export default {
props: {
resCode: {
type: String,
default: "",
},
},
data() {
return {
dateRange: null,
startDate: null,
endDate: null,
listData: [],
dateRange: "0",
startDate: dayjs().subtract(1, "month").format("YYYY-MM-DD HH:mm:ss"),
endDate: dayjs().format("YYYY-MM-DD HH:mm:ss"),
paramsData: {
pageSize: 10,
pageNum: 1,
total: 0,
},
tableData: [],
};
},
created() {},
methods: {},
created() {
this.getTableData();
},
methods: {
getTableData() {
getReservoirCZAlarmPageData({
startDate: this.startDate,
endDate: this.endDate,
pageSize: this.paramsData.pageSize,
pageNum: this.paramsData.pageNum,
}).then((res) => {
console.log("res >>>>> ", res);
this.tableData = res.records || [];
this.paramsData.total = res.total;
});
},
handleChangeDate(value) {
switch (value) {
case "0":
this.startDate = dayjs()
.subtract(1, "month")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
break;
case "1":
this.startDate = dayjs()
.subtract(1, "day")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
break;
case "2":
this.startDate = dayjs()
.subtract(7, "day")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
break;
case "3":
this.startDate = dayjs()
.subtract(3, "month")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
break;
case "4":
this.startDate = dayjs()
.subtract(1, "year")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
break;
default:
break;
}
},
handleSearch() {
this.tableData = [];
this.getTableData();
},
handleReset() {
this.dateRange = null;
this.startDate = null;
this.endDate = null;
this.paramsData.pageNum = 1;
this.tableData = [];
this.getTableData();
},
},
};
</script>
<style scoped lang="scss">

35
src/views/reservoir/safeOperation/components/ProjectDetail.vue

@ -2,29 +2,32 @@
<div class="project-detail-page">
<el-tabs :tab-position="'left'" v-model="activeTab">
<el-tab-pane label="基础信息" name="1" lazy>
<BaseInfo ref="baseInfoRef"></BaseInfo>
<BaseInfo
ref="baseInfoRef"
:resCode="resCode"
@getResInfo="handleGetResInfo"
></BaseInfo>
</el-tab-pane>
<!-- <el-tab-pane label="实时监测" name="2">
<RealTimeMonitor ref="realTimeMonitor"></RealTimeMonitor>
</el-tab-pane> -->
<el-tab-pane label="水雨情(代表站)" name="2" lazy>
<WaterRain ref="waterRainRef"></WaterRain>
<WaterRain ref="waterRainRef" :resCode="resCode"></WaterRain>
</el-tab-pane>
<el-tab-pane label="环境量" name="3" lazy>
<EnvirQuality ref="envirQuality"></EnvirQuality>
<EnvirQuality ref="envirQuality" :resCode="resCode"></EnvirQuality>
</el-tab-pane>
<el-tab-pane label="工程安全监测" name="4" lazy>
<EngineSafe ref="engineSafe"></EngineSafe>
<EngineSafe ref="engineSafe" :resCode="resCode"></EngineSafe>
</el-tab-pane>
<el-tab-pane label="监测预警" name="5" lazy>
<MonitorWarning ref="monitorWarning"></MonitorWarning>
<MonitorWarning
ref="monitorWarning"
:resCode="resCode"
></MonitorWarning>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import BaseInfo from "./BaseInfo.vue";
import RealTimeMonitor from "./RealTimeMonitor.vue";
import WaterRain from "./WaterRain.vue";
import EnvirQuality from "./EnvirQuality.vue";
import EngineSafe from "./EngineSafe.vue";
@ -33,21 +36,25 @@ export default {
components: {
BaseInfo,
WaterRain,
RealTimeMonitor,
EnvirQuality,
EngineSafe,
MonitorWarning,
},
props: {
resCode: {
type: String,
default: "",
},
},
data() {
return {
activeTab: "4",
activeTab: "1",
};
},
created() {},
methods: {
initData(code) {
this.$refs.baseInfoRef.initData(code);
// this.$refs.realTimeMonitor.initData(code);
handleGetResInfo(data) {
this.$emit("getResInfo", data);
},
},
};

229
src/views/reservoir/safeOperation/components/RealTimeMonitor.vue

@ -1,229 +0,0 @@
<!-- 实时监测 -->
<template>
<div class="real-time-monitor-page">
<el-tabs v-model="activeName">
<el-tab-pane label="过程线分析" name="1">
<div class="flex items-center">
<div>
开始日期
<el-date-picker
v-model="paramsData.startDate"
type="date"
:picker-options="{
disabledDate: filterStartDate,
}"
placeholder="选择日期"
>
</el-date-picker>
</div>
<div class="ml-8">
结束日期
<el-date-picker
v-model="paramsData.endDate"
type="date"
:picker-options="{
disabledDate: filterEndDate,
}"
placeholder="选择日期"
>
</el-date-picker>
</div>
<el-button type="primary" class="!ml-16" @click="handleSearch"
>查询</el-button
>
<el-button @click="handleReset">重置</el-button>
</div>
<div class="mt-12 flex content-box">
<div class="tree-box">
<el-input placeholder="输入关键字进行过滤" v-model="filterText">
</el-input>
<el-tree
class="filter-tree"
:data="treeData"
:props="defaultProps"
default-expand-all
:filter-node-method="filterNode"
@node-click="handleClickTreeNode"
ref="tree"
>
</el-tree>
</div>
<div class="echarts-box">
<div class="title">统计图</div>
<div ref="echartsRef" class="echart-dom"></div>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import * as echarts from "echarts";
import { initLineOptions, doubleYAxisOptions } from "../js/initEcharts";
import {
getReservoirMonitorTreeData,
getReservoirRainDetailData,
} from "@/api/reservoir";
export default {
data() {
return {
resCode: null, //
activeName: "1",
filterText: "",
myChart: null,
treeData: [
{
label: "xxx水库",
value: "xxxreservoir",
children: [
{
label: "xx环境量",
value: "xxxenv1",
children: [
{
label: "xx雨量站",
value: "xxxrain1",
type: "1",
},
{
label: "xx水位站",
value: "xxxwater1",
type: "2",
},
],
},
],
},
],
defaultProps: {
children: "children",
label: "label",
},
paramsData: {
startDate: "",
endDate: "",
},
};
},
created() {},
watch: {
filterText(val) {
this.$refs.tree.filter(val);
},
},
methods: {
initData(code) {
console.log("请求数据 >>>>>> ", code);
this.resCode = code;
getReservoirMonitorTreeData(code).then((res) => {
this.treeData = res.data;
});
},
filterStartDate(date) {
if (this.paramsData.endDate) {
return (
(date && date.valueOf() > this.paramsData.endDate) ||
date.valueOf() > Date.now()
);
}
return date && date.valueOf() > Date.now();
},
filterEndDate(date) {
if (this.paramsData.startDate) {
return (
(date && date.valueOf() < this.paramsData.startDate) ||
date.valueOf() > Date.now()
);
}
return date && date.valueOf() > Date.now();
},
filterNode(value, data) {
if (!value) return true;
return data.label.indexOf(value) !== -1;
},
initChart(data, type) {
// echarts
switch (type) {
case "1":
// echarts
if (!this.$refs.echartsRef) {
return;
}
if (this.myChart) {
this.myChart.dispose();
}
let options = initLineOptions(data);
this.myChart = echarts.init(this.$refs.echartsRef);
options && this.myChart.setOption(options);
break;
case "2":
// echarts
if (!this.$refs.echartsRef) {
return;
}
if (this.myChart) {
this.myChart.dispose();
}
let options2 = doubleYAxisOptions(data);
this.myChart = echarts.init(this.$refs.echartsRef);
options2 && this.myChart.setOption(options2);
break;
default:
break;
}
},
//
handleSearch() {
this.initData();
},
handleReset() {
this.paramsData.startDate = "";
this.paramsData.endDate = "";
},
handleClickTreeNode(data, node) {
if (node.isLeaf && data.type) {
getReservoirRainDetailData({
resCode: this.resCode,
id: data.id,
}).then((res) => {
this.initChart(res.data, data.type);
});
}
},
},
};
</script>
<style scoped lang="scss">
.real-time-monitor-page {
.content-box {
.tree-box {
width: 240px;
border: 1px solid #f4f5f7;
border-radius: 2px;
background: #fff;
overflow: auto;
padding: 4px;
}
.echarts-box {
flex: 1;
border: 1px solid #f4f5f7;
border-radius: 2px;
background: #fff;
margin-left: 4px;
.title {
height: 32px;
line-height: 32px;
padding-left: 12px;
border-bottom: 1px solid #f4f5f7;
}
.echart-dom {
height: 360px;
}
}
}
}
</style>

157
src/views/reservoir/safeOperation/components/WaterRain.vue

@ -1,9 +1,14 @@
<template>
<div class="water-rain-comp">
<div class="text-16">监测站名称(代表站)</div>
<div class="water-rain-comp" v-if="detailData">
<div class="text-16 font-700">{{ detailData.stnm }}</div>
<div class="flex justify-between mt-12">
<div class="flex items-center">
<el-select class="w-150" size="mini" v-model="dateRange">
<el-select
class="w-150"
size="mini"
v-model="dateRange"
@change="handleChangeDate"
>
<el-option label="近1月" value="0"></el-option>
<el-option label="近1日" value="1"></el-option>
<el-option label="近7日" value="2"></el-option>
@ -43,42 +48,45 @@
<div class="w-50">
<div class="mb-8">水情</div>
<div class="flex">
<div class="mr-10">
<div class="mr-12">
<div>当前水位</div>
<div>22 m</div>
<div>{{ (detailData && detailData.currentRz) || "-" }} m</div>
</div>
<div class="mr-10">
<div class="mr-12">
<div>当前蓄水位</div>
<div>22 m³</div>
<div>{{ (detailData && detailData.currentW) || "-" }} m³</div>
</div>
<div class="mr-10">
<div class="mr-12">
<div>最高库水位</div>
<div>22 m</div>
<div>{{ (detailData && detailData.maxRz) || "-" }} m</div>
<div class="text-12">{{ detailData && detailData.maxRzTime }}</div>
</div>
<div class="mr-10">
<div class="mr-12">
<div>最低库水位</div>
<div>17 m</div>
<div>{{ (detailData && detailData.minRz) || "-" }} m</div>
<div class="text-12">{{ detailData && detailData.minRzTime }}</div>
</div>
<div>
<div>平均库水位</div>
<div>20 m</div>
<div>{{ (detailData && detailData.avgRz) || "-" }} m</div>
</div>
</div>
</div>
<div class="w-50">
<div class="mb-8">雨情</div>
<div class="flex">
<div class="mr-10">
<div class="mr-12">
<div>日降雨量</div>
<div>22 mm</div>
<div>{{ (detailData && detailData.dyp) || "-" }} mm</div>
</div>
<div class="mr-10">
<div class="mr-12">
<div>最高日降雨量</div>
<div>22 mm</div>
<div>{{ (detailData && detailData.maxDyp) || "-" }} mm</div>
<div>{{ detailData && detailData.maxDypTime }}</div>
</div>
<div>
<div>平均日降雨量</div>
<div>22 mm</div>
<div>{{ (detailData && detailData.avgDyp) || "-" }} mm</div>
</div>
</div>
</div>
@ -92,37 +100,130 @@
</template>
<script>
import * as echarts from "echarts";
import dayjs from "dayjs";
import { initLineOptions, doubleYAxisOptions } from "../js/initEcharts";
import { initLineOptions } from "../js/initEcharts";
import {
getReservoirFlagCZData,
getReservoirCZDetailData,
getReservoirCZElementDetailData,
getReservoirCZEchartsData,
} from "@/api/reservoir";
export default {
props: {
resCode: {
type: String,
default: "",
},
},
data() {
return {
dateRange: null,
startDate: null,
endDate: null,
dateRange: "0",
startDate: dayjs().subtract(1, "month").format("YYYY-MM-DD HH:mm:ss"),
endDate: dayjs().format("YYYY-MM-DD HH:mm:ss"),
myChart: null,
czInfo: null,
detailData: null,
};
},
created() {},
mounted() {
setTimeout(() => {
this.initChart();
}, 30);
this.initData();
},
methods: {
initData() {},
handleSearch() {},
handleReset() {},
initData() {
getReservoirFlagCZData(this.resCode).then((res) => {
getReservoirCZDetailData(res.data.stcd).then((res2) => {
console.log("res2 >>>>> ", res2);
this.czInfo = res2.data;
this.getTableData();
});
});
},
getTableData() {
if (!this.czInfo) {
return;
}
getReservoirCZElementDetailData({
stcd: this.czInfo.stcd,
startDate: this.startDate,
endDate: this.endDate,
}).then((res3) => {
this.detailData = res3.data;
this.getEchartData();
});
},
getEchartData() {
getReservoirCZEchartsData({
elementType: "WATER_LEVEL",
stcd: this.czInfo.stcd,
resCode: this.resCode,
startTime: this.startDate,
endTime: this.endDate,
}).then((res) => {
this.initChart(res.data);
});
},
handleChangeDate(value) {
switch (value) {
case "0":
this.startDate = dayjs()
.subtract(1, "month")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
break;
case "1":
this.startDate = dayjs()
.subtract(1, "day")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
break;
case "2":
this.startDate = dayjs()
.subtract(7, "day")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
break;
case "3":
this.startDate = dayjs()
.subtract(3, "month")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
break;
case "4":
this.startDate = dayjs()
.subtract(1, "year")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
break;
default:
break;
}
this.getTableData();
},
handleSearch() {
this.getTableData();
},
handleReset() {
this.dateRange = "0";
this.startDate = dayjs()
.subtract(1, "month")
.format("YYYY-MM-DD HH:mm:ss");
this.endDate = dayjs().format("YYYY-MM-DD HH:mm:ss");
this.getTableData();
},
initChart(data) {
// echarts
if (!this.$refs.echartsRef) {
return;
}
if (this.myChart) {
this.myChart.dispose();
}
let options = doubleYAxisOptions(data);
let options = initLineOptions(data);
this.myChart = echarts.init(this.$refs.echartsRef);
options && this.myChart.setOption(options);
},

113
src/views/reservoir/safeOperation/index.vue

@ -3,7 +3,7 @@
<div id="reservoir-map-container"></div>
<!-- 按钮浮窗 -->
<el-input
<!-- <el-input
class="search-input"
placeholder="请输入内容"
style="width: 240px"
@ -15,7 +15,7 @@
icon="el-icon-search"
size="small"
></el-button>
</el-input>
</el-input> -->
<div class="tool-btn">
<div class="btn mb-10 cursor-pointer" @click="showTreeBox = !showTreeBox">
图层管理
@ -54,13 +54,35 @@
<div class="legend-icon">
<div class="row">
<img class="icon" src="@/assets/image/reservoir_big.png" alt="" />
<span>大型</span>
</div>
<div class="row">
<img class="icon" src="@/assets/image/reservoir_normal.png" alt="" />
<span>中型</span>
</div>
<div class="row">
<img class="icon" src="@/assets/image/reservoir_small.png" alt="" />
<span>小型</span>
</div>
</div>
<!-- 弹窗 -->
<el-dialog title="水库弹窗" :visible.sync="showDialog" width="1080px">
<ProjectDetail ref="detailRef"></ProjectDetail>
<el-dialog
:title="
`${resInfoData && resInfoData.resName}(${
resInfoData && resInfoData.resCode
})` || '弹窗'
"
:visible.sync="showDialog"
:destroy-on-close="true"
width="1080px"
>
<ProjectDetail
ref="detailRef"
:resCode="commonResCode"
@getResInfo="handleGetResInfo"
></ProjectDetail>
</el-dialog>
</div>
</template>
@ -94,7 +116,11 @@ export default {
components: { ProjectDetail },
data() {
return {
showDialog: true,
showDialog: false,
//
resInfoData: null,
// code
commonResCode: null,
mapSceneType: 2, // 2: 2D, 3: 3D
showTreeBox: false,
defaultProps: {
@ -134,6 +160,10 @@ export default {
1
);
},
handleGetResInfo(data) {
console.log("handleGetResInfo >>>>> ", data);
this.resInfoData = data;
},
initMap() {
viewer = new sycim.Viewer("reservoir-map-container");
window.viewer = viewer;
@ -238,61 +268,15 @@ export default {
openDialog(e) {
console.log("openDialog >>>>> ", e);
let code = e;
this.showDialog = true;
this.$nextTick(() => {
devRun(() => {
code = "440111000034";
});
this.$refs.detailRef.initData(code);
this.commonResCode = code;
this.showDialog = true;
this.$nextTick(() => {
// this.$refs.detailRef.initData(code);
});
},
// layer
// addLayer(originType, type, count) {
// if (!layer) {
// layer = new sycim.EntityLayer("layer").addTo(viewer);
// }
// let svg = this.iconType[type];
// if ((svg, count > 0)) {
// for (let i = 0; i < count; i++) {
// let log = 113.27 + (Math.random() > 0.5 ? 1 : -1) * 2 * Math.random();
// let lat = 23.13 + (Math.random() > 0.5 ? 1 : -1) * 2 * Math.random();
// let graphicItem = new sycim.Billboard(
// [log, lat, 0.1],
// `/icons/${svg}`
// );
// graphicItem.setStyle({
// canEdit: false,
// horizontalOrigin: sycim.HorizontalOrigin.CENTER,
// verticalOrigin: sycim.VerticalOrigin.BOTTOM,
// disableDepthTestDistance: Number.POSITIVE_INFINITY,
// });
// layer.addGraphic(graphicItem);
// this.graphicList.push({
// originType,
// type,
// graphicId: graphicItem.graphicId,
// });
// }
// this.viewerAddEventListener();
// }
// },
// removeLayer(originType, type) {
// let list = this.graphicList.filter(
// (v) => v.originType === originType && v.type === type
// );
// if (list) {
// for (let i = 0; i < list.length; i++) {
// const el = list[i];
// let graphicItem = layer?.getGraphic(el.graphicId);
// if (graphicItem) {
// layer.removeGraphic(graphicItem);
// }
// }
// }
// },
//
handleClickTree(data, node) {
if (node.isLeaf && !data.children) {
@ -373,13 +357,28 @@ export default {
.legend-icon {
border-radius: 4px;
padding: 2px;
padding: 8px 10px;
background: #fff;
width: 100px;
width: 80px;
position: absolute;
z-index: 9;
right: 20px;
bottom: 20px;
.row {
display: flex;
align-items: center;
font-size: 14px;
margin-bottom: 4px;
.icon {
width: 16px;
height: 16px;
margin-right: 4px;
}
&:last-child {
margin-bottom: 0;
}
}
}
.my-icon {
width: 16px;

138
src/views/reservoir/safeOperation/js/initEcharts.js

@ -1,5 +1,51 @@
// 单个xy轴折线图
export const initLineOptions = () => {
// 折线图
export const initLineOptions = (data) => {
const { markLine, xaxis, yaxis } = data
let yAxis = yaxis.map(v => {
return {
type: 'value',
name: `${v.name}(${v.unit})`,
nameLocation: 'end',
}
})
let series = []
yaxis.forEach((v,i) =>{
if(v.series?.length){
v.series.forEach(v2 => {
let tempMarkLine = null
if(markLine && markLine[i]){
tempMarkLine = {
label: {
show: true,
position: 'end'
},
data: [
{
name: markLine[i].name,
yAxis: markLine[i].value
}
],
lineStyle: {
type: 'dashed',
color: '#f00',
cap: 'round',
join: 'miter'
}
}
}
series.push({
type: 'line',
smooth: true,
yAxisIndex: i,
name: v2.name,
data: v2.data,
markLine: tempMarkLine,
})
})
}
})
return {
title: {
// text: "统计",
@ -10,7 +56,7 @@ export const initLineOptions = () => {
},
grid: {
left: "5%",
right: "5%",
right: "10%",
bottom: "10%",
top: '20%',
containLabel: true,
@ -35,91 +81,11 @@ export const initLineOptions = () => {
axisTick: {
alignWithLabel: true,
},
data: ['00:00','02:00','04:00','06:00','08:00','10:00','12:00',
'14:00','16:00','18:00','20:00','22:00'],
},
],
yAxis: [
{
type: "value",
// inverse: true,
name: "降雨量(mm)",
nameLocation: 'end',
},
],
series: [
{
color: "#4a66bb",
type: 'line',
smooth: true,
name: '降雨量',
areaStyle: {},
data: [0, 10, 4, 8, 1, 6, 3, 5, 2, 7, 9, 11],
data: xaxis,
},
],
yAxis: yAxis,
series: series
};
};
// 双y轴折线图
export const doubleYAxisOptions = () => {
return {
title: {
// text: "统计",
},
grid: {
left: "5%",
right: "5%",
bottom: "10%",
top: '20%',
containLabel: true,
},
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#283b56",
},
},
formatter: '{b}<br />{a0}: {c0}mm<br />{a1}: {c1}℃'
},
xAxis:[
{
type: 'category',
// name: '时间',
nameLocation: 'middle',
nameGap: 30,
data: ['00:00','02:00','04:00','06:00','08:00','10:00','12:00',
'14:00','16:00','18:00','20:00','22:00'],
}
],
yAxis: [
{
type: 'value',
name: '降雨量(mm)',
nameLocation: 'end',
},
{
type: 'value',
name: '温度(℃)',
position: 'right',
nameLocation: 'end',
}
],
series: [
{
name: '降雨量',
type: 'line',
smooth: true,
data: [0, 10, 4, 8, 1, 6, 3, 5, 2, 7, 9, 11],
},
{
name: '温度',
type: 'line',
smooth: true,
yAxisIndex: 1,
data: [24,28,26,30,25,27,29,31,23,22,21,20],
}
]
}
}

Loading…
Cancel
Save