import React, { useState, useEffect, useMemo } from "react"; import { Form, Input, Select, Button, Space, Card, Typography, message, DatePicker, } from "antd"; import { ArrowLeftOutlined, SaveOutlined, } from "@ant-design/icons"; import { supabase } from "@/config/supabase"; import { useNavigate, useParams, useSearchParams } from "react-router-dom"; import { v4 as uuidv4 } from "uuid"; import TaskList from '@/components/TaskList'; import dayjs from 'dayjs'; import {supabaseService} from '@/hooks/supabaseService' const { Title } = Typography; const TYPE = "task"; export default function TaskForm() { const { id } = useParams(); const [searchParams] = useSearchParams(); const isEdit = searchParams.get("edit") === "true"; const templateId = searchParams.get("templateId"); const isView = id && !isEdit; const [form] = Form.useForm(); const navigate = useNavigate(); const [loading, setLoading] = useState(false); const [customers, setCustomers] = useState([]); const [formValues, setFormValues] = useState({}); const [units, setUnits] = useState([]); const [loadingUnits,setLoadingUnits]=useState(false) const fetchUnits = async () => { setLoadingUnits(true); try { const { data: units } = await supabaseService.select("resources", { filter: { type: { eq: "units" }, "attributes->>template_type": { in: `(${TYPE})` }, }, order: { column: "created_at", ascending: false, }, }); setUnits(units || []); } catch (error) { message.error("获取单位列表失败"); console.error(error); } finally { setLoadingUnits(false); } }; useEffect(() => { fetchUnits(); }, []); const initialValues = { sections: [ { key: uuidv4(), sectionName: "任务类型 1", items: [ { key: uuidv4(), name: "", description: "", timeRange: null, unit: "未开始", }, ], }, ], status: "未开始", timeRange: null, }; // 处理表单值变化 const handleValuesChange = (changedValues, allValues) => { setFormValues(allValues); }; // 获取任务详情 const fetchTaskDetail = async () => { try { setLoading(true); const { data, error } = await supabase .from("resources") .select("*") .eq("id", id) .single(); if (error) throw error; if (data?.attributes) { const formData = { taskName: data.attributes.taskName, customers: data.attributes.customers.map((customer) => customer.id) || [], description: data.attributes.description, sections: data.attributes.sections.map((section) => ({ key: uuidv4(), sectionName: section.sectionName, items: section.items.map((item) => ({ key: uuidv4(), name: item.name, description: item.description || "", timeRange: item.timeRange, unit: item.unit || "未开始", })), })), status: data.attributes.status || "未开始", timeRange: data.attributes.timeRange ? [dayjs(data.attributes.timeRange[0]), dayjs(data.attributes.timeRange[1])] : null, }; form.setFieldsValue(formData); setFormValues(formData); } } catch (error) { console.error("获取任务详情失败:", error); message.error("获取任务详情失败"); } finally { setLoading(false); } }; // 获取模板数据 const fetchTemplateData = async () => { try { setLoading(true); const { data: template, error } = await supabase .from("resources") .select("*") .eq("type", "serviceTemplate") .eq("id", templateId) .single(); if (error) throw error; if (template?.attributes) { const taskData = { taskName: template.attributes.templateName, description: template.attributes.description, sections: template.attributes.sections.map((section) => ({ key: uuidv4(), sectionName: section.sectionName, items: section.items.map((item) => ({ key: uuidv4(), name: item.name, description: item.description, timeRange: null, unit: "未开始", })), })), }; form.setFieldsValue(taskData); setFormValues(taskData); } } catch (error) { console.error("获取模板数据失败:", error); message.error("获取模板数据失败"); } finally { setLoading(false); } }; // 获取客户列表 const fetchCustomers = async () => { try { const { data, error } = await supabase .from("resources") .select("*") .eq("type", "customer"); if (error) throw error; setCustomers(data || []); } catch (error) { console.error("获取客户列表失败:", error); } }; // 保存任务 const onFinish = async (values) => { try { setLoading(true); const taskData = { type: "task", attributes: { taskName: values.taskName, customers: customers .filter(customer => values.customers.includes(customer.id)) .map(customer => ({ id: customer.id, name: customer.attributes.name })), description: values.description, sections: values.sections.map((section) => ({ sectionName: section.sectionName, items: section.items.map((item) => ({ name: item.name, description: item.description, timeRange: item.timeRange, unit: item.unit, })), })), status: values.status, timeRange: values.timeRange ? [ values.timeRange[0].format('YYYY-MM-DD'), values.timeRange[1].format('YYYY-MM-DD') ] : null, }, }; let result; if (id) { result = await supabase .from("resources") .update(taskData) .eq("id", id) .select(); } else { result = await supabase .from("resources") .insert([taskData]) .select(); } if (result.error) throw result.error; message.success("保存成功"); navigate("/company/task"); } catch (error) { console.error("保存失败:", error); message.error("保存失败"); } finally { setLoading(false); } }; useEffect(() => { fetchCustomers(); }, []); useEffect(() => { if (id) { fetchTaskDetail(); } else if (templateId) { fetchTemplateData(); } else { form.setFieldsValue(initialValues); setFormValues(initialValues); } }, [id, templateId]); return (
{id ? (isEdit ? "编辑任务" : "查看任务") : "新建任务"} {id ? isEdit ? "请修改任务信息" : "任务详情" : "请填写任务信息"}
{!isView && ( )}
} >
基本信息 } bordered={false} >
任务名称} rules={[{ required: true, message: "请输入任务名称" }]} > 客户名称} rules={[{ required: true, message: "请选择至少一个客户" }]} > ({ label: unit.attributes.name, value: unit.attributes.name, }))} /> 时间范围} rules={[{ required: true, message: "请选择时间范围" }]} > { if (dates) { form.setFieldValue('timeRange', [ dayjs(dates[0]), dayjs(dates[1]) ]); } else { form.setFieldValue('timeRange', null); } }} />
任务流程 } bordered={false} >
); }