Browse Source

Merge branch 'dev' of https://gitea.anxinyun.cn/gao.zhiyuan/Highways4Good into dev

release_0.0.4
巴林闲侠 3 years ago
parent
commit
83b621cbc3
  1. 2
      api/app/lib/controllers/report/index.js
  2. 2
      web/client/src/sections/fillion/actions/index.js
  3. 38
      web/client/src/sections/fillion/actions/patrol.js
  4. 12
      web/client/src/sections/fillion/components/gis/patrolGis.js
  5. 349
      web/client/src/sections/fillion/components/maintenanceTable.js
  6. 298
      web/client/src/sections/fillion/components/patrolTable.js
  7. 7
      web/client/src/sections/fillion/containers/maintenance.js
  8. 5
      web/client/src/sections/fillion/containers/patrol.js
  9. 4
      web/client/src/utils/webapi.js

2
api/app/lib/controllers/report/index.js

@ -9,7 +9,7 @@ async function reportList (ctx) {
where: { where: {
}, },
attributes: ['id', 'road', 'time', 'projectType', 'roadSectionStart', 'roadSectionEnd', 'reportType'], attributes: ['id', 'road', 'time', 'projectType', 'roadSectionStart', 'roadSectionEnd', 'reportType', 'content'],
include: [{ include: [{
model: models.User, model: models.User,
attributes: ['name'] attributes: ['name']

2
web/client/src/sections/fillion/actions/index.js

@ -1,6 +1,8 @@
'use strict'; 'use strict';
import * as infor from './infor' import * as infor from './infor'
import * as patrol from './patrol'
export default { export default {
...infor, ...infor,
...patrol,
} }

38
web/client/src/sections/fillion/actions/patrol.js

@ -0,0 +1,38 @@
import { basicAction } from '@peace/utils'
import { ApiTable } from '$utils'
export function getReportList(query) {
return dispatch => basicAction({
type: 'get',
dispatch: dispatch,
actionType: 'GET_REPORT_LIST',
url: ApiTable.getReportList,
query,
msg: { error: '获取巡查数据失败' },
reducer: { name: 'reportList' }
});
}
export function getReportDetail(reportId) {
return dispatch => basicAction({
type: 'get',
dispatch: dispatch,
actionType: 'GET_REPORT_DETAIL_LIST',
url: ApiTable.getReportDetail.replace("{reportId}", reportId),
msg: { error: '获取巡查数据失败' },
reducer: { name: 'reportDetail' }
});
}
export function getUserList(query) {
return dispatch => basicAction({
type: 'get',
dispatch: dispatch,
actionType: 'GET_USER_LIST',
url: ApiTable.getUsers,
query,
msg: { error: '获取用户数据失败' },
reducer: { name: 'userList' }
});
}

12
web/client/src/sections/fillion/components/gis/patrolGis.js

@ -0,0 +1,12 @@
import React from 'react'
import PropTypes from 'prop-types'
function PatrolGis(props) {
return (
<div>PatrolGis</div>
)
}
PatrolGis.propTypes = {}
export default PatrolGis

349
web/client/src/sections/fillion/components/maintenanceTable.js

@ -1,79 +1,176 @@
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import './protable.less' import './protable.less'
import { Card, Button, Popconfirm, Badge, Col, Row, DatePicker, Input } from 'antd'; import { Card, Button, DatePicker, Input, Modal, Spin, Image, message, Popover } from 'antd';
import ProTable from '@ant-design/pro-table'; import ProTable from '@ant-design/pro-table';
// import { Badge, Button } from 'antd'; import { getReportList, getReportDetail } from '../actions/patrol';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { httpDel } from '@peace/utils'
import { PinyinHelper } from '@peace/utils';
// @ts-ignore // @ts-ignore
import styles from './protable.less'; import styles from './protable.less';
import moment from 'moment';
const DetailForm = (props) => {
const { visible, data, handleClose, loading } = props;
const keyList = [
{ key: '问题编号', name: 'id' },
{ key: '所在路段', name: 'road' },
{ key: '具体位置', name: 'address' },
{ key: '巡查内容', name: 'content' },
{ key: '病害照片', name: 'scenePic' },
{ key: '养护前', name: 'conserveBeforePic' },
{ key: '养护中', name: 'conserveUnderwayPic' },
{ key: '养护后', name: 'conserveAfterPic' },
];
const renderContent = (data) => {
if (data) {
return keyList.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 : 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={imgSrc} width={'100%'} style={{ marginBottom: 4 }} />
</div>
}) : '暂无图片'
}
</div>
}
</div>
})
} else {
return '暂无数据'
}
}
return (
<Modal
visible={visible}
footer={null}
onCancel={handleClose}
title={'巡更详细'}
>
<Spin spinning={loading}>
{renderContent(data)}
</Spin>
</Modal>
)
}
const DetailList = (props) => { const DetailList = (props) => {
const { patrolName } = props; const { reportList, loading, dispatch, handleOpen, handelRefresh } = props;
const [tableListDataSource, setTableListDataSource] = useState([]); const [visible, setVisible] = useState(false)
const [selectRecord, setSelectRecord] = useState();
const checkDetail = (record) => {
dispatch(getReportDetail(record.id))
}
const handleRemove = (record) => {
let url = 'report/{reportId}';
const actionType = "DEL_REPORT_RECORD";
const msg = {}
if (record) {
url = url.replace('{reportId}', record.id)
httpDel(dispatch, { url, actionType, msg }).then(res => {
if (res.success) {
message.success("记录删除成功")
handelRefresh();
} else {
message.error("记录删除失败")
}
})
}
}
const columns = [ const columns = [
{ {
title: '问题编号', title: '问题编号',
key: 'num', key: 'id',
dataIndex: 'num', dataIndex: 'id',
align:'center' align: 'center',
render: (text, record) => {
return moment(record.time).format("YYYYMMDD") * 10000 + record.id;
}
}, { }, {
title: '所属道路', title: '所属道路',
key: 'road', key: 'road',
dataIndex: 'road', dataIndex: 'road',
align:'center' align: 'center'
}, { }, {
title: '所在路段', title: '所在路段',
key: 'address', key: 'address',
dataIndex: 'address', dataIndex: 'address',
align:'center' align: 'center',
}, { render: (text, record) => {
return `${record.roadSectionStart || ''}-${record.roadSectionEnd || ''}`
}
},
{
title: '缺陷名称', title: '缺陷名称',
key: 'name', key: 'content',
dataIndex: 'name', dataIndex: 'content',
align:'center' align: 'center'
}, { },
{
title: '巡查人', title: '巡查人',
width:100, width: 100,
key: 'patrolName', key: 'userName',
dataIndex: 'patrolName', dataIndex: 'userName',
align:'center' align: 'center',
render: (text, record) => {
return record.user.name
}
}, { }, {
title: '上报时间', title: '上报时间',
key: 'createdAt', key: 'time',
dataIndex: 'createdAt', dataIndex: 'time',
valueType: 'dateTime', valueType: 'dateTime',
align:'center' align: 'center'
}, { }, {
title: '操作', title: '操作',
width:200, width: 200,
key: 'option', key: 'option',
valueType: 'option', valueType: 'option',
align:'center', align: 'center',
render: () => [<Button style={{marginRight:10}}>查看</Button>,<Button ></Button>] render: (text, record) => {
return [
<Button
onClick={() => { checkDetail(record); handleOpen(); }}
style={{ marginRight: 10 }}>查看</Button>,
<Popover
content={[
<div style={{ width: '100%', height: 30 }}>
<Button onClick={() => setVisible(false)} style={{ float: "right" }} ></Button>
<Button type="primary" onClick={() => handleRemove(record)} style={{ marginRight: 8, float: "right" }} ></Button>
</div>
]}
visible={selectRecord == record.id && visible}
trigger="click"
onClick={() => setSelectRecord(record.id)}
title="是否删除该记录?"
onVisibleChange={(newVisible) => setVisible(newVisible)}
>
<Button>删除</Button>
</Popover>
]
}
}, },
]; ];
useEffect(() => {
const source = [];
for (let i = 0; i < 25; i += 1) {
source.push({
num: `${i + 1}`,
road: `成华大道${i + 2}`,
address: `二仙桥${i + 3}`,
name: `缺失内容${i + 4}`,
patrolName: patrolName,
createdAt: Date.now() - Math.floor(Math.random() * 10000),
key: i,
});
}
setTableListDataSource(source);
}, [patrolName]);
return ( return (
<ProTable <ProTable
columns={columns} columns={columns}
dataSource={tableListDataSource} dataSource={reportList}
loading={loading}
pagination={{ pagination={{
pageSize: 10, pageSize: 10,
defaultPageSize:10, defaultPageSize: 10,
showSizeChanger: false, showSizeChanger: false,
}} }}
rowKey="key" rowKey="key"
@ -85,57 +182,52 @@ const DetailList = (props) => {
const patrolNameListDataSource = [];
for (let i = 0; i < 10; i += 1) {
patrolNameListDataSource.push({
patrolName: `老大爷${i}`,
});
}
const PatrolNameList = (props) => { const PatrolNameList = (props) => {
const { onChange, patrolName } = props; const [users, setUsers] = useState([]);
const { onChange, record, userList, loading } = props;
const { name } = record || { name: '' }
const columns = [ const columns = [
{ {
title: '巡更人员', title: '巡更人员',
key: 'patrolName', key: 'name',
dataIndex: 'patrolName', dataIndex: 'name',
align:'center' align: 'center'
}, },
]; ];
useEffect(() => {
if (userList && userList instanceof Array) {
let users = userList.filter(user => user.remark != 'sp');
setUsers(users);
}
}, [userList])
var timer = null;
const doUserNameSearch = (e) => {
const name = e.target.value;
if (timer) {
clearTimeout(timer)
} else {
setTimeout(() => {
let users = userList.filter(user => PinyinHelper.isSearchMatched(user.name, name) && user.remark != 'sp');
setUsers(users);
}, 500);
}
}
return ( return (
<div className='spilce'> <div className='spilce'>
<ProTable <ProTable
columns={columns} columns={columns}
request={(params, sorter, filter) => { dataSource={users}
// 表单搜索项会从 params 传入,传递给后端接口。 loading={loading}
console.log(params, sorter, filter); rowKey="name"
return Promise.resolve({
data: patrolNameListDataSource,
success: true,
});
}}
rowKey="patrolName"
rowClassName={(record) => { rowClassName={(record) => {
return record.patrolName === patrolName ? styles['split-row-select-active'] : ''; return record.patrolName === name ? styles['split-row-select-active'] : '';
}} }}
// toolbar={{ toolBarRender={() => [
// search: { <Input placeholder='输入养护人员名称' onChange={doUserNameSearch} ></Input>
// onSearch: (value) => {
// alert(value);
// },
// },
// }}
toolBarRender={()=>[
<Input placeholder='输入巡更人员名称'></Input>
]} ]}
options={false} options={false}
pagination={false} pagination={false}
@ -143,8 +235,9 @@ const PatrolNameList = (props) => {
onRow={(record) => { onRow={(record) => {
return { return {
onClick: () => { onClick: () => {
if (record.patrolName) { if (record) {
onChange(record.patrolName); console.log('record:', record)
onChange(record);
} }
}, },
}; };
@ -156,45 +249,64 @@ const PatrolNameList = (props) => {
const MaintenanceTable = () => { const MaintenanceTable = (props) => {
const [patrolName, setPatrolName] = useState('老大爷0'); const { userList, reportList, dispatch, reportListLoading, reportDetail, reportDetailLoading, userLoading } = props;
const [record, setRecord] = useState();
const [dateRange, setDateRange] = useState();
const [detailVisible, setDetailVisible] = useState(false)
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
const tabList = [
{ useEffect(() => {
key: 'tab1', if (userList && userList instanceof Array) {
tab: '养护', let users = userList.filter(user => user.remark != 'sp');
},
]; setRecord(users[0]);
const contentList = { }
tab1: [<div> }, [userList])
<Card style={{ flex: 1 }}>
<DetailList patrolName={patrolName} /> useEffect(() => {
</Card> if (record) {
</div>] let query = { userId: record.id, reportType: 'conserve' }
}; if ((dateRange && dateRange instanceof Array)) {
const [activeTabKey1, setActiveTabKey1] = useState('tab1'); query.startTime = moment(dateRange[0]).startOf('day').format('YYYY-MM-DD HH:mm:ss')
const onTab1Change = (key) => { query.endTime = moment(dateRange[1]).endOf('day').format('YYYY-MM-DD HH:mm:ss')
setActiveTabKey1(key); }
}; dispatch(getReportList(query));
}
}, [record, dateRange])
const handleClose = () => {
setDetailVisible(false)
}
const handleOpen = () => {
setDetailVisible(true)
}
const handelRefresh = () => {
let query = { userId: record.id, reportType: 'patrol' }
dispatch(getReportList(query));
}
return ( return (
<div className='card-protable'> <div className='card-protable'>
<Card > <Card >
<PatrolNameList onChange={(searchPatrolName) => setPatrolName(searchPatrolName)} patrolName={patrolName} /> <PatrolNameList onChange={(record) => setRecord(record)} record={record} userList={userList} loading={userLoading} handelRefresh={handelRefresh} />
</Card> </Card>
<Card <Card style={{ flex: 1 }} >
style={{ flex: 1 }} <div style={{ marginBottom: 20 }}>
tabList={tabList} <RangePicker onChange={(date, dateString) => { setDateRange(dateString) }} />
activeTabKey={activeTabKey1} <Button style={{ marginLeft: 20 }}>查询</Button>
onTabChange={(key) => { <Button style={{ marginLeft: 20 }}>导出</Button>
onTab1Change(key);
}}
>
<div style={{ marginBottom: 20}}>
<RangePicker />
<Button style={{marginLeft:20}}>查询</Button>
<Button style={{marginLeft:20}}>导出</Button>
</div> </div>
{contentList[activeTabKey1]} <Card style={{ flex: 1 }}>
<DetailList reportList={reportList} record={record} loading={reportListLoading} dispatch={dispatch} handleOpen={handleOpen} />
</Card>
<DetailForm
visible={detailVisible}
handleClose={handleClose}
data={reportDetail}
loading={reportDetailLoading} />
</Card> </Card>
</div> </div>
@ -202,13 +314,12 @@ const MaintenanceTable = () => {
}; };
function mapStateToProps(state) { function mapStateToProps(state) {
const { auth, depMessage } = state; const { auth, depMessage, userList, reportList, reportDetail } = state;
const pakData = (dep) => { const pakData = (dep) => {
return dep.map((d) => { return dep.map((d) => {
return { return {
title: d.name, title: d.name,
value: d.id, value: d.id,
// children: d.type >= 2 ? [] : pakData(d.subordinate)
children: pakData(d.subordinate) children: pakData(d.subordinate)
} }
}) })
@ -219,6 +330,12 @@ function mapStateToProps(state) {
depMessage: depMessage.data || [], depMessage: depMessage.data || [],
depLoading: depMessage.isRequesting, depLoading: depMessage.isRequesting,
depData, depData,
userList: userList.data || [],
userLoading: userList.isRequesting,
reportList: reportList.data,
reportListLoading: reportList.isRequesting,
reportDetail: reportDetail.data,
reportDetailLoading: reportDetail.isRequesting,
}; };
} }
export default connect(mapStateToProps)(MaintenanceTable); export default connect(mapStateToProps)(MaintenanceTable);

298
web/client/src/sections/fillion/components/patrolTable.js

@ -1,21 +1,104 @@
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import './protable.less' import './protable.less'
import { Card, Button, Popconfirm, Badge, Col, Row, DatePicker, Input } from 'antd'; import { Card, Button, Popconfirm, Badge, Col, Row, DatePicker, Input, Modal, Spin, Image, message, Popover } from 'antd';
import ProTable from '@ant-design/pro-table'; import ProTable from '@ant-design/pro-table';
// import { Badge, Button } from 'antd'; import { getReportList, getReportDetail } from '../actions/patrol';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { httpDel } from '@peace/utils'
import { PinyinHelper } from '@peace/utils';
import PatrolGis from './gis/patrolGis';
// @ts-ignore // @ts-ignore
import styles from './protable.less'; import styles from './protable.less';
import moment from 'moment';
const DetailForm = (props) => {
const { visible, data, handleClose, loading } = props;
const keyList = [
{ key: '问题编号', name: 'id' },
{ key: '所在路段', name: 'road' },
{ key: '具体位置', name: 'address' },
{ key: '巡查内容', name: 'content' },
{ key: '病害照片', name: 'scenePic' },
];
const renderContent = (data) => {
if (data) {
// Object.keys(data).map(key => {
// })
return keyList.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' ?
<Input style={{ width: '70%' }} value={obj.name == 'id' ? moment(data.time).format("YYYYMMDD") * 10000 + data.id : data[obj.name]} disabled />
:
<div style={{ width: '70%', display: 'flex', position: 'relative', flexWrap: 'wrap' }}>
{
data.scenePic && data.scenePic instanceof Array ? data.scenePic.map(imgSrc => {
return <div style={{ width: '44%', margin: 6 }}>
<Image src={imgSrc} width={'100%'} style={{ marginBottom: 4 }} />
</div>
}) : '暂无图片'
}
</div>
}
</div>
})
} else {
return '暂无数据'
}
}
return (
<Modal
visible={visible}
footer={null}
onCancel={handleClose}
title={'巡更详细'}
>
<Spin spinning={loading}>
{renderContent(data)}
</Spin>
</Modal>
)
}
const DetailList = (props) => { const DetailList = (props) => {
const { patrolName } = props; const { reportList, loading, dispatch, handleOpen, handelRefresh } = props;
const [tableListDataSource, setTableListDataSource] = useState([]); const [visible, setVisible] = useState(false)
const [selectRecord, setSelectRecord] = useState();
const checkDetail = (record) => {
dispatch(getReportDetail(record.id))
}
const handleRemove = (record) => {
let url = 'report/{reportId}';
const actionType = "DEL_REPORT_RECORD";
const msg = {}
if (record) {
url = url.replace('{reportId}', record.id)
httpDel(dispatch, { url, actionType, msg }).then(res => {
if (res.success) {
message.success("记录删除成功");
handelRefresh()
} else {
message.error("记录删除失败")
}
})
}
}
const columns = [ const columns = [
{ {
title: '问题编号', title: '问题编号',
key: 'num', key: 'id',
dataIndex: 'num', dataIndex: 'id',
align: 'center' align: 'center',
render: (text, record) => {
return moment(record.time).format("YYYYMMDD") * 10000 + record.id;
}
}, { }, {
title: '所属道路', title: '所属道路',
key: 'road', key: 'road',
@ -25,22 +108,30 @@ const DetailList = (props) => {
title: '所在路段', title: '所在路段',
key: 'address', key: 'address',
dataIndex: 'address', dataIndex: 'address',
align: 'center' align: 'center',
}, { render: (text, record) => {
return `${record.roadSectionStart || ''}-${record.roadSectionEnd || ''}`
}
},
{
title: '缺陷名称', title: '缺陷名称',
key: 'name', key: 'content',
dataIndex: 'name', dataIndex: 'content',
align: 'center' align: 'center'
}, { },
{
title: '巡查人', title: '巡查人',
width: 100, width: 100,
key: 'patrolName', key: 'userName',
dataIndex: 'patrolName', dataIndex: 'userName',
align: 'center' align: 'center',
render: (text, record) => {
return record.user.name
}
}, { }, {
title: '上报时间', title: '上报时间',
key: 'createdAt', key: 'time',
dataIndex: 'createdAt', dataIndex: 'time',
valueType: 'dateTime', valueType: 'dateTime',
align: 'center' align: 'center'
}, { }, {
@ -49,28 +140,35 @@ const DetailList = (props) => {
key: 'option', key: 'option',
valueType: 'option', valueType: 'option',
align: 'center', align: 'center',
render: () => [<Button style={{ marginRight: 10 }}>查看</Button>, <Button ></Button>] render: (text, record) => {
return [
<Button
onClick={() => { checkDetail(record); handleOpen(); }}
style={{ marginRight: 10 }}>查看</Button>,
<Popover
content={[
<div style={{ width: '100%', height: 30 }}>
<Button onClick={() => setVisible(false)} style={{ float: "right" }} ></Button>
<Button type="primary" onClick={() => handleRemove(record)} style={{ marginRight: 8, float: "right" }} ></Button>
</div>
]}
visible={selectRecord == record.id && visible}
trigger="click"
onClick={() => setSelectRecord(record.id)}
title="是否删除该记录?"
onVisibleChange={(newVisible) => setVisible(newVisible)}
>
<Button>删除</Button>
</Popover>
]
}
}, },
]; ];
useEffect(() => {
const source = [];
for (let i = 0; i < 25; i += 1) {
source.push({
num: `${i + 1}`,
road: `成华大道${i + 2}`,
address: `二仙桥${i + 3}`,
name: `缺失内容${i + 4}`,
patrolName: patrolName,
createdAt: Date.now() - Math.floor(Math.random() * 10000),
key: i,
});
}
setTableListDataSource(source);
}, [patrolName]);
return ( return (
<ProTable <ProTable
columns={columns} columns={columns}
dataSource={tableListDataSource} dataSource={reportList}
loading={loading}
pagination={{ pagination={{
pageSize: 10, pageSize: 10,
defaultPageSize: 10, defaultPageSize: 10,
@ -85,57 +183,51 @@ const DetailList = (props) => {
const patrolNameListDataSource = [];
for (let i = 0; i < 10; i += 1) {
patrolNameListDataSource.push({
patrolName: `老大爷${i}`,
});
}
const PatrolNameList = (props) => { const PatrolNameList = (props) => {
const { onChange, patrolName } = props; const [users, setUsers] = useState([]);
const { onChange, record, userList, loading } = props;
const { name } = record || { name: '' }
const columns = [ const columns = [
{ {
title: '巡更人员', title: '巡更人员',
key: 'patrolName', key: 'name',
dataIndex: 'patrolName', dataIndex: 'name',
align: 'center' align: 'center'
}, },
]; ];
useEffect(() => {
if (userList) {
setUsers(userList)
}
}, [userList])
var timer = null;
const doUserNameSearch = (e) => {
const name = e.target.value;
if (timer) {
clearTimeout(timer)
} else {
setTimeout(() => {
let users = userList.filter(user => PinyinHelper.isSearchMatched(user.name, name));
setUsers(users);
}, 500);
}
}
return ( return (
<div className='spilce'> <div className='spilce'>
<ProTable <ProTable
columns={columns} columns={columns}
request={(params, sorter, filter) => { dataSource={users}
// 表单搜索项会从 params 传入,传递给后端接口。 loading={loading}
console.log(params, sorter, filter); rowKey="name"
return Promise.resolve({
data: patrolNameListDataSource,
success: true,
});
}}
rowKey="patrolName"
rowClassName={(record) => { rowClassName={(record) => {
return record.patrolName === patrolName ? styles['split-row-select-active'] : ''; return record.patrolName === name ? styles['split-row-select-active'] : '';
}} }}
// toolbar={{
// search: {
// onSearch: (value) => {
// alert(value);
// },
// },
// }}
toolBarRender={() => [ toolBarRender={() => [
<Input placeholder='输入巡更人员名称'></Input> <Input placeholder='输入巡更人员名称' onChange={doUserNameSearch} ></Input>
]} ]}
options={false} options={false}
pagination={false} pagination={false}
@ -143,8 +235,9 @@ const PatrolNameList = (props) => {
onRow={(record) => { onRow={(record) => {
return { return {
onClick: () => { onClick: () => {
if (record.patrolName) { if (record) {
onChange(record.patrolName); console.log('record:', record)
onChange(record);
} }
}, },
}; };
@ -156,9 +249,43 @@ const PatrolNameList = (props) => {
const PatrolTable = () => { const PatrolTable = (props) => {
const [patrolName, setPatrolName] = useState('老大爷0'); const { userList, reportList, dispatch, reportListLoading, reportDetail, reportDetailLoading, userLoading } = props;
const [record, setRecord] = useState();
const [dateRange, setDateRange] = useState();
const [detailVisible, setDetailVisible] = useState(false)
const { RangePicker } = DatePicker; const { RangePicker } = DatePicker;
useEffect(() => {
if (userList && userList instanceof Array) {
setRecord(userList[0]);
}
}, [userList])
useEffect(() => {
if (record) {
let query = { userId: record.id, reportType: 'patrol' }
if ((dateRange && dateRange instanceof Array)) {
query.startTime = moment(dateRange[0]).startOf('day').format('YYYY-MM-DD HH:mm:ss')
query.endTime = moment(dateRange[1]).endOf('day').format('YYYY-MM-DD HH:mm:ss')
}
dispatch(getReportList(query));
}
}, [record, dateRange])
const handelRefresh = () => {
let query = { userId: record.id, reportType: 'patrol' }
dispatch(getReportList(query));
}
const handleClose = () => {
setDetailVisible(false)
}
const handleOpen = () => {
setDetailVisible(true)
}
const tabList = [ const tabList = [
{ {
key: 'tab1', key: 'tab1',
@ -171,9 +298,10 @@ const PatrolTable = () => {
const contentList = { const contentList = {
tab1: [<div> tab1: [<div>
<Card style={{ flex: 1 }}> <Card style={{ flex: 1 }}>
<DetailList patrolName={patrolName} /> <DetailList reportList={reportList} record={record} loading={reportListLoading} dispatch={dispatch} handleOpen={handleOpen} handelRefresh={handelRefresh} />
</Card> </Card>
</div>] </div>],
tab2: <PatrolGis />
}; };
const [activeTabKey1, setActiveTabKey1] = useState('tab1'); const [activeTabKey1, setActiveTabKey1] = useState('tab1');
const onTab1Change = (key) => { const onTab1Change = (key) => {
@ -182,7 +310,7 @@ const PatrolTable = () => {
return ( return (
<div className='card-protable'> <div className='card-protable'>
<Card > <Card >
<PatrolNameList onChange={(searchPatrolName) => setPatrolName(searchPatrolName)} patrolName={patrolName} /> <PatrolNameList onChange={(record) => setRecord(record)} record={record} userList={userList} loading={userLoading} />
</Card> </Card>
<Card <Card
style={{ flex: 1 }} style={{ flex: 1 }}
@ -194,12 +322,17 @@ const PatrolTable = () => {
> >
{ {
activeTabKey1 == 'tab1' ? <div style={{ marginBottom: 20 }}> activeTabKey1 == 'tab1' ? <div style={{ marginBottom: 20 }}>
<RangePicker /> <RangePicker onChange={(date, dateString) => { setDateRange(dateString) }} />
<Button style={{ marginLeft: 20 }}>查询</Button> <Button style={{ marginLeft: 20 }}>查询</Button>
<Button style={{ marginLeft: 20 }}>导出</Button> <Button style={{ marginLeft: 20 }}>导出</Button>
</div> : '' </div> : ''
} }
{contentList[activeTabKey1]} {contentList[activeTabKey1]}
<DetailForm
visible={detailVisible}
handleClose={handleClose}
data={reportDetail}
loading={reportDetailLoading} />
</Card> </Card>
</div> </div>
@ -207,13 +340,12 @@ const PatrolTable = () => {
}; };
function mapStateToProps(state) { function mapStateToProps(state) {
const { auth, depMessage } = state; const { auth, depMessage, userList, reportList, reportDetail } = state;
const pakData = (dep) => { const pakData = (dep) => {
return dep.map((d) => { return dep.map((d) => {
return { return {
title: d.name, title: d.name,
value: d.id, value: d.id,
// children: d.type >= 2 ? [] : pakData(d.subordinate)
children: pakData(d.subordinate) children: pakData(d.subordinate)
} }
}) })
@ -224,6 +356,12 @@ function mapStateToProps(state) {
depMessage: depMessage.data || [], depMessage: depMessage.data || [],
depLoading: depMessage.isRequesting, depLoading: depMessage.isRequesting,
depData, depData,
userList: userList.data || [],
userLoading: userList.isRequesting,
reportList: reportList.data,
reportListLoading: reportList.isRequesting,
reportDetail: reportDetail.data,
reportDetailLoading: reportDetail.isRequesting,
}; };
} }
export default connect(mapStateToProps)(PatrolTable); export default connect(mapStateToProps)(PatrolTable);

7
web/client/src/sections/fillion/containers/maintenance.js

@ -3,7 +3,9 @@ import { connect } from 'react-redux';
import '../style.less'; import '../style.less';
import { getDepMessage, getReportStatistic } from "../actions/infor" import { getDepMessage, getReportStatistic } from "../actions/infor"
import MaintenanceTable from '../components/maintenanceTable'; import MaintenanceTable from '../components/maintenanceTable';
import { getUserList } from '../actions/patrol';
const superagent = require('superagent'); const superagent = require('superagent');
const Maintenance = (props) => { const Maintenance = (props) => {
const { dispatch, user } = props const { dispatch, user } = props
const [data, setData] = useState() const [data, setData] = useState()
@ -12,6 +14,11 @@ const Maintenance = (props) => {
setData(props) setData(props)
}, []); }, []);
useEffect(() => {
dispatch(getUserList())
}, [true])
//批量导出 //批量导出
const exports = (ids, counts) => { const exports = (ids, counts) => {
// console.log(user); // console.log(user);

5
web/client/src/sections/fillion/containers/patrol.js

@ -2,6 +2,7 @@ import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import '../style.less'; import '../style.less';
import { getDepMessage, getReportStatistic } from "../actions/infor" import { getDepMessage, getReportStatistic } from "../actions/infor"
import { getUserList } from '../actions/patrol';
import PatrolTable from '../components/patrolTable'; import PatrolTable from '../components/patrolTable';
const superagent = require('superagent'); const superagent = require('superagent');
const patrol = (props) => { const patrol = (props) => {
@ -12,6 +13,10 @@ const patrol = (props) => {
setData(props) setData(props)
}, []); }, []);
useEffect(() => {
dispatch(getUserList())
}, [true])
//批量导出 //批量导出
const exports = (ids, counts) => { const exports = (ids, counts) => {
// console.log(user); // console.log(user);

4
web/client/src/utils/webapi.js

@ -39,6 +39,10 @@ export const ApiTable = {
getReportRectify: 'report/rectify', getReportRectify: 'report/rectify',
getReportRectifyDetail: 'report/rectify/detail', getReportRectifyDetail: 'report/rectify/detail',
compileReportRectifyDetail: 'report/rectify/detail', compileReportRectifyDetail: 'report/rectify/detail',
getReportList: 'report/list',
getReportDetail: 'report/{reportId}/detail',
getUsers: 'user',
//运政管理 //运政管理
getOperaTional: 'vehicle', getOperaTional: 'vehicle',

Loading…
Cancel
Save