import React, { useEffect, useRef, useState } from 'react'; import { Button, Descriptions, Drawer, message, Popconfirm, Space, Table, Tag, Typography, } 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: '订单号', dataIndex: 'order_no', valueType: 'text', hideInForm: true, render: (_, record) => {record.order_no}, }, { title: '门店', dataIndex: 'store_id', valueType: 'select', hideInForm: true, fieldProps: { options: stores.map((s) => ({ label: s.name, value: s.id })), showSearch: true, optionFilterProp: 'label', }, render: (_, record) => record.store?.name ?? '-', }, { title: '订货日期', dataIndex: 'order_date', valueType: 'dateRange', hideInForm: true, align: 'center', render: (_, record) => record.order_date, }, { title: '订货总量', dataIndex: 'total_quantity', hideInForm: true, hideInSearch: true, align: 'right', }, { title: '订单金额', dataIndex: 'total_amount', hideInForm: true, hideInSearch: true, align: 'right', render: (_, record) => ¥{record.total_amount}, }, { title: '状态', dataIndex: 'status', valueType: 'select', hideInForm: true, fieldProps: { options: Object.entries(STORE_ORDER_STATUS_MAP).map(([value, item]) => ({ value: Number(value), label: item.text, })), }, render: (_, record) => { const item = STORE_ORDER_STATUS_MAP[record.status ?? 0]; return {item?.text}; }, align: 'center', }, { title: '备注', dataIndex: 'remark', hideInForm: true, hideInSearch: true, ellipsis: true, render: (_, record) => record.remark || '-', }, ]; 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;