CANCERYS\kw093 пре 1 недеља
родитељ
комит
6ed77c2b3e
4 измењених фајлова са 85 додато и 6 уклоњено
  1. +38
    -4
      src/main/java/com/ffii/fpsms/modules/jobOrder/service/JoPickOrderService.kt
  2. +17
    -2
      src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt
  3. +2
    -0
      src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt
  4. +28
    -0
      src/main/java/com/ffii/fpsms/modules/stock/web/InventoryLotLineController.kt

+ 38
- 4
src/main/java/com/ffii/fpsms/modules/jobOrder/service/JoPickOrderService.kt Прегледај датотеку

@@ -2108,7 +2108,15 @@ open fun getCompletedJobOrderPickOrders(completedDate: LocalDate?): List<Map<Str
return if (num.isNotEmpty()) "${num}F" else cleaned
}

open fun getAllJoPickOrders(bomType: String?, floor: String?): List<AllJoPickOrderResponse> {
open fun getAllJoPickOrders(
bomType: String?,
floor: String?,
jobOrderCode: String? = null,
pickOrderCode: String? = null,
itemName: String? = null,
bomDescription: String? = null,
planStart: LocalDate? = null,
): List<AllJoPickOrderResponse> {
println("=== getAllJoPickOrders ===")
val wallStartNs = System.nanoTime()
val timing = linkedMapOf<String, Long>()
@@ -2130,7 +2138,9 @@ open fun getCompletedJobOrderPickOrders(completedDate: LocalDate?): List<Map<Str
// println("Found ${releasedPickOrders.size} released job order pick orders")
val pickOrderIds = releasedPickOrders.mapNotNull { it.id }

val normalizedFloorFilter = floor?.let { normalizeFloor(it) }?.takeIf { it.isNotBlank() }
val normalizedFloorFilter = floor
?.let { normalizeFloor(it) }
?.takeIf { it.isNotBlank() && it != "ALL" }

// 2. 批量查询每个 pick order 的按楼层统计(若没有则跳过)
val floorCountsByPickOrderId: Map<Long, List<Map<String, Any?>>> = timed("queryFloorCountsMs") {
@@ -2266,7 +2276,10 @@ open fun getCompletedJobOrderPickOrders(completedDate: LocalDate?): List<Map<Str
val bom = jobOrder.bom

// 按 bom.type 过滤:null / blank 表示不过滤(全部)
val normalizedType = bomType?.trim()?.lowercase()?.takeIf { it.isNotBlank() }
val normalizedType = bomType
?.trim()
?.lowercase()
?.takeIf { it.isNotBlank() && it != "all" }
if (normalizedType != null) {
val currentType = bom?.type?.trim()?.lowercase()
if (currentType != normalizedType) return@mapNotNull null
@@ -2339,11 +2352,13 @@ open fun getCompletedJobOrderPickOrders(completedDate: LocalDate?): List<Map<Str
jobOrderType = jobOrderType?.name,
itemId = item.id ?: 0L,
itemName = item.name ?: "",
bomDescription = bom?.description,
reqQty = jobOrder.reqQty ?: BigDecimal.ZERO,
//uomId = bom.outputQtyUom?.id : 0L,
uomId = 0,
uomName = bom?.outputQtyUom ?: "",
lotNo = lotNo,
planStart = jobOrder.planStart,
jobOrderStatus = jobOrder.status?.value ?: "",
finishedPickOLineCount = finishedLines,
floorPickCounts = floorPickCounts,
@@ -2355,13 +2370,32 @@ open fun getCompletedJobOrderPickOrders(completedDate: LocalDate?): List<Map<Str
val sorted = timed("sortResponseMs") {
jobOrderPickOrders.sortedByDescending { it.id }
}
val normalizedJobOrderCode = jobOrderCode?.trim()?.lowercase()?.takeIf { it.isNotBlank() }
val normalizedPickOrderCode = pickOrderCode?.trim()?.lowercase()?.takeIf { it.isNotBlank() }
val normalizedItemName = itemName?.trim()?.lowercase()?.takeIf { it.isNotBlank() }
val normalizedBomDescription = bomDescription?.trim()?.lowercase()?.takeIf { it.isNotBlank() }
val dateFilter = planStart
val filtered = timed("applySearchFilterMs") {
sorted.filter { row ->
val jobCodeMatch = normalizedJobOrderCode == null ||
(row.jobOrderCode?.lowercase()?.contains(normalizedJobOrderCode) == true)
val pickCodeMatch = normalizedPickOrderCode == null ||
(row.pickOrderCode?.lowercase()?.contains(normalizedPickOrderCode) == true)
val itemNameMatch = normalizedItemName == null ||
row.itemName.lowercase().contains(normalizedItemName)
val bomDescriptionMatch = normalizedBomDescription == null ||
(row.bomDescription?.lowercase()?.contains(normalizedBomDescription) == true)
val planStartMatch = dateFilter == null || row.planStart?.toLocalDate() == dateFilter
jobCodeMatch && pickCodeMatch && itemNameMatch && bomDescriptionMatch && planStartMatch
}
}
val totalMs = (System.nanoTime() - wallStartNs) / 1_000_000
println(
"JO_ALL_PICK_ORDERS_TIMING totalMs=$totalMs released=${releasedPickOrders.size} " +
timing.entries.joinToString(" ") { "${it.key}=${it.value}" },
)
// println("Returning ${jobOrderPickOrders.size} released job order pick orders")
sorted
filtered
} catch (e: Exception) {
val totalMs = (System.nanoTime() - wallStartNs) / 1_000_000
println(


+ 17
- 2
src/main/java/com/ffii/fpsms/modules/jobOrder/web/JobOrderController.kt Прегледај датотеку

@@ -304,9 +304,24 @@ fun getJobOrderPickOrderLotDetails(
@RequestParam(name = "type", required = false) bomType: String?,
// Single floor, e.g. "2F"/"3F"/"4F". When provided, backend returns job pick orders
// that still have unpicked lines on that floor OR any "no lot" remaining lines.
@RequestParam(required = false) floor: String?
@RequestParam(required = false) floor: String?,
@RequestParam(name = "jobOrderCode", required = false) jobOrderCode: String?,
@RequestParam(name = "pickOrderCode", required = false) pickOrderCode: String?,
@RequestParam(name = "itemName", required = false) itemName: String?,
@RequestParam(name = "bomDescription", required = false) bomDescription: String?,
@RequestParam(name = "planStart", required = false)
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
planStart: LocalDate?,
): List<AllJoPickOrderResponse> {
return joPickOrderService.getAllJoPickOrders(bomType, floor)
return joPickOrderService.getAllJoPickOrders(
bomType = bomType,
floor = floor,
jobOrderCode = jobOrderCode,
pickOrderCode = pickOrderCode,
itemName = itemName,
bomDescription = bomDescription,
planStart = planStart,
)
}

@GetMapping("/all-lots-hierarchical-by-pick-order/{pickOrderId}")


+ 2
- 0
src/main/java/com/ffii/fpsms/modules/jobOrder/web/model/CreateJobOrderRequest.kt Прегледај датотеку

@@ -49,10 +49,12 @@ data class AllJoPickOrderResponse(
val jobOrderType: String?,
val itemId: Long,
val itemName: String,
val bomDescription: String?,
val reqQty: BigDecimal,
val uomId: Long,
val uomName: String,
val lotNo: String?,
val planStart: LocalDateTime?,
val jobOrderStatus: String,
val finishedPickOLineCount: Int,
val floorPickCounts: List<FloorPickCountDto> = emptyList(),


+ 28
- 0
src/main/java/com/ffii/fpsms/modules/stock/web/InventoryLotLineController.kt Прегледај датотеку

@@ -92,6 +92,34 @@ class InventoryLotLineController (
inventoryLotLineService.printLabelForInventoryLotLine(request)
}

/**
* Workbench print endpoint: same printing behavior as `/print-label`,
* but always returns JSON so frontend won't fail on empty-body JSON parsing.
*/
@GetMapping("/workbench/print-label")
fun printLabelWorkbench(@ModelAttribute request: PrintLabelForInventoryLotLineRequest): MessageResponse {
return try {
inventoryLotLineService.printLabelForInventoryLotLine(request)
MessageResponse(
id = request.inventoryLotLineId,
name = "print_label",
code = "SUCCESS",
type = "workbench_print_label",
message = "Print job submitted",
errorPosition = null,
)
} catch (e: Exception) {
MessageResponse(
id = request.inventoryLotLineId,
name = "print_label",
code = "ERROR",
type = "workbench_print_label",
message = e.message ?: "Print failed",
errorPosition = null,
)
}
}

@PostMapping("/updateStatus")
fun updateInventoryLotLineStatus(@RequestBody request: UpdateInventoryLotLineStatusRequest): MessageResponse {
println("=== DEBUG: updateInventoryLotLineStatus Controller ===")


Loading…
Откажи
Сачувај