Browse Source

员工档案

master
deartibers 2 years ago
parent
commit
4779313609
  1. BIN
      web/client/assets/images/background/loginBackgroundimg.png
  2. BIN
      web/client/assets/images/background/loginText.png
  3. BIN
      web/client/assets/images/hrImg/back.png
  4. BIN
      web/client/assets/images/hrImg/department.png
  5. BIN
      web/client/assets/images/hrImg/detailBgc.png
  6. BIN
      web/client/assets/images/hrImg/export.png
  7. BIN
      web/client/assets/images/hrImg/information.png
  8. BIN
      web/client/assets/images/hrImg/man.png
  9. BIN
      web/client/assets/images/hrImg/mc.png
  10. BIN
      web/client/assets/images/hrImg/name.png
  11. BIN
      web/client/assets/images/hrImg/number.png
  12. BIN
      web/client/assets/images/hrImg/position.png
  13. BIN
      web/client/assets/images/hrImg/post.png
  14. BIN
      web/client/assets/images/hrImg/resume.png
  15. BIN
      web/client/assets/images/hrImg/woman.png
  16. BIN
      web/client/assets/images/hrImg/year.png
  17. 6
      web/client/src/app.jsx
  18. 2
      web/client/src/layout/actions/webSocket.js
  19. 79
      web/client/src/layout/components/header/index.jsx
  20. 209
      web/client/src/sections/auth/containers/login.jsx
  21. 3
      web/client/src/sections/auth/style.less
  22. 6
      web/client/src/sections/humanAffairs/actions/index.js
  23. 15
      web/client/src/sections/humanAffairs/actions/personnelFiles.js
  24. 273
      web/client/src/sections/humanAffairs/components/personnelModal.jsx
  25. 6
      web/client/src/sections/humanAffairs/containers/index.js
  26. 266
      web/client/src/sections/humanAffairs/containers/personnelFiles.jsx
  27. 752
      web/client/src/sections/humanAffairs/containers/personnelFilesDetail.jsx
  28. 15
      web/client/src/sections/humanAffairs/index.js
  29. 25
      web/client/src/sections/humanAffairs/nav-item.jsx
  30. 5
      web/client/src/sections/humanAffairs/reducers/index.js
  31. 30
      web/client/src/sections/humanAffairs/routes.js
  32. 0
      web/client/src/sections/humanAffairs/style.less
  33. 36
      web/client/src/utils/webapi.js

BIN
web/client/assets/images/background/loginBackgroundimg.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 690 KiB

BIN
web/client/assets/images/background/loginText.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
web/client/assets/images/hrImg/back.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

BIN
web/client/assets/images/hrImg/department.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 B

BIN
web/client/assets/images/hrImg/detailBgc.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
web/client/assets/images/hrImg/export.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
web/client/assets/images/hrImg/information.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 597 B

BIN
web/client/assets/images/hrImg/man.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
web/client/assets/images/hrImg/mc.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
web/client/assets/images/hrImg/name.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 663 B

BIN
web/client/assets/images/hrImg/number.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 453 B

BIN
web/client/assets/images/hrImg/position.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 B

BIN
web/client/assets/images/hrImg/post.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 778 B

BIN
web/client/assets/images/hrImg/resume.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
web/client/assets/images/hrImg/woman.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
web/client/assets/images/hrImg/year.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 596 B

6
web/client/src/app.jsx

@ -5,6 +5,7 @@ import Layout from './layout';
import Auth from './sections/auth';
import Example from './sections/example';
import NoMatch from './sections/noMatch';
import HumanAffairs from './sections/humanAffairs';
const App = props => {
const { projectName } = props
@ -29,8 +30,9 @@ const App = props => {
return (
<Layout
title={projectName}
sections={[
Example,Auth, NoMatch,
sections={[//Example
Auth, NoMatch,
HumanAffairs,
]}
/>
)

2
web/client/src/layout/actions/webSocket.js

@ -12,7 +12,6 @@ export function initWebSocket ({ ioUrl, token, pomsUserId }) {
if (user) {
user = JSON.parse(user)
token = user.token
pomsUserId = user.pomsUserInfo.id
}
}
if (!ioUrl || !token || !pomsUserId) {
@ -28,7 +27,6 @@ export function initWebSocket ({ ioUrl, token, pomsUserId }) {
, {
query: {
token: token,
pomsUserId: pomsUserId
},
});
dispatch({

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

@ -31,22 +31,30 @@ const Header = (props) => {
}}
header={{
logo: (
<img
src="/assets/images/install/long_logo.png"
style={{ display: "inline-block", width: 200, height: 40, marginLeft: -24 }}
/>
<div style={{ display: 'flex' }}>
<div style={{ marginLeft: 16, width: 24, height: 24 }}>
<img src="/assets/images/background/username.png" alt="" style={{ width: 24, marginRight: -10 }} />
</div>
<div style={{ fontFamily: 'YouSheBiaoTiHei', fontSize: 18, marginLeft: 12 }}>
项企一体化数字应用平台
</div>
</div>
// <img
// src="/assets/images/install/long_logo.png"
// style={{ display: "inline-block", width: 200, height: 40, marginLeft: -24 }}
// />
),
text: (
<>
// text: (
// <>
{/* <SplitButtonGroup style={{ marginLeft: 10 }} aria-label="项目操作按钮组"> */}
<Button theme="solid" type="primary" style={{ width: 52, height: 24, background: '#005ABD' }}>全局</Button>
{/* <Dropdown onVisibleChange={(v) => { }} menu={{}} trigger="click" position="bottomRight"> */}
<Button style={{ width: 16, height: 24, background: '#005ABD' }} theme="solid" type="primary" icon={<IconTreeTriangleDown />}></Button>
{/* </Dropdown> */}
{/* </SplitButtonGroup> */}
</>
),
// {/* <SplitButtonGroup style={{ marginLeft: 10 }} aria-label=""> */}
// <Button theme="solid" type="primary" style={{ width: 52, height: 24, background: '#005ABD' }}></Button>
// {/* <Dropdown onVisibleChange={(v) => { }} menu={{}} trigger="click" position="bottomRight"> */}
// <Button style={{ width: 16, height: 24, background: '#005ABD' }} theme="solid" type="primary" icon={<IconTreeTriangleDown />}></Button>
// {/* </Dropdown> */}
// {/* </SplitButtonGroup> */}
// </>
// ),
}}
footer={
<>
@ -75,7 +83,22 @@ const Header = (props) => {
)
}
})}
<Nav.Sub
<div style={{ display: 'flex', alignItems: 'center' }}>
<div style={{ marginLeft: 16, width: 24, height: 24 }}>
<img src="/assets/images/background/username.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ color: '#92CBFF', fontSize: 12, marginLeft: 10, cursor: "pointer" }} onClick={() => {
dispatch(actions.auth.logout(user));
if (socket) {
socket.disconnect();
}
history.push(`/signin`);
}}>
退出
</div>
</div>
{/* <Nav.Sub
itemKey={"user"}
text={
<div
@ -110,25 +133,6 @@ const Header = (props) => {
</div>
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center', height: 30, borderBottom: '1px solid #F2F3F5', cursor: "pointer" }}
onClick={() => {
history.push(`/userCenter`);
}}>
<div style={{ width: 15, height: 15, marginLeft: 20 }}>
<img src="/assets/images/console/yonghu.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ color: '#646566', fontSize: 12, marginLeft: 9 }}>
用户中心
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center', height: 30, borderBottom: '1px solid #F2F3F5', cursor: "pointer" }}>
<div style={{ width: 15, height: 15, marginLeft: 20 }}>
<img src="/assets/images/console/suo.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ color: '#646566', fontSize: 12, marginLeft: 9 }}>
安全认证
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', height: 27, color: '#646566', fontSize: 12, cursor: "pointer" }}
onClick={() => {
dispatch(actions.auth.logout(user));
@ -138,13 +142,8 @@ const Header = (props) => {
history.push(`/signin`);
}}>
退出
{/* <Nav.Item itemKey={"logout"} text={"退出"} style={{ textAlign: "center" }} /> */}
</div>
{/* collapseButton collapseText */}
</Nav.Sub>
</Nav.Sub> */}
</>
}
/>

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

