feat():设备维护联调

test
李神峰 2024-12-16 17:46:34 +08:00
parent 301269f407
commit bedf26d9a6
26 changed files with 555 additions and 508 deletions

BIN
src/assets/images/zcd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -26,6 +26,7 @@ const SiderMenu: React.FC<{
const [openKeys, setOpenKeys] = useState<any>([`${menuIndexes[1]}`]);
console.log('openKeys', openKeys)
console.log(subMenu);
const [irSelect,setIr] =useState('')
const location = useLocation();
const pathname = location.pathname;
@ -33,11 +34,22 @@ const SiderMenu: React.FC<{
const navigate = useNavigate();
function goto(url: string) {
setIr(url)
if (pathname !== url) {
navigate(url);
}
}
const getIcon = (item: any) => {
const idx = item.children?.findIndex((item:any)=>irSelect == item.path)
if(item.path == irSelect || (idx !== -1&&idx !== undefined)){
return 'zcdSelect'
}else{
return 'zcd'
}
}
// useEffect(() => {
// if (openKeys?.[0] === 'undefined') {
@ -93,7 +105,7 @@ const SiderMenu: React.FC<{
{
subMenu.map((o: any) => (
o.children && o.children.length > 0 ? (
<SubMenu key={o.id} icon={o.icon ? <img style={{ width: 16, height: 16 }} src={`/assets/icons/${o.icon}.png`} /> : <FolderOutlined />}
<SubMenu key={o.id} icon={<img style={{ width: 16, height: 16 }} src={require(`../../assets/images/${getIcon(o)}.png`)} />}
title={<span>
{o.title}
{renderPop(o.title) && <span
@ -114,7 +126,9 @@ const SiderMenu: React.FC<{
<>
<Menu.Item
onClick={() => goto(oo.path)}
key={oo.id}>{oo.title}
key={oo.id}
icon={<img style={{ width: 16, height: 16 }} src={require(`../../assets/images/${getIcon(oo)}.png`)} />}
>{oo.title}
</Menu.Item>
{renderPop(oo.title) &&<div
style={{
@ -134,8 +148,8 @@ const SiderMenu: React.FC<{
) : (
<>
<Menu.Item
icon={o.icon ? <img style={{ width: 16, height: 16 }}
src={`/assets/icons/${o.icon}.png`} /> : <ProfileOutlined />}
icon={<img style={{ width: 16, height: 16 }}
src={require(`../../assets/images/${getIcon(o)}.png`)} />}
onClick={() => goto(o.path)} key={o.id}>
<div style={{position:"relative"}}>
<span>{o.title}</span>

View File

@ -17,55 +17,6 @@ import { httppost2 } from '../../utils/request';
import apiurl from '../../service/apiurl';
const { Header, Content, Sider } = Layout;
const meunObj:any = {
'home':'基本情况',
'fxzb':'防汛准备',
'sxfd':'思想发动',
'fxkhgzh':'防汛抗旱工作会',
'fbzrh':'防办主任会',
'fxpxb':'防汛培训班',
'fxtj':'防汛图件',
'zzjg':'组织机构',
'zq':'政区',
'gc':'工程',
'gczx':'工程整修',
'ytygc':'已投运工程',
'zjgc':'在建工程',
'hdqz':'河道清障',
'yaxb':'预案修编',
'zqya':'政区预案',
'ytygcya':'已投运工程预案',
'zjgcya':'在建工程预案',
'hsddya':'洪水调度方案',
'qxdw':'抢险队伍',
'qxwl':'抢险物料',
'jczw':'检测站网',
'yqz':'雨情站',
'sqz':'水情站',
'zbb':'值班表',
'txl':'通讯录',
'ysgzq':'雨水工灾情',
'ssyq':'实时雨情',
'sssq':'实时水情',
'ssgq':'实时工情',
'yxqk':'运行情况',
'gcxq':'工程险情',
'dbaq':'大坝安全监测数据',
'sszq':'实时灾情',
'fxdd':'防汛调度',
'dqxsfx':'当前形势分析',
'tqyb':'天气预报',
'hsyb':'洪水预报',
'skhs':'水库洪水',
'hdhs':'河道洪水',
'ddjc':'调度决策',
'yjxy':'应急响应',
'ddzl':'调度指令',
'videoSurveillance':'视频监控',
'fxdp':'防汛大屏',
}
const DashboardLayout: React.FC = () => {
@ -112,33 +63,6 @@ const DashboardLayout: React.FC = () => {
// 这个方法是统计菜单点击情况的
// useEffect(()=>{
// (async()=>{
// const list = location.pathname.split('/')
// let menu1:any = meunObj?.[list[2]]
// let menu2:any = meunObj?.[list[3]]
// let menu3:any = meunObj?.[list[4]]
// if(menu1==='基本情况'){
// menu2 = '基本情况'
// }
// if(menu1==='视频监控'){
// menu2 = '视频监控'
// }
// if(menu1==='防汛大屏'){
// menu2 = '防汛大屏'
// }
// const res = await httppost2(apiurl.setMenu,{
// createId:localStorage.getItem('userId'),
// loginType:0,
// menu1:menu1,
// menu2:menu2,
// menu3:menu3
// })
// })()
// },[location.pathname])
const menuIndexes = useMemo(() => findMenu(menu, pathname), [menu, pathname]);
const menuUrl = ['/mgr/home', '/mgr/forecast', '/mgr/earlyWarning', '/mgr/preview', '/mgr/plan','/mgr/videoSurveillance'];

View File

@ -5,7 +5,9 @@ import './index.less'
import { httpget, httpGetFile, httppost } from '../../utils/request';
import apiurl from '../../service/apiurl';
const { Dragger } = Upload;
export default function FileUpload({ mode,setFileIds,files }) {
export default function FileUpload({ mode, setFileIds, files, downloadUrl, uploadUrl }) {
const url = "http://223.75.53.141:9102/test.by-lyf.tmp"
const [fileList, setFileList] = useState([]) //上传文件列表
const [iframeSrc, setIframeSrc] = useState('')
const [pdfViewOPen, setPdfViewOPen] = useState(false)
@ -17,7 +19,7 @@ export default function FileUpload({ mode,setFileIds,files }) {
const deleteFile = async (fileId) => {
let filterFile = fileList.filter(item => item.response?.data?.fileId !== fileId);
setFileList(filterFile)
setFileIds(filterFile.map(item => item.response?.data?.fileId))
setFileIds(filterFile.map(item => ({fileId:item.response?.data?.fileId})))
}
const fileChange = (info) => {
@ -32,7 +34,9 @@ export default function FileUpload({ mode,setFileIds,files }) {
setLoading(false);
}
let fileIds = info.fileList.map(file => {
return file.response?.data?.fileId
return {
fileId:file.response?.data?.fileId
}
})
setFileIds(fileIds)
setFileList(info.fileList)
@ -48,8 +52,7 @@ export default function FileUpload({ mode,setFileIds,files }) {
*/
const download = (params) => {
let downloadLink = document.createElement("a");
// downloadLink.href = `http://192.168.66.7:20010/fileAssociations/downloadFile/${params?.fileId}`;
downloadLink.href = `http://223.75.53.141:81/shzh/jcsj/fileAssociations/downloadFile/${params?.fileId}`;
downloadLink.href = `${downloadUrl}/${params?.fileId}`;
downloadLink.download = `${params.fileName}`;
downloadLink.style.display = "none";
// 将链接添加到页面中
@ -70,8 +73,8 @@ export default function FileUpload({ mode,setFileIds,files }) {
useEffect(() => {
if (mode != "save" && files) {
setFileList(files.map(file => ({...file,name:file.fileName,response:{data:{name:file.fileName,fileId:file.fileId}}})))
setFileIds(files.map(item => item.response?.data?.fileId))
setFileList(files.map(file => ({ ...file, name: file.fileName, response: { data: { name: file.fileName, fileId: file.fileId,filePath:file.filePath } } })))
setFileIds(files.map(item => ({fileId:item.response?.data?.fileId})))
}
}, [mode, files])
@ -81,7 +84,7 @@ export default function FileUpload({ mode,setFileIds,files }) {
<Dragger
name='file'
// multiple
action="/shzh/jcsj/fileAssociations/uploadFile"
action={uploadUrl}
onChange={fileChange}
onDrop={(info) => { console.log(info.dataTransfer.files); }}
fileList={fileList}
@ -115,7 +118,7 @@ export default function FileUpload({ mode,setFileIds,files }) {
:
file.name.indexOf('.pdf') > -1 ?
<div
onClick={() => { download(file.response?.data) }}
onClick={() => { viewPdf(file.response?.data) }}
style={{ cursor: 'pointer' }}
>
<FilePdfOutlined style={{ fontSize: 40 }} />
@ -131,7 +134,7 @@ export default function FileUpload({ mode,setFileIds,files }) {
:
file.name.indexOf('.ppt') > -1 ?
<div
onClick={() => { viewPdf(file.response?.data) }}
onClick={() => { download(file.response?.data) }}
style={{ cursor: 'pointer' }}
>
<FilePptOutlined style={{ fontSize: 40 }} />
@ -145,7 +148,7 @@ export default function FileUpload({ mode,setFileIds,files }) {
</div>
:
<FileJpgOutlined style={{ fontSize: 40 }} onClick={() => { download(file.response?.data) }} />
<Image width={60} src={url + file.response?.data?.filePath} alt='' />
}
<span>{file.name}</span>
</div>
@ -176,7 +179,7 @@ export default function FileUpload({ mode,setFileIds,files }) {
border: 0,
marginTop: 20,
}}
src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`/gunshiApp/tsg/projectEvents/file/download/${iframeSrc}`)}`}
src={`${process.env.PUBLIC_URL}/static/pdf/web/viewer.html?file=${encodeURIComponent(`${downloadUrl}/${iframeSrc}`)}`}
/>
</Modal>
</div>

View File

@ -2,6 +2,7 @@
const service_fxdd = '/gunshiApp/tsg'
const service_xyt = '/gunshiApp/tsg'//登陆先用小玉潭
const service_ykz = '/gunshiApp/ykz'
const apiurl = {
setMenu: service_fxdd + '/visitMenuLog/insert',
setPassword: service_fxdd + '/user/updateSecretKey',
@ -14,7 +15,7 @@ const apiurl = {
home: {
videoList: service_fxdd + "/gateValveCctvRel/list",
videosrc: service_fxdd + "/attCctvBase/preview",
videosrc: service_fxdd + "/attCctvBase/preview/",
},
zmjk: {
getList : service_xyt + '/attGateB/list',
@ -24,10 +25,37 @@ const apiurl = {
},
sbwh: {
whfabz: {
page: service_fxdd + '/resPerson/page',
save: service_fxdd + '/resPerson/save',
edit: service_fxdd + '/resPerson/edit',
delete:service_fxdd + '/resPerson/delete',
page: service_ykz + '/maintainPlan/page',
save: service_ykz + '/maintainPlan/insert',
edit: service_ykz + '/maintainPlan/update',
delete: service_ykz + '/maintainPlan/del',
uploadUrl: service_ykz + '/maintainPlan/file/upload/singleSimple',
downloadUrl:service_ykz + '/maintainPlan/file/download'
},
ssgcjl: {
page: service_ykz + '/implementProcessRecord/page',
save: service_ykz + '/implementProcessRecord/insert',
edit: service_ykz + '/implementProcessRecord/update',
delete: service_ykz + '/implementProcessRecord/del',
uploadUrl: service_ykz + '/implementProcessRecord/file/upload/singleSimple',
downloadUrl: service_ykz + '/implementProcessRecord/file/download',
list:service_ykz + '/implementProcessRecord/list'
},
whxmys: {
page: service_ykz + '/maintainProjectCheck/page',
save: service_ykz + '/maintainProjectCheck/insert',
edit: service_ykz + '/maintainProjectCheck/update',
delete: service_ykz + '/maintainProjectCheck/del',
uploadUrl: service_ykz + '/maintainProjectCheck/file/upload/singleSimple',
downloadUrl:service_ykz + '/maintainProjectCheck/file/download'
},
cgtzgl: {
page: service_ykz + '/purchaseLedger/page',
save: service_ykz + '/purchaseLedger/insert',
edit: service_ykz + '/purchaseLedger/update',
delete: service_ykz + '/purchaseLedger/del',
uploadUrl: service_ykz + '/purchaseLedger/file/upload/singleSimple',
downloadUrl:service_ykz + '/purchaseLedger/file/download'
}
}

View File

@ -5,8 +5,8 @@ module.exports = function (app) {
app.use(
'/gunshiApp',
createProxyMiddleware({
target: 'http://local.gunshiiot.com:18083/',//测试
// target: 'http://192.168.66.199:24105/',//正式
// target: 'http://local.gunshiiot.com:18083/',//测试
target: 'http://192.168.66.7:24106/',//正式
// target: 'http://36.139.207.50:18083/',//移动云
// target: 'http://192.168.66.49:24105/',//移动云
changeOrigin: true,

View File

@ -1,5 +1,8 @@
import React, { useEffect, useState, useMemo } from 'react'
import { useNavigate } from 'react-router';
import {
RightCircleFilled, LeftCircleFilled
} from '@ant-design/icons';
import autofit from 'autofit.js'
import Zmjk from "./zmjk"
import './index.less'
@ -9,7 +12,7 @@ import clsx from 'clsx';
import { Select } from 'antd';
import { httpget2, httppost2 } from '../../utils/request';
import apiurl from '../../service/apiurl';
import HFivePlayer from '../../components/video1Plary';
const MenuTitleCard = ({ key, title }) => {
return (
<div className='menuItem_style' key={key} title={title}>
@ -88,29 +91,40 @@ export default function Home() {
}
const [videoList, setVideoList] = useState([])
const [videoArr, setvideoArr] = useState({})
const [index, setIndex] = useState(0)
// 获取视频列表
const getVideoList = async () => {
try {
const res = await httppost2(apiurl.home.videoList, { valveCode: "HP0024208020000063" })
setVideoList(res.data.map(item => ({label:item.name,value:item.indexCode})))
setVideoList(res.data)
getVideoSrc(res.data[0].indexCode)
} catch (error) {
console.log(error);
}
}
// 获取视频流
const getVideoSrc = async (current) => {
const res = await httpget2(`${apiurl.home.videosrc}${current}`)
if (res.code == 200 && res.data?.length !== 0) {
// setvideoArr({src:'ws://223.76.234.232:559/openUrl/7WKpEbu'})
setvideoArr({ src: res.data })
} else {
setvideoArr({})
}
}
const delClick = () => {
let idx = index - 1
setIndex(idx)
getVideoSrc(videoList[idx].indexCode)
}
const addClick = () => {
let idx = index + 1
setIndex(idx)
getVideoSrc(videoList[idx].indexCode)
}
const [activeOne, setActiveOne] = useState(0)
useEffect(() => {
autofit.init({
@ -180,7 +194,7 @@ export default function Home() {
<th style={{ width: 137 }}>监测时间</th>
</tr>
</thead>
<tbody >
<tbody style={{ overflowY: safeData.length > 4 ? 'scroll' : 'hidden' }}>
{safeData.map((item, i) => (
<tr style={{ borderBottom: '2px solid #536cc6', textAlign: 'center' }} className={clsx({ 'odd_row': i % 2 })} key={i}>
<td>{item.cd}</td>
@ -256,15 +270,12 @@ export default function Home() {
{/* 视频监控 */}
<div className='operate-log'>
<div className='project-title'>
<Select
placeholder="请选择视频"
options={videoList}
allowClear
/>
视频监控
</div>
<div className='project-content'>
<div className='project-content video-style'>
{index !== 0 && <LeftCircleFilled className="leftIcon" onClick={() => delClick()} />}
<HFivePlayer wsUrl={videoArr} playerID={'111'} />
{index !== videoList.length - 1 && <RightCircleFilled className="rightIcon" onClick={() => addClick()} />}
</div>
</div>
</div>

View File

@ -154,9 +154,25 @@
border-radius: 5px;
padding: 10px;
color: #fff;
}
.video-style{
position: relative;
height: 300px;
.leftIcon{
position: absolute;
top: 45%;
left: 10px;
font-size: 24px;
z-index: 1;
}
.rightIcon{
position: absolute;
top: 45%;
right: 10px;
font-size: 24px;
}
}
}
}
.odd_row{

View File

@ -205,7 +205,7 @@ const Page = () => {
<div key={o} className='o' style={{ flexGrow: 1, width: 100, display: 'flex', justifyContent: 'center' }}>
<div
onClick={() => {}}
style={{ width: 80, height: 32, border: '1px solid #444', backgroundColor: '#fff', borderRadius: 4, color: '#888', display: 'flex', justifyContent: 'center', alignItems: 'center', fontSize: 18, cursor: 'pointer' }}
style={{ width: 80, height: 32, border: '1px solid #4c5dce', backgroundColor: '#315da2', borderRadius: 4, color: '#fff', display: 'flex', justifyContent: 'center', alignItems: 'center', fontSize: 18, cursor: 'pointer' }}
>
{renAperture(damList[o]?.realAperture)}
</div>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 MiB

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -24,6 +24,8 @@
.loginFormBox{
background-color: rgba(255, 255, 255, .5);
// background:url(./img/formBg.png) no-repeat center;
background-size: 100% 100%;
width: 100%;
// height: 60%;
border-radius: 6px;

View File

@ -59,7 +59,7 @@ const LoginPage = () => {
// "aesKey": keystr
}
const result = await login(params)
if (result.code == 200) {
if (result?.code == 200) {
localStorage.setItem('access_token', result.token);
cookie.save('Admin-Token', result.token);
localStorage.setItem('expires_in', result.token);
@ -68,11 +68,11 @@ const LoginPage = () => {
getInfo(res,value)
})
} else {
message.error((result.description).replace('参数错误',''));
message.error((result?.description)?.replace('参数错误',''));
}
}
const getInfo = (result1: any, value: any) => {
if (result1.code === 200) {
if (result1?.code === 200) {
if(checked){
localStorage.setItem('loginNamePwd',JSON.stringify(value))
// localStorage.setItem('checked',checked)

View File

@ -9,8 +9,6 @@ import { createCrudService } from '../../../components/crud/_';
import {CrudOpRender_text} from '../../../components/crud/CrudOpRender';
import { httppost5 } from '../../../utils/request';
import { exportFile } from '../../../utils/tools.js';
const url = "http://223.75.53.141:9102/test.by-lyf.tmp"
const Page = () => {
const types = {
0: "防汛物资",
@ -24,20 +22,20 @@ const Page = () => {
const [searchVal, setSearchVal] = useState(false)
const columns = [
{ title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" },
{ title: '物资名称', key: 'name', dataIndex: 'name', width: 150, ellipsis: true },
{ title: '物资名称', key: 'goodsName', dataIndex: 'goodsName', width: 150, ellipsis: true },
{
title: '类型', key: 'type', dataIndex: 'type', width: 140,
title: '类型', key: 'goodsType', dataIndex: 'goodsType', width: 140,
render: (value) => <span>{types[value]}</span>,
},
{ title: '规格型号', key: 'adress', dataIndex: 'adress', width: 150, ellipsis: true },
{ title: '数量', key: 'type', dataIndex: 'type', width: 140},
{ title: '计量单位', key: 'type', dataIndex: 'type', width: 140},
{ title: '单价(元)', key: 'type', dataIndex: 'type', width: 140},
{ title: '规格型号', key: 'specs', dataIndex: 'specs', width: 150, ellipsis: true },
{ title: '数量', key: 'quantity', dataIndex: 'quantity', width: 140},
{ title: '计量单位', key: 'unit', dataIndex: 'unit', width: 140},
{ title: '单价(元)', key: 'unitPrice', dataIndex: 'unitPrice', width: 140},
{
title: '采购时间', key: 'eventsDate', dataIndex: 'eventsDate', width: 150,
title: '采购时间', key: 'purchaseTime', dataIndex: 'purchaseTime', width: 150,
},
{
title: '供方名称', key: 'eventsDate', dataIndex: 'eventsDate', width: 150,
title: '供方名称', key: 'supplierName', dataIndex: 'supplierName', width: 150,
},
{
title: '操作', key: 'operation', width: 200, fixed: 'right',align: 'center',
@ -61,13 +59,13 @@ const Page = () => {
} else if (type === 'view') {
refModal.current.showView(params);
} else if (type === 'del') {
refModal.current.onDeleteGet(apiurl.rcgl.gcdsj.delete + `/${params.id}`);
refModal.current.onDeleteGet(apiurl.sbwh.cgtzgl.delete + `/${params.id}`);
}
}
const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.sbwh.whfabz.page).find_noCode);
const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.sbwh.cgtzgl.page).find_noCode);
/**
* @description 处理成功的回调

View File

@ -33,15 +33,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});
}
@ -49,10 +49,10 @@ const ToolBar = ({ setSearchVal, onSave, storeData, exportFile1 }) => {
<>
<div style={{display:'flex',justifyContent:'space-between'}}>
<Form form={form} className='toolbarBox' layout="inline" onFinish={onFinish}>
<Form.Item label="物资名称" name="name">
<Form.Item label="物资名称" name="goodsName">
<Input allowClear style={{width:'150px'}}/>
</Form.Item>
<Form.Item label="类型" name="type">
<Form.Item label="类型" name="goodsType">
<NormalSelect allowClear style={{ width: '150px' }} options={types} />
</Form.Item>
<Form.Item label="采购时间" name="tm">

View File

@ -4,7 +4,7 @@ import { formItemLayout, btnItemLayout } from '../../../components/crud/FormLayo
import apiurl from '../../../service/apiurl';
import FileUpload from '../../../components/fileUpload';
import NormalSelect from '../../../components/Form/NormalSelect';
import { httppost2 } from '../../../utils/request';
import "./index.less"
import moment from 'moment';
const { RangePicker } = DatePicker
@ -27,18 +27,45 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
const [form] = Form.useForm();
const [fileIds, setFileIds] = useState()
const onfinish = (values) => {
values.eventsDate = values.eventsDate?moment(values.eventsDate).format("YYYY-MM-DD 00:00:00"):''
const userId = localStorage.getItem('userId')
const userName = localStorage.getItem('userName')
values.createUserId = userId;
values.createUserName = userName;
values.startTime = values.tm ? moment(values.tm[0]).format("YYYY-MM-DD 00:00:00") : '';
values.endTime = values.tm ? moment(values.tm[1]).format("YYYY-MM-DD 00:00:00") : '';
if (mode === 'edit') {
values.files = fileIds;
values.id = record.id;
onEdit(apiurl.rcgl.gcdsj.edit,values)
onEdit(apiurl.sbwh.ssgcjl.edit, values)
}
if (mode === 'save') {
values.files = fileIds
onSave(apiurl.rcgl.gcdsj.save,values)
onSave(apiurl.sbwh.ssgcjl.save, values)
}
}
// 获取方案list
const faList = async () => {
try {
const res = await httppost2(apiurl.sbwh.ssgcjl.list)
debugger
} catch (error) {
console.log(error);
}
}
useEffect(() => {
if (mode != 'save') {
let dataSo = record.startTime && record.endTime ?
[moment(record.startTime), moment(record.endTime)] : ''
form.setFieldValue("tm", dataSo)
}
}, [record, mode])
useEffect(() => {
faList()
}, [])
return (
<>
<Form
@ -51,7 +78,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}>
<Form.Item
label="项目名称"
name="name"
name="projectName"
rules={[{ required: true }]}
>
<Input disabled={mode === 'view'} style={{ width: '100%' }} allowClear />
@ -60,7 +87,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}>
<Form.Item
label="方案名称"
name="name"
name="planName"
rules={[{ required: true }]}
>
<Input disabled={mode === 'view'} style={{ width: '100%' }} allowClear />
@ -72,7 +99,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}>
<Form.Item
label="过程名称"
name="adress"
name="processName"
rules={[{ required: true }]}
>
<Input disabled={mode === 'view'} style={{ width: '100%' }} allowClear />
@ -81,7 +108,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}>
<Form.Item
label="完成情况(%"
name="name"
name="completeStatus"
>
<InputNumber min={0} max={100} disabled={mode === 'view'} style={{ width: '100%' }} allowClear />
</Form.Item>
@ -91,7 +118,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}>
<Form.Item
label="问题类型"
name="type"
name="problemType"
>
<NormalSelect
allowClear
@ -104,7 +131,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}>
<Form.Item
label="问题发生时间"
name="eventsDate"
name="tm"
getValueFromEvent={(e, dateString) => dateString}
getValueProps={(value) => {
return {
@ -121,7 +148,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}>
<Form.Item
label="问题描述"
name="eventsDesc"
name="problemDesc"
labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }}
>
@ -140,6 +167,8 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
wrapperCol={{ span: 19 }}
>
<FileUpload
uploadUrl={apiurl.sbwh.ssgcjl.uploadUrl}
downloadUrl={apiurl.sbwh.ssgcjl.downloadUrl}
mode={mode}
files={record?.files}
setFileIds={setFileIds}

View File

@ -10,20 +10,15 @@ import {CrudOpRender_text} from '../../../components/crud/CrudOpRender';
const url = "http://223.75.53.141:9102/test.by-lyf.tmp"
const Page = () => {
const types = {
0: "设备维修",
1: '设备更换',
2:"结构加固"
}
const refModal = useRef();
const [searchVal, setSearchVal] = useState(false)
const columns = [
{ title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" },
{ title: '方案名称', key: 'name', dataIndex: 'name', width: 150, ellipsis: true },
{ title: '过程地点', key: 'adress', dataIndex: 'adress', width: 200, ellipsis: true },
{ title: '记录人', key: 'type', dataIndex: 'type', width: 140,},
{ title: '方案名称', key: 'planName', dataIndex: 'planName', width: 150, ellipsis: true },
{ title: '过程名称', key: 'processName', dataIndex: 'processName', width: 200, ellipsis: true },
{ title: '记录人', key: 'createUserName', dataIndex: 'createUserName', width: 140,},
{
title: '记录时间', key: 'eventsDate', dataIndex: 'eventsDate', width: 140,
title: '记录时间', key: 'createTime', dataIndex: 'createTime', width: 140,
},
{
title: '操作', key: 'operation', width: 200, fixed: 'right',align: 'center',
@ -47,13 +42,13 @@ const Page = () => {
} else if (type === 'view') {
refModal.current.showView(params);
} else if (type === 'del') {
refModal.current.onDeleteGet(apiurl.rcgl.gcdsj.delete + `/${params.id}`);
refModal.current.onDeleteGet(apiurl.sbwh.ssgcjl.delete + `/${params.id}`);
}
}
const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.sbwh.whfabz.page).find_noCode);
const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.sbwh.ssgcjl.page).find_noCode);
/**
* @description 处理成功的回调

View File

@ -8,15 +8,15 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role }) => {
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});
}
@ -24,7 +24,7 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role }) => {
<>
<div style={{display:'flex',justifyContent:'space-between'}}>
<Form form={form} className='toolbarBox' layout="inline" onFinish={onFinish}>
<Form.Item label="项目名称" name="name">
<Form.Item label="项目名称" name="projectName">
<Input allowClear style={{width:'150px'}}/>
</Form.Item>
<Form.Item label="记录时间" name="tm">

View File

@ -9,6 +9,7 @@ import NormalSelect from '../../../components/Form/NormalSelect';
import "./index.less"
import moment from 'moment';
import { httppost2 } from '../../../utils/request';
const { RangePicker } = DatePicker
const url = "http://223.75.53.141:9102/test.by-lyf.tmp"
@ -29,18 +30,32 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
const [form] = Form.useForm();
const [fileIds, setFileIds] = useState()
const onfinish = (values) => {
values.eventsDate = values.eventsDate?moment(values.eventsDate).format("YYYY-MM-DD 00:00:00"):''
if (mode === 'edit') {
const userId = localStorage.getItem('userId')
const userName = localStorage.getItem('userName')
values.createUserId = userId;
values.createUserName = userName;
values.startTime =values.tm? moment(values.tm[0]).format("YYYY-MM-DD 00:00:00") :'';
values.endTime = values.tm?moment(values.tm[1]).format("YYYY-MM-DD 00:00:00") :'';
values.files = fileIds;
if (mode === 'edit') {
values.id = record.id;
onEdit(apiurl.rcgl.gcdsj.edit,values)
onEdit(apiurl.sbwh.whfabz.edit,values)
}
if (mode === 'save') {
values.files = fileIds
onSave(apiurl.rcgl.gcdsj.save,values)
onSave(apiurl.sbwh.whfabz.save,values)
}
}
useEffect(() => {
if (mode != 'save') {
let dataSo = record.startTime && record.endTime ?
[moment(record.startTime), moment(record.endTime)]:''
form.setFieldValue("tm", dataSo)
}
}, [record,mode])
return (
<>
<Form
@ -53,7 +68,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}>
<Form.Item
label="项目名称"
name="name"
name="projectName"
rules={[{ required: true }]}
>
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
@ -62,7 +77,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}>
<Form.Item
label="方案名称"
name="name"
name="planName"
rules={[{ required: true }]}
>
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
@ -74,7 +89,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}>
<Form.Item
label="项目地点"
name="adress"
name="projectAddr"
>
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item>
@ -82,7 +97,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}>
<Form.Item
label="项目负责人"
name="name"
name="projectLeader"
>
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item>
@ -92,7 +107,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}>
<Form.Item
label="维护类型"
name="type"
name="maintainType"
rules={[{ required: true }]}
>
<NormalSelect
@ -106,7 +121,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}>
<Form.Item
label="计划维护时间"
name="eventsDate"
name="tm"
getValueFromEvent={(e,dateString) => dateString}
getValueProps={(value) => {
return {
@ -123,7 +138,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={24}>
<Form.Item
label="维护内容"
name="eventsDesc"
name="content"
labelCol={{ span: 3 }}
wrapperCol={{ span: 19 }}
>
@ -135,7 +150,7 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
<Col span={12}>
<Form.Item
label="费用预估(元)"
name="eventsDesc"
name="costEstimate"
>
<Input disabled={mode==='view'} style={{width:'100%'}} allowClear />
</Form.Item>
@ -151,6 +166,8 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
wrapperCol={{ span: 19 }}
>
<FileUpload
uploadUrl={apiurl.sbwh.whfabz.uploadUrl}
downloadUrl={apiurl.sbwh.whfabz.downloadUrl}
mode={mode}
files={record?.files}
setFileIds={setFileIds}

View File

@ -19,15 +19,15 @@ const Page = () => {
const [searchVal, setSearchVal] = useState(false)
const columns = [
{ title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" },
{ title: '项目名称', key: 'name', dataIndex: 'name', width: 150, ellipsis: true },
{ title: '项目地点', key: 'adress', dataIndex: 'adress', width: 200, ellipsis: true },
{ title: '项目名称', key: 'projectName', dataIndex: 'projectName', width: 150, ellipsis: true },
{ title: '项目地点', key: 'projectAddr', dataIndex: 'projectAddr', width: 200, ellipsis: true },
{
title: '维护类型', key: 'type', dataIndex: 'type', width: 140,
title: '维护类型', key: 'maintainType', dataIndex: 'maintainType', width: 140,
render: (value) => <span>{types[value]}</span>,
},
{ title: '编制人', key: 'type', dataIndex: 'type', width: 140,},
{ title: '编制人', key: 'createUserName', dataIndex: 'createUserName', width: 140},
{
title: '编制时间', key: 'eventsDate', dataIndex: 'eventsDate', width: 140,
title: '编制时间', key: 'createTime', dataIndex: 'createTime', width: 140,
},
{
title: '操作', key: 'operation', width: 200, fixed: 'right',align: 'center',
@ -51,7 +51,7 @@ const Page = () => {
} else if (type === 'view') {
refModal.current.showView(params);
} else if (type === 'del') {
refModal.current.onDeleteGet(apiurl.rcgl.gcdsj.delete + `/${params.id}`);
refModal.current.onDeleteGet(apiurl.sbwh.whfabz.delete + `/${params.id}`);
}
}

View File

@ -22,15 +22,15 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role }) => {
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});
}
@ -38,10 +38,10 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role }) => {
<>
<div style={{display:'flex',justifyContent:'space-between'}}>
<Form form={form} className='toolbarBox' layout="inline" onFinish={onFinish}>
<Form.Item label="项目名称" name="name">
<Form.Item label="项目名称" name="projectName">
<Input allowClear style={{width:'150px'}}/>
</Form.Item>
<Form.Item label="维护类型" name="type">
<Form.Item label="维护类型" name="maintainType">
<NormalSelect allowClear style={{ width: '150px' }} options={types} />
</Form.Item>
<Form.Item label="编制时间" name="tm">

View File

@ -29,15 +29,20 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
const [form] = Form.useForm();
const [fileIds, setFileIds] = useState()
const onfinish = (values) => {
values.eventsDate = values.eventsDate?moment(values.eventsDate).format("YYYY-MM-DD 00:00:00"):''
const userId = localStorage.getItem('userId')
const userName = localStorage.getItem('userName')
values.createUserId = userId;
values.createUserName = userName;
values.startTime =values.tm? moment(values.tm[0]).format("YYYY-MM-DD 00:00:00") :'';
values.endTime = values.tm?moment(values.tm[1]).format("YYYY-MM-DD 00:00:00") :'';
if (mode === 'edit') {
values.files = fileIds;
values.id = record.id;
onEdit(apiurl.rcgl.gcdsj.edit,values)
onEdit(apiurl.sbwh.whxmys.edit,values)
}
if (mode === 'save') {
values.files = fileIds
onSave(apiurl.rcgl.gcdsj.save,values)
onSave(apiurl.sbwh.whxmys.save,values)
}
}
@ -133,6 +138,8 @@ const ModalForm = ({ mode, record, onEdit, onSave, onSimilarSave }) => {
wrapperCol={{ span: 19 }}
>
<FileUpload
uploadUrl={apiurl.sbwh.whxmys.uploadUrl}
downloadUrl={apiurl.sbwh.whxmys.downloadUrl}
mode={mode}
files={record?.files}
setFileIds={setFileIds}

View File

@ -19,14 +19,17 @@ const Page = () => {
const [searchVal, setSearchVal] = useState(false)
const columns = [
{ title: '序号', key: 'inx', dataIndex: 'inx', width: 60, align:"center" },
{ title: '项目名称', key: 'name', dataIndex: 'name', width: 150, ellipsis: true },
{ title: '验收时间', key: 'adress', dataIndex: 'adress', width: 200, ellipsis: true },
{ title: '记录人', key: 'type', dataIndex: 'type', width: 140,},
{ title: '项目名称', key: 'projectName', dataIndex: 'projectName', width: 150, ellipsis: true },
{
title: '记录时间', key: 'eventsDate', dataIndex: 'eventsDate', width: 140,
title: '验收时间', key: 'tm', dataIndex: 'tm', width: 200, ellipsis: true,
render: (v, r) => <span>{r.startTime || '-'}{r.endTime || '-'}</span>
},
{ title: '记录人', key: 'createUserName', dataIndex: 'createUserName', width: 140,},
{
title: '记录时间', key: 'createTime', dataIndex: 'createTime', width: 140,
},
{
title: '操作', key: 'operation', width: 200, fixed: 'right',align: 'center',
title: '操作', key: 'createTime', width: 200, fixed: 'right',align: 'center',
render: (value, row, index) => (
<CrudOpRender_text
edit={ true }
@ -47,13 +50,13 @@ const Page = () => {
} else if (type === 'view') {
refModal.current.showView(params);
} else if (type === 'del') {
refModal.current.onDeleteGet(apiurl.rcgl.gcdsj.delete + `/${params.id}`);
refModal.current.onDeleteGet(apiurl.sbwh.whxmys.delete + `/${params.id}`);
}
}
const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.sbwh.whfabz.page).find_noCode);
const { tableProps, search, refresh } = usePageTable(createCrudService(apiurl.sbwh.whxmys.page).find_noCode);
/**
* @description 处理成功的回调

View File

@ -22,15 +22,15 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role }) => {
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});
}
@ -38,7 +38,7 @@ const ToolBar = ({ setSearchVal, onSave, storeData, role }) => {
<>
<div style={{display:'flex',justifyContent:'space-between'}}>
<Form form={form} className='toolbarBox' layout="inline" onFinish={onFinish}>
<Form.Item label="项目名称" name="name">
<Form.Item label="项目名称" name="projectName">
<Input allowClear style={{width:'150px'}}/>
</Form.Item>
<Form.Item label="记录时间" name="tm">

View File

@ -116,11 +116,11 @@ const Page = () => {
exportFile1={exportExcel}
/>
</Card>
<div className="ant-card-body" style={{ padding: "20px 0 0 0", display: 'flex', columnGap: 10 }}>
<div className="ant-card-body" style={{ padding: "20px 0 0 0", display: 'flex', columnGap: 10,overflow:'hidden' }}>
<div style={{ width: 800 }}>
<Table columns={columns} rowKey="inx" {...tableProps} scroll={{ x: width, y: "calc( 100vh - 400px )" }} />
</div>
<div style={{ flex: 1,height:"calc( 100vh - 400px )" }} >
<div style={{ width: 750,height:570 }} >
<ReactEcharts
option={pxOptions || {}}
style={{ width: "100%", height: '100%' }}