Browse Source

update

master
kelvin.yau 2 months ago
parent
commit
d3510504ff
18 changed files with 457 additions and 56 deletions
  1. +1
    -0
      build.gradle
  2. +1
    -0
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/DoPickOrderRepository.kt
  3. +2
    -0
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/entity/models/DeliveryOrderLineInfo.kt
  4. +190
    -18
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt
  5. +5
    -0
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoPickOrderService.kt
  6. +19
    -0
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DeliveryOrderController.kt
  7. +6
    -0
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDNLabelsRequest.kt
  8. +5
    -1
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDeliveryNoteRequest.kt
  9. +8
    -0
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDNLabelsRequest.kt
  10. +3
    -0
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDeliveryNoteRequest.kt
  11. +3
    -0
      src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderRepository.kt
  12. +1
    -0
      src/main/java/com/ffii/fpsms/modules/pickOrder/entity/RouterRepository.kt
  13. +1
    -1
      src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotLineRepository.kt
  14. +3
    -0
      src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotRepository.kt
  15. +4
    -0
      src/main/java/com/ffii/fpsms/modules/stock/service/InventoryLotService.kt
  16. +1
    -0
      src/main/java/com/ffii/fpsms/modules/stock/service/SuggestedPickLotService.kt
  17. +150
    -0
      src/main/resources/DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml
  18. +54
    -36
      src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml

+ 1
- 0
build.gradle View File

@@ -46,6 +46,7 @@ dependencies {
exclude group: "com.fasterxml.jackson.dataformat", module: "jackson-dataformat-xml" exclude group: "com.fasterxml.jackson.dataformat", module: "jackson-dataformat-xml"
} }
implementation group: 'net.sf.jasperreports', name: 'jasperreports-fonts', version: '6.21.0' implementation group: 'net.sf.jasperreports', name: 'jasperreports-fonts', version: '6.21.0'
implementation group: 'org.mozilla', name: 'rhino', version: '1.7.14'


implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0' implementation group: 'org.apache.commons', name: 'commons-lang3', version: '3.12.0'
implementation group: 'org.apache.poi', name: 'poi', version: '5.2.3' implementation group: 'org.apache.poi', name: 'poi', version: '5.2.3'


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

@@ -19,4 +19,5 @@ interface DoPickOrderRepository : JpaRepository<DoPickOrder, Long> {
status: DoPickOrderStatus status: DoPickOrderStatus
): List<DoPickOrder> ): List<DoPickOrder>
fun findByPickOrderId(pickOrderId: Long): List<DoPickOrder> fun findByPickOrderId(pickOrderId: Long): List<DoPickOrder>

} }

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

@@ -15,4 +15,6 @@ interface DeliveryOrderLineInfo {
val price: BigDecimal? val price: BigDecimal?
val status: String? val status: String?


@get:Value("#{target.item?.id}")
val itemId: Long?
} }

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

@@ -59,6 +59,16 @@ import java.io.FileNotFoundException


import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecord import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecord
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecordRepository import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderRecordRepository
import com.ffii.fpsms.modules.deliveryOrder.web.models.ExportDNLabelsRequest
import com.ffii.fpsms.modules.deliveryOrder.web.models.PrintDNLabelsRequest
import com.ffii.fpsms.modules.pickOrder.entity.RouterRepository
import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository
import com.ffii.fpsms.modules.stock.entity.InventoryLotRepository
import com.ffii.fpsms.modules.stock.service.InventoryLotService
import com.ffii.fpsms.modules.pickOrder.entity.Router
import net.sf.jasperreports.engine.JasperPrintManager
import net.sf.jasperreports.engine.JRPrintPage
import com.ffii.fpsms.modules.stock.entity.SuggestPickLotRepository


