Files
nxxmdata/bank-backend/controllers/employeeController.js
2025-09-25 17:43:54 +08:00

450 lines
9.9 KiB
JavaScript

const { Employee, User } = require('../models');
const { validationResult } = require('express-validator');
const bcrypt = require('bcryptjs');
/**
* 获取员工列表
*/
const getEmployees = async (req, res) => {
try {
const {
page = 1,
pageSize = 10,
searchField = 'name',
searchValue = '',
status = '',
isLoanSpecialist = ''
} = req.query;
// 构建查询条件
const where = {};
if (searchValue) {
if (searchField === 'name') {
where.name = { [require('sequelize').Op.like]: `%${searchValue}%` };
} else if (searchField === 'phone') {
where.phone = { [require('sequelize').Op.like]: `%${searchValue}%` };
} else if (searchField === 'employeeNumber') {
where.employeeNumber = { [require('sequelize').Op.like]: `%${searchValue}%` };
}
}
if (status) {
where.status = status;
}
if (isLoanSpecialist !== '') {
where.isLoanSpecialist = isLoanSpecialist === 'true';
}
// 分页参数
const offset = (parseInt(page) - 1) * parseInt(pageSize);
const limit = parseInt(pageSize);
// 查询数据
const { count, rows } = await Employee.findAndCountAll({
where,
limit,
offset,
order: [['created_at', 'DESC']],
attributes: {
exclude: ['password'] // 不返回密码
}
});
// 格式化数据
const employees = rows.map(employee => ({
id: employee.id,
employeeNumber: employee.employeeNumber,
name: employee.name,
phone: employee.phone,
email: employee.email,
isLoanSpecialist: employee.isLoanSpecialist,
department: employee.department,
position: employee.position,
status: employee.status,
lastLogin: employee.lastLogin,
createdAt: employee.createdAt,
updatedAt: employee.updatedAt
}));
res.json({
success: true,
message: '获取员工列表成功',
data: {
employees,
pagination: {
current: parseInt(page),
pageSize: parseInt(pageSize),
total: count,
pages: Math.ceil(count / parseInt(pageSize))
}
}
});
} catch (error) {
console.error('获取员工列表失败:', error);
res.status(500).json({
success: false,
message: '获取员工列表失败'
});
}
};
/**
* 获取员工详情
*/
const getEmployeeById = async (req, res) => {
try {
const { id } = req.params;
const employee = await Employee.findByPk(id, {
attributes: {
exclude: ['password'] // 不返回密码
}
});
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: '获取员工详情失败'
});
}
};
/**
* 创建员工
*/
const createEmployee = async (req, res) => {
try {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({
success: false,
message: '请求参数错误',
errors: errors.array()
});
}
const {
employeeNumber,
name,
phone,
email,
password,
isLoanSpecialist,
department,
position
} = req.body;
// 检查员工编号是否已存在
const existingEmployee = await Employee.findOne({
where: { employeeNumber }
});
if (existingEmployee) {
return res.status(400).json({
success: false,
message: '员工编号已存在'
});
}
// 检查手机号是否已存在
const existingPhone = await Employee.findOne({
where: { phone }
});
if (existingPhone) {
return res.status(400).json({
success: false,
message: '手机号已存在'
});
}
// 创建员工
const employee = await Employee.create({
employeeNumber,
name,
phone,
email,
password: password || '123456', // 默认密码
isLoanSpecialist: isLoanSpecialist || false,
department,
position,
status: 'active'
});
res.status(201).json({
success: true,
message: '创建员工成功',
data: {
id: employee.id,
employeeNumber: employee.employeeNumber,
name: employee.name,
phone: employee.phone,
email: employee.email,
isLoanSpecialist: employee.isLoanSpecialist,
department: employee.department,
position: employee.position,
status: employee.status,
createdAt: employee.createdAt
}
});
} catch (error) {
console.error('创建员工失败:', error);
res.status(500).json({
success: false,
message: '创建员工失败'
});
}
};
/**
* 更新员工信息
*/
const 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 {
name,
phone,
email,
isLoanSpecialist,
department,
position,
status
} = req.body;
const employee = await Employee.findByPk(id);
if (!employee) {
return res.status(404).json({
success: false,
message: '员工不存在'
});
}
// 检查手机号是否被其他员工使用
if (phone && phone !== employee.phone) {
const existingPhone = await Employee.findOne({
where: {
phone,
id: { [require('sequelize').Op.ne]: id }
}
});
if (existingPhone) {
return res.status(400).json({
success: false,
message: '手机号已被其他员工使用'
});
}
}
// 更新员工信息
await employee.update({
name,
phone,
email,
isLoanSpecialist,
department,
position,
status
});
res.json({
success: true,
message: '更新员工信息成功',
data: {
id: employee.id,
employeeNumber: employee.employeeNumber,
name: employee.name,
phone: employee.phone,
email: employee.email,
isLoanSpecialist: employee.isLoanSpecialist,
department: employee.department,
position: employee.position,
status: employee.status,
updatedAt: employee.updatedAt
}
});
} catch (error) {
console.error('更新员工信息失败:', error);
res.status(500).json({
success: false,
message: '更新员工信息失败'
});
}
};
/**
* 重设密码
*/
const resetPassword = async (req, res) => {
try {
const { id } = req.params;
const { newPassword } = req.body;
const employee = await Employee.findByPk(id);
if (!employee) {
return res.status(404).json({
success: false,
message: '员工不存在'
});
}
// 更新密码
await employee.update({
password: newPassword || '123456' // 默认密码
});
res.json({
success: true,
message: '重设密码成功'
});
} catch (error) {
console.error('重设密码失败:', error);
res.status(500).json({
success: false,
message: '重设密码失败'
});
}
};
/**
* 删除员工
*/
const 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: '删除员工失败'
});
}
};
/**
* 批量更新员工状态
*/
const batchUpdateStatus = async (req, res) => {
try {
const { ids, status } = req.body;
if (!ids || !Array.isArray(ids) || ids.length === 0) {
return res.status(400).json({
success: false,
message: '请选择要更新的员工'
});
}
if (!status) {
return res.status(400).json({
success: false,
message: '请选择要更新的状态'
});
}
await Employee.update(
{
status
},
{
where: {
id: { [require('sequelize').Op.in]: ids }
}
}
);
res.json({
success: true,
message: '批量更新状态成功'
});
} catch (error) {
console.error('批量更新状态失败:', error);
res.status(500).json({
success: false,
message: '批量更新状态失败'
});
}
};
/**
* 获取员工统计信息
*/
const 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 lockedEmployees = await Employee.count({ where: { status: 'locked' } });
const loanSpecialists = await Employee.count({ where: { isLoanSpecialist: true } });
res.json({
success: true,
message: '获取员工统计成功',
data: {
totalEmployees,
activeEmployees,
inactiveEmployees,
lockedEmployees,
loanSpecialists
}
});
} catch (error) {
console.error('获取员工统计失败:', error);
res.status(500).json({
success: false,
message: '获取员工统计失败'
});
}
};
module.exports = {
getEmployees,
getEmployeeById,
createEmployee,
updateEmployee,
resetPassword,
deleteEmployee,
batchUpdateStatus,
getEmployeeStats
};