import { App, Alert, Form, Input, InputNumber, Modal, Select } from 'antd' import type { FormInstance } from 'antd' import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' import { useEffect, useState } from 'react' import { createAdminManualOrderCost, fetchAdminFundAccounts } from '@/services/admin' import { getAdminRole } from '@/utils/admin-auth' export type ManualOrderCostItem = { orderItemId: number matchSku?: string skuName?: string skuCode?: string quantity?: number } type ManualOrderCostModalProps = { open: boolean orderId: number orderNo: string items: ManualOrderCostItem[] onClose: () => void } type ManualOrderCostFormValues = { orderItemId: number fundAccountId: number amountYuan: number expenseCategory: string payeeName?: string paymentMethod?: string evidence?: string note?: string } const CATEGORY_OPTIONS = [ { value: 'service_fee', label: '人工服务费' }, { value: 'goods_purchase', label: '商品采购' }, { value: 'compensation', label: '赔付 / 补偿' }, { value: 'refund_advance', label: '垫付退款' }, { value: 'freight', label: '运费' }, { value: 'other', label: '其他' }, ] const PAYMENT_METHOD_OPTIONS = [ { value: 'wechat', label: '微信' }, { value: 'alipay', label: '支付宝' }, { value: 'bank', label: '银行卡' }, { value: 'cash', label: '现金' }, { value: 'platform_balance', label: '平台余额' }, { value: 'other', label: '其他' }, ] function itemLabel(item: ManualOrderCostItem) { // 只展示平台判断用的真实 SKU,引流长标题不进录单选项。 const sku = item.matchSku || item.skuName || item.skuCode || `订单项 #${item.orderItemId}` return item.quantity && item.quantity > 1 ? `${sku} ×${item.quantity}` : sku } export default function ManualOrderCostModal({ open, orderId, orderNo, items, onClose, }: ManualOrderCostModalProps) { const { message } = App.useApp() const queryClient = useQueryClient() const [form] = Form.useForm() const fundAccountsQuery = useQuery({ queryKey: ['admin-fund-accounts', 'agent'], queryFn: () => fetchAdminFundAccounts({ accountType: 'agent', status: 'active', pageSize: 200 }), enabled: open, }) const fundAccounts = fundAccountsQuery.data?.data.items || [] const soleFundAccountId = fundAccounts.length === 1 ? fundAccounts[0]?.id : undefined const isSupport = getAdminRole() === 'support' const ownFundAccount = isSupport ? fundAccounts[0] : undefined useEffect(() => { if (!open) return form.resetFields() form.setFieldsValue({ orderItemId: items.length === 1 ? items[0].orderItemId : undefined, fundAccountId: soleFundAccountId, amountYuan: undefined, expenseCategory: 'service_fee', paymentMethod: 'other', }) }, [form, items, open, soleFundAccountId]) const mutation = useMutation({ mutationFn: (values: ManualOrderCostFormValues) => createAdminManualOrderCost({ orderId, orderItemId: values.orderItemId, fundAccountId: values.fundAccountId, amountFen: Math.max(1, Math.round(Number(values.amountYuan || 0) * 100)), expenseCategory: values.expenseCategory, payeeName: values.payeeName || '内部人工', paymentMethod: values.paymentMethod || 'other', note: values.note || '', evidenceJson: values.evidence ? { reference: values.evidence } : { note: values.note || '订单页人工录单' }, }), onSuccess: (response) => { const result = response.data if (result.warning) { message.warning(result.warning) } else { message.success(`已计入订单成本,支出单号 ${result.expenseNo}`) } void queryClient.invalidateQueries({ queryKey: ['admin-fund-accounts'] }) void queryClient.invalidateQueries({ queryKey: ['admin-fund-expenses'] }) void queryClient.invalidateQueries({ queryKey: ['admin-sales-profit-overview'] }) void queryClient.invalidateQueries({ queryKey: ['admin-sales-facts'] }) void queryClient.invalidateQueries({ queryKey: ['admin-order-detail', String(orderId)] }) onClose() }, onError: (error) => { message.error(error instanceof Error ? error.message : '录入人工成本失败') }, }) async function submit() { const values = await form.validateFields() mutation.mutate(values) } return ( void submit()} onCancel={onClose} destroyOnHidden width={620} > form={form as FormInstance} layout="vertical" initialValues={{ expenseCategory: 'service_fee', paymentMethod: 'other' }} > {isSupport ? ( <> ) : ( ) : ( ) }