From 8ff5c9e902074f7e371bcbaf07ed3b5edb6dac01 Mon Sep 17 00:00:00 2001 From: "CANCERYS\\kw093" Date: Fri, 3 Jul 2026 20:43:38 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A3=9C=E8=B2=A8=20FIX?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/DoReplenishmentRepository.kt | 13 +++++-- .../service/DoReplenishmentService.kt | 38 ++++++++++++++++--- .../service/DoWorkbenchMainService.kt | 2 + .../web/models/DoReplenishmentModels.kt | 1 + 4 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoReplenishmentRepository.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoReplenishmentRepository.kt index 5b7492a..e62d8a1 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoReplenishmentRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoReplenishmentRepository.kt @@ -25,19 +25,24 @@ interface DoReplenishmentRepository : AbstractRepository status: String, ): DoReplenishment? + fun findByDeliveryOrderPickOrderIdAndStatusAndDeletedIsFalse( + deliveryOrderPickOrderId: Long, + status: String, + ): List + @Query( """ SELECT r FROM DoReplenishment r - LEFT JOIN DeliveryOrder targetDo ON targetDo.id = r.targetDoId AND targetDo.deleted = false + LEFT JOIN DeliveryOrderPickOrder dopo ON dopo.id = r.deliveryOrderPickOrderId AND dopo.deleted = false WHERE r.deleted = false AND ( :deliveryDate IS NULL OR ( - targetDo.id IS NOT NULL - AND DATE(targetDo.estimatedArrivalDate) = :deliveryDate + dopo.id IS NOT NULL + AND dopo.requiredDeliveryDate = :deliveryDate ) OR ( - targetDo.id IS NULL + dopo.id IS NULL AND r.deliveryDate = :deliveryDate ) ) diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoReplenishmentService.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoReplenishmentService.kt index 2cc20c8..6085c70 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoReplenishmentService.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoReplenishmentService.kt @@ -8,6 +8,7 @@ import com.ffii.fpsms.modules.deliveryOrder.entity.DoReplenishment import com.ffii.fpsms.modules.deliveryOrder.entity.DoReplenishmentRepository import com.ffii.fpsms.modules.deliveryOrder.entity.DeliveryOrder import com.ffii.fpsms.modules.deliveryOrder.entity.DeliveryOrderLineRepository +import com.ffii.fpsms.modules.deliveryOrder.entity.DeliveryOrderPickOrderRepository import com.ffii.fpsms.modules.deliveryOrder.entity.DeliveryOrderRepository import com.ffii.fpsms.modules.deliveryOrder.enums.DeliveryOrderStatus import com.ffii.fpsms.modules.deliveryOrder.web.models.DoReplenishmentResponse @@ -20,6 +21,7 @@ import com.ffii.fpsms.modules.pickOrder.entity.PickOrderLine import com.ffii.fpsms.modules.pickOrder.entity.PickOrderLineRepository import com.ffii.fpsms.modules.pickOrder.entity.PickOrderRepository import com.ffii.fpsms.modules.stock.entity.StockOutLIneRepository +import com.ffii.fpsms.modules.stock.service.WorkbenchStockOutLinePickProgress import com.ffii.fpsms.modules.pickOrder.enums.PickOrderLineStatus import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -31,6 +33,7 @@ import java.time.format.DateTimeFormatter open class DoReplenishmentService( private val doReplenishmentRepository: DoReplenishmentRepository, private val deliveryOrderRepository: DeliveryOrderRepository, + private val deliveryOrderPickOrderRepository: DeliveryOrderPickOrderRepository, private val deliveryOrderLineRepository: DeliveryOrderLineRepository, private val doPickOrderRepository: DoPickOrderRepository, private val doPickOrderLineRepository: DoPickOrderLineRepository, @@ -207,6 +210,18 @@ open class DoReplenishmentService( doReplenishmentRepository.save(row) } + @Transactional + open fun completeProcessingByDeliveryOrderPickOrderId(deliveryOrderPickOrderId: Long) { + if (deliveryOrderPickOrderId <= 0L) return + val rows = doReplenishmentRepository.findByDeliveryOrderPickOrderIdAndStatusAndDeletedIsFalse( + deliveryOrderPickOrderId, + DoReplenishment.STATUS_PROCESSING, + ) + for (row in rows) { + row.pickOrderLineId?.let { completeByPickOrderLineId(it) } + } + } + /** * After workbench batch release links pick orders to a ticket, create replenishment POL rows * (no DOL), assign target DO / ticket FKs, and move status pending → processing. @@ -505,12 +520,12 @@ open class DoReplenishmentService( } } - val targetDoIds = entities.mapNotNull { it.targetDoId }.distinct() - val targetDoEtaById = if (targetDoIds.isEmpty()) { + val dopoIds = entities.mapNotNull { it.deliveryOrderPickOrderId }.distinct() + val targetDoRequiredDateByDopoId = if (dopoIds.isEmpty()) { emptyMap() } else { - deliveryOrderRepository.findAllById(targetDoIds).associate { deliveryOrder -> - deliveryOrder.id!! to deliveryOrder.estimatedArrivalDate?.toLocalDate() + deliveryOrderPickOrderRepository.findAllById(dopoIds).associate { dopo -> + dopo.id!! to dopo.requiredDeliveryDate } } @@ -525,6 +540,14 @@ open class DoReplenishmentService( fallbackQtyByKey = fallbackQtyBySourceKey, ) + val polIds = entities.mapNotNull { it.pickOrderLineId }.distinct() + val stockOutLinesByPolId = if (polIds.isEmpty()) { + emptyMap() + } else { + stockOutLIneRepository.findAllInfoByPickOrderLineIdInAndDeletedFalse(polIds) + .groupBy { it.pickOrderLineId } + } + return entities.map { row -> DoReplenishmentResponse( id = row.id!!, @@ -537,6 +560,11 @@ open class DoReplenishmentService( itemNo = row.itemNo, itemName = row.itemName, originalQty = actualShippedQtyBySourceKey[row.sourceDoId!! to row.itemId!!], + actualPickQty = row.pickOrderLineId?.let { polId -> + WorkbenchStockOutLinePickProgress.sumPickedQty( + stockOutLinesByPolId[polId].orEmpty(), + ) + }, replenishQty = row.replenishQty!!, shortUom = row.uomId?.let { shortUomById[it] }, shopCode = row.shopCode, @@ -544,7 +572,7 @@ open class DoReplenishmentService( truckLaneCode = row.truckLaneCode, targetDoId = row.targetDoId, targetDoCode = row.targetDoCode, - targetDoEstimatedArrivalDate = row.targetDoId?.let { targetDoEtaById[it] }, + targetDoEstimatedArrivalDate = row.deliveryOrderPickOrderId?.let { targetDoRequiredDateByDopoId[it] }, pickOrderLineId = row.pickOrderLineId, deliveryOrderPickOrderId = row.deliveryOrderPickOrderId, status = row.status, diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoWorkbenchMainService.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoWorkbenchMainService.kt index 5629356..6351d2b 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoWorkbenchMainService.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoWorkbenchMainService.kt @@ -1554,6 +1554,7 @@ return MessageResponse( deliveryOrderPickOrderRepository.save(dop) } markDeliveryOrdersCompletedForDeliveryOrderPickOrder(deliveryOrderPickOrderId) + doReplenishmentService.completeProcessingByDeliveryOrderPickOrderId(deliveryOrderPickOrderId) return MessageResponse( id = dop.id, code = "SUCCESS", @@ -2482,6 +2483,7 @@ return MessageResponse( mapOf("dopId" to dopId, "deliveryNoteCode" to newDeliveryNoteCode), ) markDeliveryOrdersCompletedForDeliveryOrderPickOrder(dopId) + doReplenishmentService.completeProcessingByDeliveryOrderPickOrderId(dopId) } /** * When a workbench ticket ([delivery_order_pick_order]) is completed, align linked [delivery_order] headers. diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/DoReplenishmentModels.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/DoReplenishmentModels.kt index a432a7a..6a67a09 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/DoReplenishmentModels.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/DoReplenishmentModels.kt @@ -42,6 +42,7 @@ data class DoReplenishmentResponse( val itemNo: String?, val itemName: String?, val originalQty: BigDecimal?, + val actualPickQty: BigDecimal?, val replenishQty: BigDecimal, val shortUom: String?, val shopCode: String?,