|
|
|
@@ -7,7 +7,6 @@ import com.ffii.fpsms.modules.bag.service.BagService |
|
|
|
import com.ffii.fpsms.modules.bag.web.model.CreateBagLotLineRequest |
|
|
|
import com.ffii.fpsms.modules.common.CodeGenerator |
|
|
|
import com.ffii.fpsms.modules.deliveryOrder.entity.DeliveryOrderRepository |
|
|
|
import com.ffii.fpsms.modules.deliveryOrder.entity.DoReplenishment |
|
|
|
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecord |
|
|
|
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecordRepository |
|
|
|
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRepository |
|
|
|
@@ -131,7 +130,6 @@ open class DoWorkbenchMainService( |
|
|
|
private val printerService: PrinterService, |
|
|
|
private val itemsRepository: ItemsRepository, |
|
|
|
private val transactionManager: PlatformTransactionManager, |
|
|
|
private val doReplenishmentService: DoReplenishmentService, |
|
|
|
) { |
|
|
|
@PersistenceContext |
|
|
|
private lateinit var entityManager: EntityManager |
|
|
|
@@ -670,7 +668,13 @@ return MessageResponse( |
|
|
|
"4/F" -> "4/F" |
|
|
|
else -> storeId |
|
|
|
} |
|
|
|
val releaseFilterClause = WorkbenchReleaseTypeSupport.summaryFilterSql(releaseType) |
|
|
|
val rt = releaseType.lowercase() |
|
|
|
val releaseFilterClause = when (rt) { |
|
|
|
"batch" -> " AND LOWER(COALESCE(dop.releaseType, '')) = 'batch' " |
|
|
|
"single" -> " AND LOWER(COALESCE(dop.releaseType, '')) = 'single' " |
|
|
|
"isExtra" -> " AND LOWER(COALESCE(dop.releaseType, '')) = 'isExtra' " |
|
|
|
else -> "" |
|
|
|
} |
|
|
|
val sql = """ |
|
|
|
SELECT |
|
|
|
dop.truckDepartureTime AS truckDepartureTime, |
|
|
|
@@ -1064,7 +1068,6 @@ return MessageResponse( |
|
|
|
dop.deliveryNoteCode AS deliveryNoteCode, |
|
|
|
dop.cartonQty AS cartonQty, |
|
|
|
dop.handlerName AS handlerName, |
|
|
|
dop.releaseType AS releaseType, |
|
|
|
GROUP_CONCAT(DISTINCT po.id ORDER BY po.id SEPARATOR ',') AS pickOrderIdsStr, |
|
|
|
GROUP_CONCAT(DISTINCT po.code ORDER BY po.code SEPARATOR ',') AS pickOrderCodesStr, |
|
|
|
GROUP_CONCAT(DISTINCT d.id ORDER BY d.id SEPARATOR ',') AS deliveryOrderIdsStr, |
|
|
|
@@ -1183,7 +1186,6 @@ return MessageResponse( |
|
|
|
shopAddress = null, |
|
|
|
fgPickOrders = emptyList<FgPickOrderSummary>(), |
|
|
|
handlerName = str(row, "handlerName"), |
|
|
|
releaseType = str(row, "releaseType"), |
|
|
|
) |
|
|
|
} |
|
|
|
} |
|
|
|
@@ -1217,7 +1219,6 @@ return MessageResponse( |
|
|
|
dop.deliveryNoteCode AS deliveryNoteCode, |
|
|
|
dop.cartonQty AS cartonQty, |
|
|
|
dop.handlerName AS handlerName, |
|
|
|
dop.releaseType AS releaseType, |
|
|
|
GROUP_CONCAT(DISTINCT po.id ORDER BY po.id SEPARATOR ',') AS pickOrderIdsStr, |
|
|
|
GROUP_CONCAT(DISTINCT po.code ORDER BY po.code SEPARATOR ',') AS pickOrderCodesStr, |
|
|
|
GROUP_CONCAT(DISTINCT d.id ORDER BY d.id SEPARATOR ',') AS deliveryOrderIdsStr, |
|
|
|
@@ -1335,7 +1336,6 @@ return MessageResponse( |
|
|
|
shopAddress = null, |
|
|
|
fgPickOrders = emptyList<FgPickOrderSummary>(), |
|
|
|
handlerName = str(row, "handlerName"), |
|
|
|
releaseType = str(row, "releaseType"), |
|
|
|
) |
|
|
|
} |
|
|
|
} |
|
|
|
@@ -1681,7 +1681,9 @@ return MessageResponse( |
|
|
|
params["shopPat"] = "%${shopName.trim()}%" |
|
|
|
} |
|
|
|
val rtNorm = releaseTypeFilter?.trim()?.lowercase().orEmpty() |
|
|
|
sqlBuilder.append(WorkbenchReleaseTypeSupport.summaryFilterSql(rtNorm)) |
|
|
|
if (rtNorm == "isExtra") { |
|
|
|
sqlBuilder.append(" AND LOWER(COALESCE(dop.releaseType, '')) = 'isExtra' ") |
|
|
|
} |
|
|
|
sqlBuilder.append(" ORDER BY dop.requiredDeliveryDate, dop.truckDepartureTime, dop.truckLanceCode, dop.id ") |
|
|
|
val rows: List<Map<String, Any?>> = try { |
|
|
|
jdbcDao.queryForList(sqlBuilder.toString(), params) |
|
|
|
@@ -1765,9 +1767,7 @@ return MessageResponse( |
|
|
|
dop.truckDepartureTime as truck_departure_time, |
|
|
|
dop.shopCode as ShopCode, |
|
|
|
dop.shopName as ShopName, |
|
|
|
dop.ticketStatus as doTicketStatus, |
|
|
|
dop.requiredDeliveryDate as required_delivery_date, |
|
|
|
dop.releaseType as release_type |
|
|
|
dop.ticketStatus as doTicketStatus |
|
|
|
FROM fpsmsdb.delivery_order_pick_order dop |
|
|
|
WHERE dop.handledBy = :userId |
|
|
|
|
|
|
|
@@ -1794,7 +1794,7 @@ return MessageResponse( |
|
|
|
if (doPickOrderInfo == null) { |
|
|
|
println("❌ No delivery_order_pick_order found for workbench user $userId") |
|
|
|
val totalMs = (System.nanoTime() - wallStartNs) / 1_000_000 |
|
|
|
log. info( |
|
|
|
log.info( |
|
|
|
"workbench all-lots-hierarchical-workbench timing: userId={} totalMs={} detail={}", |
|
|
|
userId, |
|
|
|
totalMs, |
|
|
|
@@ -1896,8 +1896,7 @@ return MessageResponse( |
|
|
|
dop.truckDepartureTime as truck_departure_time, |
|
|
|
dop.shopCode as ShopCode, |
|
|
|
dop.shopName as ShopName, |
|
|
|
dop.ticketStatus as doTicketStatus, |
|
|
|
dop.releaseType as release_type |
|
|
|
dop.ticketStatus as doTicketStatus |
|
|
|
FROM fpsmsdb.delivery_order_pick_order dop |
|
|
|
WHERE dop.id = :dopoId |
|
|
|
AND dop.deleted = 0 |
|
|
|
@@ -2372,7 +2371,6 @@ return MessageResponse( |
|
|
|
val changed = pickOrderLineRepository.markCompletedIfNotCompleted(pickOrderLineId) |
|
|
|
if (changed > 0) { |
|
|
|
pickOrderRepository.incrementSubmittedLines(poId) |
|
|
|
doReplenishmentService.completeByPickOrderLineId(pickOrderLineId) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@@ -2495,7 +2493,6 @@ return MessageResponse( |
|
|
|
pickOrderLineRepository.save( |
|
|
|
pol.apply { this.status = PickOrderLineStatus.COMPLETED }, |
|
|
|
) |
|
|
|
doReplenishmentService.completeByPickOrderLineId(pickOrderLineId) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@@ -2683,21 +2680,6 @@ return MessageResponse( |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
private fun buildDeliveryOrderCodeAll(deliveryNoteCode: String): String { |
|
|
|
val sql = """ |
|
|
|
SELECT DISTINCT do.code AS code |
|
|
|
FROM delivery_order_pick_order dop |
|
|
|
JOIN pick_order po ON po.deliveryOrderPickOrderId = dop.id AND po.deleted = 0 |
|
|
|
JOIN delivery_order do ON do.id = po.doId |
|
|
|
WHERE dop.deliveryNoteCode = :deliveryNoteCode |
|
|
|
AND dop.deleted = 0 |
|
|
|
ORDER BY do.code |
|
|
|
""".trimIndent() |
|
|
|
val codes = jdbcDao.queryForList(sql, mapOf("deliveryNoteCode" to deliveryNoteCode)) |
|
|
|
.mapNotNull { row -> row["code"]?.toString() } |
|
|
|
return deliveryOrderService.formatDoCodesPlain(codes) |
|
|
|
} |
|
|
|
|
|
|
|
open fun exportDeliveryNoteWorkbench(request: ExportDeliveryNoteRequest): Map<String, Any> { |
|
|
|
val DELIVERYNOTE_PDF = "DeliveryNote/DeliveryNotePDF.jrxml" |
|
|
|
val resource = ClassPathResource(DELIVERYNOTE_PDF) |
|
|
|
@@ -2763,13 +2745,6 @@ return MessageResponse( |
|
|
|
emptyMap() |
|
|
|
} |
|
|
|
|
|
|
|
val deliveryOrders = deliveryOrderRepository.findAllById(ctx.deliveryOrderIds) |
|
|
|
val deliveryOrderCodeById = deliveryOrders.associate { it.id!! to (it.code ?: "") } |
|
|
|
val isExtraByDoId = deliveryOrders.associate { it.id!! to it.isExtra } |
|
|
|
val headerIsMerge = ctx.header.ticketNo?.startsWith("TI-M-") == true |
|
|
|
val headerTicketNo = ctx.header.ticketNo |
|
|
|
val replenishPdfIndex = doReplenishmentService.buildReplenishPdfIndex(ctx.deliveryOrderIds) |
|
|
|
|
|
|
|
sortedLines.forEach { row -> |
|
|
|
fields.add( |
|
|
|
deliveryOrderService.buildDeliveryNotePdfLineField( |
|
|
|
@@ -2781,38 +2756,6 @@ return MessageResponse( |
|
|
|
stockOutLinesByPickOrderLineId = stockOutLinesByPickOrderLineId, |
|
|
|
illById = illById, |
|
|
|
itemsById = itemsById, |
|
|
|
deliveryOrderCodeById = deliveryOrderCodeById, |
|
|
|
isExtraByDoId = isExtraByDoId, |
|
|
|
headerTicketNo = headerTicketNo, |
|
|
|
headerIsMerge = headerIsMerge, |
|
|
|
replenishPdfIndex = replenishPdfIndex, |
|
|
|
), |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
val replenishmentOnlyRows = doReplenishmentService.replenishmentsWithoutDeliveryOrderLine( |
|
|
|
ctx.deliveryOrderIds, |
|
|
|
exportLines, |
|
|
|
) |
|
|
|
replenishmentOnlyRows.sortedWith( |
|
|
|
compareBy<DoReplenishment>( |
|
|
|
{ it.targetDoId }, |
|
|
|
{ it.itemNo }, |
|
|
|
{ it.code }, |
|
|
|
), |
|
|
|
).forEach { replenishment -> |
|
|
|
fields.add( |
|
|
|
deliveryOrderService.buildDeliveryNotePdfLineFieldForReplenishment( |
|
|
|
replenishment = replenishment, |
|
|
|
sequenceNumber = fields.size + 1, |
|
|
|
pickOrderLines = pickOrderLines, |
|
|
|
stockOutLinesByPickOrderLineId = stockOutLinesByPickOrderLineId, |
|
|
|
illById = illById, |
|
|
|
itemsById = itemsById, |
|
|
|
deliveryOrderCodeById = deliveryOrderCodeById, |
|
|
|
isExtraByDoId = isExtraByDoId, |
|
|
|
headerTicketNo = headerTicketNo, |
|
|
|
headerIsMerge = headerIsMerge, |
|
|
|
), |
|
|
|
) |
|
|
|
} |
|
|
|
@@ -2823,17 +2766,14 @@ return MessageResponse( |
|
|
|
params["deliveryNoteCodeTitle"] = "送貨單編號:" |
|
|
|
params["deliveryNoteCode"] = ctx.header.deliveryNoteCode ?: "" |
|
|
|
params["numOfCarton"] = request.numOfCarton.toString().takeUnless { it == "0" } ?: "" |
|
|
|
params["shopName"] = deliveryOrderService.formatShopNameForDeliveryNote( |
|
|
|
ctx.header.shopName ?: deliveryNoteInfo[0].shopName ?: "", |
|
|
|
) |
|
|
|
params["shopName"] = ctx.header.shopName ?: deliveryNoteInfo[0].shopName ?: "" |
|
|
|
params["shopAddress"] = deliveryNoteInfo[0].shopAddress ?: "" |
|
|
|
params["deliveryDate"] = ctx.header.requiredDeliveryDate?.format(DateTimeFormatter.ISO_LOCAL_DATE) |
|
|
|
?: deliveryNoteInfo[0].estimatedArrivalDate?.format(DateTimeFormatter.ISO_LOCAL_DATE) |
|
|
|
?: "" |
|
|
|
params["truckNo"] = ctx.header.truckLanceCode ?: "" |
|
|
|
params["deliveryOrderCodeAll"] = ctx.header.deliveryNoteCode?.let(::buildDeliveryOrderCodeAll) |
|
|
|
?.takeIf { it.isNotBlank() } |
|
|
|
?: deliveryOrderService.formatDoCodesPlain(deliveryNoteInfo.map { it.code }) |
|
|
|
params["ShopPurchaseOrderNo"] = deliveryNoteInfo.joinToString(", ") { it.code } |
|
|
|
params["FGPickOrderNo"] = ctx.pickOrderCodes.joinToString(", ") |
|
|
|
params["loadingSequence"] = "" |
|
|
|
|
|
|
|
return mapOf( |
|
|
|
@@ -2850,6 +2790,7 @@ return MessageResponse( |
|
|
|
ExportDNLabelsRequest( |
|
|
|
doPickOrderId = request.doPickOrderId, |
|
|
|
numOfCarton = request.numOfCarton, |
|
|
|
blankCartonNumber = request.blankCartonNumber, |
|
|
|
), |
|
|
|
) |
|
|
|
|
|
|
|
@@ -2870,7 +2811,9 @@ return MessageResponse( |
|
|
|
) |
|
|
|
} |
|
|
|
} |
|
|
|
updateWorkbenchCartonQty(request.doPickOrderId, request.numOfCarton) |
|
|
|
if (request.blankCartonNumber != true) { |
|
|
|
updateWorkbenchCartonQty(request.doPickOrderId, request.numOfCarton) |
|
|
|
} |
|
|
|
} finally { |
|
|
|
//tempPdfFile.delete() |
|
|
|
} |
|
|
|
@@ -2916,13 +2859,21 @@ return MessageResponse( |
|
|
|
|
|
|
|
val params = workbenchCartonLabelParams(ctx, cartonLabelInfo) |
|
|
|
val fields = mutableListOf<MutableMap<String, Any>>() |
|
|
|
val blankCartonNumber = request.blankCartonNumber == true |
|
|
|
|
|
|
|
for (cartonNumber in 1..request.numOfCarton) { |
|
|
|
fields.add( |
|
|
|
mutableMapOf( |
|
|
|
"cartonIndex" to cartonNumber, |
|
|
|
"cartonTotal" to request.numOfCarton, |
|
|
|
) |
|
|
|
if (blankCartonNumber) { |
|
|
|
mutableMapOf<String, Any?>( |
|
|
|
"cartonIndex" to null, |
|
|
|
"cartonTotal" to null, |
|
|
|
) |
|
|
|
} else { |
|
|
|
mutableMapOf( |
|
|
|
"cartonIndex" to cartonNumber, |
|
|
|
"cartonTotal" to request.numOfCarton, |
|
|
|
) |
|
|
|
} as MutableMap<String, Any>, |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
|