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

2
web/client/index.html

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

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

@ -22,18 +22,13 @@ const Sider = (props) => {
dispatch(push(homePath))
}
}, [leftItems])
let routeSelectedKey = [useLocation().pathname.split('/')[1]]//
let routeSelectedKeys = [useLocation().pathname.split('/')[2]]//
let routeSelectedKeyss = [useLocation().pathname.split('/')[3]]//
let routeSelectedKey = useLocation().pathname.split('/');
// let routeSelectedKey = [useLocation().pathname.split('/')[1]]//
// let routeSelectedKeys = [useLocation().pathname.split('/')[2]]//
// let routeSelectedKeyss = [useLocation().pathname.split('/')[3]]//
useEffect(() => {
if (routeSelectedKeyss[0]) {
setSelectedKeys(routeSelectedKeyss)
}
else if (routeSelectedKeys[0]) {
setSelectedKeys(routeSelectedKeys)
}
else {
setSelectedKeys(routeSelectedKey)
if (routeSelectedKey.length) {
setSelectedKeys([routeSelectedKey[routeSelectedKey.length - 1]])
}
const lastOpenKeys = localStorage.getItem('poms_open_sider')
if (lastOpenKeys) {
@ -51,8 +46,8 @@ const Sider = (props) => {
<Nav
style={{ background: '#101531', padding: 0 }}
selectedKeys={selectedKeys}
bodyStyle={{height:clientHeight-64}}
mode = "vertical"
bodyStyle={{ height: clientHeight - 64 }}
mode="vertical"
footer={{
collapseButton: true,
}}
@ -76,7 +71,7 @@ const Sider = (props) => {
)
}
function mapStateToProps (state) {
function mapStateToProps(state) {
const { global } = state;
return {
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)
));
}
function deepCopy (data) {//
function deepCopy(data) {//
//string,number,bool,null,undefined,symbol
//object,array,date
if (data && typeof data === "object") {
@ -81,7 +81,7 @@ const LayoutContainer = props => {
}
}
const [allItems, setAllItems] = useState([])
const [headerItems, setHeaderItems] = useState([])
// const [headerItems, setHeaderItems] = useState([])
const [leftItems, setLeftItems] = useState([])
const [leftChange, setLeftChange] = useState(true)
const [leftShow, setLeftShow] = useState(false)
@ -102,10 +102,10 @@ const LayoutContainer = props => {
itm.items[i].fatherKey = itm.itemKey
delete itm.items[i].items
}
topItems.push(itm)
}
else {
topItems.push.apply(topItems, item)
// topItems.push(itm)
// }
// else {
// topItems.push.apply(topItems, item)
}
}
}
@ -113,16 +113,16 @@ const LayoutContainer = props => {
}
}
setAllItems(nextItems)
setHeaderItems(topItems)
// setHeaderItems(topItems)
if (lastSelectedKeys) {//
for (let i = 0; i < nextItems.length; i++) {
if (JSON.parse(lastSelectedKeys)[0] == nextItems[i].itemKey) {
let openArr = []
for (let j = 0; j < nextItems[i].items.length; j++) {
openArr.push(nextItems[i].items[j].itemKey)
}
localStorage.setItem('poms_open_sider', JSON.stringify(openArr))
// let openArr = []
// for (let j = 0; j < nextItems[i].items.length; j++) {
// openArr.push(nextItems[i].items[j].itemKey)
// }
// localStorage.setItem('poms_open_sider', JSON.stringify(openArr))
setLeftItems(nextItems[i].items)
}
}
@ -151,7 +151,7 @@ const LayoutContainer = props => {
openArr.push(allItems[i].items[o].itemKey)
}
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)
setLeftShow(true)
}
@ -229,7 +229,7 @@ const LayoutContainer = props => {
<>
<Layout.Header>
<Header
headerItems={headerItems}
// headerItems={headerItems} //
user={user}
pathname={location.pathname}
toggleCollapsed={() => {
@ -238,25 +238,29 @@ const LayoutContainer = props => {
collapsed={collapsed}
history={history}
tochange={(val) => {
setLeftChange(!leftChange)
// setLeftChange(!leftChange) //
if (val.fatherKey) {
for (let i = 0; i < allItems.length; i++) {
if (val.fatherKey == allItems[i].itemKey) {
let openArr = []
for (let j = 0; j < allItems[i].items.length; j++) {
openArr.push(allItems[i].items[j].itemKey)
}
localStorage.setItem('poms_selected_sider', JSON.stringify([val.fatherKey]))
localStorage.setItem('poms_open_sider', JSON.stringify(openArr))
setLeftItems(allItems[i].items)
}
}
setLeftShow(true)
localStorage.setItem('poms_selected_sider', JSON.stringify([val.itemKey]));
const historyOpenKeys = localStorage.getItem('poms_open_sider');
const openKeys = historyOpenKeys && JSON.parse(historyOpenKeys).concat(val.openKey || val.itemKey) || [val.openKey || val.itemKey]
localStorage.setItem('poms_open_sider', JSON.stringify(openKeys));
// for (let i = 0; i < allItems.length; i++) {
// if (val.fatherKey == allItems[i].itemKey) {
// let openArr = []
// for (let j = 0; j < allItems[i].items.length; j++) {
// openArr.push(allItems[i].items[j].itemKey)
// }
// localStorage.setItem('poms_selected_sider', JSON.stringify([val.fatherKey]))
// localStorage.setItem('poms_open_sider', JSON.stringify(openArr))
// setLeftItems(allItems[i].items)
// }
// }
// setLeftShow(true)
}
else {
localStorage.setItem('poms_open_sider', JSON.stringify([]))
localStorage.removeItem('poms_selected_sider')
setLeftShow(false)
// setLeftShow(false)
}
history.push(val.to);
}}
@ -303,7 +307,7 @@ const LayoutContainer = props => {
)
}
function mapStateToProps (state) {
function mapStateToProps(state) {
const { global, auth, ajaxResponse, webSocket } = state;
return {
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';
export const INIT_AUTH = 'INIT_AUTH';
export function initAuth (userData) {
export function initAuth(userData) {
const sessionUser = JSON.parse(sessionStorage.getItem('hrUser'))
const user = userData || sessionUser || {};
if (user.authorized && !sessionUser) {
@ -21,7 +21,7 @@ export function initAuth (userData) {
export const REQUEST_LOGIN = 'REQUEST_LOGIN';
export const LOGIN_SUCCESS = 'LOGIN_SUCCESS';
export const LOGIN_ERROR = 'LOGIN_ERROR';
export function login (username, password) {
export function login(username, password) {
return dispatch => {
dispatch({ type: REQUEST_LOGIN });
@ -63,7 +63,7 @@ export function login (username, password) {
}
export const LOGOUT = 'LOGOUT';
export function logout () {
export function logout() {
const user = JSON.parse(sessionStorage.getItem('hrUser'))
user && user.token ?
Request.put(ApiTable.logout, {
@ -71,6 +71,9 @@ export function logout () {
code: 'POMS'
}) : null;
sessionStorage.removeItem('hrUser');
localStorage.removeItem('poms_selected_sider');
localStorage.removeItem('poms_open_sider');
return {
type: LOGOUT
};

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

@ -20,7 +20,7 @@ const Login = props => {
useEffect(() => {
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_selected_sider', JSON.stringify(["humanAffairs"]))
}
@ -67,7 +67,7 @@ const Login = props => {
dispatch(login(values.username, values.password)).then(res => {
const data = res.payload.user
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}
@ -103,7 +103,7 @@ const Login = props => {
);
}
function mapStateToProps (state) {
function mapStateToProps(state) {
const { auth, global } = state;
return {
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])
function getMemberSearchList () {//
function getMemberSearchList() {//
let obj = lookup
if (lookup.entryTime?.length > 1) {
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) => {//
if (res.success) {
setNativeList(res.payload?.data)
}
})
}
function getMemberWorkPlaceList () {
function getMemberWorkPlaceList() {
dispatch(humanAffairs.getMemberWorkPlace()).then((res) => {//
if (res.success) {
setWorkPlaceList(res.payload?.data)
@ -137,7 +137,7 @@ const employeeInformation = (props) => {
},
];
//
function attribute () {
function attribute() {
const arr = localStorage.getItem(EMPLOYEEINFORMATION)
? JSON.parse(localStorage.getItem(EMPLOYEEINFORMATION))
: [];
@ -435,7 +435,7 @@ const employeeInformation = (props) => {
}
setSetupp(columns);
}
function handleRow (record, index) {//
function handleRow(record, index) {//
//
if (index % 2 === 0) {
return {
@ -452,9 +452,9 @@ const employeeInformation = (props) => {
<>
<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 }}>档案中心</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 }}>员工信息</div>
</div>
@ -681,7 +681,7 @@ const employeeInformation = (props) => {
)
}
function mapStateToProps (state) {
function mapStateToProps(state) {
const { auth, global, MemberSearch, webSocket } = state;
return {
// 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';
//档案中心
import PersonnelFiles from './personnelFiles';
import PersonnelFilesDetail from './personnelFilesDetail';
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 SaleLog from './saleLog';
import PMLog from './pmLog';
import LeaveStatistics from './leaveStatistics';
import OvertimeStatistics from './overtimeStatistics';
import ProbationerKPI from './probationerKPI';
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 {
PersonnelFiles, PersonnelFilesDetail, EmployeeInformation,
PersonnelFiles, EmployeeInformation, DeptArchives,
AttendanceStatistics, LeaveStatistics, OvertimeStatistics,
AppointmentRecords,
ResourceRepository,
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])
function getAttendanceVacateList () {//
function getAttendanceVacateList() {//
let obj = lookup
if (lookup.entryTime?.length > 1) {
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) => {//
if (res.success) {
let myTableList = tableList
@ -98,7 +98,7 @@ const leaveStatistics = (props) => {
},
];
//
function attribute (typeList) {
function attribute(typeList) {
const arr = localStorage.getItem(LEAVESTATISTICS)
? JSON.parse(localStorage.getItem(LEAVESTATISTICS))
: [];
@ -242,7 +242,7 @@ const leaveStatistics = (props) => {
}
setSetupp(columns);
}
function handleRow (record, index) {//
function handleRow(record, index) {//
//
if (index % 2 === 0) {
return {
@ -259,7 +259,7 @@ const leaveStatistics = (props) => {
<>
<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 }}>员工关系</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>
@ -435,7 +435,7 @@ const leaveStatistics = (props) => {
)
}
function mapStateToProps (state) {
function mapStateToProps(state) {
const { auth, global, MemberSearch, webSocket } = state;
return {
// 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])
function getAttendanceOvertimeList () {//
function getAttendanceOvertimeList() {//
let obj = lookup
if (lookup.entryTime?.length > 1) {
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)
? JSON.parse(localStorage.getItem(OVERTIMESTATISTICS))
: [];
@ -337,7 +337,7 @@ const overtimeStatistics = (props) => {
}
setSetupp(columns);
}
function handleRow (record, index) {//
function handleRow(record, index) {//
//
if (index % 2 === 0) {
return {
@ -354,7 +354,7 @@ const overtimeStatistics = (props) => {
<>
<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 }}>员工关系</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>
@ -516,7 +516,7 @@ const overtimeStatistics = (props) => {
)
}
function mapStateToProps (state) {
function mapStateToProps(state) {
const { auth, global, MemberSearch, webSocket } = state;
return {
// 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 '../style.less'
import moment from 'moment'
import { set } from 'nprogress';
const Rest = (props) => {
const { dispatch, actions, history, user, loading, socket, xqMembers } = props
@ -32,7 +31,7 @@ const Rest = (props) => {
getMemberSearchList()
}, [typeChoose])
function getMemberSearchList () {//
function getMemberSearchList() {//
dispatch(humanAffairs.getMemberSearch())
dispatch(humanAffairs.getMemberList({ keywordTarget, keyword, state: typeChoose })).then((res) => {//
if (res.success) {
@ -41,19 +40,19 @@ const Rest = (props) => {
})
}
function typeOnChange (e) {//
function typeOnChange(e) {//
setTypeChoose(e.target.value);
}
function seachValueChange (value) {
function seachValueChange(value) {
setKeyword(value)
}
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: '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>
@ -312,7 +311,7 @@ const Rest = (props) => {
)
}
function mapStateToProps (state) {
function mapStateToProps(state) {
const { auth, global, MemberSearch, webSocket } = state;
return {
// 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={{ 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 }}>基本动作</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={{ 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 }}>基本动作</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={{ 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 }}>基本动作</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',
text: '人事管理',
icon: <IconCode />,
items: [
{
itemKey: 'archivesCenter',
text: '档案中心',
items: [{
itemKey: 'personnelArchives',
text: '人员档案',
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: [{
itemKey: 'personnelFiles', to: '/humanAffairs/archivesCenter/personnelFiles', text: '人员档案'
itemKey: 'appointmentRecords', to: '/humanAffairs/recruit/recruitRecord/appointmentRecords', text: '任用记录'
}]
}, {
itemKey: 'employeeRelations',
text: '员工关系',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbyuangongguanxi"></iconpark-icon>,
to: '/humanAffairs/employeeRelations/employeeInformation',
itemKey: 'trainFiles',
text: '培训档案',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbpeixundangan"></iconpark-icon>,
to: '/humanAffairs/train/trainFiles/resourceRepository',
items: [{
itemKey: 'employeeInformation', to: '/humanAffairs/employeeRelations/employeeInformation', text: '员工信息'
itemKey: 'resourceRepository', to: '/humanAffairs/train/trainFiles/resourceRepository', text: '培训资源储存库'
}]
}, {
itemKey: 'basicAction',
text: '基本动作',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbjiben"></iconpark-icon>,
to: '/humanAffairs/basicAction/weeklyManagement',
to: '/humanAffairs/achievements/basicAction/weeklyManagement',
items: [{
itemKey: 'weeklyManagement', to: '/humanAffairs/basicAction/weeklyManagement', text: '周报管理'
},{
itemKey: 'saleLog', to: '/humanAffairs/basicAction/saleLog', text: '销售日志'
},{
itemKey: 'pmLog', to: '/humanAffairs/basicAction/pmLog', text: '工程日志'
itemKey: 'weeklyManagement', to: '/humanAffairs/achievements/basicAction/weeklyManagement', text: '周报管理'
}, {
itemKey: 'saleLog', to: '/humanAffairs/achievements/basicAction/saleLog', text: '销售日志'
}, {
itemKey: 'pmLog', to: '/humanAffairs/achievements/basicAction/pmLog', text: '工程日志'
}]
}, {
itemKey: 'leaveManagement',
text: '假勤管理',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbjiaqinguanli"></iconpark-icon>,
to: '/humanAffairs/leaveManagement/leaveStatistics',
itemKey: 'employeeKPI',
text: '员工考核',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconcbyuangongkaohe"></iconpark-icon>,
to: '/humanAffairs/achievements/employeeKPI/probationer',
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 {
PersonnelFiles, PersonnelFilesDetail, EmployeeInformation,
PersonnelFiles, EmployeeInformation, //人员档案
DeptArchives, //部门档案
AttendanceStatistics, LeaveStatistics, OvertimeStatistics,
AppointmentRecords,
ResourceRepository,
WeeklyManagement, SaleLog, PMLog,
LeaveStatistics, OvertimeStatistics
ProbationerKPI, RegularKPI,
MonthlyProcess, Quarter, HighMonthly, PenaltiesRecord,
EmployeeAuth, FormMaintenance,
PersonnelFilesDetail,
} from './containers';
export default [{
@ -11,17 +18,99 @@ export default [{
key: 'humanAffairs',
breadcrumb: '人事管理',
// 不设置 component 则面包屑禁止跳转
childRoutes: [{
childRoutes: [
{
path: '/archivesCenter',
key: 'archivesCenter',
breadcrumb: '档案中心',
childRoutes: [{
path: '/personnelArchives',
key: 'personnelArchives',
component: PersonnelFiles,
breadcrumb: '人员档案',
childRoutes: [{
path: '/personnelFiles',
key: 'personnelFiles',
component: PersonnelFiles,
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',
key: 'basicAction',
breadcrumb: '基本动作',
@ -42,29 +131,70 @@ export default [{
breadcrumb: '工程日志',
}]
}, {
path: '/employeeRelations',
key: 'employeeRelations',
breadcrumb: '员工关系',
path: '/employeeKPI',
key: 'employeeKPI',
breadcrumb: '员工考核',
childRoutes: [{
path: '/employeeInformation',
key: 'employeeInformation',
component: EmployeeInformation,
breadcrumb: '员工信息',
path: '/probationer',
key: 'probationer',
component: ProbationerKPI,
breadcrumb: '试用期员工考核',
}, {
path: '/regular',
key: 'regular',
component: RegularKPI,
breadcrumb: '正式员工考核',
}]
}, {
path: '/leaveManagement',
key: 'leaveManagement',
breadcrumb: '假勤管理',
path: '/middleKPI',
key: 'middleKPI',
breadcrumb: '中层考核',
childRoutes: [{
path: '/leaveStatistics',
key: 'leaveStatistics',
component: LeaveStatistics,
breadcrumb: '请假统计',
path: '/monthlyProcess',
key: 'monthlyProcess',
component: MonthlyProcess,
breadcrumb: '月度过程考核',
}, {
path: '/overtimeStatistics',
key: 'overtimeStatistics',
component: OvertimeStatistics,
breadcrumb: '加班统计',
path: '/quarter',
key: 'quarter',
component: Quarter,
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