wenlele
1 year ago
7 changed files with 1793 additions and 2189 deletions
File diff suppressed because it is too large
@ -0,0 +1,181 @@ |
|||||
|
import { connect } from 'react-redux'; |
||||
|
import React, { useEffect, useState } from 'react'; |
||||
|
import { Button, Modal, Form, Input, Divider, Spin, Select, DatePicker, Descriptions, Table } from 'antd' |
||||
|
import { roadSpotChange } from '../actions/spotCheck'; |
||||
|
import { getRoadway } from "../actions/infor" |
||||
|
|
||||
|
import moment from 'moment' |
||||
|
import '../components/maintenanceTable.less' |
||||
|
|
||||
|
|
||||
|
|
||||
|
const Adjustment = (props) => { |
||||
|
const { dispatch, user, loading, reportDetail, editData, onCancel, road, onOk } = props |
||||
|
const [data, setData] = useState()//外层表格的数据
|
||||
|
const [vis, setVis] = useState(false)//模态框的显示与隐藏变量
|
||||
|
const [count, setCount] = useState(0) |
||||
|
const [page, setPage] = useState(1) |
||||
|
const [depName, setDepName] = useState('') |
||||
|
const [total, setTotal] = useState(0) |
||||
|
const [previewId, setPreviewId] = useState(0) |
||||
|
const [reportData, setReportData] = useState([]) |
||||
|
const [detailList, setDetailList] = useState([]) |
||||
|
const [detailVisible, setDetailVisible] = useState(false) |
||||
|
const [dateRange, setDateRange] = useState([]); |
||||
|
const { RangePicker } = DatePicker |
||||
|
const [nameList, setNameList] = useState([]); |
||||
|
const [codeList, setCodeList] = useState([]); |
||||
|
const [indexList, setIndexList] = useState([]); |
||||
|
const [roadFind, setRoadFind] = useState({}); |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
useEffect(() => { |
||||
|
if (editData?.id) { |
||||
|
dispatch(getRoadway({ level: editData?.road?.level, alterId: editData?.alterId })).then(res => { |
||||
|
if (res.success) { |
||||
|
let name = [] |
||||
|
let code = [] |
||||
|
let index = [] |
||||
|
res?.payload.data?.forEach(v => { |
||||
|
if (v.routeName && !name.includes(v.routeName)) { |
||||
|
name.push(v.routeName) |
||||
|
} |
||||
|
if (v.routeCode && !code.includes(v.routeCode)) { |
||||
|
code.push(v.routeCode) |
||||
|
} |
||||
|
if (v.sectionNo && !index.includes(v.sectionNo)) { |
||||
|
index.push(v.sectionNo) |
||||
|
} |
||||
|
}); |
||||
|
setNameList(name) |
||||
|
setCodeList(code) |
||||
|
setIndexList(index) |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
}, []) |
||||
|
|
||||
|
|
||||
|
const [form] = Form.useForm() |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
return ( |
||||
|
<Modal visible={true} |
||||
|
onCancel={() => { |
||||
|
onCancel() |
||||
|
}} |
||||
|
title='调整' onOk={() => { |
||||
|
form.validateFields().then((values) => { |
||||
|
let data = road?.find(d => values?.routeName == d?.routeName |
||||
|
&& values?.routeCode == d?.routeCode && values?.sectionNo == d?.sectionNo) |
||||
|
dispatch(roadSpotChange({ |
||||
|
previewId: editData?.previewId, |
||||
|
originRoadId: editData?.id, |
||||
|
changeRoadId: data?.id |
||||
|
})).then(res => { |
||||
|
if (res.success) { |
||||
|
onCancel() |
||||
|
onOk() |
||||
|
} |
||||
|
}); |
||||
|
}) |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
}}> |
||||
|
<Form form={form} labelCol={{ span: 4 }} onValuesChange={(changedValues, allValues) => { |
||||
|
let name = [] |
||||
|
let code = [] |
||||
|
let index = [] |
||||
|
let data = road?.filter(d => (allValues?.routeName ? allValues?.routeName == d?.routeName : true) |
||||
|
&& (allValues?.routeCode ? allValues?.routeCode == d?.routeCode : true) && |
||||
|
(allValues?.sectionNo ? allValues?.sectionNo == d?.sectionNo : true)) |
||||
|
|
||||
|
data?.forEach(v => { |
||||
|
if (v.routeName && !name.includes(v.routeName)) { |
||||
|
name.push(v.routeName) |
||||
|
} |
||||
|
if (v.routeCode && !code.includes(v.routeCode)) { |
||||
|
code.push(v.routeCode) |
||||
|
} |
||||
|
if (v.sectionNo && !index.includes(v.sectionNo)) { |
||||
|
index.push(v.sectionNo) |
||||
|
} |
||||
|
}); |
||||
|
setNameList(name) |
||||
|
setCodeList(code) |
||||
|
setIndexList(index) |
||||
|
|
||||
|
if (allValues?.routeName && allValues?.routeCode && allValues?.sectionNo) { |
||||
|
form.setFieldsValue({ |
||||
|
'startingPlaceName': data[0]?.startingPlaceName, |
||||
|
'stopPlaceName': data[0]?.stopPlaceName |
||||
|
}) |
||||
|
} else { |
||||
|
form.setFieldsValue({ |
||||
|
'startingPlaceName': null, |
||||
|
'stopPlaceName': null |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
}}> |
||||
|
<Form.Item label='道路类型' name='type' initialValue={editData?.road?.level ? (editData?.road?.level + "道") : ""} > |
||||
|
<Input disabled style={{ marginBottom: 10 }} /> |
||||
|
</Form.Item> |
||||
|
<Form.Item |
||||
|
label="路线名称" |
||||
|
name="routeName" |
||||
|
rules={[{ required: true, message: '请选择路线名称' }]} |
||||
|
> |
||||
|
<Select style={{ marginBottom: 10 }} allowClear showSearch={true} placeholder="请选择路线名称" options={nameList?.map(v => ({ value: v, label: v })) || []} /> |
||||
|
</Form.Item> |
||||
|
<Form.Item |
||||
|
label="路线代码" |
||||
|
name="routeCode" |
||||
|
rules={[{ required: true, message: '请选择路线代码' }]} |
||||
|
> |
||||
|
<Select style={{ marginBottom: 10 }} allowClear showSearch={true} placeholder="请选择路线代码" options={codeList?.map(v => ({ value: v, label: v })) || []} /> |
||||
|
</Form.Item> |
||||
|
<Form.Item |
||||
|
label="路段序号" |
||||
|
name="sectionNo" |
||||
|
rules={[{ required: true, message: '请选择抽取比例' }]} |
||||
|
> |
||||
|
<Select style={{}} allowClear showSearch={true} placeholder="请选择抽取比例" options={indexList?.map(v => ({ value: v, label: v })) || []} /> |
||||
|
</Form.Item> |
||||
|
|
||||
|
<Form.Item label='起点地名' name='startingPlaceName'> |
||||
|
<Input disabled /> |
||||
|
</Form.Item> |
||||
|
<Form.Item label='止点地名' name='stopPlaceName'> |
||||
|
<Input disabled /> |
||||
|
</Form.Item> |
||||
|
</Form> |
||||
|
</Modal> |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
) |
||||
|
} |
||||
|
function mapStateToProps (state) { |
||||
|
const { auth, road } = state |
||||
|
//('state1', state)
|
||||
|
return { |
||||
|
user: auth.user, |
||||
|
road: road?.data || [], |
||||
|
} |
||||
|
} |
||||
|
export default connect(mapStateToProps)(Adjustment); |
@ -1,669 +1,190 @@ |
|||||
import { connect } from 'react-redux'; |
import { connect } from 'react-redux'; |
||||
import React, { useEffect, useState } from 'react'; |
import React, { useEffect, useState } from 'react'; |
||||
import { Button, Modal, Form, Input, Divider, Spin, Image, DatePicker, Descriptions, Table } from 'antd' |
import { Button, Modal, Form, Input, Divider, Spin, Select, DatePicker, Descriptions, Table } from 'antd' |
||||
import ProTable from '@ant-design/pro-table'; |
const { TextArea } = Input; |
||||
import { getReportSpotPrepare, getSpotCheck, getSpotCheckDetail } from '../actions/extract' |
import { roadSpotChangList } from '../actions/spotCheck'; |
||||
import { getReportDetail } from '../actions/patrol'; |
|
||||
import moment from 'moment' |
import moment from 'moment' |
||||
import '../components/maintenanceTable.less' |
import '../components/maintenanceTable.less' |
||||
|
|
||||
|
|
||||
const DetailForm = (props) => { |
|
||||
const { visible, data, handleClose, loading } = props |
const AdjustLog = (props) => { |
||||
//console.log('data1', data)
|
const { dispatch, user, loading, reportDetail, reportDetailLoading, detailLoading } = props |
||||
const [qndmn] = useState(localStorage.getItem('qndmn')) |
const [data, setData] = useState()//外层表格的数据
|
||||
const changeBoolean = (bool) => { |
const [vis, setVis] = useState(false)//模态框的显示与隐藏变量
|
||||
// console.log('bool', bool)
|
const [count, setCount] = useState(0) |
||||
return bool ? '无异常' : '有异常' |
const [page, setPage] = useState(1) |
||||
} |
const [depName, setDepName] = useState('') |
||||
const reportTypeText = (text) => { |
const [total, setTotal] = useState(0) |
||||
switch (text) { |
const [previewId, setPreviewId] = useState(0) |
||||
case 'road': return '道路'; |
const [reportData, setReportData] = useState([]) |
||||
//
|
const [detailList, setDetailList] = useState([]) |
||||
case 'countyRoad': return '县道'; |
const [detailVisible, setDetailVisible] = useState(false) |
||||
case 'villageRoad': return '乡道'; |
const [dateRange, setDateRange] = useState([]); |
||||
case 'rusticRoad': return '村道'; |
const { RangePicker } = DatePicker |
||||
//
|
const [expandedRowKeys, setExpandedRowKeys] = useState([]); |
||||
case 'bridge': return '桥梁'; |
|
||||
case 'culvert': return '涵洞'; |
|
||||
case 'other': return '其他'; |
//console.log('reportData', reportData)
|
||||
//
|
const [form] = Form.useForm() |
||||
case 'conserve': return '养护'; |
|
||||
case 'patrol': return '巡查'; |
|
||||
case 'construction': return '在建'; |
|
||||
default: return text; |
//里层列名
|
||||
} |
const columns = [ |
||||
} |
{ |
||||
const keyList = [ |
title: '抽查日期', |
||||
{ key: '路线代码', name: 'codeRoad' }, |
key: 'date', |
||||
{ key: '其他', name: 'projectType' }, |
dataIndex: 'date', |
||||
{ key: '道路类型', name: 'reportType' }, |
render: (_, record) => record?.roadSpotCheckPreview?.date && moment(record?.roadSpotCheckPreview?.date).format('YYYY-MM-DD') || '--' |
||||
{ key: '路线名称', name: 'road' }, |
}, |
||||
{ key: '路线代码', name: 'codeRoad' }, |
{ |
||||
{ key: '养护路段', name: 'roadSectionStart' }, |
title: '调整内容', |
||||
{ key: '具体位置', name: 'address' }, |
key: 'content', |
||||
{ key: '路面类型', name: 'roadType' }, |
dataIndex: 'content', |
||||
{ key: '路面宽度(米)', name: 'roadWidth' }, |
}, |
||||
{ key: '错车道(个)', name: 'wrongLane' }, |
{ |
||||
{ key: '行道树(棵)', name: 'roadsideTrees' }, |
title: '调整人员', |
||||
{ key: '边沟(米)', name: 'roadsideDitch' }, |
key: 'user', |
||||
{ key: '护栏(米)', name: 'guardrail' }, |
dataIndex: 'user', |
||||
{ key: '标线(米)', name: 'roadMarking' }, |
render: (_, record) => record?.user?.name || '--' |
||||
{ key: '养护人员人数(人)', name: 'maintenanceStaffCount' }, |
}, |
||||
{ key: '修整路肩(平方米)', name: 'shoulderRepair' }, |
{ |
||||
{ key: '清理边沟(米)', name: 'ditchCleaning' }, |
title: '调整时间', |
||||
{ key: '修补沥青路面(平方米)', name: 'asphaltRepair' }, |
key: 'time', |
||||
{ key: '修补水泥路面(平方米)', name: 'concreteRepair' }, |
dataIndex: 'time', |
||||
{ key: '除草(米)', name: 'grassMowing' }, |
render: (_, record) => record?.time && moment(record?.time).format('YYYY-MM-DD HH:mm:ss') || '--' |
||||
{ key: '树刷白(株/公里)', name: 'treeWhitening' }, |
|
||||
{ key: '桩刷白(个)', name: 'pileWhitening' }, |
}, |
||||
{ key: '维护护栏(个)', name: 'guardrailMaintenance' }, |
{ |
||||
{ key: '修复端头(块)', name: 'endHeadRepair' }, |
title: '操作', |
||||
{ key: '其他养护内容', name: 'otherDescription' }, |
key: 'operation', |
||||
{ key: '养护前图片', name: 'conserveBeforePic' }, |
dataIndex: 'operation', |
||||
{ key: '养护中图片', name: 'conserveUnderwayPic' }, |
render: (_, record) => <Button type="link" onClick={() => { |
||||
{ key: '养护后图片', name: 'conserveAfterPic' }, |
setVis(true) |
||||
{ key: '上报视频', name: 'videoUrl' }, |
form.setFieldsValue({ |
||||
|
'date': record?.roadSpotCheckPreview?.date && moment(record?.roadSpotCheckPreview?.date).format('YYYY-MM-DD') || '--', |
||||
]; |
'content': record?.content, |
||||
const keyListOld = [ |
'user': record?.user?.name || '--', |
||||
// { key: '编号', name: 'id' },
|
'time': record?.time && moment(record?.time).format('YYYY-MM-DD HH:mm:ss') || '--', |
||||
{ key: '工程类型', name: 'projectType' }, |
}) |
||||
{ key: '所在路段', name: 'road' }, |
}}> 查看详情 </Button > |
||||
{ key: '具体位置', name: 'address' }, |
|
||||
{ key: '巡查内容', name: 'content' }, |
}, |
||||
{ key: '路线代码', name: 'codeRoad' }, |
|
||||
// { key: '病害照片', name: 'scenePic' },
|
] |
||||
{ key: '养护前', name: 'conserveBeforePic' }, |
const queryData = (data = {}) => { |
||||
{ key: '养护中', name: 'conserveUnderwayPic' }, |
dispatch(roadSpotChangList(data)).then(res => { |
||||
{ key: '养护后', name: 'conserveAfterPic' }, |
if (res.success) { |
||||
|
setReportData(res?.payload.data) |
||||
]; |
} |
||||
const roadInfo = [ |
}) |
||||
{ key: '路面类型', name: 'roadType' }, |
} |
||||
{ key: '路面宽度/米', name: 'roadWidth' }, |
|
||||
{ key: '错车道/个', name: 'wrongLane' }, |
|
||||
{ key: '行道树/棵', name: 'roadsideTrees' }, |
|
||||
{ key: '边沟/米', name: 'roadsideDitch' }, |
|
||||
{ key: '护栏/米', name: 'guardrail' }, |
useEffect(() => { |
||||
{ key: '标线/米', name: 'roadMarking' }, |
queryData() |
||||
]; |
}, []) |
||||
const mantenanceInfo = [ |
|
||||
{ key: '养护人员人数/人', name: 'maintenanceStaffCount' }, |
|
||||
{ key: '修整路肩/平方米', name: 'shoulderRepair' }, |
|
||||
{ key: '开挖、清理边沟/米', name: 'ditchCleaning' }, |
|
||||
{ key: '修补沥青路面/平米', name: 'asphaltRepair' }, |
|
||||
{ key: '修补水泥路面/平米', name: 'concreteRepair' }, |
const cancelHandler = () => { |
||||
{ key: '除草/米', name: 'grassMowing' }, |
setVis(false) |
||||
{ key: '行道树刷白/株/公里', name: 'treeWhitening' }, |
form.resetFields() |
||||
{ key: '公里桩/百米桩刷漆/个', name: 'pileWhitening' }, |
} |
||||
{ key: '维修护栏/米', name: 'guardrailMaintenance' }, |
|
||||
{ key: '修复端头/块', name: 'endHeadRepair' }, |
|
||||
{ key: '其他', name: 'otherDescription' }, |
|
||||
]; |
return ( |
||||
const mantenancePic = [ |
<div> |
||||
{ key: '养护前图片', name: 'conserveBeforePic' }, |
|
||||
{ key: '养护中图片', name: 'conserveUnderwayPic' }, |
<div style={{ marginBottom: 16 }}> |
||||
{ key: '养护后图片', name: 'conserveAfterPic' }, |
抽查日期: |
||||
]; |
<RangePicker value={dateRange[0] ? [moment(dateRange[0]), moment(dateRange[1])] : []} onChange={(date, dateString) => { |
||||
const renderContent = (data) => { |
setDateRange(dateString) |
||||
if (data) { |
}} style={{ marginRight: 20 }} /> |
||||
console.log('data1111', data) |
<Button style={{ marginRight: 20 }} onClick={() => { |
||||
if (moment(data.time).isAfter(moment('2023-08-03 00:00:00'))) { |
setPage(1) |
||||
return <div className='maintenanceNew'> |
setExpandedRowKeys([]) |
||||
<Descriptions title="基础信息" bordered style={{ marginBottom: 20 }}> |
queryData({ startTime: dateRange[0], endTime: dateRange[1] }) |
||||
<Descriptions.Item label="道路类型">{data['codeRoad'] && data['codeRoad'].length ? data['codeRoad'][0] === 'X' ? '县道' : data['codeRoad'][0] === 'Y' ? '乡道' : '村道' : ''}</Descriptions.Item> |
}} > 查询 </Button> |
||||
<Descriptions.item label="其他">{reportTypeText(data['projectType']) || ''}</Descriptions.item> |
<Button style={{ marginRight: 20 }} onClick={() => { |
||||
<Descriptions.item label="路线代码">{data['codeRoad'] || ''}</Descriptions.item> |
setDateRange([]) |
||||
<Descriptions.item label="路线名称">{data['code'] || ''}</Descriptions.item> |
}} > 重置 </Button> |
||||
<Descriptions.item label="养护路段" span={2}>{data['roadSectionStart'] + '-' + data['roadSectionEnd'] || ''}</Descriptions.item> |
|
||||
<Descriptions.Item label="具体位置" span={3} >{data['address'] || ''}</Descriptions.Item> |
</div> |
||||
</Descriptions> |
|
||||
<Descriptions title="道路信息" bordered style={{ marginBottom: 20 }}> |
|
||||
{roadInfo.map(item => ( |
<Table |
||||
<Descriptions.Item label={item.key}> |
columns={columns} |
||||
{data[item.name] || ''} |
dataSource={reportData} |
||||
</Descriptions.Item> |
loading={loading} |
||||
))} |
pagination={{ |
||||
</Descriptions> |
total: reportData?.length || 0, |
||||
<Descriptions title="道路信息" bordered style={{ marginBottom: 20 }}> |
pageSize: 10, |
||||
{mantenanceInfo.map(item => ( |
current: page || 1, |
||||
<Descriptions.Item label={item.key}> |
defaultPageSize: 10, |
||||
{data[item.name] || ''} |
showSizeChanger: false, |
||||
</Descriptions.Item> |
onChange: (page, pageSize) => { |
||||
))} |
setPage(page) |
||||
</Descriptions> |
} |
||||
<Descriptions title="养护图片" bordered style={{ marginBottom: 20 }} > |
}} |
||||
{mantenancePic.map(item => ( |
rowKey={(record) => { return record.id }} |
||||
<Descriptions.Item label={item.key} span={3} > |
/> |
||||
<div style={{ width: '70%', display: 'flex', position: 'relative', flexWrap: 'wrap' }}> |
|
||||
{data[item.name]?.map(imgSrc => { |
|
||||
return <div style={{ width: '50px', margin: 6, display: 'flex' }}> |
{vis && <Modal visible={vis} onCancel={cancelHandler} title='查看详情' |
||||
<Image src={qndmn + '/' + imgSrc} width={'100%'} style={{ marginBottom: 4 }} /> |
footer={<Button onClick={() => { |
||||
</div> |
setVis(false) |
||||
}) || '暂无图片'} |
form.resetFields() |
||||
</div> |
}} > 重置 </Button>} |
||||
</Descriptions.Item> |
onOk={() => { |
||||
))} |
form.resetFields() |
||||
</Descriptions> |
setVis(false) |
||||
<Descriptions title="养护视频" bordered style={{ marginBottom: 20 }} > |
}}> |
||||
<Descriptions.Item label={'养护视频'} span={3}> |
<Form form={form}> |
||||
<div style={{ width: '70%', display: 'flex', position: 'relative', flexWrap: 'wrap' }}> |
|
||||
{data['videoUrl']?.map(videoSrc => { |
<Form.Item label='抽查日期' name='date'> |
||||
return <div style={{ width: '44%', margin: 6, display: 'flex' }}> |
<Input disabled /> |
||||
<video src={qndmn + '/' + videoSrc} width={'100%'} style={{ marginBottom: 4 }} controls /> |
</Form.Item> |
||||
</div> |
<Form.Item label='调整内容' name='content'> |
||||
}) || '暂无视频'} |
<TextArea |
||||
</div> |
disabled |
||||
</Descriptions.Item> |
placeholder="" |
||||
</Descriptions> |
autoSize={{ |
||||
</div> |
minRows: 2, |
||||
// if (data) {
|
maxRows: 6, |
||||
// if (moment(data.time).isAfter(moment('2023-08-03 00:00:00'))) {
|
}} |
||||
// return keyList.map(obj => {
|
/> |
||||
// return <div style={{ display: 'flex', width: '100%', justifyContent: 'space-between', margin: '12px 0' }}>
|
</Form.Item> |
||||
// <span style={{ fontSize: 16, color: 'gray', minWidth: '26%' }}>{obj.key}</span>
|
<Form.Item label='调整人员' name='user'> |
||||
// {
|
<Input disabled /> |
||||
// obj.name != 'conserveBeforePic' && obj.name != 'conserveAfterPic' && obj.name != 'roadSectionStart' && obj.name != 'videoUrl' && obj.name.indexOf('conserve') == -1 ?
|
</Form.Item> |
||||
// <Input
|
<Form.Item label='调整时间' name='time'> |
||||
// style={{ width: '60%' }}
|
<Input disabled /> |
||||
// value={
|
</Form.Item> |
||||
// obj.name == 'id' ?
|
</Form> |
||||
// moment(data.time).format("YYYYMMDD") * 10000 + data.id
|
</Modal>} |
||||
// :
|
|
||||
// obj.name == 'projectType' ?
|
|
||||
// reportTypeText(data[obj.name])
|
|
||||
// : obj.name == 'reportType' && data['codeRoad'] ? data['codeRoad'][0] === 'X' ? '县道'
|
</div> |
||||
// : data['codeRoad'][0] === 'Y' ? '乡道' : '村道' :
|
) |
||||
// data[obj.name]
|
|
||||
// }
|
|
||||
// disabled
|
|
||||
// />
|
|
||||
// : obj.name != 'roadSectionStart' && obj.name != 'videoUrl' ?
|
|
||||
// <div style={{ width: '70%', display: 'flex', position: 'relative', flexWrap: 'wrap' }}>
|
|
||||
// {
|
|
||||
// data[obj.name] && data[obj.name] instanceof Array ? data[obj.name].map(imgSrc => {
|
|
||||
// return <div style={{ width: '44%', margin: 6 }}>
|
|
||||
// <Image src={qndmn + '/' + imgSrc} width={'100%'} style={{ marginBottom: 4 }} />
|
|
||||
// </div>
|
|
||||
// }) : '暂无图片'
|
|
||||
// }
|
|
||||
// </div> : obj.name != 'videoUrl' ? <div style={{ width: '60%', display: 'flex', position: 'relative', flexWrap: 'wrap' }}>
|
|
||||
// <Input style={{ width: '100%' }} disabled value={data[obj.name] + '-' + data['roadSectionEnd']} />
|
|
||||
|
|
||||
// </div> : <div style={{ width: '70%', display: 'flex', position: 'relative', flexWrap: 'wrap' }}>
|
|
||||
// {
|
|
||||
// data[obj.name] && data[obj.name] instanceof Array ? data[obj.name].map(videoUrl => {
|
|
||||
// return <div style={{ width: '44%', margin: 6 }}>
|
|
||||
// <video width={'100%'} style={{ marginBottom: 4 }} >
|
|
||||
// <source src={qndmn + '/' + videoUrl} type="video/mp4" controls />
|
|
||||
// </video>
|
|
||||
// </div>
|
|
||||
// }) : '暂无视频'
|
|
||||
// }
|
|
||||
// </div>
|
|
||||
// }
|
|
||||
|
|
||||
// </div>
|
|
||||
// })
|
|
||||
|
|
||||
// } else {
|
|
||||
// return keyListOld.map(obj => {
|
|
||||
// return <div style={{ display: 'flex', width: '100%', justifyContent: 'space-between', margin: '12px 0' }}>
|
|
||||
// <span style={{ fontSize: 16, color: 'gray', minWidth: '26%' }}>{obj.key}</span>
|
|
||||
// {
|
|
||||
// obj.name != 'scenePic' && obj.name.indexOf('conserve') == -1 ?
|
|
||||
// <Input
|
|
||||
// style={{ width: '70%' }}
|
|
||||
// value={
|
|
||||
// obj.name == 'id' ?
|
|
||||
// moment(data.time).format("YYYYMMDD") * 10000 + data.id
|
|
||||
// :
|
|
||||
// obj.name == 'projectType' ?
|
|
||||
// reportTypeText(data[obj.name]) :
|
|
||||
// data[obj.name]
|
|
||||
// }
|
|
||||
// disabled
|
|
||||
// />
|
|
||||
// :
|
|
||||
// <div style={{ width: '70%', display: 'flex', position: 'relative', flexWrap: 'wrap' }}>
|
|
||||
// {
|
|
||||
// data[obj.name] && data[obj.name] instanceof Array ? data[obj.name].map(imgSrc => {
|
|
||||
// return <div style={{ width: '44%', margin: 6 }}>
|
|
||||
// <Image src={qndmn + '/' + imgSrc} width={'100%'} style={{ marginBottom: 4 }} />
|
|
||||
// </div>
|
|
||||
// }) : '暂无图片'
|
|
||||
// }
|
|
||||
// </div>
|
|
||||
|
|
||||
// }
|
|
||||
// </div>
|
|
||||
// })
|
|
||||
|
|
||||
// }
|
|
||||
|
|
||||
} else { |
|
||||
return <div className='maintenanceNew'> |
|
||||
<Descriptions title="养护信息" bordered style={{ marginBottom: 20 }} column={3}> |
|
||||
<Descriptions.Item label="道路类型">{data['codeRoad'] && data['codeRoad'].length ? data['codeRoad'][0] === 'X' ? '县道' : data['codeRoad'][0] === 'Y' ? '乡道' : '村道' : ''}</Descriptions.Item> |
|
||||
<Descriptions.item label="养护路段" >{data['roadSectionStart'] && data['roadSectionEnd'] ? (data['roadSectionStart'] + '-' + data['roadSectionEnd']) : ''}</Descriptions.item> |
|
||||
<Descriptions.item label="路线代码">{data['codeRoad'] || ''}</Descriptions.item> |
|
||||
{/* <Descriptions.item label="路线名称">{data['code'] || ''}</Descriptions.item> */} |
|
||||
<Descriptions.Item label="具体位置" span={3} >{data['address'] || ''}</Descriptions.Item> |
|
||||
<Descriptions.Item label="养护内容" span={3} >{data['content'] || ''}</Descriptions.Item> |
|
||||
</Descriptions> |
|
||||
<Descriptions title="养护图片" bordered style={{ marginBottom: 20 }} > |
|
||||
{mantenancePic.map(item => ( |
|
||||
<Descriptions.Item label={item.key} className="custom-item" span={3}> |
|
||||
<div style={{ width: '70%', display: 'flex', position: 'relative', flexWrap: 'wrap' }}> |
|
||||
{data[item.name]?.map(imgSrc => { |
|
||||
return <div style={{ width: '50px', margin: 6, display: 'flex' }}> |
|
||||
<Image src={qndmn + '/' + imgSrc} width={'100%'} style={{ marginBottom: 4 }} /> |
|
||||
</div> |
|
||||
}) || '暂无图片'} |
|
||||
</div> |
|
||||
</Descriptions.Item> |
|
||||
))} |
|
||||
</Descriptions> |
|
||||
<Descriptions title="养护视频" bordered style={{ marginBottom: 20 }} > |
|
||||
<Descriptions.Item label={'养护视频'} className="custom-item" > |
|
||||
<div style={{ width: '70%', display: 'flex', position: 'relative', flexWrap: 'wrap' }}> |
|
||||
{data['videoUrl']?.map(videoSrc => { |
|
||||
return <div style={{ width: '44%', margin: 6, display: 'flex' }}> |
|
||||
<video src={qndmn + '/' + videoSrc} width={'100%'} style={{ marginBottom: 4 }} controls /> |
|
||||
</div> |
|
||||
}) || '暂无视频'} |
|
||||
</div> |
|
||||
</Descriptions.Item> |
|
||||
</Descriptions> |
|
||||
</div> |
|
||||
} |
|
||||
} else { |
|
||||
return '暂无数据' |
|
||||
} |
|
||||
} |
|
||||
// const renderContent = (data) => {
|
|
||||
// if (data) {
|
|
||||
// if (data['inspectionNoException']) {
|
|
||||
// // 当'无异常'字段为true时,显示'无异常'和其他非异常相关字段
|
|
||||
// return keyList.map(obj => {
|
|
||||
// if (obj.name === 'inspectionNoException' || obj.name === 'reportType' || obj.name === 'projectType' || obj.name === 'road' || obj.name === 'roadSectionStart' || obj.name === 'address' || obj.name === 'codeRoad' || obj.name === 'scenePic' || obj.name === 'videoUrl') {
|
|
||||
// return (
|
|
||||
// <div style={{ display: 'flex', width: '100%', justifyContent: 'space-between', margin: '12px 0' }}>
|
|
||||
// <span style={{ fontSize: 16, color: 'gray', minWidth: '26%' }}>{obj.key}</span>
|
|
||||
// {
|
|
||||
// obj.name === 'scenePic' && data[obj.name] instanceof Array ?
|
|
||||
// <div style={{ width: '70%', display: 'flex', position: 'relative', flexWrap: 'wrap' }}>
|
|
||||
// {
|
|
||||
// data[obj.name].map(imgSrc => {
|
|
||||
// return <div style={{ width: '44%', margin: 6 }}>
|
|
||||
// <Image src={qndmn + '/' + imgSrc} width={'100%'} style={{ marginBottom: 4 }} />
|
|
||||
// </div>
|
|
||||
// })
|
|
||||
// }
|
|
||||
// </div>
|
|
||||
// : obj.name === 'roadSectionStart' ?
|
|
||||
// <div style={{ width: '70%', display: 'flex', position: 'relative', flexWrap: 'wrap' }}>
|
|
||||
// <Input style={{ width: '100%' }} disabled value={data[obj.name] + '-' + data['roadSectionEnd']} />
|
|
||||
// </div>
|
|
||||
// :
|
|
||||
// <Input
|
|
||||
// style={{ width: '70%' }}
|
|
||||
// value={
|
|
||||
// obj.name === 'inspectionNoException' ?
|
|
||||
// '无异常'
|
|
||||
// :
|
|
||||
// obj.name === 'id'
|
|
||||
// ? moment(data.time).format("YYYYMMDD") * 10000 + data.id
|
|
||||
// : obj.name === 'projectType' || obj.name === 'reportType'
|
|
||||
// ? reportTypeText(data[obj.name])
|
|
||||
// : data[obj.name]
|
|
||||
// }
|
|
||||
// disabled
|
|
||||
// />
|
|
||||
// }
|
|
||||
// </div>
|
|
||||
// );
|
|
||||
// } else {
|
|
||||
// return null; // 不渲染异常相关字段
|
|
||||
// }
|
|
||||
// });
|
|
||||
// } else {
|
|
||||
// // 当'无异常'字段为false或未定义时,显示其他异常相关字段
|
|
||||
// return keyList.map(obj => {
|
|
||||
// if (obj.name !== 'inspectionNoException') {
|
|
||||
// return (
|
|
||||
// <div style={{ display: 'flex', width: '100%', justifyContent: 'space-between', margin: '12px 0' }}>
|
|
||||
// <span style={{ fontSize: 16, color: 'gray', minWidth: '26%' }}>{obj.key}</span>
|
|
||||
// {
|
|
||||
// obj.name !== 'scenePic' && obj.name !== 'roadSectionStart' && obj.name.indexOf('conserve') === -1 ?
|
|
||||
// <Input
|
|
||||
// style={{ width: '70%' }}
|
|
||||
// value={
|
|
||||
// obj.name === 'id'
|
|
||||
// ? moment(data.time).format("YYYYMMDD") * 10000 + data.id
|
|
||||
// : obj.name === 'projectType' || obj.name === 'reportType'
|
|
||||
// ? reportTypeText(data[obj.name])
|
|
||||
// : data[obj.name]
|
|
||||
// }
|
|
||||
// disabled
|
|
||||
// />
|
|
||||
// : obj.name !== 'roadSectionStart' ?
|
|
||||
// <div style={{ width: '70%', display: 'flex', position: 'relative', flexWrap: 'wrap' }}>
|
|
||||
// {
|
|
||||
// data[obj.name] && data[obj.name] instanceof Array ? data[obj.name].map(imgSrc => {
|
|
||||
// return <div style={{ width: '44%', margin: 6 }}>
|
|
||||
// <Image src={qndmn + '/' + imgSrc} width={'100%'} style={{ marginBottom: 4 }} />
|
|
||||
// </div>
|
|
||||
// }) : '暂无图片'
|
|
||||
// }
|
|
||||
// </div>
|
|
||||
// : <div style={{ width: '70%', display: 'flex', position: 'relative', flexWrap: 'wrap' }}>
|
|
||||
// <Input style={{ width: '100%' }} disabled value={data[obj.name] + '-' + data['roadSectionEnd']} />
|
|
||||
// </div>
|
|
||||
// }
|
|
||||
// </div>
|
|
||||
// );
|
|
||||
// } else {
|
|
||||
// return null; // 不渲染其他异常字段
|
|
||||
// }
|
|
||||
// });
|
|
||||
// }
|
|
||||
// } else {
|
|
||||
// return '暂无数据';
|
|
||||
// }
|
|
||||
// }
|
|
||||
return ( |
|
||||
<Modal |
|
||||
width={'60%'} |
|
||||
visible={visible} |
|
||||
footer={null} |
|
||||
onCancel={handleClose} |
|
||||
title={'养护管理详情'} |
|
||||
> |
|
||||
<Spin spinning={loading}> |
|
||||
{renderContent(data)} |
|
||||
</Spin> |
|
||||
</Modal> |
|
||||
) |
|
||||
} |
|
||||
const MaintenanceSpotCheck = (props) => { |
|
||||
const { dispatch, user, loading, reportDetail, reportDetailLoading } = props |
|
||||
const [data, setData] = useState()//外层表格的数据
|
|
||||
const [vis, setVis] = useState(false)//模态框的显示与隐藏变量
|
|
||||
const [count, setCount] = useState(0) |
|
||||
const [depId, setDepId] = useState(0) |
|
||||
const [depName, setDepName] = useState('') |
|
||||
const [total, setTotal] = useState(0) |
|
||||
const [previewId, setPreviewId] = useState(0) |
|
||||
const [reportData, setReportData] = useState([]) |
|
||||
const [detailVisible, setDetailVisible] = useState(false) |
|
||||
const [dateRange, setDateRange] = useState(['1970-1-1', '2099-12-31']); |
|
||||
const { RangePicker } = DatePicker |
|
||||
const [expandedRowKeys, setExpandedRowKeys] = useState([]); |
|
||||
|
|
||||
//console.log('reportData', reportData)
|
|
||||
const checkDetail = (record) => { |
|
||||
dispatch(getReportDetail(record?.id)) |
|
||||
} |
|
||||
const handleOpen = () => { |
|
||||
setDetailVisible(true) |
|
||||
} |
|
||||
const handleClose = () => { |
|
||||
setDetailVisible(false) |
|
||||
} |
|
||||
|
|
||||
//里层列名
|
|
||||
const columns = [ |
|
||||
{ |
|
||||
title: '抽查日期', |
|
||||
key: 'spotDate', |
|
||||
dataIndex: 'spotDate', |
|
||||
align: 'center', |
|
||||
// render: (_, record) => {
|
|
||||
// return
|
|
||||
// }
|
|
||||
}, |
|
||||
{ |
|
||||
title: '抽查乡镇', |
|
||||
key: 'projectType', |
|
||||
dataIndex: 'depName', |
|
||||
align: 'center', |
|
||||
|
|
||||
}, |
|
||||
{ |
|
||||
title: '抽查数量', |
|
||||
key: 'count', |
|
||||
dataIndex: 'count', |
|
||||
align: 'center', |
|
||||
|
|
||||
}, |
|
||||
{ |
|
||||
title: '抽查总数', |
|
||||
key: 'reportCount', |
|
||||
dataIndex: 'reportCount', |
|
||||
align: 'center', |
|
||||
|
|
||||
}, |
|
||||
|
|
||||
] |
|
||||
const queryData = (query = { startTime: '1970-1-1', endTime: '2099-12-31' }) => { |
|
||||
dispatch(getSpotCheckDetail(query)).then(res => { |
|
||||
if (res.success) { |
|
||||
const data = res?.payload.data?.map(item => { |
|
||||
return { |
|
||||
spotDate: moment(item.date).format('YYYY-MM-DD'), |
|
||||
depName: item.department?.name, |
|
||||
reportCount: item.reportCount, |
|
||||
count: Math.ceil((item.reportCount * item.percentage) / 100), |
|
||||
reportDetail: item.reportSpotChecks?.map(child => { |
|
||||
return child.report |
|
||||
}), |
|
||||
id: item.id |
|
||||
} |
|
||||
}) |
|
||||
//console.log('data1', data)
|
|
||||
setReportData(data) |
|
||||
} |
|
||||
}) |
|
||||
} |
|
||||
|
|
||||
useEffect(() => { |
|
||||
queryData() |
|
||||
}, []) |
|
||||
const [form] = Form.useForm() |
|
||||
const addHanler = () => { |
|
||||
setVis(true) |
|
||||
} |
|
||||
const extractHandler = () => { |
|
||||
form.validateFields(['percentValue']).then(async (values) => { |
|
||||
if (Number(values.percentValue) > 0) { |
|
||||
const res = await dispatch(getReportSpotPrepare({ percentage: Number(values.percentValue) })) |
|
||||
// setCount(res?.payload.data?.reportCount)
|
|
||||
// setDepId(res?.payload.data?.lukyDepartment?.id)
|
|
||||
// setDepName(res?.payload.data?.lukyDepartment?.name)
|
|
||||
setPreviewId(res?.payload.data?.previewId) |
|
||||
// setTotal(Math.ceil((res?.payload.data?.reportCount) * (Number(values.percentValue) / 100)))
|
|
||||
|
|
||||
form.setFieldsValue({ |
|
||||
'result': res?.payload.data?.reportCount, |
|
||||
'village': res?.payload.data?.lukyDepartment?.name, |
|
||||
'total': Math.ceil((res?.payload.data?.reportCount) * (Number(values.percentValue) / 100)) |
|
||||
}) |
|
||||
} |
|
||||
}) |
|
||||
} |
|
||||
const cancelHandler = () => { |
|
||||
setVis(false) |
|
||||
form.resetFields() |
|
||||
} |
|
||||
const okHandler = async () => { |
|
||||
if (previewId !== 0) { |
|
||||
const res = await dispatch(getSpotCheck({ previewId })) |
|
||||
const rslt = res.payload.data.map(item => { |
|
||||
return { |
|
||||
spotDate: moment(item.date).format('YYYY-MM-DD'), |
|
||||
depName: item.department?.name, |
|
||||
reportCount: item.reportCount, |
|
||||
count: Math.ceil((item.reportCount * item.percentage) / 100), |
|
||||
reportDetail: item.reportSpotChecks?.map(child => { |
|
||||
return child.report |
|
||||
}), |
|
||||
id: item.id |
|
||||
} |
|
||||
}) || [] |
|
||||
setReportData(rslt) |
|
||||
form.resetFields() |
|
||||
setVis(false) |
|
||||
} |
|
||||
} |
|
||||
//console.log('setReportData', reportData)
|
|
||||
|
|
||||
const lookhandler = () => { |
|
||||
if ((dateRange && dateRange instanceof Array && dateRange[0] != '')) { |
|
||||
queryData({ startTime: moment(dateRange[0]).startOf('day').format('YYYY-MM-DD HH:mm:ss'), endTime: moment(dateRange[1]).endOf('day').format('YYYY-MM-DD HH:mm:ss') }) |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
return ( |
|
||||
<div> |
|
||||
<Button onClick={addHanler} type='primary' style={{ marginRight: '50px' }}> 新增 </Button> |
|
||||
<RangePicker onChange={(date, dateString) => { setDateRange(dateString) }} style={{ marginRight: '50px' }} /> |
|
||||
<Button onClick={lookhandler} > 查询 </Button> |
|
||||
<Divider /> |
|
||||
<ProTable |
|
||||
columns={columns} |
|
||||
dataSource={reportData} |
|
||||
loading={loading} |
|
||||
expandable={{ |
|
||||
//expandedRowKeys, // 控制哪些行展开,这里需要通过 state 管理
|
|
||||
defaultExpandedRowKeys: ['0'], |
|
||||
// onExpand: handleExpand,
|
|
||||
expandedRowRender: (record) => ( |
|
||||
< Table |
|
||||
pagination={false} |
|
||||
dataSource={record?.reportDetail} |
|
||||
columns={ |
|
||||
[ |
|
||||
{ title: '所属道路', dataIndex: 'road' }, |
|
||||
{ |
|
||||
title: '所在路段', |
|
||||
key: 'address', |
|
||||
dataIndex: 'address', |
|
||||
align: 'center', |
|
||||
render: (_, r) => { |
|
||||
return `${r?.roadSectionStart || ''}-${r?.roadSectionEnd || ''}` |
|
||||
} |
|
||||
}, |
|
||||
{ title: '具体位置', dataIndex: 'address' }, |
|
||||
{ |
|
||||
title: '上报人', |
|
||||
width: 100, |
|
||||
key: 'userName', |
|
||||
dataIndex: 'userName', |
|
||||
align: 'center', |
|
||||
render: (text, r) => { |
|
||||
return r?.user?.name || '' |
|
||||
} |
|
||||
}, |
|
||||
{ |
|
||||
title: '上报时间', |
|
||||
key: 'time', |
|
||||
dataIndex: 'time', |
|
||||
valueType: 'dateTime', |
|
||||
align: 'center', |
|
||||
render: (_, r) => { |
|
||||
return moment(r?.time).format('YYYY-MM-DD HH:mm:ss') |
|
||||
} |
|
||||
}, |
|
||||
{ |
|
||||
title: '操作', |
|
||||
key: 'caozuo', |
|
||||
align: 'center', |
|
||||
render: (_, r) => { |
|
||||
return <Button |
|
||||
onClick={() => { checkDetail(r); handleOpen() }} |
|
||||
style={{ marginRight: 10 }}>查看</Button> |
|
||||
} |
|
||||
} |
|
||||
// { title: '', dataIndex: 'subColumn1' },
|
|
||||
// { title: '', dataIndex: 'subColumn2' },
|
|
||||
// ... 其他子表格列配置
|
|
||||
]} |
|
||||
/> |
|
||||
), |
|
||||
}} |
|
||||
pagination={{ |
|
||||
pageSize: 10, |
|
||||
defaultPageSize: 10, |
|
||||
showSizeChanger: false, |
|
||||
}} |
|
||||
rowKey={(record) => { return record.id }} |
|
||||
toolBarRender={false} |
|
||||
search={false} |
|
||||
/> |
|
||||
<Modal visible={vis} onCancel={cancelHandler} title='养护抽查' onOk={okHandler}> |
|
||||
<Form form={form}> |
|
||||
<Form.Item |
|
||||
label="抽取比例(%)" |
|
||||
// name="percent"
|
|
||||
rules={[{ required: true, message: '请填写抽取比例' }]} |
|
||||
> |
|
||||
<Input.Group compact> |
|
||||
<Form.Item |
|
||||
name="percentValue" |
|
||||
noStyle |
|
||||
rules={[ |
|
||||
{ required: true, message: '请填写抽取比例' }, |
|
||||
{ |
|
||||
pattern: /^(100|\d{1,2})(\.\d{1,2})?$/, |
|
||||
message: '请输入有效的比例', |
|
||||
}, |
|
||||
]} |
|
||||
> |
|
||||
<Input style={{ width: '80%' }} placeholder="请输入抽取比例" /> |
|
||||
</Form.Item> |
|
||||
{/* <Form.Item |
|
||||
// name="percentSign"
|
|
||||
noStyle |
|
||||
style={{ width: '20%', textAlign: 'center' }} |
|
||||
> |
|
||||
% |
|
||||
</Form.Item> */} |
|
||||
</Input.Group> |
|
||||
</Form.Item> |
|
||||
<Form.Item className="ant-row" style={{ |
|
||||
textAlign: 'center', |
|
||||
}}> |
|
||||
<Button style={{}} type='primary' onClick={extractHandler}>开始抽取</Button> |
|
||||
</Form.Item> |
|
||||
<Form.Item label='抽查总数' name='result'> |
|
||||
<Input disabled /> |
|
||||
</Form.Item> |
|
||||
<Form.Item label='抽查乡镇' name='village'> |
|
||||
<Input disabled /> |
|
||||
</Form.Item> |
|
||||
<Form.Item label='抽查条数' name='total'> |
|
||||
<Input disabled /> |
|
||||
</Form.Item> |
|
||||
</Form> |
|
||||
</Modal> |
|
||||
<DetailForm visible={detailVisible} |
|
||||
handleClose={handleClose} |
|
||||
data={reportDetail} |
|
||||
loading={reportDetailLoading} /> |
|
||||
</div> |
|
||||
) |
|
||||
} |
} |
||||
function mapStateToProps (state) { |
function mapStateToProps (state) { |
||||
const { auth, spotCheckDetail, reportDetail } = state |
const { auth, roadSpotList, reportDetail, roadSpotDetail } = state |
||||
//('state1', state)
|
//('state1', state)
|
||||
return { |
return { |
||||
user: auth.user, |
user: auth.user, |
||||
loading: spotCheckDetail?.isRequesting, |
loading: roadSpotList?.isRequesting, |
||||
reportDetailLoading: reportDetail.isRequesting, |
detailLoading: roadSpotDetail?.isRequesting, |
||||
reportDetail: reportDetail.data, |
reportDetailLoading: reportDetail.isRequesting, |
||||
|
reportDetail: reportDetail.data, |
||||
} |
|
||||
|
} |
||||
} |
} |
||||
export default connect(mapStateToProps)(MaintenanceSpotCheck); |
export default connect(mapStateToProps)(AdjustLog); |
Loading…
Reference in new issue