diff --git a/api/app/lib/schedule/attendance.js b/api/app/lib/schedule/attendance.js index c7a2c43..7e72c81 100644 --- a/api/app/lib/schedule/attendance.js +++ b/api/app/lib/schedule/attendance.js @@ -7,7 +7,7 @@ module.exports = function (app, opts) { { interval: '34 21 4 * * *', // interval: '*/3 * * * *', - immediate: true, + // immediate: true, // proRun: true, }, async () => { diff --git a/web/client/assets/images/background/loginBackgroundimg.png b/web/client/assets/images/background/loginBackgroundimg.png new file mode 100644 index 0000000..ed709cd Binary files /dev/null and b/web/client/assets/images/background/loginBackgroundimg.png differ diff --git a/web/client/assets/images/background/loginText.png b/web/client/assets/images/background/loginText.png new file mode 100644 index 0000000..21fb0fe Binary files /dev/null and b/web/client/assets/images/background/loginText.png differ diff --git a/web/client/assets/images/hrImg/back.png b/web/client/assets/images/hrImg/back.png new file mode 100644 index 0000000..6914924 Binary files /dev/null and b/web/client/assets/images/hrImg/back.png differ diff --git a/web/client/assets/images/hrImg/department.png b/web/client/assets/images/hrImg/department.png new file mode 100644 index 0000000..34957a8 Binary files /dev/null and b/web/client/assets/images/hrImg/department.png differ diff --git a/web/client/assets/images/hrImg/detailBgc.png b/web/client/assets/images/hrImg/detailBgc.png new file mode 100644 index 0000000..713bfc1 Binary files /dev/null and b/web/client/assets/images/hrImg/detailBgc.png differ diff --git a/web/client/assets/images/hrImg/export.png b/web/client/assets/images/hrImg/export.png new file mode 100644 index 0000000..2227ba8 Binary files /dev/null and b/web/client/assets/images/hrImg/export.png differ diff --git a/web/client/assets/images/hrImg/information.png b/web/client/assets/images/hrImg/information.png new file mode 100644 index 0000000..28add9d Binary files /dev/null and b/web/client/assets/images/hrImg/information.png differ diff --git a/web/client/assets/images/hrImg/man.png b/web/client/assets/images/hrImg/man.png new file mode 100644 index 0000000..791bab2 Binary files /dev/null and b/web/client/assets/images/hrImg/man.png differ diff --git a/web/client/assets/images/hrImg/mc.png b/web/client/assets/images/hrImg/mc.png new file mode 100644 index 0000000..e26217e Binary files /dev/null and b/web/client/assets/images/hrImg/mc.png differ diff --git a/web/client/assets/images/hrImg/name.png b/web/client/assets/images/hrImg/name.png new file mode 100644 index 0000000..98532da Binary files /dev/null and b/web/client/assets/images/hrImg/name.png differ diff --git a/web/client/assets/images/hrImg/number.png b/web/client/assets/images/hrImg/number.png new file mode 100644 index 0000000..edea2b9 Binary files /dev/null and b/web/client/assets/images/hrImg/number.png differ diff --git a/web/client/assets/images/hrImg/position.png b/web/client/assets/images/hrImg/position.png new file mode 100644 index 0000000..a93fc5f Binary files /dev/null and b/web/client/assets/images/hrImg/position.png differ diff --git a/web/client/assets/images/hrImg/post.png b/web/client/assets/images/hrImg/post.png new file mode 100644 index 0000000..fd0e1f8 Binary files /dev/null and b/web/client/assets/images/hrImg/post.png differ diff --git a/web/client/assets/images/hrImg/resume.png b/web/client/assets/images/hrImg/resume.png new file mode 100644 index 0000000..974058b Binary files /dev/null and b/web/client/assets/images/hrImg/resume.png differ diff --git a/web/client/assets/images/hrImg/woman.png b/web/client/assets/images/hrImg/woman.png new file mode 100644 index 0000000..08bb1cf Binary files /dev/null and b/web/client/assets/images/hrImg/woman.png differ diff --git a/web/client/assets/images/hrImg/year.png b/web/client/assets/images/hrImg/year.png new file mode 100644 index 0000000..50db588 Binary files /dev/null and b/web/client/assets/images/hrImg/year.png differ diff --git a/web/client/src/app.jsx b/web/client/src/app.jsx index 14ac081..37d0ba7 100644 --- a/web/client/src/app.jsx +++ b/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 ( ) diff --git a/web/client/src/layout/actions/webSocket.js b/web/client/src/layout/actions/webSocket.js index 106186b..e91971e 100644 --- a/web/client/src/layout/actions/webSocket.js +++ b/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({ diff --git a/web/client/src/layout/components/header/index.jsx b/web/client/src/layout/components/header/index.jsx index d338a87..41d7436 100644 --- a/web/client/src/layout/components/header/index.jsx +++ b/web/client/src/layout/components/header/index.jsx @@ -31,22 +31,30 @@ const Header = (props) => { }} header={{ logo: ( - +
+
+ +
+
+ 项企一体化数字应用平台 +
+
+ // ), - text: ( - <> + // text: ( + // <> - {/* */} - - {/* { }} menu={{}} trigger="click" position="bottomRight"> */} - - {/* */} - {/* */} - - ), + // {/* */} + // + // {/* { }} menu={{}} trigger="click" position="bottomRight"> */} + // + // {/* */} + // {/* */} + // + // ), }} footer={ <> @@ -75,7 +83,22 @@ const Header = (props) => { ) } })} - +
+ +
+
{ + dispatch(actions.auth.logout(user)); + if (socket) { + socket.disconnect(); + } + history.push(`/signin`); + }}> + 退出 +
+ + + {/* { -
{ - history.push(`/userCenter`); - }}> -
- -
-
- 用户中心 -
-
-
-
- -
-
- 安全认证 -
-
{ dispatch(actions.auth.logout(user)); @@ -138,13 +142,8 @@ const Header = (props) => { history.push(`/signin`); }}> 退出 - {/* */}
- - {/* collapseButton collapseText */} - - -
+
*/} } /> diff --git a/web/client/src/sections/auth/containers/login.jsx b/web/client/src/sections/auth/containers/login.jsx index 4b81829..531cce9 100644 --- a/web/client/src/sections/auth/containers/login.jsx +++ b/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 ( -
-
- ); + + + ); } 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); \ No newline at end of file diff --git a/web/client/src/sections/auth/style.less b/web/client/src/sections/auth/style.less index e1bc5e1..29f6615 100644 --- a/web/client/src/sections/auth/style.less +++ b/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; } \ No newline at end of file diff --git a/web/client/src/sections/example/containers/example.jsx b/web/client/src/sections/example/containers/example.jsx index 95a36da..63220fe 100644 --- a/web/client/src/sections/example/containers/example.jsx +++ b/web/client/src/sections/example/containers/example.jsx @@ -1,13 +1,11 @@ import React, { useEffect, useState } from 'react'; import { connect } from 'react-redux'; import { Spin, Card, Button } from '@douyinfe/semi-ui'; -import ExportMembersModal from './export-members-modal' import '../style.less' const { Meta } = Card; const Example = (props) => { const { dispatch, actions, user, loading, socket } = props - const [exportModalVs, setExportModalVs] = useState(false); useEffect(() => { // ACTION 示例 // dispatch(actions.example.getMembers(user.orgId)) @@ -55,10 +53,6 @@ const Example = (props) => { > */} - { - exportModalVs ? setExportModalVs(false)} /> : '' - } ) } diff --git a/web/client/src/sections/humanAffairs/actions/index.js b/web/client/src/sections/humanAffairs/actions/index.js new file mode 100644 index 0000000..b996305 --- /dev/null +++ b/web/client/src/sections/humanAffairs/actions/index.js @@ -0,0 +1,6 @@ +'use strict'; + +import * as personnelFiles from './personnelFiles' +export default { + ...personnelFiles, +} \ No newline at end of file diff --git a/web/client/src/sections/humanAffairs/actions/personnelFiles.js b/web/client/src/sections/humanAffairs/actions/personnelFiles.js new file mode 100644 index 0000000..eb926f5 --- /dev/null +++ b/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 } }, + }); +} \ No newline at end of file diff --git a/web/client/src/sections/humanAffairs/components/personnelModal.jsx b/web/client/src/sections/humanAffairs/components/personnelModal.jsx new file mode 100644 index 0000000..a1722af --- /dev/null +++ b/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 ( + <> + +
+
+
{ + // 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)} + > +
+
+ 职务信息 +
+
+
+
+ +
+ 搜索 +
+
+
+
+
+
+ +
+
+ 姓名: +
+
+ 刘昊然 +
+
+
+
+ +
+
+ 员工编号: +
+
+ 0001 +
+
+
+
+ +
+
+ 职位: +
+
+ 产品经理 +
+
+
+
+
+ +
+
+ 所属部门: +
+
+ 行业服务部 +
+
+
+
+
+
+
+ 基本信息 +
+
+
+
+
+ +
+
+ upload +
+
+
+
+ + + 男 + + + 女 + + +
+
+ +
+
+
+
+ {/*
+ + { + pepList.map((item, index) => { + return ( + + {item.name} + + ) + }) + } + +
*/} + {/*
+ + { + peopleList.map((item, index) => { + return ( + + {item.name} + + ) + }) + } + +
*/} +
+
+
+ + ); +} +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); diff --git a/web/client/src/sections/example/containers/export-members-modal.jsx b/web/client/src/sections/humanAffairs/containers/export-members-modal.jsx similarity index 100% rename from web/client/src/sections/example/containers/export-members-modal.jsx rename to web/client/src/sections/humanAffairs/containers/export-members-modal.jsx diff --git a/web/client/src/sections/humanAffairs/containers/index.js b/web/client/src/sections/humanAffairs/containers/index.js new file mode 100644 index 0000000..59a3f85 --- /dev/null +++ b/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 }; \ No newline at end of file diff --git a/web/client/src/sections/humanAffairs/containers/personnelFiles.jsx b/web/client/src/sections/humanAffairs/containers/personnelFiles.jsx new file mode 100644 index 0000000..d8024cf --- /dev/null +++ b/web/client/src/sections/humanAffairs/containers/personnelFiles.jsx @@ -0,0 +1,271 @@ +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 ExportMembersModal from './export-members-modal' +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 [exportModalVs, setExportModalVs] = 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 ( + <> +
+
+
人事管理
+
/
+
档案中心
+
/
+
人员档案
+
+
+
+
+
+
员工档案
+
EMPLOYEE FILE
+
+
+
{ + setPersonnelModal(true); + }}> + 新增档案 +
+
setExportModalVs(true)} style={{ padding: '6px 20px', background: '#00BA85', color: '#FFFFFF', fontSize: 14, cursor: "pointer", marginLeft: 20 }}> + 导入员工信息 +
+
+
+
+
+
+
+
+
员工档案详情
+
EMPLOYEE FILE DETAILS
+
+
+
+
+ +
+
+ } + showClear + placeholder='请输入或选择关键词' + value={seachValue} + style={{ width: 346 }} + onChange={seachValueChange}> + +
+ +
+
+
+
+
+ 当前显示 +
+
+ 11条 +
+
+ 结果 +
+
+
+
+ 人员状态: +
+
+ +
+
+
+ +
+
+ 导出 +
+
+
+
+
+ { + archivesList.map((item, index) => { + return ( +
+
+ +
+
+
+
+ 0012 +
+
+ 行业服务部 +
+ {/*
+ +
*/} +
+
+
+
+ +
+
+ 刘昊然 +
+
+ 请假中 +
+
+
+ 23岁 +
+
+
+
+
+ +
+
+ 男 +
+
+
+ 未婚 +
+
+
+
+
+ +
+
+ 人力资源部副部长 +
+
+
+ 9年经验 +
+
+
+
+
+ +
+
+ 入职3年 +
+
+
+ 本科 +
+
+
+ +
+
+
+ ) + }) + } + +
+
+
+ {//成员弹框 + personnelModal ? + { + setPersonnelModal(false); + }} + close={() => { + setPersonnelModal(false); + // getUserList() + }} > + : '' + } + { + exportModalVs ? setExportModalVs(false)} /> : '' + } + + ) +} + +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); diff --git a/web/client/src/sections/humanAffairs/containers/personnelFilesDetail.jsx b/web/client/src/sections/humanAffairs/containers/personnelFilesDetail.jsx new file mode 100644 index 0000000..eed1147 --- /dev/null +++ b/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 ( + <> +
+
+
人事管理
+
/
+
档案中心
+
/
+
人员档案
+
/
+
档案详情
+
+
+
+
+
+ +
+
+
张小小的个人档案
+
+
+
+ 编辑档案 +
+
+ 删除档案 +
+
+
+
+
+
+ +
+
+
+ {/* 基本信息 */} +
+
+ 基本信息 +
+
+
+
+ 证件号: +
+
+ 3211011290000022 +
+
+
+
+ 联系方式: +
+
+ 13221212211 +
+
+
+
+
+
+
+ 姓名: +
+
+ 刘昊然 +
+
+
+
+ 性别: +
+
+ 男 +
+
+
+
+
+
+ 出生日期: +
+
+ 1998年6月15日 +
+
+
+
+ 政治面貌: +
+
+ 党员 +
+
+
+
+
+
+
+
+ 年龄: +
+
+ 22岁 +
+
+
+
+ 籍贯: +
+
+ 镇江 +
+
+
+
+
+
+ 婚育状态: +
+
+ 已婚已育 +
+
+
+
+ 工作地点: +
+
+ 江西-南昌 +
+
+
+
+
+ {/* 学历信息 */} +
+
+ 学历信息 +
+
+
+
+ 毕业院校: +
+
+ 江苏大学 +
+
+
+
+ 毕业时间: +
+
+ 2022年12月31日 +
+
+
+
+
+
+ 学历: +
+
+ 本科 +
+
+
+
+ 专业: +
+
+ 法学 +
+
+
+
+
+ {/* 职务信息 */} +
+
+ 职务信息 +
+
+
+
+ 员工编号: +
+
+ 0001 +
+
+
+
+ 所属部门: +
+
+ 行业服务部 +
+
+
+
+
+
+ 员工职位: +
+
+ 产品经理 +
+
+
+
+ 入职时间: +
+
+ 0001 +
+
+
+
+ 转试用期时间: +
+
+ 2022年12月31日 +
+
+
+
+ 转正时间: +
+
+ 2022年12月31日 +
+
+
+
+
+
+ 工作经验: +
+
+ 10年 +
+
+
+
+ 入职年限: +
+
+ 10年 +
+
+
+
+ 试用期: +
+
+ 3个月 +
+
+
+
+ +
+
+ 他/她的简历 +
+
+
+
+
+
+
+
+ 他/她的历史工作经历与职务 +
+
+
2017年就职于XX公司,担任总经理职务 +
+
+
+
+
+
+ 基础动作 +
+
+ 时间筛选: +
+
+
+ +
+
+ 加班信息 +
+
+
+
+ +
+
+
+
+
+
+ 加班次数: +
+
+ 25次 +
+
+
+
+ 工作日: +
+
+ 115小时 +
+
+
+
+ 普通假日: +
+
+ 12小时 +
+
+
+
+ 法定假日: +
+
+ 1小时 +
+
+
+
+ 累计加班时长: +
+
+ 436小时 +
+
+
+
+ + + + +
+
+ +
+
+ 请假信息 +
+
+
+
+ +
+
+
+
+
+
+ 请假次数: +
+
+ 25次 +
+
+
+
+ 年休假: +
+
+ 115小时 +
+
+
+
+ 事假: +
+
+ 12小时 +
+
+
+
+ 病假: +
+
+ 1小时 +
+
+
+
+ 剩余年假: +
+
+ 436小时 +
+
+
+
+
+ + + + + + + + ) +} + +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); diff --git a/web/client/src/sections/humanAffairs/index.js b/web/client/src/sections/humanAffairs/index.js new file mode 100644 index 0000000..e011eb7 --- /dev/null +++ b/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 +}; \ No newline at end of file diff --git a/web/client/src/sections/humanAffairs/nav-item.jsx b/web/client/src/sections/humanAffairs/nav-item.jsx new file mode 100644 index 0000000..e2f2869 --- /dev/null +++ b/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: , + items: [ + { + itemKey: 'archivesCenter', + text: '档案中心', + icon: , + to: '/humanAffairs/archivesCenter/personnelFiles', + items: [{ + itemKey: 'personnelFiles', to: '/humanAffairs/archivesCenter/personnelFiles', text: '人员档案' + }] + }, + ] + }, + ] + ); +} \ No newline at end of file diff --git a/web/client/src/sections/humanAffairs/reducers/index.js b/web/client/src/sections/humanAffairs/reducers/index.js new file mode 100644 index 0000000..7ed1088 --- /dev/null +++ b/web/client/src/sections/humanAffairs/reducers/index.js @@ -0,0 +1,5 @@ +'use strict'; + +export default { + +} \ No newline at end of file diff --git a/web/client/src/sections/humanAffairs/routes.js b/web/client/src/sections/humanAffairs/routes.js new file mode 100644 index 0000000..9fb9882 --- /dev/null +++ b/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 + } +}]; \ No newline at end of file diff --git a/web/client/src/sections/humanAffairs/style.less b/web/client/src/sections/humanAffairs/style.less new file mode 100644 index 0000000..e69de29 diff --git a/web/client/src/utils/webapi.js b/web/client/src/utils/webapi.js index 7ed808c..e49acad 100644 --- a/web/client/src/utils/webapi.js +++ b/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 = { diff --git a/web/routes/attachment/index.js b/web/routes/attachment/index.js index d1621e0..8ba1021 100644 --- a/web/routes/attachment/index.js +++ b/web/routes/attachment/index.js @@ -51,7 +51,9 @@ module.exports = { let upload = async function (ctx, next) { try { + console.log('-------------'); const { token } = ctx.request.query + console.log(token); if (token) { const { files } = await parse(ctx.req) const file = files[0]