Skip to content

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; // 每页显示条数
}