diff --git a/src/pages/Order/List/index.tsx b/src/pages/Order/List/index.tsx index 36fd5cb..af2bbcb 100644 --- a/src/pages/Order/List/index.tsx +++ b/src/pages/Order/List/index.tsx @@ -84,8 +84,8 @@ import dayjs from 'dayjs'; import * as XLSX from 'xlsx'; const ListPage: React.FC = () => { const [file, setFile] = useState(null); - const [csvData, setCsvData] = useState([]); - const [processedData, setProcessedData] = useState([]); + const [csvData, setCsvData] = useState([]); + const [processedData, setProcessedData] = useState([]); const actionRef = useRef(); const [activeKey, setActiveKey] = useState('all'); const [count, setCount] = useState([]); @@ -476,63 +476,63 @@ const ListPage: React.FC = () => { const [selectedRowKeys, setSelectedRowKeys] = useState([]); - /** - * @description 处理文件上传 - */ - const handleFileUpload = (uploadedFile: File) => { - // 检查文件类型 - if (!uploadedFile.name.match(/\.(xlsx)$/)) { - message.error('请上传 xlsx 格式的文件!'); - return false; + /** + * @description 处理文件上传 + */ + const handleFileUpload = (uploadedFile: File) => { + // 检查文件类型 + if (!uploadedFile.name.match(/\.(xlsx)$/)) { + message.error('请上传 xlsx 格式的文件!'); + return false; + } + setFile(uploadedFile); + + const reader = new FileReader(); + // 对于Excel文件,继续使用readAsArrayBuffer + reader.onload = (e) => { + try { + const data = e.target?.result; + // 如果是ArrayBuffer,使用type: 'array'来处理 + const workbook = XLSX.read(data, { type: 'array' }); + const sheetName = workbook.SheetNames[0]; + const worksheet = workbook.Sheets[sheetName]; + const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); + + if (jsonData.length < 2) { + message.error('文件为空或缺少表头!'); + setCsvData([]); + return; + } + // 将数组转换为对象数组 + const headers = jsonData[0] as string[]; + const rows = jsonData.slice(1).map((rowArray: any) => { + const rowData: { [key: string]: any } = {}; + headers.forEach((header, index) => { + rowData[header] = rowArray[index]; + }); + return rowData; + }); + + message.success(`成功解析 ${rows.length} 条数据.`); + setCsvData(rows); + setProcessedData([]); // 清空旧的处理结果 + } catch (error) { + message.error('Excel文件解析失败,请检查文件格式!'); + console.error('Excel Parse Error:', error); + setCsvData([]); } - setFile(uploadedFile); - - const reader = new FileReader(); - // 对于Excel文件,继续使用readAsArrayBuffer - reader.onload = (e) => { - try { - const data = e.target?.result; - // 如果是ArrayBuffer,使用type: 'array'来处理 - const workbook = XLSX.read(data, { type: 'array' }); - const sheetName = workbook.SheetNames[0]; - const worksheet = workbook.Sheets[sheetName]; - const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); - - if (jsonData.length < 2) { - message.error('文件为空或缺少表头!'); - setCsvData([]); - return; - } - // 将数组转换为对象数组 - const headers = jsonData[0] as string[]; - const rows = jsonData.slice(1).map((rowArray: any) => { - const rowData: { [key: string]: any } = {}; - headers.forEach((header, index) => { - rowData[header] = rowArray[index]; - }); - return rowData; - }); - - message.success(`成功解析 ${rows.length} 条数据.`); - setCsvData(rows); - setProcessedData([]); // 清空旧的处理结果 - } catch (error) { - message.error('Excel文件解析失败,请检查文件格式!'); - console.error('Excel Parse Error:', error); - setCsvData([]); - } - }; - reader.readAsArrayBuffer(uploadedFile); - - - reader.onerror = (error) => { - message.error('文件读取失败!'); - console.error('File Read Error:', error); - }; - - return false; // 阻止antd Upload组件的默认上传行为 }; - + reader.readAsArrayBuffer(uploadedFile); + + + reader.onerror = (error) => { + message.error('文件读取失败!'); + console.error('File Read Error:', error); + }; + + return false; // 阻止antd Upload组件的默认上传行为 + }; + return ( @@ -560,42 +560,42 @@ const ListPage: React.FC = () => { }} toolBarRender={() => [ // , - { - const { file, onSuccess, onError } = options; - console.log(file); - const formData = new FormData(); + const { file, onSuccess, onError } = options; + console.log(file); + const formData = new FormData(); formData.append('file', file); - try { + try { const res = await request('/order/import', { method: 'POST', data: formData, requestType: 'form', }); - if (res?.success && res.data) { - // 使用xlsx将JSON数据转换为Excel + if (res?.success && res.data) { + // 使用xlsx将JSON数据转换为Excel const XLSX = require('xlsx'); const worksheet = XLSX.utils.json_to_sheet(res.data); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, 'Orders'); const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); - // 否则按原逻辑处理二进制数据 - const blob = new Blob([excelBuffer], { - type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - }); - const url = URL.createObjectURL(blob); - const a = document.createElement('a'); - a.href = url; - a.download = 'orders.xlsx'; - a.click(); - URL.revokeObjectURL(url); - + // 否则按原逻辑处理二进制数据 + const blob = new Blob([excelBuffer], { + type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = 'orders.xlsx'; + a.click(); + URL.revokeObjectURL(url); + } else { message.error(res.message || '导出失败'); } @@ -606,9 +606,9 @@ const ListPage: React.FC = () => { onError?.(error); } }} - > - - , + > + + , { try { @@ -756,36 +756,36 @@ const Detail: React.FC<{ ) ? [] : [ - , - , - ]), + const { + success, + message: errMsg, + data, + } = await ordercontrollerSyncorderbyid({ + siteId: record.siteId, + orderId: record.externalOrderId, + }); + if (!success) { + throw new Error(errMsg); + } + showSyncResult(data as SyncResultData, '订单'); + tableRef.current?.reload(); + } catch (error: any) { + message.error(error?.message || '同步失败'); + } + }} + > + 同步订单 + , + ]), // ...(['processing', 'pending_reshipment'].includes(record.orderStatus) // ? [ // , @@ -804,152 +804,152 @@ const Detail: React.FC<{ 'pending_refund', ].includes(record.orderStatus) ? [ - , - { - try { - if (!record.id) { - message.error('订单ID不存在'); - return; - } - const { success, message: errMsg } = - await ordercontrollerChangestatus( - { - id: record.id, - }, - { - status: 'after_sale_pending', - }, - ); - if (!success) { - throw new Error(errMsg); - } - tableRef.current?.reload(); - } catch (error: any) { - message.error(error.message); + , + { + try { + if (!record.id) { + message.error('订单ID不存在'); + return; } - }} - > - - , - ] + const { success, message: errMsg } = + await ordercontrollerChangestatus( + { + id: record.id, + }, + { + status: 'after_sale_pending', + }, + ); + if (!success) { + throw new Error(errMsg); + } + tableRef.current?.reload(); + } catch (error: any) { + message.error(error.message); + } + }} + > + + , + ] : []), ...(record.orderStatus === 'after_sale_pending' ? [ - , - { - try { - if (!record.id) { - message.error('订单ID不存在'); - return; - } - const { success, message: errMsg } = - await ordercontrollerCancelorder({ + , + { + try { + if (!record.id) { + message.error('订单ID不存在'); + return; + } + const { success, message: errMsg } = + await ordercontrollerCancelorder({ + id: record.id, + }); + if (!success) { + throw new Error(errMsg); + } + tableRef.current?.reload(); + } catch (error: any) { + message.error(error.message); + } + }} + > + + , + , + { + try { + if (!record.id) { + message.error('订单ID不存在'); + return; + } + const { success, message: errMsg } = + await ordercontrollerRefundorder({ + id: record.id, + }); + if (!success) { + throw new Error(errMsg); + } + tableRef.current?.reload(); + } catch (error: any) { + message.error(error.message); + } + }} + > + + , + , + { + try { + if (!record.id) { + message.error('订单ID不存在'); + return; + } + const { success, message: errMsg } = + await ordercontrollerCompletedorder({ + id: record.id, + }); + if (!success) { + throw new Error(errMsg); + } + tableRef.current?.reload(); + } catch (error: any) { + message.error(error.message); + } + }} + > + + , + , + { + try { + const { success, message: errMsg } = + await ordercontrollerChangestatus( + { id: record.id, - }); - if (!success) { - throw new Error(errMsg); - } - tableRef.current?.reload(); - } catch (error: any) { - message.error(error.message); + }, + { + status: 'pending_reshipment', + }, + ); + if (!success) { + throw new Error(errMsg); } - }} - > - - , - , - { - try { - if (!record.id) { - message.error('订单ID不存在'); - return; - } - const { success, message: errMsg } = - await ordercontrollerRefundorder({ - id: record.id, - }); - if (!success) { - throw new Error(errMsg); - } - tableRef.current?.reload(); - } catch (error: any) { - message.error(error.message); - } - }} - > - - , - , - { - try { - if (!record.id) { - message.error('订单ID不存在'); - return; - } - const { success, message: errMsg } = - await ordercontrollerCompletedorder({ - id: record.id, - }); - if (!success) { - throw new Error(errMsg); - } - tableRef.current?.reload(); - } catch (error: any) { - message.error(error.message); - } - }} - > - - , - , - { - try { - const { success, message: errMsg } = - await ordercontrollerChangestatus( - { - id: record.id, - }, - { - status: 'pending_reshipment', - }, - ); - if (!success) { - throw new Error(errMsg); - } - tableRef.current?.reload(); - } catch (error: any) { - message.error(error.message); - } - }} - > - - , - ] + tableRef.current?.reload(); + } catch (error: any) { + message.error(error.message); + } + }} + > + + , + ] : []), ]} > @@ -1212,31 +1212,31 @@ const Detail: React.FC<{ } actions={ v.state === 'waiting-for-scheduling' || - v.state === 'waiting-for-transit' + v.state === 'waiting-for-transit' ? [ - { - try { - const { success, message: errMsg } = - await logisticscontrollerDelshipment({ - id: v.id, - }); - if (!success) { - throw new Error(errMsg); - } - tableRef.current?.reload(); - initRequest(); - } catch (error: any) { - message.error(error.message); + { + try { + const { success, message: errMsg } = + await logisticscontrollerDelshipment({ + id: v.id, + }); + if (!success) { + throw new Error(errMsg); } - }} - > - - 取消运单 - , - ] + tableRef.current?.reload(); + initRequest(); + } catch (error: any) { + message.error(error.message); + } + }} + > + + 取消运单 + , + ] : [] } > @@ -1381,10 +1381,16 @@ const Shipping: React.FC<{ const [rates, setRates] = useState([]); const [ratesLoading, setRatesLoading] = useState(false); const { message } = App.useApp(); -const [shipmentPlatforms, setShipmentPlatforms] = useState([ + const [shipmentPlatforms, setShipmentPlatforms] = useState([ { label: 'uniuni', value: 'uniuni' }, { label: 'tms.freightwaves', value: 'freightwaves' }, - ]); + ]); + const [courierCompany, setCourierCompany] = useState([ + { label: 'UNIUNI', value: 'UNIUNI' }, + { label: 'PuroYYZ', value: 'PuroYYZ' }, + { label: 'CPYYZ', value: 'CPYYZ' }, + { label: 'UPSYYZ7000NEW', value: 'UPSYYZ7000NEW' }, + ]); return ( { @@ -1436,8 +1442,9 @@ const [shipmentPlatforms, setShipmentPlatforms] = useState([ if (reShipping) data.sales = [{}]; let shipmentInfo = localStorage.getItem('shipmentInfo'); if (shipmentInfo) shipmentInfo = JSON.parse(shipmentInfo); - const a = { + const a = { shipmentPlatform: 'uniuni', + courierCompany: 'UNIUNI', ...data, // payment_method_id: shipmentInfo?.payment_method_id, stockPointId: shipmentInfo?.stockPointId, @@ -1464,7 +1471,7 @@ const [shipmentPlatforms, setShipmentPlatforms] = useState([ }, origin: { name: data?.name, - email_addresses: data?.email, + email_addresses: shipmentInfo?.email_addresses, contact_name: data?.name, phone_number: shipmentInfo?.phone_number, address: { @@ -1497,7 +1504,7 @@ const [shipmentPlatforms, setShipmentPlatforms] = useState([ }, }, }; - return a + return a }} onFinish={async ({ customer_note, @@ -1541,6 +1548,7 @@ const [shipmentPlatforms, setShipmentPlatforms] = useState([ postal_code: details.origin.address.postal_code, address_line_1: details.origin.address.address_line_1, phone_number: details.origin.phone_number, + email_addresses: details.origin.email_addresses, }), ); @@ -1561,17 +1569,25 @@ const [shipmentPlatforms, setShipmentPlatforms] = useState([ } }} > - + - - - + + + + + + - // value && value.length > 0 - // ? Promise.resolve() - // : Promise.reject('至少需要一个商品'), - // }, - // ]} + // rules={[ + // { + // required: true, + // message: '至少需要一个商品', + // validator: (_, value) => + // value && value.length > 0 + // ? Promise.resolve() + // : Promise.reject('至少需要一个商品'), + // }, + // ]} > } > - {/* @@ -2484,7 +2500,7 @@ const CreateOrder: React.FC<{