diff --git a/build.gradle b/build.gradle index 63c1278..6c79443 100644 --- a/build.gradle +++ b/build.gradle @@ -46,6 +46,7 @@ dependencies { exclude group: "com.fasterxml.jackson.dataformat", module: "jackson-dataformat-xml" } implementation group: 'net.sf.jasperreports', name: 'jasperreports-fonts', version: '6.21.0' + implementation group: 'org.mozilla', name: 'rhino', version: '1.7.14' implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0' implementation group: 'org.apache.poi', name: 'poi', version: '5.2.3' 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 80d7d94..d686ebe 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 @@ -19,4 +19,5 @@ interface DoPickOrderRepository : JpaRepository { status: DoPickOrderStatus ): List fun findByPickOrderId(pickOrderId: Long): List + } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/models/DeliveryOrderLineInfo.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/models/DeliveryOrderLineInfo.kt index a2ef79f..702f9d9 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/models/DeliveryOrderLineInfo.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/models/DeliveryOrderLineInfo.kt @@ -15,4 +15,6 @@ interface DeliveryOrderLineInfo { val price: BigDecimal? val status: String? + @get:Value("#{target.item?.id}") + val itemId: Long? } \ 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 c57d875..abacac6 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 @@ -59,6 +59,16 @@ import java.io.FileNotFoundException import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecord import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecordRepository +import com.ffii.fpsms.modules.deliveryOrder.web.models.ExportDNLabelsRequest +import com.ffii.fpsms.modules.deliveryOrder.web.models.PrintDNLabelsRequest +import com.ffii.fpsms.modules.pickOrder.entity.RouterRepository +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 com.ffii.fpsms.modules.pickOrder.entity.Router +import net.sf.jasperreports.engine.JasperPrintManager +import net.sf.jasperreports.engine.JRPrintPage +import com.ffii.fpsms.modules.stock.entity.SuggestPickLotRepository @Service open class DeliveryOrderService( @@ -79,7 +89,12 @@ open class DeliveryOrderService( private val stockOutLineRepository: StockOutLIneRepository, private val pickOrderLineRepository: PickOrderLineRepository, private val printerService: PrinterService, - private val doPickOrderRecordRepository: DoPickOrderRecordRepository + private val doPickOrderRecordRepository: DoPickOrderRecordRepository, + private val routerRepository: RouterRepository, + private val purchaseOrderRepository: PurchaseOrderRepository, + private val inventoryLotService: InventoryLotService, + private val suggestedPickLotRepository: SuggestPickLotRepository, + private val inventoryLotRepository: InventoryLotRepository, ) { open fun findByM18DataLogId(m18DataLogId: Long): DeliveryOrder? { @@ -535,16 +550,58 @@ open class DeliveryOrderService( ) } - private fun buildShopAddress(shop: com.ffii.fpsms.modules.master.entity.Shop?): String { - if (shop == null) return "" + open fun getRouteAndIndexByInventoryLotId(inventoryLotId: Int): List { + return routerRepository.findByInventoryLotIdAndDeletedFalse(inventoryLotId) + .sortedBy { it.index } + } + + open fun getRoutesByInventoryLotId(inventoryLotId: Int): List { + return getRouteAndIndexByInventoryLotId(inventoryLotId) + .mapNotNull { it.route } + } - val addressParts = mutableListOf() + open fun getRouteByItemId(itemId: Long): String? { + val inventoryLots = inventoryLotService.findByItemId(itemId) + if (inventoryLots.isNotEmpty()){ + val inventoryLotId = inventoryLots.first().id?.toInt() + return inventoryLotId?.let { lotId -> + getRoutesByInventoryLotId(lotId).firstOrNull() + } + } + return null + } - shop.addr3?.let { if (it.isNotBlank()) addressParts.add(it) } + open fun getRouterIndexByItemId(itemId: Long): Int? { + val inventoryLots = inventoryLotService.findByItemId(itemId) + if( inventoryLots.isNotEmpty()){ + val inventoryLotId = inventoryLots.first().id?.toInt() + return inventoryLotId?.let { lotId -> + getRouteAndIndexByInventoryLotId(lotId).firstOrNull()?.index + } + } + return null + } - return addressParts.joinToString(", ") + open fun getLotNumbersForPickOrderByItemId(itemId: Long, pickOrderId: Long): String { + try { + val pickOrderLines = pickOrderLineRepository.findAllByPickOrderId(pickOrderId) + val pickOrderLineIds = pickOrderLines.mapNotNull { it.id } + val suggestedPickLots = suggestedPickLotRepository.findAllByPickOrderLineIdIn(pickOrderLineIds) + + val lotNumbers = suggestedPickLots + .filter { it.pickOrderLine?.item?.id == itemId } + .mapNotNull { it.suggestedLotLine?.inventoryLot?.lotNo } + .distinct() + + return lotNumbers.joinToString(", ") + } catch (e: Exception) { + println("Error getting lot numbers for item $itemId in pick order $pickOrderId: ${e.message}") + return "" + } } + + //Delivery Note @Throws(IOException::class) @Transactional open fun exportDeliveryNote(request: ExportDeliveryNoteRequest): Map { @@ -556,12 +613,30 @@ open class DeliveryOrderService( val inputStream = resource.inputStream val deliveryNote = JasperCompileManager.compileReport(inputStream) val deliveryNoteInfo = deliveryOrderRepository.findDeliveryOrderInfoById(request.deliveryOrderIds).toMutableList() + val fields = mutableListOf>() val params = mutableMapOf() + val deliveryOrderEntity = deliveryOrderRepository.findByIdAndDeletedIsFalse(request.deliveryOrderIds) + val selectedTruckNo = deliveryOrderEntity?.shop?.id?.let { shopId -> + val trucks = truckRepository.findByShopIdAndDeletedFalse(shopId) + trucks.firstOrNull()?.truckNo + } ?: "" + + val selectedPickOrder = pickOrderRepository.findById(request.pickOrderIds).orElse(null) + + for (info in deliveryNoteInfo) { - info.deliveryOrderLines.forEachIndexed { index, line -> + val sortedLines = info.deliveryOrderLines.sortedBy { line -> + line.itemId?.let { itemId -> + getRouterIndexByItemId(itemId) + } ?: Int.MAX_VALUE + } + + sortedLines.forEachIndexed { index, line -> + val field = mutableMapOf() + field["sequenceNumber"] = (index + 1).toString() field["itemNo"] = line.itemNo field["itemName"] = line.itemName ?:"" @@ -569,20 +644,44 @@ open class DeliveryOrderService( field["qty"] = line.qty.toString() field["shortName"] = line.uomShortDesc ?:"" + val route = line.itemId?.let { itemId -> + getRouteByItemId(itemId) + } ?: "" + field["route"] = route + + val lotNo = line.itemId?.let { itemId -> + getLotNumbersForPickOrderByItemId(itemId, request.pickOrderIds) + } ?: "" + field["lotNo"] = lotNo fields.add(field) } } + if(request.isDraft){ + params["dnTitle"] = "送貨單(初稿)" + params["colQty"] = "所需數量" + params["totalCartonTitle"] = "" + } + else{ + params["dnTitle"] = "送貨單" + params["colQty"] = "數量" + params["totalCartonTitle"] = "總箱數:" + } + + params["numOfCarton"] = request.numOfCarton.toString() + if(params["numOfCarton"] == "0"){ + params["numOfCarton"] = "" + } + params["deliveryOrderCode"] = deliveryNoteInfo[0].code params["shopName"] = deliveryNoteInfo[0].shopName ?: "" params["shopAddress"] = deliveryNoteInfo[0].shopAddress ?: "" params["deliveryDate"] = deliveryNoteInfo[0].estimatedArrivalDate?.format(DateTimeFormatter.ISO_LOCAL_DATE) ?: "" - //numOfCarton - //truckNo + params["truckNo"] = selectedTruckNo + params["ShopPurchaseOrderNo"] = deliveryNoteInfo[0].code + params["FGPickOrderNo"] = selectedPickOrder?.code ?: "" - //FGPickOrderNo - //ShopPurchaseOrderNo return mapOf( "report" to PdfUtils.fillReport(deliveryNote, fields, params), @@ -590,13 +689,82 @@ open class DeliveryOrderService( ) } + + //Print Delivery Note @Transactional open fun printDeliveryNote(request: PrintDeliveryNoteRequest){ - val printer = printerService.findById(request.printerId) ?: throw java.util.NoSuchElementException("No such printer") + //val printer = printerService.findById(request.printerId) ?: throw java.util.NoSuchElementException("No such printer") val pdf = exportDeliveryNote( ExportDeliveryNoteRequest( - deliveryOrderIds = request.deliveryOrderId + deliveryOrderIds = request.deliveryOrderId, + numOfCarton = request.numOfCarton, + isDraft = request.isDraft, + pickOrderIds = request.pickOrderId + ) + ) + + val jasperPrint = pdf["report"] as JasperPrint + + val tempPdfFile = File.createTempFile("print_job_",".pdf") + + try{ + JasperExportManager.exportReportToPdfFile(jasperPrint,tempPdfFile.absolutePath) + + // val printQty = if (request.printQty == null || request.printQty <= 0) 1 else request.printQty + // printer.ip?.let { ip -> printer.port?.let { port -> + // ZebraPrinterUtil.printPdfToZebra(tempPdfFile, ip, port, printQty, ZebraPrinterUtil.PrintDirection.ROTATED) + // }} + } finally { + // tempPdfFile.delete() + } + + } + + //Carton Labels + open fun exportDNLabels(request: ExportDNLabelsRequest): Map{ + val DNLABELS_PDF = "DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml" + val resource = ClassPathResource(DNLABELS_PDF) + if(!resource.exists()){ + throw FileNotFoundException("Label file not found: $DNLABELS_PDF") + } + val inputStream = resource.inputStream + val cartonLabel = JasperCompileManager.compileReport(inputStream) + val cartonLabelInfo = deliveryOrderRepository.findDeliveryOrderInfoById(request.deliveryOrderIds).toMutableList() + val params = mutableMapOf() + val fields = mutableListOf>() + for (info in cartonLabelInfo) { + val field = mutableMapOf() + } + + params["shopPurchaseOrderNo"] = cartonLabelInfo[0].code + params["deliveryOrderCode"] = cartonLabelInfo[0].code + params["shopAddress"] = cartonLabelInfo[0].shopAddress?: "" + params["shopName"] = cartonLabelInfo[0].shopName?: "" + + for(cartonNumber in 1..request.numOfCarton){ + val field = mutableMapOf() + fields.add(field) + } + + return mapOf( + "report" to PdfUtils.fillReport(cartonLabel, fields, params), + "filename" to "${cartonLabelInfo[0].code}_carton_labels" + ) + + + } + + + //Print Carton Labels + @Transactional + open fun printDNLabels(request: PrintDNLabelsRequest){ + //val printer = printerService.findById(request.printerId) ?: throw java.util.NoSuchElementException("No such printer") + + val pdf = exportDNLabels( + ExportDNLabelsRequest( + deliveryOrderIds = request.deliveryOrderId, + numOfCarton = request.numOfCarton ) ) @@ -607,12 +775,16 @@ open class DeliveryOrderService( try{ JasperExportManager.exportReportToPdfFile(jasperPrint,tempPdfFile.absolutePath) - val printQty = if (request.printQty == null || request.printQty <= 0) 1 else request.printQty - printer.ip?.let { ip -> printer.port?.let { port -> - ZebraPrinterUtil.printPdfToZebra(tempPdfFile, ip, port, printQty, ZebraPrinterUtil.PrintDirection.ROTATED) - }} + + //val printQty = if (request.printQty == null || request.printQty <= 0) 1 else request.printQty + //printer.ip?.let { ip -> printer.port?.let { port -> + // ZebraPrinterUtil.printPdfToZebra(tempPdfFile, ip, port, printQty, ZebraPrinterUtil.PrintDirection.ROTATED) + //}} + + println("Test PDF saved to: ${tempPdfFile.absolutePath}") + } finally { - tempPdfFile.delete() + //tempPdfFile.delete() } } 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 d6201e6..83c520f 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 @@ -148,4 +148,9 @@ class DoPickOrderService( } return doPickOrderRecordRepository.saveAll(doPickOrderRecords) } + + // Add method to find do_pick_order records by pick order ID + fun findByPickOrderId(pickOrderId: Long): List { + return doPickOrderRepository.findByPickOrderId(pickOrderId) + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DeliveryOrderController.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DeliveryOrderController.kt index b19bee6..8ec75da 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DeliveryOrderController.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DeliveryOrderController.kt @@ -15,7 +15,9 @@ import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RestController import com.ffii.fpsms.modules.deliveryOrder.web.models.DoDetailResponse +import com.ffii.fpsms.modules.deliveryOrder.web.models.ExportDNLabelsRequest import com.ffii.fpsms.modules.deliveryOrder.web.models.ExportDeliveryNoteRequest +import com.ffii.fpsms.modules.deliveryOrder.web.models.PrintDNLabelsRequest import com.ffii.fpsms.modules.deliveryOrder.web.models.PrintDeliveryNoteRequest import com.ffii.fpsms.modules.deliveryOrder.web.models.ReleaseDoRequest import com.ffii.fpsms.modules.master.web.models.MessageResponse @@ -197,4 +199,21 @@ class DeliveryOrderController( fun printDN(@RequestBody request: PrintDeliveryNoteRequest) { deliveryOrderService.printDeliveryNote(request) } + + @PostMapping("/DNLabels") + @Throws(UnsupportedEncodingException::class, NoSuchMessageException::class, ParseException::class, Exception::class) + fun printDNLabels(@Valid @RequestBody request: ExportDNLabelsRequest, response: HttpServletResponse){ + response.characterEncoding = "utf-8" + response.contentType = "application/pdf" + val out: OutputStream = response.outputStream + val pdf = deliveryOrderService.exportDNLabels(request) + val jasperPrint = pdf["report"] as JasperPrint + response.addHeader("filename", "${pdf["filename"]}.pdf") + out.write(JasperExportManager.exportReportToPdf(jasperPrint)) + } + + @GetMapping("print-DNLabels") + fun printDN(@RequestBody request: PrintDNLabelsRequest) { + deliveryOrderService.printDNLabels(request) + } } \ No newline at end of file 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 new file mode 100644 index 0000000..4114f59 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDNLabelsRequest.kt @@ -0,0 +1,6 @@ +package com.ffii.fpsms.modules.deliveryOrder.web.models + +data class ExportDNLabelsRequest ( + val deliveryOrderIds: Long, + val numOfCarton: Int, +) diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDeliveryNoteRequest.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDeliveryNoteRequest.kt index d5a3c7c..e99dc7e 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDeliveryNoteRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDeliveryNoteRequest.kt @@ -1,5 +1,9 @@ package com.ffii.fpsms.modules.deliveryOrder.web.models +import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository data class ExportDeliveryNoteRequest ( - val deliveryOrderIds: Long + val deliveryOrderIds: Long, + val numOfCarton: Int, + val isDraft: Boolean, + val pickOrderIds: Long, ) 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 new file mode 100644 index 0000000..970ce1f --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDNLabelsRequest.kt @@ -0,0 +1,8 @@ +package com.ffii.fpsms.modules.deliveryOrder.web.models + +data class PrintDNLabelsRequest ( + val deliveryOrderId: Long, + val printerId: Long, + val printQty: Int?, + val numOfCarton: Int, +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDeliveryNoteRequest.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDeliveryNoteRequest.kt index 9dec7d4..22380c0 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDeliveryNoteRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDeliveryNoteRequest.kt @@ -4,4 +4,7 @@ data class PrintDeliveryNoteRequest( val deliveryOrderId: Long, val printerId: Long, val printQty: Int?, + val numOfCarton: Int, + val isDraft: Boolean, + val pickOrderId: Long, ) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderRepository.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderRepository.kt index e6994e6..439a505 100644 --- a/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderRepository.kt @@ -72,4 +72,7 @@ interface PickOrderRepository : AbstractRepository { fun findAllByStatusAndDeletedFalse(@Param("status") status: PickOrderStatus): List @Query("SELECT p FROM PickOrder p WHERE p.assignTo.id = :assignToId AND p.status IN :statuses AND p.deleted = false") fun findAllByAssignToIdAndStatusIn(@Param("assignToId") assignToId: Long, @Param("statuses") statuses: List): List + + @Query("SELECT p FROM PickOrder p WHERE p.deliveryOrder.id = :deliveryOrderId AND p.deleted = false") + fun findByDeliveryOrderId(@Param("deliveryOrderId") deliveryOrderId: Long): List } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/RouterRepository.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/RouterRepository.kt index 478774b..caeedc3 100644 --- a/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/RouterRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/RouterRepository.kt @@ -23,4 +23,5 @@ interface RouterRepository : AbstractRepository { @Query("SELECT r FROM Router r WHERE r.route = :route AND r.deleted = false") fun findByRouteAndDeletedFalse(@Param("route") route: String): List + } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotLineRepository.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotLineRepository.kt index 689988e..965291d 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotLineRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotLineRepository.kt @@ -9,6 +9,7 @@ import org.springframework.data.jpa.repository.Query import org.springframework.stereotype.Repository import java.io.Serializable import com.ffii.fpsms.modules.stock.entity.enum.InventoryLotLineStatus +import org.springframework.data.repository.query.Param @Repository interface InventoryLotLineRepository : AbstractRepository { @@ -36,5 +37,4 @@ interface InventoryLotLineRepository : AbstractRepository fun findAllByInventoryLotItemIdAndStatus(itemId: Long, status: String): List fun findAllByInventoryLotItemIdAndStatus(itemId: Long, status: InventoryLotLineStatus): List - } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotRepository.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotRepository.kt index 5fbe1fe..93cf17e 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotRepository.kt @@ -7,4 +7,7 @@ import java.io.Serializable @Repository interface InventoryLotRepository: AbstractRepository { fun findByStockInLineIdAndDeletedFalse(stockInLineId: Serializable): InventoryLot? + + fun findByItemIdAndDeletedFalse(itemId: Long): List + } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/service/InventoryLotService.kt b/src/main/java/com/ffii/fpsms/modules/stock/service/InventoryLotService.kt index 170a342..70caf10 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/service/InventoryLotService.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/service/InventoryLotService.kt @@ -47,4 +47,8 @@ open class InventoryLotService( entity = savedInventoryLot, ) } + + open fun findByItemId(itemId: Long): List{ + return inventoryLotRepository.findByItemIdAndDeletedFalse(itemId) + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/service/SuggestedPickLotService.kt b/src/main/java/com/ffii/fpsms/modules/stock/service/SuggestedPickLotService.kt index 0edcd99..51ef450 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/service/SuggestedPickLotService.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/service/SuggestedPickLotService.kt @@ -43,6 +43,7 @@ open class SuggestedPickLotService( val stockOutRepository: StockOutRepository, val itemRepository: ItemsRepository ) { + // Calculation Available Qty / Remaining Qty open fun calculateRemainingQtyForInfo(inventoryLotLine: InventoryLotLineInfo?): BigDecimal { val zero = BigDecimal.ZERO diff --git a/src/main/resources/DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml b/src/main/resources/DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml new file mode 100644 index 0000000..a9eca4e --- /dev/null +++ b/src/main/resources/DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml b/src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml index aedf069..2583b02 100644 --- a/src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml +++ b/src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml @@ -18,6 +18,11 @@ + + + + + @@ -28,21 +33,12 @@ + - <band height="28"> - <staticText> - <reportElement x="223" y="2" width="108" height="23" uuid="d88b3126-393b-4444-9a75-a73af8ae0797"> - <property name="com.jaspersoft.studio.unit.y" value="px"/> - <property name="com.jaspersoft.studio.unit.height" value="px"/> - </reportElement> - <textElement textAlignment="Center" verticalAlignment="Bottom"> - <font fontName="微軟正黑體" size="16"/> - </textElement> - <text><![CDATA[送貨單]]></text> - </staticText> + <band height="50"> <staticText> <reportElement x="430" y="10" width="40" height="18" uuid="ddea10c9-9e96-484b-b76b-bfff59950a98"> <property name="com.jaspersoft.studio.unit.y" value="px"/> @@ -88,10 +84,22 @@ </textElement> <text><![CDATA[/]]></text> </staticText> + <textField> + <reportElement x="223" y="2" width="108" height="23" uuid="17f9fd50-da7c-43b2-93ea-7306e59aea90"> + <property name="com.jaspersoft.studio.unit.x" value="px"/> + <property name="com.jaspersoft.studio.unit.y" value="px"/> + <property name="com.jaspersoft.studio.unit.width" value="px"/> + <property name="com.jaspersoft.studio.unit.height" value="px"/> + </reportElement> + <textElement textAlignment="Center"> + <font fontName="微軟正黑體" size="16"/> + </textElement> + <textFieldExpression><![CDATA[$P{dnTitle}]]></textFieldExpression> + </textField> </band> - + @@ -152,16 +160,6 @@ - - - - - - - - - - @@ -207,7 +205,7 @@ - + @@ -243,7 +241,16 @@ - + + + + + + + + + + @@ -291,16 +298,6 @@ - - - - - - - - - - @@ -311,10 +308,22 @@ + + + + + + + + + + + + - + @@ -361,10 +370,19 @@ - + + + + + + + + + +