| @@ -46,6 +46,7 @@ dependencies { | |||||
| exclude group: "com.fasterxml.jackson.dataformat", module: "jackson-dataformat-xml" | exclude group: "com.fasterxml.jackson.dataformat", module: "jackson-dataformat-xml" | ||||
| } | } | ||||
| implementation group: 'net.sf.jasperreports', name: 'jasperreports-fonts', version: '6.21.0' | 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.commons', name: 'commons-lang3', version: '3.12.0' | ||||
| implementation group: 'org.apache.poi', name: 'poi', version: '5.2.3' | implementation group: 'org.apache.poi', name: 'poi', version: '5.2.3' | ||||
| @@ -19,4 +19,5 @@ interface DoPickOrderRepository : JpaRepository<DoPickOrder, Long> { | |||||
| status: DoPickOrderStatus | status: DoPickOrderStatus | ||||
| ): List<DoPickOrder> | ): List<DoPickOrder> | ||||
| fun findByPickOrderId(pickOrderId: Long): List<DoPickOrder> | fun findByPickOrderId(pickOrderId: Long): List<DoPickOrder> | ||||
| } | } | ||||
| @@ -15,4 +15,6 @@ interface DeliveryOrderLineInfo { | |||||
| val price: BigDecimal? | val price: BigDecimal? | ||||
| val status: String? | val status: String? | ||||
| @get:Value("#{target.item?.id}") | |||||
| val itemId: Long? | |||||
| } | } | ||||
| @@ -59,6 +59,16 @@ import java.io.FileNotFoundException | |||||
| import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecord | import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecord | ||||
| import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecordRepository | 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 | @Service | ||||
| open class DeliveryOrderService( | open class DeliveryOrderService( | ||||
| @@ -79,7 +89,12 @@ open class DeliveryOrderService( | |||||
| private val stockOutLineRepository: StockOutLIneRepository, | private val stockOutLineRepository: StockOutLIneRepository, | ||||
| private val pickOrderLineRepository: PickOrderLineRepository, | private val pickOrderLineRepository: PickOrderLineRepository, | ||||
| private val printerService: PrinterService, | 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? { | 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<Router> { | |||||
| return routerRepository.findByInventoryLotIdAndDeletedFalse(inventoryLotId) | |||||
| .sortedBy { it.index } | |||||
| } | |||||
| open fun getRoutesByInventoryLotId(inventoryLotId: Int): List<String> { | |||||
| return getRouteAndIndexByInventoryLotId(inventoryLotId) | |||||
| .mapNotNull { it.route } | |||||
| } | |||||
| val addressParts = mutableListOf<String>() | |||||
| 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) | @Throws(IOException::class) | ||||
| @Transactional | @Transactional | ||||
| open fun exportDeliveryNote(request: ExportDeliveryNoteRequest): Map<String, Any> { | open fun exportDeliveryNote(request: ExportDeliveryNoteRequest): Map<String, Any> { | ||||
| @@ -556,12 +613,30 @@ open class DeliveryOrderService( | |||||
| val inputStream = resource.inputStream | val inputStream = resource.inputStream | ||||
| val deliveryNote = JasperCompileManager.compileReport(inputStream) | val deliveryNote = JasperCompileManager.compileReport(inputStream) | ||||
| val deliveryNoteInfo = deliveryOrderRepository.findDeliveryOrderInfoById(request.deliveryOrderIds).toMutableList() | val deliveryNoteInfo = deliveryOrderRepository.findDeliveryOrderInfoById(request.deliveryOrderIds).toMutableList() | ||||
| val fields = mutableListOf<MutableMap<String, Any>>() | val fields = mutableListOf<MutableMap<String, Any>>() | ||||
| val params = mutableMapOf<String, Any>() | val params = mutableMapOf<String, Any>() | ||||
| 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) { | 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<String, Any>() | val field = mutableMapOf<String, Any>() | ||||
| field["sequenceNumber"] = (index + 1).toString() | field["sequenceNumber"] = (index + 1).toString() | ||||
| field["itemNo"] = line.itemNo | field["itemNo"] = line.itemNo | ||||
| field["itemName"] = line.itemName ?:"" | field["itemName"] = line.itemName ?:"" | ||||
| @@ -569,20 +644,44 @@ open class DeliveryOrderService( | |||||
| field["qty"] = line.qty.toString() | field["qty"] = line.qty.toString() | ||||
| field["shortName"] = line.uomShortDesc ?:"" | 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) | 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["deliveryOrderCode"] = deliveryNoteInfo[0].code | ||||
| params["shopName"] = deliveryNoteInfo[0].shopName ?: "" | params["shopName"] = deliveryNoteInfo[0].shopName ?: "" | ||||
| params["shopAddress"] = deliveryNoteInfo[0].shopAddress ?: "" | params["shopAddress"] = deliveryNoteInfo[0].shopAddress ?: "" | ||||
| params["deliveryDate"] = deliveryNoteInfo[0].estimatedArrivalDate?.format(DateTimeFormatter.ISO_LOCAL_DATE) ?: "" | 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( | return mapOf( | ||||
| "report" to PdfUtils.fillReport(deliveryNote, fields, params), | "report" to PdfUtils.fillReport(deliveryNote, fields, params), | ||||
| @@ -590,13 +689,82 @@ open class DeliveryOrderService( | |||||
| ) | ) | ||||
| } | } | ||||
| //Print Delivery Note | |||||
| @Transactional | @Transactional | ||||
| open fun printDeliveryNote(request: PrintDeliveryNoteRequest){ | 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( | val pdf = exportDeliveryNote( | ||||
| ExportDeliveryNoteRequest( | 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<String, Any>{ | |||||
| 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<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["shopAddress"] = cartonLabelInfo[0].shopAddress?: "" | |||||
| params["shopName"] = cartonLabelInfo[0].shopName?: "" | |||||
| for(cartonNumber in 1..request.numOfCarton){ | |||||
| val field = mutableMapOf<String, Any>() | |||||
| 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{ | try{ | ||||
| JasperExportManager.exportReportToPdfFile(jasperPrint,tempPdfFile.absolutePath) | 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 { | } finally { | ||||
| tempPdfFile.delete() | |||||
| //tempPdfFile.delete() | |||||
| } | } | ||||
| } | } | ||||
| @@ -148,4 +148,9 @@ class DoPickOrderService( | |||||
| } | } | ||||
| return doPickOrderRecordRepository.saveAll(doPickOrderRecords) | return doPickOrderRecordRepository.saveAll(doPickOrderRecords) | ||||
| } | } | ||||
| // Add method to find do_pick_order records by pick order ID | |||||
| fun findByPickOrderId(pickOrderId: Long): List<DoPickOrder> { | |||||
| return doPickOrderRepository.findByPickOrderId(pickOrderId) | |||||
| } | |||||
| } | } | ||||
| @@ -15,7 +15,9 @@ import org.springframework.web.bind.annotation.RequestMapping | |||||
| import org.springframework.web.bind.annotation.RequestParam | import org.springframework.web.bind.annotation.RequestParam | ||||
| import org.springframework.web.bind.annotation.RestController | import org.springframework.web.bind.annotation.RestController | ||||
| import com.ffii.fpsms.modules.deliveryOrder.web.models.DoDetailResponse | 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.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.PrintDeliveryNoteRequest | ||||
| import com.ffii.fpsms.modules.deliveryOrder.web.models.ReleaseDoRequest | import com.ffii.fpsms.modules.deliveryOrder.web.models.ReleaseDoRequest | ||||
| import com.ffii.fpsms.modules.master.web.models.MessageResponse | import com.ffii.fpsms.modules.master.web.models.MessageResponse | ||||
| @@ -197,4 +199,21 @@ class DeliveryOrderController( | |||||
| fun printDN(@RequestBody request: PrintDeliveryNoteRequest) { | fun printDN(@RequestBody request: PrintDeliveryNoteRequest) { | ||||
| deliveryOrderService.printDeliveryNote(request) | 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) | |||||
| } | |||||
| } | } | ||||
| @@ -0,0 +1,6 @@ | |||||
| package com.ffii.fpsms.modules.deliveryOrder.web.models | |||||
| data class ExportDNLabelsRequest ( | |||||
| val deliveryOrderIds: Long, | |||||
| val numOfCarton: Int, | |||||
| ) | |||||
| @@ -1,5 +1,9 @@ | |||||
| package com.ffii.fpsms.modules.deliveryOrder.web.models | package com.ffii.fpsms.modules.deliveryOrder.web.models | ||||
| import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository | |||||
| data class ExportDeliveryNoteRequest ( | data class ExportDeliveryNoteRequest ( | ||||
| val deliveryOrderIds: Long | |||||
| val deliveryOrderIds: Long, | |||||
| val numOfCarton: Int, | |||||
| val isDraft: Boolean, | |||||
| val pickOrderIds: Long, | |||||
| ) | ) | ||||
| @@ -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, | |||||
| ) | |||||
| @@ -4,4 +4,7 @@ data class PrintDeliveryNoteRequest( | |||||
| val deliveryOrderId: Long, | val deliveryOrderId: Long, | ||||
| val printerId: Long, | val printerId: Long, | ||||
| val printQty: Int?, | val printQty: Int?, | ||||
| val numOfCarton: Int, | |||||
| val isDraft: Boolean, | |||||
| val pickOrderId: Long, | |||||
| ) | ) | ||||
| @@ -72,4 +72,7 @@ interface PickOrderRepository : AbstractRepository<PickOrder, Long> { | |||||
| fun findAllByStatusAndDeletedFalse(@Param("status") status: PickOrderStatus): List<PickOrder> | fun findAllByStatusAndDeletedFalse(@Param("status") status: PickOrderStatus): List<PickOrder> | ||||
| @Query("SELECT p FROM PickOrder p WHERE p.assignTo.id = :assignToId AND p.status IN :statuses AND p.deleted = false") | @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<PickOrderStatus>): List<PickOrder> | fun findAllByAssignToIdAndStatusIn(@Param("assignToId") assignToId: Long, @Param("statuses") statuses: List<PickOrderStatus>): List<PickOrder> | ||||
| @Query("SELECT p FROM PickOrder p WHERE p.deliveryOrder.id = :deliveryOrderId AND p.deleted = false") | |||||
| fun findByDeliveryOrderId(@Param("deliveryOrderId") deliveryOrderId: Long): List<PickOrder> | |||||
| } | } | ||||
| @@ -23,4 +23,5 @@ interface RouterRepository : AbstractRepository<Router, Long> { | |||||
| @Query("SELECT r FROM Router r WHERE r.route = :route AND r.deleted = false") | @Query("SELECT r FROM Router r WHERE r.route = :route AND r.deleted = false") | ||||
| fun findByRouteAndDeletedFalse(@Param("route") route: String): List<Router> | fun findByRouteAndDeletedFalse(@Param("route") route: String): List<Router> | ||||
| } | } | ||||
| @@ -9,6 +9,7 @@ import org.springframework.data.jpa.repository.Query | |||||
| import org.springframework.stereotype.Repository | import org.springframework.stereotype.Repository | ||||
| import java.io.Serializable | import java.io.Serializable | ||||
| import com.ffii.fpsms.modules.stock.entity.enum.InventoryLotLineStatus | import com.ffii.fpsms.modules.stock.entity.enum.InventoryLotLineStatus | ||||
| import org.springframework.data.repository.query.Param | |||||
| @Repository | @Repository | ||||
| interface InventoryLotLineRepository : AbstractRepository<InventoryLotLine, Long> { | interface InventoryLotLineRepository : AbstractRepository<InventoryLotLine, Long> { | ||||
| @@ -36,5 +37,4 @@ interface InventoryLotLineRepository : AbstractRepository<InventoryLotLine, Long | |||||
| fun findAllByInventoryLotId(id: Serializable): List<InventoryLotLine> | fun findAllByInventoryLotId(id: Serializable): List<InventoryLotLine> | ||||
| fun findAllByInventoryLotItemIdAndStatus(itemId: Long, status: String): List<InventoryLotLine> | fun findAllByInventoryLotItemIdAndStatus(itemId: Long, status: String): List<InventoryLotLine> | ||||
| fun findAllByInventoryLotItemIdAndStatus(itemId: Long, status: InventoryLotLineStatus): List<InventoryLotLine> | fun findAllByInventoryLotItemIdAndStatus(itemId: Long, status: InventoryLotLineStatus): List<InventoryLotLine> | ||||
| } | } | ||||
| @@ -7,4 +7,7 @@ import java.io.Serializable | |||||
| @Repository | @Repository | ||||
| interface InventoryLotRepository: AbstractRepository<InventoryLot, Long> { | interface InventoryLotRepository: AbstractRepository<InventoryLot, Long> { | ||||
| fun findByStockInLineIdAndDeletedFalse(stockInLineId: Serializable): InventoryLot? | fun findByStockInLineIdAndDeletedFalse(stockInLineId: Serializable): InventoryLot? | ||||
| fun findByItemIdAndDeletedFalse(itemId: Long): List<InventoryLot> | |||||
| } | } | ||||
| @@ -47,4 +47,8 @@ open class InventoryLotService( | |||||
| entity = savedInventoryLot, | entity = savedInventoryLot, | ||||
| ) | ) | ||||
| } | } | ||||
| open fun findByItemId(itemId: Long): List<InventoryLot>{ | |||||
| return inventoryLotRepository.findByItemIdAndDeletedFalse(itemId) | |||||
| } | |||||
| } | } | ||||
| @@ -43,6 +43,7 @@ open class SuggestedPickLotService( | |||||
| val stockOutRepository: StockOutRepository, | val stockOutRepository: StockOutRepository, | ||||
| val itemRepository: ItemsRepository | val itemRepository: ItemsRepository | ||||
| ) { | ) { | ||||
| // Calculation Available Qty / Remaining Qty | // Calculation Available Qty / Remaining Qty | ||||
| open fun calculateRemainingQtyForInfo(inventoryLotLine: InventoryLotLineInfo?): BigDecimal { | open fun calculateRemainingQtyForInfo(inventoryLotLine: InventoryLotLineInfo?): BigDecimal { | ||||
| val zero = BigDecimal.ZERO | val zero = BigDecimal.ZERO | ||||
| @@ -0,0 +1,150 @@ | |||||
| <?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="Blank_A4" pageWidth="500" pageHeight="120" columnWidth="460" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="baa9f270-b398-4f1c-b01e-ba216b7997e9"> | |||||
| <parameter name="shopPurchaseOrderNo" class="java.lang.String"/> | |||||
| <parameter name="shopName" class="java.lang.String"/> | |||||
| <parameter name="shopAddress" class="java.lang.String"/> | |||||
| <parameter name="deliveryOrderCode" class="java.lang.String"/> | |||||
| <queryString> | |||||
| <![CDATA[]]> | |||||
| </queryString> | |||||
| <background> | |||||
| <band splitType="Stretch"/> | |||||
| </background> | |||||
| <detail> | |||||
| <band height="80" splitType="Stretch"> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| <textField> | |||||
| <reportElement x="80" y="0" width="150" height="18" uuid="8fac39f8-4936-43a5-8e1f-1afbc8ccca9c"> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
| </reportElement> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體" size="10"/> | |||||
| </textElement> | |||||
| <textFieldExpression><![CDATA[$P{shopPurchaseOrderNo}]]></textFieldExpression> | |||||
| </textField> | |||||
| <staticText> | |||||
| <reportElement x="0" y="0" width="80" height="18" uuid="e03fcb92-259c-4427-a68e-60fe5924d763"> | |||||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| </reportElement> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體" size="10"/> | |||||
| </textElement> | |||||
| <text><![CDATA[店鋪採購單編號: | |||||
| ]]></text> | |||||
| </staticText> | |||||
| <staticText> | |||||
| <reportElement x="0" y="60" width="80" height="18" uuid="c8e417ed-73ce-4349-b83c-e59e25258544"> | |||||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| </reportElement> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體" size="10"/> | |||||
| </textElement> | |||||
| <text><![CDATA[箱數:]]></text> | |||||
| </staticText> | |||||
| <staticText> | |||||
| <reportElement x="230" y="0" width="80" height="18" uuid="f3ffd4ee-0513-41a5-94d7-f1fdb9966a76"> | |||||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| </reportElement> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體" size="10"/> | |||||
| </textElement> | |||||
| <text><![CDATA[送貨單編號:]]></text> | |||||
| </staticText> | |||||
| <textField> | |||||
| <reportElement x="310" y="0" width="150" height="18" uuid="4319059b-9096-4c49-8275-287be93d3e6a"> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
| </reportElement> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體" size="10"/> | |||||
| </textElement> | |||||
| <textFieldExpression><![CDATA[$P{deliveryOrderCode}]]></textFieldExpression> | |||||
| </textField> | |||||
| <staticText> | |||||
| <reportElement x="0" y="20" width="80" height="18" uuid="22ce2f40-8f43-46f0-8298-e2f224cfb239"> | |||||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| </reportElement> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體" size="10"/> | |||||
| </textElement> | |||||
| <text><![CDATA[店鋪名稱:]]></text> | |||||
| </staticText> | |||||
| <textField> | |||||
| <reportElement x="80" y="20" width="300" height="18" uuid="9a440925-1bd4-4001-9b4b-7163ac27551e"> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
| </reportElement> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體" size="10"/> | |||||
| </textElement> | |||||
| <textFieldExpression><![CDATA[$P{shopName}]]></textFieldExpression> | |||||
| </textField> | |||||
| <staticText> | |||||
| <reportElement x="0" y="40" width="80" height="18" uuid="057cd155-5fc8-44e5-8764-b134cb4c24f4"> | |||||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| </reportElement> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體" size="10"/> | |||||
| </textElement> | |||||
| <text><![CDATA[店鋪地址:]]></text> | |||||
| </staticText> | |||||
| <textField> | |||||
| <reportElement x="80" y="40" width="300" height="18" uuid="26b2c156-341b-4f59-abce-bd84ea000d9d"> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
| </reportElement> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體" size="10"/> | |||||
| </textElement> | |||||
| <textFieldExpression><![CDATA[$P{shopAddress}]]></textFieldExpression> | |||||
| </textField> | |||||
| <staticText> | |||||
| <reportElement x="150" y="60" width="20" height="18" uuid="7467bc85-22c2-4b2a-bed0-a2e82a5dba6d"> | |||||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| </reportElement> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體" size="10"/> | |||||
| </textElement> | |||||
| <text><![CDATA[箱]]></text> | |||||
| </staticText> | |||||
| <textField> | |||||
| <reportElement x="80" y="60" width="25" height="18" uuid="e340a673-9fdc-4559-8431-af8ea391c472"> | |||||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| </reportElement> | |||||
| <textElement textAlignment="Center" verticalAlignment="Middle"> | |||||
| <font size="10"/> | |||||
| </textElement> | |||||
| <textFieldExpression><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression> | |||||
| </textField> | |||||
| <textField evaluationTime="Report"> | |||||
| <reportElement x="125" y="60" width="25" height="18" uuid="89ccad73-0571-4291-ae26-7804925d47eb"> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
| </reportElement> | |||||
| <textElement textAlignment="Center" verticalAlignment="Middle"> | |||||
| <font size="10"/> | |||||
| </textElement> | |||||
| <textFieldExpression><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression> | |||||
| </textField> | |||||
| <staticText> | |||||
| <reportElement x="105" y="60" width="20" height="18" uuid="1cdd7507-299b-406b-baab-d2c23e44eeb0"> | |||||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| </reportElement> | |||||
| <textElement textAlignment="Center" verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體" size="10"/> | |||||
| </textElement> | |||||
| <text><![CDATA[/]]></text> | |||||
| </staticText> | |||||
| </band> | |||||
| </detail> | |||||
| </jasperReport> | |||||
| @@ -18,6 +18,11 @@ | |||||
| <parameter name="deliveryDate" class="java.lang.String"/> | <parameter name="deliveryDate" class="java.lang.String"/> | ||||
| <parameter name="FGPickOrderNo" class="java.lang.String"/> | <parameter name="FGPickOrderNo" class="java.lang.String"/> | ||||
| <parameter name="ShopPurchaseOrderNo" class="java.lang.String"/> | <parameter name="ShopPurchaseOrderNo" class="java.lang.String"/> | ||||
| <parameter name="truckNo" class="java.lang.String"/> | |||||
| <parameter name="numOfCarton" class="java.lang.String"/> | |||||
| <parameter name="dnTitle" class="java.lang.String"/> | |||||
| <parameter name="colQty" class="java.lang.String"/> | |||||
| <parameter name="totalCartonTitle" class="java.lang.String"/> | |||||
| <queryString> | <queryString> | ||||
| <![CDATA[]]> | <![CDATA[]]> | ||||
| </queryString> | </queryString> | ||||
| @@ -28,21 +33,12 @@ | |||||
| <field name="qty" class="java.lang.String"/> | <field name="qty" class="java.lang.String"/> | ||||
| <field name="shortName" class="java.lang.String"/> | <field name="shortName" class="java.lang.String"/> | ||||
| <field name="route" class="java.lang.String"/> | <field name="route" class="java.lang.String"/> | ||||
| <field name="lotNo" class="java.lang.String"/> | |||||
| <background> | <background> | ||||
| <band height="41" splitType="Stretch"/> | <band height="41" splitType="Stretch"/> | ||||
| </background> | </background> | ||||
| <title> | <title> | ||||
| <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> | <staticText> | ||||
| <reportElement x="430" y="10" width="40" height="18" uuid="ddea10c9-9e96-484b-b76b-bfff59950a98"> | <reportElement x="430" y="10" width="40" height="18" uuid="ddea10c9-9e96-484b-b76b-bfff59950a98"> | ||||
| <property name="com.jaspersoft.studio.unit.y" value="px"/> | <property name="com.jaspersoft.studio.unit.y" value="px"/> | ||||
| @@ -88,10 +84,22 @@ | |||||
| </textElement> | </textElement> | ||||
| <text><![CDATA[/]]></text> | <text><![CDATA[/]]></text> | ||||
| </staticText> | </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> | </band> | ||||
| </title> | </title> | ||||
| <pageHeader> | <pageHeader> | ||||
| <band height="117"> | |||||
| <band height="118"> | |||||
| <staticText> | <staticText> | ||||
| <reportElement x="0" y="10" width="80" height="18" uuid="7f991bbe-caf4-43c1-b8e1-d85b1f2d3815"> | <reportElement x="0" y="10" width="80" height="18" uuid="7f991bbe-caf4-43c1-b8e1-d85b1f2d3815"> | ||||
| <property name="com.jaspersoft.studio.unit.y" value="px"/> | <property name="com.jaspersoft.studio.unit.y" value="px"/> | ||||
| @@ -152,16 +160,6 @@ | |||||
| </textElement> | </textElement> | ||||
| <text><![CDATA[店鋪採購單編號:]]></text> | <text><![CDATA[店鋪採購單編號:]]></text> | ||||
| </staticText> | </staticText> | ||||
| <staticText> | |||||
| <reportElement x="0" y="90" width="80" height="18" uuid="3e5f2bc4-03d7-4d7c-9a93-ca4fa8f5ed33"> | |||||
| <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> | <staticText> | ||||
| <reportElement x="275" y="70" width="110" height="18" uuid="6b810312-71e2-4749-bc8b-0b7a705377f8"> | <reportElement x="275" y="70" width="110" height="18" uuid="6b810312-71e2-4749-bc8b-0b7a705377f8"> | ||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| @@ -207,7 +205,7 @@ | |||||
| <textElement verticalAlignment="Middle"> | <textElement verticalAlignment="Middle"> | ||||
| <font fontName="微軟正黑體"/> | <font fontName="微軟正黑體"/> | ||||
| </textElement> | </textElement> | ||||
| <textFieldExpression><![CDATA["Text Field"]]></textFieldExpression> | |||||
| <textFieldExpression><![CDATA[$P{truckNo}]]></textFieldExpression> | |||||
| </textField> | </textField> | ||||
| <textField> | <textField> | ||||
| <reportElement x="385" y="30" width="150" height="18" uuid="24a1331c-e50f-4a72-9a41-3e05b85f4c21"> | <reportElement x="385" y="30" width="150" height="18" uuid="24a1331c-e50f-4a72-9a41-3e05b85f4c21"> | ||||
| @@ -243,7 +241,16 @@ | |||||
| <textElement verticalAlignment="Middle"> | <textElement verticalAlignment="Middle"> | ||||
| <font fontName="微軟正黑體"/> | <font fontName="微軟正黑體"/> | ||||
| </textElement> | </textElement> | ||||
| <textFieldExpression><![CDATA["Text Field"]]></textFieldExpression> | |||||
| <textFieldExpression><![CDATA[$P{numOfCarton}]]></textFieldExpression> | |||||
| </textField> | |||||
| <textField> | |||||
| <reportElement x="0" y="90" width="80" height="18" uuid="25254ea4-e2b2-4ae0-975b-99c8f9390a64"> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| </reportElement> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體"/> | |||||
| </textElement> | |||||
| <textFieldExpression><![CDATA[$P{totalCartonTitle}]]></textFieldExpression> | |||||
| </textField> | </textField> | ||||
| </band> | </band> | ||||
| </pageHeader> | </pageHeader> | ||||
| @@ -291,16 +298,6 @@ | |||||
| </textElement> | </textElement> | ||||
| <text><![CDATA[貨品名稱]]></text> | <text><![CDATA[貨品名稱]]></text> | ||||
| </staticText> | </staticText> | ||||
| <staticText> | |||||
| <reportElement x="470" y="5" width="84" height="18" uuid="c0485433-8212-4b0a-90ed-c69885ad6d74"> | |||||
| <property name="com.jaspersoft.studio.unit.y" value="px"/> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| </reportElement> | |||||
| <textElement textAlignment="Left"> | |||||
| <font fontName="微軟正黑體" size="12"/> | |||||
| </textElement> | |||||
| <text><![CDATA[數量]]></text> | |||||
| </staticText> | |||||
| <line> | <line> | ||||
| <reportElement x="0" y="28" width="554" height="1" uuid="76648c53-0490-4e52-b737-a8075d9c654f"> | <reportElement x="0" y="28" width="554" height="1" uuid="76648c53-0490-4e52-b737-a8075d9c654f"> | ||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| @@ -311,10 +308,22 @@ | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| </line> | </line> | ||||
| <textField> | |||||
| <reportElement x="470" y="5" width="84" height="18" uuid="c7debdbf-fb80-4e4a-92d0-1bff85b60d0e"> | |||||
| <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> | |||||
| <font fontName="微軟正黑體" size="12"/> | |||||
| </textElement> | |||||
| <textFieldExpression><![CDATA[$P{colQty}]]></textFieldExpression> | |||||
| </textField> | |||||
| </band> | </band> | ||||
| </columnHeader> | </columnHeader> | ||||
| <detail> | <detail> | ||||
| <band height="25"> | |||||
| <band height="37"> | |||||
| <textField> | <textField> | ||||
| <reportElement x="0" y="1" width="50" height="18" uuid="ae87b739-dadf-452a-bc35-8c2da1a6a9a8"> | <reportElement x="0" y="1" width="50" height="18" uuid="ae87b739-dadf-452a-bc35-8c2da1a6a9a8"> | ||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| @@ -361,10 +370,19 @@ | |||||
| <textFieldExpression><![CDATA[$F{itemName} + "(" + $F{uom} + ")"]]></textFieldExpression> | <textFieldExpression><![CDATA[$F{itemName} + "(" + $F{uom} + ")"]]></textFieldExpression> | ||||
| </textField> | </textField> | ||||
| <line> | <line> | ||||
| <reportElement x="0" y="21" width="554" height="1" uuid="00d1c4c2-fcb0-4282-90c6-5443b260007c"> | |||||
| <reportElement x="0" y="36" width="554" height="1" uuid="00d1c4c2-fcb0-4282-90c6-5443b260007c"> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| </line> | </line> | ||||
| <textField> | |||||
| <reportElement x="240" y="18" width="230" height="18" uuid="af701932-2e78-47d4-a131-b668200dc376"> | |||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
| </reportElement> | |||||
| <textElement verticalAlignment="Top"> | |||||
| <font fontName="微軟正黑體"/> | |||||
| </textElement> | |||||
| <textFieldExpression><![CDATA[$F{lotNo}]]></textFieldExpression> | |||||
| </textField> | |||||
| </band> | </band> | ||||
| </detail> | </detail> | ||||
| <pageFooter> | <pageFooter> | ||||