8 changed files with 1450 additions and 555 deletions
			
			
		
								
									
										File diff suppressed because it is too large
									
								
							
						
					| @ -0,0 +1,11 @@ | |||
| alter table road_spot_check_preview | |||
| 	add abstract_finish boolean; | |||
| 
 | |||
| comment on column road_spot_check_preview.abstract_finish is '是否全部抽取完'; | |||
| 
 | |||
| 
 | |||
| alter table road_spot_check_preview | |||
| 	add next_abstract jsonb; | |||
| 
 | |||
| comment on column road_spot_check_preview.next_abstract is '下次必抽道路'; | |||
| 
 | |||
| @ -0,0 +1,315 @@ | |||
| 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 { roadSpotPrepare, getTown } from '../actions/spotCheck' | |||
| 
 | |||
| import moment from 'moment' | |||
| import '../components/maintenanceTable.less' | |||
| 
 | |||
| 
 | |||
| 
 | |||
| const SpotCheck = ({ dispatch, user, loading, reportDetail, editData, onCancel, road, onOk, town = [], viewDetails }) => { | |||
| 
 | |||
| 
 | |||
|    const [countyRoadTime, setCountyRoadTime] = useState(true) | |||
|    const [currentValue, setCurrentValue] = useState({}) | |||
|    const [townDisabled, setTownDisabled] = useState({}) | |||
|    const [dataList, setDataList] = useState([]) | |||
| 
 | |||
| 
 | |||
| 
 | |||
|    const [form] = Form.useForm() | |||
| 
 | |||
| 
 | |||
| 
 | |||
| 
 | |||
|    useEffect(() => { | |||
|       if (!viewDetails) { | |||
| 
 | |||
|          if (editData?.id) { | |||
|             exhibition(editData) | |||
|             setCurrentValue(editData) | |||
| 
 | |||
|          } | |||
|       } else { | |||
| 
 | |||
|          let gather = [editData.gather['countyRoad']] | |||
|          town.forEach(d => { | |||
|             if (d.code != '360121205000') { | |||
|                gather.push(editData.gather[d.code] || {}) | |||
|             } | |||
| 
 | |||
|          }) | |||
|          setDataList(gather) | |||
|       } | |||
| 
 | |||
|    }, []) | |||
| 
 | |||
| 
 | |||
|    const exhibition = (show) => { | |||
|       form.setFieldsValue({ | |||
|          'countyPercentage': show?.countyPercentage, | |||
|          'townPercentage': show?.countyPercentage == 50 ? 25 : 50, | |||
|          'villagePercentage': show?.countyPercentage == 50 ? 10 : 20, | |||
|       }) | |||
| 
 | |||
|       let disabled = {} | |||
| 
 | |||
|       for (let code in show.gather) { | |||
|          if (code == 'countyRoad') { | |||
|             setCountyRoadTime(false) | |||
|             form.setFieldsValue({ | |||
|                'countyPresent': show.gather[code]?.countyPresent?.toFixed(4) || 0, | |||
|                'countyDifferenceValue': show.gather[code]?.countyDifferenceValue?.toFixed(4) || 0, | |||
|                'drawPeople': show.gather[code]?.drawPeople, | |||
|                'abstractTime': moment(show.gather[code]?.abstractTime), | |||
|             }) | |||
|          } else { | |||
|             form.setFieldsValue({ | |||
|                [code + 'townshipPresent']: show.gather[code]?.townshipPresent?.toFixed(4) || 0, | |||
|                [code + 'townshipDifferenceValue']: show.gather[code]?.townshipDifferenceValue?.toFixed(4) || 0, | |||
|                [code + 'villagePresent']: show.gather[code]?.villagePresent?.toFixed(4) || 0, | |||
|                [code + 'villageDifferenceValue']: show.gather[code]?.villageDifferenceValue?.toFixed(4) || 0, | |||
|                [code + 'drawPeople']: show.gather[code]?.drawPeople, | |||
|                [code + 'abstractTime']: moment(show.gather[code]?.abstractTime), | |||
|             }) | |||
|             disabled[code] = true | |||
|          } | |||
|       } | |||
| 
 | |||
|       setTownDisabled(disabled) | |||
| 
 | |||
|    } | |||
| 
 | |||
| 
 | |||
| 
 | |||
|    return ( | |||
|       <Modal | |||
|          visible={true} | |||
|          title={viewDetails ? "抽查详情" : '养护抽查'} | |||
|          width={1274} | |||
|          footer={null} | |||
|          onCancel={() => { | |||
|             onCancel() | |||
|          }} | |||
|          onOk={() => { | |||
| 
 | |||
| 
 | |||
|          }}> | |||
|          {viewDetails ? <div style={{ width: "100%" }}> | |||
|             <div style={{ textAlign: 'center', fontSize: 16 }}>南昌县农村公路养护管理暨用地范围内环境整治提升工程         考核汇总表</div> | |||
|             <Table | |||
|                // sticky
 | |||
|                scroll={{ | |||
|                   x: 2534, y: 600 | |||
|                }} | |||
|                pagination={false} | |||
|                columns={[{ title: '责任单位', dataIndex: 'name', key: 'name', fixed: 'left', }, | |||
|                { | |||
|                   title: '县道', | |||
|                   children: [ | |||
|                      { title: '总里程', dataIndex: 'county', key: 'county', render: (t, r) => t?.toFixed(4) }, | |||
|                      { title: '纳入考核里程', dataIndex: 'countyParticipate', key: 'countyParticipate', render: (t, r) => t?.toFixed(4) }, | |||
|                      { title: '本次考核里程', dataIndex: 'countyPresent', key: 'countyPresent', render: (t, r) => t?.toFixed(4) }, | |||
|                      { title: '实际抽取比原计划多', dataIndex: 'countyDifferenceValue', key: 'countyDifferenceValue', render: (t, r) => t?.toFixed(4) }, | |||
|                   ] | |||
|                }, | |||
|                { | |||
|                   title: '乡道', | |||
|                   children: [ | |||
|                      { title: '总里程', dataIndex: 'township', key: 'township', render: (t, r) => t?.toFixed(4) }, | |||
|                      { title: '纳入考核里程', dataIndex: 'townshipParticipate', key: 'townshipParticipate', render: (t, r) => t?.toFixed(4) }, | |||
|                      { title: '本次考核里程', dataIndex: 'townshipPresent', key: 'townshipPresent', render: (t, r) => t?.toFixed(4) }, | |||
|                      { title: '实际抽取比原计划多', dataIndex: 'townshipDifferenceValue', key: 'townshipDifferenceValue', render: (t, r) => t?.toFixed(4) }, | |||
|                   ] | |||
|                }, | |||
|                { | |||
|                   title: '村道', | |||
|                   children: [ | |||
|                      { title: '总里程', dataIndex: 'village', key: 'village', render: (t, r) => t?.toFixed(4) }, | |||
|                      { title: '纳入考核里程', dataIndex: 'villageParticipate', key: 'villageParticipate', render: (t, r) => t?.toFixed(4) }, | |||
|                      { title: '本次考核里程', dataIndex: 'villagePresent', key: 'villagePresent', render: (t, r) => t?.toFixed(4) }, | |||
|                      { title: '实际抽取比原计划多', dataIndex: 'villageDifferenceValue', key: 'villageDifferenceValue', render: (t, r) => t?.toFixed(4) }, | |||
|                   ] | |||
|                }, | |||
|                { | |||
|                   title: '', | |||
|                   children: [ | |||
|                      { title: '抽查人', dataIndex: 'drawPeople', key: 'drawPeople', }, | |||
|                   ] | |||
|                }, | |||
|                { | |||
|                   title: '', | |||
|                   children: [ | |||
|                      { title: '抽查时间', dataIndex: 'abstractTime', key: 'abstractTime', width: 160, render: (t, r) => moment(t).format('YYYY-MM-DD HH:mm:ss') }, | |||
|                   ] | |||
|                }, | |||
|                { | |||
|                   title: '', | |||
|                   children: [ | |||
|                      { | |||
|                         title: '操作', dataIndex: 'action', key: 'action', fixed: 'right', | |||
|                         render: (t, r) => { | |||
|                            let roadId = [] | |||
|                            if (r.name == '南昌县交通运输局') { | |||
|                               roadId = r.countyRoadId || [] | |||
|                            } else { | |||
|                               roadId = [...r.townRoadId, ...r.villageRoadId] | |||
|                            } | |||
|                            return <a href={`/_api/road/spot/export?token=${user?.token}&previewId=${editData.id}&roadId=${roadId.join()}`}> 导出</a> | |||
|                         } | |||
|                      }, | |||
|                   ] | |||
|                },]} | |||
|                dataSource={dataList} | |||
|             /> | |||
|          </div> | |||
|             : <Form | |||
|                form={form} | |||
|                onValuesChange={(changedValues, allValues) => { | |||
| 
 | |||
| 
 | |||
| 
 | |||
|                }}> | |||
|                <div style={{ display: "flex" }} > | |||
|                   <Form.Item | |||
|                      label={'抽取县道比例(%)'} | |||
|                      name="countyPercentage" | |||
|                      rules={[ | |||
|                         { required: true, message: '请选择抽取比例' }, | |||
|                         // {
 | |||
|                         //    pattern: /^(100|\d{1,2})(\.\d{1,2})?$/,
 | |||
|                         //    message: '请输入有效的比例',
 | |||
|                         // },
 | |||
|                      ]} | |||
|                   > | |||
|                      <Select style={{ width: 150, marginRight: 20 }} placeholder="请选择抽取比例" options={[{ value: 50, label: '50%', }, { value: 75, label: '75%', }]} | |||
|                         onChange={v => { | |||
|                            // setShow(v)
 | |||
|                            form.setFieldsValue({ | |||
|                               'townPercentage': v == 75 ? 50 : 25, | |||
|                               'villagePercentage': v == 75 ? 20 : 10, | |||
|                            }) | |||
|                         }} /> | |||
|                   </Form.Item> | |||
|                   <Form.Item label='抽查人' name='drawPeople' rules={[{ required: true, message: '请输入抽查人' },]}> | |||
|                      <Input placeholder="抽查人" style={{ width: 100, marginRight: 20 }} /> | |||
|                   </Form.Item> | |||
|                   <Form.Item  > | |||
|                      <Button disabled={!countyRoadTime} style={{ marginRight: 20 }} type='primary' onClick={() => { | |||
|                         form.validateFields(['countyPercentage', 'drawPeople']).then((values) => { | |||
|                            console.log(111, values); | |||
|                            dispatch(roadSpotPrepare({ | |||
|                               countyPercentage: values.countyPercentage, drawPeople: values.drawPeople, level: '县' | |||
|                            })).then(res => { | |||
|                               if (res.success) { | |||
|                                  exhibition(res?.payload.data || {}) | |||
|                                  setCurrentValue(res?.payload.data || {}) | |||
|                               } | |||
|                            }) | |||
|                         }) | |||
|                      }}>开始抽取</Button> | |||
|                   </Form.Item> | |||
|                   <Form.Item   > | |||
|                      <Button disabled={countyRoadTime} style={{}} type='primary' > | |||
|                         <a href={`/_api/road/spot/export?token=${user?.token}&previewId=${currentValue.id}&roadId=${currentValue?.gather && currentValue?.gather['countyRoad']?.countyRoadId?.join()}`}> 导出</a> | |||
|                      </Button> | |||
|                   </Form.Item> | |||
|                </div> | |||
|                <div style={{ display: "flex" }}> | |||
|                   <Form.Item label='县道实际抽取(公里)' name='countyPresent'> | |||
|                      <Input disabled style={{ width: 100, marginRight: 20 }} /> | |||
|                   </Form.Item> | |||
|                   <Form.Item label='县道比计划多(公里)' name='countyDifferenceValue'> | |||
|                      <Input disabled style={{ width: 100, marginRight: 20 }} /> | |||
|                   </Form.Item> | |||
|                   <Form.Item name="abstractTime" label='抽取时间' > | |||
|                      <DatePicker disabled showTime format="YYYY-MM-DD HH:mm:ss" placeholder="" style={{ width: 174, }} /> | |||
|                   </Form.Item> | |||
|                </div> | |||
|                <div style={{ display: "flex", marginTop: 30, paddingLeft: 30 }}> | |||
|                   <Form.Item label={'抽取乡道比例(%)'} name="townPercentage" rules={[{ required: true, message: '请选择抽取比例' }]} | |||
|                   > | |||
|                      <Select disabled style={{ width: 150, marginRight: 20 }} placeholder="" options={[{ value: 25, label: '25%', }, { value: 50, label: '50%', }]} /> | |||
|                   </Form.Item> | |||
|                   <Form.Item label={'抽取村道比例(%)'} name="villagePercentage" rules={[{ required: true, message: '请选择抽取比例' }]} | |||
|                   > | |||
|                      <Select disabled style={{ width: 150, marginRight: 20 }} placeholder="" options={[{ value: 10, label: '10%', }, { value: 20, label: '20%', }]} /> | |||
|                   </Form.Item> | |||
|                </div> | |||
|                <div style={{ display: "flex", marginBottom: 10 }}> | |||
|                   <div style={{ width: 66, marginLeft: 34 }}>责任单位</div> | |||
|                   <div style={{ width: 150 }}>乡道实际抽取(公里)</div> | |||
|                   <div style={{ width: 150 }}>乡道比计划多(公里)</div> | |||
|                   <div style={{ width: 150 }}>村道实际抽取(公里)</div> | |||
|                   <div style={{ width: 150 }}>村道比计划多(公里)</div> | |||
|                   <div style={{ width: 120 }}>抽查人</div> | |||
|                   <div style={{ width: 196 }}>抽查时间</div> | |||
|                   <div style={{ width: 100 }}>操作</div> | |||
|                </div> | |||
|                {town?.map(d => { | |||
|                   return <div style={{ display: "flex" }} > | |||
|                      <div style={{ width: 200, }}> | |||
|                         <Form.Item label={d.name} name={d.code + 'townshipPresent'} labelCol={{ span: 12, }} > | |||
|                            <Input disabled style={{ width: 130, }} /> | |||
|                         </Form.Item> | |||
|                      </div> | |||
|                      <Form.Item name={d.code + 'townshipDifferenceValue'}> | |||
|                         <Input disabled style={{ width: 130, marginRight: 20, marginLeft: 50 }} /> | |||
|                      </Form.Item> | |||
|                      <Form.Item name={d.code + 'villagePresent'}> | |||
|                         <Input disabled style={{ width: 130, marginRight: 20 }} /> | |||
|                      </Form.Item> | |||
|                      <Form.Item name={d.code + 'villageDifferenceValue'}> | |||
|                         <Input disabled style={{ width: 130, marginRight: 20 }} /> | |||
|                      </Form.Item> | |||
|                      <Form.Item name={d.code + 'drawPeople'} rules={[{ required: true, message: '请填写抽查人' }]}> | |||
|                         <Input placeholder="抽查人" style={{ width: 100, marginRight: 20 }} /> | |||
|                      </Form.Item> | |||
|                      <Form.Item name={d.code + 'abstractTime'}  > | |||
|                         <DatePicker disabled showTime format="YYYY-MM-DD HH:mm:ss" placeholder="" style={{ width: 174, marginRight: 20, }} /> | |||
|                      </Form.Item> | |||
|                      <Form.Item  > | |||
|                         <Button disabled={countyRoadTime ? true : townDisabled[d.code] ? true : false} style={{ marginRight: 20 }} type='primary' onClick={() => { | |||
|                            form.validateFields([d.code + 'drawPeople', 'countyPercentage']).then((values) => { | |||
|                               console.log(111, values); | |||
|                               dispatch(roadSpotPrepare({ | |||
|                                  countyPercentage: values.countyPercentage, drawPeople: values[d.code + 'drawPeople'], code: d.code | |||
|                               })).then(res => { | |||
|                                  if (res.success) { | |||
|                                     exhibition(res?.payload.data || {}) | |||
|                                     setCurrentValue(res?.payload.data || {}) | |||
|                                  } | |||
|                               }) | |||
|                            }) | |||
|                         }}>开始抽取</Button> | |||
|                      </Form.Item> | |||
|                      <Form.Item   > | |||
|                         <Button disabled={townDisabled[d.code] ? false : true} style={{}} type='primary'> | |||
|                            <a href={`/_api/road/spot/export?token=${user?.token}&previewId=${currentValue.id}&roadId=${currentValue?.gather | |||
|                               && [...(currentValue?.gather[d.code]?.townRoadId || []), ...(currentValue?.gather[d.code]?.villageRoadId | |||
|                                  || [])].join()}`}> 导出</a>
 | |||
|                         </Button> | |||
|                      </Form.Item> | |||
|                   </div> | |||
|                }) | |||
|                } | |||
|             </Form> | |||
| 
 | |||
|          } | |||
| 
 | |||
| 
 | |||
|       </Modal > | |||
| 
 | |||
|    ) | |||
| } | |||
| function mapStateToProps (state) { | |||
|    const { auth, road, } = state | |||
| 
 | |||
|    return { | |||
|       user: auth.user, | |||
|       road: road?.data || [], | |||
|       // town: town?.data || [],
 | |||
|    } | |||
| } | |||
| export default connect(mapStateToProps)(SpotCheck) | |||
					Loading…
					
					
				
		Reference in new issue