GuDingZiChan/backend/src/controllers/batchController.ts
2026-03-10 16:19:47 +08:00

239 lines
8.5 KiB
TypeScript

import { Request, Response } from 'express'
import prisma from '../utils/prisma'
import { successResponse, errorResponse } from '../utils/response'
import { logOperation } from './operationLogController'
// 批量借出
export const batchBorrow = async (req: Request, res: Response) => {
try {
const { equipment_ids, person_id, expected_return_time, is_long_term, notes } = req.body
if (!Array.isArray(equipment_ids) || equipment_ids.length === 0) {
return errorResponse(res, '请选择要借出的资产')
}
const person = await prisma.person.findUnique({ where: { id: Number(person_id) } })
if (!person || person.status !== 'active') {
return errorResponse(res, '使用者不存在或已禁用')
}
const results: any[] = []
let successCount = 0
let failedCount = 0
for (const equipmentId of equipment_ids) {
try {
const equipment = await prisma.equipment.findUnique({ where: { id: Number(equipmentId) } })
if (!equipment) {
results.push({ equipment_id: equipmentId, status: 'failed', message: '资产不存在' })
failedCount++
continue
}
if (equipment.status !== '可用' || equipment.remaining_quantity <= 0) {
results.push({ equipment_id: equipmentId, equipment_code: equipment.equipment_code, status: 'failed', message: '资产不可借用' })
failedCount++
continue
}
const longTerm = Boolean(is_long_term)
await prisma.borrowRecord.create({
data: {
equipment_id: equipment.id,
equipment_code: equipment.equipment_code,
person_id: person.id,
person_name: person.real_name,
person_nickname: person.nickname,
person_identifier: person.id_number,
expected_return_time: longTerm ? null : (expected_return_time ? new Date(expected_return_time) : null),
is_long_term: longTerm,
notes: longTerm ? `${notes || ''};在职长期` : notes,
status: '已借出'
}
})
const newRemaining = equipment.remaining_quantity - 1
await prisma.equipment.update({
where: { id: equipment.id },
data: {
remaining_quantity: newRemaining,
status: newRemaining === 0 ? '已借出' : '可用',
borrowed_value: Number(equipment.unit_price) * (equipment.total_quantity - newRemaining),
available_value: Number(equipment.unit_price) * newRemaining
}
})
results.push({ equipment_id: equipmentId, equipment_code: equipment.equipment_code, status: 'success', message: '借出成功' })
successCount++
} catch (error: any) {
results.push({ equipment_id: equipmentId, status: 'failed', message: error.message })
failedCount++
}
}
// 记录操作日志
const userId = res.locals.user?.id
const username = res.locals.user?.username || res.locals.user?.name || 'unknown'
const successCodes = results.filter(r => r.status === 'success').map(r => r.equipment_code).join(', ')
if (successCount > 0) {
await logOperation(
userId,
username,
'批量借出',
`批量借出 ${successCount} 件资产给 ${person.real_name}(${person.nickname}),资产编码:${successCodes}`,
undefined,
undefined,
req.ip
)
}
successResponse(res, { success_count: successCount, failed_count: failedCount, results }, '批量借出完成')
} catch (error: any) {
errorResponse(res, error.message || '批量借出失败')
}
}
// 批量归还
export const batchReturn = async (req: Request, res: Response) => {
try {
const { equipment_ids, return_condition = '正常', notes } = req.body
if (!Array.isArray(equipment_ids) || equipment_ids.length === 0) {
return errorResponse(res, '请选择要归还的资产')
}
const results: any[] = []
let successCount = 0
let failedCount = 0
for (const equipmentId of equipment_ids) {
try {
const equipment = await prisma.equipment.findUnique({ where: { id: Number(equipmentId) } })
if (!equipment) {
results.push({ equipment_id: equipmentId, status: 'failed', message: '资产不存在' })
failedCount++
continue
}
const borrowRecord = await prisma.borrowRecord.findFirst({
where: { equipment_id: equipment.id, status: '已借出' },
orderBy: { borrow_time: 'desc' }
})
if (!borrowRecord) {
results.push({ equipment_id: equipmentId, equipment_code: equipment.equipment_code, status: 'failed', message: '未找到借用记录' })
failedCount++
continue
}
await prisma.borrowRecord.update({
where: { id: borrowRecord.id },
data: { return_time: new Date(), status: '已归还', return_condition, notes }
})
const newRemaining = equipment.remaining_quantity + 1
await prisma.equipment.update({
where: { id: equipment.id },
data: {
remaining_quantity: newRemaining,
status: '可用',
borrowed_value: Number(equipment.unit_price) * (equipment.total_quantity - newRemaining),
available_value: Number(equipment.unit_price) * newRemaining
}
})
results.push({ equipment_id: equipmentId, equipment_code: equipment.equipment_code, status: 'success', message: '归还成功' })
successCount++
} catch (error: any) {
results.push({ equipment_id: equipmentId, status: 'failed', message: error.message })
failedCount++
}
}
// 记录操作日志
const userId = res.locals.user?.id
const username = res.locals.user?.username || res.locals.user?.name || 'unknown'
const successCodes = results.filter(r => r.status === 'success').map(r => r.equipment_code).join(', ')
if (successCount > 0) {
await logOperation(
userId,
username,
'批量归还',
`批量归还 ${successCount} 件资产,归还状态:${return_condition},资产编码:${successCodes}`,
undefined,
undefined,
req.ip
)
}
successResponse(res, { success_count: successCount, failed_count: failedCount, results }, '批量归还完成')
} catch (error: any) {
errorResponse(res, error.message || '批量归还失败')
}
}
// 批量转移部门
export const batchTransfer = async (req: Request, res: Response) => {
try {
const { equipment_ids, department_id } = req.body
if (!Array.isArray(equipment_ids) || equipment_ids.length === 0) {
return errorResponse(res, '请选择要转移的资产')
}
const department = await prisma.department.findUnique({ where: { id: Number(department_id) } })
if (!department) {
return errorResponse(res, '目标部门不存在')
}
const results: any[] = []
let successCount = 0
let failedCount = 0
for (const equipmentId of equipment_ids) {
try {
const equipment = await prisma.equipment.findUnique({ where: { id: Number(equipmentId) } })
if (!equipment) {
results.push({ equipment_id: equipmentId, status: 'failed', message: '资产不存在' })
failedCount++
continue
}
await prisma.equipment.update({
where: { id: equipment.id },
data: { department_id: department.id }
})
results.push({ equipment_id: equipmentId, equipment_code: equipment.equipment_code, status: 'success', message: '转移成功' })
successCount++
} catch (error: any) {
results.push({ equipment_id: equipmentId, status: 'failed', message: error.message })
failedCount++
}
}
// 记录操作日志
const userId = res.locals.user?.id
const username = res.locals.user?.username || res.locals.user?.name || 'unknown'
const successCodes = results.filter(r => r.status === 'success').map(r => r.equipment_code).join(', ')
if (successCount > 0) {
await logOperation(
userId,
username,
'批量转移',
`批量转移 ${successCount} 件资产到部门 ${department.name},资产编码:${successCodes}`,
undefined,
undefined,
req.ip
)
}
successResponse(res, { success_count: successCount, failed_count: failedCount, results }, '批量转移完成')
} catch (error: any) {
errorResponse(res, error.message || '批量转移失败')
}
}