feat(M09-D3): 完成商品寄存与安全取出闭环

This commit is contained in:
Codex
2026-08-11 07:39:46 +08:00
parent 1a3ea7bdf0
commit 60264cbd11
28 changed files with 2735 additions and 72 deletions
+44 -1
View File
@@ -138,6 +138,15 @@ const productOrderPaymentDownSql = read(
const productOrderPaymentVerifySql = read(
'database/migrations/2026081108_m09d2_product_order_payment_inventory.verify.sql'
);
const productStorageUpSql = read(
'database/migrations/2026081109_m09d3_product_storage.up.sql'
);
const productStorageDownSql = read(
'database/migrations/2026081109_m09d3_product_storage.down.sql'
);
const productStorageVerifySql = read(
'database/migrations/2026081109_m09d3_product_storage.verify.sql'
);
const coreTables = [
'qipai_schema_migrations',
@@ -684,4 +693,38 @@ assert.match(productOrderPaymentUpSql, /r\.code IN \('STAFF', 'STORE_ADMIN', 'TE
assert.match(productOrderPaymentVerifySql, /fully_granted_goods_order_roles/);
assert.match(productOrderPaymentVerifySql, /'2026081108'/);
console.log('PASS: M01-B through M09-D2 migration contracts are present.');
for (const table of [
'qipai_product_storage_records',
'qipai_product_storage_items',
'qipai_product_storage_events',
'qipai_product_storage_event_items'
]) {
assert.match(productStorageUpSql, new RegExp(`CREATE TABLE IF NOT EXISTS ${table}\\b`));
assert.match(productStorageDownSql, new RegExp(`DROP TABLE IF EXISTS ${table}\\b`));
assert.match(productStorageVerifySql, new RegExp(`'${table}'`));
}
assert.doesNotMatch(productStorageUpSql, /\bDECIMAL\b/i);
for (const state of [
'STORED', 'PARTIALLY_RETRIEVED', 'RETRIEVED', 'EXPIRED', 'CANCELLED'
]) assert.match(productStorageUpSql, new RegExp(`'${state}'`));
assert.match(productStorageUpSql, /claim_credential_hash CHAR\(64\) CHARACTER SET ascii COLLATE ascii_bin/);
assert.match(productStorageUpSql, /request_fingerprint CHAR\(64\) CHARACTER SET ascii COLLATE ascii_bin/);
assert.match(productStorageUpSql, /remaining_quantity <= total_quantity/);
assert.match(productStorageUpSql, /uq_qipai_product_storage_source_order/);
assert.match(productStorageUpSql, /uq_qipai_product_storage_event_request/);
assert.match(productStorageUpSql, /uq_qipai_product_storage_event_version/);
assert.match(productStorageUpSql, /qipai_product_storage_events_no_update/);
assert.match(productStorageUpSql, /qipai_product_storage_events_no_delete/);
assert.match(productStorageUpSql, /qipai_product_storage_event_items_no_update/);
assert.match(productStorageUpSql, /qipai_product_storage_event_items_no_delete/);
for (const permission of ['goods.storage.read', 'goods.storage.manage']) {
const pattern = new RegExp(permission.replace('.', '\\.'));
assert.match(productStorageUpSql, pattern);
assert.match(productStorageDownSql, pattern);
assert.match(productStorageVerifySql, pattern);
}
assert.match(productStorageUpSql, /r\.code IN \('STAFF', 'STORE_ADMIN', 'TENANT_ADMIN', 'PLATFORM_ADMIN'\)/);
assert.match(productStorageVerifySql, /fully_granted_goods_storage_roles/);
assert.match(productStorageVerifySql, /'2026081109'/);
console.log('PASS: M01-B through M09-D3 migration contracts are present.');