From bc987567aca57355a52e40b4c040c764d0db6214 Mon Sep 17 00:00:00 2001 From: lroyia Date: Wed, 15 Apr 2026 09:50:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=B7=A5=E4=BD=9C=E8=AE=A1?= =?UTF-8?q?=E5=88=92skill?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- skills/work-weekly-report/SKILL.md | 26 +++++++- .../scripts/work-weekly-report.js | 63 +++++++++++++++++-- 2 files changed, 83 insertions(+), 6 deletions(-) diff --git a/skills/work-weekly-report/SKILL.md b/skills/work-weekly-report/SKILL.md index f000fa4..1052187 100644 --- a/skills/work-weekly-report/SKILL.md +++ b/skills/work-weekly-report/SKILL.md @@ -140,7 +140,31 @@ node scripts/work-weekly-report.js update-status --week "2026-W15" --plan-item " --- -### 功能6: 设置周报总结 +### 功能6: 延期计划项 + +将某个计划项的预计完成日期延长到指定日期,并可记录延期原因。 + +**使用示例**: +``` +把任务A延期到下周三 +任务B需要延期到4月20日 +将计划项延长一周 +``` + +**CLI 命令**: +```bash +# 延期计划项 +node scripts/work-weekly-report.js extend-plan --plan-item "uuid" --new-date "2026-04-20" + +# 带延期原因 +node scripts/work-weekly-report.js extend-plan --plan-item "uuid" --new-date "2026-04-22" --reason "等待外部依赖" +``` + +**延期记录**: 每次延期都会记录延期次数和原因,可在周报中查看。 + +--- + +### 功能7: 设置周报总结 为某周添加总结文字。 diff --git a/skills/work-weekly-report/scripts/work-weekly-report.js b/skills/work-weekly-report/scripts/work-weekly-report.js index 91e37d6..ef2bd85 100644 --- a/skills/work-weekly-report/scripts/work-weekly-report.js +++ b/skills/work-weekly-report/scripts/work-weekly-report.js @@ -254,7 +254,7 @@ function getOrCreateWeeklyReport(weekNumber) { /** * 制定/更新周计划 */ -function planWeek(weekNumber, tasks, priority = 'medium') { +function planWeek(weekNumber, tasks, priority = 'medium', expectedDate = null) { const { data, report } = getOrCreateWeeklyReport(weekNumber); const now = getCurrentISO(); @@ -262,7 +262,7 @@ function planWeek(weekNumber, tasks, priority = 'medium') { const planItem = { id: generateUUID(), description: taskDesc, - expectedDate: null, + expectedDate: expectedDate, priority: priority, status: 'pending', createdAt: now, @@ -429,6 +429,34 @@ function updatePlanItemStatus(weekNumber, planItemId, status) { return report; } +/** + * 延期计划项 + * 将计划项的预计完成日期延长到指定日期 + */ +function extendPlanItem(weekNumber, planItemId, newExpectedDate, reason = '') { + const { data, report } = getOrCreateWeeklyReport(weekNumber); + + const planItem = report.plan.find(p => p.id === planItemId); + if (!planItem) { + throw new Error(`未找到计划项: ${planItemId}`); + } + + const oldDate = planItem.expectedDate; + planItem.expectedDate = newExpectedDate; + planItem.updatedAt = getCurrentISO(); + + // 如果传入了延期原因,记录在 extendedReason 字段 + if (reason) { + planItem.extendedReason = reason; + } + + // 增加延期次数统计 + planItem.extendCount = (planItem.extendCount || 0) + 1; + + saveData(data); + return { report, planItem, oldDate, newDate: newExpectedDate }; +} + /** * 设置周报总结 */ @@ -475,7 +503,7 @@ if (require.main === module) { const command = args[0]; // 已知的标志列表 - const FLAGS = ['--week', '--tasks', '--priority', '--date', '--content', '--status', '--hours', '--plan-item', '--format']; + const FLAGS = ['--week', '--tasks', '--priority', '--date', '--content', '--status', '--hours', '--plan-item', '--format', '--expected-date']; function getArgValue(flag) { const index = args.indexOf(flag); @@ -525,11 +553,13 @@ if (require.main === module) { process.exit(1); } const priority = getArgValue('--priority') || 'medium'; - const report = planWeek(week, tasks, priority); + const expectedDate = getArgValue('--expected-date'); + const report = planWeek(week, tasks, priority, expectedDate); console.log(`已在 ${report.weekNumber} 创建 ${tasks.length} 个计划项`); console.log('\n计划项:'); report.plan.slice(-tasks.length).forEach((item, i) => { - console.log(` ${i + 1}. [${item.priority}] ${item.description} (${item.id})`); + const dateStr = item.expectedDate ? ` [预计: ${item.expectedDate}]` : ''; + console.log(` ${i + 1}. [${item.priority}] ${item.description}${dateStr} (${item.id})`); }); break; } @@ -635,6 +665,27 @@ if (require.main === module) { break; } + case 'extend-plan': { + const weekIdentifier = getArgValue('--week') || '本周'; + const planItemId = getArgValue('--plan-item'); + const newDate = getArgValue('--new-date'); + const reason = getArgValue('--reason') || ''; + if (!planItemId || !newDate) { + console.error('错误: 请提供计划项ID (--plan-item) 和新日期 (--new-date YYYY-MM-DD)'); + process.exit(1); + } + const weekNumber = parseWeekIdentifier(weekIdentifier); + const result = extendPlanItem(weekNumber, planItemId, newDate, reason); + const item = result.planItem; + console.log(`已将计划项延期:`); + console.log(` 任务: ${item.description}`); + console.log(` 原定日期: ${result.oldDate || '未设置'}`); + console.log(` 新日期: ${result.newDate}`); + if (reason) console.log(` 延期原因: ${reason}`); + console.log(` 延期次数: ${item.extendCount} 次`); + break; + } + case 'week-info': { const date = getArgValue('--date') || getCurrentDateStr(); const info = getWeekInfo(date); @@ -654,6 +705,7 @@ if (require.main === module) { console.log(' node work-weekly-report.js update-status --plan-item UUID --status STATUS [--week YYYY-Www]'); console.log(' node work-weekly-report.js summary --content "总结" [--week YYYY-Www]'); console.log(' node work-weekly-report.js remove-plan --plan-item UUID [--week YYYY-Www]'); + console.log(' node work-weekly-report.js extend-plan --plan-item UUID --new-date YYYY-MM-DD [--week YYYY-Www] [--reason "原因"]'); console.log(' node work-weekly-report.js week-info [--date YYYY-MM-DD]'); console.log('\n周标识: YYYY-Www, 本周, 上周, 上上周, 下周'); } @@ -674,6 +726,7 @@ module.exports = { updatePlanItemStatus, setSummary, removePlanItem, + extendPlanItem, getWorkdays, parseWeekIdentifier, isWorkday