Files
X-Financial/web/src/views/scripts/useAuditRuleVersionActions.js

152 lines
4.1 KiB
JavaScript
Raw Normal View History

import {
activateAgentAsset,
createAgentAssetVersion,
restoreAgentAssetVersion,
updateAgentAsset
} from '../../services/agentAssets.js'
import {
buildRuleConfigPayload,
incrementVersion
} from './auditViewRuntimeModel.js'
import {
buildMarkdownVersionContent,
normalizeText,
parseRuntimeRuleText
} from './auditViewModel.js'
export function useAuditRuleVersionActions({
selectedSkill,
selectedSkillIsRule,
canEditMarkdown,
canManageSelected,
actionState,
detailBusy,
refreshCurrentAssets,
loadSelectedAssetDetail,
resolveActor,
toast
}) {
async function persistRuleRuntimeConfig(asset, runtimeRule) {
await updateAgentAsset(
asset.id,
{
config_json: buildRuleConfigPayload(asset, runtimeRule)
},
{ actor: resolveActor() }
)
}
async function saveRuleVersion({ action, changeNote, successLabel }) {
if (
!selectedSkill.value ||
!selectedSkillIsRule.value ||
selectedSkill.value.usesSpreadsheetRule ||
!canEditMarkdown.value ||
detailBusy.value
) {
return
}
if (!normalizeText(selectedSkill.value.markdownContent)) {
toast('规则 Markdown 内容不能为空。')
return
}
const runtimeRule = parseRuntimeRuleText(selectedSkill.value.runtimeRuleText)
if (!runtimeRule) {
toast('运行时 JSON 必须是合法的对象。')
return
}
const nextVersion = incrementVersion(selectedSkill.value.currentVersion)
actionState.value = action
try {
await createAgentAssetVersion(
selectedSkill.value.id,
{
version: nextVersion,
content: buildMarkdownVersionContent(selectedSkill.value.markdownContent, runtimeRule),
content_type: 'markdown',
change_note: changeNote,
created_by: resolveActor()
},
{ actor: resolveActor() }
)
await persistRuleRuntimeConfig(selectedSkill.value, runtimeRule)
await refreshCurrentAssets()
await loadSelectedAssetDetail(selectedSkill.value.id, { silent: true })
toast(`${successLabel} ${nextVersion}`)
} catch (error) {
toast(error?.message || `${successLabel}失败,请稍后重试。`)
} finally {
actionState.value = ''
}
}
async function saveRuleMarkdown() {
await saveRuleVersion({
action: 'save-markdown',
changeNote: '通过规则中心保存 Markdown 规则内容,并同步运行时 JSON。',
successLabel: '规则 Markdown 已保存为'
})
}
async function saveRuleRuntimeJson() {
await saveRuleVersion({
action: 'save-runtime-json',
changeNote: '通过规则中心保存运行时 JSON 配置。',
successLabel: '规则 JSON 已保存为'
})
}
async function activateSelectedRule() {
if (!selectedSkill.value || !selectedSkillIsRule.value || !canManageSelected.value || detailBusy.value) {
return
}
actionState.value = 'activate'
try {
await activateAgentAsset(selectedSkill.value.id, { actor: resolveActor() })
await refreshCurrentAssets()
await loadSelectedAssetDetail(selectedSkill.value.id, { silent: true })
toast('规则已正式上线。')
} catch (error) {
toast(error?.message || '规则上线失败,请稍后重试。')
} finally {
actionState.value = ''
}
}
async function restoreSelectedVersion(version) {
if (
!selectedSkill.value ||
!selectedSkillIsRule.value ||
!canManageSelected.value ||
detailBusy.value ||
!version
) {
return
}
actionState.value = `restore-${version}`
try {
await restoreAgentAssetVersion(selectedSkill.value.id, version, { actor: resolveActor() })
await refreshCurrentAssets()
await loadSelectedAssetDetail(selectedSkill.value.id, { silent: true })
toast(`已基于 ${version} 生成新的工作版本。`)
} catch (error) {
toast(error?.message || '历史版本恢复失败,请稍后重试。')
} finally {
actionState.value = ''
}
}
return {
saveRuleMarkdown,
saveRuleRuntimeJson,
activateSelectedRule,
restoreSelectedVersion
}
}