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 || '批量转移失败') } }