Browse Source

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

release_0.0.1
巴林闲侠 3 years ago
parent
commit
7e6105a9dc
  1. 1
      Highways4Good
  2. 224
      web/client/src/sections/fillion/components/maintenanceTable.js
  3. 229
      web/client/src/sections/fillion/components/patrolTable.js
  4. 3
      web/client/src/sections/fillion/components/protable.less
  5. 4
      web/client/src/sections/fillion/containers/index.js
  6. 42
      web/client/src/sections/fillion/containers/maintenance.js
  7. 42
      web/client/src/sections/fillion/containers/patrol.js
  8. 6
      web/client/src/sections/fillion/nav-item.js
  9. 14
      web/client/src/sections/fillion/routes.js
  10. 2
      web/package.json

1
Highways4Good

@ -0,0 +1 @@
Subproject commit cbdfefa311b3a886f44cbc68f55bb6741655312b

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

@ -0,0 +1,224 @@
import { connect } from 'react-redux';
import './protable.less'
import { Card, Button, Popconfirm, Badge, Col, Row, DatePicker, Input } from 'antd';
import ProTable from '@ant-design/pro-table';
// import { Badge, Button } from 'antd';
import React, { useEffect, useState } from 'react';
// @ts-ignore
import styles from './protable.less';
const DetailList = (props) => {
const { patrolName } = props;
const [tableListDataSource, setTableListDataSource] = useState([]);
const columns = [
{
title: '问题编号',
key: 'num',
dataIndex: 'num',
align:'center'
}, {
title: '所属道路',
key: 'road',
dataIndex: 'road',
align:'center'
}, {
title: '所在路段',
key: 'address',
dataIndex: 'address',
align:'center'
}, {
title: '缺陷名称',
key: 'name',
dataIndex: 'name',
align:'center'
}, {
title: '巡查人',
width:100,
key: 'patrolName',
dataIndex: 'patrolName',
align:'center'
}, {
title: '上报时间',
key: 'createdAt',
dataIndex: 'createdAt',
valueType: 'dateTime',
align:'center'
}, {
title: '操作',
width:200,
key: 'option',
valueType: 'option',
align:'center',
render: () => [<Button style={{marginRight:10}}>查看</Button>,<Button ></Button>]
},
];
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 (
<ProTable
columns={columns}
dataSource={tableListDataSource}
pagination={{
pageSize: 10,
defaultPageSize:10,
showSizeChanger: false,
}}
rowKey="key"
toolBarRender={false}
search={false}
/>
);
};
const patrolNameListDataSource = [];
for (let i = 0; i < 10; i += 1) {
patrolNameListDataSource.push({
patrolName: `老大爷${i}`,
});
}
const IPList = (props) => {
const { onChange, patrolName } = props;
const columns = [
{
title: '巡更人员',
key: 'patrolName',
dataIndex: 'patrolName',
align:'center'
},
];
return (
<div className='spilce'>
<ProTable
columns={columns}
request={(params, sorter, filter) => {
// 表单搜索项会从 params 传入,传递给后端接口。
console.log(params, sorter, filter);
return Promise.resolve({
data: patrolNameListDataSource,
success: true,
});
}}
rowKey="patrolName"
rowClassName={(record) => {
return record.patrolName === patrolName ? styles['split-row-select-active'] : '';
}}
// toolbar={{
// search: {
// onSearch: (value) => {
// alert(value);
// },
// },
// }}
toolBarRender={()=>[
<Input placeholder='输入巡更人员名称'></Input>
]}
options={false}
pagination={false}
search={false}
onRow={(record) => {
return {
onClick: () => {
if (record.patrolName) {
onChange(record.patrolName);
}
},
};
}}
/></div>
);
};
const MaintenanceTable = () => {
const [patrolName, setPatrolName] = useState('老大爷0');
const { RangePicker } = DatePicker;
const tabList = [
{
key: 'tab1',
tab: '养护',
},
];
const contentList = {
tab1: [<div>
<Card style={{ flex: 1 }}>
<DetailList patrolName={patrolName} />
</Card>
</div>]
};
const [activeTabKey1, setActiveTabKey1] = useState('tab1');
const onTab1Change = (key) => {
setActiveTabKey1(key);
};
return (
<div className='card-protable'>
<Card >
<IPList onChange={(searchPatrolName) => setPatrolName(searchPatrolName)} patrolName={patrolName} />
</Card>
<Card
style={{ flex: 1 }}
tabList={tabList}
activeTabKey={activeTabKey1}
onTabChange={(key) => {
onTab1Change(key);
}}
>
<div style={{ marginBottom: 20}}>
<RangePicker />
<Button style={{marginLeft:20}}>查询</Button>
<Button style={{marginLeft:20}}>导出</Button>
</div>
{contentList[activeTabKey1]}
</Card>
</div>
);
};
function mapStateToProps(state) {
const { auth, depMessage } = state;
const pakData = (dep) => {
return dep.map((d) => {
return {
title: d.name,
value: d.id,
// children: d.type >= 2 ? [] : pakData(d.subordinate)
children: pakData(d.subordinate)
}
})
}
let depData = pakData(depMessage.data || [])
return {
user: auth.user,
depMessage: depMessage.data || [],
depLoading: depMessage.isRequesting,
depData,
};
}
export default connect(mapStateToProps)(MaintenanceTable);

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

