// 任务模块: 保留选项的可见性过滤 (T-FL-*) // 前端 src/pages/task/date.js 有一份同口径实现, 用于即时过滤; 后端用于统计/兜底 import { isVisibleByRetention } from './date.js' /** * 按"任务所属列"的保留选项过滤任务列表 (T-FL-11) * @param {object[]} tasks 任务(需含 status / doneAt / columnId) * @param {object[]} columns 列(需含 id / retention) */ export function filterVisible(tasks, columns, now = new Date()) { const retentionById = new Map((columns || []).map((c) => [c.id, c.retention || 'forever'])) return (tasks || []).filter((t) => { const opt = retentionById.get(t.columnId) || 'forever' return isVisibleByRetention(t, opt, now) }) } /** 单条判定, 供详情接口复用 */ export function isTaskVisible(task, columns, now = new Date()) { const col = (columns || []).find((c) => c.id === task.columnId) return isVisibleByRetention(task, col?.retention || 'forever', now) } /** 列内计数: 过滤后条数 (T-FL-14 计数与展示同源) */ export function countByColumn(tasks, columns, now = new Date()) { const visible = filterVisible(tasks, columns, now) const out = {} for (const c of columns || []) out[c.id] = 0 for (const t of visible) out[t.columnId] = (out[t.columnId] || 0) + 1 return out }