import { Purchase_Order_STATUS_ENUM } from '@/constants'; import { productcontrollerSearchproducts } from '@/servers/api/product'; import { stockcontrollerCreatepurchaseorder, stockcontrollerDelpurchaseorder, stockcontrollerGetallstockpoints, stockcontrollerGetpurchaseorders, stockcontrollerReceivepurchaseorder, stockcontrollerUpdatepurchaseorder, } from '@/servers/api/stock'; import { EditOutlined, PlusOutlined } from '@ant-design/icons'; import { ActionType, DrawerForm, PageContainer, ProColumns, ProForm, ProFormDatePicker, ProFormDependency, ProFormDigit, ProFormList, ProFormSelect, ProFormText, ProFormTextArea, ProTable, } from '@ant-design/pro-components'; import { App, Button, Divider, Form, Popconfirm } from 'antd'; import { useRef } from 'react'; const PurchaseOrderPage: React.FC = () => { const { message } = App.useApp(); const actionRef = useRef(); const columns: ProColumns[] = [ { title: '订单编号', dataIndex: 'orderNumber', }, { title: '仓库', dataIndex: 'stockPointName', hideInSearch: true, }, { title: '状态', dataIndex: 'status', valueType: 'select', valueEnum: Purchase_Order_STATUS_ENUM, hideInSearch: true, }, { title: '预计到货时间', dataIndex: 'expectedArrivalTime', valueType: 'dateTime', hideInSearch: true, }, { title: '数量', hideInSearch: true, render(_, record) { return record.items.reduce((cur, next) => { return cur + next.quantity; }, 0); }, }, { title: '备注', dataIndex: 'note', hideInSearch: true, }, { title: '更新时间', dataIndex: 'updatedAt', valueType: 'dateTime', hideInSearch: true, }, { title: '创建时间', dataIndex: 'createdAt', valueType: 'dateTime', hideInSearch: true, }, { title: '操作', dataIndex: 'option', valueType: 'option', render: (_, record) => ( <> {record.status !== 'received' && ( )} {record.status === 'draft' ? ( <> { try { const { success, message: errMsg } = await stockcontrollerDelpurchaseorder({ id: record.id as number, }); if (!success) { throw new Error(errMsg); } actionRef.current?.reload(); } catch (error: any) { message.error(error.message); } }} > ) : record.status === 'submitted' ? ( <> { try { const { success, message: errMsg } = await stockcontrollerReceivepurchaseorder({ id: record.id as number, }); if (!success) { throw new Error(errMsg); } actionRef.current?.reload(); } catch (error: any) { message.error(error.message); } }} > ) : ( )} ), }, ]; return ( headerTitle="查询表格" actionRef={actionRef} rowKey="id" request={async (params) => { const { data, success } = await stockcontrollerGetpurchaseorders( params, ); return { total: data?.total || 0, data: data?.items || [], success, }; }} columns={columns} toolBarRender={() => []} /> ); }; const CreateForm: React.FC<{ tableRef: React.MutableRefObject; }> = ({ tableRef }) => { const { message } = App.useApp(); const [form] = Form.useForm(); return ( title="新建" trigger={ } form={form} autoFocusFirstInput layout="vertical" drawerProps={{ destroyOnClose: true, }} onFinish={async (values) => { try { const { success, message: errMsg } = await stockcontrollerCreatepurchaseorder(values); if (!success) { throw new Error(errMsg); } tableRef.current?.reload(); message.success('提交成功'); return true; } catch (error: any) { message.error(error.message); } }} > { try { const { data } = await stockcontrollerGetallstockpoints(); return ( data?.map((item) => { return { label: item.name, value: item.id, }; }) || [] ); } catch (error) { return []; } }} name="stockPointId" label="仓库" width="lg" placeholder="请选择仓库" rules={[{ required: true, message: '请选择仓库' }]} /> {({ items }) => { return '数量:' + items?.reduce((acc, cur) => acc + cur.quantity, 0); }} name="items" label="产品" rules={[ { required: true, message: '至少需要一个商品', validator: (_, value) => value && value.length > 0 ? Promise.resolve() : Promise.reject('至少需要一个商品'), }, ]} creatorButtonProps={{ children: '新增', size: 'large' }} wrapperCol={{ span: 24 }} > {(fields, idx, { remove }) => (
{ if (keyWords.length < 3) return []; try { const { data } = await productcontrollerSearchproducts({ name: keyWords, }); return ( data?.map((item) => { return { label: item.name, value: item.sku, }; }) || [] ); } catch (error) { return []; } }} name="productSku" label={'产品' + (idx + 1)} width="lg" placeholder="请选择产品" tooltip="至少输入3个字符" fieldProps={{ showSearch: true, filterOption: false, }} transform={(value) => { return value?.value || value; }} debounceTime={300} // 防抖,减少请求频率 rules={[{ required: true, message: '请选择产品' }]} onChange={(_, option) => { form.setFieldValue( ['items', fields.key, 'productName'], option.title, ); }} />
)} ); }; const UpdateForm: React.FC<{ tableRef: React.MutableRefObject; values: API.UpdatePurchaseOrderDTO & { id: number; }; }> = ({ tableRef, values }) => { const { message } = App.useApp(); const [form] = Form.useForm(); const initialValues = { ...values, items: values?.items?.map((item: API.PurchaseOrderItem) => ({ ...item, productSku: { label: item.productName, value: item.productSku, }, })), }; return ( title="编辑" form={form} initialValues={initialValues} trigger={ } autoFocusFirstInput drawerProps={{ destroyOnClose: true, }} onFinish={async (values) => { try { const { success, message: errMsg } = await stockcontrollerUpdatepurchaseorder( { id: initialValues.id }, values, ); if (!success) { throw new Error(errMsg); } message.success('提交成功'); tableRef.current?.reload(); return true; } catch (error: any) { message.error(error.message); } }} > { try { const { data } = await stockcontrollerGetallstockpoints(); return ( data?.map((item) => { return { label: item.name, value: item.id, }; }) || [] ); } catch (error) { return []; } }} name="stockPointId" label="仓库" width="lg" placeholder="请选择仓库" rules={[{ required: true, message: '请选择仓库' }]} /> {({ items }) => { return ( '数量:' + items?.reduce((acc, cur) => acc + cur.quantity, 0) ); }} name="items" rules={[ { required: true, message: '至少需要一个商品', validator: (_, value) => value && value.length > 0 ? Promise.resolve() : Promise.reject('至少需要一个商品'), }, ]} creatorButtonProps={{ children: '新增', size: 'large' }} wrapperCol={{ span: 24 }} > {(fields, idx, { remove }) => (
{ if (keyWords.length < 3) return []; try { const { data } = await productcontrollerSearchproducts({ name: keyWords, }); return ( data?.map((item) => { return { label: item.name, value: item.sku, }; }) || [] ); } catch (error) { return []; } }} name="productSku" label="产品" width="lg" placeholder="请选择产品" tooltip="至少输入3个字符" fieldProps={{ showSearch: true, filterOption: false, }} transform={(value) => { return value?.value || value; }} debounceTime={300} // 防抖,减少请求频率 rules={[{ required: true, message: '请选择产品' }]} onChange={(_, option) => { form.setFieldValue( ['items', fields.key, 'productName'], option?.title, ); }} />
)}
); }; const DetailForm: React.FC<{ tableRef: React.MutableRefObject; values: API.UpdatePurchaseOrderDTO & { id: number; }; }> = ({ tableRef, values }) => { const { message } = App.useApp(); const [form] = Form.useForm(); const initialValues = { ...values, items: values?.items?.map((item: API.PurchaseOrderItem) => ({ ...item, productSku: { label: item.productName, value: item.productSku, }, })), }; return ( title="详情" form={form} initialValues={initialValues} trigger={} autoFocusFirstInput drawerProps={{ destroyOnClose: true, }} readonly={true} layout="vertical" > { try { const { data } = await stockcontrollerGetallstockpoints(); return ( data?.map((item) => { return { label: item.name, value: item.id, }; }) || [] ); } catch (error) { return []; } }} name="stockPointId" label="仓库" width="lg" placeholder="请选择仓库" rules={[{ required: true, message: '请选择仓库' }]} /> name="items" rules={[ { required: true, message: '至少需要一个商品', validator: (_, value) => value && value.length > 0 ? Promise.resolve() : Promise.reject('至少需要一个商品'), }, ]} creatorButtonProps={{ children: '新增', size: 'large' }} wrapperCol={{ span: 24 }} > {(fields, idx, { remove }) => (
{ if (keyWords.length < 3) return []; try { const { data } = await productcontrollerSearchproducts({ name: keyWords, }); return ( data?.map((item) => { return { label: item.name, value: item.sku, }; }) || [] ); } catch (error) { return []; } }} name="productSku" label="产品" width="lg" placeholder="请选择产品" tooltip="至少输入3个字符" fieldProps={{ showSearch: true, filterOption: false, }} transform={(value) => { return value?.value || value; }} debounceTime={300} // 防抖,减少请求频率 rules={[{ required: true, message: '请选择产品' }]} onChange={(_, option) => { form.setFieldValue( ['items', fields.key, 'productName'], option?.title, ); }} />
)} ); }; export default PurchaseOrderPage;