@ -8,136 +8,109 @@ import { IconLock, IconUser } from '@douyinfe/semi-icons';
import '../style.less'
const Login = props => {
const { dispatch, user, error, actions, apiRoot, isRequesting } = props
const form = useRef();
const { dispatch, user, error, actions, apiRoot, isRequesting } = props
const form = useRef();
useEffect(() => {
if (error) {
Toast.error(error);
form.current.setValue('password', '')
}
}, [error])
useEffect(() => {
if (error) {
Toast.error(error);
form.current.setValue('password', '')
}
}, [error])
useEffect(() => {
if (user && user.authorized) {
dispatch(push('/console'));
localStorage.setItem('poms_open_sider', JSON.stringify([]))
localStorage.removeItem('poms_selected_sider')
}
}, [user])
useEffect(() => {
if (user && user.authorized) {
dispatch(push('/humanAffairs/archivesCenter/personnelFiles'));
localStorage.setItem('poms_open_sider', JSON.stringify(["archivesCenter"]))
localStorage.setItem('poms_selected_sider', JSON.stringify(["humanAffairs"]))
}
}, [user])
return (
<div style={{
width: '100%',
height: '100%',
// backgroundImage: "url('/assets/images/background/loginBackground.gif')",
// backgroundSize: 'cover',
// backgroundRepeat: 'no-repeat',
// position: 'relative',
}}>
<video
autoPlay loop muted
style={{
width: 'calc(100% - 512px)', objectFit: "fill", objectPosition: 'left top', height: '100%'
}}
src="/assets/video/login_bg.mp4"
type="video/mp4"
/>
{/* <img src='/assets/images/background/loginBackground.gif' style={{
width: "100%",
height: 'calc(100vh - 4px)',
objectFit: "cover",
objectPosition: 'left top',
position: 'absolute',
top: 0,
left: 0,
zIndex: "5"
}} /> */}
<div style={{
width: 600,
height: 90,
objectFit: "cover",
objectPosition: 'left top',
position: 'absolute',
top: 100,
left: 41,
zIndex: 5,
fontSize: 14,
color: ' #005ABD',
display:'flex',
flexDirection: 'column',
justifyContent: 'space-between',
}}>
<div><span style={{ fontFamily: 'YouSheBiaoTiHei', }}>POMS运维中台管理系统</span> 为企业数字化转型提供安全稳定高效的数字化运维底座</div>
<div><span style={{ fontFamily: 'YouSheBiaoTiHei', }}>高效</span> 为运维智能化升级提供领先的创新技术和平台管理</div>
<div><span style={{ fontFamily: 'YouSheBiaoTiHei', }}>智能</span>助力数字化转型和智能化升级一步到位</div>
</div>
<div style={{
width: 512,
return (
<div style={{
width: '100%',
height: '100%',
padding: '45px 60px',
background: 'rgb(255 255 255 / 50%)',
backdropFilter: "saturate(100%) contrast(100%) blur(17px)",
position: 'absolute',
top: 0,
right: 0,
zIndex: "6",
textAlign: 'center',
}}>
background: '#F0F4FF',
}}>
<div style={{
width: 388,
marginTop: "40%"
width: '57.64%',
height: '100%'
}}>
<img src="/assets/images/background/user_login.png" alt="" style={{ width: 324, height: 24, marginBottom: 71 }} />
<Form
onSubmit={values => {
dispatch(login(values.username, values.password)).then(res => {
const data = res.payload.user
dispatch(actions.layout.initWebSocket({ ioUrl: apiRoot, token: data.token, pomsUserId: data.pomsUserInfo.id }))
})
}}
getFormApi={formApi => form.current = formApi}
>
<Form.Input
className='inputbgc'
field='username'
noLabel={true}
label='用户名'
placeholder='请输入账号'
prefix={<IconUser style={{ color: '#1859C1', marginRight: 14, marginLeft: 8 }} />}
style={{ background: '#FFFFFF', height: 46, marginBottom: 33, border: '1px solid rgb(185 211 239)', borderRadius: '4px' }}
/>
<Form.Input
field='password'
noLabel={true}
mode="password"
autoComplete=""
placeholder='请输入密码'
label='密码'
prefix={<IconLock style={{ color: '#1859C1', marginRight: 14, marginLeft: 8 }} />}
style={{ background: '#FFFFFF', height: 46, border: '1px solid rgb(185 211 239)', borderRadius: '4px' }}
/>
<img src="/assets/images/background/xiangqi.png" style={{ width: 112, height: 14, margin: "4px 0 0 278px" }} />
<Button htmlType='submit' block theme="solid" loading={isRequesting} style={{ marginTop: 56, height: 46, backgroundColor: '#005ABD', borderRadius: '3px' }}>立即登录</Button>
<div className='zoomImage'>
<img src="/assets/images/background/loginText.png" style={{ width: 587, height: 81, margin: "143px 0 0 69px" }} />
</div>
</div>
<div style={{
width: '42.36%',
height: '100%',
padding: '45px 60px',
background: 'rgb(255 255 255 / 50%)',
backdropFilter: "saturate(100%) contrast(100%) blur(17px)",
position: 'absolute',
top: 0,
right: 0,
zIndex: "6",
textAlign: 'center',
display: 'flex',
justifyContent: 'center',
background: '#FFFFFF'
}}>
<div style={{
width: 388,
marginTop: "18.33%"
}}>
<div style={{ fontSize: 31, color: '#000000',marginBottom:90 }}>
FS-CRM企业信息管理系统
</div>
<Form
onSubmit={values => {
dispatch(login(values.username, values.password)).then(res => {
const data = res.payload.user
dispatch(actions.layout.initWebSocket({ ioUrl: apiRoot, token: data.token, pomsUserId: data.pomsUserInfo.id }))
})
}}
getFormApi={formApi => form.current = formApi}
>
<Form.Input
className='inputbgc'
field='username'
noLabel={true}
label='用户名'
placeholder='请输入账号'
prefix={<IconUser style={{ color: '#717171', marginRight: 14, marginLeft: 8 }} />}
style={{ background: '#FFFFFF', height: 46, marginBottom: 33, border: '1px solid rgb(185 211 239)', borderRadius: '4px' }}
/>
<Form.Input
field='password'
noLabel={true}
mode="password"
autoComplete=""
placeholder='请输入密码'
label='密码'
prefix={<IconLock style={{ color: '#717171', marginRight: 14, marginLeft: 8 }} />}
style={{ background: '#FFFFFF', height: 46, border: '1px solid rgb(185 211 239)', borderRadius: '4px' }}
/>
<img src="/assets/images/background/xiangqi.png" style={{ width: 112, height: 14, margin: "4px 0 0 278px" }} />
<Button htmlType='submit' block theme="solid" loading={isRequesting} style={{ marginTop: 56, height: 46, backgroundColor: '#0F7EFB', borderRadius: '27px' }}>立即登录</Button>
</Form>
</Form>
</div>
</div>
</div>
</div>
);
</div>
</div >
);
}
function mapStateToProps (state) {
const { auth, global } = state;
return {
user: auth.user,
error: auth.error,
actions: global.actions,
apiRoot: global.apiRoot,
isRequesting: auth.isRequesting
}
const { auth, global } = state;
return {
user: auth.user,
error: auth.error,
actions: global.actions,
apiRoot: global.apiRoot,
isRequesting: auth.isRequesting
}
}
export default connect(mapStateToProps)(Login);

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

