import { Button, Input, Popup, SafeArea, TextArea, } from "@nutui/nutui-react-taro"; import { DealerPicker, Icon } from "@/components"; import { ScrollView, View } from "@tarojs/components"; import { useEffect, useState } from "react"; interface IExpenseProvisionCreateProps { onFinish?: (expenseProvision: BusinessAPI.ExpenseProvision) => void; visible: boolean; onClose: () => void; editMode?: boolean; expenseProvision?: BusinessAPI.ExpenseProvision; } export default function ExpenseProvisionCreate( props: IExpenseProvisionCreateProps, ) { const { onFinish, visible, onClose, editMode = false, expenseProvision: initialExpenseProvision, } = props; const [expenseProvision, setExpenseProvision] = useState(); // 表单错误状态 const [formErrors, setFormErrors] = useState<{ dealerName?: boolean; provisionAmount?: boolean; remark?: boolean; }>({}); // 初始化表单数据 useEffect(() => { if (visible) { if (editMode && initialExpenseProvision) { // 编辑模式:回填数据 setExpenseProvision(initialExpenseProvision); } else { // 新增模式:清空数据 setExpenseProvision(undefined); } // 清空错误状态 setFormErrors({}); } }, [visible, editMode, initialExpenseProvision]); const validateForm = () => { const errors = { dealerName: !expenseProvision?.dealerName, provisionAmount: !expenseProvision?.provisionAmount || expenseProvision.provisionAmount <= 0, remark: false, // 备注是可选的,不设为错误 }; setFormErrors(errors); // 检查是否有错误 return !Object.values(errors).some((error) => error); }; const saveExpenseProvision = async () => { if (!validateForm()) { return; } if (expenseProvision) { // 编辑模式下保留原有ID,新增模式下生成新ID const finalExpenseProvision: BusinessAPI.ExpenseProvision = { ...expenseProvision, expenseProvisionId: editMode ? initialExpenseProvision?.expenseProvisionId || expenseProvision.expenseProvisionId : expenseProvision.expenseProvisionId || `EP_${Date.now()}`, }; onFinish?.(finalExpenseProvision); } // 重置表单 setExpenseProvision(undefined); setFormErrors({}); onClose(); }; return ( <> { onClose(); }} onOverlayClick={() => { onClose(); }} lockScroll > {/* 编辑模式下客户名称不可修改 */} {editMode ? ( <> 客户名称 {expenseProvision?.dealerName || "未知客户"} ) : ( <> 客户名称 { setExpenseProvision((prev) => { return { ...prev!, dealerName: dealerVO.shortName, }; }); setFormErrors((prev) => ({ ...prev, dealerId: false, })); }} trigger={ {expenseProvision?.dealerName || "请选择客户"} } /> {formErrors.dealerName && ( 请选择客户 )} )} 计提金额 { const num = Number(value); if (!Number.isNaN(num) && num >= 0) { setExpenseProvision((prev) => { return { ...prev!, provisionAmount: num, }; }); // 实时清除金额错误状态 if (num > 0) { setFormErrors((prev) => ({ ...prev, provisionAmount: false, })); } } }} /> {formErrors.provisionAmount && ( 请输入正确的计提金额 )} 备注(可选)