feat(organize): 整理记录按整理方式、媒体库目录、分类筛选,统计给出维度计数

列表与统计新增 action / libraryRootId / category 参数(分类取冻结计划的 classification.category);
统计 facets 按其余条件给出三个维度的可选值与条数(只列非零项),供整理记录的维度按钮列选项。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
This commit is contained in:
rootandClaude Opus 5.5 committed 2026-10-06 17:50:28 +08:00
1 parent ad3bf8926b
commit eb294b0ffa
3 files changed
+86 -1

No files matched your search

+17
View File
@@ -340,6 +340,12 @@ export const OrganizationListQuery = z.object({
attention: z
.union([z.boolean(), z.enum(["true", "false", "1", "0"]).transform((v) => v === "true" || v === "1")])
.optional(),
/** 整理方式(复制 / 移动 / 硬链接 / 原地整理) */
action: z.enum(["copy", "move", "hardlink", "in_place"]).optional(),
/** 目标媒体库目录 */
libraryRootId: Id.optional(),
/** 冻结计划里的二级分类(如「欧美电影」) */
category: z.string().min(1).max(100).optional(),
});
export type OrganizationListQuery = z.infer<typeof OrganizationListQuery>;
@@ -356,6 +362,17 @@ export const OrganizationStats = z.object({
cancelled: NonNegInt,
/** 需要处理(同列表 attention=true 的口径,不受状态筛选影响) */
attention: NonNegInt,
/**
* 筛选维度的可选值与条数(只列非零项):每个维度按其余条件计数(不含本维度自己的条件),
* 供整理记录的维度按钮列选项。libraryRootId 的 value 是媒体库目录 id。
*/
facets: z
.object({
action: z.array(z.object({ value: z.string(), n: NonNegInt })),
libraryRootId: z.array(z.object({ value: z.string(), n: NonNegInt })),
category: z.array(z.object({ value: z.string(), n: NonNegInt })),
})
.optional(),
});
export type OrganizationStats = z.infer<typeof OrganizationStats>;