@ -4,4 +4,7 @@ input:-webkit-autofill{
box-shadow: 0 0 0px 1000px transparent inset !important;
background-color:transparent;
transition: background-color 50000s ease-in-out 0s;
}
.zoomImage{
width: 100%; height: 100%; background: url(/assets/images/background/loginBackgroundimg.png) right center no-repeat; background-size: contain;
}

6
web/client/src/sections/humanAffairs/actions/index.js

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

15
web/client/src/sections/humanAffairs/actions/personnelFiles.js

@ -0,0 +1,15 @@
'use strict';
import { ApiTable, basicAction } from '$utils'
export function getMemberSearch (query) {//搜索项企用户
return (dispatch) => basicAction({
type: "get",
dispatch: dispatch,
actionType: "GET_MemberSearch",
query: query,
url: `${ApiTable.getMemberSearch}`,
msg: { option: "搜索项企用户" },
reducer: { name: "MemberSearch", params: { noClear: true } },
});
}

273
web/client/src/sections/humanAffairs/components/personnelModal.jsx

@ -0,0 +1,273 @@
import React, { useState, useRef, useEffect } from "react";
import { connect } from "react-redux";
import { Modal, Form } from "@douyinfe/semi-ui";
import { IconAlertCircle } from '@douyinfe/semi-icons';
function pushModal (props) {
const {
close,
cancel,
visible,
dispatch,
pepList,
actions,
adminEdit,//
editObj,
} = props;
const { install } = actions;
const form = useRef();//
const [disablePeople, setDisablePeople] = useState(true); //
const [peopleList, setPeopleList] = useState([]); //List
const [departmentId, setDepartmentId] = useState(); //id
const [peopleId, setPeopleId] = useState(); //id
//
useEffect(() => {
// if (editObj.id) {
// let departmentList = []
// for (let i = 0; i < pepList.length; i++) {
// if (pepList[i].id == editObj.departments[0].id) {
// departmentList = pepList[i].users
// }
// }
// setPeopleList(departmentList)
// setDepartmentId(editObj.departments[0].id)
// setPeopleId(editObj.pepUserId)
// setDisablePeople(false)
// }
}, []);
function handleOk () {
//
form.current
.validate()
.then((values) => {
if (adminEdit) {
}
else {
}
})
}
function handleCancel () {
cancel();
//
}
return (
<>
<Modal
title={editObj?.id ? '修改档案' : '新增档案'}
okText="确定"
cancelText="取消"
visible={visible}
onOk={handleOk}
width={966}
onCancel={handleCancel}
>
<div style={{ borderBottom: '1px solid #DCDEE0', margin: '0px -24px' }}></div>
<div style={{ margin: "0px 26px" }}>
<Form
allowEmpty
labelPosition="left"
labelAlign="right"
labelWidth="98px"
onValueChange={(values, field) => {
// for (var key in field) {
// if (key == 'department') {
// if (values.department >= 0) {
// let departmentList = []
// for (let i = 0; i < pepList.length; i++) {
// if (pepList[i].id == values.department) {
// departmentList = pepList[i].users
// }
// }
// setPeopleList(departmentList)
// setDisablePeople(false)
// form.current.setValue('pepUserId', undefined);
// }
// else {
// setPeopleList([])
// setDisablePeople(true)
// form.current.setValue('pepUserId', undefined);
// }
// }
// }
}}
getFormApi={(formApi) => (form.current = formApi)}
>
<div style={{ width: 846, border: '1px solid rgba(151,151,151,0.2)', marginTop: 18 }}>
<div style={{ height: 50, padding: '0px 30px', color: '#4A4A4A', fontSize: 14, display: 'flex', alignItems: 'center' }}>
职务信息
</div>
<div style={{ borderBottom: '1px solid rgba(151,151,151,0.2)', }}></div>
<div style={{ padding: '20px 30px' }}>
<div style={{ display: 'flex', alignItems: 'center' }}>
<Form.Input
field="pepUserId"
label='人员编号:'
style={{ width: 425 }}
initValue={'' || ""}
placeholder="请输入人员编号"
showClear
rules={[{ required: true, message: "请输入人员编号" }]} />
<div style={{ marginLeft: 12, color: '#005ABD', cursor: "pointer", fontSize: 14 }}>
搜索
</div>
</div>
<div style={{ width: 786, height: 95, background: '#F4F5FC', border: '1px solid rgba(0, 90, 189, 0.2)', marginTop: 8, padding: '20px 83px 20px 50px' }}>
<div style={{ display: 'flex', justifyContent: 'space-between' }}>
<div style={{ display: 'flex', alignItems: 'center' }}>
<div style={{ width: 16, height: 16, marginRight: 9 }}>
<img src="/assets/images/hrImg/name.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ color: 'rgba(0,0,0,0.6)', fontSize: 12 }}>
姓名
</div>
<div style={{ color: '#4A4A4A', fontSize: 12 }}>
刘昊然
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center' }}>
<div style={{ width: 16, height: 16, marginRight: 9 }}>
<img src="/assets/images/hrImg/number.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ color: 'rgba(0,0,0,0.6)', fontSize: 12 }}>
员工编号
</div>
<div style={{ color: '#4A4A4A', fontSize: 12 }}>
0001
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center' }}>
<div style={{ width: 16, height: 16, marginRight: 9 }}>
<img src="/assets/images/hrImg/position.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ color: 'rgba(0,0,0,0.6)', fontSize: 12 }}>
职位
</div>
<div style={{ color: '#4A4A4A', fontSize: 12 }}>
产品经理
</div>
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center', marginTop: 20 }}>
<div style={{ width: 16, height: 16, marginRight: 9 }}>
<img src="/assets/images/hrImg/department.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ color: 'rgba(0,0,0,0.6)', fontSize: 12 }}>
所属部门
</div>
<div style={{ color: '#FFFFFF', fontSize: 12, padding: '0px 4px 1px', background: 'rgba(0,90,189,0.8)' }}>
行业服务部
</div>
</div>
</div>
</div>
</div>
<div style={{ width: 846, border: '1px solid rgba(151,151,151,0.2)', marginTop: 12 }}>
<div style={{ height: 50, padding: '0px 30px', color: '#4A4A4A', fontSize: 14, display: 'flex', alignItems: 'center' }}>
基本信息
</div>
<div style={{ borderBottom: '1px solid rgba(151,151,151,0.2)', }}></div>
<div style={{ padding: '20px 30px' }}>
<div style={{ display: 'flex', alignItems: 'center' }}>
<div>
<Form.Input
field="idNumber"
label='证件号:'
style={{ width: 364 }}
initValue={'' || ""}
placeholder="请输入证件号"
showClear
// rules={[{ required: true, message: "" }]}
/>
</div>
<div>
upload
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center' }}>
<div>
<Form.Select
label="性别:"
field="gender"
placeholder="请选择性别"
style={{ width: 122 }}
initValue={departmentId || ""}
showClear
>
<Form.Select.Option value='man'>
</Form.Select.Option>
<Form.Select.Option value='woman'>
</Form.Select.Option>
</Form.Select>
</div>
<div>
</div>
</div>
</div>
</div>
{/* <div>
<Form.Select
label="选择部门:"
field="department"
placeholder="请选择部门"
style={{ width: 417 }}
rules={[{ required: true, message: "请选择部门" }]}
initValue={departmentId || ""}
showClear
>
{
pepList.map((item, index) => {
return (
<Form.Select.Option key={index} value={item.id}>
{item.name}
</Form.Select.Option>
)
})
}
</Form.Select>
</div> */}
{/* <div>
<Form.Select
label="选择人员:"
field="pepUserId"
placeholder="请选择人员"
style={{ width: 417 }}
rules={[{ required: true, message: "请选择人员" }]}
initValue={peopleId || ""}
showClear
disabled={disablePeople}
>
{
peopleList.map((item, index) => {
return (
<Form.Select.Option key={item.id} value={item.id}>
{item.name}
</Form.Select.Option>
)
})
}
</Form.Select>
</div> */}
</Form>
</div>
</Modal>
</>
);
}
function mapStateToProps (state) {
const { auth, global, members } = state;
return {
// loading: members.isRequesting,
user: auth.user,
actions: global.actions,
// members: members.data,
};
}
export default connect(mapStateToProps)(pushModal);

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

