|
|
|
@@ -39,6 +39,7 @@ import com.ffii.fpsms.modules.stock.web.model.SuggestedPickLotForPoRequest |
|
|
|
import com.ffii.fpsms.modules.user.entity.UserRepository |
|
|
|
import com.ffii.fpsms.modules.user.service.UserService |
|
|
|
import org.springframework.data.domain.PageRequest |
|
|
|
import org.springframework.dao.DataIntegrityViolationException |
|
|
|
import org.springframework.http.HttpStatus |
|
|
|
import org.springframework.http.ResponseEntity |
|
|
|
import org.springframework.stereotype.Service |
|
|
|
@@ -1343,36 +1344,31 @@ open class PickOrderService( |
|
|
|
} |
|
|
|
|
|
|
|
println(" All pick orders in this do_pick_order are completed, moving to record table") |
|
|
|
val prefix = "DN" |
|
|
|
val midfix = CodeGenerator.DEFAULT_MIDFIX |
|
|
|
val latestCode = doPickOrderRecordRepository.findLatestDeliveryNoteCodeByPrefix("${prefix}-${midfix}") |
|
|
|
val deliveryNoteCode = CodeGenerator.generateNo(prefix = prefix, midfix = midfix, latestCode = latestCode) |
|
|
|
|
|
|
|
// 2) 先复制 do_pick_order -> do_pick_order_record |
|
|
|
val dpoRecord = DoPickOrderRecord( |
|
|
|
recordId =dpo.id, |
|
|
|
storeId = dpo.storeId ?: "", |
|
|
|
ticketNo = dpo.ticketNo ?: "", |
|
|
|
ticketStatus = DoPickOrderStatus.completed, |
|
|
|
truckId = dpo.truckId, |
|
|
|
|
|
|
|
truckDepartureTime = dpo.truckDepartureTime, |
|
|
|
shopId = dpo.shopId, |
|
|
|
handledBy = dpo.handledBy, |
|
|
|
handlerName = dpo.handlerName, |
|
|
|
doOrderId = dpo.doOrderId, |
|
|
|
pickOrderCode = dpo.pickOrderCode, |
|
|
|
deliveryOrderCode = dpo.deliveryOrderCode, |
|
|
|
deliveryNoteCode = deliveryNoteCode, |
|
|
|
loadingSequence = dpo.loadingSequence, |
|
|
|
ticketReleaseTime = dpo.ticketReleaseTime, |
|
|
|
ticketCompleteDateTime = java.time.LocalDateTime.now(), |
|
|
|
truckLanceCode = dpo.truckLanceCode, |
|
|
|
shopCode = dpo.shopCode, |
|
|
|
shopName = dpo.shopName, |
|
|
|
requiredDeliveryDate = dpo.requiredDeliveryDate |
|
|
|
) |
|
|
|
val savedHeader = doPickOrderRecordRepository.save(dpoRecord) |
|
|
|
val savedHeader = saveDoPickOrderRecordWithDnRetry { deliveryNoteCode -> |
|
|
|
DoPickOrderRecord( |
|
|
|
recordId = dpo.id, |
|
|
|
storeId = dpo.storeId ?: "", |
|
|
|
ticketNo = dpo.ticketNo ?: "", |
|
|
|
ticketStatus = DoPickOrderStatus.completed, |
|
|
|
truckId = dpo.truckId, |
|
|
|
truckDepartureTime = dpo.truckDepartureTime, |
|
|
|
shopId = dpo.shopId, |
|
|
|
handledBy = dpo.handledBy, |
|
|
|
handlerName = dpo.handlerName, |
|
|
|
doOrderId = dpo.doOrderId, |
|
|
|
pickOrderCode = dpo.pickOrderCode, |
|
|
|
deliveryOrderCode = dpo.deliveryOrderCode, |
|
|
|
deliveryNoteCode = deliveryNoteCode, |
|
|
|
loadingSequence = dpo.loadingSequence, |
|
|
|
ticketReleaseTime = dpo.ticketReleaseTime, |
|
|
|
ticketCompleteDateTime = java.time.LocalDateTime.now(), |
|
|
|
truckLanceCode = dpo.truckLanceCode, |
|
|
|
shopCode = dpo.shopCode, |
|
|
|
shopName = dpo.shopName, |
|
|
|
requiredDeliveryDate = dpo.requiredDeliveryDate |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
// 3) 复制行 do_pick_order_line -> do_pick_order_line_record |
|
|
|
val lines = doPickOrderLineRepository.findByDoPickOrderIdAndDeletedFalse(dpo.id!!) |
|
|
|
@@ -1548,35 +1544,31 @@ open class PickOrderService( |
|
|
|
|
|
|
|
private fun moveDoPickOrderToCompletedRecordAfterForce(dpo: DoPickOrder) { |
|
|
|
val doOrderIdForDelivery = dpo.doOrderId |
|
|
|
val prefix = "DN" |
|
|
|
val midfix = CodeGenerator.DEFAULT_MIDFIX |
|
|
|
val latestCode = doPickOrderRecordRepository.findLatestDeliveryNoteCodeByPrefix("$prefix-$midfix") |
|
|
|
val deliveryNoteCode = CodeGenerator.generateNo(prefix = prefix, midfix = midfix, latestCode = latestCode) |
|
|
|
|
|
|
|
val dpoRecord = DoPickOrderRecord( |
|
|
|
recordId = dpo.id, |
|
|
|
storeId = dpo.storeId ?: "", |
|
|
|
ticketNo = dpo.ticketNo ?: "", |
|
|
|
ticketStatus = DoPickOrderStatus.completed, |
|
|
|
truckId = dpo.truckId, |
|
|
|
truckDepartureTime = dpo.truckDepartureTime, |
|
|
|
pickOrderId = dpo.pickOrderId, |
|
|
|
doOrderId = dpo.doOrderId, |
|
|
|
ticketReleaseTime = dpo.ticketReleaseTime, |
|
|
|
shopId = dpo.shopId, |
|
|
|
handlerName = dpo.handlerName, |
|
|
|
handledBy = dpo.handledBy, |
|
|
|
ticketCompleteDateTime = LocalDateTime.now(), |
|
|
|
truckLanceCode = dpo.truckLanceCode, |
|
|
|
shopCode = dpo.shopCode, |
|
|
|
shopName = dpo.shopName, |
|
|
|
requiredDeliveryDate = dpo.requiredDeliveryDate, |
|
|
|
pickOrderCode = dpo.pickOrderCode, |
|
|
|
deliveryOrderCode = dpo.deliveryOrderCode, |
|
|
|
deliveryNoteCode = deliveryNoteCode, |
|
|
|
loadingSequence = dpo.loadingSequence, |
|
|
|
) |
|
|
|
val savedHeader = doPickOrderRecordRepository.save(dpoRecord) |
|
|
|
val savedHeader = saveDoPickOrderRecordWithDnRetry { deliveryNoteCode -> |
|
|
|
DoPickOrderRecord( |
|
|
|
recordId = dpo.id, |
|
|
|
storeId = dpo.storeId ?: "", |
|
|
|
ticketNo = dpo.ticketNo ?: "", |
|
|
|
ticketStatus = DoPickOrderStatus.completed, |
|
|
|
truckId = dpo.truckId, |
|
|
|
truckDepartureTime = dpo.truckDepartureTime, |
|
|
|
pickOrderId = dpo.pickOrderId, |
|
|
|
doOrderId = dpo.doOrderId, |
|
|
|
ticketReleaseTime = dpo.ticketReleaseTime, |
|
|
|
shopId = dpo.shopId, |
|
|
|
handlerName = dpo.handlerName, |
|
|
|
handledBy = dpo.handledBy, |
|
|
|
ticketCompleteDateTime = LocalDateTime.now(), |
|
|
|
truckLanceCode = dpo.truckLanceCode, |
|
|
|
shopCode = dpo.shopCode, |
|
|
|
shopName = dpo.shopName, |
|
|
|
requiredDeliveryDate = dpo.requiredDeliveryDate, |
|
|
|
pickOrderCode = dpo.pickOrderCode, |
|
|
|
deliveryOrderCode = dpo.deliveryOrderCode, |
|
|
|
deliveryNoteCode = deliveryNoteCode, |
|
|
|
loadingSequence = dpo.loadingSequence, |
|
|
|
) |
|
|
|
} |
|
|
|
|
|
|
|
val lines = doPickOrderLineRepository.findByDoPickOrderIdAndDeletedFalse(dpo.id!!) |
|
|
|
val lineRecords = lines.map { l: DoPickOrderLine -> |
|
|
|
@@ -1607,6 +1599,27 @@ open class PickOrderService( |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private fun saveDoPickOrderRecordWithDnRetry( |
|
|
|
maxAttempts: Int = 3, |
|
|
|
buildRecord: (String) -> DoPickOrderRecord |
|
|
|
): DoPickOrderRecord { |
|
|
|
val prefix = "DN" |
|
|
|
repeat(maxAttempts) { attempt -> |
|
|
|
val midfix = LocalDate.now().format(CodeGenerator.DEFAULT_FORMATTER) |
|
|
|
val latestCode = doPickOrderRecordRepository.findLatestDeliveryNoteCodeByPrefix("$prefix-$midfix") |
|
|
|
val deliveryNoteCode = CodeGenerator.generateNo(prefix = prefix, midfix = midfix, latestCode = latestCode) |
|
|
|
val dpoRecord = buildRecord(deliveryNoteCode) |
|
|
|
try { |
|
|
|
return doPickOrderRecordRepository.save(dpoRecord) |
|
|
|
} catch (e: DataIntegrityViolationException) { |
|
|
|
if (attempt == maxAttempts - 1) { |
|
|
|
throw e |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
throw IllegalStateException("Failed to generate unique delivery note code after $maxAttempts attempts") |
|
|
|
} |
|
|
|
|
|
|
|
@Transactional(rollbackFor = [java.lang.Exception::class]) |
|
|
|
open fun checkAndCompletePickOrderByConsoCode(consoCode: String): MessageResponse { |
|
|
|
try { |
|
|
|
|