新增: 三实体列表查询维度补全(status/关键词/排序/分页下沉后端)

任务/项目/灵感三实体新增 list_by_query 动态 WHERE(累积式 where_clauses
+params_vec 收口)+ order_by 白名单防注入 + limit/offset 钳制。命令层
list_{tasks,projects,ideas} 吃 Option<XxxQuery> 双参向后兼容(旧无参/单参
路径等价全量)。前端 Tasks/Ideas status/keyword 筛选下沉后端 query。

F-260621-02
This commit is contained in:
2026-06-22 01:03:37 +08:00
parent 72e57c6232
commit c9b6e28433
18 changed files with 878 additions and 76 deletions

View File

@@ -5,7 +5,7 @@ import { createTasksStore } from './project/tasks'
import { createIdeasStore } from './project/ideas'
import { createWorkflowStore } from './project/workflow'
import { state, clearError } from './project/state'
import type { DfDataChangedPayload } from '@/api/types'
import type { DfDataChangedPayload, TaskQuery } from '@/api/types'
// ── barrel 组合器(零行为变更,纯重构) ──
//
@@ -34,10 +34,26 @@ function createStore() {
// - 'all' : 全量拉取
// - 具体 id : 按项目拉取
// 由 Tasks.vue 经 setActiveTaskProject 在 onMounted/watch 更新本变量。
//
// F-260621-02(P1 status 下沉):新增 _activeTaskStatus 追踪当前 status 筛选,数据变更
// 联动刷新时一并下沉到后端 query(保 B-29「store.tasks 反映当前筛选」契约,
// 避免刷新把已选 status 冲掉)。
let _activeTaskProject: string | undefined = undefined
let _activeTaskStatus: string | undefined = undefined
function setActiveTaskProject(projectKey: string | undefined) {
_activeTaskProject = projectKey
}
function setActiveTaskStatus(statusKey: string | undefined) {
_activeTaskStatus = statusKey
}
// 构造当前 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
return query
}
let _dataChangedUnlisten: (() => void) | null = null
@@ -49,9 +65,11 @@ function createStore() {
if (entity === 'project') {
void projectsStore.loadProjects()
} else if (entity === 'task') {
// 无筛选状态(undefined)时不触发,保 B-29 筛选契约;有筛选则按当前 activeProject 拉
if (_activeTaskProject !== undefined) {
void tasksStore.loadTasks(_activeTaskProject === 'all' ? undefined : _activeTaskProject)
// 无筛选状态(_activeTaskProject undefined)时不触发,保 B-29 筛选契约;
// 有筛选则按当前 activeProject + activeStatus 构造 query 下沉后端拉取
const q = buildActiveTaskQuery()
if (q !== undefined) {
void tasksStore.loadTasks(q)
}
} else if (entity === 'idea') {
void ideasStore.loadIdeas()
@@ -126,6 +144,8 @@ function createStore() {
stopDataChangedListener,
// CR-260615-26(R-1): Tasks 视图登记当前 activeProject 筛选,供 listener 按筛选拉取
setActiveTaskProject,
// F-260621-02(P1 status 下沉):Tasks 视图登记当前 status 筛选,供 listener 复用同一筛选拉取
setActiveTaskStatus,
pendingApproval: computed(() => state.pendingApproval),
// computed
stats,