fix: enforce stable shadow snapshot boundaries

This commit is contained in:
zgw
2026-09-03 15:07:37 +08:00
parent 935d7af43d
commit d77fac1d56
12 changed files with 256 additions and 88 deletions

View File

@@ -379,7 +379,9 @@ public final class JdbcWarehouseRepository implements WarehouseRepository {
+ "ORDER BY lane_code, depth, space_id", parameters, rawSpaceMapper());
List<InventoryItem> inventory = named.query("SELECT i.stock_id, i.space_id, i.tray_code, i.project_no, "
+ "i.product_no, i.lot_no, i.inbound_time_raw, i.inbound_at, i.quantity, i.out_quantity "
+ "FROM " + dialect.inventoryView() + " i JOIN " + dialect.spaceStateView() + " s ON s.space_id = i.space_id "
+ "FROM " + dialect.inventoryView() + " i JOIN " + dialect.spaceStateView()
+ " s ON s.warehouse_id = i.warehouse_id AND s.snapshot_generation = i.snapshot_generation "
+ "AND s.space_id = i.space_id "
+ "WHERE s.warehouse_id = :warehouse AND s.lane_code IN (:lanes) "
+ "ORDER BY i.space_id, i.stock_id", parameters, inventoryMapper());
Map<String, List<InventoryItem>> inventoryBySpace = inventory.stream()
@@ -474,7 +476,9 @@ public final class JdbcWarehouseRepository implements WarehouseRepository {
.addValue("product", blankToNull(search.productNo()));
String sql = "SELECT i.stock_id, i.space_id, s.lane_code, s.floor_no, i.tray_code, i.project_no, "
+ "i.product_no, i.lot_no, i.inbound_time_raw, i.inbound_at FROM " + dialect.inventoryView()
+ " i JOIN " + dialect.spaceStateView() + " s ON s.space_id = i.space_id "
+ " i JOIN " + dialect.spaceStateView()
+ " s ON s.warehouse_id = i.warehouse_id AND s.snapshot_generation = i.snapshot_generation "
+ "AND s.space_id = i.space_id "
+ "WHERE s.warehouse_id = :warehouse AND " + predicate
+ " ORDER BY i.inbound_at, i.inbound_time_raw, i.stock_id";
List<OutboundStockMatch> matches = named.query(sql, parameters, (rs, row) -> new OutboundStockMatch(
@@ -503,7 +507,9 @@ public final class JdbcWarehouseRepository implements WarehouseRepository {
+ "WHEN s.stock_tray_count = 0 THEN NULLIF(LTRIM(RTRIM(s.space_tray_code)), '') END";
Integer count = named.queryForObject("SELECT COUNT(DISTINCT " + usableTray + ") FROM "
+ dialect.spaceStateView() + " s JOIN " + dialect.inventoryView()
+ " i ON i.space_id = s.space_id WHERE s.warehouse_id = :warehouse "
+ " i ON i.warehouse_id = s.warehouse_id "
+ "AND i.snapshot_generation = s.snapshot_generation AND i.space_id = s.space_id "
+ "WHERE s.warehouse_id = :warehouse "
+ "AND NULLIF(LTRIM(RTRIM(i.project_no)), '') = :project AND s.space_status = '2' "
+ "AND s.role = 'STORAGE' AND s.depth IS NOT NULL AND s.pending_outbound = "
+ dialect.falseLiteral() + " AND s.reserved = " + dialect.falseLiteral()

View File

@@ -966,9 +966,9 @@ BEGIN
+ (SELECT COUNT_BIG(*) FROM dbo.in_stockin_detail inbound WITH (NOLOCK)
JOIN dbo.mydo_job_detail detail WITH (NOLOCK) ON detail.stockin_detail_id = inbound.stockin_detail_id
JOIN dbo.mydo_job job WITH (NOLOCK) ON job.job_id = detail.job_id
WHERE job.warehouse_id = @warehouse_id)
WHERE job.finish_time IS NULL OR LTRIM(RTRIM(job.finish_time)) = '')
+ (SELECT COUNT_BIG(*) FROM dbo.out_stockout_detail outbound WITH (NOLOCK)
WHERE outbound.warehouse_id = @warehouse_id);
WHERE ISNULL(outbound.quantity, 0) > ISNULL(outbound.allot_quantity, 0));
SELECT @source_payload = ISNULL(CONVERT(nvarchar(max), (
SELECT cargo.cargo_space_id AS [@space_id], cargo.warehouse_id AS [@warehouse_id],
@@ -1028,22 +1028,27 @@ BEGIN
inbound.stockin_id AS [@stockin_id], inbound.lot_no AS [@lot_no],
inbound.product_id AS [@product_id], inbound.quantity AS [@quantity],
inbound.assign_num AS [@assign_num], inbound.spare4 AS [@project_no],
job.warehouse_id AS [@warehouse_id], detail.job_id AS [@job_id]
job.warehouse_id AS [@warehouse_id], job.task_no AS [@task_no],
job.tray_code AS [@tray_code], detail.job_id AS [@job_id],
detail.in_or_out_id AS [@request_id]
FROM dbo.in_stockin_detail inbound WITH (NOLOCK)
JOIN dbo.mydo_job_detail detail WITH (NOLOCK) ON detail.stockin_detail_id = inbound.stockin_detail_id
JOIN dbo.mydo_job job WITH (NOLOCK) ON job.job_id = detail.job_id
WHERE job.warehouse_id = @warehouse_id
WHERE job.finish_time IS NULL OR LTRIM(RTRIM(job.finish_time)) = ''
ORDER BY inbound.stockin_detail_id
FOR XML PATH('inbound'), ROOT('inbound_requests'), TYPE
)), '');
SET @source_payload = @source_payload + '|OUTBOUND|' + ISNULL(CONVERT(nvarchar(max), (
SELECT outbound.stockout_detail_id AS [@stockout_detail_id], outbound.warehouse_id AS [@warehouse_id],
warehouse.project_no AS [@project_no],
outbound.product_id AS [@product_id], outbound.lot_no AS [@lot_no],
outbound.quantity AS [@quantity], outbound.assign_num AS [@assign_num],
outbound.allot_quantity AS [@allot_quantity], outbound.create_time AS [@create_time]
FROM dbo.out_stockout_detail outbound WITH (NOLOCK)
WHERE outbound.warehouse_id = @warehouse_id
LEFT JOIN dbo.bas_warehouse warehouse WITH (NOLOCK)
ON warehouse.warehouse_id = outbound.warehouse_id
WHERE ISNULL(outbound.quantity, 0) > ISNULL(outbound.allot_quantity, 0)
ORDER BY outbound.stockout_detail_id
FOR XML PATH('outbound'), ROOT('outbound_requests'), TYPE
)), '');
@@ -1096,22 +1101,22 @@ BEGIN
AND (job.finish_time IS NULL OR LTRIM(RTRIM(job.finish_time)) = '');
;WITH inbound_source AS (
SELECT job.warehouse_id, job.task_no, job.tray_code,
SELECT @warehouse_id AS warehouse_id, job.task_no, job.tray_code,
detail.in_or_out_id AS request_id, job.warehouse_id AS raw_warehouse_id,
inbound.spare4 AS project_no, inbound.product_id, inbound.lot_no,
ROW_NUMBER() OVER (
PARTITION BY job.warehouse_id, job.task_no, job.tray_code
PARTITION BY job.task_no, job.tray_code
ORDER BY inbound.stockin_detail_id, detail.job_detail_id) AS source_rank
FROM dbo.in_stockin_detail inbound WITH (NOLOCK)
JOIN dbo.mydo_job_detail detail WITH (NOLOCK)
ON detail.stockin_detail_id = inbound.stockin_detail_id
JOIN dbo.mydo_job job WITH (NOLOCK) ON job.job_id = detail.job_id
WHERE job.warehouse_id = @warehouse_id
WHERE job.finish_time IS NULL OR LTRIM(RTRIM(job.finish_time)) = ''
)
INSERT INTO alg.shadow_inbound_request_snapshot (
warehouse_id, task_no, tray_no, request_id, raw_warehouse_id,
project_no, product_id, lot_no, snapshot_generation, synchronized_at)
SELECT warehouse_id, ISNULL(task_no, ''), ISNULL(tray_code, ''), request_id,
SELECT @warehouse_id, ISNULL(task_no, ''), ISNULL(tray_code, ''), request_id,
raw_warehouse_id, project_no, product_id, lot_no,
@snapshot_generation, @synchronized_at
FROM inbound_source
@@ -1120,11 +1125,14 @@ BEGIN
INSERT INTO alg.shadow_outbound_request_snapshot (
warehouse_id, stockout_detail_id, raw_warehouse_id, project_no, product_id,
requested_quantity, snapshot_generation, synchronized_at)
SELECT outbound.warehouse_id, outbound.stockout_detail_id, outbound.warehouse_id,
NULL, outbound.product_id, CONVERT(decimal(38,6), outbound.quantity),
SELECT @warehouse_id, outbound.stockout_detail_id, outbound.warehouse_id,
NULLIF(LTRIM(RTRIM(warehouse.project_no)), ''), outbound.product_id,
CONVERT(decimal(38,6), outbound.quantity),
@snapshot_generation, @synchronized_at
FROM dbo.out_stockout_detail outbound WITH (NOLOCK)
WHERE outbound.warehouse_id = @warehouse_id;
LEFT JOIN dbo.bas_warehouse warehouse WITH (NOLOCK)
ON warehouse.warehouse_id = outbound.warehouse_id
WHERE ISNULL(outbound.quantity, 0) > ISNULL(outbound.allot_quantity, 0);
EXEC alg.usp_rebuild_space_topology @warehouse_id = @warehouse_id,
@snapshot_generation = @snapshot_generation;
@@ -1145,9 +1153,9 @@ BEGIN
+ (SELECT COUNT_BIG(*) FROM dbo.in_stockin_detail inbound WITH (NOLOCK)
JOIN dbo.mydo_job_detail detail WITH (NOLOCK) ON detail.stockin_detail_id = inbound.stockin_detail_id
JOIN dbo.mydo_job job WITH (NOLOCK) ON job.job_id = detail.job_id
WHERE job.warehouse_id = @warehouse_id)
WHERE job.finish_time IS NULL OR LTRIM(RTRIM(job.finish_time)) = '')
+ (SELECT COUNT_BIG(*) FROM dbo.out_stockout_detail outbound WITH (NOLOCK)
WHERE outbound.warehouse_id = @warehouse_id);
WHERE ISNULL(outbound.quantity, 0) > ISNULL(outbound.allot_quantity, 0));
SELECT @source_payload = ISNULL(CONVERT(nvarchar(max), (
SELECT cargo.cargo_space_id AS [@space_id], cargo.warehouse_id AS [@warehouse_id],
@@ -1203,21 +1211,26 @@ BEGIN
inbound.stockin_id AS [@stockin_id], inbound.lot_no AS [@lot_no],
inbound.product_id AS [@product_id], inbound.quantity AS [@quantity],
inbound.assign_num AS [@assign_num], inbound.spare4 AS [@project_no],
job.warehouse_id AS [@warehouse_id], detail.job_id AS [@job_id]
job.warehouse_id AS [@warehouse_id], job.task_no AS [@task_no],
job.tray_code AS [@tray_code], detail.job_id AS [@job_id],
detail.in_or_out_id AS [@request_id]
FROM dbo.in_stockin_detail inbound WITH (NOLOCK)
JOIN dbo.mydo_job_detail detail WITH (NOLOCK) ON detail.stockin_detail_id = inbound.stockin_detail_id
JOIN dbo.mydo_job job WITH (NOLOCK) ON job.job_id = detail.job_id
WHERE job.warehouse_id = @warehouse_id
WHERE job.finish_time IS NULL OR LTRIM(RTRIM(job.finish_time)) = ''
ORDER BY inbound.stockin_detail_id
FOR XML PATH('inbound'), ROOT('inbound_requests'), TYPE
)), '');
SET @source_payload = @source_payload + '|OUTBOUND|' + ISNULL(CONVERT(nvarchar(max), (
SELECT outbound.stockout_detail_id AS [@stockout_detail_id], outbound.warehouse_id AS [@warehouse_id],
warehouse.project_no AS [@project_no],
outbound.product_id AS [@product_id], outbound.lot_no AS [@lot_no],
outbound.quantity AS [@quantity], outbound.assign_num AS [@assign_num],
outbound.allot_quantity AS [@allot_quantity], outbound.create_time AS [@create_time]
FROM dbo.out_stockout_detail outbound WITH (NOLOCK)
WHERE outbound.warehouse_id = @warehouse_id
LEFT JOIN dbo.bas_warehouse warehouse WITH (NOLOCK)
ON warehouse.warehouse_id = outbound.warehouse_id
WHERE ISNULL(outbound.quantity, 0) > ISNULL(outbound.allot_quantity, 0)
ORDER BY outbound.stockout_detail_id
FOR XML PATH('outbound'), ROOT('outbound_requests'), TYPE
)), '');

View File

@@ -304,9 +304,9 @@ BEGIN
JOIN dbo.mydo_job_detail detail WITH (NOLOCK)
ON detail.stockin_detail_id = inbound.stockin_detail_id
JOIN dbo.mydo_job job WITH (NOLOCK) ON job.job_id = detail.job_id
WHERE job.warehouse_id = @warehouse_id)
WHERE job.finish_time IS NULL OR LTRIM(RTRIM(job.finish_time)) = '')
+ (SELECT COUNT_BIG(*) FROM dbo.out_stockout_detail outbound WITH (NOLOCK)
WHERE outbound.warehouse_id = @warehouse_id);
WHERE ISNULL(outbound.quantity, 0) > ISNULL(outbound.allot_quantity, 0));
SELECT @source_payload = ISNULL(CONVERT(nvarchar(max), (
SELECT cargo.cargo_space_id AS [@space_id], cargo.warehouse_id AS [@warehouse_id],
@@ -363,22 +363,27 @@ BEGIN
inbound.stockin_id AS [@stockin_id], inbound.lot_no AS [@lot_no],
inbound.product_id AS [@product_id], inbound.quantity AS [@quantity],
inbound.assign_num AS [@assign_num], inbound.spare4 AS [@project_no],
job.warehouse_id AS [@warehouse_id], detail.job_id AS [@job_id]
job.warehouse_id AS [@warehouse_id], job.task_no AS [@task_no],
job.tray_code AS [@tray_code], detail.job_id AS [@job_id],
detail.in_or_out_id AS [@request_id]
FROM dbo.in_stockin_detail inbound WITH (NOLOCK)
JOIN dbo.mydo_job_detail detail WITH (NOLOCK)
ON detail.stockin_detail_id = inbound.stockin_detail_id
JOIN dbo.mydo_job job WITH (NOLOCK) ON job.job_id = detail.job_id
WHERE job.warehouse_id = @warehouse_id
WHERE job.finish_time IS NULL OR LTRIM(RTRIM(job.finish_time)) = ''
ORDER BY inbound.stockin_detail_id
FOR XML PATH('inbound'), ROOT('inbound_requests'), TYPE
)), '');
SET @source_payload = @source_payload + '|OUTBOUND|' + ISNULL(CONVERT(nvarchar(max), (
SELECT outbound.stockout_detail_id AS [@stockout_detail_id], outbound.warehouse_id AS [@warehouse_id],
warehouse.project_no AS [@project_no],
outbound.product_id AS [@product_id], outbound.lot_no AS [@lot_no],
outbound.quantity AS [@quantity], outbound.assign_num AS [@assign_num],
outbound.allot_quantity AS [@allot_quantity], outbound.create_time AS [@create_time]
FROM dbo.out_stockout_detail outbound WITH (NOLOCK)
WHERE outbound.warehouse_id = @warehouse_id
LEFT JOIN dbo.bas_warehouse warehouse WITH (NOLOCK)
ON warehouse.warehouse_id = outbound.warehouse_id
WHERE ISNULL(outbound.quantity, 0) > ISNULL(outbound.allot_quantity, 0)
ORDER BY outbound.stockout_detail_id
FOR XML PATH('outbound'), ROOT('outbound_requests'), TYPE
)), '');
@@ -430,22 +435,22 @@ BEGIN
AND (job.finish_time IS NULL OR LTRIM(RTRIM(job.finish_time)) = '');
;WITH inbound_source AS (
SELECT job.warehouse_id, job.task_no, job.tray_code,
SELECT @warehouse_id AS warehouse_id, job.task_no, job.tray_code,
detail.in_or_out_id AS request_id, job.warehouse_id AS raw_warehouse_id,
inbound.spare4 AS project_no, inbound.product_id, inbound.lot_no,
ROW_NUMBER() OVER (
PARTITION BY job.warehouse_id, job.task_no, job.tray_code
PARTITION BY job.task_no, job.tray_code
ORDER BY inbound.stockin_detail_id, detail.job_detail_id) AS source_rank
FROM dbo.in_stockin_detail inbound WITH (NOLOCK)
JOIN dbo.mydo_job_detail detail WITH (NOLOCK)
ON detail.stockin_detail_id = inbound.stockin_detail_id
JOIN dbo.mydo_job job WITH (NOLOCK) ON job.job_id = detail.job_id
WHERE job.warehouse_id = @warehouse_id
WHERE job.finish_time IS NULL OR LTRIM(RTRIM(job.finish_time)) = ''
)
INSERT INTO alg.shadow_inbound_request_snapshot (
warehouse_id, task_no, tray_no, request_id, raw_warehouse_id,
project_no, product_id, lot_no, snapshot_generation, synchronized_at)
SELECT warehouse_id, ISNULL(task_no, ''), ISNULL(tray_code, ''), request_id,
SELECT @warehouse_id, ISNULL(task_no, ''), ISNULL(tray_code, ''), request_id,
raw_warehouse_id, project_no, product_id, lot_no,
@snapshot_generation, @synchronized_at
FROM inbound_source
@@ -454,11 +459,14 @@ BEGIN
INSERT INTO alg.shadow_outbound_request_snapshot (
warehouse_id, stockout_detail_id, raw_warehouse_id, project_no, product_id,
requested_quantity, snapshot_generation, synchronized_at)
SELECT outbound.warehouse_id, outbound.stockout_detail_id, outbound.warehouse_id,
NULL, outbound.product_id, CONVERT(decimal(38,6), outbound.quantity),
SELECT @warehouse_id, outbound.stockout_detail_id, outbound.warehouse_id,
NULLIF(LTRIM(RTRIM(warehouse.project_no)), ''), outbound.product_id,
CONVERT(decimal(38,6), outbound.quantity),
@snapshot_generation, @synchronized_at
FROM dbo.out_stockout_detail outbound WITH (NOLOCK)
WHERE outbound.warehouse_id = @warehouse_id;
LEFT JOIN dbo.bas_warehouse warehouse WITH (NOLOCK)
ON warehouse.warehouse_id = outbound.warehouse_id
WHERE ISNULL(outbound.quantity, 0) > ISNULL(outbound.allot_quantity, 0);
EXEC alg.usp_rebuild_space_topology @warehouse_id = @warehouse_id,
@snapshot_generation = @snapshot_generation;
@@ -479,8 +487,9 @@ BEGIN
+ (SELECT COUNT_BIG(*) FROM dbo.in_stockin_detail inbound WITH (NOLOCK)
JOIN dbo.mydo_job_detail detail WITH (NOLOCK) ON detail.stockin_detail_id = inbound.stockin_detail_id
JOIN dbo.mydo_job job WITH (NOLOCK) ON job.job_id = detail.job_id
WHERE job.warehouse_id = @warehouse_id)
+ (SELECT COUNT_BIG(*) FROM dbo.out_stockout_detail outbound WITH (NOLOCK) WHERE outbound.warehouse_id = @warehouse_id);
WHERE job.finish_time IS NULL OR LTRIM(RTRIM(job.finish_time)) = '')
+ (SELECT COUNT_BIG(*) FROM dbo.out_stockout_detail outbound WITH (NOLOCK)
WHERE ISNULL(outbound.quantity, 0) > ISNULL(outbound.allot_quantity, 0));
SELECT @source_payload = ISNULL(CONVERT(nvarchar(max), (
SELECT cargo.cargo_space_id AS [@space_id], cargo.warehouse_id AS [@warehouse_id],
@@ -535,20 +544,25 @@ BEGIN
SELECT inbound.stockin_detail_id AS [@stockin_detail_id], inbound.stockin_guid AS [@stockin_guid],
inbound.stockin_id AS [@stockin_id], inbound.lot_no AS [@lot_no], inbound.product_id AS [@product_id],
inbound.quantity AS [@quantity], inbound.assign_num AS [@assign_num], inbound.spare4 AS [@project_no],
job.warehouse_id AS [@warehouse_id], detail.job_id AS [@job_id]
job.warehouse_id AS [@warehouse_id], job.task_no AS [@task_no],
job.tray_code AS [@tray_code], detail.job_id AS [@job_id],
detail.in_or_out_id AS [@request_id]
FROM dbo.in_stockin_detail inbound WITH (NOLOCK)
JOIN dbo.mydo_job_detail detail WITH (NOLOCK) ON detail.stockin_detail_id = inbound.stockin_detail_id
JOIN dbo.mydo_job job WITH (NOLOCK) ON job.job_id = detail.job_id
WHERE job.warehouse_id = @warehouse_id
WHERE job.finish_time IS NULL OR LTRIM(RTRIM(job.finish_time)) = ''
ORDER BY inbound.stockin_detail_id
FOR XML PATH('inbound'), ROOT('inbound_requests'), TYPE
)), '');
SET @source_payload = @source_payload + '|OUTBOUND|' + ISNULL(CONVERT(nvarchar(max), (
SELECT outbound.stockout_detail_id AS [@stockout_detail_id], outbound.warehouse_id AS [@warehouse_id],
warehouse.project_no AS [@project_no],
outbound.product_id AS [@product_id], outbound.lot_no AS [@lot_no], outbound.quantity AS [@quantity],
outbound.assign_num AS [@assign_num], outbound.allot_quantity AS [@allot_quantity], outbound.create_time AS [@create_time]
FROM dbo.out_stockout_detail outbound WITH (NOLOCK)
WHERE outbound.warehouse_id = @warehouse_id
LEFT JOIN dbo.bas_warehouse warehouse WITH (NOLOCK)
ON warehouse.warehouse_id = outbound.warehouse_id
WHERE ISNULL(outbound.quantity, 0) > ISNULL(outbound.allot_quantity, 0)
ORDER BY outbound.stockout_detail_id
FOR XML PATH('outbound'), ROOT('outbound_requests'), TYPE
)), '');

