239 lines
8.5 KiB
TypeScript
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 || '批量转移失败')
|
|
}
|
|
}
|