package com.ffii.fpsms.py import com.ffii.fpsms.modules.jobOrder.entity.JobOrderRepository import com.ffii.fpsms.py.entity.PyJobOrderPrintSubmit import org.springframework.http.HttpStatus import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import org.springframework.web.server.ResponseStatusException @Service open class PyJobOrderPrintSubmitService( private val repository: PyJobOrderPrintSubmitRepository, private val jobOrderRepository: JobOrderRepository, ) { /** * Cumulative printed qty per job order, split by channel (打袋 / 標籤 / 激光). */ open fun sumPrintedQtyByJobOrderIds(ids: List): Map { if (ids.isEmpty()) return emptyMap() val rows = repository.sumQtyGroupedByJobOrderIdAndChannel(ids) val out = mutableMapOf() for (row in rows) { val jobOrderId = (row[0] as Number).toLong() val channel = (row[1] as String).trim() val qty = (row[2] as Number).toLong() val cur = out.getOrDefault(jobOrderId, PrintedQtyByChannel()) out[jobOrderId] = when (channel) { PyPrintChannel.DATAFLEX -> cur.copy(bagPrintedQty = qty) PyPrintChannel.LABEL -> cur.copy(labelPrintedQty = qty) PyPrintChannel.LASER -> cur.copy(laserPrintedQty = qty) else -> cur } } return out } private fun sumPrintedByJobOrderIdsAndChannel(ids: List, channel: String): Map { if (ids.isEmpty()) return emptyMap() val rows = repository.sumQtyGroupedByJobOrderId(ids, channel) return rows.associate { row -> (row[0] as Number).toLong() to (row[1] as Number).toLong() } } /** * Persist one submit row and return cumulative print total for that job order and channel. */ @Transactional open fun recordPrint(jobOrderId: Long, qty: Int, printChannel: String): PyJobOrderPrintSubmitResponse { if (qty < 1) { throw ResponseStatusException(HttpStatus.BAD_REQUEST, "qty must be at least 1") } val jo = jobOrderRepository.findById(jobOrderId).orElseThrow { ResponseStatusException(HttpStatus.NOT_FOUND, "Job order not found: $jobOrderId") } val row = PyJobOrderPrintSubmit().apply { jobOrder = jo this.qty = qty this.printChannel = printChannel } repository.save(row) val total = sumPrintedByJobOrderIdsAndChannel(listOf(jobOrderId), printChannel)[jobOrderId] ?: qty.toLong() return PyJobOrderPrintSubmitResponse( jobOrderId = jobOrderId, submittedQty = qty, printChannel = printChannel, cumulativeQtyForChannel = total, ) } }