diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt index 9146fa0..971f2fa 100644 --- a/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt @@ -4,7 +4,7 @@ import com.ffii.core.response.RecordsRes import com.ffii.core.support.AbstractBaseEntityService import com.ffii.core.support.JdbcDao import com.ffii.fpsms.modules.common.SecurityUtils - +import com.ffii.fpsms.modules.common.CodeGenerator import com.ffii.fpsms.modules.jobOrder.entity.JobOrderRepository import com.ffii.fpsms.modules.master.entity.ItemsRepository import com.ffii.fpsms.modules.master.entity.UomConversionRepository @@ -1234,9 +1234,14 @@ open class PickOrderService( println("Stock out line ${line.id}: status=${line.status}, qty=${line.qty}") } - val unfinishedLines = stockOutLines.filter { - it.status != StockOutLineStatus.COMPLETE.status - && it.status != StockOutLineStatus.REJECTED.status + val unfinishedLines = stockOutLines.filter { sol -> + val status = sol.status?.trim()?.lowercase() + val isComplete = status == "completed" || status == StockOutLineStatus.COMPLETE.status.lowercase() + val isRejected = status == "rejected" || status == StockOutLineStatus.REJECTED.status.lowercase() + val isPartiallyComplete = status == "partially_completed" || status == StockOutLineStatus.PARTIALLY_COMPLETE.status.lowercase() + + // 只要是“结束态”(你认可的状态),就不算 unfinished + !(isComplete || isRejected || isPartiallyComplete) } println("Unfinished lines: ${unfinishedLines.size}") @@ -1334,7 +1339,11 @@ open class PickOrderService( } println(" All pick orders in this do_pick_order are completed, moving to record table") - + val prefix = "DN" + val midfix = CodeGenerator.DEFAULT_MIDFIX + val latestCode = doPickOrderRecordRepository.findLatestDeliveryNoteCodeByPrefix("${prefix}-${midfix}") + val deliveryNoteCode = CodeGenerator.generateNo(prefix = prefix, midfix = midfix, latestCode = latestCode) + // 2) 先复制 do_pick_order -> do_pick_order_record val dpoRecord = DoPickOrderRecord( recordId =dpo.id, @@ -1350,6 +1359,7 @@ open class PickOrderService( doOrderId = dpo.doOrderId, pickOrderCode = dpo.pickOrderCode, deliveryOrderCode = dpo.deliveryOrderCode, + deliveryNoteCode = deliveryNoteCode, loadingSequence = dpo.loadingSequence, ticketReleaseTime = dpo.ticketReleaseTime, ticketCompleteDateTime = java.time.LocalDateTime.now(), @@ -1365,7 +1375,7 @@ open class PickOrderService( val lineRecords = lines.map { l: DoPickOrderLine -> DoPickOrderLineRecord().apply { this.recordId=l.id - this.doPickOrderId = savedHeader.id + this.doPickOrderId = savedHeader.recordId this.pickOrderId = l.pickOrderId this.doOrderId = l.doOrderId this.pickOrderCode = l.pickOrderCode @@ -1483,9 +1493,18 @@ open class PickOrderService( } else { emptyList() } - val unfinishedLines = stockOutLines.filter { - it.status != StockOutLineStatus.COMPLETE.status - && it.status != StockOutLineStatus.REJECTED.status + val unfinishedLines = stockOutLines.filter { sol -> + val status = sol.status?.trim()?.lowercase() + + val isComplete = + status == "completed" || status == StockOutLineStatus.COMPLETE.status.lowercase() + val isRejected = + status == "rejected" || status == StockOutLineStatus.REJECTED.status.lowercase() + val isPartiallyComplete = + status == "partially_completed" || status == StockOutLineStatus.PARTIALLY_COMPLETE.status.lowercase() + + // 只要是你认可的“结束态”,就不算 unfinished + !(isComplete || isRejected || isPartiallyComplete) } println("📊 Stock out lines: ${stockOutLines.size}, Unfinished: ${unfinishedLines.size}") @@ -2403,9 +2422,20 @@ open class PickOrderService( emptyList() } - val unfinishedLines = stockOutLines.filter { - it.status != StockOutLineStatus.COMPLETE.status && it.status != StockOutLineStatus.REJECTED.status + val unfinishedLines = stockOutLines.filter { sol -> + val status = sol.status?.trim()?.lowercase() + + val isComplete = + status == "completed" || status == StockOutLineStatus.COMPLETE.status.lowercase() + val isRejected = + status == "rejected" || status == StockOutLineStatus.REJECTED.status.lowercase() + val isPartiallyComplete = + status == "partially_completed" || status == StockOutLineStatus.PARTIALLY_COMPLETE.status.lowercase() + + // 只要是结束态,就不算 unfinished + !(isComplete || isRejected || isPartiallyComplete) } + println("📊 Stock out lines: ${stockOutLines.size}, Unfinished: ${unfinishedLines.size}") mapOf( "pickOrderId" to pickOrder.id, diff --git a/src/main/java/com/ffii/fpsms/modules/stock/service/StockOutLineService.kt b/src/main/java/com/ffii/fpsms/modules/stock/service/StockOutLineService.kt index d94294c..7e54be0 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/service/StockOutLineService.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/service/StockOutLineService.kt @@ -37,6 +37,7 @@ import com.ffii.fpsms.modules.bag.web.model.CreateBagLotLineRequest import com.ffii.fpsms.modules.common.CodeGenerator import org.springframework.context.annotation.Lazy import com.ffii.fpsms.modules.bag.service.BagService +import com.ffii.fpsms.modules.pickOrder.service.PickOrderService import com.ffii.fpsms.modules.common.SecurityUtils import com.ffii.fpsms.modules.stock.entity.StockLedgerRepository import com.ffii.fpsms.modules.stock.entity.InventoryRepository @@ -62,6 +63,7 @@ private val doPickOrderLineRepository: DoPickOrderLineRepository, private val doPickOrderLineRecordRepository: DoPickOrderLineRecordRepository, private val inventoryLotLineService: InventoryLotLineService, private val bagService: BagService, + private val pickOrderService: PickOrderService, private val stockLedgerRepository: StockLedgerRepository, private val inventoryRepository: InventoryRepository, private val pickExecutionIssueRepository: PickExecutionIssueRepository @@ -1318,7 +1320,24 @@ if (submitQty > BigDecimal.ZERO && actualInventoryLotLineId != null) { println(" ✗ Error checking pick order line $pickOrderLineId: ${e.message}") } } + val affectedConsoCodes = affectedPickOrderIds + .mapNotNull { pickOrderId -> + val po = pickOrderRepository.findById(pickOrderId).orElse(null) + po?.consoCode + } + .filter { !it.isNullOrBlank() } + .distinct() +println("=== Checking completion by consoCode for ${affectedConsoCodes.size} affected consoCodes after batch submit ===") +affectedConsoCodes.forEach { consoCode -> + try { + val result = pickOrderService.checkAndCompletePickOrderByConsoCode(consoCode) + println(" -> checkAndCompletePickOrderByConsoCode($consoCode) result: code=${result.code}, message=${result.message}") + } catch (e: Exception) { + println(" ✗ Error checking completion for consoCode=$consoCode: ${e.message}") + e.printStackTrace() + } +} val msg = if (errors.isEmpty()) { "Batch submit success (${processedIds.size} lines)." } else {