@Service @Service
open class DeliveryOrderService( open class DeliveryOrderService(
@@ -79,7 +89,12 @@ open class DeliveryOrderService(
private val stockOutLineRepository: StockOutLIneRepository, private val stockOutLineRepository: StockOutLIneRepository,
private val pickOrderLineRepository: PickOrderLineRepository, private val pickOrderLineRepository: PickOrderLineRepository,
private val printerService: PrinterService, private val printerService: PrinterService,
private val doPickOrderRecordRepository: DoPickOrderRecordRepository
private val doPickOrderRecordRepository: DoPickOrderRecordRepository,
private val routerRepository: RouterRepository,
private val purchaseOrderRepository: PurchaseOrderRepository,
private val inventoryLotService: InventoryLotService,
private val suggestedPickLotRepository: SuggestPickLotRepository,
private val inventoryLotRepository: InventoryLotRepository,
) { ) {


open fun findByM18DataLogId(m18DataLogId: Long): DeliveryOrder? { open fun findByM18DataLogId(m18DataLogId: Long): DeliveryOrder? {
@@ -535,16 +550,58 @@ open class DeliveryOrderService(
) )
} }


private fun buildShopAddress(shop: com.ffii.fpsms.modules.master.entity.Shop?): String {
if (shop == null) return ""
open fun getRouteAndIndexByInventoryLotId(inventoryLotId: Int): List<Router> {
return routerRepository.findByInventoryLotIdAndDeletedFalse(inventoryLotId)
.sortedBy { it.index }
}

open fun getRoutesByInventoryLotId(inventoryLotId: Int): List<String> {
return getRouteAndIndexByInventoryLotId(inventoryLotId)
.mapNotNull { it.route }
}


val addressParts = mutableListOf<String>()
open fun getRouteByItemId(itemId: Long): String? {
val inventoryLots = inventoryLotService.findByItemId(itemId)
if (inventoryLots.isNotEmpty()){
val inventoryLotId = inventoryLots.first().id?.toInt()
return inventoryLotId?.let { lotId ->
getRoutesByInventoryLotId(lotId).firstOrNull()
}
}
return null
}


shop.addr3?.let { if (it.isNotBlank()) addressParts.add(it) }
open fun getRouterIndexByItemId(itemId: Long): Int? {
val inventoryLots = inventoryLotService.findByItemId(itemId)
if( inventoryLots.isNotEmpty()){
val inventoryLotId = inventoryLots.first().id?.toInt()
return inventoryLotId?.let { lotId ->
getRouteAndIndexByInventoryLotId(lotId).firstOrNull()?.index
}
}
return null
}


return addressParts.joinToString(", ")
open fun getLotNumbersForPickOrderByItemId(itemId: Long, pickOrderId: Long): String {
try {
val pickOrderLines = pickOrderLineRepository.findAllByPickOrderId(pickOrderId)
val pickOrderLineIds = pickOrderLines.mapNotNull { it.id }
val suggestedPickLots = suggestedPickLotRepository.findAllByPickOrderLineIdIn(pickOrderLineIds)

val lotNumbers = suggestedPickLots
.filter { it.pickOrderLine?.item?.id == itemId }
.mapNotNull { it.suggestedLotLine?.inventoryLot?.lotNo }
.distinct()

return lotNumbers.joinToString(", ")
} catch (e: Exception) {
println("Error getting lot numbers for item $itemId in pick order $pickOrderId: ${e.message}")
return ""
}
} }



//Delivery Note
@Throws(IOException::class) @Throws(IOException::class)
@Transactional @Transactional
open fun exportDeliveryNote(request: ExportDeliveryNoteRequest): Map<String, Any> { open fun exportDeliveryNote(request: ExportDeliveryNoteRequest): Map<String, Any> {
@@ -556,12 +613,30 @@ open class DeliveryOrderService(
val inputStream = resource.inputStream val inputStream = resource.inputStream
val deliveryNote = JasperCompileManager.compileReport(inputStream) val deliveryNote = JasperCompileManager.compileReport(inputStream)
val deliveryNoteInfo = deliveryOrderRepository.findDeliveryOrderInfoById(request.deliveryOrderIds).toMutableList() val deliveryNoteInfo = deliveryOrderRepository.findDeliveryOrderInfoById(request.deliveryOrderIds).toMutableList()

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


val deliveryOrderEntity = deliveryOrderRepository.findByIdAndDeletedIsFalse(request.deliveryOrderIds)
val selectedTruckNo = deliveryOrderEntity?.shop?.id?.let { shopId ->
val trucks = truckRepository.findByShopIdAndDeletedFalse(shopId)
trucks.firstOrNull()?.truckNo
} ?: ""

val selectedPickOrder = pickOrderRepository.findById(request.pickOrderIds).orElse(null)


for (info in deliveryNoteInfo) { for (info in deliveryNoteInfo) {
info.deliveryOrderLines.forEachIndexed { index, line ->
val sortedLines = info.deliveryOrderLines.sortedBy { line ->
line.itemId?.let { itemId ->
getRouterIndexByItemId(itemId)
} ?: Int.MAX_VALUE
}

sortedLines.forEachIndexed { index, line ->

val field = mutableMapOf<String, Any>() val field = mutableMapOf<String, Any>()

field["sequenceNumber"] = (index + 1).toString() field["sequenceNumber"] = (index + 1).toString()
field["itemNo"] = line.itemNo field["itemNo"] = line.itemNo
field["itemName"] = line.itemName ?:"" field["itemName"] = line.itemName ?:""
@@ -569,20 +644,44 @@ open class DeliveryOrderService(
field["qty"] = line.qty.toString() field["qty"] = line.qty.toString()
field["shortName"] = line.uomShortDesc ?:"" field["shortName"] = line.uomShortDesc ?:""


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

val lotNo = line.itemId?.let { itemId ->
getLotNumbersForPickOrderByItemId(itemId, request.pickOrderIds)
} ?: ""
field["lotNo"] = lotNo


fields.add(field) fields.add(field)
} }
} }


if(request.isDraft){
params["dnTitle"] = "送貨單(初稿)"
params["colQty"] = "所需數量"
params["totalCartonTitle"] = ""
}
else{
params["dnTitle"] = "送貨單"
params["colQty"] = "數量"
params["totalCartonTitle"] = "總箱數:"
}

params["numOfCarton"] = request.numOfCarton.toString()
if(params["numOfCarton"] == "0"){
params["numOfCarton"] = ""
}

params["deliveryOrderCode"] = deliveryNoteInfo[0].code params["deliveryOrderCode"] = deliveryNoteInfo[0].code
params["shopName"] = deliveryNoteInfo[0].shopName ?: "" params["shopName"] = deliveryNoteInfo[0].shopName ?: ""
params["shopAddress"] = deliveryNoteInfo[0].shopAddress ?: "" params["shopAddress"] = deliveryNoteInfo[0].shopAddress ?: ""
params["deliveryDate"] = deliveryNoteInfo[0].estimatedArrivalDate?.format(DateTimeFormatter.ISO_LOCAL_DATE) ?: "" params["deliveryDate"] = deliveryNoteInfo[0].estimatedArrivalDate?.format(DateTimeFormatter.ISO_LOCAL_DATE) ?: ""
//numOfCarton
//truckNo
params["truckNo"] = selectedTruckNo
params["ShopPurchaseOrderNo"] = deliveryNoteInfo[0].code
params["FGPickOrderNo"] = selectedPickOrder?.code ?: ""


//FGPickOrderNo
//ShopPurchaseOrderNo


return mapOf( return mapOf(
"report" to PdfUtils.fillReport(deliveryNote, fields, params), "report" to PdfUtils.fillReport(deliveryNote, fields, params),
@@ -590,13 +689,82 @@ open class DeliveryOrderService(
) )
} }



//Print Delivery Note
@Transactional @Transactional
open fun printDeliveryNote(request: PrintDeliveryNoteRequest){ open fun printDeliveryNote(request: PrintDeliveryNoteRequest){
val printer = printerService.findById(request.printerId) ?: throw java.util.NoSuchElementException("No such printer")
//val printer = printerService.findById(request.printerId) ?: throw java.util.NoSuchElementException("No such printer")


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

val jasperPrint = pdf["report"] as JasperPrint

val tempPdfFile = File.createTempFile("print_job_",".pdf")

try{
JasperExportManager.exportReportToPdfFile(jasperPrint,tempPdfFile.absolutePath)

// val printQty = if (request.printQty == null || request.printQty <= 0) 1 else request.printQty
// printer.ip?.let { ip -> printer.port?.let { port ->
// ZebraPrinterUtil.printPdfToZebra(tempPdfFile, ip, port, printQty, ZebraPrinterUtil.PrintDirection.ROTATED)
// }}
} finally {
// tempPdfFile.delete()
}

}

//Carton Labels
open fun exportDNLabels(request: ExportDNLabelsRequest): Map<String, Any>{
val DNLABELS_PDF = "DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml"
val resource = ClassPathResource(DNLABELS_PDF)
if(!resource.exists()){
throw FileNotFoundException("Label file not found: $DNLABELS_PDF")
}
val inputStream = resource.inputStream
val cartonLabel = JasperCompileManager.compileReport(inputStream)
val cartonLabelInfo = deliveryOrderRepository.findDeliveryOrderInfoById(request.deliveryOrderIds).toMutableList()
val params = mutableMapOf<String, Any>()
val fields = mutableListOf<MutableMap<String ,Any>>()
for (info in cartonLabelInfo) {
val field = mutableMapOf<String, Any>()
}

params["shopPurchaseOrderNo"] = cartonLabelInfo[0].code
params["deliveryOrderCode"] = cartonLabelInfo[0].code
params["shopAddress"] = cartonLabelInfo[0].shopAddress?: ""
params["shopName"] = cartonLabelInfo[0].shopName?: ""

for(cartonNumber in 1..request.numOfCarton){
val field = mutableMapOf<String, Any>()
fields.add(field)
}

return mapOf(
"report" to PdfUtils.fillReport(cartonLabel, fields, params),
"filename" to "${cartonLabelInfo[0].code}_carton_labels"
)


}


//Print Carton Labels
@Transactional
open fun printDNLabels(request: PrintDNLabelsRequest){
//val printer = printerService.findById(request.printerId) ?: throw java.util.NoSuchElementException("No such printer")

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


@@ -607,12 +775,16 @@ open class DeliveryOrderService(
try{ try{
JasperExportManager.exportReportToPdfFile(jasperPrint,tempPdfFile.absolutePath) JasperExportManager.exportReportToPdfFile(jasperPrint,tempPdfFile.absolutePath)


val printQty = if (request.printQty == null || request.printQty <= 0) 1 else request.printQty
printer.ip?.let { ip -> printer.port?.let { port ->
ZebraPrinterUtil.printPdfToZebra(tempPdfFile, ip, port, printQty, ZebraPrinterUtil.PrintDirection.ROTATED)
}}

//val printQty = if (request.printQty == null || request.printQty <= 0) 1 else request.printQty
//printer.ip?.let { ip -> printer.port?.let { port ->
// ZebraPrinterUtil.printPdfToZebra(tempPdfFile, ip, port, printQty, ZebraPrinterUtil.PrintDirection.ROTATED)
//}}

println("Test PDF saved to: ${tempPdfFile.absolutePath}")

} finally { } finally {
tempPdfFile.delete()
//tempPdfFile.delete()
} }


} }


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

@@ -148,4 +148,9 @@ class DoPickOrderService(
} }
return doPickOrderRecordRepository.saveAll(doPickOrderRecords) return doPickOrderRecordRepository.saveAll(doPickOrderRecords)
} }
// Add method to find do_pick_order records by pick order ID
fun findByPickOrderId(pickOrderId: Long): List<DoPickOrder> {
return doPickOrderRepository.findByPickOrderId(pickOrderId)
}
} }

+ 19
- 0
src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DeliveryOrderController.kt View File

@@ -15,7 +15,9 @@ import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
import com.ffii.fpsms.modules.deliveryOrder.web.models.DoDetailResponse import com.ffii.fpsms.modules.deliveryOrder.web.models.DoDetailResponse
import com.ffii.fpsms.modules.deliveryOrder.web.models.ExportDNLabelsRequest
import com.ffii.fpsms.modules.deliveryOrder.web.models.ExportDeliveryNoteRequest import com.ffii.fpsms.modules.deliveryOrder.web.models.ExportDeliveryNoteRequest
import com.ffii.fpsms.modules.deliveryOrder.web.models.PrintDNLabelsRequest
import com.ffii.fpsms.modules.deliveryOrder.web.models.PrintDeliveryNoteRequest import com.ffii.fpsms.modules.deliveryOrder.web.models.PrintDeliveryNoteRequest
import com.ffii.fpsms.modules.deliveryOrder.web.models.ReleaseDoRequest import com.ffii.fpsms.modules.deliveryOrder.web.models.ReleaseDoRequest
import com.ffii.fpsms.modules.master.web.models.MessageResponse import com.ffii.fpsms.modules.master.web.models.MessageResponse
@@ -197,4 +199,21 @@ class DeliveryOrderController(
fun printDN(@RequestBody request: PrintDeliveryNoteRequest) { fun printDN(@RequestBody request: PrintDeliveryNoteRequest) {
deliveryOrderService.printDeliveryNote(request) deliveryOrderService.printDeliveryNote(request)
} }

@PostMapping("/DNLabels")
@Throws(UnsupportedEncodingException::class, NoSuchMessageException::class, ParseException::class, Exception::class)
fun printDNLabels(@Valid @RequestBody request: ExportDNLabelsRequest, response: HttpServletResponse){
response.characterEncoding = "utf-8"
response.contentType = "application/pdf"
val out: OutputStream = response.outputStream
val pdf = deliveryOrderService.exportDNLabels(request)
val jasperPrint = pdf["report"] as JasperPrint
response.addHeader("filename", "${pdf["filename"]}.pdf")
out.write(JasperExportManager.exportReportToPdf(jasperPrint))
}

@GetMapping("print-DNLabels")
fun printDN(@RequestBody request: PrintDNLabelsRequest) {
deliveryOrderService.printDNLabels(request)
}
} }

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

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

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

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

