|
|
|
@@ -23,6 +23,7 @@ import java.time.LocalTime |
|
|
|
import java.time.format.DateTimeFormatter |
|
|
|
import com.ffii.fpsms.modules.common.SecurityUtils |
|
|
|
import com.ffii.fpsms.modules.report.service.M18BomShopSyncReportService |
|
|
|
import com.ffii.fpsms.modules.report.service.ReportMultiValueTokens |
|
|
|
import com.ffii.fpsms.modules.report.service.ReportService |
|
|
|
import com.ffii.fpsms.modules.report.service.ShopOrderReplenishmentReportService |
|
|
|
|
|
|
|
@@ -309,10 +310,164 @@ class ReportController( |
|
|
|
@RequestParam(required = false) lastOutDateStart: String?, |
|
|
|
@RequestParam(required = false) lastOutDateEnd: String?, |
|
|
|
@RequestParam(required = false, defaultValue = "0") stockTakeRoundId: Long, |
|
|
|
): ResponseEntity<ByteArray> = |
|
|
|
generateStockBalancePdf( |
|
|
|
stockCategory = stockCategory, |
|
|
|
itemCode = itemCode, |
|
|
|
stockDate = stockDate, |
|
|
|
balanceFilterStart = balanceFilterStart, |
|
|
|
balanceFilterEnd = balanceFilterEnd, |
|
|
|
storeLocation = storeLocation, |
|
|
|
lastInDateStart = lastInDateStart, |
|
|
|
lastInDateEnd = lastInDateEnd, |
|
|
|
lastOutDateStart = lastOutDateStart, |
|
|
|
lastOutDateEnd = lastOutDateEnd, |
|
|
|
stockTakeRoundId = stockTakeRoundId, |
|
|
|
) |
|
|
|
|
|
|
|
@PostMapping("/print-stock-balance") |
|
|
|
fun generateStockBalanceReportPost( |
|
|
|
@RequestBody(required = false) req: StockBalanceReportRequest?, |
|
|
|
): ResponseEntity<ByteArray> { |
|
|
|
val r = req ?: StockBalanceReportRequest() |
|
|
|
return generateStockBalancePdf( |
|
|
|
stockCategory = r.stockCategory, |
|
|
|
itemCode = combinedItemCode(r.itemCode, r.itemCodePaste, r.itemCodes), |
|
|
|
stockDate = r.stockDate, |
|
|
|
balanceFilterStart = r.balanceFilterStart, |
|
|
|
balanceFilterEnd = r.balanceFilterEnd, |
|
|
|
storeLocation = r.storeLocation, |
|
|
|
lastInDateStart = r.lastInDateStart, |
|
|
|
lastInDateEnd = r.lastInDateEnd, |
|
|
|
lastOutDateStart = r.lastOutDateStart, |
|
|
|
lastOutDateEnd = r.lastOutDateEnd, |
|
|
|
stockTakeRoundId = r.stockTakeRoundId ?: 0L, |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
@GetMapping("/print-stock-balance-excel") |
|
|
|
fun exportStockBalanceReportExcel( |
|
|
|
@RequestParam(required = false) stockCategory: String?, |
|
|
|
@RequestParam(required = false) itemCode: String?, |
|
|
|
@RequestParam(required = false) stockDate: String?, |
|
|
|
@RequestParam(required = false) balanceFilterStart: String?, |
|
|
|
@RequestParam(required = false) balanceFilterEnd: String?, |
|
|
|
@RequestParam(required = false) storeLocation: String?, |
|
|
|
@RequestParam(required = false) lastInDateStart: String?, |
|
|
|
@RequestParam(required = false) lastInDateEnd: String?, |
|
|
|
@RequestParam(required = false) lastOutDateStart: String?, |
|
|
|
@RequestParam(required = false) lastOutDateEnd: String?, |
|
|
|
@RequestParam(required = false, defaultValue = "0") stockTakeRoundId: Long, |
|
|
|
): ResponseEntity<ByteArray> = |
|
|
|
generateStockBalanceExcel( |
|
|
|
stockCategory = stockCategory, |
|
|
|
itemCode = itemCode, |
|
|
|
stockDate = stockDate, |
|
|
|
balanceFilterStart = balanceFilterStart, |
|
|
|
balanceFilterEnd = balanceFilterEnd, |
|
|
|
storeLocation = storeLocation, |
|
|
|
lastInDateStart = lastInDateStart, |
|
|
|
lastInDateEnd = lastInDateEnd, |
|
|
|
lastOutDateStart = lastOutDateStart, |
|
|
|
lastOutDateEnd = lastOutDateEnd, |
|
|
|
stockTakeRoundId = stockTakeRoundId, |
|
|
|
) |
|
|
|
|
|
|
|
@PostMapping("/print-stock-balance-excel") |
|
|
|
fun exportStockBalanceReportExcelPost( |
|
|
|
@RequestBody(required = false) req: StockBalanceReportRequest?, |
|
|
|
): ResponseEntity<ByteArray> { |
|
|
|
val r = req ?: StockBalanceReportRequest() |
|
|
|
return generateStockBalanceExcel( |
|
|
|
stockCategory = r.stockCategory, |
|
|
|
itemCode = combinedItemCode(r.itemCode, r.itemCodePaste, r.itemCodes), |
|
|
|
stockDate = r.stockDate, |
|
|
|
balanceFilterStart = r.balanceFilterStart, |
|
|
|
balanceFilterEnd = r.balanceFilterEnd, |
|
|
|
storeLocation = r.storeLocation, |
|
|
|
lastInDateStart = r.lastInDateStart, |
|
|
|
lastInDateEnd = r.lastInDateEnd, |
|
|
|
lastOutDateStart = r.lastOutDateStart, |
|
|
|
lastOutDateEnd = r.lastOutDateEnd, |
|
|
|
stockTakeRoundId = r.stockTakeRoundId ?: 0L, |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
private fun combinedItemCode( |
|
|
|
itemCode: String?, |
|
|
|
itemCodePaste: String?, |
|
|
|
itemCodes: List<String>?, |
|
|
|
): String? { |
|
|
|
val joined = buildString { |
|
|
|
if (!itemCode.isNullOrBlank()) append(itemCode).append(' ') |
|
|
|
if (!itemCodePaste.isNullOrBlank()) append(itemCodePaste).append(' ') |
|
|
|
itemCodes?.forEach { code -> |
|
|
|
if (code.isNotBlank()) append(code).append(' ') |
|
|
|
} |
|
|
|
} |
|
|
|
val tokens = ReportMultiValueTokens.split(joined) |
|
|
|
return tokens.takeIf { it.isNotEmpty() }?.joinToString(",") |
|
|
|
} |
|
|
|
|
|
|
|
private fun loadStockBalanceRows( |
|
|
|
stockCategory: String?, |
|
|
|
itemCode: String?, |
|
|
|
stockDate: String?, |
|
|
|
balanceFilterStart: String?, |
|
|
|
balanceFilterEnd: String?, |
|
|
|
storeLocation: String?, |
|
|
|
lastInDateStart: String?, |
|
|
|
lastInDateEnd: String?, |
|
|
|
lastOutDateStart: String?, |
|
|
|
lastOutDateEnd: String?, |
|
|
|
stockTakeRoundId: Long, |
|
|
|
): List<Map<String, Any>> = |
|
|
|
if (!stockDate.isNullOrBlank()) { |
|
|
|
reportService.searchStockBalanceReportByDate( |
|
|
|
stockCategory = stockCategory, |
|
|
|
itemCode = itemCode, |
|
|
|
stockDate = stockDate, |
|
|
|
balanceFilterStart = balanceFilterStart, |
|
|
|
balanceFilterEnd = balanceFilterEnd, |
|
|
|
storeLocation = storeLocation, |
|
|
|
) |
|
|
|
} else { |
|
|
|
reportService.searchStockBalanceReport( |
|
|
|
stockCategory, |
|
|
|
itemCode, |
|
|
|
balanceFilterStart, |
|
|
|
balanceFilterEnd, |
|
|
|
storeLocation, |
|
|
|
lastInDateStart, |
|
|
|
lastInDateEnd, |
|
|
|
lastOutDateStart, |
|
|
|
lastOutDateEnd, |
|
|
|
stockTakeRoundId, |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
private fun generateStockBalancePdf( |
|
|
|
stockCategory: String?, |
|
|
|
itemCode: String?, |
|
|
|
stockDate: String?, |
|
|
|
balanceFilterStart: String?, |
|
|
|
balanceFilterEnd: String?, |
|
|
|
storeLocation: String?, |
|
|
|
lastInDateStart: String?, |
|
|
|
lastInDateEnd: String?, |
|
|
|
lastOutDateStart: String?, |
|
|
|
lastOutDateEnd: String?, |
|
|
|
stockTakeRoundId: Long, |
|
|
|
): ResponseEntity<ByteArray> { |
|
|
|
val tokenCount = ReportMultiValueTokens.split(itemCode).size |
|
|
|
val parameters = mutableMapOf<String, Any>() |
|
|
|
parameters["stockCategory"] = stockCategory ?: "All" |
|
|
|
parameters["itemNo"] = itemCode ?: "All" |
|
|
|
parameters["itemNo"] = |
|
|
|
when { |
|
|
|
itemCode.isNullOrBlank() -> "All" |
|
|
|
tokenCount > 30 -> "$tokenCount items" |
|
|
|
else -> itemCode |
|
|
|
} |
|
|
|
parameters["reportDate"] = (stockDate ?: LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) |
|
|
|
parameters["reportTime"] = LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss")) |
|
|
|
parameters["storeLocation"] = storeLocation ?: "" |
|
|
|
@@ -323,35 +478,24 @@ class ReportController( |
|
|
|
parameters["lastOutDateStart"] = lastOutDateStart ?: "" |
|
|
|
parameters["lastOutDateEnd"] = lastOutDateEnd ?: "" |
|
|
|
|
|
|
|
val dbData = |
|
|
|
if (!stockDate.isNullOrBlank()) { |
|
|
|
reportService.searchStockBalanceReportByDate( |
|
|
|
stockCategory = stockCategory, |
|
|
|
itemCode = itemCode, |
|
|
|
stockDate = stockDate, |
|
|
|
balanceFilterStart = balanceFilterStart, |
|
|
|
balanceFilterEnd = balanceFilterEnd, |
|
|
|
storeLocation = storeLocation, |
|
|
|
) |
|
|
|
} else { |
|
|
|
reportService.searchStockBalanceReport( |
|
|
|
stockCategory, |
|
|
|
itemCode, |
|
|
|
balanceFilterStart, |
|
|
|
balanceFilterEnd, |
|
|
|
storeLocation, |
|
|
|
lastInDateStart, |
|
|
|
lastInDateEnd, |
|
|
|
lastOutDateStart, |
|
|
|
lastOutDateEnd, |
|
|
|
stockTakeRoundId |
|
|
|
) |
|
|
|
} |
|
|
|
val dbData = loadStockBalanceRows( |
|
|
|
stockCategory = stockCategory, |
|
|
|
itemCode = itemCode, |
|
|
|
stockDate = stockDate, |
|
|
|
balanceFilterStart = balanceFilterStart, |
|
|
|
balanceFilterEnd = balanceFilterEnd, |
|
|
|
storeLocation = storeLocation, |
|
|
|
lastInDateStart = lastInDateStart, |
|
|
|
lastInDateEnd = lastInDateEnd, |
|
|
|
lastOutDateStart = lastOutDateStart, |
|
|
|
lastOutDateEnd = lastOutDateEnd, |
|
|
|
stockTakeRoundId = stockTakeRoundId, |
|
|
|
) |
|
|
|
|
|
|
|
val pdfBytes = reportService.createPdfResponse( |
|
|
|
"/jasper/StockBalanceReport.jrxml", |
|
|
|
parameters, |
|
|
|
dbData |
|
|
|
dbData, |
|
|
|
) |
|
|
|
|
|
|
|
val headers = HttpHeaders().apply { |
|
|
|
@@ -359,48 +503,35 @@ class ReportController( |
|
|
|
setContentDispositionFormData("attachment", "StockBalanceReport.pdf") |
|
|
|
set("filename", "StockBalanceReport.pdf") |
|
|
|
} |
|
|
|
|
|
|
|
return ResponseEntity(pdfBytes, headers, HttpStatus.OK) |
|
|
|
} |
|
|
|
|
|
|
|
@GetMapping("/print-stock-balance-excel") |
|
|
|
fun exportStockBalanceReportExcel( |
|
|
|
@RequestParam(required = false) stockCategory: String?, |
|
|
|
@RequestParam(required = false) itemCode: String?, |
|
|
|
@RequestParam(required = false) stockDate: String?, |
|
|
|
@RequestParam(required = false) balanceFilterStart: String?, |
|
|
|
@RequestParam(required = false) balanceFilterEnd: String?, |
|
|
|
@RequestParam(required = false) storeLocation: String?, |
|
|
|
@RequestParam(required = false) lastInDateStart: String?, |
|
|
|
@RequestParam(required = false) lastInDateEnd: String?, |
|
|
|
@RequestParam(required = false) lastOutDateStart: String?, |
|
|
|
@RequestParam(required = false) lastOutDateEnd: String?, |
|
|
|
@RequestParam(required = false, defaultValue = "0") stockTakeRoundId: Long, |
|
|
|
private fun generateStockBalanceExcel( |
|
|
|
stockCategory: String?, |
|
|
|
itemCode: String?, |
|
|
|
stockDate: String?, |
|
|
|
balanceFilterStart: String?, |
|
|
|
balanceFilterEnd: String?, |
|
|
|
storeLocation: String?, |
|
|
|
lastInDateStart: String?, |
|
|
|
lastInDateEnd: String?, |
|
|
|
lastOutDateStart: String?, |
|
|
|
lastOutDateEnd: String?, |
|
|
|
stockTakeRoundId: Long, |
|
|
|
): ResponseEntity<ByteArray> { |
|
|
|
val dbData = |
|
|
|
if (!stockDate.isNullOrBlank()) { |
|
|
|
reportService.searchStockBalanceReportByDate( |
|
|
|
stockCategory = stockCategory, |
|
|
|
itemCode = itemCode, |
|
|
|
stockDate = stockDate, |
|
|
|
balanceFilterStart = balanceFilterStart, |
|
|
|
balanceFilterEnd = balanceFilterEnd, |
|
|
|
storeLocation = storeLocation, |
|
|
|
) |
|
|
|
} else { |
|
|
|
reportService.searchStockBalanceReport( |
|
|
|
stockCategory, |
|
|
|
itemCode, |
|
|
|
balanceFilterStart, |
|
|
|
balanceFilterEnd, |
|
|
|
storeLocation, |
|
|
|
lastInDateStart, |
|
|
|
lastInDateEnd, |
|
|
|
lastOutDateStart, |
|
|
|
lastOutDateEnd, |
|
|
|
stockTakeRoundId |
|
|
|
) |
|
|
|
} |
|
|
|
val dbData = loadStockBalanceRows( |
|
|
|
stockCategory = stockCategory, |
|
|
|
itemCode = itemCode, |
|
|
|
stockDate = stockDate, |
|
|
|
balanceFilterStart = balanceFilterStart, |
|
|
|
balanceFilterEnd = balanceFilterEnd, |
|
|
|
storeLocation = storeLocation, |
|
|
|
lastInDateStart = lastInDateStart, |
|
|
|
lastInDateEnd = lastInDateEnd, |
|
|
|
lastOutDateStart = lastOutDateStart, |
|
|
|
lastOutDateEnd = lastOutDateEnd, |
|
|
|
stockTakeRoundId = stockTakeRoundId, |
|
|
|
) |
|
|
|
|
|
|
|
val excelBytes = createStockBalanceExcel( |
|
|
|
dbData = dbData, |
|
|
|
@@ -1130,4 +1261,20 @@ class ReportController( |
|
|
|
return mapOf("rows" to rows) |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
data class StockBalanceReportRequest( |
|
|
|
val stockDate: String? = null, |
|
|
|
val itemCode: String? = null, |
|
|
|
val itemCodePaste: String? = null, |
|
|
|
val itemCodes: List<String>? = null, |
|
|
|
val stockCategory: String? = null, |
|
|
|
val balanceFilterStart: String? = null, |
|
|
|
val balanceFilterEnd: String? = null, |
|
|
|
val storeLocation: String? = null, |
|
|
|
val lastInDateStart: String? = null, |
|
|
|
val lastInDateEnd: String? = null, |
|
|
|
val lastOutDateStart: String? = null, |
|
|
|
val lastOutDateEnd: String? = null, |
|
|
|
val stockTakeRoundId: Long? = 0L, |
|
|
|
) |