395 lines
8.8 KiB
JavaScript
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
|
|
})
|
|
}
|
|
}
|