Procházet zdrojové kódy

成品出倉執貨時 標籤列印時頁數顯示空白

production
B.E.N.S.O.N před 6 dny
rodič
revize
172d32f613
4 změnil soubory, kde provedl 37 přidání a 84 odebrání
  1. +32
    -81
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoWorkbenchMainService.kt
  2. +1
    -0
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDNLabelsRequest.kt
  3. +2
    -1
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDNLabelsRequest.kt
  4. +2
    -2
      src/main/resources/DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml

+ 32
- 81
src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoWorkbenchMainService.kt Zobrazit soubor

@@ -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.bag.web.model.CreateBagLotLineRequest
import com.ffii.fpsms.modules.common.CodeGenerator import com.ffii.fpsms.modules.common.CodeGenerator
import com.ffii.fpsms.modules.deliveryOrder.entity.DeliveryOrderRepository 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.DoPickOrderLineRecord
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecordRepository import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecordRepository
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRepository import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRepository
@@ -131,7 +130,6 @@ open class DoWorkbenchMainService(
private val printerService: PrinterService, private val printerService: PrinterService,
private val itemsRepository: ItemsRepository, private val itemsRepository: ItemsRepository,
private val transactionManager: PlatformTransactionManager, private val transactionManager: PlatformTransactionManager,
private val doReplenishmentService: DoReplenishmentService,
) { ) {
@PersistenceContext @PersistenceContext
private lateinit var entityManager: EntityManager private lateinit var entityManager: EntityManager
@@ -670,7 +668,13 @@ return MessageResponse(
"4/F" -> "4/F" "4/F" -> "4/F"
else -> storeId 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 = """ val sql = """
SELECT SELECT
dop.truckDepartureTime AS truckDepartureTime, dop.truckDepartureTime AS truckDepartureTime,
@@ -1064,7 +1068,6 @@ return MessageResponse(
dop.deliveryNoteCode AS deliveryNoteCode, dop.deliveryNoteCode AS deliveryNoteCode,
dop.cartonQty AS cartonQty, dop.cartonQty AS cartonQty,
dop.handlerName AS handlerName, dop.handlerName AS handlerName,
dop.releaseType AS releaseType,
GROUP_CONCAT(DISTINCT po.id ORDER BY po.id SEPARATOR ',') AS pickOrderIdsStr, 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 po.code ORDER BY po.code SEPARATOR ',') AS pickOrderCodesStr,
GROUP_CONCAT(DISTINCT d.id ORDER BY d.id SEPARATOR ',') AS deliveryOrderIdsStr, GROUP_CONCAT(DISTINCT d.id ORDER BY d.id SEPARATOR ',') AS deliveryOrderIdsStr,
@@ -1183,7 +1186,6 @@ return MessageResponse(
shopAddress = null, shopAddress = null,
fgPickOrders = emptyList<FgPickOrderSummary>(), fgPickOrders = emptyList<FgPickOrderSummary>(),
handlerName = str(row, "handlerName"), handlerName = str(row, "handlerName"),
releaseType = str(row, "releaseType"),
) )
} }
} }
@@ -1217,7 +1219,6 @@ return MessageResponse(
dop.deliveryNoteCode AS deliveryNoteCode, dop.deliveryNoteCode AS deliveryNoteCode,
dop.cartonQty AS cartonQty, dop.cartonQty AS cartonQty,
dop.handlerName AS handlerName, dop.handlerName AS handlerName,
dop.releaseType AS releaseType,
GROUP_CONCAT(DISTINCT po.id ORDER BY po.id SEPARATOR ',') AS pickOrderIdsStr, 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 po.code ORDER BY po.code SEPARATOR ',') AS pickOrderCodesStr,
GROUP_CONCAT(DISTINCT d.id ORDER BY d.id SEPARATOR ',') AS deliveryOrderIdsStr, GROUP_CONCAT(DISTINCT d.id ORDER BY d.id SEPARATOR ',') AS deliveryOrderIdsStr,
@@ -1335,7 +1336,6 @@ return MessageResponse(
shopAddress = null, shopAddress = null,
fgPickOrders = emptyList<FgPickOrderSummary>(), fgPickOrders = emptyList<FgPickOrderSummary>(),
handlerName = str(row, "handlerName"), handlerName = str(row, "handlerName"),
releaseType = str(row, "releaseType"),
) )
} }
} }
@@ -1681,7 +1681,9 @@ return MessageResponse(
params["shopPat"] = "%${shopName.trim()}%" params["shopPat"] = "%${shopName.trim()}%"
} }
val rtNorm = releaseTypeFilter?.trim()?.lowercase().orEmpty() 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 ") sqlBuilder.append(" ORDER BY dop.requiredDeliveryDate, dop.truckDepartureTime, dop.truckLanceCode, dop.id ")
val rows: List<Map<String, Any?>> = try { val rows: List<Map<String, Any?>> = try {
jdbcDao.queryForList(sqlBuilder.toString(), params) jdbcDao.queryForList(sqlBuilder.toString(), params)
@@ -1765,9 +1767,7 @@ return MessageResponse(
dop.truckDepartureTime as truck_departure_time, dop.truckDepartureTime as truck_departure_time,
dop.shopCode as ShopCode, dop.shopCode as ShopCode,
dop.shopName as ShopName, 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 FROM fpsmsdb.delivery_order_pick_order dop
WHERE dop.handledBy = :userId WHERE dop.handledBy = :userId


@@ -1794,7 +1794,7 @@ return MessageResponse(
if (doPickOrderInfo == null) { if (doPickOrderInfo == null) {
println("❌ No delivery_order_pick_order found for workbench user $userId") println("❌ No delivery_order_pick_order found for workbench user $userId")
val totalMs = (System.nanoTime() - wallStartNs) / 1_000_000 val totalMs = (System.nanoTime() - wallStartNs) / 1_000_000
log. info(
log.info(
"workbench all-lots-hierarchical-workbench timing: userId={} totalMs={} detail={}", "workbench all-lots-hierarchical-workbench timing: userId={} totalMs={} detail={}",
userId, userId,
totalMs, totalMs,
@@ -1896,8 +1896,7 @@ return MessageResponse(
dop.truckDepartureTime as truck_departure_time, dop.truckDepartureTime as truck_departure_time,
dop.shopCode as ShopCode, dop.shopCode as ShopCode,
dop.shopName as ShopName, dop.shopName as ShopName,
dop.ticketStatus as doTicketStatus,
dop.releaseType as release_type
dop.ticketStatus as doTicketStatus
FROM fpsmsdb.delivery_order_pick_order dop FROM fpsmsdb.delivery_order_pick_order dop
WHERE dop.id = :dopoId WHERE dop.id = :dopoId
AND dop.deleted = 0 AND dop.deleted = 0
@@ -2372,7 +2371,6 @@ return MessageResponse(
val changed = pickOrderLineRepository.markCompletedIfNotCompleted(pickOrderLineId) val changed = pickOrderLineRepository.markCompletedIfNotCompleted(pickOrderLineId)
if (changed > 0) { if (changed > 0) {
pickOrderRepository.incrementSubmittedLines(poId) pickOrderRepository.incrementSubmittedLines(poId)
doReplenishmentService.completeByPickOrderLineId(pickOrderLineId)
} }
} }


@@ -2495,7 +2493,6 @@ return MessageResponse(
pickOrderLineRepository.save( pickOrderLineRepository.save(
pol.apply { this.status = PickOrderLineStatus.COMPLETED }, 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> { open fun exportDeliveryNoteWorkbench(request: ExportDeliveryNoteRequest): Map<String, Any> {
val DELIVERYNOTE_PDF = "DeliveryNote/DeliveryNotePDF.jrxml" val DELIVERYNOTE_PDF = "DeliveryNote/DeliveryNotePDF.jrxml"
val resource = ClassPathResource(DELIVERYNOTE_PDF) val resource = ClassPathResource(DELIVERYNOTE_PDF)
@@ -2763,13 +2745,6 @@ return MessageResponse(
emptyMap() 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 -> sortedLines.forEach { row ->
fields.add( fields.add(
deliveryOrderService.buildDeliveryNotePdfLineField( deliveryOrderService.buildDeliveryNotePdfLineField(
@@ -2781,38 +2756,6 @@ return MessageResponse(
stockOutLinesByPickOrderLineId = stockOutLinesByPickOrderLineId, stockOutLinesByPickOrderLineId = stockOutLinesByPickOrderLineId,
illById = illById, illById = illById,
itemsById = itemsById, 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["deliveryNoteCodeTitle"] = "送貨單編號:"
params["deliveryNoteCode"] = ctx.header.deliveryNoteCode ?: "" params["deliveryNoteCode"] = ctx.header.deliveryNoteCode ?: ""
params["numOfCarton"] = request.numOfCarton.toString().takeUnless { it == "0" } ?: "" 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["shopAddress"] = deliveryNoteInfo[0].shopAddress ?: ""
params["deliveryDate"] = ctx.header.requiredDeliveryDate?.format(DateTimeFormatter.ISO_LOCAL_DATE) params["deliveryDate"] = ctx.header.requiredDeliveryDate?.format(DateTimeFormatter.ISO_LOCAL_DATE)
?: deliveryNoteInfo[0].estimatedArrivalDate?.format(DateTimeFormatter.ISO_LOCAL_DATE) ?: deliveryNoteInfo[0].estimatedArrivalDate?.format(DateTimeFormatter.ISO_LOCAL_DATE)
?: "" ?: ""
params["truckNo"] = ctx.header.truckLanceCode ?: "" 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"] = "" params["loadingSequence"] = ""


return mapOf( return mapOf(
@@ -2850,6 +2790,7 @@ return MessageResponse(
ExportDNLabelsRequest( ExportDNLabelsRequest(
doPickOrderId = request.doPickOrderId, doPickOrderId = request.doPickOrderId,
numOfCarton = request.numOfCarton, 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 { } finally {
//tempPdfFile.delete() //tempPdfFile.delete()
} }
@@ -2916,13 +2859,21 @@ return MessageResponse(


val params = workbenchCartonLabelParams(ctx, cartonLabelInfo) val params = workbenchCartonLabelParams(ctx, cartonLabelInfo)
val fields = mutableListOf<MutableMap<String, Any>>() val fields = mutableListOf<MutableMap<String, Any>>()
val blankCartonNumber = request.blankCartonNumber == true


for (cartonNumber in 1..request.numOfCarton) { for (cartonNumber in 1..request.numOfCarton) {
fields.add( 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>,
) )
} }




+ 1
- 0
src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/ExportDNLabelsRequest.kt Zobrazit soubor

@@ -3,4 +3,5 @@ package com.ffii.fpsms.modules.deliveryOrder.web.models
data class ExportDNLabelsRequest ( data class ExportDNLabelsRequest (
val doPickOrderId: Long, val doPickOrderId: Long,
val numOfCarton: Int, val numOfCarton: Int,
val blankCartonNumber: Boolean? = false,
) )

+ 2
- 1
src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/models/PrintDNLabelsRequest.kt Zobrazit soubor

@@ -4,5 +4,6 @@ data class PrintDNLabelsRequest (
val doPickOrderId: Long, val doPickOrderId: Long,
val printerId: Long, val printerId: Long,
val printQty: Int?, val printQty: Int?,
val numOfCarton: Int
val numOfCarton: Int,
val blankCartonNumber: Boolean? = false,
) )

+ 2
- 2
src/main/resources/DeliveryNote/DeliveryNoteCartonLabelsPDF.jrxml Zobrazit soubor

@@ -147,7 +147,7 @@
</textElement> </textElement>
<text><![CDATA[ 箱(蛋類除外)]]></text> <text><![CDATA[ 箱(蛋類除外)]]></text>
</staticText> </staticText>
<textField>
<textField isBlankWhenNull="true">
<reportElement x="155" y="106" width="40" height="30" uuid="dab335a5-e253-498c-a9bf-b9707d8e1099"> <reportElement x="155" y="106" width="40" height="30" uuid="dab335a5-e253-498c-a9bf-b9707d8e1099">
<property name="com.jaspersoft.studio.unit.width" value="px"/> <property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/> <property name="com.jaspersoft.studio.unit.height" value="px"/>
@@ -157,7 +157,7 @@
</textElement> </textElement>
<textFieldExpression><![CDATA[$F{cartonIndex}]]></textFieldExpression> <textFieldExpression><![CDATA[$F{cartonIndex}]]></textFieldExpression>
</textField> </textField>
<textField evaluationTime="Report">
<textField evaluationTime="Report" isBlankWhenNull="true">
<reportElement x="230" y="106" width="40" height="30" uuid="66d50bad-7b39-49c1-b127-4d763133ee0c"> <reportElement x="230" y="106" width="40" height="30" uuid="66d50bad-7b39-49c1-b127-4d763133ee0c">
<property name="com.jaspersoft.studio.unit.width" value="px"/> <property name="com.jaspersoft.studio.unit.width" value="px"/>
<property name="com.jaspersoft.studio.unit.height" value="px"/> <property name="com.jaspersoft.studio.unit.height" value="px"/>


Načítá se…
Zrušit
Uložit