Compare commits

...

작성자 SHA1 메시지 날짜
  Fai Luk c422f5c09d reset function of po picking 4 일 전
3개의 변경된 파일113개의 추가작업 그리고 4개의 파일을 삭제
분할 보기
  1. +90
    -2
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoPickOrderService.kt
  2. +12
    -0
      src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DoPickOrderController.kt
  3. +11
    -2
      src/main/java/com/ffii/fpsms/modules/stock/entity/StockLedgerRepository.kt

+ 90
- 2
src/main/java/com/ffii/fpsms/modules/deliveryOrder/service/DoPickOrderService.kt 파일 보기

@@ -47,6 +47,9 @@ import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecordReposito
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecord
import org.springframework.context.annotation.Lazy
import com.ffii.fpsms.modules.pickOrder.entity.PickOrderLineRepository
import com.ffii.fpsms.modules.stock.entity.StockOutLIneRepository
import com.ffii.fpsms.modules.stock.entity.StockLedgerRepository
import com.ffii.fpsms.modules.pickOrder.entity.PickExecutionIssueRepository
import com.ffii.fpsms.modules.deliveryOrder.web.models.TicketReleaseTableResponse
import com.ffii.fpsms.modules.deliveryOrder.web.models.TruckScheduleDashboardResponse
import com.ffii.fpsms.modules.deliveryOrder.web.models.SearchDeliveryOrderInfoRequest
@@ -64,7 +67,10 @@ open class DoPickOrderService(
private val doPickOrderLineRepository: DoPickOrderLineRepository,
@Lazy private val deliveryOrderRepository: DeliveryOrderRepository,
private val doPickOrderLineRecordRepository: DoPickOrderLineRecordRepository,
private val pickOrderLineRepository: PickOrderLineRepository
private val pickOrderLineRepository: PickOrderLineRepository,
private val stockOutLineRepository: StockOutLIneRepository,
private val stockLedgerRepository: StockLedgerRepository,
private val pickExecutionIssueRepository: PickExecutionIssueRepository
) {
open fun findReleasedDoPickOrders(): List<DoPickOrder> {
return doPickOrderRepository.findByTicketStatusIn(
@@ -636,7 +642,6 @@ open class DoPickOrderService(
}
}


open fun getTicketReleaseTable(startDate: LocalDate? = null, endDate: LocalDate? = null): List<TicketReleaseTableResponse> {
val doPickOrders = if (startDate != null && endDate != null) {
doPickOrderRepository.findAllByDeletedFalseAndRequiredDeliveryDateBetween(startDate, endDate)
@@ -723,6 +728,89 @@ open class DoPickOrderService(
return allPickOrderLines.size
}

/**
* Reset a DO pick order back to the "non-pick" / pending state so it can be processed again.
* This is used by the Finished Good page to undo a ticket that has already been released/handled.
*/
@Transactional
open fun resetToNonPick(doPickOrderId: Long): MessageResponse {
val doPickOrder = doPickOrderRepository.findById(doPickOrderId).orElse(null)
?: return MessageResponse(
id = null,
code = "NOT_FOUND",
name = null,
type = null,
message = "DO Pick Order not found",
errorPosition = null,
entity = null
)

// Reset handler and ticket status/timestamps back to pending (non-pick)
doPickOrder.handledBy = null
doPickOrder.handlerName = null
doPickOrder.ticketStatus = DoPickOrderStatus.pending
doPickOrder.ticketReleaseTime = null
doPickOrder.ticketCompleteDateTime = null

// Reset scanned result & unassign related pick orders (do NOT delete pick orders/lines)
val doPickOrderLines = doPickOrderLineRepository.findByDoPickOrderIdAndDeletedFalse(doPickOrder.id!!)
val pickOrderIds = doPickOrderLines.mapNotNull { it.pickOrderId }.distinct()

if (pickOrderIds.isNotEmpty()) {
// 1) Load all pick-order lines under these pick orders
val allPickOrderLines = pickOrderIds.flatMap { pid ->
pickOrderLineRepository.findAllByPickOrderIdAndDeletedFalse(pid)
}
val pickOrderLineIds = allPickOrderLines.mapNotNull { it.id }.distinct()

if (pickOrderLineIds.isNotEmpty()) {
// 2) Delete stock_ledger rows linked to these stock_out_line rows
val stockOutLines = stockOutLineRepository.findAllByPickOrderLineIdInAndDeletedFalse(pickOrderLineIds)
if (stockOutLines.isNotEmpty()) {
val stockOutLineIds = stockOutLines.mapNotNull { it.id }.distinct()
if (stockOutLineIds.isNotEmpty()) {
val ledgers = stockLedgerRepository.findAllByStockOutLineIdInAndDeletedFalse(stockOutLineIds)
if (ledgers.isNotEmpty()) {
stockLedgerRepository.deleteAll(ledgers)
}
}
// 3) Delete stock_out_line rows (scan results)
stockOutLineRepository.deleteAll(stockOutLines)
}

// 4) Delete pick_execution_issue rows for these pick-order lines
pickOrderLineIds.forEach { polId ->
val issues = pickExecutionIssueRepository.findByPickOrderLineIdAndDeletedFalse(polId)
if (issues.isNotEmpty()) {
pickExecutionIssueRepository.deleteAll(issues)
}
}
}

// 5) Unassign pick orders and reset their status (keep rows)
val pickOrders = pickOrderRepository.findAllById(pickOrderIds)
if (pickOrders.isNotEmpty()) {
pickOrders.forEach { po ->
po.assignTo = null
po.status = PickOrderStatus.PENDING
}
pickOrderRepository.saveAll(pickOrders)
}
}

val saved = doPickOrderRepository.save(doPickOrder)

return MessageResponse(
id = saved.id,
code = "SUCCESS",
name = null,
type = null,
message = "DO Pick Order has been reset to non-pick state",
errorPosition = null,
entity = null
)
}

private fun countFGItemsFromRecord(doPickOrderRecord: DoPickOrderRecord): Int {

// RECORD_ID FROM DO_PICK_ORDER_RECORD TABLE


+ 12
- 0
src/main/java/com/ffii/fpsms/modules/deliveryOrder/web/DoPickOrderController.kt 파일 보기

@@ -134,4 +134,16 @@ class DoPickOrderController(
return doPickOrderService.getTruckScheduleDashboard(date ?: LocalDate.now())
}

@PostMapping("/reset-to-non-pick")
fun resetToNonPick(
@RequestParam("doPickOrderRecordId") doPickOrderRecordId: Long
): ResponseEntity<Void> {
val result = doPickOrderService.resetToNonPick(doPickOrderRecordId)
return if (result.code == "SUCCESS") {
ResponseEntity.noContent().build()
} else {
ResponseEntity.badRequest().build()
}
}

}

+ 11
- 2
src/main/java/com/ffii/fpsms/modules/stock/entity/StockLedgerRepository.kt 파일 보기

@@ -56,5 +56,14 @@ interface StockLedgerRepository: AbstractRepository<StockLedger, Long> {
WHERE sl.itemId = :itemId AND sl.deleted = false
ORDER BY sl.date DESC, sl.id DESC
""")
fun findLatestByItemId(@Param("itemId") itemId: Long): List<StockLedger>
}
fun findLatestByItemId(@Param("itemId") itemId: Long): List<StockLedger>

@Query("""
SELECT sl FROM StockLedger sl
WHERE sl.deleted = false
AND sl.stockOutLine.id IN :stockOutLineIds
""")
fun findAllByStockOutLineIdInAndDeletedFalse(
@Param("stockOutLineIds") stockOutLineIds: List<Long>
): List<StockLedger>
}

불러오는 중...
취소
저장