修复: 前端UX一致性(Dashboard状态映射/状态徽章全局/Knowledge下一条与失败反馈/Ideas筛选与错误条/ConfirmDialog安全/快捷菜单状态机/分页越界) + 后端校验(queue/count-list一致/软删拒改/父聚合/promote CAS/MCP状态机收口/update白名单剔除id/created_at) + 销账

This commit is contained in:
lxy
2026-08-09 21:35:58 +08:00
parent 8bc5380ecb
commit fbd8fae44b
30 changed files with 829 additions and 138 deletions
+20 -2
View File
@@ -6,7 +6,7 @@ import { createIdeasStore } from './project/ideas'
import { createWorkflowStore } from './project/workflow'
import { state, clearError } from './project/state'
import { taskApi } from '@/api/task'
import type { DfDataChangedPayload, TaskQuery } from '@/api/types'
import type { DfDataChangedPayload, TaskQuery, IdeaQuery } from '@/api/types'
// ── barrel 组合器(零行为变更,纯重构) ──
//
@@ -41,21 +41,34 @@ function createStore() {
// 避免刷新把已选 status 冲掉)。
let _activeTaskProject: string | undefined = undefined
let _activeTaskStatus: string | undefined = undefined
// WK-10:Tasks 视图搜索关键字登记(数据变更联动刷新时一并下沉 keyword,避免冲掉搜索结果)
let _activeTaskKeyword: string | undefined = undefined
function setActiveTaskProject(projectKey: string | undefined) {
_activeTaskProject = projectKey
}
function setActiveTaskStatus(statusKey: string | undefined) {
_activeTaskStatus = statusKey
}
function setActiveTaskKeyword(keyword: string | undefined) {
_activeTaskKeyword = keyword
}
// 构造当前 task 视图筛选对应的 query(供数据变更 listener 复用同一筛选拉取)
function buildActiveTaskQuery(): TaskQuery | undefined {
if (_activeTaskProject === undefined) return undefined // 视图未挂载,不触发
const query: TaskQuery = {}
if (_activeTaskProject !== 'all') query.project_id = _activeTaskProject
if (_activeTaskStatus && _activeTaskStatus !== 'all') query.status = _activeTaskStatus
if (_activeTaskKeyword) query.keyword = _activeTaskKeyword
return query
}
// WK-4:Ideas 视图当前查询登记(数据变更联动刷新按当前筛选重载,不再无参 loadIdeas 全量冲掉筛选)。
// undefined = Ideas 视图未挂载(如 Dashboard)→ 退化为全量刷新,保持面板统计新鲜。
let _activeIdeaQuery: IdeaQuery | undefined = undefined
function setActiveIdeaQuery(q: IdeaQuery | undefined) {
_activeIdeaQuery = q
}
let _dataChangedUnlisten: (() => void) | null = null
async function startDataChangedListener() {
@@ -76,7 +89,8 @@ function createStore() {
// Dashboard 数字(与 Tasks 视图分页/筛选解耦,不受 q undefined 影响)
void loadStats()
} else if (entity === 'idea') {
void ideasStore.loadIdeas()
// WK-4:按 Ideas 视图当前 query 重载(未挂载时退化为全量刷新 Dashboard 面板)
void ideasStore.loadIdeas(_activeIdeaQuery)
}
})
return _dataChangedUnlisten
@@ -179,6 +193,10 @@ function createStore() {
setActiveTaskProject,
// F-260621-02(P1 status 下沉):Tasks 视图登记当前 status 筛选,供 listener 复用同一筛选拉取
setActiveTaskStatus,
// WK-10:Tasks 视图登记当前搜索关键字,供 listener 复用同一筛选拉取
setActiveTaskKeyword,
// WK-4: Ideas 视图登记当前查询,供 listener 按筛选重载(不冲掉筛选视图)
setActiveIdeaQuery,
pendingApproval: computed(() => state.pendingApproval),
// computed
stats,