From 8f99f1b2584d87a659de2ac851c8c3af83748126 Mon Sep 17 00:00:00 2001 From: Fai Luk Date: Fri, 4 Sep 2026 00:53:00 +0800 Subject: [PATCH] refining the onpack zip --- .../service/PlasticBagPrinterService.kt | 18 +++++++++++++++--- .../service/OnPackExpiryZipStemTest.kt | 10 +++++++++- 2 files changed, 24 insertions(+), 4 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 beebf47..3a57467 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 @@ -69,11 +69,13 @@ data class OnPackZipResult( private data class OnPackBmpExportItem( val codeLower: String, - /** ZIP / template file stem (e.g. `pp2211` or `pp2211-2` for expiry multi-JO). */ + /** ZIP / template file stem. First JO stays `pp2211` so operators select that template. */ val fileStem: String, val itemId: Long, val stockInLineId: Long, val itemCode: String, + /** Code BMP text. When that item has 2+ JOs, first bag shows `PP2211-1`. */ + val printItemCode: String, val productName: String, val planDate: LocalDate?, ) @@ -164,6 +166,11 @@ class PlasticBagPrinterService( fun onPackExpiryFileStem(itemCodeLower: String, indexOneBased: Int, totalForItem: Int): String = if (totalForItem > 1 && indexOneBased > 1) "$itemCodeLower-$indexOneBased" else itemCodeLower + fun onPackExpiryPrintCode(itemCode: String, indexOneBased: Int, totalForItem: Int): String { + val code = itemCode.trim().uppercase() + return if (totalForItem > 1) "$code-$indexOneBased" else code + } + /** ISO `yyyy-MM-dd`, compact `yyyyMMdd`, or already `Expiry Date yyyyMMdd`. */ fun formatLaserExpiryParam(expiryDate: String?): String { val raw = expiryDate?.trim().orEmpty() @@ -325,6 +332,7 @@ class PlasticBagPrinterService( itemId = itemId, stockInLineId = stockInLineId, itemCode = itemCode, + printItemCode = itemCode, productName = productName, planDate = jo?.planStart?.toLocalDate(), ) @@ -789,7 +797,11 @@ class PlasticBagPrinterService( } if (includeExpiry) { items.mapIndexed { index, item -> - item.copy(fileStem = onPackExpiryFileStem(codeLower, index + 1, items.size)) + val n = index + 1 + item.copy( + fileStem = onPackExpiryFileStem(codeLower, n, items.size), + printItemCode = onPackExpiryPrintCode(item.itemCode, n, items.size), + ) } } else { items @@ -879,7 +891,7 @@ class PlasticBagPrinterService( ONPACK_PRODUCT_BMP_HEIGHT, ) val codeBmp = createMonochromeBitmapFixed( - item.itemCode, + item.printItemCode, ONPACK_CODE_BMP_WIDTH, ONPACK_CODE_BMP_HEIGHT, ) diff --git a/src/test/kotlin/com/ffii/fpsms/modules/jobOrder/service/OnPackExpiryZipStemTest.kt b/src/test/kotlin/com/ffii/fpsms/modules/jobOrder/service/OnPackExpiryZipStemTest.kt index ce88952..99ce7bf 100644 --- a/src/test/kotlin/com/ffii/fpsms/modules/jobOrder/service/OnPackExpiryZipStemTest.kt +++ b/src/test/kotlin/com/ffii/fpsms/modules/jobOrder/service/OnPackExpiryZipStemTest.kt @@ -8,13 +8,21 @@ import org.junit.jupiter.api.Test class OnPackExpiryZipStemTest { @Test - fun expiry_file_stem_suffixes_from_second_job_only() { + fun expiry_file_stem_keeps_first_as_plain_item_code() { assertEquals("pp2211", PlasticBagPrinterService.onPackExpiryFileStem("pp2211", 1, 1)) assertEquals("pp2211", PlasticBagPrinterService.onPackExpiryFileStem("pp2211", 1, 2)) assertEquals("pp2211-2", PlasticBagPrinterService.onPackExpiryFileStem("pp2211", 2, 2)) assertEquals("pp2211-3", PlasticBagPrinterService.onPackExpiryFileStem("pp2211", 3, 3)) } + @Test + fun expiry_print_code_shows_dash_one_on_first_bag_when_multiple() { + assertEquals("PP2211", PlasticBagPrinterService.onPackExpiryPrintCode("PP2211", 1, 1)) + assertEquals("PP2211-1", PlasticBagPrinterService.onPackExpiryPrintCode("pp2211", 1, 2)) + assertEquals("PP2211-2", PlasticBagPrinterService.onPackExpiryPrintCode("PP2211", 2, 2)) + assertEquals("PP2211-3", PlasticBagPrinterService.onPackExpiryPrintCode("PP2211", 3, 3)) + } + @Test fun export_job_orders_sort_by_job_order_code_then_id() { val jo10 = JobOrder().apply { id = 10L; code = "JO-002" }