Files
nxxmdata/government-backend/controllers/VaccineController.js

395 lines
8.8 KiB
JavaScript

const Vaccine = require('../models/Vaccine')
const { Op } = require('sequelize')
// 获取疫苗列表
exports.getVaccines = async (req, res) => {
try {
const { page = 1, pageSize = 10, keyword = '', type = '', status = '' } = req.query
// 构建查询条件
const where = {}
// 关键词搜索
if (keyword) {
where[Op.or] = [
{ name: { [Op.like]: `%${keyword}%` } },
{ manufacturer: { [Op.like]: `%${keyword}%` } }
]
}
// 疫苗类型筛选
if (type) {
where.type = type
}
// 状态筛选
if (status) {
where.status = status
}
// 分页查询
const offset = (page - 1) * pageSize
const { count, rows } = await Vaccine.findAndCountAll({
where,
order: [['createTime', 'DESC']],
limit: parseInt(pageSize),
offset: parseInt(offset)
})
res.json({
code: 200,
data: {
list: rows,
total: count,
page: parseInt(page),
pageSize: parseInt(pageSize)
},
message: '获取疫苗列表成功'
})
} catch (error) {
console.error('获取疫苗列表失败:', error)
res.status(500).json({
code: 500,
message: '服务器内部错误: ' + error.message
})
}
}
// 获取疫苗详情
exports.getVaccineById = async (req, res) => {
try {
const { id } = req.params
const vaccine = await Vaccine.findByPk(id)
if (!vaccine) {
return res.status(404).json({
code: 404,
message: '疫苗不存在'
})
}
res.json({
code: 200,
data: vaccine,
message: '获取疫苗详情成功'
})
} catch (error) {
console.error('获取疫苗详情失败:', error)
res.status(500).json({
code: 500,
message: '服务器内部错误: ' + error.message
})
}
}
// 创建疫苗
exports.createVaccine = async (req, res) => {
try {
const {
name,
type,
manufacturer,
approvalNumber,
specification,
price,
validDays,
storageCondition,
notes,
stockCount = 0
} = req.body
// 验证必填字段
if (!name || !type || !manufacturer || !approvalNumber || !specification || !price || !validDays || !storageCondition) {
return res.status(400).json({
code: 400,
message: '请填写所有必填字段'
})
}
// 验证疫苗类型
const validTypes = ['foot_and_mouth_disease', 'bovine_tuberculosis', 'brucellosis', 'rabies', 'other']
if (!validTypes.includes(type)) {
return res.status(400).json({
code: 400,
message: '疫苗类型无效'
})
}
// 检查批准文号是否已存在
const existingVaccine = await Vaccine.findOne({
where: { approvalNumber }
})
if (existingVaccine) {
return res.status(400).json({
code: 400,
message: '该批准文号已存在'
})
}
// 创建疫苗
const vaccine = await Vaccine.create({
name,
type,
manufacturer,
approvalNumber,
specification,
price: parseFloat(price),
validDays: parseInt(validDays),
storageCondition,
notes,
stockCount: parseInt(stockCount),
status: stockCount > 0 ? 'valid' : 'low_stock'
})
res.json({
code: 200,
data: vaccine,
message: '创建疫苗成功'
})
} catch (error) {
console.error('创建疫苗失败:', error)
res.status(500).json({
code: 500,
message: '服务器内部错误: ' + error.message
})
}
}
// 更新疫苗
exports.updateVaccine = async (req, res) => {
try {
const { id } = req.params
const updateData = req.body
// 验证疫苗类型
if (updateData.type) {
const validTypes = ['foot_and_mouth_disease', 'bovine_tuberculosis', 'brucellosis', 'rabies', 'other']
if (!validTypes.includes(updateData.type)) {
return res.status(400).json({
code: 400,
message: '疫苗类型无效'
})
}
}
// 如果更新批准文号,检查是否已存在
if (updateData.approvalNumber) {
const existingVaccine = await Vaccine.findOne({
where: {
approvalNumber: updateData.approvalNumber,
id: { [Op.ne]: id }
}
})
if (existingVaccine) {
return res.status(400).json({
code: 400,
message: '该批准文号已存在'
})
}
}
// 更新疫苗
const [affectedRows] = await Vaccine.update(updateData, {
where: { id }
})
if (affectedRows === 0) {
return res.status(404).json({
code: 404,
message: '疫苗不存在'
})
}
// 获取更新后的疫苗
const updatedVaccine = await Vaccine.findByPk(id)
res.json({
code: 200,
data: updatedVaccine,
message: '更新疫苗成功'
})
} catch (error) {
console.error('更新疫苗失败:', error)
res.status(500).json({
code: 500,
message: '服务器内部错误: ' + error.message
})
}
}
// 删除疫苗
exports.deleteVaccine = async (req, res) => {
try {
const { id } = req.params
const deletedRows = await Vaccine.destroy({
where: { id }
})
if (deletedRows === 0) {
return res.status(404).json({
code: 404,
message: '疫苗不存在'
})
}
res.json({
code: 200,
message: '删除疫苗成功'
})
} catch (error) {
console.error('删除疫苗失败:', error)
res.status(500).json({
code: 500,
message: '服务器内部错误: ' + error.message
})
}
}
// 批量删除疫苗
exports.batchDeleteVaccines = async (req, res) => {
try {
const { ids } = req.body
if (!ids || !Array.isArray(ids) || ids.length === 0) {
return res.status(400).json({
code: 400,
message: '请选择要删除的疫苗'
})
}
const deletedRows = await Vaccine.destroy({
where: {
id: {
[Op.in]: ids
}
}
})
res.json({
code: 200,
data: { deletedCount: deletedRows },
message: `成功删除 ${deletedRows} 个疫苗`
})
} catch (error) {
console.error('批量删除疫苗失败:', error)
res.status(500).json({
code: 500,
message: '服务器内部错误: ' + error.message
})
}
}
// 疫苗入库
exports.stockIn = async (req, res) => {
try {
const { id } = req.params
const { count, batchNumber, inDate } = req.body
if (!count || count <= 0) {
return res.status(400).json({
code: 400,
message: '入库数量必须大于0'
})
}
const vaccine = await Vaccine.findByPk(id)
if (!vaccine) {
return res.status(404).json({
code: 404,
message: '疫苗不存在'
})
}
// 更新库存数量
const newStockCount = vaccine.stockCount + parseInt(count)
const newStatus = newStockCount > 0 ? 'valid' : 'low_stock'
await Vaccine.update({
stockCount: newStockCount,
status: newStatus
}, {
where: { id }
})
res.json({
code: 200,
message: '疫苗入库成功',
data: {
newStockCount,
status: newStatus
}
})
} catch (error) {
console.error('疫苗入库失败:', error)
res.status(500).json({
code: 500,
message: '服务器内部错误: ' + error.message
})
}
}
// 疫苗出库
exports.stockOut = async (req, res) => {
try {
const { id } = req.params
const { count, purpose, outDate } = req.body
if (!count || count <= 0) {
return res.status(400).json({
code: 400,
message: '出库数量必须大于0'
})
}
const vaccine = await Vaccine.findByPk(id)
if (!vaccine) {
return res.status(404).json({
code: 404,
message: '疫苗不存在'
})
}
if (vaccine.stockCount < count) {
return res.status(400).json({
code: 400,
message: '库存不足,无法出库'
})
}
// 更新库存数量
const newStockCount = vaccine.stockCount - parseInt(count)
let newStatus = 'valid'
if (newStockCount === 0) {
newStatus = 'low_stock'
} else if (newStockCount < 100) {
newStatus = 'low_stock'
}
await Vaccine.update({
stockCount: newStockCount,
status: newStatus
}, {
where: { id }
})
res.json({
code: 200,
message: '疫苗出库成功',
data: {
newStockCount,
status: newStatus
}
})
} catch (error) {
console.error('疫苗出库失败:', error)
res.status(500).json({
code: 500,
message: '服务器内部错误: ' + error.message
})
}
}