Files
lserp_cs_6.0/插件库/Lskj.AgentBridge/Deployment/New-WorkflowWriteCasesTemplate.ps1
2026-08-14 14:28:28 +08:00

189 lines
8.1 KiB
PowerShell

[CmdletBinding()]
param(
[Parameter(Mandatory = $true)][ValidateSet('purchase', 'leave')][string]$Workflow,
[Parameter(Mandatory = $true)][string]$OutputPath
)
Set-StrictMode -Version 2.0
$ErrorActionPreference = 'Stop'
$codes = if ($Workflow -eq 'purchase') {
@(
'purchase_unique_match_commit', 'purchase_ambiguous_match_blocked',
'purchase_overallocation_blocked', 'purchase_permission_denied',
'purchase_database_permission_recheck_denied',
'purchase_currency_field_missing_blocked',
'purchase_currency_crosswalk_unapproved_blocked',
'purchase_row_scope_denied',
'purchase_runtime_recheck_blocked', 'purchase_transaction_rollback',
'purchase_idempotency_replay', 'purchase_idempotency_conflict',
'purchase_audit_correlated'
)
} else {
@(
'leave_natural_language_resolution',
'leave_multi_day_calendar_resolution',
'leave_resolution_proof_bypass_blocked', 'leave_ambiguous_type_blocked',
'leave_ambiguous_flow_type_blocked',
'leave_time_segment_required_blocked',
'leave_local_time_zone_rejected',
'leave_other_employee_denied', 'leave_create_draft_commit',
'leave_permission_denied', 'leave_database_permission_recheck_denied',
'leave_submit_separate_confirmation', 'leave_overlap_blocked',
'leave_stale_flow_type_blocked',
'leave_runtime_recheck_blocked', 'leave_transaction_rollback',
'leave_idempotency_replay', 'leave_idempotency_conflict',
'leave_audit_correlated'
)
}
$placeholderHash = 'REPLACE_WITH_SHA256'
$observedAt = [DateTime]::UtcNow.ToString('yyyy-MM-ddTHH:mm:ss.fffZ')
$expectedResults = @{
purchase_unique_match_commit = 'purchase_document_created'
purchase_ambiguous_match_blocked = 'purchase_match_invalid'
purchase_overallocation_blocked = 'purchase_match_invalid'
purchase_permission_denied = 'command_access_denied'
purchase_database_permission_recheck_denied = 'purchase_write_permission_denied'
purchase_currency_field_missing_blocked = 'purchase_currency_field_not_configured'
purchase_currency_crosswalk_unapproved_blocked = 'purchase_currency_crosswalk_not_approved'
purchase_row_scope_denied = 'purchase_row_scope_denied'
purchase_runtime_recheck_blocked = 'purchase_source_changed'
purchase_transaction_rollback = 'purchase_legacy_create_failed'
purchase_idempotency_replay = 'purchase_document_created'
purchase_idempotency_conflict = 'idempotency_key_conflict'
purchase_audit_correlated = 'purchase_document_created'
leave_natural_language_resolution = 'leave_intent_resolved'
leave_multi_day_calendar_resolution = 'leave_intent_resolved'
leave_resolution_proof_bypass_blocked = 'leave_resolution_invalid'
leave_ambiguous_type_blocked = 'leave_resolution_invalid'
leave_ambiguous_flow_type_blocked = 'leave_resolution_invalid'
leave_time_segment_required_blocked = 'leave_resolution_invalid'
leave_local_time_zone_rejected = 'input_schema_violation'
leave_other_employee_denied = 'leave_resolution_invalid'
leave_permission_denied = 'command_access_denied'
leave_database_permission_recheck_denied = 'leave_write_permission_denied'
leave_create_draft_commit = 'leave_draft_created'
leave_submit_separate_confirmation = 'leave_submitted'
leave_overlap_blocked = 'leave_request_invalid'
leave_stale_flow_type_blocked = 'leave_request_changed'
leave_runtime_recheck_blocked = 'leave_request_changed'
leave_transaction_rollback = 'leave_legacy_create_failed'
leave_idempotency_replay = 'leave_draft_created'
leave_idempotency_conflict = 'idempotency_key_conflict'
leave_audit_correlated = 'leave_draft_created'
}
$expectedIssues = @{
leave_ambiguous_type_blocked = 'leave_type_ambiguous'
leave_ambiguous_flow_type_blocked = 'leave_flow_type_ambiguous'
leave_time_segment_required_blocked = 'leave_time_segment_required'
leave_other_employee_denied = 'leave_employee_reference_unsupported'
}
$cases = @($codes | ForEach-Object {
$caseCode = [string]$_
$commandName = if ($caseCode.StartsWith('purchase_', [StringComparison]::Ordinal)) {
'purchase.invoice.create'
} elseif ($caseCode -in @(
'leave_natural_language_resolution',
'leave_multi_day_calendar_resolution',
'leave_ambiguous_type_blocked',
'leave_ambiguous_flow_type_blocked',
'leave_time_segment_required_blocked',
'leave_other_employee_denied')) {
'hr.leave.resolve'
} elseif ($caseCode -eq 'leave_submit_separate_confirmation') {
'hr.leave.submit'
} else {
'hr.leave.create'
}
$planRequired = $caseCode -notin @(
'purchase_permission_denied',
'leave_permission_denied',
'leave_local_time_zone_rejected')
$planVersion = if (-not $planRequired) {
$null
} elseif ($commandName -eq 'purchase.invoice.create') {
'1.4'
} elseif ($commandName -eq 'hr.leave.resolve') {
'1.4'
} elseif ($commandName -eq 'hr.leave.submit') {
'1.0'
} else {
'1.2'
}
$planRisk = if (-not $planRequired) {
$null
} elseif ($commandName -eq 'hr.leave.resolve') {
'draft'
} else {
'write'
}
$issueCode = $null
if ($expectedIssues.ContainsKey($caseCode)) {
$issueCode = [string]$expectedIssues[$caseCode]
}
[ordered]@{
caseCode = $caseCode
uatAuthorizationSourceSha256 =
'REPLACE_WITH_UAT_AUTHORIZATION_SOURCE_SHA256'
uatAuthorizationContentSha256 =
'REPLACE_WITH_UAT_AUTHORIZATION_CONTENT_SHA256'
uatAuthorizationIdSha256 =
'REPLACE_WITH_UAT_AUTHORIZATION_ID_SHA256'
uatTokenSha256 = 'REPLACE_WITH_UNIQUE_UAT_CASE_TOKEN_SHA256'
runtimeCliVersion = 'REPLACE_WITH_RUNTIME_CLI_VERSION'
runtimeCliSha256 = 'REPLACE_WITH_RUNTIME_CLI_SHA256'
runtimeCliSignerThumbprint =
'REPLACE_WITH_RUNTIME_CLI_SIGNER_THUMBPRINT'
passed = $false
correlationId = 'REPLACE_WITH_CORRELATION_ID'
contextCorrelationBound = $false
commandName = $commandName
planCommandVersion = $planVersion
planModuleCode = $(if ($planRequired) { 'REPLACE_WITH_MODULE_CODE' } else { $null })
planRisk = $planRisk
accountBookSha256 = $placeholderHash
subSystemIdSha256 = $placeholderHash
userIdSha256 = $placeholderHash
userNameSha256 = $placeholderHash
databaseScopeFingerprint = $placeholderHash
isAdministrator = $false
inputFingerprintSha256 = $placeholderHash
planFingerprintSha256 = $null
resultCode = [string]$expectedResults[$caseCode]
issueCode = $issueCode
recordIdSha256 = $null
transactionEvidenceIdSha256 = $null
businessAuditIdSha256 = $null
idempotencyKeySha256 = $null
businessMutationCount = 0
replayed = $false
nativeConfirmationObserved = $false
auditEventCount = 1
sourceDocumentSetSha256 = $null
sourceDocumentPreprocessContracts = @()
sourceDocumentInputFingerprintBound = $false
sourceDocumentWritePayloadBound = $false
sourceDocumentAuditCount = 0
observedAtUtc = $observedAt
}
})
$target = [IO.Path]::GetFullPath($OutputPath)
$directory = [IO.Path]::GetDirectoryName($target)
if ([string]::IsNullOrWhiteSpace($directory) -or -not [IO.Directory]::Exists($directory) -or
[IO.File]::Exists($target) -or [IO.Directory]::Exists($target)) {
throw 'Output must be a new file in an existing directory.'
}
$utf8 = New-Object Text.UTF8Encoding($false, $true)
$body = $utf8.GetBytes(($cases | ConvertTo-Json -Depth 5) + [Environment]::NewLine)
$stream = [IO.File]::Open(
$target, [IO.FileMode]::CreateNew, [IO.FileAccess]::Write, [IO.FileShare]::None)
try { $stream.Write($body, 0, $body.Length); $stream.Flush() }
finally { $stream.Dispose() }
[ordered]@{
outputFile = $target
workflow = $Workflow
caseCount = $cases.Count
ready = $false
nextStep = 'Replace every placeholder with observed, redacted evidence; keep passed=false until independently reviewed.'
} | ConvertTo-Json -Depth 4