import React, { useState, useEffect, useCallback } from 'react'; import { Modal, Form, Input, DatePicker, InputNumber, Select, Space, message } from 'antd'; import dayjs from 'dayjs'; import apiClient from '../../utils/request'; import useFormDraft from '../../hooks/useFormDraft'; interface ContractCreateModalProps { visible: boolean; projectId: number; projectName: string; onCancel: () => void; onSuccess: () => void; } const ContractCreateModal: React.FC = ({ visible, projectId, projectName, onCancel, onSuccess }) => { const [form] = Form.useForm(); const [contractAmount, setContractAmount] = useState(0); // 表单草稿保护 const { save: saveDraft, restore: restoreDraft, clear: clearDraft, hasDraft } = useFormDraft({ form, storageKey: 'contract_create', }) const handleFormChange = useCallback(() => { saveDraft() }, [saveDraft]) // 生成默认的合同编号(包含时间戳确保唯一性) const today = dayjs(); const dateStr = today.format('YYYYMMDD'); const timeStr = today.format('HHmmss'); const defaultContractCode = `CONTRACT-${dateStr}-${timeStr}`; useEffect(() => { if (visible) { form.setFieldsValue({ contract_code: defaultContractCode, project_name: projectName, contract_method: 'lump_sum', currency: 'CNY', contract_amount: 0, contract_period: 180 }); setContractAmount(0); } }, [visible, form, projectName]); // 处理工期变化 const handlePeriodChange = (value: number) => { // 只需要设置工期天数,不需要计算开始和结束日期 }; // 提交表单 const handleSubmit = async (values: any) => { // 构建提交数据(简化版) const submitData = { contract_code: values.contract_code, project_name: values.project_name, contract_method: values.contract_method || 'lump_sum', currency: values.currency || 'CNY', contract_amount: values.contract_amount || 0, contract_period: values.contract_period || 180, warranty_deposit_percentage: 5, // 默认5% warranty_period: 12, // 默认12个月 // 其他字段留空,后续在项目管理中补充 project_overview: '', other_requirements: '', contract_file: null, payment_nodes: [], unit_price_items: [] }; try { const res = await apiClient.put(`/budget-projects/${projectId}/sign`, submitData, { headers: { 'x-user-role': 'admin' // 签约操作需要管理员权限 } }); if (res.data.success) { message.success('签约成功,项目已自动创建'); clearDraft() onSuccess(); onCancel(); } else { message.error(res.data.message || '操作失败'); } } catch (error: any) { console.error('签约失败:', error); console.error('错误响应:', error.response); const errorMessage = error.response?.data?.message || error.message || '操作失败'; message.error(errorMessage); } }; return ( form.submit()} onCancel={() => { if (form.isFieldsTouched()) { Modal.confirm({ title: '确认关闭', content: '表单数据尚未保存,关闭后可通过草稿恢复。确定关闭吗?', okText: '关闭', cancelText: '继续编辑', onOk: () => { saveDraft() onCancel() }, }) } else { onCancel() } }} width={600} okText="确认签约" cancelText="取消" maskClosable={false} >
{/* 基本信息 */} `¥ ${value}`} parser={(value) => value.replace(/¥\s?|(,*)/g, '')} onChange={(value) => setContractAmount(value || 0)} /> {/* 工期 */}

注:此为快速签约流程,仅录入基本信息。详细的合同信息可在项目管理中补充。

); }; export default ContractCreateModal;