| @@ -4,6 +4,7 @@ import com.ffii.fpsms.modules.jobOrder.web.model.LaserBag2AutoSendReport | |||||
| import com.ffii.fpsms.modules.jobOrder.web.model.LaserBag2JobSendResult | import com.ffii.fpsms.modules.jobOrder.web.model.LaserBag2JobSendResult | ||||
| import com.ffii.fpsms.modules.jobOrder.web.model.LaserBag2SendRequest | import com.ffii.fpsms.modules.jobOrder.web.model.LaserBag2SendRequest | ||||
| import org.slf4j.LoggerFactory | import org.slf4j.LoggerFactory | ||||
| import org.springframework.beans.factory.annotation.Value | |||||
| import org.springframework.stereotype.Service | import org.springframework.stereotype.Service | ||||
| import java.time.LocalDate | import java.time.LocalDate | ||||
| @@ -12,25 +13,22 @@ import java.time.LocalDate | |||||
| * ([LASER_PRINT.itemCodes]), then sends Bag2-style laser TCP payloads via [PlasticBagPrinterService.sendLaserBag2Job], | * ([LASER_PRINT.itemCodes]), then sends Bag2-style laser TCP payloads via [PlasticBagPrinterService.sendLaserBag2Job], | ||||
| * which uses [com.ffii.fpsms.modules.common.SettingNames.LASER_PRINT_HOST] / [LASER_PRINT_PORT] from the database. | * which uses [com.ffii.fpsms.modules.common.SettingNames.LASER_PRINT_HOST] / [LASER_PRINT_PORT] from the database. | ||||
| * | * | ||||
| * Matches /laserPrint row click: [sendsPerJob] rounds with [delayBetweenSendsMs] between rounds (default 3 × 3s like the frontend). | |||||
| * [sendsPerJob] TCP rounds per job order (default from `laser.bag2.auto-send.sends-per-job`, typically 1). | |||||
| * [sendLaserBag2Job] may still retry once internally on failure. | |||||
| */ | */ | ||||
| @Service | @Service | ||||
| class LaserBag2AutoSendService( | class LaserBag2AutoSendService( | ||||
| private val plasticBagPrinterService: PlasticBagPrinterService, | private val plasticBagPrinterService: PlasticBagPrinterService, | ||||
| @Value("\${laser.bag2.auto-send.sends-per-job:1}") private val defaultSendsPerJob: Int, | |||||
| @Value("\${laser.bag2.auto-send.delay-between-sends-ms:3000}") private val defaultDelayBetweenSendsMs: Long, | |||||
| ) { | ) { | ||||
| private val logger = LoggerFactory.getLogger(javaClass) | private val logger = LoggerFactory.getLogger(javaClass) | ||||
| companion object { | |||||
| /** Same as LaserPrint page (3 sends per row click). */ | |||||
| const val DEFAULT_SENDS_PER_JOB = 3 | |||||
| const val DEFAULT_DELAY_BETWEEN_SENDS_MS = 3000L | |||||
| } | |||||
| fun runAutoSend( | fun runAutoSend( | ||||
| planStart: LocalDate, | planStart: LocalDate, | ||||
| limitPerRun: Int = 0, | limitPerRun: Int = 0, | ||||
| sendsPerJob: Int = DEFAULT_SENDS_PER_JOB, | |||||
| delayBetweenSendsMs: Long = DEFAULT_DELAY_BETWEEN_SENDS_MS, | |||||
| sendsPerJob: Int = defaultSendsPerJob, | |||||
| delayBetweenSendsMs: Long = defaultDelayBetweenSendsMs, | |||||
| ): LaserBag2AutoSendReport { | ): LaserBag2AutoSendReport { | ||||
| val (reachable, laserIp, laserPort) = plasticBagPrinterService.probeLaserBag2Tcp() | val (reachable, laserIp, laserPort) = plasticBagPrinterService.probeLaserBag2Tcp() | ||||
| if (!reachable) { | if (!reachable) { | ||||
| @@ -297,7 +297,7 @@ class PlasticBagPrinterService( | |||||
| val codeStr = (itemCode ?: "").trim().replace(";", ",") | val codeStr = (itemCode ?: "").trim().replace(";", ",") | ||||
| val nameStr = (itemName ?: "").trim().replace(";", ",") | val nameStr = (itemName ?: "").trim().replace(";", ",") | ||||
| val payload = if (itemId != null && stockInLineId != null) { | val payload = if (itemId != null && stockInLineId != null) { | ||||
| "{\"itemID\":$itemId,\"stockInLineId\":$stockInLineId};$codeStr;$nameStr;;" | |||||
| "{\"itemId\":$itemId,\"stockInLineId\":$stockInLineId};$codeStr;$nameStr;;" | |||||
| } else { | } else { | ||||
| "0;$codeStr;$nameStr;;" | "0;$codeStr;$nameStr;;" | ||||
| } | } | ||||
| @@ -50,7 +50,7 @@ class PlasticBagPrinterController( | |||||
| } | } | ||||
| /** | /** | ||||
| * Bag2.py laser TCP protocol: `{"itemID":n,"stockInLineId":m};code;name;;` or `0;code;name;;` | |||||
| * Bag2.py laser TCP protocol: `{"itemId":n,"stockInLineId":m};code;name;;` or `0;code;name;;` | |||||
| */ | */ | ||||
| @PostMapping("/print-laser-bag2") | @PostMapping("/print-laser-bag2") | ||||
| fun printLaserBag2(@RequestBody request: LaserBag2SendRequest): ResponseEntity<LaserBag2SendResponse> { | fun printLaserBag2(@RequestBody request: LaserBag2SendRequest): ResponseEntity<LaserBag2SendResponse> { | ||||
| @@ -64,7 +64,7 @@ class PlasticBagPrinterController( | |||||
| /** | /** | ||||
| * Same as /laserPrint row workflow: list job orders for [planStart] filtered by LASER_PRINT.itemCodes, | * Same as /laserPrint row workflow: list job orders for [planStart] filtered by LASER_PRINT.itemCodes, | ||||
| * then for each (up to [limitPerRun], 0 = all) send laser TCP commands using LASER_PRINT.host/port (3× with 3s gap per job). | |||||
| * then for each (up to [limitPerRun], 0 = all) send laser TCP using LASER_PRINT.host/port (`laser.bag2.auto-send.sends-per-job` rounds per job). | |||||
| * For manual runs from /testing; scheduler uses [LaserBag2AutoSendScheduler]. | * For manual runs from /testing; scheduler uses [LaserBag2AutoSendScheduler]. | ||||
| */ | */ | ||||
| @PostMapping("/laser-bag2-auto-send") | @PostMapping("/laser-bag2-auto-send") | ||||
| @@ -39,6 +39,7 @@ laser: | |||||
| bag2: | bag2: | ||||
| auto-send: | auto-send: | ||||
| enabled: true | enabled: true | ||||
| sends-per-job: 1 | |||||
| m18: | m18: | ||||
| config: | config: | ||||
| @@ -62,12 +62,15 @@ ngpcl: | |||||
| # Laser Bag2 (/laserPrint) auto-send: same as listing + TCP send using DB LASER_PRINT.host / port / itemCodes. | # Laser Bag2 (/laserPrint) auto-send: same as listing + TCP send using DB LASER_PRINT.host / port / itemCodes. | ||||
| # Scheduler is off by default. limit-per-run: max job orders per tick (1 = first matching only); 0 = all matches (heavy). | # Scheduler is off by default. limit-per-run: max job orders per tick (1 = first matching only); 0 = all matches (heavy). | ||||
| # sends-per-job: TCP payloads per job order per tick (1 = single send; each send may retry once on failure inside sendLaserBag2Job). | |||||
| laser: | laser: | ||||
| bag2: | bag2: | ||||
| auto-send: | auto-send: | ||||
| enabled: false | enabled: false | ||||
| interval-ms: 60000 | interval-ms: 60000 | ||||
| limit-per-run: 1 | limit-per-run: 1 | ||||
| sends-per-job: 1 | |||||
| delay-between-sends-ms: 3000 | |||||
| bom: | bom: | ||||
| import: | import: | ||||