优化
This commit is contained in:
@@ -23,6 +23,7 @@ public interface PendingReviewOrderClient {
|
||||
@RequestParam(required = false) String inboundCode,
|
||||
@RequestParam(required = false) String createdStart,
|
||||
@RequestParam(required = false) String createdEnd,
|
||||
@RequestParam(required = false) List<Long> excludedOrderIds,
|
||||
@RequestParam long page,
|
||||
@RequestParam long size);
|
||||
|
||||
|
||||
@@ -28,6 +28,27 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ba
|
||||
""")
|
||||
List<PlanColoadMemberRow> planColoadMembers(@Param("planId") long planId);
|
||||
|
||||
@Select("""
|
||||
<script>
|
||||
SELECT DISTINCT item.order_id
|
||||
FROM fl_loading_plan_item item
|
||||
JOIN fl_loading_plan plan ON plan.id=item.loading_plan_id
|
||||
JOIN fl_inbound_order inbound
|
||||
ON inbound.tenant_id=item.account_id AND inbound.id=item.inbound_id
|
||||
WHERE item.deleted=0 AND plan.plan_status IN ('EDITING','LOADING')
|
||||
AND item.order_id IS NOT NULL
|
||||
AND inbound.channel_code IN
|
||||
<foreach collection="actualChannels" item="channel" open="(" separator="," close=")">#{channel}</foreach>
|
||||
<if test="query.warehouseId != null">AND inbound.warehouse_id=#{query.warehouseId}</if>
|
||||
<if test="query.customerId != null">AND item.account_id=#{query.customerId}</if>
|
||||
<if test="query.inboundCode != null and query.inboundCode.trim() != ''">
|
||||
AND item.inbound_code=#{query.inboundCode}
|
||||
</if>
|
||||
</script>
|
||||
""")
|
||||
List<Long> occupiedOrderIds(@Param("query") InboundCandidateQuery query,
|
||||
@Param("actualChannels") Set<String> actualChannels);
|
||||
|
||||
@Select("""
|
||||
SELECT o.tenant_id accountId,o.id inboundId,i.inbound_detail_id inboundDetailId,
|
||||
o.order_id orderId,o.order_no orderNo,o.inbound_code inboundCode,
|
||||
@@ -113,6 +134,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ba
|
||||
o.process_status IN ('WAIT_MEASURE','MEASURING','MEASURE_PENDING','MEASURE_REJECTED',
|
||||
'WAIT_PRICING','FEE_CONFIRMING','INBOUNDING','WAIT_SPLIT','LOADING')
|
||||
)
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM fl_loading_plan_item active_item
|
||||
WHERE active_item.account_id=o.tenant_id AND active_item.inbound_id=o.id
|
||||
AND active_item.deleted=0
|
||||
)
|
||||
) eligible
|
||||
LEFT JOIN fl_coload_group_member current_member
|
||||
ON current_member.tenant_id=eligible.accountId AND current_member.inbound_id=eligible.inboundId
|
||||
|
||||
@@ -59,6 +59,9 @@ public class SmartLoadingRepository {
|
||||
public List<PlanColoadMemberRow> planColoadMembers(long planId) {
|
||||
return candidates.planColoadMembers(planId);
|
||||
}
|
||||
public List<Long> occupiedOrderIds(InboundCandidateQuery query, Set<String> actualChannels) {
|
||||
return candidates.occupiedOrderIds(query, actualChannels);
|
||||
}
|
||||
public Candidate candidate(long planId, long warehouseId, long inboundId, long detailId) {
|
||||
return candidates.candidate(planId, warehouseId, inboundId, detailId);
|
||||
}
|
||||
|
||||
@@ -253,6 +253,8 @@ public class LoadingPickService {
|
||||
Task replay = replayTaskOperation(taskId, operationId, requestHash, operatorId);
|
||||
if (replay != null) return replay;
|
||||
LoadingPickTaskEntity task = requiredLoadingTaskForUpdate(taskId);
|
||||
replay = replayTaskOperation(taskId, operationId, requestHash, operatorId);
|
||||
if (replay != null) return replay;
|
||||
LoadingPickAssignmentEntity existing = repository.assignment(taskId);
|
||||
if (existing == null) {
|
||||
if (request.expectedAssignmentVersion() != 0
|
||||
@@ -282,6 +284,8 @@ public class LoadingPickService {
|
||||
Task replay = replayTaskOperation(taskId, operationId, requestHash, operatorId);
|
||||
if (replay != null) return replay;
|
||||
LoadingPickTaskEntity task = requiredLoadingTaskForUpdate(taskId);
|
||||
replay = replayTaskOperation(taskId, operationId, requestHash, operatorId);
|
||||
if (replay != null) return replay;
|
||||
LoadingPickAssignmentEntity existing = repository.assignment(taskId);
|
||||
int changed = existing == null
|
||||
? request.expectedAssignmentVersion() == 0
|
||||
@@ -310,6 +314,12 @@ public class LoadingPickService {
|
||||
return view(requiredTask(taskId), request.warehouseId());
|
||||
}
|
||||
LoadingPickTaskEntity task = requiredAssignedLoadingTaskForUpdate(taskId, operatorId);
|
||||
requireNoTaskOperation(operationId);
|
||||
replay = repository.history(operationId);
|
||||
if (replay != null) {
|
||||
assertReplay(replay, taskId, itemId, requestHash);
|
||||
return view(task, request.warehouseId());
|
||||
}
|
||||
LoadingPickItemEntity item = repository.item(taskId, itemId, request.warehouseId());
|
||||
if (item == null) {
|
||||
throw new BizException(ResultCode.NOT_FOUND, "PDA拣货明细不存在");
|
||||
@@ -347,6 +357,12 @@ public class LoadingPickService {
|
||||
return view(requiredTask(taskId), request.warehouseId());
|
||||
}
|
||||
LoadingPickTaskEntity task = requiredAssignedLoadingTaskForUpdate(taskId, operatorId);
|
||||
requireNoTaskOperation(operationId);
|
||||
replay = repository.history(operationId);
|
||||
if (replay != null) {
|
||||
assertReplay(replay, taskId, itemId, requestHash);
|
||||
return view(task, request.warehouseId());
|
||||
}
|
||||
requireWarehouseItem(taskId, itemId, request.warehouseId());
|
||||
if (repository.partial(itemId, request.finalPickedPackageCount(), release.mode(), release.json(),
|
||||
request.version(), request.warehouseId()) != 1) {
|
||||
@@ -372,6 +388,12 @@ public class LoadingPickService {
|
||||
return view(requiredTask(taskId), request.warehouseId());
|
||||
}
|
||||
LoadingPickTaskEntity task = requiredAssignedLoadingTaskForUpdate(taskId, operatorId);
|
||||
requireNoTaskOperation(operationId);
|
||||
replay = repository.history(operationId);
|
||||
if (replay != null) {
|
||||
assertReplay(replay, taskId, itemId, requestHash);
|
||||
return view(task, request.warehouseId());
|
||||
}
|
||||
LoadingPickItemEntity item = requireWarehouseItem(taskId, itemId, request.warehouseId());
|
||||
if (repository.hasPickedOrPartialItem(taskId, item.getInboundId())) {
|
||||
throw conflict("同一入库单已存在已拣或部分拣货明细,不能跳拣并恢复智能装柜候选");
|
||||
|
||||
@@ -125,24 +125,28 @@ public class SmartLoadingService {
|
||||
? EnumSet.allOf(CandidateOrderStatus.class)
|
||||
: EnumSet.copyOf(query.orderStatuses());
|
||||
boolean includePending = selected.remove(CandidateOrderStatus.PENDING_REVIEW);
|
||||
InboundCandidateQuery firstlegQuery = withStatuses(query, List.copyOf(selected), 1, 1);
|
||||
if (!includePending) return firstlegCandidates(withStatuses(query, List.copyOf(selected),
|
||||
query.page(), query.size()), actualChannels);
|
||||
if (selected.isEmpty()) return pendingReviewCandidates(query, actualChannels, query.page(), query.size());
|
||||
|
||||
PageResult<InboundCandidate> pendingCount = pendingReviewCandidates(query, actualChannels, 1, 1);
|
||||
PageResult<InboundCandidate> firstlegCount = firstlegCandidates(firstlegQuery, actualChannels);
|
||||
long total = pendingCount.total() + firstlegCount.total();
|
||||
long offset = Math.multiplyExact(query.page() - 1, query.size());
|
||||
PageResult<InboundCandidate> pendingPage = pendingReviewCandidates(query, actualChannels,
|
||||
query.page(), query.size());
|
||||
List<InboundCandidate> records = new ArrayList<>();
|
||||
if (offset < pendingCount.total()) {
|
||||
records.addAll(pendingReviewRange(query, actualChannels, offset, query.size()));
|
||||
}
|
||||
long firstlegOffset = Math.max(0, offset - pendingCount.total());
|
||||
int remaining = Math.toIntExact(query.size() - records.size());
|
||||
if (remaining > 0 && firstlegOffset < firstlegCount.total()) {
|
||||
records.addAll(firstlegRange(query, actualChannels, List.copyOf(selected), firstlegOffset, remaining));
|
||||
PageResult<InboundCandidate> firstlegPage;
|
||||
if (offset < pendingPage.total()) {
|
||||
records.addAll(pendingPage.records());
|
||||
int remaining = Math.toIntExact(query.size() - records.size());
|
||||
firstlegPage = firstlegCandidates(withStatuses(query, List.copyOf(selected), 1,
|
||||
Math.max(1, remaining)), actualChannels);
|
||||
if (remaining > 0) records.addAll(firstlegPage.records());
|
||||
} else {
|
||||
long firstlegOffset = offset - pendingPage.total();
|
||||
firstlegPage = firstlegRange(query, actualChannels, List.copyOf(selected),
|
||||
firstlegOffset, query.size());
|
||||
records.addAll(firstlegPage.records());
|
||||
}
|
||||
long total = pendingPage.total() + firstlegPage.total();
|
||||
long pages = total == 0 ? 0 : (total + query.size() - 1) / query.size();
|
||||
return new PageResult<>(records, query.page(), query.size(), total, pages);
|
||||
}
|
||||
@@ -184,7 +188,7 @@ public class SmartLoadingService {
|
||||
try {
|
||||
response = pendingReviewOrders.page(internalToken, List.copyOf(actualChannels), query.warehouseId(),
|
||||
query.customerId(), query.inboundCode(), isoDate(query.createdStart()), isoDate(query.createdEnd()),
|
||||
page, size);
|
||||
repository.occupiedOrderIds(query, actualChannels), page, size);
|
||||
} catch (RuntimeException exception) {
|
||||
throw new BizException(ResultCode.SERVICE_UNAVAILABLE, "待审核订单服务暂时不可用");
|
||||
}
|
||||
@@ -205,27 +209,20 @@ public class SmartLoadingService {
|
||||
return value == null ? null : value.toString();
|
||||
}
|
||||
|
||||
private List<InboundCandidate> pendingReviewRange(InboundCandidateQuery query, Set<String> channels,
|
||||
long offset, long limit) {
|
||||
return pageRange(offset, limit, (page, size) -> pendingReviewCandidates(query, channels, page, size));
|
||||
}
|
||||
|
||||
private List<InboundCandidate> firstlegRange(InboundCandidateQuery query, Set<String> channels,
|
||||
List<CandidateOrderStatus> statuses,
|
||||
long offset, long limit) {
|
||||
return pageRange(offset, limit, (page, size) -> firstlegCandidates(
|
||||
withStatuses(query, statuses, page, size), channels));
|
||||
}
|
||||
|
||||
private static List<InboundCandidate> pageRange(long offset, long limit,
|
||||
java.util.function.BiFunction<Long, Long, PageResult<InboundCandidate>> source) {
|
||||
if (limit <= 0) return List.of();
|
||||
private PageResult<InboundCandidate> firstlegRange(InboundCandidateQuery query, Set<String> channels,
|
||||
List<CandidateOrderStatus> statuses,
|
||||
long offset, long limit) {
|
||||
if (limit <= 0) return new PageResult<>(List.of(), 1, 1, 0, 0);
|
||||
final long chunk = 200;
|
||||
long page = offset / chunk + 1;
|
||||
int skip = Math.toIntExact(offset % chunk);
|
||||
List<InboundCandidate> result = new ArrayList<>();
|
||||
long total = 0;
|
||||
while (result.size() < limit) {
|
||||
List<InboundCandidate> rows = source.apply(page++, chunk).records();
|
||||
PageResult<InboundCandidate> sourcePage = firstlegCandidates(
|
||||
withStatuses(query, statuses, page++, chunk), channels);
|
||||
total = sourcePage.total();
|
||||
List<InboundCandidate> rows = sourcePage.records();
|
||||
if (rows.isEmpty()) break;
|
||||
int from = Math.min(skip, rows.size());
|
||||
int take = Math.min(Math.toIntExact(limit - result.size()), rows.size() - from);
|
||||
@@ -233,7 +230,8 @@ public class SmartLoadingService {
|
||||
skip = 0;
|
||||
if (rows.size() < chunk) break;
|
||||
}
|
||||
return List.copyOf(result);
|
||||
return new PageResult<>(List.copyOf(result), query.page(), query.size(), total,
|
||||
total == 0 ? 0 : (total + query.size() - 1) / query.size());
|
||||
}
|
||||
|
||||
private static InboundCandidateQuery withStatuses(InboundCandidateQuery source,
|
||||
@@ -1268,7 +1266,8 @@ public class SmartLoadingService {
|
||||
private PendingReviewOrderClient.Row requirePendingReviewOrder(AssignPendingReviewRequest request) {
|
||||
try {
|
||||
ApiResponse<PageResult<PendingReviewOrderClient.Row>> response = pendingReviewOrders.page(
|
||||
internalToken, null, null, request.customerId(), request.inboundCode(), null, null, 1, 2);
|
||||
internalToken, null, null, request.customerId(), request.inboundCode(), null, null,
|
||||
null, 1, 2);
|
||||
if (response == null || !response.successful() || response.data() == null) throw unavailable();
|
||||
return response.data().records().stream()
|
||||
.filter(row -> Objects.equals(row.orderId(), request.orderId())
|
||||
|
||||
Reference in New Issue
Block a user