diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoPickOrderLineRecordRepository.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoPickOrderLineRecordRepository.kt index 2d49869..2ba912a 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoPickOrderLineRecordRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoPickOrderLineRecordRepository.kt @@ -1,12 +1,20 @@ package com.ffii.fpsms.modules.deliveryOrder.entity import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.data.jpa.repository.Query +import org.springframework.data.repository.query.Param import org.springframework.stereotype.Repository +import java.time.LocalDate @Repository interface DoPickOrderLineRecordRepository : JpaRepository { fun findByDoPickOrderIdAndDeletedFalse(doPickOrderId: Long): List fun findByDoOrderIdAndDeletedFalse(doOrderId: Long): List fun findByDoPickOrderIdInAndDeletedFalse(doPickOrderIds: Collection): List - + + fun findByDoPickOrderId(recordId: Long?): List + + @Query("SELECT d FROM DoPickOrderLineRecord d WHERE d.recordId = :recordId AND d.deleted = false") + fun findByRecordIdAndDeletedFalse(@Param("recordId") recordId: Long): List + } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoPickOrderRecordRepository.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoPickOrderRecordRepository.kt index c94e2db..b019545 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoPickOrderRecordRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoPickOrderRecordRepository.kt @@ -7,6 +7,7 @@ import com.ffii.fpsms.modules.deliveryOrder.enums.DoPickOrderStatus import com.ffii.fpsms.modules.master.entity.projections.SearchId import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.Query +import org.springframework.data.repository.query.Param import org.springframework.stereotype.Repository import java.io.Serializable import java.time.LocalDateTime @@ -26,4 +27,13 @@ interface DoPickOrderRecordRepository : JpaRepository { fun findByStoreIdAndRequiredDeliveryDateAndTicketStatusIn(storeId: String, requiredDeliveryDate: LocalDate, ticketStatus: List): List fun findByHandledByAndTicketStatusAndDeletedFalse(handledBy: Long, ticketStatus: DoPickOrderStatus): List + + @Query("SELECT d FROM DoPickOrderRecord d WHERE d.deleted = false ORDER BY d.ticketReleaseTime DESC NULLS LAST") + fun findAllByDeletedFalseOrderByTicketReleaseTimeDesc(): List + + @Query("SELECT d FROM DoPickOrderRecord d WHERE d.deleted = false AND d.requiredDeliveryDate BETWEEN :startDate AND :endDate ORDER BY d.ticketReleaseTime DESC NULLS LAST") + fun findAllByDeletedFalseAndRequiredDeliveryDateBetween( + @Param("startDate") startDate: LocalDate, + @Param("endDate") endDate: LocalDate + ): List } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoPickOrderRepository.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoPickOrderRepository.kt index 1d5af10..b41a34e 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoPickOrderRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoPickOrderRepository.kt @@ -34,21 +34,10 @@ fun findByStoreIdAndRequiredDeliveryDateAndTicketStatusIn( @Query("SELECT d FROM DoPickOrder d WHERE d.deleted = false ORDER BY d.requiredDeliveryDate ASC, d.truckDepartureTime ASC") fun findAllByDeletedFalseOrderByTicketReleaseTimeDesc(): List - @Query(""" - SELECT COUNT(DISTINCT pol.id) - FROM PickOrderLine pol - WHERE pol.pickOrder.id IN ( - SELECT DISTINCT dpol2.pickOrderId - FROM DoPickOrderLine dpol2 - WHERE dpol2.doPickOrderId IN ( - SELECT DISTINCT dpol1.doPickOrderId - FROM DoPickOrderLine dpol1 - WHERE dpol1.pickOrderId = :pickOrderId - AND dpol1.deleted = false - ) - AND dpol2.deleted = false - ) - AND pol.deleted = false - """) - fun countPickOrderLinesByRelatedPickOrderId(@Param("pickOrderId") pickOrderId: Long): Long + @Query("SELECT d FROM DoPickOrder d WHERE d.deleted = false AND d.requiredDeliveryDate BETWEEN :startDate AND :endDate ORDER BY d.ticketReleaseTime DESC NULLS LAST") + fun findAllByDeletedFalseAndRequiredDeliveryDateBetween( + @Param("startDate") startDate: LocalDate, + @Param("endDate") endDate: LocalDate + ): List + } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt index 51da506..87cce23 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt @@ -60,7 +60,6 @@ import java.io.FileNotFoundException import com.ffii.core.support.JdbcDao; import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecordRepository import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRepository -import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecord import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecordRepository import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRepository import com.ffii.fpsms.modules.deliveryOrder.web.models.ExportDNLabelsRequest @@ -68,15 +67,11 @@ import com.ffii.fpsms.modules.deliveryOrder.web.models.PrintDNLabelsRequest import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository import com.ffii.fpsms.modules.stock.entity.InventoryLotRepository import com.ffii.fpsms.modules.stock.service.InventoryLotService -import net.sf.jasperreports.engine.JasperPrintManager -import net.sf.jasperreports.engine.JRPrintPage import com.ffii.fpsms.modules.stock.entity.SuggestPickLotRepository import com.ffii.fpsms.modules.stock.service.SuggestedPickLotService // 添加这行 import com.ffii.fpsms.modules.deliveryOrder.web.models.* -import com.ffii.fpsms.modules.pickOrder.entity.PickExecutionIssue // 添加 import com.ffii.fpsms.modules.pickOrder.entity.PickExecutionIssueRepository // 添加 -import com.ffii.fpsms.modules.pickOrder.entity.IssueCategory // 添加 -import com.ffii.fpsms.modules.pickOrder.entity.HandleStatus + @Service open class DeliveryOrderService( private val deliveryOrderRepository: DeliveryOrderRepository, @@ -818,7 +813,7 @@ open class DeliveryOrderService( NoSuchElementException("DoPickOrderRecord not found with ID: ${request.doPickOrderId}") } - val doPickOrderLineRecords = doPickOrderLineRecordRepository.findByDoPickOrderIdAndDeletedFalse(request.doPickOrderId) + val doPickOrderLineRecords = doPickOrderLineRecordRepository.findByDoPickOrderId(doPickOrderRecord.recordId) val pickOrderIds = doPickOrderLineRecords.mapNotNull { it.pickOrderId }.distinct() if(pickOrderIds.isEmpty()){ @@ -974,7 +969,8 @@ open class DeliveryOrderService( val doPickOrderRecord = doPickOrderRecordRepository.findById(request.doPickOrderId).orElseThrow { NoSuchElementException("DoPickOrderRecord not found with ID: ${request.doPickOrderId}") } - val doPickOrderLineRecords = doPickOrderLineRecordRepository.findByDoPickOrderIdAndDeletedFalse(request.doPickOrderId) + + val doPickOrderLineRecords = doPickOrderLineRecordRepository.findByDoPickOrderId(doPickOrderRecord.recordId) val deliveryOrderIds = doPickOrderLineRecords.mapNotNull { it.doOrderId }.distinct() if(deliveryOrderIds.isEmpty()){ @@ -998,7 +994,11 @@ open class DeliveryOrderService( } - params["shopPurchaseOrderNo"] = doPickOrderRecord.deliveryOrderCode ?: cartonLabelInfo[0].code + params["shopPurchaseOrderNo"] = if (deliveryOrderIds.size > 0) { + "請查閲送貨單(採購單共${deliveryOrderIds.size}張)" + } else { + doPickOrderRecord.deliveryOrderCode ?: cartonLabelInfo[0].code + } params["deliveryNoteCode"] = doPickOrderRecord.deliveryNoteCode ?: "" params["shopAddress"] = cartonLabelInfo[0].shopAddress ?: "" params["shopName"] = doPickOrderRecord.shopName ?: cartonLabelInfo[0].shopName ?: "" diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoPickOrderService.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoPickOrderService.kt index ab54d81..5fa677c 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoPickOrderService.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoPickOrderService.kt @@ -46,6 +46,9 @@ import com.ffii.fpsms.modules.deliveryOrder.entity.DeliveryOrderRepository import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecordRepository import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecord import org.springframework.context.annotation.Lazy +import com.ffii.fpsms.modules.pickOrder.entity.PickOrderLineRepository +import com.ffii.fpsms.modules.deliveryOrder.web.models.TicketReleaseTableResponse + @Service open class DoPickOrderService( private val doPickOrderRepository: DoPickOrderRepository, @@ -56,8 +59,8 @@ open class DoPickOrderService( private val truckRepository: TruckRepository, private val doPickOrderLineRepository: DoPickOrderLineRepository, @Lazy private val deliveryOrderRepository: DeliveryOrderRepository, - - private val doPickOrderLineRecordRepository: DoPickOrderLineRecordRepository + private val doPickOrderLineRecordRepository: DoPickOrderLineRecordRepository, + private val pickOrderLineRepository: PickOrderLineRepository ) { open fun findReleasedDoPickOrders(): List { return doPickOrderRepository.findByTicketStatusIn( @@ -598,7 +601,121 @@ open class DoPickOrderService( } } - open fun getTicketReleaseTable(): List{ - return doPickOrderRepository.findAllByDeletedFalseOrderByTicketReleaseTimeDesc() + + open fun getTicketReleaseTable(startDate: LocalDate? = null, endDate: LocalDate? = null): List { + val doPickOrders = if (startDate != null && endDate != null) { + doPickOrderRepository.findAllByDeletedFalseAndRequiredDeliveryDateBetween(startDate, endDate) + } else { + doPickOrderRepository.findAllByDeletedFalseOrderByTicketReleaseTimeDesc() + } + + val doPickOrderRecords = if (startDate != null && endDate != null) { + doPickOrderRecordRepository.findAllByDeletedFalseAndRequiredDeliveryDateBetween(startDate, endDate) + } else { + doPickOrderRecordRepository.findAllByDeletedFalseOrderByTicketReleaseTimeDesc() + } + + val doPickOrderResponses = doPickOrders.map { doPickOrder -> + TicketReleaseTableResponse( + id = doPickOrder.id, + storeId = doPickOrder.storeId, + ticketNo = doPickOrder.ticketNo, + pickOrderId = doPickOrder.pickOrderId, + doOrderId = doPickOrder.doOrderId, + pickOrderCode = doPickOrder.pickOrderCode, + deliveryOrderCode = doPickOrder.deliveryOrderCode, + loadingSequence = doPickOrder.loadingSequence, + ticketStatus = doPickOrder.ticketStatus?.name, + truckId = doPickOrder.truckId, + truckDepartureTime = doPickOrder.truckDepartureTime, + shopId = doPickOrder.shopId, + handledBy = doPickOrder.handledBy, + ticketReleaseTime = doPickOrder.ticketReleaseTime, + ticketCompleteDateTime = doPickOrder.ticketCompleteDateTime, + truckLanceCode = doPickOrder.truckLanceCode, + shopCode = doPickOrder.shopCode, + shopName = doPickOrder.shopName, + requiredDeliveryDate = doPickOrder.requiredDeliveryDate, + handlerName = doPickOrder.handlerName, + numberOfFGItems = countFGItems(doPickOrder) + ) + } + + val doPickOrderRecordResponses = doPickOrderRecords.map { record -> + TicketReleaseTableResponse( + id = record.id, + storeId = record.storeId, + ticketNo = record.ticketNo, + pickOrderId = record.pickOrderId, + doOrderId = record.doOrderId, + pickOrderCode = record.pickOrderCode, + deliveryOrderCode = record.deliveryOrderCode, + loadingSequence = record.loadingSequence, + ticketStatus = record.ticketStatus?.name, + truckId = record.truckId, + truckDepartureTime = record.truckDepartureTime, + shopId = record.shopId, + handledBy = record.handledBy, + ticketReleaseTime = record.ticketReleaseTime, + ticketCompleteDateTime = record.ticketCompleteDateTime, + truckLanceCode = record.truckLanceCode, + shopCode = record.shopCode, + shopName = record.shopName, + requiredDeliveryDate = record.requiredDeliveryDate, + handlerName = record.handlerName, + numberOfFGItems = countFGItemsFromRecord(record) + ) + } + + return (doPickOrderResponses + doPickOrderRecordResponses).sortedByDescending { it.ticketReleaseTime?: LocalDateTime.MIN } + } + + private fun countFGItems(doPickOrder: DoPickOrder): Int { + val doPickOrderLines = doPickOrderLineRepository.findByDoPickOrderIdAndDeletedFalse(doPickOrder.id!!) + val pickOrderIds = doPickOrderLines.mapNotNull { it.pickOrderId }.distinct() + + if (pickOrderIds.isEmpty()) { + val directPickOrderId = doPickOrder.pickOrderId + if (directPickOrderId != null) { + val pickOrderLines = pickOrderLineRepository.findAllByPickOrderId(directPickOrderId) + return pickOrderLines.size + } + return 0 + } + val allPickOrderLines = pickOrderIds.flatMap { pickOrderId -> + pickOrderLineRepository.findAllByPickOrderId(pickOrderId) + } + return allPickOrderLines.size + } + + private fun countFGItemsFromRecord(doPickOrderRecord: DoPickOrderRecord): Int { + + // RECORD_ID FROM DO_PICK_ORDER_RECORD TABLE + val recordId = doPickOrderRecord.recordId + if (recordId == null) { + return 0 + } + + // DO_PICK_ORDER_ID FROM DO_PICK_ORDER_LINE_RECORD TABLE + val doPickOrderLineRecords = doPickOrderLineRecordRepository.findByDoPickOrderIdAndDeletedFalse(recordId) + if (doPickOrderLineRecords.isEmpty()) { + return 0 + } + + // RECORD_ID FROM DO_PICK_ORDER_LINE_RECORD TABLE + // POID FROM PICK_ORDER_LINE TABLE + val pickOrderIds = doPickOrderLineRecords.mapNotNull { it.pickOrderId }.distinct() + if (pickOrderIds.isEmpty()) { + return 0 + } + + val allPickOrderLines = pickOrderIds.flatMap { pickOrderId -> + val lines = pickOrderLineRepository.findAllByPickOrderId(pickOrderId) + lines + } + + return allPickOrderLines.size } + + }// 类结束 \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DoPickOrderController.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DoPickOrderController.kt index 4ab0d6c..788f88b 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DoPickOrderController.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DoPickOrderController.kt @@ -92,7 +92,11 @@ fun getBatchReleaseProgress(@PathVariable jobId: String): MessageResponse { } @GetMapping("/ticket-release-table") - fun getTicketReleaseTable(): List { - return doPickOrderService.getTicketReleaseTable() + fun getTicketReleaseTable( + @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) startDate: LocalDate?, + @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) endDate: LocalDate? + ): List { + return doPickOrderService.getTicketReleaseTable(startDate, endDate) } + } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/TicketReleaseTableResponse.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/TicketReleaseTableResponse.kt new file mode 100644 index 0000000..6c736c3 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/TicketReleaseTableResponse.kt @@ -0,0 +1,29 @@ +package com.ffii.fpsms.modules.deliveryOrder.web.models + +import java.time.LocalDateTime +import java.time.LocalDate +import java.time.LocalTime + +data class TicketReleaseTableResponse( + val id: Long?, + val storeId: String?, + val ticketNo: String?, + val pickOrderId: Long?, + val doOrderId: Long?, + val pickOrderCode: String?, + val deliveryOrderCode: String?, + val loadingSequence: Int?, + val ticketStatus: String?, + val truckId: Long?, + val truckDepartureTime: LocalTime?, + val shopId: Long?, + val handledBy: Long?, + val ticketReleaseTime: LocalDateTime?, + val ticketCompleteDateTime: LocalDateTime?, + val truckLanceCode: String?, + val shopCode: String?, + val shopName: String?, + val requiredDeliveryDate: LocalDate?, + val handlerName: String?, + val numberOfFGItems: Int = 0 +) \ No newline at end of file diff --git a/src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml b/src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml index fb33a40..3efb01e 100644 --- a/src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml +++ b/src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml @@ -1,7 +1,7 @@ - + @@ -14,7 +14,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -119,10 +119,10 @@ - + - + @@ -167,7 +167,7 @@ - + @@ -177,14 +177,14 @@ - + - - + + - - + + @@ -193,7 +193,7 @@ - + @@ -202,7 +202,7 @@ - + @@ -211,7 +211,7 @@ - + @@ -220,7 +220,7 @@ - + @@ -229,18 +229,18 @@ - + - + - + - + @@ -269,11 +269,11 @@ - + - + @@ -283,7 +283,7 @@ - + @@ -315,7 +315,7 @@ - + @@ -324,7 +324,7 @@ - + @@ -351,10 +351,10 @@ - + - + @@ -365,7 +365,7 @@ - +