Browse Source

dn fix phase 1

master
kelvin.yau 1 month ago
parent
commit
fa5bafd9e3
10 changed files with 175 additions and 130 deletions
  1. +2
    -0
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoPickOrderRepository.kt
  2. +105
    -54
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt
  3. +15
    -15
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoPickOrderService.kt
  4. +3
    -1
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoReleaseCoordinatorService.kt
  5. +1
    -1
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDNLabelsRequest.kt
  6. +1
    -2
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDeliveryNoteRequest.kt
  7. +2
    -2
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDNLabelsRequest.kt
  8. +1
    -2
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDeliveryNoteRequest.kt
  9. +4
    -2
      src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickExecutionIssueService.kt
  10. +41
    -51
      src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml

+ 2
- 0
src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoPickOrderRepository.kt View File

@@ -7,6 +7,7 @@ import com.ffii.fpsms.modules.deliveryOrder.enums.DoPickOrderStatus
import com.ffii.fpsms.modules.master.entity.projections.SearchId
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query
import org.springframework.data.repository.query.Param
import org.springframework.stereotype.Repository
import java.io.Serializable
import java.time.LocalDateTime
@@ -29,4 +30,5 @@ fun findByStoreIdAndRequiredDeliveryDateAndTicketStatusIn(
requiredDeliveryDate: LocalDate,
status: List<DoPickOrderStatus>
): List<DoPickOrder>

}

+ 105
- 54
src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt View File

