1307 lines
67 KiB
SQL
1307 lines
67 KiB
SQL
-- Internal master data foundation health check.
|
|
-- Read-only. Reports data quality and truth-source risks inside the system.
|
|
|
|
WITH required_index_guards(index_name, table_name, predicate_hint, definition_hint) AS (
|
|
VALUES
|
|
('AssetSeries_code_key', 'AssetSeries', NULL, NULL),
|
|
('AssetFamily_code_key', 'AssetFamily', NULL, NULL),
|
|
('AssetVariant_code_key', 'AssetVariant', NULL, NULL),
|
|
('AssetVariant_assetFamilyId_identityKey_key', 'AssetVariant', NULL, NULL),
|
|
('AssetVariant_barcode_active_key', 'AssetVariant', '"deletedAt" IS NULL', 'upper(btrim('),
|
|
('AssetFamilySeriesCompatibility_assetFamilyId_assetSeriesId_key', 'AssetFamilySeriesCompatibility', NULL, NULL),
|
|
('DraftGroup_code_key', 'DraftGroup', NULL, NULL),
|
|
('PlanningTemplate_code_key', 'PlanningTemplate', NULL, NULL),
|
|
('Substrate_code_key', 'Substrate', NULL, NULL),
|
|
('WarehouseLocation_code_key', 'WarehouseLocation', NULL, NULL),
|
|
('User_email_normalized_key', 'User', NULL, 'lower(btrim('),
|
|
('User_name_normalized_key', 'User', NULL, 'btrim'),
|
|
('Department_name_normalized_key', 'Department', NULL, 'btrim'),
|
|
('Department_externalId_normalized_key', 'Department', 'NULLIF(btrim', 'btrim'),
|
|
('EmployeeDirectory_dingtalkUserId_normalized_key', 'EmployeeDirectory', 'NULLIF(btrim', 'btrim'),
|
|
('EmployeeDirectory_dingtalkUnionId_normalized_key', 'EmployeeDirectory', 'NULLIF(btrim', 'btrim'),
|
|
('EmployeeDirectory_jobNumber_normalized_key', 'EmployeeDirectory', 'NULLIF(btrim', 'btrim'),
|
|
('EmployeeDirectory_mobile_normalized_key', 'EmployeeDirectory', 'NULLIF(btrim', 'btrim'),
|
|
('WarehouseLocation_active_position_key', 'WarehouseLocation', '"isActive" = true', 'lower(btrim('),
|
|
('PackagedItem_code_key', 'PackagedItem', NULL, NULL),
|
|
('PreSku_draftGroupId_sequence_key', 'PreSku', NULL, NULL),
|
|
('Product_modelNumber_key', 'Product', NULL, NULL),
|
|
('ProductSKU_skuCode_key', 'ProductSKU', NULL, NULL),
|
|
('ProductSKU_active_skuCode_normalized_key', 'ProductSKU', '"deletedAt" IS NULL', 'upper(btrim('),
|
|
('ProductSKU_sourcePreSkuId_key', 'ProductSKU', NULL, NULL),
|
|
('IntakeNonIntegratedProduct_spu_brand_key', 'IntakeNonIntegratedProduct', NULL, NULL),
|
|
('IntakeNonIntegratedProduct_spu_brand_normalized_key', 'IntakeNonIntegratedProduct', NULL, 'upper(btrim('),
|
|
('ProductSkuAssetProfile_skuId_key', 'ProductSkuAssetProfile', NULL, NULL),
|
|
('ProductSkuAssetProfile_barcode_active_non_empty_key', 'ProductSkuAssetProfile', '"skuDeletedAt" IS NULL', 'upper(btrim('),
|
|
('PreSkuBasicInfo_preSkuId_key', 'PreSkuBasicInfo', NULL, NULL),
|
|
('PreSkuBasicInfo_formalSkuCode_non_empty_key', 'PreSkuBasicInfo', 'NULLIF(btrim(', 'upper(btrim('),
|
|
('PreSkuBasicInfo_barcode_non_empty_key', 'PreSkuBasicInfo', 'NULLIF(btrim(', 'upper(btrim('),
|
|
('IntakeNonIntegratedProductProfile_productId_key', 'IntakeNonIntegratedProductProfile', NULL, NULL),
|
|
('IntakeNonIntegratedSkuItem_productId_skuItemId_key', 'IntakeNonIntegratedSkuItem', NULL, NULL),
|
|
('IntakeNonIntegratedSkuItem_skuCode_non_empty_key', 'IntakeNonIntegratedSkuItem', '"dataQualityStatus" = ''READY''', 'upper(btrim('),
|
|
('IntakeNonIntegratedSkuItem_barcode_non_empty_key', 'IntakeNonIntegratedSkuItem', '"dataQualityStatus" = ''READY''', 'upper(btrim('),
|
|
('MasterDataQualityDecision_open_target_key', 'MasterDataQualityDecision', 'status = ''APPROVED_INCOMPLETE''', NULL),
|
|
('ProductPatentRecord_patentGroupKey_key', 'ProductPatentRecord', NULL, NULL),
|
|
('IntakeReferenceLibraryItem_libraryType_itemKey_key', 'IntakeReferenceLibraryItem', NULL, NULL),
|
|
('IntakeReferenceLibraryItem_libraryType_code_non_empty_key', 'IntakeReferenceLibraryItem', 'NULLIF(btrim(code),', 'upper(btrim('),
|
|
('IntakeReferenceLibraryItem_libraryType_itemKey_normalized_key', 'IntakeReferenceLibraryItem', NULL, 'lower(btrim('),
|
|
('IntakeReferenceLibraryItem_spu_rule_name_non_empty_key', 'IntakeReferenceLibraryItem', '"libraryType" = ''SPU_RULE''', NULL),
|
|
('IntakeReferenceLibraryItem_spu_rule_name_normalized_key', 'IntakeReferenceLibraryItem', '"libraryType" = ''SPU_RULE''', 'lower(btrim('),
|
|
('SpuNumberCounter_productCategory_key', 'SpuNumberCounter', NULL, NULL),
|
|
('SpuNumberCounter_productCategory_normalized_key', 'SpuNumberCounter', NULL, 'lower(btrim('),
|
|
('SpuNumberCounter_prefix_key', 'SpuNumberCounter', NULL, NULL),
|
|
('Material_code_key', 'Material', NULL, NULL),
|
|
('Hardware_code_key', 'Hardware', NULL, NULL),
|
|
('CommonComponent_code_key', 'CommonComponent', NULL, NULL),
|
|
('BrandMaterialBinding_brand_material_normalized_key', 'BrandMaterialBinding', NULL, 'lower(btrim('),
|
|
('Panel_product_sku_code_normalized_key', 'Panel', NULL, 'upper(btrim('),
|
|
('ProductCategory_name_normalized_key', 'ProductCategory', NULL, 'lower(btrim('),
|
|
('MaterialCategory_name_normalized_key', 'MaterialCategory', NULL, 'lower(btrim('),
|
|
('HardwareCategory_name_normalized_key', 'HardwareCategory', NULL, 'lower(btrim('),
|
|
('CommonComponentCategory_name_normalized_key', 'CommonComponentCategory', NULL, 'lower(btrim('),
|
|
('SubstrateCategory_name_normalized_key', 'SubstrateCategory', NULL, 'lower(btrim('),
|
|
('SubstrateEnvironmentGrade_name_normalized_key', 'SubstrateEnvironmentGrade', NULL, 'lower(btrim('),
|
|
('SubstrateSurfaceOption_name_normalized_key', 'SubstrateSurfaceOption', NULL, 'lower(btrim('),
|
|
('SubstrateSystemNameOption_name_normalized_key', 'SubstrateSystemNameOption', NULL, 'lower(btrim('),
|
|
('SubstrateThicknessSpec_name_normalized_key', 'SubstrateThicknessSpec', NULL, 'lower(btrim('),
|
|
('ProviderConfig_active_service_key', 'ProviderConfig', '"isActive" = true', NULL),
|
|
('ThemeConfig_name_normalized_key', 'ThemeConfig', NULL, 'lower(btrim('),
|
|
('ThemeConfig_default_key', 'ThemeConfig', '"isDefault" = true', NULL)
|
|
)
|
|
SELECT
|
|
'missing_required_index_guard' AS check_name,
|
|
guard.index_name,
|
|
guard.table_name,
|
|
pg_get_expr(pg_idx.indpred, pg_idx.indrelid) AS actual_predicate,
|
|
guard.predicate_hint AS expected_predicate_hint,
|
|
pg_get_indexdef(idx.oid) AS actual_definition,
|
|
guard.definition_hint AS expected_definition_hint
|
|
FROM required_index_guards guard
|
|
LEFT JOIN pg_class idx ON idx.relname = guard.index_name
|
|
LEFT JOIN pg_index pg_idx ON pg_idx.indexrelid = idx.oid
|
|
LEFT JOIN pg_class table_cls ON table_cls.oid = pg_idx.indrelid
|
|
LEFT JOIN pg_namespace ns ON ns.oid = table_cls.relnamespace
|
|
WHERE idx.oid IS NULL
|
|
OR ns.nspname <> 'public'
|
|
OR table_cls.relname <> guard.table_name
|
|
OR pg_idx.indisunique IS DISTINCT FROM true
|
|
OR (
|
|
guard.predicate_hint IS NOT NULL
|
|
AND COALESCE(pg_get_expr(pg_idx.indpred, pg_idx.indrelid), '') NOT LIKE '%' || guard.predicate_hint || '%'
|
|
)
|
|
OR (
|
|
guard.definition_hint IS NOT NULL
|
|
AND COALESCE(pg_get_indexdef(idx.oid), '') NOT LIKE '%' || guard.definition_hint || '%'
|
|
)
|
|
ORDER BY guard.index_name;
|
|
|
|
WITH required_constraint_guards(constraint_name, table_name, expression_hint) AS (
|
|
VALUES
|
|
('IntakeProductProfile_developmentKind_allowed', 'IntakeNonIntegratedProductProfile', '"productDevelopmentKind" = '''''),
|
|
('IntakeNonIntegratedSkuItem_missingRequiredFields_allowed', 'IntakeNonIntegratedSkuItem', 'missingRequiredFields'),
|
|
('IntakeNonIntegratedSkuItem_quality_state_required_fields', 'IntakeNonIntegratedSkuItem', 'dataQualityStatus'),
|
|
('MasterDataQualityDecision_target_not_blank', 'MasterDataQualityDecision', 'targetType'),
|
|
('MasterDataQualityDecision_status_allowed', 'MasterDataQualityDecision', 'APPROVED_INCOMPLETE'),
|
|
('MasterDataQualityDecision_reason_not_blank', 'MasterDataQualityDecision', 'reason'),
|
|
('MasterDataQualityDecision_decidedBy_not_blank', 'MasterDataQualityDecision', 'decidedBy'),
|
|
('MasterDataQualityDecision_reason_not_placeholder', 'MasterDataQualityDecision', '待确认'),
|
|
('MasterDataQualityDecision_decidedBy_not_placeholder', 'MasterDataQualityDecision', '待确认'),
|
|
('MasterDataQualityDecision_resolvedBy_not_placeholder', 'MasterDataQualityDecision', '待确认'),
|
|
('MasterDataQualityDecision_resolved_state_valid', 'MasterDataQualityDecision', 'resolvedAt'),
|
|
('SpuNumberCounter_productCategory_not_blank', 'SpuNumberCounter', 'productCategory'),
|
|
('SpuNumberCounter_productCategory_normalized', 'SpuNumberCounter', 'btrim'),
|
|
('SpuNumberCounter_prefix_not_blank', 'SpuNumberCounter', 'prefix'),
|
|
('SpuNumberCounter_prefix_normalized', 'SpuNumberCounter', 'upper(btrim'),
|
|
('SpuNumberCounter_lastUsedIndex_non_negative', 'SpuNumberCounter', 'lastUsedIndex'),
|
|
('SpuNumberCounter_sourceLibraryItemId_normalized', 'SpuNumberCounter', 'sourceLibraryItemId'),
|
|
('ProductSKU_active_skuCode_not_deleted_marker', 'ProductSKU', '__deleted__'),
|
|
('ProductSKU_price_cost_stock_non_negative', 'ProductSKU', '"costPrice"'),
|
|
('ProductSKU_soft_delete_identity_valid', 'ProductSKU', 'originalSkuCode'),
|
|
('ProductSKU_no_soft_delete_lifecycle_attributes', 'ProductSKU', '_originalSkuCode'),
|
|
('ProductSKU_soft_delete_tombstone_valid', 'ProductSKU', 'deletedCodeAt'),
|
|
('ProductSKU_no_formal_truth_attributes', 'ProductSKU', 'skuName'),
|
|
('AssetSeries_code_normalized', 'AssetSeries', 'upper(btrim'),
|
|
('AssetSeries_identity_valid', 'AssetSeries', 'sortOrder'),
|
|
('AssetSeries_metadata_object', 'AssetSeries', 'jsonb_typeof'),
|
|
('AssetFamily_code_normalized', 'AssetFamily', 'upper(btrim'),
|
|
('AssetFamily_identity_valid', 'AssetFamily', 'connectionRoles'),
|
|
('AssetFamily_metadata_object', 'AssetFamily', 'jsonb_typeof'),
|
|
('AssetFamily_lifecycle_state_valid', 'AssetFamily', 'PENDING_REVIEW'),
|
|
('DraftGroup_code_normalized', 'DraftGroup', 'upper(btrim'),
|
|
('DraftGroup_identity_valid', 'DraftGroup', 'btrim'),
|
|
('DraftGroup_summary_object', 'DraftGroup', 'jsonb_typeof'),
|
|
('DraftGroup_optional_text_not_blank', 'DraftGroup', 'description'),
|
|
('IntakeReferenceLibraryItem_code_normalized', 'IntakeReferenceLibraryItem', 'upper(btrim'),
|
|
('IntakeReferenceLibraryItem_code_required', 'IntakeReferenceLibraryItem', 'NULLIF(btrim'),
|
|
('IntakeReferenceLibraryItem_libraryType_allowed', 'IntakeReferenceLibraryItem', 'PACKAGING_MATERIAL'),
|
|
('IntakeReferenceLibraryItem_itemKey_required', 'IntakeReferenceLibraryItem', 'btrim'),
|
|
('IntakeReferenceLibraryItem_letter_normalized', 'IntakeReferenceLibraryItem', 'upper(btrim'),
|
|
('IntakeReferenceLibraryItem_spu_rule_name_normalized', 'IntakeReferenceLibraryItem', 'SPU_RULE'),
|
|
('PlanningTemplate_code_normalized', 'PlanningTemplate', 'upper(btrim'),
|
|
('PlanningTemplate_name_not_blank', 'PlanningTemplate', 'name'),
|
|
('PlanningTemplate_slots_array', 'PlanningTemplate', 'jsonb_array_length'),
|
|
('PlanningTemplate_rules_object', 'PlanningTemplate', 'rules'),
|
|
('PlanningTemplate_optional_text_not_blank', 'PlanningTemplate', 'namePattern'),
|
|
('PlanningWorkspace_name_not_blank', 'PlanningWorkspace', 'name'),
|
|
('PlanningWorkspace_visibility_allowed', 'PlanningWorkspace', 'DEPARTMENT'),
|
|
('PlanningWorkspace_slotSelections_object', 'PlanningWorkspace', 'slotSelections'),
|
|
('PlanningWorkspace_metadata_object', 'PlanningWorkspace', 'metadata'),
|
|
('PlanningWorkspace_optional_text_not_blank', 'PlanningWorkspace', 'description'),
|
|
('PlanningDraft_identity_not_blank', 'PlanningDraft', 'selectedCandidateKey'),
|
|
('PlanningDraft_selectedAssets_object', 'PlanningDraft', 'selectedAssets'),
|
|
('PlanningDraft_previewNodes_array', 'PlanningDraft', 'previewNodes'),
|
|
('PlanningDraft_summary_array', 'PlanningDraft', 'summary'),
|
|
('PlanningDraft_warnings_array', 'PlanningDraft', 'warnings'),
|
|
('PlanningDraft_sourceSnapshot_object', 'PlanningDraft', 'sourceSnapshot'),
|
|
('PlanningDraft_optional_text_not_blank', 'PlanningDraft', 'notes'),
|
|
('Substrate_code_normalized', 'Substrate', 'upper(btrim'),
|
|
('WarehouseLocation_code_normalized', 'WarehouseLocation', 'upper(btrim'),
|
|
('PackagedItem_code_normalized', 'PackagedItem', 'upper(btrim'),
|
|
('PreSkuPackagingPlan_status_allowed', 'PreSkuPackagingPlan', 'CONFIRMED'),
|
|
('PreSkuPackagingPlan_boxes_array', 'PreSkuPackagingPlan', 'jsonb_typeof'),
|
|
('PreSkuPackagingPlan_costSummary_object', 'PreSkuPackagingPlan', 'costSummary'),
|
|
('PreSkuPackagingPlan_processDraft_object', 'PreSkuPackagingPlan', 'processDraft'),
|
|
('PreSkuPackagingPlan_optional_text_not_blank', 'PreSkuPackagingPlan', 'sourceRefId'),
|
|
('WarehouseLocation_name_not_blank', 'WarehouseLocation', 'name'),
|
|
('WarehouseLocation_optional_text_not_blank', 'WarehouseLocation', 'zone'),
|
|
('BrandMaterialBinding_materialType_allowed', 'BrandMaterialBinding', 'CARTON_PRINT'),
|
|
('BrandMaterialBinding_identity_not_blank', 'BrandMaterialBinding', 'materialType'),
|
|
('BrandMaterialBinding_file_metadata_consistent', 'BrandMaterialBinding', 'fileSize'),
|
|
('PackagedItem_status_allowed', 'PackagedItem', 'ACTIVE'),
|
|
('PackagedItem_name_not_blank', 'PackagedItem', 'name'),
|
|
('PackagedItem_quantities_valid', 'PackagedItem', 'stockQuantity'),
|
|
('PackagedItem_dimensions_valid', 'PackagedItem', 'weight'),
|
|
('PackagedItem_payload_object', 'PackagedItem', 'jsonb_typeof'),
|
|
('Material_code_normalized', 'Material', 'upper(btrim'),
|
|
('Hardware_code_normalized', 'Hardware', 'upper(btrim'),
|
|
('CommonComponent_code_normalized', 'CommonComponent', 'upper(btrim'),
|
|
('IntakeNonIntegratedProduct_spu_brand_normalized', 'IntakeNonIntegratedProduct', 'upper(btrim'),
|
|
('Product_modelNumber_normalized', 'Product', 'upper(btrim'),
|
|
('Product_name_not_blank', 'Product', 'name'),
|
|
('Product_visibility_allowed', 'Product', 'DEPARTMENT'),
|
|
('Product_optional_text_not_blank', 'Product', 'description'),
|
|
('ProductCollaborator_identity_not_blank', 'ProductCollaborator', 'productId'),
|
|
('ProductCollaborator_role_allowed', 'ProductCollaborator', 'viewer'),
|
|
('ProductCollaborator_addedBy_not_blank', 'ProductCollaborator', 'addedBy'),
|
|
('ShareLink_token_not_blank', 'ShareLink', 'token'),
|
|
('ShareLink_viewCount_non_negative', 'ShareLink', 'viewCount'),
|
|
('ShareLink_expiresAt_after_createdAt', 'ShareLink', 'expiresAt'),
|
|
('Panel_identity_dimensions_valid', 'Panel', 'gltfNodeName'),
|
|
('Panel_explosionDirection_allowed', 'Panel', 'explosionDirection'),
|
|
('Panel_assemblySemantic_object', 'Panel', 'assemblySemantic'),
|
|
('Panel_optional_text_not_blank', 'Panel', 'partType'),
|
|
('Hole_geometry_quality', 'Hole', 'normalX'),
|
|
('Hole_type_allowed', 'Hole', 'shelf_pin'),
|
|
('Hole_optional_text_not_blank', 'Hole', 'groupId'),
|
|
('ProductHardware_match_status_allowed', 'ProductHardware', 'unmatched'),
|
|
('ProductHardware_match_confidence_valid', 'ProductHardware', 'matchConfidence'),
|
|
('ProductHardware_match_method_allowed', 'ProductHardware', 'blockName'),
|
|
('ProductHardware_quantities_geometry_valid', 'ProductHardware', 'holeDistance'),
|
|
('ProductHardware_transform_object', 'ProductHardware', 'transform'),
|
|
('ProductHardware_sourceSignature_object', 'ProductHardware', 'sourceSignature'),
|
|
('ProductHardware_optional_text_not_blank', 'ProductHardware', 'sourceBlockName'),
|
|
('AssemblyStep_identity_order_valid', 'AssemblyStep', 'order'),
|
|
('AssemblyStep_type_allowed', 'AssemblyStep', 'hardware'),
|
|
('AssemblyStep_animation_valid', 'AssemblyStep', 'cameraTransition'),
|
|
('AssemblyStep_transform_object', 'AssemblyStep', 'transform'),
|
|
('AssemblyStep_cameraPosition_object', 'AssemblyStep', 'cameraPosition'),
|
|
('AssemblyStep_infoCardData_object', 'AssemblyStep', 'infoCardData'),
|
|
('AssemblyStep_optional_text_not_blank', 'AssemblyStep', 'description'),
|
|
('AssemblyVersion_snapshot_array', 'AssemblyVersion', 'snapshot'),
|
|
('AssemblyVersion_version_positive', 'AssemblyVersion', 'version'),
|
|
('AssemblyVersion_optional_text_not_blank', 'AssemblyVersion', 'createdBy'),
|
|
('ProductSKU_skuCode_normalized', 'ProductSKU', 'upper(btrim'),
|
|
('ProductSKU_active_skuCode_no_deleted_marker_ci', 'ProductSKU', 'lower'),
|
|
('AssetVariant_code_normalized', 'AssetVariant', 'upper(btrim'),
|
|
('AssetVariant_barcode_normalized', 'AssetVariant', 'upper(btrim'),
|
|
('AssetVariant_identity_valid', 'AssetVariant', 'identityKey'),
|
|
('AssetVariant_json_shape_valid', 'AssetVariant', 'mountPoints'),
|
|
('AssetVariant_cost_weight_valid', 'AssetVariant', 'estimatedCostPrice'),
|
|
('AssetVariant_lifecycle_state_valid', 'AssetVariant', 'PENDING_REVIEW'),
|
|
('AssetVariant_inheritance_not_self', 'AssetVariant', 'inheritedFromVariantId'),
|
|
('PreSku_identity_valid', 'PreSku', 'sourceCandidateKey'),
|
|
('PreSku_process_snapshots_shape_valid', 'PreSku', 'familySelection'),
|
|
('PreSku_weight_valid', 'PreSku', 'weightPreview'),
|
|
('PreSku_component_codes_valid', 'PreSku', 'componentCodes'),
|
|
('PreSku_optional_text_not_blank', 'PreSku', 'customName'),
|
|
('PreSkuBasicInfo_formalSkuCode_normalized', 'PreSkuBasicInfo', 'upper(btrim'),
|
|
('PreSkuBasicInfo_barcode_normalized', 'PreSkuBasicInfo', 'upper(btrim'),
|
|
('PreSkuBasicInfo_model_normalized', 'PreSkuBasicInfo', 'upper(btrim'),
|
|
('PreSkuBasicInfo_versionNo_normalized', 'PreSkuBasicInfo', 'upper(btrim'),
|
|
('PreSkuBasicInfo_attributeCode_normalized', 'PreSkuBasicInfo', 'upper(btrim'),
|
|
('PreSkuBasicInfo_drawingId_normalized', 'PreSkuBasicInfo', 'upper(btrim'),
|
|
('PreSkuBasicInfo_source_allowed', 'PreSkuBasicInfo', 'DRAFT_GROUP'),
|
|
('PreSkuBasicInfo_optional_text_not_blank', 'PreSkuBasicInfo', 'formalSkuCode'),
|
|
('AssetSkuSyncEvent_reason_allowed', 'AssetSkuSyncEvent', 'VARIANT_UPDATED'),
|
|
('AssetSkuSyncEvent_counts_non_negative', 'AssetSkuSyncEvent', 'retryCount'),
|
|
('AssetSkuSyncEvent_synced_not_over_affected', 'AssetSkuSyncEvent', 'syncedCount'),
|
|
('AssetSkuSyncEvent_completed_has_processed_at', 'AssetSkuSyncEvent', 'processedAt'),
|
|
('ProductSkuAssetProfile_barcode_normalized', 'ProductSkuAssetProfile', 'upper(btrim'),
|
|
('ProductSkuAssetProfile_model_normalized', 'ProductSkuAssetProfile', 'upper(btrim'),
|
|
('ProductSkuAssetProfile_specCode_normalized', 'ProductSkuAssetProfile', 'upper(btrim'),
|
|
('ProductSkuAssetProfile_primary_source_required', 'ProductSkuAssetProfile', 'primarySourceAssetVariantId'),
|
|
('ProductSkuAssetProfile_source_variant_ids_required', 'ProductSkuAssetProfile', 'sourceAssetVariantIds'),
|
|
('ProductSkuAssetProfile_primary_source_in_source_ids', 'ProductSkuAssetProfile', 'primarySourceAssetVariantId'),
|
|
('ProductSkuAssetProfile_optional_text_not_blank', 'ProductSkuAssetProfile', 'specCode'),
|
|
('ProductPatentRecord_patentGroupKey_normalized', 'ProductPatentRecord', 'upper(btrim'),
|
|
('ProductPatentRecord_productId_required', 'ProductPatentRecord', 'btrim'),
|
|
('ProductPatentRecord_applicationNo_normalized', 'ProductPatentRecord', 'upper(btrim'),
|
|
('ProductPatentRecord_patentNo_normalized', 'ProductPatentRecord', 'upper(btrim'),
|
|
('ProductPatentRecord_spu_normalized', 'ProductPatentRecord', 'upper(btrim'),
|
|
('ProductPatentRecord_patent_identity_required', 'ProductPatentRecord', 'patentName'),
|
|
('IntakeNonIntegratedSkuItem_skuCode_normalized', 'IntakeNonIntegratedSkuItem', 'upper(btrim'),
|
|
('IntakeNonIntegratedSkuItem_barcode_normalized', 'IntakeNonIntegratedSkuItem', 'upper(btrim'),
|
|
('ApprovalWorkflow_approvalNumber_normalized', 'ApprovalWorkflow', 'upper(btrim'),
|
|
('ApprovalWorkflow_title_not_blank', 'ApprovalWorkflow', 'title'),
|
|
('ApprovalWorkflow_productId_not_blank', 'ApprovalWorkflow', 'productId'),
|
|
('ApprovalWorkflow_accessKey_not_blank', 'ApprovalWorkflow', 'accessKey'),
|
|
('ApprovalWorkflow_participant_user_ids_valid', 'ApprovalWorkflow', 'text_array_distinct_non_blank'),
|
|
('ApprovalWorkflow_business_roles_distinct', 'ApprovalWorkflow', 'array_positions'),
|
|
('ApprovalWorkflow_fieldMatrix_array', 'ApprovalWorkflow', 'jsonb_typeof'),
|
|
('ApprovalWorkflow_summary_object', 'ApprovalWorkflow', 'jsonb_typeof'),
|
|
('ApprovalWorkflow_metadata_object', 'ApprovalWorkflow', 'jsonb_typeof'),
|
|
('ApprovalWorkflowFieldChange_fieldKey_not_blank', 'ApprovalWorkflowFieldChange', 'fieldKey'),
|
|
('ApprovalWorkflowFieldChange_source_not_blank', 'ApprovalWorkflowFieldChange', 'source'),
|
|
('ApprovalWorkflowFieldChange_optional_text_not_blank', 'ApprovalWorkflowFieldChange', 'sourcePage'),
|
|
('ApprovalWorkflowFieldChange_metadata_object', 'ApprovalWorkflowFieldChange', 'jsonb_typeof'),
|
|
('User_email_normalized', 'User', 'lower(btrim'),
|
|
('User_name_not_blank', 'User', 'btrim'),
|
|
('User_loginSource_not_blank', 'User', 'loginSource'),
|
|
('User_business_roles_distinct', 'User', 'array_positions'),
|
|
('User_optional_text_not_blank', 'User', 'dingtalkUserId'),
|
|
('Department_identity_not_blank', 'Department', 'fullPath'),
|
|
('Department_optional_text_not_blank', 'Department', 'externalId'),
|
|
('Department_orderIndex_non_negative', 'Department', 'orderIndex'),
|
|
('Team_identity_not_blank', 'Team', 'orderIndex'),
|
|
('EmployeeDirectory_name_not_blank', 'EmployeeDirectory', 'btrim'),
|
|
('EmployeeDirectory_optional_text_not_blank', 'EmployeeDirectory', 'primaryDepartmentExternalId'),
|
|
('EmployeeDirectory_email_normalized', 'EmployeeDirectory', 'lower(btrim'),
|
|
('EmployeeDirectory_departmentExternalIds_array', 'EmployeeDirectory', 'jsonb_typeof'),
|
|
('EmployeeDirectory_rawSnapshot_object', 'EmployeeDirectory', 'jsonb_typeof'),
|
|
('EmployeeLookupCache_identity_not_blank', 'EmployeeLookupCache', 'lookupValue'),
|
|
('EmployeeLookupCache_result_object', 'EmployeeLookupCache', 'jsonb_typeof'),
|
|
('ProductCategory_identity_valid', 'ProductCategory', 'sortOrder'),
|
|
('ProductCategory_optional_text_not_blank', 'ProductCategory', 'description'),
|
|
('MaterialCategory_identity_valid', 'MaterialCategory', 'sortOrder'),
|
|
('MaterialCategory_optional_text_not_blank', 'MaterialCategory', 'icon'),
|
|
('HardwareCategory_identity_valid', 'HardwareCategory', 'sortOrder'),
|
|
('HardwareCategory_optional_text_not_blank', 'HardwareCategory', 'description'),
|
|
('CommonComponentCategory_identity_valid', 'CommonComponentCategory', 'sortOrder'),
|
|
('CommonComponentCategory_optional_text_not_blank', 'CommonComponentCategory', 'description'),
|
|
('SubstrateCategory_identity_valid', 'SubstrateCategory', 'sortOrder'),
|
|
('SubstrateEnvironmentGrade_identity_valid', 'SubstrateEnvironmentGrade', 'sortOrder'),
|
|
('SubstrateSurfaceOption_identity_valid', 'SubstrateSurfaceOption', 'sortOrder'),
|
|
('SubstrateSystemNameOption_identity_valid', 'SubstrateSystemNameOption', 'sortOrder'),
|
|
('SubstrateThicknessSpec_identity_dimensions_valid', 'SubstrateThicknessSpec', 'thicknessMm'),
|
|
('HardwareMapping_match_key_exactly_one', 'HardwareMapping', 'signatureHash'),
|
|
('HardwareMapping_usage_source_valid', 'HardwareMapping', 'usageCount'),
|
|
('SubstrateFinish_relation_ids_not_blank', 'SubstrateFinish', 'substrateId'),
|
|
('PanelMaterial_relation_ids_not_blank', 'PanelMaterial', 'materialId'),
|
|
('AssetVariantLocationBinding_relation_ids_not_blank', 'AssetVariantLocationBinding', 'warehouseLocationId'),
|
|
('PreSkuLocationBinding_relation_ids_not_blank', 'PreSkuLocationBinding', 'warehouseLocationId'),
|
|
('PackagingPlan_identity_counts_valid', 'PackagingPlan', 'boxCount'),
|
|
('PackagingPlan_boxes_array', 'PackagingPlan', 'jsonb_typeof'),
|
|
('PackagingPlan_totals_valid', 'PackagingPlan', 'totalWeight'),
|
|
('PackagingPlan_optional_text_not_blank', 'PackagingPlan', 'description'),
|
|
('SystemConfig_key_valid', 'SystemConfig', 'btrim'),
|
|
('SystemConfig_description_not_blank', 'SystemConfig', 'description'),
|
|
('ProviderConfig_identity_valid', 'ProviderConfig', 'serviceType'),
|
|
('ProviderConfig_optional_fields_valid', 'ProviderConfig', 'jsonb_typeof'),
|
|
('ThemeConfig_identity_valid', 'ThemeConfig', 'createdBy'),
|
|
('ThemeConfig_optional_config_valid', 'ThemeConfig', 'homeBackground'),
|
|
('IntakeNodePermissionOverride_identity_valid', 'IntakeNodePermissionOverride', 'targetKey'),
|
|
('IntakeNodePermissionOverride_audit_text_not_blank', 'IntakeNodePermissionOverride', 'createdBy'),
|
|
('AssistedAssemblyAiRender_identity_valid', 'AssistedAssemblyAiRender', 'prompt'),
|
|
('AssistedAssemblyAiRender_json_shape_valid', 'AssistedAssemblyAiRender', 'workspaceSnapshot'),
|
|
('AssistedAssemblyAiRender_status_duration_valid', 'AssistedAssemblyAiRender', 'durationMs'),
|
|
('AssistedAssemblyAiRender_optional_text_not_blank', 'AssistedAssemblyAiRender', 'negativePrompt'),
|
|
('Feedback_identity_valid', 'Feedback', 'description'),
|
|
('Feedback_images_valid', 'Feedback', 'text_array_all_trimmed_non_blank'),
|
|
('Feedback_comments_array', 'Feedback', 'jsonb_typeof'),
|
|
('Feedback_resolution_state_valid', 'Feedback', 'resolvedAt'),
|
|
('ActivityLog_identity_valid', 'ActivityLog', 'action'),
|
|
('ActivityLog_target_pair_valid', 'ActivityLog', 'targetType'),
|
|
('ActivityLog_json_shape_valid', 'ActivityLog', 'metadata')
|
|
)
|
|
SELECT
|
|
'missing_required_check_constraint_guard' AS check_name,
|
|
guard.constraint_name,
|
|
guard.table_name,
|
|
pg_get_constraintdef(con.oid) AS actual_definition,
|
|
guard.expression_hint AS expected_expression_hint
|
|
FROM required_constraint_guards guard
|
|
LEFT JOIN pg_constraint con ON con.conname = guard.constraint_name
|
|
LEFT JOIN pg_class table_cls ON table_cls.oid = con.conrelid
|
|
LEFT JOIN pg_namespace ns ON ns.oid = table_cls.relnamespace
|
|
WHERE con.oid IS NULL
|
|
OR con.contype <> 'c'
|
|
OR ns.nspname <> 'public'
|
|
OR table_cls.relname <> guard.table_name
|
|
OR (
|
|
guard.expression_hint IS NOT NULL
|
|
AND COALESCE(pg_get_constraintdef(con.oid), '') NOT LIKE '%' || guard.expression_hint || '%'
|
|
)
|
|
ORDER BY guard.constraint_name;
|
|
|
|
SELECT
|
|
'missing_required_trigger_guard' AS check_name,
|
|
guard.trigger_name,
|
|
guard.table_name
|
|
FROM (
|
|
VALUES
|
|
('IntakeNonIntegratedProduct_soft_delete_cleanup_sku_items', 'IntakeNonIntegratedProduct'),
|
|
('ProductSKU_sync_asset_profile_deleted_at', 'ProductSKU')
|
|
) AS guard(trigger_name, table_name)
|
|
WHERE NOT EXISTS (
|
|
SELECT 1
|
|
FROM information_schema.triggers
|
|
WHERE trigger_schema = 'public'
|
|
AND trigger_name = guard.trigger_name
|
|
AND event_object_table = guard.table_name
|
|
);
|
|
|
|
SELECT
|
|
'asset_series_duplicate_code_risk' AS check_name,
|
|
code,
|
|
COUNT(*)::integer AS duplicate_count
|
|
FROM "AssetSeries"
|
|
WHERE NULLIF(btrim(code), '') IS NOT NULL
|
|
GROUP BY code
|
|
HAVING COUNT(*) > 1
|
|
ORDER BY duplicate_count DESC, code;
|
|
|
|
SELECT
|
|
'asset_family_duplicate_code_risk' AS check_name,
|
|
code,
|
|
COUNT(*)::integer AS duplicate_count
|
|
FROM "AssetFamily"
|
|
WHERE NULLIF(btrim(code), '') IS NOT NULL
|
|
GROUP BY code
|
|
HAVING COUNT(*) > 1
|
|
ORDER BY duplicate_count DESC, code;
|
|
|
|
SELECT
|
|
'asset_variant_duplicate_code_risk' AS check_name,
|
|
upper(btrim(code)) AS code,
|
|
COUNT(*)::integer AS duplicate_count
|
|
FROM "AssetVariant"
|
|
WHERE NULLIF(btrim(code), '') IS NOT NULL
|
|
GROUP BY upper(btrim(code))
|
|
HAVING COUNT(*) > 1
|
|
ORDER BY duplicate_count DESC, upper(btrim(code));
|
|
|
|
SELECT
|
|
'asset_variant_duplicate_barcode_risk' AS check_name,
|
|
upper(btrim(barcode)) AS barcode,
|
|
COUNT(*)::integer AS duplicate_count
|
|
FROM "AssetVariant"
|
|
WHERE NULLIF(btrim(barcode), '') IS NOT NULL
|
|
GROUP BY upper(btrim(barcode))
|
|
HAVING COUNT(*) > 1
|
|
ORDER BY duplicate_count DESC, upper(btrim(barcode));
|
|
|
|
SELECT
|
|
'product_duplicate_model_number_risk' AS check_name,
|
|
upper(btrim("modelNumber")) AS "modelNumber",
|
|
COUNT(*)::integer AS duplicate_count
|
|
FROM "Product"
|
|
WHERE NULLIF(btrim("modelNumber"), '') IS NOT NULL
|
|
GROUP BY upper(btrim("modelNumber"))
|
|
HAVING COUNT(*) > 1
|
|
ORDER BY duplicate_count DESC, upper(btrim("modelNumber"));
|
|
|
|
SELECT
|
|
'product_identity_visibility_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "Product"
|
|
WHERE NULLIF(btrim(name), '') IS NULL
|
|
OR name <> btrim(name)
|
|
OR visibility NOT IN ('PRIVATE', 'TEAM', 'DEPARTMENT', 'PUBLIC')
|
|
OR (description IS NOT NULL AND NULLIF(btrim(description), '') IS NULL);
|
|
|
|
SELECT
|
|
'product_collaborator_role_identity_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "ProductCollaborator"
|
|
WHERE NULLIF(btrim("productId"), '') IS NULL
|
|
OR NULLIF(btrim("userId"), '') IS NULL
|
|
OR role NOT IN ('editor', 'viewer')
|
|
OR ("addedBy" IS NOT NULL AND NULLIF(btrim("addedBy"), '') IS NULL);
|
|
|
|
SELECT
|
|
'product_sku_price_cost_stock_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "ProductSKU"
|
|
WHERE "price" < 0
|
|
OR ("costPrice" IS NOT NULL AND "costPrice" < 0)
|
|
OR "stock" < 0;
|
|
|
|
SELECT
|
|
'share_link_identity_counter_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "ShareLink"
|
|
WHERE NULLIF(btrim(token), '') IS NULL
|
|
OR token <> btrim(token)
|
|
OR "viewCount" < 0
|
|
OR ("expiresAt" IS NOT NULL AND "expiresAt" <= "createdAt");
|
|
|
|
SELECT
|
|
'panel_identity_dimension_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "Panel"
|
|
WHERE NULLIF(btrim(code), '') IS NULL
|
|
OR code <> upper(btrim(code))
|
|
OR NULLIF(btrim(name), '') IS NULL
|
|
OR name <> btrim(name)
|
|
OR NULLIF(btrim("gltfNodeName"), '') IS NULL
|
|
OR "gltfNodeName" <> btrim("gltfNodeName")
|
|
OR length <= 0
|
|
OR width <= 0
|
|
OR thickness <= 0
|
|
OR COALESCE("installOrder", 0) < 0
|
|
OR ("partType" IS NOT NULL AND NULLIF(btrim("partType"), '') IS NULL)
|
|
OR ("explosionDirection" IS NOT NULL AND "explosionDirection" NOT IN ('auto', 'up', 'down', 'left', 'right', 'front', 'back'))
|
|
OR ("assemblySemantic" IS NOT NULL AND jsonb_typeof("assemblySemantic") NOT IN ('object', 'null'));
|
|
|
|
SELECT
|
|
'panel_duplicate_code_scope_risk' AS check_name,
|
|
"productId",
|
|
COALESCE("skuId", '') AS "skuScope",
|
|
upper(btrim(code)) AS code,
|
|
COUNT(*)::integer AS duplicate_count
|
|
FROM "Panel"
|
|
GROUP BY "productId", COALESCE("skuId", ''), upper(btrim(code))
|
|
HAVING COUNT(*) > 1
|
|
ORDER BY duplicate_count DESC, "productId", "skuScope", code;
|
|
|
|
SELECT
|
|
'hole_geometry_quality_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "Hole"
|
|
WHERE "positionX" IN ('Infinity'::float8, '-Infinity'::float8, 'NaN'::float8)
|
|
OR "positionY" IN ('Infinity'::float8, '-Infinity'::float8, 'NaN'::float8)
|
|
OR "positionZ" IN ('Infinity'::float8, '-Infinity'::float8, 'NaN'::float8)
|
|
OR diameter <= 0
|
|
OR depth < 0
|
|
OR "normalX" IN ('Infinity'::float8, '-Infinity'::float8, 'NaN'::float8)
|
|
OR "normalY" IN ('Infinity'::float8, '-Infinity'::float8, 'NaN'::float8)
|
|
OR "normalZ" IN ('Infinity'::float8, '-Infinity'::float8, 'NaN'::float8)
|
|
OR ("normalX" = 0 AND "normalY" = 0 AND "normalZ" = 0)
|
|
OR confidence < 0
|
|
OR confidence > 1
|
|
OR ("holeType" IS NOT NULL AND "holeType" NOT IN ('hinge', 'connector', 'shelf_pin', 'screw', 'dowel', 'cable', 'unknown'))
|
|
OR ("groupId" IS NOT NULL AND NULLIF(btrim("groupId"), '') IS NULL);
|
|
|
|
SELECT
|
|
'product_hardware_quality_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "ProductHardware"
|
|
WHERE jsonb_typeof(transform) <> 'object'
|
|
OR "matchStatus" NOT IN ('matched', 'pending', 'unmatched')
|
|
OR ("matchConfidence" IS NOT NULL AND ("matchConfidence" < 0 OR "matchConfidence" > 1))
|
|
OR ("matchMethod" IS NOT NULL AND "matchMethod" NOT IN ('blockName', 'mapping', 'size', 'manual'))
|
|
OR ("installOrder" IS NOT NULL AND "installOrder" < 0)
|
|
OR ("holeDistance" IS NOT NULL AND "holeDistance" < 0)
|
|
OR ("sourceSignature" IS NOT NULL AND jsonb_typeof("sourceSignature") NOT IN ('object', 'null'))
|
|
OR ("sourceBlockName" IS NOT NULL AND NULLIF(btrim("sourceBlockName"), '') IS NULL)
|
|
OR (notes IS NOT NULL AND NULLIF(btrim(notes), '') IS NULL)
|
|
OR ("panelId" IS NOT NULL AND NULLIF(btrim("panelId"), '') IS NULL)
|
|
OR ("connectedPanelId" IS NOT NULL AND NULLIF(btrim("connectedPanelId"), '') IS NULL)
|
|
OR ("associatedHoleId" IS NOT NULL AND NULLIF(btrim("associatedHoleId"), '') IS NULL)
|
|
OR ("parentHardwareId" IS NOT NULL AND NULLIF(btrim("parentHardwareId"), '') IS NULL);
|
|
|
|
SELECT
|
|
'assembly_step_quality_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "AssemblyStep"
|
|
WHERE "order" < 0
|
|
OR NULLIF(btrim(title), '') IS NULL
|
|
OR title <> btrim(title)
|
|
OR "stepType" NOT IN ('panel', 'hardware', 'custom')
|
|
OR duration <= 0
|
|
OR NULLIF(btrim(easing), '') IS NULL
|
|
OR "cameraTransition" NOT IN ('smooth', 'cut', 'orbit')
|
|
OR jsonb_typeof(transform) <> 'object'
|
|
OR ("cameraPosition" IS NOT NULL AND jsonb_typeof("cameraPosition") NOT IN ('object', 'null'))
|
|
OR ("infoCardData" IS NOT NULL AND jsonb_typeof("infoCardData") NOT IN ('object', 'null'))
|
|
OR (description IS NOT NULL AND NULLIF(btrim(description), '') IS NULL)
|
|
OR ("panelId" IS NOT NULL AND NULLIF(btrim("panelId"), '') IS NULL)
|
|
OR EXISTS (SELECT 1 FROM unnest("hardwareIds") AS item WHERE NULLIF(btrim(item), '') IS NULL)
|
|
OR cardinality("hardwareIds") <> (SELECT COUNT(DISTINCT btrim(item))::integer FROM unnest("hardwareIds") AS item)
|
|
OR EXISTS (SELECT 1 FROM unnest("partIds") AS item WHERE NULLIF(btrim(item), '') IS NULL)
|
|
OR cardinality("partIds") <> (SELECT COUNT(DISTINCT btrim(item))::integer FROM unnest("partIds") AS item);
|
|
|
|
SELECT
|
|
'assembly_version_snapshot_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "AssemblyVersion"
|
|
WHERE version <= 0
|
|
OR jsonb_typeof(snapshot) <> 'array'
|
|
OR (description IS NOT NULL AND NULLIF(btrim(description), '') IS NULL)
|
|
OR ("createdBy" IS NOT NULL AND NULLIF(btrim("createdBy"), '') IS NULL);
|
|
|
|
SELECT
|
|
'product_sku_duplicate_sku_code_risk' AS check_name,
|
|
upper(btrim("skuCode")) AS "skuCode",
|
|
COUNT(*)::integer AS duplicate_count
|
|
FROM "ProductSKU"
|
|
WHERE "deletedAt" IS NULL
|
|
AND NULLIF(btrim("skuCode"), '') IS NOT NULL
|
|
GROUP BY upper(btrim("skuCode"))
|
|
HAVING COUNT(*) > 1
|
|
ORDER BY duplicate_count DESC, upper(btrim("skuCode"));
|
|
|
|
SELECT
|
|
'product_sku_missing_name_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "ProductSKU" sku
|
|
JOIN "Product" product ON product."id" = sku."productId"
|
|
WHERE sku."deletedAt" IS NULL
|
|
AND product."deletedAt" IS NULL
|
|
AND NULLIF(btrim(COALESCE(sku."name", '')), '') IS NULL;
|
|
|
|
SELECT
|
|
'product_sku_formal_truth_attribute_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "ProductSKU"
|
|
WHERE attributes ?| ARRAY[
|
|
'skuName',
|
|
'model',
|
|
'specCode',
|
|
'barcode',
|
|
'category',
|
|
'color',
|
|
'material',
|
|
'size'
|
|
];
|
|
|
|
SELECT
|
|
'draft_group_duplicate_code_risk' AS check_name,
|
|
code,
|
|
COUNT(*)::integer AS duplicate_count
|
|
FROM "DraftGroup"
|
|
WHERE NULLIF(btrim(code), '') IS NOT NULL
|
|
GROUP BY code
|
|
HAVING COUNT(*) > 1
|
|
ORDER BY duplicate_count DESC, code;
|
|
|
|
SELECT
|
|
'draft_group_invalid_process_shape_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "DraftGroup"
|
|
WHERE NULLIF(btrim(code), '') IS NULL
|
|
OR code <> btrim(code)
|
|
OR NULLIF(btrim(name), '') IS NULL
|
|
OR name <> btrim(name)
|
|
OR jsonb_typeof(summary::jsonb) <> 'object'
|
|
OR (description IS NOT NULL AND NULLIF(btrim(description), '') IS NULL)
|
|
OR (notes IS NOT NULL AND NULLIF(btrim(notes), '') IS NULL);
|
|
|
|
SELECT
|
|
'pre_sku_duplicate_per_group_risk' AS check_name,
|
|
"draftGroupId",
|
|
sequence,
|
|
COUNT(*)::integer AS duplicate_count
|
|
FROM "PreSku"
|
|
GROUP BY "draftGroupId", sequence
|
|
HAVING COUNT(*) > 1
|
|
ORDER BY duplicate_count DESC, "draftGroupId", sequence;
|
|
|
|
SELECT
|
|
'pre_sku_invalid_process_shape_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "PreSku"
|
|
WHERE sequence <= 0
|
|
OR NULLIF(btrim("defaultName"), '') IS NULL
|
|
OR "defaultName" <> btrim("defaultName")
|
|
OR NULLIF(btrim("sourceCandidateKey"), '') IS NULL
|
|
OR "sourceCandidateKey" <> btrim("sourceCandidateKey")
|
|
OR jsonb_typeof("familySelection"::jsonb) <> 'object'
|
|
OR jsonb_typeof("variantSelection"::jsonb) <> 'object'
|
|
OR jsonb_typeof("previewNodes"::jsonb) <> 'array'
|
|
OR jsonb_typeof("displaySummary"::jsonb) <> 'object'
|
|
OR jsonb_typeof("bomPreview"::jsonb) <> 'array'
|
|
OR (
|
|
"recommendedHardware" IS NOT NULL
|
|
AND jsonb_typeof("recommendedHardware"::jsonb) NOT IN ('array', 'null')
|
|
)
|
|
OR (
|
|
"explosionPreview" IS NOT NULL
|
|
AND jsonb_typeof("explosionPreview"::jsonb) NOT IN ('array', 'null')
|
|
)
|
|
OR jsonb_typeof("installStepPreview"::jsonb) <> 'array'
|
|
OR (
|
|
"packagingSnapshot" IS NOT NULL
|
|
AND jsonb_typeof("packagingSnapshot"::jsonb) NOT IN ('object', 'null')
|
|
)
|
|
OR ("weightPreview" IS NOT NULL AND "weightPreview" < 0)
|
|
OR EXISTS (
|
|
SELECT 1
|
|
FROM unnest("componentCodes") AS item
|
|
WHERE NULLIF(btrim(item), '') IS NULL
|
|
)
|
|
OR ("customName" IS NOT NULL AND NULLIF(btrim("customName"), '') IS NULL)
|
|
OR (notes IS NOT NULL AND NULLIF(btrim(notes), '') IS NULL);
|
|
|
|
SELECT
|
|
'pre_sku_formalization_lifecycle_mismatch_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM (
|
|
SELECT pre_sku."id"
|
|
FROM "PreSku" pre_sku
|
|
LEFT JOIN "ProductSKU" sku ON sku."sourcePreSkuId" = pre_sku."id"
|
|
WHERE pre_sku.status = 'FORMALIZED'::"PreSkuStatus"
|
|
AND sku."id" IS NULL
|
|
|
|
UNION ALL
|
|
|
|
SELECT pre_sku."id"
|
|
FROM "ProductSKU" sku
|
|
JOIN "PreSku" pre_sku ON pre_sku."id" = sku."sourcePreSkuId"
|
|
WHERE sku."deletedAt" IS NULL
|
|
AND pre_sku.status <> 'FORMALIZED'::"PreSkuStatus"
|
|
) mismatches;
|
|
|
|
SELECT
|
|
'asset_family_without_series_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "AssetFamily"
|
|
WHERE "assetSeriesId" IS NULL;
|
|
|
|
SELECT
|
|
'asset_variant_without_model_url_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "AssetVariant"
|
|
WHERE NULLIF(btrim("modelUrl"), '') IS NULL;
|
|
|
|
SELECT
|
|
'product_sku_without_asset_profile_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "ProductSKU" sku
|
|
JOIN "Product" product ON product."id" = sku."productId"
|
|
LEFT JOIN "ProductSkuAssetProfile" profile ON profile."skuId" = sku."id"
|
|
WHERE sku."deletedAt" IS NULL
|
|
AND product."deletedAt" IS NULL
|
|
AND jsonb_typeof(sku.attributes::jsonb -> 'assetSkuSnapshot') = 'object'
|
|
AND profile."id" IS NULL;
|
|
|
|
SELECT
|
|
'product_sku_asset_profile_snapshot_sync_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "ProductSKU" sku
|
|
JOIN "Product" product ON product."id" = sku."productId"
|
|
JOIN "ProductSkuAssetProfile" profile ON profile."skuId" = sku."id"
|
|
WHERE sku."deletedAt" IS NULL
|
|
AND product."deletedAt" IS NULL
|
|
AND jsonb_typeof(sku.attributes::jsonb -> 'assetSkuSnapshot') = 'object'
|
|
AND (
|
|
COALESCE(profile."model", '') IS DISTINCT FROM COALESCE(sku.attributes::jsonb -> 'assetSkuSnapshot' ->> 'model', '')
|
|
OR COALESCE(profile."specCode", '') IS DISTINCT FROM COALESCE(sku.attributes::jsonb -> 'assetSkuSnapshot' ->> 'specCode', '')
|
|
OR COALESCE(profile."barcode", '') IS DISTINCT FROM COALESCE(sku.attributes::jsonb -> 'assetSkuSnapshot' ->> 'barcode', '')
|
|
OR COALESCE(profile."imageUrl", '') IS DISTINCT FROM COALESCE(sku.attributes::jsonb -> 'assetSkuSnapshot' ->> 'imageUrl', '')
|
|
);
|
|
|
|
SELECT
|
|
'product_sku_profile_duplicate_barcode_risk' AS check_name,
|
|
upper(btrim(profile."barcode")) AS barcode,
|
|
COUNT(*)::integer AS duplicate_count
|
|
FROM "ProductSkuAssetProfile" profile
|
|
JOIN "ProductSKU" sku ON sku."id" = profile."skuId"
|
|
JOIN "Product" product ON product."id" = sku."productId"
|
|
WHERE sku."deletedAt" IS NULL
|
|
AND product."deletedAt" IS NULL
|
|
AND profile."sourceStatus" = 'ACTIVE'
|
|
AND NULLIF(btrim(COALESCE(profile."barcode", '')), '') IS NOT NULL
|
|
GROUP BY upper(btrim(profile."barcode"))
|
|
HAVING COUNT(*) > 1
|
|
ORDER BY duplicate_count DESC, barcode;
|
|
|
|
SELECT
|
|
'product_sku_asset_profile_source_id_mismatch_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "ProductSKU" sku
|
|
JOIN "Product" product ON product."id" = sku."productId"
|
|
JOIN "ProductSkuAssetProfile" profile ON profile."skuId" = sku."id"
|
|
WHERE sku."deletedAt" IS NULL
|
|
AND product."deletedAt" IS NULL
|
|
AND NULLIF(btrim(COALESCE(sku."sourceAssetVariantId", '')), '') IS NOT NULL
|
|
AND NULLIF(btrim(COALESCE(profile."primarySourceAssetVariantId", '')), '') IS NOT NULL
|
|
AND sku."sourceAssetVariantId" IS DISTINCT FROM profile."primarySourceAssetVariantId";
|
|
|
|
SELECT
|
|
'pre_sku_missing_truth_snapshot_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "PreSku"
|
|
WHERE "familySelection" IS NULL
|
|
OR "variantSelection" IS NULL
|
|
OR "displaySummary" IS NULL
|
|
OR "bomPreview" IS NULL;
|
|
|
|
SELECT
|
|
'pre_sku_missing_basic_info_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "PreSku" pre_sku
|
|
LEFT JOIN "PreSkuBasicInfo" basic_info ON basic_info."preSkuId" = pre_sku."id"
|
|
WHERE basic_info."id" IS NULL
|
|
AND (
|
|
NULLIF(btrim(COALESCE(pre_sku."displaySummary"::jsonb ->> 'model', pre_sku."familySelection"::jsonb ->> 'model', '')), '') IS NOT NULL
|
|
OR NULLIF(btrim(COALESCE(pre_sku."displaySummary"::jsonb ->> 'formalSkuCode', pre_sku."familySelection"::jsonb ->> 'formalSkuCode', '')), '') IS NOT NULL
|
|
OR NULLIF(btrim(COALESCE(pre_sku."displaySummary"::jsonb ->> 'barcode', pre_sku."familySelection"::jsonb ->> 'barcode', '')), '') IS NOT NULL
|
|
OR NULLIF(btrim(COALESCE(pre_sku."displaySummary"::jsonb ->> 'specName', pre_sku."familySelection"::jsonb ->> 'specName', '')), '') IS NOT NULL
|
|
);
|
|
|
|
SELECT
|
|
'pre_sku_basic_info_snapshot_sync_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "PreSku" pre_sku
|
|
JOIN "PreSkuBasicInfo" basic_info ON basic_info."preSkuId" = pre_sku."id"
|
|
WHERE COALESCE(basic_info."model", '') IS DISTINCT FROM COALESCE(NULLIF(btrim(COALESCE(pre_sku."displaySummary"::jsonb ->> 'model', pre_sku."familySelection"::jsonb ->> 'model', '')), ''), '')
|
|
OR COALESCE(basic_info."formalSkuCode", '') IS DISTINCT FROM COALESCE(NULLIF(btrim(COALESCE(pre_sku."displaySummary"::jsonb ->> 'formalSkuCode', pre_sku."familySelection"::jsonb ->> 'formalSkuCode', '')), ''), '')
|
|
OR COALESCE(basic_info."barcode", '') IS DISTINCT FROM COALESCE(NULLIF(btrim(COALESCE(pre_sku."displaySummary"::jsonb ->> 'barcode', pre_sku."familySelection"::jsonb ->> 'barcode', '')), ''), '')
|
|
OR COALESCE(basic_info."specName", '') IS DISTINCT FROM COALESCE(NULLIF(btrim(COALESCE(pre_sku."displaySummary"::jsonb ->> 'specName', pre_sku."familySelection"::jsonb ->> 'specName', '')), ''), '');
|
|
|
|
SELECT
|
|
'pre_sku_duplicate_formal_sku_code_risk' AS check_name,
|
|
upper(btrim(basic_info."formalSkuCode")) AS "formalSkuCode",
|
|
COUNT(*)::integer AS duplicate_count
|
|
FROM "PreSkuBasicInfo" basic_info
|
|
JOIN "PreSku" pre_sku ON pre_sku."id" = basic_info."preSkuId"
|
|
WHERE pre_sku."status" <> 'ARCHIVED'
|
|
AND NULLIF(btrim(basic_info."formalSkuCode"), '') IS NOT NULL
|
|
GROUP BY upper(btrim(basic_info."formalSkuCode"))
|
|
HAVING COUNT(*) > 1
|
|
ORDER BY duplicate_count DESC, upper(btrim(basic_info."formalSkuCode"));
|
|
|
|
SELECT
|
|
'pre_sku_duplicate_barcode_risk' AS check_name,
|
|
upper(btrim(basic_info."barcode")) AS "barcode",
|
|
COUNT(*)::integer AS duplicate_count
|
|
FROM "PreSkuBasicInfo" basic_info
|
|
JOIN "PreSku" pre_sku ON pre_sku."id" = basic_info."preSkuId"
|
|
WHERE pre_sku."status" <> 'ARCHIVED'
|
|
AND NULLIF(btrim(basic_info."barcode"), '') IS NOT NULL
|
|
GROUP BY upper(btrim(basic_info."barcode"))
|
|
HAVING COUNT(*) > 1
|
|
ORDER BY duplicate_count DESC, upper(btrim(basic_info."barcode"));
|
|
|
|
SELECT
|
|
'intake_non_integrated_missing_product_profile_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "IntakeNonIntegratedProduct" product
|
|
LEFT JOIN "IntakeNonIntegratedProductProfile" profile ON profile."productId" = product."id"
|
|
WHERE product."deletedAt" IS NULL
|
|
AND profile."id" IS NULL;
|
|
|
|
SELECT
|
|
'intake_non_integrated_product_profile_quality_risk' AS check_name,
|
|
COUNT(*) FILTER (WHERE NULLIF(btrim(profile."productName"), '') IS NULL)::integer AS missing_product_name_count,
|
|
COUNT(*) FILTER (WHERE NULLIF(btrim(profile."productCategory"), '') IS NULL)::integer AS missing_product_category_count,
|
|
COUNT(*) FILTER (WHERE NULLIF(btrim(profile."productDevelopmentKind"), '') IS NULL)::integer AS missing_development_kind_count
|
|
FROM "IntakeNonIntegratedProduct" product
|
|
JOIN "IntakeNonIntegratedProductProfile" profile ON profile."productId" = product."id"
|
|
WHERE product."deletedAt" IS NULL;
|
|
|
|
SELECT
|
|
'intake_non_integrated_product_profile_quality_sample' AS check_name,
|
|
product."id",
|
|
product."spu",
|
|
profile."productName",
|
|
profile."productCategory",
|
|
profile."productDevelopmentKind",
|
|
ARRAY_REMOVE(ARRAY[
|
|
CASE WHEN NULLIF(btrim(profile."productName"), '') IS NULL THEN 'productName' END,
|
|
CASE WHEN NULLIF(btrim(profile."productCategory"), '') IS NULL THEN 'productCategory' END,
|
|
CASE WHEN NULLIF(btrim(profile."productDevelopmentKind"), '') IS NULL THEN 'productDevelopmentKind' END
|
|
], NULL) AS "missingFields"
|
|
FROM "IntakeNonIntegratedProduct" product
|
|
JOIN "IntakeNonIntegratedProductProfile" profile ON profile."productId" = product."id"
|
|
WHERE product."deletedAt" IS NULL
|
|
AND (
|
|
NULLIF(btrim(profile."productName"), '') IS NULL
|
|
OR NULLIF(btrim(profile."productCategory"), '') IS NULL
|
|
OR NULLIF(btrim(profile."productDevelopmentKind"), '') IS NULL
|
|
)
|
|
ORDER BY product."spu", product."id"
|
|
LIMIT 20;
|
|
|
|
WITH payload_profile AS (
|
|
SELECT
|
|
product."id" AS product_id,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb -> 'openingReference' ->> 'productName'), ''), NULLIF(btrim(product."payload"::jsonb ->> 'previewImageName'), ''), NULLIF(btrim(product."payload"::jsonb ->> 'spu'), ''), '') AS product_name,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb -> 'openingReference' ->> 'productImage'), ''), NULLIF(btrim(product."payload"::jsonb ->> 'previewImage'), ''), '') AS product_image_url,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb -> 'openingReference' ->> 'productCategory'), ''), NULLIF(btrim(product."payload"::jsonb ->> 'productCategory'), ''), '') AS product_category,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb -> 'openingReference' ->> 'salesCategory'), ''), NULLIF(btrim(product."payload"::jsonb ->> 'salesCategory'), ''), '') AS sales_category,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb -> 'openingReference' ->> 'year'), ''), NULLIF(btrim(product."payload"::jsonb ->> 'year'), ''), '') AS product_year,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb -> 'openingReference' ->> 'currentStage'), ''), NULLIF(btrim(product."payload"::jsonb ->> 'projectStatus'), ''), '') AS product_status,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'productDevelopmentKind'), ''), '') AS product_development_kind,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'goodsType'), ''), '') AS goods_type,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'materialType'), ''), '') AS material_type,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'productionType'), ''), '') AS production_type,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'size'), ''), NULLIF(btrim(product."payload"::jsonb -> 'openingReference' ->> 'size'), ''), '') AS size,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'color'), ''), '') AS color,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'tagMaterial'), ''), '') AS tag_material,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'priceBand'), ''), NULLIF(btrim(product."payload"::jsonb -> 'openingReference' ->> 'targetPriceBand'), ''), '') AS price_band,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'demandFlowNo'), ''), '') AS demand_flow_no,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'processTemplate'), ''), '') AS process_template,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'productPlanning'), ''), NULLIF(btrim(product."payload"::jsonb -> 'openingReference' ->> 'planningOwner'), ''), '') AS product_planning,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'brandPlanning'), ''), '') AS brand_planning,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'demandDepartment'), ''), '') AS demand_department,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'spuOwner'), ''), '') AS spu_owner,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'operationsOwner'), ''), '') AS operations_owner,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'purchaseOwner'), ''), NULLIF(btrim(product."payload"::jsonb ->> 'purchaser'), ''), '') AS purchase_owner,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'visualDirector'), ''), '') AS visual_director,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb ->> 'visualPlanning'), ''), '') AS visual_planning,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb -> 'openingReference' ->> 'structureDesigner'), ''), '') AS structure_designer
|
|
FROM "IntakeNonIntegratedProduct" product
|
|
WHERE product."deletedAt" IS NULL
|
|
)
|
|
SELECT
|
|
'intake_non_integrated_product_profile_payload_sync_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM payload_profile payload
|
|
JOIN "IntakeNonIntegratedProductProfile" profile ON profile."productId" = payload.product_id
|
|
WHERE COALESCE(profile."productName", '') IS DISTINCT FROM payload.product_name
|
|
OR COALESCE(profile."productImageUrl", '') IS DISTINCT FROM payload.product_image_url
|
|
OR COALESCE(profile."productCategory", '') IS DISTINCT FROM payload.product_category
|
|
OR COALESCE(profile."salesCategory", '') IS DISTINCT FROM payload.sales_category
|
|
OR COALESCE(profile."productYear", '') IS DISTINCT FROM payload.product_year
|
|
OR COALESCE(profile."productStatus", '') IS DISTINCT FROM payload.product_status
|
|
OR COALESCE(profile."productDevelopmentKind", '') IS DISTINCT FROM payload.product_development_kind
|
|
OR COALESCE(profile."goodsType", '') IS DISTINCT FROM payload.goods_type
|
|
OR COALESCE(profile."materialType", '') IS DISTINCT FROM payload.material_type
|
|
OR COALESCE(profile."productionType", '') IS DISTINCT FROM payload.production_type
|
|
OR COALESCE(profile."size", '') IS DISTINCT FROM payload.size
|
|
OR COALESCE(profile."color", '') IS DISTINCT FROM payload.color
|
|
OR COALESCE(profile."tagMaterial", '') IS DISTINCT FROM payload.tag_material
|
|
OR COALESCE(profile."priceBand", '') IS DISTINCT FROM payload.price_band
|
|
OR COALESCE(profile."demandFlowNo", '') IS DISTINCT FROM payload.demand_flow_no
|
|
OR COALESCE(profile."processTemplate", '') IS DISTINCT FROM payload.process_template
|
|
OR COALESCE(profile."productPlanning", '') IS DISTINCT FROM payload.product_planning
|
|
OR COALESCE(profile."brandPlanning", '') IS DISTINCT FROM payload.brand_planning
|
|
OR COALESCE(profile."demandDepartment", '') IS DISTINCT FROM payload.demand_department
|
|
OR COALESCE(profile."spuOwner", '') IS DISTINCT FROM payload.spu_owner
|
|
OR COALESCE(profile."operationsOwner", '') IS DISTINCT FROM payload.operations_owner
|
|
OR COALESCE(profile."purchaseOwner", '') IS DISTINCT FROM payload.purchase_owner
|
|
OR COALESCE(profile."visualDirector", '') IS DISTINCT FROM payload.visual_director
|
|
OR COALESCE(profile."visualPlanning", '') IS DISTINCT FROM payload.visual_planning
|
|
OR COALESCE(profile."structureDesigner", '') IS DISTINCT FROM payload.structure_designer;
|
|
|
|
WITH payload_stock_source AS (
|
|
SELECT
|
|
product."id" AS product_id,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb -> 'metadata' ->> 'sourceSpu'), ''), '') AS source_spu,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb -> 'metadata' ->> 'sourceSkuId'), ''), '') AS source_sku_id,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb -> 'metadata' ->> 'sourceCategory'), ''), '') AS source_category,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb -> 'metadata' ->> 'sourceItemType'), ''), '') AS source_item_type,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb -> 'metadata' ->> 'sourceSalesStatus'), ''), '') AS source_sales_status,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb -> 'metadata' ->> 'sourceEnabled'), ''), '') AS source_enabled,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb -> 'metadata' ->> 'sourceStockDisabled'), ''), '') AS source_stock_disabled,
|
|
CASE
|
|
WHEN jsonb_typeof(product."payload"::jsonb -> 'skuItems') = 'array'
|
|
THEN jsonb_array_length(product."payload"::jsonb -> 'skuItems')
|
|
ELSE 0
|
|
END AS stock_sku_count,
|
|
COALESCE(NULLIF(btrim(product."payload"::jsonb -> 'metadata' ->> 'sourceSalesStatus'), ''), '') = '销售' AS stock_has_on_sale_sku
|
|
FROM "IntakeNonIntegratedProduct" product
|
|
WHERE product."deletedAt" IS NULL
|
|
)
|
|
SELECT
|
|
'intake_non_integrated_stock_source_profile_sync_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM payload_stock_source payload
|
|
JOIN "IntakeNonIntegratedProductProfile" profile ON profile."productId" = payload.product_id
|
|
WHERE COALESCE(profile."sourceSpu", '') IS DISTINCT FROM payload.source_spu
|
|
OR COALESCE(profile."sourceSkuId", '') IS DISTINCT FROM payload.source_sku_id
|
|
OR COALESCE(profile."sourceCategory", '') IS DISTINCT FROM payload.source_category
|
|
OR COALESCE(profile."sourceItemType", '') IS DISTINCT FROM payload.source_item_type
|
|
OR COALESCE(profile."sourceSalesStatus", '') IS DISTINCT FROM payload.source_sales_status
|
|
OR COALESCE(profile."sourceEnabled", '') IS DISTINCT FROM payload.source_enabled
|
|
OR COALESCE(profile."sourceStockDisabled", '') IS DISTINCT FROM payload.source_stock_disabled
|
|
OR COALESCE(profile."stockSkuCount", 0) IS DISTINCT FROM payload.stock_sku_count
|
|
OR COALESCE(profile."stockHasOnSaleSku", false) IS DISTINCT FROM payload.stock_has_on_sale_sku;
|
|
|
|
SELECT
|
|
'intake_non_integrated_duplicate_sku_code_risk' AS check_name,
|
|
upper(btrim(sku."skuCode")) AS "skuCode",
|
|
COUNT(*)::integer AS duplicate_count
|
|
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
|
|
ORDER BY duplicate_count DESC, upper(btrim(sku."skuCode"));
|
|
|
|
SELECT
|
|
'intake_non_integrated_duplicate_barcode_risk' AS check_name,
|
|
upper(btrim(sku."barcode")) AS "barcode",
|
|
COUNT(*)::integer AS duplicate_count
|
|
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
|
|
FROM "IntakeNonIntegratedSkuItem" sku
|
|
JOIN "IntakeNonIntegratedProduct" product ON product."id" = sku."productId"
|
|
WHERE product."deletedAt" IS NULL
|
|
AND sku."dataQualityStatus" = 'INCOMPLETE';
|
|
|
|
SELECT
|
|
'intake_non_integrated_incomplete_sku_sample' AS check_name,
|
|
sku."id",
|
|
sku."productId",
|
|
product."spu",
|
|
sku."skuItemId",
|
|
sku."skuCode",
|
|
sku."specName",
|
|
sku."model",
|
|
sku."barcode",
|
|
sku."missingRequiredFields"
|
|
FROM "IntakeNonIntegratedSkuItem" sku
|
|
JOIN "IntakeNonIntegratedProduct" product ON product."id" = sku."productId"
|
|
WHERE product."deletedAt" IS NULL
|
|
AND sku."dataQualityStatus" = 'INCOMPLETE'
|
|
ORDER BY product."spu", sku."sortOrder", sku."id"
|
|
LIMIT 20;
|
|
|
|
SELECT
|
|
'approval_workflow_identity_quality_risk' AS check_name,
|
|
COUNT(*)::integer AS total_count,
|
|
COUNT(*) FILTER (
|
|
WHERE NULLIF(btrim("approvalNumber"), '') IS NULL
|
|
OR "approvalNumber" <> upper(btrim("approvalNumber"))
|
|
)::integer AS invalid_approval_number_count,
|
|
COUNT(*) FILTER (WHERE NULLIF(btrim("title"), '') IS NULL)::integer AS missing_title_count,
|
|
COUNT(*) FILTER (WHERE NULLIF(btrim("productId"), '') IS NULL)::integer AS missing_product_id_count,
|
|
COUNT(*) FILTER (WHERE NULLIF(btrim("accessKey"), '') IS NULL)::integer AS missing_access_key_count,
|
|
COUNT(*) FILTER (
|
|
WHERE EXISTS (
|
|
SELECT 1
|
|
FROM unnest("participantUserIds") AS participant_id
|
|
WHERE NULLIF(btrim(participant_id), '') IS NULL
|
|
)
|
|
OR cardinality("participantUserIds") <> (
|
|
SELECT COUNT(DISTINCT participant_id)::integer
|
|
FROM unnest("participantUserIds") AS participant_id
|
|
)
|
|
)::integer AS invalid_participant_user_ids_count
|
|
FROM "ApprovalWorkflow";
|
|
|
|
SELECT
|
|
'approval_workflow_json_shape_risk' AS check_name,
|
|
COUNT(*) FILTER (
|
|
WHERE "fieldMatrix" IS NOT NULL AND jsonb_typeof("fieldMatrix") NOT IN ('array', 'null')
|
|
)::integer AS invalid_field_matrix_count,
|
|
COUNT(*) FILTER (
|
|
WHERE "summary" IS NOT NULL AND jsonb_typeof("summary") NOT IN ('object', 'null')
|
|
)::integer AS invalid_summary_count,
|
|
COUNT(*) FILTER (
|
|
WHERE "metadata" IS NOT NULL AND jsonb_typeof("metadata") NOT IN ('object', 'null')
|
|
)::integer AS invalid_metadata_count
|
|
FROM "ApprovalWorkflow";
|
|
|
|
SELECT
|
|
'approval_workflow_field_change_quality_risk' AS check_name,
|
|
COUNT(*)::integer AS total_count,
|
|
COUNT(*) FILTER (WHERE NULLIF(btrim("fieldKey"), '') IS NULL)::integer AS missing_field_key_count,
|
|
COUNT(*) FILTER (WHERE NULLIF(btrim("source"), '') IS NULL)::integer AS missing_source_count,
|
|
COUNT(*) FILTER (
|
|
WHERE "sourcePage" IS NOT NULL AND NULLIF(btrim("sourcePage"), '') IS NULL
|
|
)::integer AS blank_source_page_count,
|
|
COUNT(*) FILTER (
|
|
WHERE "metadata" IS NOT NULL AND jsonb_typeof("metadata") NOT IN ('object', 'null')
|
|
)::integer AS invalid_metadata_count
|
|
FROM "ApprovalWorkflowFieldChange";
|
|
|
|
SELECT
|
|
'product_patent_record_quality_risk' AS check_name,
|
|
COUNT(*)::integer AS total_count,
|
|
COUNT(*) FILTER (WHERE NULLIF(btrim("productId"), '') IS NULL)::integer AS missing_product_id_count,
|
|
COUNT(*) FILTER (WHERE NULLIF(btrim("patentGroupKey"), '') IS NULL)::integer AS missing_group_key_count,
|
|
COUNT(*) FILTER (
|
|
WHERE NULLIF(btrim("patentName"), '') IS NULL
|
|
AND NULLIF(btrim("patentNo"), '') IS NULL
|
|
AND NULLIF(btrim("applicationNo"), '') IS NULL
|
|
)::integer AS missing_patent_identity_count
|
|
FROM "ProductPatentRecord";
|
|
|
|
WITH payload_sku_items AS (
|
|
SELECT
|
|
p."id" AS product_id,
|
|
item.sku_item,
|
|
item.ordinality::integer AS sort_order,
|
|
COALESCE(NULLIF(btrim(item.sku_item ->> 'id'), ''), 'sku-' || item.ordinality::text) AS raw_sku_item_id
|
|
FROM "IntakeNonIntegratedProduct" p
|
|
CROSS JOIN LATERAL jsonb_array_elements(
|
|
CASE
|
|
WHEN jsonb_typeof(p."payload"::jsonb -> 'skuItems') = 'array'
|
|
THEN p."payload"::jsonb -> 'skuItems'
|
|
ELSE '[]'::jsonb
|
|
END
|
|
) WITH ORDINALITY AS item(sku_item, ordinality)
|
|
WHERE p."deletedAt" IS NULL
|
|
),
|
|
deduped_payload_sku_items AS (
|
|
SELECT
|
|
payload_sku_items.*,
|
|
CASE
|
|
WHEN COUNT(*) OVER (PARTITION BY product_id, raw_sku_item_id) = 1
|
|
THEN raw_sku_item_id
|
|
ELSE raw_sku_item_id || '-' || ROW_NUMBER() OVER (
|
|
PARTITION BY product_id, raw_sku_item_id
|
|
ORDER BY sort_order
|
|
)::text
|
|
END AS sku_item_id
|
|
FROM payload_sku_items
|
|
),
|
|
payload_snapshot AS (
|
|
SELECT
|
|
product_id,
|
|
sku_item_id,
|
|
sort_order,
|
|
COALESCE(sku_item ->> 'skuCode', '') AS sku_code,
|
|
COALESCE(sku_item ->> 'specName', '') AS spec_name,
|
|
COALESCE(sku_item ->> 'model', '') AS model,
|
|
COALESCE(sku_item ->> 'barcode', '') AS barcode
|
|
FROM deduped_payload_sku_items
|
|
),
|
|
structured_snapshot AS (
|
|
SELECT
|
|
sku."productId" AS product_id,
|
|
sku."skuItemId" AS sku_item_id,
|
|
sku."sortOrder" AS sort_order,
|
|
sku."skuCode" AS sku_code,
|
|
sku."specName" AS spec_name,
|
|
sku."model" AS model,
|
|
sku."barcode" AS barcode
|
|
FROM "IntakeNonIntegratedSkuItem" sku
|
|
JOIN "IntakeNonIntegratedProduct" product ON product."id" = sku."productId"
|
|
WHERE product."deletedAt" IS NULL
|
|
)
|
|
SELECT
|
|
'intake_non_integrated_sku_payload_sync_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM payload_snapshot payload
|
|
FULL JOIN structured_snapshot structured
|
|
ON structured.product_id = payload.product_id
|
|
AND structured.sku_item_id = payload.sku_item_id
|
|
WHERE payload.product_id IS NULL
|
|
OR structured.product_id IS NULL
|
|
OR payload.sort_order IS DISTINCT FROM structured.sort_order
|
|
OR payload.sku_code IS DISTINCT FROM structured.sku_code
|
|
OR payload.spec_name IS DISTINCT FROM structured.spec_name
|
|
OR payload.model IS DISTINCT FROM structured.model
|
|
OR payload.barcode IS DISTINCT FROM structured.barcode;
|
|
|
|
WITH reference_option_rows AS (
|
|
SELECT 'ProductCategory' AS table_name, name, "sortOrder", description, icon FROM "ProductCategory"
|
|
UNION ALL SELECT 'MaterialCategory', name, "sortOrder", NULL::text AS description, icon FROM "MaterialCategory"
|
|
UNION ALL SELECT 'HardwareCategory', name, "sortOrder", description, icon FROM "HardwareCategory"
|
|
UNION ALL SELECT 'CommonComponentCategory', name, "sortOrder", description, icon FROM "CommonComponentCategory"
|
|
UNION ALL SELECT 'SubstrateCategory', name, "sortOrder", NULL::text AS description, NULL::text AS icon FROM "SubstrateCategory"
|
|
UNION ALL SELECT 'SubstrateEnvironmentGrade', name, "sortOrder", NULL::text AS description, NULL::text AS icon FROM "SubstrateEnvironmentGrade"
|
|
UNION ALL SELECT 'SubstrateSurfaceOption', name, "sortOrder", NULL::text AS description, NULL::text AS icon FROM "SubstrateSurfaceOption"
|
|
UNION ALL SELECT 'SubstrateSystemNameOption', name, "sortOrder", NULL::text AS description, NULL::text AS icon FROM "SubstrateSystemNameOption"
|
|
),
|
|
duplicate_reference_option_names AS (
|
|
SELECT table_name, lower(btrim(name)) AS normalized_name
|
|
FROM reference_option_rows
|
|
GROUP BY table_name, lower(btrim(name))
|
|
HAVING COUNT(*) > 1
|
|
)
|
|
SELECT
|
|
'reference_option_quality_risk' AS check_name,
|
|
COUNT(*)::integer AS identity_risk_count,
|
|
(SELECT COUNT(*)::integer FROM duplicate_reference_option_names) AS duplicate_normalized_name_count
|
|
FROM reference_option_rows
|
|
WHERE NULLIF(btrim(name), '') IS NULL
|
|
OR name <> btrim(name)
|
|
OR "sortOrder" < 0
|
|
OR (description IS NOT NULL AND NULLIF(btrim(description), '') IS NULL)
|
|
OR (icon IS NOT NULL AND NULLIF(btrim(icon), '') IS NULL);
|
|
|
|
SELECT
|
|
'substrate_thickness_spec_quality_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "SubstrateThicknessSpec"
|
|
WHERE NULLIF(btrim(name), '') IS NULL
|
|
OR name <> btrim(name)
|
|
OR "sortOrder" < 0
|
|
OR "thicknessMm" <= 0
|
|
OR "sheetLengthMm" <= 0
|
|
OR "sheetWidthMm" <= 0;
|
|
|
|
SELECT
|
|
'hardware_mapping_quality_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "HardwareMapping"
|
|
WHERE (
|
|
CASE WHEN NULLIF(btrim(COALESCE("blockName", '')), '') IS NOT NULL THEN 1 ELSE 0 END
|
|
+ CASE WHEN NULLIF(btrim(COALESCE("signatureHash", '')), '') IS NOT NULL THEN 1 ELSE 0 END
|
|
) <> 1
|
|
OR "usageCount" < 0
|
|
OR NULLIF(btrim("createdBy"), '') IS NULL
|
|
OR "createdBy" <> btrim("createdBy");
|
|
|
|
SELECT
|
|
'location_and_material_binding_quality_risk' AS check_name,
|
|
(
|
|
SELECT COUNT(*)::integer
|
|
FROM "SubstrateFinish"
|
|
WHERE NULLIF(btrim("substrateId"), '') IS NULL
|
|
OR NULLIF(btrim("finishId"), '') IS NULL
|
|
) AS substrate_finish_risk_count,
|
|
(
|
|
SELECT COUNT(*)::integer
|
|
FROM "PanelMaterial"
|
|
WHERE NULLIF(btrim("panelId"), '') IS NULL
|
|
OR NULLIF(btrim("materialId"), '') IS NULL
|
|
) AS panel_material_risk_count,
|
|
(
|
|
SELECT COUNT(*)::integer
|
|
FROM "AssetVariantLocationBinding"
|
|
WHERE NULLIF(btrim("assetVariantId"), '') IS NULL
|
|
OR NULLIF(btrim("warehouseLocationId"), '') IS NULL
|
|
) AS asset_variant_location_risk_count,
|
|
(
|
|
SELECT COUNT(*)::integer
|
|
FROM "PreSkuLocationBinding"
|
|
WHERE NULLIF(btrim("preSkuId"), '') IS NULL
|
|
OR NULLIF(btrim("warehouseLocationId"), '') IS NULL
|
|
) AS pre_sku_location_risk_count;
|
|
|
|
SELECT
|
|
'legacy_packaging_plan_quality_risk' AS check_name,
|
|
COUNT(*)::integer AS row_count
|
|
FROM "PackagingPlan"
|
|
WHERE NULLIF(btrim(name), '') IS NULL
|
|
OR name <> btrim(name)
|
|
OR "boxCount" <= 0
|
|
OR jsonb_typeof(boxes) <> 'array'
|
|
OR ("totalWeight" IS NOT NULL AND "totalWeight" < 0)
|
|
OR ("totalVolume" IS NOT NULL AND "totalVolume" < 0)
|
|
OR (description IS NOT NULL AND NULLIF(btrim(description), '') IS NULL)
|
|
OR (notes IS NOT NULL AND NULLIF(btrim(notes), '') IS NULL);
|
|
|
|
SELECT
|
|
'config_audit_permission_quality_risk' AS check_name,
|
|
(
|
|
SELECT COUNT(*)::integer
|
|
FROM "SystemConfig"
|
|
WHERE NULLIF(btrim(key), '') IS NULL
|
|
OR key <> btrim(key)
|
|
OR (description IS NOT NULL AND NULLIF(btrim(description), '') IS NULL)
|
|
) AS system_config_risk_count,
|
|
(
|
|
SELECT COUNT(*)::integer
|
|
FROM "ProviderConfig"
|
|
WHERE NULLIF(btrim("serviceType"), '') IS NULL
|
|
OR "serviceType" <> btrim("serviceType")
|
|
OR NULLIF(btrim(name), '') IS NULL
|
|
OR name <> btrim(name)
|
|
OR NULLIF(btrim("baseUrl"), '') IS NULL
|
|
OR "baseUrl" <> regexp_replace(btrim("baseUrl"), '/+$', '')
|
|
OR NULLIF(btrim("apiKey"), '') IS NULL
|
|
OR "apiKey" <> btrim("apiKey")
|
|
OR "sortOrder" < 0
|
|
OR (model IS NOT NULL AND NULLIF(btrim(model), '') IS NULL)
|
|
OR (extra IS NOT NULL AND jsonb_typeof(extra) <> 'object')
|
|
) AS provider_config_risk_count,
|
|
(
|
|
SELECT COUNT(*)::integer
|
|
FROM (
|
|
SELECT "serviceType"
|
|
FROM "ProviderConfig"
|
|
WHERE "isActive" = true
|
|
GROUP BY "serviceType"
|
|
HAVING COUNT(*) > 1
|
|
) duplicated_active
|
|
) AS provider_active_conflict_count,
|
|
(
|
|
SELECT COUNT(*)::integer
|
|
FROM "ThemeConfig"
|
|
WHERE NULLIF(btrim(name), '') IS NULL
|
|
OR name <> btrim(name)
|
|
OR NULLIF(btrim("createdBy"), '') IS NULL
|
|
OR "createdBy" <> btrim("createdBy")
|
|
OR (description IS NOT NULL AND NULLIF(btrim(description), '') IS NULL)
|
|
OR ("startDate" IS NOT NULL AND "endDate" IS NOT NULL AND "startDate" >= "endDate")
|
|
OR ("homeBackground" IS NOT NULL AND jsonb_typeof("homeBackground") <> 'object')
|
|
OR ("loginPanel" IS NOT NULL AND jsonb_typeof("loginPanel") <> 'object')
|
|
) AS theme_config_risk_count,
|
|
(
|
|
SELECT COUNT(*)::integer
|
|
FROM "IntakeNodePermissionOverride"
|
|
WHERE NULLIF(btrim("targetKey"), '') IS NULL
|
|
OR "targetKey" <> btrim("targetKey")
|
|
OR NULLIF(btrim("subjectKey"), '') IS NULL
|
|
OR "subjectKey" <> btrim("subjectKey")
|
|
OR NULLIF(btrim(action), '') IS NULL
|
|
OR action <> btrim(action)
|
|
OR ("createdBy" IS NOT NULL AND NULLIF(btrim("createdBy"), '') IS NULL)
|
|
OR ("updatedBy" IS NOT NULL AND NULLIF(btrim("updatedBy"), '') IS NULL)
|
|
) AS permission_override_risk_count,
|
|
(
|
|
SELECT COUNT(*)::integer
|
|
FROM "AssistedAssemblyAiRender"
|
|
WHERE NULLIF(btrim("createdBy"), '') IS NULL
|
|
OR "createdBy" <> btrim("createdBy")
|
|
OR NULLIF(btrim(prompt), '') IS NULL
|
|
OR prompt <> btrim(prompt)
|
|
OR jsonb_typeof(params) <> 'object'
|
|
OR jsonb_typeof("resultImages") <> 'array'
|
|
OR jsonb_typeof("workspaceSnapshot") <> 'object'
|
|
OR jsonb_typeof("assetSnapshot") <> 'object'
|
|
OR ("attempts" IS NOT NULL AND jsonb_typeof("attempts") <> 'array')
|
|
OR ("durationMs" IS NOT NULL AND "durationMs" < 0)
|
|
OR ("negativePrompt" IS NOT NULL AND NULLIF(btrim("negativePrompt"), '') IS NULL)
|
|
OR ("referenceImageUrl" IS NOT NULL AND NULLIF(btrim("referenceImageUrl"), '') IS NULL)
|
|
OR ("externalRequestId" IS NOT NULL AND NULLIF(btrim("externalRequestId"), '') IS NULL)
|
|
OR ("errorMessage" IS NOT NULL AND NULLIF(btrim("errorMessage"), '') IS NULL)
|
|
OR (status = 'SUCCEEDED' AND jsonb_array_length("resultImages") = 0)
|
|
OR (status = 'FAILED' AND NULLIF(btrim(COALESCE("errorMessage", '')), '') IS NULL)
|
|
) AS ai_render_risk_count,
|
|
(
|
|
SELECT COUNT(*)::integer
|
|
FROM "Feedback"
|
|
WHERE NULLIF(btrim(title), '') IS NULL
|
|
OR title <> btrim(title)
|
|
OR NULLIF(btrim(description), '') IS NULL
|
|
OR description <> btrim(description)
|
|
OR NULLIF(btrim(category), '') IS NULL
|
|
OR category <> btrim(category)
|
|
OR array_position(images, '') IS NOT NULL
|
|
OR EXISTS (SELECT 1 FROM unnest(images) AS image WHERE NULLIF(btrim(image), '') IS NULL OR image <> btrim(image))
|
|
OR ("comments" IS NOT NULL AND jsonb_typeof("comments") <> 'array')
|
|
OR (resolution IS NOT NULL AND NULLIF(btrim(resolution), '') IS NULL)
|
|
OR (status = 'RESOLVED' AND ("resolvedAt" IS NULL OR NULLIF(btrim(COALESCE(resolution, '')), '') IS NULL))
|
|
) AS feedback_risk_count,
|
|
(
|
|
SELECT COUNT(*)::integer
|
|
FROM "ActivityLog"
|
|
WHERE NULLIF(btrim("userId"), '') IS NULL
|
|
OR "userId" <> btrim("userId")
|
|
OR NULLIF(btrim(action), '') IS NULL
|
|
OR action <> btrim(action)
|
|
OR (("targetType" IS NULL) <> ("targetId" IS NULL))
|
|
OR ("targetType" IS NOT NULL AND NULLIF(btrim("targetType"), '') IS NULL)
|
|
OR ("targetId" IS NOT NULL AND NULLIF(btrim("targetId"), '') IS NULL)
|
|
OR ("changes" IS NOT NULL AND jsonb_typeof("changes") <> 'object')
|
|
OR ("metadata" IS NOT NULL AND jsonb_typeof("metadata") <> 'object')
|
|
) AS activity_log_risk_count;
|