@@ -1,5 +1,9 @@
package com.ffii.fpsms.modules.deliveryOrder.web.models package com.ffii.fpsms.modules.deliveryOrder.web.models
import com.ffii.fpsms.modules.purchaseOrder.entity.PurchaseOrderRepository


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

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

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

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

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

@@ -4,4 +4,7 @@ data class PrintDeliveryNoteRequest(
val deliveryOrderId: Long, val deliveryOrderId: Long,
val printerId: Long, val printerId: Long,
val printQty: Int?, val printQty: Int?,
val numOfCarton: Int,
val isDraft: Boolean,
val pickOrderId: Long,
) )

+ 3
- 0
src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderRepository.kt View File

@@ -72,4 +72,7 @@ interface PickOrderRepository : AbstractRepository<PickOrder, Long> {
fun findAllByStatusAndDeletedFalse(@Param("status") status: PickOrderStatus): List<PickOrder> fun findAllByStatusAndDeletedFalse(@Param("status") status: PickOrderStatus): List<PickOrder>
@Query("SELECT p FROM PickOrder p WHERE p.assignTo.id = :assignToId AND p.status IN :statuses AND p.deleted = false") @Query("SELECT p FROM PickOrder p WHERE p.assignTo.id = :assignToId AND p.status IN :statuses AND p.deleted = false")
fun findAllByAssignToIdAndStatusIn(@Param("assignToId") assignToId: Long, @Param("statuses") statuses: List<PickOrderStatus>): List<PickOrder> fun findAllByAssignToIdAndStatusIn(@Param("assignToId") assignToId: Long, @Param("statuses") statuses: List<PickOrderStatus>): List<PickOrder>

@Query("SELECT p FROM PickOrder p WHERE p.deliveryOrder.id = :deliveryOrderId AND p.deleted = false")
fun findByDeliveryOrderId(@Param("deliveryOrderId") deliveryOrderId: Long): List<PickOrder>
} }

