23 changed files with 1571 additions and 677 deletions
@ -0,0 +1,141 @@ |
|||||
|
'use strict'; |
||||
|
const moment = require('moment') |
||||
|
|
||||
|
async function overtimeStatistic (ctx) { |
||||
|
try { |
||||
|
const { models } = ctx.fs.dc; |
||||
|
const { clickHouse } = ctx.app.fs |
||||
|
const { memberList, packageUserData, overtimeStatisticListDayType } = ctx.app.fs.utils |
||||
|
const { |
||||
|
keywordTarget, keyword, limit, page, orderBy, orderDirection, |
||||
|
startDate, endDate, |
||||
|
} = ctx.query |
||||
|
|
||||
|
const userRes = await memberList({ |
||||
|
keywordTarget, keyword, limit, page, |
||||
|
orderBy, orderDirection, |
||||
|
overtimeDayStatisticStartDate: startDate, |
||||
|
overtimeDayStatisticendDate: endDate, |
||||
|
overtimeCountStatistic: true, |
||||
|
overtimeCountStatisticStartDate: startDate, |
||||
|
overtimeCountStatisticendDate: endDate, |
||||
|
}) |
||||
|
|
||||
|
let { packageUser: returnD, pepUserIds } = await packageUserData(userRes) |
||||
|
|
||||
|
const sumRes = await overtimeStatisticListDayType({ |
||||
|
startDate, endDate, pepUserIds |
||||
|
}) |
||||
|
|
||||
|
returnD.forEach(u => { |
||||
|
u.overtimeStatistic = sumRes.filter(s => s.pepUserId == u.pepUserId) |
||||
|
}) |
||||
|
ctx.status = 200; |
||||
|
ctx.body = { |
||||
|
count: userRes.count, |
||||
|
rows: returnD |
||||
|
} |
||||
|
} catch (error) { |
||||
|
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); |
||||
|
ctx.status = 400; |
||||
|
ctx.body = { |
||||
|
message: typeof error == 'string' ? error : undefined |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
async function exportOvertimeStatistic (ctx) { |
||||
|
try { |
||||
|
const { models } = ctx.fs.dc; |
||||
|
const { clickHouse } = ctx.app.fs |
||||
|
const { memberList, packageUserData, overtimeStatisticListDayType } = ctx.app.fs.utils |
||||
|
const { |
||||
|
keywordTarget, keyword, limit, page, orderBy, orderDirection, |
||||
|
startDate, endDate, |
||||
|
} = ctx.query |
||||
|
|
||||
|
const userRes = await memberList({ |
||||
|
keywordTarget, keyword, limit, page, |
||||
|
orderBy, orderDirection, |
||||
|
overtimeDayStatisticStartDate: startDate, |
||||
|
overtimeDayStatisticendDate: endDate, |
||||
|
overtimeCountStatistic: true, |
||||
|
overtimeCountStatisticStartDate: startDate, |
||||
|
overtimeCountStatisticendDate: endDate, |
||||
|
}) |
||||
|
|
||||
|
let { packageUser: returnD, pepUserIds } = await packageUserData(userRes) |
||||
|
|
||||
|
const sumRes = await overtimeStatisticListDayType({ |
||||
|
startDate, endDate, pepUserIds |
||||
|
}) |
||||
|
|
||||
|
returnD.forEach(u => { |
||||
|
u.overtimeStatistic = sumRes.filter(s => s.pepUserId == u.pepUserId) |
||||
|
}) |
||||
|
|
||||
|
const fileName = `人员信息_${moment().format('YYYYMMDDHHmmss')}` + '.csv' |
||||
|
const filePath = await simpleExcelDown({ data: exportD, header, fileName: fileName }) |
||||
|
const fileData = fs.readFileSync(filePath); |
||||
|
|
||||
|
ctx.status = 200; |
||||
|
ctx.set('Content-Type', 'application/x-xls'); |
||||
|
ctx.set('Content-disposition', 'attachment; filename=' + encodeURI(fileName)); |
||||
|
ctx.body = fileData; |
||||
|
} catch (error) { |
||||
|
ctx.fs.logger.error(`path: ${ctx.path}, error: error`); |
||||
|
ctx.status = 400; |
||||
|
ctx.body = { |
||||
|
message: typeof error == 'string' ? error : undefined |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
async function vacateStatistic (ctx) { |
||||
|
try { |
||||
|
const { models } = ctx.fs.dc; |
||||
|
const { clickHouse } = ctx.app.fs |
||||
|
const { judgeHoliday, memberList, packageUserData, vacateStatisticListDayType } = ctx.app.fs.utils |
||||
|
const { |
||||
|
keywordTarget, keyword, limit, page, orderBy, orderDirection, |
||||
|
startDate, endDate, |
||||
|
} = ctx.query |
||||
|
|
||||
|
const userRes = await memberList({ |
||||
|
keywordTarget, keyword, limit, page, |
||||
|
orderBy, orderDirection, |
||||
|
vacateDayStatisticStartDate: startDate, |
||||
|
vacateDayStatisticendDate: endDate, |
||||
|
vacateDurationStatistic: true, |
||||
|
vacateCountStatistic: true, |
||||
|
vacateCountStatisticStartDate: startDate, |
||||
|
vacateCountStatisticendDate: endDate, |
||||
|
}) |
||||
|
|
||||
|
let { packageUser: returnD, pepUserIds } = await packageUserData(userRes) |
||||
|
|
||||
|
const sumRes = await vacateStatisticListDayType({ |
||||
|
startDate, endDate, pepUserIds |
||||
|
}) |
||||
|
|
||||
|
returnD.forEach(u => { |
||||
|
u.vacateStatistic = sumRes.filter(s => s.pepUserId == u.pepUserId) |
||||
|
}) |
||||
|
ctx.status = 200; |
||||
|
ctx.body = { |
||||
|
count: userRes.count, |
||||
|
rows: returnD |
||||
|
} |
||||
|
} catch (error) { |
||||
|
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); |
||||
|
ctx.status = 400; |
||||
|
ctx.body = { |
||||
|
message: typeof error == 'string' ? error : undefined |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = { |
||||
|
overtimeStatistic, |
||||
|
vacateStatistic, |
||||
|
}; |
@ -0,0 +1,11 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
const attendance = require('../../controllers/attendance'); |
||||
|
|
||||
|
module.exports = function (app, router, opts) { |
||||
|
app.fs.api.logAttr['GET/attendance/overtime'] = { content: '加班统计', visible: true }; |
||||
|
router.get('/attendance/overtime', attendance.overtimeStatistic); |
||||
|
|
||||
|
app.fs.api.logAttr['GET/attendance/vacate'] = { content: '请假统计', visible: true }; |
||||
|
router.get('/attendance/vacate', attendance.vacateStatistic); |
||||
|
}; |
@ -0,0 +1,68 @@ |
|||||
|
'use strict'; |
||||
|
const moment = require('moment') |
||||
|
const request = require('superagent'); |
||||
|
|
||||
|
module.exports = function (app, opts) { |
||||
|
|
||||
|
async function overtimeStatisticListDayType ({ |
||||
|
startDate, endDate, pepUserIds = [] |
||||
|
}) { |
||||
|
const { clickHouse } = app.fs |
||||
|
|
||||
|
const sumRes = await clickHouse.hr.query(` |
||||
|
SELECT |
||||
|
overtime.pep_user_id AS pepUserId, |
||||
|
holiday.type AS dayType, |
||||
|
overtime.compensate AS compensate, |
||||
|
sum(overtime_day.duration) AS duration |
||||
|
FROM overtime_day |
||||
|
INNER JOIN overtime |
||||
|
ON overtime.id = overtime_day.overtime_id |
||||
|
AND overtime.pep_user_id IN (${pepUserIds.join(',')}) |
||||
|
LEFT JOIN holiday |
||||
|
ON holiday.day = overtime_day.day |
||||
|
WHERE overtime.pep_user_id IN (${pepUserIds.join(',')}) |
||||
|
${startDate ? ` |
||||
|
AND overtime_day.day >= '${moment(startDate).format('YYYY-MM-DD')}' |
||||
|
`: ''}
|
||||
|
${endDate ? ` |
||||
|
AND overtime_day.day <= '${moment(endDate).format('YYYY-MM-DD')}' |
||||
|
` : ''}
|
||||
|
GROUP BY holiday.type, overtime.compensate, overtime.pep_user_id |
||||
|
`).toPromise()
|
||||
|
|
||||
|
return sumRes |
||||
|
} |
||||
|
|
||||
|
async function vacateStatisticListDayType ({ |
||||
|
startDate, endDate, pepUserIds = [] |
||||
|
}) { |
||||
|
const { clickHouse } = app.fs |
||||
|
|
||||
|
const sumRes = await clickHouse.hr.query(` |
||||
|
SELECT |
||||
|
vacate.pep_user_id AS pepUserId, |
||||
|
vacate.type AS type, |
||||
|
sum(vacate_day.duration) AS duration |
||||
|
FROM vacate_day |
||||
|
INNER JOIN vacate |
||||
|
ON vacate.id = vacate_day.vacate_id |
||||
|
AND vacate.pep_user_id IN (${pepUserIds.join(',')}) |
||||
|
WHERE vacate.pep_user_id IN (${pepUserIds.join(',')}) |
||||
|
${startDate ? ` |
||||
|
AND vacate_day.day >= '${moment(startDate).format('YYYY-MM-DD')}' |
||||
|
`: ''}
|
||||
|
${endDate ? ` |
||||
|
AND vacate_day.day <= '${moment(endDate).format('YYYY-MM-DD')}' |
||||
|
` : ''}
|
||||
|
GROUP BY vacate.type, vacate.pep_user_id |
||||
|
`).toPromise()
|
||||
|
|
||||
|
return sumRes |
||||
|
} |
||||
|
|
||||
|
return { |
||||
|
overtimeStatisticListDayType, |
||||
|
vacateStatisticListDayType, |
||||
|
} |
||||
|
} |
After Width: | Height: | Size: 554 B |
After Width: | Height: | Size: 838 B |
After Width: | Height: | Size: 2.0 KiB |
@ -0,0 +1,26 @@ |
|||||
|
'use strict'; |
||||
|
|
||||
|
import { ApiTable, basicAction } from '$utils' |
||||
|
|
||||
|
export function getMemberNativePlace(query) {//查询籍贯列表
|
||||
|
return (dispatch) => basicAction({ |
||||
|
type: "get", |
||||
|
dispatch: dispatch, |
||||
|
actionType: "GET_MemberNativePlace", |
||||
|
query: query, |
||||
|
url: `${ApiTable.getMemberNativePlace}`, |
||||
|
msg: { option: "查询籍贯列表" }, |
||||
|
reducer: { name: "MemberNativePlace", params: { noClear: true } }, |
||||
|
}); |
||||
|
} |
||||
|
export function getMemberWorkPlace(query) {//查询工作地列表
|
||||
|
return (dispatch) => basicAction({ |
||||
|
type: "get", |
||||
|
dispatch: dispatch, |
||||
|
actionType: "GET_MemberWorkPlace", |
||||
|
query: query, |
||||
|
url: `${ApiTable.getMemberWorkPlace}`, |
||||
|
msg: { option: "查询工作地列表" }, |
||||
|
reducer: { name: "MemberWorkPlace", params: { noClear: true } }, |
||||
|
}); |
||||
|
} |
@ -1,6 +1,9 @@ |
|||||
'use strict'; |
'use strict'; |
||||
|
|
||||
import * as personnelFiles from './personnelFiles' |
import * as personnelFiles from './personnelFiles' |
||||
|
import * as employeeInformation from './employeeInformation' |
||||
|
|
||||
export default { |
export default { |
||||
...personnelFiles, |
...personnelFiles, |
||||
|
...employeeInformation |
||||
} |
} |
@ -0,0 +1,432 @@ |
|||||
|
import React, { useEffect, useState, useRef } from 'react'; |
||||
|
import { connect } from 'react-redux'; |
||||
|
import { Table, Button, Pagination, Skeleton, Form, Tooltip } from '@douyinfe/semi-ui'; |
||||
|
import { IconSearch } from '@douyinfe/semi-icons'; |
||||
|
import { SkeletonScreen } from "$components"; |
||||
|
import '../style.less' |
||||
|
import { Setup } from "$components"; |
||||
|
import moment from 'moment' |
||||
|
import { set } from 'nprogress'; |
||||
|
|
||||
|
const employeeInformation = (props) => { |
||||
|
const { dispatch, actions, history, user, loading, socket, xqMembers } = props |
||||
|
|
||||
|
const { humanAffairs } = actions; |
||||
|
|
||||
|
const form = useRef();//表单 |
||||
|
let [archivesList, setArchivesList] = useState([]);//人员列表 |
||||
|
let [workPlaceList, setWorkPlaceList] = useState([]);//工作地点 |
||||
|
let [nativeList, setNativeList] = useState([]);//户籍地 |
||||
|
|
||||
|
const [setup, setSetup] = useState(false);//表格设置是否显现 |
||||
|
const [setupp, setSetupp] = useState([]);//实际显示的表格列表 |
||||
|
const [query, setQuery] = useState({ limit: 10, page: 0 }); //页码信息 |
||||
|
const [limits, setLimits] = useState()//每页实际条数 |
||||
|
|
||||
|
const EMPLOYEEINFORMATION = "employeeInformation"; |
||||
|
const tableList = [//表格属性 |
||||
|
{ |
||||
|
title: '基础信息', |
||||
|
list: [ |
||||
|
{ name: "员工编号", value: "userCode" }, |
||||
|
{ name: "姓名", value: "userName" }, |
||||
|
{ name: "所属部门", value: "departmrnt" }, |
||||
|
// { name: "监听设备数量", value: "monitorCount" }, |
||||
|
// { name: "累计推送次数", value: "logCount" }, |
||||
|
] |
||||
|
} |
||||
|
]; |
||||
|
useEffect(() => { |
||||
|
getMemberNativePlaceList()//查询籍贯列表 |
||||
|
getMemberWorkPlaceList()//查询工作地列表 |
||||
|
getMemberSearchList()//查询人员列表 |
||||
|
attribute(); |
||||
|
localStorage.getItem(EMPLOYEEINFORMATION) == null |
||||
|
? localStorage.setItem( |
||||
|
EMPLOYEEINFORMATION, |
||||
|
JSON.stringify(['userCode', 'userName', 'departmrnt']) |
||||
|
) |
||||
|
: ""; |
||||
|
}, []) |
||||
|
|
||||
|
function getMemberSearchList () {//查询人员列表 |
||||
|
let obj = form.current.getValues() |
||||
|
if (form.current.getValues().entryTime?.length > 1) { |
||||
|
obj.hiredateStart = moment(form.current.getValues().entryTime[0]).format('YYYY-MM-DD') |
||||
|
obj.hiredateEnd = moment(form.current.getValues().entryTime[1]).format('YYYY-MM-DD') |
||||
|
} |
||||
|
else { |
||||
|
obj.hiredateStart = '' |
||||
|
obj.hiredateEnd = '' |
||||
|
} |
||||
|
setQuery({ limit: 10, page: 0 }) |
||||
|
dispatch(humanAffairs.getMemberList({ ...obj, ...query })).then((res) => {//查询人员列表 |
||||
|
if (res.success) { |
||||
|
setArchivesList(res.payload?.data?.rows) |
||||
|
setLimits(res.payload?.data?.count) |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
function getMemberNativePlaceList () { |
||||
|
dispatch(humanAffairs.getMemberNativePlace()).then((res) => {//查询籍贯列表 |
||||
|
if (res.success) { |
||||
|
setNativeList(res.payload?.data) |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
function getMemberWorkPlaceList () { |
||||
|
dispatch(humanAffairs.getMemberWorkPlace()).then((res) => {//查询工作地列表 |
||||
|
if (res.success) { |
||||
|
setWorkPlaceList(res.payload?.data) |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
const columns = []; |
||||
|
//获取表格属性设置 |
||||
|
function attribute () { |
||||
|
const arr = localStorage.getItem(EMPLOYEEINFORMATION) |
||||
|
? JSON.parse(localStorage.getItem(EMPLOYEEINFORMATION)) |
||||
|
: []; |
||||
|
|
||||
|
const column = [ |
||||
|
{ |
||||
|
title: ( |
||||
|
<div> |
||||
|
<img src="/assets/images/hrImg/V.png" alt="" style={{ width: 14, height: 14 }} /> 员工编号 |
||||
|
</div> |
||||
|
), |
||||
|
dataIndex: "userCode", |
||||
|
key: "userCode", |
||||
|
render: (_, r, index) => { |
||||
|
return r.userCode; |
||||
|
}, |
||||
|
}, { |
||||
|
title: ( |
||||
|
<div> |
||||
|
<img src="/assets/images/hrImg/V.png" alt="" style={{ width: 14, height: 14 }} /> 姓名 |
||||
|
</div> |
||||
|
), |
||||
|
dataIndex: "userName", |
||||
|
key: "userName", |
||||
|
render: (_, r, index) => { |
||||
|
return r.userName; |
||||
|
}, |
||||
|
}, { |
||||
|
title: ( |
||||
|
<div> |
||||
|
<img src="/assets/images/hrImg/V.png" alt="" style={{ width: 14, height: 14 }} /> 所属部门 |
||||
|
</div> |
||||
|
), |
||||
|
dataIndex: "departmrnt", |
||||
|
key: "departmrnt", |
||||
|
render: (_, r, index) => { |
||||
|
return ( |
||||
|
<div> |
||||
|
{ |
||||
|
r.departmrnt.map((ite, idx) => { |
||||
|
let departmentsArr = [] |
||||
|
for (let i = 0; i < r.departmrnt.length; i++) { |
||||
|
departmentsArr.push(r.departmrnt[i].name) |
||||
|
} |
||||
|
return ( |
||||
|
<div key={idx} style={{ display: 'flex' }}> |
||||
|
{idx == 0 ? |
||||
|
(<div style={{ padding: '0px 4px 1px 4px ', color: '#FFFFFF', fontSize: 12, background: 'rgba(0,90,189,0.8)', borderRadius: 2, marginRight: 4 }}> |
||||
|
{ite.name} |
||||
|
</div>) : ('') |
||||
|
|
||||
|
} |
||||
|
{ |
||||
|
r.departmrnt.length > 1 && idx == 1 ? ( |
||||
|
<Tooltip content={departmentsArr.join(',')} trigger="click" style={{ lineHeight: 2 }}> |
||||
|
<div style={{ padding: '0px 4px 1px 4px ', color: '#FFFFFF', fontSize: 12, background: 'rgba(0,90,189,0.8)', borderRadius: 2, marginRight: 4, cursor: "pointer", }}> |
||||
|
... |
||||
|
</div> |
||||
|
</Tooltip> |
||||
|
) : ('') |
||||
|
} |
||||
|
</div> |
||||
|
) |
||||
|
}) |
||||
|
} |
||||
|
</div> |
||||
|
) |
||||
|
}, |
||||
|
}, |
||||
|
// { |
||||
|
// title: "创建时间", |
||||
|
// dataIndex: "logCount", |
||||
|
// key: "logCount", |
||||
|
// render: (_, r, index) => { |
||||
|
// return (r.logCount + '次') |
||||
|
// }, |
||||
|
// }, |
||||
|
// { |
||||
|
// title: "接收人", |
||||
|
// dataIndex: "monitorCount", |
||||
|
// key: "monitorCount", |
||||
|
// render: (_, r, index) => { |
||||
|
// return r.monitorCount |
||||
|
// }, |
||||
|
// }, |
||||
|
// { |
||||
|
// title: "监听问题", |
||||
|
// dataIndex: "pushWay", |
||||
|
// key: "pushWay", |
||||
|
// render: (_, r, index) => { |
||||
|
// return r.pushWay == 'email' ? '邮件通知' : '短信通知'; |
||||
|
// }, |
||||
|
// }, |
||||
|
// { |
||||
|
// title: "通知时效", |
||||
|
// dataIndex: "text1", |
||||
|
// key: "text1", |
||||
|
// render: (_, r, index) => { |
||||
|
// return r.text1 |
||||
|
// }, |
||||
|
// }, |
||||
|
// { |
||||
|
// title: "启用状态", |
||||
|
// dataIndex: "text2", |
||||
|
// key: "text2", |
||||
|
// render: (_, r, index) => { |
||||
|
// return r.text2 |
||||
|
// }, |
||||
|
// }, |
||||
|
// { |
||||
|
// title: "推送次数", |
||||
|
// dataIndex: "time", |
||||
|
// key: "time", |
||||
|
// render: (_, r, index) => { |
||||
|
// return r.time |
||||
|
// }, |
||||
|
// }, |
||||
|
]; |
||||
|
for (let i = 0; i < arr.length; i++) { |
||||
|
let colum = column.filter((item) => { |
||||
|
return item.key === arr[i]; |
||||
|
}); |
||||
|
columns.splice(i + 2, 0, colum[0]); |
||||
|
} |
||||
|
setSetupp(columns); |
||||
|
} |
||||
|
function handleRow (record, index) {//斑马条纹 |
||||
|
// 给偶数行设置斑马纹 |
||||
|
if (index % 2 === 0) { |
||||
|
return { |
||||
|
style: { |
||||
|
background: '#FAFCFF', |
||||
|
} |
||||
|
}; |
||||
|
} else { |
||||
|
return {}; |
||||
|
} |
||||
|
} |
||||
|
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 INFORMATION</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div style={{ marginRight: 20, marginTop: 18 }}> |
||||
|
<Form |
||||
|
labelPosition="left" |
||||
|
labelAlign="right" |
||||
|
labelWidth="80px" |
||||
|
onValueChange={(values, field) => { |
||||
|
console.log('values', values); |
||||
|
}} |
||||
|
getFormApi={(formApi) => (form.current = formApi)} |
||||
|
> |
||||
|
<div> |
||||
|
<div style={{ display: 'flex', alignItems: 'center' }}> |
||||
|
<Form.Select |
||||
|
pure |
||||
|
field="keywordTarget" |
||||
|
placeholder="请选择搜索类型" |
||||
|
style={{ width: 200 }} |
||||
|
showClear |
||||
|
> |
||||
|
<Form.Select.Option value='role'>职位</Form.Select.Option> |
||||
|
<Form.Select.Option value='dep'>部门</Form.Select.Option> |
||||
|
<Form.Select.Option value='number'>编号</Form.Select.Option> |
||||
|
<Form.Select.Option value='name'>姓名</Form.Select.Option> |
||||
|
</Form.Select> |
||||
|
<Form.Input |
||||
|
suffix={<IconSearch />} |
||||
|
field="keyword" |
||||
|
pure |
||||
|
showClear |
||||
|
style={{ width: 346, marginLeft: 12, marginRight: 12 }} |
||||
|
placeholder="请输入或选择关键词" |
||||
|
/> |
||||
|
|
||||
|
<Form.DatePicker |
||||
|
label='入职时间:' |
||||
|
field='entryTime' type="dateRange" density="compact" showClear style={{ width: 370, color: "#F9F9F9" }} /> |
||||
|
</div> |
||||
|
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}> |
||||
|
<div style={{ display: 'flex', alignItems: 'center' }}> |
||||
|
<Form.Select |
||||
|
label="婚育状态:" |
||||
|
field="marital" |
||||
|
labelPosition="left" |
||||
|
placeholder="全部" |
||||
|
style={{ width: 246, marginRight: 20, color: "#F9F9F9", }} |
||||
|
showClear |
||||
|
> |
||||
|
<Form.Select.Option value=''> |
||||
|
全部 |
||||
|
</Form.Select.Option> |
||||
|
<Form.Select.Option value='已婚已育'> |
||||
|
已婚已育 |
||||
|
</Form.Select.Option> |
||||
|
<Form.Select.Option value='已婚'> |
||||
|
已婚 |
||||
|
</Form.Select.Option> |
||||
|
<Form.Select.Option value='未婚'> |
||||
|
未婚 |
||||
|
</Form.Select.Option> |
||||
|
</Form.Select> |
||||
|
<Form.Select |
||||
|
label='户籍地:' |
||||
|
labelPosition="left" |
||||
|
field='native' |
||||
|
style={{ width: 246, marginRight: 20, color: "#F9F9F9", }} |
||||
|
placeholder="全部" |
||||
|
showClear |
||||
|
> |
||||
|
{nativeList.map((item) => { |
||||
|
return ( |
||||
|
<Form.Select.Option key={item.nativePlace} value={item.nativePlace}> |
||||
|
{item.nativePlace} |
||||
|
</Form.Select.Option> |
||||
|
); |
||||
|
})} |
||||
|
</Form.Select> |
||||
|
<Form.Select |
||||
|
label='工作地点:' |
||||
|
labelPosition="left" |
||||
|
field='workPlace' |
||||
|
style={{ width: 246, marginRight: 20, color: "#F9F9F9", }} |
||||
|
placeholder="全部" |
||||
|
showClear |
||||
|
> |
||||
|
{workPlaceList.map((item) => { |
||||
|
return ( |
||||
|
<Form.Select.Option key={item.workPlace} value={item.workPlace}> |
||||
|
{item.workPlace} |
||||
|
</Form.Select.Option> |
||||
|
); |
||||
|
})} |
||||
|
</Form.Select> |
||||
|
</div> |
||||
|
<div style={{ display: 'flex', alignItems: 'center' }}> |
||||
|
<img src="/assets/images/hrImg/export.png" alt="" style={{ width: 20, height: 20, cursor: "pointer", marginRight: 15 }} |
||||
|
// onClick={() => setSetup(true)} |
||||
|
/> |
||||
|
<img src="/assets/images/hrImg/setup.png" alt="" style={{ width: 20, height: 20, cursor: "pointer", marginRight: 15 }} |
||||
|
onClick={() => setSetup(true)} |
||||
|
/> |
||||
|
<Button theme='solid' type='primary' style={{ width: 80, borderRadius: 2, height: 32, background: '#DBECFF', color: '#005ABD' }} |
||||
|
onClick={() => { |
||||
|
getMemberSearchList() |
||||
|
}}>查询</Button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</Form> |
||||
|
<div style={{ border: '1px solid #C7E1FF', background: '#F4F8FF', borderRadius: 2, height: 32, width: 669, padding: '8px 0px 7px 12px', display: 'flex', alignItems: 'center', color: '#0F7EFB', fontSize: 12 }}> |
||||
|
<img src="/assets/images/hrImg/!.png" alt="" style={{ width: 14, height: 14, marginRight: 8 }} /> |
||||
|
表格中带有认证标识" |
||||
|
<img src="/assets/images/hrImg/V.png" alt="" style={{ width: 14, height: 14 }} /> |
||||
|
"信息的为系统基础数据,来源于项企PEP、钉钉等系统,其他数据均为导入或自定义数据 |
||||
|
</div> |
||||
|
<div style={{ marginTop: 20 }}> |
||||
|
<Skeleton |
||||
|
// loading={loading} |
||||
|
loading={false} |
||||
|
active={true} |
||||
|
placeholder={SkeletonScreen()} |
||||
|
> |
||||
|
<Table |
||||
|
columns={setupp.filter((s) => s)} |
||||
|
dataSource={archivesList} |
||||
|
bordered={false} |
||||
|
empty="暂无数据" |
||||
|
pagination={false} |
||||
|
onRow={handleRow} |
||||
|
/> |
||||
|
</Skeleton> |
||||
|
<div |
||||
|
style={{ |
||||
|
display: "flex", |
||||
|
justifyContent: "space-between", |
||||
|
padding: "20px 20px", |
||||
|
}} |
||||
|
> |
||||
|
<div> |
||||
|
</div> |
||||
|
<div style={{ display: 'flex', }}> |
||||
|
<span style={{ lineHeight: "30px", fontSize: 13, color: 'rgba(0,90,189,0.8)' }}> |
||||
|
共{limits}条信息 |
||||
|
</span> |
||||
|
<Pagination |
||||
|
className="22" |
||||
|
total={limits} |
||||
|
showSizeChanger |
||||
|
currentPage={query.page + 1} |
||||
|
pageSizeOpts={[10, 20, 30, 40]} |
||||
|
onChange={(currentPage, pageSize) => { |
||||
|
setQuery({ limit: pageSize, page: currentPage - 1 }); |
||||
|
page.current = currentPage - 1 |
||||
|
}} |
||||
|
/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
{setup ? ( |
||||
|
<Setup |
||||
|
tableType={EMPLOYEEINFORMATION} |
||||
|
tableList={tableList} |
||||
|
length={25} |
||||
|
close={() => { |
||||
|
setSetup(false); |
||||
|
attribute(); |
||||
|
// setcameraSetup(false); |
||||
|
}} |
||||
|
/> |
||||
|
) : ( |
||||
|
"" |
||||
|
)} |
||||
|
</> |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
function mapStateToProps (state) { |
||||
|
const { auth, global, MemberSearch, webSocket } = state; |
||||
|
return { |
||||
|
// loading: members.isRequesting, |
||||
|
user: auth.user, |
||||
|
actions: global.actions, |
||||
|
xqMembers: MemberSearch.data, |
||||
|
// socket: webSocket.socket |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
export default connect(mapStateToProps)(employeeInformation); |
@ -0,0 +1,9 @@ |
|||||
|
.semi-table{ |
||||
|
.semi-table-row:first-child{ |
||||
|
.semi-table-row-head{ |
||||
|
background: #F2F3F5; |
||||
|
color: #4A4A4A; |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue