mirror of
https://github.com/Tria-plc/edr-platform.git
synced 2026-08-29 01:20:55 +00:00
Faciklity add
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
import type { FacilityStatus, FacilityType } from '../entities/facility.entity';
|
||||
|
||||
export class CreateFacilityDto {
|
||||
code!: string;
|
||||
name!: string;
|
||||
description?: string;
|
||||
facilityType!: FacilityType;
|
||||
facilityStatus?: FacilityStatus;
|
||||
locationName?: string;
|
||||
country?: string;
|
||||
city?: string;
|
||||
address?: string;
|
||||
latitude?: number;
|
||||
longitude?: number;
|
||||
capacity?: number;
|
||||
isActive?: boolean;
|
||||
notes?: string;
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
import type { FacilityStatus, FacilityType } from '../entities/facility.entity';
|
||||
|
||||
export class UpdateFacilityDto {
|
||||
code?: string;
|
||||
name?: string;
|
||||
description?: string;
|
||||
facilityType?: FacilityType;
|
||||
facilityStatus?: FacilityStatus;
|
||||
locationName?: string;
|
||||
country?: string;
|
||||
city?: string;
|
||||
address?: string;
|
||||
latitude?: number;
|
||||
longitude?: number;
|
||||
capacity?: number;
|
||||
isActive?: boolean;
|
||||
notes?: string;
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
import { BaseEntity } from '@edr/api-common';
|
||||
import { Column, Entity, Index, OneToMany } from 'typeorm';
|
||||
|
||||
import { Warehouse } from '../../warehouses/entities/warehouse.entity';
|
||||
|
||||
export const FACILITY_TYPES = ['PORT', 'DRY_PORT', 'TERMINAL', 'RAIL_YARD', 'WAREHOUSE_COMPLEX'] as const;
|
||||
export type FacilityType = (typeof FACILITY_TYPES)[number];
|
||||
|
||||
export const FACILITY_STATUSES = ['ACTIVE', 'INACTIVE', 'UNDER_MAINTENANCE'] as const;
|
||||
export type FacilityStatus = (typeof FACILITY_STATUSES)[number];
|
||||
|
||||
@Entity({ schema: 'freight', name: 'facilities' })
|
||||
@Index(['code'], { unique: true })
|
||||
@Index(['facilityStatus'])
|
||||
export class Facility extends BaseEntity {
|
||||
@Column({ name: 'code', type: 'varchar', length: 40, unique: true })
|
||||
code!: string;
|
||||
|
||||
@Column({ name: 'name', type: 'varchar', length: 160 })
|
||||
name!: string;
|
||||
|
||||
@Column({ name: 'description', type: 'text', nullable: true })
|
||||
description?: string | null;
|
||||
|
||||
@Column({ name: 'facility_type', type: 'varchar', length: 32 })
|
||||
facilityType!: FacilityType;
|
||||
|
||||
@Column({ name: 'facility_status', type: 'varchar', length: 32, default: 'ACTIVE' })
|
||||
facilityStatus!: FacilityStatus;
|
||||
|
||||
@Column({ name: 'location_name', type: 'varchar', length: 200, nullable: true })
|
||||
locationName?: string | null;
|
||||
|
||||
@Column({ name: 'country', type: 'varchar', length: 100, nullable: true })
|
||||
country?: string | null;
|
||||
|
||||
@Column({ name: 'city', type: 'varchar', length: 100, nullable: true })
|
||||
city?: string | null;
|
||||
|
||||
@Column({ name: 'address', type: 'text', nullable: true })
|
||||
address?: string | null;
|
||||
|
||||
@Column({ name: 'latitude', type: 'numeric', precision: 10, scale: 8, nullable: true })
|
||||
latitude?: number | null;
|
||||
|
||||
@Column({ name: 'longitude', type: 'numeric', precision: 11, scale: 8, nullable: true })
|
||||
longitude?: number | null;
|
||||
|
||||
@Column({ name: 'capacity', type: 'numeric', precision: 14, scale: 3, nullable: true })
|
||||
capacity?: number | null;
|
||||
|
||||
@Column({ name: 'is_active', type: 'boolean', default: true })
|
||||
isActive!: boolean;
|
||||
|
||||
@Column({ name: 'notes', type: 'text', nullable: true })
|
||||
notes?: string | null;
|
||||
|
||||
@OneToMany(() => Warehouse, (warehouse) => warehouse.facility)
|
||||
warehouses?: Warehouse[];
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
import { Body, Controller, Delete, Get, HttpCode, Param, Patch, Post } from '@nestjs/common';
|
||||
import { ApiOperation, ApiTags } from '@nestjs/swagger';
|
||||
|
||||
import { CreateFacilityDto } from './dto/create-facility.dto';
|
||||
import { UpdateFacilityDto } from './dto/update-facility.dto';
|
||||
import { Facility } from './entities/facility.entity';
|
||||
import { FacilitiesService } from './facilities.service';
|
||||
|
||||
@ApiTags('Facilities')
|
||||
@Controller('facilities')
|
||||
export class FacilitiesController {
|
||||
constructor(private readonly facilitiesService: FacilitiesService) {}
|
||||
|
||||
@Post()
|
||||
@ApiOperation({ summary: 'Create a new facility' })
|
||||
async create(@Body() createFacilityDto: CreateFacilityDto): Promise<Facility> {
|
||||
return this.facilitiesService.create(createFacilityDto);
|
||||
}
|
||||
|
||||
@Get()
|
||||
@ApiOperation({ summary: 'List all facilities' })
|
||||
async findAll(): Promise<Facility[]> {
|
||||
return this.facilitiesService.findAll();
|
||||
}
|
||||
|
||||
@Get(':id')
|
||||
@ApiOperation({ summary: 'Get a facility by ID' })
|
||||
async findOne(@Param('id') id: string): Promise<Facility | null> {
|
||||
return this.facilitiesService.findOne(id);
|
||||
}
|
||||
|
||||
@Patch(':id')
|
||||
@ApiOperation({ summary: 'Update a facility' })
|
||||
async update(@Param('id') id: string, @Body() updateFacilityDto: UpdateFacilityDto): Promise<Facility | null> {
|
||||
return this.facilitiesService.update(id, updateFacilityDto);
|
||||
}
|
||||
|
||||
@Delete(':id')
|
||||
@HttpCode(204)
|
||||
@ApiOperation({ summary: 'Delete a facility (soft delete)' })
|
||||
async remove(@Param('id') id: string): Promise<void> {
|
||||
return this.facilitiesService.remove(id);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
import { Module } from '@nestjs/common';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
|
||||
import { Facility } from './entities/facility.entity';
|
||||
import { FacilitiesController } from './facilities.controller';
|
||||
import { FacilitiesRepository } from './facilities.repository';
|
||||
import { FacilitiesService } from './facilities.service';
|
||||
|
||||
@Module({
|
||||
imports: [TypeOrmModule.forFeature([Facility])],
|
||||
controllers: [FacilitiesController],
|
||||
providers: [FacilitiesService, FacilitiesRepository],
|
||||
exports: [FacilitiesService, FacilitiesRepository],
|
||||
})
|
||||
export class FacilitiesModule {}
|
||||
@@ -0,0 +1,13 @@
|
||||
import { BaseRepository } from '@edr/api-common';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Repository } from 'typeorm';
|
||||
|
||||
import { Facility } from './entities/facility.entity';
|
||||
|
||||
@Injectable()
|
||||
export class FacilitiesRepository extends BaseRepository<Facility> {
|
||||
constructor(@InjectRepository(Facility) repository: Repository<Facility>) {
|
||||
super(repository);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
import { Injectable } from '@nestjs/common';
|
||||
|
||||
import { CreateFacilityDto } from './dto/create-facility.dto';
|
||||
import { UpdateFacilityDto } from './dto/update-facility.dto';
|
||||
import { Facility } from './entities/facility.entity';
|
||||
import { FacilitiesRepository } from './facilities.repository';
|
||||
|
||||
@Injectable()
|
||||
export class FacilitiesService {
|
||||
constructor(private readonly facilitiesRepository: FacilitiesRepository) {}
|
||||
|
||||
async create(createFacilityDto: CreateFacilityDto): Promise<Facility> {
|
||||
return this.facilitiesRepository.create(createFacilityDto);
|
||||
}
|
||||
|
||||
async findAll(): Promise<Facility[]> {
|
||||
return this.facilitiesRepository.findAll({ relations: ['warehouses'] });
|
||||
}
|
||||
|
||||
async findOne(id: string): Promise<Facility | null> {
|
||||
return this.facilitiesRepository.findById(id);
|
||||
}
|
||||
|
||||
async update(id: string, updateFacilityDto: UpdateFacilityDto): Promise<Facility | null> {
|
||||
return this.facilitiesRepository.update(id, updateFacilityDto);
|
||||
}
|
||||
|
||||
async remove(id: string): Promise<void> {
|
||||
return this.facilitiesRepository.softDelete(id);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
import { BaseEntity } from '@edr/api-common';
|
||||
import { Column, Entity, Index, OneToMany } from 'typeorm';
|
||||
import { Column, Entity, Index, ManyToOne, OneToMany } from 'typeorm';
|
||||
|
||||
import { Facility } from '../../facilities/entities/facility.entity';
|
||||
import { WarehouseYard } from './warehouse-yard.entity';
|
||||
|
||||
export const WAREHOUSE_TYPES = ['OPEN_WAREHOUSE', 'CLOSED_WAREHOUSE'] as const;
|
||||
@@ -58,6 +59,12 @@ export class Warehouse extends BaseEntity {
|
||||
@Column({ name: 'is_active', type: 'boolean', default: true })
|
||||
isActive!: boolean;
|
||||
|
||||
@Column({ name: 'facility_id', type: 'uuid', nullable: true })
|
||||
facilityId?: string | null;
|
||||
|
||||
@ManyToOne(() => Facility, (facility) => facility.warehouses, { nullable: true })
|
||||
facility?: Facility | null;
|
||||
|
||||
@OneToMany(() => WarehouseYard, (yard) => yard.warehouse)
|
||||
yards?: WarehouseYard[];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user