feat(): 增加水厂信息

master
李神峰 2025-07-01 17:12:27 +08:00
parent e3254a5d98
commit d13a76e316
12 changed files with 245 additions and 44 deletions

View File

@ -1,8 +1,8 @@
{
"records":[
{"序号":"1","部门编码":"A01","部门名称":"办公室","上级部门":"","排序号":"1","备注":"","创建日期":"2023-08-30"},
{"序号":"2","部门编码":"A02","部门名称":"工程科","上级部门":"","排序号":"2","备注":"","创建日期":"2023-08-30"},
{"序号":"3","部门编码":"A03","部门名称":"养护科","上级部门":"","排序号":"3","备注":"","创建日期":"2023-08-29"}
{"序号":"1","部门编码":"A01","部门名称":"办公室","上级部门":"","排序号":"1","备注":"","创建日期":"2025-05-30"},
{"序号":"2","部门编码":"A02","部门名称":"工程科","上级部门":"","排序号":"2","备注":"","创建日期":"2025-05-30"},
{"序号":"3","部门编码":"A03","部门名称":"养护科","上级部门":"","排序号":"3","备注":"","创建日期":"2025-05-30"}
],
"total": 10,
"pages": 1

View File

@ -8,7 +8,7 @@
"serviceAddr": "172.20.1.101",
"port": "18300",
"route": "",
"registerTime": "2023-05-24 12:00:30",
"registerTime": "2025-05-24 12:00:30",
"provider": "江苏德高物联技术有限公司",
"stNum": 1,
"contacts": "",
@ -16,7 +16,7 @@
"target": "DB_ZHSK.ST_FLOW_R",
"enable": "1",
"服务状态": "1",
"maxTime": "2023-10-09 15:00:00",
"maxTime": "2025-10-09 15:00:00",
"countVo": {
"allCount": 6495,
"todayCount": 16,
@ -33,7 +33,7 @@
"serviceAddr": "121.40.63.15",
"port": "7889",
"route": "",
"registerTime": "2023-05-24 12:00:29",
"registerTime": "2025-05-24 12:00:29",
"provider": "江苏德高物联技术有限公司",
"stNum": 1,
"contacts": "",
@ -41,7 +41,7 @@
"target": "DB_ZHSK.ST_FLOW_R",
"enable": "1",
"服务状态": "1",
"maxTime": "2023-10-09 15:00:00",
"maxTime": "2025-10-09 15:00:00",
"countVo": {
"allCount": 6495,
"todayCount": 16,
@ -58,7 +58,7 @@
"serviceAddr": "10.42.160.53",
"port": "9527",
"route": "",
"registerTime": "2023-05-24 12:00:28",
"registerTime": "2025-05-24 12:00:28",
"provider": "襄阳气象局",
"stNum": 1,
"contacts": "",
@ -84,7 +84,7 @@
"serviceAddr": "58.19.239.227",
"port": "10088",
"route": "",
"registerTime": "2023-05-24 12:00:26",
"registerTime": "2025-05-24 12:00:26",
"provider": "襄阳气象局",
"stNum": 176,
"contacts": "",
@ -92,7 +92,7 @@
"target": "DB_ZHSK.WEATHER_XY_SK",
"enable": "1",
"服务状态": "1",
"maxTime": "2023-10-09 15:30:00",
"maxTime": "2025-10-09 15:30:00",
"countVo": {
"allCount": 3719924,
"todayCount": 16389,
@ -109,7 +109,7 @@
"serviceAddr": "218.200.85.79",
"port": "4505",
"route": "",
"registerTime": "2023-05-24 12:00:00",
"registerTime": "2025-05-24 12:00:00",
"provider": "力合科技(湖南)股份有限公司",
"stNum": 1,
"contacts": "李晶晶",
@ -117,7 +117,7 @@
"target": "DB_ZHSK.HYD_RI_WQAMD_W",
"enable": "1",
"服务状态": "1",
"maxTime": "2023-10-09 15:00:00",
"maxTime": "2025-10-09 15:00:00",
"countVo": {
"allCount": 18271,
"todayCount": 15,
@ -134,7 +134,7 @@
"serviceAddr": "47.112.66.254",
"port": "80",
"route": "",
"registerTime": "2023-05-24 12:00:00",
"registerTime": "2025-05-24 12:00:00",
"provider": "鲧石",
"stNum": 215,
"contacts": "曾杰",
@ -142,7 +142,7 @@
"target": "DB_ZHSK.REL_ST_STTP,DB_ZHSK.ST_RIVER_R",
"enable": "1",
"服务状态": "1",
"maxTime": "2023-10-09 15:00:00",
"maxTime": "2025-10-09 15:00:00",
"countVo": {
"allCount": 3866780,
"todayCount": 1504,
@ -159,7 +159,7 @@
"serviceAddr": "10.42.160.200",
"port": "1433",
"route": "",
"registerTime": "2023-05-24 12:00:00",
"registerTime": "2025-05-24 12:00:00",
"provider": "鲧石",
"stNum": 372,
"contacts": "曾杰",
@ -167,7 +167,7 @@
"target": "DB_ZHSK.REL_ST_STTP,DB_ZHSK.ST_RSVR_R",
"enable": "1",
"服务状态": "1",
"maxTime": "2023-10-09 16:00:00",
"maxTime": "2025-10-09 16:00:00",
"countVo": {
"allCount": 8813744,
"todayCount": 10226,

View File

@ -1,5 +1,5 @@
{
"records": [{"序号":"1","量水设施代码":"HP0024208020000063","量水设施名称":"量水堰1#","设施类别":"量水槽","经度":"114. 989405","纬度":"31. 36019","所在位置":"溢洪道下游","喉道尺寸(m*m)":"1.5*1.2","设计流量(m³/s)":"2","实达流量(m³/s)":"2","创建日期":"2023-08-30"}],
"records": [{"序号":"1","量水设施代码":"HP0024208020000063","量水设施名称":"量水堰1#","设施类别":"量水槽","经度":"114. 989405","纬度":"31. 36019","所在位置":"溢洪道下游","喉道尺寸(m*m)":"1.5*1.2","设计流量(m³/s)":"2","实达流量(m³/s)":"2","创建日期":"2025-05-30"}],
"total": 10,
"pages": 1
}

View File

@ -1,11 +1,11 @@
{
"records": [
{"闸阀代码":"HP0024208020000063","闸阀名称":"电动蝶阀1#","产品名称":"暗杆闸阀","经度":"114.989405","纬度":"31.36019","所在位置":"取水塔1楼","型号":"Z45H-PN10","规格":"DN40","结构长度":"GB/T12221-2005","创建日期":"2023-08-30"},
{"闸阀代码":"HP0024208020000078","闸阀名称":"电动蝶阀2#","产品名称":"暗杆闸阀","经度":"114.078096","纬度":"30.953825","所在位置":"取水塔2楼","型号":"Z45H-PN10","规格":"DN60","结构长度":"GB/T12221-2005","创建日期":"2023-08-30"},
{"闸阀代码":"HP0024208020000082","闸阀名称":"电动蝶阀3#","产品名称":"暗杆闸阀","经度":"114.118889","纬度":"30.974167","所在位置":"取水塔3楼","型号":"Z45H-PN10","规格":"DN80","结构长度":"GB/T12221-2005","创建日期":"2023-08-29"},
{"闸阀代码":"HP0024208020000085","闸阀名称":"电动活塞阀1#","产品名称":"电磁阀","经度":"114.989405","纬度":"31.36019","所在位置":"取水塔1楼","型号":"Z45H-PN10","规格":"DN40","结构长度":"GB/T12221-2005","创建日期":"2023-08-30"},
{"闸阀代码":"HP0024208020000087","闸阀名称":"电动活塞阀2#","产品名称":"电磁阀","经度":"114.078096","纬度":"30.953825","所在位置":"取水塔2楼","型号":"Z45H-PN10","规格":"DN60","结构长度":"GB/T12221-2005","创建日期":"2023-08-30"},
{"闸阀代码":"HP0024208020000089","闸阀名称":"电动活塞阀3#","产品名称":"电磁阀","经度":"114.118889","纬度":"30.974167","所在位置":"取水塔3楼","型号":"Z45H-PN10","规格":"DN80","结构长度":"GB/T12221-2005","创建日期":"2023-08-29"}
{"闸阀代码":"HP0024208020000063","闸阀名称":"电动蝶阀1#","产品名称":"暗杆闸阀","经度":"114.989405","纬度":"31.36019","所在位置":"取水塔1楼","型号":"Z45H-PN10","规格":"DN40","结构长度":"GB/T12221-2005","创建日期":"2025-05-30"},
{"闸阀代码":"HP0024208020000078","闸阀名称":"电动蝶阀2#","产品名称":"暗杆闸阀","经度":"114.078096","纬度":"30.953825","所在位置":"取水塔2楼","型号":"Z45H-PN10","规格":"DN60","结构长度":"GB/T12221-2005","创建日期":"2025-05-30"},
{"闸阀代码":"HP0024208020000082","闸阀名称":"电动蝶阀3#","产品名称":"暗杆闸阀","经度":"114.118889","纬度":"30.974167","所在位置":"取水塔3楼","型号":"Z45H-PN10","规格":"DN80","结构长度":"GB/T12221-2005","创建日期":"2025-05-30"},
{"闸阀代码":"HP0024208020000085","闸阀名称":"电动活塞阀1#","产品名称":"电磁阀","经度":"114.989405","纬度":"31.36019","所在位置":"取水塔1楼","型号":"Z45H-PN10","规格":"DN40","结构长度":"GB/T12221-2005","创建日期":"2025-05-30"},
{"闸阀代码":"HP0024208020000087","闸阀名称":"电动活塞阀2#","产品名称":"电磁阀","经度":"114.078096","纬度":"30.953825","所在位置":"取水塔2楼","型号":"Z45H-PN10","规格":"DN60","结构长度":"GB/T12221-2005","创建日期":"2025-05-30"},
{"闸阀代码":"HP0024208020000089","闸阀名称":"电动活塞阀3#","产品名称":"电磁阀","经度":"114.118889","纬度":"30.974167","所在位置":"取水塔3楼","型号":"Z45H-PN10","规格":"DN80","结构长度":"GB/T12221-2005","创建日期":"2025-05-30"}
],
"total": 10,
"pages": 1

View File

@ -77,7 +77,7 @@ export function loadMenu(user: LoginUser): MenuItem[] {
id: id(), title: '资源目录', redirect: '/mgr/res', icon: 'xtgl.png', children: [
{
id: id(), title: '工程及水系', redirect: '/mgr/res', children: [
{ id: id(), title: '水', path: '/mgr/res' },
{ id: id(), title: '水源地', path: '/mgr/res' },
{ id: id(), title: '河流', path: '/mgr/rivl' },
{ id: id(), title: '大坝', path: '/mgr/dam' },
// { id: id(), title: '水电站', path: '/mgr/elst' },
@ -92,8 +92,9 @@ export function loadMenu(user: LoginUser): MenuItem[] {
//{ id: id(), title: '水位流量曲线', path: '/mgr/rzhis' },
{ id: id(), title: '管理单位', path: '/mgr/unit' },
{ id: id(), title: '行政区划', path: '/mgr/ad' },
{ id: id(), title: '人员管理', path: '/mgr/personel' },
{ id: id(), title: '用水户信息', path: '/mgr/personel' },
{ id: id(), title: '部门管理', path: '/mgr/department' },
{ id: id(), title: '水厂信息', path: '/mgr/waterPro' },
],
}
],

View File

@ -23,7 +23,7 @@ import DirPage from './Serv/Dir';
import WatchPage from './Serv/Watch';
import MgrPage from './Serv/Mgr';
import WaterPage from './Base/WaterPro'
const AppRouters: React.FC = () => {
const dispatch = useDispatch<Dispatch>();
@ -52,6 +52,7 @@ const AppRouters: React.FC = () => {
{ path: 'unit', element: <UnitPage /> },
{ path: 'ad', element: <AdPage /> },
{ path: 'personel', element: <PersonelPage /> },
{ path: 'waterPro', element: <WaterPage /> },
{ path: 'department', element: <DepartmentPage /> },
{ path: 'dir', element: <DirPage /> },
{ path: 'servreg', element: <RegPage /> },

View File

@ -20,20 +20,21 @@ const DataTable: React.FC<{
{ title: '用户帐号', key: '用户帐号', dataIndex: '用户帐号', width: 120, align: 'center' },
{ title: '用户姓名', key: '用户姓名', dataIndex: '用户姓名', width: 120, align: 'center' },
{ title: '手机号码', key: '手机号码', dataIndex: '手机号码', width: 120, align: 'center' },
{ title: '部门', key: '部门', dataIndex: '部门', width: 120, align: 'center' },
{ title: '职务', key: '职务', dataIndex: '职务', width: 120, align: 'center' },
{ title: '状态', key: '状态', dataIndex: '状态', width: 120, align: 'center' },
{
title: '操作', key: 'op', align: 'center', width: 200, render: rec =>
(<Space split={<Divider type="vertical" />}>
<OpButton text='编辑'></OpButton>
<OpButton text='详情'></OpButton>
<OpButton text='密码'></OpButton>
<OpButton text='删除'></OpButton>
<OpButton text='冻结'></OpButton>
</Space>
)
}
{ title: '行政区划', key: '行政区划', dataIndex: '行政区划', width: 120, align: 'center' },
{ title: '用水户类型', key: '用水户类型', dataIndex: '用水户类型', width: 120, align: 'center' },
{ title: '人口数量', key: '人口数量', dataIndex: '人口数量', width: 120, align: 'center' },
{ title: '水价方案', key: '水价方案', dataIndex: '水价方案', width: 120, align: 'center' },
// {
// title: '操作', key: 'op', align: 'center', width: 200, render: rec =>
// (<Space split={<Divider type="vertical" />}>
// <OpButton text='编辑'></OpButton>
// <OpButton text='详情'></OpButton>
// <OpButton text='密码'></OpButton>
// <OpButton text='删除'></OpButton>
// <OpButton text='冻结'></OpButton>
// </Space>
// )
// }
], []);
return (

View File

@ -0,0 +1,59 @@
import { Divider, Space, Table } from 'antd';
import { ColumnsType } from 'antd/lib/table';
import moment from 'moment';
import React, { useMemo } from 'react';
import OpButton, { DelOpButton, EditOpButton } from '../../../components/crud/OpButton';
import { SysUserItem } from '../../../models/_/defs';
import { IContextProp } from './_';
const DataTable: React.FC<{
ctx: IContextProp
}> = ({ ctx }) => {
const { pager, crud } = ctx;
const columns = useMemo<ColumnsType<SysUserItem>>(() => [
{ title: '序号', key: 'id', align: 'center', width: 80, render: (_1: any, _2: any, index: number) => ctx.pager.noRender(index) },
{ title: '水厂名称', key: '水厂名称', dataIndex: '水厂名称', width: 120, align: 'center' },
{ title: '经营性质', key: '经营性质', dataIndex: '经营性质', width: 120, align: 'center' },
{ title: '行政区划', key: '行政区划', dataIndex: '行政区划', width: 120, align: 'center' },
{ title: '地理位置', key: '地理位置', dataIndex: '地理位置', width: 120, align: 'center' },
{ title: '许可证号', key: '许可证号', dataIndex: '许可证号', width: 120, align: 'center' },
{ title: '净水工艺', key: '净水工艺', dataIndex: '净水工艺', width: 120, align: 'center' },
{ title: '水质级别', key: '水质级别', dataIndex: '水质级别', width: 120, align: 'center' },
{ title: '生产能力', key: '生产能力', dataIndex: '生产能力', width: 120, align: 'center' },
{ title: '取用水源', key: '取用水源', dataIndex: '取用水源', width: 120, align: 'center' },
{ title: '供水对象', key: '供水对象', dataIndex: '供水对象', width: 120, align: 'center' },
{ title: '供水人口', key: '供水人口', dataIndex: '供水人口', width: 120, align: 'center' },
{ title: '负责人', key: '负责人', dataIndex: '负责人', width: 120, align: 'center' },
{ title: '联系方式', key: '联系方式', dataIndex: '联系方式', width: 120, align: 'center' },
// {
// title: '操作', key: 'op', align: 'center', width: 200, render: rec =>
// (<Space split={<Divider type="vertical" />}>
// <OpButton text='编辑'></OpButton>
// <OpButton text='详情'></OpButton>
// <OpButton text='密码'></OpButton>
// <OpButton text='删除'></OpButton>
// <OpButton text='冻结'></OpButton>
// </Space>
// )
// }
], []);
return (
<>
<Table
columns={columns}
rowKey={row => row.}
{...pager.tableProps}
dataSource={[]}
/>
</>
)
}
export default DataTable

View File

@ -0,0 +1,53 @@
import { SearchOutlined } from '@ant-design/icons'
import { Button, Col, Form, Input, Row, Space } from 'antd'
import React from 'react'
import { IContextProp } from './_'
const SearchBar: React.FC<{
ctx: IContextProp
}> = ({ ctx }) => {
const { pager } = ctx;
const doSearch = (data: any) => {
pager.search({
search: {
username: data.name,
}
})
}
return (
<Form layout="horizontal" onFinish={doSearch}>
<Row gutter={32}>
<Col flex={0} style={{ width: 260 }}>
<Form.Item name="水厂名称" label="水厂名称">
<Input placeholder='请输入水厂名称' allowClear />
</Form.Item>
</Col>
{/* <Col flex={0} style={{ width: 260 }}>
<Form.Item name="姓名" label="姓名">
<Input placeholder='请输入姓名' allowClear />
</Form.Item>
</Col>
<Col flex={0} style={{ width: 260 }}>
<Form.Item name="手机号码" label="手机号码">
<Input placeholder='请输入手机号码' allowClear />
</Form.Item>
</Col> */}
<Col>
<Space>
<Button htmlType='submit' icon={<SearchOutlined />} type="primary">
</Button>
{/* <Button onClick={() => ctx.crud.goto('add', {})}>
</Button> */}
</Space>
</Col>
</Row>
</Form>
)
}
export default SearchBar

View File

@ -0,0 +1,67 @@
import { message } from "antd";
import useCrud, { BasicCrudType, CrudContext } from "../../../components/crud/useCrud";
import usePageTable, { PageTableContext } from "../../../components/crud/usePageTable";
import { SysUserItem } from "../../../models/_/defs";
import { httpGet, httpPost, paginate, paginateDemo } from "../../../utils/request";
type CRUD_TYPER = BasicCrudType;
export type IContextProp = {
pager: PageTableContext<SysUserItem>;
crud: CrudContext<CRUD_TYPER>;
saveOrUpdate: (val: FormPropType) => Promise<void>;
del: (val: any) => Promise<void>;
}
export type FormPropType = {
}
export function usePageContext(): IContextProp {
const crud = useCrud<CRUD_TYPER>();
const pager = usePageTable<SysUserItem>((opt: any) => paginateDemo('sysUser.json', opt));
const saveOrUpdate = async (val: FormPropType): Promise<void> => {
if (crud.loading || (crud.mode !== 'add' && crud.mode !== 'edit')) {
return;
}
crud.setLoading(true);
/*
const res: any = await httpPost(apiPaths.whitelist[crud.mode], val);
if (res) {
message.success('操作成功');
pager.refresh();
crud.goto(null, null);
}
*/
crud.setLoading(false);
}
const del = async (val: any) => {
crud.setLoading(true);
/*
const res: any = await httpGet(`${apiPaths.whitelist.del}/${val?.userId}`);
if (res) {
message.success('操作成功');
pager.refresh();
}
*/
crud.setLoading(false);
}
return {
crud,
pager,
saveOrUpdate,
del
}
}

View File

@ -0,0 +1,19 @@
import { Modal } from 'antd'
import React from 'react'
import DataTable from './DataTable'
import SearchBar from './SearchBar'
import { usePageContext } from './_'
const SysUserPage: React.FC = () => {
const ctx = usePageContext();
return (
<div className='content-body common-style'>
{/* <SearchBar ctx={ctx} /> */}
<DataTable ctx={ctx} />
</div>
)
}
export default SysUserPage

View File

@ -17,13 +17,13 @@ const DataTable: React.FC<{
const { pager, crud } = ctx;
const columns = useMemo<ColumnsType<ResItem>>(() => [
{ title: '序号', key: 'id', align: 'center', width: 80, render: (_1: any, _2: any, index: number) => ctx.pager.noRender(index) },
{ title: '水库代码', key: '水库代码', dataIndex: '水库代码', width: 120, align: 'center' },
{ title: '水库名称', key: '水库名称', dataIndex: '水库名称', width: 120, align: 'center' },
{ title: '测站编码', key: '测站编码', dataIndex: '测站编码', width: 120, align: 'center' },
// { title: '水库代码', key: '水库代码', dataIndex: '水库代码', width: 120, align: 'center' },
// { title: '水库名称', key: '水库名称', dataIndex: '水库名称', width: 120, align: 'center' },
// { title: '测站编码', key: '测站编码', dataIndex: '测站编码', width: 120, align: 'center' },
{ title: '行政区划', key: '行政区划', dataIndex: '行政区划', width: 120, align: 'center' },
{ title: '经度', key: '经度', dataIndex: '经度', width: 120, align: 'center' },
{ title: '纬度', key: '纬度', dataIndex: '纬度', width: 120, align: 'center' },
{ title: '水库规模', key: '水库规模', dataIndex: '水库规模', width: 120, align: 'center' },
// { title: '水库规模', key: '水库规模', dataIndex: '水库规模', width: 120, align: 'center' },
{ title: '集雨面积(km²)', key: '集雨面积(km²)', dataIndex: '集雨面积(km²)', width: 120, align: 'center' },
{ title: '总库容(万m³)', key: '总库容(万m³)', dataIndex: '总库容(万m³)', width: 120, align: 'center' },
{ title: '创建日期', key: '创建日期', dataIndex: '创建日期', width: 120, align: 'center' },