From 1633e9bace1640720b9450bca978461fc9068a1d Mon Sep 17 00:00:00 2001 From: "cyril.tsui" Date: Mon, 29 Sep 2025 18:56:39 +0800 Subject: [PATCH 1/4] update job order --- .../jobOrder/entity/JobOrderBomMaterial.kt | 7 +++-- .../entity/JobOrderBomMaterialRepository.kt | 2 ++ .../jobOrder/enums/JobOrderBomMaterialEnum.kt | 6 ++++ .../enums/JobOrderBomMaterialEnumConverter.kt | 18 ++++++++++++ .../service/JobOrderBomMaterialService.kt | 29 ++++++++++++++++++- .../jobOrder/service/JobOrderService.kt | 24 +++++++++++++-- .../jobOrder/web/JobOrderController.kt | 15 ++++++++-- .../web/model/CreateJobOrderRequest.kt | 3 +- .../web/model/JobOrderActionRequest.kt | 4 +-- .../stock/service/StockInLineService.kt | 4 +-- 10 files changed, 100 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/ffii/fpsms/modules/jobOrder/enums/JobOrderBomMaterialEnum.kt create mode 100644 src/main/java/com/ffii/fpsms/modules/jobOrder/enums/JobOrderBomMaterialEnumConverter.kt diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterial.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterial.kt index ed3c6f1..3f1f87f 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterial.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterial.kt @@ -2,6 +2,8 @@ package com.ffii.fpsms.modules.jobOrder.entity import com.fasterxml.jackson.annotation.JsonBackReference import com.ffii.core.entity.BaseEntity +import com.ffii.fpsms.modules.jobOrder.enums.JobOrderBomMaterialStatus +import com.ffii.fpsms.modules.jobOrder.enums.JobOrderBomMaterialStatusConverter import com.ffii.fpsms.modules.master.entity.Items import com.ffii.fpsms.modules.master.entity.UomConversion import com.ffii.fpsms.modules.stock.entity.InventoryLotLine @@ -35,10 +37,11 @@ open class JobOrderBomMaterial : BaseEntity() { @JoinColumn(name = "uomId", nullable = false) open var uom: UomConversion? = null - @Size(max = 255) +// @Size(max = 255) @NotNull @Column(name = "status", nullable = false) - open var status: String? = null + @Convert(converter = JobOrderBomMaterialStatusConverter::class) + open var status: JobOrderBomMaterialStatus? = null @ManyToOne @JoinColumn(name = "stockOutLineId") diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterialRepository.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterialRepository.kt index 8395771..13fe3e3 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterialRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/entity/JobOrderBomMaterialRepository.kt @@ -6,4 +6,6 @@ import org.springframework.stereotype.Repository @Repository interface JobOrderBomMaterialRepository : AbstractRepository { fun findByJobOrderIdAndItemId(jobOrderId: Long, itemId: Long): JobOrderBomMaterial?; + + fun findAllByJobOrderId(jobOrderId: Long): List; } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/enums/JobOrderBomMaterialEnum.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/enums/JobOrderBomMaterialEnum.kt new file mode 100644 index 0000000..b776778 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/enums/JobOrderBomMaterialEnum.kt @@ -0,0 +1,6 @@ +package com.ffii.fpsms.modules.jobOrder.enums + +enum class JobOrderBomMaterialStatus(val value: String) { + PENDING("pending"), + COMPLETED("completed") +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/enums/JobOrderBomMaterialEnumConverter.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/enums/JobOrderBomMaterialEnumConverter.kt new file mode 100644 index 0000000..e293951 --- /dev/null +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/enums/JobOrderBomMaterialEnumConverter.kt @@ -0,0 +1,18 @@ +package com.ffii.fpsms.modules.jobOrder.enums + +import jakarta.persistence.AttributeConverter +import jakarta.persistence.Converter + +// Job Order Bom Material Status +@Converter(autoApply = true) +class JobOrderBomMaterialStatusConverter : AttributeConverter { + override fun convertToDatabaseColumn(status: JobOrderBomMaterialStatus?): String? { + return status?.value + } + + override fun convertToEntityAttribute(value: String?): JobOrderBomMaterialStatus? { + return value?.let { v -> + JobOrderBomMaterialStatus.entries.find { it.value == v } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderBomMaterialService.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderBomMaterialService.kt index 178a2f3..b9c79fc 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderBomMaterialService.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderBomMaterialService.kt @@ -3,6 +3,7 @@ package com.ffii.fpsms.modules.jobOrder.service import com.ffii.fpsms.modules.jobOrder.entity.JobOrderBomMaterial import com.ffii.fpsms.modules.jobOrder.entity.JobOrderBomMaterialRepository import com.ffii.fpsms.modules.jobOrder.entity.JobOrderRepository +import com.ffii.fpsms.modules.jobOrder.enums.JobOrderBomMaterialStatus import com.ffii.fpsms.modules.jobOrder.web.model.CreateJobOrderBomMaterialRequest import com.ffii.fpsms.modules.master.entity.ItemsRepository import com.ffii.fpsms.modules.master.entity.UomConversionRepository @@ -45,13 +46,14 @@ open class JobOrderBomMaterialService( val jo = req.joId?.let { jobOrderRepository.findById(it).getOrNull() } val item = req.itemId?.let { itemsRepository.findById(it).getOrNull() } val uom = req.uomId?.let { uomConversionRepository.findById(it).getOrNull() } + val status = JobOrderBomMaterialStatus.entries.find { it.value === req.status } JobOrderBomMaterial().apply { jobOrder = jo this.item = item reqQty = req.reqQty this.uom = uom - status = req.status + this.status = status } } @@ -70,4 +72,29 @@ open class JobOrderBomMaterialService( fun createJobOrderBomMaterialsByJoId(joId: Long): MessageResponse { return createJobOrderBomMaterials(createJobOrderBomMaterialRequests(joId)) } + + // After Picked Job Order Bom Material + fun completeJobOrderBomMaterials(joId: Long): MessageResponse { + val jobms = jobOrderBomMaterialRepository.findAllByJobOrderId(joId) + val updatedJobms = jobms.map { + it.apply { + status = JobOrderBomMaterialStatus.COMPLETED + } + } + + jobOrderBomMaterialRepository.saveAll(updatedJobms) + + return MessageResponse( + id = null, + name = null, + code = null, + type = null, + message = "Success", + errorPosition = null + ) + } + + fun completeJobOrderBomMaterialsByJoId(joId: Long): MessageResponse { + return completeJobOrderBomMaterials(joId) + } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderService.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderService.kt index b707515..b56b489 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderService.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/service/JobOrderService.kt @@ -10,7 +10,7 @@ import com.ffii.fpsms.modules.jobOrder.entity.projections.JobOrderDetailPickLine import com.ffii.fpsms.modules.jobOrder.entity.projections.JobOrderInfo import com.ffii.fpsms.modules.jobOrder.enums.JobOrderStatus import com.ffii.fpsms.modules.jobOrder.web.model.CreateJobOrderRequest -import com.ffii.fpsms.modules.jobOrder.web.model.JobOrderReleaseRequest +import com.ffii.fpsms.modules.jobOrder.web.model.JobOrderCommonActionRequest import com.ffii.fpsms.modules.jobOrder.web.model.SearchJobOrderInfoRequest import com.ffii.fpsms.modules.master.entity.ProductionScheduleLineRepository import com.ffii.fpsms.modules.master.service.BomService @@ -158,7 +158,7 @@ open class JobOrderService( } @Transactional(rollbackFor = [Exception::class]) - open fun releaseJobOrder(request: JobOrderReleaseRequest): MessageResponse { + open fun releaseJobOrder(request: JobOrderCommonActionRequest): MessageResponse { val jo = request.id.let { jobOrderRepository.findById(it).getOrNull() } ?: throw NoSuchElementException() jo.apply { status = JobOrderStatus.PENDING @@ -255,6 +255,26 @@ open class JobOrderService( } + return MessageResponse( + id = jo.id, + code = jo.code, + name = jo.bom?.name, + type = null, + message = null, + errorPosition = null, + entity = mapOf("status" to jo.status?.value) + ) + } + + + @Transactional(rollbackFor = [Exception::class]) + open fun startJobOrder(request: JobOrderCommonActionRequest): MessageResponse { + val jo = request.id.let { jobOrderRepository.findById(it).getOrNull() } ?: throw NoSuchElementException() + jo.apply { + status = JobOrderStatus.PROCESSING + } + jobOrderRepository.save(jo) + return MessageResponse( id = jo.id, code = jo.code, diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt index ae085b7..1483543 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt @@ -7,7 +7,7 @@ import com.ffii.fpsms.modules.jobOrder.service.JobOrderBomMaterialService import com.ffii.fpsms.modules.jobOrder.service.JobOrderProcessService import com.ffii.fpsms.modules.jobOrder.service.JobOrderService import com.ffii.fpsms.modules.jobOrder.web.model.CreateJobOrderRequest -import com.ffii.fpsms.modules.jobOrder.web.model.JobOrderReleaseRequest +import com.ffii.fpsms.modules.jobOrder.web.model.JobOrderCommonActionRequest import com.ffii.fpsms.modules.jobOrder.web.model.SearchJobOrderInfoRequest import com.ffii.fpsms.modules.master.web.models.MessageResponse import jakarta.validation.Valid @@ -46,10 +46,21 @@ class JobOrderController( } @PostMapping("/release") - fun releaseJobOrder(@Valid @RequestBody request: JobOrderReleaseRequest): MessageResponse { + fun releaseJobOrder(@Valid @RequestBody request: JobOrderCommonActionRequest): MessageResponse { return jobOrderService.releaseJobOrder(request) } + @PostMapping("/start") + fun startJobOrder(@Valid @RequestBody request: JobOrderCommonActionRequest): MessageResponse { + val jo = jobOrderService.startJobOrder(request) + if (jo.id == null) { + throw NoSuchElementException() + } + jobOrderBomMaterialService.completeJobOrderBomMaterialsByJoId(jo.id) + + return jo + } + @PostMapping("/manualCreate") fun manualCreateJobOrder(@Valid @RequestBody request: CreateJobOrderRequest): MessageResponse { val jo = jobOrderService.createJobOrder(request) diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt index c9b05f2..175beb6 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt @@ -1,5 +1,6 @@ package com.ffii.fpsms.modules.jobOrder.web.model +import com.ffii.fpsms.modules.jobOrder.enums.JobOrderBomMaterialStatus import java.math.BigDecimal import java.time.LocalDateTime @@ -19,7 +20,7 @@ data class CreateJobOrderBomMaterialRequest ( val itemId: Long?, val reqQty: BigDecimal?, val uomId: Long?, - val status: String = "pending", + val status: String = JobOrderBomMaterialStatus.PENDING.value, ) data class CreateJobOrderProcessRequest ( diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/JobOrderActionRequest.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/JobOrderActionRequest.kt index d8e3bcc..217d306 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/JobOrderActionRequest.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/JobOrderActionRequest.kt @@ -1,5 +1,5 @@ package com.ffii.fpsms.modules.jobOrder.web.model -data class JobOrderReleaseRequest( +data class JobOrderCommonActionRequest( val id: Long, -) +) \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt b/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt index f40f1d7..7571f8f 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/service/StockInLineService.kt @@ -83,8 +83,8 @@ open class StockInLineService( val pol = if (request.purchaseOrderLineId != null) request.purchaseOrderLineId?.let { polRepository.findById(it).orElseThrow() } else null - val stl = if (request.stockTakeId != null) - request.stockTakeId?.let { stockTakeLineRepository.findById(it).getOrNull() } + val stl = if (request.stockTakeLineId != null) + request.stockTakeLineId?.let { stockTakeLineRepository.findById(it).getOrNull() } else null var stockIn = if (request.stockInId != null) request.stockInId?.let { stockInRepository.findByIdAndDeletedFalse(it) } From 97e8ea972ef09bb680bc9fc38961d1a962556423 Mon Sep 17 00:00:00 2001 From: "kelvin.yau" Date: Mon, 29 Sep 2025 19:45:42 +0800 Subject: [PATCH 2/4] update --- .../com/ffii/core/utils/ZebraPrinterUtil.kt | 35 +++++++++++++------ .../service/DeliveryOrderService.kt | 25 ++++++------- .../web/DeliveryOrderController.kt | 7 ++-- .../stock/entity/projection/InventoryInfo.kt | 12 ++++--- 4 files changed, 48 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/ffii/core/utils/ZebraPrinterUtil.kt b/src/main/java/com/ffii/core/utils/ZebraPrinterUtil.kt index ea78295..8d72bc1 100644 --- a/src/main/java/com/ffii/core/utils/ZebraPrinterUtil.kt +++ b/src/main/java/com/ffii/core/utils/ZebraPrinterUtil.kt @@ -35,7 +35,6 @@ open class ZebraPrinterUtil { * @param printDirection Valid values: N (Normal), R (Rotated 90), I (Inverted 180), B (Bottom-up 270) * @throws Exception if there is an error during file processing or printing. */ - @JvmStatic fun printPdfToZebra(pdfFile: File, printerIp: String, printerPort: Int, printQty: Int? = 1, printDirection: PrintDirection = PrintDirection.NORMAL) { // Check if the file exists and is readable @@ -47,22 +46,36 @@ open class ZebraPrinterUtil { // 1. Load the PDF document PDDocument.load(pdfFile).use { document -> val renderer = PDFRenderer(document) + val totalPages = document.numberOfPages - // 2. Render the first page of the PDF as a monochrome image - // The '300 / 72f' scales the image to 300 DPI. - val image = renderer.renderImage(0, 300 / 72f, ImageType.BINARY) + println("DEBUG: PDF has $totalPages pages") - // 3. Convert the image to a ZPL format string - val zplCommand = convertImageToZpl(image, printDirection) + // Print each page for the specified quantity + repeat(printQty ?: 1) { copyIndex -> + println("DEBUG: Printing copy ${copyIndex + 1} of ${printQty ?: 1}") - // 4. Send the ZPL command to the printer via a network socket - val printData = zplCommand.toByteArray() - Socket(printerIp, printerPort).use { socket -> - val os: OutputStream = socket.getOutputStream() - repeat(printQty ?: 1) { index -> + // Iterate through all pages in the PDF + for (pageIndex in 0 until totalPages) { + println("DEBUG: Processing page ${pageIndex + 1} of $totalPages") + + // 2. Render each page of the PDF as a monochrome image + val image = renderer.renderImage(pageIndex, 300 / 72f, ImageType.BINARY) + + // 3. Convert the image to a ZPL format string + val zplCommand = convertImageToZpl(image, printDirection) + + // 4. Send each page as a separate print job + Socket(printerIp, printerPort).use { socket -> + val os: OutputStream = socket.getOutputStream() + val printData = zplCommand.toByteArray() os.write(printData) os.flush() + println("DEBUG: Page ${pageIndex + 1} sent to printer") } + + // Small delay between pages to ensure printer can process each page + Thread.sleep(100) + } } } } catch (e: Exception) { diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt index 6f2b511..7a6cee8 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DeliveryOrderService.kt @@ -695,7 +695,7 @@ open class DeliveryOrderService( //Print Delivery Note @Transactional 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( ExportDeliveryNoteRequest( @@ -713,12 +713,12 @@ open class DeliveryOrderService( 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) - // }} + 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() + //tempPdfFile.delete() } } @@ -754,14 +754,15 @@ open class DeliveryOrderService( "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 printer = printerService.findById(request.printerId) ?: throw java.util.NoSuchElementException("No such printer") val pdf = exportDNLabels( ExportDNLabelsRequest( @@ -778,10 +779,10 @@ open class DeliveryOrderService( 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}") diff --git a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DeliveryOrderController.kt b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DeliveryOrderController.kt index 8ec75da..2eb7873 100644 --- a/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DeliveryOrderController.kt +++ b/src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DeliveryOrderController.kt @@ -21,6 +21,7 @@ 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.ReleaseDoRequest import com.ffii.fpsms.modules.master.web.models.MessageResponse +import com.ffii.fpsms.modules.stock.web.model.PrintQrCodeForSilRequest import jakarta.servlet.http.HttpServletResponse import jakarta.validation.Valid import net.sf.jasperreports.engine.JasperExportManager @@ -195,8 +196,8 @@ class DeliveryOrderController( out.write(JasperExportManager.exportReportToPdf(jasperPrint)) } - @GetMapping("print-DN") - fun printDN(@RequestBody request: PrintDeliveryNoteRequest) { + @GetMapping("/print-DN") + fun printDN(@ModelAttribute request: PrintDeliveryNoteRequest) { deliveryOrderService.printDeliveryNote(request) } @@ -213,7 +214,7 @@ class DeliveryOrderController( } @GetMapping("print-DNLabels") - fun printDN(@RequestBody request: PrintDNLabelsRequest) { + fun printDN(@ModelAttribute request: PrintDNLabelsRequest) { deliveryOrderService.printDNLabels(request) } } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/stock/entity/projection/InventoryInfo.kt b/src/main/java/com/ffii/fpsms/modules/stock/entity/projection/InventoryInfo.kt index ceca671..39ed573 100644 --- a/src/main/java/com/ffii/fpsms/modules/stock/entity/projection/InventoryInfo.kt +++ b/src/main/java/com/ffii/fpsms/modules/stock/entity/projection/InventoryInfo.kt @@ -13,30 +13,32 @@ interface InventoryInfo{ val itemName: String? @get:Value("#{target.item.type}") val itemType: String? -// @get:Value("#{target.qty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") + // @get:Value("#{target.qty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") // @get:Value("#{target.onHandQty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") @get:Value("#{target.onHandQty}") val onHandQty: BigDecimal? -// @get:Value("#{target.onHoldQty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") + // @get:Value("#{target.onHoldQty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") @get:Value("#{target.onHoldQty}") val onHoldQty: BigDecimal? -// @get:Value("#{target.unavailableQty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") + // @get:Value("#{target.unavailableQty / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") @get:Value("#{target.unavailableQty}") val unavailableQty: BigDecimal? -// @get:Value("#{(target.onHandQty - target.onHoldQty - target.unavailableQty) / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") + // @get:Value("#{(target.onHandQty - target.onHoldQty - target.unavailableQty) / (target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioN / target.item.itemUoms.^[stockUnit == true && deleted == false]?.ratioD)}") @get:Value("#{(target.onHandQty - target.onHoldQty - target.unavailableQty)}") val availableQty: BigDecimal? @get:Value("#{target.item.itemUoms.^[stockUnit == true && deleted == false]?.uom.code}") val uomCode: String? @get:Value("#{target.item.itemUoms.^[stockUnit == true && deleted == false]?.uom?.udfudesc}") val uomUdfudesc: String? + @get:Value("#{target.item.itemUoms.^[stockUnit == true && deleted == false]?.uom?.udfShortDesc}") + val uomShortDesc: String? // @get:Value("#{target.qty * target.uom.gramPerSmallestUnit}") // val germPerSmallestUnit: BigDecimal? @get:Value("#{(target.onHandQty - target.onHoldQty - target.unavailableQty)}") val qtyPerSmallestUnit: BigDecimal? @get:Value("#{target.item.itemUoms.^[baseUnit == true && deleted == false]?.uom?.udfudesc}") val baseUom: String? -// @get:Value("#{target.qty * (target.uom.unit4 != '' ? target.uom.unit4Qty " + + // @get:Value("#{target.qty * (target.uom.unit4 != '' ? target.uom.unit4Qty " + // ": target.uom.unit3 != '' ? target.uom.unit3Qty " + // ": target.uom.unit2 != '' ? target.uom.unit2Qty " + // ": target.uom.unit1Qty)}") From 1467b483e6d6ae758b0ef826f5070fb3e695fd3b Mon Sep 17 00:00:00 2001 From: "kelvin.yau" Date: Mon, 29 Sep 2025 19:55:11 +0800 Subject: [PATCH 3/4] update --- .../202510927_01_enson/02_altertable_enson.sql | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/main/resources/db/changelog/changes/202510927_01_enson/02_altertable_enson.sql diff --git a/src/main/resources/db/changelog/changes/202510927_01_enson/02_altertable_enson.sql b/src/main/resources/db/changelog/changes/202510927_01_enson/02_altertable_enson.sql new file mode 100644 index 0000000..db8c93f --- /dev/null +++ b/src/main/resources/db/changelog/changes/202510927_01_enson/02_altertable_enson.sql @@ -0,0 +1,16 @@ +--liquibase formatted sql + +--changeset enson:update + +ALTER TABLE pick_execution_issue +CHANGE COLUMN handle_status handle_status ENUM('pending', 'handled', 'resolved', "Jopending", "Johandled", "Joresloved") NULL DEFAULT 'pending' ; + +ALTER TABLE do_pick_order +ADD COLUMN do_order_id INT NULL AFTER pick_order_id, +ADD COLUMN ticket_release_time DATETIME NULL DEFAULT NULL AFTER handled_by, +CHANGE COLUMN handled_by handled_by INT NULL ; + +ALTER TABLE do_pick_order_record +ADD COLUMN do_order_id INT NULL AFTER pick_order_id, +ADD COLUMN ticket_release_time DATETIME NULL DEFAULT NULL AFTER handled_by, +CHANGE COLUMN handled_by handled_by INT NULL ; \ No newline at end of file From 94d0d4f14313e509ab43a98e078ef3ac29b28a3e Mon Sep 17 00:00:00 2001 From: "kelvin.yau" Date: Mon, 29 Sep 2025 19:56:47 +0800 Subject: [PATCH 4/4] update --- src/main/resources/application-db-local.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application-db-local.yml b/src/main/resources/application-db-local.yml index a9c01bf..4fa8584 100644 --- a/src/main/resources/application-db-local.yml +++ b/src/main/resources/application-db-local.yml @@ -1,5 +1,5 @@ spring: datasource: - jdbc-url: jdbc:mysql://127.0.0.1:3308/fpsmsdb?useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT%2B8 + jdbc-url: jdbc:mysql://127.0.0.1:3306/fpsmsdb?useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT%2B8 username: root password: secret \ No newline at end of file