diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderRepository.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderRepository.kt index c4a864d..6616cdc 100644 --- a/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderRepository.kt +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/entity/PickOrderRepository.kt @@ -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 { fun findPickOrderInfoByDeletedIsFalse(): List @@ -130,4 +131,52 @@ fun findAllCompletedWithJobOrderPlanStartOnDay( @Param("planStartFrom") planStartFrom: LocalDateTime, @Param("planStartToExclusive") planStartToExclusive: LocalDateTime, ): List + + +@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 + +@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, +): List } \ No newline at end of file diff --git a/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt b/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt index fee6c22..8c13572 100644 --- a/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt +++ b/src/main/java/com/ffii/fpsms/modules/pickOrder/service/PickOrderService.kt @@ -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( diff --git a/src/main/resources/db/changelog/changes/20260420_01_Enson/01_alter_stock_take.sql b/src/main/resources/db/changelog/changes/20260420_01_Enson/01_alter_stock_take.sql new file mode 100644 index 0000000..46bad22 --- /dev/null +++ b/src/main/resources/db/changelog/changes/20260420_01_Enson/01_alter_stock_take.sql @@ -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); \ No newline at end of file