|
|
|
'use strict';
|
|
|
|
const moment = require('moment')
|
|
|
|
const request = require('superagent');
|
|
|
|
|
|
|
|
module.exports = function (app, opts) {
|
|
|
|
|
|
|
|
async function memberList ({
|
|
|
|
keywordTarget, keyword, limit, page, state,
|
|
|
|
hiredateStart, hiredateEnd
|
|
|
|
}) {
|
|
|
|
const { judgeHoliday } = app.fs.utils
|
|
|
|
const { clickHouse } = app.fs
|
|
|
|
const { database: pepEmis } = clickHouse.pepEmis.opts.config
|
|
|
|
|
|
|
|
const curDay = moment().format('YYYY-MM-DD')
|
|
|
|
const nowTime = moment()
|
|
|
|
let whereOption = []
|
|
|
|
let whereFromSelectOption = []
|
|
|
|
let returnEmpty = false
|
|
|
|
if (state == 'inOffice') {
|
|
|
|
// 在岗
|
|
|
|
const holidayJudge = await judgeHoliday(curDay)
|
|
|
|
if (holidayJudge) {
|
|
|
|
if (
|
|
|
|
holidayJudge.workday
|
|
|
|
&& nowTime.isAfter(moment(curDay + ' 08:30'))
|
|
|
|
&& nowTime.isBefore(moment(curDay + ' 17:30'))
|
|
|
|
) {
|
|
|
|
// 在工作日的工作时间范围 无请假记录
|
|
|
|
whereFromSelectOption.push(`vacateStartTime = '1970-01-01 00:00:00.000000'`)
|
|
|
|
} else {
|
|
|
|
returnEmpty = true
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
returnEmpty = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (state == 'dayoff') {
|
|
|
|
// 放假
|
|
|
|
const holidayJudge = await judgeHoliday(curDay)
|
|
|
|
if (holidayJudge) {
|
|
|
|
if (
|
|
|
|
holidayJudge.dayoff || holidayJudge.festivals
|
|
|
|
) {
|
|
|
|
// 在休息日范围内且无加班申请
|
|
|
|
whereFromSelectOption.push(`overtimeStartTime = '1970-01-01 00:00:00.000000'`)
|
|
|
|
} else {
|
|
|
|
returnEmpty = true
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
returnEmpty = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (returnEmpty) {
|
|
|
|
return {
|
|
|
|
count: 0,
|
|
|
|
rows: []
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const innerSelectQuery = `
|
|
|
|
FROM member
|
|
|
|
INNER JOIN ${pepEmis}.user AS user
|
|
|
|
ON member.pep_user_id = user.id
|
|
|
|
${keywordTarget == 'number' && keyword ? `
|
|
|
|
AND toString(user.id) LIKE '%${keyword}%'
|
|
|
|
`: ''}
|
|
|
|
${keywordTarget == 'name' && keyword ? `
|
|
|
|
AND user.name LIKE '%${keyword}%'
|
|
|
|
`: ''}
|
|
|
|
${state == 'vacate' ? 'INNER' : 'LEFT'} JOIN (
|
|
|
|
SELECT
|
|
|
|
pep_user_id,
|
|
|
|
any(start_time) AS vacateStartTime,
|
|
|
|
any(end_time) AS vacateEndTime
|
|
|
|
FROM vacate
|
|
|
|
WHERE
|
|
|
|
start_time <= '${nowTime.format('YYYY-MM-DD HH:mm:ss')}'
|
|
|
|
AND end_time > '${nowTime.format('YYYY-MM-DD HH:mm:ss')}'
|
|
|
|
GROUP BY pep_user_id
|
|
|
|
) AS hrVacate
|
|
|
|
ON hrVacate.pep_user_id = member.pep_user_id
|
|
|
|
|
|
|
|
LEFT JOIN (
|
|
|
|
SELECT
|
|
|
|
pep_user_id,
|
|
|
|
any(start_time) AS overtimeStartTime,
|
|
|
|
any(end_time) AS overtimeEndTime
|
|
|
|
FROM overtime
|
|
|
|
WHERE
|
|
|
|
start_time <= '${nowTime.format('YYYY-MM-DD HH:mm:ss')}'
|
|
|
|
AND end_time > '${nowTime.format('YYYY-MM-DD HH:mm:ss')}'
|
|
|
|
GROUP BY pep_user_id
|
|
|
|
) AS hrOvertime
|
|
|
|
ON hrOvertime.pep_user_id = member.pep_user_id
|
|
|
|
|
|
|
|
WHERE
|
|
|
|
member.del = 0
|
|
|
|
${keywordTarget == 'role' && keyword ? `
|
|
|
|
AND user.id IN (
|
|
|
|
SELECT user_role.user
|
|
|
|
FROM ${pepEmis}.user_role AS user_role
|
|
|
|
INNER JOIN ${pepEmis}.role AS role
|
|
|
|
ON role.id = user_role.role
|
|
|
|
AND role.name LIKE '%${keyword}%'
|
|
|
|
)
|
|
|
|
` : ''}
|
|
|
|
${keywordTarget == 'dep' && keyword ? `
|
|
|
|
AND user.id IN (
|
|
|
|
SELECT department_user.user
|
|
|
|
FROM ${pepEmis}.department_user AS department_user
|
|
|
|
INNER JOIN ${pepEmis}.department AS department
|
|
|
|
ON department.id = department_user.department
|
|
|
|
AND department.name LIKE '%${keyword}%'
|
|
|
|
)
|
|
|
|
` : ''}
|
|
|
|
${state == 'dimission' ? `AND member.dimission_date IS NOT null` : ''}
|
|
|
|
${state == 'onJob' ? `AND member.dimission_date IS null` : ''}
|
|
|
|
${whereFromSelectOption.length ? `AND ${whereFromSelectOption.join('AND')}` : ''}
|
|
|
|
${hiredateStart ? `
|
|
|
|
AND member.hiredate >= '${moment(hiredateStart).format('YYYY-MM-DD')}'
|
|
|
|
`: ''}
|
|
|
|
${hiredateEnd ? `
|
|
|
|
AND member.hiredate <= '${moment(hiredateEnd).format('YYYY-MM-DD')}'
|
|
|
|
` : ''}
|
|
|
|
`
|
|
|
|
|
|
|
|
const userRes = await clickHouse.hr.query(`
|
|
|
|
SELECT
|
|
|
|
hrMember."member.pep_user_id" AS pepUserId,
|
|
|
|
hrMember.*,
|
|
|
|
user.name AS userName,
|
|
|
|
user.people_code AS userCode,
|
|
|
|
role.name AS roleName,
|
|
|
|
role.id AS roleId,
|
|
|
|
department.name AS depName,
|
|
|
|
department.id AS depId
|
|
|
|
FROM (
|
|
|
|
SELECT
|
|
|
|
member.*,
|
|
|
|
hrVacate.vacateStartTime AS vacateStartTime,
|
|
|
|
hrVacate.vacateEndTime AS vacateEndTime,
|
|
|
|
hrOvertime.overtimeStartTime AS overtimeStartTime,
|
|
|
|
hrOvertime.overtimeEndTime AS overtimeEndTime
|
|
|
|
${innerSelectQuery}
|
|
|
|
${limit ? `LIMIT ${limit}` : ''}
|
|
|
|
${limit && page ? 'OFFSET ' + parseInt(limit) * parseInt(page) : ''}
|
|
|
|
) AS hrMember
|
|
|
|
|
|
|
|
LEFT JOIN ${pepEmis}.user AS user
|
|
|
|
ON hrMember."member.pep_user_id" = user.id
|
|
|
|
LEFT JOIN ${pepEmis}.user_role AS user_role
|
|
|
|
ON ${pepEmis}.user_role.user = user.id
|
|
|
|
LEFT JOIN ${pepEmis}.role AS role
|
|
|
|
ON ${pepEmis}.role.id = user_role.role
|
|
|
|
LEFT JOIN ${pepEmis}.department_user AS department_user
|
|
|
|
ON department_user.user = user.id
|
|
|
|
LEFT JOIN ${pepEmis}.department AS department
|
|
|
|
ON department.id = department_user.department
|
|
|
|
${whereOption.length ? `WHERE ${whereOption.join(' AND ')}` : ''}
|
|
|
|
`).toPromise()
|
|
|
|
|
|
|
|
const countRes = await clickHouse.hr.query(`
|
|
|
|
SELECT
|
|
|
|
count(member.pep_user_id) AS count
|
|
|
|
${innerSelectQuery}
|
|
|
|
`).toPromise()
|
|
|
|
|
|
|
|
return {
|
|
|
|
count: countRes[0].count,
|
|
|
|
rows: userRes
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
|
|
|
memberList
|
|
|
|
}
|
|
|
|
}
|