@ -0,0 +1,229 @@
import { connect } from 'react-redux';
import './protable.less'
import { Card, Button, Popconfirm, Badge, Col, Row, DatePicker, Input } from 'antd';
import ProTable from '@ant-design/pro-table';
// import { Badge, Button } from 'antd';
import React, { useEffect, useState } from 'react';
// @ts-ignore
import styles from './protable.less';
const DetailList = (props) => {
const { patrolName } = props;
const [tableListDataSource, setTableListDataSource] = useState([]);
const columns = [
{
title: '问题编号',
key: 'num',
dataIndex: 'num',
align: 'center'
}, {
title: '所属道路',
key: 'road',
dataIndex: 'road',
align: 'center'
}, {
title: '所在路段',
key: 'address',
dataIndex: 'address',
align: 'center'
}, {
title: '缺陷名称',
key: 'name',
dataIndex: 'name',
align: 'center'
}, {
title: '巡查人',
width: 100,
key: 'patrolName',
dataIndex: 'patrolName',
align: 'center'
}, {
title: '上报时间',
key: 'createdAt',
dataIndex: 'createdAt',
valueType: 'dateTime',
align: 'center'
}, {
title: '操作',
width: 200,
key: 'option',
valueType: 'option',
align: 'center',
render: () => [<Button style={{ marginRight: 10 }}>查看</Button>, <Button ></Button>]
},
];
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 (
<ProTable
columns={columns}
dataSource={tableListDataSource}
pagination={{
pageSize: 10,
defaultPageSize: 10,
showSizeChanger: false,
}}
rowKey="key"
toolBarRender={false}
search={false}
/>
);
};
const patrolNameListDataSource = [];
for (let i = 0; i < 10; i += 1) {
patrolNameListDataSource.push({
patrolName: `老大爷${i}`,
});
}
const IPList = (props) => {
const { onChange, patrolName } = props;
const columns = [
{
title: '巡更人员',
key: 'patrolName',
dataIndex: 'patrolName',
align: 'center'
},
];
return (
<div className='spilce'>
<ProTable
columns={columns}
request={(params, sorter, filter) => {
// 表单搜索项会从 params 传入,传递给后端接口。
console.log(params, sorter, filter);
return Promise.resolve({
data: patrolNameListDataSource,
success: true,
});
}}
rowKey="patrolName"
rowClassName={(record) => {
return record.patrolName === patrolName ? styles['split-row-select-active'] : '';
}}
// toolbar={{
// search: {
// onSearch: (value) => {
// alert(value);
// },
// },
// }}
toolBarRender={() => [
<Input placeholder='输入巡更人员名称'></Input>
]}
options={false}
pagination={false}
search={false}
onRow={(record) => {
return {
onClick: () => {
if (record.patrolName) {
onChange(record.patrolName);
}
},
};
}}
/></div>
);
};
const PatrolTable = () => {
const [patrolName, setPatrolName] = useState('老大爷0');
const { RangePicker } = DatePicker;
const tabList = [
{
key: 'tab1',
tab: '巡更',
}, {
key: 'tab2',
tab: '巡更轨迹查询',
},
];
const contentList = {
tab1: [<div>
<Card style={{ flex: 1 }}>
<DetailList patrolName={patrolName} />
</Card>
</div>]
};
const [activeTabKey1, setActiveTabKey1] = useState('tab1');
const onTab1Change = (key) => {
setActiveTabKey1(key);
};
return (
<div className='card-protable'>
<Card >
<IPList onChange={(searchPatrolName) => setPatrolName(searchPatrolName)} patrolName={patrolName} />
</Card>
<Card
style={{ flex: 1 }}
tabList={tabList}
activeTabKey={activeTabKey1}
onTabChange={(key) => {
onTab1Change(key);
}}
>
{
activeTabKey1 == 'tab1' ? <div style={{ marginBottom: 20 }}>
<RangePicker />
<Button style={{ marginLeft: 20 }}>查询</Button>
<Button style={{ marginLeft: 20 }}>导出</Button>
</div> : ''
}
{contentList[activeTabKey1]}
</Card>
</div>
);
};
function mapStateToProps(state) {
const { auth, depMessage } = state;
const pakData = (dep) => {
return dep.map((d) => {
return {
title: d.name,
value: d.id,
// children: d.type >= 2 ? [] : pakData(d.subordinate)
children: pakData(d.subordinate)
}
})
}
let depData = pakData(depMessage.data || [])
return {
user: auth.user,
depMessage: depMessage.data || [],
depLoading: depMessage.isRequesting,
depData,
};
}
export default connect(mapStateToProps)(PatrolTable);

3
web/client/src/sections/fillion/components/protable.less