+ 1
- 0
src/main/java/com/ffii/fpsms/modules/pickOrder/entity/RouterRepository.kt View File

@@ -23,4 +23,5 @@ interface RouterRepository : AbstractRepository<Router, Long> {
@Query("SELECT r FROM Router r WHERE r.route = :route AND r.deleted = false") @Query("SELECT r FROM Router r WHERE r.route = :route AND r.deleted = false")
fun findByRouteAndDeletedFalse(@Param("route") route: String): List<Router> fun findByRouteAndDeletedFalse(@Param("route") route: String): List<Router>



} }

+ 1
- 1
src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotLineRepository.kt View File

@@ -9,6 +9,7 @@ import org.springframework.data.jpa.repository.Query
import org.springframework.stereotype.Repository import org.springframework.stereotype.Repository
import java.io.Serializable import java.io.Serializable
import com.ffii.fpsms.modules.stock.entity.enum.InventoryLotLineStatus import com.ffii.fpsms.modules.stock.entity.enum.InventoryLotLineStatus
import org.springframework.data.repository.query.Param


@Repository @Repository
interface InventoryLotLineRepository : AbstractRepository<InventoryLotLine, Long> { interface InventoryLotLineRepository : AbstractRepository<InventoryLotLine, Long> {
@@ -36,5 +37,4 @@ interface InventoryLotLineRepository : AbstractRepository<InventoryLotLine, Long
fun findAllByInventoryLotId(id: Serializable): List<InventoryLotLine> fun findAllByInventoryLotId(id: Serializable): List<InventoryLotLine>
fun findAllByInventoryLotItemIdAndStatus(itemId: Long, status: String): List<InventoryLotLine> fun findAllByInventoryLotItemIdAndStatus(itemId: Long, status: String): List<InventoryLotLine>
fun findAllByInventoryLotItemIdAndStatus(itemId: Long, status: InventoryLotLineStatus): List<InventoryLotLine> fun findAllByInventoryLotItemIdAndStatus(itemId: Long, status: InventoryLotLineStatus): List<InventoryLotLine>

} }

