diff --git a/public/assets/images/ggll.jpg b/public/assets/images/ggll.jpg new file mode 100644 index 000000000..5351031de Binary files /dev/null and b/public/assets/images/ggll.jpg differ diff --git a/public/assets/images/gsl.jpg b/public/assets/images/gsl.jpg new file mode 100644 index 000000000..e553dc490 Binary files /dev/null and b/public/assets/images/gsl.jpg differ diff --git a/public/assets/images/gsts.jpg b/public/assets/images/gsts.jpg new file mode 100644 index 000000000..f26110f74 Binary files /dev/null and b/public/assets/images/gsts.jpg differ diff --git a/public/assets/images/ksw.jpg b/public/assets/images/ksw.jpg new file mode 100644 index 000000000..02d3a98dd Binary files /dev/null and b/public/assets/images/ksw.jpg differ diff --git a/public/assets/images/scll.jpg b/public/assets/images/scll.jpg new file mode 100644 index 000000000..2f9e0c165 Binary files /dev/null and b/public/assets/images/scll.jpg differ diff --git a/public/assets/images/yclsl.jpg b/public/assets/images/yclsl.jpg new file mode 100644 index 000000000..6e3ad7eb8 Binary files /dev/null and b/public/assets/images/yclsl.jpg differ diff --git a/src/models/auth/_.ts b/src/models/auth/_.ts index 1447caaad..88b4d90b6 100644 --- a/src/models/auth/_.ts +++ b/src/models/auth/_.ts @@ -418,7 +418,20 @@ export async function loadMenu(): Promise { }, ], }, - + { + id: id(), title: '水资源调度', redirect: '/mgr/szydd/gsnlfx', icon: 'fxzb', + children: [ + { + id: id(), title: '供水能力分析', path: '/mgr/szydd/gsnlfx', + }, + { + id: id(), title: '供水统计分析', path: '/mgr/szydd/gstjfx', + }, + { + id: id(), title: '典型年降雨资料', path: '/mgr/szydd/dxnjyzl', + }, + ] + }, // { id: id(), title: '基本情况', path: '/mgr/home', icon: 'jbqk' }, diff --git a/src/service/apiurl.js b/src/service/apiurl.js index 0d2564764..37e313e8e 100644 --- a/src/service/apiurl.js +++ b/src/service/apiurl.js @@ -434,6 +434,7 @@ const apiurl = { }, // 供水兴利 gsxl: { + gsWater:service_fxdd + "/gateValveReal/predict/water", dxnjyzl: { page: service_fxdd + '/tyYearRainfall/page', edit: service_fxdd + '/tyYearRainfall/update', @@ -921,6 +922,7 @@ const apiurl = { // 水库弹框详情 reservoirmonitor: service_fxdd + '/reservoir/water/monitor/data', //图像监测-列表 + reservoirmonitor1: service_fxdd + '/reservoir/water/data/page', //图像监测-列表 // 水库基础信息 attResBase: service_fxdd + '/attResBase/attResBase', //基本信息 diff --git a/src/views/AppRouters.tsx b/src/views/AppRouters.tsx index 346936b12..10f646cce 100644 --- a/src/views/AppRouters.tsx +++ b/src/views/AppRouters.tsx @@ -110,7 +110,7 @@ import Ajtj from './sz/szzf/ajtj' import Clyj from './sz/szzf/clyj' import Krgl from './KrLine' - +import Gsnlfx from './gxsl/gsnlfx' const HomePage = lazy(() => import('./Home')) @@ -222,8 +222,10 @@ const AppRouters: React.FC = () => { // 供水兴利 { path: 'gsxl/zfzl', element: }, { path: 'gsxl/zfjk', element: }, - { path: 'gsxl/gstjfx', element: }, - { path: 'gsxl/dxnjyzl', element: }, + + { path: 'szydd/gsnlfx', element: }, + { path: 'szydd/gstjfx', element: }, + { path: 'szydd/dxnjyzl', element: }, { path: 'fxzb/jczw/yqz', element: }, { path: 'fxzb/jczw/sqz', element: }, diff --git a/src/views/fxzb/ddgc/form.js b/src/views/fxzb/ddgc/form.js index e758f6b48..f4aa6d72e 100644 --- a/src/views/fxzb/ddgc/form.js +++ b/src/views/fxzb/ddgc/form.js @@ -203,7 +203,7 @@ const ModalForm = ({ mode, record,onEdit,onSave,onCrudSuccess }) => { {mode == "view" ? null : } diff --git a/src/views/fxzb/fxya/form.js b/src/views/fxzb/fxya/form.js index 7e7b1428e..e74746326 100644 --- a/src/views/fxzb/fxya/form.js +++ b/src/views/fxzb/fxya/form.js @@ -203,7 +203,7 @@ const ModalForm = ({ mode, record,onEdit,onSave,onCrudSuccess }) => { {mode == "view" ? null : } diff --git a/src/views/gcaqjc/sjtjcx/ndsltjb/index.js b/src/views/gcaqjc/sjtjcx/ndsltjb/index.js index 1988f34e6..203758521 100644 --- a/src/views/gcaqjc/sjtjcx/ndsltjb/index.js +++ b/src/views/gcaqjc/sjtjcx/ndsltjb/index.js @@ -74,6 +74,7 @@ const Page = () => { tm:c.tm }))) return { + drp:s.drp, tm: s.tm, rz: s.rz, inx:i+1 diff --git a/src/views/gcaqjc/sjtjcx/ndsytjb/index.js b/src/views/gcaqjc/sjtjcx/ndsytjb/index.js index 213262d1e..8c9d13f32 100644 --- a/src/views/gcaqjc/sjtjcx/ndsytjb/index.js +++ b/src/views/gcaqjc/sjtjcx/ndsytjb/index.js @@ -34,7 +34,7 @@ const Page = () => { const columns4 = [ { title: '降雨量(mm)', key: 'drp', dataIndex: 'drp', width: 120, align: "center", - render: (rec, record) => { rec ?? "-"} + render: (rec, record) => { record?.drp ?? "-"} }, ]; const getDmTree = async() => { @@ -76,6 +76,7 @@ const Page = () => { tm:c.tm }))) return { + drp:s.drp, tm: s.tm, rz: s.rz, inx:i+1 diff --git a/src/views/gxsl/dxnjyzl/index.js b/src/views/gxsl/dxnjyzl/index.js index 0faf74759..d4c77b930 100644 --- a/src/views/gxsl/dxnjyzl/index.js +++ b/src/views/gxsl/dxnjyzl/index.js @@ -11,9 +11,9 @@ import {CrudOpRender_text} from '../../../components/crud/CrudOpRender'; const Page = () => { const role = useSelector(state => state.auth.role); - const editBtn = role?.rule?.find(item => item.menuName == "编辑"); - const viewBtn = role?.rule?.find(item => item.menuName == "查看"); - const delBtn = role?.rule?.find(item => item.menuName == "删除"); + const editBtn = role?.rule?.find(item => item.menuName == "编辑") || true; + const viewBtn = role?.rule?.find(item => item.menuName == "查看") || true; + const delBtn = role?.rule?.find(item => item.menuName == "删除") || true; const expandedRowRender = (record) => { const columns = [ { diff --git a/src/views/gxsl/dxnjyzl/toolbar.js b/src/views/gxsl/dxnjyzl/toolbar.js index 8eaee7e60..ebac9848b 100644 --- a/src/views/gxsl/dxnjyzl/toolbar.js +++ b/src/views/gxsl/dxnjyzl/toolbar.js @@ -4,8 +4,8 @@ import NormalSelect from '../../../components/Form/NormalSelect'; import moment from 'moment'; const { RangePicker } = DatePicker; const ToolBar = ({ setSearchVal, onSave, storeData, role }) => { - const addBtn = role?.rule?.find(item => item.menuName == "新增"); - const searchBtn = role?.rule?.find(item => item.menuName == "查询"); + const addBtn = role?.rule?.find(item => item.menuName == "新增") || true; + const searchBtn = role?.rule?.find(item => item.menuName == "查询") || true; const [form] = Form.useForm(); const types = [ { diff --git a/src/views/gxsl/gsnlfx/KrLine.js b/src/views/gxsl/gsnlfx/KrLine.js new file mode 100644 index 000000000..dd6588b93 --- /dev/null +++ b/src/views/gxsl/gsnlfx/KrLine.js @@ -0,0 +1,100 @@ +import React,{useEffect,useMemo,useState} from 'react' +import { Button, DatePicker, Table } from 'antd'; +import { createCrudService } from '../../../components/crud/_'; +import usePageTable from '../../../components/crud/usePageTable2'; +import moment from 'moment'; +import apiurl from '../../../service/apiurl'; +import {reservoirmonitor} from '../../../service/sssq' +import ReactEcharts from 'echarts-for-react'; +import drpOption from './drpOption'; +const {RangePicker} = DatePicker; +export default function KrLine({ record }) { + const columns = [ + {title: '时间', key: '', dataIndex: '', align: 'center',render:(rec)=>moment(rec.tm).format('MM-DD HH:mm')}, + { + title: '水位(m)', key: 'rz', dataIndex: 'rz', align: 'center', + render: (rec) => {rec ? rec.toFixed(2) : "-"}}, + { + title: '库容(万m³)', key: 'w', dataIndex: 'w', align: 'center', + render: (rec) => {rec ??"-"}, + }, + ]; + const [data, setData] = useState([]); + const [params, setParams] = useState({}) + const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.sssq.reservoirmonitor1).find_noCode); + const option = useMemo(() => { + return drpOption({data}); + }, [data]) + const searchTm = (e) => { + setParams({ + ...params, + stm: e[0].format("YYYY-MM-DD HH:mm:ss"), + etm: e[1].format("YYYY-MM-DD HH:mm:ss"), + tm:e, + }) + }; + + const doSearch = () => { + search({ search: params }) + getData(params) + } + + + const getData = async (params) => { + setData(await reservoirmonitor(params)); + } + useEffect(() => { + const stm = moment().subtract(7, 'days').add(1, 'hour').set({ minute: 0, second: 0 }).format("YYYY-MM-DD HH:mm:ss"); + const etm = moment().add(1, 'hour').set({ minute: 0, second: 0 }).format("YYYY-MM-DD HH:mm:ss"); + const tm = [ + moment().subtract(7, 'days').add(1, 'hour').set({ minute: 0, second: 0 }), + moment().add(1, 'hour').set({ minute: 0, second: 0 }), + ]; + const params = { + search: { + stm, + etm + } + } + if (record?.stcd) { + search(params) + getData({stcd:record.stcd,...params.search}) + setParams({tm,stcd:record.stcd}) + } + }, [record]) + return ( +
+
+ + + +
+
+ + +
+ { + data.length > 0 ? + :
+ +
+ } +
+ + + + ) +} diff --git a/src/views/gxsl/gsnlfx/drpOption.js b/src/views/gxsl/gsnlfx/drpOption.js new file mode 100644 index 000000000..36685d530 --- /dev/null +++ b/src/views/gxsl/gsnlfx/drpOption.js @@ -0,0 +1,130 @@ +import echarts from 'echarts/lib/echarts' + +export default function drpOption ({ + data, +}) { + const maxVal = Math.max(...data.map(obj => obj.drp)) + // const minVal = Math.min(...data.map(obj => obj.drp)) + const maxSw = Math.ceil(Math.max(...data.map(obj => obj.rz))) + const minSw = Math.floor(Math.min(...data.map(obj => obj.rz))) + const maxKr = Math.max(...data.map(obj => obj.w)) + const minKr = Math.min(...data.map(obj => obj.w)) + return { + tooltip: { + trigger: 'axis' + }, + grid: { + top: '18%', + left: '5%', + right: '5%', + width: '90%', + height: '70%' + }, + legend: { + // 显示图例 + show: true, + left:60 + }, + xAxis: [ + { + type: 'category', + data: data.map(o => o.tm), + inverse: true, + splitLine: { + show: false + }, + axisLabel: { + color: '#333', + fontSize: 12, + formatter: val => val.substr('2020-'.length, 11) + }, + axisLine: { + lineStyle: { + color: '#07a6ff', + width: 0.5 + } + }, + axisTick: { + show: false + } + } + ], + yAxis: [ + { + type: 'value', + position: 'left', + name: '水位(m)', + splitLine: { + show: true, + lineStyle: { + color: '#07a6ff', + width: 0.25, + type: 'dotted' + } + }, + axisLabel: { + color: '#333', + fontSize: 12 + }, + axisLine: { + show: false + }, + axisTick: { + show: false + }, + min: minSw, + max: maxSw + }, + { + type: 'value', + position: 'right', + name: '库容(万m³)', + splitLine: { + show: false, + lineStyle: { + color: '#07a6ff', + width: 0.25, + type: 'dotted' + } + }, + axisLabel: { + color: '#333', + fontSize: 12 + }, + axisLine: { + show: false + }, + axisTick: { + show: false + }, + min: minKr - 0.1, + max: maxKr + 0.1 + } + ], + series: [ + { + yAxisIndex:0, + name: '水位', + type: 'line', + symbol: 'none', + color: '#0AE0B5', + label: { + show: false + }, + data: data.map(o => o.rz ? o.rz.toFixed(2):null ) + }, + { + yAxisIndex:1, + name: '库容', + type: 'line', + color: '#007AFD', + symbol: 'none', + showSymbol: false, + label: { + show: false + }, + data: data.map(o => o.w) + } + ] + } +} diff --git a/src/views/gxsl/gsnlfx/index.js b/src/views/gxsl/gsnlfx/index.js new file mode 100644 index 000000000..98bef60be --- /dev/null +++ b/src/views/gxsl/gsnlfx/index.js @@ -0,0 +1,236 @@ + +import React, { useEffect, useState,useMemo } from 'react' +import { Button ,Modal,Form,Row,Col} from "antd" +import { reservoirlist, } from "../../../service/sssq"; +import apiurl from '../../../service/apiurl'; +import MyImg from '../../Home/MapCtrl/components/Skssjc/myImg' +import { httppost2, httpget2, httppost5 } from '../../../utils/request'; +import NormalSelect from '../../../components/Form/NormalSelect'; +import moment from 'moment'; +import KrLine from './KrLine'; +import "./index.less" +export default function Gsnlfx() { + const month = moment().month() + 1; + const optionsType = Array(12 - month + 1).fill(0).map((item,i) => ({label: (i + month) + "月",value: i + month})) + const typeObj = { + 1: "枯 ", + 2: "偏枯 ", + 3: "平", + 4: "偏丰", + 5:"丰" + } + const [form] = Form.useForm() + const [tableData, setTableData] = useState([]) + const [ssgData, setSsGData] = useState({}) //输水管数据 + const [gsDays, setGsDays] = useState() + const [lslOpen, setLslOpen] = useState(false) + const [simailarData, setSimailarData] = useState([]) + const [lslData, setlslData] = useState(null) + + const getData = async (params) => { + setTableData(await reservoirlist(params)); + } + // 相似年下拉 + const getSimilarData = async() => { + try { + const res = await httppost2(apiurl.gsxl.zfzl.similar) + setSimailarData(res.data.map(item => ({ + label: item.year + "年" + `(${typeObj[item.status]},${item.drp}mm)`, + value:item.year + }))) + } catch (error) { + console.log(error); + } + } + // 输水管流量数据 + const getInputData = async() => { + try { + const res = await httppost2(apiurl.gsxl.zfzl.input) + const ssg = res.data.find(item => item.sttp == "PQ"); + const fsg = res.data.find(item => item.sttp == "QQ"); + setSsGData({ssg,fsg}) + } catch (error) { + console.log(error); + } + } + + // 获取可供水时间 + const getWaterTimeData = async(params={}) => { + try { + const res = await httpget2(apiurl.gsxl.zfzl.kyTime,params) + let r = { + type: "可供水天数", + value: Object.keys(res.data)[0], + tm: Object.values(res.data)[0] + } + setGsDays(r) + } catch (error) { + console.log(error); + } + } + const providerWater = useMemo(() => { + if (tableData[0]?.nowCap && tableData[0]?.deadCap) { + let num = ((tableData[0]?.nowCap - tableData[0]?.deadCap) / 10000).toFixed(2) + return num + } else { + return "--" + } + }, [tableData]) + + const generate = () => { + setLslOpen(true) + } + + const computerResult = async() => { + const values = form.getFieldsValue(); + try { + const res = await httpget2(apiurl.gsxl.gsWater, values) + if (res.code == 200) { + setLslOpen(false); + setlslData((res.data / 10000).toFixed(2)) + getWaterTimeData(values) + } + } catch (error) { + console.log(error); + + } + } + useEffect(() => { + let option = { + sources: ["SW", "SK"], + args: "", + }; + getData(option) + getInputData() + getWaterTimeData() + getSimilarData() + }, []) + return ( +
+
+
+
+ + 供水能力分析 +
+
+
+
+ + 当前库水位(m) +
+
+ {tableData[0]?.rz ?? "-"} + ({tableData[0]?.drpTm ?? "--"}) +
+
+
+
+ + 可供水量(万m³) +
+
+ {providerWater} + ({tableData[0]?.drpTm ?? "--"}) +
+
+
+
+ + 灌溉流量(m³/s) +
+
+ {ssgData?.ssg?.v ?? "--"} + ({ssgData?.ssg?.tm ?? "--"}) +
+
+
+
+ + 水厂流量(m³/s) +
+
+ {ssgData?.fsg?.v ?? "--"} + ({ssgData?.fsg?.tm ?? "--"}) +
+
+
+
+ + 预测来水量(万m³) +
+
+ {lslData ?? "预测生成"} + +
+
+
+
+ + 计算可供水天数(天) +
+
+ {gsDays?.value ?? "--"} + ({gsDays?.tm ?? "--"}) +
+
+ +
+
+ +
+
+
+
+ + 库容过程线 +
+ +
+
+ + setLslOpen(false)} + width={500} + okText="计算" + destroyOnClose + onOk={computerResult} + > +
+ +
+ + + + + + + + + + + + + + + + ) +} diff --git a/src/views/gxsl/gsnlfx/index.less b/src/views/gxsl/gsnlfx/index.less new file mode 100644 index 000000000..c4218716c --- /dev/null +++ b/src/views/gxsl/gsnlfx/index.less @@ -0,0 +1,83 @@ +.gb-top-title{ + display: flex; + align-items: center; + column-gap: 10px; + margin-bottom: 10px; + .gb-top-icon{ + width: 5px; + height: 20px; + background-color: #0079fe; + } +} +.gsnl-content{ + display: flex; + column-gap: 10px; + padding-right:10px; + .content-left{ + width: 700px; + padding: 10px; + border: 1px solid #dfdfdf; + border-radius: 5px; + overflow-y: auto; + height: calc( 100vh - 100px); + .content-card{ + display: flex; + flex-wrap: wrap; + column-gap: 20px; + padding-top: 10px; + .card-item{ + width: 325px; + border: 1px solid #dfdfdf; + border-radius: 5px; + margin-bottom: 20px; + padding: 10px; + padding-bottom: 0; + box-shadow: 5px 5px 5px 0px rgba(0, 0, 0, 0.4); + .card-title{ + display: flex; + align-items: center; + column-gap: 10px; + font-size: 18px; + margin-bottom: 10px; + } + .card-value{ + display: flex; + align-items: baseline; + flex-wrap: nowrap; + .nl-value{ + font-size: 36px; + font-weight: 700; + color:#02a7f0; + } + .nl-time{ + font-size: 14px; + font-weight: bold; + } + } + img{ + width: 40px; + } + } + + .yc-content{ + display: flex; + flex-direction: column; + .yc-input{ + display: inline-block; + width: 80%; + height: 40px; + padding: 10px; + border-radius: 5px; + background-color: #f0f6ff; + margin-bottom: 15px; + } + } + } + } + .content-right{ + flex: 1; + border: 1px solid #dfdfdf; + padding: 10px; + border-radius: 5px; + } +} \ No newline at end of file diff --git a/src/views/rcgl/byfz/bypc/form.js b/src/views/rcgl/byfz/bypc/form.js index ec3a45ae2..0d345a7c0 100644 --- a/src/views/rcgl/byfz/bypc/form.js +++ b/src/views/rcgl/byfz/bypc/form.js @@ -86,8 +86,8 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => { const surveyType = [ {label:"日常检查排查",value:1}, - {label:"定期普查",value:1}, - {label:"专项调查",value:1}, + {label:"定期普查",value:2}, + {label:"专项调查",value:3}, ] const surveyWay = [ {label:"人工排查法",value:1}, diff --git a/src/views/zbgl/zbb/index.js b/src/views/zbgl/zbb/index.js index 473d4a978..b6f0da335 100644 --- a/src/views/zbgl/zbb/index.js +++ b/src/views/zbgl/zbb/index.js @@ -148,6 +148,7 @@ const Page = () => {
}//doUpload={this.canOp ? this.doUpload : null} dateCellRender={dateCellRender} diff --git a/src/views/zbgl/zbb/toolbar.js b/src/views/zbgl/zbb/toolbar.js index 5a1dd77df..a600532c9 100644 --- a/src/views/zbgl/zbb/toolbar.js +++ b/src/views/zbgl/zbb/toolbar.js @@ -114,7 +114,7 @@ const ToolBar = ({ value, onChange, tm, callback,role }) => { @@ -152,7 +152,7 @@ const ToolBar = ({ value, onChange, tm, callback,role }) => {