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 8d84a22..0dcf624 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 @@ -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"]}")