'use client'; import { create } from 'zustand'; import type { VersionPlan, PlanType } from '@/lib/version-plan'; import { loadServerData, saveServerData } from '@/lib/server-data'; import { getPlanCompletionState } from '@/lib/version-plan-workflow'; import type { PlanResultPayload } from '@/lib/version-plan-workflow'; const MOCK_PLANS: VersionPlan[] = []; function saveStored(plans: VersionPlan[]) { saveServerData('version-plans', plans).catch(() => {}); } async function loadStored(): Promise { try { return await loadServerData('version-plans'); } catch {} return null; } interface VersionPlanState { plans: VersionPlan[]; fetchPlans: () => Promise; createPlan: (data: Omit) => void; updatePlan: (id: string, data: Partial) => void; completePlan: (id: string, result: PlanResultPayload) => { ok: boolean; message?: string }; deletePlan: (id: string) => void; } export const useVersionPlanStore = create((set, get) => ({ plans: MOCK_PLANS, fetchPlans: async () => { const cached = await loadStored(); if (cached) set({ plans: cached }); }, createPlan: (data) => { const plan: VersionPlan = { ...data, id: `plan-${Date.now()}`, createdAt: new Date().toISOString().slice(0, 10) }; const plans = [...get().plans, plan]; set({ plans }); saveStored(plans); }, updatePlan: (id, data) => { const now = new Date().toISOString(); const plans = get().plans.map((p) => { if (p.id !== id) return p; const patch = { ...data }; if (patch.status === 'in_progress' && !p.actualStartAt) { (patch as any).actualStartAt = now; } if (patch.status === 'completed' && !p.completedAt) { (patch as any).completedAt = now; } return { ...p, ...patch }; }); set({ plans }); saveStored(plans); }, completePlan: (id, result) => { let response: { ok: boolean; message?: string } = { ok: false, message: '计划不存在' }; const plans = get().plans.map((p) => { if (p.id !== id) return p; const next = { ...p, ...result, status: 'completed' as const, completedAt: new Date().toISOString() }; const state = getPlanCompletionState(next); if (!state.canComplete) { response = { ok: false, message: state.missingReasons.join('、') || '计划未满足完成条件' }; return p; } response = { ok: true }; return next; }); set({ plans }); saveStored(plans); return response; }, deletePlan: (id) => { const plans = get().plans.filter((p) => p.id !== id); set({ plans }); saveStored(plans); }, }));