Browse Source

人事管理菜单结构调整,并增加未开发的界面入口

master
周沫沫历险记 2 years ago
parent
commit
1cbacf8b46
  1. 2
      web/client/index.ejs
  2. 2
      web/client/index.html
  3. 92
      web/client/src/layout/components/header/contant.js
  4. 5
      web/client/src/layout/components/header/index.jsx
  5. 23
      web/client/src/layout/components/sider/index.jsx
  6. 62
      web/client/src/layout/containers/layout/index.jsx
  7. 9
      web/client/src/sections/auth/actions/auth.js
  8. 6
      web/client/src/sections/auth/containers/login.jsx
  9. 14
      web/client/src/sections/humanAffairs/components/empty.js
  10. 42
      web/client/src/sections/humanAffairs/containers/appointmentRecords.jsx
  11. 42
      web/client/src/sections/humanAffairs/containers/attendanceStatistics.jsx
  12. 54
      web/client/src/sections/humanAffairs/containers/deptArchives.jsx
  13. 40
      web/client/src/sections/humanAffairs/containers/employeeAuth.jsx
  14. 16
      web/client/src/sections/humanAffairs/containers/employeeInformation.jsx
  15. 40
      web/client/src/sections/humanAffairs/containers/formMaintenance.jsx
  16. 42
      web/client/src/sections/humanAffairs/containers/highMonthly.jsx
  17. 37
      web/client/src/sections/humanAffairs/containers/index.js
  18. 12
      web/client/src/sections/humanAffairs/containers/leaveStatistics.jsx
  19. 42
      web/client/src/sections/humanAffairs/containers/monthlyProcess.jsx
  20. 10
      web/client/src/sections/humanAffairs/containers/overtimeStatistics.jsx
  21. 42
      web/client/src/sections/humanAffairs/containers/penaltiesRecord.jsx
  22. 13
      web/client/src/sections/humanAffairs/containers/personnelFiles.jsx
  23. 2
      web/client/src/sections/humanAffairs/containers/pmLog.jsx
  24. 42
      web/client/src/sections/humanAffairs/containers/probationerKPI.jsx
  25. 42
      web/client/src/sections/humanAffairs/containers/quarter.jsx
  26. 42
      web/client/src/sections/humanAffairs/containers/regularKPI.jsx
  27. 42
      web/client/src/sections/humanAffairs/containers/resourceRepository.jsx
  28. 2
      web/client/src/sections/humanAffairs/containers/saleLog.jsx
  29. 2
      web/client/src/sections/humanAffairs/containers/weeklyManagement.jsx
  30. 114
      web/client/src/sections/humanAffairs/nav-item.jsx
  31. 172
      web/client/src/sections/humanAffairs/routes.js

2
web/client/index.ejs

@ -9,7 +9,7 @@
<!-- <link rel="shortcut icon" href="/assets/images/favicon.ico"> --> <!-- <link rel="shortcut icon" href="/assets/images/favicon.ico"> -->
<script src="https://lf1-cdn-tos.bytegoofy.com/obj/iconpark/icons_20231_4.a82ed651163d1db5bc9208ca2d929534.es5.js"></script> <script src="https://lf1-cdn-tos.bytegoofy.com/obj/iconpark/icons_20231_12.7f8fd1546294d369f0a85f7d68afb538.es5.js"></script>
</head> </head>

2
web/client/index.html

@ -7,7 +7,7 @@
<!-- <link rel="shortcut icon" href="/assets/images/favicon.ico"> --> <!-- <link rel="shortcut icon" href="/assets/images/favicon.ico"> -->
<script src="https://lf1-cdn-tos.bytegoofy.com/obj/iconpark/icons_20231_4.a82ed651163d1db5bc9208ca2d929534.es5.js"></script> <script src="https://lf1-cdn-tos.bytegoofy.com/obj/iconpark/icons_20231_12.7f8fd1546294d369f0a85f7d68afb538.es5.js"></script>
</head> </head>
<body> <body>

92
web/client/src/layout/components/header/contant.js

@ -0,0 +1,92 @@
const headerItems = [{
itemKey: "authCenter",
text: "权限中心",
items: [{
fatherKey: "authCenter",
openKey: "authCenter",
itemKey: "employeeAuth",
text: "员工权限",
to: "/humanAffairs/authCenter/employeeAuth"
}, {
fatherKey: 'authCenter',
openKey: "authCenter",
itemKey: "formMaintenance",
text: "表单维护",
to: "/humanAffairs/authCenter/formMaintenance"
}]
}, {
itemKey: "achievements",
text: "绩效考核",
items: [{
fatherKey: "achievements",
itemKey: "basicAction",
text: "基本动作",
to: "/humanAffairs/achievements/basicAction/weeklyManagement"
}, {
fatherKey: 'achievements',
itemKey: "employeeKPI",
text: "员工考核",
to: "/humanAffairs/achievements/employeeKPI/probationer"
}, {
fatherKey: "achievements",
itemKey: "middleKPI",
text: "中层考核",
to: "/humanAffairs/achievements/middleKPI/monthlyProcess"
}, {
fatherKey: 'achievements',
itemKey: "highKPI",
text: "高管考核",
to: "/humanAffairs/achievements/highKPI/highMonthly"
}, {
fatherKey: 'achievements',
itemKey: "penalties",
text: "奖惩信息",
to: "/humanAffairs/achievements/penalties/penaltiesRecord"
}]
}, {
itemKey: "train",
text: "培训",
items: [{
fatherKey: "train",
itemKey: "trainFiles",
text: "培训档案",
to: "/humanAffairs/train/trainFiles/resourceRepository"
}]
}, {
itemKey: "recruit",
text: "招聘",
items: [{
fatherKey: "recruit",
itemKey: "recruitRecord",
text: "招聘记录",
to: "/humanAffairs/recruit/recruitRecord/appointmentRecords"
}]
}, {
itemKey: "employeeRelationship",
text: "员工关系",
items: [{
fatherKey: "employeeRelationship",
itemKey: "leaveManagement",
text: "假勤管理",
to: "/humanAffairs/employeeRelationship/leaveManagement/attendanceStatistics"
}]
}, {
itemKey: "archivesCenter",
text: "档案中心",
items: [{
fatherKey: "archivesCenter",
openKey: "personnelArchives",
itemKey: "personnelFiles",
text: "人员档案",
to: "/humanAffairs/archivesCenter/personnelArchives/personnelFiles"
}, {
fatherKey: 'archivesCenter',
itemKey: "deptArchives",
text: "部门档案",
to: "/humanAffairs/archivesCenter/deptArchives/department"
}]
}]
export {
headerItems
}

5
web/client/src/layout/components/header/index.jsx

