| @@ -524,84 +524,93 @@ fun searchMaterialStockOutTraceabilityReport( | |||||
| } | } | ||||
| val sql = """ | 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) | val result = jdbcDao.queryForList(sql, args) | ||||
| println("=== Material Stock Out Traceability (Total: ${result.size} rows) ===") | println("=== Material Stock Out Traceability (Total: ${result.size} rows) ===") | ||||
| @@ -609,6 +618,7 @@ fun searchMaterialStockOutTraceabilityReport( | |||||
| println("Row $index:") | println("Row $index:") | ||||
| println(" itemNo: ${row["itemNo"]}") | println(" itemNo: ${row["itemNo"]}") | ||||
| println(" itemName: ${row["itemName"]}") | println(" itemName: ${row["itemName"]}") | ||||
| println(" jobOrderNo: ${row["jobOrderNo"]}") | |||||
| println(" stockOutQty: ${row["stockOutQty"]}") | println(" stockOutQty: ${row["stockOutQty"]}") | ||||
| println(" totalStockOutQty: ${row["totalStockOutQty"]}") | println(" totalStockOutQty: ${row["totalStockOutQty"]}") | ||||
| println(" materialPickOrderNo: ${row["materialPickOrderNo"]}") | println(" materialPickOrderNo: ${row["materialPickOrderNo"]}") | ||||