fix(M09-REGRESSION): 完成商品逐单对账与权限收口

This commit is contained in:
Codex
2026-08-11 08:25:12 +08:00
parent e91b979128
commit 41b9cf7349
21 changed files with 566 additions and 39 deletions
+60
View File
@@ -0,0 +1,60 @@
import assert from 'node:assert/strict';
import { readFileSync } from 'node:fs';
import { join } from 'node:path';
const root = process.cwd();
const read = (path) => readFileSync(join(root, path), 'utf8');
const orderService = read('backend/src/products/product-order-service.ts');
for (const pattern of [
'reconcileForManagement', 'buildProductOrderReconciliation',
'qipai_product_inventory_ledger', 'qipai_product_storage_records',
'PAYMENT_CAPTURED_AMOUNT', 'REFUND_SUCCEEDED_AMOUNT',
'INVENTORY_RESERVATION_BALANCE', 'INVENTORY_SALE_BALANCE',
'STORAGE_ITEM_BALANCE'
]) assert.ok(orderService.includes(pattern), `product reconciliation is missing ${pattern}`);
const orderRoutes = read('backend/src/routes/product-orders.ts');
assert.match(orderRoutes, /product-orders\/:orderId\/reconciliation/);
assert.match(orderRoutes, /service\.reconcileForManagement/);
assert.match(orderRoutes, /capabilities\.includes\('platform\.manage'\)/);
const inventoryRoute = read('backend/src/routes/inventory.ts');
const inventoryService = read('backend/src/inventory/inventory-service.ts');
assert.match(inventoryRoute, /capabilities\.includes\('platform\.manage'\)/);
assert.match(inventoryService, /capabilities\.includes\('platform\.manage'\)/);
const api = read('admin/src/api.ts');
const types = read('admin/src/types.ts');
const panel = read('admin/src/components/ProductOperationsPanel.vue');
assert.match(api, /getProductOrderReconciliation/);
assert.match(types, /interface ProductOrderReconciliation/);
for (const pattern of [
'逐单对账', '一致性检查', '库存不可变流水', '关联寄存',
'支付流水', '退款流水', '不可变事件'
]) assert.ok(panel.includes(pattern), `product operations reconciliation is missing ${pattern}`);
const reconciliationTest = read('backend/tests/product-reconciliation.test.mjs');
for (const pattern of [
'detects amount, payment, refund, inventory and storage drift',
"inventoryStatus: 'RELEASED'",
'reservationBalance', 'STORAGE_ITEM_BALANCE'
]) assert.ok(reconciliationTest.includes(pattern), `reconciliation unit test is missing ${pattern}`);
const routeTest = read('backend/tests/product-order-route.test.mjs');
const inventoryRouteTest = read('backend/tests/inventory-route.test.mjs');
const inventoryServiceTest = read('backend/tests/inventory-service.test.mjs');
for (const source of [routeTest, inventoryRouteTest, inventoryServiceTest]) {
assert.match(source, /platform\.manage/);
assert.match(source, /storeIds: \[\]/);
}
const mysqlTest = read('backend/tests/mysql-migration-roundtrip.test.mjs');
for (const pattern of [
'completedReconciliation', 'storageReconciliation', 'platformActor',
'reconcileForManagement', 'netRevenueCents', 'recordRemainingQuantity'
]) assert.ok(mysqlTest.includes(pattern), `live MySQL reconciliation is missing ${pattern}`);
console.log(
'PASS: M09 regression reconciliation, platform scope, immutable ledgers and drift gates are present.'
);
+2
View File
@@ -46,6 +46,8 @@ node scripts/check-m09-d3-product-storage.mjs
Assert-NativeSuccess "check-m09-d3-product-storage"
node scripts/check-m09-d4-product-experience.mjs
Assert-NativeSuccess "check-m09-d4-product-experience"
node scripts/check-m09-regression.mjs
Assert-NativeSuccess "check-m09-regression"
if (Test-Path "admin/package.json") {
Push-Location admin