@ -3,10 +3,11 @@ import React from "react";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { SplitButtonGroup, Dropdown, Button, Nav, Avatar } from '@douyinfe/semi-ui'; import { SplitButtonGroup, Dropdown, Button, Nav, Avatar } from '@douyinfe/semi-ui';
import { IconTreeTriangleDown } from '@douyinfe/semi-icons'; import { IconTreeTriangleDown } from '@douyinfe/semi-icons';
import { headerItems } from './contant';
import "./index.less"; import "./index.less";
const Header = (props) => { const Header = (props) => {
const { dispatch, history, user, actions, socket, headerItems, tochange } = props; const { dispatch, history, user, actions, socket, tochange } = props;
return ( return (
<> <>
@ -152,7 +153,7 @@ const Header = (props) => {
); );
}; };
function mapStateToProps (state) { function mapStateToProps(state) {
const { global, auth, webSocket } = state; const { global, auth, webSocket } = state;
return { return {
actions: global.actions, actions: global.actions,

23
web/client/src/layout/components/sider/index.jsx

@ -22,18 +22,13 @@ const Sider = (props) => {
dispatch(push(homePath)) dispatch(push(homePath))
} }
}, [leftItems]) }, [leftItems])
let routeSelectedKey = [useLocation().pathname.split('/')[1]]// let routeSelectedKey = useLocation().pathname.split('/');
let routeSelectedKeys = [useLocation().pathname.split('/')[2]]// // let routeSelectedKey = [useLocation().pathname.split('/')[1]]//
let routeSelectedKeyss = [useLocation().pathname.split('/')[3]]// // let routeSelectedKeys = [useLocation().pathname.split('/')[2]]//
// let routeSelectedKeyss = [useLocation().pathname.split('/')[3]]//
useEffect(() => { useEffect(() => {
if (routeSelectedKeyss[0]) { if (routeSelectedKey.length) {
setSelectedKeys(routeSelectedKeyss) setSelectedKeys([routeSelectedKey[routeSelectedKey.length - 1]])
}
else if (routeSelectedKeys[0]) {
setSelectedKeys(routeSelectedKeys)
}
else {
setSelectedKeys(routeSelectedKey)
} }
const lastOpenKeys = localStorage.getItem('poms_open_sider') const lastOpenKeys = localStorage.getItem('poms_open_sider')
if (lastOpenKeys) { if (lastOpenKeys) {
@ -51,8 +46,8 @@ const Sider = (props) => {
<Nav <Nav
style={{ background: '#101531', padding: 0 }} style={{ background: '#101531', padding: 0 }}
selectedKeys={selectedKeys} selectedKeys={selectedKeys}
bodyStyle={{height:clientHeight-64}} bodyStyle={{ height: clientHeight - 64 }}
mode = "vertical" mode="vertical"
footer={{ footer={{
collapseButton: true, collapseButton: true,
}} }}
@ -76,7 +71,7 @@ const Sider = (props) => {
) )
} }
function mapStateToProps (state) { function mapStateToProps(state) {
const { global } = state; const { global } = state;
return { return {
clientHeight: global.clientHeight, clientHeight: global.clientHeight,

62
web/client/src/layout/containers/layout/index.jsx

@ -39,7 +39,7 @@ const LayoutContainer = props => {
document.getElementById('HrApp').clientWidth - (collapsed ? 120 : 240) document.getElementById('HrApp').clientWidth - (collapsed ? 120 : 240)
)); ));
} }
function deepCopy (data) {// function deepCopy(data) {//
//string,number,bool,null,undefined,symbol //string,number,bool,null,undefined,symbol
//object,array,date //object,array,date
if (data && typeof data === "object") { if (data && typeof data === "object") {
@ -81,7 +81,7 @@ const LayoutContainer = props => {
} }
} }
const [allItems, setAllItems] = useState([]) const [allItems, setAllItems] = useState([])
const [headerItems, setHeaderItems] = useState([]) // const [headerItems, setHeaderItems] = useState([])
const [leftItems, setLeftItems] = useState([]) const [leftItems, setLeftItems] = useState([])
const [leftChange, setLeftChange] = useState(true) const [leftChange, setLeftChange] = useState(true)
const [leftShow, setLeftShow] = useState(false) const [leftShow, setLeftShow] = useState(false)
@ -102,10 +102,10 @@ const LayoutContainer = props => {
itm.items[i].fatherKey = itm.itemKey itm.items[i].fatherKey = itm.itemKey
delete itm.items[i].items delete itm.items[i].items
} }
topItems.push(itm) // topItems.push(itm)
} // }
else { // else {
topItems.push.apply(topItems, item) // topItems.push.apply(topItems, item)
} }
} }
} }
@ -113,16 +113,16 @@ const LayoutContainer = props => {
} }
} }
setAllItems(nextItems) setAllItems(nextItems)
setHeaderItems(topItems) // setHeaderItems(topItems)
if (lastSelectedKeys) {// if (lastSelectedKeys) {//
for (let i = 0; i < nextItems.length; i++) { for (let i = 0; i < nextItems.length; i++) {
if (JSON.parse(lastSelectedKeys)[0] == nextItems[i].itemKey) { if (JSON.parse(lastSelectedKeys)[0] == nextItems[i].itemKey) {
let openArr = [] // let openArr = []
for (let j = 0; j < nextItems[i].items.length; j++) { // for (let j = 0; j < nextItems[i].items.length; j++) {
openArr.push(nextItems[i].items[j].itemKey) // openArr.push(nextItems[i].items[j].itemKey)
} // }
localStorage.setItem('poms_open_sider', JSON.stringify(openArr)) // localStorage.setItem('poms_open_sider', JSON.stringify(openArr))
setLeftItems(nextItems[i].items) setLeftItems(nextItems[i].items)
} }
} }
@ -151,7 +151,7 @@ const LayoutContainer = props => {
openArr.push(allItems[i].items[o].itemKey) openArr.push(allItems[i].items[o].itemKey)
} }
localStorage.setItem('poms_selected_sider', JSON.stringify([pathnameArr[1]])) localStorage.setItem('poms_selected_sider', JSON.stringify([pathnameArr[1]]))
localStorage.setItem('poms_open_sider', JSON.stringify(openArr)) // localStorage.setItem('poms_open_sider', JSON.stringify(openArr))
setLeftItems(allItems[i].items) setLeftItems(allItems[i].items)
setLeftShow(true) setLeftShow(true)
} }
@ -229,7 +229,7 @@ const LayoutContainer = props => {
<> <>
<Layout.Header> <Layout.Header>
<Header <Header
headerItems={headerItems} // headerItems={headerItems} //
user={user} user={user}
pathname={location.pathname} pathname={location.pathname}
toggleCollapsed={() => { toggleCollapsed={() => {
@ -238,25 +238,29 @@ const LayoutContainer = props => {
collapsed={collapsed} collapsed={collapsed}
history={history} history={history}
tochange={(val) => { tochange={(val) => {
setLeftChange(!leftChange) // setLeftChange(!leftChange) //
if (val.fatherKey) { if (val.fatherKey) {
for (let i = 0; i < allItems.length; i++) { localStorage.setItem('poms_selected_sider', JSON.stringify([val.itemKey]));
if (val.fatherKey == allItems[i].itemKey) { const historyOpenKeys = localStorage.getItem('poms_open_sider');
let openArr = [] const openKeys = historyOpenKeys && JSON.parse(historyOpenKeys).concat(val.openKey || val.itemKey) || [val.openKey || val.itemKey]
for (let j = 0; j < allItems[i].items.length; j++) { localStorage.setItem('poms_open_sider', JSON.stringify(openKeys));
openArr.push(allItems[i].items[j].itemKey) // for (let i = 0; i < allItems.length; i++) {
} // if (val.fatherKey == allItems[i].itemKey) {
localStorage.setItem('poms_selected_sider', JSON.stringify([val.fatherKey])) // let openArr = []
localStorage.setItem('poms_open_sider', JSON.stringify(openArr)) // for (let j = 0; j < allItems[i].items.length; j++) {
setLeftItems(allItems[i].items) // openArr.push(allItems[i].items[j].itemKey)
} // }
} // localStorage.setItem('poms_selected_sider', JSON.stringify([val.fatherKey]))
setLeftShow(true) // localStorage.setItem('poms_open_sider', JSON.stringify(openArr))
// setLeftItems(allItems[i].items)
// }
// }
// setLeftShow(true)
} }
else { else {
localStorage.setItem('poms_open_sider', JSON.stringify([])) localStorage.setItem('poms_open_sider', JSON.stringify([]))
localStorage.removeItem('poms_selected_sider') localStorage.removeItem('poms_selected_sider')
setLeftShow(false) // setLeftShow(false)
} }
history.push(val.to); history.push(val.to);
}} }}
@ -303,7 +307,7 @@ const LayoutContainer = props => {
) )
} }
function mapStateToProps (state) { function mapStateToProps(state) {
const { global, auth, ajaxResponse, webSocket } = state; const { global, auth, ajaxResponse, webSocket } = state;
return { return {
title: global.title, title: global.title,

9
web/client/src/sections/auth/actions/auth.js

@ -4,7 +4,7 @@ import { ApiTable, AxyRequest, EmisRequest } from '$utils'
import { Request } from '@peace/utils'; import { Request } from '@peace/utils';
export const INIT_AUTH = 'INIT_AUTH'; export const INIT_AUTH = 'INIT_AUTH';
export function initAuth (userData) { export function initAuth(userData) {
const sessionUser = JSON.parse(sessionStorage.getItem('hrUser')) const sessionUser = JSON.parse(sessionStorage.getItem('hrUser'))
const user = userData || sessionUser || {}; const user = userData || sessionUser || {};
if (user.authorized && !sessionUser) { if (user.authorized && !sessionUser) {
@ -21,7 +21,7 @@ export function initAuth (userData) {
export const REQUEST_LOGIN = 'REQUEST_LOGIN'; export const REQUEST_LOGIN = 'REQUEST_LOGIN';
export const LOGIN_SUCCESS = 'LOGIN_SUCCESS'; export const LOGIN_SUCCESS = 'LOGIN_SUCCESS';
export const LOGIN_ERROR = 'LOGIN_ERROR'; export const LOGIN_ERROR = 'LOGIN_ERROR';
export function login (username, password) { export function login(username, password) {
return dispatch => { return dispatch => {
dispatch({ type: REQUEST_LOGIN }); dispatch({ type: REQUEST_LOGIN });
@ -63,7 +63,7 @@ export function login (username, password) {
} }
export const LOGOUT = 'LOGOUT'; export const LOGOUT = 'LOGOUT';
export function logout () { export function logout() {
const user = JSON.parse(sessionStorage.getItem('hrUser')) const user = JSON.parse(sessionStorage.getItem('hrUser'))
user && user.token ? user && user.token ?
Request.put(ApiTable.logout, { Request.put(ApiTable.logout, {
@ -71,6 +71,9 @@ export function logout () {
code: 'POMS' code: 'POMS'
}) : null; }) : null;
sessionStorage.removeItem('hrUser'); sessionStorage.removeItem('hrUser');
localStorage.removeItem('poms_selected_sider');
localStorage.removeItem('poms_open_sider');
return { return {
type: LOGOUT type: LOGOUT
}; };

6
web/client/src/sections/auth/containers/login.jsx

@ -20,7 +20,7 @@ const Login = props => {
useEffect(() => { useEffect(() => {
if (user && user.authorized) { if (user && user.authorized) {
dispatch(push('/humanAffairs/archivesCenter/personnelFiles')); dispatch(push('/humanAffairs/archivesCenter/personnelArchives/personnelFiles'));
localStorage.setItem('poms_open_sider', JSON.stringify(["archivesCenter"])) localStorage.setItem('poms_open_sider', JSON.stringify(["archivesCenter"]))
localStorage.setItem('poms_selected_sider', JSON.stringify(["humanAffairs"])) localStorage.setItem('poms_selected_sider', JSON.stringify(["humanAffairs"]))
} }
@ -67,7 +67,7 @@ const Login = props => {
dispatch(login(values.username, values.password)).then(res => { dispatch(login(values.username, values.password)).then(res => {
const data = res.payload.user const data = res.payload.user
localStorage.setItem('word', JSON.stringify(values.password)) localStorage.setItem('word', JSON.stringify(values.password))
dispatch(actions.layout.initWebSocket({ ioUrl: apiRoot, token: data.token, hrUserId: data.hrUserInfo.id })) dispatch(actions.layout.initWebSocket({ ioUrl: apiRoot, token: data.token, hrUserId: data.hrUserInfo && hrUserInfo.id }))
}) })
}} }}
getFormApi={formApi => form.current = formApi} getFormApi={formApi => form.current = formApi}
@ -103,7 +103,7 @@ const Login = props => {
); );
} }
function mapStateToProps (state) { function mapStateToProps(state) {
const { auth, global } = state; const { auth, global } = state;
return { return {
user: auth.user, user: auth.user,

14
web/client/src/sections/humanAffairs/components/empty.js

@ -0,0 +1,14 @@
import React from 'react';
import { Empty as EmptySemi } from '@douyinfe/semi-ui';
import { IllustrationConstruction, IllustrationConstructionDark } from '@douyinfe/semi-illustrations';
const Empty = (props) => {
return (<EmptySemi
image={<IllustrationConstruction style={{ width: 150, height: 150 }} />}
darkModeImage={<IllustrationConstructionDark style={{ width: 150, height: 150 }} />}
title={'功能建设中'}
description="当前功能暂未开放,敬请期待。"
/>
)
}
export default Empty

42
web/client/src/sections/humanAffairs/containers/appointmentRecords.jsx

@ -0,0 +1,42 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import Empty from '../components/empty';
import '../style.less'
const AppointmentRecords = (props) => {
const { dispatch, actions } = props
return (
<>
<div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>招聘</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>招聘记录</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: '#033C9A', fontSize: 14 }}>任用记录</div>
</div>
<div style={{ background: '#FFFFFF', boxShadow: '0px 0px 12px 2px rgba(220,222,224,0.2)', borderRadius: 2, padding: '20px 0px 20px 19px ', marginTop: 12 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'baseline' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #0F7EFB', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#033C9A', marginLeft: 8 }}>任用记录</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>APPOINTMENT RECORDS</div>
</div>
</div>
<Empty />
</div>
</div>
</>
)
}
function mapStateToProps(state) {
const { auth, global } = state;
return {
user: auth.user,
actions: global.actions,
};
}
export default connect(mapStateToProps)(AppointmentRecords);

42
web/client/src/sections/humanAffairs/containers/attendanceStatistics.jsx

@ -0,0 +1,42 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import Empty from '../components/empty';
import '../style.less'
const AttendanceStatistics = (props) => {
const { dispatch, actions } = props
return (
<>
<div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>员工关系</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>假勤管理</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: '#033C9A', fontSize: 14 }}>出勤统计</div>
</div>
<div style={{ background: '#FFFFFF', boxShadow: '0px 0px 12px 2px rgba(220,222,224,0.2)', borderRadius: 2, padding: '20px 0px 20px 19px ', marginTop: 12 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'baseline' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #0F7EFB', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#033C9A', marginLeft: 8 }}>出勤统计</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>ATTENDANCE STATISTICS</div>
</div>
</div>
<Empty />
</div>
</div>
</>
)
}
function mapStateToProps(state) {
const { auth, global } = state;
return {
user: auth.user,
actions: global.actions,
};
}
export default connect(mapStateToProps)(AttendanceStatistics);

54
web/client/src/sections/humanAffairs/containers/deptArchives.jsx

@ -0,0 +1,54 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import Empty from '../components/empty';
import '../style.less'
const DeptArchives = (props) => {
const { dispatch, actions } = props
return (
<>
<div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>档案中心</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>部门档案</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: '#033C9A', fontSize: 14 }}>部门档案</div>
</div>
<div style={{ background: '#FFFFFF', boxShadow: '0px 0px 12px 2px rgba(220,222,224,0.2)', borderRadius: 2, padding: '20px 0px 20px 19px ', marginTop: 12 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'baseline' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #0F7EFB', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#033C9A', marginLeft: 8 }}>部门档案</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>DEPARTMENT FILE</div>
</div>
</div>
</div>
<div style={{ background: '#FFFFFF', boxShadow: '0px 0px 12px 2px rgba(220,222,224,0.2)', borderRadius: 2, padding: '20px 0px 20px 19px ', marginTop: 9 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'baseline' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #0F7EFB', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#033C9A', marginLeft: 8 }}>部门档案详情</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>DEPARTMENT FILE DETAILS</div>
</div>
</div>
<div >
<Empty
/>
</div>
</div>
</div>
</>
)
}
function mapStateToProps(state) {
const { auth, global } = state;
return {
user: auth.user,
actions: global.actions
};
}
export default connect(mapStateToProps)(DeptArchives);

40
web/client/src/sections/humanAffairs/containers/employeeAuth.jsx

@ -0,0 +1,40 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import Empty from '../components/empty';
import '../style.less'
const EmployeeAuth = (props) => {
const { dispatch, actions } = props
return (
<>
<div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>权限中心</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: '#033C9A', fontSize: 14 }}>员工权限</div>
</div>
<div style={{ background: '#FFFFFF', boxShadow: '0px 0px 12px 2px rgba(220,222,224,0.2)', borderRadius: 2, padding: '20px 0px 20px 19px ', marginTop: 12 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'baseline' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #0F7EFB', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#033C9A', marginLeft: 8 }}>员工权限</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>EMPLOYEE AUTHORITY</div>
</div>
</div>
<Empty />
</div>
</div>
</>
)
}
function mapStateToProps(state) {
const { auth, global } = state;
return {
user: auth.user,
actions: global.actions,
};
}
export default connect(mapStateToProps)(EmployeeAuth);

16
web/client/src/sections/humanAffairs/containers/employeeInformation.jsx

@ -88,7 +88,7 @@ const employeeInformation = (props) => {
}, [query, order]) }, [query, order])
function getMemberSearchList () {// function getMemberSearchList() {//
let obj = lookup let obj = lookup
if (lookup.entryTime?.length > 1) { if (lookup.entryTime?.length > 1) {
obj.hiredateStart = moment(lookup.entryTime[0]).format('YYYY-MM-DD') obj.hiredateStart = moment(lookup.entryTime[0]).format('YYYY-MM-DD')
@ -105,14 +105,14 @@ const employeeInformation = (props) => {
} }
}) })
} }
function getMemberNativePlaceList () { function getMemberNativePlaceList() {
dispatch(humanAffairs.getMemberNativePlace()).then((res) => {// dispatch(humanAffairs.getMemberNativePlace()).then((res) => {//
if (res.success) { if (res.success) {
setNativeList(res.payload?.data) setNativeList(res.payload?.data)
} }
}) })
} }
function getMemberWorkPlaceList () { function getMemberWorkPlaceList() {
dispatch(humanAffairs.getMemberWorkPlace()).then((res) => {// dispatch(humanAffairs.getMemberWorkPlace()).then((res) => {//
if (res.success) { if (res.success) {
setWorkPlaceList(res.payload?.data) setWorkPlaceList(res.payload?.data)
@ -137,7 +137,7 @@ const employeeInformation = (props) => {
}, },
]; ];
// //
function attribute () { function attribute() {
const arr = localStorage.getItem(EMPLOYEEINFORMATION) const arr = localStorage.getItem(EMPLOYEEINFORMATION)
? JSON.parse(localStorage.getItem(EMPLOYEEINFORMATION)) ? JSON.parse(localStorage.getItem(EMPLOYEEINFORMATION))
: []; : [];
@ -435,7 +435,7 @@ const employeeInformation = (props) => {
} }
setSetupp(columns); setSetupp(columns);
} }
function handleRow (record, index) {// function handleRow(record, index) {//
// //
if (index % 2 === 0) { if (index % 2 === 0) {
return { return {
@ -452,9 +452,9 @@ const employeeInformation = (props) => {
<> <>
<div style={{ padding: '0px 12px' }}> <div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}> <div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>人事管理</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>档案中心</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>员工关系</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>人员档案</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div> <div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: '#033C9A', fontSize: 14 }}>员工信息</div> <div style={{ color: '#033C9A', fontSize: 14 }}>员工信息</div>
</div> </div>
@ -681,7 +681,7 @@ const employeeInformation = (props) => {
) )
} }
function mapStateToProps (state) { function mapStateToProps(state) {
const { auth, global, MemberSearch, webSocket } = state; const { auth, global, MemberSearch, webSocket } = state;
return { return {
// loading: members.isRequesting, // loading: members.isRequesting,

40
web/client/src/sections/humanAffairs/containers/formMaintenance.jsx

@ -0,0 +1,40 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import Empty from '../components/empty';
import '../style.less'
const FormMaintenance = (props) => {
const { dispatch, actions } = props
return (
<>
<div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>权限中心</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: '#033C9A', fontSize: 14 }}>表单维护</div>
</div>
<div style={{ background: '#FFFFFF', boxShadow: '0px 0px 12px 2px rgba(220,222,224,0.2)', borderRadius: 2, padding: '20px 0px 20px 19px ', marginTop: 12 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'baseline' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #0F7EFB', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#033C9A', marginLeft: 8 }}>表单维护</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>FORM MAINTENANCE</div>
</div>
</div>
<Empty />
</div>
</div>
</>
)
}
function mapStateToProps(state) {
const { auth, global } = state;
return {
user: auth.user,
actions: global.actions,
};
}
export default connect(mapStateToProps)(FormMaintenance);

42
web/client/src/sections/humanAffairs/containers/highMonthly.jsx

@ -0,0 +1,42 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import Empty from '../components/empty';
import '../style.less'
const HighMonthly = (props) => {
const { dispatch, actions } = props
return (
<>
<div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>绩效考核</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>高管考核</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: '#033C9A', fontSize: 14 }}>月度过程考核</div>
</div>
<div style={{ background: '#FFFFFF', boxShadow: '0px 0px 12px 2px rgba(220,222,224,0.2)', borderRadius: 2, padding: '20px 0px 20px 19px ', marginTop: 12 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'baseline' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #0F7EFB', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#033C9A', marginLeft: 8 }}>月度过程考核</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>MONTHLY PROCESS ASSESSMENT</div>
</div>
</div>
<Empty />
</div>
</div>
</>
)
}
function mapStateToProps(state) {
const { auth, global } = state;
return {
user: auth.user,
actions: global.actions,
};
}
export default connect(mapStateToProps)(HighMonthly);

37
web/client/src/sections/humanAffairs/containers/index.js

@ -1,17 +1,42 @@
'use strict'; 'use strict';
//档案中心
import PersonnelFiles from './personnelFiles'; import PersonnelFiles from './personnelFiles';
import PersonnelFilesDetail from './personnelFilesDetail';
import EmployeeInformation from './employeeInformation'; import EmployeeInformation from './employeeInformation';
import DeptArchives from './deptArchives';
//员工关系
import AttendanceStatistics from './attendanceStatistics';
import LeaveStatistics from './leaveStatistics';
import OvertimeStatistics from './overtimeStatistics';
//招聘
import AppointmentRecords from './appointmentRecords';
//培训
import ResourceRepository from './resourceRepository';
//绩效考核
import WeeklyManagement from './weeklyManagement'; import WeeklyManagement from './weeklyManagement';
import SaleLog from './saleLog'; import SaleLog from './saleLog';
import PMLog from './pmLog'; import PMLog from './pmLog';
import LeaveStatistics from './leaveStatistics'; import ProbationerKPI from './probationerKPI';
import OvertimeStatistics from './overtimeStatistics'; import RegularKPI from './regularKPI';
import MonthlyProcess from './monthlyProcess';
import Quarter from './quarter';
import HighMonthly from './highMonthly';
import PenaltiesRecord from './penaltiesRecord';
//权限中心
import EmployeeAuth from './employeeAuth';
import FormMaintenance from './formMaintenance';
//其它
import PersonnelFilesDetail from './personnelFilesDetail';
export { export {
PersonnelFiles, PersonnelFilesDetail, EmployeeInformation, PersonnelFiles, EmployeeInformation, DeptArchives,
AttendanceStatistics, LeaveStatistics, OvertimeStatistics,
AppointmentRecords,
ResourceRepository,
WeeklyManagement, SaleLog, PMLog, WeeklyManagement, SaleLog, PMLog,
LeaveStatistics, OvertimeStatistics ProbationerKPI, RegularKPI,
MonthlyProcess, Quarter, HighMonthly, PenaltiesRecord,
EmployeeAuth, FormMaintenance,
PersonnelFilesDetail,
}; };

12
web/client/src/sections/humanAffairs/containers/leaveStatistics.jsx

@ -51,7 +51,7 @@ const leaveStatistics = (props) => {
}, [query, order]) }, [query, order])
function getAttendanceVacateList () {// function getAttendanceVacateList() {//
let obj = lookup let obj = lookup
if (lookup.entryTime?.length > 1) { if (lookup.entryTime?.length > 1) {
obj.startDate = moment(lookup.entryTime[0]).format('YYYY-MM-DD') obj.startDate = moment(lookup.entryTime[0]).format('YYYY-MM-DD')
@ -68,7 +68,7 @@ const leaveStatistics = (props) => {
} }
}) })
} }
function getAttendanceVacateTypeList () { function getAttendanceVacateTypeList() {
dispatch(humanAffairs.getAttendanceVacateType()).then((res) => {// dispatch(humanAffairs.getAttendanceVacateType()).then((res) => {//
if (res.success) { if (res.success) {
let myTableList = tableList let myTableList = tableList
@ -98,7 +98,7 @@ const leaveStatistics = (props) => {
}, },
]; ];
// //
function attribute (typeList) { function attribute(typeList) {
const arr = localStorage.getItem(LEAVESTATISTICS) const arr = localStorage.getItem(LEAVESTATISTICS)
? JSON.parse(localStorage.getItem(LEAVESTATISTICS)) ? JSON.parse(localStorage.getItem(LEAVESTATISTICS))
: []; : [];
@ -242,7 +242,7 @@ const leaveStatistics = (props) => {
} }
setSetupp(columns); setSetupp(columns);
} }
function handleRow (record, index) {// function handleRow(record, index) {//
// //
if (index % 2 === 0) { if (index % 2 === 0) {
return { return {
@ -259,7 +259,7 @@ const leaveStatistics = (props) => {
<> <>
<div style={{ padding: '0px 12px' }}> <div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}> <div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>人事管理</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>员工关系</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>假勤管理</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>假勤管理</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div> <div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
@ -435,7 +435,7 @@ const leaveStatistics = (props) => {
) )
} }
function mapStateToProps (state) { function mapStateToProps(state) {
const { auth, global, MemberSearch, webSocket } = state; const { auth, global, MemberSearch, webSocket } = state;
return { return {
// loading: members.isRequesting, // loading: members.isRequesting,

42
web/client/src/sections/humanAffairs/containers/monthlyProcess.jsx

@ -0,0 +1,42 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import Empty from '../components/empty';
import '../style.less'
const MonthlyProcess = (props) => {
const { dispatch, actions } = props
return (
<>
<div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>绩效考核</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>中层考核</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: '#033C9A', fontSize: 14 }}>月度过程考核</div>
</div>
<div style={{ background: '#FFFFFF', boxShadow: '0px 0px 12px 2px rgba(220,222,224,0.2)', borderRadius: 2, padding: '20px 0px 20px 19px ', marginTop: 12 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'baseline' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #0F7EFB', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#033C9A', marginLeft: 8 }}>月度过程考核</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>Monthly process assessment</div>
</div>
</div>
<Empty />
</div>
</div>
</>
)
}
function mapStateToProps(state) {
const { auth, global } = state;
return {
user: auth.user,
actions: global.actions,
};
}
export default connect(mapStateToProps)(MonthlyProcess);

10
web/client/src/sections/humanAffairs/containers/overtimeStatistics.jsx

@ -59,7 +59,7 @@ const overtimeStatistics = (props) => {
}, [query, order]) }, [query, order])
function getAttendanceOvertimeList () {// function getAttendanceOvertimeList() {//
let obj = lookup let obj = lookup
if (lookup.entryTime?.length > 1) { if (lookup.entryTime?.length > 1) {
obj.startDate = moment(lookup.entryTime[0]).format('YYYY-MM-DD') obj.startDate = moment(lookup.entryTime[0]).format('YYYY-MM-DD')
@ -93,7 +93,7 @@ const overtimeStatistics = (props) => {
}, },
]; ];
// //
function attribute () { function attribute() {
const arr = localStorage.getItem(OVERTIMESTATISTICS) const arr = localStorage.getItem(OVERTIMESTATISTICS)
? JSON.parse(localStorage.getItem(OVERTIMESTATISTICS)) ? JSON.parse(localStorage.getItem(OVERTIMESTATISTICS))
: []; : [];
@ -337,7 +337,7 @@ const overtimeStatistics = (props) => {
} }
setSetupp(columns); setSetupp(columns);
} }
function handleRow (record, index) {// function handleRow(record, index) {//
// //
if (index % 2 === 0) { if (index % 2 === 0) {
return { return {
@ -354,7 +354,7 @@ const overtimeStatistics = (props) => {
<> <>
<div style={{ padding: '0px 12px' }}> <div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}> <div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>人事管理</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>员工关系</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>假勤管理</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>假勤管理</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div> <div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
@ -516,7 +516,7 @@ const overtimeStatistics = (props) => {
) )
} }
function mapStateToProps (state) { function mapStateToProps(state) {
const { auth, global, MemberSearch, webSocket } = state; const { auth, global, MemberSearch, webSocket } = state;
return { return {
// loading: members.isRequesting, // loading: members.isRequesting,

42
web/client/src/sections/humanAffairs/containers/penaltiesRecord.jsx

@ -0,0 +1,42 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import Empty from '../components/empty';
import '../style.less'
const PenaltiesRecord = (props) => {
const { dispatch, actions } = props
return (
<>
<div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>绩效考核</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>奖惩信息</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: '#033C9A', fontSize: 14 }}>奖惩信息</div>
</div>
<div style={{ background: '#FFFFFF', boxShadow: '0px 0px 12px 2px rgba(220,222,224,0.2)', borderRadius: 2, padding: '20px 0px 20px 19px ', marginTop: 12 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'baseline' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #0F7EFB', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#033C9A', marginLeft: 8 }}>奖惩信息</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>REWARD AND PUNISHMENT INFORMATION</div>
</div>
</div>
<Empty />
</div>
</div>
</>
)
}
function mapStateToProps(state) {
const { auth, global } = state;
return {
user: auth.user,
actions: global.actions,
};
}
export default connect(mapStateToProps)(PenaltiesRecord);

13
web/client/src/sections/humanAffairs/containers/personnelFiles.jsx

@ -6,7 +6,6 @@ import PersonnelModal from '../components/personnelModal';
import ImportMembersModal from './import-members-modal' import ImportMembersModal from './import-members-modal'
import '../style.less' import '../style.less'
import moment from 'moment' import moment from 'moment'
import { set } from 'nprogress';
const Rest = (props) => { const Rest = (props) => {
const { dispatch, actions, history, user, loading, socket, xqMembers } = props const { dispatch, actions, history, user, loading, socket, xqMembers } = props
@ -32,7 +31,7 @@ const Rest = (props) => {
getMemberSearchList() getMemberSearchList()
}, [typeChoose]) }, [typeChoose])
function getMemberSearchList () {// function getMemberSearchList() {//
dispatch(humanAffairs.getMemberSearch()) dispatch(humanAffairs.getMemberSearch())
dispatch(humanAffairs.getMemberList({ keywordTarget, keyword, state: typeChoose })).then((res) => {// dispatch(humanAffairs.getMemberList({ keywordTarget, keyword, state: typeChoose })).then((res) => {//
if (res.success) { if (res.success) {
@ -41,19 +40,19 @@ const Rest = (props) => {
}) })
} }
function typeOnChange (e) {// function typeOnChange(e) {//
setTypeChoose(e.target.value); setTypeChoose(e.target.value);
} }
function seachValueChange (value) { function seachValueChange(value) {
setKeyword(value) setKeyword(value)
} }
return ( return (
<> <>
<div style={{ padding: '0px 12px' }}> <div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}> <div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>人事管理</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>档案中心</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>档案中心</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>人员档案</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div> <div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: '#033C9A', fontSize: 14 }}>人员档案</div> <div style={{ color: '#033C9A', fontSize: 14 }}>人员档案</div>
</div> </div>
@ -312,7 +311,7 @@ const Rest = (props) => {
) )
} }
function mapStateToProps (state) { function mapStateToProps(state) {
const { auth, global, MemberSearch, webSocket } = state; const { auth, global, MemberSearch, webSocket } = state;
return { return {
// loading: members.isRequesting, // loading: members.isRequesting,

2
web/client/src/sections/humanAffairs/containers/pmLog.jsx

@ -224,7 +224,7 @@ const PMLog = (props) => {
<> <>
<div style={{ padding: '0px 12px' }}> <div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}> <div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>人事管理</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>绩效考核</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>基本动作</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>基本动作</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div> <div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>

42
web/client/src/sections/humanAffairs/containers/probationerKPI.jsx

@ -0,0 +1,42 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import Empty from '../components/empty';
import '../style.less'
const ProbationerKPI = (props) => {
const { dispatch, actions } = props
return (
<>
<div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>绩效考核</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>员工考核</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: '#033C9A', fontSize: 14 }}>试用期员工考核</div>
</div>
<div style={{ background: '#FFFFFF', boxShadow: '0px 0px 12px 2px rgba(220,222,224,0.2)', borderRadius: 2, padding: '20px 0px 20px 19px ', marginTop: 12 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'baseline' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #0F7EFB', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#033C9A', marginLeft: 8 }}>试用期员工考核</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>EMPLOYEE EVALUATION DURING PROBATION PERIOD</div>
</div>
</div>
<Empty />
</div>
</div>
</>
)
}
function mapStateToProps(state) {
const { auth, global } = state;
return {
user: auth.user,
actions: global.actions,
};
}
export default connect(mapStateToProps)(ProbationerKPI);

42
web/client/src/sections/humanAffairs/containers/quarter.jsx

@ -0,0 +1,42 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import Empty from '../components/empty';
import '../style.less'
const Quarter = (props) => {
const { dispatch, actions } = props
return (
<>
<div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>绩效考核</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>中层考核</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: '#033C9A', fontSize: 14 }}>季度考核</div>
</div>
<div style={{ background: '#FFFFFF', boxShadow: '0px 0px 12px 2px rgba(220,222,224,0.2)', borderRadius: 2, padding: '20px 0px 20px 19px ', marginTop: 12 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'baseline' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #0F7EFB', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#033C9A', marginLeft: 8 }}>季度考核</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>QUARTERLY ASSESSMENT</div>
</div>
</div>
<Empty />
</div>
</div>
</>
)
}
function mapStateToProps(state) {
const { auth, global } = state;
return {
user: auth.user,
actions: global.actions,
};
}
export default connect(mapStateToProps)(Quarter);

42
web/client/src/sections/humanAffairs/containers/regularKPI.jsx

@ -0,0 +1,42 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import Empty from '../components/empty';
import '../style.less'
const RegularKPI = (props) => {
const { dispatch, actions } = props
return (
<>
<div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>绩效考核</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>员工考核</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: '#033C9A', fontSize: 14 }}>正式员工考核</div>
</div>
<div style={{ background: '#FFFFFF', boxShadow: '0px 0px 12px 2px rgba(220,222,224,0.2)', borderRadius: 2, padding: '20px 0px 20px 19px ', marginTop: 12 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'baseline' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #0F7EFB', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#033C9A', marginLeft: 8 }}>正式员工考核</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>FORMAL EMPLOYEE ASSESSMENT</div>
</div>
</div>
<Empty />
</div>
</div>
</>
)
}
function mapStateToProps(state) {
const { auth, global } = state;
return {
user: auth.user,
actions: global.actions,
};
}
export default connect(mapStateToProps)(RegularKPI);

42
web/client/src/sections/humanAffairs/containers/resourceRepository.jsx

@ -0,0 +1,42 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import Empty from '../components/empty';
import '../style.less'
const ResourceRepository = (props) => {
const { dispatch, actions } = props
return (
<>
<div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>培训</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>培训档案</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: '#033C9A', fontSize: 14 }}>培训资源储存库</div>
</div>
<div style={{ background: '#FFFFFF', boxShadow: '0px 0px 12px 2px rgba(220,222,224,0.2)', borderRadius: 2, padding: '20px 0px 20px 19px ', marginTop: 12 }}>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'baseline' }}>
<div style={{ width: 0, height: 20, borderLeft: '3px solid #0F7EFB', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></div>
<div style={{ fontFamily: "YouSheBiaoTiHei", fontSize: 24, color: '#033C9A', marginLeft: 8 }}>培训资源储存库</div>
<div style={{ marginLeft: 6, fontSize: 12, color: '#969799', fontFamily: "DINExp", }}>RESOURCE REPOSITORY</div>
</div>
</div>
<Empty />
</div>
</div>
</>
)
}
function mapStateToProps(state) {
const { auth, global } = state;
return {
user: auth.user,
actions: global.actions,
};
}
export default connect(mapStateToProps)(ResourceRepository);

2
web/client/src/sections/humanAffairs/containers/saleLog.jsx

@ -224,7 +224,7 @@ const SaleLog = (props) => {
<> <>
<div style={{ padding: '0px 12px' }}> <div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}> <div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>人事管理</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>绩效考核</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>基本动作</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>基本动作</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div> <div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>

2
web/client/src/sections/humanAffairs/containers/weeklyManagement.jsx

@ -249,7 +249,7 @@ const WeeklyManagement = (props) => {
<> <>
<div style={{ padding: '0px 12px' }}> <div style={{ padding: '0px 12px' }}>
<div style={{ display: 'flex' }}> <div style={{ display: 'flex' }}>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>人事管理</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>绩效考核</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14, margin: '0px 8px' }}>/</div>
<div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>基本动作</div> <div style={{ color: 'rgba(0,0,0,0.45)', fontSize: 14 }}>基本动作</div>
<div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div> <div style={{ color: '#033C9A', fontSize: 14, margin: '0px 8px' }}>/</div>

114
web/client/src/sections/humanAffairs/nav-item.jsx

@ -8,47 +8,111 @@ export function getNavItem(user, dispatch) {
itemKey: 'humanAffairs', itemKey: 'humanAffairs',
text: '人事管理', text: '人事管理',
icon: <IconCode />, icon: <IconCode />,
items: [ items: [{
{ itemKey: 'personnelArchives',
itemKey: 'archivesCenter', text: '人员档案',
text: '档案中心',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbrengongdangan"></iconpark-icon>, icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbrengongdangan"></iconpark-icon>,
to: '/humanAffairs/archivesCenter/personnelFiles', to: '/humanAffairs/archivesCenter/personnelArchives/personnelFiles',
items: [{
itemKey: 'personnelFiles', to: '/humanAffairs/archivesCenter/personnelArchives/personnelFiles', text: '人员档案'
}, {
itemKey: 'employeeInformation', to: '/humanAffairs/archivesCenter/personnelArchives/employeeInformation', text: '员工信息'
}]
}, {
itemKey: 'deptArchives',
text: '部门档案',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbbumen"></iconpark-icon>,
to: '/humanAffairs/archivesCenter/deptArchives/department',
items: [{
itemKey: 'department', to: '/humanAffairs/archivesCenter/deptArchives/department', text: '部门档案'
}]
}, {
itemKey: 'leaveManagement',
text: '假勤管理',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbjiaqinguanli"></iconpark-icon>,
to: '/humanAffairs/employeeRelationship/leaveManagement/attendanceStatistics',
items: [{
itemKey: 'attendanceStatistics', to: '/humanAffairs/employeeRelationship/leaveManagement/attendanceStatistics', text: '出勤统计'
}, {
itemKey: 'leaveStatistics', to: '/humanAffairs/employeeRelationship/leaveManagement/leaveStatistics', text: '请假统计'
}, {
itemKey: 'overtimeStatistics', to: '/humanAffairs/employeeRelationship/leaveManagement/overtimeStatistics', text: '加班统计'
}]
}, {
itemKey: 'recruitRecord',
text: '招聘记录',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbzhaopin"></iconpark-icon>,
to: '/humanAffairs/recruit/recruitRecord/appointmentRecords',
items: [{ items: [{
itemKey: 'personnelFiles', to: '/humanAffairs/archivesCenter/personnelFiles', text: '人员档案' itemKey: 'appointmentRecords', to: '/humanAffairs/recruit/recruitRecord/appointmentRecords', text: '任用记录'
}] }]
}, { }, {
itemKey: 'employeeRelations', itemKey: 'trainFiles',
text: '员工关系', text: '培训档案',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbyuangongguanxi"></iconpark-icon>, icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbpeixundangan"></iconpark-icon>,
to: '/humanAffairs/employeeRelations/employeeInformation', to: '/humanAffairs/train/trainFiles/resourceRepository',
items: [{ items: [{
itemKey: 'employeeInformation', to: '/humanAffairs/employeeRelations/employeeInformation', text: '员工信息' itemKey: 'resourceRepository', to: '/humanAffairs/train/trainFiles/resourceRepository', text: '培训资源储存库'
}] }]
}, { }, {
itemKey: 'basicAction', itemKey: 'basicAction',
text: '基本动作', text: '基本动作',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbjiben"></iconpark-icon>, icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbjiben"></iconpark-icon>,
to: '/humanAffairs/basicAction/weeklyManagement', to: '/humanAffairs/achievements/basicAction/weeklyManagement',
items: [{ items: [{
itemKey: 'weeklyManagement', to: '/humanAffairs/basicAction/weeklyManagement', text: '周报管理' itemKey: 'weeklyManagement', to: '/humanAffairs/achievements/basicAction/weeklyManagement', text: '周报管理'
},{ }, {
itemKey: 'saleLog', to: '/humanAffairs/basicAction/saleLog', text: '销售日志' itemKey: 'saleLog', to: '/humanAffairs/achievements/basicAction/saleLog', text: '销售日志'
},{ }, {
itemKey: 'pmLog', to: '/humanAffairs/basicAction/pmLog', text: '工程日志' itemKey: 'pmLog', to: '/humanAffairs/achievements/basicAction/pmLog', text: '工程日志'
}] }]
}, { }, {
itemKey: 'leaveManagement', itemKey: 'employeeKPI',
text: '假勤管理', text: '员工考核',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbjiaqinguanli"></iconpark-icon>, icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbyuangongkaohe"></iconpark-icon>,
to: '/humanAffairs/leaveManagement/leaveStatistics', to: '/humanAffairs/achievements/employeeKPI/probationer',
items: [{ items: [{
itemKey: 'leaveStatistics', to: '/humanAffairs/leaveManagement/leaveStatistics', text: '请假统计' itemKey: 'probationer', to: '/humanAffairs/achievements/employeeKPI/probationer', text: '试用期员工考核'
}, { }, {
itemKey: 'overtimeStatistics', to: '/humanAffairs/leaveManagement/overtimeStatistics', text: '加班统计' itemKey: 'regular', to: '/humanAffairs/achievements/employeeKPI/regular', text: '正式员工考核'
}]
}, {
itemKey: 'middleKPI',
text: '中层考核',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbzhongceng"></iconpark-icon>,
to: '/humanAffairs/achievements/middleKPI/monthlyProcess',
items: [{
itemKey: 'monthlyProcess', to: '/humanAffairs/achievements/middleKPI/monthlyProcess', text: '月度过程考核'
}, {
itemKey: 'quarter', to: '/humanAffairs/achievements/middleKPI/quarter', text: '季度考核'
}]
}, {
itemKey: 'highKPI',
text: '高管考核',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbgaojiguanli"></iconpark-icon>,
to: '/humanAffairs/achievements/highKPI/highMonthly',
items: [{
itemKey: 'highMonthly', to: '/humanAffairs/achievements/highKPI/highMonthly', text: '月度过程考核'
}]
}, {
itemKey: 'penalties',
text: '奖惩信息',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbjiangcheng"></iconpark-icon>,
to: '/humanAffairs/achievements/penalties/penaltiesRecord',
items: [{
itemKey: 'penaltiesRecord', to: '/humanAffairs/achievements/penalties/penaltiesRecord', text: '奖惩信息'
}]
}, {
itemKey: 'authCenter',
text: '权限中心',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbquanxian"></iconpark-icon>,
to: '/humanAffairs/authCenter/employeeAuth',
items: [{
itemKey: 'employeeAuth', to: '/humanAffairs/authCenter/employeeAuth', text: '员工权限'
}, {
itemKey: 'formMaintenance', to: '/humanAffairs/authCenter/formMaintenance', text: '表单维护'
}]
}] }]
},
]
}, },
] ]
); );

172
web/client/src/sections/humanAffairs/routes.js

@ -1,7 +1,14 @@
import { import {
PersonnelFiles, PersonnelFilesDetail, EmployeeInformation, PersonnelFiles, EmployeeInformation, //人员档案
DeptArchives, //部门档案
AttendanceStatistics, LeaveStatistics, OvertimeStatistics,
AppointmentRecords,
ResourceRepository,
WeeklyManagement, SaleLog, PMLog, WeeklyManagement, SaleLog, PMLog,
LeaveStatistics, OvertimeStatistics ProbationerKPI, RegularKPI,
MonthlyProcess, Quarter, HighMonthly, PenaltiesRecord,
EmployeeAuth, FormMaintenance,
PersonnelFilesDetail,
} from './containers'; } from './containers';
export default [{ export default [{
@ -11,17 +18,99 @@ export default [{
key: 'humanAffairs', key: 'humanAffairs',
breadcrumb: '人事管理', breadcrumb: '人事管理',
// 不设置 component 则面包屑禁止跳转 // 不设置 component 则面包屑禁止跳转
childRoutes: [{ childRoutes: [
{
path: '/archivesCenter', path: '/archivesCenter',
key: 'archivesCenter', key: 'archivesCenter',
breadcrumb: '档案中心', breadcrumb: '档案中心',
childRoutes: [{
path: '/personnelArchives',
key: 'personnelArchives',
component: PersonnelFiles,
breadcrumb: '人员档案',
childRoutes: [{ childRoutes: [{
path: '/personnelFiles', path: '/personnelFiles',
key: 'personnelFiles', key: 'personnelFiles',
component: PersonnelFiles, component: PersonnelFiles,
breadcrumb: '人员档案', breadcrumb: '人员档案',
}, {
path: '/employeeInformation',
key: 'employeeInformation',
component: EmployeeInformation,
breadcrumb: '员工信息',
}]
}, {
path: '/deptArchives',
key: 'deptArchives',
breadcrumb: '部门档案',
childRoutes: [{
path: '/department',
key: 'department',
component: DeptArchives,
breadcrumb: '部门档案',
}]
}]
}, {
path: '/employeeRelationship',
key: 'employeeRelationship',
breadcrumb: '员工关系',
childRoutes: [{
path: '/leaveManagement',
key: 'leaveManagement',
breadcrumb: '假勤管理',
childRoutes: [{
path: '/attendanceStatistics',
key: 'attendanceStatistics',
component: AttendanceStatistics,
breadcrumb: '出勤统计',
}, {
path: '/leaveStatistics',
key: 'leaveStatistics',
component: LeaveStatistics,
breadcrumb: '请假统计',
}, {
path: '/overtimeStatistics',
key: 'overtimeStatistics',
component: OvertimeStatistics,
breadcrumb: '加班统计',
}]
}]
}, {
path: '/recruit',
key: 'recruit',
breadcrumb: '招聘',
childRoutes: [{
path: '/recruitRecord',
key: 'recruitRecord',
breadcrumb: '招聘记录',
childRoutes: [{
path: '/appointmentRecords',
key: 'appointmentRecords',
component: AppointmentRecords,
breadcrumb: '任用记录',
}]
}] }]
}, { }, {
path: '/train',
key: 'train',
breadcrumb: '培训',
childRoutes: [{
path: '/trainFiles',
key: 'trainFiles',
breadcrumb: '培训档案',
childRoutes: [{
path: '/resourceRepository',
key: 'resourceRepository',
component: ResourceRepository,
breadcrumb: '培训资源储存库',
}]
}]
},
{
path: '/achievements',
key: 'achievements',
breadcrumb: '绩效考核',
childRoutes: [{
path: '/basicAction', path: '/basicAction',
key: 'basicAction', key: 'basicAction',
breadcrumb: '基本动作', breadcrumb: '基本动作',
@ -42,29 +131,70 @@ export default [{
breadcrumb: '工程日志', breadcrumb: '工程日志',
}] }]
}, { }, {
path: '/employeeRelations', path: '/employeeKPI',
key: 'employeeRelations', key: 'employeeKPI',
breadcrumb: '员工关系', breadcrumb: '员工考核',
childRoutes: [{ childRoutes: [{
path: '/employeeInformation', path: '/probationer',
key: 'employeeInformation', key: 'probationer',
component: EmployeeInformation, component: ProbationerKPI,
breadcrumb: '员工信息', breadcrumb: '试用期员工考核',
}, {
path: '/regular',
key: 'regular',
component: RegularKPI,
breadcrumb: '正式员工考核',
}] }]
}, { }, {
path: '/leaveManagement', path: '/middleKPI',
key: 'leaveManagement', key: 'middleKPI',
breadcrumb: '假勤管理', breadcrumb: '中层考核',
childRoutes: [{ childRoutes: [{
path: '/leaveStatistics', path: '/monthlyProcess',
key: 'leaveStatistics', key: 'monthlyProcess',
component: LeaveStatistics, component: MonthlyProcess,
breadcrumb: '请假统计', breadcrumb: '月度过程考核',
}, { }, {
path: '/overtimeStatistics', path: '/quarter',
key: 'overtimeStatistics', key: 'quarter',
component: OvertimeStatistics, component: Quarter,
breadcrumb: '加班统计', breadcrumb: '季度考核',
}]
}, {
path: '/highKPI',
key: 'highKPI',
breadcrumb: '高管考核',
childRoutes: [{
path: '/highMonthly',
key: 'highMonthly',
component: HighMonthly,
breadcrumb: '月度过程考核',
}]
}, {
path: '/penalties',
key: 'penalties',
breadcrumb: '奖惩信息',
childRoutes: [{
path: '/penaltiesRecord',
key: 'penaltiesRecord',
component: PenaltiesRecord,
breadcrumb: '奖惩信息',
}]
}]
}, {
path: '/authCenter',
key: 'authCenter',
breadcrumb: '权限中心',
childRoutes: [{
path: '/employeeAuth',
key: 'employeeAuth',
breadcrumb: '员工权限',
component: EmployeeAuth
}, {
path: '/formMaintenance',
key: 'formMaintenance',
component: FormMaintenance,
breadcrumb: '表单维护',
}] }]
}] }]
} }

Loading…
Cancel
Save