Browse Source

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

release_0.0.1
dengyinhuan 2 years ago
parent
commit
7c61a4bc6d
  1. 5
      .gitignore
  2. 3
      api/app/lib/controllers/data/road.js
  3. 9
      api/log/development.log
  4. 15
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/actions/example.js
  5. 7
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/actions/index.js
  6. 53
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/example.js
  7. 8
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/build/index.js
  8. 0
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/build/left.js
  9. 0
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/build/right.js
  10. 8
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/conserve/index.js
  11. 8
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/guanli/index.js
  12. 29
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/index.js
  13. 17
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerLeft.js
  14. 19
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerRight.js
  15. 14
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerRight/center-right-bottom.js
  16. 14
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerRight/center-right-center.js
  17. 14
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerRight/center-right-centertop.js
  18. 15
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerRight/center-right-top.js
  19. 14
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerleft/center-left-bottom.js
  20. 16
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerleft/center-left-center.js
  21. 14
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerleft/center-left-centertop.js
  22. 15
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerleft/center-left-top.js
  23. 18
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/index.js
  24. 17
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/left.js
  25. 14
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/left/left-bottom.js
  26. 14
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/left/left-center.js
  27. 14
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/left/left-top.js
  28. 16
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/right.js
  29. 14
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/right/right-bottom.js
  30. 9
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/right/right-center.js
  31. 13
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/right/right-top.js
  32. 8
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/operation/index.js
  33. 40
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/heand/index.js
  34. 23
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/heand/style.less
  35. 6
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/index.js
  36. 4
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/public/font.css
  37. 22
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/public/module.js
  38. 15
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/index.js
  39. 16
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/nav-item.js
  40. 5
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/reducers/index.js
  41. 21
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/routes.js
  42. 3
      scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/style.less
  43. 128
      scripts/0.0.1/data/工具脚本(无需执行)/dataIn.js
  44. 24
      scripts/0.0.1/data/工具脚本(无需执行)/index.js
  45. 50
      scripts/0.0.1/data/工具脚本(无需执行)/道路_数据库表对应.json
  46. 4
      scripts/0.0.1/data/工具脚本(无需执行)/道路_数据脚本对应.sql
  47. 10
      web/client/assets/color.less
  48. 5
      web/client/src/app.js
  49. 8
      web/client/src/layout/containers/layout/index.js
  50. 15
      web/client/src/sections/example/actions/example.js
  51. 7
      web/client/src/sections/example/actions/index.js
  52. 43
      web/client/src/sections/example/containers/example.js
  53. 5
      web/client/src/sections/example/containers/index.js
  54. 15
      web/client/src/sections/example/index.js
  55. 16
      web/client/src/sections/example/nav-item.js
  56. 5
      web/client/src/sections/example/reducers/index.js
  57. 18
      web/client/src/sections/example/routes.js
  58. 3
      web/client/src/sections/example/style.less
  59. 2
      web/client/src/sections/fillion/components/bridgeTable.js
  60. 2
      web/client/src/sections/fillion/components/highwaysTable.js
  61. 405
      web/client/src/sections/fillion/components/inforTable.js
  62. 9
      web/client/src/sections/fillion/components/protable.less
  63. 2248
      web/client/src/sections/fillion/components/publicTable.js
  64. 215
      web/client/src/sections/fillion/components/videoTable.js
  65. 12
      web/client/src/sections/fillion/containers/index.js
  66. 29
      web/client/src/sections/fillion/containers/infor.js
  67. 42
      web/client/src/sections/fillion/containers/videois.js
  68. 24
      web/client/src/sections/fillion/nav-item.js
  69. 68
      web/client/src/sections/fillion/routes.js
  70. 30
      web/client/src/sections/middleground/actions/data.js
  71. 7
      web/client/src/sections/middleground/actions/index.js
  72. 118
      web/client/src/sections/middleground/components/dateModal.js
  73. 5
      web/client/src/sections/middleground/components/index.js
  74. 157
      web/client/src/sections/middleground/containers/data.js
  75. 5
      web/client/src/sections/middleground/containers/index.js
  76. 15
      web/client/src/sections/middleground/index.js
  77. 18
      web/client/src/sections/middleground/nav-item.js
  78. 5
      web/client/src/sections/middleground/reducers/index.js
  79. 14
      web/client/src/sections/middleground/routes.js
  80. 86
      web/client/src/sections/middleground/style.less
  81. 8
      web/client/src/sections/organization/actions/user.js
  82. 5
      web/client/src/sections/organization/containers/index.js
  83. 34
      web/client/src/sections/organization/containers/user.js
  84. 29
      web/client/src/sections/organization/nav-item.js
  85. 10
      web/client/src/sections/organization/routes.js
  86. 37
      web/client/src/sections/report/actions/compile.js
  87. 59
      web/client/src/sections/report/actions/config.js
  88. 26
      web/client/src/sections/report/actions/download.js
  89. 11
      web/client/src/sections/report/actions/index.js
  90. 118
      web/client/src/sections/report/components/compileDrawer.js
  91. 124
      web/client/src/sections/report/components/configModal.js
  92. 111
      web/client/src/sections/report/containers/compile.js
  93. 157
      web/client/src/sections/report/containers/config.js
  94. 129
      web/client/src/sections/report/containers/download.js
  95. 7
      web/client/src/sections/report/containers/index.js
  96. 15
      web/client/src/sections/report/index.js
  97. 35
      web/client/src/sections/report/nav-item.js
  98. 5
      web/client/src/sections/report/reducers/index.js
  99. 33
      web/client/src/sections/report/routes.js
  100. 3
      web/client/src/sections/report/style.less