+ 3
- 0
src/main/java/com/ffii/fpsms/modules/stock/entity/InventoryLotRepository.kt View File

@@ -7,4 +7,7 @@ import java.io.Serializable
@Repository @Repository
interface InventoryLotRepository: AbstractRepository<InventoryLot, Long> { interface InventoryLotRepository: AbstractRepository<InventoryLot, Long> {
fun findByStockInLineIdAndDeletedFalse(stockInLineId: Serializable): InventoryLot? fun findByStockInLineIdAndDeletedFalse(stockInLineId: Serializable): InventoryLot?

fun findByItemIdAndDeletedFalse(itemId: Long): List<InventoryLot>

} }

+ 4
- 0
src/main/java/com/ffii/fpsms/modules/stock/service/InventoryLotService.kt View File

@@ -47,4 +47,8 @@ open class InventoryLotService(
entity = savedInventoryLot, entity = savedInventoryLot,
) )
} }

open fun findByItemId(itemId: Long): List<InventoryLot>{
return inventoryLotRepository.findByItemIdAndDeletedFalse(itemId)
}
} }

+ 1
- 0
src/main/java/com/ffii/fpsms/modules/stock/service/SuggestedPickLotService.kt View File

@@ -43,6 +43,7 @@ open class SuggestedPickLotService(
val stockOutRepository: StockOutRepository, val stockOutRepository: StockOutRepository,
val itemRepository: ItemsRepository val itemRepository: ItemsRepository
) { ) {

// Calculation Available Qty / Remaining Qty // Calculation Available Qty / Remaining Qty
open fun calculateRemainingQtyForInfo(inventoryLotLine: InventoryLotLineInfo?): BigDecimal { open fun calculateRemainingQtyForInfo(inventoryLotLine: InventoryLotLineInfo?): BigDecimal {
val zero = BigDecimal.ZERO val zero = BigDecimal.ZERO


+ 150
- 0
src/main/resources/DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml View File

@@ -0,0 +1,150 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.17.0.final using JasperReports Library version 6.17.0-6d93193241dd8cc42629e188b94f9e0bc5722efd -->
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Blank_A4" pageWidth="500" pageHeight="120" columnWidth="460" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="baa9f270-b398-4f1c-b01e-ba216b7997e9">
<parameter name="shopPurchaseOrderNo" class="java.lang.String"/>
<parameter name="shopName" class="java.lang.String"/>
<parameter name="shopAddress" class="java.lang.String"/>
<parameter name="deliveryOrderCode" class="java.lang.String"/>
<queryString>
<![CDATA[]]>
</queryString>
<background>
<band splitType="Stretch"/>
</background>
<detail>
<band height="80" splitType="Stretch">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<textField>
<reportElement x="80" y="0" width="150" height="18" uuid="8fac39f8-4936-43a5-8e1f-1afbc8ccca9c">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體" size="10"/>
</textElement>
<textFieldExpression><![CDATA[$P{shopPurchaseOrderNo}]]></textFieldExpression>
</textField>
<staticText>
<reportElement x="0" y="0" width="80" height="18" uuid="e03fcb92-259c-4427-a68e-60fe5924d763">
<property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體" size="10"/>
</textElement>
<text><![CDATA[店鋪採購單編號:
]]></text>
</staticText>
<staticText>
<reportElement x="0" y="60" width="80" height="18" uuid="c8e417ed-73ce-4349-b83c-e59e25258544">
<property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體" size="10"/>
</textElement>
<text><![CDATA[箱數:]]></text>
</staticText>
<staticText>
<reportElement x="230" y="0" width="80" height="18" uuid="f3ffd4ee-0513-41a5-94d7-f1fdb9966a76">
<property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體" size="10"/>
</textElement>
<text><![CDATA[送貨單編號:]]></text>
</staticText>
<textField>
<reportElement x="310" y="0" width="150" height="18" uuid="4319059b-9096-4c49-8275-287be93d3e6a">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體" size="10"/>
</textElement>
<textFieldExpression><![CDATA[$P{deliveryOrderCode}]]></textFieldExpression>
</textField>
<staticText>
<reportElement x="0" y="20" width="80" height="18" uuid="22ce2f40-8f43-46f0-8298-e2f224cfb239">
<property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體" size="10"/>
</textElement>
<text><![CDATA[店鋪名稱:]]></text>
</staticText>
<textField>
<reportElement x="80" y="20" width="300" height="18" uuid="9a440925-1bd4-4001-9b4b-7163ac27551e">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體" size="10"/>
</textElement>
<textFieldExpression><![CDATA[$P{shopName}]]></textFieldExpression>
</textField>
<staticText>
<reportElement x="0" y="40" width="80" height="18" uuid="057cd155-5fc8-44e5-8764-b134cb4c24f4">
<property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體" size="10"/>
</textElement>
<text><![CDATA[店鋪地址:]]></text>
</staticText>
<textField>
<reportElement x="80" y="40" width="300" height="18" uuid="26b2c156-341b-4f59-abce-bd84ea000d9d">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體" size="10"/>
</textElement>
<textFieldExpression><![CDATA[$P{shopAddress}]]></textFieldExpression>
</textField>
<staticText>
<reportElement x="150" y="60" width="20" height="18" uuid="7467bc85-22c2-4b2a-bed0-a2e82a5dba6d">
<property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體" size="10"/>
</textElement>
<text><![CDATA[箱]]></text>
</staticText>
<textField>
<reportElement x="80" y="60" width="25" height="18" uuid="e340a673-9fdc-4559-8431-af8ea391c472">
<property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font size="10"/>
</textElement>
<textFieldExpression><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression>
</textField>
<textField evaluationTime="Report">
<reportElement x="125" y="60" width="25" height="18" uuid="89ccad73-0571-4291-ae26-7804925d47eb">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
</reportElement>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font size="10"/>
</textElement>
<textFieldExpression><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression>
</textField>
<staticText>
<reportElement x="105" y="60" width="20" height="18" uuid="1cdd7507-299b-406b-baab-d2c23e44eeb0">
<property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement textAlignment="Center" verticalAlignment="Middle">
<font fontName="微軟正黑體" size="10"/>
</textElement>
<text><![CDATA[/]]></text>
</staticText>
</band>
</detail>
</jasperReport>

+ 54
- 36
src/main/resources/DeliveryNote/DeliveryNotePDF.jrxml View File

@@ -18,6 +18,11 @@
<parameter name="deliveryDate" class="java.lang.String"/> <parameter name="deliveryDate" class="java.lang.String"/>
<parameter name="FGPickOrderNo" class="java.lang.String"/> <parameter name="FGPickOrderNo" class="java.lang.String"/>
<parameter name="ShopPurchaseOrderNo" class="java.lang.String"/> <parameter name="ShopPurchaseOrderNo" class="java.lang.String"/>
<parameter name="truckNo" class="java.lang.String"/>
<parameter name="numOfCarton" class="java.lang.String"/>
<parameter name="dnTitle" class="java.lang.String"/>
<parameter name="colQty" class="java.lang.String"/>
<parameter name="totalCartonTitle" class="java.lang.String"/>
<queryString> <queryString>
<![CDATA[]]> <![CDATA[]]>
</queryString> </queryString>
@@ -28,21 +33,12 @@
<field name="qty" class="java.lang.String"/> <field name="qty" class="java.lang.String"/>
<field name="shortName" class="java.lang.String"/> <field name="shortName" class="java.lang.String"/>
<field name="route" class="java.lang.String"/> <field name="route" class="java.lang.String"/>
<field name="lotNo" class="java.lang.String"/>
<background> <background>
<band height="41" splitType="Stretch"/> <band height="41" splitType="Stretch"/>
</background> </background>
<title> <title>
<band height="28">
<staticText>
<reportElement x="223" y="2" width="108" height="23" uuid="d88b3126-393b-4444-9a75-a73af8ae0797">
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement textAlignment="Center" verticalAlignment="Bottom">
<font fontName="微軟正黑體" size="16"/>
</textElement>
<text><![CDATA[送貨單]]></text>
</staticText>
<band height="50">
<staticText> <staticText>
<reportElement x="430" y="10" width="40" height="18" uuid="ddea10c9-9e96-484b-b76b-bfff59950a98"> <reportElement x="430" y="10" width="40" height="18" uuid="ddea10c9-9e96-484b-b76b-bfff59950a98">
<property name="com.jaspersoft.studio.unit.y" value="px"/> <property name="com.jaspersoft.studio.unit.y" value="px"/>
@@ -88,10 +84,22 @@
</textElement> </textElement>
<text><![CDATA[/]]></text> <text><![CDATA[/]]></text>
</staticText> </staticText>
<textField>
<reportElement x="223" y="2" width="108" height="23" uuid="17f9fd50-da7c-43b2-93ea-7306e59aea90">
<property name="com.jaspersoft.studio.unit.x" value="px"/>
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement textAlignment="Center">
<font fontName="微軟正黑體" size="16"/>
</textElement>
<textFieldExpression><![CDATA[$P{dnTitle}]]></textFieldExpression>
</textField>
</band> </band>
</title> </title>
<pageHeader> <pageHeader>
<band height="117">
<band height="118">
<staticText> <staticText>
<reportElement x="0" y="10" width="80" height="18" uuid="7f991bbe-caf4-43c1-b8e1-d85b1f2d3815"> <reportElement x="0" y="10" width="80" height="18" uuid="7f991bbe-caf4-43c1-b8e1-d85b1f2d3815">
<property name="com.jaspersoft.studio.unit.y" value="px"/> <property name="com.jaspersoft.studio.unit.y" value="px"/>
@@ -152,16 +160,6 @@
</textElement> </textElement>
<text><![CDATA[店鋪採購單編號:]]></text> <text><![CDATA[店鋪採購單編號:]]></text>
</staticText> </staticText>
<staticText>
<reportElement x="0" y="90" width="80" height="18" uuid="3e5f2bc4-03d7-4d7c-9a93-ca4fa8f5ed33">
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement textAlignment="Left" verticalAlignment="Middle">
<font fontName="微軟正黑體" size="12"/>
</textElement>
<text><![CDATA[總箱數:]]></text>
</staticText>
<staticText> <staticText>
<reportElement x="275" y="70" width="110" height="18" uuid="6b810312-71e2-4749-bc8b-0b7a705377f8"> <reportElement x="275" y="70" width="110" height="18" uuid="6b810312-71e2-4749-bc8b-0b7a705377f8">
<property name="com.jaspersoft.studio.unit.height" value="px"/> <property name="com.jaspersoft.studio.unit.height" value="px"/>
@@ -207,7 +205,7 @@
<textElement verticalAlignment="Middle"> <textElement verticalAlignment="Middle">
<font fontName="微軟正黑體"/> <font fontName="微軟正黑體"/>
</textElement> </textElement>
<textFieldExpression><![CDATA["Text Field"]]></textFieldExpression>
<textFieldExpression><![CDATA[$P{truckNo}]]></textFieldExpression>
</textField> </textField>
<textField> <textField>
<reportElement x="385" y="30" width="150" height="18" uuid="24a1331c-e50f-4a72-9a41-3e05b85f4c21"> <reportElement x="385" y="30" width="150" height="18" uuid="24a1331c-e50f-4a72-9a41-3e05b85f4c21">
@@ -243,7 +241,16 @@
<textElement verticalAlignment="Middle"> <textElement verticalAlignment="Middle">
<font fontName="微軟正黑體"/> <font fontName="微軟正黑體"/>
</textElement> </textElement>
<textFieldExpression><![CDATA["Text Field"]]></textFieldExpression>
<textFieldExpression><![CDATA[$P{numOfCarton}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="0" y="90" width="80" height="18" uuid="25254ea4-e2b2-4ae0-975b-99c8f9390a64">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Middle">
<font fontName="微軟正黑體"/>
</textElement>
<textFieldExpression><![CDATA[$P{totalCartonTitle}]]></textFieldExpression>
</textField> </textField>
</band> </band>
</pageHeader> </pageHeader>
@@ -291,16 +298,6 @@
</textElement> </textElement>
<text><![CDATA[貨品名稱]]></text> <text><![CDATA[貨品名稱]]></text>
</staticText> </staticText>
<staticText>
<reportElement x="470" y="5" width="84" height="18" uuid="c0485433-8212-4b0a-90ed-c69885ad6d74">
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement textAlignment="Left">
<font fontName="微軟正黑體" size="12"/>
</textElement>
<text><![CDATA[數量]]></text>
</staticText>
<line> <line>
<reportElement x="0" y="28" width="554" height="1" uuid="76648c53-0490-4e52-b737-a8075d9c654f"> <reportElement x="0" y="28" width="554" height="1" uuid="76648c53-0490-4e52-b737-a8075d9c654f">
<property name="com.jaspersoft.studio.unit.height" value="px"/> <property name="com.jaspersoft.studio.unit.height" value="px"/>
@@ -311,10 +308,22 @@
<property name="com.jaspersoft.studio.unit.height" value="px"/> <property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement> </reportElement>
</line> </line>
<textField>
<reportElement x="470" y="5" width="84" height="18" uuid="c7debdbf-fb80-4e4a-92d0-1bff85b60d0e">
<property name="com.jaspersoft.studio.unit.x" value="px"/>
<property name="com.jaspersoft.studio.unit.y" value="px"/>
<property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement>
<font fontName="微軟正黑體" size="12"/>
</textElement>
<textFieldExpression><![CDATA[$P{colQty}]]></textFieldExpression>
</textField>
</band> </band>
</columnHeader> </columnHeader>
<detail> <detail>
<band height="25">
<band height="37">
<textField> <textField>
<reportElement x="0" y="1" width="50" height="18" uuid="ae87b739-dadf-452a-bc35-8c2da1a6a9a8"> <reportElement x="0" y="1" width="50" height="18" uuid="ae87b739-dadf-452a-bc35-8c2da1a6a9a8">
<property name="com.jaspersoft.studio.unit.height" value="px"/> <property name="com.jaspersoft.studio.unit.height" value="px"/>
@@ -361,10 +370,19 @@
<textFieldExpression><![CDATA[$F{itemName} + "(" + $F{uom} + ")"]]></textFieldExpression> <textFieldExpression><![CDATA[$F{itemName} + "(" + $F{uom} + ")"]]></textFieldExpression>
</textField> </textField>
<line> <line>
<reportElement x="0" y="21" width="554" height="1" uuid="00d1c4c2-fcb0-4282-90c6-5443b260007c">
<reportElement x="0" y="36" width="554" height="1" uuid="00d1c4c2-fcb0-4282-90c6-5443b260007c">
<property name="com.jaspersoft.studio.unit.height" value="px"/> <property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement> </reportElement>
</line> </line>
<textField>
<reportElement x="240" y="18" width="230" height="18" uuid="af701932-2e78-47d4-a131-b668200dc376">
<property name="com.jaspersoft.studio.unit.height" value="px"/>
</reportElement>
<textElement verticalAlignment="Top">
<font fontName="微軟正黑體"/>
</textElement>
<textFieldExpression><![CDATA[$F{lotNo}]]></textFieldExpression>
</textField>
</band> </band>
</detail> </detail>
<pageFooter> <pageFooter>


Loading…
Cancel
Save