Skip to content

Commit 1ce8ccc

Browse files
author
延枚
committed
Merge feature/search_workitem_improve: 增强工作项搜索功能
* feature/search_workitem_improve: feat: 增强工作项搜索功能,支持更多筛选条件
2 parents cce5312 + d93d378 commit 1ce8ccc

File tree

3 files changed

+157
-0
lines changed

3 files changed

+157
-0
lines changed

operations/projex/types.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,16 @@ export const SearchWorkitemsSchema = z.object({
299299
updatedBefore: z.string().nullable().optional().describe("Updated not later than, format: YYYY-MM-DD"),
300300
creator: z.string().nullable().optional().describe("Creator user ID, multiple values separated by commas. Special value 'self' can be used to represent the current user"),
301301
assignedTo: z.string().nullable().optional().describe("Assignee user ID, multiple values separated by commas. Special value 'self' can be used to represent the current user"),
302+
sprint: z.string().nullable().optional().describe("Sprint ID, multiple values separated by commas"),
303+
workitemType: z.string().nullable().optional().describe("Work item type ID, multiple values separated by commas"),
304+
statusStage: z.string().nullable().optional().describe("Status stage ID, multiple values separated by commas"),
305+
tag: z.string().nullable().optional().describe("Tag ID, multiple values separated by commas"),
306+
priority: z.string().nullable().optional().describe("Priority ID, multiple values separated by commas"),
307+
subjectDescription: z.string().nullable().optional().describe("Text contained in title or description"),
308+
finishTimeAfter: z.string().nullable().optional().describe("Finish time not earlier than, format: YYYY-MM-DD"),
309+
finishTimeBefore: z.string().nullable().optional().describe("Finish time not later than, format: YYYY-MM-DD"),
310+
updateStatusAtAfter: z.string().nullable().optional().describe("Status update time not earlier than, format: YYYY-MM-DD"),
311+
updateStatusAtBefore: z.string().nullable().optional().describe("Status update time not later than, format: YYYY-MM-DD"),
302312

303313
// Advanced parameters
304314
advancedConditions: z.string().nullable().optional().describe("Advanced filter conditions, JSON format"),

operations/projex/workitem.ts

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,16 @@ export async function searchWorkitemsFunc(
3939
updatedBefore?: string,
4040
creator?: string,
4141
assignedTo?: string,
42+
sprint?: string,
43+
workitemType?: string,
44+
statusStage?: string,
45+
tag?: string,
46+
priority?: string,
47+
subjectDescription?: string,
48+
finishTimeAfter?: string,
49+
finishTimeBefore?: string,
50+
updateStatusAtAfter?: string,
51+
updateStatusAtBefore?: string,
4252
advancedConditions?: string,
4353
orderBy: string = "gmtCreate",
4454
includeDetails: boolean = false // 新增参数:是否自动补充缺失的description等详细信息
@@ -83,6 +93,16 @@ export async function searchWorkitemsFunc(
8393
updatedBefore,
8494
creator: finalCreator,
8595
assignedTo: finalAssignedTo,
96+
sprint,
97+
workitemType,
98+
statusStage,
99+
tag,
100+
priority,
101+
subjectDescription,
102+
finishTimeAfter,
103+
finishTimeBefore,
104+
updateStatusAtAfter,
105+
updateStatusAtBefore,
86106
advancedConditions
87107
});
88108

@@ -198,6 +218,16 @@ function buildWorkitemConditions(args: {
198218
updatedBefore?: string;
199219
creator?: string;
200220
assignedTo?: string;
221+
sprint?: string;
222+
workitemType?: string;
223+
statusStage?: string;
224+
tag?: string;
225+
priority?: string;
226+
subjectDescription?: string;
227+
finishTimeAfter?: string;
228+
finishTimeBefore?: string;
229+
updateStatusAtAfter?: string;
230+
updateStatusAtBefore?: string;
201231
advancedConditions?: string;
202232
}): string | undefined {
203233

@@ -286,6 +316,113 @@ function buildWorkitemConditions(args: {
286316
});
287317
}
288318

319+
if (args.sprint) {
320+
const sprintValues = args.sprint.split(",");
321+
const values = sprintValues.map(v => v.trim());
322+
323+
filterConditions.push({
324+
className: "sprint",
325+
fieldIdentifier: "sprint",
326+
format: "list",
327+
operator: "CONTAINS",
328+
toValue: null,
329+
value: values,
330+
});
331+
}
332+
333+
if (args.workitemType) {
334+
const workitemTypeValues = args.workitemType.split(",");
335+
const values = workitemTypeValues.map(v => v.trim());
336+
337+
filterConditions.push({
338+
className: "workitemType",
339+
fieldIdentifier: "workitemType",
340+
format: "list",
341+
operator: "CONTAINS",
342+
toValue: null,
343+
value: values,
344+
});
345+
}
346+
347+
if (args.statusStage) {
348+
const statusStageValues = args.statusStage.split(",");
349+
const values = statusStageValues.map(v => v.trim());
350+
351+
filterConditions.push({
352+
className: "statusStage",
353+
fieldIdentifier: "statusStage",
354+
format: "list",
355+
operator: "CONTAINS",
356+
toValue: null,
357+
value: values,
358+
});
359+
}
360+
361+
if (args.tag) {
362+
const tagValues = args.tag.split(",");
363+
const values = tagValues.map(v => v.trim());
364+
365+
filterConditions.push({
366+
className: "tag",
367+
fieldIdentifier: "tag",
368+
format: "multiList",
369+
operator: "CONTAINS",
370+
toValue: null,
371+
value: values,
372+
});
373+
}
374+
375+
if (args.priority) {
376+
const priorityValues = args.priority.split(",");
377+
const values = priorityValues.map(v => v.trim());
378+
379+
filterConditions.push({
380+
className: "option",
381+
fieldIdentifier: "priority",
382+
format: "list",
383+
operator: "CONTAINS",
384+
toValue: null,
385+
value: values,
386+
});
387+
}
388+
389+
if (args.subjectDescription) {
390+
filterConditions.push({
391+
className: "string",
392+
fieldIdentifier: "subject-description",
393+
format: "input",
394+
operator: "CONTAINS",
395+
toValue: null,
396+
value: [args.subjectDescription],
397+
});
398+
}
399+
400+
if (args.finishTimeAfter) {
401+
const finishTimeBefore = args.finishTimeBefore ? `${args.finishTimeBefore} 23:59:59` : null;
402+
403+
filterConditions.push({
404+
className: "date",
405+
fieldIdentifier: "finishTime",
406+
format: "input",
407+
operator: "BETWEEN",
408+
toValue: finishTimeBefore,
409+
value: [`${args.finishTimeAfter} 00:00:00`],
410+
});
411+
}
412+
413+
if (args.updateStatusAtAfter) {
414+
const updateStatusAtBefore = args.updateStatusAtBefore ? `${args.updateStatusAtBefore} 23:59:59` : null;
415+
416+
filterConditions.push({
417+
className: "date",
418+
fieldIdentifier: "updateStatusAt",
419+
format: "input",
420+
operator: "BETWEEN",
421+
toValue: updateStatusAtBefore,
422+
value: [`${args.updateStatusAtAfter} 00:00:00`],
423+
});
424+
}
425+
289426
if (filterConditions.length === 0) {
290427
return undefined;
291428
}

tool-handlers/project-management.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,16 @@ export const handleProjectManagementTools = async (request: any) => {
139139
args.updatedBefore ?? undefined,
140140
args.creator ?? undefined,
141141
args.assignedTo ?? undefined,
142+
args.sprint ?? undefined,
143+
args.workitemType ?? undefined,
144+
args.statusStage ?? undefined,
145+
args.tag ?? undefined,
146+
args.priority ?? undefined,
147+
args.subjectDescription ?? undefined,
148+
args.finishTimeAfter ?? undefined,
149+
args.finishTimeBefore ?? undefined,
150+
args.updateStatusAtAfter ?? undefined,
151+
args.updateStatusAtBefore ?? undefined,
142152
args.advancedConditions ?? undefined,
143153
args.orderBy ?? "gmtCreate",
144154
args.includeDetails ?? false

0 commit comments

Comments
 (0)