Merge remote-tracking branch 'origin/test' into dev
# Conflicts: # scripts/admin-test-env-modules/phase4-overseas-pda.mjs
This commit is contained in:
@@ -115,7 +115,9 @@ public class OrderRepository {
|
|||||||
.eq(OutboxEventEntity::getPublishStatus, "PENDING")
|
.eq(OutboxEventEntity::getPublishStatus, "PENDING")
|
||||||
.and(v -> v.isNull(OutboxEventEntity::getNextRetryAt)
|
.and(v -> v.isNull(OutboxEventEntity::getNextRetryAt)
|
||||||
.or().le(OutboxEventEntity::getNextRetryAt, LocalDateTime.now()))
|
.or().le(OutboxEventEntity::getNextRetryAt, LocalDateTime.now()))
|
||||||
.orderByAsc(OutboxEventEntity::getCreatedAt)
|
// Approval and its first declaration update can share the same DB timestamp.
|
||||||
|
// Keep the insertion order deterministic so the inbound exists before its update is delivered.
|
||||||
|
.orderByAsc(OutboxEventEntity::getCreatedAt, OutboxEventEntity::getId)
|
||||||
.last("LIMIT " + Math.min(Math.max(limit, 1), 100)));
|
.last("LIMIT " + Math.min(Math.max(limit, 1), 100)));
|
||||||
}
|
}
|
||||||
public void markOutboxPublished(long tenantId, long id, LocalDateTime publishedAt) {
|
public void markOutboxPublished(long tenantId, long id, LocalDateTime publishedAt) {
|
||||||
|
|||||||
+1
-1
@@ -147,7 +147,7 @@ class OrderRepositoryIsolationUpdateTest {
|
|||||||
ArgumentCaptor<Wrapper<OutboxEventEntity>> wrapper = ArgumentCaptor.forClass(Wrapper.class);
|
ArgumentCaptor<Wrapper<OutboxEventEntity>> wrapper = ArgumentCaptor.forClass(Wrapper.class);
|
||||||
verify(mapper).selectList(wrapper.capture());
|
verify(mapper).selectList(wrapper.capture());
|
||||||
assertThat(wrapper.getValue().getSqlSegment())
|
assertThat(wrapper.getValue().getSqlSegment())
|
||||||
.contains("aggregate_type", "publish_status")
|
.contains("aggregate_type", "publish_status", "created_at", "id")
|
||||||
.doesNotContain("event_type");
|
.doesNotContain("event_type");
|
||||||
assertThat(params(wrapper.getValue()).values())
|
assertThat(params(wrapper.getValue()).values())
|
||||||
.contains("FIRST_LEG_ORDER", "PENDING");
|
.contains("FIRST_LEG_ORDER", "PENDING");
|
||||||
|
|||||||
@@ -48,22 +48,27 @@ async function ensureMatsonSupplier(context, records) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function stableLoadedCartonMarks(items) {
|
export function stableLoadedCartonMarks(items) {
|
||||||
const used = new Set()
|
const groups = new Map()
|
||||||
return [...(Array.isArray(items) ? items : [])]
|
for (const item of [...(Array.isArray(items) ? items : [])]
|
||||||
.sort((left, right) => id(left?.loadingPlanItemId).localeCompare(id(right?.loadingPlanItemId)))
|
.sort((left, right) => id(left?.loadingPlanItemId).localeCompare(id(right?.loadingPlanItemId)))
|
||||||
.flatMap((item) => {
|
) {
|
||||||
const count = Math.max(0, Number(item?.pickedPackageCount) || 0)
|
const groupKey = id(item?.inboundId) || `item:${id(item?.loadingPlanItemId)}`
|
||||||
const labels = [...new Set((item?.boxCodes || [])
|
const group = groups.get(groupKey) || { count: 0, labels: new Set() }
|
||||||
.map((value) => String(value || '').trim()).filter((value) => value && !used.has(value)))]
|
group.count += Math.max(0, Number(item?.pickedPackageCount) || 0)
|
||||||
// Partial loading keeps the lowest carton indexes on the loaded source inbound and
|
for (const value of item?.boxCodes || []) {
|
||||||
// transfers the highest indexes to the remainder child. Mirror that settlement rule
|
const label = String(value || '').trim()
|
||||||
// instead of sampling labels, otherwise downstream PDA fixtures may reference cartons
|
if (label) group.labels.add(label)
|
||||||
// that were deliberately moved out of this container.
|
}
|
||||||
.sort((left, right) => left.localeCompare(right, undefined, { numeric: true, sensitivity: 'base' }))
|
groups.set(groupKey, group)
|
||||||
.slice(0, count)
|
}
|
||||||
labels.forEach((value) => used.add(value))
|
// Settlement transfers the highest carton indexes to the remainder child for the whole
|
||||||
return labels
|
// inbound, not per cargo line. Aggregate task rows by inbound before selecting the retained
|
||||||
})
|
// low indexes so the downstream fixture mirrors the persisted container manifest.
|
||||||
|
return [...groups.entries()]
|
||||||
|
.sort(([left], [right]) => left.localeCompare(right))
|
||||||
|
.flatMap(([, group]) => [...group.labels]
|
||||||
|
.sort((left, right) => left.localeCompare(right, undefined, { numeric: true, sensitivity: 'base' }))
|
||||||
|
.slice(0, group.count))
|
||||||
}
|
}
|
||||||
|
|
||||||
async function request(context, method, path, body, headers = {}) {
|
async function request(context, method, path, body, headers = {}) {
|
||||||
|
|||||||
@@ -436,9 +436,12 @@ test('preload and loading versions use immediate allocation and claim baselines'
|
|||||||
|
|
||||||
test('loaded carton fixture mirrors partial settlement and keeps the lowest carton indexes', () => {
|
test('loaded carton fixture mirrors partial settlement and keeps the lowest carton indexes', () => {
|
||||||
const marks = stableLoadedCartonMarks([
|
const marks = stableLoadedCartonMarks([
|
||||||
{ loadingPlanItemId: '20', pickedPackageCount: 3,
|
{ loadingPlanItemId: '30', inboundId: '200', pickedPackageCount: 1,
|
||||||
boxCodes: ['NYEXX2609020358#8-5', 'NYEXX2609020358#8-2', 'NYEXX2609020358#8-1', 'NYEXX2609020358#8-3'] },
|
boxCodes: ['NYEXX2609020358#8-5'] },
|
||||||
{ loadingPlanItemId: '10', pickedPackageCount: 1, boxCodes: ['NYEXX2609020357#4-4', 'NYEXX2609020357#4-1'] },
|
{ loadingPlanItemId: '20', inboundId: '200', pickedPackageCount: 2,
|
||||||
|
boxCodes: ['NYEXX2609020358#8-2', 'NYEXX2609020358#8-1', 'NYEXX2609020358#8-3'] },
|
||||||
|
{ loadingPlanItemId: '10', inboundId: '100', pickedPackageCount: 1,
|
||||||
|
boxCodes: ['NYEXX2609020357#4-4', 'NYEXX2609020357#4-1'] },
|
||||||
])
|
])
|
||||||
assert.deepEqual(marks, [
|
assert.deepEqual(marks, [
|
||||||
'NYEXX2609020357#4-1',
|
'NYEXX2609020357#4-1',
|
||||||
|
|||||||
Reference in New Issue
Block a user