5
.gitignore

@ -138,4 +138,7 @@ dist
*yarn.lock
*package-lock.json
*log/
*downloadFiles/
*downloadFiles/
web/client/assets/color.less
package-lock.json
development.text

3
api/app/lib/controllers/data/road.js

@ -32,5 +32,6 @@ async function importIn (ctx) {
}
module.exports = {
importIn
importIn,
};

9
api/log/development.log

@ -6954,3 +6954,12 @@
2022-07-20 21:00:55.063 - debug: [FS-LOGGER] Init.
2022-07-20 21:00:55.128 - info: [FS-ATTACHMENT] Inject attachment mw into router.
2022-07-20 21:00:55.129 - info: [FS-AUTH] Inject auth and api mv into router.
2022-07-21 09:15:39.313 - debug: [FS-LOGGER] Init.
2022-07-21 09:15:39.402 - info: [FS-ATTACHMENT] Inject attachment mw into router.
2022-07-21 09:15:39.402 - info: [FS-AUTH] Inject auth and api mv into router.
2022-07-21 09:27:02.043 - error: path: /department/user, error: SequelizeValidationError: notNull Violation: user.username cannot be null
2022-07-21 09:33:35.924 - error: path: /department/user/1, error: SequelizeValidationError: notNull Violation: user.username cannot be null
2022-07-21 09:33:37.379 - error: path: /department/user/1, error: SequelizeValidationError: notNull Violation: user.username cannot be null
2022-07-21 09:33:38.086 - error: path: /department/user/1, error: SequelizeValidationError: notNull Violation: user.username cannot be null
2022-07-21 09:38:23.005 - error: path: /department/user, error: SequelizeValidationError: notNull Violation: user.username cannot be null
2022-07-21 09:42:39.489 - error: path: /department/user, error: SequelizeValidationError: notNull Violation: user.username cannot be null

15
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/actions/example.js

@ -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' }
});
}

7
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/actions/index.js

@ -1,7 +0,0 @@
'use strict';
import * as example from './example'
export default {
...example
}

53
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/example.js

@ -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);

8
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/build/index.js

@ -1,8 +0,0 @@
import React from 'react'
const Build = () => {
return (
<>Build</>
)
}
export default Build

0
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/build/left.js

0
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/build/right.js

8
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/conserve/index.js

@ -1,8 +0,0 @@
import React from 'react'
const Conserve = () => {
return (
<>1212121</>
)
}
export default Conserve

8
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/guanli/index.js

@ -1,8 +0,0 @@
import React from 'react'
const Guanli = () => {
return (
<>管理</>
)
}
export default Guanli

29
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/index.js

@ -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

17
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerLeft.js

@ -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

19
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerRight.js

@ -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

14
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerRight/center-right-bottom.js

@ -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

14
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerRight/center-right-center.js

@ -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

14
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerRight/center-right-centertop.js

@ -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

15
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerRight/center-right-top.js

@ -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

14
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerleft/center-left-bottom.js

@ -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

16
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerleft/center-left-center.js

@ -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

14
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerleft/center-left-centertop.js

@ -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

15
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/centerleft/center-left-top.js

@ -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

18
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/index.js

@ -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

17
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/left.js

@ -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

14
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/left/left-bottom.js

@ -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

14
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/left/left-center.js

@ -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

14
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/left/left-top.js

@ -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

16
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/right.js

@ -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

14
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/right/right-bottom.js

@ -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

9
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/right/right-center.js

@ -1,9 +0,0 @@
import React from 'react'
const Rightcenter = () => {
return (
<><div style={{ width: /* width || */ "100%", height: /* height || */ "30%" }}>
</div></>
)
}
export default Rightcenter

13
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/leadership/right/right-top.js

@ -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

8
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/footer/operation/index.js

@ -1,8 +0,0 @@
import React from 'react'
const Operation = () => {
return (
<>运营</>
)
}
export default Operation

40
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/heand/index.js

@ -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

23
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/heand/style.less

@ -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;
}
}

6
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/index.js

@ -1,6 +0,0 @@
'use strict';
import Example from './example';
import Build from './footer/build'
export { Example, Build };

4
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/public/font.css

@ -1,4 +0,0 @@
@font-face {
font-family: "YouSheBiaoTiHei";
src: url("/assets/fontziti/YouSheBiaoTiHei-2.ttf") format("truetype");
}

22
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/containers/public/module.js

@ -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

15
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/index.js

@ -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
};

16
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/nav-item.js

@ -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>
);
}

5
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/reducers/index.js

@ -1,5 +0,0 @@
'use strict';
export default {
}

21
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/routes.js

@ -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: '棒子',
// }]
}
}];

3
scripts/0.0.1/data/工具脚本(无需执行)/data/道路/quanju/style.less

@ -1,3 +0,0 @@
#example:hover {
font-size: larger;
}

