/** * 文件: MultiAfterSalesModal.tsx * 作者: 阿瑞 * 功能: 多重售后操作模态框组件 * 版本: v2.0.0 - 使用 fetch 替换 axios */ import React, { useEffect, useState } from 'react'; import { Modal, Form, Select, DatePicker, Button, InputNumber, Input, App } from 'antd'; import { IAfterSalesRecord, IPaymentPlatform, IProduct } from '@/models/types'; import dayjs from 'dayjs'; import { useUserInfo } from '@/store/userStore'; import ProductImage from '@/components/product/ProductImage'; import AddProductComponent from '../sale/components/AddProductComponent'; import { CloseOutlined } from '@ant-design/icons'; interface MultiAfterSalesModalProps { visible: boolean; onOk: () => void; onCancel: () => void; record: IAfterSalesRecord | null; // 传递当前的售后记录 type: '退货' | '换货' | '补发' | '补差'; } const { Option } = Select; const MultiAfterSalesModal: React.FC = ({ visible, onOk, onCancel, record, type }) => { const { message } = App.useApp(); // 使用 App.useApp 获取 message 实例 const [form] = Form.useForm(); const [paymentPlatforms, setPaymentPlatforms] = useState([]); const [selectedProducts, setSelectedProducts] = useState([]); const [products, setProducts] = useState([]); const userInfo = useUserInfo(); const [paymentCode, setPaymentCode] = useState(null); //获取收支平台 const fetchPayPlatforms = async (teamId: string) => { try { const response = await fetch(`/api/backstage/payment-platforms?teamId=${teamId}`); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); setPaymentPlatforms(data.platforms || []); } catch (error: unknown) { console.error('加载平台数据失败:', error); message.error('加载平台数据失败'); setPaymentPlatforms([]); } }; // 获取产品数据 const fetchProducts = async (teamId: string) => { try { const response = await fetch(`/api/backstage/products?teamId=${teamId}`); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); setProducts(data.products || []); } catch (error: unknown) { console.error('加载产品数据失败:', error); message.error('加载产品数据失败'); } }; useEffect(() => { form.resetFields(); setSelectedProducts([]); if (record && userInfo.团队?._id) { const teamId = userInfo.团队._id; fetchPayPlatforms(teamId); fetchProducts(teamId); // 加载产品列表 form.setFieldsValue({ 前一次售后: record._id, // 使用当前售后记录的ID作为前一次售后 类型: type, 日期: dayjs(), }); } }, [record, type, userInfo.团队?._id]); const handleOk = async () => { try { const values = await form.validateFields(); if (!record) { message.error('未选择售后记录,无法创建新的售后记录'); return; } const replacementProductIds = selectedProducts.map(product => product._id); let paymentCodeId = null; if (paymentCode) { const response = await fetch('/api/backstage/sales/aftersale/uploadPaymentCode', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ 收款码: paymentCode }), }); if (!response.ok) { throw new Error('收款码上传失败'); } const paymentCodeResponse = await response.json(); paymentCodeId = paymentCodeResponse.paymentCodeId; } const afterSalesData = { 销售记录: record.销售记录._id, 前一次售后: record._id, // 传递前一次售后的 ID 类型: type, 原产品: values.原产品, // 传递原产品的 ID 数组 替换产品: replacementProductIds, // 传递替换产品的 ID 数组 团队: userInfo.团队?._id, 日期: values.日期.toISOString(), 收款码: paymentCodeId, // 添加收款码ID字段 原因: values.原因, // 售后原因 收支类型: values.收支类型, 收支平台: values.收支平台, 收支金额: values.收支金额, 待收: values.待收, 备注: values.备注, }; const response = await fetch('/api/backstage/sales/aftersale', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(afterSalesData), }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } message.success(`${type}操作成功`); onOk(); } catch (error: unknown) { console.error(`${type}操作失败:`, error); message.error(`${type}操作失败`); } }; const [isProductModalVisible, setIsProductModalVisible] = useState(false); // 修改:新增产品成功后的回调函数,更新选中的产品状态 const handleAddProductSuccess = (newProduct: IProduct) => { setSelectedProducts(prevProducts => [...prevProducts, newProduct]); // 更新选中的产品 setIsProductModalVisible(false); // 关闭产品模态框 }; const handleProductSelectChange = (selectedProductIds: string[]) => { const selected = products.filter(product => selectedProductIds.includes(product._id)); setSelectedProducts(selected); }; const renderAdditionalFields = () => { if (type === '换货' || type === '补发') { return (
{selectedProducts.map(product => (
{product.名称}
))}
setIsProductModalVisible(false)} onSuccess={handleAddProductSuccess} />
); } return null; }; const handlePaste = (event: React.ClipboardEvent) => { const items = event.clipboardData.items; for (const item of items) { if (item.type.startsWith('image/')) { const file = item.getAsFile(); if (file) { const reader = new FileReader(); reader.onload = async (e) => { const img = new Image(); img.src = e.target?.result as string; img.onload = async () => { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); const width = img.width / 2; const height = img.height / 2; canvas.width = width; canvas.height = height; ctx?.drawImage(img, 0, 0, width, height); const compressedDataUrl = canvas.toDataURL('image/jpeg', 0.8); setPaymentCode(compressedDataUrl); }; }; reader.readAsDataURL(file); } } } }; return ( 取消 , , ]} width="76vw" style={{ top: 20 }} >

售后信息

售后信息

{renderAdditionalFields()}

收支信息

{paymentCode ? ( <> Payment Code ) : (

粘贴图片到此区域

)}
); }; export default MultiAfterSalesModal;