From 02a221cbb499aaac90a811b2414540f46cbb84f7 Mon Sep 17 00:00:00 2001 From: "CANCERYS\\kw093" Date: Mon, 2 Mar 2026 21:06:32 +0800 Subject: [PATCH] update report --- .../report/service/ItemQcFailReportService.kt | 9 ++++- .../modules/report/service/ReportService.kt | 37 +++++++++++++++---- .../service/StockTakeVarianceReportService.kt | 32 +++++++++++++++- 3 files changed, 68 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/ffii/fpsms/modules/report/service/ItemQcFailReportService.kt b/src/main/java/com/ffii/fpsms/modules/report/service/ItemQcFailReportService.kt index e854e30..1fa451e 100644 --- a/src/main/java/com/ffii/fpsms/modules/report/service/ItemQcFailReportService.kt +++ b/src/main/java/com/ffii/fpsms/modules/report/service/ItemQcFailReportService.kt @@ -58,7 +58,10 @@ open class ItemQcFailReportService( COALESCE(qic.description, qi.description, qi.name, '') AS qcDefectCriteria, /* Lot Qty / Defect Qty:按 jrxml 字段类型输出 String */ - TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(COALESCE(sil.acceptedQty, 0), 2))) AS lotQty, + TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(COALESCE( + CASE WHEN sil.purchaseOrderId IS NOT NULL AND iu_purchase.id IS NOT NULL AND iu.id IS NOT NULL + THEN sil.acceptedQty * (iu_purchase.ratioN / NULLIF(iu_purchase.ratioD, 0)) / (iu.ratioN / NULLIF(iu.ratioD, 0)) + ELSE sil.acceptedQty END, 0), 2))) AS lotQty, TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(COALESCE(qr.failQty, 0), 2))) AS defectQty, /* Ref Data (e.g temp):目前库表只有 qc_result.remarks,可先放这里 */ @@ -86,6 +89,10 @@ open class ItemQcFailReportService( AND iu.deleted = 0 LEFT JOIN uom_conversion uc ON iu.uomId = uc.id + LEFT JOIN item_uom iu_purchase + ON it.id = iu_purchase.itemId + AND iu_purchase.purchaseUnit = 1 + AND iu_purchase.deleted = 0 LEFT JOIN inventory_lot il ON sil.inventoryLotId = il.id AND il.deleted = 0 diff --git a/src/main/java/com/ffii/fpsms/modules/report/service/ReportService.kt b/src/main/java/com/ffii/fpsms/modules/report/service/ReportService.kt index 5d4a8b3..02e0946 100644 --- a/src/main/java/com/ffii/fpsms/modules/report/service/ReportService.kt +++ b/src/main/java/com/ffii/fpsms/modules/report/service/ReportService.kt @@ -706,6 +706,7 @@ fun searchMaterialStockOutTraceabilityReport( } else "" val sql = """ + SELECT COALESCE(it.code, '') as itemNo, COALESCE(it.name, '') as itemName, @@ -714,13 +715,25 @@ fun searchMaterialStockOutTraceabilityReport( COALESCE(sil.lotNo, il.lotNo, '') as lotNo, COALESCE(DATE_FORMAT(COALESCE(sil.expiryDate, il.expiryDate), '%Y-%m-%d'), '') as expiryDate, CASE WHEN COALESCE(qr_agg.qcFailed, 0) = 1 THEN '0' - ELSE TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(COALESCE(sil.acceptedQty, 0), 2))) - END as stockInQty, - TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(COALESCE(sil.acceptedQty, 0), 2))) as iqcSampleQty, + ELSE TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(COALESCE( + CASE WHEN sil.purchaseOrderId IS NOT NULL AND iu_purchase.id IS NOT NULL AND iu.id IS NOT NULL + THEN sil.acceptedQty * (iu_purchase.ratioN / NULLIF(iu_purchase.ratioD, 0)) / (iu.ratioN / NULLIF(iu.ratioD, 0)) + ELSE sil.acceptedQty END, 0), 2))) + END as stockInQty, + TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(COALESCE( + CASE WHEN sil.purchaseOrderId IS NOT NULL AND iu_purchase.id IS NOT NULL AND iu.id IS NOT NULL + THEN sil.acceptedQty * (iu_purchase.ratioN / NULLIF(iu_purchase.ratioD, 0)) / (iu.ratioN / NULLIF(iu.ratioD, 0)) + ELSE sil.acceptedQty END, 0), 2))) as iqcSampleQty, TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(COALESCE(qr_agg.failQtySum, 0), 2))) as iqcDefectQty, TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT( - CASE WHEN COALESCE(sil.acceptedQty, 0) > 0 - THEN COALESCE(qr_agg.failQtySum, 0) / sil.acceptedQty * 100 + CASE WHEN COALESCE( + CASE WHEN sil.purchaseOrderId IS NOT NULL AND iu_purchase.id IS NOT NULL AND iu.id IS NOT NULL + THEN sil.acceptedQty * (iu_purchase.ratioN / NULLIF(iu_purchase.ratioD, 0)) / (iu.ratioN / NULLIF(iu.ratioD, 0)) + ELSE sil.acceptedQty END, 0) > 0 + THEN COALESCE(qr_agg.failQtySum, 0) / + (CASE WHEN sil.purchaseOrderId IS NOT NULL AND iu_purchase.id IS NOT NULL AND iu.id IS NOT NULL + THEN sil.acceptedQty * (iu_purchase.ratioN / NULLIF(iu_purchase.ratioD, 0)) / (iu.ratioN / NULLIF(iu.ratioD, 0)) + ELSE sil.acceptedQty END) * 100 ELSE 0 END, 2))) as iqcDefectPercentage, CASE WHEN COALESCE(qr_agg.qcFailed, 0) = 1 THEN '不合格' ELSE '已接受' END as iqcResult, @@ -729,14 +742,24 @@ fun searchMaterialStockOutTraceabilityReport( COALESCE(wh.code, '') as storeLocation, COALESCE(sp_si.code, sp_po.code, '') as supplierID, COALESCE(sp_si.name, sp_po.name, '') as supplierName, - TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(SUM(COALESCE(sil.acceptedQty, 0)) OVER (PARTITION BY it.id), 2))) as totalStockInQty, - TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(SUM(COALESCE(sil.acceptedQty, 0)) OVER (PARTITION BY it.id), 2))) as totalIqcSampleQty + TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(SUM(COALESCE( + CASE WHEN sil.purchaseOrderId IS NOT NULL AND iu_purchase.id IS NOT NULL AND iu.id IS NOT NULL + THEN sil.acceptedQty * (iu_purchase.ratioN / NULLIF(iu_purchase.ratioD, 0)) / (iu.ratioN / NULLIF(iu.ratioD, 0)) + ELSE sil.acceptedQty END, 0)) OVER (PARTITION BY it.id), 2))) as totalStockInQty, + TRIM(TRAILING '.' FROM TRIM(TRAILING '0' FROM FORMAT(SUM(COALESCE( + CASE WHEN sil.purchaseOrderId IS NOT NULL AND iu_purchase.id IS NOT NULL AND iu.id IS NOT NULL + THEN sil.acceptedQty * (iu_purchase.ratioN / NULLIF(iu_purchase.ratioD, 0)) / (iu.ratioN / NULLIF(iu.ratioD, 0)) + ELSE sil.acceptedQty END, 0)) OVER (PARTITION BY it.id), 2))) as totalIqcSampleQty FROM stock_in_line sil LEFT JOIN stock_in si ON sil.stockInId = si.id LEFT JOIN purchase_order po ON sil.purchaseOrderId = po.id LEFT JOIN items it ON sil.itemId = it.id LEFT JOIN item_uom iu ON it.id = iu.itemId AND iu.stockUnit = true LEFT JOIN uom_conversion uc ON iu.uomId = uc.id + LEFT JOIN item_uom iu_purchase + ON it.id = iu_purchase.itemId + AND iu_purchase.purchaseUnit = 1 + AND iu_purchase.deleted = 0 LEFT JOIN inventory_lot il ON sil.inventoryLotId = il.id LEFT JOIN inventory_lot_line ill ON il.id = ill.inventoryLotId LEFT JOIN warehouse wh ON ill.warehouseId = wh.id diff --git a/src/main/java/com/ffii/fpsms/modules/report/service/StockTakeVarianceReportService.kt b/src/main/java/com/ffii/fpsms/modules/report/service/StockTakeVarianceReportService.kt index 55b7b4d..e562305 100644 --- a/src/main/java/com/ffii/fpsms/modules/report/service/StockTakeVarianceReportService.kt +++ b/src/main/java/com/ffii/fpsms/modules/report/service/StockTakeVarianceReportService.kt @@ -119,14 +119,42 @@ WITH latest_str AS ( in_agg AS ( SELECT ill.id AS inventoryLotLineId, - SUM(CASE WHEN DATE(sil.receiptDate) < :fromDate THEN COALESCE(sil.acceptedQty, 0) ELSE 0 END) AS inBefore, - SUM(CASE WHEN DATE(sil.receiptDate) BETWEEN :fromDate AND :toDate THEN COALESCE(sil.acceptedQty, 0) ELSE 0 END) AS inDuring, + SUM(CASE WHEN DATE(sil.receiptDate) < :fromDate THEN + CASE WHEN sil.purchaseOrderId IS NOT NULL + AND iu_purchase.id IS NOT NULL + AND iu_stock.id IS NOT NULL + THEN COALESCE(sil.acceptedQty, 0) * (iu_purchase.ratioN / NULLIF(iu_purchase.ratioD, 0)) / (iu_stock.ratioN / NULLIF(iu_stock.ratioD, 0)) + ELSE COALESCE(sil.acceptedQty, 0) + END + ELSE 0 END) AS inBefore, + SUM(CASE WHEN DATE(sil.receiptDate) BETWEEN :fromDate AND :toDate THEN + CASE WHEN sil.purchaseOrderId IS NOT NULL + AND iu_purchase.id IS NOT NULL + AND iu_stock.id IS NOT NULL + THEN COALESCE(sil.acceptedQty, 0) * (iu_purchase.ratioN / NULLIF(iu_purchase.ratioD, 0)) / (iu_stock.ratioN / NULLIF(iu_stock.ratioD, 0)) + ELSE COALESCE(sil.acceptedQty, 0) + END + ELSE 0 END) AS inDuring, MAX(CASE WHEN sil.receiptDate IS NOT NULL THEN DATE(sil.receiptDate) END) AS lastInDate FROM inventory_lot_line ill + INNER JOIN inventory_lot il + ON ill.inventoryLotId = il.id + AND il.deleted = 0 + INNER JOIN items it + ON il.itemId = it.id + AND it.deleted = 0 LEFT JOIN stock_in_line sil ON sil.inventoryLotLineId = ill.id AND sil.deleted = 0 AND sil.status = 'completed' + LEFT JOIN item_uom iu_purchase + ON it.id = iu_purchase.itemId + AND iu_purchase.purchaseUnit = 1 + AND iu_purchase.deleted = 0 + LEFT JOIN item_uom iu_stock + ON it.id = iu_stock.itemId + AND iu_stock.stockUnit = 1 + AND iu_stock.deleted = 0 WHERE ill.deleted = 0 GROUP BY ill.id ),