import React, { useState, useEffect } from 'react'; import { Card, Form, Input, Select, Radio, Button, message, Row, Col, Divider, Space, Typography, Spin, Table, Popconfirm, Modal, } from 'antd'; import { history, useLocation, useIntl, connect, FormattedMessage } from 'umi'; import type { ConnectProps, Dispatch } from 'umi'; import { ArrowLeftOutlined, SaveOutlined, PlusOutlined, DeleteOutlined } from '@ant-design/icons'; import CategorySelector from '@/components/CategorySelector'; import type { BreadcrumbState } from '@/models/breadcrumb'; import { AnnualTemplateStatus, AnnualTemplateStatusText } from '@/dicts/supplierAnnualDict'; import { addAnnualTemplate, updateAnnualTemplate, getAnnualTemplateDetail, getAllAnnualTemplates, } from '@/servers/api/supplierAnnual'; import styles from './supplierAnnualTemplateManage.less'; const { Option } = Select; interface LocationState { isEdit?: boolean; editData?: supplierAnnualTemplateManage.TemplateRecord; } // 模板记录类型 - 使用实际API接口类型 const { Title } = Typography; // 品类限制类型常量 const CategoryLimitationType = { UNIVERSAL: '0', // 不限 LIMITED: '1', // 限制 }; // 是否星号项常量 const StarOptions = { YES: '1', NO: '0', }; interface PageProps extends ConnectProps { breadcrumb: BreadcrumbState; // dva model状态 dispatch: Dispatch; // dva dispatch方法 } const SupplierAnnualTemplateManageAdd: React.FC = ({ breadcrumb, dispatch }) => { const intl = useIntl(); const [form] = Form.useForm(); const [loading, setLoading] = useState(false); const [isEdit, setIsEdit] = useState(false); const [templateDetail, setTemplateDetail] = useState(null); const [templateList, setTemplateList] = useState( [], ); const [indicatorList, setIndicatorList] = useState( [], ); // 获取路由传递的数据 const location = useLocation(); // 获取所有模板列表 const fetchTemplateList = async () => { try { setLoading(true); const res = await getAllAnnualTemplates({ status: '1' }); if (res.success && res.data) { // 如果是修改,需要过滤掉自己 if (location.state?.editData) { setTemplateList( res.data.filter( (template: supplierAnnualTemplateManage.TemplateRecord) => template.id !== location.state.editData?.id, ), ); } else { setTemplateList(res.data); } } else { message.error( res.message || intl.formatMessage({ id: 'supplierAnnualTemplateManage.list.getListFailed' }), ); } setLoading(false); } catch (error) { console.error('获取模板列表失败:', error); message.error(intl.formatMessage({ id: 'supplierAnnualTemplateManage.list.getListFailed' })); setLoading(false); } }; // 获取模板详情 const fetchTemplateDetail = async (templateId: string) => { try { setLoading(true); const res = await getAnnualTemplateDetail(templateId); if (res.success && res.data) { setTemplateDetail(res.data); // 设置表单数据 form.setFieldsValue({ templateName: res.data.templateName, categoryLimitation: res.data.categoryLimitation, categoryId: res.data.categoryId, status: res.data.status, copyTemplateId: res.data.templateType, }); // 设置指标数据 if (res.data.indicatorList && res.data.indicatorList.length > 0) { setIndicatorList(res.data.indicatorList); } } else { message.error( res.message || intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.getDetailFailed' }), ); } setLoading(false); } catch (error) { console.error('获取模板详情失败:', error); message.error(intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.getDetailFailed' })); setLoading(false); } }; useEffect(() => { if (location.state?.editData?.id && dispatch) { dispatch({ type: 'breadcrumb/updateBreadcrumbName', payload: intl.formatMessage({ id: "supplierAnnualTemplateManage.add.edit" }), }); } // 组件卸载时重置面包屑 return () => { dispatch({ type: 'breadcrumb/resetBreadcrumb', }); }; }, [dispatch, intl, location]); // 初始化编辑数据 useEffect(() => { // 获取所有模板列表 fetchTemplateList(); // 如果是编辑模式,加载编辑数据 if (location.state?.isEdit && location.state?.editData) { setIsEdit(true); // 获取模板详情 if (location.state.editData.id) { fetchTemplateDetail(location.state.editData.id); } } else { // 非编辑模式,默认添加一条空指标 const newIndicator: supplierAnnualTemplateManage.IndicatorItem = { orderBy: '1', itemName: '', isStar: StarOptions.NO, }; setIndicatorList([newIndicator]); } }, []); // 处理返回 const handleBack = () => { history.goBack(); }; // 实际提交数据的函数 const submitFormData = async (submitData: supplierAnnualTemplateManage.AddTemplateRequest) => { setLoading(true); try { // 调用API接口 let res; if (isEdit) { res = await updateAnnualTemplate(submitData); } else { res = await addAnnualTemplate(submitData); } if (res && res.success) { message.success( isEdit ? intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.submitSuccess' }) : intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.saveSuccess' }), ); history.goBack(); } else { message.error( res?.message || (isEdit ? intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.submitFailed' }) : intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.saveFailed' })), ); } } catch (error) { console.error('提交失败:', error); message.error( isEdit ? intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.submitFailed' }) : intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.saveFailed' }), ); } finally { setLoading(false); } }; // 处理表单提交前的验证 const handleSubmit = async (values: any) => { // 检查指标列表 if (!indicatorList || indicatorList.length === 0) { message.error( intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.atLeastOneIndicator' }), ); return; } // 检查指标名称不能为空 const emptyNameIndex = indicatorList.findIndex((item) => !item.itemName); if (emptyNameIndex !== -1) { message.error( intl.formatMessage( { id: 'supplierAnnualTemplateManage.add.indicatorNameRequired' }, { index: emptyNameIndex + 1 }, ), ); return; } // 准备提交数据 const submitData: supplierAnnualTemplateManage.AddTemplateRequest = { ...values, indicatorList, templateType: values.copyTemplateId || '1', // 默认类型 }; // 如果是编辑模式,添加ID if (isEdit && templateDetail) { submitData.id = templateDetail.id; } // 显示确认弹框 Modal.confirm({ title: intl.formatMessage({ id: 'supplierAnnualTemplateManage.common.confirm' }), content: isEdit ? intl.formatMessage({ id: 'supplierAnnualTemplateManage.modal.enableConfirmContent' }) : intl.formatMessage({ id: 'supplierAnnualTemplateManage.modal.disableConfirmContent' }), okText: intl.formatMessage({ id: 'supplierAnnualTemplateManage.common.confirm' }), cancelText: intl.formatMessage({ id: 'supplierAnnualTemplateManage.common.cancel' }), onOk: async () => { await submitFormData(submitData); }, }); }; // 处理模板选择 const handleTemplateSelect = async (templateId: string) => { // 如果是新建模式,并且选择了模板,获取模板详情作为基础数据 if (!isEdit && templateId) { try { setLoading(true); const res = await getAnnualTemplateDetail(templateId); if (res.success && res.data) { // 设置品类限制和品类信息 form.setFieldsValue({ categoryLimitation: res.data.categoryLimitation, categoryId: res.data.categoryId, }); // 复制指标列表 if (res.data.indicatorList && res.data.indicatorList.length > 0) { const copiedList = JSON.parse(JSON.stringify(res.data.indicatorList)).map( (item: any) => { // 删除id,防止ID冲突 delete item.id; return item; }, ); setIndicatorList(copiedList); } } else { message.error( res.message || intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.getDetailFailed' }), ); } setLoading(false); } catch (error) { console.error('获取模板详情失败:', error); message.error( intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.getDetailFailed' }), ); setLoading(false); } } }; // 处理添加指标 const handleAddIndicator = () => { const newIndicator: supplierAnnualTemplateManage.IndicatorItem = { orderBy: String(indicatorList.length + 1), itemName: '', isStar: StarOptions.NO, }; setIndicatorList([...indicatorList, newIndicator]); }; // 处理删除指标 const handleDeleteIndicator = (index: number) => { const newList = [...indicatorList]; newList.splice(index, 1); // 更新序号 const updatedList = newList.map((item, idx) => ({ ...item, orderBy: String(idx + 1), })); setIndicatorList(updatedList); }; // 处理指标项修改 const handleIndicatorChange = (index: number, key: string, value: string) => { const newList = [...indicatorList]; newList[index][key] = value; setIndicatorList(newList); }; // 指标表格列定义 const columns = [ { title: intl.formatMessage({ id: 'supplierAnnualTemplateManage.list.serialNumber' }), dataIndex: 'orderBy', key: 'orderBy', width: 80, render: (_: string, __: any, index: number) => index + 1, }, { title: intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.checkItem' }), dataIndex: 'itemName', key: 'itemName', render: (text: string, record: supplierAnnualTemplateManage.IndicatorItem, index: number) => ( handleIndicatorChange(index, 'itemName', e.target.value)} placeholder={`${intl.formatMessage({ id: 'supplierAnnualTemplateManage.common.pleaseInput', })}${intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.checkItem' })}`} /> ), }, { title: intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.starItem' }), dataIndex: 'isStar', key: 'isStar', width: 120, render: (text: string, record: supplierAnnualTemplateManage.IndicatorItem, index: number) => ( ), }, { title: intl.formatMessage({ id: 'supplierAnnualTemplateManage.list.operation' }), key: 'action', width: 120, render: (_: any, __: supplierAnnualTemplateManage.IndicatorItem, index: number) => ( {index === indicatorList.length - 1 && (
{intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.categoryLimitationUniversal', })} {intl.formatMessage({ id: 'supplierAnnualTemplateManage.add.categoryLimitationLimited', })} prevValues.categoryLimitation !== currentValues.categoryLimitation } > {({ getFieldValue }) => { const categoryLimitation = getFieldValue('categoryLimitation'); return categoryLimitation === CategoryLimitationType.LIMITED ? ( ) : null; }} {AnnualTemplateStatusText[AnnualTemplateStatus.DRAFT]} {AnnualTemplateStatusText[AnnualTemplateStatus.ENABLED]} {AnnualTemplateStatusText[AnnualTemplateStatus.DISABLED]}
); }; // export default SupplierAnnualTemplateManageAdd; // 将dva model中的状态映射到组件props export default connect(({ breadcrumb }: { breadcrumb: BreadcrumbState }) => ({ breadcrumb, }))(SupplierAnnualTemplateManageAdd);