diff --git a/src/main/java/com/ffii/fpsms/modules/productProcess/service/ProductProcessService.kt b/src/main/java/com/ffii/fpsms/modules/productProcess/service/ProductProcessService.kt index e9347d6..deb4a17 100644 --- a/src/main/java/com/ffii/fpsms/modules/productProcess/service/ProductProcessService.kt +++ b/src/main/java/com/ffii/fpsms/modules/productProcess/service/ProductProcessService.kt @@ -1564,7 +1564,21 @@ open class ProductProcessService( val minPriority: Int, val ready: Boolean ) - + val candidateProcesses = productProcessRepository + .findByJobOrder_IdInAndDeletedIsFalse(candidateJobOrderIds) + + val candidateProcessIds = candidateProcesses.mapNotNull { it.id } + + val candidateLines = if (candidateProcessIds.isNotEmpty()) { + productProcessLineRepository.findByProductProcess_IdInWithOperatorAndEquipment(candidateProcessIds) + } else emptyList() + + val linesByJobOrder = candidateLines.groupBy { it.productProcess.jobOrder?.id ?: 0L } + + val done = { s: String? -> + val x = s?.trim()?.lowercase() + x == "completed" || x == "pass" + } val qcKeys = candidateAggregates.mapNotNull { agg -> val jobOrderId = agg.jobOrderId val stockInLine = stockInLineByJobOrderId[jobOrderId] @@ -1586,10 +1600,21 @@ open class ProductProcessService( val lineAggregate = lineStatusByJobOrderId[jobOrderId] val totalLines = lineAggregate?.totalLines ?: 0L - val doneLines = lineAggregate?.doneLines ?: 0L - val allLinesDone = totalLines > 0 && doneLines == totalLines - val ready = includedInList && allLinesDone && stockInLine != null + val done = { s: String? -> + val x = s?.trim()?.lowercase() + x == "completed" || x == "pass" + } + + + val jobLines = linesByJobOrder[jobOrderId].orEmpty() + val packing = jobLines.filter { (it.name ?: "").trim() == "包裝" } + val nonPacking = jobLines.filter { (it.name ?: "").trim() != "包裝" } + val nonPackingOk = nonPacking.isEmpty() || nonPacking.all { done(it.status) } + val packingOk = packing.isEmpty() || packing.any { done(it.status) } + + val ready = includedInList && stockInLine != null && nonPackingOk && packingOk + JobOrderQcKey( jobOrderId = jobOrderId, maxDate = agg.maxDate ?: LocalDate.MIN, @@ -1691,7 +1716,10 @@ open class ProductProcessService( val joPickOrdersList = if (pickOrderId != null) joPickOrdersByPickOrderId[pickOrderId].orEmpty() else emptyList() val productProcessLines = linesByProcessId[productProcess.id ?: 0L].orEmpty() - val finishedCount = productProcessLines.count { it.status == "Completed" } + val finishedCount = productProcessLines.count { + val s = it.status?.trim()?.lowercase() + s == "completed" || s == "pass" + } val bomIsDrink = productProcess.bom?.isDrink val matchStatus = if (joPickOrdersList.isNotEmpty() && diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLineRepository.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLineRepository.kt index 30e4dd2..9845433 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLineRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/StockInLineRepository.kt @@ -12,6 +12,11 @@ import java.time.LocalDate import java.time.LocalDateTime import org.springframework.data.repository.query.Param +interface JobOrderFirstLotNoProjection { + val jobOrderId: Long + val lotNo: String? +} + @Repository interface StockInLineRepository : AbstractRepository { @@ -164,4 +169,22 @@ fun findLatestLotNoByPrefix(@Param("prefix") prefix: String): String? """ ) fun findAllByJobOrder_IdInAndDeletedFalse(@Param("jobOrderIds") jobOrderIds: List): List + + @Query( + """ + SELECT sil.jobOrderId AS jobOrderId, sil.lotNo AS lotNo + FROM fpsmsdb.stock_in_line sil + WHERE sil.deleted = 0 + AND sil.jobOrderId IN (:jobOrderIds) + AND sil.id IN ( + SELECT MIN(s2.id) + FROM fpsmsdb.stock_in_line s2 + WHERE s2.deleted = 0 + AND s2.jobOrderId IN (:jobOrderIds) + GROUP BY s2.jobOrderId + ) + """, + nativeQuery = true + ) + fun findFirstLotNoByJobOrderIds(@Param("jobOrderIds") jobOrderIds: List): List } \ No newline at end of file