367 lines
8.1 KiB
JavaScript
367 lines
8.1 KiB
JavaScript
/**
|
|
* 员工控制器
|
|
* @file employeeController.js
|
|
* @description 处理员工相关的请求
|
|
*/
|
|
const { Employee, Department, Position } = require('../models');
|
|
const { validationResult } = require('express-validator');
|
|
const { Op } = require('sequelize');
|
|
|
|
/**
|
|
* 获取员工列表
|
|
* @param {Object} req 请求对象
|
|
* @param {Object} res 响应对象
|
|
*/
|
|
exports.getEmployees = async (req, res) => {
|
|
try {
|
|
const {
|
|
page = 1,
|
|
limit = 10,
|
|
search = '',
|
|
department = '',
|
|
position = '',
|
|
status = '',
|
|
sortBy = 'created_at',
|
|
sortOrder = 'DESC'
|
|
} = req.query;
|
|
|
|
const offset = (page - 1) * limit;
|
|
const whereClause = {};
|
|
|
|
// 搜索条件
|
|
if (search) {
|
|
whereClause[Op.or] = [
|
|
{ name: { [Op.like]: `%${search}%` } },
|
|
{ employee_id: { [Op.like]: `%${search}%` } },
|
|
{ phone: { [Op.like]: `%${search}%` } },
|
|
{ email: { [Op.like]: `%${search}%` } }
|
|
];
|
|
}
|
|
|
|
// 部门筛选
|
|
if (department) {
|
|
whereClause.department_id = department;
|
|
}
|
|
|
|
// 职位筛选
|
|
if (position) {
|
|
whereClause.position_id = position;
|
|
}
|
|
|
|
// 状态筛选
|
|
if (status) {
|
|
whereClause.status = status;
|
|
}
|
|
|
|
const { count, rows: employees } = await Employee.findAndCountAll({
|
|
where: whereClause,
|
|
include: [
|
|
{
|
|
model: Department,
|
|
as: 'department',
|
|
attributes: ['id', 'name']
|
|
},
|
|
{
|
|
model: Position,
|
|
as: 'position',
|
|
attributes: ['id', 'name', 'level']
|
|
}
|
|
],
|
|
order: [[sortBy, sortOrder.toUpperCase()]],
|
|
limit: parseInt(limit),
|
|
offset: parseInt(offset)
|
|
});
|
|
|
|
res.json({
|
|
success: true,
|
|
message: '获取员工列表成功',
|
|
data: {
|
|
employees,
|
|
pagination: {
|
|
current: parseInt(page),
|
|
pageSize: parseInt(limit),
|
|
total: count,
|
|
pages: Math.ceil(count / limit)
|
|
}
|
|
}
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('获取员工列表错误:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '服务器内部错误',
|
|
error: error.message
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 创建员工
|
|
* @param {Object} req 请求对象
|
|
* @param {Object} res 响应对象
|
|
*/
|
|
exports.createEmployee = async (req, res) => {
|
|
try {
|
|
const errors = validationResult(req);
|
|
if (!errors.isEmpty()) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: '输入数据验证失败',
|
|
errors: errors.array()
|
|
});
|
|
}
|
|
|
|
const {
|
|
name,
|
|
employee_id,
|
|
department_id,
|
|
position_id,
|
|
phone,
|
|
email,
|
|
hire_date,
|
|
salary,
|
|
status = 'active'
|
|
} = req.body;
|
|
|
|
// 检查员工编号是否已存在
|
|
const existingEmployee = await Employee.findOne({
|
|
where: { employee_id }
|
|
});
|
|
|
|
if (existingEmployee) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: '员工编号已存在'
|
|
});
|
|
}
|
|
|
|
const employee = await Employee.create({
|
|
name,
|
|
employee_id,
|
|
department_id,
|
|
position_id,
|
|
phone,
|
|
email,
|
|
hire_date,
|
|
salary: salary * 100, // 转换为分
|
|
status
|
|
});
|
|
|
|
res.status(201).json({
|
|
success: true,
|
|
message: '创建员工成功',
|
|
data: employee
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('创建员工错误:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '服务器内部错误',
|
|
error: error.message
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 获取员工详情
|
|
* @param {Object} req 请求对象
|
|
* @param {Object} res 响应对象
|
|
*/
|
|
exports.getEmployeeById = async (req, res) => {
|
|
try {
|
|
const { id } = req.params;
|
|
|
|
const employee = await Employee.findByPk(id, {
|
|
include: [
|
|
{
|
|
model: Department,
|
|
as: 'department',
|
|
attributes: ['id', 'name', 'description']
|
|
},
|
|
{
|
|
model: Position,
|
|
as: 'position',
|
|
attributes: ['id', 'name', 'level', 'description']
|
|
}
|
|
]
|
|
});
|
|
|
|
if (!employee) {
|
|
return res.status(404).json({
|
|
success: false,
|
|
message: '员工不存在'
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
message: '获取员工详情成功',
|
|
data: employee
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('获取员工详情错误:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '服务器内部错误',
|
|
error: error.message
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 更新员工
|
|
* @param {Object} req 请求对象
|
|
* @param {Object} res 响应对象
|
|
*/
|
|
exports.updateEmployee = async (req, res) => {
|
|
try {
|
|
const errors = validationResult(req);
|
|
if (!errors.isEmpty()) {
|
|
return res.status(400).json({
|
|
success: false,
|
|
message: '输入数据验证失败',
|
|
errors: errors.array()
|
|
});
|
|
}
|
|
|
|
const { id } = req.params;
|
|
const updateData = req.body;
|
|
|
|
// 如果更新薪资,转换为分
|
|
if (updateData.salary) {
|
|
updateData.salary = updateData.salary * 100;
|
|
}
|
|
|
|
const employee = await Employee.findByPk(id);
|
|
|
|
if (!employee) {
|
|
return res.status(404).json({
|
|
success: false,
|
|
message: '员工不存在'
|
|
});
|
|
}
|
|
|
|
await employee.update(updateData);
|
|
|
|
res.json({
|
|
success: true,
|
|
message: '更新员工成功',
|
|
data: employee
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('更新员工错误:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '服务器内部错误',
|
|
error: error.message
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 删除员工
|
|
* @param {Object} req 请求对象
|
|
* @param {Object} res 响应对象
|
|
*/
|
|
exports.deleteEmployee = async (req, res) => {
|
|
try {
|
|
const { id } = req.params;
|
|
|
|
const employee = await Employee.findByPk(id);
|
|
|
|
if (!employee) {
|
|
return res.status(404).json({
|
|
success: false,
|
|
message: '员工不存在'
|
|
});
|
|
}
|
|
|
|
await employee.destroy();
|
|
|
|
res.json({
|
|
success: true,
|
|
message: '删除员工成功'
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('删除员工错误:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '服务器内部错误',
|
|
error: error.message
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 获取员工统计
|
|
* @param {Object} req 请求对象
|
|
* @param {Object} res 响应对象
|
|
*/
|
|
exports.getEmployeeStats = async (req, res) => {
|
|
try {
|
|
const totalEmployees = await Employee.count();
|
|
const activeEmployees = await Employee.count({ where: { status: 'active' } });
|
|
const inactiveEmployees = await Employee.count({ where: { status: 'inactive' } });
|
|
|
|
const departmentStats = await Employee.findAll({
|
|
attributes: [
|
|
'department_id',
|
|
[Employee.sequelize.fn('COUNT', Employee.sequelize.col('id')), 'count']
|
|
],
|
|
include: [{
|
|
model: Department,
|
|
as: 'department',
|
|
attributes: ['name']
|
|
}],
|
|
group: ['department_id', 'department.id'],
|
|
raw: false
|
|
});
|
|
|
|
const positionStats = await Employee.findAll({
|
|
attributes: [
|
|
'position_id',
|
|
[Employee.sequelize.fn('COUNT', Employee.sequelize.col('id')), 'count']
|
|
],
|
|
include: [{
|
|
model: Position,
|
|
as: 'position',
|
|
attributes: ['name', 'level']
|
|
}],
|
|
group: ['position_id', 'position.id'],
|
|
raw: false
|
|
});
|
|
|
|
res.json({
|
|
success: true,
|
|
message: '获取员工统计成功',
|
|
data: {
|
|
total: totalEmployees,
|
|
active: activeEmployees,
|
|
inactive: inactiveEmployees,
|
|
departmentStats: departmentStats.map(item => ({
|
|
department: item.department.name,
|
|
count: parseInt(item.dataValues.count)
|
|
})),
|
|
positionStats: positionStats.map(item => ({
|
|
position: item.position.name,
|
|
level: item.position.level,
|
|
count: parseInt(item.dataValues.count)
|
|
}))
|
|
}
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('获取员工统计错误:', error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: '服务器内部错误',
|
|
error: error.message
|
|
});
|
|
}
|
|
};
|