@@ -0,0 +1,32 @@ | |||||
package com.ffii.core.utils; | |||||
import org.springframework.util.ResourceUtils; | |||||
import java.io.File; | |||||
import net.sf.jasperreports.engine.JasperCompileManager; | |||||
import net.sf.jasperreports.engine.JasperPrint; | |||||
import net.sf.jasperreports.engine.JasperReport; | |||||
import java.util.Map; | |||||
import java.util.List; | |||||
import net.sf.jasperreports.engine.JRDataSource; | |||||
import net.sf.jasperreports.engine.JREmptyDataSource; | |||||
import net.sf.jasperreports.engine.JasperFillManager; | |||||
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; | |||||
public class PdfUtils { | |||||
public static JasperReport loadJasperReport(String path) throws Exception { | |||||
File file = ResourceUtils.getFile(path); | |||||
JasperReport reportTemplate = JasperCompileManager.compileReport(file.getAbsolutePath()); | |||||
return reportTemplate; | |||||
} | |||||
public static <T> JasperPrint fillReport(JasperReport report, List<T> loopList, Map<String, Object> params) | |||||
throws Exception { | |||||
JRDataSource dataSources = loopList.size() > 0 ? new JRBeanCollectionDataSource(loopList) | |||||
: new JREmptyDataSource(); | |||||
JasperPrint jasperPrint = JasperFillManager.fillReport(report, params, dataSources); | |||||
return jasperPrint; | |||||
} | |||||
} |
@@ -0,0 +1,18 @@ | |||||
package com.ffii.core.utils | |||||
import com.google.zxing.BarcodeFormat | |||||
import java.awt.image.BufferedImage | |||||
import com.google.zxing.client.j2se.MatrixToImageWriter; | |||||
import com.google.zxing.common.BitMatrix; | |||||
import com.google.zxing.qrcode.QRCodeWriter; | |||||
open class QrCodeUtil { | |||||
companion object { | |||||
fun generateQRCodeImage(barcodeText: String?): BufferedImage { | |||||
val barcodeWriter = QRCodeWriter() | |||||
val bitMatrix: BitMatrix = barcodeWriter.encode(barcodeText, BarcodeFormat.QR_CODE, 250, 250) | |||||
val img: BufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix) | |||||
return img | |||||
} | |||||
} | |||||
} |
@@ -113,4 +113,6 @@ open class PurchaseOrderService( | |||||
return savedPurchaseOrder | return savedPurchaseOrder | ||||
} | } | ||||
} | } |
@@ -10,7 +10,7 @@ import jakarta.validation.constraints.NotNull | |||||
@Entity | @Entity | ||||
@Table(name = "qc_result") | @Table(name = "qc_result") | ||||
class QcResult: BaseEntity<Long>() { | |||||
open class QcResult: BaseEntity<Long>() { | |||||
@NotNull | @NotNull | ||||
@ManyToOne | @ManyToOne | ||||
@JoinColumn(name = "qcItemId") | @JoinColumn(name = "qcItemId") | ||||
@@ -1,8 +1,10 @@ | |||||
package com.ffii.fpsms.modules.qc.entity | package com.ffii.fpsms.modules.qc.entity | ||||
import com.ffii.core.support.AbstractRepository | import com.ffii.core.support.AbstractRepository | ||||
import com.ffii.fpsms.modules.qc.entity.projection.QcResultInfo | |||||
import org.springframework.stereotype.Repository | import org.springframework.stereotype.Repository | ||||
@Repository | @Repository | ||||
interface QcResultRepository: AbstractRepository<QcResult, Long> { | interface QcResultRepository: AbstractRepository<QcResult, Long> { | ||||
fun findAllQcResultInfoByStockInLineIdAndDeletedFalse(stockInLineId: Long): List<QcResultInfo> | |||||
} | } |
@@ -0,0 +1,14 @@ | |||||
package com.ffii.fpsms.modules.qc.entity.projection | |||||
import org.springframework.beans.factory.annotation.Value | |||||
interface QcResultInfo { | |||||
val id: Long | |||||
@get:Value("#{target.qcItem.name}") | |||||
val name: String | |||||
@get:Value("#{target.qcItem.code}") | |||||
val code: String | |||||
@get:Value("#{target.stockInLine.id}") | |||||
val stockInLineId: Long | |||||
val failQty: Double | |||||
} |
@@ -8,6 +8,7 @@ import com.ffii.fpsms.modules.master.web.models.MessageResponse | |||||
import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderLineRepository | import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderLineRepository | ||||
import com.ffii.fpsms.modules.qc.entity.QcResult | import com.ffii.fpsms.modules.qc.entity.QcResult | ||||
import com.ffii.fpsms.modules.qc.entity.QcResultRepository | import com.ffii.fpsms.modules.qc.entity.QcResultRepository | ||||
import com.ffii.fpsms.modules.qc.entity.projection.QcResultInfo | |||||
import com.ffii.fpsms.modules.qc.web.model.SaveQcResultRequest | import com.ffii.fpsms.modules.qc.web.model.SaveQcResultRequest | ||||
import com.ffii.fpsms.modules.stock.entity.StockInLine | import com.ffii.fpsms.modules.stock.entity.StockInLine | ||||
import com.ffii.fpsms.modules.stock.entity.StockInLineRepository | import com.ffii.fpsms.modules.stock.entity.StockInLineRepository | ||||
@@ -54,4 +55,7 @@ open class QcResultService( | |||||
) | ) | ||||
} | } | ||||
fun getAllQcResultInfoByStockInLineId(stockInLineId: Long): List<QcResultInfo> { | |||||
return qcResultRepository.findAllQcResultInfoByStockInLineIdAndDeletedFalse(stockInLineId) | |||||
} | |||||
} | } |
@@ -2,13 +2,11 @@ package com.ffii.fpsms.modules.qc.web | |||||
import com.ffii.fpsms.modules.master.web.models.MessageResponse | import com.ffii.fpsms.modules.master.web.models.MessageResponse | ||||
import com.ffii.fpsms.modules.master.web.models.NewItemRequest | import com.ffii.fpsms.modules.master.web.models.NewItemRequest | ||||
import com.ffii.fpsms.modules.qc.entity.projection.QcResultInfo | |||||
import com.ffii.fpsms.modules.qc.service.QcResultService | import com.ffii.fpsms.modules.qc.service.QcResultService | ||||
import com.ffii.fpsms.modules.qc.web.model.SaveQcResultRequest | import com.ffii.fpsms.modules.qc.web.model.SaveQcResultRequest | ||||
import jakarta.validation.Valid | import jakarta.validation.Valid | ||||
import org.springframework.web.bind.annotation.PostMapping | |||||
import org.springframework.web.bind.annotation.RequestBody | |||||
import org.springframework.web.bind.annotation.RequestMapping | |||||
import org.springframework.web.bind.annotation.RestController | |||||
import org.springframework.web.bind.annotation.* | |||||
@RestController | @RestController | ||||
@RequestMapping("/qcResult") | @RequestMapping("/qcResult") | ||||
@@ -20,4 +18,9 @@ class QcResultController( | |||||
fun saveItem(@Valid @RequestBody request: SaveQcResultRequest): MessageResponse { | fun saveItem(@Valid @RequestBody request: SaveQcResultRequest): MessageResponse { | ||||
return qcResultService.createOrUpdate(request) | return qcResultService.createOrUpdate(request) | ||||
} | } | ||||
@GetMapping("/{stockInLineId}") | |||||
fun getAllQcResultInfoByStockInLineId(@PathVariable stockInLineId: Long): List<QcResultInfo> { | |||||
return qcResultService.getAllQcResultInfoByStockInLineId(stockInLineId) | |||||
} | |||||
} | } |
@@ -1,6 +1,7 @@ | |||||
package com.ffii.fpsms.modules.stock.entity | package com.ffii.fpsms.modules.stock.entity | ||||
import com.ffii.core.support.AbstractRepository | import com.ffii.core.support.AbstractRepository | ||||
import com.ffii.fpsms.modules.stock.entity.projection.QrCodeInfo | |||||
import com.ffii.fpsms.modules.stock.entity.projection.StockInLineInfo | import com.ffii.fpsms.modules.stock.entity.projection.StockInLineInfo | ||||
import org.springframework.stereotype.Repository | import org.springframework.stereotype.Repository | ||||
@@ -10,4 +11,5 @@ interface StockInLineRepository : AbstractRepository<StockInLine, Long> { | |||||
fun findAllStockInLineInfoByStockInIdAndDeletedFalse(stockInId: Long): List<StockInLineInfo> | fun findAllStockInLineInfoByStockInIdAndDeletedFalse(stockInId: Long): List<StockInLineInfo> | ||||
fun findStockInLineInfoByIdAndDeletedFalse(id: Long): StockInLineInfo | fun findStockInLineInfoByIdAndDeletedFalse(id: Long): StockInLineInfo | ||||
fun findStockInLineInfoByIdInAndDeletedFalse(id: List<Long>): List<StockInLineInfo> | fun findStockInLineInfoByIdInAndDeletedFalse(id: List<Long>): List<StockInLineInfo> | ||||
fun findQrCodeInfoByIdInAndDeletedFalse(id: List<Long>): List<QrCodeInfo> | |||||
} | } |
@@ -0,0 +1,27 @@ | |||||
package com.ffii.fpsms.modules.stock.entity.projection | |||||
import org.springframework.beans.factory.annotation.Value | |||||
import java.awt.image.BufferedImage | |||||
import java.math.BigDecimal | |||||
import java.time.LocalDate | |||||
import java.time.LocalDateTime | |||||
interface QrCodeInfo { // stockInLine | |||||
val id: Long // stockInLineId | |||||
@get:Value("#{target.item?.id}") | |||||
val itemId: Long | |||||
@get:Value("#{target.item?.name}") | |||||
val itemName: String | |||||
val itemNo: String | |||||
@get:Value("#{target.stockIn?.purchaseOrder.code}") | |||||
val poCode: String | |||||
@get:Value("#{target.item?.type}") | |||||
val itemType: String | |||||
val acceptedQty: BigDecimal | |||||
val productionDate: LocalDateTime? | |||||
val expiryDate: LocalDate? | |||||
val lotNo: String? | |||||
@get:Value("#{target.stockIn?.purchaseOrder?.shop?.name}") | |||||
val supplier: String? | |||||
var qrCode: BufferedImage? | |||||
} |
@@ -2,6 +2,7 @@ package com.ffii.fpsms.modules.stock.service | |||||
import com.ffii.core.support.AbstractBaseEntityService | import com.ffii.core.support.AbstractBaseEntityService | ||||
import com.ffii.core.support.JdbcDao | import com.ffii.core.support.JdbcDao | ||||
import com.ffii.core.utils.QrCodeUtil | |||||
import com.ffii.fpsms.modules.common.CodeGenerator | import com.ffii.fpsms.modules.common.CodeGenerator | ||||
import com.ffii.fpsms.modules.master.entity.ItemsRepository | import com.ffii.fpsms.modules.master.entity.ItemsRepository | ||||
import com.ffii.fpsms.modules.master.entity.QcItemRepository | import com.ffii.fpsms.modules.master.entity.QcItemRepository | ||||
@@ -10,17 +11,21 @@ import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderLineRepository | |||||
import com.ffii.fpsms.modules.qc.entity.QcResult | import com.ffii.fpsms.modules.qc.entity.QcResult | ||||
import com.ffii.fpsms.modules.qc.entity.QcResultRepository | import com.ffii.fpsms.modules.qc.entity.QcResultRepository | ||||
import com.ffii.fpsms.modules.stock.entity.* | import com.ffii.fpsms.modules.stock.entity.* | ||||
import com.ffii.fpsms.modules.stock.sql.StockSql.SQL.INVENTORY_COUNT | |||||
import com.ffii.fpsms.modules.stock.web.model.ExportQrCodeRequest | |||||
import com.ffii.fpsms.modules.stock.web.model.SaveStockInLineRequest | import com.ffii.fpsms.modules.stock.web.model.SaveStockInLineRequest | ||||
import com.ffii.fpsms.modules.stock.web.model.SaveStockInRequest | import com.ffii.fpsms.modules.stock.web.model.SaveStockInRequest | ||||
import com.ffii.fpsms.modules.stock.web.model.StockInLineStatus | import com.ffii.fpsms.modules.stock.web.model.StockInLineStatus | ||||
import com.ffii.fpsms.modules.stock.sql.StockSql.SQL.INVENTORY_COUNT | |||||
import com.ffii.fpsms.modules.stock.web.model.SaveInventoryRequest | |||||
import net.sf.jasperreports.engine.JasperCompileManager | |||||
import org.springframework.core.io.ClassPathResource | |||||
import org.springframework.stereotype.Service | import org.springframework.stereotype.Service | ||||
import org.springframework.transaction.annotation.Transactional | import org.springframework.transaction.annotation.Transactional | ||||
import java.io.IOException | import java.io.IOException | ||||
import java.math.BigDecimal | import java.math.BigDecimal | ||||
import java.time.LocalDate | import java.time.LocalDate | ||||
import java.time.LocalDateTime | import java.time.LocalDateTime | ||||
import com.ffii.core.utils.PdfUtils; | |||||
@Service | @Service | ||||
open class StockInLineService( | open class StockInLineService( | ||||
@@ -83,7 +88,8 @@ open class StockInLineService( | |||||
expiryDate = request.expiryDate// frontend form input | expiryDate = request.expiryDate// frontend form input | ||||
lotNo = newLotNo | lotNo = newLotNo | ||||
} | } | ||||
return inventoryLotRepository.saveAndFlush(inventoryLot) | |||||
val savedInventoryLot = inventoryLotRepository.saveAndFlush(inventoryLot) | |||||
return savedInventoryLot | |||||
} | } | ||||
@Throws(IOException::class) | @Throws(IOException::class) | ||||
@@ -127,18 +133,19 @@ open class StockInLineService( | |||||
if (request.acceptedQty.compareTo(stockInLine.acceptedQty) == 0) { | if (request.acceptedQty.compareTo(stockInLine.acceptedQty) == 0) { | ||||
var savedInventoryLot: InventoryLot? = null | var savedInventoryLot: InventoryLot? = null | ||||
saveQcResultWhenStockIn(request, stockInLine) | saveQcResultWhenStockIn(request, stockInLine) | ||||
if (request.status == StockInLineStatus.RECEIVED.status) { | |||||
if (request.expiryDate == null) { | |||||
return MessageResponse( | |||||
id = null, | |||||
code = null, | |||||
name = null, | |||||
type = "Found Null", | |||||
message = "missing expiry", | |||||
errorPosition = "expiryDate", | |||||
) | |||||
} | |||||
if (request.status == StockInLineStatus.COMPLETE.status) { | |||||
// if (request.expiryDate == null) { | |||||
// return MessageResponse( | |||||
// id = null, | |||||
// code = null, | |||||
// name = null, | |||||
// type = "Found Null", | |||||
// message = "missing expiry", | |||||
// errorPosition = "expiryDate", | |||||
// ) | |||||
// } | |||||
savedInventoryLot = saveInventoryLotWhenStockIn(request = request, stockInLine = stockInLine) | savedInventoryLot = saveInventoryLotWhenStockIn(request = request, stockInLine = stockInLine) | ||||
println(savedInventoryLot) | |||||
} | } | ||||
stockInLine.apply { | stockInLine.apply { | ||||
// user = null | // user = null | ||||
@@ -188,18 +195,19 @@ open class StockInLineService( | |||||
} | } | ||||
saveQcResultWhenStockIn(request, stockInLine) | saveQcResultWhenStockIn(request, stockInLine) | ||||
var savedInventoryLot: InventoryLot? = null | var savedInventoryLot: InventoryLot? = null | ||||
if (request.status == StockInLineStatus.RECEIVED.status) { | |||||
if (request.expiryDate == null) { | |||||
return MessageResponse( | |||||
id = null, | |||||
code = null, | |||||
name = null, | |||||
type = "Found Null", | |||||
message = "missing expiry", | |||||
errorPosition = "expiryDate", | |||||
) | |||||
} | |||||
if (request.status == StockInLineStatus.COMPLETE.status) { | |||||
// if (request.expiryDate == null) { | |||||
// return MessageResponse( | |||||
// id = null, | |||||
// code = null, | |||||
// name = null, | |||||
// type = "Found Null", | |||||
// message = "missing expiry", | |||||
// errorPosition = "expiryDate", | |||||
// ) | |||||
// } | |||||
savedInventoryLot = saveInventoryLotWhenStockIn(request = request, stockInLine = stockInLine) | savedInventoryLot = saveInventoryLotWhenStockIn(request = request, stockInLine = stockInLine) | ||||
println(savedInventoryLot) | |||||
} | } | ||||
stockInLine.apply { | stockInLine.apply { | ||||
receiptDate = request.receiptDate?.atStartOfDay() | receiptDate = request.receiptDate?.atStartOfDay() | ||||
@@ -228,4 +236,32 @@ open class StockInLineService( | |||||
} | } | ||||
} | } | ||||
@Throws(IOException::class) | |||||
@Transactional | |||||
open fun exportStockInLineQrcode(request: ExportQrCodeRequest): Map<String, Any> { | |||||
val QRCODE_PDF = "qrCodeLabel/poItemPDF.jrxml" | |||||
val resource = ClassPathResource(QRCODE_PDF) | |||||
val inputStream = resource.inputStream | |||||
val poLabel = JasperCompileManager.compileReport(inputStream) | |||||
val stockInLineInfo = stockInLineRepository.findQrCodeInfoByIdInAndDeletedFalse(request.stockInLineIds).toMutableList() | |||||
for (lineInfo in stockInLineInfo) { | |||||
val field = mutableMapOf<String, Any>() | |||||
val qrCodeContent = ( | |||||
"itemId:${lineInfo.itemId}" + | |||||
",stockInLineId:${lineInfo.id}" | |||||
) | |||||
val image = QrCodeUtil.generateQRCodeImage(qrCodeContent) | |||||
lineInfo.apply { | |||||
this.qrCode = image | |||||
} | |||||
} | |||||
val params: MutableMap<String, Any> = mutableMapOf( | |||||
"poCode" to stockInLineInfo[0].poCode | |||||
) | |||||
return mapOf( | |||||
"report" to PdfUtils.fillReport(poLabel,stockInLineInfo, params), | |||||
"fileName" to stockInLineInfo[0].poCode | |||||
); | |||||
} | |||||
} | } |
@@ -5,8 +5,8 @@ open class StockSql { | |||||
val INVENTORY_COUNT = StringBuilder("select" | val INVENTORY_COUNT = StringBuilder("select" | ||||
+ " count(id) " | + " count(id) " | ||||
+ " from inventory_lot i " | + " from inventory_lot i " | ||||
+ " where i.stockInDate <= :from " | |||||
+ " and i.stockInDate < :to " | |||||
+ " where i.stockInDate > :from " | |||||
+ " and i.stockInDate <= :to " | |||||
+ " and i.itemId = :itemId" | + " and i.itemId = :itemId" | ||||
) | ) | ||||
} | } |
@@ -1,15 +1,22 @@ | |||||
package com.ffii.fpsms.modules.stock.web | package com.ffii.fpsms.modules.stock.web | ||||
import com.ffii.fpsms.modules.master.web.models.MessageResponse | import com.ffii.fpsms.modules.master.web.models.MessageResponse | ||||
import com.ffii.fpsms.modules.master.web.models.NewItemRequest | |||||
import com.ffii.fpsms.modules.stock.service.StockInLineService | import com.ffii.fpsms.modules.stock.service.StockInLineService | ||||
import com.ffii.fpsms.modules.stock.web.model.ExportQrCodeRequest | |||||
import com.ffii.fpsms.modules.stock.web.model.SaveStockInLineRequest | import com.ffii.fpsms.modules.stock.web.model.SaveStockInLineRequest | ||||
import jakarta.servlet.http.HttpServletResponse | |||||
import jakarta.validation.Valid | import jakarta.validation.Valid | ||||
import org.springframework.web.bind.annotation.GetMapping | |||||
import net.sf.jasperreports.engine.JasperExportManager | |||||
import net.sf.jasperreports.engine.JasperPrint | |||||
import org.springframework.context.NoSuchMessageException | |||||
import org.springframework.web.bind.annotation.PostMapping | import org.springframework.web.bind.annotation.PostMapping | ||||
import org.springframework.web.bind.annotation.RequestBody | import org.springframework.web.bind.annotation.RequestBody | ||||
import org.springframework.web.bind.annotation.RequestMapping | import org.springframework.web.bind.annotation.RequestMapping | ||||
import org.springframework.web.bind.annotation.RestController | import org.springframework.web.bind.annotation.RestController | ||||
import java.io.OutputStream | |||||
import java.io.UnsupportedEncodingException | |||||
import java.text.ParseException | |||||
@RestController | @RestController | ||||
@RequestMapping("/stockInLine") | @RequestMapping("/stockInLine") | ||||
@@ -25,4 +32,18 @@ class StockInLineController( | |||||
fun update(@Valid @RequestBody newItem: SaveStockInLineRequest): MessageResponse { | fun update(@Valid @RequestBody newItem: SaveStockInLineRequest): MessageResponse { | ||||
return stockInLineService.update(newItem) | return stockInLineService.update(newItem) | ||||
} | } | ||||
@PostMapping("/print-label") | |||||
@Throws(UnsupportedEncodingException::class, NoSuchMessageException::class, ParseException::class, Exception::class) | |||||
fun printLabel(@Valid @RequestBody request: ExportQrCodeRequest, response: HttpServletResponse) { | |||||
response.characterEncoding = "utf-8"; | |||||
response.contentType = "application/pdf"; | |||||
val out: OutputStream = response.outputStream | |||||
val pdf: Map<String, Any> = stockInLineService.exportStockInLineQrcode(request) | |||||
val jasperPrint = pdf["report"] as JasperPrint | |||||
response.setHeader("Content-Disposition", "attachment; filename=" + pdf["fileName"] + ".pdf"); | |||||
out.write(JasperExportManager.exportReportToPdf(jasperPrint)); | |||||
} | |||||
} | } |
@@ -0,0 +1,5 @@ | |||||
package com.ffii.fpsms.modules.stock.web.model | |||||
data class ExportQrCodeRequest ( | |||||
val stockInLineIds: List<Long> | |||||
) |
@@ -0,0 +1,196 @@ | |||||
<?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="poItemPDF" printOrder="Horizontal" pageWidth="425" pageHeight="283" orientation="Landscape" columnWidth="421" leftMargin="2" rightMargin="2" topMargin="2" bottomMargin="2" uuid="6cb85eb9-3573-42f3-a293-099db250aec0"> | |||||
<property name="com.jaspersoft.studio.unit." value="pixel"/> | |||||
<parameter name="lotNo" class="java.lang.String"/> | |||||
<parameter name="materialName" class="java.lang.String"/> | |||||
<parameter name="materialCode" class="java.lang.String"/> | |||||
<parameter name="purchaseCode" class="java.lang.String"/> | |||||
<parameter name="qrCode" class="java.awt.Image"/> | |||||
<parameter name="materialQty" class="java.math.BigDecimal"/> | |||||
<parameter name="materialUom" class="java.lang.String"/> | |||||
<queryString> | |||||
<![CDATA[]]> | |||||
</queryString> | |||||
<field name="lotNo" class="java.lang.String"/> | |||||
<field name="materialName" class="java.lang.String"/> | |||||
<field name="materialCode" class="java.lang.String"/> | |||||
<field name="materialQty" class="java.lang.String"/> | |||||
<field name="materialUom" class="java.lang.String"/> | |||||
<field name="qrCode" class="java.awt.Image"/> | |||||
<field name="purchaseCode" class="java.lang.String"/> | |||||
<field name="supplierName" class="java.lang.String"/> | |||||
<field name="materialWeight" class="java.lang.String"/> | |||||
<field name="weightUnit" class="java.lang.String"/> | |||||
<field name="mfrDate" class="java.lang.String"/> | |||||
<field name="shelfLifeDate" class="java.lang.String"/> | |||||
<background> | |||||
<band splitType="Stretch"/> | |||||
</background> | |||||
<detail> | |||||
<band height="279" splitType="Stretch"> | |||||
<textField> | |||||
<reportElement x="80" y="21" width="150" height="16" uuid="402f35fc-b11a-4bf1-982d-e12c622f38ea"> | |||||
<property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
<property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
</reportElement> | |||||
<textElement> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<textFieldExpression><![CDATA[$F{lotNo}]]></textFieldExpression> | |||||
</textField> | |||||
<staticText> | |||||
<reportElement x="0" y="21" width="80" height="16" uuid="f5f145f1-123f-4fe5-90fa-8550b3d2eb63"/> | |||||
<textElement textAlignment="Left"> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<text><![CDATA[批次編號:]]></text> | |||||
</staticText> | |||||
<staticText> | |||||
<reportElement x="0" y="49" width="80" height="16" uuid="c2041205-51f8-45bb-a1d1-e3de37eebed7"/> | |||||
<textElement textAlignment="Left"> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<text><![CDATA[供應商:]]></text> | |||||
</staticText> | |||||
<textField> | |||||
<reportElement x="80" y="49" width="150" height="16" uuid="ab82ca39-8840-4471-b7c0-cdeec9cb5693"> | |||||
<property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
<property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
</reportElement> | |||||
<textElement> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<textFieldExpression><![CDATA[$F{supplierName}]]></textFieldExpression> | |||||
</textField> | |||||
<staticText> | |||||
<reportElement x="0" y="104" width="80" height="16" uuid="96d46fb1-939d-4f3e-b8f0-172b69b85e9f"/> | |||||
<textElement textAlignment="Left"> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<text><![CDATA[物料編號:]]></text> | |||||
</staticText> | |||||
<textField> | |||||
<reportElement x="80" y="104" width="150" height="16" uuid="1f289946-b945-4f79-8515-212368b8be3b"> | |||||
<property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
<property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
</reportElement> | |||||
<textElement> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<textFieldExpression><![CDATA[$F{materialCode}]]></textFieldExpression> | |||||
</textField> | |||||
<staticText> | |||||
<reportElement x="0" y="160" width="80" height="16" uuid="53a2d7cf-bd50-4264-abee-346823cd49dd"/> | |||||
<textElement textAlignment="Left"> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<text><![CDATA[數量:]]></text> | |||||
</staticText> | |||||
<textField> | |||||
<reportElement x="80" y="160" width="150" height="16" uuid="629d9af8-c73f-4614-ba9d-a582e2ed4a29"> | |||||
<property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
<property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
</reportElement> | |||||
<textElement> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<textFieldExpression><![CDATA[$F{materialQty} + " " + $F{materialUom}]]></textFieldExpression> | |||||
</textField> | |||||
<image> | |||||
<reportElement x="230" y="45" width="190" height="190" uuid="5dd35c73-973b-4f0d-9cad-13305a29a9fd"> | |||||
<property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
<property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
</reportElement> | |||||
<imageExpression><![CDATA[$F{qrCode}]]></imageExpression> | |||||
</image> | |||||
<staticText> | |||||
<reportElement x="0" y="216" width="80" height="16" uuid="c62ac00a-c495-462c-93bc-97bdd3cdb395"> | |||||
<property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
</reportElement> | |||||
<textElement textAlignment="Left"> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<text><![CDATA[生產日期:]]></text> | |||||
</staticText> | |||||
<textField> | |||||
<reportElement x="80" y="216" width="150" height="16" uuid="74a5cfba-046d-42f4-92d7-113729514a6f"> | |||||
<property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
<property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
</reportElement> | |||||
<textElement> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<textFieldExpression><![CDATA[$F{mfrDate}]]></textFieldExpression> | |||||
</textField> | |||||
<staticText> | |||||
<reportElement x="0" y="77" width="80" height="16" uuid="1b1efafd-049a-432e-93c4-9662273011f7"/> | |||||
<textElement textAlignment="Left"> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<text><![CDATA[採購訂單編號:]]></text> | |||||
</staticText> | |||||
<textField> | |||||
<reportElement x="80" y="77" width="150" height="16" uuid="b805e20a-9a36-45c8-8255-23b6cc58f47c"> | |||||
<property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
<property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
</reportElement> | |||||
<textElement> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<textFieldExpression><![CDATA[$P{purchaseCode}]]></textFieldExpression> | |||||
</textField> | |||||
<staticText> | |||||
<reportElement x="0" y="132" width="80" height="16" uuid="5c3f9b03-222c-4c94-ab58-6bc86d44c5ce"/> | |||||
<textElement textAlignment="Left"> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<text><![CDATA[物料名稱:]]></text> | |||||
</staticText> | |||||
<textField> | |||||
<reportElement x="80" y="132" width="150" height="16" uuid="e04b094d-2d16-4060-b6d9-2e6033a673ab"> | |||||
<property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
<property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
</reportElement> | |||||
<textElement> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<textFieldExpression><![CDATA[$F{materialName}]]></textFieldExpression> | |||||
</textField> | |||||
<staticText> | |||||
<reportElement x="0" y="188" width="80" height="16" uuid="8b4d694b-90eb-4be4-b407-38d3dae15096"/> | |||||
<textElement textAlignment="Left"> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<text><![CDATA[總淨重量:]]></text> | |||||
</staticText> | |||||
<textField> | |||||
<reportElement x="80" y="188" width="150" height="16" uuid="d6a75fb1-ade3-4216-b7e2-d596e65091ef"> | |||||
<property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
<property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
</reportElement> | |||||
<textElement> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<textFieldExpression><![CDATA[$F{materialWeight} + " " + $F{weightUnit}]]></textFieldExpression> | |||||
</textField> | |||||
<staticText> | |||||
<reportElement x="0" y="244" width="80" height="16" uuid="32edcad1-23c1-4d41-8c9a-352d9e6ef377"/> | |||||
<textElement textAlignment="Left"> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<text><![CDATA[到期日:]]></text> | |||||
</staticText> | |||||
<textField> | |||||
<reportElement x="80" y="244" width="150" height="16" uuid="97e4a9bb-fc84-4074-b523-ddf9eb9ed2d2"> | |||||
<property name="com.jaspersoft.studio.unit.height" value="px"/> | |||||
<property name="com.jaspersoft.studio.unit.width" value="px"/> | |||||
</reportElement> | |||||
<textElement> | |||||
<font fontName="微軟正黑體" size="12"/> | |||||
</textElement> | |||||
<textFieldExpression><![CDATA[$F{shelfLifeDate}]]></textFieldExpression> | |||||
</textField> | |||||
</band> | |||||
</detail> | |||||
</jasperReport> |