Browse Source

修改冲突

master
wuqun 3 years ago
parent
commit
d9d4d01fe7
  1. 367
      api/app/lib/controllers/member/index.js
  2. 9
      api/app/lib/models/overtime.js
  3. 9
      api/app/lib/models/vacate.js
  4. 8
      api/app/lib/routes/member/index.js
  5. 27
      api/app/lib/schedule/attendance.js
  6. 149
      api/app/lib/utils/member.js
  7. 2
      api/sequelize-automate.config.js

367
api/app/lib/controllers/member/index.js

@ -1,5 +1,6 @@
'use strict'; 'use strict';
const moment = require('moment') const moment = require('moment')
const fs = require('fs');
async function add(ctx) { async function add(ctx) {
try { try {
@ -31,7 +32,7 @@ async function add(ctx) {
} }
}) })
} else { } else {
await models.create(storageData) await models.Member.create(storageData)
} }
ctx.status = 204; ctx.status = 204;
@ -186,149 +187,212 @@ async function del(ctx) {
async function list(ctx) { async function list(ctx) {
try { try {
const { models } = ctx.fs.dc; const { models } = ctx.fs.dc;
const { judgeHoliday } = ctx.app.fs.utils const { judgeHoliday, memberList } = ctx.app.fs.utils
const { clickHouse } = ctx.app.fs
const { database: pepEmis } = clickHouse.pepEmis.opts.config
const { keywordTarget, keyword, limit, page, state } = ctx.query const { keywordTarget, keyword, limit, page, state } = ctx.query
ctx.status = 200; const userRes = await memberList({ keywordTarget, keyword, limit, page, state })
const curDay = moment().format('YYYY-MM-DD') let returnD = []
const nowTime = moment() userRes.forEach(u => {
let whereOption = [] let existUser = returnD.find(r => r.pepUserId == u.pepUserId)
let whereFromSelectOption = [] if (existUser) {
if (state == 'inOffice') { if (u.depId && !existUser.departmrnt.some(d => d.id == u.depId)) {
// 在岗 existUser.departmrnt.push({
const holidayJudge = await judgeHoliday(curDay) id: u.depId,
if (holidayJudge) { name: u.depName
if ( })
holidayJudge.workday
&& nowTime.isAfter(moment(curDay + ' 08:30'))
&& nowTime.isBefore(moment(curDay + ' 17:30'))
) {
// 在工作日的工作时间范围 无请假记录
whereFromSelectOption.push(`vacateStartTime IS NULL`)
} else {
ctx.body = []
return
} }
} else { if (u.roleId && !existUser.role.some(r => r.id == u.roleId)) {
ctx.body = [] existUser.role.push({
return id: u.roleId,
} name: u.roleName
} })
if (state == 'dayoff') {
// 放假
const holidayJudge = await judgeHoliday(curDay)
if (holidayJudge) {
if (
holidayJudge.dayoff || holidayJudge.festivals
) {
// 在休息日范围内且无加班申请
whereFromSelectOption.push(`overtimeStartTime IS NULL`)
} else {
ctx.body = []
return
} }
} else { } else {
ctx.body = [] let obj = {}
return for (let k in u) {
let nextKey = k.replace('hrMember.', '')
.replace('member.', '')
if (nextKey.includes('_')) {
nextKey = nextKey.toLowerCase()
.replace(
/(_)[a-z]/g,
(L) => L.toUpperCase()
)
.replace(/_/g, '')
}
obj[nextKey] = u[k]
}
returnD.push({
...obj,
departmrnt: u.depId ? [{
id: u.depId,
name: u.depName
}] : [],
role: u.roleId ? [{
id: u.roleId,
name: u.roleName
}] : [],
del: undefined,
pepuserid: undefined
})
} }
})
ctx.status = 200;
ctx.body = 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 overTimeStatistics(ctx) {
try {
const { models } = ctx.fs.dc;
const { clickHouse } = ctx.app.fs
const { database: pepEmis } = clickHouse.pepEmis.opts.config
const { startDate, endDate, pepUserId } = ctx.query
const timeOption = []
if (startDate && endDate) {
timeOption.push(
`wpStory.create_at <= '${moment(endDate).format('YYYY-MM-DD HH:mm:ss')}'
AND wpStory.create_at > '${moment(startDate).format('YYYY-MM-DD HH:mm:ss')}'`
)
} }
const userRes = await clickHouse.hr.query(` const dataRes = await clickHouse.hr.query(`
SELECT SELECT
hrMember."member.pep_user_id" AS pepUserId, compensate,
hrMember.*, create_at AS createTime,
user.name AS userName, start_time AS startTime,
role.name AS roleName, end_time AS endTime,
role.id AS roleId, pay_dayoff AS payDayoff,
department.name AS depName, pay_festivals AS payFestivals,
department.id AS depId pay_workday AS payWorkday,
FROM ( reason,
take_rest_dayoff AS takeRestDayoff,
take_rest_festivals AS takeRestFestivals,
take_rest_workday AS takeRestWorkday,
wpStory.id AS storyId
FROM
overtime
INNER JOIN ${pepEmis}.workflow_process_history AS wpStory
ON wpStory.id = overtime.pep_process_story_id
${timeOption.length ? `AND ${timeOption.join(' AND ')}` : ''}
WHERE overtime.pep_user_id = ${pepUserId}
`).toPromise()
const statisticRes = await clickHouse.hr.query(`
SELECT SELECT
member.*, count(overtime.id) AS overTimeCount,
hrVacate.vacateStartTime AS vacateStartTime, sum(pay_dayoff) AS sumPayDayoff,
hrVacate.vacateEndTime AS vacateEndTime, sum(pay_festivals) AS sumPayFestivals,
hrOvertime.overtimeStartTime AS overtimeStartTime, sum(pay_workday) AS sumPayWorkday,
hrOvertime.overtimeEndTime AS overtimeEndTime sum(take_rest_dayoff) AS sumTakeRestDayoff,
FROM member sum(take_rest_festivals) AS sumTakeRestFestivals,
INNER JOIN ${pepEmis}.user AS user sum(take_rest_workday) AS sumTakeRestWorkday
ON member.pep_user_id = user.id FROM
${keywordTarget == 'number' && keyword ? ` overtime
AND user.id LIKE '%${keyword}%' INNER JOIN ${pepEmis}.workflow_process_history AS wpStory
`: ''} ON wpStory.id = overtime.pep_process_story_id
${keywordTarget == 'name' && keyword ? ` ${timeOption.length ? `AND ${timeOption.join(' AND ')}` : ''}
AND user.name LIKE '%${keyword}%' WHERE overtime.pep_user_id = ${pepUserId}
`: ''} GROUP BY overtime.pep_user_id
${state == 'vacate' ? 'INNER' : 'LEFT'} JOIN ( `).toPromise()
let returnD = {
...(statisticRes.length ? statisticRes[0] : {}),
data: dataRes
}
ctx.status = 200;
ctx.body = 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 vacateStatistics(ctx) {
try {
const { models } = ctx.fs.dc;
const { clickHouse } = ctx.app.fs
const { database: pepEmis } = clickHouse.pepEmis.opts.config
const { startDate, endDate, pepUserId } = ctx.query
const timeOption = []
if (startDate && endDate) {
timeOption.push(
`wpStory.create_at <= '${moment(endDate).format('YYYY-MM-DD HH:mm:ss')}'
AND wpStory.create_at > '${moment(startDate).format('YYYY-MM-DD HH:mm:ss')}'`
)
}
const dataRes = await clickHouse.hr.query(`
SELECT SELECT
pep_user_id, type,
any(start_time) AS vacateStartTime, create_at AS createTime,
any(end_time) AS vacateEndTime start_time AS startTime,
FROM vacate end_time AS endTime,
WHERE duration,
start_time <= '${nowTime.format('YYYY-MM-DD HH:mm:ss')}' reason,
AND end_time > '${nowTime.format('YYYY-MM-DD HH:mm:ss')}' wpStory.id AS storyId
GROUP BY pep_user_id FROM
) AS hrVacate vacate
ON hrVacate.pep_user_id = member.pep_user_id INNER JOIN ${pepEmis}.workflow_process_history AS wpStory
ON wpStory.id = vacate.pep_process_story_id
LEFT JOIN ( ${timeOption.length ? `AND ${timeOption.join(' AND ')}` : ''}
WHERE vacate.pep_user_id = ${pepUserId}
`).toPromise()
const statisticRes = await clickHouse.hr.query(`
SELECT SELECT
pep_user_id, type,
any(start_time) AS overtimeStartTime, count(vacate.id) AS count,
any(end_time) AS overtimeEndTime sum(duration) AS sumDuration
FROM overtime FROM
WHERE vacate
start_time <= '${nowTime.format('YYYY-MM-DD HH:mm:ss')}' INNER JOIN ${pepEmis}.workflow_process_history AS wpStory
AND end_time > '${nowTime.format('YYYY-MM-DD HH:mm:ss')}' ON wpStory.id = vacate.pep_process_story_id
GROUP BY pep_user_id ${timeOption.length ? `AND ${timeOption.join(' AND ')}` : ''}
) AS hrOvertime WHERE vacate.pep_user_id = ${pepUserId}
ON hrOvertime.pep_user_id = member.pep_user_id GROUP BY type
WHERE
member.pep_user_id > 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')}` : ''}
${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() `).toPromise()
let returnD = [] let returnD = {
statistic: statisticRes,
data: dataRes
}
ctx.status = 200;
ctx.body = 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 exportData(ctx) {
try {
const { models } = ctx.fs.dc;
const { simpleExcelDown, memberList } = ctx.app.fs.utils
const { keywordTarget, keyword, limit, page, state, keys = '' } = ctx.query
const userRes = await memberList({ keywordTarget, keyword, limit, page, state })
const tableAttributes = models['Member'].tableAttributes
const optionKeys = keys.split(',')
let exportD = []
userRes.forEach(u => { userRes.forEach(u => {
let existUser = returnD.find(r => r.pepUserId == u.pepUserId) let existUser = exportD.find(r => r.pepUserId == u.pepUserId)
if (existUser) { if (existUser) {
if (u.depId && !existUser.departmrnt.some(d => d.id == u.depId)) { if (u.depId && !existUser.departmrnt.some(d => d.id == u.depId)) {
existUser.departmrnt.push({ existUser.departmrnt.push({
@ -345,19 +409,19 @@ async function list(ctx) {
} else { } else {
let obj = {} let obj = {}
for (let k in u) { for (let k in u) {
obj[ let nextKey = k.replace('hrMember.', '')
k.replace('hrMember.', '')
.replace('member.', '') .replace('member.', '')
// 变为小驼峰 if (nextKey.includes('_')) {
.toLowerCase() nextKey = nextKey.toLowerCase()
.replace( .replace(
/(_)[a-z]/g, /(_)[a-z]/g,
(L) => L.toUpperCase() (L) => L.toUpperCase()
) )
.replace(/_/g, '') .replace(/_/g, '')
] = u[k]
} }
returnD.push({ obj[nextKey] = u[k]
}
exportD.push({
...obj, ...obj,
departmrnt: u.depId ? [{ departmrnt: u.depId ? [{
id: u.depId, id: u.depId,
@ -373,8 +437,34 @@ async function list(ctx) {
} }
}) })
let preHeader = [{
title: '姓名',
key: 'userName',
}]
let header = [].concat(preHeader)
for (let k in tableAttributes) {
const comment = tableAttributes[k].comment
if (k != 'id' && comment) {
if ([].includes(k)) {
// 截住不想导出的字段
continue
}
header.push({
title: comment || '-',
key: k,
// index: tableAttributes[k].index,
})
}
}
const fileName = `人员信息_${moment().format('YYYYMMDDHHmmss')}` + '.csv'
const filePath = await simpleExcelDown({ data: exportD, header, fileName: fileName })
const fileData = fs.readFileSync(filePath);
ctx.body = returnD ctx.status = 200;
ctx.set('Content-Type', 'application/x-xls');
ctx.set('Content-disposition', 'attachment; filename=' + encodeURI(fileName));
ctx.body = fileData;
} catch (error) { } catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: error`); ctx.fs.logger.error(`path: ${ctx.path}, error: error`);
ctx.status = 400; ctx.status = 400;
@ -457,5 +547,8 @@ module.exports = {
del, del,
searchPepMember, searchPepMember,
list, list,
overTimeStatistics,
vacateStatistics,
exportData,
addMembersBulk addMembersBulk
}; }

9
api/app/lib/models/overtime.js

@ -131,6 +131,15 @@ module.exports = dc => {
primaryKey: false, primaryKey: false,
field: "compensate", field: "compensate",
autoIncrement: false autoIncrement: false
},
reason: {
type: DataTypes.STRING,
allowNull: true,
defaultValue: null,
comment: "原因",
primaryKey: false,
field: "reason",
autoIncrement: false
} }
}, { }, {
tableName: "overtime", tableName: "overtime",

9
api/app/lib/models/vacate.js

@ -77,6 +77,15 @@ module.exports = dc => {
primaryKey: false, primaryKey: false,
field: "wf_process_state", field: "wf_process_state",
autoIncrement: false autoIncrement: false
},
reason: {
type: DataTypes.STRING,
allowNull: true,
defaultValue: null,
comment: "原因",
primaryKey: false,
field: "reason",
autoIncrement: false
} }
}, { }, {
tableName: "vacate", tableName: "vacate",

8
api/app/lib/routes/member/index.js

@ -18,7 +18,15 @@ module.exports = function (app, router, opts) {
app.fs.api.logAttr['GET/member/list'] = { content: '查询人员列表', visible: true }; app.fs.api.logAttr['GET/member/list'] = { content: '查询人员列表', visible: true };
router.get('/member/list', member.list); router.get('/member/list', member.list);
app.fs.api.logAttr['GET/member/overtime'] = { content: '查询单个人员加班统计数据', visible: true };
router.get('/member/overtime', member.overTimeStatistics);
app.fs.api.logAttr['GET/member/vacate'] = { content: '查询单个人员请假统计数据', visible: true };
router.get('/member/vacate', member.vacateStatistics);
app.fs.api.logAttr['POST/add/members/bulk'] = { content: '导入员工信息', visible: true }; app.fs.api.logAttr['POST/add/members/bulk'] = { content: '导入员工信息', visible: true };
router.post('/add/members/bulk', member.addMembersBulk); router.post('/add/members/bulk', member.addMembersBulk);
app.fs.api.logAttr['GET/members/export'] = { content: '导出员工信息', visible: true };
router.get('/members/export', member.exportData);
}; };

27
api/app/lib/schedule/attendance.js

@ -5,8 +5,8 @@ module.exports = function (app, opts) {
const updateAttendance = app.fs.scheduleInit( const updateAttendance = app.fs.scheduleInit(
// 妥妥流水账 (*^▽^*) // 妥妥流水账 (*^▽^*)
{ {
interval: '34 21 4 * * *', // interval: '34 21 4 * * *',
// interval: '*/3 * * * *', interval: '34 21 */1 * * *',
// immediate: true, // immediate: true,
// proRun: true, // proRun: true,
}, },
@ -22,6 +22,9 @@ module.exports = function (app, opts) {
const { } = app.fs.utils const { } = app.fs.utils
let overtimeNeedData = { let overtimeNeedData = {
reason: {
keyWord: ['加班事由']
},
begainTime: { begainTime: {
keyWord: ['加班开始时间'], keyWord: ['加班开始时间'],
require: true, require: true,
@ -44,6 +47,9 @@ module.exports = function (app, opts) {
} }
let vacateNeedData = { let vacateNeedData = {
reason: {
keyWord: ['请假事由']
},
begainTime: { begainTime: {
keyWord: ['请假开始时间', '请假起始时间'], keyWord: ['请假开始时间', '请假起始时间'],
keys: ['leaveStartTime'], keys: ['leaveStartTime'],
@ -160,7 +166,7 @@ module.exports = function (app, opts) {
) )
} else { } else {
console.warn( console.warn(
`表单数据缺失:`, `表单数据缺失:[${nd}]`,
applyDetail applyDetail
); );
} }
@ -177,6 +183,8 @@ module.exports = function (app, opts) {
} }
} }
const existOvertimeCount = await models.Overtime.count()
const existVacateCount = await models.Vacate.count()
const attendanceRes = await clickHouse.pepEmis.query( const attendanceRes = await clickHouse.pepEmis.query(
` `
@ -207,6 +215,11 @@ module.exports = function (app, opts) {
AND fgroup.name = '假勤管理' AND fgroup.name = '假勤管理'
INNER JOIN ${camWorkflow}.act_hi_procinst AS procin INNER JOIN ${camWorkflow}.act_hi_procinst AS procin
ON procin.id_ = story.procinst_id ON procin.id_ = story.procinst_id
` +
`
${existOvertimeCount || existVacateCount ?
`WHERE story.create_at > '${moment().subtract(1, 'month').format('YYYY-MM-DD HH:mm:ss')}'`
: ''}
` `
).toPromise() ).toPromise()
@ -218,7 +231,7 @@ module.exports = function (app, opts) {
if (a.processName.indexOf('请假') > -1) { if (a.processName.indexOf('请假') > -1) {
let needData = JSON.parse(JSON.stringify(vacateNeedData)) let needData = JSON.parse(JSON.stringify(vacateNeedData))
getData(a, needData) getData(a, needData)
const { begainTime, endTime, type, hrAffirmType, duration, hrAffirmDuration } = needData const { begainTime, endTime, type, hrAffirmType, duration, hrAffirmDuration, reason } = needData
if (begainTime.value && endTime.value && type.value) { if (begainTime.value && endTime.value && type.value) {
let durationSec = 0 let durationSec = 0
if (hrAffirmDuration.value) { if (hrAffirmDuration.value) {
@ -253,6 +266,7 @@ module.exports = function (app, opts) {
duration: durationSec, duration: durationSec,
type: typeStorage, type: typeStorage,
wfProcessState: a.state, wfProcessState: a.state,
reason: reason.value
} }
if (existRes) { if (existRes) {
await models.Vacate.update(storageD, { await models.Vacate.update(storageD, {
@ -277,7 +291,7 @@ module.exports = function (app, opts) {
// 获取表单里的数据并插入 needData // 获取表单里的数据并插入 needData
getData(a, needData) getData(a, needData)
const { begainTime, endTime, duration, compensate, hrAffirmDuration } = needData const { begainTime, endTime, duration, compensate, hrAffirmDuration, reason } = needData
if (begainTime.value && endTime.value && hrAffirmDuration.value && compensate.value) { if (begainTime.value && endTime.value && hrAffirmDuration.value && compensate.value) {
let durationSec = parseFloat(hrAffirmDuration.value) * 3600 let durationSec = parseFloat(hrAffirmDuration.value) * 3600
@ -372,7 +386,8 @@ module.exports = function (app, opts) {
payWorkday, payWorkday,
payDayoff, payDayoff,
payFestivals, payFestivals,
compensate: compensate.value compensate: compensate.value,
reason: reason.value
} }
if (existRes) { if (existRes) {
await models.Overtime.update(storageD, { await models.Overtime.update(storageD, {

149
api/app/lib/utils/member.js

@ -0,0 +1,149 @@
'use strict';
const moment = require('moment')
const request = require('superagent');
module.exports = function (app, opts) {
async function memberList ({ keywordTarget, keyword, limit, page, state }) {
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 = []
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 IS NULL`)
} else {
return []
}
} else {
return []
}
}
if (state == 'dayoff') {
// 放假
const holidayJudge = await judgeHoliday(curDay)
if (holidayJudge) {
if (
holidayJudge.dayoff || holidayJudge.festivals
) {
// 在休息日范围内且无加班申请
whereFromSelectOption.push(`overtimeStartTime IS NULL`)
} else {
return []
}
} else {
return []
}
}
const userRes = await clickHouse.hr.query(`
SELECT
hrMember."member.pep_user_id" AS pepUserId,
hrMember.*,
user.name AS userName,
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
FROM member
INNER JOIN ${pepEmis}.user AS user
ON member.pep_user_id = user.id
${keywordTarget == 'number' && keyword ? `
AND 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')}` : ''}
${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()
return userRes
}
return {
memberList
}
}

2
api/sequelize-automate.config.js

@ -26,7 +26,7 @@ module.exports = {
dir: './app/lib/models', // 指定输出 models 文件的目录 dir: './app/lib/models', // 指定输出 models 文件的目录
typesDir: 'models', // 指定输出 TypeScript 类型定义的文件目录,只有 TypeScript / Midway 等会有类型定义 typesDir: 'models', // 指定输出 TypeScript 类型定义的文件目录,只有 TypeScript / Midway 等会有类型定义
emptyDir: false, // !!! 谨慎操作 生成 models 之前是否清空 `dir` 以及 `typesDir` emptyDir: false, // !!! 谨慎操作 生成 models 之前是否清空 `dir` 以及 `typesDir`
tables: ['member'], // 指定生成哪些表的 models,如 ['user', 'user_post'];如果为 null,则忽略改属性 tables: ['overtime','vacate'], // 指定生成哪些表的 models,如 ['user', 'user_post'];如果为 null,则忽略改属性
skipTables: [], // 指定跳过哪些表的 models,如 ['user'];如果为 null,则忽略改属性 skipTables: [], // 指定跳过哪些表的 models,如 ['user'];如果为 null,则忽略改属性
tsNoCheck: false, // 是否添加 `@ts-nocheck` 注释到 models 文件中 tsNoCheck: false, // 是否添加 `@ts-nocheck` 注释到 models 文件中
ignorePrefix: [], // 生成的模型名称忽略的前缀,因为 项目中有以下表名是以 t_ 开头的,在实际模型中不需要, 可以添加多个 [ 't_data_', 't_',] ,长度较长的 前缀放前面 ignorePrefix: [], // 生成的模型名称忽略的前缀,因为 项目中有以下表名是以 t_ 开头的,在实际模型中不需要, 可以添加多个 [ 't_data_', 't_',] ,长度较长的 前缀放前面

Loading…
Cancel
Save