From a111a80bf6b73d7c0098f5efe9ef9f6280d8ac66 Mon Sep 17 00:00:00 2001 From: "vluk@2fi-solutions.com.hk" Date: Mon, 15 Jun 2026 12:08:07 +0800 Subject: [PATCH] handle the laser printer that failed to print 1175 full name with (uom) --- .../service/PlasticBagPrinterService.kt | 2 +- .../com/ffii/fpsms/py/PyJobOrderListItem.kt | 5 +- .../com/ffii/fpsms/py/PyJobOrderListMapper.kt | 59 +++++++++++++++++++ .../ffii/fpsms/py/PyJobOrderListMapperTest.kt | 10 +++- 4 files changed, 69 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/ffii/fpsms/modules/jobOrder/service/PlasticBagPrinterService.kt b/src/main/java/com/ffii/fpsms/modules/jobOrder/service/PlasticBagPrinterService.kt index 78dcb59..3299060 100644 --- a/src/main/java/com/ffii/fpsms/modules/jobOrder/service/PlasticBagPrinterService.kt +++ b/src/main/java/com/ffii/fpsms/modules/jobOrder/service/PlasticBagPrinterService.kt @@ -177,7 +177,7 @@ class PlasticBagPrinterService( val ids = filtered.mapNotNull { it.id } val printed = pyJobOrderPrintSubmitService.sumPrintedQtyByJobOrderIds(ids) return filtered.map { jo -> - PyJobOrderListMapper.toListItem(jo, printed[jo.id!!], stockInLineRepository, itemUomService) + PyJobOrderListMapper.toLaserListItem(jo, printed[jo.id!!], stockInLineRepository, itemUomService) } } diff --git a/src/main/java/com/ffii/fpsms/py/PyJobOrderListItem.kt b/src/main/java/com/ffii/fpsms/py/PyJobOrderListItem.kt index 6c39629..0ac36f2 100644 --- a/src/main/java/com/ffii/fpsms/py/PyJobOrderListItem.kt +++ b/src/main/java/com/ffii/fpsms/py/PyJobOrderListItem.kt @@ -8,9 +8,8 @@ import java.time.LocalDateTime * No login required. * stockInLineId and itemId are for QR code: {"itemId": xxx, "stockInLineId": xxx} * lotNo replaces job order no. on the label display. - * [itemName] is BOM/item display name plus stock UOM [udfudesc] in parentheses, e.g. "名稱(1包X2磅)"; - * stock unit is not appended when a parenthetical segment already looks like packaging UOM - * (digits + unit tokens). Usage/grade notes in parentheses, e.g. "(菠菜用)" or "(P+4)", still get UOM appended. + * [itemName] is BOM/item display name plus stock UOM [udfudesc] in parentheses when appropriate; + * GET /py/laser-job-orders (/laserPrint) may omit that suffix for specific item codes (e.g. PP1175) due to laser name length. */ data class PyJobOrderListItem( val id: Long, diff --git a/src/main/java/com/ffii/fpsms/py/PyJobOrderListMapper.kt b/src/main/java/com/ffii/fpsms/py/PyJobOrderListMapper.kt index 1fe4ed9..66e8a6a 100644 --- a/src/main/java/com/ffii/fpsms/py/PyJobOrderListMapper.kt +++ b/src/main/java/com/ffii/fpsms/py/PyJobOrderListMapper.kt @@ -52,6 +52,29 @@ object PyJobOrderListMapper { return nameNorm.contains(norm) } + /** + * Item codes where /laserPrint must not append stock UOM to [itemName] (laser field length limit). + * BOM base name only, e.g. PP1175 "鮮檸檬汁(P+4)" without "(1包X2磅)" suffix. + */ + private val LASER_OMIT_APPENDED_STOCK_UOM_ITEM_CODES = setOf("PP1175") + + /** + * Display name for GET /py/laser-job-orders and /plastic/laser-job-orders (/laserPrint page). + * Same as [buildDisplayItemName] except listed item codes never get stock UOM appended. + */ + fun buildDisplayItemNameForLaser( + baseName: String?, + stockUnitDesc: String?, + itemCode: String?, + ): String? { + val code = itemCode?.trim().orEmpty() + if (code in LASER_OMIT_APPENDED_STOCK_UOM_ITEM_CODES) { + val baseTrim = baseName?.trim().orEmpty() + return baseTrim.ifEmpty { null } + } + return buildDisplayItemName(baseName, stockUnitDesc) + } + fun toListItem( jo: JobOrder, printed: PrintedQtyByChannel?, @@ -86,4 +109,40 @@ object PyJobOrderListMapper { laserPrintedQty = p.laserPrintedQty, ) } + + /** /laserPrint list: may shorten [itemName] for laser length limits (see [buildDisplayItemNameForLaser]). */ + fun toLaserListItem( + jo: JobOrder, + printed: PrintedQtyByChannel?, + stockInLineRepository: StockInLineRepository, + itemUomService: ItemUomService, + ): PyJobOrderListItem { + val itemCode = jo.bom?.item?.code ?: jo.bom?.code + val baseName = jo.bom?.name ?: jo.bom?.item?.name + val itemId = jo.bom?.item?.id + val stockUnitDesc = itemId?.let { id -> + itemUomService.findStockUnitByItemId(id)?.uom?.udfudesc + } + val itemName = buildDisplayItemNameForLaser(baseName, stockUnitDesc, itemCode) + + val stockInLine = jo.id?.let { stockInLineRepository.findFirstByJobOrder_IdAndDeletedFalse(it) } + val stockInLineId = stockInLine?.id + val lotNo = stockInLine?.lotNo + val p = printed ?: PrintedQtyByChannel() + + return PyJobOrderListItem( + id = jo.id!!, + code = jo.code, + planStart = jo.planStart, + itemCode = itemCode, + itemName = itemName, + reqQty = jo.reqQty, + stockInLineId = stockInLineId, + itemId = itemId, + lotNo = lotNo, + bagPrintedQty = p.bagPrintedQty, + labelPrintedQty = p.labelPrintedQty, + laserPrintedQty = p.laserPrintedQty, + ) + } } diff --git a/src/test/kotlin/com/ffii/fpsms/py/PyJobOrderListMapperTest.kt b/src/test/kotlin/com/ffii/fpsms/py/PyJobOrderListMapperTest.kt index 7d22baf..e90561f 100644 --- a/src/test/kotlin/com/ffii/fpsms/py/PyJobOrderListMapperTest.kt +++ b/src/test/kotlin/com/ffii/fpsms/py/PyJobOrderListMapperTest.kt @@ -64,10 +64,14 @@ class PyJobOrderListMapperTest { } @Test - fun buildDisplayItemName_appends_when_no_parens() { + fun buildDisplayItemNameForLaser_omits_appended_uom_for_PP1175() { assertEquals( - "大冬菇($stockUom)", - PyJobOrderListMapper.buildDisplayItemName("大冬菇", stockUom), + "鮮檸檬汁(P+4)", + PyJobOrderListMapper.buildDisplayItemNameForLaser("鮮檸檬汁(P+4)", stockUom, "PP1175"), + ) + assertEquals( + "咖哩汁(1包X2磅)", + PyJobOrderListMapper.buildDisplayItemNameForLaser("咖哩汁(1包X2磅)", stockUom, "PP1080"), ) } }