diff --git a/src/machine_details/entities/machine_detail.entity.ts b/src/machine_details/entities/machine_detail.entity.ts index 2d1af03046c811d8cc922d83bd648eff1213d9a0..85345f3974857919f32d429890b74b30b17f4c9b 100644 --- a/src/machine_details/entities/machine_detail.entity.ts +++ b/src/machine_details/entities/machine_detail.entity.ts @@ -26,5 +26,5 @@ export class MachineDetail { outputRate: number; @Column({ type: 'float', nullable: true }) - changOver?: number; + changeOver?: number; } diff --git a/src/queues/dto/create-queue.dto.ts b/src/queues/dto/create-queue.dto.ts index e50200214e1ca007d139c527059e33cf7fe86f78..dcbbb4aae80eef9ec5c25f863cd010988849ae92 100644 --- a/src/queues/dto/create-queue.dto.ts +++ b/src/queues/dto/create-queue.dto.ts @@ -49,7 +49,7 @@ export class CreateQueueDto { itemID: number; // ✅ เพิ่ม itemType - @IsEnum(['PRODUCT', 'MATERIAL']) + @IsEnum(['PRODUCT', 'MATERIAL', 'CHANGEOVER']) @IsNotEmpty() - itemType: 'PRODUCT' | 'MATERIAL'; + itemType: 'PRODUCT' | 'MATERIAL' | 'CHANGEOVER'; } diff --git a/src/queues/entities/queue.entity.ts b/src/queues/entities/queue.entity.ts index a2c28979ebddd7097172c6b63a4ed0ecd849b619..979f48746635eb660ed021e2c77501841c539174 100644 --- a/src/queues/entities/queue.entity.ts +++ b/src/queues/entities/queue.entity.ts @@ -69,6 +69,6 @@ export class Queue { @Column() itemID: number; - @Column({ type: 'enum', enum: ['PRODUCT', 'MATERIAL'] }) - itemType: 'PRODUCT' | 'MATERIAL'; + @Column({ type: 'enum', enum: ['PRODUCT', 'MATERIAL', 'CHANGEOVER'] }) + itemType: 'PRODUCT' | 'MATERIAL' | 'CHANGEOVER'; } diff --git a/src/queues/queues.service.ts b/src/queues/queues.service.ts index 55d21c85d2ca1748d577d155547be9fa806bf569..e28b155ee2822779a9895e4c76040b909d4ce113 100644 --- a/src/queues/queues.service.ts +++ b/src/queues/queues.service.ts @@ -340,16 +340,27 @@ export class QueuesService { : await this.orderRepository.findOneByOrFail({ OrderID: Number(OrderID), }); - const queueType = await this.queueTypeRepository.findOneByOrFail({ - TypeName: order ? 'ORDER' : 'ผลิตเผื่อ', - }); + + // --- กำหนด queueType ตาม itemType --- + let queueType; + if (itemType === 'CHANGEOVER') { + // ถ้า itemType เป็น CHANGEOVER ให้ใช้ QueueTypeID 3 + queueType = await this.queueTypeRepository.findOneByOrFail({ + QueueTypeID: 3, + }); + } else { + // สำหรับสินค้าปกติ ใช้เงื่อนไขเดิม + queueType = await this.queueTypeRepository.findOneByOrFail({ + TypeName: order ? 'ORDER' : 'ผลิตเผื่อ', + }); + } const employees = Array.isArray(EmployeeIds) && EmployeeIds.length > 0 ? await this.employeeRepository.findByIds(EmployeeIds.map(Number)) : []; - // ตรวจสอบ item + // ตรวจสอบ item สำหรับ PRODUCT กับ MATERIAL เท่านั้น if (itemType === 'PRODUCT') { await this.productRepository.findOneByOrFail({ ProductID: Number(itemID), @@ -358,7 +369,8 @@ export class QueuesService { await this.materialRepository.findOneByOrFail({ MaterialID: Number(itemID), }); - } else { + } else if (itemType !== 'CHANGEOVER') { + // ถ้า itemType ไม่ใช่ PRODUCT, MATERIAL, หรือ CHANGEOVER ให้ throw error throw new BadRequestException(`Invalid itemType: ${itemType}`); } @@ -381,9 +393,14 @@ export class QueuesService { // --- STEP 2: Save Queues --- const savedQueues = await this.queueRepository.save(newQueues); - // --- STEP 3: Group Queues by OrderID + Day + Item (สร้าง ProductionTarget เดิม) --- + // --- STEP 3: Group Queues by OrderID + Day + Item (สร้าง ProductionTarget) --- const targetMap = new Map<string, ProductionTarget>(); for (const q of savedQueues) { + // ข้ามคิวพิเศษ เช่นคิวที่มี itemType ไม่ใช่ PRODUCT หรือ MATERIAL + if (!['PRODUCT', 'MATERIAL'].includes(q.itemType)) { + continue; + } + const orderId = q.order ? q.order.OrderID : 'none'; const day = q.startTime ? q.startTime.toISOString().substring(0, 10) @@ -394,7 +411,6 @@ export class QueuesService { const existing = targetMap.get(key); if (existing) { existing.TargetProduced += producedQty; - if ( q.startTime && (!existing.startTime || q.startTime < existing.startTime) @@ -416,7 +432,7 @@ export class QueuesService { } else { const target = this.productionTargetRepository.create({ itemID: q.itemID, - itemType: q.itemType, + itemType: q.itemType as 'PRODUCT' | 'MATERIAL', order: q.order ?? null, page: q.page, TargetProduced: producedQty, // temporary, จะอัปเดตใหม่ @@ -438,9 +454,6 @@ export class QueuesService { // --- STEP 4: Reverse Deduction (แยกตาม OrderID และวัน) --- const deduction = await this._reverseDeduction(savedQueues); - // deduction จะได้ array ของ { orderId, day, key, leftover, totalProduced } - - // สร้าง map จาก deduction ด้วย global key = `${orderId}|${key}|${day}` const leftoverMap = new Map<string, number>(); for (const entry of deduction) { const globalKey = `${entry.orderId || 'none'}|${entry.key}|${entry.day}`;