import React, { useEffect, useRef, useState } from 'react'; import { Button, Descriptions, Drawer, message, Popconfirm, Space, Table, Tag, Typography, Image, } from 'antd'; import type { TableProps } from 'antd'; import XinTable from '@/components/XinTable'; import type { XinTableColumn, XinTableInstance, XinTableProps, } from '@/components/XinTable/typings.ts'; import type IStoreOrder from '@/domain/iStoreOrder.ts'; import type { IStoreOrderItem } from '@/domain/iStoreOrder.ts'; import { STORE_ORDER_STATUS_MAP } from '@/domain/iStoreOrder.ts'; import { getStoreOrder, updateOrderStatus } from '@/api/order/store.ts'; import { getStoreOptions } from '@/api/customer/store.ts'; import type IStore from '@/domain/iStore.ts'; import AuthButton from '@/components/AuthButton'; const { Title, Text } = Typography; /** * 状态流转合法路径:待汇总→配送中/取消;已汇总→配送中;配送中→已完成 */ const NEXT_STATUS: Record = { 0: [ { status: 2, label: '开始配送' }, { status: 9, label: '取消订单', danger: true }, ], 1: [{ status: 2, label: '开始配送' }], 2: [{ status: 3, label: '完成订单' }], }; /** * 门店订单管理(只读 + 状态流转,订单由小程序端创建) */ const StoreOrderPage: React.FC = () => { const tableRef = useRef>(null); const [stores, setStores] = useState([]); const [detailOpen, setDetailOpen] = useState(false); const [detail, setDetail] = useState(null); const [detailLoading, setDetailLoading] = useState(false); useEffect(() => { getStoreOptions().then((res) => setStores(res.data.data ?? [])); }, []); const openDetail = async (id: number) => { setDetailOpen(true); setDetailLoading(true); try { const res = await getStoreOrder(id); setDetail(res.data.data ?? null); } finally { setDetailLoading(false); } }; const handleStatusChange = async (id: number, status: number) => { await updateOrderStatus(id, status); message.success('状态已更新'); setDetailOpen(false); await tableRef.current?.reload(); }; const itemColumns: TableProps['columns'] = [ { title: '品名', dataIndex: 'product_name' }, { title: '规格', dataIndex: 'product_spec', render: (v) => v || '-' }, { title: '单价', dataIndex: 'price', align: 'right', render: (v) => `¥${v}` }, { title: '订货量', dataIndex: 'quantity', align: 'right' }, { title: '金额', dataIndex: 'amount', align: 'right', render: (v) => `¥${v}` }, { title: '备注', dataIndex: 'remark', render: (v) => v || '-' }, ]; const columns: XinTableColumn[] = [ { title: '订单号', hideInTable: true, dataIndex: 'order_no', valueType: 'text', hideInForm: true }, { title: '商品信息', dataIndex: 'items', hideInForm: true, hideInSearch: true, width: 300, render: (_, record) => { return ( { record.items && record.items.length > 0 && record.items.map(item => (
{item.product_name}
{ item.price } ¥ × { item.quantity }
))}
) } }, { title: '基本信息', dataIndex: 'order_no', hideInForm: true, hideInSearch: true, width: 300, render: (_, record) => { return (
订货门店: {record.store?.name ?? `门店#${record.store_id}`}
订单号: {record.order_no}
订货时间:{record.created_at}
) } }, { title: '门店', dataIndex: 'store_id', valueType: 'select', hideInForm: true, hideInTable: true, fieldProps: { options: stores.map((s) => ({ label: s.name, value: s.id })), showSearch: true, optionFilterProp: 'label', }, render: (_, record) => record.store?.name ?? '-', }, { title: '门店信息', dataIndex: 'store_id', hideInForm: true, hideInSearch: true, width: 300, render: (_, record) => (
联系人:{ record.store?.contact ?? '-' }
联系电话:{ record.store?.phone ?? '-' }
门店地址:{ record.store?.address ?? '-' }
), }, { title: '订货日期', dataIndex: 'order_date', valueType: 'dateRange', hideInForm: true, hideInTable: true, align: 'center', }, { title: '订单信息', hideInForm: true, dataIndex: 'status', hideInSearch: true, width: 200, render: (_, record) => (
订货数量: {record.total_quantity}
周转框数量: {record.box_num}
周转托盘数量: {record.tray_num}
) }, { title: '附加信息', hideInForm: true, dataIndex: 'box_num', hideInSearch: true, width: 200, render: (_, record) => (
附加总金额: {record.added_amount} ¥
商品总金额: {record.product_amount} ¥
订单总金额: {record.total_amount} ¥
) }, { title: '订单状态', dataIndex: 'status', valueType: 'select', hideInForm: true, align: 'center', fieldProps: { options: Object.entries(STORE_ORDER_STATUS_MAP).map(([value, item]) => ({ value: Number(value), label: item.text, })), }, render: (_, record) => ( {STORE_ORDER_STATUS_MAP[record.status ?? 0]?.text} ) }, { title: '采购单ID', dataIndex: 'purchase_id', valueType: 'digit', hideInForm: true, }, { title: '账单ID', dataIndex: 'statement_id', valueType: 'digit', hideInForm: true, }, ]; const operateRender: XinTableProps['operateRender'] = (record) => [ , ]; const tableProps: XinTableProps = { api: '/order/store', columns, rowKey: 'id', accessName: 'order.store', tableRef, operateRender, formProps: false, }; return ( <>
门店订单 小程序下单汇总;待汇总订单将进入采购单生成,订单创建与取消在小程序端完成。
{...tableProps} /> setDetailOpen(false)} width={720} loading={detailLoading} footer={ detail && NEXT_STATUS[detail.status ?? -1] ? ( {NEXT_STATUS[detail.status!].map((action) => ( handleStatusChange(detail.id!, action.status)} > ))} ) : null } > {detail ? ( <> {detail.order_no} {detail.store?.name} {detail.order_date} {STORE_ORDER_STATUS_MAP[detail.status ?? 0]?.text} {detail.total_quantity} ¥{detail.total_amount} {detail.remark ? ( {detail.remark} ) : null} 商品明细 rowKey="id" size="small" columns={itemColumns} dataSource={detail.items ?? []} pagination={false} summary={() => ( 合计 ¥{detail.total_amount} )} /> ) : null} ); }; export default StoreOrderPage;