| @@ -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 | |||
| @@ -29,4 +30,5 @@ fun findByStoreIdAndRequiredDeliveryDateAndTicketStatusIn( | |||
| requiredDeliveryDate: LocalDate, | |||
| status: List<DoPickOrderStatus> | |||
| ): List<DoPickOrder> | |||
| } | |||
| @@ -58,8 +58,10 @@ import org.springframework.core.io.ClassPathResource | |||
| import java.io.File | |||
| import java.io.FileNotFoundException | |||
| import com.ffii.core.support.JdbcDao; | |||
| 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 | |||
| import com.ffii.fpsms.modules.deliveryOrder.web.models.PrintDNLabelsRequest | |||
| import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository | |||
| @@ -100,6 +102,8 @@ open class DeliveryOrderService( | |||
| private val inventoryLotRepository: InventoryLotRepository, | |||
| private val jdbcDao: JdbcDao, | |||
| private val pickExecutionIssueRepository: PickExecutionIssueRepository, | |||
| private val doPickOrderRepository: DoPickOrderRepository, | |||
| private val doPickOrderLineRepository: DoPickOrderLineRepository, | |||
| ) { | |||
| open fun findByM18DataLogId(m18DataLogId: Long): DeliveryOrder? { | |||
| @@ -673,63 +677,104 @@ open class DeliveryOrderService( | |||
| if (!resource.exists()) { | |||
| throw FileNotFoundException("Report file not fount: $DELIVERYNOTE_PDF") | |||
| } | |||
| val inputStream = resource.inputStream | |||
| val deliveryNote = JasperCompileManager.compileReport(inputStream) | |||
| val deliveryNoteInfo = | |||
| deliveryOrderRepository.findDeliveryOrderInfoById(request.deliveryOrderIds).toMutableList() | |||
| val doPickOrder = doPickOrderRepository.findById(request.doPickOrderId).orElseThrow { | |||
| NoSuchElementException("DoPickOrder not found with ID: ${request.doPickOrderId}") | |||
| } | |||
| val pickOrderIds = if (doPickOrder.pickOrderId != null) { | |||
| // Single pick order case | |||
| listOf(doPickOrder.pickOrderId!!) | |||
| } else { | |||
| // Merged pick orders case - get from DoPickOrderLine | |||
| val doPickOrderLines = doPickOrderLineRepository.findByDoPickOrderIdAndDeletedFalse(doPickOrder.id!!) | |||
| val orderIds = doPickOrderLines.mapNotNull { it.pickOrderId }.distinct() | |||
| val fields = mutableListOf<MutableMap<String, Any>>() | |||
| val params = mutableMapOf<String, Any>() | |||
| if (orderIds.isEmpty()) { | |||
| throw IllegalStateException("DoPickOrder ${request.doPickOrderId} has no associated pick orders") | |||
| } | |||
| orderIds | |||
| } | |||
| val deliveryOrderEntity = deliveryOrderRepository.findByIdAndDeletedIsFalse(request.deliveryOrderIds) | |||
| val selectedTruckNo = deliveryOrderEntity?.shop?.id?.let { shopId -> | |||
| val trucks = truckRepository.findByShopIdAndDeletedFalse(shopId) | |||
| trucks.firstOrNull()?.truckLanceCode | |||
| } ?: "" | |||
| val deliveryOrderIds = if (doPickOrder.doOrderId != null) { | |||
| // Single delivery order case | |||
| listOf(doPickOrder.doOrderId!!) | |||
| } else { | |||
| // Merged delivery orders case - get from DoPickOrderLine | |||
| val doPickOrderLines = doPickOrderLineRepository.findByDoPickOrderIdAndDeletedFalse(doPickOrder.id!!) | |||
| val orderIds = doPickOrderLines.mapNotNull { it.doOrderId }.distinct() | |||
| val selectedPickOrder = pickOrderRepository.findById(request.pickOrderIds).orElse(null) | |||
| if (orderIds.isEmpty()) { | |||
| throw IllegalStateException("DoPickOrder ${request.doPickOrderId} has no associated delivery orders") | |||
| } | |||
| orderIds | |||
| } | |||
| val deliveryNoteInfo = deliveryOrderIds.flatMap { deliveryOrderId -> | |||
| deliveryOrderRepository.findDeliveryOrderInfoById(deliveryOrderId) | |||
| }.toMutableList() | |||
| for (info in deliveryNoteInfo) { | |||
| val sortedLines = info.deliveryOrderLines.sortedBy { line -> | |||
| line.itemId?.let { itemId -> | |||
| getWarehouseOrderByItemId(itemId) // ✅ 改用 warehouse order | |||
| } ?: Int.MAX_VALUE | |||
| } | |||
| if (deliveryNoteInfo.isEmpty()) { | |||
| throw NoSuchElementException("Delivery orders not found for IDs: $deliveryOrderIds") | |||
| } | |||
| sortedLines.forEachIndexed { index, line -> | |||
| val pickOrderId = pickOrderIds.first() | |||
| val field = mutableMapOf<String, Any>() | |||
| val inputStream = resource.inputStream | |||
| val deliveryNote = JasperCompileManager.compileReport(inputStream) | |||
| field["sequenceNumber"] = (index + 1).toString() | |||
| field["itemNo"] = line.itemNo | |||
| field["itemName"] = line.itemName ?: "" | |||
| field["uom"] = line.uom ?: "" | |||
| field["qty"] = line.qty.toString() | |||
| field["shortName"] = line.uomShortDesc ?: "" | |||
| val fields = mutableListOf<MutableMap<String, Any>>() | |||
| val params = mutableMapOf<String, Any>() | |||
| val route = line.itemId?.let { itemId -> | |||
| getWarehouseCodeByItemId(itemId) // ✅ 使用新方法 | |||
| } ?: "" | |||
| field["route"] = route | |||
| val truckNo = doPickOrder.truckLanceCode ?: "" | |||
| val selectedPickOrder = pickOrderRepository.findById(pickOrderId).orElse(null) | |||
| val lotNo = line.itemId?.let { itemId -> | |||
| getLotNumbersForPickOrderByItemId(itemId, request.pickOrderIds) | |||
| } ?: "" | |||
| field["lotNo"] = lotNo | |||
| val allLines = deliveryNoteInfo.flatMap { info -> | |||
| info.deliveryOrderLines.map { line -> line } | |||
| } | |||
| fields.add(field) | |||
| } | |||
| val sortedLines = allLines.sortedBy { line -> | |||
| line.itemId?.let { itemId -> | |||
| getWarehouseOrderByItemId(itemId) | |||
| } ?: Int.MAX_VALUE | |||
| } | |||
| sortedLines.forEach { line -> | |||
| val field = mutableMapOf<String, Any>() | |||
| field["sequenceNumber"] = (fields.size + 1).toString() | |||
| field["itemNo"] = line.itemNo | |||
| field["itemName"] = line.itemName ?: "" | |||
| field["uom"] = line.uom ?: "" | |||
| field["qty"] = line.qty.toString() | |||
| field["shortName"] = line.uomShortDesc ?: "" | |||
| val route = line.itemId?.let { itemId -> | |||
| getWarehouseCodeByItemId(itemId) | |||
| } ?: "" | |||
| field["route"] = route | |||
| val lotNo = line.itemId?.let { itemId -> | |||
| pickOrderIds.mapNotNull { pickOrderId -> | |||
| val lots = getLotNumbersForPickOrderByItemId(itemId, pickOrderId) | |||
| if (lots.isNotBlank()) lots else null | |||
| }.distinct().joinToString(", ") | |||
| } ?: "" | |||
| field["lotNo"] = lotNo | |||
| fields.add(field) | |||
| } | |||
| if (request.isDraft) { | |||
| params["dnTitle"] = "送貨單(初稿)" | |||
| params["colQty"] = "所需數量" | |||
| params["totalCartonTitle"] = "" | |||
| params["deliveryOrderCodeTitle"] = "" | |||
| params["deliveryOrderCode"] = "" | |||
| } else { | |||
| params["dnTitle"] = "送貨單" | |||
| params["colQty"] = "數量" | |||
| params["colQty"] = "已提數量" | |||
| params["totalCartonTitle"] = "總箱數:" | |||
| params["deliveryOrderCodeTitle"] = "送貨單編號:" | |||
| params["deliveryOrderCode"] = "GEN FROM CODE GENERATOR (NEED FIND TIMING)" | |||
| } | |||
| params["numOfCarton"] = request.numOfCarton.toString() | |||
| @@ -737,23 +782,20 @@ open class DeliveryOrderService( | |||
| params["numOfCarton"] = "" | |||
| } | |||
| params["deliveryOrderCode"] = deliveryNoteInfo[0].code | |||
| params["shopName"] = deliveryNoteInfo[0].shopName ?: "" | |||
| params["shopName"] = doPickOrder.shopName ?: deliveryNoteInfo[0].shopName ?:"" | |||
| params["shopAddress"] = deliveryNoteInfo[0].shopAddress ?: "" | |||
| params["deliveryDate"] = | |||
| deliveryNoteInfo[0].estimatedArrivalDate?.format(DateTimeFormatter.ISO_LOCAL_DATE) ?: "" | |||
| params["truckNo"] = selectedTruckNo | |||
| params["ShopPurchaseOrderNo"] = deliveryNoteInfo[0].code | |||
| params["FGPickOrderNo"] = selectedPickOrder?.code ?: "" | |||
| params["deliveryDate"] = deliveryNoteInfo[0].estimatedArrivalDate?.format(DateTimeFormatter.ISO_LOCAL_DATE) ?: "" | |||
| params["truckNo"] = truckNo | |||
| params["ShopPurchaseOrderNo"] = doPickOrder.deliveryOrderCode ?: deliveryNoteInfo.joinToString(", ") { it.code } | |||
| params["FGPickOrderNo"] = doPickOrder.pickOrderCode ?: selectedPickOrder?.code ?: "" | |||
| return mapOf( | |||
| "report" to PdfUtils.fillReport(deliveryNote, fields, params), | |||
| "filename" to deliveryNoteInfo[0].code | |||
| "filename" to deliveryNoteInfo.joinToString("_") { it.code } | |||
| ) | |||
| } | |||
| //Print Delivery Note | |||
| @Transactional | |||
| open fun printDeliveryNote(request: PrintDeliveryNoteRequest) { | |||
| @@ -761,10 +803,9 @@ open class DeliveryOrderService( | |||
| val pdf = exportDeliveryNote( | |||
| ExportDeliveryNoteRequest( | |||
| deliveryOrderIds = request.deliveryOrderId, | |||
| doPickOrderId = request.doPickOrderId, | |||
| numOfCarton = request.numOfCarton, | |||
| isDraft = request.isDraft, | |||
| pickOrderIds = request.pickOrderId | |||
| isDraft = request.isDraft | |||
| ) | |||
| ) | |||
| @@ -792,20 +833,30 @@ open class DeliveryOrderService( | |||
| if (!resource.exists()) { | |||
| throw FileNotFoundException("Label file not found: $DNLABELS_PDF") | |||
| } | |||
| val doPickOrder = doPickOrderRepository.findById(request.doPickOrderId).orElseThrow { | |||
| NoSuchElementException("DoPickOrder not found with ID: ${request.doPickOrderId}") | |||
| } | |||
| val deliveryOrderId = doPickOrder.doOrderId | |||
| ?: throw IllegalStateException("DoPickOrder has no associated delivery order") | |||
| val inputStream = resource.inputStream | |||
| val cartonLabel = JasperCompileManager.compileReport(inputStream) | |||
| val cartonLabelInfo = | |||
| deliveryOrderRepository.findDeliveryOrderInfoById(request.deliveryOrderIds).toMutableList() | |||
| deliveryOrderRepository.findDeliveryOrderInfoById(request.doPickOrderId).toMutableList() | |||
| val params = mutableMapOf<String, Any>() | |||
| val fields = mutableListOf<MutableMap<String, Any>>() | |||
| for (info in cartonLabelInfo) { | |||
| val field = mutableMapOf<String, Any>() | |||
| } | |||
| params["shopPurchaseOrderNo"] = cartonLabelInfo[0].code | |||
| params["deliveryOrderCode"] = cartonLabelInfo[0].code | |||
| params["shopPurchaseOrderNo"] = doPickOrder.deliveryOrderCode ?: cartonLabelInfo[0].code | |||
| params["deliveryOrderCode"] = "GEN FROM CODE GENERATOR (NEED FIND TIMING)" | |||
| params["shopAddress"] = cartonLabelInfo[0].shopAddress ?: "" | |||
| params["shopName"] = cartonLabelInfo[0].shopName ?: "" | |||
| params["shopName"] = doPickOrder.shopName ?: cartonLabelInfo[0].shopName ?: "" | |||
| for (cartonNumber in 1..request.numOfCarton) { | |||
| val field = mutableMapOf<String, Any>() | |||
| @@ -828,7 +879,7 @@ open class DeliveryOrderService( | |||
| val pdf = exportDNLabels( | |||
| ExportDNLabelsRequest( | |||
| deliveryOrderIds = request.deliveryOrderId, | |||
| doPickOrderId = request.doPickOrderId, | |||
| numOfCarton = request.numOfCarton | |||
| ) | |||
| ) | |||
| @@ -64,7 +64,7 @@ open class DoPickOrderService( | |||
| ) | |||
| } | |||
| fun getNextTicketNumber(datePrefix: String, storeId: String): String { | |||
| open fun getNextTicketNumber(datePrefix: String, storeId: String): String { | |||
| println("🔍 DEBUG: Getting next ticket number for date prefix: $datePrefix, store: $storeId") | |||
| try { | |||
| val sanitizedStoreId = storeId.replace("/", "") | |||
| @@ -92,18 +92,18 @@ open class DoPickOrderService( | |||
| } | |||
| } | |||
| fun save(record: DoPickOrder): DoPickOrder { | |||
| open fun save(record: DoPickOrder): DoPickOrder { | |||
| return doPickOrderRepository.save(record) | |||
| } | |||
| fun findByStoreIdOrderByTruckDepartureTime(storeId: String): List<DoPickOrder> { | |||
| open fun findByStoreIdOrderByTruckDepartureTime(storeId: String): List<DoPickOrder> { | |||
| return doPickOrderRepository.findByStoreIdAndTicketStatusOrderByTruckDepartureTimeAsc( | |||
| storeId, DoPickOrderStatus.pending | |||
| ) | |||
| } | |||
| // Add these missing methods | |||
| fun assignByStore(request: AssignByStoreRequest): MessageResponse { | |||
| open fun assignByStore(request: AssignByStoreRequest): MessageResponse { | |||
| // TODO: Implement store-based assignment logic | |||
| return MessageResponse( | |||
| id = null, | |||
| @@ -116,7 +116,7 @@ open class DoPickOrderService( | |||
| ) | |||
| } | |||
| fun releaseAssignedByStore(request: AssignByStoreRequest): MessageResponse { | |||
| open fun releaseAssignedByStore(request: AssignByStoreRequest): MessageResponse { | |||
| // TODO: Implement store-based release logic | |||
| return MessageResponse( | |||
| id = null, | |||
| @@ -130,7 +130,7 @@ open class DoPickOrderService( | |||
| } | |||
| // ✅ Updated method to set ticketReleaseTime when assigning order to user | |||
| fun updateHandledByForPickOrder(pickOrderId: Long, userId: Long): List<DoPickOrder> { | |||
| open fun updateHandledByForPickOrder(pickOrderId: Long, userId: Long): List<DoPickOrder> { | |||
| val doPickOrders = doPickOrderRepository.findByPickOrderId(pickOrderId) | |||
| val user = userRepository.findById(userId).orElse(null) // ✅ 改用 orElse(null) | |||
| val handlerName = user?.name ?: "Unknown" | |||
| @@ -143,7 +143,7 @@ open class DoPickOrderService( | |||
| return doPickOrderRepository.saveAll(doPickOrders) | |||
| } | |||
| fun completeDoPickOrdersForPickOrder(pickOrderId: Long): List<DoPickOrder> { | |||
| open fun completeDoPickOrdersForPickOrder(pickOrderId: Long): List<DoPickOrder> { | |||
| val doPickOrders = doPickOrderRepository.findByPickOrderId(pickOrderId) | |||
| doPickOrders.forEach { | |||
| it.ticketStatus = DoPickOrderStatus.completed | |||
| @@ -169,7 +169,7 @@ open class DoPickOrderService( | |||
| // ✅ New method to remove do_pick_order records when auto-assigning by store | |||
| // ✅ 修改方法:先复制记录到record表,再删除原记录 | |||
| @Transactional | |||
| fun removeDoPickOrdersForPickOrder(pickOrderId: Long): Int { | |||
| open fun removeDoPickOrdersForPickOrder(pickOrderId: Long): Int { | |||
| val doPickOrders = doPickOrderRepository.findByPickOrderId(pickOrderId) | |||
| var deletedCount = 0 | |||
| @@ -229,12 +229,12 @@ open class DoPickOrderService( | |||
| return deletedCount | |||
| } | |||
| fun saveRecord(record: DoPickOrderRecord): DoPickOrderRecord { | |||
| open fun saveRecord(record: DoPickOrderRecord): DoPickOrderRecord { | |||
| return doPickOrderRecordRepository.save(record) | |||
| } | |||
| // ✅ Add method to update DoPickOrderRecord status | |||
| fun updateRecordHandledByForPickOrder(pickOrderId: Long, userId: Long): List<DoPickOrderRecord> { | |||
| open fun updateRecordHandledByForPickOrder(pickOrderId: Long, userId: Long): List<DoPickOrderRecord> { | |||
| val doPickOrderRecords = doPickOrderRecordRepository.findByPickOrderId(pickOrderId) | |||
| val user = userRepository.findById(userId).orElse(null) // ✅ 改用 orElse(null) | |||
| val handlerName = user?.name ?: "Unknown" | |||
| @@ -248,7 +248,7 @@ open class DoPickOrderService( | |||
| } | |||
| // ✅ Add method to complete DoPickOrderRecord | |||
| fun completeDoPickOrderRecordsForPickOrder(pickOrderId: Long): List<DoPickOrderRecord> { | |||
| open fun completeDoPickOrderRecordsForPickOrder(pickOrderId: Long): List<DoPickOrderRecord> { | |||
| val doPickOrderRecords = doPickOrderRecordRepository.findByPickOrderId(pickOrderId) | |||
| doPickOrderRecords.forEach { | |||
| it.ticketStatus = DoPickOrderStatus.completed | |||
| @@ -258,18 +258,18 @@ open class DoPickOrderService( | |||
| } | |||
| // Add method to find do_pick_order records by pick order ID | |||
| fun findByPickOrderId(pickOrderId: Long): List<DoPickOrder> { | |||
| open fun findByPickOrderId(pickOrderId: Long): List<DoPickOrder> { | |||
| return doPickOrderRepository.findByPickOrderId(pickOrderId) | |||
| } | |||
| fun updateDoOrderIdForPickOrder(pickOrderId: Long, doOrderId: Long): List<DoPickOrder> { | |||
| open fun updateDoOrderIdForPickOrder(pickOrderId: Long, doOrderId: Long): List<DoPickOrder> { | |||
| val doPickOrders = doPickOrderRepository.findByPickOrderId(pickOrderId) | |||
| doPickOrders.forEach { | |||
| it.doOrderId = doOrderId | |||
| } | |||
| return doPickOrderRepository.saveAll(doPickOrders) | |||
| } | |||
| fun getSummaryByStore(storeId: String, requiredDate: LocalDate?): StoreLaneSummary { | |||
| open fun getSummaryByStore(storeId: String, requiredDate: LocalDate?): StoreLaneSummary { | |||
| val targetDate = requiredDate ?: LocalDate.now() | |||
| println("🔍 DEBUG: Getting summary for store=$storeId, date=$targetDate") | |||
| @@ -372,7 +372,7 @@ open class DoPickOrderService( | |||
| } | |||
| } | |||
| // ✅ 修复:把 assignByLane 移到类里面 | |||
| fun assignByLane(request: AssignByLaneRequest): MessageResponse { | |||
| open fun assignByLane(request: AssignByLaneRequest): MessageResponse { | |||
| val user = userRepository.findById(request.userId).orElse(null) | |||
| ?: return MessageResponse( | |||
| id = null, code = "USER_NOT_FOUND", name = null, type = null, | |||
| @@ -41,6 +41,7 @@ class DoReleaseCoordinatorService( | |||
| private val poolSize = Runtime.getRuntime().availableProcessors() | |||
| private val executor = Executors.newFixedThreadPool(min(poolSize, 4)) | |||
| private val jobs = ConcurrentHashMap<String, BatchReleaseJobStatus>() | |||
| private fun updateBatchTicketNumbers() { | |||
| try { | |||
| val updateSql = """ | |||
| @@ -188,6 +189,7 @@ class DoReleaseCoordinatorService( | |||
| e.printStackTrace() | |||
| } | |||
| } | |||
| private fun getOrderedDeliveryOrderIds(ids: List<Long>): List<Long> { | |||
| try { | |||
| println("🔍 DEBUG: Getting ordered IDs for ${ids.size} orders") | |||
| @@ -492,7 +494,7 @@ class DoReleaseCoordinatorService( | |||
| "4F" -> "4/F" | |||
| else -> "2/F" | |||
| } | |||
| val doPickOrder = DoPickOrder( | |||
| storeId = storeId, | |||
| ticketNo = "TEMP-${System.currentTimeMillis()}", | |||
| @@ -1,6 +1,6 @@ | |||
| package com.ffii.fpsms.modules.deliveryOrder.web.models | |||
| data class ExportDNLabelsRequest ( | |||
| val deliveryOrderIds: Long, | |||
| val doPickOrderId: Long, | |||
| val numOfCarton: Int, | |||
| ) | |||
| @@ -2,8 +2,7 @@ package com.ffii.fpsms.modules.deliveryOrder.web.models | |||
| import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository | |||
| data class ExportDeliveryNoteRequest ( | |||
| val deliveryOrderIds: Long, | |||
| val doPickOrderId: Long, | |||
| val numOfCarton: Int, | |||
| val isDraft: Boolean, | |||
| val pickOrderIds: Long, | |||
| ) | |||
| @@ -1,8 +1,8 @@ | |||
| package com.ffii.fpsms.modules.deliveryOrder.web.models | |||
| data class PrintDNLabelsRequest ( | |||
| val deliveryOrderId: Long, | |||
| val doPickOrderId: Long, | |||
| val printerId: Long, | |||
| val printQty: Int?, | |||
| val numOfCarton: Int, | |||
| val numOfCarton: Int | |||
| ) | |||
| @@ -1,10 +1,9 @@ | |||
| package com.ffii.fpsms.modules.deliveryOrder.web.models | |||
| data class PrintDeliveryNoteRequest( | |||
| val deliveryOrderId: Long, | |||
| val doPickOrderId: Long, | |||
| val printerId: Long, | |||
| val printQty: Int?, | |||
| val numOfCarton: Int, | |||
| val isDraft: Boolean, | |||
| val pickOrderId: Long, | |||
| ) | |||
| @@ -713,6 +713,8 @@ open fun createBatchReleaseIssue( | |||
| FROM fpsmsdb.delivery_order_line dol | |||
| INNER JOIN fpsmsdb.items i ON i.id = dol.itemId | |||
| WHERE dol.deliveryOrderId = :deliveryOrderId | |||
| INNER JOIN fpsmsdb.items i ON i.id = dol.itemId | |||
| WHERE dol.doId = :deliveryOrderId | |||
| AND dol.deleted = 0 | |||
| """.trimIndent() | |||
| @@ -736,11 +738,11 @@ open fun createBatchReleaseIssue( | |||
| val issue = PickExecutionIssue( | |||
| id = null, | |||
| pickOrderId = null, // batch release 失败时可能还没有 pick order | |||
| pickOrderId = 0L, // batch release 失败时可能还没有 pick order | |||
| pickOrderCode = deliveryOrder["code"] as? String ?: "", | |||
| pickOrderCreateDate = LocalDate.now(), | |||
| pickExecutionDate = LocalDate.now(), | |||
| pickOrderLineId = null, // batch release 失败时可能还没有 pick order line | |||
| pickOrderLineId = 0L, // batch release 失败时可能还没有 pick order line | |||
| issueNo = issueNo, | |||
| joPickOrderId = null, | |||
| doPickOrderId = null, | |||
| @@ -1,15 +1,6 @@ | |||
| <?xml version="1.0" encoding="UTF-8"?> | |||
| <!-- Created with Jaspersoft Studio version 6.17.0.final using JasperReports Library version 6.17.0-6d93193241dd8cc42629e188b94f9e0bc5722efd --> | |||
| <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="DeliveryNotePDF" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" isIgnorePagination="true" uuid="36f9d415-527f-4152-b7b0-eea81fe06f73"> | |||
| <property name="com.jaspersoft.studio.unit." value="pixel"/> | |||
| <property name="com.jaspersoft.studio.unit.pageHeight" value="pixel"/> | |||
| <property name="com.jaspersoft.studio.unit.pageWidth" value="pixel"/> | |||
| <property name="com.jaspersoft.studio.unit.topMargin" value="pixel"/> | |||
| <property name="com.jaspersoft.studio.unit.bottomMargin" value="pixel"/> | |||
| <property name="com.jaspersoft.studio.unit.leftMargin" value="pixel"/> | |||
| <property name="com.jaspersoft.studio.unit.rightMargin" value="pixel"/> | |||
| <property name="com.jaspersoft.studio.unit.columnWidth" value="pixel"/> | |||
| <property name="com.jaspersoft.studio.unit.columnSpacing" value="pixel"/> | |||
| <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="DeliveryNotePDF" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="36f9d415-527f-4152-b7b0-eea81fe06f73"> | |||
| <parameter name="deliveryOrderCode" class="java.lang.String"> | |||
| <parameterDescription><![CDATA[DeliveryOrderCode]]></parameterDescription> | |||
| </parameter> | |||
| @@ -159,17 +150,7 @@ | |||
| <pageHeader> | |||
| <band height="110"> | |||
| <staticText> | |||
| <reportElement x="0" y="10" width="110" height="18" uuid="7f991bbe-caf4-43c1-b8e1-d85b1f2d3815"> | |||
| <property name="com.jaspersoft.studio.unit.y" value="px"/> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement textAlignment="Left" verticalAlignment="Middle"> | |||
| <font fontName="微軟正黑體" size="12"/> | |||
| </textElement> | |||
| <text><![CDATA[送貨單編號:]]></text> | |||
| </staticText> | |||
| <staticText> | |||
| <reportElement x="0" y="30" width="110" height="18" uuid="7bdf9657-d5d2-4fbf-a6c3-a5da5b292dc8"> | |||
| <reportElement x="0" y="10" width="110" height="18" uuid="7bdf9657-d5d2-4fbf-a6c3-a5da5b292dc8"> | |||
| <property name="com.jaspersoft.studio.unit.y" value="px"/> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| @@ -179,7 +160,7 @@ | |||
| <text><![CDATA[送貨日期:]]></text> | |||
| </staticText> | |||
| <staticText> | |||
| <reportElement x="275" y="10" width="110" height="18" uuid="f53e2068-dd24-4151-bd2a-033c6cbda674"> | |||
| <reportElement x="0" y="30" width="110" height="18" uuid="f53e2068-dd24-4151-bd2a-033c6cbda674"> | |||
| <property name="com.jaspersoft.studio.unit.y" value="px"/> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| @@ -193,20 +174,11 @@ | |||
| <property name="com.jaspersoft.studio.unit.y" value="px"/> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement textAlignment="Left" verticalAlignment="Middle"> | |||
| <textElement textAlignment="Left" verticalAlignment="Top"> | |||
| <font fontName="微軟正黑體" size="12"/> | |||
| </textElement> | |||
| <text><![CDATA[店鋪採購單編號:]]></text> | |||
| </staticText> | |||
| <textField> | |||
| <reportElement x="110" y="10" width="150" height="18" uuid="69d21d74-e625-41e9-b4bb-abde259d6620"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement verticalAlignment="Middle"> | |||
| <font fontName="微軟正黑體"/> | |||
| </textElement> | |||
| <textFieldExpression><![CDATA[$P{deliveryOrderCode}]]></textFieldExpression> | |||
| </textField> | |||
| <textField> | |||
| <reportElement x="110" y="50" width="425" height="54" uuid="24a1331c-e50f-4a72-9a41-3e05b85f4c21"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| @@ -217,7 +189,7 @@ | |||
| <textFieldExpression><![CDATA[$P{ShopPurchaseOrderNo}]]></textFieldExpression> | |||
| </textField> | |||
| <textField> | |||
| <reportElement x="385" y="10" width="150" height="18" uuid="78f29b7d-c311-4c53-9c66-fda8752c9797"> | |||
| <reportElement x="110" y="30" width="150" height="18" uuid="78f29b7d-c311-4c53-9c66-fda8752c9797"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement verticalAlignment="Middle"> | |||
| @@ -226,7 +198,7 @@ | |||
| <textFieldExpression><![CDATA[$P{FGPickOrderNo}]]></textFieldExpression> | |||
| </textField> | |||
| <textField> | |||
| <reportElement x="110" y="30" width="150" height="18" uuid="e67b4047-642b-46f5-8ec7-785ead88b97e"> | |||
| <reportElement x="110" y="10" width="150" height="18" uuid="e67b4047-642b-46f5-8ec7-785ead88b97e"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement verticalAlignment="Middle"> | |||
| @@ -235,7 +207,7 @@ | |||
| <textFieldExpression><![CDATA[$P{deliveryDate}]]></textFieldExpression> | |||
| </textField> | |||
| <textField> | |||
| <reportElement x="385" y="30" width="150" height="18" uuid="8062f7b6-8917-432a-a02c-e5a5766c14e5"> | |||
| <reportElement x="385" y="10" width="150" height="18" uuid="8062f7b6-8917-432a-a02c-e5a5766c14e5"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement verticalAlignment="Middle"> | |||
| @@ -244,7 +216,7 @@ | |||
| <textFieldExpression><![CDATA[$P{numOfCarton}]]></textFieldExpression> | |||
| </textField> | |||
| <textField> | |||
| <reportElement x="275" y="30" width="110" height="18" uuid="25254ea4-e2b2-4ae0-975b-99c8f9390a64"> | |||
| <reportElement x="275" y="10" width="110" height="18" uuid="25254ea4-e2b2-4ae0-975b-99c8f9390a64"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement verticalAlignment="Middle"> | |||
| @@ -252,12 +224,30 @@ | |||
| </textElement> | |||
| <textFieldExpression><![CDATA[$P{totalCartonTitle}]]></textFieldExpression> | |||
| </textField> | |||
| <textField> | |||
| <reportElement x="385" y="30" width="150" height="18" uuid="69d21d74-e625-41e9-b4bb-abde259d6620"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement verticalAlignment="Middle"> | |||
| <font fontName="微軟正黑體"/> | |||
| </textElement> | |||
| <textFieldExpression><![CDATA[$P{deliveryOrderCode}]]></textFieldExpression> | |||
| </textField> | |||
| <textField> | |||
| <reportElement x="275" y="30" width="110" height="18" uuid="db59b94d-5a33-4c84-98d9-30b8b86bd018"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement verticalAlignment="Middle"> | |||
| <font fontName="微軟正黑體"/> | |||
| </textElement> | |||
| <textFieldExpression><![CDATA[$P{deliveryOrderCodeTitle}]]></textFieldExpression> | |||
| </textField> | |||
| </band> | |||
| </pageHeader> | |||
| <columnHeader> | |||
| <band height="33"> | |||
| <staticText> | |||
| <reportElement x="0" y="5" width="50" height="18" uuid="d0d76c93-d260-4b03-b116-6e7ba1fdbdd8"> | |||
| <reportElement x="0" y="5" width="40" height="18" uuid="d0d76c93-d260-4b03-b116-6e7ba1fdbdd8"> | |||
| <property name="com.jaspersoft.studio.unit.y" value="px"/> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||
| @@ -268,7 +258,7 @@ | |||
| <text><![CDATA[序號]]></text> | |||
| </staticText> | |||
| <staticText> | |||
| <reportElement x="50" y="5" width="110" height="18" uuid="58a5c922-fd98-4997-9b17-16bdf9f78519"> | |||
| <reportElement x="40" y="5" width="110" height="18" uuid="58a5c922-fd98-4997-9b17-16bdf9f78519"> | |||
| <property name="com.jaspersoft.studio.unit.y" value="px"/> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||
| @@ -279,7 +269,7 @@ | |||
| <text><![CDATA[路綫]]></text> | |||
| </staticText> | |||
| <staticText> | |||
| <reportElement x="160" y="5" width="80" height="18" uuid="65c27cc0-f806-4930-930c-6b3fd632a52f"> | |||
| <reportElement x="150" y="4" width="80" height="18" uuid="65c27cc0-f806-4930-930c-6b3fd632a52f"> | |||
| <property name="com.jaspersoft.studio.unit.y" value="px"/> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| @@ -289,7 +279,7 @@ | |||
| <text><![CDATA[貨品編號]]></text> | |||
| </staticText> | |||
| <staticText> | |||
| <reportElement x="240" y="5" width="230" height="18" uuid="fa7ba1d5-003a-4c99-8a2f-4162756ee515"> | |||
| <reportElement x="230" y="5" width="240" height="18" uuid="fa7ba1d5-003a-4c99-8a2f-4162756ee515"> | |||
| <property name="com.jaspersoft.studio.unit.y" value="px"/> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| @@ -325,28 +315,28 @@ | |||
| <detail> | |||
| <band height="42"> | |||
| <textField> | |||
| <reportElement x="0" y="1" width="50" height="18" uuid="ae87b739-dadf-452a-bc35-8c2da1a6a9a8"> | |||
| <reportElement x="0" y="1" width="40" height="18" uuid="ae87b739-dadf-452a-bc35-8c2da1a6a9a8"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement verticalAlignment="Top"> | |||
| <textElement verticalAlignment="Middle"> | |||
| <font fontName="微軟正黑體"/> | |||
| </textElement> | |||
| <textFieldExpression><![CDATA[$F{sequenceNumber}]]></textFieldExpression> | |||
| </textField> | |||
| <textField> | |||
| <reportElement x="50" y="1" width="110" height="18" uuid="b4bcfa6c-5d2e-4fba-815a-cc2fccd39213"> | |||
| <reportElement x="40" y="1" width="110" height="18" uuid="b4bcfa6c-5d2e-4fba-815a-cc2fccd39213"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement verticalAlignment="Top"> | |||
| <textElement verticalAlignment="Middle"> | |||
| <font fontName="微軟正黑體"/> | |||
| </textElement> | |||
| <textFieldExpression><![CDATA[$F{route}]]></textFieldExpression> | |||
| </textField> | |||
| <textField> | |||
| <reportElement x="160" y="1" width="80" height="18" uuid="3e4a71e7-d6e1-4da8-ae58-ef752c289a6d"> | |||
| <reportElement x="150" y="0" width="80" height="18" uuid="3e4a71e7-d6e1-4da8-ae58-ef752c289a6d"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement verticalAlignment="Top"> | |||
| <textElement verticalAlignment="Middle"> | |||
| <font fontName="微軟正黑體"/> | |||
| </textElement> | |||
| <textFieldExpression><![CDATA[$F{itemNo}]]></textFieldExpression> | |||
| @@ -355,16 +345,16 @@ | |||
| <reportElement x="470" y="0" width="84" height="18" uuid="e60b7a29-273a-4a9f-a443-f4977292c429"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement verticalAlignment="Top"> | |||
| <textElement verticalAlignment="Middle"> | |||
| <font fontName="微軟正黑體"/> | |||
| </textElement> | |||
| <textFieldExpression><![CDATA[$F{qty} + $F{shortName}]]></textFieldExpression> | |||
| </textField> | |||
| <textField> | |||
| <reportElement x="240" y="1" width="230" height="18" uuid="c2b4da75-fdca-4e99-8103-5769dea75841"> | |||
| <reportElement x="230" y="1" width="240" height="18" uuid="c2b4da75-fdca-4e99-8103-5769dea75841"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement verticalAlignment="Top"> | |||
| <textElement verticalAlignment="Middle"> | |||
| <font fontName="微軟正黑體"/> | |||
| </textElement> | |||
| <textFieldExpression><![CDATA[$F{itemName} + "(" + $F{uom} + ")"]]></textFieldExpression> | |||
| @@ -375,10 +365,10 @@ | |||
| </reportElement> | |||
| </line> | |||
| <textField> | |||
| <reportElement x="240" y="18" width="230" height="18" uuid="af701932-2e78-47d4-a131-b668200dc376"> | |||
| <reportElement x="230" y="18" width="240" height="18" uuid="af701932-2e78-47d4-a131-b668200dc376"> | |||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||
| </reportElement> | |||
| <textElement verticalAlignment="Top"> | |||
| <textElement verticalAlignment="Middle"> | |||
| <font fontName="微軟正黑體"/> | |||
| </textElement> | |||
| <textFieldExpression><![CDATA[$F{lotNo}]]></textFieldExpression> | |||