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 0a10dc2..5d4a8b3 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 @@ -848,8 +848,39 @@ fun searchMaterialStockOutTraceabilityReport( sl.itemId, COALESCE(il_in.id, il_out.id) AS lotId, SUM(CASE WHEN DATE(sl.date) < :fromDate THEN COALESCE(sl.inQty, 0) - COALESCE(sl.outQty, 0) ELSE 0 END) AS openingBalance, - SUM(CASE WHEN DATE(sl.date) BETWEEN :fromDate AND :toDate THEN COALESCE(sl.inQty, 0) ELSE 0 END) AS cumStockIn, - SUM(CASE WHEN DATE(sl.date) BETWEEN :fromDate AND :toDate THEN COALESCE(sl.outQty, 0) ELSE 0 END) AS cumStockOut, + SUM( + CASE + WHEN DATE(sl.date) BETWEEN :fromDate AND :toDate + AND sil.stockTakeLineId IS NULL -- 不是「由盤點」產生的入庫 + THEN COALESCE(sl.inQty, 0) + ELSE 0 + END +) AS cumStockIn, + +-- 累計付出量:排除 type = 'stocktake' 的出庫 (專門的盤點出庫) +SUM( + CASE + WHEN DATE(sl.date) BETWEEN :fromDate AND :toDate + AND COALESCE(sl.outQty, 0) > 0 + AND NOT ( + -- 1) 盤點正式出庫 + LOWER(TRIM(COALESCE(sl.type, ''))) = 'stocktake' + -- 2) 盤點差異調整出庫(你已經算在 cumStockOutAdjStockTake) + OR ( + LOWER(TRIM(COALESCE(sl.type, ''))) = 'adj' + AND (sol.stockTransferId IS NULL OR sol.id IS NULL) + ) + -- 3) 錯誤輸入或遺失出庫 + OR LOWER(TRIM(COALESCE(sl.type, ''))) = 'miss' + OR LOWER(TRIM(COALESCE(sol.type, ''))) = 'miss' + -- 4) 不良品棄置出庫 + OR LOWER(TRIM(COALESCE(sl.type, ''))) = 'bad' + OR LOWER(TRIM(COALESCE(sol.type, ''))) = 'bad' + ) + THEN COALESCE(sl.outQty, 0) + ELSE 0 + END +) AS cumStockOut, SUM(CASE WHEN DATE(sl.date) <= :toDate THEN COALESCE(sl.inQty, 0) - COALESCE(sl.outQty, 0) ELSE 0 END) AS currentBalance, MAX(CASE WHEN COALESCE(sl.inQty, 0) > 0 THEN sl.date END) AS lastInDate, MAX(CASE WHEN COALESCE(sl.outQty, 0) > 0 THEN sl.date END) AS lastOutDate,