2026-05-29 09:44:03 +08:00
|
|
|
import { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'
|
2026-05-11 06:32:38 +00:00
|
|
|
|
2026-05-27 09:17:57 +08:00
|
|
|
import AuditAssetList from '../../components/audit/AuditAssetList.vue'
|
|
|
|
|
import AuditJsonRiskRuleDetail from '../../components/audit/AuditJsonRiskRuleDetail.vue'
|
|
|
|
|
import AuditRuleDialogs from '../../components/audit/AuditRuleDialogs.vue'
|
|
|
|
|
import AuditSpreadsheetChangeDrawer from '../../components/audit/AuditSpreadsheetChangeDrawer.vue'
|
|
|
|
|
import AuditSpreadsheetRuleDetail from '../../components/audit/AuditSpreadsheetRuleDetail.vue'
|
|
|
|
|
import AuditVersionTimelineDrawer from '../../components/audit/AuditVersionTimelineDrawer.vue'
|
2026-05-20 14:21:56 +08:00
|
|
|
import TableLoadingState from '../../components/shared/TableLoadingState.vue'
|
2026-05-11 06:32:38 +00:00
|
|
|
import { useSystemState } from '../../composables/useSystemState.js'
|
|
|
|
|
import { useToast } from '../../composables/useToast.js'
|
2026-05-26 12:16:20 +08:00
|
|
|
import { isFinanceUser, isManagerUser, isPlatformAdminUser } from '../../utils/accessControl.js'
|
2026-05-29 09:44:03 +08:00
|
|
|
import { useAuditAssetData } from './useAuditAssetData.js'
|
|
|
|
|
import { buildAuditDetailTopBar } from './auditViewDetailTopBar.js'
|
|
|
|
|
import { useAuditListFilters } from './auditViewListFilters.js'
|
|
|
|
|
import { useAuditRuleReviewFlow } from './useAuditRuleReviewFlow.js'
|
|
|
|
|
import { useAuditRuleVersionActions } from './useAuditRuleVersionActions.js'
|
|
|
|
|
import { useAuditRiskRuleActions } from './useAuditRiskRuleActions.js'
|
|
|
|
|
import { useAuditRiskRuleCreateFlow } from './useAuditRiskRuleCreateFlow.js'
|
|
|
|
|
import { useAuditRiskRuleJsonEditor } from './useAuditRiskRuleJsonEditor.js'
|
|
|
|
|
import { useAuditSpreadsheetEditor } from './useAuditSpreadsheetEditor.js'
|
|
|
|
|
import { useAuditVersionTimeline } from './useAuditVersionTimeline.js'
|
2026-05-18 02:51:25 +00:00
|
|
|
|
2026-05-21 23:53:03 +08:00
|
|
|
import {
|
|
|
|
|
TAB_META,
|
|
|
|
|
STATUS_OPTIONS,
|
2026-05-24 21:44:17 +08:00
|
|
|
ENABLED_STATE_OPTIONS,
|
|
|
|
|
ONLINE_STATE_OPTIONS,
|
2026-05-21 23:53:03 +08:00
|
|
|
RISK_SCENARIO_OPTIONS,
|
|
|
|
|
normalizeText,
|
|
|
|
|
readConfigJson,
|
|
|
|
|
buildPreviewRuleDetail,
|
|
|
|
|
} from './auditViewModel.js'
|
2026-05-23 19:54:42 +08:00
|
|
|
import {
|
2026-05-26 12:16:20 +08:00
|
|
|
RISK_RULE_BUSINESS_STAGE_OPTIONS,
|
2026-05-26 17:29:35 +08:00
|
|
|
RISK_RULE_EXPENSE_CATEGORY_OPTIONS,
|
2026-05-23 19:54:42 +08:00
|
|
|
} from './auditViewRiskRuleModel.js'
|
2026-05-06 11:00:38 +08:00
|
|
|
|
|
|
|
|
export default {
|
2026-05-09 15:46:16 +00:00
|
|
|
name: 'AuditView',
|
2026-05-13 03:35:44 +00:00
|
|
|
components: {
|
2026-05-27 09:17:57 +08:00
|
|
|
AuditAssetList,
|
|
|
|
|
AuditJsonRiskRuleDetail,
|
|
|
|
|
AuditRuleDialogs,
|
|
|
|
|
AuditSpreadsheetChangeDrawer,
|
|
|
|
|
AuditSpreadsheetRuleDetail,
|
|
|
|
|
AuditVersionTimelineDrawer,
|
|
|
|
|
TableLoadingState
|
2026-05-13 03:35:44 +00:00
|
|
|
},
|
2026-05-29 09:44:03 +08:00
|
|
|
emits: ['detail-open-change', 'detail-topbar-change'],
|
2026-05-11 06:32:38 +00:00
|
|
|
setup(_, { emit }) {
|
|
|
|
|
const { toast } = useToast()
|
|
|
|
|
const { currentUser } = useSystemState()
|
|
|
|
|
|
2026-05-18 02:51:25 +00:00
|
|
|
const tabs = Object.entries(TAB_META).map(([id, meta]) => ({
|
2026-05-11 06:32:38 +00:00
|
|
|
id,
|
|
|
|
|
label: meta.label
|
|
|
|
|
}))
|
|
|
|
|
|
2026-05-18 02:51:25 +00:00
|
|
|
const activeType = ref('financialRules')
|
2026-05-06 11:00:38 +08:00
|
|
|
const selectedSkill = ref(null)
|
2026-05-11 01:53:30 +00:00
|
|
|
const keyword = ref('')
|
2026-05-11 06:32:38 +00:00
|
|
|
const activeFilterPopover = ref('')
|
|
|
|
|
const selectedDomain = ref('')
|
|
|
|
|
const selectedOwner = ref('')
|
2026-05-26 17:29:35 +08:00
|
|
|
const selectedRiskLevel = ref('')
|
2026-05-11 06:32:38 +00:00
|
|
|
const selectedStatus = ref('')
|
2026-05-19 20:23:58 +08:00
|
|
|
const selectedRiskScenario = ref('')
|
2026-05-24 21:44:17 +08:00
|
|
|
const selectedOnlineState = ref('')
|
|
|
|
|
const selectedEnabledState = ref('')
|
2026-05-11 06:32:38 +00:00
|
|
|
const actionState = ref('')
|
2026-05-27 09:17:57 +08:00
|
|
|
const riskRuleAttachmentOptions = [
|
|
|
|
|
{ label: '是', value: true },
|
|
|
|
|
{ label: '否', value: false }
|
|
|
|
|
]
|
2026-05-06 11:00:38 +08:00
|
|
|
|
2026-05-26 12:16:20 +08:00
|
|
|
const isAdmin = computed(() => isPlatformAdminUser(currentUser.value))
|
|
|
|
|
const isRuleManager = computed(() => isManagerUser(currentUser.value))
|
2026-05-18 02:51:25 +00:00
|
|
|
const isFinance = computed(() => isFinanceUser(currentUser.value))
|
|
|
|
|
const activeMeta = computed(() => TAB_META[activeType.value])
|
2026-05-11 06:32:38 +00:00
|
|
|
const activeTabLabel = computed(() => activeMeta.value.label)
|
|
|
|
|
const searchPlaceholder = computed(() => activeMeta.value.searchPlaceholder)
|
2026-05-09 15:46:16 +00:00
|
|
|
const createButtonLabel = computed(() => activeMeta.value.createButtonLabel)
|
|
|
|
|
const hintText = computed(() => activeMeta.value.hintText)
|
|
|
|
|
const tableColumns = computed(() => activeMeta.value.tableColumns)
|
2026-05-19 20:23:58 +08:00
|
|
|
const showRuntimeColumn = computed(() => activeMeta.value.showRuntimeColumn !== false)
|
2026-05-11 06:33:46 +00:00
|
|
|
const showMetricColumn = computed(() => activeMeta.value.showMetricColumn !== false)
|
2026-05-19 20:23:58 +08:00
|
|
|
const showVersionColumn = computed(() => activeMeta.value.showVersionColumn !== false)
|
|
|
|
|
const showStatusColumn = computed(() => activeMeta.value.showStatusColumn !== false)
|
2026-05-26 09:15:14 +08:00
|
|
|
const showOnlineColumn = computed(() => false)
|
2026-05-28 09:30:34 +08:00
|
|
|
const showEnabledColumn = computed(() => activeMeta.value.showEnabledColumn === true)
|
2026-05-11 06:32:38 +00:00
|
|
|
const selectedSkillIsRule = computed(() => selectedSkill.value?.type === 'rules')
|
2026-05-18 02:51:25 +00:00
|
|
|
const selectedSkillUsesSpreadsheet = computed(
|
|
|
|
|
() => selectedSkillIsRule.value && Boolean(selectedSkill.value?.usesSpreadsheetRule)
|
|
|
|
|
)
|
2026-05-19 20:23:58 +08:00
|
|
|
const selectedSkillUsesJsonRisk = computed(
|
|
|
|
|
() => selectedSkillIsRule.value && Boolean(selectedSkill.value?.usesJsonRiskRule)
|
|
|
|
|
)
|
2026-05-18 02:51:25 +00:00
|
|
|
const canManageSelected = computed(
|
2026-05-26 12:16:20 +08:00
|
|
|
() => isRuleManager.value && Boolean(selectedSkill.value) && !selectedSkill.value?.isPreviewMock
|
|
|
|
|
)
|
|
|
|
|
const canAdminOperateSelected = computed(
|
2026-05-18 02:51:25 +00:00
|
|
|
() => isAdmin.value && Boolean(selectedSkill.value) && !selectedSkill.value?.isPreviewMock
|
|
|
|
|
)
|
|
|
|
|
const canEditSelected = computed(
|
|
|
|
|
() =>
|
|
|
|
|
Boolean(selectedSkill.value) &&
|
|
|
|
|
!selectedSkill.value?.isPreviewMock &&
|
|
|
|
|
(isAdmin.value || isFinance.value)
|
|
|
|
|
)
|
2026-05-24 21:44:17 +08:00
|
|
|
const latestRiskRuleTestSummary = computed(() => selectedSkill.value?.latestTestSummary || null)
|
|
|
|
|
const riskRuleTestPassed = computed(() => Boolean(latestRiskRuleTestSummary.value?.test_passed))
|
|
|
|
|
const riskRuleInReview = computed(
|
|
|
|
|
() => selectedSkillUsesJsonRisk.value && selectedSkill.value?.statusValue === 'review'
|
|
|
|
|
)
|
2026-05-26 09:15:14 +08:00
|
|
|
const riskRuleGenerationBusy = computed(
|
|
|
|
|
() => selectedSkillUsesJsonRisk.value && selectedSkill.value?.statusValue === 'generating'
|
|
|
|
|
)
|
|
|
|
|
const riskRuleGenerationFailed = computed(
|
|
|
|
|
() => selectedSkillUsesJsonRisk.value && selectedSkill.value?.statusValue === 'failed'
|
|
|
|
|
)
|
2026-05-24 21:44:17 +08:00
|
|
|
const canOpenRiskRuleTest = computed(
|
|
|
|
|
() =>
|
|
|
|
|
selectedSkillUsesJsonRisk.value &&
|
2026-05-26 12:16:20 +08:00
|
|
|
canAdminOperateSelected.value &&
|
2026-05-24 21:44:17 +08:00
|
|
|
Boolean(selectedSkill.value?.id) &&
|
2026-05-26 09:15:14 +08:00
|
|
|
!riskRuleGenerationBusy.value &&
|
2026-05-26 12:16:20 +08:00
|
|
|
!riskRuleGenerationFailed.value
|
2026-05-24 21:44:17 +08:00
|
|
|
)
|
|
|
|
|
const canDeleteRiskRule = computed(
|
|
|
|
|
() =>
|
|
|
|
|
selectedSkillUsesJsonRisk.value &&
|
2026-05-26 12:16:20 +08:00
|
|
|
canAdminOperateSelected.value &&
|
2026-05-24 21:44:17 +08:00
|
|
|
Boolean(selectedSkill.value?.id) &&
|
2026-05-26 12:16:20 +08:00
|
|
|
!normalizeText(selectedSkill.value?.publishedVersion).replace('-', '')
|
2026-05-24 21:44:17 +08:00
|
|
|
)
|
2026-05-26 09:15:14 +08:00
|
|
|
const canOpenRiskRuleReviewSubmit = computed(
|
2026-05-26 12:16:20 +08:00
|
|
|
() => false
|
2026-05-26 09:15:14 +08:00
|
|
|
)
|
|
|
|
|
const canSubmitRiskRuleReview = computed(
|
|
|
|
|
() =>
|
|
|
|
|
canOpenRiskRuleReviewSubmit.value &&
|
2026-05-24 21:44:17 +08:00
|
|
|
riskRuleTestPassed.value
|
|
|
|
|
)
|
|
|
|
|
const canReturnRiskRule = computed(
|
2026-05-26 12:16:20 +08:00
|
|
|
() => false
|
2026-05-24 21:44:17 +08:00
|
|
|
)
|
|
|
|
|
const canPublishRiskRule = computed(
|
|
|
|
|
() =>
|
2026-05-26 12:16:20 +08:00
|
|
|
false
|
2026-05-24 21:44:17 +08:00
|
|
|
)
|
|
|
|
|
const canToggleRiskRuleEnabled = computed(
|
2026-05-26 12:16:20 +08:00
|
|
|
() => selectedSkillUsesJsonRisk.value && canManageSelected.value
|
2026-05-24 21:44:17 +08:00
|
|
|
)
|
2026-05-28 09:30:34 +08:00
|
|
|
const canEditMarkdown = computed(() => selectedSkillIsRule.value && canEditSelected.value)
|
2026-05-18 02:51:25 +00:00
|
|
|
const isDisplayingWorkingVersion = computed(
|
|
|
|
|
() => selectedSkill.value?.displayVersion === selectedSkill.value?.workingVersion
|
|
|
|
|
)
|
|
|
|
|
const canUploadSpreadsheet = computed(
|
|
|
|
|
() =>
|
|
|
|
|
canEditSelected.value &&
|
|
|
|
|
selectedSkillUsesSpreadsheet.value &&
|
2026-05-19 16:19:03 +00:00
|
|
|
!detailBusy.value
|
2026-05-18 02:51:25 +00:00
|
|
|
)
|
|
|
|
|
const canDownloadSpreadsheet = computed(
|
|
|
|
|
() =>
|
|
|
|
|
selectedSkillUsesSpreadsheet.value &&
|
|
|
|
|
Boolean(selectedSkill.value?.id) &&
|
|
|
|
|
!detailBusy.value
|
|
|
|
|
)
|
|
|
|
|
const canEditSpreadsheetInline = computed(
|
|
|
|
|
() =>
|
|
|
|
|
selectedSkillUsesSpreadsheet.value &&
|
|
|
|
|
(selectedSkill.value?.isPreviewMock || canEditSelected.value)
|
|
|
|
|
)
|
|
|
|
|
const selectedSpreadsheetFileName = computed(
|
|
|
|
|
() =>
|
2026-05-19 16:19:03 +00:00
|
|
|
normalizeText(selectedSkill.value?.ruleDocument?.file_name) || '未上传规则表'
|
2026-05-18 02:51:25 +00:00
|
|
|
)
|
2026-05-19 16:19:03 +00:00
|
|
|
const selectedSpreadsheetModeLabel = computed(() => {
|
2026-05-18 02:51:25 +00:00
|
|
|
if (selectedSkill.value?.isPreviewMock) {
|
2026-05-19 16:19:03 +00:00
|
|
|
return canEditSpreadsheetInline.value ? '可编辑' : '只读'
|
2026-05-18 02:51:25 +00:00
|
|
|
}
|
2026-05-19 16:19:03 +00:00
|
|
|
return canEditSpreadsheetInline.value ? '在线可编辑' : '只读'
|
2026-05-18 02:51:25 +00:00
|
|
|
})
|
2026-05-29 09:44:03 +08:00
|
|
|
const {
|
|
|
|
|
versionSwitchTarget,
|
|
|
|
|
versionTimelineOpen,
|
|
|
|
|
versionTimelineLoading,
|
|
|
|
|
versionTimelineError,
|
|
|
|
|
selectedVersionTimelineItems,
|
|
|
|
|
loadVersionTimeline: loadVersionTimelineInState,
|
|
|
|
|
openVersionTimeline: openVersionTimelineInState,
|
|
|
|
|
closeVersionTimeline: closeVersionTimelineInState,
|
|
|
|
|
clearVersionTimelineState,
|
|
|
|
|
openVersionSwitch: openVersionSwitchInState,
|
|
|
|
|
cancelVersionSwitch: cancelVersionSwitchInState,
|
|
|
|
|
confirmVersionSwitch: confirmVersionSwitchInState
|
|
|
|
|
} = useAuditVersionTimeline({
|
|
|
|
|
selectedSkill,
|
|
|
|
|
toast
|
|
|
|
|
})
|
|
|
|
|
const {
|
|
|
|
|
loadRiskRuleJson,
|
|
|
|
|
saveRiskRuleJson,
|
|
|
|
|
formatRiskRuleJson,
|
|
|
|
|
downloadRiskRuleJson
|
|
|
|
|
} = useAuditRiskRuleJsonEditor({
|
|
|
|
|
selectedSkill,
|
|
|
|
|
canEditMarkdown,
|
|
|
|
|
actionState,
|
|
|
|
|
toast
|
2026-05-18 09:42:23 +00:00
|
|
|
})
|
2026-05-11 06:32:38 +00:00
|
|
|
const detailBusy = computed(() => Boolean(actionState.value))
|
2026-05-29 09:44:03 +08:00
|
|
|
const {
|
|
|
|
|
loading,
|
|
|
|
|
errorMessage,
|
|
|
|
|
detailLoading,
|
|
|
|
|
detailError,
|
|
|
|
|
assetBuckets,
|
|
|
|
|
currentAssets,
|
|
|
|
|
loadRuns,
|
|
|
|
|
loadAssets,
|
|
|
|
|
refreshCurrentAssets,
|
|
|
|
|
loadSelectedAssetDetail,
|
|
|
|
|
mergeSelectedRuleLifecycle
|
|
|
|
|
} = useAuditAssetData({
|
|
|
|
|
activeType,
|
|
|
|
|
activeMeta,
|
|
|
|
|
selectedSkill,
|
|
|
|
|
loadVersionTimeline: loadVersionTimelineInState,
|
|
|
|
|
loadSpreadsheetChangeRecords: (...args) => loadSpreadsheetChangeRecords(...args),
|
|
|
|
|
loadRiskRuleJson,
|
|
|
|
|
toast
|
2026-05-11 06:32:38 +00:00
|
|
|
})
|
2026-05-29 09:44:03 +08:00
|
|
|
const {
|
|
|
|
|
spreadsheetUploadInput,
|
|
|
|
|
spreadsheetOnlyOfficeLoading,
|
|
|
|
|
spreadsheetOnlyOfficeError,
|
|
|
|
|
spreadsheetOnlyOfficeReady,
|
|
|
|
|
spreadsheetOnlyOfficeHostId,
|
|
|
|
|
spreadsheetChangeDetailOpen,
|
|
|
|
|
selectedSpreadsheetChangeRecord,
|
|
|
|
|
selectedSpreadsheetChangeRecords,
|
|
|
|
|
selectedSpreadsheetChangeSheetRows,
|
|
|
|
|
selectedSpreadsheetChangeCellRows,
|
|
|
|
|
destroySpreadsheetOnlyOfficeEditor,
|
|
|
|
|
mountSpreadsheetOnlyOfficeEditor,
|
|
|
|
|
triggerSpreadsheetUpload,
|
|
|
|
|
downloadSpreadsheetFile,
|
|
|
|
|
handleSpreadsheetFileInput,
|
|
|
|
|
loadSpreadsheetChangeRecords,
|
|
|
|
|
openSpreadsheetChangeDetail,
|
|
|
|
|
closeSpreadsheetChangeDetail
|
|
|
|
|
} = useAuditSpreadsheetEditor({
|
|
|
|
|
selectedSkill,
|
|
|
|
|
selectedSkillUsesSpreadsheet,
|
|
|
|
|
canEditSpreadsheetInline,
|
|
|
|
|
canUploadSpreadsheet,
|
|
|
|
|
canDownloadSpreadsheet,
|
|
|
|
|
selectedSpreadsheetFileName,
|
|
|
|
|
actionState,
|
|
|
|
|
refreshCurrentAssets,
|
|
|
|
|
loadSelectedAssetDetail,
|
|
|
|
|
resolveActor,
|
|
|
|
|
toast
|
2026-05-11 06:32:38 +00:00
|
|
|
})
|
2026-05-29 09:44:03 +08:00
|
|
|
const {
|
|
|
|
|
canCreateRiskRule,
|
|
|
|
|
riskRuleCreateOpen,
|
|
|
|
|
riskRuleCreateForm,
|
|
|
|
|
riskRuleCreateBusy,
|
|
|
|
|
openRiskRuleCreateDialog,
|
|
|
|
|
closeRiskRuleCreateDialog,
|
|
|
|
|
submitRiskRuleCreate,
|
|
|
|
|
stopAllRiskRuleGenerationPolls
|
|
|
|
|
} = useAuditRiskRuleCreateFlow({
|
|
|
|
|
activeType,
|
|
|
|
|
isRuleManager,
|
|
|
|
|
detailBusy,
|
|
|
|
|
actionState,
|
|
|
|
|
assetBuckets,
|
|
|
|
|
refreshCurrentAssets,
|
|
|
|
|
resolveActor,
|
|
|
|
|
toast
|
2026-05-11 06:32:38 +00:00
|
|
|
})
|
2026-05-29 09:44:03 +08:00
|
|
|
const {
|
|
|
|
|
saveRuleMarkdown,
|
|
|
|
|
saveRuleRuntimeJson,
|
|
|
|
|
activateSelectedRule,
|
|
|
|
|
restoreSelectedVersion
|
|
|
|
|
} = useAuditRuleVersionActions({
|
|
|
|
|
selectedSkill,
|
|
|
|
|
selectedSkillIsRule,
|
|
|
|
|
canEditMarkdown,
|
|
|
|
|
canManageSelected,
|
|
|
|
|
actionState,
|
|
|
|
|
detailBusy,
|
|
|
|
|
refreshCurrentAssets,
|
|
|
|
|
loadSelectedAssetDetail,
|
|
|
|
|
resolveActor,
|
|
|
|
|
toast
|
|
|
|
|
})
|
|
|
|
|
const {
|
|
|
|
|
reviewSubmitOpen,
|
|
|
|
|
reviewSubmitVersion,
|
|
|
|
|
reviewSubmitReviewer,
|
|
|
|
|
reviewSubmitReviewerLoading,
|
|
|
|
|
reviewSubmitReviewerOptions,
|
|
|
|
|
canSubmitReview,
|
|
|
|
|
hasReviewSubmitReviewers,
|
|
|
|
|
canReviewSelected,
|
|
|
|
|
reviewSelectedRule,
|
|
|
|
|
openSubmitReviewDialog,
|
|
|
|
|
closeSubmitReviewDialog,
|
|
|
|
|
submitSelectedRuleForReview
|
|
|
|
|
} = useAuditRuleReviewFlow({
|
|
|
|
|
selectedSkill,
|
|
|
|
|
selectedSkillIsRule,
|
|
|
|
|
selectedSkillUsesJsonRisk,
|
|
|
|
|
canEditSelected,
|
|
|
|
|
canManageSelected,
|
|
|
|
|
isDisplayingWorkingVersion,
|
|
|
|
|
canOpenRiskRuleReviewSubmit,
|
|
|
|
|
riskRuleTestPassed,
|
|
|
|
|
detailBusy,
|
|
|
|
|
actionState,
|
|
|
|
|
refreshCurrentAssets,
|
|
|
|
|
loadSelectedAssetDetail,
|
|
|
|
|
resolveActor,
|
|
|
|
|
toast
|
|
|
|
|
})
|
|
|
|
|
const {
|
|
|
|
|
riskRuleTestOpen,
|
|
|
|
|
riskRuleDeleteOpen,
|
|
|
|
|
riskRuleReturnOpen,
|
|
|
|
|
riskRulePublishOpen,
|
|
|
|
|
riskRuleReturnNote,
|
|
|
|
|
resetRiskRuleActionDialogs,
|
|
|
|
|
openRiskRuleTestDialog,
|
|
|
|
|
closeRiskRuleTestDialog,
|
|
|
|
|
handleRiskRuleReportSaved,
|
|
|
|
|
openDeleteRiskRuleDialog,
|
|
|
|
|
closeDeleteRiskRuleDialog,
|
|
|
|
|
deleteSelectedRiskRule,
|
|
|
|
|
openReturnRiskRuleDialog,
|
|
|
|
|
closeReturnRiskRuleDialog,
|
|
|
|
|
returnSelectedRiskRule,
|
|
|
|
|
openPublishRiskRuleDialog,
|
|
|
|
|
closePublishRiskRuleDialog,
|
|
|
|
|
publishSelectedRiskRule,
|
|
|
|
|
toggleSelectedRiskRuleEnabled
|
|
|
|
|
} = useAuditRiskRuleActions({
|
|
|
|
|
selectedSkill,
|
|
|
|
|
detailBusy,
|
|
|
|
|
actionState,
|
|
|
|
|
canOpenRiskRuleTest,
|
|
|
|
|
canDeleteRiskRule,
|
|
|
|
|
canReturnRiskRule,
|
|
|
|
|
canPublishRiskRule,
|
|
|
|
|
canToggleRiskRuleEnabled,
|
|
|
|
|
riskRuleTestPassed,
|
|
|
|
|
refreshCurrentAssets,
|
|
|
|
|
loadSelectedAssetDetail,
|
|
|
|
|
mergeSelectedRuleLifecycle,
|
|
|
|
|
closeDetail,
|
|
|
|
|
resolveActor,
|
|
|
|
|
toast
|
|
|
|
|
})
|
|
|
|
|
const showReviewNote = computed(
|
|
|
|
|
() => selectedSkillIsRule.value && (selectedSkill.value?.reviewNote || selectedSkill.value?.reviewTimeLabel)
|
|
|
|
|
)
|
|
|
|
|
const {
|
|
|
|
|
activeFilterTokens,
|
|
|
|
|
auditEmptyState,
|
|
|
|
|
domainOptions,
|
|
|
|
|
ownerOptions,
|
|
|
|
|
riskLevelOptions,
|
|
|
|
|
selectedDomainLabel,
|
|
|
|
|
selectedEnabledStateLabel,
|
|
|
|
|
selectedOnlineStateLabel,
|
|
|
|
|
selectedOwnerLabel,
|
|
|
|
|
selectedRiskLevelLabel,
|
|
|
|
|
selectedRiskScenarioLabel,
|
|
|
|
|
selectedStatusLabel,
|
|
|
|
|
showEnabledFilter,
|
|
|
|
|
showOnlineFilter,
|
|
|
|
|
showOwnerFilter,
|
|
|
|
|
showRiskLevelFilter,
|
|
|
|
|
showRiskScenarioFilter,
|
|
|
|
|
showStatusFilter,
|
|
|
|
|
visibleSkills
|
|
|
|
|
} = useAuditListFilters({
|
|
|
|
|
activeType,
|
|
|
|
|
activeTabLabel,
|
|
|
|
|
currentAssets,
|
|
|
|
|
keyword,
|
|
|
|
|
selectedDomain,
|
|
|
|
|
selectedEnabledState,
|
|
|
|
|
selectedOnlineState,
|
|
|
|
|
selectedOwner,
|
|
|
|
|
selectedRiskLevel,
|
|
|
|
|
selectedRiskScenario,
|
|
|
|
|
selectedStatus
|
2026-05-13 06:52:30 +00:00
|
|
|
})
|
2026-05-11 06:32:38 +00:00
|
|
|
const canActivateSelected = computed(() => {
|
|
|
|
|
if (!selectedSkillIsRule.value || !canManageSelected.value || detailBusy.value) {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-18 02:51:25 +00:00
|
|
|
return (
|
|
|
|
|
isDisplayingWorkingVersion.value &&
|
|
|
|
|
selectedSkill.value?.reviewStatusValue === 'approved' &&
|
|
|
|
|
selectedSkill.value?.workingVersion !== selectedSkill.value?.publishedVersion
|
|
|
|
|
)
|
2026-05-11 06:32:38 +00:00
|
|
|
})
|
|
|
|
|
const activateBlockedReason = computed(() => {
|
|
|
|
|
if (!selectedSkillIsRule.value) {
|
|
|
|
|
return ''
|
|
|
|
|
}
|
2026-05-18 02:51:25 +00:00
|
|
|
if (selectedSkill.value?.isPreviewMock) {
|
|
|
|
|
return '当前为页面预览态,暂不执行真实审核和上线。'
|
|
|
|
|
}
|
2026-05-11 06:32:38 +00:00
|
|
|
if (!canManageSelected.value) {
|
2026-05-26 17:29:35 +08:00
|
|
|
return '仅高级财务人员可执行审核和上线。'
|
2026-05-18 02:51:25 +00:00
|
|
|
}
|
|
|
|
|
if (!isDisplayingWorkingVersion.value) {
|
|
|
|
|
return '请先切回当前工作版本,再执行审核或上线。'
|
2026-05-11 06:32:38 +00:00
|
|
|
}
|
2026-05-18 02:51:25 +00:00
|
|
|
if (selectedSkill.value?.workingVersion === selectedSkill.value?.publishedVersion) {
|
|
|
|
|
return '当前工作版本已经是线上版本。'
|
2026-05-11 06:32:38 +00:00
|
|
|
}
|
|
|
|
|
if (selectedSkill.value?.reviewStatusValue !== 'approved') {
|
|
|
|
|
return '当前规则版本未审核通过,不能上线。'
|
|
|
|
|
}
|
|
|
|
|
return ''
|
2026-05-11 01:53:30 +00:00
|
|
|
})
|
2026-05-29 09:44:03 +08:00
|
|
|
const auditDetailTopBar = computed(() =>
|
|
|
|
|
buildAuditDetailTopBar({
|
|
|
|
|
skill: selectedSkill.value,
|
|
|
|
|
usesJsonRiskRule: selectedSkillUsesJsonRisk.value,
|
|
|
|
|
usesSpreadsheetRule: selectedSkillUsesSpreadsheet.value,
|
|
|
|
|
spreadsheetModeLabel: selectedSpreadsheetModeLabel.value,
|
|
|
|
|
spreadsheetFileName: selectedSpreadsheetFileName.value,
|
|
|
|
|
canEditSpreadsheetInline: canEditSpreadsheetInline.value
|
2026-05-11 06:32:38 +00:00
|
|
|
})
|
2026-05-21 23:53:03 +08:00
|
|
|
)
|
2026-05-09 15:46:16 +00:00
|
|
|
|
2026-05-09 16:16:56 +00:00
|
|
|
watch(
|
|
|
|
|
selectedSkill,
|
|
|
|
|
(value) => {
|
|
|
|
|
emit('detail-open-change', Boolean(value))
|
|
|
|
|
},
|
|
|
|
|
{ immediate: true }
|
|
|
|
|
)
|
|
|
|
|
|
2026-05-29 09:44:03 +08:00
|
|
|
watch(
|
|
|
|
|
auditDetailTopBar,
|
|
|
|
|
(value) => {
|
|
|
|
|
emit('detail-topbar-change', value)
|
|
|
|
|
},
|
|
|
|
|
{ immediate: true, deep: true }
|
|
|
|
|
)
|
|
|
|
|
|
2026-05-18 02:51:25 +00:00
|
|
|
watch(
|
|
|
|
|
() => [
|
|
|
|
|
selectedSkill.value?.id || '',
|
|
|
|
|
selectedSkill.value?.loading ? '1' : '0',
|
|
|
|
|
selectedSkill.value?.usesSpreadsheetRule ? '1' : '0'
|
|
|
|
|
],
|
|
|
|
|
async () => {
|
|
|
|
|
if (!selectedSkillUsesSpreadsheet.value || selectedSkill.value?.loading) {
|
|
|
|
|
destroySpreadsheetOnlyOfficeEditor()
|
|
|
|
|
spreadsheetOnlyOfficeError.value = ''
|
|
|
|
|
spreadsheetOnlyOfficeLoading.value = false
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
await mountSpreadsheetOnlyOfficeEditor()
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
|
2026-05-11 06:32:38 +00:00
|
|
|
watch(activeType, () => {
|
2026-05-18 02:51:25 +00:00
|
|
|
destroySpreadsheetOnlyOfficeEditor()
|
2026-05-11 06:32:38 +00:00
|
|
|
selectedSkill.value = null
|
2026-05-29 09:44:03 +08:00
|
|
|
clearVersionTimelineState()
|
2026-05-11 06:32:38 +00:00
|
|
|
resetFilters()
|
|
|
|
|
loadAssets({ force: true }).catch((error) => {
|
|
|
|
|
errorMessage.value = error?.message || '资产数据加载失败,请稍后重试。'
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
function resetFilters() {
|
|
|
|
|
keyword.value = ''
|
|
|
|
|
selectedDomain.value = ''
|
|
|
|
|
selectedOwner.value = ''
|
2026-05-26 17:29:35 +08:00
|
|
|
selectedRiskLevel.value = ''
|
2026-05-11 06:32:38 +00:00
|
|
|
selectedStatus.value = ''
|
2026-05-19 20:23:58 +08:00
|
|
|
selectedRiskScenario.value = ''
|
2026-05-24 21:44:17 +08:00
|
|
|
selectedOnlineState.value = ''
|
|
|
|
|
selectedEnabledState.value = ''
|
2026-05-11 06:32:38 +00:00
|
|
|
activeFilterPopover.value = ''
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-13 06:52:30 +00:00
|
|
|
function handleAuditEmptyAction() {
|
|
|
|
|
if (!currentAssets.value.length || !activeFilterTokens.value.length) {
|
|
|
|
|
loadAssets({ force: true }).catch(() => {})
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
resetFilters()
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-11 06:32:38 +00:00
|
|
|
function toggleFilterPopover(name) {
|
|
|
|
|
activeFilterPopover.value = activeFilterPopover.value === name ? '' : name
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function closeFilterPopover() {
|
|
|
|
|
activeFilterPopover.value = ''
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function selectFilter(name, value) {
|
|
|
|
|
if (name === 'domain') {
|
|
|
|
|
selectedDomain.value = value
|
|
|
|
|
}
|
|
|
|
|
if (name === 'owner') {
|
|
|
|
|
selectedOwner.value = value
|
|
|
|
|
}
|
2026-05-26 17:29:35 +08:00
|
|
|
if (name === 'riskLevel') {
|
|
|
|
|
selectedRiskLevel.value = value
|
|
|
|
|
}
|
2026-05-11 06:32:38 +00:00
|
|
|
if (name === 'status') {
|
|
|
|
|
selectedStatus.value = value
|
|
|
|
|
}
|
2026-05-19 20:23:58 +08:00
|
|
|
if (name === 'riskScenario') {
|
|
|
|
|
selectedRiskScenario.value = value
|
|
|
|
|
}
|
2026-05-24 21:44:17 +08:00
|
|
|
if (name === 'online') {
|
|
|
|
|
selectedOnlineState.value = value
|
|
|
|
|
}
|
|
|
|
|
if (name === 'enabled') {
|
|
|
|
|
selectedEnabledState.value = value
|
|
|
|
|
}
|
2026-05-11 06:32:38 +00:00
|
|
|
closeFilterPopover()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function handleDocumentClick(event) {
|
|
|
|
|
const target = event.target
|
|
|
|
|
if (!(target instanceof Element)) {
|
|
|
|
|
closeFilterPopover()
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if (!target.closest('.picker-filter')) {
|
|
|
|
|
closeFilterPopover()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function resolveActor() {
|
|
|
|
|
return currentUser.value?.name || currentUser.value?.username || 'system'
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-29 09:44:03 +08:00
|
|
|
function openAssetDetail(asset) {
|
|
|
|
|
if (asset?.usesJsonRiskRule && asset.statusValue === 'generating') {
|
|
|
|
|
toast('规则仍在后台生成中,生成完成后才能进入详情。')
|
2026-05-23 19:54:42 +08:00
|
|
|
return
|
|
|
|
|
}
|
2026-05-29 09:44:03 +08:00
|
|
|
destroySpreadsheetOnlyOfficeEditor()
|
|
|
|
|
spreadsheetOnlyOfficeError.value = ''
|
|
|
|
|
spreadsheetOnlyOfficeLoading.value = false
|
|
|
|
|
if (asset?.isPreviewMock) {
|
|
|
|
|
selectedSkill.value = buildPreviewRuleDetail()
|
|
|
|
|
detailError.value = ''
|
|
|
|
|
detailLoading.value = false
|
|
|
|
|
clearVersionTimelineState()
|
2026-05-26 09:15:14 +08:00
|
|
|
return
|
|
|
|
|
}
|
2026-05-29 09:44:03 +08:00
|
|
|
const opensSpreadsheetRule = Boolean(asset?.usesSpreadsheetRule)
|
|
|
|
|
selectedSkill.value = {
|
|
|
|
|
...asset,
|
|
|
|
|
configJson: {},
|
|
|
|
|
isPreviewMock: false,
|
|
|
|
|
usesSpreadsheetRule: opensSpreadsheetRule,
|
|
|
|
|
usesJsonRiskRule: Boolean(asset?.usesJsonRiskRule),
|
|
|
|
|
riskRuleJsonText: '{}',
|
|
|
|
|
riskRuleSummary: null,
|
|
|
|
|
riskRuleDescription: '',
|
|
|
|
|
riskRuleSourceRef: '',
|
|
|
|
|
ruleDocument: asset?.ruleDocument || null,
|
|
|
|
|
scenarioList: [],
|
|
|
|
|
fields: [],
|
|
|
|
|
promptSections: [],
|
|
|
|
|
outputRules: [],
|
|
|
|
|
tests: [],
|
|
|
|
|
triggers: [],
|
|
|
|
|
tools: [],
|
|
|
|
|
history: [],
|
|
|
|
|
markdownContent: '',
|
|
|
|
|
runtimeRuleText: '',
|
|
|
|
|
ruleTemplateKey: '',
|
|
|
|
|
ruleTemplateLabel: '',
|
|
|
|
|
runtimeKind: 'policy_rule_draft',
|
|
|
|
|
displayVersion: asset.version,
|
|
|
|
|
displayVersionChangeNote: '无版本说明',
|
|
|
|
|
loading: !opensSpreadsheetRule,
|
|
|
|
|
reviewStatusLabel: opensSpreadsheetRule ? '' : '加载中',
|
|
|
|
|
reviewStatusTone: 'draft'
|
2026-05-18 09:42:23 +00:00
|
|
|
}
|
2026-05-29 09:44:03 +08:00
|
|
|
clearVersionTimelineState()
|
|
|
|
|
if (opensSpreadsheetRule) {
|
|
|
|
|
loadSpreadsheetChangeRecords(asset.id).catch(() => {})
|
2026-05-18 02:51:25 +00:00
|
|
|
}
|
2026-05-29 09:44:03 +08:00
|
|
|
loadSelectedAssetDetail(asset.id).catch(() => {})
|
2026-05-11 06:32:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function closeDetail() {
|
2026-05-18 02:51:25 +00:00
|
|
|
destroySpreadsheetOnlyOfficeEditor()
|
|
|
|
|
spreadsheetOnlyOfficeError.value = ''
|
|
|
|
|
spreadsheetOnlyOfficeLoading.value = false
|
2026-05-11 06:32:38 +00:00
|
|
|
selectedSkill.value = null
|
|
|
|
|
detailError.value = ''
|
|
|
|
|
detailLoading.value = false
|
2026-05-29 09:44:03 +08:00
|
|
|
clearVersionTimelineState()
|
|
|
|
|
resetRiskRuleActionDialogs()
|
2026-05-18 02:51:25 +00:00
|
|
|
}
|
|
|
|
|
|
2026-05-11 06:32:38 +00:00
|
|
|
onMounted(() => {
|
|
|
|
|
document.addEventListener('click', handleDocumentClick)
|
|
|
|
|
loadAssets({ force: true }).catch(() => {})
|
|
|
|
|
loadRuns().catch(() => {})
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
onBeforeUnmount(() => {
|
2026-05-18 02:51:25 +00:00
|
|
|
destroySpreadsheetOnlyOfficeEditor()
|
2026-05-29 09:44:03 +08:00
|
|
|
stopAllRiskRuleGenerationPolls()
|
2026-05-11 06:32:38 +00:00
|
|
|
document.removeEventListener('click', handleDocumentClick)
|
|
|
|
|
})
|
|
|
|
|
|
2026-05-06 11:00:38 +08:00
|
|
|
return {
|
|
|
|
|
tabs,
|
2026-05-09 15:46:16 +00:00
|
|
|
activeType,
|
2026-05-11 06:32:38 +00:00
|
|
|
activeTabLabel,
|
|
|
|
|
selectedSkill,
|
|
|
|
|
versionSwitchTarget,
|
|
|
|
|
keyword,
|
2026-05-09 15:46:16 +00:00
|
|
|
createButtonLabel,
|
|
|
|
|
hintText,
|
2026-05-11 01:53:30 +00:00
|
|
|
searchPlaceholder,
|
2026-05-09 15:46:16 +00:00
|
|
|
tableColumns,
|
2026-05-19 20:23:58 +08:00
|
|
|
showRuntimeColumn,
|
|
|
|
|
showVersionColumn,
|
2026-05-11 06:33:46 +00:00
|
|
|
showMetricColumn,
|
2026-05-19 20:23:58 +08:00
|
|
|
showStatusColumn,
|
2026-05-24 21:44:17 +08:00
|
|
|
showOnlineColumn,
|
|
|
|
|
showEnabledColumn,
|
2026-05-09 15:46:16 +00:00
|
|
|
visibleSkills,
|
2026-05-13 06:52:30 +00:00
|
|
|
auditEmptyState,
|
2026-05-11 06:32:38 +00:00
|
|
|
loading,
|
|
|
|
|
errorMessage,
|
|
|
|
|
detailLoading,
|
|
|
|
|
detailError,
|
|
|
|
|
selectedDomain,
|
|
|
|
|
selectedOwner,
|
2026-05-26 17:29:35 +08:00
|
|
|
selectedRiskLevel,
|
2026-05-11 06:32:38 +00:00
|
|
|
selectedStatus,
|
2026-05-19 20:23:58 +08:00
|
|
|
selectedRiskScenario,
|
2026-05-24 21:44:17 +08:00
|
|
|
selectedOnlineState,
|
|
|
|
|
selectedEnabledState,
|
2026-05-11 06:32:38 +00:00
|
|
|
selectedDomainLabel,
|
|
|
|
|
selectedOwnerLabel,
|
2026-05-26 17:29:35 +08:00
|
|
|
selectedRiskLevelLabel,
|
2026-05-11 06:32:38 +00:00
|
|
|
selectedStatusLabel,
|
2026-05-19 20:23:58 +08:00
|
|
|
selectedRiskScenarioLabel,
|
2026-05-24 21:44:17 +08:00
|
|
|
selectedOnlineStateLabel,
|
|
|
|
|
selectedEnabledStateLabel,
|
2026-05-19 20:23:58 +08:00
|
|
|
showRiskScenarioFilter,
|
2026-05-26 17:29:35 +08:00
|
|
|
showOwnerFilter,
|
|
|
|
|
showRiskLevelFilter,
|
2026-05-19 20:23:58 +08:00
|
|
|
showStatusFilter,
|
2026-05-24 21:44:17 +08:00
|
|
|
showOnlineFilter,
|
|
|
|
|
showEnabledFilter,
|
2026-05-11 06:32:38 +00:00
|
|
|
domainOptions,
|
|
|
|
|
ownerOptions,
|
2026-05-26 17:29:35 +08:00
|
|
|
riskLevelOptions,
|
2026-05-11 06:32:38 +00:00
|
|
|
statusOptions: STATUS_OPTIONS,
|
2026-05-19 20:23:58 +08:00
|
|
|
riskScenarioOptions: RISK_SCENARIO_OPTIONS,
|
2026-05-24 21:44:17 +08:00
|
|
|
onlineStateOptions: ONLINE_STATE_OPTIONS,
|
|
|
|
|
enabledStateOptions: ENABLED_STATE_OPTIONS,
|
2026-05-11 06:32:38 +00:00
|
|
|
activeFilterPopover,
|
|
|
|
|
activeFilterTokens,
|
|
|
|
|
canManageSelected,
|
2026-05-18 02:51:25 +00:00
|
|
|
canEditSelected,
|
2026-05-23 19:54:42 +08:00
|
|
|
canCreateRiskRule,
|
2026-05-24 21:44:17 +08:00
|
|
|
canOpenRiskRuleTest,
|
|
|
|
|
canDeleteRiskRule,
|
2026-05-26 09:15:14 +08:00
|
|
|
canOpenRiskRuleReviewSubmit,
|
2026-05-24 21:44:17 +08:00
|
|
|
canSubmitRiskRuleReview,
|
|
|
|
|
canReturnRiskRule,
|
|
|
|
|
canPublishRiskRule,
|
|
|
|
|
canToggleRiskRuleEnabled,
|
|
|
|
|
riskRuleTestPassed,
|
|
|
|
|
riskRuleInReview,
|
2026-05-18 02:51:25 +00:00
|
|
|
canSubmitReview,
|
2026-05-18 09:42:23 +00:00
|
|
|
hasReviewSubmitReviewers,
|
2026-05-18 02:51:25 +00:00
|
|
|
canReviewSelected,
|
2026-05-11 06:32:38 +00:00
|
|
|
canEditMarkdown,
|
2026-05-18 02:51:25 +00:00
|
|
|
canUploadSpreadsheet,
|
|
|
|
|
canDownloadSpreadsheet,
|
|
|
|
|
canEditSpreadsheetInline,
|
2026-05-11 06:32:38 +00:00
|
|
|
canActivateSelected,
|
|
|
|
|
activateBlockedReason,
|
|
|
|
|
selectedSkillIsRule,
|
2026-05-18 02:51:25 +00:00
|
|
|
selectedSkillUsesSpreadsheet,
|
2026-05-19 20:23:58 +08:00
|
|
|
selectedSkillUsesJsonRisk,
|
2026-05-18 02:51:25 +00:00
|
|
|
selectedSpreadsheetFileName,
|
2026-05-19 16:19:03 +00:00
|
|
|
selectedSpreadsheetModeLabel,
|
2026-05-18 02:51:25 +00:00
|
|
|
selectedVersionTimelineItems,
|
2026-05-18 09:42:23 +00:00
|
|
|
selectedSpreadsheetChangeRecords,
|
2026-05-11 06:32:38 +00:00
|
|
|
detailBusy,
|
|
|
|
|
actionState,
|
2026-05-18 09:42:23 +00:00
|
|
|
reviewSubmitOpen,
|
|
|
|
|
reviewSubmitVersion,
|
|
|
|
|
reviewSubmitReviewer,
|
|
|
|
|
reviewSubmitReviewerLoading,
|
|
|
|
|
reviewSubmitReviewerOptions,
|
2026-05-27 09:17:57 +08:00
|
|
|
riskRuleAttachmentOptions,
|
2026-05-23 19:54:42 +08:00
|
|
|
riskRuleCreateOpen,
|
|
|
|
|
riskRuleCreateForm,
|
|
|
|
|
riskRuleCreateBusy,
|
2026-05-24 21:44:17 +08:00
|
|
|
riskRuleTestOpen,
|
|
|
|
|
riskRuleDeleteOpen,
|
|
|
|
|
riskRuleReturnOpen,
|
|
|
|
|
riskRulePublishOpen,
|
|
|
|
|
riskRuleReturnNote,
|
2026-05-26 12:16:20 +08:00
|
|
|
riskRuleBusinessStageOptions: RISK_RULE_BUSINESS_STAGE_OPTIONS,
|
2026-05-24 21:44:17 +08:00
|
|
|
riskRuleExpenseCategoryOptions: RISK_RULE_EXPENSE_CATEGORY_OPTIONS,
|
2026-05-11 06:32:38 +00:00
|
|
|
showReviewNote,
|
2026-05-18 02:51:25 +00:00
|
|
|
spreadsheetUploadInput,
|
|
|
|
|
spreadsheetOnlyOfficeLoading,
|
|
|
|
|
spreadsheetOnlyOfficeError,
|
|
|
|
|
spreadsheetOnlyOfficeReady,
|
|
|
|
|
spreadsheetOnlyOfficeHostId,
|
|
|
|
|
versionTimelineOpen,
|
|
|
|
|
versionTimelineLoading,
|
|
|
|
|
versionTimelineError,
|
2026-05-18 09:42:23 +00:00
|
|
|
spreadsheetChangeDetailOpen,
|
|
|
|
|
selectedSpreadsheetChangeRecord,
|
|
|
|
|
selectedSpreadsheetChangeSheetRows,
|
|
|
|
|
selectedSpreadsheetChangeCellRows,
|
2026-05-11 06:32:38 +00:00
|
|
|
openAssetDetail,
|
|
|
|
|
closeDetail,
|
|
|
|
|
resetFilters,
|
2026-05-13 06:52:30 +00:00
|
|
|
handleAuditEmptyAction,
|
2026-05-11 06:32:38 +00:00
|
|
|
toggleFilterPopover,
|
|
|
|
|
selectFilter,
|
|
|
|
|
closeFilterPopover,
|
2026-05-23 19:54:42 +08:00
|
|
|
openRiskRuleCreateDialog,
|
|
|
|
|
closeRiskRuleCreateDialog,
|
|
|
|
|
submitRiskRuleCreate,
|
2026-05-29 09:44:03 +08:00
|
|
|
openVersionSwitch: openVersionSwitchInState,
|
|
|
|
|
cancelVersionSwitch: cancelVersionSwitchInState,
|
|
|
|
|
confirmVersionSwitch: confirmVersionSwitchInState,
|
2026-05-11 06:32:38 +00:00
|
|
|
saveRuleMarkdown,
|
2026-05-15 06:57:07 +00:00
|
|
|
saveRuleRuntimeJson,
|
2026-05-19 20:23:58 +08:00
|
|
|
saveRiskRuleJson,
|
|
|
|
|
formatRiskRuleJson,
|
|
|
|
|
downloadRiskRuleJson,
|
2026-05-18 02:51:25 +00:00
|
|
|
triggerSpreadsheetUpload,
|
|
|
|
|
downloadSpreadsheetFile,
|
|
|
|
|
handleSpreadsheetFileInput,
|
2026-05-11 06:32:38 +00:00
|
|
|
reviewSelectedRule,
|
2026-05-18 09:42:23 +00:00
|
|
|
openSubmitReviewDialog,
|
|
|
|
|
closeSubmitReviewDialog,
|
|
|
|
|
submitSelectedRuleForReview,
|
2026-05-24 21:44:17 +08:00
|
|
|
openRiskRuleTestDialog,
|
|
|
|
|
closeRiskRuleTestDialog,
|
|
|
|
|
handleRiskRuleReportSaved,
|
|
|
|
|
openDeleteRiskRuleDialog,
|
|
|
|
|
closeDeleteRiskRuleDialog,
|
|
|
|
|
deleteSelectedRiskRule,
|
|
|
|
|
openReturnRiskRuleDialog,
|
|
|
|
|
closeReturnRiskRuleDialog,
|
|
|
|
|
returnSelectedRiskRule,
|
|
|
|
|
openPublishRiskRuleDialog,
|
|
|
|
|
closePublishRiskRuleDialog,
|
|
|
|
|
publishSelectedRiskRule,
|
|
|
|
|
toggleSelectedRiskRuleEnabled,
|
2026-05-11 06:32:38 +00:00
|
|
|
activateSelectedRule,
|
2026-05-18 02:51:25 +00:00
|
|
|
restoreSelectedVersion,
|
2026-05-29 09:44:03 +08:00
|
|
|
openVersionTimeline: openVersionTimelineInState,
|
|
|
|
|
closeVersionTimeline: closeVersionTimelineInState,
|
2026-05-18 09:42:23 +00:00
|
|
|
openSpreadsheetChangeDetail,
|
|
|
|
|
closeSpreadsheetChangeDetail,
|
2026-05-11 06:32:38 +00:00
|
|
|
loadAssets
|
2026-05-06 11:00:38 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|