|
|
@@ -1564,7 +1564,21 @@ open class ProductProcessService( |
|
|
val minPriority: Int, |
|
|
val minPriority: Int, |
|
|
val ready: Boolean |
|
|
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 qcKeys = candidateAggregates.mapNotNull { agg -> |
|
|
val jobOrderId = agg.jobOrderId |
|
|
val jobOrderId = agg.jobOrderId |
|
|
val stockInLine = stockInLineByJobOrderId[jobOrderId] |
|
|
val stockInLine = stockInLineByJobOrderId[jobOrderId] |
|
|
@@ -1586,10 +1600,21 @@ open class ProductProcessService( |
|
|
|
|
|
|
|
|
val lineAggregate = lineStatusByJobOrderId[jobOrderId] |
|
|
val lineAggregate = lineStatusByJobOrderId[jobOrderId] |
|
|
val totalLines = lineAggregate?.totalLines ?: 0L |
|
|
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( |
|
|
JobOrderQcKey( |
|
|
jobOrderId = jobOrderId, |
|
|
jobOrderId = jobOrderId, |
|
|
maxDate = agg.maxDate ?: LocalDate.MIN, |
|
|
maxDate = agg.maxDate ?: LocalDate.MIN, |
|
|
@@ -1691,7 +1716,10 @@ open class ProductProcessService( |
|
|
val joPickOrdersList = if (pickOrderId != null) joPickOrdersByPickOrderId[pickOrderId].orEmpty() else emptyList() |
|
|
val joPickOrdersList = if (pickOrderId != null) joPickOrdersByPickOrderId[pickOrderId].orEmpty() else emptyList() |
|
|
|
|
|
|
|
|
val productProcessLines = linesByProcessId[productProcess.id ?: 0L].orEmpty() |
|
|
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 bomIsDrink = productProcess.bom?.isDrink |
|
|
val matchStatus = if (joPickOrdersList.isNotEmpty() && |
|
|
val matchStatus = if (joPickOrdersList.isNotEmpty() && |
|
|
|