Parcourir la source

update pick order efficient

stable1
CANCERYS\kw093 il y a 2 semaines
Parent
révision
7c3f781852
3 fichiers modifiés avec 70 ajouts et 11 suppressions
  1. +50
    -1
      src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderRepository.kt
  2. +7
    -10
      src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt
  3. +13
    -0
      src/main/resources/db/changelog/changes/20260420_01_Enson/01_alter_stock_take.sql

+ 50
- 1
src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderRepository.kt Voir le fichier

@@ -3,6 +3,7 @@ package com.ffii.fpsms.modules.pickOrder.entity
import com.ffii.core.support.AbstractRepository
import com.ffii.fpsms.modules.pickOrder.entity.projection.PickOrderInfo
import com.ffii.fpsms.modules.pickOrder.enums.PickOrderStatus
import com.ffii.fpsms.modules.pickOrder.enums.PickOrderType
import com.ffii.fpsms.modules.pickOrder.web.models.SearchPickOrderRequest
import org.springframework.data.domain.Page
import org.springframework.data.domain.Pageable
@@ -12,7 +13,7 @@ import org.springframework.stereotype.Repository
import com.ffii.fpsms.modules.user.entity.User
import java.io.Serializable
import java.time.LocalDateTime
import org.springframework.data.jpa.repository.Modifying
@Repository
interface PickOrderRepository : AbstractRepository<PickOrder, Long> {
fun findPickOrderInfoByDeletedIsFalse(): List<PickOrderInfo>
@@ -130,4 +131,52 @@ fun findAllCompletedWithJobOrderPlanStartOnDay(
@Param("planStartFrom") planStartFrom: LocalDateTime,
@Param("planStartToExclusive") planStartToExclusive: LocalDateTime,
): List<PickOrder>


@Modifying(clearAutomatically = true, flushAutomatically = true)
@Query(
value = """
UPDATE fpsmsdb.pick_order
SET assignTo = :userId,
status = :status,
modified = :modified,
modifiedBy = :modifiedBy
WHERE deliveryOrderPickOrderId = :dopoId
AND deleted = 0
""",
nativeQuery = true
)
fun bulkAssignWorkbenchTicket(
@Param("dopoId") dopoId: Long,
@Param("userId") userId: Long,
@Param("status") status: String, // 传 "released"
@Param("modified") modified: LocalDateTime,
@Param("modifiedBy") modifiedBy: String,
): Int


@Query(
value = """
SELECT id
FROM fpsmsdb.pick_order
WHERE deliveryOrderPickOrderId = :dopoId
AND deleted = 0
""",
nativeQuery = true
)
fun findIdsByDeliveryOrderPickOrderId(@Param("dopoId") dopoId: Long): List<Long>

@Query("""
SELECT p.id
FROM PickOrder p
WHERE p.deleted = false
AND p.assignTo.id = :userId
AND p.status = :status
AND (p.type IS NULL OR p.type NOT IN :excludedTypes)
""")
fun findReleasedIdsForPickExecution(
@Param("userId") userId: Long,
@Param("status") status: PickOrderStatus,
@Param("excludedTypes") excludedTypes: List<PickOrderType>,
): List<Long>
}

+ 7
- 10
src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt Voir le fichier

@@ -18,6 +18,7 @@ import com.ffii.fpsms.modules.pickOrder.entity.PickOrderRepository
import com.ffii.fpsms.modules.pickOrder.entity.projection.PickOrderInfo
import com.ffii.fpsms.modules.pickOrder.enums.PickOrderLineStatus
import com.ffii.fpsms.modules.pickOrder.enums.PickOrderStatus
import com.ffii.fpsms.modules.pickOrder.enums.PickOrderType
import com.ffii.fpsms.modules.pickOrder.entity.PickOrderGroup
import com.ffii.fpsms.modules.pickOrder.entity.PickOrderGroupRepository
import com.ffii.fpsms.modules.pickOrder.web.models.*
@@ -2352,16 +2353,12 @@ open class PickOrderService(
}

open fun getPickOrderDetailsOptimizedByUser(userId: Long): GetPickOrderInfoResponse {
val today = LocalDate.now()
val zero = BigDecimal.ZERO

// Get all released pick order IDs for the user
val allPickOrders = pickOrderRepository.findAll()
val releasedPickOrderIds = allPickOrders
.filter { it.status == PickOrderStatus.RELEASED }
.filter { it.assignTo?.id == userId }
.filter { it.type?.value != "do" && it.type?.value != "jo" } // 排除 do 和 job 类型
.map { it.id!! }
// Fetch pre-filtered IDs directly from DB to avoid full-table scan.
val releasedPickOrderIds = pickOrderRepository.findReleasedIdsForPickExecution(
userId,
PickOrderStatus.RELEASED,
listOf(PickOrderType.DELIVERY_ORDER, PickOrderType.JOB_ORDER)
)

if (releasedPickOrderIds.isEmpty()) {
return GetPickOrderInfoResponse(


+ 13
- 0
src/main/resources/db/changelog/changes/20260420_01_Enson/01_alter_stock_take.sql Voir le fichier

@@ -0,0 +1,13 @@
--liquibase formatted sql

--changeset Enson:20260420-01
CREATE INDEX idx_po_assign_status_type_deleted_id
ON fpsmsdb.pick_order (assignTo, status, type, deleted, id);

--changeset Enson:20260420-02
CREATE INDEX idx_inv_item_deleted
ON fpsmsdb.inventory (itemId, deleted);

--changeset Enson:20260420-03
CREATE INDEX idx_sol_polid_deleted_status_qty
ON fpsmsdb.stock_out_line (pickOrderLineId, deleted, status, qty);

Chargement…
Annuler
Enregistrer