fix(data-foundation): 放行非集成 SKU 冲突质量状态约束

This commit is contained in:
WuYongJie 2026-06-02 21:53:34 +08:00
parent 56252d92f3
commit 2c4d38e54e
4 changed files with 26 additions and 4 deletions

View File

@ -83,6 +83,14 @@ BEGIN
OR cardinality("missingRequiredFields") > 0
)
)
OR
(
"dataQualityStatus" = 'CONFLICT'
AND (
NULLIF(btrim("skuCode"), '') IS NOT NULL
OR NULLIF(btrim("barcode"), '') IS NOT NULL
)
)
);
END IF;
END $$;

View File

@ -926,6 +926,7 @@ SELECT
FROM "IntakeNonIntegratedSkuItem" sku
JOIN "IntakeNonIntegratedProduct" product ON product."id" = sku."productId"
WHERE product."deletedAt" IS NULL
AND sku."dataQualityStatus" = 'READY'
AND NULLIF(btrim(sku."skuCode"), '') IS NOT NULL
GROUP BY upper(btrim(sku."skuCode"))
HAVING COUNT(*) > 1
@ -938,11 +939,20 @@ SELECT
FROM "IntakeNonIntegratedSkuItem" sku
JOIN "IntakeNonIntegratedProduct" product ON product."id" = sku."productId"
WHERE product."deletedAt" IS NULL
AND sku."dataQualityStatus" = 'READY'
AND NULLIF(btrim(sku."barcode"), '') IS NOT NULL
GROUP BY upper(btrim(sku."barcode"))
HAVING COUNT(*) > 1
ORDER BY duplicate_count DESC, upper(btrim(sku."barcode"));
SELECT
'intake_non_integrated_conflict_sku_risk' AS check_name,
COUNT(*)::integer AS row_count
FROM "IntakeNonIntegratedSkuItem" sku
JOIN "IntakeNonIntegratedProduct" product ON product."id" = sku."productId"
WHERE product."deletedAt" IS NULL
AND sku."dataQualityStatus" = 'CONFLICT';
SELECT
'intake_non_integrated_incomplete_sku_risk' AS check_name,
COUNT(*)::integer AS row_count

View File

@ -644,7 +644,7 @@ const REQUIRED_DATABASE_GUARDS = [
name: 'IntakeNonIntegratedSkuItem_quality_state_required_fields',
relationName: 'IntakeNonIntegratedSkuItem',
expressionPattern: 'dataQualityStatus',
purpose: '非集成 SKU 的 READY/INCOMPLETE 状态必须和必填字段、缺失字段数组一致。',
purpose: '非集成 SKU 的 READY/INCOMPLETE/CONFLICT 状态必须和必填字段、缺失字段数组、冲突身份一致。',
},
{
type: 'partial-unique-index',
@ -3111,7 +3111,8 @@ async function getStructuredSkuSummary(client) {
SELECT
COUNT(*)::integer AS total,
COUNT(*) FILTER (WHERE "dataQualityStatus" = 'READY')::integer AS ready,
COUNT(*) FILTER (WHERE "dataQualityStatus" = 'INCOMPLETE')::integer AS incomplete
COUNT(*) FILTER (WHERE "dataQualityStatus" = 'INCOMPLETE')::integer AS incomplete,
COUNT(*) FILTER (WHERE "dataQualityStatus" = 'CONFLICT')::integer AS conflict
FROM "IntakeNonIntegratedSkuItem" sku
JOIN "IntakeNonIntegratedProduct" product ON product."id" = sku."productId"
WHERE product."deletedAt" IS NULL
@ -3149,6 +3150,7 @@ async function getDuplicateGroupCount(client, columnName) {
FROM "IntakeNonIntegratedSkuItem" sku
JOIN "IntakeNonIntegratedProduct" product ON product."id" = sku."productId"
WHERE product."deletedAt" IS NULL
AND sku."dataQualityStatus" = 'READY'
AND NULLIF(btrim("${columnName}"), '') IS NOT NULL
GROUP BY upper(btrim("${columnName}"))
HAVING COUNT(*) > 1

View File

@ -1324,16 +1324,18 @@ describe('verify-master-data-foundation', () => {
expect(query).toContain('product."deletedAt" IS NULL')
if (query.includes('duplicate_groups')) {
expect(query).toContain('upper(btrim("skuCode"))')
expect(query).toContain('sku."dataQualityStatus" = \'READY\'')
return Promise.resolve({ rows: [{ duplicate_groups: 0 }] })
}
return Promise.resolve({ rows: [{ total: 3, ready: 2, incomplete: 1 }] })
return Promise.resolve({ rows: [{ total: 4, ready: 2, incomplete: 1, conflict: 1 }] })
}),
}
await expect(getStructuredSkuSummary(client)).resolves.toEqual({
total: 3,
total: 4,
ready: 2,
incomplete: 1,
conflict: 1,
})
await expect(getDuplicateGroupCount(client, 'skuCode')).resolves.toBe(0)
})