128
scripts/0.0.1/data/工具脚本(无需执行)/dataIn.js

@ -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)
}

24
scripts/0.0.1/data/工具脚本(无需执行)/index.js

@ -9,10 +9,10 @@ try {
// 连接数据库
const pool = new Pool({
user: 'FashionAdmin',
host: '10.8.30.156',
database: 'SmartEmergency',
password: '123456',
user: 'postgres',
host: '10.8.30.32',
database: 'highways4good',
password: '123',
port: 5432,
})
@ -56,11 +56,11 @@ try {
await client.query('BEGIN')
const fileList = [
// {
// path: './data/道路/乡道第三方.xls',
// n: '道路',
// tableName: 'road'
// },
{
path: './data/道路/乡道第三方.xls',
n: '道路',
tableName: 'road'
},
]
for (let f of fileList) {
@ -73,6 +73,7 @@ try {
console.log(res[0]);
let dataEx = res[0];
transResult = ''
sqlResult = ''
sql = `
-- ${f.n}
create table if not exists "${f.tableName}"
@ -99,13 +100,16 @@ try {
.replace(/( |^)[A-Z]/g, (L) => L.toLowerCase())
}", \n
`
sqlResult += `"${t}" : "${engT.trim().replace(/ /g, '_').replace(/( |^)[A-Z]/g, (L) => L.toLowerCase())}", \n
`
sql += `
alter table ${f.tableName} add ${upperEngT} varchar(1024);
comment on column ${f.tableName}.${upperEngT} is '${t}';
`
}
fs.writeFileSync(`${f.n}_字段对应.json`, `{${transResult}}`, 'utf-8');
// fs.writeFileSync(`${f.n}_字段对应.json`, `{${transResult}}`, 'utf-8');
// fs.writeFileSync(`${f.n}_数据脚本对应.sql`, sql, 'utf-8');
fs.writeFileSync(`${f.n}_数据库表对应.json`, `{${sqlResult}}`, 'utf-8');
}
// await client.query('ROLLBACK')

50
scripts/0.0.1/data/工具脚本(无需执行)/道路_数据库表对应.json

@ -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"
}

4
scripts/0.0.1/data/工具脚本(无需执行)/道路_数据脚本对应.sql

@ -32,8 +32,8 @@ ON column road.Urban_Management_Section_Or_Not is '是否城管路段'; alter TA
ON column road.Management_And_Maintenance_Unit is '管养单位'; alter TABLE road add Road_Administration_Unit varchar(1024); comment
ON column road.Road_Administration_Unit is '路政管理单位'; alter TABLE road add Alimentation varchar(1024); comment
ON column road.Alimentation is '列养情况'; alter TABLE road add Source_Of_Listed_Maintenance_Funds varchar(1024); comment
ON column road.Source_Of_Listed_Maintenance_Funds is '列养资金来源'; alter TABLE road add Curing_Time_ varchar(1024); comment
ON column road.Curing_Time_ is '养护时间'; alter TABLE road add Greening_Mileage varchar(1024); comment
ON column road.Source_Of_Listed_Maintenance_Funds is '列养资金来源'; alter TABLE road add Curing_Time varchar(1024); comment
ON column road.Curing_Time is '养护时间'; alter TABLE road add Greening_Mileage varchar(1024); comment
ON column road.Greening_Mileage is '可绿化里程'; alter TABLE road add Greening_Mileaged varchar(1024); comment
ON column road.Greening_Mileaged is '已绿化里程'; alter TABLE road add Type_Of_Repeated_Road_Section varchar(1024); comment
ON column road.Type_Of_Repeated_Road_Section is '重复道路路段类型'; alter TABLE road add Serial_Number_Of_Repeated_Section varchar(1024); comment

10
web/client/assets/color.less

@ -1149,10 +1149,10 @@ tr > .ant-picker-cell-in-view.ant-picker-cell-range-hover-start:last-child::afte
.ant-mentions-dropdown-menu-item-active {background-color: @item-hover-bg;}
.ant-menu-item-danger.ant-menu-item {color: #ff4d4f;}
.ant-menu-item-danger.ant-menu-item:hover, .ant-menu-item-danger.ant-menu-item-active {color: #ff4d4f;}
.ant-menu-item-danger.ant-menu-item:active {background: #fff1f0;}
.ant-menu-item-danger.ant-menu-item:active {background: color(~`colorPalette("@{radio-dot-disabled-color}", 1)`);}
.ant-menu-item-danger.ant-menu-item-selected {color: #ff4d4f;}
.ant-menu-item-danger.ant-menu-item-selected > a, .ant-menu-item-danger.ant-menu-item-selected > a:hover {color: #ff4d4f;}
.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected {background-color: #fff1f0;}
.ant-menu:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected {background-color: color(~`colorPalette("@{radio-dot-disabled-color}", 1)`);}
.ant-menu-inline .ant-menu-item-danger.ant-menu-item::after {border-right-color: #ff4d4f;}
.ant-menu-dark .ant-menu-item-danger.ant-menu-item, .ant-menu-dark .ant-menu-item-danger.ant-menu-item:hover, .ant-menu-dark .ant-menu-item-danger.ant-menu-item > a {color: #ff4d4f;}
.ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal) .ant-menu-item-danger.ant-menu-item-selected {color: #fff;background-color: #ff4d4f;}
@ -1722,11 +1722,11 @@ tr.ant-table-expanded-row:hover > td {background: @table-expanded-row-bg;}
.ant-tag-checkable:active, .ant-tag-checkable-checked {color: #fff;}
.ant-tag-checkable-checked {background-color: @primary-color;}
.ant-tag-checkable:active {background-color: color(~`colorPalette("@{primary-color}", 7)`);}
.ant-tag-pink {color: #c41d7f;background: #fff0f6;border-color: #ffadd2;}
.ant-tag-pink {color: #c41d7f;background: color(~`colorPalette("@{alert-info-bg-color}", 1)`);border-color: #ffadd2;}
.ant-tag-pink-inverse {color: #fff;background: #eb2f96;border-color: #eb2f96;}
.ant-tag-magenta {color: #c41d7f;background: #fff0f6;border-color: #ffadd2;}
.ant-tag-magenta {color: #c41d7f;background: color(~`colorPalette("@{alert-info-bg-color}", 1)`);border-color: #ffadd2;}
.ant-tag-magenta-inverse {color: #fff;background: #eb2f96;border-color: #eb2f96;}
.ant-tag-red {color: #cf1322;background: #fff1f0;border-color: #ffa39e;}
.ant-tag-red {color: #cf1322;background: color(~`colorPalette("@{radio-dot-disabled-color}", 1)`);border-color: #ffa39e;}
.ant-tag-red-inverse {color: #fff;background: #f5222d;border-color: #f5222d;}
.ant-tag-volcano {color: #d4380d;background: #fff2e8;border-color: #ffbb96;}
.ant-tag-volcano-inverse {color: #fff;background: #fa541c;border-color: #fa541c;}

5
web/client/src/app.js

@ -3,11 +3,8 @@
import React, { useEffect } from 'react';
import Layout from './layout';
import Auth from './sections/auth';
import Report from './sections/report';
import Example from './sections/example';
import Quanju from './sections/quanju';
import Organization from './sections/organization'
import Middleground from './sections/middleground';
import Fillion from './sections/fillion'
@ -21,7 +18,7 @@ const App = props => {
return (
<Layout
title={projectName}
sections={[Middleground, Auth, Organization, Report, Fillion, Example, Quanju]}
sections={[ Auth, Organization, Fillion, Quanju]}
/>
)
}

8
web/client/src/layout/containers/layout/index.js

@ -8,7 +8,6 @@ import { connect } from 'react-redux';
import { message, Layout, Breadcrumb, Badge } from 'antd';
import Sider from '../../components/sider';
import { getDepMessage } from "../../../sections/organization/actions/user"
import { getFundamental } from "../../../sections/middleground/actions/data"
import Header from '../../components/header';
import Footer from '../../components/footer';
import Breadcrumbs from './breadcrumb';
@ -60,12 +59,7 @@ const LayoutContainer = props => {
});
scrollbar = new PerfectScrollbar('#page-content', { suppressScrollX: true });
}, [])
useEffect(() => {
// 获取数据
dispatch(getFundamental()).then(res => {
setDatas(res)
})
}, [true])
useEffect(() => {
NProgress.done();
if (!user || !user.authorized) {

15
web/client/src/sections/example/actions/example.js

@ -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' }
});
}

7
web/client/src/sections/example/actions/index.js

@ -1,7 +0,0 @@
'use strict';
import * as example from './example'
export default {
...example
}

43
web/client/src/sections/example/containers/example.js

@ -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);

5
web/client/src/sections/example/containers/index.js

@ -1,5 +0,0 @@
'use strict';
import Example from './example';
export { Example };

15
web/client/src/sections/example/index.js

@ -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
};

16
web/client/src/sections/example/nav-item.js

@ -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>
);
}

5
web/client/src/sections/example/reducers/index.js

@ -1,5 +0,0 @@
'use strict';
export default {
}

18
web/client/src/sections/example/routes.js

@ -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: '棒子',
}]
}
}];

3
web/client/src/sections/example/style.less

@ -1,3 +0,0 @@
#example:hover {
font-size: larger;
}

2
web/client/src/sections/fillion/components/bridgeTable.js

@ -30,7 +30,7 @@ const BrideTable = (props) => {
onChange: (value, cs) => {
setSitename(value.currentTarget.value)
},
placeholder: '请输入道路名称进行搜索',
placeholder: '请输入桥梁代码进行搜索',
getPopupContainer: (triggerNode) => triggerNode.parentNode,
},
},

2
web/client/src/sections/fillion/components/highwaysTable.js

@ -30,7 +30,7 @@ const HigwaysTable = (props) => {
onChange: (value, cs) => {
setSitename(value.currentTarget.value)
},
placeholder: '请输入道路名称进行搜索',
placeholder: '请输入桥梁代码进行搜索',
getPopupContainer: (triggerNode) => triggerNode.parentNode,
},
},

405
web/client/src/sections/fillion/components/inforTable.js

@ -1,8 +1,8 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import { Spin, Button, Popconfirm, TreeSelect } from 'antd';
import { Spin, Button, Popconfirm, Badge } from 'antd';
import ProTable from '@ant-design/pro-table';
import './protable.less'
import moment from 'moment';
import { getReportStatistic } from "../actions/infor"
const InForTable = (props) => {
@ -16,137 +16,295 @@ const InForTable = (props) => {
useEffect(() => {
setRegionId(user.departmentId)
}, [user])
useEffect(() => {
setDay([moment('2022-03-01').format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')])
}, [depData])
const onChange = (value) => {
// setRegionName(value)
setRegionId(value)
}
const columns = [
{
title: '场所名称',
dataIndex: 'placeName',
formItemProps: {
label: '场所名称',
},
fieldProps: {
onChange: (value, cs) => {
setSitename(value.currentTarget.value)
const columns =
[
{
title: '检测点名称',
dataIndex: 'placeName',
fixed: 'left',
width: 120,
options: 1,
backgroundColor: "#ffffff",
fieldProps: {
onChange: (value, cs) => {
setSitename(value.currentTarget.value)
},
placeholder: '请输入检测点名称进行搜索',
getPopupContainer: (triggerNode) => triggerNode.parentNode,
},
placeholder: '请输入场所名称进行搜索',
getPopupContainer: (triggerNode) => triggerNode.parentNode,
},
},
{
title: '场所地址',
search: false,
dataIndex: 'time',
valueType: 'dateRange',
initialValue: day,
order: 4,
render: (dom, record) => {
return record.address
{
title: '车牌号',
// search: false,
dataIndex: 'containers1',
fixed: 'left',
width: 120,
render: (dom, record) => {
return record.address
},
fieldProps: {
placeholder: '请输入车牌号进行搜索',
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
},
fieldProps: {
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
},
{
title: '隐患场所',
dataIndex: 'regionName',
valueType: 'select',
initialValue: -1,
fieldProps: {
label: null,
onChange: (value, cs) => {
setPlaceType(value);
},
options: [{
label: '全部',
value: -1
},
{
label: '隐患场所',
value: 0
}, {
label: '非隐患场所',
value: 1
}, {
label: '非合用场所',
value: 2
},],
getPopupContainer: (triggerNode) => triggerNode.parentNode,
{
title: '车轴数',
// search: false,
dataIndex: 'containers2',
width: 120,
render: (dom, record) => {
return record.address
},
fieldProps: {
placeholder: '请输入车轴数进行搜索',
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
},
order: 5,
render: (dom, record) => {
let flag = "是"
if (record.hiddenDangerItem12 == null) {
flag = <span style={{ color: '#8c8987' }}>/</span>
{
title: '超限率(%)',
// search: false,
dataIndex: 'containers3',
// valueType: 'dateRange',
// initialValue: day,
width: 120,
render: (dom, record) => {
return record.address
},
fieldProps: {
placeholder: '请输入超限率进行搜索',
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
if (record.hiddenDangerItem12 && record.correctiveAction == null && record.punishment == null) {
flag = <span style={{ color: '#8c8987' }}></span>
}, {
title: '超限重量(kg)',
search: false,
dataIndex: 'containers4',
valueType: 'dateRange',
initialValue: day,
width: 120,
render: (dom, record) => {
return record.address
},
fieldProps: {
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
}, {
title: '车货总重(kg)',
search: false,
dataIndex: 'containers5',
valueType: 'dateRange',
initialValue: day,
width: 120,
render: (dom, record) => {
return record.address
},
fieldProps: {
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
}, {
title: '车货限重(kg)',
search: false,
dataIndex: 'containers6',
valueType: 'dateRange',
initialValue: day,
width: 120,
render: (dom, record) => {
return record.address
},
fieldProps: {
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
}, {
title: '检测时间',
// search: false,
key: 'since',
dataIndex: 'createdAt',
valueType: 'dateTime',
width: 120,
render: (dom, record) => {
return record.address
},
fieldProps: {
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
}, {
title: '经营业户名称',
search: false,
dataIndex: 'containers8',
valueType: 'dateRange',
initialValue: day,
width: 120,
render: (dom, record) => {
return record.address
},
fieldProps: {
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
}, {
title: '经营业户地址',
search: false,
dataIndex: 'containers9',
valueType: 'dateRange',
initialValue: day,
width: 140,
render: (dom, record) => {
return record.address
},
fieldProps: {
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
}, {
title: '通知人',
search: false,
dataIndex: 'containers10',
valueType: 'dateRange',
initialValue: day,
width: 140,
render: (dom, record) => {
return record.address
},
fieldProps: {
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
}, {
title: '通知方式',
search: false,
dataIndex: 'containers11',
valueType: 'dateRange',
initialValue: day,
width: 140,
render: (dom, record) => {
return record.address
},
fieldProps: {
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
}, {
title: '通知结果(打不通、表示不来、不是当事人)',
search: false,
dataIndex: 'containers12',
valueType: 'dateRange',
initialValue: day,
width: 140,
render: (dom, record) => {
return record.address
},
fieldProps: {
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
}, {
title: '处理时间',
search: false,
dataIndex: 'time9',
valueType: 'dateRange',
initialValue: day,
width: 140,
render: (dom, record) => {
return record.address
},
fieldProps: {
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
}, {
title: '扣分',
search: false,
dataIndex: 'containers13',
valueType: 'dateRange',
initialValue: day,
width: 140,
render: (dom, record) => {
return record.address
},
fieldProps: {
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
}, {
title: '罚款',
search: false,
dataIndex: 'containers14',
valueType: 'dateRange',
initialValue: day,
width: 140,
render: (dom, record) => {
return record.address
},
fieldProps: {
getPopupContainer: (triggerNode) => triggerNode.parentNode,
}
return flag
}
},
{
title: '排查日期',
dataIndex: 'time',
valueType: 'dateRange',
initialValue: day,
order: 4,
fieldProps: {
onChange: (value, cs) => {
setDay(cs)
},
getPopupContainer: (triggerNode) => triggerNode.parentNode,
},
render: (dom, record) => {
return [moment(record.time).format('YYYY-MM-DD HH:mm:ss'),]
}
},
{
title: '操作',
dataIndex: 'creatTime',
valueType: 'dateTimeRange',
hideInSearch: true,
render: (dom, record) => {
return <Button type="link" onClick={() => { props.openModal('edit', record) }}>详情</Button>
}
},
]
{
title: '操作',
dataIndex: 'creatTime',
valueType: 'dateTimeRange',
hideInSearch: true,
width: 120,
fixed: 'right',
render: (dom, record) => {
return <div><Button type="link">编辑</Button><Button type="link"></Button></div>
}
},
{
key: "direction",
hideInTable: true,
dataIndex: "direction",
order: 6,
renderFormItem: (item, { type, defaultRender, ...rest }, form) => {
return (
<div> <Button
type="primary"
style={{ width: "100px" }}
onClick={() => {
dispatch(push(`article/update/post`));
}}
>
新增
</Button>
<Button
type="primary"
style={{ width: "100px", marginLeft: 20 }}
onClick={() => {
// dispatch(push(`article/update/post`));
}}
>
导入
</Button>
</div>
);
},
},
]
return (
<Spin spinning={false}>
<h4 style={{ position: 'relative', top: '34px', left: '62px' }}>区域</h4>
<TreeSelect
value={regionId}
suffixIcon={true}
dropdownMatchSelectWidth={false}
style={{ width: '18.4%', marginLeft: '104px' }}
treeData={depData}
placeholder="全部"
showSearch={true}
onChange={onChange}
treeDefaultExpandAll={false}
request={async () => {
return depData
}}
expandedKeys={["title"]}
notFoundContent={
depLoading ?
<p style={{ textAlign: 'center' }}>
<Spin spinning={depLoading}></Spin>
</p> :
<p style={{ textAlign: 'center' }}>暂无数据</p>
}
getPopupContainer={(triggerNode) => triggerNode.parentNode}
/>
<div>
<div className='protable-transpor'>
<ProTable
scroll={{ x: 800 }}
options={false}
ref={c => { finishedProductTable = c; }}
style={{ width: "100% ", overflow: "auto", height: '760px' }}
rowKey="id"
rowKey='id'
onReset={(v) => {
const { id } = depMessage[0]
console.log(id)
@ -162,7 +320,7 @@ const InForTable = (props) => {
},
}}
columns={columns}
options={false}
dataSource={(counts || {}).rows || []}
request={async (params) => {
const query = {
@ -194,6 +352,7 @@ const InForTable = (props) => {
</Popconfirm>
],
}}
>
</ProTable></div>

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

@ -6,4 +6,13 @@
background-color: #ffffff !important;
}
}
.spilce{
.split-row-select-active {
background-color: #e6f7ff;
}
}
.card-protable{display: flex;
flex-direction:row;
width: 100%;
}

2248
web/client/src/sections/fillion/components/publicTable.js

File diff suppressed because it is too large

215
web/client/src/sections/fillion/components/videoTable.js

@ -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);

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

@ -1,6 +1,12 @@
'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 };
export { Infor,transportation,BridgeTable,HigHways,OperaTional,Enforce,Public,Videois };

29
web/client/src/sections/fillion/containers/infor.js

@ -3,7 +3,6 @@ import { connect } from 'react-redux';
import '../style.less';
import { getDepMessage, getReportStatistic } from "../actions/infor"
import InForTable from '../components/inforTable';
import UserModal from '../components/infor/details';
const superagent = require('superagent');
const infor = (props) => {
const { dispatch, user} = props
@ -15,16 +14,16 @@ const infor = (props) => {
dispatch(getReportStatistic())
setData(props)
}, []);
//打开弹窗
const openModal = (type, record) => {
setModalVisible(true);
// setModalType(type);
if (type == 'edit') {
setModalRecord(record);
} else {
setModalRecord(null);
}
}
// //打开弹窗
// const openModal = (type, record) => {
// setModalVisible(true);
// // setModalType(type);
// if (type == 'edit') {
// setModalRecord(record);
// } else {
// setModalRecord(null);
// }
// }
//批量导出
const exports = (ids,counts) => {
// console.log(user);
@ -42,12 +41,8 @@ const infor = (props) => {
})
}
return (
<> <InForTable data={data} openModal={openModal} exports={exports} />
<UserModal
visible={modalVisible}
onVisibleChange={setModalVisible}
modalRecord={modalRecord}
/></>
<> <InForTable data={data} exports={exports} />
</>
)
}
function mapStateToProps(state) {

42
web/client/src/sections/fillion/containers/videois.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 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);

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

@ -5,9 +5,29 @@ import { ReadOutlined } from '@ant-design/icons';
const SubMenu = Menu.SubMenu;
export function getNavItem(user, dispatch) {
return (
<SubMenu key="fillion" icon={<ReadOutlined />} title={'填报管理'}>
<SubMenu key="fillion" icon={<ReadOutlined />} title={'数据管理'}>
<Menu.Item key="fillioninfor">
<Link to="/fillion/infor">填报信息</Link>
<Link to="/fillion/infor">治超管理</Link>
</Menu.Item>
<Menu.Item key="filliontransportation">
<Link to="/fillion/transportation">道路管理</Link>
</Menu.Item><Menu.Item key="fillionbridge">
<Link to="/fillion/bridge">桥梁管理</Link>
</Menu.Item>
<Menu.Item key="fillionhighways">
<Link to="/fillion/highways">路政管理</Link>
</Menu.Item>
<Menu.Item key="fillionoperational">
<Link to="/fillion/operational">运政管理</Link>
</Menu.Item>
<Menu.Item key="fillionenforce">
<Link to="/fillion/enforce">执法管理</Link>
</Menu.Item>
<Menu.Item key="fillionpublic">
<Link to="/fillion/public">公交管理</Link>
</Menu.Item>
<Menu.Item key="fillionvideois">
<Link to="/fillion/videois">视频管理</Link>
</Menu.Item>
</SubMenu>
);

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

@ -1,19 +1,71 @@
'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 [{
type: 'inner',
route: {
path: '/fillion',
key: 'fillion',
breadcrumb: '填报管理',
breadcrumb: '数据管理',
menuSelectKeys: ['fillion'],
menuOpenKeys: ['fillion'],
childRoutes: [ {
childRoutes: [{
path: '/infor',
key: 'fillioninfor',
menuSelectKeys:['fillioninfor'],
component: infor,
breadcrumb: '填报信息',
}]
menuSelectKeys: ['fillioninfor'],
component: Infor,
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: '视频管理',
}
]
}
}];
}];

30
web/client/src/sections/middleground/actions/data.js

@ -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
}

7
web/client/src/sections/middleground/actions/index.js

@ -1,7 +0,0 @@
'use strict';
import * as date from "./data"
export default {
...date
}

118
web/client/src/sections/middleground/components/dateModal.js

@ -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)

5
web/client/src/sections/middleground/components/index.js

@ -1,5 +0,0 @@
'use strict';
import DateModal from './dateModal';
export { DateModal };

157
web/client/src/sections/middleground/containers/data.js

@ -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);

5
web/client/src/sections/middleground/containers/index.js

@ -1,5 +0,0 @@
'use strict';
import UserManage from './data';
export { UserManage };

15
web/client/src/sections/middleground/index.js

@ -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
};

18
web/client/src/sections/middleground/nav-item.js

@ -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>
);
}

5
web/client/src/sections/middleground/reducers/index.js

@ -1,5 +0,0 @@
'use strict';
export default {
};

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

@ -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'],
}
}];

86
web/client/src/sections/middleground/style.less

@ -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;
}
}
}
}
}

8
web/client/src/sections/organization/actions/user.js

@ -36,23 +36,23 @@ export function createUser(data) {
});
}
export function updateUser(id, data) {
export function updateUser(userId, data) {
return dispatch => basicAction({
type: 'put',
data,
dispatch: dispatch,
actionType: 'UPDATE_DEPARTMENT_USER',
url: ApiTable.updateUser.replace('{id}', id),
url: ApiTable.updateUser.replace('{userId}', userId),
msg: { option: '修改用户' },
});
}
export function delUser(ids) {
export function delUser(userIds) {
return dispatch => basicAction({
type: 'del',
dispatch: dispatch,
actionType: 'DEL_DEPARTMENT_USER',
url: ApiTable.delUser.replace('{ids}', ids),
url: ApiTable.delUser.replace('{userIds}', userIds),
msg: { option: '删除用户' },
});
}

5
web/client/src/sections/organization/containers/index.js

@ -1,6 +1,7 @@
'use strict';
import Authority from './authority';
import UserManage from './user';
export { Authority, UserManage };
export { UserManage};

34
web/client/src/sections/organization/containers/user.js

@ -54,7 +54,25 @@ const UserManage = (props) => {
dataIndex: 'action',
render: (dom, record) => {
return record.username == 'SuperAdmin' ? '' : [
// return record.username == 'SuperAdmin' ? '' : [
// <Button type="link" onClick={() => { openModal('edit', record) }}>编辑</Button>,
// <Popconfirm
// title="确认删除?"
// onConfirm={() => {
// delUsers([record.id])
// }}
// >
// <Button type="link">删除</Button>
// </Popconfirm>,
// <Button
// type="link"
// onClick={() => {
// setModalRecord(record);
// setPwdModalVisible(true);
// }}
// >重置密码</Button>
// ]
return [
<Button type="link" onClick={() => { openModal('edit', record) }}>编辑</Button>,
<Popconfirm
title="确认删除?"
@ -131,7 +149,14 @@ const UserManage = (props) => {
<Spin spinning={loading} /* style={{ height: "calc(100vh - 70px)" }} */>
<Row gutter={16} /* style={{ overflow: "scroll" }} */>
<Col flex="260px" style={{ height: '100%' }}>
<Card title="部门" bordered={false} bodyStyle={{ padding: 8, paddingTop: 24, }}>
<Card bordered={false} bodyStyle={{ padding: 8, paddingTop: 24, }}>
<Button
type="primary"
key="primary"
style={{ marginLeft: 50 }}
onClick={() => openModal('create')}
>新建部门</Button>
{
depMessage.length ?
<Tree
@ -150,13 +175,14 @@ const UserManage = (props) => {
key: 'id',
children: 'subordinate'
}}
style={{ paddingTop: 20 }}
/> : ''
}
</Card>
</Col>
<Col /* flex="auto" */ style={{ width: "calc(100% - 260px)", height: '100%', display: "black" }}>
<Card title="用户" bordered={false} height={clientHeight} bodyStyle={{ padding: 8, paddingTop: 24, overflow: "hidden", width: "100%" }}>
<Card bordered={false} height={clientHeight} bodyStyle={{ padding: 8, paddingTop: 24, overflow: "hidden", width: "100%" }}>
<ProTable
columns={columns}
dataSource={depUser}
@ -184,7 +210,7 @@ const UserManage = (props) => {
style={{ marginRight: 10 }}
onClick={() => openModal('create')}
>新建用户</Button>
<Button style={{ marginRight: 10 }} onClick={() => { dispatch(getDepUser(depSelectedKeys[0])); }}>刷新</Button>
{/* <Button style={{ marginRight: 10 }} onClick={() => { dispatch(getDepUser(depSelectedKeys[0])); }}>刷新</Button> */}
<Popconfirm title="确认删除?" onConfirm={() => { delUsers(rowSelected, 'batch') }}>
<Button>批量删除</Button>
</Popconfirm>

29
web/client/src/sections/organization/nav-item.js

@ -9,23 +9,24 @@ import { push } from 'react-router-redux';
const SubMenu = Menu.SubMenu;
export function getNavItem(user, dispatch) {
if (!Func.isAuthorized("ORG_MANAGE")) {
return null
}
// console.log(!Func.isAuthorized("ORG_MANAGE"));
if (user.type != 1 && user.type != 2 && user.type != 3) {
dispatch(push('/fillion/infor'));
return null
}
// if (!Func.isAuthorized("ORG_MANAGE")) {
// return null
// }
// // console.log(!Func.isAuthorized("ORG_MANAGE"));
// if (user.type != 1 && user.type != 2 && user.type != 3) {
// dispatch(push('/fillion/infor'));
// return null
// }
return (
<SubMenu key="organization" icon={<SettingOutlined />} title={'组织管理'}>
{Func.isAuthorized("ORG_MEMBER") && <Menu.Item key="userManage">
<SubMenu key="organization" icon={<SettingOutlined />} title={'授权管理'}>
{ <Menu.Item key="userManage">
<Link to="/organization/user">用户管理</Link>
</Menu.Item>
}
{Func.isAuthorized("ORG_AUTH") && <Menu.Item key="authority">
<Link to="/organization/authority">权限配置</Link>
</Menu.Item>}
}
</SubMenu>
);
}

10
web/client/src/sections/organization/routes.js

@ -1,12 +1,12 @@
'use strict';
import { UserManage, Authority } from './containers';
import { UserManage, Authority,AdminiSter } from './containers';
export default [{
type: 'inner',
route: {
path: '/organization',
key: 'organization',
breadcrumb: '组织管理',
breadcrumb: '授权管理',
menuSelectKeys: ['userManage'],
menuOpenKeys: ['organization'],
childRoutes: [{
@ -15,12 +15,6 @@ export default [{
menuSelectKeys: ['userManage'],
component: UserManage,
breadcrumb: '用户管理',
}, {
path: '/authority',
key: 'authority',
component: Authority,
menuSelectKeys: ['authority'],
breadcrumb: '权限配置',
}]
}
}];

37
web/client/src/sections/report/actions/compile.js

@ -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: '保存信息' },
});
}

59
web/client/src/sections/report/actions/config.js

@ -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: '删除报表配置' },
});
}

26
web/client/src/sections/report/actions/download.js

@ -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' }
});
}

11
web/client/src/sections/report/actions/index.js

@ -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,
}

118
web/client/src/sections/report/components/compileDrawer.js

@ -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);

124
web/client/src/sections/report/components/configModal.js

@ -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);

111
web/client/src/sections/report/containers/compile.js

@ -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);

157
web/client/src/sections/report/containers/config.js

@ -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);

129
web/client/src/sections/report/containers/download.js

@ -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);

7
web/client/src/sections/report/containers/index.js

@ -1,7 +0,0 @@
'use strict';
import Config from './config';
import Download from './download';
import Compile from './compile'
export { Config, Download, Compile };

15
web/client/src/sections/report/index.js

@ -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
};

35
web/client/src/sections/report/nav-item.js

@ -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>
);
}

5
web/client/src/sections/report/reducers/index.js

@ -1,5 +0,0 @@
'use strict';
export default {
}

33
web/client/src/sections/report/routes.js

@ -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: '整治汇总表',
}]
}
}];

3
web/client/src/sections/report/style.less

@ -1,3 +0,0 @@
#example:hover {
font-size: larger;
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save