| @@ -116,27 +116,27 @@ WITH latest_str AS ( | |||||
| ) | ) | ||||
| ) | ) | ||||
| ), | ), | ||||
| in_out AS ( | |||||
| in_agg AS ( | |||||
| SELECT | SELECT | ||||
| ill.id AS inventoryLotLineId, | 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(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(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 | FROM inventory_lot_line ill | ||||
| LEFT JOIN stock_in_line sil | LEFT JOIN stock_in_line sil | ||||
| ON sil.inventoryLotLineId = ill.id | ON sil.inventoryLotLineId = ill.id | ||||
| AND sil.deleted = 0 | AND sil.deleted = 0 | ||||
| AND sil.status = 'completed' | 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 | LEFT JOIN stock_out_line sol | ||||
| ON sol.inventoryLotLineId = ill.id | ON sol.inventoryLotLineId = ill.id | ||||
| AND sol.deleted = 0 | AND sol.deleted = 0 | ||||
| @@ -144,6 +144,18 @@ in_out AS ( | |||||
| WHERE ill.deleted = 0 | WHERE ill.deleted = 0 | ||||
| GROUP BY ill.id | 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 ( | data AS ( | ||||
| SELECT | SELECT | ||||
| it.type AS stockSubCategory, | it.type AS stockSubCategory, | ||||