From 043abb15054ca3eca8c65e4ddc84f4f45cfee381 Mon Sep 17 00:00:00 2001 From: lishenfeng Date: Thu, 26 Dec 2024 15:10:07 +0800 Subject: [PATCH] =?UTF-8?q?feat():=20=E5=B7=A1=E6=9F=A5=E5=B7=A1=E6=A3=80?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/crud/CrudOpRender.js | 4 +- src/service/apiurl.js | 49 +- src/views/AppRouters.tsx | 28 +- src/views/Gcyx/xcxj/xjrw/detailForm.js | 443 ++++++++++++++++++ src/views/Gcyx/xcxj/xjrw/form.js | 351 ++++++++++++++ src/views/Gcyx/xcxj/xjrw/index.js | 222 +++++++++ src/views/Gcyx/xcxj/xjrw/index.less | 30 ++ src/views/Gcyx/xcxj/xjrw/toolbar.js | 73 +++ src/views/Gcyx/xcxj/xjwtcl/form.js | 347 ++++++++++++++ src/views/Gcyx/xcxj/xjwtcl/index.js | 197 ++++++++ src/views/Gcyx/xcxj/xjwtcl/index.less | 30 ++ src/views/Gcyx/xcxj/xjwtcl/toolbar.js | 53 +++ .../xcxj/xjxpz/AdcdTreeSelector/index.less | 47 ++ .../xcxj/xjxpz/AdcdTreeSelector/index.tsx | 313 +++++++++++++ src/views/Gcyx/xcxj/xjxpz/form.js | 110 +++++ src/views/Gcyx/xcxj/xjxpz/index.js | 141 ++++++ src/views/Gcyx/xcxj/xjxpz/index.less | 30 ++ src/views/Gcyx/xcxj/xjxpz/toolbar.js | 43 ++ src/views/SafeWatch/SlWatch/index.js | 72 +++ src/views/SafeWatch/SlWatch/toolbar.js | 71 +++ src/views/SafeWatch/TransformWatch/form.js | 97 ++++ src/views/SafeWatch/TransformWatch/index.js | 143 ++++++ src/views/SafeWatch/TransformWatch/index.less | 0 src/views/SafeWatch/TransformWatch/toolbar.js | 60 +++ src/views/SafeWatch/WarnRecord/index.js | 83 ++++ src/views/SafeWatch/WarnRecord/toolbar.js | 88 ++++ src/views/SafeWatch/WarnRuleConfig/form.js | 106 +++++ src/views/SafeWatch/WarnRuleConfig/index.js | 128 +++++ src/views/SafeWatch/WarnRuleConfig/toolbar.js | 61 +++ src/views/Sbwh/Zhfxkh/form.js | 173 +++++++ src/views/Sbwh/Zhfxkh/index.js | 113 +++++ src/views/Sbwh/Zhfxkh/index.less | 0 src/views/Sbwh/Zhfxkh/toolbar.js | 67 +++ src/views/WatchData/Jcsj/index.js | 9 +- src/views/WatchData/Jcsj/options.js | 4 +- .../PoliceMangant/PoliceRecord/index.js | 24 +- .../PoliceMangant/PoliceRecord/toolbar.js | 10 +- .../PoliceMangant/PoliceRuleConfig/index.js | 16 +- 38 files changed, 3806 insertions(+), 30 deletions(-) create mode 100644 src/views/Gcyx/xcxj/xjrw/detailForm.js create mode 100644 src/views/Gcyx/xcxj/xjrw/form.js create mode 100644 src/views/Gcyx/xcxj/xjrw/index.js create mode 100644 src/views/Gcyx/xcxj/xjrw/index.less create mode 100644 src/views/Gcyx/xcxj/xjrw/toolbar.js create mode 100644 src/views/Gcyx/xcxj/xjwtcl/form.js create mode 100644 src/views/Gcyx/xcxj/xjwtcl/index.js create mode 100644 src/views/Gcyx/xcxj/xjwtcl/index.less create mode 100644 src/views/Gcyx/xcxj/xjwtcl/toolbar.js create mode 100644 src/views/Gcyx/xcxj/xjxpz/AdcdTreeSelector/index.less create mode 100644 src/views/Gcyx/xcxj/xjxpz/AdcdTreeSelector/index.tsx create mode 100644 src/views/Gcyx/xcxj/xjxpz/form.js create mode 100644 src/views/Gcyx/xcxj/xjxpz/index.js create mode 100644 src/views/Gcyx/xcxj/xjxpz/index.less create mode 100644 src/views/Gcyx/xcxj/xjxpz/toolbar.js create mode 100644 src/views/SafeWatch/SlWatch/index.js create mode 100644 src/views/SafeWatch/SlWatch/toolbar.js create mode 100644 src/views/SafeWatch/TransformWatch/form.js create mode 100644 src/views/SafeWatch/TransformWatch/index.js create mode 100644 src/views/SafeWatch/TransformWatch/index.less create mode 100644 src/views/SafeWatch/TransformWatch/toolbar.js create mode 100644 src/views/SafeWatch/WarnRecord/index.js create mode 100644 src/views/SafeWatch/WarnRecord/toolbar.js create mode 100644 src/views/SafeWatch/WarnRuleConfig/form.js create mode 100644 src/views/SafeWatch/WarnRuleConfig/index.js create mode 100644 src/views/SafeWatch/WarnRuleConfig/toolbar.js create mode 100644 src/views/Sbwh/Zhfxkh/form.js create mode 100644 src/views/Sbwh/Zhfxkh/index.js create mode 100644 src/views/Sbwh/Zhfxkh/index.less create mode 100644 src/views/Sbwh/Zhfxkh/toolbar.js diff --git a/src/components/crud/CrudOpRender.js b/src/components/crud/CrudOpRender.js index 8409e9a..2f2f345 100644 --- a/src/components/crud/CrudOpRender.js +++ b/src/components/crud/CrudOpRender.js @@ -43,8 +43,8 @@ export function CrudOpRender_text({ command,modify,edit,del,view,status}) {
{ status ? ( - - + + ) : null } diff --git a/src/service/apiurl.js b/src/service/apiurl.js index 92779f3..dcc884d 100644 --- a/src/service/apiurl.js +++ b/src/service/apiurl.js @@ -23,13 +23,45 @@ const apiurl = { getDamData: service_xyt + '/gatePore/listByStcd', getVideo: service_xyt + '/gateValveCctvRel/list' }, + + rcgl: { + xcxj: { + xjrw: { + page: service_ykz + "/inspect/task/page", + save: service_ykz + "/inspect/task/insert", + edit: service_ykz + "/inspect/task/update", + delete: service_ykz + "/inspect/task/del", + list: service_ykz + "/inspect/point/listWithItem", + detail: service_ykz + '/inspect/detail/getByTaskId', + info: service_ykz + '/inspect/detail/info' + }, + xjwtcl: { + page: service_ykz + "/inspect/detail/page", + }, + xjxpz: { + page: service_ykz + "/inspectItem/page", + save: service_ykz + "/inspectItem/insert", + edit: service_ykz + "/inspectItem/update", + delete: service_ykz + "/inspectItem/del", + tree: service_ykz + "/inspect/point/list", + saveTree: service_ykz + "/inspect/point/insert", + editTree: service_ykz + "/inspect/point/update", + deleteTree: service_ykz + "/inspect/point/del", + } + }, + }, jcsj: { bjgl: { bjgzpz: { page: service_ykz + '/warnRule/page', save: service_ykz +'/warnRule/insert', edit: service_ykz +'/warnRule/update', - delete:service_ykz +'/warnRule/del' + delete: service_ykz + '/warnRule/del', + stop:service_ykz + '/warnRule/startStop' + }, + bjjl: { + page: service_ykz + '/warnRecord/page', + export:service_ykz + '/warnRecord/export' } }, jcsj: { @@ -39,6 +71,15 @@ const apiurl = { export:service_ykz + '/stPptnRReal/export' } }, + aqjc: { + bxjc: { + wypage: service_ykz + '/osmoticShiftR/page', + wysave: service_ykz + '/osmoticShiftR/insert', + wyedit: service_ykz + '/osmoticShiftR/update', + wydelete: service_ykz + '/osmoticShiftR/del', + wyexport:service_ykz + '/osmoticShiftR/export' + } + }, sbwh: { whfabz: { page: service_ykz + '/maintainPlan/page', @@ -95,6 +136,12 @@ const apiurl = { uploadUrl: service_ykz + '/sparePartsInfo/file/upload/singleSimple', downloadUrl: service_ykz + '/sparePartsInfo/file/download', export:service_ykz + '/sparePartsInfo/export' + }, + zhfxkh: { + page: service_ykz + '/assessAnalysis/page', + save: service_ykz + '/assessAnalysis/insert', + edit: service_ykz + '/assessAnalysis/update', + delete:service_ykz + '/assessAnalysis/del' } }, gcyx: { diff --git a/src/views/AppRouters.tsx b/src/views/AppRouters.tsx index 9307887..456fc92 100644 --- a/src/views/AppRouters.tsx +++ b/src/views/AppRouters.tsx @@ -11,6 +11,7 @@ import Whxmys from "./Sbwh/Whxmys"; import Cgtzgl from "./Sbwh/Cgtzgl"; import Kchsgl from "./Sbwh/Kchsgl"; import Spbjgl from "./Sbwh/Spbjgl"; +import Zhfxkh from './Sbwh/Zhfxkh'; import BasicSituation from "./Gcyx/InformationSearch/BasicSituation"; import RunSituation from "./Gcyx/InformationSearch/RunSituation"; import StaticTable from "./Gcyx/InformationSearch/StaticTable"; @@ -23,6 +24,13 @@ import UserInfo from './SystemMangant/UserInfo1' import Dept from './SystemMangant/dept' import Role from './SystemMangant/role' import MenuM from './SystemMangant/menuM' +import Bxjc from './SafeWatch/TransformWatch' +import Sljc from './SafeWatch/SlWatch' +import Yjjl from './SafeWatch/WarnRecord' +import Yjgzpz from './SafeWatch/WarnRuleConfig' +import Xjrw from "./Gcyx/xcxj/xjrw" +import Xjwtcl from "./Gcyx/xcxj/xjwtcl" +import Xjxpz from "./Gcyx/xcxj/xjxpz" import TestLine from './TestLine' // const HomePage = lazy(() => import('./Home')) @@ -49,6 +57,11 @@ const AppRouters: React.FC = () => { { path: 'jcsj/bjgl/bjjl', element: }, { path: 'jcsj/bjgl/bjgzpz', element: }, + // 安全监测 + { path: 'aqjc/bxjc', element: }, + { path: 'aqjc/sljc', element: }, + { path: 'aqjc/yjjl', element: }, + { path: 'aqjc/yjgzpz', element: }, // 设备维护 { path: 'sbwh/wxyhgl/wxfabz', element: }, { path: 'sbwh/wxyhgl/ssgcjl', element: }, @@ -56,13 +69,16 @@ const AppRouters: React.FC = () => { { path: 'sbwh/sbwzgl/cgtzgl', element: }, { path: 'sbwh/sbwzgl/kchsgl', element: }, { path: 'sbwh/sbwzgl/bpbjgl', element: }, + { path: 'sbwh/sbwzgl/zhfxkh', element: }, // 工程运行 - // { path: 'gcyx/xxcx/jbqk', element: }, - // { path: 'gcyx/xxcx/yxqk', element: }, - // { path: 'gcyx/xxcx/tjbb', element: }, - // { path: 'gcyx/xxcx/czrz', element: }, - // { path: 'gcyx/jsyj/sbgzjl', element: }, - + { path: 'gcyx/xxcx/jbqk', element: }, + { path: 'gcyx/xxcx/yxqk', element: }, + { path: 'gcyx/xxcx/tjbb', element: }, + { path: 'gcyx/xxcx/czrz', element: }, + { path: 'gcyx/jsyj/sbgzjl', element: }, + { path: 'gcyx/xcxj/xcrw', element: }, + { path: 'gcyx/xcxj/xjwtcl', element: }, + { path: 'gcyx/xcxj/xjxpz', element: }, // 系统管理 { path: 'xtgl/yhxx', element: }, { path: 'xtgl/bmgl', element: }, diff --git a/src/views/Gcyx/xcxj/xjrw/detailForm.js b/src/views/Gcyx/xcxj/xjrw/detailForm.js new file mode 100644 index 0000000..b35dddc --- /dev/null +++ b/src/views/Gcyx/xcxj/xjrw/detailForm.js @@ -0,0 +1,443 @@ +import React,{useEffect,useState,useMemo,useRef} from 'react'; +import { Form, Button, Input, Row,Upload, Col, Table, DatePicker,Tabs, Tooltip,message,Image,Modal,Typography ,Popconfirm, Descriptions } from 'antd'; +import { DeleteOutlined,FileWordOutlined,FilePdfOutlined,FileZipOutlined,FileExcelOutlined,VideoCameraOutlined } from '@ant-design/icons'; +import { formItemLayout, btnItemLayout } from '../../../../components/crud/FormLayoutProps'; + +import apiurl from '../../../../service/apiurl'; + +import NormalSelect from '../../../../components/Form/NormalSelect'; + +import "./index.less" +import moment from 'moment'; +import { httpget2 } from '../../../../utils/request'; +const { RangePicker } = DatePicker +const { Dragger } = Upload; +const url = "http://223.75.53.141:9102/test.by-lyf.tmp" + + +const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave,submit }) => { +console.log(record); + const taskTypes = [ + {label:"日常巡查",value:0}, + {label:"特别检查",value:1}, + {label:"汛前巡检",value:2}, + ] + const statusTypes = [ + {label:"未完成",value:0}, + {label:"进行中",value:1}, + {label:"已完成",value:2}, + ] + const xjStatus = { + 0: "cha", + 1:"gou" + } + const renderTooltip = (value) => { + return ( + <> + + + {value?.itemProblemDesc} + + + {value?.handleSuggestion} + + + + ) + } + const columns = [ + { + title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align: "center", + render: (value, row, index) => {index + 1} + }, + { + title: '巡查项', key: 'itemDesc', dataIndex: 'itemDesc', width: 200, + render: (value, row, index) => +
+
{value}
+ + + + + +
+ }, + { title: '巡查状态', key: 'isNormal', dataIndex: 'isNormal', width: 100, align: "center", + render: (value) =>
+
+ }, + { title: '巡查问题描述', key: 'problemDesc', dataIndex: 'problemDesc', width: 300,ellipsis:true }, + { title: '巡查图片', key: 'inspectPics', dataIndex: 'inspectPics', width: 100,align: "center", + render: (value) => + + }, + { title: '巡查视频', key: 'inspectVideos', dataIndex: 'inspectVideos', width: 100,align: "center", + render: (value) => + + }, + { + title: '是否处理', key: 'isHandle', dataIndex: 'isHandle', width: 100,align: "center", + render: (value) => {value? "是" : "否"} + }, + { title: '处理人', key: 'handleUserName', dataIndex: 'handleUserName', width: 150 }, + { + title: '操作', key: 'operator', dataIndex: 'operator', width: 150, + render:(value,row) => handleDetail(row)}>处理详情 + }, + + ] + const width = useMemo(() => columns.reduce((total, cur) => total + (cur.width), 0), [columns]); + + const [form] = Form.useForm(); + const [imgVisible, setImgVisible] = useState(false) + const [imgList, setImgList] = useState([]) + const [videoOpen, setVideoOpen] = useState(false) + const [videoParams, setVideoParams] = useState({}) + const [tabsRender, setTabsRender] = useState([]) + const [totals, setTotals] = useState({}) + const [handleDetailsOpen, setHandleDetailsOpen] = useState(false) + const [handleDetails, setHandleDetails] = useState({}) + const [handleImgfileList, setHandleImgFileList] = useState([]) //上传文件列表 + const [handleVideoFileList, setHandleVideoFileList] = useState([]) //上传文件列表 + const handleDetail = (row) => { + setHandleDetailsOpen(true) + setHandleDetails(row) + } + + const reviewPic = (arrPic) => { + if (arrPic.length > 0) { + setImgVisible(true) + setImgList(arrPic) + } + } + + const reviewVideo = (arrVideo) => { + if (arrVideo.length > 0) { + setVideoOpen(true) + setVideoParams(arrVideo[0]) + } + } + const renderItems = (items) => { + const result = items.map(o => ({ + key: o.pointId, + label: o.name + `(${o.children.filter(r=>r.isNormal == 0).length})`, + children: + + })) + setTabsRender(result) + } + const getTabsDetail = async (id) => { + let items = {}; + try { + const res = await httpget2(apiurl.rcgl.xcxj.xjrw.info,{taskId:id}); + renderItems(res.data) + res.data.forEach(o => { + items.isNormalTotal = o.children.filter(item => item.isNormal == 0).length; + items.normalTotal = o.children.filter(item => item.isNormal == 1).length; + }) + setTotals(items); + } catch (error) { + console.log(error); + } + } + + const handleFile = (arr=[]) => { + const newArr = arr?.map(item => ({ + name: item.fileName, + response: { + data: { + filePath: item.filePath, + fileId:item.fileId + } + }, + })) + return newArr + } + useEffect(() => { + const handleImgFile = handleFile(handleDetails?.handlePics || []); + const hanldeVideoFile = handleFile(handleDetails?.handleVideos || []); + setHandleImgFileList(handleImgFile) + setHandleVideoFileList(hanldeVideoFile) + }, [handleDetails]) + + useEffect(() => { + getTabsDetail(record.id) + }, [record]) + + return ( +
+
+ 基本信息
+
+ +
+ + + + + + + + + + + + + + + + + + + + + dateString} + getValueProps={(value) => ({ value: value ? moment(value) : undefined })} + placeholder="" + > + + + + + dateString} + getValueProps={(value) => ({ value: value ? moment(value) : undefined })} + placeholder="" + > + + + + + + + dateString} + getValueProps={(value) => ({ value: value ? moment(value) : undefined })} + placeholder="" + > + + + + + dateString} + getValueProps={(value) => ({ value: value ? moment(value) : undefined })} + placeholder="" + + > + + + + + + + + + + + + + + + + + +
+ + 巡查信息 + {record?.status == 2 ? + (异常项:{totals?.isNormalTotal},正常项:{totals?.normalTotal}) + : null + } +
+ { + record?.status == 2 ? + + : + + } + +
+ setImgVisible(vis), + }} + > + { + imgList.length > 0 ? imgList.map(item => ( + + )) + : null + } + + + +
+ setVideoOpen(false)} + > + + + setHandleDetailsOpen(false)} + > + <> +
+ +
+ + + { + handleImgfileList.length > 0 && handleImgfileList.map(file => { + return ( + +
+
+ + {file.name} +
+
+ + ) + }) + } + + + + + + + + + { + handleVideoFileList.length > 0 && handleVideoFileList.map(file => { + return ( + +
+
+
{ setVideoOpen(true); setVideoParams(file)}} + style={{ cursor: 'pointer' }} + > + +
+ {file.name} +
+
+ + ) + }) + } + + + + + + + + + + + + + + + + ); +} + +export default ModalForm; diff --git a/src/views/Gcyx/xcxj/xjrw/form.js b/src/views/Gcyx/xcxj/xjrw/form.js new file mode 100644 index 0000000..16ef5b3 --- /dev/null +++ b/src/views/Gcyx/xcxj/xjrw/form.js @@ -0,0 +1,351 @@ +import React,{useEffect,useState,useMemo,useRef} from 'react'; +import { Form, Button, Input, Row,Upload, Col, Table, DatePicker, TreeSelect,message,Image,Modal,Typography ,Popconfirm } from 'antd'; +import { DeleteOutlined,FileWordOutlined,FilePdfOutlined,FileZipOutlined,FileExcelOutlined } from '@ant-design/icons'; +import { formItemLayout, btnItemLayout } from '../../../../components/crud/FormLayoutProps'; +import PersonTree from '../../../../components/PersonTree'; +import apiurl from '../../../../service/apiurl'; + +import NormalSelect from '../../../../components/Form/NormalSelect'; +import { xyt_httpget2 } from '../../../../utils/request'; +import "./index.less" +import moment from 'moment'; +import { httpget2 } from '../../../../utils/request'; +const { RangePicker } = DatePicker +const { Dragger } = Upload; +const url = "http://223.75.53.141:9102/test.by-lyf.tmp" + + +const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => { + const [itemList, setItemList] = useState([]) + const [itemParams, setItemParams] = useState([]) + const [list, setList] = useState([]) + const taskTypes = [ + {label:"日常巡查",value:0}, + {label:"特别检查",value:1}, + {label:"汛前巡检",value:2}, + ] + const [form] = Form.useForm(); + + const handleTree = (arr) => { + + const res = arr.map(item => { + item.value = item.id; + item.title = item.itemDesc; + if (item.children) { + item.children = handleTree(item.children) + } + return item; + }) + return res + } + + const getItemList = async() => { + try { + const res = await httpget2(apiurl.rcgl.xcxj.xjrw.list); + if (res.code === 200) { + const arr1 = res.data.map(item => ({ + id: item.id, + itemDesc: item.name, + children: item.children, + disabled:item.children.length > 0 ? false : true + })); + const result = handleTree(arr1) + setList(res.data) + console.log(result); + setItemList(result) + } + } catch (error) { + console.log(error); + + } + } + + const onfinish = (values) => { + const userId = localStorage.getItem('userId') + const userName = localStorage.getItem('userName') + values.startDate = values.startDate?moment(values.startDate).format("YYYY-MM-DD 00:00:00"):'' + values.endDate = values.endDate ? moment(values.endDate).format("YYYY-MM-DD 00:00:00") : '' + values.createUserId = userId + values.createUserName = userName; + values.inspectUserName = deptUserList?.find(item => item.userId == values.inspectUserId)?.nickName + values.items = itemParams; + if (mode === 'save') { + onSave(apiurl.rcgl.xcxj.xjrw.save,values) + } + if (mode == "edit") { + onEdit(apiurl.rcgl.xcxj.xjrw.edit,{...record,...values}) + } + } + + const itemChange = (a, b, c) => { + const itemArr = a.map(item => { + let pointId; + list.forEach(o => { + if (o.id != item && !pointId) { + pointId = o.children?.find(t => t.id == item)?.pointId; + } + }) + return { + itemId: item, + pointId + } + }) + setItemParams(itemArr) + } + + const getXjInfo = async () => { + try { + const res = await httpget2(apiurl.rcgl.xcxj.xjrw.detail, { taskId: record?.id }) + if (res.code === 200) { + const xjd = res.data.map(item => item.itemId) + form.setFieldValue("items", xjd) + setItemParams(res.data) + } + } catch (error) { + console.log(error); + + } + } + useEffect(() => { + getItemList() + }, []) + + useEffect(() => { + if (mode == "edit") { + getXjInfo() + } + }, [record,mode]) + + + const [deptList, setDeptList] = useState([]) + const [deptUserList, setDeptUserList] = useState([]) + const buildTree = (data, parentId) => { + let tree = []; + data.forEach((node) => { + node.title = node.deptName; + node.key = node.deptId; + + if (node.parentId === parentId) { + let children = buildTree(data, node.deptId); + if (children.length) { + node.children = children; + } + tree.push(node); + } + }); + return tree; +} + +const handleTreeList = (dept, user) => { + const deptArr = dept.map(item => { + return { + ...item, + value: item.deptId, + title: item.deptName, + disabled: item.userId ? false : true, + children: user.filter(u => u.deptId == item.deptId).map(u => ({ + ...u, + value: u.userId, + title: u.nickName + })) + } + }) + console.log("deptArr",deptArr); + const treelist = buildTree(deptArr,0) + return treelist + } + const treeList = useMemo(() => { + if (deptUserList?.length > 0 && deptList?.length > 0) { + return handleTreeList(deptList,deptUserList) + } else { + return [] + } + }, [deptUserList, deptList]) + + + // 获取部门数据 +const getDeptList = async() => { +try { + const result = await xyt_httpget2(apiurl.rcgl.zbgl.zbb.deptlist); + if (result.code == 200) { + setDeptList(result.data); + getDeptUser(result.data[0]) + } + +} catch (error) { + console.log(error); +} +} + +// 获取部门人员数据 +const getDeptUser = async() => { +try { + const result = await xyt_httpget2(apiurl.rcgl.zbgl.zbb.userList, {pageNum:1,pageSize:9999}); + if (result.code == 200) { + setDeptUserList(result.rows) + } +} catch (error) { + console.log(error); +} +} + useEffect(() => { + getDeptList() + }, []) + + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dateString} + getValueProps={(value) => ({ value: value ? moment(value) : undefined })} + + > + + + + + dateString} + getValueProps={(value) => ({ value: value ? moment(value) : undefined })} + + > + + + + + { + mode==='view'?null:( + <> + + + + + ) + } + + + ); +} + +export default ModalForm; diff --git a/src/views/Gcyx/xcxj/xjrw/index.js b/src/views/Gcyx/xcxj/xjrw/index.js new file mode 100644 index 0000000..d85deb5 --- /dev/null +++ b/src/views/Gcyx/xcxj/xjrw/index.js @@ -0,0 +1,222 @@ +import React, { Fragment, useRef, useMemo,useEffect,useState } from 'react'; +import BasicCrudModal from '../../../../components/crud/BasicCrudModal'; +import { Table, Card, Modal, Form, Input, Button, Row,Col, Timeline, message, Tabs,Image } from 'antd'; +import {FileWordOutlined,FilePdfOutlined,FileZipOutlined,FileExcelOutlined } from '@ant-design/icons'; +import { useSelector } from 'react-redux'; +import ToolBar from './toolbar'; +import ModalForm from './form'; +import DetailModalForm from "./detailForm" +import apiurl from '../../../../service/apiurl'; +import usePageTable from '../../../../components/crud/usePageTable2'; +import { createCrudService } from '../../../../components/crud/_'; +import {CrudOpRender_text} from '../../../../components/crud/CrudOpRender'; + +const url = "http://223.75.53.141:9102/test.by-lyf.tmp" +const Page = () => { + const role = useSelector(state => state.auth.role); + 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 task = { + 0: "未完成", + 1: "进行中", + 2: "已完成" + } + const taskType = { + 1: "日常巡查", + 2: "特别检查", + 3: "汛前巡检" + } + const refModal = useRef(); + const [searchVal, setSearchVal] = useState(false) + const [tabs, setTabsChange] = useState(0) + const columns = [ + { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align: "center" }, + { + title: '任务类型', key: 'taskType', dataIndex: 'taskType', width: 200, + render: (value) => {taskType[value]} + + }, + { title: '任务标题', key: 'taskTitle', dataIndex: 'taskTitle', width: 250, ellipsis: true }, + {title: '任务内容', key: 'taskContent', dataIndex: 'taskContent', width: 200}, + { + title: '任务状态', key: 'status', dataIndex: 'status', width: 200, + render: (value) => + {task[value]} + + + }, + {title: '巡查人', key: 'inspectUserName', dataIndex: 'inspectUserName', width: 100}, + {title: '开始日期', key: 'startDate', dataIndex: 'startDate', width: 200}, + {title: '结束日期', key: 'endDate', dataIndex: 'endDate', width: 200}, + {title: '问题数量', key: 'problemNum', dataIndex: 'problemNum', width: 100,align: 'center'}, + { title: '待处理', key: 'handleNum', dataIndex: 'handleNum', width: 100,align: 'center'}, + { title: '创建时间', key: 'createTime', dataIndex: 'createTime', width: 200 }, + { title: '创建人', key: 'createUserName', dataIndex: 'createUserName', width: 150 }, + + { + title: '操作', key: 'operation', width: 200, fixed: 'right',align: 'center', + render: (value, row, index) => ( + () => command(cmd)(row)} />) + }, + ]; + const [modeBtn, setModeBtn] = useState('') + const width = useMemo(() => columns.reduce((total, cur) => total + (cur.width), 0), [columns]); + + const command = (type) => (params) => { + setModeBtn(type) + if (type === 'save') { + refModal.current.showSave(); + } else if (type === 'edit') { + refModal.current.showEdit({ ...params }); + } else if (type === 'view') { + refModal.current.showView(params); + } else if (type === 'del') { + refModal.current.onDeleteGet(apiurl.rcgl.xcxj.xjrw.delete + `/${params.id}`); + } + } + + + + const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.rcgl.xcxj.xjrw.page).find_noCode); + const { tableProps:tableProps0, search:search0 } = usePageTable(createCrudService(apiurl.rcgl.xcxj.xjrw.page).find_noCode); + const { tableProps:tableProps1, search:search1 } = usePageTable(createCrudService(apiurl.rcgl.xcxj.xjrw.page).find_noCode); + const { tableProps:tableProps2, search:search2 } = usePageTable(createCrudService(apiurl.rcgl.xcxj.xjrw.page).find_noCode); + + /** + * @description 处理成功的回调 + */ + const successCallback = () => { + refresh() + setTabsChange(0) +} + useEffect(() => { + const userId = localStorage.getItem('userId') + if (searchVal) { + const params = { + search: { + ...searchVal, + status: Number(tabs), + createUserId:userId + + } + }; + search(params) + } + }, [searchVal, tabs]) + + useEffect(() => { + const userId = localStorage.getItem('userId') + if (searchVal) { + const params = { + search: { + ...searchVal, + status: 0, + createUserId:userId + } + }; + search0(params) + } + }, [searchVal]) + useEffect(() => { + const userId = localStorage.getItem('userId') + if (searchVal) { + const params = { + search: { + ...searchVal, + status: 1, + createUserId:userId + } + }; + search1(params) + } + }, [searchVal]) + + useEffect(() => { + const userId = localStorage.getItem('userId') + if (searchVal) { + const params = { + search: { + ...searchVal, + status: 2, + createUserId:userId + } + }; + search2(params) + } + }, [searchVal]) + + + + return ( + <> +
+
+ + + +
+ setTabsChange(e)} + activeKey={tabs} + items={[ + { + label: `未完成(${tableProps0?.pagination?.total})`, + key: 0, + children:
+ }, + { + label: `进行中(${tableProps1?.pagination?.total})`, + key: 1, + children:
+ }, + { + label: `已完成(${tableProps2?.pagination?.total})`, + key: 2, + children:
+ } + ]} + > + + + + + {refresh({addvcd:localStorage.getItem('ADCD6')})}} + /> + + + ); +} + +export default Page; diff --git a/src/views/Gcyx/xcxj/xjrw/index.less b/src/views/Gcyx/xcxj/xjrw/index.less new file mode 100644 index 0000000..e0bd728 --- /dev/null +++ b/src/views/Gcyx/xcxj/xjrw/index.less @@ -0,0 +1,30 @@ +.basic-info{ + position: relative; + font-size: 16px; + margin-bottom: 20px; + padding:5px 25px; + border-bottom: 1px solid #eee; + &::before{ + position: absolute; + top:8px; + left:0; + content: ""; + display: block; + width: 5px; + height: 20px; + background-color: #0079fe; + } +} +.time-line{ + width: 50%; + margin-left: 6%; + margin-top: 1%; + .time-line-item{ + display: flex; + // align-items: center; + column-gap: 20px; + .item-right{ + flex:1 + } + } +} \ No newline at end of file diff --git a/src/views/Gcyx/xcxj/xjrw/toolbar.js b/src/views/Gcyx/xcxj/xjrw/toolbar.js new file mode 100644 index 0000000..521eb6f --- /dev/null +++ b/src/views/Gcyx/xcxj/xjrw/toolbar.js @@ -0,0 +1,73 @@ +import React, { useEffect,useState } from 'react'; +import { Form, Input, Button, DatePicker } from 'antd'; + +import moment from 'moment'; +import NormalSelect from '../../../../components/Form/NormalSelect'; +const { RangePicker } = DatePicker; +const ToolBar = ({ setSearchVal, onSave, storeData, role }) => { + const addBtn = role?.rule?.find(item => item.menuName == "创建任务")||true; + const searchBtn = role?.rule?.find(item => item.menuName == "查询")||true; + + const types = [ + {label:"日常巡查",value:1}, + {label:"特别检查",value:2}, + {label:"汛前巡检",value:3}, + ] + const [form] = Form.useForm(); + + const onFinish = (values) => { + let dateTimeRangeSo; + if (values.tm) { + dateTimeRangeSo = { + start: moment(values.tm[0]).format('YYYY-MM-DD 00:00:00'), + end: moment(values.tm[1]).format('YYYY-MM-DD 23:59:59') + } + } + delete values.tm + setSearchVal({...values, dateTimeRangeSo}); + } + + useEffect(() => { + let dateTimeRangeSo = { + start: moment().subtract(1,"years").format('YYYY-MM-DD 00:00:00'), + end: moment().format('YYYY-MM-DD 23:59:59') + } + form.setFieldValue("tm", [moment(dateTimeRangeSo.start), moment(dateTimeRangeSo.end)]) + setSearchVal({ dateTimeRangeSo }) + }, []) + + return ( + <> +
+
+ + + + + + + {searchBtn ? + + : null } + + + + + { + (onSave && addBtn) ? + + + + :null + } + +
+ + ); +} + +export default ToolBar; \ No newline at end of file diff --git a/src/views/Gcyx/xcxj/xjwtcl/form.js b/src/views/Gcyx/xcxj/xjwtcl/form.js new file mode 100644 index 0000000..62c9cae --- /dev/null +++ b/src/views/Gcyx/xcxj/xjwtcl/form.js @@ -0,0 +1,347 @@ +import React,{useEffect,useState,useMemo,useRef} from 'react'; +import { Form, Button, Input, Row,Upload, Col, Table, DatePicker, InputNumber,message,Image,Modal,Typography ,Popconfirm } from 'antd'; +import { DeleteOutlined,FileWordOutlined,FilePdfOutlined,FileZipOutlined,FileExcelOutlined,VideoCameraOutlined } from '@ant-design/icons'; +import { formItemLayout, btnItemLayout } from '../../../../components/crud/FormLayoutProps'; + +import apiurl from '../../../../service/apiurl'; + +import NormalSelect from '../../../../components/Form/NormalSelect'; + +import "./index.less" +import moment from 'moment'; +const { RangePicker } = DatePicker +const { Dragger } = Upload; +const url = "http://223.75.53.141:9102/test.by-lyf.tmp" + + +const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave,submit }) => { +console.log(record); + + const [form] = Form.useForm(); + const [imgfileList, setImgFileList] = useState([]) //上传文件列表 + const [videoFileList, setVideoFileList] = useState([]) //上传文件列表 + const [handleImgfileList, setHandleImgFileList] = useState([]) //上传文件列表 + const [handleVideoFileList, setHandleVideoFileList] = useState([]) //上传文件列表 + const [videoOpen, setVideoOpen] = useState(false) + const [videoParams, setVideoParams] = useState({}) + + const onfinish = (values) => { + if (mode === 'edit') { + values.id = record.id; + onEdit(apiurl.rcgl.xcxj.xjrw.edit,values) + } + if (mode === 'save') { + onSave(apiurl.rcgl.xcxj.xjrw.save,values) + } + } + const handleFile = (arr=[]) => { + const newArr = arr?.map(item => ({ + name: item.fileName, + response: { + data: { + filePath: item.filePath, + fileId:item.fileId + } + }, + })) + return newArr + } + useEffect(() => { + if (mode != 'save') { + // const imgFile = record?.inspectPics?.map(o => ({ + // name: o.fileName, + // response: { + // data: { + // filePath: o.filePath, + // fileId:o.fileId + // } + // }, + // })) + const imgFile = handleFile(record?.inspectPics); + const videoFile = handleFile(record?.inspectVideos); + const handleImgFile = handleFile(record?.handlePics); + const hanldeVideoFile = handleFile(record?.handleVideos); + setImgFileList(imgFile) + setVideoFileList(videoFile) + setHandleImgFileList(handleImgFile) + setHandleVideoFileList(hanldeVideoFile) + form.setFieldsValue({ + ...record, + handleTime: record.handleTime ? moment(record.handleTime) : '', + finishTime: record.finishTime? moment(record.finishTime) : '' + }) + } + }, [record, mode]) + + + + return ( +
+
+ 巡检信息
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + imgfileList.length > 0 && imgfileList.map(file => { + return ( + +
+
+ + {file.name} +
+
+ + ) + }) + } + + + + + + + + + { + videoFileList.length > 0 && videoFileList.map(file => { + return ( + +
+
+
{ setVideoOpen(true); setVideoParams(file)}} + style={{ cursor: 'pointer' }} + > + +
+ {file.name} +
+
+ + ) + }) + } + + + + +
+ 处理信息
+ + + + + + + { + (record?.isHandle || record?.isHandle == 0) ? + + + + + : null + } + + { + record?.isHandle ? + <> + + + + + + + + + + + + + + + + + + + { + handleImgfileList.length > 0 && handleImgfileList.map(file => { + return ( + +
+
+ + {file.name} +
+
+ + ) + }) + } + + + + + + + + + { + handleVideoFileList.length > 0 && handleVideoFileList.map(file => { + return ( + +
+
+
{ setVideoOpen(true); setVideoParams(file)}} + style={{ cursor: 'pointer' }} + > + +
+ {file.name} +
+
+ + ) + }) + } + + + + + : null + } + + + + + setVideoOpen(false)} + > + + + ); +} + +export default ModalForm; diff --git a/src/views/Gcyx/xcxj/xjwtcl/index.js b/src/views/Gcyx/xcxj/xjwtcl/index.js new file mode 100644 index 0000000..226a929 --- /dev/null +++ b/src/views/Gcyx/xcxj/xjwtcl/index.js @@ -0,0 +1,197 @@ +import React, { Fragment, useRef, useMemo,useEffect,useState } from 'react'; +import BasicCrudModal from '../../../../components/crud/BasicCrudModal'; +import { Table, Card, Modal, Form, Input, Button, Row,Col, Timeline, message, Tabs,Image } from 'antd'; +import {FileWordOutlined,FilePdfOutlined,FileZipOutlined,FileExcelOutlined } from '@ant-design/icons'; +import { useSelector } from 'react-redux'; +import ToolBar from './toolbar'; +import ModalForm from './form'; +import apiurl from '../../../../service/apiurl'; +import usePageTable from '../../../../components/crud/usePageTable2'; +import { createCrudService } from '../../../../components/crud/_'; +import {CrudOpRender_text} from '../../../../components/crud/CrudOpRender'; + +const url = "http://223.75.53.141:9102/test.by-lyf.tmp" +const Page = () => { + const role = useSelector(state => state.auth.role); + const viewBtn = role?.rule?.find(item => item.menuName == "详情") || true; + const refModal = useRef(); + const [searchVal, setSearchVal] = useState(false) + const [tabs, setTabsChange] = useState(0) + const [imgVisible, setImgVisible] = useState(false) + const [imgList, setImgList] = useState([]) + const [videoOpen, setVideoOpen] = useState(false) + const [videoParams, setVideoParams] = useState({}) + const columns = [ + { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align: "center" }, + { title: '任务标题', key: 'taskTitle', dataIndex: 'taskTitle', width: 250, ellipsis: true }, + {title: '巡检点', key: 'name', dataIndex: 'name', width: 200}, + { + title: '巡查项', key: 'itemDesc', dataIndex: 'itemDesc', width: 200, + }, + {title: '巡查问题描述', key: 'problemDesc', dataIndex: 'problemDesc', width: 200}, + { + title: '巡查图片', key: 'inspectPics', dataIndex: 'inspectPics', width: 100, + render: (value) => + }, + { + title: '巡查视频', key: 'inspectVideos', dataIndex: 'inspectVideos', width: 100, + render: (value) => + }, + { + title: '处理状态', key: 'isHandle', dataIndex: 'isHandle', width: 200, align: 'center', + render: (value) => { value == 1 ? "已处理" : value == 0 ? "待处理" : ''} + }, + { title: '巡查人', key: 'inspectUserName', dataIndex: 'inspectUserName', width: 150 }, + { title: '巡查完成时间', key: 'finishTime', dataIndex: 'finishTime', width: 200 }, + + { + title: '操作', key: 'operation', width: 200, fixed: 'right',align: 'center', + render: (value, row, index) => ( + () => command(cmd)(row)} />) + }, + ]; + + + const width = useMemo(() => columns.reduce((total, cur) => total + (cur.width), 0), [columns]); + + const command = (type) => (params) => { + if (type === 'save') { + refModal.current.showSave(); + } else if (type === 'edit') { + refModal.current.showEdit({ ...params }); + } else if (type === 'view') { + refModal.current.showView(params); + } else if (type === 'del') { + refModal.current.onDeleteGet(apiurl.rcgl.xcxj.xjrw.delete + `/${params.id}`); + } + } + + + + const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.rcgl.xcxj.xjwtcl.page).find_noCode); + const { tableProps:tableProps0, search:search0 } = usePageTable(createCrudService(apiurl.rcgl.xcxj.xjwtcl.page).find_noCode); + const { tableProps:tableProps1, search:search1 } = usePageTable(createCrudService(apiurl.rcgl.xcxj.xjwtcl.page).find_noCode); + + const reviewPic = (arrPic) => { + if (arrPic.length > 0) { + setImgVisible(true) + setImgList(arrPic) + } + } + + const reviewVideo = (arrVideo) => { + if (arrVideo.length > 0) { + setVideoOpen(true) + setVideoParams(arrVideo[0]) + } + } + + useEffect(() => { + const userId = localStorage.getItem('userId') + if (searchVal) { + const params = { + search: { + ...searchVal, + isHandle: Number(tabs), + inspectUserId:userId + } + }; + search(params) + } + }, [searchVal,tabs]) + + useEffect(() => { + const userId = localStorage.getItem('userId') + if (searchVal) { + const params = { + search: { + ...searchVal, + isHandle: 0, + inspectUserId:userId + } + }; + search0(params) + } + }, [searchVal]) + useEffect(() => { + const userId = localStorage.getItem('userId') + if (searchVal) { + const params = { + search: { + ...searchVal, + isHandle: 1, + inspectUserId:userId + } + }; + search1(params) + } + }, [searchVal]) + + return ( + <> +
+
+ + + +
+ setTabsChange(e)} > + +
+ + +
+ + + + + + + +
+ setImgVisible(vis), + }} + > + { + imgList.length > 0 ? imgList.map(item => ( + + )) + : null + } + + + +
+ setVideoOpen(false)} + > + + + ); +} + +export default Page; diff --git a/src/views/Gcyx/xcxj/xjwtcl/index.less b/src/views/Gcyx/xcxj/xjwtcl/index.less new file mode 100644 index 0000000..e0bd728 --- /dev/null +++ b/src/views/Gcyx/xcxj/xjwtcl/index.less @@ -0,0 +1,30 @@ +.basic-info{ + position: relative; + font-size: 16px; + margin-bottom: 20px; + padding:5px 25px; + border-bottom: 1px solid #eee; + &::before{ + position: absolute; + top:8px; + left:0; + content: ""; + display: block; + width: 5px; + height: 20px; + background-color: #0079fe; + } +} +.time-line{ + width: 50%; + margin-left: 6%; + margin-top: 1%; + .time-line-item{ + display: flex; + // align-items: center; + column-gap: 20px; + .item-right{ + flex:1 + } + } +} \ No newline at end of file diff --git a/src/views/Gcyx/xcxj/xjwtcl/toolbar.js b/src/views/Gcyx/xcxj/xjwtcl/toolbar.js new file mode 100644 index 0000000..2892675 --- /dev/null +++ b/src/views/Gcyx/xcxj/xjwtcl/toolbar.js @@ -0,0 +1,53 @@ +import React, { useEffect,useState } from 'react'; +import { Form, Input, Button, DatePicker } from 'antd'; + +import moment from 'moment'; +import NormalSelect from '../../../../components/Form/NormalSelect'; +const { RangePicker } = DatePicker; +const ToolBar = ({ setSearchVal, onSave, storeData, role }) => { + const searchBtn = role?.rule?.find(item => item.menuName == "查询")||true; + const [form] = Form.useForm(); + + const onFinish = (values) => { + let dateTimeRangeSo; + if (values.tm) { + dateTimeRangeSo = { + start: moment(values.tm[0]).format('YYYY-MM-DD 00:00:00'), + end: moment(values.tm[1]).format('YYYY-MM-DD 23:59:59') + } + } + delete values.tm + setSearchVal({...values, dateTimeRangeSo}); + } + + useEffect(() => { + let dateTimeRangeSo = { + start: moment().subtract(1,"years").format('YYYY-MM-DD 00:00:00'), + end: moment().format('YYYY-MM-DD 23:59:59') + } + form.setFieldValue("tm", [moment(dateTimeRangeSo.start), moment(dateTimeRangeSo.end)]) + setSearchVal({ dateTimeRangeSo }) + }, []) + + return ( + <> +
+
+ + + + + {searchBtn ? + + : null } + +
+ + ); +} + +export default ToolBar; \ No newline at end of file diff --git a/src/views/Gcyx/xcxj/xjxpz/AdcdTreeSelector/index.less b/src/views/Gcyx/xcxj/xjxpz/AdcdTreeSelector/index.less new file mode 100644 index 0000000..ac6ad25 --- /dev/null +++ b/src/views/Gcyx/xcxj/xjxpz/AdcdTreeSelector/index.less @@ -0,0 +1,47 @@ +li.ant-tree-treenode-disabled > span:not(.ant-tree-switcher), +li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper, +li.ant-tree-treenode-disabled > .ant-tree-node-content-wrapper span{ + color: #000 !important; + font-weight: bold; +} + +.treeBox1{ + .ant-tree-node-content-wrapper{ + position: static !important; + } + .hover-ele{ + &:hover{ + color:#259dff + } + } +} +.AdcdTreeSelectorStyle{ + .ant-input-wrapper{ + + .ant-input-affix-wrapper{ + width: 98%; + } + .ant-input-group-addon{ + .ant-btn{ + width: 34px; + height: 34px; + } + } + } + + .treeTitle { + display: flex; + justify-content: space-between; + .treeBtn { + display: none; + } +} +.treeTitle:hover { + .treeBtn { + display: flex; + } +} +} +.no-matter{ + opacity: 0.5; +} \ No newline at end of file diff --git a/src/views/Gcyx/xcxj/xjxpz/AdcdTreeSelector/index.tsx b/src/views/Gcyx/xcxj/xjxpz/AdcdTreeSelector/index.tsx new file mode 100644 index 0000000..ba64933 --- /dev/null +++ b/src/views/Gcyx/xcxj/xjxpz/AdcdTreeSelector/index.tsx @@ -0,0 +1,313 @@ +import React, { useState, useEffect } from 'react'; +import { Tree, Input, Checkbox, Spin,Modal,Form,Col,Row,message,Space } from 'antd'; +import { EditOutlined,PlusCircleOutlined, DeleteOutlined,ExclamationCircleOutlined} from '@ant-design/icons'; +import './index.less'; +import { formItemLayout, btnItemLayout } from '../../../../../components/crud/FormLayoutProps'; +import { getXjTreeData } from '../../../../../service/warn'; +import apiurl from '../../../../../service/apiurl'; +import { httppost3,httpget6 } from '../../../../../utils/request'; + +const { Search } = Input; + +type IProps = { + onSelectFun?: any; + setAdcd?: any; + showCheckbox: any; + tableName?: any; + onChangeOpen?: any; + hasAlertBox?: boolean;//顶部是否有预警条 + isFetch?: boolean; +} +const { confirm } = Modal; +const AdcdTreeSelector: React.FC = ({ onSelectFun, setAdcd, showCheckbox, tableName, hasAlertBox }) => { + const [loading, setLoading] = useState(true); + const [treeData, setTreeData] = useState([]); + const [newTreeData, setNewTreeData] = useState([]); + const [isFiter, setIsFiter] = useState(false); + const [expandedKeys, setExpandedKeys] = useState([]); + const [checkedKeys, setCheckedKeys] = useState([]); + const [selectedKeys, setSelectedKeys] = useState([]); + const [selectedItem, setSelectedItem] = useState({}); + const [autoExpandParent, setAutoExpandParent] = useState(true); + const [treeBoxHeight, setTreeBoxHeight] = useState({}); + const [jdOpen, setJdOpen] = useState(false) + const [form] = Form.useForm(); + const [mode, setMode] = useState('') + const [itemDetail, setItemDetail] = useState({}) + const [orderMax, setOrderMax] = useState(0) + useEffect(() => { + getCustomerTreeData(); + }, []); + + useEffect(() => { + if(tableName){ + setSelectedKeys([]); + } + }, [tableName]); + + useEffect(()=>{ + //根据预警条计/多选框计算高度 + if(hasAlertBox){ + if(showCheckbox){ + setTreeBoxHeight({height:"calc( 100vh - 240px )"}) + }else{ + setTreeBoxHeight({height:"calc( 100vh - 210px )"}) + } + }else{ + if(showCheckbox){ + setTreeBoxHeight({height:"calc( 100vh - 224px )"}) + }else{ + setTreeBoxHeight({height:"calc( 100vh - 194px )"}) + } + } + },[hasAlertBox]) + + const getCustomerTreeData = async () => { + const adcdTreedata: any = await getXjTreeData(); + const item:any = adcdTreedata + if (item) { + setSelectedKeys([item[0]?.id]) + setAdcd(item[0]?.id) + } + if (adcdTreedata.length > 0) { + handelTreeData(adcdTreedata); + setTreeData(adcdTreedata); + setLoading(false); + setOrderMax(Math.max(...adcdTreedata.map((item:any) => item?.orderIndex))) + } else { + setLoading(false); + setTreeData([]); + } + }; + // @ts-ignore + const handelTreeData = (data) => { + if (data.length > 0) { + // @ts-ignore + data.forEach(item => { + item.title = item.name; + item.key = item.id; + if (item.children && item.children.length > 0) { + handelTreeData(item.children); + } + }); + } + } + + const onExpand = (expandedKeysValue:any) => { + setExpandedKeys(expandedKeysValue); + setAutoExpandParent(false); + }; + + + const onSelect = (selectedKeysValue:any, info:any) => { + setSelectedKeys(selectedKeysValue); + setSelectedItem(info); + + if (info.selectedNodes.length > 0) { + let selectData = info.selectedNodes[0]; + + let adcdVal = ""; + adcdVal = selectData.key; + + let params = { id: adcdVal }; + if(onSelectFun){ + onSelectFun(params); + } + if(setAdcd){ + setAdcd(adcdVal) + } + } else { + let params = { id: "" }; + if(onSelectFun){ + onSelectFun(params); + } + if(setAdcd){ + setAdcd("") + } + } + }; + + + + + + // 删除 + const deleteJd = (v: any) => { + confirm({ + title: '删除', + icon: , + content: '确认删除此数据', + okText: '确定', + okType: 'primary', + cancelText: '取消', + onOk: async() => { + try { + const res = await httpget6(apiurl.rcgl.xcxj.xjxpz.deleteTree + `/${v.id}`) + if (res.code === 200) { + message.success('删除成功'); + getCustomerTreeData(); + } + if (res.code === 400) { + message.error(res.description); + } + } catch (error) { + console.log(error); + } + }, + onCancel() { + console.log('Cancel'); + }, + }); + } + + // 新增节点 + const saveJd = (v: any) => { + if (v) { + // form.setFieldValue('name', v.title); + setItemDetail(v); + } + setJdOpen(true); + setMode("save"); + } + + // 编辑节点 + const editJd = (v: any) => { + setJdOpen(true); + form.setFieldsValue(v); + setMode("edit"); + setItemDetail(v); + } + + const onOk = async () => { + const name = form.getFieldValue('name'); + const url = mode == "save" ? apiurl.rcgl.xcxj.xjxpz.saveTree : apiurl.rcgl.xcxj.xjxpz.editTree; + let saveParams = { + name, + parentId: itemDetail?.id || undefined, + orderIndex:itemDetail?.orderIndex || orderMax + } + let editParams = { + ...itemDetail, + name + } + try { + const res = await httppost3(url, mode == "save" ? saveParams:editParams) + if (res.code == 200) { + message.success(mode == "save" ? '新增成功' : '编辑成功'); + setJdOpen(false); + getCustomerTreeData(); + form.resetFields(); + } else if (res.code == 400) { + message.error(res.description); + } + } catch (error) { + console.log(error); + + } + } + return ( +
+
新增巡检点
+ { + loading? +
+ +
:null + } + +
+
+ { + treeData.length > 0 && + { + return ( +
+ {v.title} + + {/* { + e.stopPropagation(); + saveJd(v); + }} + className='hover-ele' + /> */} + { + e.stopPropagation(); + editJd(v); + }} + className='hover-ele' + /> + { + e.stopPropagation(); + deleteJd(v); + }} + className='hover-ele' + /> + + +
+ ) + }} + /> + } +
+ +
+ { setJdOpen(false); form.resetFields()}} + onOk={onOk} + > +
+ +
+ + + + + + + + + ); +}; + +export default AdcdTreeSelector; diff --git a/src/views/Gcyx/xcxj/xjxpz/form.js b/src/views/Gcyx/xcxj/xjxpz/form.js new file mode 100644 index 0000000..48ca5bb --- /dev/null +++ b/src/views/Gcyx/xcxj/xjxpz/form.js @@ -0,0 +1,110 @@ +import React,{useEffect,useState,useMemo,useRef} from 'react'; +import { Form, Button, Input, Row,Upload, Col, TreeSelect, DatePicker, InputNumber,message,Image,Modal,Typography ,Popconfirm } from 'antd'; +import { DeleteOutlined,FileWordOutlined,FilePdfOutlined,FileZipOutlined,FileExcelOutlined } from '@ant-design/icons'; +import { formItemLayout, btnItemLayout } from '../../../../components/crud/FormLayoutProps'; +import { httpget2, httppost2,xyt_httpget2 } from '../../../../utils/request'; +import apiurl from '../../../../service/apiurl'; +import NormalSelect from '../../../../components/Form/NormalSelect'; +import "./index.less" +import moment from 'moment'; +const { RangePicker } = DatePicker +const { Dragger } = Upload; +const url = "http://223.75.53.141:9102/test.by-lyf.tmp" + + +const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => { + const [form] = Form.useForm(); + const onfinish = (values) => { + values.pointId = record.code; + if (mode === 'edit') { + values.id = record.id; + values.status = record.status; + onEdit(apiurl.rcgl.xcxj.xjxpz.edit,values) + } + if (mode === 'save') { + onSave(apiurl.rcgl.xcxj.xjxpz.save,values) + } + } + + + + + + + + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + mode==='view'?null:( + <> + + + + + ) + } + + + ); +} + +export default ModalForm; diff --git a/src/views/Gcyx/xcxj/xjxpz/index.js b/src/views/Gcyx/xcxj/xjxpz/index.js new file mode 100644 index 0000000..c31ff4d --- /dev/null +++ b/src/views/Gcyx/xcxj/xjxpz/index.js @@ -0,0 +1,141 @@ +import React, { Fragment, useRef, useMemo,useEffect,useState } from 'react'; +import BasicCrudModal from '../../../../components/crud/BasicCrudModal'; +import { Table, Card, Modal, Form, Input, Button, Row,Col, Timeline, message, Tabs,Image,Switch } from 'antd'; +import {FileWordOutlined,FilePdfOutlined,FileZipOutlined,FileExcelOutlined } from '@ant-design/icons'; +import { useSelector } from 'react-redux'; +import AdcdTreeSelector from "./AdcdTreeSelector"; +import ToolBar from './toolbar'; +import ModalForm from './form'; +import apiurl from '../../../../service/apiurl'; +import usePageTable from '../../../../components/crud/usePageTable2'; +import { createCrudService } from '../../../../components/crud/_'; +import {CrudOpRender_text} from '../../../../components/crud/CrudOpRender'; + +const url = "http://223.75.53.141:9102/test.by-lyf.tmp" +const Page = () => { + const role = useSelector(state => state.auth.role); + console.log(role); + + 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 checkType = { + 1: "低风险", + 2: "一般风险", + 3: "较大风险", + 4:"重大风险" + } + const risk = { + 1: "low", + 2: "yiban", + 3: "jiaoda", + 4:"zhongda" + } + const refModal = useRef(); + const columns = [ + { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align: "center" }, + {title: '巡检项描述', key: 'itemDesc', dataIndex: 'itemDesc', width: 240}, + { + title: '问题描述', key: 'problemDesc', dataIndex: 'problemDesc', width: 320,ellipsis:true}, + { + title: '处理建议', key: 'handleSuggestion', dataIndex: 'handleSuggestion', width: 200 }, + { + title: '排序号', key: 'orderIndex', dataIndex: 'orderIndex', width: 100, + }, + { + title: '是否启用', key: 'status', dataIndex: 'status', width: 200, + render: (v, r) => { + onEdit(apiurl.rcgl.xcxj.xjxpz.edit,{...r, status:e ? 0 : 1}) + }} /> + }, + { + title: '操作', key: 'operation', width: 200, fixed: 'right',align: 'center', + render: (value, row, index) => ( + () => command(cmd)(row)} />) + }, + ]; + const [code, setCode] = useState() + + + const width = useMemo(() => columns.reduce((total, cur) => total + (cur.width), 0), [columns]); + + + + const command = (type) => (params) => { + if (type === 'save') { + refModal.current.showSave({code}); + } else if (type === 'edit') { + refModal.current.showEdit({ ...params,code }); + } else if (type === 'view') { + refModal.current.showView(params); + } else if (type === 'del') { + refModal.current.onDeleteGet(apiurl.rcgl.xcxj.xjxpz.delete + `/${params.id}`); + } + } + + + + const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.rcgl.xcxj.xjxpz.page).find_noCode); + + const onEdit = (path,values) => { + createCrudService(path).edit(values).then((result) => { + if (result?.code === 200) { + refresh() + } + }) + } + useEffect(() => { + if (code) { + let params = { + search: { + menuId:code, + } + }; + search(params) + } + }, [code]); + + + return ( + <> +
+
+ +
+
+ + + + +
+ + + + + + + + ); +} + +export default Page; diff --git a/src/views/Gcyx/xcxj/xjxpz/index.less b/src/views/Gcyx/xcxj/xjxpz/index.less new file mode 100644 index 0000000..e0bd728 --- /dev/null +++ b/src/views/Gcyx/xcxj/xjxpz/index.less @@ -0,0 +1,30 @@ +.basic-info{ + position: relative; + font-size: 16px; + margin-bottom: 20px; + padding:5px 25px; + border-bottom: 1px solid #eee; + &::before{ + position: absolute; + top:8px; + left:0; + content: ""; + display: block; + width: 5px; + height: 20px; + background-color: #0079fe; + } +} +.time-line{ + width: 50%; + margin-left: 6%; + margin-top: 1%; + .time-line-item{ + display: flex; + // align-items: center; + column-gap: 20px; + .item-right{ + flex:1 + } + } +} \ No newline at end of file diff --git a/src/views/Gcyx/xcxj/xjxpz/toolbar.js b/src/views/Gcyx/xcxj/xjxpz/toolbar.js new file mode 100644 index 0000000..47e06bd --- /dev/null +++ b/src/views/Gcyx/xcxj/xjxpz/toolbar.js @@ -0,0 +1,43 @@ +import React, { useEffect,useState } from 'react'; +import { Form, Input, Button, DatePicker } from 'antd'; + +import moment from 'moment'; +const { RangePicker } = DatePicker; +const ToolBar = ({ setSearchVal, onSave, storeData, role }) => { + console.log("role",role); + + const addBtn = role?.rule?.find(item => item.menuName == "新增"); + const [form] = Form.useForm(); + + const onFinish = (values) => { + let dateSo; + if (values.tm) { + dateSo = { + start: moment(values.tm[0]).format('YYYY-MM-DD 00:00:00'), + end: moment(values.tm[1]).format('YYYY-MM-DD 00:00:00') + } + } + delete values.tm + setSearchVal({...values, dateSo}); + } + + + + return ( + <> +
+
+ { + (onSave) ? + + + + :null + } + +
+ + ); +} + +export default ToolBar; \ No newline at end of file diff --git a/src/views/SafeWatch/SlWatch/index.js b/src/views/SafeWatch/SlWatch/index.js new file mode 100644 index 0000000..b91a919 --- /dev/null +++ b/src/views/SafeWatch/SlWatch/index.js @@ -0,0 +1,72 @@ +import React, { Fragment, useRef, useMemo,useEffect,useState } from 'react'; +import BasicCrudModal from '../../../components/crud/BasicCrudModal'; +import { Table, Card, Modal, Form, Input, Button, Row,Col, Timeline, message, Tabs,Image } from 'antd'; +import ToolBar from './toolbar'; +import apiurl from '../../../service/apiurl'; +import usePageTable from '../../../components/crud/usePageTable2'; +import { createCrudService } from '../../../components/crud/_'; +import { httppost5 } from '../../../utils/request'; +import { exportFile } from '../../../utils/tools.js'; +const Page = () => { + const types = { + 0: "设备维修", + 1: '设备更换', + 2:"结构加固" + } + const [searchVal, setSearchVal] = useState(false) + const columns = [ + { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" }, + { title: '监测断面', key: 'projectName', dataIndex: 'projectName', width: 150}, + { title: '测点编号', key: 'projectAddr', dataIndex: 'projectAddr', width: 150}, + { title: '测压管水位(m)', key: 'projectAddr', dataIndex: 'projectAddr', width: 150}, + { title: '渗压(KPa)', key: 'projectAddr', dataIndex: 'projectAddr', width: 150}, + { title: '振弦(Hz)', key: 'projectAddr', dataIndex: 'projectAddr', width: 150}, + { title: '温度(℃)', key: 'projectAddr', dataIndex: 'projectAddr', width: 150}, + { + title: '监测时间', key: 'createTime', dataIndex: 'createTime', width: 140, + }, + + ]; + const width = useMemo(() => columns.reduce((total, cur) => total + (cur.width), 0), [columns]); + const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.sbwh.whfabz.page).find_noCode); + + // 导出 + const exportExcel = () => { + let params = { + ...searchVal, + } + httppost5(apiurl.sbwh.cgtzgl.export, params).then(res => { + exportFile(`渗流监测.xlsx`,res.data) + }) + } + + useEffect(()=>{ + const params = { + search: { + ...searchVal, + } + }; + search(params) + }, [searchVal]) + + + return ( + <> +
+
+ + + +
+
+ + + + + ); +} + +export default Page; diff --git a/src/views/SafeWatch/SlWatch/toolbar.js b/src/views/SafeWatch/SlWatch/toolbar.js new file mode 100644 index 0000000..801fffe --- /dev/null +++ b/src/views/SafeWatch/SlWatch/toolbar.js @@ -0,0 +1,71 @@ +import React, { useEffect, useState } from 'react'; +import { Form, Input, Button, DatePicker } from 'antd'; +import NormalSelect from '../../../components/Form/NormalSelect'; + +import moment from 'moment'; +const { RangePicker } = DatePicker; +const ToolBar = ({ setSearchVal, exportFile1, storeData, role }) => { + + const types = [ + { + label: "设备维修", + value: 0 + }, + { + label: "设备更换", + value: 1 + }, { + label: "结构加固", + value: 2 + }, + ] + const [form] = Form.useForm(); + + const onFinish = (values) => { + let dateTimeRangeSo; + if (values.tm) { + dateTimeRangeSo = { + start: moment(values.tm[0]).format('YYYY-MM-DD HH:mm:ss'), + end: moment(values.tm[1]).format('YYYY-MM-DD HH:mm:ss') + } + } + delete values.tm + setSearchVal({ ...values, dateTimeRangeSo }); + } + + + return ( + <> +
+
+ + + + + + + + + + + + + + + + + + + + +
+ + ); +} + +export default ToolBar; \ No newline at end of file diff --git a/src/views/SafeWatch/TransformWatch/form.js b/src/views/SafeWatch/TransformWatch/form.js new file mode 100644 index 0000000..c9e8c2d --- /dev/null +++ b/src/views/SafeWatch/TransformWatch/form.js @@ -0,0 +1,97 @@ +import React, { useEffect, useState, useMemo, useRef } from 'react'; +import { Form, Button, Input, Row, Upload, Col, Table, DatePicker, InputNumber, message, Image, Modal, Typography, Popconfirm } from 'antd'; +import { formItemLayout, btnItemLayout } from '../../../components/crud/FormLayoutProps'; +import apiurl from '../../../service/apiurl'; +import "./index.less" +import moment from 'moment'; +const { RangePicker } = DatePicker + +const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => { + const [form] = Form.useForm(); + const onfinish = (values) => { + values.tm = values.tm ? moment(values.tm).format('YYYY-MM-DD 00:00:00') : undefined + if (mode === 'edit') { + onEdit(apiurl.aqjc.bxjc.wyedit, { ...record, ...values }) + } + if (mode === 'save') { + onSave(apiurl.aqjc.bxjc.wysave, values) + } + } + + + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + dateString} + getValueProps={(value) => ({ value: value ? moment(value) : undefined })} + > + + + + + { + mode === 'view' ? null : ( + <> + + + + + ) + } + + + + ); +} + +export default ModalForm; diff --git a/src/views/SafeWatch/TransformWatch/index.js b/src/views/SafeWatch/TransformWatch/index.js new file mode 100644 index 0000000..6cb9836 --- /dev/null +++ b/src/views/SafeWatch/TransformWatch/index.js @@ -0,0 +1,143 @@ +import React, { Fragment, useRef, useMemo, useEffect, useState } from 'react'; +import BasicCrudModal from '../../../components/crud/BasicCrudModal'; +import { Table, Card, Modal, Form, Input, Button, Row, Col, Timeline, message, Tabs, Image } from 'antd'; +import ToolBar from './toolbar'; +import ModalForm from './form'; +import apiurl from '../../../service/apiurl'; +import usePageTable from '../../../components/crud/usePageTable2'; +import { createCrudService } from '../../../components/crud/_'; +import { CrudOpRender_text } from '../../../components/crud/CrudOpRender'; +import { httppost5 } from '../../../utils/request'; +import { exportFile } from '../../../utils/tools.js'; + +const Page = () => { + const types = { + 0: "设备维修", + 1: '设备更换', + 2: "结构加固" + } + const refModal = useRef(); + const [searchVal, setSearchVal] = useState(false) + const [tabsActive, setTabsActive] = useState("1") + + const wColumns = [ + { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align: "center" }, + { title: '监测点', key: 'stationCode', dataIndex: 'stationCode', width: 150}, + { title: 'X方向位移(mm)', key: 'x', dataIndex: 'x', width: 150}, + { title: 'Y方向位移(mm)', key: 'y', dataIndex: 'y', width: 150 }, + { title: 'H方向位移(mm)', key: 'h', dataIndex: 'h', width: 150 }, + { + title: '上报时间', key: 'tm', dataIndex: 'tm', width: 140, + }, + { + title: '操作', key: 'operation', width: 200, fixed: 'right', align: 'center', + render: (value, row, index) => ( + () => command(cmd)(row)} />) + }, + ]; + const jColumns = [ + { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align: "center" }, + { title: '监测点', key: 'stationCode', dataIndex: 'stationCode', width: 150}, + { title: '缝开度(mm)', key: 'createUserName', dataIndex: 'createUserName', width: 150 }, + { + title: '监测时间', key: 'tm', dataIndex: 'tm', width: 140, + }, + ]; + const columns = useMemo(() => { + return tabsActive == '1' ? wColumns : jColumns + },[tabsActive]) + + const width = useMemo(() => columns.reduce((total, cur) => total + (cur.width), 0), [columns]); + + const command = (type) => (params) => { + if (type === 'save') { + refModal.current.showSave(); + } else if (type === 'edit') { + refModal.current.showEdit({ ...params }); + } else if (type === 'view') { + refModal.current.showView(params); + } else if (type === 'del') { + refModal.current.onDeleteGet(apiurl.aqjc.bxjc.wydelete + `/${params.id}`); + } + } + + + + const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.aqjc.bxjc.wypage).find_noCode); + + /** + * @description 处理成功的回调 + */ + const successCallback = () => { + refresh() + } + + + // 导出 + const exportExcel = () => { + let params = { + ...searchVal, + } + httppost5(apiurl.aqjc.bxjc.wyexport, params).then(res => { + exportFile(`${tabsActive == '1' ? '水平位移':'结构缝开度'}.xlsx`,res.data) + }) + } + useEffect(() => { + const params = { + search: { + ...searchVal, + } + }; + search(params) + }, [searchVal]) + + + return ( + <> +
+ {setTabsActive(e) }} + items={[ + { + label: '水平位移', + key: '1', + }, + { + label: '结构缝开度', + key: '2', + + } + ]} + /> +
+ + + +
+
+ + + + + + + ); +} + +export default Page; diff --git a/src/views/SafeWatch/TransformWatch/index.less b/src/views/SafeWatch/TransformWatch/index.less new file mode 100644 index 0000000..e69de29 diff --git a/src/views/SafeWatch/TransformWatch/toolbar.js b/src/views/SafeWatch/TransformWatch/toolbar.js new file mode 100644 index 0000000..d0af804 --- /dev/null +++ b/src/views/SafeWatch/TransformWatch/toolbar.js @@ -0,0 +1,60 @@ +import React, { useEffect, useState } from 'react'; +import { Form, Input, Button, DatePicker } from 'antd'; +import NormalSelect from '../../../components/Form/NormalSelect'; + +import moment from 'moment'; +const { RangePicker } = DatePicker; +const ToolBar = ({ setSearchVal, onSave, tabsActive, exportFile1 }) => { + const [form] = Form.useForm(); + const onFinish = (values) => { + let dateTimeRangeSo; + if (values.tm) { + dateTimeRangeSo = { + start: moment(values.tm[0]).format('YYYY-MM-DD HH:mm:ss'), + end: moment(values.tm[1]).format('YYYY-MM-DD HH:mm:ss') + } + } + delete values.tm + setSearchVal({ ...values, dateTimeRangeSo }); + } + + + return ( + <> +
+
+ + + + + + + + + + + + + + + + + { + (onSave && tabsActive == '1') ? + + + + : null + } + +
+ + ); +} + +export default ToolBar; \ No newline at end of file diff --git a/src/views/SafeWatch/WarnRecord/index.js b/src/views/SafeWatch/WarnRecord/index.js new file mode 100644 index 0000000..4e2da78 --- /dev/null +++ b/src/views/SafeWatch/WarnRecord/index.js @@ -0,0 +1,83 @@ +import React, { Fragment, useRef, useMemo,useEffect,useState } from 'react'; +import BasicCrudModal from '../../../components/crud/BasicCrudModal'; +import { Table, Card, Modal, Form, Input, Button, Row,Col, Timeline, message, Tabs,Image } from 'antd'; +import ToolBar from './toolbar'; +import apiurl from '../../../service/apiurl'; +import usePageTable from '../../../components/crud/usePageTable2'; +import { createCrudService } from '../../../components/crud/_'; +import { httppost5 } from '../../../utils/request'; +import { exportFile } from '../../../utils/tools.js'; +const Page = () => { + const types = { + 0: "水平位移", + 1: '结构缝开度', + 2: "渗流监测", + 3:'环境量监测' + } + const statusTypes = { + 0: "报警中", + 1: '已解除', + } + const [searchVal, setSearchVal] = useState(false) + const columns = [ + { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" }, + { + title: '监测类型', key: 'projectName', dataIndex: 'projectName', width: 150, + render: (v) => {types[v]} + }, + { title: '监测点', key: 'projectAddr', dataIndex: 'projectAddr', width: 150}, + { title: '监测值', key: 'projectAddr', dataIndex: 'projectAddr', width: 150}, + { + title: '状态', key: 'projectAddr', dataIndex: 'projectAddr', width: 150, + render: (v) => {statusTypes[v]} + }, + { title: '预警依据', key: 'projectAddr', dataIndex: 'projectAddr', width: 250}, + { title: '预警时间', key: 'projectAddr', dataIndex: 'projectAddr', width: 150}, + { + title: '持续时长', key: 'createTime', dataIndex: 'createTime', width: 150, + }, + + ]; + const width = useMemo(() => columns.reduce((total, cur) => total + (cur.width), 0), [columns]); + const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.sbwh.whfabz.page).find_noCode); + + // 导出 + const exportExcel = () => { + let params = { + ...searchVal, + } + httppost5(apiurl.sbwh.cgtzgl.export, params).then(res => { + exportFile(`渗流监测.xlsx`,res.data) + }) + } + + useEffect(()=>{ + const params = { + search: { + ...searchVal, + } + }; + search(params) + }, [searchVal]) + + + return ( + <> +
+
+ + + +
+
+ + + + + ); +} + +export default Page; diff --git a/src/views/SafeWatch/WarnRecord/toolbar.js b/src/views/SafeWatch/WarnRecord/toolbar.js new file mode 100644 index 0000000..286f41d --- /dev/null +++ b/src/views/SafeWatch/WarnRecord/toolbar.js @@ -0,0 +1,88 @@ +import React, { useEffect, useState } from 'react'; +import { Form, Input, Button, DatePicker } from 'antd'; +import NormalSelect from '../../../components/Form/NormalSelect'; + +import moment from 'moment'; +const { RangePicker } = DatePicker; +const ToolBar = ({ setSearchVal, exportFile1, storeData, role }) => { + + const types = [ + { + label: "水平位移", + value: 0 + }, + { + label: "结构缝开度", + value: 1 + }, + { + label: "渗流监测", + value: 2 + }, + { + label: "环境量监测", + value: 3 + } + ] + + const typeStatus = [ + { + label: "报警中", + value: 0 + }, + { + label: "已解除", + value: 1 + }, + + ] + const [form] = Form.useForm(); + + const onFinish = (values) => { + let dateTimeRangeSo; + if (values.tm) { + dateTimeRangeSo = { + start: moment(values.tm[0]).format('YYYY-MM-DD HH:mm:ss'), + end: moment(values.tm[1]).format('YYYY-MM-DD HH:mm:ss') + } + } + delete values.tm + setSearchVal({ ...values, dateTimeRangeSo }); + } + + + return ( + <> +
+
+ + + + + + + + + + + + + + + + + + + + +
+ + ); +} + +export default ToolBar; \ No newline at end of file diff --git a/src/views/SafeWatch/WarnRuleConfig/form.js b/src/views/SafeWatch/WarnRuleConfig/form.js new file mode 100644 index 0000000..0bf6a8c --- /dev/null +++ b/src/views/SafeWatch/WarnRuleConfig/form.js @@ -0,0 +1,106 @@ +import React,{useEffect,useState,useMemo,useRef} from 'react'; +import { Form, Button, Input, Row,Upload, Col, Table, DatePicker, InputNumber,message,Image,Modal,Typography ,Popconfirm } from 'antd'; +import { formItemLayout, btnItemLayout } from '../../../components/crud/FormLayoutProps'; +import apiurl from '../../../service/apiurl'; +import NormalSelect from '../../../components/Form/NormalSelect'; +import moment from 'moment'; +const { RangePicker } = DatePicker +const url = "http://223.75.53.141:9102/test.by-lyf.tmp" + +const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => { + const types = [ + { + label: "闸后流量", + value: 0, + }, + { + label: "雨量", + value: 1, + }, + { + label: "闸前水位", + value:2, + }, + { + label: "闸后水位", + value: 3, + }, + + ] + const [form] = Form.useForm(); + const onfinish = (values) => { + values.eventsDate = values.eventsDate?moment(values.eventsDate).format("YYYY-MM-DD 00:00:00"):'' + if (mode === 'edit') { + onEdit(apiurl.jcsj.bjgl.bjgzpz.edit,{...record,...values}) + } + if (mode === 'save') { + onSave(apiurl.jcsj.bjgl.bjgzpz.save,values) + } + } + + return ( + <> + + + + + + + + + + + + + + + + + + + + + + + + + + + { + mode==='view'?null:( + <> + + + + + ) + } + + + + ); +} + +export default ModalForm; diff --git a/src/views/SafeWatch/WarnRuleConfig/index.js b/src/views/SafeWatch/WarnRuleConfig/index.js new file mode 100644 index 0000000..1fdea86 --- /dev/null +++ b/src/views/SafeWatch/WarnRuleConfig/index.js @@ -0,0 +1,128 @@ +import React, { Fragment, useRef, useMemo,useEffect,useState } from 'react'; +import BasicCrudModal from '../../../components/crud/BasicCrudModal'; +import { Table, Card, Modal, Form, Input, Button, Row,Col, Timeline, message, Tabs,Image } from 'antd'; +import ToolBar from './toolbar'; +import ModalForm from './form'; +import apiurl from '../../../service/apiurl'; +import usePageTable from '../../../components/crud/usePageTable2'; +import { createCrudService } from '../../../components/crud/_'; +import {CrudOpRender_text} from '../../../components/crud/CrudOpRender'; +import { httppost2 } from '../../../utils/request'; + +const url = "http://223.75.53.141:9102/test.by-lyf.tmp" +const Page = () => { + const types = { + 0: "闸后流量", + 1: '雨量', + 2: "闸前水位", + 3:'闸后水位' + } + const refModal = useRef(); + const [searchVal, setSearchVal] = useState(false) + const columns = [ + { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" }, + + { + title: '监测点', key: 'type', dataIndex: 'type', width: 150, + render: (v) => {types[v]} + }, + { title: '阈值下限', key: 'upperLimit', dataIndex: 'upperLimit', width: 150}, + { title: '阈值上限', key: 'lowerLimit ', dataIndex: 'lowerLimit', width: 150}, + { + title: '是否启用', key: 'status', dataIndex: 'status', width: 150, + render: (v) => { v == 1 ? '否': v==0?'是':''} + }, + { + title: '配置时间', key: 'createTime', dataIndex: 'createTime', width: 150, + }, + { + title: '最近报警时间', key: 'eventsDate', dataIndex: 'eventsDate', width: 140, + }, + { + title: '操作', key: 'operation', width: 200, fixed: 'right',align: 'center', + render: (value, row, index) => ( + () => command(cmd)(row)} />) + }, + ]; + + + const width = useMemo(() => columns.reduce((total, cur) => total + (cur.width), 0), [columns]); + + const stopStatus = async (params) => { + try { + const res = await httppost2(apiurl.jcsj.bjgl.bjgzpz.stop, params) + if (res.code == 200) { + message.success(`${params.status ? '停用':'启用'}成功`) + refresh() + } + } catch (error) { + console.log(error); + } + } + const command = (type) => (params) => { + if (type === 'save') { + refModal.current.showSave(); + } else if (type === 'edit') { + refModal.current.showEdit({ ...params }); + } else if (type === 'view') { + refModal.current.showView(params); + } else if (type === 'del') { + refModal.current.onDeleteGet(apiurl.jcsj.bjgl.bjgzpz.delete + `/${params.id}`); + } else if (type == 'status') { + stopStatus({ id: params.id, status: params.status == 1 ? 0 : params.status == 0 ? 1 : ''}) + } + } + + + + const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.jcsj.bjgl.bjgzpz.page).find_noCode); + + /** + * @description 处理成功的回调 + */ + const successCallback = () => { + refresh() +} + + useEffect(()=>{ + const params = { + search: { + ...searchVal, + } + }; + search(params) + }, [searchVal]) + + + return ( + <> +
+
+ + + +
+
+ + + + + + + ); +} + +export default Page; diff --git a/src/views/SafeWatch/WarnRuleConfig/toolbar.js b/src/views/SafeWatch/WarnRuleConfig/toolbar.js new file mode 100644 index 0000000..e446de7 --- /dev/null +++ b/src/views/SafeWatch/WarnRuleConfig/toolbar.js @@ -0,0 +1,61 @@ +import React, { useEffect,useState } from 'react'; +import { Form, Input, Button, DatePicker } from 'antd'; +import NormalSelect from '../../../components/Form/NormalSelect'; + +import moment from 'moment'; +const { RangePicker } = DatePicker; +const ToolBar = ({ setSearchVal, onSave, storeData, role }) => { + + const types = [ + { + label: "闸后流量", + value: 0, + }, + { + label: "雨量", + value: 1, + }, + { + label: "闸前水位", + value: 2, + }, + { + label: "闸后水位", + value: 3, + }, + ] + const [form] = Form.useForm(); + + const onFinish = (values) => { + setSearchVal({...values}); + } + + + return ( + <> +
+
+ + + + + + + + + + + { + (onSave) ? + + + + :null + } + +
+ + ); +} + +export default ToolBar; \ No newline at end of file diff --git a/src/views/Sbwh/Zhfxkh/form.js b/src/views/Sbwh/Zhfxkh/form.js new file mode 100644 index 0000000..3e8717f --- /dev/null +++ b/src/views/Sbwh/Zhfxkh/form.js @@ -0,0 +1,173 @@ +import React,{useEffect,useState,useMemo,useRef} from 'react'; +import { Form, Button, Input, Row,Upload, Col, Table, DatePicker, InputNumber,message,Image,Modal,Typography ,Popconfirm } from 'antd'; +import { DeleteOutlined,FileWordOutlined,FilePdfOutlined,FileZipOutlined,FileExcelOutlined } from '@ant-design/icons'; +import { formItemLayout, btnItemLayout } from '../../../components/crud/FormLayoutProps'; +import {getCurrentQuarter,getQuarterStartEndDates} from "../../../utils/tools" +import apiurl from '../../../service/apiurl'; +import NormalSelect from '../../../components/Form/NormalSelect'; +import "./index.less" +import moment from 'moment'; +const { RangePicker } = DatePicker +const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => { + const types = [ + { + label: "年度", + value: 1 + }, + { + label: "季度", + value: 2 + },{ + label: "月度", + value: 3 + }, + ] + const [form] = Form.useForm(); + const [taskType, setTaskType] = useState(2) + const onfinish = (values) => { + const userId = localStorage.getItem('userId') + const userName = localStorage.getItem('userName') + values.createUserId = userId; + values.createUserName = userName; + values.startDate =values.dateRangeSo? moment(values.dateRangeSo[0]).format("YYYY-MM-DD 00:00:00") :''; + values.endDate = values.dateRangeSo ? moment(values.dateRangeSo[1]).format("YYYY-MM-DD 23:59:59") : ''; + if (mode === 'edit') { + onEdit(apiurl.sbwh.zhfxkh.edit,{...record,...values}) + } + if (mode === 'save') { + onSave(apiurl.sbwh.zhfxkh.save,values) + } + } + + const onvaluesChange = (changedValues) => { + if ("assessFreq" in changedValues) { + setTaskType(changedValues["assessFreq"]); + } + } + + useEffect(() => { + if (mode != 'save') { + let dataSo = record.startDate && record.endDate ? + [moment(record.startDate), moment(record.startDate)] : '' + form.setFieldValue("dateRangeSo", dataSo) + }else{ + form.setFieldValue("assessFreq", 2) + } + }, [record,mode]) + + + useEffect(() => { + if (mode == "save") { + if (taskType == 2) { + const { startDate, endDate } = getQuarterStartEndDates(getCurrentQuarter('').value, moment().year()); + form.setFieldValue("assessBatch", moment()) + form.setFieldValue("dateRangeSo",[moment(startDate), moment(endDate)]) + } else if (taskType == 1) { + form.setFieldValue("assessBatch", moment()) + form.setFieldValue("dateRangeSo",[moment().startOf('year'), moment().endOf('year')]) + } else { + form.setFieldValue("assessBatch", moment().format('YYYY-MM-DD')) + form.setFieldValue("dateRangeSo",[moment().startOf('month'), moment().endOf('month')]) + } + } + }, [taskType,mode]) + return ( + <> +
+ +
+ + + + + + + + + + + + + + dateString} + getValueProps={(value) => ({ value: value ? moment(value) : undefined })} + rules={[ + { + required: true, + }, + ]} + > + + + + + dateString} + getValueProps={(value) => { + return { + value: value ? [value[0]&&moment(value[0]),value[1]&&moment(value[1])] : undefined + }; + }} + > + + + + + + + + + + + + { + mode==='view'?null:( + <> + + + + + ) + } + + + + ); +} + +export default ModalForm; diff --git a/src/views/Sbwh/Zhfxkh/index.js b/src/views/Sbwh/Zhfxkh/index.js new file mode 100644 index 0000000..0904f11 --- /dev/null +++ b/src/views/Sbwh/Zhfxkh/index.js @@ -0,0 +1,113 @@ +import React, { Fragment, useRef, useMemo,useEffect,useState } from 'react'; +import BasicCrudModal from '../../../components/crud/BasicCrudModal'; +import { Table, Card, Modal, Form, Input, Button, Row,Col, Timeline, message, Tabs,Image } from 'antd'; +import ToolBar from './toolbar'; +import ModalForm from './form'; +import apiurl from '../../../service/apiurl'; +import usePageTable from '../../../components/crud/usePageTable2'; +import { createCrudService } from '../../../components/crud/_'; +import {CrudOpRender_text} from '../../../components/crud/CrudOpRender'; + +const url = "http://223.75.53.141:9102/test.by-lyf.tmp" +const Page = () => { + const types = { + 1: '年度', + 2: "季度", + 3:'月度' + } + const refModal = useRef(); + const [searchVal, setSearchVal] = useState(false) + const columns = [ + { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" }, + { title: '考核对象', key: 'objectName', dataIndex: 'objectName', width: 150}, + { + title: '考核频次', key: 'assessFreq', dataIndex: 'assessFreq', width: 140, + render: (value) => {types[value]}, + }, + // { title: '考核批次', key: 'assessBatch', dataIndex: 'assessBatch', width: 140}, + { + title: '考核周期', key: 'zq', dataIndex: 'zq', width: 230, + render: (_,r) => {r.startDate && r.endDate ? `${r.startDate} - ${r.endDate}` : ''} + }, + { title: '考核分数', key: 'assessScore', dataIndex: 'assessScore', width: 140}, + { + title: '创建时间', key: 'createTime', dataIndex: 'createTime', width: 140, + }, + { + title: '考核创建人', key: 'createUserName', dataIndex: 'createUserName', width: 140, + }, + { + title: '操作', key: 'operation', width: 200, fixed: 'right',align: 'center', + render: (value, row, index) => ( + () => command(cmd)(row)} />) + }, + ]; + + + const width = useMemo(() => columns.reduce((total, cur) => total + (cur.width), 0), [columns]); + + const command = (type) => (params) => { + if (type === 'save') { + refModal.current.showSave(); + } else if (type === 'edit') { + refModal.current.showEdit({ ...params }); + } else if (type === 'view') { + refModal.current.showView(params); + } else if (type === 'del') { + refModal.current.onDeleteGet(apiurl.sbwh.zhfxkh.delete + `/${params.id}`); + } + } + + + + const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.sbwh.zhfxkh.page).find_noCode); + + /** + * @description 处理成功的回调 + */ + const successCallback = () => { + refresh() +} + + useEffect(()=>{ + const params = { + search: { + ...searchVal, + } + }; + search(params) + }, [searchVal]) + + + return ( + <> +
+
+ + + +
+
+ + + + + + + ); +} + +export default Page; diff --git a/src/views/Sbwh/Zhfxkh/index.less b/src/views/Sbwh/Zhfxkh/index.less new file mode 100644 index 0000000..e69de29 diff --git a/src/views/Sbwh/Zhfxkh/toolbar.js b/src/views/Sbwh/Zhfxkh/toolbar.js new file mode 100644 index 0000000..2599954 --- /dev/null +++ b/src/views/Sbwh/Zhfxkh/toolbar.js @@ -0,0 +1,67 @@ +import React, { useEffect,useState } from 'react'; +import { Form, Input, Button, DatePicker } from 'antd'; +import NormalSelect from '../../../components/Form/NormalSelect'; + +import moment from 'moment'; +const { RangePicker } = DatePicker; +const ToolBar = ({ setSearchVal, onSave, storeData, role }) => { + + const types = [ + { + label: "年度", + value: 1 + }, + { + label: "季度", + value: 2 + },{ + label: "月度", + value: 3 + }, + ] + const [form] = Form.useForm(); + + const onFinish = (values) => { + let dateTimeRangeSo; + if (values.tm) { + dateTimeRangeSo = { + start: moment(values.tm[0]).format('YYYY-MM-DD HH:mm:ss'), + end: moment(values.tm[1]).format('YYYY-MM-DD HH:mm:ss') + } + } + delete values.tm + setSearchVal({...values, dateTimeRangeSo}); + } + + + return ( + <> +
+
+ + + + + + + + + + + + + + { + (onSave) ? + + + + :null + } + +
+ + ); +} + +export default ToolBar; \ No newline at end of file diff --git a/src/views/WatchData/Jcsj/index.js b/src/views/WatchData/Jcsj/index.js index 692d518..98d5efe 100644 --- a/src/views/WatchData/Jcsj/index.js +++ b/src/views/WatchData/Jcsj/index.js @@ -158,12 +158,17 @@ const Page = () => {
-
+ +
+ { + historyList.length > 0 ? + /> : +
+ }
diff --git a/src/views/WatchData/Jcsj/options.js b/src/views/WatchData/Jcsj/options.js index 0cc7ad1..caa5c8a 100644 --- a/src/views/WatchData/Jcsj/options.js +++ b/src/views/WatchData/Jcsj/options.js @@ -3,6 +3,8 @@ export default function options(data = []) { const maxY = Math.ceil(Math.max(...data?.map(s => s.val))) const minY = Math.floor(Math.min(...data?.map(s => s.val))) + const type = data[0]?.type + const unit = type == 0 ? 'm³/s' : type == 3 ? 'mm' : 'm' return { tooltip: { trigger: "axis", @@ -40,7 +42,7 @@ export default function options(data = []) { }, axisLabel: { color: "#7a869a", - formatter: '{value} m³/s' + formatter: `{value} ${unit}` }, axisTick: { show: false diff --git a/src/views/WatchData/PoliceMangant/PoliceRecord/index.js b/src/views/WatchData/PoliceMangant/PoliceRecord/index.js index 45c2c31..4725be4 100644 --- a/src/views/WatchData/PoliceMangant/PoliceRecord/index.js +++ b/src/views/WatchData/PoliceMangant/PoliceRecord/index.js @@ -10,8 +10,8 @@ const url = "http://223.75.53.141:9102/test.by-lyf.tmp" const Page = () => { const types = { 0: "闸后流量", - 1: '闸前水位', - 2:'闸后水位' + 2: '闸前水位', + 3:'闸后水位' } const types1 = { 0: "报警中", @@ -21,34 +21,34 @@ const Page = () => { const columns = [ { title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" }, { - title: '监测项目', key: 'name', dataIndex: 'name', width: 150, + title: '监测项目', key: 'type', dataIndex: 'type', width: 150, render: (v) => {types[v]} }, - { title: '监测值', key: 'adress', dataIndex: 'adress', width: 150}, - { title: '阈值下限', key: 'adress', dataIndex: 'adress', width: 150}, - { title: '阈值上限', key: 'adress', dataIndex: 'adress', width: 150}, + { title: '监测值', key: 'val', dataIndex: 'val', width: 150}, + { title: '阈值下限', key: 'lowerLimit', dataIndex: 'lowerLimit', width: 150}, + { title: '阈值上限', key: 'upperLimit', dataIndex: 'upperLimit', width: 150}, { - title: '状态', key: 'adress', dataIndex: 'adress', width: 150, + title: '状态', key: 'status', dataIndex: 'status', width: 150, render: (v) => {types[v]} }, { - title: '报警时间', key: 'eventsDate', dataIndex: 'eventsDate', width: 140, + title: '报警时间', key: 'warnTime', dataIndex: 'warnTime', width: 140, }, { - title: '持续时长', key: 'eventsDate', dataIndex: 'eventsDate', width: 140, + title: '持续时长', key: 'duration', dataIndex: 'duration', width: 140, }, ]; const width = useMemo(() => columns.reduce((total, cur) => total + (cur.width), 0), [columns]); - const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.sbwh.whfabz.page).find_noCode); + const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.jcsj.bjgl.bjjl.page).find_noCode); const exportExcel = () => { let params = { ...searchVal, } - httppost5(apiurl.pxjh.export, params).then(res => { - exportFile(`统计报表.xlsx`,res.data) + httppost5(apiurl.jcsj.bjgl.bjjl.export, params).then(res => { + exportFile(`报警记录.xlsx`,res.data) }) } useEffect(() => { diff --git a/src/views/WatchData/PoliceMangant/PoliceRecord/toolbar.js b/src/views/WatchData/PoliceMangant/PoliceRecord/toolbar.js index 754e0c5..753c851 100644 --- a/src/views/WatchData/PoliceMangant/PoliceRecord/toolbar.js +++ b/src/views/WatchData/PoliceMangant/PoliceRecord/toolbar.js @@ -13,11 +13,11 @@ const ToolBar = ({ setSearchVal, onSave, storeData, exportFile1 }) => { }, { label: "闸前水位", - value: 1, + value: 2, }, { label: "闸后水位", - value: 2, + value: 3, }, ] @@ -34,15 +34,15 @@ const ToolBar = ({ setSearchVal, onSave, storeData, exportFile1 }) => { const [form] = Form.useForm(); const onFinish = (values) => { - let dateSo; + let dateTimeRangeSo ; if (values.tm) { - dateSo = { + dateTimeRangeSo = { start: moment(values.tm[0]).format('YYYY-MM-DD HH:mm:ss'), end: moment(values.tm[1]).format('YYYY-MM-DD HH:mm:ss') } } delete values.tm - setSearchVal({...values, dateSo}); + setSearchVal({...values, dateTimeRangeSo}); } diff --git a/src/views/WatchData/PoliceMangant/PoliceRuleConfig/index.js b/src/views/WatchData/PoliceMangant/PoliceRuleConfig/index.js index 037879d..a8f0a68 100644 --- a/src/views/WatchData/PoliceMangant/PoliceRuleConfig/index.js +++ b/src/views/WatchData/PoliceMangant/PoliceRuleConfig/index.js @@ -7,6 +7,7 @@ import apiurl from '../../../../service/apiurl'; import usePageTable from '../../../../components/crud/usePageTable2'; import { createCrudService } from '../../../../components/crud/_'; import {CrudOpRender_text} from '../../../../components/crud/CrudOpRender'; +import { httppost2 } from '../../../../utils/request'; const url = "http://223.75.53.141:9102/test.by-lyf.tmp" const Page = () => { @@ -29,7 +30,7 @@ const Page = () => { { title: '阈值上限', key: 'lowerLimit ', dataIndex: 'lowerLimit', width: 150}, { title: '是否启用', key: 'status', dataIndex: 'status', width: 150, - render: (v) => { v == 1 ? '停用': '启用'} + render: (v) => { v == 1 ? '否': v==0?'是':''} }, { title: '配置时间', key: 'createTime', dataIndex: 'createTime', width: 150, @@ -51,6 +52,17 @@ const Page = () => { const width = useMemo(() => columns.reduce((total, cur) => total + (cur.width), 0), [columns]); + const stopStatus = async (params) => { + try { + const res = await httppost2(apiurl.jcsj.bjgl.bjgzpz.stop, params) + if (res.code == 200) { + message.success(`${params.status ? '停用':'启用'}成功`) + refresh() + } + } catch (error) { + console.log(error); + } + } const command = (type) => (params) => { if (type === 'save') { refModal.current.showSave(); @@ -60,6 +72,8 @@ const Page = () => { refModal.current.showView(params); } else if (type === 'del') { refModal.current.onDeleteGet(apiurl.jcsj.bjgl.bjgzpz.delete + `/${params.id}`); + } else if (type == 'status') { + stopStatus({ id: params.id, status: params.status == 1 ? 0 : params.status == 0 ? 1 : ''}) } }