feat: 重构各业务模块管理页面与服务

This commit is contained in:
2026-08-05 17:12:00 +08:00
parent 80e6fccf05
commit fd39e1686a
163 changed files with 18409 additions and 13449 deletions

View File

@@ -25,6 +25,7 @@ import { UpdateRoomInspectionDto } from './dto/room-inspection.dto';
import { RoomInspectionsService } from './room-inspections.service';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
import { OperationLogsService } from '../operation-logs/operation-logs.service';
import { logAudit } from '../common/with-audit-log';
import { extractRequestInfo } from '../common/request-utils';
import { RequirePermission } from '../auth/decorators/permission.decorator';
import { BatchIdsDto } from '../common/batch-ids.dto';
@@ -64,16 +65,9 @@ export class RoomsController {
@RequirePermission('room:edit')
@UsePipes(new ValidationPipe({ transform: true, whitelist: true, forbidNonWhitelisted: true }))
async batchRestore(@Body() dto: BatchIdsDto, @Request() req: any) {
const { ipAddress, userAgent } = extractRequestInfo(req);
const result = await this.service.batchRestore(dto.ids);
await this.logService.log({
userId: req.user?.id,
username: req.user?.username,
module: '宿舍',
action: '批量恢复宿舍',
detail: `IDs: ${dto.ids.join(',')}`,
ipAddress,
userAgent,
await logAudit(this.logService, req, {
module: '宿舍', action: '批量恢复宿舍', detail: `IDs: ${dto.ids.join(',')}`,
});
return result;
}
@@ -86,23 +80,14 @@ export class RoomsController {
@Body() dto: UpdateRoomInspectionDto,
@Request() req: any,
) {
const { ipAddress, userAgent } = extractRequestInfo(req);
const result = await this.inspectionsService.submit(
+roomId,
date,
dto.presentOccupancyIds,
{ id: req.user?.id, username: req.user?.username },
);
await this.logService.log({
userId: req.user?.id,
username: req.user?.username,
module: '宿舍查寝',
action: result.isUpdate ? '修改查寝记录' : '提交查寝记录',
targetId: +roomId,
targetType: 'room',
detail: `查寝日期: ${date}, 宿舍: ${result.roomNumber}, 在寝: ${result.presentNames.join('、') || '无'}, 缺勤: ${result.absentNames.join('、') || '无'}`,
ipAddress,
userAgent,
await logAudit(this.logService, req, {
module: '宿舍查寝', action: result.isUpdate ? '修改查寝记录' : '提交查寝记录', targetId: +roomId, targetType: 'room', detail: `查寝日期: ${date}, 宿舍: ${result.roomNumber}, 在寝: ${result.presentNames.join('、') || '无'}, 缺勤: ${result.absentNames.join('、') || '无'}`,
});
return result.inspection;
}
@@ -285,16 +270,9 @@ export class RoomsController {
@Post()
@RequirePermission('room:create')
async create(@Body() dto: CreateRoomDto, @Request() req: any) {
const { ipAddress, userAgent } = extractRequestInfo(req);
const result = await this.service.create(dto);
await this.logService.log({
userId: req.user?.id,
username: req.user?.username,
module: '宿舍',
action: '添加宿舍',
detail: `房间号: ${dto.roomNumber}, 楼栋: ${dto.building || '无'}, 额定: ${dto.capacity}`,
ipAddress,
userAgent,
await logAudit(this.logService, req, {
module: '宿舍', action: '添加宿舍', detail: `房间号: ${dto.roomNumber}, 楼栋: ${dto.building || '无'}, 额定: ${dto.capacity}`,
});
return result;
}
@@ -302,18 +280,9 @@ export class RoomsController {
@Put(':id')
@RequirePermission('room:edit')
async update(@Param('id') id: string, @Body() dto: UpdateRoomDto, @Request() req: any) {
const { ipAddress, userAgent } = extractRequestInfo(req);
const result = await this.service.update(+id, dto);
await this.logService.log({
userId: req.user?.id,
username: req.user?.username,
module: '宿舍',
action: '编辑宿舍',
targetId: +id,
targetType: 'room',
detail: JSON.stringify(dto),
ipAddress,
userAgent,
await logAudit(this.logService, req, {
module: '宿舍', action: '编辑宿舍', targetId: +id, targetType: 'room', detail: JSON.stringify(dto),
});
return result;
}
@@ -321,17 +290,9 @@ export class RoomsController {
@Delete(':id')
@RequirePermission('room:delete')
async remove(@Param('id') id: string, @Request() req: any) {
const { ipAddress, userAgent } = extractRequestInfo(req);
const result = await this.service.remove(+id);
await this.logService.log({
userId: req.user?.id,
username: req.user?.username,
module: '宿舍',
action: '归档宿舍',
targetId: +id,
targetType: 'room',
ipAddress,
userAgent,
await logAudit(this.logService, req, {
module: '宿舍', action: '归档宿舍', targetId: +id, targetType: 'room',
});
return result;
}
@@ -339,16 +300,29 @@ export class RoomsController {
@Post('batch-delete')
@RequirePermission('room:delete')
async batchRemove(@Body() body: { ids: number[] }, @Request() req: any) {
const { ipAddress, userAgent } = extractRequestInfo(req);
const result = await this.service.batchRemove(body.ids || []);
await this.logService.log({
userId: req.user?.id,
username: req.user?.username,
module: '宿舍',
action: '批量归档宿舍',
detail: `IDs: ${(body.ids || []).join(',')}`,
ipAddress,
userAgent,
await logAudit(this.logService, req, {
module: '宿舍', action: '批量归档宿舍', detail: `IDs: ${(body.ids || []).join(',')}`,
});
return result;
}
@Delete(':id/permanent')
@RequirePermission('room:purge')
async purge(@Param('id') id: string, @Request() req: any) {
const result = await this.service.purge(+id);
await logAudit(this.logService, req, {
module: '宿舍', action: '永久删除宿舍', targetId: +id, targetType: 'room', detail: '物理删除,不可恢复',
});
return result;
}
@Post('batch-permanent-delete')
@RequirePermission('room:purge')
async batchPurge(@Body() body: { ids: number[] }, @Request() req: any) {
const result = await this.service.batchPurge(body.ids || []);
await logAudit(this.logService, req, {
module: '宿舍', action: '批量永久删除宿舍', detail: `IDs: ${(body.ids || []).join(',')}`,
});
return result;
}
@@ -356,17 +330,9 @@ export class RoomsController {
@Put(':id/restore')
@RequirePermission('room:edit')
async restore(@Param('id') id: string, @Request() req: any) {
const { ipAddress, userAgent } = extractRequestInfo(req);
const result = await this.service.restore(+id);
await this.logService.log({
userId: req.user?.id,
username: req.user?.username,
module: '宿舍',
action: '恢复宿舍',
targetId: +id,
targetType: 'room',
ipAddress,
userAgent,
await logAudit(this.logService, req, {
module: '宿舍', action: '恢复宿舍', targetId: +id, targetType: 'room',
});
return result;
}
@@ -377,7 +343,7 @@ export class RoomsController {
async importExcel(@UploadedFile() file: Express.Multer.File, @Request() req: any) {
const { ipAddress, userAgent } = extractRequestInfo(req);
const workbook = new ExcelJS.Workbook();
await workbook.xlsx.load(file.buffer as any);
await workbook.xlsx.load(file.buffer.buffer as ArrayBuffer);
const ws = workbook.worksheets[0];
const rows: {
roomNumber: string;