View File

@@ -86,6 +86,24 @@ class JdbcWarehouseRepositoryTest {
assertThat(space(lanes, "OUT-INNER").state().zoneCode()).isEqualTo("FLEX");
}
@Test
void publishedReadModelJoinsDoNotCrossWarehouseBoundaries() throws Exception {
execute("INSERT INTO BAS_CARGO_SPACE VALUES ('SHARED-SPACE','W1','R','A','Shared id',9,90,1,'2','',"
+ "'TRAY-W1','SHARED-LANE','1')");
execute("INSERT INTO ALG_INVENTORY_ITEM_SNAPSHOT (WAREHOUSE_ID, STOCK_ID, SPACE_ID, TRAY_CODE, "
+ "PROJECT_NO, PRODUCT_NO, LOT_NO, INBOUND_TIME_RAW, INBOUND_AT, QUANTITY, OUT_QUANTITY) "
+ "VALUES ('W2','CROSS-W2','SHARED-SPACE',NULL,'PROJECT-W2','SKU-W2','LOT-W2',"
+ "'2026-09-03 00:00:00',TIMESTAMP '2026-09-03 00:00:00',1,0)");
rebuildTopology("W1");
List<LaneSnapshot> lanes = repository.loadLaneSnapshots("W1", List.of("SHARED-LANE"));
assertThat(space(lanes, "SHARED-SPACE").inventory()).isEmpty();
assertThat(repository.searchOutboundStock("W1", OutboundStockSearch.project("PROJECT-W2", null)))
.isEmpty();
assertThat(repository.countProjectPallets("W1", "PROJECT-W2")).isZero();
}
@Test
void statusFourPhysicalOuterPalletIsPreservedAndMakesDeepOutboundWait() throws Exception {
execute("INSERT INTO BAS_CARGO_SPACE VALUES ('ALLOC-TARGET','W1','RA','A','Target',7,21,2,'2','',"

View File

@@ -208,6 +208,25 @@ class ShadowSqlServerMigrationScriptTest {
"snapshot_generation = @snapshot_generation");
}
@Test
void refreshPreservesRawRequestWarehouseUnderAuthoritativeSnapshotWarehouse() throws IOException {
for (String script : new String[]{"db/sqlserver/install-shadow.sql",
"db/sqlserver/upgrade-shadow-v2-to-v3.sql"}) {
String refresh = normalize(resource(script));
refresh = refresh.substring(refresh.indexOf("create procedure alg.usp_refresh_shadow_snapshot"));
assertThat(refresh).as(script).contains(
"select @warehouse_id, isnull(task_no, ''), isnull(tray_code, ''), request_id, raw_warehouse_id",
"select @warehouse_id, outbound.stockout_detail_id, outbound.warehouse_id",
"left join dbo.bas_warehouse warehouse with (nolock)",
"nullif(ltrim(rtrim(warehouse.project_no)), '')",
"job.finish_time is null or ltrim(rtrim(job.finish_time)) = ''",
"isnull(outbound.quantity, 0) > isnull(outbound.allot_quantity, 0)");
assertThat(refresh).as(script).doesNotContain(
"select outbound.warehouse_id, outbound.stockout_detail_id, outbound.warehouse_id, null");
}
}
@Test
void plannerViewsContainOnlyGenerationQualifiedAlgSnapshots() throws IOException {
String install = normalize(resource("db/sqlserver/install-shadow.sql"));

View File

@@ -178,6 +178,7 @@ $$;
CREATE VIEW ALG_V_INVENTORY_ITEM AS
SELECT
WAREHOUSE_ID, CAST(0 AS BIGINT) AS SNAPSHOT_GENERATION,
STOCK_ID, SPACE_ID, TRAY_CODE, PROJECT_NO, PRODUCT_NO, LOT_NO,
INBOUND_TIME_RAW, INBOUND_AT, QUANTITY, OUT_QUANTITY
FROM ALG_INVENTORY_ITEM_SNAPSHOT;
@@ -281,6 +282,7 @@ LANE_GAPS AS (
SELECT
C.CARGO_SPACE_ID AS SPACE_ID,
C.WAREHOUSE_ID,
CAST(0 AS BIGINT) AS SNAPSHOT_GENERATION,
C.GROUP_CODING_NO AS LANE_CODE,
C.CARGO_AREA_ID AS AREA_ID,
CASE