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 fe07e97..142f160 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 @@ -7,7 +7,6 @@ import com.ffii.fpsms.modules.bag.service.BagService import com.ffii.fpsms.modules.bag.web.model.CreateBagLotLineRequest import com.ffii.fpsms.modules.common.CodeGenerator import com.ffii.fpsms.modules.deliveryOrder.entity.DeliveryOrderRepository -import com.ffii.fpsms.modules.deliveryOrder.entity.DoReplenishment import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecord import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecordRepository import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRepository @@ -131,7 +130,6 @@ open class DoWorkbenchMainService( private val printerService: PrinterService, private val itemsRepository: ItemsRepository, private val transactionManager: PlatformTransactionManager, - private val doReplenishmentService: DoReplenishmentService, ) { @PersistenceContext private lateinit var entityManager: EntityManager @@ -670,7 +668,13 @@ return MessageResponse( "4/F" -> "4/F" else -> storeId } - val releaseFilterClause = WorkbenchReleaseTypeSupport.summaryFilterSql(releaseType) + val rt = releaseType.lowercase() + val releaseFilterClause = when (rt) { + "batch" -> " AND LOWER(COALESCE(dop.releaseType, '')) = 'batch' " + "single" -> " AND LOWER(COALESCE(dop.releaseType, '')) = 'single' " + "isExtra" -> " AND LOWER(COALESCE(dop.releaseType, '')) = 'isExtra' " + else -> "" + } val sql = """ SELECT dop.truckDepartureTime AS truckDepartureTime, @@ -1064,7 +1068,6 @@ return MessageResponse( dop.deliveryNoteCode AS deliveryNoteCode, dop.cartonQty AS cartonQty, dop.handlerName AS handlerName, - dop.releaseType AS releaseType, GROUP_CONCAT(DISTINCT po.id ORDER BY po.id SEPARATOR ',') AS pickOrderIdsStr, GROUP_CONCAT(DISTINCT po.code ORDER BY po.code SEPARATOR ',') AS pickOrderCodesStr, GROUP_CONCAT(DISTINCT d.id ORDER BY d.id SEPARATOR ',') AS deliveryOrderIdsStr, @@ -1183,7 +1186,6 @@ return MessageResponse( shopAddress = null, fgPickOrders = emptyList(), handlerName = str(row, "handlerName"), - releaseType = str(row, "releaseType"), ) } } @@ -1217,7 +1219,6 @@ return MessageResponse( dop.deliveryNoteCode AS deliveryNoteCode, dop.cartonQty AS cartonQty, dop.handlerName AS handlerName, - dop.releaseType AS releaseType, GROUP_CONCAT(DISTINCT po.id ORDER BY po.id SEPARATOR ',') AS pickOrderIdsStr, GROUP_CONCAT(DISTINCT po.code ORDER BY po.code SEPARATOR ',') AS pickOrderCodesStr, GROUP_CONCAT(DISTINCT d.id ORDER BY d.id SEPARATOR ',') AS deliveryOrderIdsStr, @@ -1335,7 +1336,6 @@ return MessageResponse( shopAddress = null, fgPickOrders = emptyList(), handlerName = str(row, "handlerName"), - releaseType = str(row, "releaseType"), ) } } @@ -1681,7 +1681,9 @@ return MessageResponse( params["shopPat"] = "%${shopName.trim()}%" } val rtNorm = releaseTypeFilter?.trim()?.lowercase().orEmpty() - sqlBuilder.append(WorkbenchReleaseTypeSupport.summaryFilterSql(rtNorm)) + if (rtNorm == "isExtra") { + sqlBuilder.append(" AND LOWER(COALESCE(dop.releaseType, '')) = 'isExtra' ") + } sqlBuilder.append(" ORDER BY dop.requiredDeliveryDate, dop.truckDepartureTime, dop.truckLanceCode, dop.id ") val rows: List> = try { jdbcDao.queryForList(sqlBuilder.toString(), params) @@ -1765,9 +1767,7 @@ return MessageResponse( dop.truckDepartureTime as truck_departure_time, dop.shopCode as ShopCode, dop.shopName as ShopName, - dop.ticketStatus as doTicketStatus, - dop.requiredDeliveryDate as required_delivery_date, - dop.releaseType as release_type + dop.ticketStatus as doTicketStatus FROM fpsmsdb.delivery_order_pick_order dop WHERE dop.handledBy = :userId @@ -1794,7 +1794,7 @@ return MessageResponse( if (doPickOrderInfo == null) { println("❌ No delivery_order_pick_order found for workbench user $userId") val totalMs = (System.nanoTime() - wallStartNs) / 1_000_000 - log. info( + log.info( "workbench all-lots-hierarchical-workbench timing: userId={} totalMs={} detail={}", userId, totalMs, @@ -1896,8 +1896,7 @@ return MessageResponse( dop.truckDepartureTime as truck_departure_time, dop.shopCode as ShopCode, dop.shopName as ShopName, - dop.ticketStatus as doTicketStatus, - dop.releaseType as release_type + dop.ticketStatus as doTicketStatus FROM fpsmsdb.delivery_order_pick_order dop WHERE dop.id = :dopoId AND dop.deleted = 0 @@ -2372,7 +2371,6 @@ return MessageResponse( val changed = pickOrderLineRepository.markCompletedIfNotCompleted(pickOrderLineId) if (changed > 0) { pickOrderRepository.incrementSubmittedLines(poId) - doReplenishmentService.completeByPickOrderLineId(pickOrderLineId) } } @@ -2495,7 +2493,6 @@ return MessageResponse( pickOrderLineRepository.save( pol.apply { this.status = PickOrderLineStatus.COMPLETED }, ) - doReplenishmentService.completeByPickOrderLineId(pickOrderLineId) } } @@ -2683,21 +2680,6 @@ return MessageResponse( ) } - private fun buildDeliveryOrderCodeAll(deliveryNoteCode: String): String { - val sql = """ - SELECT DISTINCT do.code AS code - FROM delivery_order_pick_order dop - JOIN pick_order po ON po.deliveryOrderPickOrderId = dop.id AND po.deleted = 0 - JOIN delivery_order do ON do.id = po.doId - WHERE dop.deliveryNoteCode = :deliveryNoteCode - AND dop.deleted = 0 - ORDER BY do.code - """.trimIndent() - val codes = jdbcDao.queryForList(sql, mapOf("deliveryNoteCode" to deliveryNoteCode)) - .mapNotNull { row -> row["code"]?.toString() } - return deliveryOrderService.formatDoCodesPlain(codes) - } - open fun exportDeliveryNoteWorkbench(request: ExportDeliveryNoteRequest): Map { val DELIVERYNOTE_PDF = "DeliveryNote/DeliveryNotePDF.jrxml" val resource = ClassPathResource(DELIVERYNOTE_PDF) @@ -2763,13 +2745,6 @@ return MessageResponse( emptyMap() } - val deliveryOrders = deliveryOrderRepository.findAllById(ctx.deliveryOrderIds) - val deliveryOrderCodeById = deliveryOrders.associate { it.id!! to (it.code ?: "") } - val isExtraByDoId = deliveryOrders.associate { it.id!! to it.isExtra } - val headerIsMerge = ctx.header.ticketNo?.startsWith("TI-M-") == true - val headerTicketNo = ctx.header.ticketNo - val replenishPdfIndex = doReplenishmentService.buildReplenishPdfIndex(ctx.deliveryOrderIds) - sortedLines.forEach { row -> fields.add( deliveryOrderService.buildDeliveryNotePdfLineField( @@ -2781,38 +2756,6 @@ return MessageResponse( stockOutLinesByPickOrderLineId = stockOutLinesByPickOrderLineId, illById = illById, itemsById = itemsById, - deliveryOrderCodeById = deliveryOrderCodeById, - isExtraByDoId = isExtraByDoId, - headerTicketNo = headerTicketNo, - headerIsMerge = headerIsMerge, - replenishPdfIndex = replenishPdfIndex, - ), - ) - } - - val replenishmentOnlyRows = doReplenishmentService.replenishmentsWithoutDeliveryOrderLine( - ctx.deliveryOrderIds, - exportLines, - ) - replenishmentOnlyRows.sortedWith( - compareBy( - { it.targetDoId }, - { it.itemNo }, - { it.code }, - ), - ).forEach { replenishment -> - fields.add( - deliveryOrderService.buildDeliveryNotePdfLineFieldForReplenishment( - replenishment = replenishment, - sequenceNumber = fields.size + 1, - pickOrderLines = pickOrderLines, - stockOutLinesByPickOrderLineId = stockOutLinesByPickOrderLineId, - illById = illById, - itemsById = itemsById, - deliveryOrderCodeById = deliveryOrderCodeById, - isExtraByDoId = isExtraByDoId, - headerTicketNo = headerTicketNo, - headerIsMerge = headerIsMerge, ), ) } @@ -2823,17 +2766,14 @@ return MessageResponse( params["deliveryNoteCodeTitle"] = "送貨單編號:" params["deliveryNoteCode"] = ctx.header.deliveryNoteCode ?: "" params["numOfCarton"] = request.numOfCarton.toString().takeUnless { it == "0" } ?: "" - params["shopName"] = deliveryOrderService.formatShopNameForDeliveryNote( - ctx.header.shopName ?: deliveryNoteInfo[0].shopName ?: "", - ) + params["shopName"] = ctx.header.shopName ?: deliveryNoteInfo[0].shopName ?: "" params["shopAddress"] = deliveryNoteInfo[0].shopAddress ?: "" params["deliveryDate"] = ctx.header.requiredDeliveryDate?.format(DateTimeFormatter.ISO_LOCAL_DATE) ?: deliveryNoteInfo[0].estimatedArrivalDate?.format(DateTimeFormatter.ISO_LOCAL_DATE) ?: "" params["truckNo"] = ctx.header.truckLanceCode ?: "" - params["deliveryOrderCodeAll"] = ctx.header.deliveryNoteCode?.let(::buildDeliveryOrderCodeAll) - ?.takeIf { it.isNotBlank() } - ?: deliveryOrderService.formatDoCodesPlain(deliveryNoteInfo.map { it.code }) + params["ShopPurchaseOrderNo"] = deliveryNoteInfo.joinToString(", ") { it.code } + params["FGPickOrderNo"] = ctx.pickOrderCodes.joinToString(", ") params["loadingSequence"] = "" return mapOf( @@ -2850,6 +2790,7 @@ return MessageResponse( ExportDNLabelsRequest( doPickOrderId = request.doPickOrderId, numOfCarton = request.numOfCarton, + blankCartonNumber = request.blankCartonNumber, ), ) @@ -2870,7 +2811,9 @@ return MessageResponse( ) } } - updateWorkbenchCartonQty(request.doPickOrderId, request.numOfCarton) + if (request.blankCartonNumber != true) { + updateWorkbenchCartonQty(request.doPickOrderId, request.numOfCarton) + } } finally { //tempPdfFile.delete() } @@ -2916,13 +2859,21 @@ return MessageResponse( val params = workbenchCartonLabelParams(ctx, cartonLabelInfo) val fields = mutableListOf>() + val blankCartonNumber = request.blankCartonNumber == true for (cartonNumber in 1..request.numOfCarton) { fields.add( - mutableMapOf( - "cartonIndex" to cartonNumber, - "cartonTotal" to request.numOfCarton, - ) + if (blankCartonNumber) { + mutableMapOf( + "cartonIndex" to null, + "cartonTotal" to null, + ) + } else { + mutableMapOf( + "cartonIndex" to cartonNumber, + "cartonTotal" to request.numOfCarton, + ) + } as MutableMap, ) } diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDNLabelsRequest.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDNLabelsRequest.kt index 0e108bb..d6015b8 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDNLabelsRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDNLabelsRequest.kt @@ -3,4 +3,5 @@ package com.ffii.fpsms.modules.deliveryOrder.web.models data class ExportDNLabelsRequest ( val doPickOrderId: Long, val numOfCarton: Int, + val blankCartonNumber: Boolean? = false, ) diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDNLabelsRequest.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDNLabelsRequest.kt index 276e903..d86e0a0 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDNLabelsRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDNLabelsRequest.kt @@ -4,5 +4,6 @@ data class PrintDNLabelsRequest ( val doPickOrderId: Long, val printerId: Long, val printQty: Int?, - val numOfCarton: Int + val numOfCarton: Int, + val blankCartonNumber: Boolean? = false, ) \ No newline at end of file diff --git a/src/main/resources/DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml b/src/main/resources/DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml index 5a46005..b00d29b 100644 --- a/src/main/resources/DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml +++ b/src/main/resources/DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml @@ -147,7 +147,7 @@ - + @@ -157,7 +157,7 @@ - +