@ -11,6 +11,9 @@
.split-row-select-active {
background-color: #e6f7ff;
}
th {
display: none;
}
}
.card-protable{display: flex;
flex-direction:row;

4
web/client/src/sections/fillion/containers/index.js

@ -9,4 +9,6 @@ import Enforce from './enforce';
import Public from './public';
import Videois from './videois';
import PromoTional from './promotional';
export { Infor,transportation,BridgeTable,HigHways,OperaTional,Enforce,Public,Videois,PromoTional };
import Maintenance from './maintenance';
import Patrol from './patrol';
export { Infor,transportation,BridgeTable,HigHways,OperaTional,Enforce,Public,Videois,PromoTional,Maintenance,Patrol };

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

@ -0,0 +1,42 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import '../style.less';
import { getDepMessage, getReportStatistic } from "../actions/infor"
import MaintenanceTable from '../components/maintenanceTable';
const superagent = require('superagent');
const Maintenance = (props) => {
const { dispatch, user } = props
const [data, setData] = useState()
useEffect(() => {
// dispatch(getDepMessage())
dispatch(getReportStatistic())
setData(props)
}, []);
//批量导出
const exports = (ids, counts) => {
// console.log(user);
let reportIds = [];
if (ids.length)
reportIds = ids
else
reportIds = (counts || {}).ids || [];
superagent.post('/_report/http')
.send({ id: reportIds.map(i => Number(i)) }).end((err, res) => {
const resTextIs = res.text.split('/').pop()
window.open(
'/_api/' +
`attachments?src=files/${resTextIs}&filename=${encodeURIComponent(resTextIs)}&token=${user.token}`)
})
}
return (
<> <MaintenanceTable data={data} exports={exports} />
</>
)
}
function mapStateToProps(state) {
const { auth } = state
return {
user: auth.user,
}
}
export default connect(mapStateToProps)(Maintenance);

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

@ -0,0 +1,42 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import '../style.less';
import { getDepMessage, getReportStatistic } from "../actions/infor"
import PatrolTable from '../components/patrolTable';
const superagent = require('superagent');
const patrol = (props) => {
const { dispatch, user } = props
const [data, setData] = useState()
useEffect(() => {
// dispatch(getDepMessage())
dispatch(getReportStatistic())
setData(props)
}, []);
//批量导出
const exports = (ids, counts) => {
// console.log(user);
let reportIds = [];
if (ids.length)
reportIds = ids
else
reportIds = (counts || {}).ids || [];
superagent.post('/_report/http')
.send({ id: reportIds.map(i => Number(i)) }).end((err, res) => {
const resTextIs = res.text.split('/').pop()
window.open(
'/_api/' +
`attachments?src=files/${resTextIs}&filename=${encodeURIComponent(resTextIs)}&token=${user.token}`)
})
}
return (
<> <PatrolTable data={data} exports={exports} />
</>
)
}
function mapStateToProps(state) {
const { auth } = state
return {
user: auth.user,
}
}
export default connect(mapStateToProps)(patrol);

6
web/client/src/sections/fillion/nav-item.js

@ -23,6 +23,12 @@ export function getNavItem(user, dispatch) {
<Menu.Item key="fillionenforce">
<Link to="/fillion/enforce">执法管理</Link>
</Menu.Item>
<Menu.Item key="fillionmaintenance">
<Link to="/fillion/maintenance">养护管理</Link>
</Menu.Item>
<Menu.Item key="fillionpatrol">
<Link to="/fillion/patrol">巡查管理</Link>
</Menu.Item>
<Menu.Item key="fillionpublic">
<Link to="/fillion/public">公交管理</Link>
</Menu.Item>

14
web/client/src/sections/fillion/routes.js

@ -8,6 +8,8 @@ import { Enforce } from './containers';
import { Public } from './containers';
import { Videois } from './containers';
import { PromoTional } from './containers';
import { Maintenance } from './containers'
import { Patrol } from './containers'
export default [{
type: 'inner',
route: {
@ -54,6 +56,18 @@ export default [{
menuSelectKeys: ['fillionenforce'],
component: Enforce,
breadcrumb: '执法管理',
}, {
path: '/maintenance',
key: 'fillionmaintenance',
menuSelectKeys: ['fillionmaintenance'],
component: Maintenance,
breadcrumb: '养护管理',
}, {
path: '/patrol',
key: 'fillionpatrol',
menuSelectKeys: ['fillionpatrol'],
component: Patrol,
breadcrumb: '巡查管理',
}, {
path: '/public',
key: 'fillionpublic',

2
web/package.json

@ -6,7 +6,7 @@
"scripts": {
"test": "mocha",
"start": "cross-env NODE_ENV=development npm run start-params",
"start-params": "npm run color && node server -p 5000 -u http://10.8.30.157:8439",
"start-params": "npm run color && node server -p 5000 -u https://3024-117-90-36-177.jp.ngrok.io",
"deploy": "export NODE_ENV=production&&npm run color && npm run build && node server",
"build-dev": "export NODE_ENV=development&&webpack --config webpack.config.js",
"build": "export NODE_ENV=production&&webpack --config webpack.config.prod.js",

Loading…
Cancel
Save