Nest booking 预定模块
Nest booking.module.ts
ts
import { Module } from "@nestjs/common";
import { BookingService } from "./booking.service";
import { BookingController } from "./booking.controller";
// 增加Excel 动态模块
import { ExcelModule } from "../../commonModules/excel/excel.module";
// 增加上传模块
import { UploadModule } from "../../commonModules/upload/upload.module";
// 增加邮箱模块
import { EmailModule } from "../../commonModules/email/email.module";
// 增加加密解密模块
import { CryptoModule } from "../../commonModules/crypto/crypto.module";
@Module({
imports: [
ExcelModule.forRoot({ name: "testdemoexcel" }),
UploadModule,
EmailModule,
CryptoModule,
],
controllers: [BookingController],
providers: [BookingService],
})
export class BookingModule {}Nest booking.controller.ts
ts
import {
Controller,
Get,
Post,
Body,
Patch,
Param,
Delete,
} from "@nestjs/common";
import { BookingService } from "./booking.service";
// 引入dto
import { CreateBookingDto } from "./dto/create-booking.dto";
import { ListBookingDto } from "./dto/list-booking.dto";
import { UpdateBookingDto } from "./dto/update-booking.dto";
@Controller({
version: ["1"],
path: "booking",
})
export class BookingController {
constructor(private readonly bookingService: BookingService) {}
// 新增预订
/**
*
* @api {POST} /v1/booking/add 增加
* @apiName 创建预订
* @apiGroup booking
* @apiVersion 0.0.0
*
* @apiBody {Number} user_id 用户id
* @apiBody {Number} room_id 会议室id
* @apiBody {String} start_time 开始时间
* @apiBody {String} end_time 结束时间
* @apiBody {String} note 备注
* @apiBody {Number} status 状态
*
* @apiSuccess {Object} response 响应数据
* @apiSuccess {Number} response.code 200
* @apiSuccess {String} response.message 操作成功
* @apiSuccess {Object} response.data 添加成功
* @apiParamExample {type} Request-Example:
* {
* "user_id":3,
* "room_id":3,
* "start_time":"2024-07-02T10:00:00",
* "end_time":"2024-07-02T12:00:00",
* "status":1,
* "note":"用于项目讨论"
* }
*
*
* @apiSuccessExample {type} Success-Response:
* {
* code : 200
* message : 操作成功
* data: 添加成功
* }
*
*
*/
@Post("add")
async create(@Body() createBookingDto: CreateBookingDto) {
// 查询
createBookingDto.booking_attendees = {
create: {
user_id: createBookingDto.user_id,
},
};
return await this.bookingService.create(createBookingDto);
}
/**
*
* @api {POST} /v1/booking/list 返回全部预订
* @apiName 返回全部预订
* @apiGroup booking
* @apiVersion 0.0.0
*
* @apiBody {String} searchContent 会议室名字
* @apiBody {Number} page 当前页
* @apiBody {number} pageSize 每页分的个数
*
* @apiSuccess {Object} response 响应数据
* @apiSuccess {Number} response.code 200
* @apiSuccess {String} response.message 操作成功
* @apiSuccess {Object} response.data 更新成功
* @apiSuccess {Object[]} response.data.list 数据集合
* @apiSuccess {Number} response.data.list.id 预定编号
* @apiSuccess {Number} response.data.list.user_id 用户编号
* @apiSuccess {Number} response.data.list.room_id 会议室编号
* @apiSuccess {String} response.data.list.start_time 开始时间
* @apiSuccess {String} response.data.list.end_time 结束时间
* @apiSuccess {String} response.data.list.create_time 创建时间
* @apiSuccess {String} response.data.list.update_time 更新时间
* @apiSuccess {String} response.data.list.status 状态 状态(申请中、审批通过、审批驳回、已解除)
* @apiSuccess {Object} response.data.pagination 数据集合
* @apiSuccess {Number} response.data.pagination.total 总数
* @apiSuccess {Number} response.data.pagination.page 当前页
* @apiSuccess {Number} response.data.pagination.pageSize 每页个数
* @apiSuccess {Number} response.data.pagination.totalPages 总页数
* @apiSuccess {Boolean} response.data.pagination.hasNextPage 是否有下一页
* @apiSuccess {Boolean} response.data.pagination.hasPreviousPage 是否有上一页
* @apiParamExample {type} Request-Example:
* {
* "page":1,
* "pageSize":10,
* }
*
*
* @apiSuccessExample {type} Success-Response:
* {
* code : 200
* message : 操作成功
* data: {
* list: [
* {
* id: 3,
* user_id: 3,
* room_id: 3,
* start_time: "2024-07-02T10:00:00",
* end_time: "2024-07-02T12:00:00",
* status: 1,
* note: "用于项目讨论",
* create_time: "2025-12-31T11:21:03.000Z",
* update_time: "2025-12-31T11:21:03.000Z"
* }
* ],
* "pagination": {
* "total": 1,
* "page": 1,
* "pageSize": 10,
* "totalPages": 1,
* "hasNextPage": false,
* "hasPreviousPage": false
* }
* }
* }
*
*
*/
@Get("list")
async findAll(@Body() body: ListBookingDto) {
return await this.bookingService.findAll(body.page, body.pageSize);
}
// 修改审批
/**
*
* @api {POST} /v1/booking/update 修改状态
* @apiName 修改状态
* @apiGroup booking
* @apiVersion 0.0.0
*
* @apiBody {Number} id 预定ID
* @apiBody {Number} status 状态 状态(申请中、审批通过、审批驳回、已解除)
*
* @apiSuccess {Object} response 响应数据
* @apiSuccess {Number} response.code 200
* @apiSuccess {String} response.message 操作成功
* @apiSuccess {Object} response.data 修改成功
* @apiParamExample {type} Request-Example:
* {
* "id":1,
* "status":2
*}
*
*
* @apiSuccessExample {type} Success-Response:
* {
* code : 200
* message : 操作成功
* data: 修改成功
* }
*
*
*/
@Post("update")
async update(@Body() body: UpdateBookingDto) {
return await this.bookingService.updateStatus(body);
}
// 删除预订
/**
*
* @api {POST} /v1/booking/delete 删除
* @apiName 删除状态
* @apiGroup booking
* @apiVersion 0.0.0
*
* @apiBody {Number} id 预定ID
*
* @apiSuccess {Object} response 响应数据
* @apiSuccess {Number} response.code 200
* @apiSuccess {String} response.message 操作成功
* @apiSuccess {Object} response.data 删除成功
* @apiParamExample {type} Request-Example:
* {
* "id":1,
*}
*
*
* @apiSuccessExample {type} Success-Response:
* {
* code : 200
* message : 操作成功
* data: 删除成功
* }
*
*
*/
@Post("delete")
async remove(@Body() body: { id: number }) {
return await this.bookingService.delete(body.id);
}
}Nest booking.service.ts
ts
import { Inject, Injectable } from "@nestjs/common";
import { PrismadbService } from "../../commonModules/prisma/prisma.service";
import { GlobalCheckException } from "../../common/globalcheck.exception";
import { UpdateBookingDto } from "./dto/update-booking.dto";
@Injectable()
export class BookingService {
@Inject(PrismadbService)
private readonly prisma: PrismadbService;
// 创建预定
async create(createBookingDto) {
// 先查询是否有冲突的预订
const bookings = await this.prisma.bookings.findFirst({
where: {
room_id: createBookingDto.room_id,
},
});
if (!bookings) {
const result = await this.prisma.bookings.create({
data: createBookingDto,
});
return result;
} else {
throw new GlobalCheckException("该时间段已有预订,无法创建新的预订");
}
}
// 查询列表
async findAll(page = 1, pageSize = 10) {
const result = await this.prisma.bookings.paginate(page, pageSize, {
orderBy: {
id: "desc",
},
});
return result;
}
// 修改状态
async updateStatus(data: UpdateBookingDto) {
// 先查询预订是否存在
const booking = await this.prisma.bookings.findFirst({
where: {
id: data.id,
},
});
if (booking) {
const result = await this.prisma.bookings.update({
where: {
id: data.id,
},
data: {
status: data.status,
},
});
if (result) {
return "更新完毕";
} else {
throw new GlobalCheckException("更新失败");
}
}
}
// 删除预订
async delete(id: number) {
// 先去查询
const booking = await this.prisma.bookings.findFirst({
where: {
id: id,
},
});
if (booking) {
const result = await this.prisma.bookings.deleteMany({
where: {
id: id,
},
});
const result2 = await this.prisma.booking_attendees.deleteMany({
where: {
booking_id: id,
},
});
if (result) {
return "删除成功";
} else {
throw new GlobalCheckException("删除失败");
}
}
}
}Nest booking.dto.ts
create-booking.dto.ts
ts
import { IsString, IsNotEmpty, MaxLength } from "class-validator";
export class CreateBookingDto {
@IsNotEmpty({
message: "userId不能为空",
})
user_id: Number;
@IsNotEmpty({
message: "roomId不能为空",
})
room_id: Number;
@IsNotEmpty({
message: "开始时间不能为空",
})
start_time: String;
@IsNotEmpty({
message: "结束时间不能为空",
})
end_time: String;
@IsNotEmpty({
message: "状态不能为空",
})
status: Number;
@MaxLength(120, {
message: "备注不能超过120个字符",
})
note?: String;
booking_attendees?: any;
}update-booking.dto.ts
ts
import { IsString, IsNotEmpty, MaxLength } from "class-validator";
export class UpdateBookingDto {
@IsNotEmpty({
message: "bookingId不能为空",
})
id: number;
@IsNotEmpty({
message: "status不能为空",
})
status: number;
}list-booking.dto.ts
ts
import { IsString, IsNotEmpty, MaxLength } from "class-validator";
export class ListBookingDto {
@IsNotEmpty({
message: "page不能为空",
})
page: number; // 当前页数
@IsNotEmpty({
message: "size不能为空",
})
pageSize: number; // 每页显示条数
}