@@ -58,8 +58,10 @@ import org.springframework.core.io.ClassPathResource
import java.io.File
import java.io.FileNotFoundException
import com.ffii.core.support.JdbcDao;
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRepository
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecord
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecordRepository
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRepository
import com.ffii.fpsms.modules.deliveryOrder.web.models.ExportDNLabelsRequest
import com.ffii.fpsms.modules.deliveryOrder.web.models.PrintDNLabelsRequest
import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository
@@ -100,6 +102,8 @@ open class DeliveryOrderService(
private val inventoryLotRepository: InventoryLotRepository,
private val jdbcDao: JdbcDao,
private val pickExecutionIssueRepository: PickExecutionIssueRepository,
private val doPickOrderRepository: DoPickOrderRepository,
private val doPickOrderLineRepository: DoPickOrderLineRepository,
) {

open fun findByM18DataLogId(m18DataLogId: Long): DeliveryOrder? {
@@ -673,63 +677,104 @@ open class DeliveryOrderService(
if (!resource.exists()) {
throw FileNotFoundException("Report file not fount: $DELIVERYNOTE_PDF")
}
val inputStream = resource.inputStream
val deliveryNote = JasperCompileManager.compileReport(inputStream)
val deliveryNoteInfo =
deliveryOrderRepository.findDeliveryOrderInfoById(request.deliveryOrderIds).toMutableList()
val doPickOrder = doPickOrderRepository.findById(request.doPickOrderId).orElseThrow {
NoSuchElementException("DoPickOrder not found with ID: ${request.doPickOrderId}")
}
val pickOrderIds = if (doPickOrder.pickOrderId != null) {
// Single pick order case
listOf(doPickOrder.pickOrderId!!)
} else {
// Merged pick orders case - get from DoPickOrderLine
val doPickOrderLines = doPickOrderLineRepository.findByDoPickOrderIdAndDeletedFalse(doPickOrder.id!!)
val orderIds = doPickOrderLines.mapNotNull { it.pickOrderId }.distinct()

val fields = mutableListOf<MutableMap<String, Any>>()
val params = mutableMapOf<String, Any>()
if (orderIds.isEmpty()) {
throw IllegalStateException("DoPickOrder ${request.doPickOrderId} has no associated pick orders")
}
orderIds
}

val deliveryOrderEntity = deliveryOrderRepository.findByIdAndDeletedIsFalse(request.deliveryOrderIds)
val selectedTruckNo = deliveryOrderEntity?.shop?.id?.let { shopId ->
val trucks = truckRepository.findByShopIdAndDeletedFalse(shopId)
trucks.firstOrNull()?.truckLanceCode
} ?: ""
val deliveryOrderIds = if (doPickOrder.doOrderId != null) {
// Single delivery order case
listOf(doPickOrder.doOrderId!!)
} else {
// Merged delivery orders case - get from DoPickOrderLine
val doPickOrderLines = doPickOrderLineRepository.findByDoPickOrderIdAndDeletedFalse(doPickOrder.id!!)
val orderIds = doPickOrderLines.mapNotNull { it.doOrderId }.distinct()

val selectedPickOrder = pickOrderRepository.findById(request.pickOrderIds).orElse(null)
if (orderIds.isEmpty()) {
throw IllegalStateException("DoPickOrder ${request.doPickOrderId} has no associated delivery orders")
}
orderIds
}

val deliveryNoteInfo = deliveryOrderIds.flatMap { deliveryOrderId ->
deliveryOrderRepository.findDeliveryOrderInfoById(deliveryOrderId)
}.toMutableList()

for (info in deliveryNoteInfo) {
val sortedLines = info.deliveryOrderLines.sortedBy { line ->
line.itemId?.let { itemId ->
getWarehouseOrderByItemId(itemId) // ✅ 改用 warehouse order
} ?: Int.MAX_VALUE
}
if (deliveryNoteInfo.isEmpty()) {
throw NoSuchElementException("Delivery orders not found for IDs: $deliveryOrderIds")
}

sortedLines.forEachIndexed { index, line ->
val pickOrderId = pickOrderIds.first()

val field = mutableMapOf<String, Any>()
val inputStream = resource.inputStream
val deliveryNote = JasperCompileManager.compileReport(inputStream)

field["sequenceNumber"] = (index + 1).toString()
field["itemNo"] = line.itemNo
field["itemName"] = line.itemName ?: ""
field["uom"] = line.uom ?: ""
field["qty"] = line.qty.toString()
field["shortName"] = line.uomShortDesc ?: ""
val fields = mutableListOf<MutableMap<String, Any>>()
val params = mutableMapOf<String, Any>()

val route = line.itemId?.let { itemId ->
getWarehouseCodeByItemId(itemId) // ✅ 使用新方法
} ?: ""
field["route"] = route
val truckNo = doPickOrder.truckLanceCode ?: ""
val selectedPickOrder = pickOrderRepository.findById(pickOrderId).orElse(null)

val lotNo = line.itemId?.let { itemId ->
getLotNumbersForPickOrderByItemId(itemId, request.pickOrderIds)
} ?: ""
field["lotNo"] = lotNo
val allLines = deliveryNoteInfo.flatMap { info ->
info.deliveryOrderLines.map { line -> line }
}

fields.add(field)
}
val sortedLines = allLines.sortedBy { line ->
line.itemId?.let { itemId ->
getWarehouseOrderByItemId(itemId)
} ?: Int.MAX_VALUE
}

sortedLines.forEach { line ->
val field = mutableMapOf<String, Any>()

field["sequenceNumber"] = (fields.size + 1).toString()
field["itemNo"] = line.itemNo
field["itemName"] = line.itemName ?: ""
field["uom"] = line.uom ?: ""
field["qty"] = line.qty.toString()
field["shortName"] = line.uomShortDesc ?: ""

val route = line.itemId?.let { itemId ->
getWarehouseCodeByItemId(itemId)
} ?: ""
field["route"] = route

val lotNo = line.itemId?.let { itemId ->
pickOrderIds.mapNotNull { pickOrderId ->
val lots = getLotNumbersForPickOrderByItemId(itemId, pickOrderId)
if (lots.isNotBlank()) lots else null
}.distinct().joinToString(", ")
} ?: ""
field["lotNo"] = lotNo

fields.add(field)
}

if (request.isDraft) {
params["dnTitle"] = "送貨單(初稿)"
params["colQty"] = "所需數量"
params["totalCartonTitle"] = ""
params["deliveryOrderCodeTitle"] = ""
params["deliveryOrderCode"] = ""
} else {
params["dnTitle"] = "送貨單"
params["colQty"] = "數量"
params["colQty"] = "已提數量"
params["totalCartonTitle"] = "總箱數:"
params["deliveryOrderCodeTitle"] = "送貨單編號:"
params["deliveryOrderCode"] = "GEN FROM CODE GENERATOR (NEED FIND TIMING)"
}

params["numOfCarton"] = request.numOfCarton.toString()
@@ -737,23 +782,20 @@ open class DeliveryOrderService(
params["numOfCarton"] = ""
}

params["deliveryOrderCode"] = deliveryNoteInfo[0].code
params["shopName"] = deliveryNoteInfo[0].shopName ?: ""
params["shopName"] = doPickOrder.shopName ?: deliveryNoteInfo[0].shopName ?:""
params["shopAddress"] = deliveryNoteInfo[0].shopAddress ?: ""
params["deliveryDate"] =
deliveryNoteInfo[0].estimatedArrivalDate?.format(DateTimeFormatter.ISO_LOCAL_DATE) ?: ""
params["truckNo"] = selectedTruckNo
params["ShopPurchaseOrderNo"] = deliveryNoteInfo[0].code
params["FGPickOrderNo"] = selectedPickOrder?.code ?: ""
params["deliveryDate"] = deliveryNoteInfo[0].estimatedArrivalDate?.format(DateTimeFormatter.ISO_LOCAL_DATE) ?: ""
params["truckNo"] = truckNo
params["ShopPurchaseOrderNo"] = doPickOrder.deliveryOrderCode ?: deliveryNoteInfo.joinToString(", ") { it.code }
params["FGPickOrderNo"] = doPickOrder.pickOrderCode ?: selectedPickOrder?.code ?: ""


return mapOf(
"report" to PdfUtils.fillReport(deliveryNote, fields, params),
"filename" to deliveryNoteInfo[0].code
"filename" to deliveryNoteInfo.joinToString("_") { it.code }
)
}


//Print Delivery Note
@Transactional
open fun printDeliveryNote(request: PrintDeliveryNoteRequest) {
@@ -761,10 +803,9 @@ open class DeliveryOrderService(

val pdf = exportDeliveryNote(
ExportDeliveryNoteRequest(
deliveryOrderIds = request.deliveryOrderId,
doPickOrderId = request.doPickOrderId,
numOfCarton = request.numOfCarton,
isDraft = request.isDraft,
pickOrderIds = request.pickOrderId
isDraft = request.isDraft
)
)

@@ -792,20 +833,30 @@ open class DeliveryOrderService(
if (!resource.exists()) {
throw FileNotFoundException("Label file not found: $DNLABELS_PDF")
}

val doPickOrder = doPickOrderRepository.findById(request.doPickOrderId).orElseThrow {
NoSuchElementException("DoPickOrder not found with ID: ${request.doPickOrderId}")
}

val deliveryOrderId = doPickOrder.doOrderId
?: throw IllegalStateException("DoPickOrder has no associated delivery order")

val inputStream = resource.inputStream
val cartonLabel = JasperCompileManager.compileReport(inputStream)
val cartonLabelInfo =
deliveryOrderRepository.findDeliveryOrderInfoById(request.deliveryOrderIds).toMutableList()
deliveryOrderRepository.findDeliveryOrderInfoById(request.doPickOrderId).toMutableList()

val params = mutableMapOf<String, Any>()
val fields = mutableListOf<MutableMap<String, Any>>()

for (info in cartonLabelInfo) {
val field = mutableMapOf<String, Any>()
}

params["shopPurchaseOrderNo"] = cartonLabelInfo[0].code
params["deliveryOrderCode"] = cartonLabelInfo[0].code
params["shopPurchaseOrderNo"] = doPickOrder.deliveryOrderCode ?: cartonLabelInfo[0].code
params["deliveryOrderCode"] = "GEN FROM CODE GENERATOR (NEED FIND TIMING)"
params["shopAddress"] = cartonLabelInfo[0].shopAddress ?: ""
params["shopName"] = cartonLabelInfo[0].shopName ?: ""
params["shopName"] = doPickOrder.shopName ?: cartonLabelInfo[0].shopName ?: ""

for (cartonNumber in 1..request.numOfCarton) {
val field = mutableMapOf<String, Any>()
@@ -828,7 +879,7 @@ open class DeliveryOrderService(

val pdf = exportDNLabels(
ExportDNLabelsRequest(
deliveryOrderIds = request.deliveryOrderId,
doPickOrderId = request.doPickOrderId,
numOfCarton = request.numOfCarton
)
)


+ 15
- 15
src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoPickOrderService.kt View File

@@ -64,7 +64,7 @@ open class DoPickOrderService(
)
}

fun getNextTicketNumber(datePrefix: String, storeId: String): String {
open fun getNextTicketNumber(datePrefix: String, storeId: String): String {
println("🔍 DEBUG: Getting next ticket number for date prefix: $datePrefix, store: $storeId")
try {
val sanitizedStoreId = storeId.replace("/", "")
@@ -92,18 +92,18 @@ open class DoPickOrderService(
}
}

fun save(record: DoPickOrder): DoPickOrder {
open fun save(record: DoPickOrder): DoPickOrder {
return doPickOrderRepository.save(record)
}

fun findByStoreIdOrderByTruckDepartureTime(storeId: String): List<DoPickOrder> {
open fun findByStoreIdOrderByTruckDepartureTime(storeId: String): List<DoPickOrder> {
return doPickOrderRepository.findByStoreIdAndTicketStatusOrderByTruckDepartureTimeAsc(
storeId, DoPickOrderStatus.pending
)
}

// Add these missing methods
fun assignByStore(request: AssignByStoreRequest): MessageResponse {
open fun assignByStore(request: AssignByStoreRequest): MessageResponse {
// TODO: Implement store-based assignment logic
return MessageResponse(
id = null,
@@ -116,7 +116,7 @@ open class DoPickOrderService(
)
}

fun releaseAssignedByStore(request: AssignByStoreRequest): MessageResponse {
open fun releaseAssignedByStore(request: AssignByStoreRequest): MessageResponse {
// TODO: Implement store-based release logic
return MessageResponse(
id = null,
@@ -130,7 +130,7 @@ open class DoPickOrderService(
}

// ✅ Updated method to set ticketReleaseTime when assigning order to user
fun updateHandledByForPickOrder(pickOrderId: Long, userId: Long): List<DoPickOrder> {
open fun updateHandledByForPickOrder(pickOrderId: Long, userId: Long): List<DoPickOrder> {
val doPickOrders = doPickOrderRepository.findByPickOrderId(pickOrderId)
val user = userRepository.findById(userId).orElse(null) // ✅ 改用 orElse(null)
val handlerName = user?.name ?: "Unknown"
@@ -143,7 +143,7 @@ open class DoPickOrderService(
return doPickOrderRepository.saveAll(doPickOrders)
}

fun completeDoPickOrdersForPickOrder(pickOrderId: Long): List<DoPickOrder> {
open fun completeDoPickOrdersForPickOrder(pickOrderId: Long): List<DoPickOrder> {
val doPickOrders = doPickOrderRepository.findByPickOrderId(pickOrderId)
doPickOrders.forEach {
it.ticketStatus = DoPickOrderStatus.completed
@@ -169,7 +169,7 @@ open class DoPickOrderService(
// ✅ New method to remove do_pick_order records when auto-assigning by store
// ✅ 修改方法:先复制记录到record表,再删除原记录
@Transactional
fun removeDoPickOrdersForPickOrder(pickOrderId: Long): Int {
open fun removeDoPickOrdersForPickOrder(pickOrderId: Long): Int {
val doPickOrders = doPickOrderRepository.findByPickOrderId(pickOrderId)
var deletedCount = 0
@@ -229,12 +229,12 @@ open class DoPickOrderService(
return deletedCount
}

fun saveRecord(record: DoPickOrderRecord): DoPickOrderRecord {
open fun saveRecord(record: DoPickOrderRecord): DoPickOrderRecord {
return doPickOrderRecordRepository.save(record)
}

// ✅ Add method to update DoPickOrderRecord status
fun updateRecordHandledByForPickOrder(pickOrderId: Long, userId: Long): List<DoPickOrderRecord> {
open fun updateRecordHandledByForPickOrder(pickOrderId: Long, userId: Long): List<DoPickOrderRecord> {
val doPickOrderRecords = doPickOrderRecordRepository.findByPickOrderId(pickOrderId)
val user = userRepository.findById(userId).orElse(null) // ✅ 改用 orElse(null)
val handlerName = user?.name ?: "Unknown"
@@ -248,7 +248,7 @@ open class DoPickOrderService(
}

// ✅ Add method to complete DoPickOrderRecord
fun completeDoPickOrderRecordsForPickOrder(pickOrderId: Long): List<DoPickOrderRecord> {
open fun completeDoPickOrderRecordsForPickOrder(pickOrderId: Long): List<DoPickOrderRecord> {
val doPickOrderRecords = doPickOrderRecordRepository.findByPickOrderId(pickOrderId)
doPickOrderRecords.forEach {
it.ticketStatus = DoPickOrderStatus.completed
@@ -258,18 +258,18 @@ open class DoPickOrderService(
}

// Add method to find do_pick_order records by pick order ID
fun findByPickOrderId(pickOrderId: Long): List<DoPickOrder> {
open fun findByPickOrderId(pickOrderId: Long): List<DoPickOrder> {
return doPickOrderRepository.findByPickOrderId(pickOrderId)
}

fun updateDoOrderIdForPickOrder(pickOrderId: Long, doOrderId: Long): List<DoPickOrder> {
open fun updateDoOrderIdForPickOrder(pickOrderId: Long, doOrderId: Long): List<DoPickOrder> {
val doPickOrders = doPickOrderRepository.findByPickOrderId(pickOrderId)
doPickOrders.forEach {
it.doOrderId = doOrderId
}
return doPickOrderRepository.saveAll(doPickOrders)
}
fun getSummaryByStore(storeId: String, requiredDate: LocalDate?): StoreLaneSummary {
open fun getSummaryByStore(storeId: String, requiredDate: LocalDate?): StoreLaneSummary {
val targetDate = requiredDate ?: LocalDate.now()
println("🔍 DEBUG: Getting summary for store=$storeId, date=$targetDate")
@@ -372,7 +372,7 @@ open class DoPickOrderService(
}
}
// ✅ 修复:把 assignByLane 移到类里面
fun assignByLane(request: AssignByLaneRequest): MessageResponse {
open fun assignByLane(request: AssignByLaneRequest): MessageResponse {
val user = userRepository.findById(request.userId).orElse(null)
?: return MessageResponse(
id = null, code = "USER_NOT_FOUND", name = null, type = null,


+ 3
- 1
src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoReleaseCoordinatorService.kt View File

@@ -41,6 +41,7 @@ class DoReleaseCoordinatorService(
private val poolSize = Runtime.getRuntime().availableProcessors()
private val executor = Executors.newFixedThreadPool(min(poolSize, 4))
private val jobs = ConcurrentHashMap<String, BatchReleaseJobStatus>()

private fun updateBatchTicketNumbers() {
try {
val updateSql = """
@@ -188,6 +189,7 @@ class DoReleaseCoordinatorService(
e.printStackTrace()
}
}

private fun getOrderedDeliveryOrderIds(ids: List<Long>): List<Long> {
try {
println("🔍 DEBUG: Getting ordered IDs for ${ids.size} orders")
@@ -492,7 +494,7 @@ class DoReleaseCoordinatorService(
"4F" -> "4/F"
else -> "2/F"
}
val doPickOrder = DoPickOrder(
storeId = storeId,
ticketNo = "TEMP-${System.currentTimeMillis()}",


+ 1
- 1
src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDNLabelsRequest.kt View File

@@ -1,6 +1,6 @@
package com.ffii.fpsms.modules.deliveryOrder.web.models

data class ExportDNLabelsRequest (
val deliveryOrderIds: Long,
val doPickOrderId: Long,
val numOfCarton: Int,
)

+ 1
- 2
src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDeliveryNoteRequest.kt View File

@@ -2,8 +2,7 @@ package com.ffii.fpsms.modules.deliveryOrder.web.models
import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository

data class ExportDeliveryNoteRequest (
val deliveryOrderIds: Long,
val doPickOrderId: Long,
val numOfCarton: Int,
val isDraft: Boolean,
val pickOrderIds: Long,
)

+ 2
- 2
src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDNLabelsRequest.kt View File

@@ -1,8 +1,8 @@
package com.ffii.fpsms.modules.deliveryOrder.web.models

data class PrintDNLabelsRequest (
val deliveryOrderId: Long,
val doPickOrderId: Long,
val printerId: Long,
val printQty: Int?,
val numOfCarton: Int,
val numOfCarton: Int
)

+ 1
- 2
src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDeliveryNoteRequest.kt View File

@@ -1,10 +1,9 @@
package com.ffii.fpsms.modules.deliveryOrder.web.models

data class PrintDeliveryNoteRequest(
val deliveryOrderId: Long,
val doPickOrderId: Long,
val printerId: Long,
val printQty: Int?,
val numOfCarton: Int,
val isDraft: Boolean,
val pickOrderId: Long,
)

+ 4
- 2
src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickExecutionIssueService.kt View File

@@ -713,6 +713,8 @@ open fun createBatchReleaseIssue(
FROM fpsmsdb.delivery_order_line dol
INNER JOIN fpsmsdb.items i ON i.id = dol.itemId
WHERE dol.deliveryOrderId = :deliveryOrderId
INNER JOIN fpsmsdb.items i ON i.id = dol.itemId
WHERE dol.doId = :deliveryOrderId
AND dol.deleted = 0
""".trimIndent()
@@ -736,11 +738,11 @@ open fun createBatchReleaseIssue(
val issue = PickExecutionIssue(
id = null,
pickOrderId = null, // batch release 失败时可能还没有 pick order
pickOrderId = 0L, // batch release 失败时可能还没有 pick order
pickOrderCode = deliveryOrder["code"] as? String ?: "",
pickOrderCreateDate = LocalDate.now(),
pickExecutionDate = LocalDate.now(),
pickOrderLineId = null, // batch release 失败时可能还没有 pick order line
pickOrderLineId = 0L, // batch release 失败时可能还没有 pick order line
issueNo = issueNo,
joPickOrderId = null,
doPickOrderId = null,


+ 41
- 51
src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml View File

@@ -1,15 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.17.0.final using JasperReports Library version 6.17.0-6d93193241dd8cc42629e188b94f9e0bc5722efd -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="DeliveryNotePDF" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" isIgnorePagination="true" uuid="36f9d415-527f-4152-b7b0-eea81fe06f73">
<property name="com.jaspersoft.studio.unit." value="pixel"/>
<property name="com.jaspersoft.studio.unit.pageHeight" value="pixel"/>
<property name="com.jaspersoft.studio.unit.pageWidth" value="pixel"/>
<property name="com.jaspersoft.studio.unit.topMargin" value="pixel"/>
<property name="com.jaspersoft.studio.unit.bottomMargin" value="pixel"/>
<property name="com.jaspersoft.studio.unit.leftMargin" value="pixel"/>
<property name="com.jaspersoft.studio.unit.rightMargin" value="pixel"/>
<property name="com.jaspersoft.studio.unit.columnWidth" value="pixel"/>
<property name="com.jaspersoft.studio.unit.columnSpacing" value="pixel"/>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="DeliveryNotePDF" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="36f9d415-527f-4152-b7b0-eea81fe06f73">
<parameter name="deliveryOrderCode" class="java.lang.String">
<parameterDescription><![CDATA[DeliveryOrderCode]]></parameterDescription>
</parameter>
@@ -159,17 +150,7 @@
<pageHeader>
<band height="110">
<staticText>
<reportElement x="0" y="10" width="110" height="18" uuid="7f991bbe-caf4-43c1-b8e1-d85b1f2d3815">
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement textAlignment="Left" verticalAlignment="Middle">
<font fontName="微軟正黑體" size="12"/>
</textElement>
<text><![CDATA[送貨單編號:]]></text>
</staticText>
<staticText>
<reportElement x="0" y="30" width="110" height="18" uuid="7bdf9657-d5d2-4fbf-a6c3-a5da5b292dc8">
<reportElement x="0" y="10" width="110" height="18" uuid="7bdf9657-d5d2-4fbf-a6c3-a5da5b292dc8">
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
@@ -179,7 +160,7 @@
<text><![CDATA[送貨日期:]]></text>
</staticText>
<staticText>
<reportElement x="275" y="10" width="110" height="18" uuid="f53e2068-dd24-4151-bd2a-033c6cbda674">
<reportElement x="0" y="30" width="110" height="18" uuid="f53e2068-dd24-4151-bd2a-033c6cbda674">
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
@@ -193,20 +174,11 @@
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement textAlignment="Left" verticalAlignment="Middle">
<textElement textAlignment="Left" verticalAlignment="Top">
<font fontName="微軟正黑體" size="12"/>
</textElement>
<text><![CDATA[店鋪採購單編號:]]></text>
</staticText>
<textField>
<reportElement x="110" y="10" width="150" height="18" uuid="69d21d74-e625-41e9-b4bb-abde259d6620">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體"/>
</textElement>
<textFieldExpression><![CDATA[$P{deliveryOrderCode}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="110" y="50" width="425" height="54" uuid="24a1331c-e50f-4a72-9a41-3e05b85f4c21">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
@@ -217,7 +189,7 @@
<textFieldExpression><![CDATA[$P{ShopPurchaseOrderNo}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="385" y="10" width="150" height="18" uuid="78f29b7d-c311-4c53-9c66-fda8752c9797">
<reportElement x="110" y="30" width="150" height="18" uuid="78f29b7d-c311-4c53-9c66-fda8752c9797">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
@@ -226,7 +198,7 @@
<textFieldExpression><![CDATA[$P{FGPickOrderNo}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="110" y="30" width="150" height="18" uuid="e67b4047-642b-46f5-8ec7-785ead88b97e">
<reportElement x="110" y="10" width="150" height="18" uuid="e67b4047-642b-46f5-8ec7-785ead88b97e">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
@@ -235,7 +207,7 @@
<textFieldExpression><![CDATA[$P{deliveryDate}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="385" y="30" width="150" height="18" uuid="8062f7b6-8917-432a-a02c-e5a5766c14e5">
<reportElement x="385" y="10" width="150" height="18" uuid="8062f7b6-8917-432a-a02c-e5a5766c14e5">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
@@ -244,7 +216,7 @@
<textFieldExpression><![CDATA[$P{numOfCarton}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="275" y="30" width="110" height="18" uuid="25254ea4-e2b2-4ae0-975b-99c8f9390a64">
<reportElement x="275" y="10" width="110" height="18" uuid="25254ea4-e2b2-4ae0-975b-99c8f9390a64">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
@@ -252,12 +224,30 @@
</textElement>
<textFieldExpression><![CDATA[$P{totalCartonTitle}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="385" y="30" width="150" height="18" uuid="69d21d74-e625-41e9-b4bb-abde259d6620">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體"/>
</textElement>
<textFieldExpression><![CDATA[$P{deliveryOrderCode}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="275" y="30" width="110" height="18" uuid="db59b94d-5a33-4c84-98d9-30b8b86bd018">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體"/>
</textElement>
<textFieldExpression><![CDATA[$P{deliveryOrderCodeTitle}]]></textFieldExpression>
</textField>
</band>
</pageHeader>
<columnHeader>
<band height="33">
<staticText>
<reportElement x="0" y="5" width="50" height="18" uuid="d0d76c93-d260-4b03-b116-6e7ba1fdbdd8">
<reportElement x="0" y="5" width="40" height="18" uuid="d0d76c93-d260-4b03-b116-6e7ba1fdbdd8">
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
@@ -268,7 +258,7 @@
<text><![CDATA[序號]]></text>
</staticText>
<staticText>
<reportElement x="50" y="5" width="110" height="18" uuid="58a5c922-fd98-4997-9b17-16bdf9f78519">
<reportElement x="40" y="5" width="110" height="18" uuid="58a5c922-fd98-4997-9b17-16bdf9f78519">
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
@@ -279,7 +269,7 @@
<text><![CDATA[路綫]]></text>
</staticText>
<staticText>
<reportElement x="160" y="5" width="80" height="18" uuid="65c27cc0-f806-4930-930c-6b3fd632a52f">
<reportElement x="150" y="4" width="80" height="18" uuid="65c27cc0-f806-4930-930c-6b3fd632a52f">
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
@@ -289,7 +279,7 @@
<text><![CDATA[貨品編號]]></text>
</staticText>
<staticText>
<reportElement x="240" y="5" width="230" height="18" uuid="fa7ba1d5-003a-4c99-8a2f-4162756ee515">
<reportElement x="230" y="5" width="240" height="18" uuid="fa7ba1d5-003a-4c99-8a2f-4162756ee515">
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
@@ -325,28 +315,28 @@
<detail>
<band height="42">
<textField>
<reportElement x="0" y="1" width="50" height="18" uuid="ae87b739-dadf-452a-bc35-8c2da1a6a9a8">
<reportElement x="0" y="1" width="40" height="18" uuid="ae87b739-dadf-452a-bc35-8c2da1a6a9a8">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Top">
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體"/>
</textElement>
<textFieldExpression><![CDATA[$F{sequenceNumber}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="50" y="1" width="110" height="18" uuid="b4bcfa6c-5d2e-4fba-815a-cc2fccd39213">
<reportElement x="40" y="1" width="110" height="18" uuid="b4bcfa6c-5d2e-4fba-815a-cc2fccd39213">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Top">
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體"/>
</textElement>
<textFieldExpression><![CDATA[$F{route}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="160" y="1" width="80" height="18" uuid="3e4a71e7-d6e1-4da8-ae58-ef752c289a6d">
<reportElement x="150" y="0" width="80" height="18" uuid="3e4a71e7-d6e1-4da8-ae58-ef752c289a6d">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Top">
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體"/>
</textElement>
<textFieldExpression><![CDATA[$F{itemNo}]]></textFieldExpression>
@@ -355,16 +345,16 @@
<reportElement x="470" y="0" width="84" height="18" uuid="e60b7a29-273a-4a9f-a443-f4977292c429">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Top">
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體"/>
</textElement>
<textFieldExpression><![CDATA[$F{qty} + $F{shortName}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="240" y="1" width="230" height="18" uuid="c2b4da75-fdca-4e99-8103-5769dea75841">
<reportElement x="230" y="1" width="240" height="18" uuid="c2b4da75-fdca-4e99-8103-5769dea75841">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Top">
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體"/>
</textElement>
<textFieldExpression><![CDATA[$F{itemName} + "(" + $F{uom} + ")"]]></textFieldExpression>
@@ -375,10 +365,10 @@
</reportElement>
</line>
<textField>
<reportElement x="240" y="18" width="230" height="18" uuid="af701932-2e78-47d4-a131-b668200dc376">
<reportElement x="230" y="18" width="240" height="18" uuid="af701932-2e78-47d4-a131-b668200dc376">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Top">
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體"/>
</textElement>
<textFieldExpression><![CDATA[$F{lotNo}]]></textFieldExpression>


Loading…
Cancel
Save