dengyinhuan
2 years ago
104 changed files with 1651 additions and 4406 deletions
@ -1,15 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import { basicAction } from '@peace/utils' |
|
||||
import { ApiTable } from '$utils' |
|
||||
|
|
||||
export function getMembers(orgId) { |
|
||||
return dispatch => basicAction({ |
|
||||
type: 'get', |
|
||||
dispatch: dispatch, |
|
||||
actionType: 'GET_MEMBERS', |
|
||||
url: `${ApiTable.getEnterprisesMembers.replace('{enterpriseId}', orgId)}`, |
|
||||
msg: { error: '获取用户列表失败' }, |
|
||||
reducer: { name: 'members' } |
|
||||
}); |
|
||||
} |
|
@ -1,7 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import * as example from './example' |
|
||||
|
|
||||
export default { |
|
||||
...example |
|
||||
} |
|
@ -1,53 +0,0 @@ |
|||||
import React, { useEffect, useState } from 'react'; |
|
||||
import { connect } from 'react-redux'; |
|
||||
import { Spin, Card } from 'antd'; |
|
||||
import Build from './footer/build' |
|
||||
import '../style.less'; |
|
||||
import Header from './heand'; |
|
||||
import Footer from './footer'; |
|
||||
import ProTable, { TableDropdown } from '@ant-design/pro-table'; |
|
||||
|
|
||||
const Example = (props) => { |
|
||||
const { dispatch, actions, user, loading } = props |
|
||||
const [tabKey, setTabKey] = useState('leadership') |
|
||||
|
|
||||
useEffect(() => { |
|
||||
dispatch(actions.example.getMembers(user.orgId)) |
|
||||
}, []) |
|
||||
const tabChange = (tab) => { |
|
||||
//leader 领导驾驶舱 site 工地 toilet 公厕 light 照明 water水质 encomic经济 environment 生态环境 security 智慧安监
|
|
||||
// setCurrentTab(tab);
|
|
||||
setTabKey(tab) |
|
||||
// dispatch({ type: 'TAB-CHANGE', data: tab })
|
|
||||
} |
|
||||
|
|
||||
return ( |
|
||||
<Spin tip="biubiubiu~" spinning={loading}> |
|
||||
<div id='example2' style={{ |
|
||||
backgroundColor: "#031839", width: "100vw", height: "100vh", /* transform: `scale(${Math.min( |
|
||||
document.body.clientWidth / 1920, |
|
||||
document.body.clientHeight / 1080 |
|
||||
)})`, */
|
|
||||
}}> |
|
||||
<div style={{ width: "100%", height: "10%" }}> |
|
||||
<Header tabChange={tabChange} tabKey={tabKey} dispatch={dispatch} /> |
|
||||
</div> |
|
||||
<div style={{ width: "100%", height: "90%" }}> |
|
||||
<Footer tabKey={tabKey} /> |
|
||||
</div> |
|
||||
</div> |
|
||||
</Spin> |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
function mapStateToProps(state) { |
|
||||
const { auth, global, members } = state; |
|
||||
return { |
|
||||
loading: members.isRequesting, |
|
||||
user: auth.user, |
|
||||
actions: global.actions, |
|
||||
members: members.data |
|
||||
}; |
|
||||
} |
|
||||
|
|
||||
export default connect(mapStateToProps)(Example); |
|
@ -1,8 +0,0 @@ |
|||||
import React from 'react' |
|
||||
|
|
||||
const Build = () => { |
|
||||
return ( |
|
||||
<>Build</> |
|
||||
) |
|
||||
} |
|
||||
export default Build |
|
@ -1,8 +0,0 @@ |
|||||
import React from 'react' |
|
||||
|
|
||||
const Conserve = () => { |
|
||||
return ( |
|
||||
<>1212121</> |
|
||||
) |
|
||||
} |
|
||||
export default Conserve |
|
@ -1,8 +0,0 @@ |
|||||
import React from 'react' |
|
||||
|
|
||||
const Guanli = () => { |
|
||||
return ( |
|
||||
<>管理</> |
|
||||
) |
|
||||
} |
|
||||
export default Guanli |
|
@ -1,29 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Build from './build' |
|
||||
import Conserve from './conserve' |
|
||||
import Guanli from './guanli' |
|
||||
import Leadership from './leadership' |
|
||||
import Operation from './operation' |
|
||||
const Footer = ({ tabKey }) => { |
|
||||
return ( |
|
||||
<> |
|
||||
{ |
|
||||
(() => { |
|
||||
switch (tabKey) { |
|
||||
case 'build': |
|
||||
return <Build /> |
|
||||
case 'conserve': |
|
||||
return <Conserve /> |
|
||||
case "leadership": |
|
||||
return <Leadership /> |
|
||||
case "guanli": |
|
||||
return <Guanli /> |
|
||||
case "operation": |
|
||||
return <Operation /> |
|
||||
} |
|
||||
})() |
|
||||
} |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Footer |
|
@ -1,17 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Centerlefttop from "./centerleft/center-left-top" |
|
||||
import Centerleftcenter from "./centerleft/center-left-center" |
|
||||
import Centerleftcentertop from "./centerleft/center-left-centertop" |
|
||||
import Centerleftbottom from "./centerleft/center-left-bottom" |
|
||||
|
|
||||
const CenterLeft = () => { |
|
||||
return ( |
|
||||
<> |
|
||||
<div style={{ width: "23%", height: "100%", float: "left", marginLeft: "1%" }}> |
|
||||
<Centerlefttop /> |
|
||||
<Centerleftbottom /> |
|
||||
</div> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default CenterLeft |
|
@ -1,19 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Centerrighttop from "./centerRight/center-right-top" |
|
||||
import Centerrightcenter from "./centerRight/center-right-center" |
|
||||
import CenterRightcentertop from "./centerRight/center-right-centertop" |
|
||||
import Centerrightbottom from "./centerRight/center-right-bottom" |
|
||||
|
|
||||
const CenterLeft = () => { |
|
||||
return ( |
|
||||
<> |
|
||||
<div style={{ width: "23%", height: "100%", float: "right", marginRight: "1%" }}> |
|
||||
<Centerrighttop /> |
|
||||
<CenterRightcentertop /> |
|
||||
<Centerrightcenter /> |
|
||||
<Centerrightbottom /> |
|
||||
</div> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default CenterLeft |
|
@ -1,14 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Module from '../../../public/module' |
|
||||
|
|
||||
const Rightbottom = () => { |
|
||||
const style = { height: "33%" } |
|
||||
return ( |
|
||||
<> |
|
||||
<Module style={style}> |
|
||||
<div style={{ width: "40%", height: "40%", background: "red" }}></div> |
|
||||
</Module> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Rightbottom |
|
@ -1,14 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Module from '../../../public/module' |
|
||||
|
|
||||
const Rightcenter = () => { |
|
||||
const style = { height: "17%" } |
|
||||
return ( |
|
||||
<> |
|
||||
<Module style={style}> |
|
||||
<div style={{ width: "40%", height: "40%", background: "red" }}></div> |
|
||||
</Module> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Rightcenter |
|
@ -1,14 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Module from '../../../public/module' |
|
||||
|
|
||||
const Rightcentertop = () => { |
|
||||
const style = { height: "23%" } |
|
||||
return ( |
|
||||
<> |
|
||||
<Module style={style}> |
|
||||
<div style={{ width: "40%", height: "40%", background: "red" }}></div> |
|
||||
</Module> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Rightcentertop |
|
@ -1,15 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Module from '../../../public/module' |
|
||||
|
|
||||
const Righttop = (props) => { |
|
||||
const { } = props |
|
||||
const style = { height: "17%" } |
|
||||
return ( |
|
||||
<> |
|
||||
<Module style={style}> |
|
||||
<div style={{ width: "40%", height: "40%", background: "red" }}></div> |
|
||||
</Module> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Righttop |
|
@ -1,14 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Module from '../../../public/module' |
|
||||
|
|
||||
const Leftbottom = () => { |
|
||||
const style = { height: "23%", marginTop: "5%" } |
|
||||
return ( |
|
||||
<> |
|
||||
<Module style={style}> |
|
||||
<div style={{ width: "40%", height: "40%", background: "red" }}></div> |
|
||||
</Module> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Leftbottom |
|
@ -1,16 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Module from '../../../public/module' |
|
||||
|
|
||||
const Leftcenter = () => { |
|
||||
const style = { |
|
||||
height: "23%" |
|
||||
} |
|
||||
return ( |
|
||||
<> |
|
||||
<Module style={style}> |
|
||||
<div style={{ width: "40%", height: "40%", background: "red" }}></div> |
|
||||
</Module> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Leftcenter |
|
@ -1,14 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Module from '../../../public/module' |
|
||||
|
|
||||
const Leftcentertop = () => { |
|
||||
const style = { height: "23%" } |
|
||||
return ( |
|
||||
<> |
|
||||
<Module style={style}> |
|
||||
<div style={{ width: "40%", height: "40%", background: "red" }}></div> |
|
||||
</Module> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Leftcentertop |
|
@ -1,15 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Module from '../../../public/module' |
|
||||
|
|
||||
const Lefttop = (props) => { |
|
||||
const { } = props |
|
||||
const style = { height: "23%" } |
|
||||
return ( |
|
||||
<> |
|
||||
<Module style={style}> |
|
||||
<div style={{ width: "40%", height: "40%", background: "red" }}></div> |
|
||||
</Module> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Lefttop |
|
@ -1,18 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Left from './left' |
|
||||
import Right from './right' |
|
||||
import CenterLeft from "./centerLeft" |
|
||||
import Centerright from "./centerRight" |
|
||||
|
|
||||
const Leadership = () => { |
|
||||
return ( |
|
||||
<> |
|
||||
<Left /> |
|
||||
<CenterLeft /> |
|
||||
<Right /> |
|
||||
{/* <Centerright /> */} |
|
||||
|
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Leadership |
|
@ -1,17 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Lefttop from './left/left-top' |
|
||||
import Leftcenter from "./left/left-center" |
|
||||
import Leftbottom from './left/left-bottom' |
|
||||
|
|
||||
const Left = () => { |
|
||||
return ( |
|
||||
<> |
|
||||
<div style={{ width: "23%", height: "100%", float: "left" }}> |
|
||||
<Lefttop /> |
|
||||
<Leftcenter /> |
|
||||
<Leftbottom /> |
|
||||
</div> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Left |
|
@ -1,14 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Module from '../../../public/module' |
|
||||
|
|
||||
const Leftbottom = () => { |
|
||||
const style = { height: "25%", marginTop: "5%" } |
|
||||
return ( |
|
||||
<> |
|
||||
<Module style={style} title={""}> |
|
||||
|
|
||||
</Module> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Leftbottom |
|
@ -1,14 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Module from '../../../public/module' |
|
||||
|
|
||||
const Leftcenter = () => { |
|
||||
const style = { height: "30%", marginTop: "5%" } |
|
||||
return ( |
|
||||
<> |
|
||||
<Module style={style}> |
|
||||
<div style={{ width: "40%", height: "40%", background: "red" }}></div> |
|
||||
</Module> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Leftcenter |
|
@ -1,14 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Module from '../../../public/module' |
|
||||
|
|
||||
const Lefttop = () => { |
|
||||
const style = { height: "25%" } |
|
||||
return ( |
|
||||
<> |
|
||||
<Module style={style} title={"道路拥堵指数"} > |
|
||||
{/* <div style={{ width: "40%", height: "40%", background: "red" }}></div> */} |
|
||||
</Module> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Lefttop |
|
@ -1,16 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Righttop from './right/right-top' |
|
||||
import Rightcenter from './right/right-center' |
|
||||
import Rightbottom from './right/right-bottom' |
|
||||
|
|
||||
const Right = () => { |
|
||||
return ( |
|
||||
<> |
|
||||
<div style={{ width: "25%", height: "100%", float: "right" }}> |
|
||||
<Righttop /> |
|
||||
<Rightbottom /> |
|
||||
</div> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Right |
|
@ -1,14 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Module from '../../../public/module' |
|
||||
|
|
||||
const Rightbottom = () => { |
|
||||
const style = { height: "45%", marginTop: "5%" } |
|
||||
return ( |
|
||||
<> |
|
||||
<Module style={style}> |
|
||||
<div style={{ width: "40%", height: "40%", background: "red" }}></div> |
|
||||
</Module> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Rightbottom |
|
@ -1,9 +0,0 @@ |
|||||
import React from 'react' |
|
||||
|
|
||||
const Rightcenter = () => { |
|
||||
return ( |
|
||||
<><div style={{ width: /* width || */ "100%", height: /* height || */ "30%" }}> |
|
||||
</div></> |
|
||||
) |
|
||||
} |
|
||||
export default Rightcenter |
|
@ -1,13 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import Module from '../../../public/module' |
|
||||
|
|
||||
const Righttop = () => { |
|
||||
const style = { height: "45%" } |
|
||||
return ( |
|
||||
<> |
|
||||
<Module style={style}> |
|
||||
</Module> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Righttop |
|
@ -1,8 +0,0 @@ |
|||||
import React from 'react' |
|
||||
|
|
||||
const Operation = () => { |
|
||||
return ( |
|
||||
<>运营</> |
|
||||
) |
|
||||
} |
|
||||
export default Operation |
|
@ -1,40 +0,0 @@ |
|||||
import React, { useState, uesEffect } from 'react' |
|
||||
import { push } from 'react-router-redux'; |
|
||||
import "./style.less" |
|
||||
import { Tabs } from 'antd'; |
|
||||
|
|
||||
|
|
||||
const { TabPane } = Tabs; |
|
||||
const Header = (props) => { |
|
||||
const { dispatch, tabChange, tabKey } = props |
|
||||
// const [tab, setTad] = useState("base")
|
|
||||
const onClick = (tab) => { |
|
||||
// setTad({ tab })
|
|
||||
tabChange(tab) |
|
||||
} |
|
||||
const dianji = () => { |
|
||||
dispatch(push('/fillion/infor')) |
|
||||
} |
|
||||
return ( |
|
||||
<div style={{ position: "relative" }}> |
|
||||
<img style={{ width: "100%", position: "absolute" }} src='/assets/images/quanju/beijingtou.png' /> |
|
||||
<div className={tabKey == "build" ? "tabKey-map" : "notabKey"} style={{ backgroundImage: "url(/assets/images/quanju/zuobeijing.png)", backgroundSize: "100% 100%" }} onClick={() => { |
|
||||
onClick("build") |
|
||||
}}><a>建设</a></div> |
|
||||
<div className={tabKey == "conserve" ? "tabKey-map" : "notabKey"} style={{ left: "11.5%", backgroundImage: "url(/assets/images/quanju/zuobeijing.png)", backgroundSize: "100% 100%" }} onClick={() => { |
|
||||
onClick("conserve") |
|
||||
}}><a>养护</a></div> |
|
||||
<div className={tabKey == "leadership" ? "tabKey-map" : "notabKey"} style={{ left: "23%", backgroundImage: "url(/assets/images/quanju/zuobeijing.png)", backgroundSize: "100% 100%" }} onClick={() => { |
|
||||
onClick("leadership") |
|
||||
}}><a>领导驾驶舱</a></div> |
|
||||
<div className={tabKey == "guanli" ? "tabKey-map" : "notabKey"} style={{ left: "65%", backgroundImage: "url(/assets/images/quanju/youbeijing.png)", backgroundSize: "100% 100%" }} onClick={() => { |
|
||||
onClick("guanli") |
|
||||
}}><a>管理</a></div> |
|
||||
<div className={tabKey == "operation" ? "tabKey-map" : "notabKey"} style={{ left: "76%", backgroundImage: "url(/assets/images/quanju/youbeijing.png)", backgroundSize: "100% 100%" }} onClick={() => { |
|
||||
onClick("operation") |
|
||||
}}><a>运营</a></div> |
|
||||
<div style={{ color: "red", position: "absolute", left: "92%", top: "15px" }} onClick={() => dianji()}>南昌县运输交通总局</div> |
|
||||
</div> |
|
||||
) |
|
||||
} |
|
||||
export default Header |
|
@ -1,23 +0,0 @@ |
|||||
.tabKey-map{ |
|
||||
width: 12%; |
|
||||
height: 45px; |
|
||||
text-align: center; |
|
||||
position: absolute; |
|
||||
top: 30px; |
|
||||
a{ |
|
||||
color: #c3d4f5; |
|
||||
line-height: 45px; |
|
||||
} |
|
||||
} |
|
||||
.notabKey{ |
|
||||
width:12%; |
|
||||
height: 45px; |
|
||||
position: absolute; |
|
||||
top: 30px; |
|
||||
text-align: center; |
|
||||
a{ |
|
||||
color: #6593c6; |
|
||||
line-height: 45px; |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -1,6 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import Example from './example'; |
|
||||
import Build from './footer/build' |
|
||||
|
|
||||
export { Example, Build }; |
|
@ -1,4 +0,0 @@ |
|||||
@font-face { |
|
||||
font-family: "YouSheBiaoTiHei"; |
|
||||
src: url("/assets/fontziti/YouSheBiaoTiHei-2.ttf") format("truetype"); |
|
||||
} |
|
@ -1,22 +0,0 @@ |
|||||
import React from 'react' |
|
||||
import "./font.css" |
|
||||
|
|
||||
const Module = (props) => { |
|
||||
const { style, children, title } = props |
|
||||
return ( |
|
||||
<> |
|
||||
<div style={{ width: style?.width || "100%", height: style?.height || "30%", backgroundColor: "#042263", marginTop: style?.marginTop || "0" }}> |
|
||||
<div style={{ width: "100%", height: "40px"/* , backgroundColor: "#fff" */, position: "relative" }}> |
|
||||
{/* <p>{title || []}</p> */} |
|
||||
<img src='/assets/images/quanju/icon.png' style={{ width: "4%", position: "absolute", left: "3%", top: "20%" }} /> |
|
||||
<span style={{ position: "absolute", color: "#FFFFFF", fontSize: "24px", fontFamily: "YouSheBiaoTiHei", left: "8%" }}>{title || []}</span> |
|
||||
<img src='/assets/images/quanju/mokuaitou.png' style={{ width: "100%", height: "28px", position: "absolute", top: "12px" }} /> |
|
||||
</div> |
|
||||
<div style={{ width: "100%", height: "70%" }}> |
|
||||
{children} |
|
||||
</div> |
|
||||
</div> |
|
||||
</> |
|
||||
) |
|
||||
} |
|
||||
export default Module |
|
@ -1,15 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import reducers from './reducers'; |
|
||||
import routes from './routes'; |
|
||||
import actions from './actions'; |
|
||||
import { getNavItem } from './nav-item'; |
|
||||
|
|
||||
export default { |
|
||||
key: 'example2', |
|
||||
name: '书写示例', |
|
||||
reducers: reducers, |
|
||||
routes: routes, |
|
||||
actions: actions, |
|
||||
getNavItem: getNavItem |
|
||||
}; |
|
@ -1,16 +0,0 @@ |
|||||
import React from 'react'; |
|
||||
import { Link } from 'react-router-dom'; |
|
||||
import { Menu } from 'antd'; |
|
||||
import { SettingOutlined } from '@ant-design/icons'; |
|
||||
|
|
||||
const SubMenu = Menu.SubMenu; |
|
||||
|
|
||||
export function getNavItem(user, dispatch) { |
|
||||
return ( |
|
||||
<SubMenu key="example2" icon={<SettingOutlined />} title={'举个栗子'}> |
|
||||
<Menu.Item key="e1"> |
|
||||
<Link to="/example2/e1">举个棒子2</Link> |
|
||||
</Menu.Item> |
|
||||
</SubMenu> |
|
||||
); |
|
||||
} |
|
@ -1,5 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
export default { |
|
||||
|
|
||||
} |
|
@ -1,21 +0,0 @@ |
|||||
'use strict'; |
|
||||
import { Example, Build } from './containers'; |
|
||||
|
|
||||
export default [{ |
|
||||
type: 'outer', |
|
||||
route: { |
|
||||
path: '/quanju', |
|
||||
key: 'quanju', |
|
||||
breadcrumb: '栗子222', |
|
||||
exact: false, |
|
||||
component: Example, |
|
||||
// 不设置 component 则面包屑禁止跳转
|
|
||||
// childRoutes: [{
|
|
||||
// path: '/e2',
|
|
||||
// key: 'e2',
|
|
||||
// exact: false,
|
|
||||
// component: Build,
|
|
||||
// breadcrumb: '棒子',
|
|
||||
// }]
|
|
||||
} |
|
||||
}]; |
|
@ -1,3 +0,0 @@ |
|||||
#example:hover { |
|
||||
font-size: larger; |
|
||||
} |
|
@ -0,0 +1,128 @@ |
|||||
|
try { |
||||
|
const { Pool, Client } = require('pg') |
||||
|
const request = require('superagent'); |
||||
|
const Hex = require('crypto-js/enc-hex'); |
||||
|
const MD5 = require('crypto-js/md5'); |
||||
|
const XLSX = require('xlsx') |
||||
|
const path = require('path') |
||||
|
const fs = require("fs"); |
||||
|
|
||||
|
// 连接数据库
|
||||
|
const pool = new Pool({ |
||||
|
user: 'postgres', |
||||
|
host: '10.8.30.32', |
||||
|
database: 'highways4good', |
||||
|
password: '123', |
||||
|
port: 5432, |
||||
|
}) |
||||
|
|
||||
|
let appid = '20200917000567738'; |
||||
|
let key = 'xXm4jsuuD38JIkkhEcK6'; |
||||
|
const getAnswer = async (query) => { |
||||
|
let start = (new Date()).getTime(); |
||||
|
let salt = start; |
||||
|
let str1 = appid + query + salt + key; |
||||
|
let sign = Hex.stringify(MD5(str1)); |
||||
|
console.log(`翻译:${query}`); |
||||
|
let answer = await request.get('http://api.fanyi.baidu.com/api/trans/vip/translate').timeout(1000 * 30).query({ |
||||
|
q: query, |
||||
|
appid: appid, |
||||
|
salt: salt, |
||||
|
from: 'zh', |
||||
|
to: 'en', |
||||
|
sign: sign |
||||
|
}); |
||||
|
if (answer.body.error_code) { |
||||
|
console.warn(answer.body); |
||||
|
throw '百度不给力,快快debug' |
||||
|
} |
||||
|
let rslt = answer.body.trans_result; |
||||
|
// let upperCaseRslt = rslt[0].dst.toLowerCase().replace(/( |^)[a-z]/g, (L) => L.toUpperCase()).replace(/ /g, '');
|
||||
|
// let upperCaseRslt = rslt[0].dst.toUpperCase().replace(/ /g, '_');
|
||||
|
// let upperCaseRslt = rslt[0].dst.toLowerCase().replace(/ /g, '_');
|
||||
|
let upperCaseRslt = rslt[0].dst.replace(/\//g, ' ').replace(/'/g, '').replace(/\s{2,}/g, ''); |
||||
|
console.log(`翻译结果:${upperCaseRslt}`); |
||||
|
while (((new Date()).getTime() - start) < (1000 / 8)) {//每s只能调用10次
|
||||
|
continue; |
||||
|
} |
||||
|
return upperCaseRslt |
||||
|
} |
||||
|
|
||||
|
const fun = async () => { |
||||
|
// note: we don't try/catch this because if connecting throws an exception
|
||||
|
// we don't need to dispose of the client (it will be undefined)
|
||||
|
const client = await pool.connect() |
||||
|
try { |
||||
|
await client.query('BEGIN') |
||||
|
|
||||
|
const fileList = [ |
||||
|
// {
|
||||
|
// path: './data/道路/村道第三方.xls',
|
||||
|
// n: '道路',
|
||||
|
// tableName: 'road',
|
||||
|
// defaultKey: ['level'],
|
||||
|
// defaultValue: ['村'],
|
||||
|
// },
|
||||
|
// {
|
||||
|
// path: './data/道路/县道第三方.xls',
|
||||
|
// n: '道路',
|
||||
|
// tableName: 'road',
|
||||
|
// defaultKey: ['level'],
|
||||
|
// defaultValue: ['县'],
|
||||
|
// },
|
||||
|
// {
|
||||
|
// path: './data/道路/乡道第三方.xls',
|
||||
|
// n: '道路',
|
||||
|
// tableName: 'road',
|
||||
|
// defaultKey: ['level'],
|
||||
|
// defaultValue: ['乡'],
|
||||
|
// },
|
||||
|
] |
||||
|
|
||||
|
for (let f of fileList) { |
||||
|
console.log(`读取 ${f.path}`); |
||||
|
// 读取数据文件
|
||||
|
let workbook = XLSX.readFile(path.join(__dirname, f.path)) |
||||
|
let firstSheetName = workbook.SheetNames[0]; |
||||
|
let worksheet = workbook.Sheets[firstSheetName]; |
||||
|
let res = XLSX.utils.sheet_to_json(worksheet); |
||||
|
const keyMap = require(`./${f.n}_数据库表对应.json`); |
||||
|
// console.log(keyMap);
|
||||
|
for (let d of res) { |
||||
|
let insertStr = `INSERT INTO "${f.tableName}" (`; |
||||
|
let insertKeys = (f.defaultKey || []).concat([]); |
||||
|
let insertValues = (f.defaultValue || []).concat([]); |
||||
|
for (let k in keyMap) { |
||||
|
// 没做判重
|
||||
|
let v = d[k]; |
||||
|
if (v) { |
||||
|
insertKeys.push(keyMap[k]); |
||||
|
insertValues.push(v); |
||||
|
} |
||||
|
} |
||||
|
insertStr += insertKeys.join(',') + ') VALUES ('; |
||||
|
insertStr += insertKeys.map((k, i) => `$${i + 1}`).join(',') + ')'; |
||||
|
// console.log(insertStr, insertValues);
|
||||
|
console.log(`插入 ${f.tableName}:${insertStr}`); |
||||
|
await client.query(insertStr, insertValues); |
||||
|
// break;
|
||||
|
} |
||||
|
// break;
|
||||
|
} |
||||
|
|
||||
|
// await client.query('ROLLBACK')
|
||||
|
await client.query('COMMIT') |
||||
|
console.log('执行完毕~') |
||||
|
} catch (e) { |
||||
|
await client.query('ROLLBACK') |
||||
|
console.log('执行错误~') |
||||
|
throw e |
||||
|
} finally { |
||||
|
client.release(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
fun() |
||||
|
} catch (error) { |
||||
|
console.error(error) |
||||
|
} |
@ -0,0 +1,50 @@ |
|||||
|
{ |
||||
|
"路线名称": "route_name", |
||||
|
"路线代码": "route_code", |
||||
|
"路段序号": "section_No", |
||||
|
"乡镇编码": "township_Code", |
||||
|
"起点地名": "starting_place_name", |
||||
|
"起点桩号": "start_station", |
||||
|
"起点分界点类别": "category_of_starting_point_and_dividing_point", |
||||
|
"止点地名": "stop_place_name", |
||||
|
"止点分界点类别": "category_of_dead_center_and_dividing_point", |
||||
|
"止点桩号": "stop_station", |
||||
|
"路段类型": "section_type", |
||||
|
"路段性质": "nature_of_road_section", |
||||
|
"建成时间": "completion_time", |
||||
|
"GBM及文明样板路": "gBM_and_civilized_model_road", |
||||
|
"地貌": "landforms", |
||||
|
"收费性质": "nature_of_charges", |
||||
|
"涵洞数量": "number_of_culverts", |
||||
|
"技术等级": "technical_level", |
||||
|
"路面类型": "pavement_type", |
||||
|
"路面宽度": "pavement_width", |
||||
|
"路基宽度": "subgrade_width", |
||||
|
"车道特征": "lane_characteristics", |
||||
|
"是否晴雨通车": "whether_it_is_open_to_traffic_in_sunny_or_rainy_days", |
||||
|
"设计时速": "design_speed_per_hour", |
||||
|
"是否城管路段": "urban_management_section_or_not", |
||||
|
"管养单位": "management_and_maintenance_unit", |
||||
|
"路政管理单位": "road_administration_unit", |
||||
|
"列养情况": "alimentation", |
||||
|
"列养资金来源": "source_of_listed_maintenance_funds", |
||||
|
"养护时间": "curing_time", |
||||
|
"可绿化里程": "greening_mileage", |
||||
|
"已绿化里程": "greening_mileaged", |
||||
|
"重复道路路段类型": "type_of_repeated_road_section", |
||||
|
"重复路段序号": "serial_number_of_repeated_section", |
||||
|
"重复路段路线编码": "repeated_section_route_code", |
||||
|
"填报单位": "reporting_unit", |
||||
|
"变更原因": "reason_for_change", |
||||
|
"变更时间": "change_time", |
||||
|
"是否按干线公路管理接养": "whether_maintenance_managed_highway", |
||||
|
"备注": "remarks", |
||||
|
"上年路线编码": "route_code_of_last_year", |
||||
|
"上年路线名称": "route_name_of_last_year", |
||||
|
"上年起点桩号": "starting_station_of_last_year", |
||||
|
"上年止点桩号": "last_years_ending_point_stake_number", |
||||
|
"图形里程": "graphic_mileage", |
||||
|
"桩号里程": "chainage_mileage", |
||||
|
"所在区县": "districtcounty", |
||||
|
"所在地市": "location_city" |
||||
|
} |
@ -1,15 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import { basicAction } from '@peace/utils' |
|
||||
import { ApiTable } from '$utils' |
|
||||
|
|
||||
export function getMembers(orgId) { |
|
||||
return dispatch => basicAction({ |
|
||||
type: 'get', |
|
||||
dispatch: dispatch, |
|
||||
actionType: 'GET_MEMBERS', |
|
||||
url: `${ApiTable.getEnterprisesMembers.replace('{enterpriseId}', orgId)}`, |
|
||||
msg: { error: '获取用户列表失败' }, |
|
||||
reducer: { name: 'members' } |
|
||||
}); |
|
||||
} |
|
@ -1,7 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import * as example from './example' |
|
||||
|
|
||||
export default { |
|
||||
...example |
|
||||
} |
|
@ -1,43 +0,0 @@ |
|||||
import React, { useEffect } from 'react'; |
|
||||
import { connect } from 'react-redux'; |
|
||||
import { Spin, Card } from 'antd'; |
|
||||
import '../style.less'; |
|
||||
import ProTable, { TableDropdown } from '@ant-design/pro-table'; |
|
||||
|
|
||||
const Example = (props) => { |
|
||||
const { dispatch, actions, user, loading } = props |
|
||||
|
|
||||
useEffect(() => { |
|
||||
dispatch(actions.example.getMembers(user.orgId)) |
|
||||
}, []) |
|
||||
|
|
||||
return ( |
|
||||
<Spin tip="biubiubiu~" spinning={loading}> |
|
||||
<div id='example'> |
|
||||
<p>STYLE EXAMPLE</p> |
|
||||
</div> |
|
||||
<ProTable |
|
||||
columns={[{ |
|
||||
dataIndex: 'index', |
|
||||
valueType: 'indexBorder', |
|
||||
width: 48, |
|
||||
}]} |
|
||||
defaultData={[{ index: 1, key: 1 }]} |
|
||||
> |
|
||||
|
|
||||
</ProTable> |
|
||||
</Spin> |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
function mapStateToProps(state) { |
|
||||
const { auth, global, members } = state; |
|
||||
return { |
|
||||
loading: members.isRequesting, |
|
||||
user: auth.user, |
|
||||
actions: global.actions, |
|
||||
members: members.data |
|
||||
}; |
|
||||
} |
|
||||
|
|
||||
export default connect(mapStateToProps)(Example); |
|
@ -1,5 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import Example from './example'; |
|
||||
|
|
||||
export { Example }; |
|
@ -1,15 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import reducers from './reducers'; |
|
||||
import routes from './routes'; |
|
||||
import actions from './actions'; |
|
||||
import { getNavItem } from './nav-item'; |
|
||||
|
|
||||
export default { |
|
||||
key: 'example', |
|
||||
name: '书写示例', |
|
||||
reducers: reducers, |
|
||||
routes: routes, |
|
||||
actions: actions, |
|
||||
getNavItem: getNavItem |
|
||||
}; |
|
@ -1,16 +0,0 @@ |
|||||
import React from 'react'; |
|
||||
import { Link } from 'react-router-dom'; |
|
||||
import { Menu } from 'antd'; |
|
||||
import { SettingOutlined } from '@ant-design/icons'; |
|
||||
|
|
||||
const SubMenu = Menu.SubMenu; |
|
||||
|
|
||||
export function getNavItem(user, dispatch) { |
|
||||
return ( |
|
||||
<SubMenu key="example" icon={<SettingOutlined />} title={'举个栗子'}> |
|
||||
<Menu.Item key="e1"> |
|
||||
<Link to="/example/e1">举个棒子</Link> |
|
||||
</Menu.Item> |
|
||||
</SubMenu> |
|
||||
); |
|
||||
} |
|
@ -1,5 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
export default { |
|
||||
|
|
||||
} |
|
@ -1,18 +0,0 @@ |
|||||
'use strict'; |
|
||||
import { Example, } from './containers'; |
|
||||
|
|
||||
export default [{ |
|
||||
type: 'inner', |
|
||||
route: { |
|
||||
path: '/example', |
|
||||
key: 'example', |
|
||||
breadcrumb: '栗子', |
|
||||
// 不设置 component 则面包屑禁止跳转
|
|
||||
childRoutes: [{ |
|
||||
path: '/e1', |
|
||||
key: 'e1', |
|
||||
component: Example, |
|
||||
breadcrumb: '棒子', |
|
||||
}] |
|
||||
} |
|
||||
}]; |
|
@ -1,3 +0,0 @@ |
|||||
#example:hover { |
|
||||
font-size: larger; |
|
||||
} |
|
File diff suppressed because it is too large
@ -0,0 +1,215 @@ |
|||||
|
|
||||
|
import { connect } from 'react-redux'; |
||||
|
import './protable.less' |
||||
|
import { Card, Button, Popconfirm, Badge,Col, Row } 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 { ip } = props; |
||||
|
const [tableListDataSource, setTableListDataSource] = useState([]); |
||||
|
|
||||
|
const columns= [ |
||||
|
{ |
||||
|
title: '视频', |
||||
|
key: 'createdAt', |
||||
|
dataIndex: 'createdAt', |
||||
|
valueType: 'dateTime', |
||||
|
render: (dom, record) => { |
||||
|
return <Row> |
||||
|
<Col span={8}></Col> |
||||
|
<Col span={8}>col-8</Col> |
||||
|
<Col span={8}>col-8</Col> |
||||
|
</Row> |
||||
|
}, |
||||
|
}, |
||||
|
]; |
||||
|
useEffect(() => { |
||||
|
const source = []; |
||||
|
for (let i = 0; i < 15; i += 1) { |
||||
|
source.push({ |
||||
|
createdAt: Date.now() - Math.floor(Math.random() * 10000), |
||||
|
code: `const getData = async params => {
|
||||
|
const data = await getData(params); |
||||
|
return { list: data.data, ...data }; |
||||
|
};`,
|
||||
|
key: i, |
||||
|
}); |
||||
|
} |
||||
|
setTableListDataSource(source); |
||||
|
}, [ip]); |
||||
|
return ( |
||||
|
<ProTable |
||||
|
columns={columns} |
||||
|
dataSource={tableListDataSource} |
||||
|
pagination={{ |
||||
|
pageSize: 3, |
||||
|
showSizeChanger: false, |
||||
|
}} |
||||
|
rowKey="key" |
||||
|
toolBarRender={false} |
||||
|
search={false} |
||||
|
/> |
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
|
const ipListDataSource= []; |
||||
|
|
||||
|
for (let i = 0; i < 10; i += 1) { |
||||
|
ipListDataSource.push({ |
||||
|
ip: `106.14.98.1${i}4`, |
||||
|
cpu: 10, |
||||
|
mem: 20, |
||||
|
status: [Math.floor(Math.random() * 10) % 4], |
||||
|
disk: 30, |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
const IPList = (props) => { |
||||
|
const { onChange, ip } = props; |
||||
|
|
||||
|
const columns= [ |
||||
|
{ |
||||
|
title: '路段名称', |
||||
|
key: 'ip', |
||||
|
dataIndex: 'ip', |
||||
|
render: (_, item) => { |
||||
|
console.log(item.ip) |
||||
|
return <Badge status={item.status} text={item.ip} />; |
||||
|
}, |
||||
|
}, |
||||
|
|
||||
|
]; |
||||
|
return ( |
||||
|
<div className='spilce'> |
||||
|
<ProTable |
||||
|
columns={columns} |
||||
|
request={(params, sorter, filter) => { |
||||
|
// 表单搜索项会从 params 传入,传递给后端接口。
|
||||
|
console.log(params, sorter, filter); |
||||
|
return Promise.resolve({ |
||||
|
data: ipListDataSource, |
||||
|
success: true, |
||||
|
}); |
||||
|
}} |
||||
|
rowKey="ip" |
||||
|
rowClassName={(record) => { |
||||
|
return record.ip === ip ? styles['split-row-select-active'] : ''; |
||||
|
}} |
||||
|
toolbar={{ |
||||
|
search: { |
||||
|
onSearch: (value) => { |
||||
|
alert(value); |
||||
|
}, |
||||
|
}, |
||||
|
}} |
||||
|
options={false} |
||||
|
pagination={false} |
||||
|
search={false} |
||||
|
onRow={(record) => { |
||||
|
return { |
||||
|
onClick: () => { |
||||
|
if (record.ip) { |
||||
|
onChange(record.ip); |
||||
|
} |
||||
|
}, |
||||
|
}; |
||||
|
}} |
||||
|
/></div> |
||||
|
|
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
|
||||
|
const videoTable = () => { |
||||
|
const [ip, setIp] = useState('0.0.0.0'); |
||||
|
const tabList = [ |
||||
|
{ |
||||
|
key: 'tab1', |
||||
|
tab: '公交', |
||||
|
}, |
||||
|
{ |
||||
|
key: 'tab2', |
||||
|
tab: '路段', |
||||
|
}, |
||||
|
]; |
||||
|
const contentList= { |
||||
|
tab1: [<div className='card-protable'> |
||||
|
<Card > |
||||
|
<IPList onChange={(cIp) => setIp(cIp)} ip={ip} /> |
||||
|
</Card> |
||||
|
<Card style={{flex:1}}> |
||||
|
<DetailList ip={ip} /> |
||||
|
</Card> |
||||
|
</div>], |
||||
|
tab2: [<div className='card-protable'> |
||||
|
<Card > |
||||
|
<IPList onChange={(cIp) => setIp(cIp)} ip={ip} /> |
||||
|
</Card> |
||||
|
<Card style={{flex:1}}> |
||||
|
|
||||
|
<DetailList ip={ip} /> |
||||
|
</Card> |
||||
|
</div>] |
||||
|
}; |
||||
|
const [activeTabKey1, setActiveTabKey1] = useState('tab1'); |
||||
|
const [activeTabKey2, setActiveTabKey2] = useState('app'); |
||||
|
const onTab1Change = (key) => { |
||||
|
setActiveTabKey1(key); |
||||
|
}; |
||||
|
|
||||
|
const onTab2Change = (key) => { |
||||
|
setActiveTabKey2(key); |
||||
|
}; |
||||
|
return ( |
||||
|
<> |
||||
|
<Card |
||||
|
style={{ |
||||
|
width: '100%', |
||||
|
}} |
||||
|
tabList={tabList} |
||||
|
activeTabKey={activeTabKey1} |
||||
|
onTabChange={(key) => { |
||||
|
onTab1Change(key); |
||||
|
}} |
||||
|
> |
||||
|
{contentList[activeTabKey1]} |
||||
|
</Card> |
||||
|
|
||||
|
</> |
||||
|
|
||||
|
); |
||||
|
}; |
||||
|
|
||||
|
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)(videoTable); |
@ -1,6 +1,12 @@ |
|||||
'use strict'; |
'use strict'; |
||||
|
|
||||
import infor from './infor'; |
import Infor from './infor'; |
||||
|
import transportation from './transportation'; |
||||
|
import BridgeTable from './bridge'; |
||||
|
import HigHways from './highways'; |
||||
|
import OperaTional from './operational'; |
||||
|
import Enforce from './enforce'; |
||||
|
import Public from './public'; |
||||
|
import Videois from './videois'; |
||||
|
|
||||
|
export { Infor,transportation,BridgeTable,HigHways,OperaTional,Enforce,Public,Videois }; |
||||
export { infor }; |
|
@ -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 VideoTable from '../components/videoTable'; |
||||
|
const superagent = require('superagent'); |
||||
|
const Videois = (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 ( |
||||
|
<> <VideoTable data={data} exports={exports} /> |
||||
|
</> |
||||
|
) |
||||
|
} |
||||
|
function mapStateToProps(state) { |
||||
|
const { auth } = state |
||||
|
return { |
||||
|
user: auth.user, |
||||
|
} |
||||
|
} |
||||
|
export default connect(mapStateToProps)(Videois); |
@ -1,19 +1,71 @@ |
|||||
'use strict'; |
'use strict'; |
||||
import { infor } from './containers'; |
import { Infor } from './containers'; |
||||
|
import { transportation } from './containers'; |
||||
|
import { BridgeTable } from './containers'; |
||||
|
import { HigHways } from './containers'; |
||||
|
import { OperaTional } from './containers'; |
||||
|
import { Enforce } from './containers'; |
||||
|
import { Public } from './containers'; |
||||
|
import { Videois } from './containers'; |
||||
export default [{ |
export default [{ |
||||
type: 'inner', |
type: 'inner', |
||||
route: { |
route: { |
||||
path: '/fillion', |
path: '/fillion', |
||||
key: 'fillion', |
key: 'fillion', |
||||
breadcrumb: '填报管理', |
breadcrumb: '数据管理', |
||||
menuSelectKeys: ['fillion'], |
menuSelectKeys: ['fillion'], |
||||
menuOpenKeys: ['fillion'], |
menuOpenKeys: ['fillion'], |
||||
childRoutes: [ { |
childRoutes: [{ |
||||
path: '/infor', |
path: '/infor', |
||||
key: 'fillioninfor', |
key: 'fillioninfor', |
||||
menuSelectKeys:['fillioninfor'], |
menuSelectKeys: ['fillioninfor'], |
||||
component: infor, |
component: Infor, |
||||
breadcrumb: '填报信息', |
breadcrumb: '治超管理', |
||||
}] |
}, { |
||||
|
path: '/transportation', |
||||
|
key: 'filliontransportation', |
||||
|
menuSelectKeys: ['filliontransportation'], |
||||
|
component: transportation, |
||||
|
breadcrumb: '道路管理', |
||||
|
} |
||||
|
, { |
||||
|
path: '/bridge', |
||||
|
key: 'fillionbridge', |
||||
|
menuSelectKeys: ['fillionbridge'], |
||||
|
component: BridgeTable, |
||||
|
breadcrumb: '桥梁管理', |
||||
|
} |
||||
|
, { |
||||
|
path: '/highways', |
||||
|
key: 'fillionhighways', |
||||
|
menuSelectKeys: ['fillionhighways'], |
||||
|
component: HigHways, |
||||
|
breadcrumb: '路政管理', |
||||
|
}, { |
||||
|
path: '/operational', |
||||
|
key: 'fillionoperational', |
||||
|
menuSelectKeys: ['fillionoperational'], |
||||
|
component: OperaTional, |
||||
|
breadcrumb: '运政管理', |
||||
|
}, { |
||||
|
path: '/enforce', |
||||
|
key: 'fillionenforce', |
||||
|
menuSelectKeys: ['fillionenforce'], |
||||
|
component: Enforce, |
||||
|
breadcrumb: '执法管理', |
||||
|
}, { |
||||
|
path: '/public', |
||||
|
key: 'fillionpublic', |
||||
|
menuSelectKeys: ['fillionpublic'], |
||||
|
component: Public, |
||||
|
breadcrumb: '公交管理', |
||||
|
}, { |
||||
|
path: '/videois', |
||||
|
key: 'fillionvideois', |
||||
|
menuSelectKeys: ['fillionvideois'], |
||||
|
component: Videois, |
||||
|
breadcrumb: '视频管理', |
||||
|
} |
||||
|
] |
||||
} |
} |
||||
}]; |
}]; |
||||
|
@ -1,30 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import { basicAction } from '@peace/utils' |
|
||||
import { ApiTable } from '$utils' |
|
||||
export function getFundamental() { |
|
||||
return dispatch => basicAction({ |
|
||||
type: 'get', |
|
||||
dispatch: dispatch, |
|
||||
actionType: 'GET_DATA', |
|
||||
url: ApiTable.getFundamental, |
|
||||
msg: { error: '获取数据失败' }, |
|
||||
reducer: { name: 'datas' } |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
|
|
||||
export function getsortord(zuo, day) { |
|
||||
return dispatch => basicAction({ |
|
||||
type: 'get', |
|
||||
dispatch: dispatch, |
|
||||
actionType: 'GET_PATIENTIA', |
|
||||
url: ApiTable.getsortord.replace('{zuo}', zuo).replace('{day}', day), |
|
||||
msg: { error: '日期更新失败' }, |
|
||||
reducer: { name: 'Patientia' } |
|
||||
}); |
|
||||
} |
|
||||
export default { |
|
||||
getFundamental, |
|
||||
getsortord |
|
||||
} |
|
@ -1,7 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import * as date from "./data" |
|
||||
|
|
||||
export default { |
|
||||
...date |
|
||||
} |
|
@ -1,118 +0,0 @@ |
|||||
import React, { useState, useEffect } from 'react' |
|
||||
import { connect } from 'react-redux'; |
|
||||
import { getFundamental } from '../actions/data'; |
|
||||
import * as echarts from "echarts" |
|
||||
import "../style.less" |
|
||||
|
|
||||
const DateModal = (props) => { |
|
||||
const { dispatch } = props |
|
||||
const [lists, setLists] = useState([]) |
|
||||
const [keys, setKeys] = useState([]) |
|
||||
const [days, setDays] = useState() |
|
||||
const [unkeys, setUnkeys] = useState([]) |
|
||||
const [num, setNum] = useState(1) |
|
||||
useEffect(() => { |
|
||||
// 获取数据
|
|
||||
dispatch(getFundamental()).then(res => { |
|
||||
setDays(res.payload.data.date) |
|
||||
|
|
||||
}) |
|
||||
}, [true]) |
|
||||
|
|
||||
const op = () => { |
|
||||
// 把获取的数据进行加工
|
|
||||
if (days && num == 1) { |
|
||||
|
|
||||
var daysValues = Object.values(days) |
|
||||
var daysKeys = Object.keys(days) |
|
||||
var list = [] |
|
||||
var arr = [] |
|
||||
var months = [] |
|
||||
for (let index = 6; index >= 0; index--) { |
|
||||
list.push(daysValues[index]) |
|
||||
} |
|
||||
setLists(list) |
|
||||
for (let index = 6; index >= 0; index--) { |
|
||||
arr.push(daysKeys[index].substring(8)) |
|
||||
} |
|
||||
for (let index = 6; index >= 0; index--) { |
|
||||
months.push(daysKeys[index].charAt(5) + "" + daysKeys[index].charAt(6)) |
|
||||
} |
|
||||
setUnkeys(months) |
|
||||
setKeys(arr) |
|
||||
setNum(2) |
|
||||
} |
|
||||
} |
|
||||
op() |
|
||||
useEffect(() => { |
|
||||
let a = ([...keys]) |
|
||||
let list = [] |
|
||||
for (let index = 0; index < 7; index++) { |
|
||||
list.push(a[index]) |
|
||||
} |
|
||||
for (let index = 0; index < 7; index++) { |
|
||||
list[index] = list[index] + "日" |
|
||||
} |
|
||||
var myChart = echarts.init(document.getElementById('echarts')); |
|
||||
// window.onresize在重复使用过程中会被覆盖
|
|
||||
// window.onresize = myChart.resize;
|
|
||||
// addEventListener来添加监听resize的事件,将能避免onresize的覆盖问题,并能实现对窗口的监听操作
|
|
||||
window.addEventListener("resize", function () { |
|
||||
myChart.resize() |
|
||||
}) |
|
||||
var option = { |
|
||||
title: { |
|
||||
text: '近七日填报数量', |
|
||||
left: "7%" |
|
||||
}, |
|
||||
grid: { |
|
||||
left: '3%', |
|
||||
right: '4%', |
|
||||
bottom: '3%', |
|
||||
containLabel: true |
|
||||
}, |
|
||||
tooltip: { |
|
||||
trigger: 'item', |
|
||||
formatter: function (params) { |
|
||||
var htmlStr = `填报数量:${params.value}条<br/>${unkeys[params.dataIndex] + "月" + params.name}<br/>` |
|
||||
return htmlStr; |
|
||||
} |
|
||||
}, |
|
||||
xAxis: { |
|
||||
type: 'category', |
|
||||
data: list, |
|
||||
axisTick: { |
|
||||
alignWithLabel: true |
|
||||
} |
|
||||
}, |
|
||||
yAxis: { |
|
||||
type: "value", |
|
||||
}, |
|
||||
series: [ |
|
||||
{ |
|
||||
name: '填报数量', |
|
||||
type: 'bar', |
|
||||
data: lists, |
|
||||
barWidth: 40 |
|
||||
} |
|
||||
] |
|
||||
}; |
|
||||
|
|
||||
// 使用刚指定的配置项和数据显示图表。
|
|
||||
myChart.setOption(option); |
|
||||
}, [lists]) |
|
||||
return ( |
|
||||
<div id='echarts'></div> |
|
||||
) |
|
||||
} |
|
||||
function mapStateToProps(state) { |
|
||||
const { auth, depMessage, depUser, global } = state; |
|
||||
return { |
|
||||
user: auth.user, |
|
||||
clientHeight: global.clientHeight, |
|
||||
loading: depMessage.isRequesting, |
|
||||
depMessage: depMessage.data || [], |
|
||||
depUser: depUser.data || [] |
|
||||
}; |
|
||||
} |
|
||||
export default connect(mapStateToProps)(DateModal) |
|
@ -1,5 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import DateModal from './dateModal'; |
|
||||
|
|
||||
export { DateModal }; |
|
@ -1,157 +0,0 @@ |
|||||
import React, { useEffect, useState } from "react"; |
|
||||
import { connect } from "react-redux"; |
|
||||
import { Space, Row, Col, DatePicker, Spin } from "antd"; |
|
||||
import { getFundamental, getsortord } from "../actions/data"; |
|
||||
import { DateModal } from "../components"; |
|
||||
import moment from "moment"; |
|
||||
import "../style.less"; |
|
||||
const { RangePicker } = DatePicker; |
|
||||
const UserManage = (props) => { |
|
||||
const { dispatch, loading, datas, Patientias } = props; |
|
||||
const dateFormat = "YYYY/MM/DD"; |
|
||||
const [data, setData] = useState(); |
|
||||
const [Patientia, setPatientia] = useState(); |
|
||||
useEffect(() => { |
|
||||
// 获取数据
|
|
||||
dispatch(getFundamental()).then((res) => { |
|
||||
setData(res); |
|
||||
}); |
|
||||
}, [true]); |
|
||||
useEffect(() => { |
|
||||
// 根据接口获取规定时间内获取到的数据
|
|
||||
var customField = [ |
|
||||
moment().add(-6, "day").format("YYYY-MM-DD"), |
|
||||
moment(new Date(), dateFormat).format("YYYY-MM-DD"), |
|
||||
]; |
|
||||
dispatch(getsortord(customField[0], customField[1])).then((res) => { |
|
||||
setPatientia(res.payload.data); |
|
||||
}); |
|
||||
}, [true]); |
|
||||
// useEffect(() => {
|
|
||||
/* Patientia ? setPatientia(Patientia */ /* .sort(sortByKey("count")) */ /* ) : null */ |
|
||||
// }, [Patientia])
|
|
||||
// 根据数组里面对象的key值进行排序
|
|
||||
// const sortByKey = (key) => {
|
|
||||
// return function (a, b) {
|
|
||||
// var value1 = a[key];
|
|
||||
// var value2 = b[key];
|
|
||||
// return value2 - value1;
|
|
||||
// }
|
|
||||
// }
|
|
||||
const disabledDate = (current) => { |
|
||||
return ( |
|
||||
(current && current < moment("2022/03/01").subtract("day")) || |
|
||||
current > moment(new Date()).subtract("days") |
|
||||
); |
|
||||
}; |
|
||||
const getTime = (date) => { |
|
||||
// 根据时间框时间获取数据进行展示
|
|
||||
if (date) { |
|
||||
var ao = []; |
|
||||
ao.push(date[0].format("YYYY/MM/DD")); |
|
||||
ao.push(date[1].format("YYYY/MM/DD")); |
|
||||
} |
|
||||
dispatch(getsortord(ao[0], ao[1])).then((res) => { |
|
||||
setPatientia(res.payload.data /* .sort(sortByKey("count")) */); |
|
||||
}); |
|
||||
}; |
|
||||
|
|
||||
return ( |
|
||||
<div style={{ overflow: "hiddle" }}> |
|
||||
{/* 此处进行了loding的效果 */} |
|
||||
<Spin spinning={loading} tip="稍等片刻~"> |
|
||||
{/* 页面上部分代码 */} |
|
||||
<div className="shuju-top"> |
|
||||
<Row className="wrap" type="flex" justify="center" align="middle"> |
|
||||
<Col span={6} align="center"> |
|
||||
<span>今日新增填报</span> |
|
||||
<p> {datas.data ? datas.data.added : null}</p> |
|
||||
</Col> |
|
||||
<Col span={6} align="center"> |
|
||||
<span>今日已审填报</span> |
|
||||
<p> |
|
||||
{datas.data ? datas.data.checked : null} |
|
||||
<span>/{datas.data ? datas.data.unChecked : null}</span> |
|
||||
</p> |
|
||||
</Col> |
|
||||
<Col span={6} align="center"> |
|
||||
<span>隐患场所总数</span> |
|
||||
<p>{datas.data ? datas.data.danger_place : null}</p> |
|
||||
</Col> |
|
||||
<Col span={6} align="center"> |
|
||||
<span>历史填报</span> |
|
||||
<p>{datas.data ? datas.data.history : null}</p> |
|
||||
</Col> |
|
||||
</Row> |
|
||||
</div> |
|
||||
{/* 页面下部分代码 */} |
|
||||
<div className="shuju-floer"> |
|
||||
{/* echarts柱状图 */} |
|
||||
<div className="shuju-floer-left">{datas ? <DateModal /> : null}</div> |
|
||||
{/* 根据时间进行的排序 */} |
|
||||
<div className="shuju-floer-reght"> |
|
||||
<p>各区县合用场所填报数量</p> |
|
||||
<Space direction="vertical" size={12}> |
|
||||
<RangePicker |
|
||||
disabledDate={disabledDate} |
|
||||
onChange={getTime} |
|
||||
defaultValue={[ |
|
||||
moment().add(-6, "day"), |
|
||||
moment(new Date(), dateFormat) |
|
||||
]} |
|
||||
width={"100%"} |
|
||||
allowClear={false} |
|
||||
/> |
|
||||
</Space> |
|
||||
<div className="dataDisplay"> |
|
||||
{Patientias |
|
||||
? Patientias.map((item, index) => { |
|
||||
return ( |
|
||||
<li |
|
||||
key={index} |
|
||||
className="traverse" |
|
||||
style={{ marginTop: index == 0 ? "30px" : "0" }} |
|
||||
> |
|
||||
{index >= 3 ? ( |
|
||||
<div className="topThree">{index + 1}</div> |
|
||||
) : ( |
|
||||
<div className="untopThree">{index + 1}</div> |
|
||||
)} |
|
||||
<span className="siteName">{item.name}</span> |
|
||||
<span className="sitePeople">{item.count}</span> |
|
||||
</li> |
|
||||
); |
|
||||
}) |
|
||||
: null} |
|
||||
</div> |
|
||||
</div> |
|
||||
</div> |
|
||||
</Spin> |
|
||||
</div> |
|
||||
); |
|
||||
}; |
|
||||
function mapStateToProps(state) { |
|
||||
// console.log(state);
|
|
||||
const { auth, depMessage, depUser, global, datas, Patientia } = state; |
|
||||
// 在reducer中进行数据处理
|
|
||||
const sortByKey = (key) => { |
|
||||
return function (a, b) { |
|
||||
var value1 = a[key]; |
|
||||
var value2 = b[key]; |
|
||||
return value2 - value1; |
|
||||
}; |
|
||||
}; |
|
||||
return { |
|
||||
user: auth.user, |
|
||||
clientHeight: global.clientHeight, |
|
||||
loading: datas.isRequesting && Patientia.isRequesting, |
|
||||
depMessage: depMessage.data || [], |
|
||||
depUser: depUser.data || [], |
|
||||
datas: datas || [], |
|
||||
Patientias: Patientia.data |
|
||||
? Patientia.data.sort(sortByKey("count")) |
|
||||
: null || [], |
|
||||
}; |
|
||||
} |
|
||||
|
|
||||
export default connect(mapStateToProps)(UserManage); |
|
@ -1,5 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import UserManage from './data'; |
|
||||
|
|
||||
export { UserManage }; |
|
@ -1,15 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import reducers from './reducers'; |
|
||||
import routes from './routes'; |
|
||||
import actions from './actions'; |
|
||||
import { getNavItem } from './nav-item'; |
|
||||
|
|
||||
export default { |
|
||||
key: 'middleground', |
|
||||
name: '', |
|
||||
reducers: reducers, |
|
||||
routes: routes, |
|
||||
actions: actions, |
|
||||
getNavItem: getNavItem |
|
||||
}; |
|
@ -1,18 +0,0 @@ |
|||||
import React from 'react'; |
|
||||
import { Link } from 'react-router-dom'; |
|
||||
import { Menu } from 'antd'; |
|
||||
import { BarChartOutlined } from '@ant-design/icons'; |
|
||||
import { push } from 'react-router-redux'; |
|
||||
|
|
||||
|
|
||||
export function getNavItem(user, dispatch) { |
|
||||
if (user.type != 1) { |
|
||||
dispatch(push('/fillion/infor')); |
|
||||
return null |
|
||||
} |
|
||||
return ( |
|
||||
<Menu.Item key="middleground" icon={<BarChartOutlined />}> |
|
||||
<Link to="/middleground">数据中心</Link> |
|
||||
</Menu.Item> |
|
||||
); |
|
||||
} |
|
@ -1,5 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
export default { |
|
||||
|
|
||||
}; |
|
@ -1,14 +0,0 @@ |
|||||
'use strict'; |
|
||||
import { UserManage } from './containers'; |
|
||||
|
|
||||
export default [{ |
|
||||
type: 'inner', |
|
||||
route: { |
|
||||
path: '/middleground', |
|
||||
key: 'middleground', |
|
||||
breadcrumb: '数据中心', |
|
||||
menuSelectKeys: ['userManage'], |
|
||||
component: UserManage, |
|
||||
menuOpenKeys: ['middleground'], |
|
||||
} |
|
||||
}]; |
|
@ -1,86 +0,0 @@ |
|||||
.shuju-top{ |
|
||||
width: 100%; |
|
||||
min-Width: 1110px; |
|
||||
height: 20vh; |
|
||||
border: 1px solid #F2F2F2; |
|
||||
border-Right: 0; |
|
||||
margin-top: 5vh; |
|
||||
overflow: auto; |
|
||||
.wrap{ |
|
||||
min-Height: 100%; |
|
||||
span{ |
|
||||
color: #959595; |
|
||||
font-Size: 18px; |
|
||||
} |
|
||||
p{ |
|
||||
font-Size: 34px; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
.shuju-floer{ |
|
||||
width: 100%; |
|
||||
height: 500px; |
|
||||
float: left; |
|
||||
margin-Top: 50px; |
|
||||
min-Width: 1110px; |
|
||||
.shuju-floer-left{ |
|
||||
height: 500px; |
|
||||
float: left; |
|
||||
#echarts{ |
|
||||
width: calc(75vw - 200px ); |
|
||||
min-Width: 810px; |
|
||||
height: 500px; |
|
||||
} |
|
||||
} |
|
||||
.shuju-floer-reght{ |
|
||||
width: calc(32vw - 200px ); |
|
||||
min-Width: 290px; |
|
||||
height: 100%; |
|
||||
float: left; |
|
||||
p{ |
|
||||
color: #464646; |
|
||||
font-Size: 18px; |
|
||||
font-Weight: 600; |
|
||||
} |
|
||||
.dataDisplay{ |
|
||||
width: 340px; |
|
||||
height: 75%; |
|
||||
overflow-y: auto; |
|
||||
.traverse{ |
|
||||
width: 300px; |
|
||||
height: 30px; |
|
||||
list-style: none; |
|
||||
.topThree{ |
|
||||
width: 20px; |
|
||||
height: 20px; |
|
||||
background-Color: #f0f2f5; |
|
||||
float: left; |
|
||||
color: rgba(0, 0, 0, 0.6470588235294118); |
|
||||
border-Radius: 50%; |
|
||||
text-align: center; |
|
||||
line-Height: 20px; |
|
||||
font-Size: 12px; |
|
||||
} |
|
||||
.untopThree{ |
|
||||
width: 20px; |
|
||||
height: 20px; |
|
||||
background-Color: #314559; |
|
||||
float: left; |
|
||||
color: #FFFFFF; |
|
||||
border-radius: 50%; |
|
||||
text-align: center; |
|
||||
line-height: 20px; |
|
||||
font-size: 12px; |
|
||||
} |
|
||||
.siteName{ |
|
||||
margin-left: 20px; |
|
||||
} |
|
||||
.sitePeople{ |
|
||||
float: right; |
|
||||
margin-right: 10px; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
} |
|
||||
} |
|
@ -1,6 +1,7 @@ |
|||||
'use strict'; |
'use strict'; |
||||
|
|
||||
import Authority from './authority'; |
|
||||
import UserManage from './user'; |
import UserManage from './user'; |
||||
|
|
||||
export { Authority, UserManage }; |
|
||||
|
export { UserManage}; |
@ -1,37 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import { basicAction } from '@peace/utils' |
|
||||
import { ApiTable } from '$utils' |
|
||||
|
|
||||
export function reportRectify (timeRange) { |
|
||||
return dispatch => basicAction({ |
|
||||
type: 'get', |
|
||||
dispatch: dispatch, |
|
||||
actionType: 'GET_REPORT_RECTIFY', |
|
||||
url: `${ApiTable.getReportRectify}?startTime=${timeRange ? timeRange[0] : ''}&endTime=${timeRange ? timeRange[1] : ''}`, |
|
||||
msg: {}, |
|
||||
reducer: { name: 'reportRectify' } |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
export function reportRectifyDetail (day, depId) { |
|
||||
return dispatch => basicAction({ |
|
||||
type: 'get', |
|
||||
dispatch: dispatch, |
|
||||
actionType: 'GET_REPORT_RECTIFY_DETAIL', |
|
||||
url: `${ApiTable.getReportRectifyDetail}?day=${day}&depId=${depId}`, |
|
||||
msg: {}, |
|
||||
reducer: { name: 'reportRectifyDetail' } |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
export function compileReportRectifyDetail (data) { |
|
||||
return dispatch => basicAction({ |
|
||||
type: 'post', |
|
||||
dispatch: dispatch, |
|
||||
data, |
|
||||
actionType: 'COMPILE_REPORT_RECTIFY_DETAIL', |
|
||||
url: `${ApiTable.compileReportRectifyDetail}`, |
|
||||
msg: { option: '保存信息' }, |
|
||||
}); |
|
||||
} |
|
@ -1,59 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import { basicAction } from '@peace/utils' |
|
||||
import { ApiTable } from '$utils' |
|
||||
|
|
||||
export function allAreas (orgId) { |
|
||||
return dispatch => basicAction({ |
|
||||
type: 'get', |
|
||||
dispatch: dispatch, |
|
||||
actionType: 'GET_ALL_AREAS', |
|
||||
url: `${ApiTable.allAreas}`, |
|
||||
msg: {}, |
|
||||
reducer: { name: 'allAreas' } |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
export function addReportConfig (data) { |
|
||||
return dispatch => basicAction({ |
|
||||
type: 'post', |
|
||||
dispatch: dispatch, |
|
||||
data: data, |
|
||||
actionType: 'POST_REPORT_CONFIGS', |
|
||||
url: `${ApiTable.addReportConfig}`, |
|
||||
msg: { option: '添加报表配置' }, |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
export function getReportConfig () { |
|
||||
return dispatch => basicAction({ |
|
||||
type: 'get', |
|
||||
dispatch: dispatch, |
|
||||
actionType: 'GET_REPORT_CONFIGS', |
|
||||
url: `${ApiTable.getReportConfig}`, |
|
||||
msg: { error: '获取报表配置失败' }, |
|
||||
reducer: { name: 'reportConfig' } |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
export function editReportConfig (data, configId) { |
|
||||
return dispatch => basicAction({ |
|
||||
type: 'put', |
|
||||
dispatch: dispatch, |
|
||||
data: data, |
|
||||
actionType: 'EDIT_REPORT_CONFIGS', |
|
||||
url: `${ApiTable.editReportConfig.replace('{reportId}', configId)}`, |
|
||||
msg: { option: '编辑报表配置' }, |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
export function delReportConfig (configId) { |
|
||||
return dispatch => basicAction({ |
|
||||
type: 'del', |
|
||||
dispatch: dispatch, |
|
||||
actionType: 'DEL_REPORT_CONFIGS', |
|
||||
url: `${ApiTable.delReportConfig.replace('{reportId}', configId)}`, |
|
||||
msg: { option: '删除报表配置' }, |
|
||||
}); |
|
||||
} |
|
||||
|
|
@ -1,26 +0,0 @@ |
|||||
import { basicAction } from '@peace/utils' |
|
||||
import { ApiTable } from '$utils' |
|
||||
|
|
||||
export function getReportList(query) { |
|
||||
return dispatch => basicAction({ |
|
||||
type: 'get', |
|
||||
dispatch: dispatch, |
|
||||
query: query, |
|
||||
actionType: 'GET_REPORT_LIST', |
|
||||
url: ApiTable.getReportList, |
|
||||
msg: { error: '获取报表数据失败' }, |
|
||||
reducer: { name: 'reportList' } |
|
||||
}); |
|
||||
} |
|
||||
|
|
||||
export function getRegionList(query) { |
|
||||
return dispatch => basicAction({ |
|
||||
type: 'get', |
|
||||
dispatch: dispatch, |
|
||||
query: query, |
|
||||
actionType: 'GET_REGION_LIST', |
|
||||
url: ApiTable.allAreas, |
|
||||
msg: { error: '获取区域数据失败' }, |
|
||||
reducer: { name: 'regionList' } |
|
||||
}); |
|
||||
} |
|
@ -1,11 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import * as config from './config' |
|
||||
import * as download from './download' |
|
||||
import * as compile from './compile' |
|
||||
|
|
||||
export default { |
|
||||
...config, |
|
||||
...download, |
|
||||
...compile, |
|
||||
} |
|
@ -1,118 +0,0 @@ |
|||||
import React, { useEffect, useState } from 'react'; |
|
||||
import { connect } from 'react-redux'; |
|
||||
import { Spin, Drawer, Button } from 'antd'; |
|
||||
import '../style.less'; |
|
||||
import { EditableProTable } from '@ant-design/pro-table'; |
|
||||
|
|
||||
const CompileDrawer = (props) => { |
|
||||
const { dispatch, actions, user, loading, visible, checkRow, close, reportRectifyDetail, checkAction } = props |
|
||||
const [requesting, setRequesting] = useState(false) |
|
||||
const [dataSource, setDataSource] = useState([]) |
|
||||
const { report } = actions |
|
||||
const isCheck = checkAction == 'check' |
|
||||
|
|
||||
useEffect(() => { |
|
||||
if (checkRow.day) { |
|
||||
dispatch(report.reportRectifyDetail(checkRow.day, checkRow.depId)) |
|
||||
} |
|
||||
}, [checkRow]) |
|
||||
|
|
||||
useEffect(() => { |
|
||||
let data = reportRectifyDetail |
|
||||
let i = 1 |
|
||||
for (let d of data) { |
|
||||
d.index_ = i++ |
|
||||
} |
|
||||
setDataSource(data) |
|
||||
}, [reportRectifyDetail]) |
|
||||
|
|
||||
return ( |
|
||||
<Drawer |
|
||||
title={"合用场所安全隐患排查整治汇总表"} |
|
||||
placement="right" |
|
||||
onClose={() => { |
|
||||
close() |
|
||||
}} |
|
||||
visible={visible} |
|
||||
width={'82%'} |
|
||||
> |
|
||||
<Spin spinning={loading || requesting}> |
|
||||
<EditableProTable |
|
||||
columns={[ |
|
||||
{ |
|
||||
title: '序号', |
|
||||
dataIndex: 'index_', |
|
||||
readonly: true, |
|
||||
}, |
|
||||
{ |
|
||||
title: '名称', |
|
||||
dataIndex: 'name', |
|
||||
readonly: true, |
|
||||
}, { |
|
||||
title: '地址', |
|
||||
dataIndex: 'address', |
|
||||
readonly: true, |
|
||||
}, { |
|
||||
title: '排查发现隐患', |
|
||||
dataIndex: 'hiddenDanger', |
|
||||
readonly: true, |
|
||||
}, { |
|
||||
title: '采取整改措施', |
|
||||
dataIndex: 'correctiveAction', |
|
||||
}, { |
|
||||
title: '实施处罚、强制措施情况', |
|
||||
dataIndex: 'punishment', |
|
||||
}, |
|
||||
]} |
|
||||
controlled={true} |
|
||||
value={dataSource} |
|
||||
onChange={setDataSource} |
|
||||
rowKey="id" |
|
||||
headerTitle={`填报单位:${checkRow.region};时间:${checkRow.day}`} |
|
||||
maxLength={5} |
|
||||
recordCreatorProps={false} |
|
||||
editable={{ |
|
||||
type: 'multiple', |
|
||||
editableKeys: isCheck ? [] : dataSource.map(r => r.id) |
|
||||
}} |
|
||||
toolBarRender={() => [ |
|
||||
isCheck ? '' : |
|
||||
<Button |
|
||||
type="primary" |
|
||||
key="save" |
|
||||
onClick={() => { |
|
||||
// dataSource 就是当前数据,可以调用 api 将其保存
|
|
||||
setRequesting(true) |
|
||||
const data = dataSource |
|
||||
for (let d of data) { |
|
||||
d.userId = user.id |
|
||||
delete d.index_ |
|
||||
} |
|
||||
dispatch(report.compileReportRectifyDetail(dataSource)).then(res => { |
|
||||
setRequesting(false) |
|
||||
}) |
|
||||
}} |
|
||||
> |
|
||||
保存数据 |
|
||||
</Button> |
|
||||
]} |
|
||||
> |
|
||||
|
|
||||
</EditableProTable> |
|
||||
</Spin> |
|
||||
</Drawer > |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
function mapStateToProps (state) { |
|
||||
const { auth, global, members, reportRectifyDetail } = state; |
|
||||
return { |
|
||||
loading: reportRectifyDetail.isRequesting, |
|
||||
user: auth.user, |
|
||||
actions: global.actions, |
|
||||
members: members.data, |
|
||||
reportRectifyDetail: reportRectifyDetail.data || [] |
|
||||
}; |
|
||||
} |
|
||||
|
|
||||
export default connect(mapStateToProps)(CompileDrawer); |
|
@ -1,124 +0,0 @@ |
|||||
import React, { useEffect, useRef } from 'react'; |
|
||||
import { connect } from 'react-redux'; |
|
||||
import { Spin, Button, Modal, Form, Switch } from 'antd'; |
|
||||
import ProForm, { ProFormText, ProFormSelect } from '@ant-design/pro-form'; |
|
||||
import { useState } from 'react'; |
|
||||
|
|
||||
const ConfigModal = (props) => { |
|
||||
const { dispatch, actions, user, loading, visible, close, editData, allAreas, reportType } = props |
|
||||
const [excuteTimeOptions, setExcuteTimeOptions] = useState([]) |
|
||||
const formRef = useRef() |
|
||||
const { report } = actions |
|
||||
|
|
||||
useEffect(() => { |
|
||||
let excuteTimeOptions = [] |
|
||||
for (let i = 0; i < 24; i++) { |
|
||||
let curT = i |
|
||||
if (curT < 10) { |
|
||||
curT = '0' + curT |
|
||||
} |
|
||||
excuteTimeOptions.push({ |
|
||||
value: curT + ':00', |
|
||||
label: curT + ':00', |
|
||||
}) |
|
||||
excuteTimeOptions.push({ |
|
||||
value: curT + ':30', |
|
||||
label: curT + ':30', |
|
||||
}) |
|
||||
} |
|
||||
setExcuteTimeOptions(excuteTimeOptions); |
|
||||
}, []) |
|
||||
|
|
||||
return ( |
|
||||
<Modal |
|
||||
title={`${editData ? '编辑' : '新增'}报表配置`} |
|
||||
visible={visible} |
|
||||
onOk={() => { |
|
||||
formRef.current.validateFields().then(v => { |
|
||||
v.excuteTime = String(v.excuteTime) |
|
||||
console.log(v); |
|
||||
dispatch(editData ? report.editReportConfig(v, editData.id) : report.addReportConfig(v)).then(res => { |
|
||||
if (res.success) { |
|
||||
dispatch(report.getReportConfig()) |
|
||||
close() |
|
||||
} |
|
||||
}) |
|
||||
}) |
|
||||
}} |
|
||||
onCancel={() => { |
|
||||
close() |
|
||||
}} |
|
||||
> |
|
||||
<ProForm |
|
||||
formRef={formRef} |
|
||||
autoFocusFirstInput |
|
||||
layout={'horizontal'} |
|
||||
labelCol={{ span: 4 }} |
|
||||
wrapperCol={{ span: 18 }} |
|
||||
initialValues={ |
|
||||
editData ? |
|
||||
editData : |
|
||||
{ |
|
||||
excuteTime: '00:00', |
|
||||
isEnable: true |
|
||||
} |
|
||||
} |
|
||||
submitter={false} |
|
||||
formKey='config-form' |
|
||||
> |
|
||||
<ProFormText |
|
||||
name={'reportName'} |
|
||||
label="报表名称" |
|
||||
placeholder="请输入名称" |
|
||||
required |
|
||||
rules={[{ required: true, message: '请输入名称' }]} |
|
||||
/> |
|
||||
<ProFormSelect |
|
||||
options={reportType} |
|
||||
cacheForSwr |
|
||||
name="reportTypeId" |
|
||||
label="报表类型" |
|
||||
required |
|
||||
rules={[{ required: true, message: '请选择报表类型' }]} |
|
||||
/> |
|
||||
<ProFormSelect |
|
||||
options={ |
|
||||
allAreas.map(a => { |
|
||||
return { |
|
||||
value: a.id, |
|
||||
label: a.name, |
|
||||
} |
|
||||
})} |
|
||||
cacheForSwr |
|
||||
name="regionId" |
|
||||
label="区域" |
|
||||
required |
|
||||
rules={[{ required: true, message: '请选择区域' }]} |
|
||||
/> |
|
||||
<Form.Item name="isEnable" label="状态" valuePropName="checked"> |
|
||||
<Switch checkedChildren="启用" unCheckedChildren="禁用" /> |
|
||||
</Form.Item> |
|
||||
<ProFormSelect |
|
||||
options={excuteTimeOptions} |
|
||||
addonBefore={'每天'} |
|
||||
addonAfter={'时'} |
|
||||
cacheForSwr |
|
||||
name="excuteTime" |
|
||||
label="生成时间" |
|
||||
/> |
|
||||
</ProForm> |
|
||||
</Modal> |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
function mapStateToProps (state) { |
|
||||
const { auth, global, allAreas } = state; |
|
||||
console.log(allAreas); |
|
||||
return { |
|
||||
user: auth.user, |
|
||||
actions: global.actions, |
|
||||
allAreas: allAreas.data || [] |
|
||||
}; |
|
||||
} |
|
||||
|
|
||||
export default connect(mapStateToProps)(ConfigModal); |
|
@ -1,111 +0,0 @@ |
|||||
// 报表编辑
|
|
||||
|
|
||||
import React, { useEffect, useState } from 'react'; |
|
||||
import { connect } from 'react-redux'; |
|
||||
import moment from 'moment' |
|
||||
import CompileDrawer from '../components/compileDrawer' |
|
||||
import { Spin, Button, DatePicker, Space, Switch } from 'antd'; |
|
||||
import ProTable from '@ant-design/pro-table'; |
|
||||
import { Func } from '$utils'; |
|
||||
|
|
||||
const { RangePicker } = DatePicker; |
|
||||
|
|
||||
const Compile = (props) => { |
|
||||
const { dispatch, actions, user, loading, reportRectify } = props |
|
||||
const [searchTime, setSearchTime] = useState([moment(), moment()]) |
|
||||
const [compileDrawerVis, setCompileDrawerVis] = useState(false) |
|
||||
const [checkRow, setCheckRow] = useState({}) |
|
||||
const [checkAction, setCheckAction] = useState('') |
|
||||
const { report } = actions |
|
||||
|
|
||||
const getReportRectify = (searchTime) => { |
|
||||
dispatch(report.reportRectify([moment(searchTime[0]).format('YYYY-MM-DD'), moment(searchTime[1]).format('YYYY-MM-DD')])) |
|
||||
} |
|
||||
|
|
||||
useEffect(() => { |
|
||||
getReportRectify(searchTime) |
|
||||
}, []) |
|
||||
|
|
||||
const showCompileDrawerVis = (row, action) => { |
|
||||
setCompileDrawerVis(true) |
|
||||
setCheckRow(row) |
|
||||
setCheckAction(action) |
|
||||
} |
|
||||
|
|
||||
return ( |
|
||||
<Spin spinning={loading}> |
|
||||
<ProTable |
|
||||
columns={[{ |
|
||||
title: '日期', |
|
||||
dataIndex: 'day', |
|
||||
}, { |
|
||||
title: '名称', |
|
||||
dataIndex: 'name', |
|
||||
}, { |
|
||||
title: '是否提交', |
|
||||
dataIndex: 'reportBool', |
|
||||
render: (_, r) => { |
|
||||
return <Switch disabled={true} checked={r.reportBool} /> |
|
||||
} |
|
||||
}, { |
|
||||
title: '操作', |
|
||||
dataIndex: 'option', |
|
||||
render: (_, r) => { |
|
||||
return [ |
|
||||
<Space> |
|
||||
{/* {Func.isAuthorized("REPORT_EDIT") && |
|
||||
<Button type="primary" onClick={() => { |
|
||||
showCompileDrawerVis(r, 'edit') |
|
||||
}}>编辑</Button> |
|
||||
} */} |
|
||||
<Button type="primary" onClick={() => { |
|
||||
showCompileDrawerVis(r, 'check') |
|
||||
}}>查看</Button> |
|
||||
</Space> |
|
||||
] |
|
||||
} |
|
||||
},]} |
|
||||
dataSource={reportRectify} |
|
||||
rowKey="index" |
|
||||
search={false} |
|
||||
options={false} |
|
||||
headerTitle="合用场所安全隐患排查整治汇总表" |
|
||||
toolBarRender={() => [ |
|
||||
<RangePicker allowClear={false} value={searchTime} |
|
||||
onChange={(date, dateString) => { |
|
||||
setSearchTime(date) |
|
||||
getReportRectify(dateString) |
|
||||
}} |
|
||||
/>, |
|
||||
]} |
|
||||
> |
|
||||
|
|
||||
</ProTable> |
|
||||
<CompileDrawer |
|
||||
visible={compileDrawerVis} |
|
||||
close={() => { |
|
||||
setCompileDrawerVis(false) |
|
||||
setCheckRow({}) |
|
||||
setCheckAction('') |
|
||||
|
|
||||
getReportRectify(searchTime) |
|
||||
}} |
|
||||
checkRow={checkRow} |
|
||||
checkAction={checkAction} |
|
||||
/> |
|
||||
</Spin> |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
function mapStateToProps(state) { |
|
||||
const { auth, global, reportRectify } = state; |
|
||||
console.log(reportRectify); |
|
||||
return { |
|
||||
user: auth.user, |
|
||||
actions: global.actions, |
|
||||
loading: reportRectify.isRequesting, |
|
||||
reportRectify: reportRectify.data || [] |
|
||||
}; |
|
||||
} |
|
||||
|
|
||||
export default connect(mapStateToProps)(Compile); |
|
@ -1,157 +0,0 @@ |
|||||
import React, { useEffect, useState } from 'react'; |
|
||||
import { connect } from 'react-redux'; |
|
||||
import ConfigModal from '../components/configModal' |
|
||||
import { Spin, Button, Space, Popconfirm, Switch } from 'antd'; |
|
||||
import ProTable from '@ant-design/pro-table'; |
|
||||
import '../style.less'; |
|
||||
import Pinyin from '../../../utils/pinyin' |
|
||||
const reportType = [{ |
|
||||
value: 1, |
|
||||
label: '县区排查整治汇总表', |
|
||||
}, { |
|
||||
value: 2, |
|
||||
label: '各县区每日汇总表', |
|
||||
}, { |
|
||||
value: 3, |
|
||||
label: '隐患场所汇总表', |
|
||||
},] |
|
||||
var pinyin = null |
|
||||
var as = null |
|
||||
var bs = null |
|
||||
const Config = (props) => { |
|
||||
const { dispatch, actions, loading, reportConfig, allAreas } = props |
|
||||
const [configModalVis, setConfigModalVis] = useState(false) |
|
||||
const [editData, setEditData] = useState(null) |
|
||||
const { report } = actions |
|
||||
useEffect(() => { |
|
||||
dispatch(report.getReportConfig()) |
|
||||
dispatch(report.allAreas()) |
|
||||
|
|
||||
}, []) |
|
||||
useEffect(()=>{ |
|
||||
pinyin=new Pinyin() |
|
||||
}) |
|
||||
return ( |
|
||||
<Spin spinning={loading}> |
|
||||
<ProTable |
|
||||
columns={[{ |
|
||||
title: '报表名称', |
|
||||
dataIndex: 'reportName', |
|
||||
}, { |
|
||||
title: '区域名称', |
|
||||
dataIndex: 'region', |
|
||||
sorter: (a, b) => { |
|
||||
let regionOne = allAreas.find(item => item.id == a.regionId) |
|
||||
let regionTwo = allAreas.find(item => item.id == b.regionId) |
|
||||
|
|
||||
if (regionOne) { |
|
||||
as = pinyin.getCamelChars(regionOne.name).toLowerCase() |
|
||||
|
|
||||
} if (regionTwo) { |
|
||||
bs = pinyin.getCamelChars(regionTwo.name).toLowerCase() |
|
||||
|
|
||||
} else { |
|
||||
return '' |
|
||||
} |
|
||||
let codeOne=as.substr(0,1).charCodeAt() |
|
||||
let codeTwo=bs.substr(0,1).charCodeAt() |
|
||||
return codeOne-codeTwo |
|
||||
}, |
|
||||
render: (_, row, index, action) => { |
|
||||
let curRegion = allAreas.find(a => a.id == row.regionId) |
|
||||
return curRegion ? curRegion.name : '' |
|
||||
}, |
|
||||
}, { |
|
||||
title: '类型', |
|
||||
dataIndex: 'reportType', |
|
||||
|
|
||||
render: (_, r) => { |
|
||||
let curType = reportType.find(t => t.value == r.reportTypeId) |
|
||||
return curType ? curType.label : '' |
|
||||
}, |
|
||||
|
|
||||
}, { |
|
||||
title: '生成时间', |
|
||||
dataIndex: 'index', |
|
||||
render: (_, row) => { |
|
||||
return `每日 ${row.excuteTime.indexOf(':') > -1 ? row.excuteTime : row.excuteTime + ':00'}` |
|
||||
} |
|
||||
}, { |
|
||||
title: '启用状态', |
|
||||
dataIndex: 'isEnable', |
|
||||
render: (_, row) => { |
|
||||
return <Switch checkedChildren="启用" unCheckedChildren="禁用" disabled defaultChecked={row.isEnable} /> |
|
||||
|
|
||||
} |
|
||||
}, { |
|
||||
title: '操作', |
|
||||
dataIndex: 'option', |
|
||||
render: (_, row) => { |
|
||||
return [ |
|
||||
<Space> |
|
||||
<Button type="primary" |
|
||||
onClick={() => { |
|
||||
setConfigModalVis(true) |
|
||||
setEditData({ |
|
||||
...row, |
|
||||
excuteTime: row.excuteTime.indexOf(':') > -1 ? row.excuteTime : row.excuteTime + ':00' |
|
||||
}) |
|
||||
}} |
|
||||
>编辑</Button> |
|
||||
<Popconfirm |
|
||||
placement="topRight" |
|
||||
title={'确认删除此报备表配置?'} |
|
||||
onConfirm={() => { |
|
||||
dispatch(report.delReportConfig(row.id)).then(res => { |
|
||||
if (res.success) { |
|
||||
dispatch(report.getReportConfig()) |
|
||||
} |
|
||||
}) |
|
||||
}} |
|
||||
> |
|
||||
<Button type="primary" danger>删除</Button> |
|
||||
</Popconfirm> |
|
||||
</Space> |
|
||||
] |
|
||||
} |
|
||||
},]} |
|
||||
dataSource={reportConfig} |
|
||||
rowKey="id" |
|
||||
search={false} |
|
||||
options={false} |
|
||||
toolBarRender={() => [ |
|
||||
<Button type="primary" key="primary" onClick={() => { setConfigModalVis(true) }}> |
|
||||
添加报表配置 |
|
||||
</Button>, |
|
||||
]} |
|
||||
> |
|
||||
|
|
||||
</ProTable> |
|
||||
{ |
|
||||
configModalVis ? |
|
||||
<ConfigModal |
|
||||
visible={true} |
|
||||
close={() => { |
|
||||
setConfigModalVis(false) |
|
||||
setEditData(null) |
|
||||
}} |
|
||||
reportType={reportType} |
|
||||
editData={editData} |
|
||||
/> : '' |
|
||||
} |
|
||||
</Spin> |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
function mapStateToProps(state) { |
|
||||
const { auth, global, reportConfig, allAreas } = state; |
|
||||
return { |
|
||||
loading: reportConfig.isRequesting, |
|
||||
user: auth.user, |
|
||||
actions: global.actions, |
|
||||
reportConfig: reportConfig.data || [], |
|
||||
allAreas: allAreas.data || [] |
|
||||
}; |
|
||||
} |
|
||||
|
|
||||
export default connect(mapStateToProps)(Config); |
|
@ -1,129 +0,0 @@ |
|||||
import React, { useEffect } from 'react'; |
|
||||
import { connect } from 'react-redux'; |
|
||||
import { Spin, Button } from 'antd'; |
|
||||
import ProTable from '@ant-design/pro-table'; |
|
||||
import '../style.less'; |
|
||||
import moment from 'moment'; |
|
||||
import { Func } from '$utils'; |
|
||||
|
|
||||
const Download = (props) => { |
|
||||
const { dispatch, actions, reportList, regionList, user } = props |
|
||||
|
|
||||
useEffect(() => { |
|
||||
dispatch(actions.report.getRegionList()); |
|
||||
}, []); |
|
||||
|
|
||||
const columns = [{ |
|
||||
title: '报表名称', |
|
||||
dataIndex: 'reportName', |
|
||||
formItemProps: { |
|
||||
label: null, |
|
||||
}, |
|
||||
fieldProps: { |
|
||||
placeholder: '输入报表名称' |
|
||||
} |
|
||||
}, { |
|
||||
title: '区域名称', |
|
||||
dataIndex: 'regionName', |
|
||||
valueType: 'select', |
|
||||
initialValue: -1, |
|
||||
fieldProps: { |
|
||||
label: null, |
|
||||
options: [{ |
|
||||
label: '全部', |
|
||||
value: -1 |
|
||||
}].concat(regionList) |
|
||||
}, |
|
||||
order: 5, |
|
||||
render: (dom, record) => { |
|
||||
return record.department ? record.department.name : null |
|
||||
} |
|
||||
}, { |
|
||||
title: '类型', |
|
||||
dataIndex: 'reportType', |
|
||||
hideInSearch: true, |
|
||||
render: (dom, record) => { |
|
||||
return record.reportType ? record.reportType.name : null |
|
||||
} |
|
||||
}, { |
|
||||
title: '生成时间', |
|
||||
dataIndex: 'creatTime', |
|
||||
valueType: 'dateTimeRange', |
|
||||
order: 4, |
|
||||
render: (dom, record) => { |
|
||||
return moment(record.creatTime).format('YYYY-MM-DD HH:mm') |
|
||||
} |
|
||||
}] |
|
||||
if (Func.isAuthorized("REPORT_DOWN")) { |
|
||||
columns.push({ |
|
||||
title: '操作', |
|
||||
key: 'option', |
|
||||
hideInSearch: true, |
|
||||
render: (dom, record) => { |
|
||||
// const ApiRoot = localStorage.getItem('tyApiRoot');
|
|
||||
const filePathArr = record.filePath.split('/') |
|
||||
|
|
||||
const fileName = filePathArr.pop() |
|
||||
// console.log(fileName);
|
|
||||
return [ |
|
||||
// <a key="download" href={ApiRoot + '' + record.filePath}>下载</a>
|
|
||||
<a href={ |
|
||||
'/_api/' + |
|
||||
// 'http://10.8.30.157:8439/'+
|
|
||||
`attachments?src=files/${fileName}&filename=${encodeURIComponent(fileName)}&token=${user.token}`} > |
|
||||
下载 |
|
||||
</a> |
|
||||
] |
|
||||
} |
|
||||
}) |
|
||||
} |
|
||||
|
|
||||
return ( |
|
||||
<Spin spinning={false}> |
|
||||
<ProTable |
|
||||
columns={columns} |
|
||||
toolbar={{ |
|
||||
settings: [] |
|
||||
}} |
|
||||
dataSource={reportList} |
|
||||
request={async (params) => { |
|
||||
const query = { |
|
||||
limit: params.pageSize, |
|
||||
offset: params.pageSize * (params.current - 1), |
|
||||
creatTime: params.creatTime, |
|
||||
reportName: params.reportName, |
|
||||
regionName: params.regionName |
|
||||
} |
|
||||
const res = await dispatch(actions.report.getReportList(query)); |
|
||||
return { |
|
||||
...res, |
|
||||
total: res.payload.data ? res.payload.data.count : 0 |
|
||||
} |
|
||||
}} |
|
||||
> |
|
||||
</ProTable> |
|
||||
</Spin > |
|
||||
) |
|
||||
} |
|
||||
|
|
||||
function mapStateToProps (state) { |
|
||||
const { auth, global, reportList, regionList } = state; |
|
||||
const { count, rows } = reportList.data || {}; |
|
||||
let regions = []; |
|
||||
if (regionList.data && regionList.data.length > 0) { |
|
||||
regions = regionList.data.map(v => { |
|
||||
return { |
|
||||
label: v.name, |
|
||||
value: v.id, |
|
||||
} |
|
||||
}); |
|
||||
} |
|
||||
return { |
|
||||
user: auth.user, |
|
||||
actions: global.actions, |
|
||||
reportList: rows || [], |
|
||||
regionList: regions |
|
||||
}; |
|
||||
} |
|
||||
|
|
||||
export default connect(mapStateToProps)(Download); |
|
@ -1,7 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import Config from './config'; |
|
||||
import Download from './download'; |
|
||||
import Compile from './compile' |
|
||||
|
|
||||
export { Config, Download, Compile }; |
|
@ -1,15 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
import reducers from './reducers'; |
|
||||
import routes from './routes'; |
|
||||
import actions from './actions'; |
|
||||
import { getNavItem } from './nav-item'; |
|
||||
|
|
||||
export default { |
|
||||
key: 'report', |
|
||||
name: '报表管理', |
|
||||
reducers: reducers, |
|
||||
routes: routes, |
|
||||
actions: actions, |
|
||||
getNavItem: getNavItem |
|
||||
}; |
|
@ -1,35 +0,0 @@ |
|||||
import React from 'react'; |
|
||||
import { Link } from 'react-router-dom'; |
|
||||
import { Menu } from 'antd'; |
|
||||
import { FileTextOutlined } from '@ant-design/icons'; |
|
||||
import { Func } from '$utils'; |
|
||||
import { push } from 'react-router-redux'; |
|
||||
|
|
||||
|
|
||||
const SubMenu = Menu.SubMenu; |
|
||||
|
|
||||
export function getNavItem(user, dispatch) { |
|
||||
if (user.type != 1 && user.type != 2) { |
|
||||
dispatch(push('/fillion/infor')); |
|
||||
return null |
|
||||
} |
|
||||
if (!Func.isAuthorized("REPORT_MANAGE")) { |
|
||||
return null |
|
||||
} |
|
||||
return ( |
|
||||
<SubMenu key="report" icon={<FileTextOutlined />} title={'报表管理'}> |
|
||||
{Func.isAuthorized("REPROT_CONFIG") && <Menu.Item key="reportConfig"> |
|
||||
<Link to="/report/config">报表配置</Link> |
|
||||
</Menu.Item>} |
|
||||
{Func.isAuthorized("REPORT_DOWN") && <Menu.Item key="reportDownload"> |
|
||||
<Link to="/report/download">报表下载</Link> |
|
||||
</Menu.Item>} |
|
||||
{Func.isAuthorized("REPORT_LIST") && |
|
||||
<Menu.Item key="reportCompile"> |
|
||||
<Link to="/report/compile">整治汇总表</Link> |
|
||||
</Menu.Item> |
|
||||
} |
|
||||
</SubMenu> |
|
||||
|
|
||||
); |
|
||||
} |
|
@ -1,5 +0,0 @@ |
|||||
'use strict'; |
|
||||
|
|
||||
export default { |
|
||||
|
|
||||
} |
|
@ -1,33 +0,0 @@ |
|||||
'use strict'; |
|
||||
import { Config, Download, Compile } from './containers'; |
|
||||
|
|
||||
export default [{ |
|
||||
type: 'inner', |
|
||||
route: { |
|
||||
path: '/report', |
|
||||
key: 'report', |
|
||||
breadcrumb: '报表管理', |
|
||||
menuSelectKeys: ['config'], |
|
||||
menuOpenKeys: ['report'], |
|
||||
// 不设置 component 则面包屑禁止跳转
|
|
||||
childRoutes: [{ |
|
||||
path: '/config', |
|
||||
key: 'reportConfig', |
|
||||
component: Config, |
|
||||
menuSelectKeys:['reportConfig'], |
|
||||
breadcrumb: '报表配置', |
|
||||
}, { |
|
||||
path: '/download', |
|
||||
key: 'reportDownload', |
|
||||
menuSelectKeys:['reportDownload'], |
|
||||
component: Download, |
|
||||
breadcrumb: '报表下载', |
|
||||
}, { |
|
||||
path: '/compile', |
|
||||
key: 'reportCompile', |
|
||||
menuSelectKeys:['reportCompile'], |
|
||||
component: Compile, |
|
||||
breadcrumb: '整治汇总表', |
|
||||
}] |
|
||||
} |
|
||||
}]; |
|
@ -1,3 +0,0 @@ |
|||||
#example:hover { |
|
||||
font-size: larger; |
|
||||
} |
|
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue