fix: force dynamic for meeting page

This commit is contained in:
李超14pro
2026-01-25 21:55:29 +08:00
commit e3e5e89df6
112 changed files with 19073 additions and 0 deletions

284
app/api/seed/route.ts Normal file
View File

@@ -0,0 +1,284 @@
export const dynamic = 'force-dynamic';
import { NextResponse } from 'next/server';
import { supabase } from '@/lib/supabase';
function addDays(date: Date, days: number): string {
const result = new Date(date);
result.setDate(result.getDate() + days);
return result.toISOString().split('T')[0];
}
export async function POST() {
const today = new Date();
const todayStr = today.toISOString().split('T')[0];
const ownerUser = {
name: '老板',
role: 'owner' as const,
avatar_url: null,
};
const pmUser = {
name: '张项目经理',
role: 'pm' as const,
avatar_url: null,
};
const memberUser = {
name: '李工程师',
role: 'member' as const,
avatar_url: null,
};
const { data: users, error: usersError } = await supabase
.from('users')
.insert([ownerUser, pmUser, memberUser])
.select();
if (usersError || !users) {
return NextResponse.json({ error: usersError?.message || '创建用户失败' }, { status: 500 });
}
const [owner, pm, member] = users;
const project1 = {
name: '产品升级项目',
description: '核心产品功能升级与优化',
owner_id: owner.id,
pm_id: pm.id,
project_type: '产品研发',
status: 'green' as const,
};
const project2 = {
name: '市场拓展计划',
description: '新市场开拓与客户获取',
owner_id: owner.id,
pm_id: pm.id,
project_type: '市场营销',
status: 'yellow' as const,
};
const { data: projects, error: projectsError } = await supabase
.from('projects')
.insert([project1, project2])
.select();
if (projectsError || !projects) {
return NextResponse.json({ error: projectsError?.message || '创建项目失败' }, { status: 500 });
}
const [proj1, proj2] = projects;
await supabase.from('project_members').insert([
{ project_id: proj1.id, user_id: owner.id },
{ project_id: proj1.id, user_id: pm.id },
{ project_id: proj1.id, user_id: member.id },
{ project_id: proj2.id, user_id: owner.id },
{ project_id: proj2.id, user_id: pm.id },
]);
const objective1 = {
project_id: proj1.id,
title: '提升产品用户体验和性能',
description: '通过优化核心功能,提升用户满意度和系统性能',
period_start: addDays(today, -15),
period_end: addDays(today, 15),
created_by: owner.id,
};
const { data: objectives, error: objectivesError } = await supabase
.from('objectives')
.insert([objective1])
.select();
if (objectivesError || !objectives) {
return NextResponse.json({ error: objectivesError?.message || '创建目标失败' }, { status: 500 });
}
const [obj1] = objectives;
const krs = [
{
project_id: proj1.id,
objective_id: obj1.id,
period_type: '1w' as const,
period_name: '本周',
period_start: addDays(today, -3),
period_end: addDays(today, 4),
title: '完成首页加载速度优化',
metric_name: '页面加载时间',
unit: '秒',
direction: 'decrease' as const,
target_value: 2,
current_value: 2.8,
owner_user_id: member.id,
confidence: 85,
status: 'green' as const,
reason_code: null,
note: null,
need_owner_help: false,
},
{
project_id: proj1.id,
objective_id: obj1.id,
period_type: '3d' as const,
period_name: '紧急任务',
period_start: todayStr,
period_end: addDays(today, 3),
title: '修复关键Bug',
metric_name: 'Bug修复数',
unit: '个',
direction: 'increase' as const,
target_value: 5,
current_value: 2,
owner_user_id: member.id,
confidence: 70,
status: 'yellow' as const,
reason_code: 'RESOURCE' as const,
note: '需要更多测试资源',
},
{
project_id: proj1.id,
objective_id: obj1.id,
period_type: '2w' as const,
period_name: '双周迭代',
period_start: addDays(today, -7),
period_end: addDays(today, 7),
title: '提升用户满意度评分',
metric_name: 'NPS评分',
unit: '分',
direction: 'increase' as const,
target_value: 50,
current_value: 35,
owner_user_id: pm.id,
confidence: 60,
status: 'yellow' as const,
reason_code: 'DEPENDENCY' as const,
note: '依赖功能还未上线',
need_owner_help: false,
},
{
project_id: proj2.id,
objective_id: null,
period_type: 'monthly' as const,
period_name: '月度目标',
period_start: addDays(today, -10),
period_end: addDays(today, 20),
title: '新客户获取',
metric_name: '新签客户数',
unit: '家',
direction: 'increase' as const,
target_value: 10,
current_value: 3,
owner_user_id: pm.id,
confidence: 45,
status: 'red' as const,
reason_code: 'EXECUTION' as const,
note: '市场推广效果不及预期',
need_owner_help: true,
},
];
const { data: krsData, error: krsError } = await supabase
.from('krs')
.insert(krs)
.select();
if (krsError || !krsData) {
return NextResponse.json({ error: krsError?.message || '创建KR失败' }, { status: 500 });
}
const checkins = krsData.flatMap((kr) => {
const baseCheckins = [];
for (let i = 0; i < 20; i++) {
const checkinDate = addDays(today, -i - 1);
const progressMultiplier = (20 - i) / 21;
baseCheckins.push({
kr_id: kr.id,
project_id: kr.project_id,
user_id: kr.owner_user_id,
date: checkinDate,
current_value: kr.current_value * progressMultiplier,
delta_value: kr.current_value * 0.1,
confidence: kr.confidence + (i * 5),
status_snapshot: i === 0 ? kr.status : 'green',
reason_code: i === 0 ? kr.reason_code : null,
note: i === 0 ? `进度更新 - ${kr.title}` : null,
});
}
return baseCheckins;
});
await supabase.from('checkins').insert(checkins);
const meeting = {
project_id: proj1.id,
period_start: addDays(today, -7),
period_end: addDays(today, -1),
summary: `本周期完成情况总结:
- 页面加载优化进展顺利,预计可按时完成
- Bug修复进度略有滞后,需要协调测试资源
- 用户满意度提升依赖新功能上线
完成率:约65%`,
decisions: `1. 协调测试团队支援Bug修复
2. 推动依赖功能优先上线
3. 下周进行用户回访收集反馈`,
risks: `- 测试资源紧张可能影响交付质量
- 依赖功能延期风险`,
next_period_commitments: `- 完成所有关键Bug修复
- 页面加载时间降至2秒以内
- 收集至少20份用户反馈`,
created_by: pm.id,
};
await supabase.from('meetings').insert([meeting]);
const metrics = [
{ name: '页面加载时间', unit: '秒', direction: 'decrease' as const, category: '技术性能' },
{ name: 'Bug修复数', unit: '个', direction: 'increase' as const, category: '质量' },
{ name: 'NPS评分', unit: '分', direction: 'increase' as const, category: '用户体验' },
{ name: '新签客户数', unit: '家', direction: 'increase' as const, category: '业务' },
{ name: '活跃用户数', unit: '人', direction: 'increase' as const, category: '业务' },
{ name: '客户流失率', unit: '%', direction: 'decrease' as const, category: '业务' },
{ name: '代码覆盖率', unit: '%', direction: 'increase' as const, category: '质量' },
{ name: '响应时间', unit: 'ms', direction: 'decrease' as const, category: '技术性能' },
];
await supabase.from('metrics').insert(metrics);
const templates = [
{
name: '产品迭代模板',
description: '适用于产品功能迭代的KR模板',
project_type: '产品研发',
tags: ['产品', '迭代', '功能'],
items: [
{ title: '功能上线', metricName: '功能完成数', unit: '个', direction: 'increase', targetValue: 3 },
{ title: '性能优化', metricName: '响应时间', unit: 'ms', direction: 'decrease', targetValue: 200 },
{ title: '质量保障', metricName: 'Bug数', unit: '个', direction: 'decrease', targetValue: 5 },
],
},
{
name: '市场拓展模板',
description: '适用于市场营销项目的KR模板',
project_type: '市场营销',
tags: ['市场', '营销', '客户'],
items: [
{ title: '客户获取', metricName: '新客户数', unit: '家', direction: 'increase', targetValue: 10 },
{ title: '线索转化', metricName: '转化率', unit: '%', direction: 'increase', targetValue: 30 },
{ title: '客户留存', metricName: '续约率', unit: '%', direction: 'increase', targetValue: 85 },
],
},
];
await supabase.from('templates').insert(templates);
return NextResponse.json({
success: true,
ownerId: owner.id,
message: '演示数据已成功创建',
});
}