feat: 新增风险图谱算法与系统仪表盘及操作反馈体系
后端新增风险图谱算法模块、风险观察与反馈服务、规则 DSL 校验器和可解释性引擎,完善系统仪表盘和财务仪表盘统计, 优化 agent 运行和编排执行链路,清理旧开发文档,前端新增 系统趋势、负载热力图等多种仪表盘图表组件,完善操作反馈 对话框和工作台日期选择器,优化报销创建和审批详情交互, 补充单元测试覆盖。
This commit is contained in:
144
web/src/composables/useWorkbenchComposerDate.js
Normal file
144
web/src/composables/useWorkbenchComposerDate.js
Normal file
@@ -0,0 +1,144 @@
|
||||
import { computed, ref } from 'vue'
|
||||
|
||||
import {
|
||||
buildWorkbenchDateLabel,
|
||||
canApplyWorkbenchDateSelection,
|
||||
getTodayDateValue,
|
||||
mergeWorkbenchDateLabelIntoDraft,
|
||||
stripWorkbenchDateLabelFromDraft
|
||||
} from '../utils/workbenchComposerDate.js'
|
||||
|
||||
export function useWorkbenchComposerDate({ draft, focusInput } = {}) {
|
||||
const workbenchDatePickerOpen = ref(false)
|
||||
const workbenchDateMode = ref('single')
|
||||
const workbenchSingleDate = ref(getTodayDateValue())
|
||||
const workbenchRangeStartDate = ref(getTodayDateValue())
|
||||
const workbenchRangeEndDate = ref(getTodayDateValue())
|
||||
const workbenchDateTagLabel = ref('')
|
||||
|
||||
const workbenchCanApplyDateSelection = computed(() =>
|
||||
canApplyWorkbenchDateSelection({
|
||||
mode: workbenchDateMode.value,
|
||||
singleDate: workbenchSingleDate.value,
|
||||
rangeStartDate: workbenchRangeStartDate.value,
|
||||
rangeEndDate: workbenchRangeEndDate.value
|
||||
})
|
||||
)
|
||||
|
||||
function clearWorkbenchDateSelection() {
|
||||
const today = getTodayDateValue()
|
||||
workbenchDatePickerOpen.value = false
|
||||
workbenchDateMode.value = 'single'
|
||||
workbenchSingleDate.value = today
|
||||
workbenchRangeStartDate.value = today
|
||||
workbenchRangeEndDate.value = today
|
||||
workbenchDateTagLabel.value = ''
|
||||
}
|
||||
|
||||
function ensureWorkbenchDateDefaults() {
|
||||
const today = getTodayDateValue()
|
||||
workbenchSingleDate.value ||= today
|
||||
workbenchRangeStartDate.value ||= workbenchSingleDate.value || today
|
||||
workbenchRangeEndDate.value ||= workbenchRangeStartDate.value || today
|
||||
}
|
||||
|
||||
function toggleWorkbenchDatePicker() {
|
||||
if (workbenchDatePickerOpen.value) {
|
||||
workbenchDatePickerOpen.value = false
|
||||
return
|
||||
}
|
||||
|
||||
ensureWorkbenchDateDefaults()
|
||||
workbenchDatePickerOpen.value = true
|
||||
}
|
||||
|
||||
function closeWorkbenchDatePicker() {
|
||||
workbenchDatePickerOpen.value = false
|
||||
}
|
||||
|
||||
function setWorkbenchDateMode(mode) {
|
||||
const today = getTodayDateValue()
|
||||
const nextMode = mode === 'range' ? 'range' : 'single'
|
||||
|
||||
if (nextMode === 'range') {
|
||||
const baseDate = workbenchSingleDate.value || today
|
||||
workbenchRangeStartDate.value ||= baseDate
|
||||
workbenchRangeEndDate.value ||= workbenchRangeStartDate.value
|
||||
} else {
|
||||
workbenchSingleDate.value ||= workbenchRangeStartDate.value || today
|
||||
}
|
||||
|
||||
workbenchDateMode.value = nextMode
|
||||
}
|
||||
|
||||
function handleWorkbenchDatePickerOutside(event) {
|
||||
if (!workbenchDatePickerOpen.value) {
|
||||
return
|
||||
}
|
||||
if (event.target instanceof Element && event.target.closest('.workbench-date-anchor')) {
|
||||
return
|
||||
}
|
||||
workbenchDatePickerOpen.value = false
|
||||
}
|
||||
|
||||
function applyWorkbenchDateSelection() {
|
||||
const label = buildWorkbenchDateLabel({
|
||||
mode: workbenchDateMode.value,
|
||||
singleDate: workbenchSingleDate.value,
|
||||
rangeStartDate: workbenchRangeStartDate.value,
|
||||
rangeEndDate: workbenchRangeEndDate.value
|
||||
})
|
||||
if (!label) {
|
||||
return
|
||||
}
|
||||
|
||||
workbenchDateTagLabel.value = label
|
||||
draft.value = stripWorkbenchDateLabelFromDraft(draft.value)
|
||||
workbenchDatePickerOpen.value = false
|
||||
focusInput?.()
|
||||
}
|
||||
|
||||
function handleWorkbenchDateInputChange(part = 'single') {
|
||||
if (workbenchDateMode.value !== 'range' || part === 'single') {
|
||||
applyWorkbenchDateSelection()
|
||||
return
|
||||
}
|
||||
|
||||
if (part === 'range-start') {
|
||||
if (!workbenchRangeEndDate.value || workbenchRangeEndDate.value < workbenchRangeStartDate.value) {
|
||||
workbenchRangeEndDate.value = workbenchRangeStartDate.value
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
applyWorkbenchDateSelection()
|
||||
}
|
||||
|
||||
function removeWorkbenchDateTag() {
|
||||
workbenchDateTagLabel.value = ''
|
||||
focusInput?.()
|
||||
}
|
||||
|
||||
function buildWorkbenchPromptText(rawText = draft.value) {
|
||||
return mergeWorkbenchDateLabelIntoDraft(rawText, workbenchDateTagLabel.value)
|
||||
}
|
||||
|
||||
return {
|
||||
workbenchDatePickerOpen,
|
||||
workbenchDateMode,
|
||||
workbenchSingleDate,
|
||||
workbenchRangeStartDate,
|
||||
workbenchRangeEndDate,
|
||||
workbenchDateTagLabel,
|
||||
workbenchCanApplyDateSelection,
|
||||
clearWorkbenchDateSelection,
|
||||
toggleWorkbenchDatePicker,
|
||||
closeWorkbenchDatePicker,
|
||||
setWorkbenchDateMode,
|
||||
handleWorkbenchDatePickerOutside,
|
||||
applyWorkbenchDateSelection,
|
||||
handleWorkbenchDateInputChange,
|
||||
removeWorkbenchDateTag,
|
||||
buildWorkbenchPromptText
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user