260322:1648 Correct Coresspondence / Doing RFA / Correct CI
CI Pipeline / build (push) Failing after 12m41s
Build and Deploy / deploy (push) Failing after 2m44s

This commit is contained in:
admin
2026-03-22 16:48:12 +07:00
parent e5deedb42e
commit 11984bfa29
683 changed files with 105251 additions and 29068 deletions
@@ -28,14 +28,12 @@
## 📝 Acceptance Criteria
1. **Contract Drawings:**
- ✅ Upload contract drawings
- ✅ Categorize by discipline
- ✅ Link to project/contract
- ✅ Search by drawing number
2. **Shop Drawings:**
- ✅ Create shop drawing with auto-number
- ✅ Create revisions
- ✅ Link to contract drawings
@@ -219,18 +217,10 @@ export class DrawingService {
) {}
// Contract Drawing Methods
async createContractDrawing(
dto: CreateContractDrawingDto,
userId: number
): Promise<ContractDrawing> {
async createContractDrawing(dto: CreateContractDrawingDto, userId: number): Promise<ContractDrawing> {
return this.dataSource.transaction(async (manager) => {
// Commit drawing file
const attachments = await this.fileStorage.commitFiles(
[dto.temp_file_id],
null,
'contract_drawing',
manager
);
const attachments = await this.fileStorage.commitFiles([dto.temp_file_id], null, 'contract_drawing', manager);
const contractDrawing = manager.create(ContractDrawing, {
drawing_number: dto.drawing_number,
@@ -247,9 +237,7 @@ export class DrawingService {
});
}
async findAllContractDrawings(
query: SearchDrawingDto
): Promise<PaginatedResult<ContractDrawing>> {
async findAllContractDrawings(query: SearchDrawingDto): Promise<PaginatedResult<ContractDrawing>> {
const queryBuilder = this.contractDrawingRepo
.createQueryBuilder('cd')
.leftJoinAndSelect('cd.contract', 'contract')
@@ -270,10 +258,9 @@ export class DrawingService {
}
if (query.search) {
queryBuilder.andWhere(
'(cd.drawing_number LIKE :search OR cd.drawing_title LIKE :search)',
{ search: `%${query.search}%` }
);
queryBuilder.andWhere('(cd.drawing_number LIKE :search OR cd.drawing_title LIKE :search)', {
search: `%${query.search}%`,
});
}
const page = query.page || 1;
@@ -290,10 +277,7 @@ export class DrawingService {
}
// Shop Drawing Methods
async createShopDrawing(
dto: CreateShopDrawingDto,
userId: number
): Promise<ShopDrawing> {
async createShopDrawing(dto: CreateShopDrawingDto, userId: number): Promise<ShopDrawing> {
return this.dataSource.transaction(async (manager) => {
// Generate drawing number
const drawingNumber = await this.docNumbering.generateNextNumber({
@@ -341,10 +325,7 @@ export class DrawingService {
// Link contract drawing references
if (dto.contract_drawing_ids?.length > 0) {
const contractDrawings = await manager.findByIds(
ContractDrawing,
dto.contract_drawing_ids
);
const contractDrawings = await manager.findByIds(ContractDrawing, dto.contract_drawing_ids);
shopDrawing.contractDrawingReferences = contractDrawings;
await manager.save(shopDrawing);
}
@@ -392,9 +373,7 @@ export class DrawingService {
});
}
async findAllShopDrawings(
query: SearchDrawingDto
): Promise<PaginatedResult<ShopDrawing>> {
async findAllShopDrawings(query: SearchDrawingDto): Promise<PaginatedResult<ShopDrawing>> {
const queryBuilder = this.shopDrawingRepo
.createQueryBuilder('sd')
.leftJoinAndSelect('sd.project', 'project')
@@ -409,21 +388,16 @@ export class DrawingService {
}
if (query.search) {
queryBuilder.andWhere(
'(sd.drawing_number LIKE :search OR sd.drawing_title LIKE :search)',
{ search: `%${query.search}%` }
);
queryBuilder.andWhere('(sd.drawing_number LIKE :search OR sd.drawing_title LIKE :search)', {
search: `%${query.search}%`,
});
}
const page = query.page || 1;
const limit = query.limit || 20;
const skip = (page - 1) * limit;
const [items, total] = await queryBuilder
.orderBy('sd.created_at', 'DESC')
.skip(skip)
.take(limit)
.getManyAndCount();
const [items, total] = await queryBuilder.orderBy('sd.created_at', 'DESC').skip(skip).take(limit).getManyAndCount();
return { items, total, page, limit, totalPages: Math.ceil(total / limit) };
}
@@ -431,12 +405,7 @@ export class DrawingService {
async findOneShopDrawing(id: number): Promise<ShopDrawing> {
const shopDrawing = await this.shopDrawingRepo.findOne({
where: { id, deleted_at: IsNull() },
relations: [
'revisions',
'revisions.attachments',
'contractDrawingReferences',
'project',
],
relations: ['revisions', 'revisions.attachments', 'contractDrawingReferences', 'project'],
order: { revisions: { revision_number: 'DESC' } },
});
@@ -462,10 +431,7 @@ export class DrawingController {
// Contract Drawings
@Post('contract')
@RequirePermission('drawing.create')
async createContractDrawing(
@Body() dto: CreateContractDrawingDto,
@CurrentUser() user: User
) {
async createContractDrawing(@Body() dto: CreateContractDrawingDto, @CurrentUser() user: User) {
return this.service.createContractDrawing(dto, user.user_id);
}
@@ -479,10 +445,7 @@ export class DrawingController {
@Post('shop')
@RequirePermission('drawing.create')
@UseInterceptors(IdempotencyInterceptor)
async createShopDrawing(
@Body() dto: CreateShopDrawingDto,
@CurrentUser() user: User
) {
async createShopDrawing(@Body() dto: CreateShopDrawingDto, @CurrentUser() user: User) {
return this.service.createShopDrawing(dto, user.user_id);
}