| @@ -7,6 +7,7 @@ import com.ffii.fpsms.modules.deliveryOrder.enums.DoPickOrderStatus | |||||
| import com.ffii.fpsms.modules.master.entity.projections.SearchId | import com.ffii.fpsms.modules.master.entity.projections.SearchId | ||||
| import org.springframework.data.jpa.repository.JpaRepository | import org.springframework.data.jpa.repository.JpaRepository | ||||
| import org.springframework.data.jpa.repository.Query | import org.springframework.data.jpa.repository.Query | ||||
| import org.springframework.data.repository.query.Param | |||||
| import org.springframework.stereotype.Repository | import org.springframework.stereotype.Repository | ||||
| import java.io.Serializable | import java.io.Serializable | ||||
| import java.time.LocalDateTime | import java.time.LocalDateTime | ||||
| @@ -29,4 +30,5 @@ fun findByStoreIdAndRequiredDeliveryDateAndTicketStatusIn( | |||||
| requiredDeliveryDate: LocalDate, | requiredDeliveryDate: LocalDate, | ||||
| status: List<DoPickOrderStatus> | status: List<DoPickOrderStatus> | ||||
| ): List<DoPickOrder> | ): List<DoPickOrder> | ||||
| } | } | ||||
| @@ -58,8 +58,10 @@ import org.springframework.core.io.ClassPathResource | |||||
| import java.io.File | import java.io.File | ||||
| import java.io.FileNotFoundException | import java.io.FileNotFoundException | ||||
| import com.ffii.core.support.JdbcDao; | 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.DoPickOrderRecord | ||||
| import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecordRepository | 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.ExportDNLabelsRequest | ||||
| import com.ffii.fpsms.modules.deliveryOrder.web.models.PrintDNLabelsRequest | import com.ffii.fpsms.modules.deliveryOrder.web.models.PrintDNLabelsRequest | ||||
| import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository | import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository | ||||
| @@ -100,6 +102,8 @@ open class DeliveryOrderService( | |||||
| private val inventoryLotRepository: InventoryLotRepository, | private val inventoryLotRepository: InventoryLotRepository, | ||||
| private val jdbcDao: JdbcDao, | private val jdbcDao: JdbcDao, | ||||
| private val pickExecutionIssueRepository: PickExecutionIssueRepository, | private val pickExecutionIssueRepository: PickExecutionIssueRepository, | ||||
| private val doPickOrderRepository: DoPickOrderRepository, | |||||
| private val doPickOrderLineRepository: DoPickOrderLineRepository, | |||||
| ) { | ) { | ||||
| open fun findByM18DataLogId(m18DataLogId: Long): DeliveryOrder? { | open fun findByM18DataLogId(m18DataLogId: Long): DeliveryOrder? { | ||||
| @@ -673,63 +677,104 @@ open class DeliveryOrderService( | |||||
| if (!resource.exists()) { | if (!resource.exists()) { | ||||
| throw FileNotFoundException("Report file not fount: $DELIVERYNOTE_PDF") | 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) { | if (request.isDraft) { | ||||
| params["dnTitle"] = "送貨單(初稿)" | params["dnTitle"] = "送貨單(初稿)" | ||||
| params["colQty"] = "所需數量" | params["colQty"] = "所需數量" | ||||
| params["totalCartonTitle"] = "" | params["totalCartonTitle"] = "" | ||||
| params["deliveryOrderCodeTitle"] = "" | |||||
| params["deliveryOrderCode"] = "" | |||||
| } else { | } else { | ||||
| params["dnTitle"] = "送貨單" | params["dnTitle"] = "送貨單" | ||||
| params["colQty"] = "數量" | |||||
| params["colQty"] = "已提數量" | |||||
| params["totalCartonTitle"] = "總箱數:" | params["totalCartonTitle"] = "總箱數:" | ||||
| params["deliveryOrderCodeTitle"] = "送貨單編號:" | |||||
| params["deliveryOrderCode"] = "GEN FROM CODE GENERATOR (NEED FIND TIMING)" | |||||
| } | } | ||||
| params["numOfCarton"] = request.numOfCarton.toString() | params["numOfCarton"] = request.numOfCarton.toString() | ||||
| @@ -737,23 +782,20 @@ open class DeliveryOrderService( | |||||
| params["numOfCarton"] = "" | 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["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( | return mapOf( | ||||
| "report" to PdfUtils.fillReport(deliveryNote, fields, params), | "report" to PdfUtils.fillReport(deliveryNote, fields, params), | ||||
| "filename" to deliveryNoteInfo[0].code | |||||
| "filename" to deliveryNoteInfo.joinToString("_") { it.code } | |||||
| ) | ) | ||||
| } | } | ||||
| //Print Delivery Note | //Print Delivery Note | ||||
| @Transactional | @Transactional | ||||
| open fun printDeliveryNote(request: PrintDeliveryNoteRequest) { | open fun printDeliveryNote(request: PrintDeliveryNoteRequest) { | ||||
| @@ -761,10 +803,9 @@ open class DeliveryOrderService( | |||||
| val pdf = exportDeliveryNote( | val pdf = exportDeliveryNote( | ||||
| ExportDeliveryNoteRequest( | ExportDeliveryNoteRequest( | ||||
| deliveryOrderIds = request.deliveryOrderId, | |||||
| doPickOrderId = request.doPickOrderId, | |||||
| numOfCarton = request.numOfCarton, | numOfCarton = request.numOfCarton, | ||||
| isDraft = request.isDraft, | |||||
| pickOrderIds = request.pickOrderId | |||||
| isDraft = request.isDraft | |||||
| ) | ) | ||||
| ) | ) | ||||
| @@ -792,20 +833,30 @@ open class DeliveryOrderService( | |||||
| if (!resource.exists()) { | if (!resource.exists()) { | ||||
| throw FileNotFoundException("Label file not found: $DNLABELS_PDF") | 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 inputStream = resource.inputStream | ||||
| val cartonLabel = JasperCompileManager.compileReport(inputStream) | val cartonLabel = JasperCompileManager.compileReport(inputStream) | ||||
| val cartonLabelInfo = | val cartonLabelInfo = | ||||
| deliveryOrderRepository.findDeliveryOrderInfoById(request.deliveryOrderIds).toMutableList() | |||||
| deliveryOrderRepository.findDeliveryOrderInfoById(request.doPickOrderId).toMutableList() | |||||
| val params = mutableMapOf<String, Any>() | val params = mutableMapOf<String, Any>() | ||||
| val fields = mutableListOf<MutableMap<String, Any>>() | val fields = mutableListOf<MutableMap<String, Any>>() | ||||
| for (info in cartonLabelInfo) { | for (info in cartonLabelInfo) { | ||||
| val field = mutableMapOf<String, Any>() | 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["shopAddress"] = cartonLabelInfo[0].shopAddress ?: "" | ||||
| params["shopName"] = cartonLabelInfo[0].shopName ?: "" | |||||
| params["shopName"] = doPickOrder.shopName ?: cartonLabelInfo[0].shopName ?: "" | |||||
| for (cartonNumber in 1..request.numOfCarton) { | for (cartonNumber in 1..request.numOfCarton) { | ||||
| val field = mutableMapOf<String, Any>() | val field = mutableMapOf<String, Any>() | ||||
| @@ -828,7 +879,7 @@ open class DeliveryOrderService( | |||||
| val pdf = exportDNLabels( | val pdf = exportDNLabels( | ||||
| ExportDNLabelsRequest( | ExportDNLabelsRequest( | ||||
| deliveryOrderIds = request.deliveryOrderId, | |||||
| doPickOrderId = request.doPickOrderId, | |||||
| numOfCarton = request.numOfCarton | numOfCarton = request.numOfCarton | ||||
| ) | ) | ||||
| ) | ) | ||||
| @@ -64,7 +64,7 @@ open class DoPickOrderService( | |||||
| ) | ) | ||||
| } | } | ||||
| fun getNextTicketNumber(datePrefix: String, storeId: String): String { | |||||
| open fun getNextTicketNumber(datePrefix: String, storeId: String): String { | |||||
| println("🔍 DEBUG: Getting next ticket number for date prefix: $datePrefix, store: $storeId") | println("🔍 DEBUG: Getting next ticket number for date prefix: $datePrefix, store: $storeId") | ||||
| try { | try { | ||||
| val sanitizedStoreId = storeId.replace("/", "") | 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) | return doPickOrderRepository.save(record) | ||||
| } | } | ||||
| fun findByStoreIdOrderByTruckDepartureTime(storeId: String): List<DoPickOrder> { | |||||
| open fun findByStoreIdOrderByTruckDepartureTime(storeId: String): List<DoPickOrder> { | |||||
| return doPickOrderRepository.findByStoreIdAndTicketStatusOrderByTruckDepartureTimeAsc( | return doPickOrderRepository.findByStoreIdAndTicketStatusOrderByTruckDepartureTimeAsc( | ||||
| storeId, DoPickOrderStatus.pending | storeId, DoPickOrderStatus.pending | ||||
| ) | ) | ||||
| } | } | ||||
| // Add these missing methods | // Add these missing methods | ||||
| fun assignByStore(request: AssignByStoreRequest): MessageResponse { | |||||
| open fun assignByStore(request: AssignByStoreRequest): MessageResponse { | |||||
| // TODO: Implement store-based assignment logic | // TODO: Implement store-based assignment logic | ||||
| return MessageResponse( | return MessageResponse( | ||||
| id = null, | 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 | // TODO: Implement store-based release logic | ||||
| return MessageResponse( | return MessageResponse( | ||||
| id = null, | id = null, | ||||
| @@ -130,7 +130,7 @@ open class DoPickOrderService( | |||||
| } | } | ||||
| // ✅ Updated method to set ticketReleaseTime when assigning order to user | // ✅ 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 doPickOrders = doPickOrderRepository.findByPickOrderId(pickOrderId) | ||||
| val user = userRepository.findById(userId).orElse(null) // ✅ 改用 orElse(null) | val user = userRepository.findById(userId).orElse(null) // ✅ 改用 orElse(null) | ||||
| val handlerName = user?.name ?: "Unknown" | val handlerName = user?.name ?: "Unknown" | ||||
| @@ -143,7 +143,7 @@ open class DoPickOrderService( | |||||
| return doPickOrderRepository.saveAll(doPickOrders) | return doPickOrderRepository.saveAll(doPickOrders) | ||||
| } | } | ||||
| fun completeDoPickOrdersForPickOrder(pickOrderId: Long): List<DoPickOrder> { | |||||
| open fun completeDoPickOrdersForPickOrder(pickOrderId: Long): List<DoPickOrder> { | |||||
| val doPickOrders = doPickOrderRepository.findByPickOrderId(pickOrderId) | val doPickOrders = doPickOrderRepository.findByPickOrderId(pickOrderId) | ||||
| doPickOrders.forEach { | doPickOrders.forEach { | ||||
| it.ticketStatus = DoPickOrderStatus.completed | it.ticketStatus = DoPickOrderStatus.completed | ||||
| @@ -169,7 +169,7 @@ open class DoPickOrderService( | |||||
| // ✅ New method to remove do_pick_order records when auto-assigning by store | // ✅ New method to remove do_pick_order records when auto-assigning by store | ||||
| // ✅ 修改方法:先复制记录到record表,再删除原记录 | // ✅ 修改方法:先复制记录到record表,再删除原记录 | ||||
| @Transactional | @Transactional | ||||
| fun removeDoPickOrdersForPickOrder(pickOrderId: Long): Int { | |||||
| open fun removeDoPickOrdersForPickOrder(pickOrderId: Long): Int { | |||||
| val doPickOrders = doPickOrderRepository.findByPickOrderId(pickOrderId) | val doPickOrders = doPickOrderRepository.findByPickOrderId(pickOrderId) | ||||
| var deletedCount = 0 | var deletedCount = 0 | ||||
| @@ -229,12 +229,12 @@ open class DoPickOrderService( | |||||
| return deletedCount | return deletedCount | ||||
| } | } | ||||
| fun saveRecord(record: DoPickOrderRecord): DoPickOrderRecord { | |||||
| open fun saveRecord(record: DoPickOrderRecord): DoPickOrderRecord { | |||||
| return doPickOrderRecordRepository.save(record) | return doPickOrderRecordRepository.save(record) | ||||
| } | } | ||||
| // ✅ Add method to update DoPickOrderRecord status | // ✅ 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 doPickOrderRecords = doPickOrderRecordRepository.findByPickOrderId(pickOrderId) | ||||
| val user = userRepository.findById(userId).orElse(null) // ✅ 改用 orElse(null) | val user = userRepository.findById(userId).orElse(null) // ✅ 改用 orElse(null) | ||||
| val handlerName = user?.name ?: "Unknown" | val handlerName = user?.name ?: "Unknown" | ||||
| @@ -248,7 +248,7 @@ open class DoPickOrderService( | |||||
| } | } | ||||
| // ✅ Add method to complete DoPickOrderRecord | // ✅ Add method to complete DoPickOrderRecord | ||||
| fun completeDoPickOrderRecordsForPickOrder(pickOrderId: Long): List<DoPickOrderRecord> { | |||||
| open fun completeDoPickOrderRecordsForPickOrder(pickOrderId: Long): List<DoPickOrderRecord> { | |||||
| val doPickOrderRecords = doPickOrderRecordRepository.findByPickOrderId(pickOrderId) | val doPickOrderRecords = doPickOrderRecordRepository.findByPickOrderId(pickOrderId) | ||||
| doPickOrderRecords.forEach { | doPickOrderRecords.forEach { | ||||
| it.ticketStatus = DoPickOrderStatus.completed | it.ticketStatus = DoPickOrderStatus.completed | ||||
| @@ -258,18 +258,18 @@ open class DoPickOrderService( | |||||
| } | } | ||||
| // Add method to find do_pick_order records by pick order ID | // 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) | 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) | val doPickOrders = doPickOrderRepository.findByPickOrderId(pickOrderId) | ||||
| doPickOrders.forEach { | doPickOrders.forEach { | ||||
| it.doOrderId = doOrderId | it.doOrderId = doOrderId | ||||
| } | } | ||||
| return doPickOrderRepository.saveAll(doPickOrders) | return doPickOrderRepository.saveAll(doPickOrders) | ||||
| } | } | ||||
| fun getSummaryByStore(storeId: String, requiredDate: LocalDate?): StoreLaneSummary { | |||||
| open fun getSummaryByStore(storeId: String, requiredDate: LocalDate?): StoreLaneSummary { | |||||
| val targetDate = requiredDate ?: LocalDate.now() | val targetDate = requiredDate ?: LocalDate.now() | ||||
| println("🔍 DEBUG: Getting summary for store=$storeId, date=$targetDate") | println("🔍 DEBUG: Getting summary for store=$storeId, date=$targetDate") | ||||
| @@ -372,7 +372,7 @@ open class DoPickOrderService( | |||||
| } | } | ||||
| } | } | ||||
| // ✅ 修复:把 assignByLane 移到类里面 | // ✅ 修复:把 assignByLane 移到类里面 | ||||
| fun assignByLane(request: AssignByLaneRequest): MessageResponse { | |||||
| open fun assignByLane(request: AssignByLaneRequest): MessageResponse { | |||||
| val user = userRepository.findById(request.userId).orElse(null) | val user = userRepository.findById(request.userId).orElse(null) | ||||
| ?: return MessageResponse( | ?: return MessageResponse( | ||||
| id = null, code = "USER_NOT_FOUND", name = null, type = null, | id = null, code = "USER_NOT_FOUND", name = null, type = null, | ||||
| @@ -41,6 +41,7 @@ class DoReleaseCoordinatorService( | |||||
| private val poolSize = Runtime.getRuntime().availableProcessors() | private val poolSize = Runtime.getRuntime().availableProcessors() | ||||
| private val executor = Executors.newFixedThreadPool(min(poolSize, 4)) | private val executor = Executors.newFixedThreadPool(min(poolSize, 4)) | ||||
| private val jobs = ConcurrentHashMap<String, BatchReleaseJobStatus>() | private val jobs = ConcurrentHashMap<String, BatchReleaseJobStatus>() | ||||
| private fun updateBatchTicketNumbers() { | private fun updateBatchTicketNumbers() { | ||||
| try { | try { | ||||
| val updateSql = """ | val updateSql = """ | ||||
| @@ -188,6 +189,7 @@ class DoReleaseCoordinatorService( | |||||
| e.printStackTrace() | e.printStackTrace() | ||||
| } | } | ||||
| } | } | ||||
| private fun getOrderedDeliveryOrderIds(ids: List<Long>): List<Long> { | private fun getOrderedDeliveryOrderIds(ids: List<Long>): List<Long> { | ||||
| try { | try { | ||||
| println("🔍 DEBUG: Getting ordered IDs for ${ids.size} orders") | println("🔍 DEBUG: Getting ordered IDs for ${ids.size} orders") | ||||
| @@ -492,7 +494,7 @@ class DoReleaseCoordinatorService( | |||||
| "4F" -> "4/F" | "4F" -> "4/F" | ||||
| else -> "2/F" | else -> "2/F" | ||||
| } | } | ||||
| val doPickOrder = DoPickOrder( | val doPickOrder = DoPickOrder( | ||||
| storeId = storeId, | storeId = storeId, | ||||
| ticketNo = "TEMP-${System.currentTimeMillis()}", | ticketNo = "TEMP-${System.currentTimeMillis()}", | ||||
| @@ -1,6 +1,6 @@ | |||||
| package com.ffii.fpsms.modules.deliveryOrder.web.models | package com.ffii.fpsms.modules.deliveryOrder.web.models | ||||
| data class ExportDNLabelsRequest ( | data class ExportDNLabelsRequest ( | ||||
| val deliveryOrderIds: Long, | |||||
| val doPickOrderId: Long, | |||||
| val numOfCarton: Int, | val numOfCarton: Int, | ||||
| ) | ) | ||||
| @@ -2,8 +2,7 @@ package com.ffii.fpsms.modules.deliveryOrder.web.models | |||||
| import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository | import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository | ||||
| data class ExportDeliveryNoteRequest ( | data class ExportDeliveryNoteRequest ( | ||||
| val deliveryOrderIds: Long, | |||||
| val doPickOrderId: Long, | |||||
| val numOfCarton: Int, | val numOfCarton: Int, | ||||
| val isDraft: Boolean, | val isDraft: Boolean, | ||||
| val pickOrderIds: Long, | |||||
| ) | ) | ||||
| @@ -1,8 +1,8 @@ | |||||
| package com.ffii.fpsms.modules.deliveryOrder.web.models | package com.ffii.fpsms.modules.deliveryOrder.web.models | ||||
| data class PrintDNLabelsRequest ( | data class PrintDNLabelsRequest ( | ||||
| val deliveryOrderId: Long, | |||||
| val doPickOrderId: Long, | |||||
| val printerId: Long, | val printerId: Long, | ||||
| val printQty: Int?, | val printQty: Int?, | ||||
| val numOfCarton: Int, | |||||
| val numOfCarton: Int | |||||
| ) | ) | ||||
| @@ -1,10 +1,9 @@ | |||||
| package com.ffii.fpsms.modules.deliveryOrder.web.models | package com.ffii.fpsms.modules.deliveryOrder.web.models | ||||
| data class PrintDeliveryNoteRequest( | data class PrintDeliveryNoteRequest( | ||||
| val deliveryOrderId: Long, | |||||
| val doPickOrderId: Long, | |||||
| val printerId: Long, | val printerId: Long, | ||||
| val printQty: Int?, | val printQty: Int?, | ||||
| val numOfCarton: Int, | val numOfCarton: Int, | ||||
| val isDraft: Boolean, | val isDraft: Boolean, | ||||
| val pickOrderId: Long, | |||||
| ) | ) | ||||
| @@ -713,6 +713,8 @@ open fun createBatchReleaseIssue( | |||||
| FROM fpsmsdb.delivery_order_line dol | FROM fpsmsdb.delivery_order_line dol | ||||
| INNER JOIN fpsmsdb.items i ON i.id = dol.itemId | INNER JOIN fpsmsdb.items i ON i.id = dol.itemId | ||||
| WHERE dol.deliveryOrderId = :deliveryOrderId | WHERE dol.deliveryOrderId = :deliveryOrderId | ||||
| INNER JOIN fpsmsdb.items i ON i.id = dol.itemId | |||||
| WHERE dol.doId = :deliveryOrderId | |||||
| AND dol.deleted = 0 | AND dol.deleted = 0 | ||||
| """.trimIndent() | """.trimIndent() | ||||
| @@ -736,11 +738,11 @@ open fun createBatchReleaseIssue( | |||||
| val issue = PickExecutionIssue( | val issue = PickExecutionIssue( | ||||
| id = null, | id = null, | ||||
| pickOrderId = null, // batch release 失败时可能还没有 pick order | |||||
| pickOrderId = 0L, // batch release 失败时可能还没有 pick order | |||||
| pickOrderCode = deliveryOrder["code"] as? String ?: "", | pickOrderCode = deliveryOrder["code"] as? String ?: "", | ||||
| pickOrderCreateDate = LocalDate.now(), | pickOrderCreateDate = LocalDate.now(), | ||||
| pickExecutionDate = LocalDate.now(), | pickExecutionDate = LocalDate.now(), | ||||
| pickOrderLineId = null, // batch release 失败时可能还没有 pick order line | |||||
| pickOrderLineId = 0L, // batch release 失败时可能还没有 pick order line | |||||
| issueNo = issueNo, | issueNo = issueNo, | ||||
| joPickOrderId = null, | joPickOrderId = null, | ||||
| doPickOrderId = null, | doPickOrderId = null, | ||||
| @@ -1,15 +1,6 @@ | |||||
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||
| <!-- Created with Jaspersoft Studio version 6.17.0.final using JasperReports Library version 6.17.0-6d93193241dd8cc42629e188b94f9e0bc5722efd --> | <!-- 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"> | <parameter name="deliveryOrderCode" class="java.lang.String"> | ||||
| <parameterDescription><![CDATA[DeliveryOrderCode]]></parameterDescription> | <parameterDescription><![CDATA[DeliveryOrderCode]]></parameterDescription> | ||||
| </parameter> | </parameter> | ||||
| @@ -159,17 +150,7 @@ | |||||
| <pageHeader> | <pageHeader> | ||||
| <band height="110"> | <band height="110"> | ||||
| <staticText> | <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.y" value="px"/> | ||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| @@ -179,7 +160,7 @@ | |||||
| <text><![CDATA[送貨日期:]]></text> | <text><![CDATA[送貨日期:]]></text> | ||||
| </staticText> | </staticText> | ||||
| <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.y" value="px"/> | ||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| @@ -193,20 +174,11 @@ | |||||
| <property name="com.jaspersoft.studio.unit.y" value="px"/> | <property name="com.jaspersoft.studio.unit.y" value="px"/> | ||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| <textElement textAlignment="Left" verticalAlignment="Middle"> | |||||
| <textElement textAlignment="Left" verticalAlignment="Top"> | |||||
| <font fontName="微軟正黑體" size="12"/> | <font fontName="微軟正黑體" size="12"/> | ||||
| </textElement> | </textElement> | ||||
| <text><![CDATA[店鋪採購單編號:]]></text> | <text><![CDATA[店鋪採購單編號:]]></text> | ||||
| </staticText> | </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> | <textField> | ||||
| <reportElement x="110" y="50" width="425" height="54" uuid="24a1331c-e50f-4a72-9a41-3e05b85f4c21"> | <reportElement x="110" y="50" width="425" height="54" uuid="24a1331c-e50f-4a72-9a41-3e05b85f4c21"> | ||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| @@ -217,7 +189,7 @@ | |||||
| <textFieldExpression><![CDATA[$P{ShopPurchaseOrderNo}]]></textFieldExpression> | <textFieldExpression><![CDATA[$P{ShopPurchaseOrderNo}]]></textFieldExpression> | ||||
| </textField> | </textField> | ||||
| <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"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| <textElement verticalAlignment="Middle"> | <textElement verticalAlignment="Middle"> | ||||
| @@ -226,7 +198,7 @@ | |||||
| <textFieldExpression><![CDATA[$P{FGPickOrderNo}]]></textFieldExpression> | <textFieldExpression><![CDATA[$P{FGPickOrderNo}]]></textFieldExpression> | ||||
| </textField> | </textField> | ||||
| <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"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| <textElement verticalAlignment="Middle"> | <textElement verticalAlignment="Middle"> | ||||
| @@ -235,7 +207,7 @@ | |||||
| <textFieldExpression><![CDATA[$P{deliveryDate}]]></textFieldExpression> | <textFieldExpression><![CDATA[$P{deliveryDate}]]></textFieldExpression> | ||||
| </textField> | </textField> | ||||
| <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"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| <textElement verticalAlignment="Middle"> | <textElement verticalAlignment="Middle"> | ||||
| @@ -244,7 +216,7 @@ | |||||
| <textFieldExpression><![CDATA[$P{numOfCarton}]]></textFieldExpression> | <textFieldExpression><![CDATA[$P{numOfCarton}]]></textFieldExpression> | ||||
| </textField> | </textField> | ||||
| <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"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| <textElement verticalAlignment="Middle"> | <textElement verticalAlignment="Middle"> | ||||
| @@ -252,12 +224,30 @@ | |||||
| </textElement> | </textElement> | ||||
| <textFieldExpression><![CDATA[$P{totalCartonTitle}]]></textFieldExpression> | <textFieldExpression><![CDATA[$P{totalCartonTitle}]]></textFieldExpression> | ||||
| </textField> | </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> | </band> | ||||
| </pageHeader> | </pageHeader> | ||||
| <columnHeader> | <columnHeader> | ||||
| <band height="33"> | <band height="33"> | ||||
| <staticText> | <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.y" value="px"/> | ||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | <property name="com.jaspersoft.studio.unit.width" value="px"/> | ||||
| @@ -268,7 +258,7 @@ | |||||
| <text><![CDATA[序號]]></text> | <text><![CDATA[序號]]></text> | ||||
| </staticText> | </staticText> | ||||
| <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.y" value="px"/> | ||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| <property name="com.jaspersoft.studio.unit.width" value="px"/> | <property name="com.jaspersoft.studio.unit.width" value="px"/> | ||||
| @@ -279,7 +269,7 @@ | |||||
| <text><![CDATA[路綫]]></text> | <text><![CDATA[路綫]]></text> | ||||
| </staticText> | </staticText> | ||||
| <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.y" value="px"/> | ||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| @@ -289,7 +279,7 @@ | |||||
| <text><![CDATA[貨品編號]]></text> | <text><![CDATA[貨品編號]]></text> | ||||
| </staticText> | </staticText> | ||||
| <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.y" value="px"/> | ||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| @@ -325,28 +315,28 @@ | |||||
| <detail> | <detail> | ||||
| <band height="42"> | <band height="42"> | ||||
| <textField> | <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"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| <textElement verticalAlignment="Top"> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體"/> | <font fontName="微軟正黑體"/> | ||||
| </textElement> | </textElement> | ||||
| <textFieldExpression><![CDATA[$F{sequenceNumber}]]></textFieldExpression> | <textFieldExpression><![CDATA[$F{sequenceNumber}]]></textFieldExpression> | ||||
| </textField> | </textField> | ||||
| <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"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| <textElement verticalAlignment="Top"> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體"/> | <font fontName="微軟正黑體"/> | ||||
| </textElement> | </textElement> | ||||
| <textFieldExpression><![CDATA[$F{route}]]></textFieldExpression> | <textFieldExpression><![CDATA[$F{route}]]></textFieldExpression> | ||||
| </textField> | </textField> | ||||
| <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"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| <textElement verticalAlignment="Top"> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體"/> | <font fontName="微軟正黑體"/> | ||||
| </textElement> | </textElement> | ||||
| <textFieldExpression><![CDATA[$F{itemNo}]]></textFieldExpression> | <textFieldExpression><![CDATA[$F{itemNo}]]></textFieldExpression> | ||||
| @@ -355,16 +345,16 @@ | |||||
| <reportElement x="470" y="0" width="84" height="18" uuid="e60b7a29-273a-4a9f-a443-f4977292c429"> | <reportElement x="470" y="0" width="84" height="18" uuid="e60b7a29-273a-4a9f-a443-f4977292c429"> | ||||
| <property name="com.jaspersoft.studio.unit.height" value="px"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| <textElement verticalAlignment="Top"> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體"/> | <font fontName="微軟正黑體"/> | ||||
| </textElement> | </textElement> | ||||
| <textFieldExpression><![CDATA[$F{qty} + $F{shortName}]]></textFieldExpression> | <textFieldExpression><![CDATA[$F{qty} + $F{shortName}]]></textFieldExpression> | ||||
| </textField> | </textField> | ||||
| <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"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| <textElement verticalAlignment="Top"> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體"/> | <font fontName="微軟正黑體"/> | ||||
| </textElement> | </textElement> | ||||
| <textFieldExpression><![CDATA[$F{itemName} + "(" + $F{uom} + ")"]]></textFieldExpression> | <textFieldExpression><![CDATA[$F{itemName} + "(" + $F{uom} + ")"]]></textFieldExpression> | ||||
| @@ -375,10 +365,10 @@ | |||||
| </reportElement> | </reportElement> | ||||
| </line> | </line> | ||||
| <textField> | <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"/> | <property name="com.jaspersoft.studio.unit.height" value="px"/> | ||||
| </reportElement> | </reportElement> | ||||
| <textElement verticalAlignment="Top"> | |||||
| <textElement verticalAlignment="Middle"> | |||||
| <font fontName="微軟正黑體"/> | <font fontName="微軟正黑體"/> | ||||
| </textElement> | </textElement> | ||||
| <textFieldExpression><![CDATA[$F{lotNo}]]></textFieldExpression> | <textFieldExpression><![CDATA[$F{lotNo}]]></textFieldExpression> | ||||