@ -0,0 +1,6 @@
'use strict';
import PersonnelFiles from './personnelFiles';
import PersonnelFilesDetail from './personnelFilesDetail';
export { PersonnelFiles, PersonnelFilesDetail };

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

@ -0,0 +1,266 @@
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import { Select, Input, Button, CheckboxGroup } from '@douyinfe/semi-ui';
import { IconSearch } from '@douyinfe/semi-icons';
import PersonnelModal from '../components/personnelModal';
import '../style.less'
const Rest = (props) => {
const { dispatch, actions, history, user, loading, socket } = props
const { humanAffairs } = actions;
let [departmentValue, setDepartmentValue] = useState('');
let [archivesList, setArchivesList] = useState(['', '', '', '', '', '', '', '', '', '']);
const [personnelModal, setPersonnelModal] = useState(false);//
const options = [
{ label: '离职', value: 'abc' },
{ label: '请假', value: 'hotsoon' },
{ label: '放假', value: 'pipixia' },
{ label: '在岗', value: 'toutiao' },
{ label: '加班', value: 'jiaban' }
]
let [seachValue, setSeachValue] = useState('');
let [typeChoose, setTypeChoose] = useState([]);
useEffect(() => {
getMemberSearchList()
}, [])
function getMemberSearchList () {//
dispatch(humanAffairs.getMemberSearch()).then((res) => {//
if (res.success) {
// let mytableData = JSON.parse(JSON.stringify(res.payload.data.rows));
// let mytableKey = []
// for (let index = 0; index < mytableData.length; index++) {
// mytableData[index].key = mytableData[index].id
// mytableKey.push(mytableData[index].id)
// }
// setTableKey(mytableKey)
// setTableData(mytableData)
// setLimits(res.payload.data.count)
// mylimits.current = res.payload.data.rows.length
}
})
}
function typeOnChange (e) {//
console.log('e.target.value', e.target.value);
setTypeChoose(e.target.value);
}
function seachValueChange () {
}
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 FILE</div>
</div>
<div style={{ display: 'flex', marginRight: 20 }}>
<div style={{ padding: '6px 20px', background: '#0F7EFB', color: '#FFFFFF', fontSize: 14, cursor: "pointer" }}
onClick={() => {
setPersonnelModal(true);
}}>
新增档案
</div>
<div style={{ padding: '6px 20px', background: '#00BA85', color: '#FFFFFF', fontSize: 14, cursor: "pointer", marginLeft: 20 }}>
导入员工信息
</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", }}>EMPLOYEE FILE DETAILS</div>
</div>
</div>
<div style={{ display: 'flex', marginTop: 16, marginBottom: 17 }}>
<div>
<Select value={departmentValue} onChange={setDepartmentValue} placeholder='部门' style={{ width: 200 }} showClear>
<Select.Option value='abc'>抖音</Select.Option>
<Select.Option value='ulikecam'>轻颜相机</Select.Option>
<Select.Option value='xigua'>西瓜视频</Select.Option>
</Select>
</div>
<div style={{ marginLeft: 12, marginRight: 18 }}>
<Input suffix={<IconSearch />}
showClear
placeholder='请输入或选择关键词'
value={seachValue}
style={{ width: 346 }}
onChange={seachValueChange}>
</Input>
</div>
<Button theme='solid' type='primary' style={{ width: 80, borderRadius: 2, height: 32, background: '#DBECFF', color: '#005ABD' }}>查询</Button>
</div>
<div style={{ borderBottom: '1px solid #F2F3F5', marginLeft: '-20px', marginBottom: 16 }}></div>
<div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 22 }}>
<div style={{ display: 'flex', }}>
<div style={{ color: '#646566', fontSize: 14 }}>
当前显示
</div>
<div style={{ color: '#005ABD', fontSize: 14, margin: '0px 10px' }}>
11
</div>
<div style={{ color: '#646566', fontSize: 14 }}>
结果
</div>
</div>
<div style={{ display: 'flex', marginRight: 30, alignItems: 'center' }}>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
人员状态
</div>
<div>
<CheckboxGroup options={options} onChange={typeOnChange} value={typeChoose} direction='horizontal' aria-label="CheckboxGroup 示例" />
</div>
<div style={{ display: 'flex', marginLeft: 30, alignItems: 'center' }}>
<div style={{ width: 20, height: 20 }}>
<img src="/assets/images/hrImg/export.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ marginLeft: 4, color: '#005ABD', fontSize: 13 }}>
导出
</div>
</div>
</div>
</div>
<div style={{ display: 'flex', flexWrap: 'wrap', marginLeft: 30 }}>
{
archivesList.map((item, index) => {
return (
<div key={index} style={{ display: 'flex', width: 368, border: '1px solid #F9F9F9', boxShadow: '0px 0px 4px 1px rgba(0,0,0,0.08)', padding: 10, marginRight: 40, marginBottom: 20 }}>
<div style={{ width: 128, height: 192 }}>
<img src="/assets/images/hrImg/mc.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ marginLeft: 4 }}>
<div style={{ display: 'flex' }}>
<div style={{ color: '#005ABD', fontSize: 14, marginRight: 6 }}>
0012
</div>
<div style={{ padding: '0px 4px 1px 4px ', color: '#FFFFFF', fontSize: 12, background: 'rgba(0,90,189,0.8)', borderRadius: 2 }}>
行业服务部
</div>
{/* <div>
</div> */}
</div>
<div style={{ marginTop: 16, display: 'flex', marginLeft: 4 }}>
<div style={{ display: 'flex', width: 159 }}>
<div style={{ width: 20, height: 20 }}>
<img src="/assets/images/hrImg/mc.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ fontSize: 14, color: '#282828', marginLeft: 12, marginRight: 9 }}>
刘昊然
</div>
<div style={{ background: '#FFFBE3', padding: '2px 6px 1px', color: '#D3A000', fontSize: 12, borderRadius: '8px 0px 8px 0px' }}>
请假中
</div>
</div>
<div style={{ color: 'rgba(0,0,0,0.65)', fontSize: 12 }}>
23
</div>
</div>
<div style={{ marginTop: 16, display: 'flex', marginLeft: 4 }}>
<div style={{ display: 'flex', width: 159 }}>
<div style={{ width: 20, height: 20 }}>
<img src="/assets/images/hrImg/man.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ fontSize: 14, color: '#282828', marginLeft: 12, marginRight: 9 }}>
</div>
</div>
<div style={{ color: 'rgba(0,0,0,0.65)', fontSize: 12 }}>
未婚
</div>
</div>
<div style={{ marginTop: 16, display: 'flex', marginLeft: 4 }}>
<div style={{ display: 'flex', width: 159 }}>
<div style={{ width: 20, height: 20 }}>
<img src="/assets/images/hrImg/post.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ fontSize: 14, color: '#282828', marginLeft: 12, marginRight: 9 }}>
人力资源部副部长
</div>
</div>
<div style={{ color: 'rgba(0,0,0,0.65)', fontSize: 12 }}>
9年经验
</div>
</div>
<div style={{ marginTop: 16, display: 'flex', marginLeft: 4 }}>
<div style={{ display: 'flex', width: 159 }}>
<div style={{ width: 20, height: 20 }}>
<img src="/assets/images/hrImg/year.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ fontSize: 14, color: '#282828', marginLeft: 12, marginRight: 9 }}>
入职3年
</div>
</div>
<div style={{ color: 'rgba(0,0,0,0.65)', fontSize: 12 }}>
本科
</div>
</div>
<div style={{ marginTop: 16, marginLeft: 4 }}>
<Button theme='solid' type='primary' style={{ width: 212, borderRadius: 17, height: 28 }}
onClick={() => {
history.push(`/personnelFilesDetail`);
}}>详情</Button>
</div>
</div>
</div>
)
})
}
</div>
</div>
</div>
{//
personnelModal ?
<PersonnelModal
visible={true}
// pepList={pepList}
// memberEdit={memberEdit}
// editObj={editObj}
// pomsList={pomsList}
// anxinDelete={anxinDelete}
// anxincloudArr={anxincloudArr}
cancel={() => {
setPersonnelModal(false);
}}
close={() => {
setPersonnelModal(false);
// getUserList()
}} >
</PersonnelModal> : ''
}
</>
)
}
function mapStateToProps (state) {
const { auth, global, members, webSocket } = state;
return {
// loading: members.isRequesting,
// user: auth.user,
actions: global.actions,
// members: members.data,
// socket: webSocket.socket
};
}
export default connect(mapStateToProps)(Rest);

