|
@ -1,5 +1,6 @@ |
|
|
'use strict'; |
|
|
'use strict'; |
|
|
const moment = require('moment') |
|
|
const moment = require('moment') |
|
|
|
|
|
const fs = require('fs'); |
|
|
|
|
|
|
|
|
async function overtimeStatistic (ctx) { |
|
|
async function overtimeStatistic (ctx) { |
|
|
try { |
|
|
try { |
|
@ -48,7 +49,7 @@ async function exportOvertimeStatistic (ctx) { |
|
|
try { |
|
|
try { |
|
|
const { models } = ctx.fs.dc; |
|
|
const { models } = ctx.fs.dc; |
|
|
const { clickHouse } = ctx.app.fs |
|
|
const { clickHouse } = ctx.app.fs |
|
|
const { memberList, packageUserData, overtimeStatisticListDayType } = ctx.app.fs.utils |
|
|
const { memberList, packageUserData, overtimeStatisticListDayType, simpleExcelDown, dayType, overtimeType } = ctx.app.fs.utils |
|
|
const { |
|
|
const { |
|
|
keywordTarget, keyword, limit, page, orderBy, orderDirection, |
|
|
keywordTarget, keyword, limit, page, orderBy, orderDirection, |
|
|
startDate, endDate, |
|
|
startDate, endDate, |
|
@ -70,12 +71,67 @@ async function exportOvertimeStatistic (ctx) { |
|
|
startDate, endDate, pepUserIds |
|
|
startDate, endDate, pepUserIds |
|
|
}) |
|
|
}) |
|
|
|
|
|
|
|
|
returnD.forEach(u => { |
|
|
returnD.forEach(d => { |
|
|
u.overtimeStatistic = sumRes.filter(s => s.pepUserId == u.pepUserId) |
|
|
d.departmrnt = d.departmrnt.map(dep => dep.name).join('、') |
|
|
|
|
|
d.role = d.role.map(r => r.name).join('、') |
|
|
|
|
|
let overtimeStatistic = sumRes.filter(s => s.pepUserId == d.pepUserId) |
|
|
|
|
|
for (let dayTypeKey in dayType) { |
|
|
|
|
|
for (let overtimeTypeKey in overtimeType) { |
|
|
|
|
|
let corOverTimeSta = overtimeStatistic.find(o => o.compensate == overtimeTypeKey && o.dayType == dayTypeKey) |
|
|
|
|
|
if (corOverTimeSta) { |
|
|
|
|
|
d[overtimeTypeKey + dayTypeKey] = (corOverTimeSta.duration / 3600) |
|
|
|
|
|
// .toFixed(1)
|
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
for (let overtimeTypeKey in overtimeType) { |
|
|
|
|
|
d['sum' + overtimeTypeKey] = overtimeStatistic.reduce((sum, o) => { |
|
|
|
|
|
if (o.compensate == overtimeTypeKey) { |
|
|
|
|
|
sum += o.duration / 3600 |
|
|
|
|
|
} |
|
|
|
|
|
return sum |
|
|
|
|
|
}, 0) |
|
|
|
|
|
} |
|
|
}) |
|
|
}) |
|
|
|
|
|
|
|
|
const fileName = `人员信息_${moment().format('YYYYMMDDHHmmss')}` + '.csv' |
|
|
let overtimeTypeHeader = [] |
|
|
const filePath = await simpleExcelDown({ data: exportD, header, fileName: fileName }) |
|
|
let sumOvertimeTypeHeader = [] |
|
|
|
|
|
for (let overtimeTypeKey in overtimeType) { |
|
|
|
|
|
sumOvertimeTypeHeader.push({ |
|
|
|
|
|
title: `合计${overtimeType[overtimeTypeKey]}加班时长(小时)`, |
|
|
|
|
|
key: 'sum' + overtimeTypeKey, |
|
|
|
|
|
defaultValue: 0 |
|
|
|
|
|
}) |
|
|
|
|
|
for (let dayTypeKey in dayType) { |
|
|
|
|
|
overtimeTypeHeader.push({ |
|
|
|
|
|
title: dayType[dayTypeKey] + '-' + overtimeType[overtimeTypeKey], |
|
|
|
|
|
key: overtimeTypeKey + dayTypeKey, |
|
|
|
|
|
defaultValue: 0 |
|
|
|
|
|
}) |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const header = [{ |
|
|
|
|
|
title: '员工编号', |
|
|
|
|
|
key: 'userCode', |
|
|
|
|
|
}, { |
|
|
|
|
|
title: '姓名', |
|
|
|
|
|
key: 'userName', |
|
|
|
|
|
}, { |
|
|
|
|
|
title: '所属部门', |
|
|
|
|
|
key: 'departmrnt', |
|
|
|
|
|
}, { |
|
|
|
|
|
title: '职位', |
|
|
|
|
|
key: 'role', |
|
|
|
|
|
}, { |
|
|
|
|
|
title: '加班次数(次)', |
|
|
|
|
|
key: 'overtimeCount', |
|
|
|
|
|
},] |
|
|
|
|
|
.concat(overtimeTypeHeader) |
|
|
|
|
|
.concat(sumOvertimeTypeHeader) |
|
|
|
|
|
|
|
|
|
|
|
const fileName = `加班统计_${startDate ? moment(startDate).format('YYYY-MM-DD') : ''}-${endDate ? moment(endDate).format('YYYY-MM-DD') : ''}_${moment().format('YYYYMMDDHHmmss')}` + '.csv' |
|
|
|
|
|
const filePath = await simpleExcelDown({ data: returnD, header, fileName: fileName }) |
|
|
const fileData = fs.readFileSync(filePath); |
|
|
const fileData = fs.readFileSync(filePath); |
|
|
|
|
|
|
|
|
ctx.status = 200; |
|
|
ctx.status = 200; |
|
@ -135,7 +191,84 @@ async function vacateStatistic (ctx) { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async function exportVacateStatistic (ctx) { |
|
|
|
|
|
try { |
|
|
|
|
|
const { models } = ctx.fs.dc; |
|
|
|
|
|
const { clickHouse } = ctx.app.fs |
|
|
|
|
|
const { memberList, packageUserData, vacateStatisticListDayType, overtimeStatisticListDayType, simpleExcelDown, dayType, overtimeType } = ctx.app.fs.utils |
|
|
|
|
|
const { |
|
|
|
|
|
keywordTarget, keyword, limit, page, orderBy, orderDirection, |
|
|
|
|
|
startDate, endDate, |
|
|
|
|
|
} = ctx.query |
|
|
|
|
|
|
|
|
|
|
|
const vacateTypeRes = await clickHouse.hr.query(` |
|
|
|
|
|
SELECT type FROM vacate GROUP BY type |
|
|
|
|
|
`).toPromise()
|
|
|
|
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
u.vacateDayStatisticDuration = (u.vacateDayStatisticDuration) || 0 / 3600 |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
const header = [{ |
|
|
|
|
|
title: '员工编号', |
|
|
|
|
|
key: 'userCode', |
|
|
|
|
|
}, { |
|
|
|
|
|
title: '姓名', |
|
|
|
|
|
key: 'userName', |
|
|
|
|
|
}, { |
|
|
|
|
|
title: '所属部门', |
|
|
|
|
|
key: 'departmrnt', |
|
|
|
|
|
}, { |
|
|
|
|
|
title: '职位', |
|
|
|
|
|
key: 'role', |
|
|
|
|
|
}, { |
|
|
|
|
|
title: '合计请假次数(次)', |
|
|
|
|
|
key: 'vacateCount', |
|
|
|
|
|
defaultValue: 0, |
|
|
|
|
|
}, { |
|
|
|
|
|
title: '合计请假时长(小时)', |
|
|
|
|
|
key: 'vacateDayStatisticDuration', |
|
|
|
|
|
defaultValue: 0, |
|
|
|
|
|
}] |
|
|
|
|
|
|
|
|
|
|
|
const fileName = `请假统计_${startDate ? moment(startDate).format('YYYY-MM-DD') : ''}-${endDate ? moment(endDate).format('YYYY-MM-DD') : ''}_${moment().format('YYYYMMDDHHmmss')}` + '.csv' |
|
|
|
|
|
const filePath = await simpleExcelDown({ data: returnD, 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 |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
module.exports = { |
|
|
module.exports = { |
|
|
overtimeStatistic, |
|
|
overtimeStatistic, |
|
|
|
|
|
exportOvertimeStatistic, |
|
|
vacateStatistic, |
|
|
vacateStatistic, |
|
|
|
|
|
exportVacateStatistic, |
|
|
}; |
|
|
}; |