|
|
@@ -47,6 +47,9 @@ import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecordReposito |
|
|
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecord |
|
|
import com.ffii.fpsms.modules.deliveryOrder.entity.DoPickOrderLineRecord |
|
|
import org.springframework.context.annotation.Lazy |
|
|
import org.springframework.context.annotation.Lazy |
|
|
import com.ffii.fpsms.modules.pickOrder.entity.PickOrderLineRepository |
|
|
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.TicketReleaseTableResponse |
|
|
import com.ffii.fpsms.modules.deliveryOrder.web.models.TruckScheduleDashboardResponse |
|
|
import com.ffii.fpsms.modules.deliveryOrder.web.models.TruckScheduleDashboardResponse |
|
|
import com.ffii.fpsms.modules.deliveryOrder.web.models.SearchDeliveryOrderInfoRequest |
|
|
import com.ffii.fpsms.modules.deliveryOrder.web.models.SearchDeliveryOrderInfoRequest |
|
|
@@ -64,7 +67,10 @@ open class DoPickOrderService( |
|
|
private val doPickOrderLineRepository: DoPickOrderLineRepository, |
|
|
private val doPickOrderLineRepository: DoPickOrderLineRepository, |
|
|
@Lazy private val deliveryOrderRepository: DeliveryOrderRepository, |
|
|
@Lazy private val deliveryOrderRepository: DeliveryOrderRepository, |
|
|
private val doPickOrderLineRecordRepository: DoPickOrderLineRecordRepository, |
|
|
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> { |
|
|
open fun findReleasedDoPickOrders(): List<DoPickOrder> { |
|
|
return doPickOrderRepository.findByTicketStatusIn( |
|
|
return doPickOrderRepository.findByTicketStatusIn( |
|
|
@@ -636,7 +642,6 @@ open class DoPickOrderService( |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
open fun getTicketReleaseTable(startDate: LocalDate? = null, endDate: LocalDate? = null): List<TicketReleaseTableResponse> { |
|
|
open fun getTicketReleaseTable(startDate: LocalDate? = null, endDate: LocalDate? = null): List<TicketReleaseTableResponse> { |
|
|
val doPickOrders = if (startDate != null && endDate != null) { |
|
|
val doPickOrders = if (startDate != null && endDate != null) { |
|
|
doPickOrderRepository.findAllByDeletedFalseAndRequiredDeliveryDateBetween(startDate, endDate) |
|
|
doPickOrderRepository.findAllByDeletedFalseAndRequiredDeliveryDateBetween(startDate, endDate) |
|
|
@@ -723,6 +728,89 @@ open class DoPickOrderService( |
|
|
return allPickOrderLines.size |
|
|
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 { |
|
|
private fun countFGItemsFromRecord(doPickOrderRecord: DoPickOrderRecord): Int { |
|
|
|
|
|
|
|
|
// RECORD_ID FROM DO_PICK_ORDER_RECORD TABLE |
|
|
// RECORD_ID FROM DO_PICK_ORDER_RECORD TABLE |
|
|
|