| @@ -524,84 +524,93 @@ fun searchMaterialStockOutTraceabilityReport( | |||
| } | |||
| val sql = """ | |||
| SELECT | |||
| IFNULL(it.code, '') AS itemNo, | |||
| IFNULL(it.name, '') AS itemName, | |||
| IFNULL(it.categoryId, 0) AS stockSubCategory, | |||
| IFNULL(uc.udfudesc, '') AS unitOfMeasure, | |||
| '' AS jobOrderNo, | |||
| IFNULL(po.consoCode, '') AS stockReqNo, | |||
| IFNULL(il.lotNo, '') AS lotNo, | |||
| IFNULL(DATE_FORMAT(il.expiryDate, '%Y-%m-%d'), '') AS expiryDate, | |||
| CAST(ROUND(IFNULL(sol.qty, 0), 2) AS CHAR) AS stockOutQty, | |||
| IFNULL(po.code, '') AS materialPickOrderNo, | |||
| COALESCE( | |||
| picker_user.name, | |||
| created_user.name, -- 新增:用 createdBy 找到的 user | |||
| modified_user.name, | |||
| '' | |||
| ) AS handler, | |||
| COALESCE(wh.code, '') AS storeLocation, | |||
| '' AS pickRemark, | |||
| CAST( | |||
| SUM(IFNULL(sol.qty, 0)) OVER (PARTITION BY it.code) AS CHAR | |||
| ) AS totalStockOutQty | |||
| FROM stock_out_line sol | |||
| INNER JOIN stock_out so | |||
| ON sol.stockOutId = so.id | |||
| AND so.deleted = 0 | |||
| AND so.type = 'job' | |||
| INNER JOIN pick_order_line pol | |||
| ON sol.pickOrderLineId = pol.id | |||
| AND pol.deleted = 0 | |||
| INNER JOIN pick_order po | |||
| ON pol.poId = po.id | |||
| AND po.deleted = 0 | |||
| AND po.type IN ('consumable', 'jo') | |||
| AND po.joId IS NULL | |||
| AND po.doId IS NULL | |||
| INNER JOIN items it | |||
| ON sol.itemId = it.id | |||
| AND it.deleted = 0 | |||
| LEFT JOIN item_uom iu | |||
| ON it.id = iu.itemId | |||
| AND iu.stockUnit = 1 | |||
| LEFT JOIN uom_conversion uc | |||
| ON iu.uomId = uc.id | |||
| LEFT JOIN inventory_lot_line ill | |||
| ON sol.inventoryLotLineId = ill.id | |||
| AND ill.deleted = 0 | |||
| LEFT JOIN inventory_lot il | |||
| ON ill.inventoryLotId = il.id | |||
| AND il.deleted = 0 | |||
| LEFT JOIN warehouse wh | |||
| ON ill.warehouseId = wh.id | |||
| AND wh.deleted = 0 | |||
| LEFT JOIN user picker_user | |||
| ON sol.pickerId = picker_user.id | |||
| AND picker_user.deleted = 0 | |||
| LEFT JOIN user created_user | |||
| ON sol.createdBy = created_user.username | |||
| AND created_user.deleted = 0 | |||
| LEFT JOIN user modified_user | |||
| ON sol.modifiedBy = modified_user.staffNo | |||
| AND modified_user.deleted = 0 | |||
| AND sol.pickerId IS NULL | |||
| WHERE | |||
| sol.deleted = 0 | |||
| AND (sol.inventoryLotLineId IS NULL OR ill.id IS NOT NULL) | |||
| $stockCategorySql | |||
| $stockSubCategorySql | |||
| $itemCodeSql | |||
| $yearSql | |||
| $lastOutDateStartSql | |||
| $lastOutDateEndSql | |||
| ORDER BY | |||
| it.code, | |||
| il.lotNo, | |||
| sol.endTime | |||
| """.trimIndent() | |||
| SELECT | |||
| IFNULL(it.code, '') AS itemNo, | |||
| IFNULL(it.name, '') AS itemName, | |||
| IFNULL(it.categoryId, 0) AS stockSubCategory, | |||
| IFNULL(uc.udfudesc, '') AS unitOfMeasure, | |||
| IFNULL(jo.code, '') AS jobOrderNo, | |||
| IFNULL(po.consoCode, '') AS stockReqNo, | |||
| IFNULL(il.lotNo, '') AS lotNo, | |||
| IFNULL(DATE_FORMAT(il.expiryDate, '%Y-%m-%d'), '') AS expiryDate, | |||
| FORMAT(ROUND(IFNULL(sol.qty, 0), 0), 0) AS stockOutQty, | |||
| IFNULL(po.code, '') AS materialPickOrderNo, | |||
| COALESCE( | |||
| picker_user.name, | |||
| jpo_handler_user.name, | |||
| created_user.name, | |||
| modified_user.name, | |||
| '' | |||
| ) AS handler, | |||
| COALESCE(wh.code, '') AS storeLocation, | |||
| '' AS pickRemark, | |||
| FORMAT( | |||
| ROUND(SUM(IFNULL(sol.qty, 0)) OVER (PARTITION BY it.code), 0), 0 | |||
| ) AS totalStockOutQty | |||
| FROM stock_out_line sol | |||
| INNER JOIN stock_out so | |||
| ON sol.stockOutId = so.id | |||
| AND so.deleted = 0 | |||
| AND so.type = 'job' | |||
| INNER JOIN pick_order_line pol | |||
| ON sol.pickOrderLineId = pol.id | |||
| AND pol.deleted = 0 | |||
| INNER JOIN pick_order po | |||
| ON pol.poId = po.id | |||
| AND po.deleted = 0 | |||
| AND po.type IN ('jo', 'JOB_ORDER') | |||
| AND po.joId IS NOT NULL | |||
| LEFT JOIN job_order jo | |||
| ON po.joId = jo.id | |||
| AND jo.deleted = 0 | |||
| INNER JOIN items it | |||
| ON sol.itemId = it.id | |||
| AND it.deleted = 0 | |||
| LEFT JOIN item_uom iu | |||
| ON it.id = iu.itemId | |||
| AND iu.stockUnit = 1 | |||
| LEFT JOIN uom_conversion uc | |||
| ON iu.uomId = uc.id | |||
| LEFT JOIN inventory_lot_line ill | |||
| ON sol.inventoryLotLineId = ill.id | |||
| AND ill.deleted = 0 | |||
| LEFT JOIN inventory_lot il | |||
| ON ill.inventoryLotId = il.id | |||
| AND il.deleted = 0 | |||
| LEFT JOIN warehouse wh | |||
| ON ill.warehouseId = wh.id | |||
| AND wh.deleted = 0 | |||
| LEFT JOIN user picker_user | |||
| ON sol.pickerId = picker_user.id | |||
| AND picker_user.deleted = 0 | |||
| LEFT JOIN jo_pick_order jpo | |||
| ON po.id = jpo.pick_order_id | |||
| AND pol.itemId = jpo.item_id | |||
| AND jpo.deleted = 0 | |||
| LEFT JOIN user jpo_handler_user | |||
| ON jpo.handled_by = jpo_handler_user.id | |||
| AND jpo_handler_user.deleted = 0 | |||
| LEFT JOIN user created_user | |||
| ON sol.createdBy = created_user.username | |||
| AND created_user.deleted = 0 | |||
| LEFT JOIN user modified_user | |||
| ON sol.modifiedBy = modified_user.staffNo | |||
| AND modified_user.deleted = 0 | |||
| AND sol.pickerId IS NULL | |||
| WHERE | |||
| sol.deleted = 0 | |||
| AND (sol.inventoryLotLineId IS NULL OR ill.id IS NOT NULL) | |||
| $stockCategorySql | |||
| $stockSubCategorySql | |||
| $itemCodeSql | |||
| $yearSql | |||
| $lastOutDateStartSql | |||
| $lastOutDateEndSql | |||
| ORDER BY | |||
| it.code, | |||
| il.lotNo, | |||
| sol.endTime | |||
| """.trimIndent() | |||
| val result = jdbcDao.queryForList(sql, args) | |||
| println("=== Material Stock Out Traceability (Total: ${result.size} rows) ===") | |||
| @@ -609,6 +618,7 @@ fun searchMaterialStockOutTraceabilityReport( | |||
| println("Row $index:") | |||
| println(" itemNo: ${row["itemNo"]}") | |||
| println(" itemName: ${row["itemName"]}") | |||
| println(" jobOrderNo: ${row["jobOrderNo"]}") | |||
| println(" stockOutQty: ${row["stockOutQty"]}") | |||
| println(" totalStockOutQty: ${row["totalStockOutQty"]}") | |||
| println(" materialPickOrderNo: ${row["materialPickOrderNo"]}") | |||