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 725fd8b..55b7b4d 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 @@ -116,27 +116,27 @@ WITH latest_str AS ( ) ) ), -in_out AS ( +in_agg AS ( SELECT ill.id AS inventoryLotLineId, - - /* 期初:fromDate 之前的入 - 出 */ SUM(CASE WHEN DATE(sil.receiptDate) < :fromDate THEN COALESCE(sil.acceptedQty, 0) ELSE 0 END) AS inBefore, - SUM(CASE WHEN DATE(sol.endTime) < :fromDate THEN COALESCE(sol.qty, 0) ELSE 0 END) AS outBefore, - - /* 區間內累計 */ SUM(CASE WHEN DATE(sil.receiptDate) BETWEEN :fromDate AND :toDate THEN COALESCE(sil.acceptedQty, 0) ELSE 0 END) AS inDuring, - SUM(CASE WHEN DATE(sol.endTime) BETWEEN :fromDate AND :toDate THEN COALESCE(sol.qty, 0) ELSE 0 END) AS outDuring, - - /* 最後入/出倉日期(不限定區間,通常看整體最後一次) */ - MAX(CASE WHEN sil.receiptDate IS NOT NULL THEN DATE(sil.receiptDate) END) AS lastInDate, - MAX(CASE WHEN sol.endTime IS NOT NULL THEN DATE(sol.endTime) END) AS lastOutDate - + MAX(CASE WHEN sil.receiptDate IS NOT NULL THEN DATE(sil.receiptDate) END) AS lastInDate FROM inventory_lot_line ill LEFT JOIN stock_in_line sil ON sil.inventoryLotLineId = ill.id AND sil.deleted = 0 AND sil.status = 'completed' + WHERE ill.deleted = 0 + GROUP BY ill.id +), +out_agg AS ( + SELECT + ill.id AS inventoryLotLineId, + SUM(CASE WHEN DATE(sol.endTime) < :fromDate THEN COALESCE(sol.qty, 0) ELSE 0 END) AS outBefore, + SUM(CASE WHEN DATE(sol.endTime) BETWEEN :fromDate AND :toDate THEN COALESCE(sol.qty, 0) ELSE 0 END) AS outDuring, + MAX(CASE WHEN sol.endTime IS NOT NULL THEN DATE(sol.endTime) END) AS lastOutDate + FROM inventory_lot_line ill LEFT JOIN stock_out_line sol ON sol.inventoryLotLineId = ill.id AND sol.deleted = 0 @@ -144,6 +144,18 @@ in_out AS ( WHERE ill.deleted = 0 GROUP BY ill.id ), +in_out AS ( + SELECT + i.inventoryLotLineId, + COALESCE(i.inBefore, 0) AS inBefore, + COALESCE(o.outBefore, 0) AS outBefore, + COALESCE(i.inDuring, 0) AS inDuring, + COALESCE(o.outDuring, 0) AS outDuring, + i.lastInDate, + o.lastOutDate + FROM in_agg i + LEFT JOIN out_agg o ON o.inventoryLotLineId = i.inventoryLotLineId +), data AS ( SELECT it.type AS stockSubCategory,