CANCERYS\kw093 преди 3 дни
родител
ревизия
4f9eca0796
променени са 4 файла, в които са добавени 48 реда и са изтрити 20 реда
  1. +13
    -13
      src/main/java/com/ffii/fpsms/modules/jobOrder/service/JoPickOrderService.kt
  2. +30
    -6
      src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickExecutionIssueService.kt
  3. +2
    -1
      src/main/java/com/ffii/fpsms/modules/pickOrder/web/models/PickExecutionIssueRequest.kt
  4. +3
    -0
      src/main/java/com/ffii/fpsms/modules/pickOrder/web/models/SubmitIssueRequest.kt

+ 13
- 13
src/main/java/com/ffii/fpsms/modules/jobOrder/service/JoPickOrderService.kt Целия файл

@@ -2346,26 +2346,26 @@ open fun getMaterialPickStatus(date: String?): List<MaterialPickStatusItem> {
// Count total items to pick (number of distinct pick order lines)
val numberOfItemsToPick = allPickOrderLines.size
// ✅ 修复:检查所有 items 是否都已完成
// 计算已完成的 items 数量(每个 pickOrderLine 至少有一个 completed 的 stockOutLine)
val completedItemsCount = allPickOrderLines.count { pol ->
val stockOutLinesForPol = allStockOutLines.filter {
it.pickOrderLine?.id == pol.id
// 已结束行数:有至少一条 completed,或整行全是 rejected 都算「已结束」
val finishedItemsCount = allPickOrderLines.count { pol ->
val stockOutLinesForPol = allStockOutLines.filter {
it.pickOrderLine?.id == pol.id
}
// 如果这个 pickOrderLine 有至少一个 completed 的 stockOutLine,则认为已完成
stockOutLinesForPol.any { it.status == "completed" }
stockOutLinesForPol.any { it.status == "completed" } ||
(stockOutLinesForPol.isNotEmpty() && stockOutLinesForPol.all { it.status == "rejected" })
}
// ✅ 修复:endTime = 最后一个 item 完成提料的时间
// 只有当所有 items 都完成时,才返回 endTime
val pickEndTime = if (completedItemsCount == numberOfItemsToPick && numberOfItemsToPick > 0) {
// 所有 items 都已完成,取最晚的 endTime
allStockOutLines
// 只有当所有 items 都已结束(完成或全部拒绝)时,才返回 endTime
val pickEndTime = if (finishedItemsCount == numberOfItemsToPick && numberOfItemsToPick > 0) {
val completedEndTime = allStockOutLines
.filter { it.status == "completed" }
.mapNotNull { it.endTime }
.maxOrNull()
// 若没有任何 completed 的 endTime(例如全部 rejected),用 pick order 的 completeDate 作为结束时间
completedEndTime ?: pickOrderIds.mapNotNull { poId ->
pickOrderRepository.findById(poId).orElse(null)?.completeDate
}.maxOrNull()
} else {
// 还有 items 未完成,返回 null
null
}


+ 30
- 6
src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickExecutionIssueService.kt Целия файл

@@ -1574,7 +1574,7 @@ open fun getMissItemList(issueCategory: String = "lot_issue"): List<StockIssueRe
// Get the first issue for non-aggregated fields
val firstIssue = issueList.first()
val (_, uomDesc) = resolveLotUomInfo(lotId)
// Sum missQty for this lot (as requested: sum of missQty, not issueQty)
val totalMissQty = issueList.sumOf { it.missQty ?: BigDecimal.ZERO }
@@ -1596,7 +1596,9 @@ open fun getMissItemList(issueCategory: String = "lot_issue"): List<StockIssueRe
pickerName = firstIssue.pickerName,
handleStatus = firstIssue.handleStatus.name,
handleDate = firstIssue.handleDate,
handledBy = firstIssue.handledBy
handledBy = firstIssue.handledBy,
uomDesc = uomDesc,

)
}
}
@@ -1623,7 +1625,7 @@ open fun getBadItemList(issueCategory: String = "lot_issue"): List<StockIssueRes
// Get the first issue for non-aggregated fields
val firstIssue = issueList.first()
val (_, uomDesc) = resolveLotUomInfo(lotId)
// Sum issueQty for this lot (as requested: sum of issueQty)
val totalIssueQty = issueList.sumOf { it.issueQty ?: BigDecimal.ZERO }
@@ -1645,7 +1647,8 @@ open fun getBadItemList(issueCategory: String = "lot_issue"): List<StockIssueRes
pickerName = firstIssue.pickerName,
handleStatus = firstIssue.handleStatus.name,
handleDate = firstIssue.handleDate,
handledBy = firstIssue.handledBy
handledBy = firstIssue.handledBy,
uomDesc = uomDesc,
)
}
}
@@ -2606,7 +2609,14 @@ open fun getLotIssueDetails(lotId: Long, itemId: Long, issueType: String): LotIs
}
val firstIssue = issues.first()
val lotLine = inventoryLotLineRepository.findById(firstIssue.lotId!!).orElse(null)
val inQty = lotLine?.inQty ?: BigDecimal.ZERO
val outQty = lotLine?.outQty ?: BigDecimal.ZERO
val bookQty = inQty.subtract(outQty)

val uom = lotLine?.stockUom?.uom
val uomCode = uom?.code
val uomDesc = uom?.udfudesc
// Get DO/JO order codes
val issueDetails = issues.map { issue ->
var doOrderCode: String? = null
@@ -2643,7 +2653,10 @@ open fun getLotIssueDetails(lotId: Long, itemId: Long, issueType: String): LotIs
itemCode = firstIssue.itemCode,
itemDescription = firstIssue.itemDescription,
storeLocation = firstIssue.storeLocation,
issues = issueDetails
issues = issueDetails,
bookQty = bookQty,

uomDesc = uomDesc,
)
}

@@ -2970,5 +2983,16 @@ private fun checkPickOrderLineCompletion(pickOrderLineId: Long) {
println("⏳ Pick order line $pickOrderLineId not completed yet - has ${unfinishedLine.size} unfinished stock out lines")
}
}
private fun resolveLotUomInfo(lotId: Long?): Pair<String?, String?> {
if (lotId == null) return Pair(null, null)

val lotLine = inventoryLotLineRepository.findById(lotId).orElse(null)
?: return Pair(null, null)

val uom = lotLine.stockUom?.uom // ItemUom -> UomConversion
val uomCode = uom?.code
val uomDesc = uom?.udfudesc // 👈 你要的 udfudesc

return Pair(uomCode, uomDesc)
}
}

+ 2
- 1
src/main/java/com/ffii/fpsms/modules/pickOrder/web/models/PickExecutionIssueRequest.kt Целия файл

@@ -50,5 +50,6 @@ data class StockIssueResponse(
val pickerName: String?,
val handleStatus: String,
val handleDate: LocalDate?,
val handledBy: Long?
val handledBy: Long?,
val uomDesc: String?
)

+ 3
- 0
src/main/java/com/ffii/fpsms/modules/pickOrder/web/models/SubmitIssueRequest.kt Целия файл

@@ -46,6 +46,9 @@ data class LotIssueDetailResponse(
val itemCode: String?,
val itemDescription: String?,
val storeLocation: String?,
val bookQty: BigDecimal?,
val uomDesc: String?,

val issues: List<IssueDetailItem>
)



Зареждане…
Отказ
Запис