752
web/client/src/sections/humanAffairs/containers/personnelFilesDetail.jsx

@ -0,0 +1,752 @@
import React, { useEffect, useState, useMemo } from 'react';
import { connect } from 'react-redux';
import { Select, Input, Button, CheckboxGroup, DatePicker, Table } from '@douyinfe/semi-ui';
import { IconSearch } from '@douyinfe/semi-icons';
import ReactECharts from 'echarts-for-react';
import * as echarts from 'echarts';
import '../style.less'
const Rest = (props) => {
const { dispatch, actions, user, loading, socket } = props
const { humanAffairs } = actions;
const [option, setOption] = useState({});
const [leaveoption, setLeaveOption] = useState({});
const [tableData, setTableData] = useState([{}, {}, {}, {}, {}, {}, {}]) //
const [leaveData, setLeaveData] = useState([{}, {}, {}, {}, {}, {}, {}]) //
const [columns, setColumns] = useState([//
{
title: "实例号",
dataIndex: "index",
key: 'index',
render: (text, r, index) => {
return index + 1;
},
}, {
title: "事由",
dataIndex: "why",
key: 'why',
render: (text, r, index) => {
return index + 1;
},
}, {
title: "类型",
dataIndex: "type",
key: 'type',
render: (text, r, index) => {
return index + 1;
},
}, {
title: "发起时间",
dataIndex: "originatingTime",
key: 'originatingTime',
render: (text, r, index) => {
return index + 1;
},
}, {
title: "开始时间",
dataIndex: "startTime",
key: 'startTime',
render: (text, r, index) => {
return index + 1;
},
}, {
title: "结束时间",
dataIndex: "endTime",
key: 'endTime',
render: (text, r, index) => {
return index + 1;
},
}, {
title: "总计时间",
dataIndex: "allTime",
key: 'allTime',
render: (text, r, index) => {
return index + 1;
},
},
])
const [leaveColumns, setLeaveColumns] = useState([//
{
title: "实例号",
dataIndex: "index",
key: 'index',
render: (text, r, index) => {
return index + 1;
},
}, {
title: "事由",
dataIndex: "why",
key: 'why',
render: (text, r, index) => {
return index + 1;
},
}, {
title: "类型",
dataIndex: "type",
key: 'type',
render: (text, r, index) => {
return index + 1;
},
}, {
title: "发起时间",
dataIndex: "originatingTime",
key: 'originatingTime',
render: (text, r, index) => {
return index + 1;
},
}, {
title: "开始时间",
dataIndex: "startTime",
key: 'startTime',
render: (text, r, index) => {
return index + 1;
},
}, {
title: "结束时间",
dataIndex: "endTime",
key: 'endTime',
render: (text, r, index) => {
return index + 1;
},
}, {
title: "总计时间",
dataIndex: "allTime",
key: 'allTime',
render: (text, r, index) => {
return index + 1;
},
},
])
const scroll = useMemo(() => ({ y: 248 }), []);
useEffect(() => {
getMemberSearchList()
getWorkOption()
getLeaveOption()
}, [])
function getWorkOption () {//线
var date = [];
date.push([2017, 6, 1].join("/"));
date.push([2017, 6, 2].join("/"));
date.push([2017, 6, 3].join("/"));
date.push([2017, 6, 4].join("/"));
date.push([2017, 6, 5].join("/"));
date.push([2017, 6, 6].join("/"));
date.push([2017, 6, 7].join("/"));
date.push([2017, 6, 8].join("/"));
date.push([2017, 6, 9].join("/"));
let data = {
legend: {
data: ["调休", "折算"],
left: 'right',
icon: 'roundRect',
itemHeight: 3, //
},
color: ['#0F7EFB', '#FE9812'], //线
xAxis: [
{
boundaryGap: false,
data: date,
},
],
yAxis: [
{
type: "value",
name: '小时'
},
],
dataZoom: [
{
id: "dataZoomX",
type: "slider",
start: 0,
end: 100,
handleIcon:
"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z",
handleSize: "80%",
},
],
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
label: {
backgroundColor: '#6a7985'
}
}
},
series: [
{
name: "调休",
type: "line",
areaStyle: {
color: 'rgba(14,156,255,0.5)',
opacity: 0.1
},
smooth: true,
data: [
["2017/6/1", 1],
["2017/6/3", 3],
["2017/6/5", 5],
["2017/6/7", 4],
["2017/6/9", 4],
],
},
{
name: "折算",
type: "line",
areaStyle: {
color: 'rgba(254,152,18,0.2)',
},
smooth: true,
data: [
["2017/6/2", 3],
["2017/6/4", 1],
["2017/6/6", 6],
["2017/6/8", 3],
],
},
],
}
setOption(data)
}
function getLeaveOption () {//线
var date = [];
date.push([2017, 6, 1].join("/"));
date.push([2017, 6, 2].join("/"));
date.push([2017, 6, 3].join("/"));
date.push([2017, 6, 4].join("/"));
date.push([2017, 6, 5].join("/"));
date.push([2017, 6, 6].join("/"));
date.push([2017, 6, 7].join("/"));
date.push([2017, 6, 8].join("/"));
date.push([2017, 6, 9].join("/"));
let data = {
color: ['#0F7EFB', '#FE9812'], //线
xAxis: [
{
boundaryGap: false,
data: date,
},
],
yAxis: [
{
type: "value",
name: '小时'
},
],
dataZoom: [
{
id: "dataZoomX",
type: "slider",
start: 0,
end: 100,
handleIcon:
"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z",
handleSize: "80%",
},
],
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'cross',
label: {
backgroundColor: '#6a7985'
}
}
},
series: [
{
name: "调休",
type: "line",
areaStyle: {
color: 'rgba(14,156,255,0.5)',
opacity: 0.1
},
smooth: true,
data: [
["2017/6/1", 1],
["2017/6/3", 3],
["2017/6/5", 5],
["2017/6/7", 4],
["2017/6/9", 4],
],
},
],
}
setLeaveOption(data)
}
function getMemberSearchList () {//
dispatch(humanAffairs.getMemberSearch()).then((res) => {//
if (res.success) {
// let mytableData = JSON.parse(JSON.stringify(res.payload.data.rows));
// let mytableKey = []
// for (let index = 0; index < mytableData.length; index++) {
// mytableData[index].key = mytableData[index].id
// mytableKey.push(mytableData[index].id)
// }
// setTableKey(mytableKey)
// setTableData(mytableData)
// setLimits(res.payload.data.count)
// mylimits.current = res.payload.data.rows.length
}
})
}
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>
<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: 20, height: 20, marginRight: 10, cursor: "pointer" }}>
<img src="/assets/images/hrImg/back.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<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>
<div style={{ display: 'flex', marginRight: 20 }}>
<div style={{ padding: '6px 20px', background: '#0F7EFB', color: '#FFFFFF', fontSize: 14, cursor: "pointer" }}>
编辑档案
</div>
<div style={{ padding: '6px 20px', background: '#FF5254', color: '#FFFFFF', fontSize: 14, cursor: "pointer", marginLeft: 20 }}>
删除档案
</div>
</div>
</div>
<div style={{ borderBottom: '1px solid #DCDEE0', margin: '16px 0px 16px -20px' }}></div>
<div style={{ display: 'flex', width: '100%' }}>
<div style={{ width: 160, height: 240, marginLeft: 17 }}>
<img src="/assets/images/hrImg/mc.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ marginLeft: 40, marginTop: 8, width: '61.452%' }}>
<div style={{ display: 'flex' }}>
{/* 基本信息 */}
<div style={{ width: '60%' }}>
<div style={{ color: '#4A4A4A', fontSize: 14, fontWeight: 'bold' }}>
基本信息
</div>
<div style={{ display: 'flex', marginTop: 13 }}>
<div style={{ display: 'flex', width: '40.82%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 48 }}>
证件号
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
3211011290000022
</div>
</div>
<div style={{ display: 'flex', width: '59.18%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60 }}>
联系方式
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
13221212211
</div>
</div>
</div>
<div style={{ display: 'flex', marginTop: 8 }}>
<div style={{ display: 'flex', width: '40.82%' }}>
<div style={{ display: 'flex', width: '52.57%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 48, textAlign: 'end' }}>
姓名
</div>
<div style={{ color: '#005ABD', fontSize: 13 }}>
刘昊然
</div>
</div>
<div style={{ display: 'flex', width: '47.43%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 48, textAlign: 'end' }}>
性别
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
</div>
</div>
</div>
<div style={{ display: 'flex', width: '59.18%' }}>
<div style={{ display: 'flex', width: '53.166%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60 }}>
出生日期
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
1998年6月15日
</div>
</div>
<div style={{ display: 'flex', width: '46.834%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60 }}>
政治面貌
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
党员
</div>
</div>
</div>
</div>
<div style={{ display: 'flex', marginTop: 8 }}>
<div style={{ display: 'flex', width: '40.82%' }}>
<div style={{ display: 'flex', width: '52.57%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 48, textAlign: 'end' }}>
年龄
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
22
</div>
</div>
<div style={{ display: 'flex', width: '47.43%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 48, textAlign: 'end' }}>
籍贯
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
镇江
</div>
</div>
</div>
<div style={{ display: 'flex', width: '59.18%' }}>
<div style={{ display: 'flex', width: '53.166%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60 }}>
婚育状态
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
已婚已育
</div>
</div>
<div style={{ display: 'flex', width: '46.834%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60 }}>
工作地点
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
江西-南昌
</div>
</div>
</div>
</div>
</div>
{/* 学历信息 */}
<div style={{ width: '40%' }}>
<div style={{ color: '#4A4A4A', fontSize: 14, fontWeight: 'bold' }}>
学历信息
</div>
<div style={{ display: 'flex', marginTop: 13 }}>
<div style={{ display: 'flex', width: '43.05%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60 }}>
毕业院校
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
江苏大学
</div>
</div>
<div style={{ display: 'flex', width: '56.95' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60 }}>
毕业时间
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
2022年12月31日
</div>
</div>
</div>
<div style={{ display: 'flex', marginTop: 9 }}>
<div style={{ display: 'flex', width: '43.05%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60, textAlign: 'end' }}>
学历
</div>
<div style={{ color: '#005ABD', fontSize: 13 }}>
本科
</div>
</div>
<div style={{ display: 'flex', width: '56.95' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60, textAlign: 'end' }}>
专业
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
法学
</div>
</div>
</div>
</div>
</div>
{/* 职务信息 */}
<div style={{ marginTop: 20 }}>
<div style={{ color: '#4A4A4A', fontSize: 14, fontWeight: 'bold' }}>
职务信息
</div>
<div style={{ marginTop: 13, display: 'flex' }}>
<div style={{ display: 'flex', width: '14.715%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60 }}>
员工编号
</div>
<div style={{ color: '#005ABD', fontSize: 13 }}>
0001
</div>
</div>
<div style={{ display: 'flex', width: '85.285%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60 }}>
所属部门
</div>
<div style={{ color: '#FFFFFF', fontSize: 12, padding: '0px 4px 1px', background: 'rgba(0,90,189,0.8)' }}>
行业服务部
</div>
</div>
</div>
<div style={{ marginTop: 9, display: 'flex' }}>
<div style={{ display: 'flex', width: '14.715%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60 }}>
员工职位
</div>
<div style={{ color: '#005ABD', fontSize: 13 }}>
产品经理
</div>
</div>
<div style={{ display: 'flex', width: '19.072%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60 }}>
入职时间
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
0001
</div>
</div>
<div style={{ display: 'flex', width: '21.395%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 84 }}>
转试用期时间
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
2022年12月31日
</div>
</div>
<div style={{ display: 'flex', width: '' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60 }}>
转正时间
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
2022年12月31日
</div>
</div>
</div>
<div style={{ display: 'flex' }}>
<div style={{ marginTop: 9, display: 'flex', width: '14.715%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60 }}>
工作经验
</div>
<div style={{ color: '#005ABD', fontSize: 13 }}>
10
</div>
</div>
<div style={{ marginTop: 9, display: 'flex', width: '19.072%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 60 }}>
入职年限
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
10
</div>
</div>
<div style={{ marginTop: 9, display: 'flex', width: '39.4%' }}>
<div style={{ color: 'rgba(0, 0, 0,0.6)', fontSize: 12, width: 84, textAlign: 'end' }}>
试用期
</div>
<div style={{ color: '#4A4A4A', fontSize: 13 }}>
3个月
</div>
</div>
<div style={{ display: 'flex', width: 139, height: 27, background: '#E5F2FF', borderRadius: 14, cursor: "pointer", alignItems: 'center', justifyContent: 'center' }}>
<div style={{ width: 18, height: 18 }}>
<img src="/assets/images/hrImg/resume.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ marginLeft: 10, fontSize: 13, color: '#4A4A4A' }}>
/她的简历
</div>
</div>
</div>
</div>
</div>
<div style={{ borderRight: '1px solid #DCDEE0', margin: '-16px 0px -20px 0px' }}></div>
<div style={{ marginLeft: 30, marginTop: 8, paddingRight: 30 }}>
<div style={{ color: '#4A4A4A', fontSize: 14 }}>
/她的历史工作经历与职务
</div>
<div style={{ marginTop: 12, fontSize: 13, display: 'flex', alignItems: 'center' }}>
<div style={{ width: 4, height: 4, borderRadius: '50%', marginRight: 6, background: '#005ABD' }}></div>2017年就职于XX公司担任总经理职务
</div>
</div>
</div>
<div style={{ borderBottom: '1px solid #DCDEE0', margin: '24px 0px 24px -20px' }}></div>
<div style={{ paddingLeft: 17 }}>
<div style={{ color: '#4A4A4A', fontSize: 14, marginBottom: 10 }}>
基础动作
</div>
<div style={{ color: '#4A4A4A', fontSize: 14, display: 'flex', alignItems: 'center' }}>
时间筛选<DatePicker type="dateRange" density="compact" style={{ width: 242 }} />
</div>
<div style={{ display: 'flex', alignItems: 'center', margin: '5px 0px 12px' }}>
<div style={{ width: 18, height: 18 }}>
<img src="/assets/images/hrImg/information.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ marginLeft: 12, color: '#4A4A4A', fontSize: 14 }}>
加班信息
</div>
</div>
<div style={{ display: 'flex', width: '100%' }}>
<div style={{ width: 540, boxShadow: '0px 0px 8px 1px rgba(0,0,0,0.1)', padding: 13 }}>
<ReactECharts
option={option}
notMerge={true}
lazyUpdate={true}
theme={"theme_name"}
/>
</div>
<div style={{ marginLeft: 17, boxShadow: '0px 0px 8px 1px rgba(0,0,0,0.1)', width: '64.424%' }}>
<div style={{ display: 'flex', background: '#F4F5FC', height: 40, alignItems: 'center', width: '100%' }}>
<div style={{ width: 6, height: 40, background: '#005ABD' }}></div>
<div style={{ display: 'flex', alignItems: 'center', marginLeft: 24, width: '19.964%' }}>
<div style={{ fontSize: 13, color: '#4A4A4A' }}>
加班次数
</div>
<div style={{ fontSize: 14, color: '#005ABD', marginLeft: 5 }}>
25
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center', width: '19.124%' }}>
<div style={{ fontSize: 13, color: '#4A4A4A' }}>
工作日
</div>
<div style={{ fontSize: 14, color: '#005ABD', marginLeft: 5 }}>
115小时
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center', width: '19.87%' }}>
<div style={{ fontSize: 13, color: '#4A4A4A' }}>
普通假日
</div>
<div style={{ fontSize: 14, color: '#005ABD', marginLeft: 5 }}>
12小时
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center', width: '19.03%' }}>
<div style={{ fontSize: 13, color: '#4A4A4A' }}>
法定假日
</div>
<div style={{ fontSize: 14, color: '#005ABD', marginLeft: 5 }}>
1小时
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center', width: '19.217%' }}>
<div style={{ fontSize: 13, color: '#4A4A4A' }}>
累计加班时长
</div>
<div style={{ fontSize: 14, color: '#005ABD', marginLeft: 5 }}>
436小时
</div>
</div>
</div>
<div>
<Table
columns={columns}
dataSource={tableData}
bordered={false}
empty="暂无数据"
pagination={false}
scroll={scroll}
/>
</div>
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center', margin: '19px 0px 12px' }}>
<div style={{ width: 18, height: 18 }}>
<img src="/assets/images/hrImg/information.png" alt="" style={{ width: '100%', height: '100%' }} />
</div>
<div style={{ marginLeft: 12, color: '#4A4A4A', fontSize: 14 }}>
请假信息
</div>
</div>
<div style={{ display: 'flex', width: '100%' }}>
<div style={{ width: 540, boxShadow: '0px 0px 8px 1px rgba(0,0,0,0.1)', padding: 13 }}>
<ReactECharts
option={leaveoption}
notMerge={true}
lazyUpdate={true}
theme={"theme_name2"}
/>
</div>
<div style={{ marginLeft: 17, boxShadow: '0px 0px 8px 1px rgba(0,0,0,0.1)', width: '64.424%' }}>
<div style={{ display: 'flex', background: '#F4F5FC', height: 40, alignItems: 'center', width: '100%' }}>
<div style={{ width: 6, height: 40, background: '#005ABD' }}></div>
<div style={{ display: 'flex', alignItems: 'center', marginLeft: 24, width: '19.964%' }}>
<div style={{ fontSize: 13, color: '#4A4A4A' }}>
请假次数
</div>
<div style={{ fontSize: 14, color: '#005ABD', marginLeft: 5 }}>
25
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center', width: '19.124%' }}>
<div style={{ fontSize: 13, color: '#4A4A4A' }}>
年休假
</div>
<div style={{ fontSize: 14, color: '#005ABD', marginLeft: 5 }}>
115小时
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center', width: '19.87%' }}>
<div style={{ fontSize: 13, color: '#4A4A4A' }}>
事假
</div>
<div style={{ fontSize: 14, color: '#005ABD', marginLeft: 5 }}>
12小时
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center', width: '19.03%' }}>
<div style={{ fontSize: 13, color: '#4A4A4A' }}>
病假
</div>
<div style={{ fontSize: 14, color: '#005ABD', marginLeft: 5 }}>
1小时
</div>
</div>
<div style={{ display: 'flex', alignItems: 'center', width: '19.217%' }}>
<div style={{ fontSize: 13, color: '#4A4A4A' }}>
剩余年假
</div>
<div style={{ fontSize: 14, color: '#005ABD', marginLeft: 5 }}>
436小时
</div>
</div>
</div>
<div>
<Table
columns={leaveColumns}
dataSource={leaveData}
bordered={false}
empty="暂无数据"
pagination={false}
scroll={scroll}
/>
</div>
</div>
</div>
</div>
</div>
</div>
</>
)
}
function mapStateToProps (state) {
const { auth, global, members, webSocket } = state;
return {
// loading: members.isRequesting,
// user: auth.user,
actions: global.actions,
// members: members.data,
// socket: webSocket.socket
};
}
export default connect(mapStateToProps)(Rest);

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

@ -0,0 +1,15 @@
'use strict';
import reducers from './reducers';
import routes from './routes';
import actions from './actions';
import { getNavItem } from './nav-item';
export default {
key: 'humanAffairs',
name: '人事管理',
reducers: reducers,
routes: routes,
actions: actions,
getNavItem: getNavItem
};

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

@ -0,0 +1,25 @@
import React from 'react';
import { IconCode } from '@douyinfe/semi-icons';
export function getNavItem (user, dispatch) {
return (
[
{
itemKey: 'humanAffairs',
text: '人事管理',
icon: <IconCode />,
items: [
{
itemKey: 'archivesCenter',
text: '档案中心',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="iconjianshezhong"></iconpark-icon>,
to: '/humanAffairs/archivesCenter/personnelFiles',
items: [{
itemKey: 'personnelFiles', to: '/humanAffairs/archivesCenter/personnelFiles', text: '人员档案'
}]
},
]
},
]
);
}

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

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

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

@ -0,0 +1,30 @@
import { PersonnelFiles,PersonnelFilesDetail } from './containers';
export default [{
type: 'inner',
route: {
path: '/humanAffairs',
key: 'humanAffairs',
breadcrumb: '人事管理',
// 不设置 component 则面包屑禁止跳转
childRoutes: [{
path: '/archivesCenter',
key: 'archivesCenter',
breadcrumb: '档案中心',
childRoutes: [{
path: '/personnelFiles',
key: 'personnelFiles',
component: PersonnelFiles,
breadcrumb: '人员档案',
}]
},]
}
},{
type: 'inner',
route: {
path: "/personnelFilesDetail",
key: 'personnelFilesDetail',
breadcrumb: '人员档案详情',
component: PersonnelFilesDetail
}
}];

0
web/client/src/sections/humanAffairs/style.less

36
web/client/src/utils/webapi.js

@ -16,40 +16,8 @@ export const ApiTable = {
login: "login",
logout: "logout",
//设置-鉴权管理
getOrganizationDeps: 'organization/deps',//获取项企(PEP)全部部门及其下用户
getOrganizationUser: 'organization/user',//获取成员列表
putOrganizationUser: 'organization/user/{pomsUserId}',//更新成员状态
postOrganizationUser: 'organization/user',//添加/编辑成员
deteleOrganizationAdmin: 'organization/admin/{pomsUserId}',//删除管理员
//设置-关系映射
getProjectPoms: 'project/poms',//获取已绑定项目列表
getProjectAnxincloud: 'project/anxincloud',//获取安心云项目
getProjectPmanage: 'project/pmanage',//获取PEP项目管理项目
postProjectBind: 'project/bind',//绑定安心云、项目管理项目
getProjectAppList: 'project/app_list',//获取应用列表
deleteProjectBind: 'project/bind/{bindId}',//删除安心云、项目管理项目绑定关系
//告警
getProjectPoms: 'project/poms', //获取已绑定项目
getAlarmLnspection: 'alarm/application/inspection', //查询应用巡检信息
putAlarmApplicationNoted: 'alarm/application/noted', //预览状态
getAlarmLnspectionApi: 'alarm/application/api', //查询应用接口/元素错误信息
postApiConfirm: "alarm/application/api_confirm", //确认应用接口/元素错误信息
getAlarmDataGroup: 'alarm/data/group', //获取数据告警分类
getAlarmDataList: "alarm/data/list", //查询数据告警列表
getAlarmDataDetailAgg: 'alarm/data/detail_agg', //查询数据告警详情聚集数据
getAlarmDataDetail: 'alarm/data/detail', //查询数据告警详情
putAlarmdataConfirm: "alarm/data/confirm", //确认数据告警
getAlarmVideoList: 'alarm/video/list', //查询视频告警列表
getAlarmVideoDeviceKind: 'alarm/video/device_kind', //查询视频设备类型
putAlarmVideoConfirm: 'alarm/video/confirm', //确认视频告警信息
getVcmpAuth: 'vcmp/auth', // 获取视频平台应用鉴权token
//服务-信鸽服务
getPush: "push", //获取推送配置列表
//人事管理-人员档案
getMemberSearch: 'member/search',//搜索项企用户
};
export const RouteTable = {

Loading…
Cancel
Save