import AccountCircleOutlined from "@mui/icons-material/AccountCircleOutlined"; import CheckCircleOutlineOutlined from "@mui/icons-material/CheckCircleOutlineOutlined"; import FactCheckOutlined from "@mui/icons-material/FactCheckOutlined"; import PaymentsOutlined from "@mui/icons-material/PaymentsOutlined"; import ReceiptLongOutlined from "@mui/icons-material/ReceiptLongOutlined"; import Alert from "@mui/material/Alert"; import Autocomplete from "@mui/material/Autocomplete"; import Button from "@mui/material/Button"; import Dialog from "@mui/material/Dialog"; import DialogActions from "@mui/material/DialogActions"; import DialogContent from "@mui/material/DialogContent"; import DialogTitle from "@mui/material/DialogTitle"; import InputAdornment from "@mui/material/InputAdornment"; import MenuItem from "@mui/material/MenuItem"; import TextField from "@mui/material/TextField"; import { DateTimePicker } from "@/shared/ui/DateTimePicker.jsx"; import { COIN_SELLER_RECHARGE_CHAINS, COIN_SELLER_RECHARGE_PROVIDER_CURRENCIES, COIN_SELLER_RECHARGE_PROVIDERS, } from "../constants.js"; import { formatAmount, formatTime, formatUsdMinor } from "../format.js"; export function FinanceCoinSellerRechargeCreateDialog({ apps, form, formError, loading, onChange, onClose, onSubmit, onVerifyReceipt, open, quote, quoteError, quoteLoading, receiptLoading, receiptVerification, }) { const disabled = loading || receiptLoading; // 财务录单的主按钮只在“金额结果已确定 + 三方凭证已校验”时开放,避免界面优化后弱化原有风控门槛。 const canCreate = receiptVerification?.verified === true && (form.isMakeup || Boolean(quote?.coinAmount)) && !disabled; const selectedAppName = apps.find((app) => app.appCode === form.appCode)?.appName || form.appCode || "待选择"; return ( 录入币商充值 完成付款凭证校验后,订单将计入充值流水
{formError ? {formError} : null}
} index="1" title="充值对象">
{apps.length ? ( onChange("appCode", event.target.value)} > {apps.map((app) => ( {app.appName || app.appCode} ))} ) : ( onChange("appCode", event.target.value)} /> )} onChange("targetUserId", event.target.value)} />
} index="2" title="入账金额">
$ }, }} type="number" value={form.usdAmount} onChange={(event) => onChange("usdAmount", event.target.value)} /> onChange("orderDateMs", value)} />
} index="3" title="支付凭证">
onChange("providerCode", event.target.value)} > {COIN_SELLER_RECHARGE_PROVIDERS.map(([value, label]) => ( {label} ))} {form.providerCode === "usdt" ? ( onChange("chain", event.target.value)} > {COIN_SELLER_RECHARGE_CHAINS.map(([value, label]) => ( {label} ))} ) : ( option || ""} isOptionEqualToValue={(option, value) => option === value} noOptionsText="无匹配币种" options={COIN_SELLER_RECHARGE_PROVIDER_CURRENCIES[form.providerCode] || []} renderInput={(params) => } value={form.providerCurrencyCode || null} onChange={(_, value) => onChange("providerCurrencyCode", value || "")} /> )} {form.providerCode !== "usdt" ? ( onChange("providerAmount", event.target.value)} /> ) : null}
onChange("externalOrderNo", event.target.value)} />
{receiptVerification ? : null} onChange("remark", event.target.value)} />
{receiptVerification?.verified ? : } {receiptVerification?.verified ? "订单已校验,可以创建" : "校验三方订单后才能创建"}
); } function FormSection({ children, icon, index, title }) { return (
{index}

{title}

{children}
); } function CoinQuoteResult({ form, quote, quoteError, quoteLoading }) { const coinAmount = form.isMakeup ? 0 : quote?.coinAmount; return (
{form.isMakeup ? "本次不发放" : "预计到账"} {coinAmount === undefined ? "—" : formatAmount(coinAmount)} 金币

{quoteHelperText(quote, quoteError, quoteLoading, form.isMakeup)}

); } function OrderPreview({ appName, form, quote, quoteLoading, receiptVerification }) { const usdAmount = Number(form.usdAmount || 0); const coinAmount = form.isMakeup ? 0 : Number(quote?.coinAmount || 0); const providerLabel = COIN_SELLER_RECHARGE_PROVIDERS.find(([value]) => value === form.providerCode)?.[1] || "待选择"; return ( ); } function quoteHelperText(quote, error, loading, isMakeup) { if (isMakeup) return "补单不发放金币,充值金额仍正常计入统计"; if (loading) return "正在计算兑换比例与金币数量"; if (error) return error; if (!quote) return "填写 APP、用户 ID 和 USD 金额后自动计算"; const source = quote.rateSource === "whitelist" ? `用户白名单 ${quote.matchedUserId || ""}`.trim() : `${quote.minUsdAmount}-${quote.maxUsdAmount} USD 区间`; return `${source} · 1 USD = ${formatAmount(quote.coinsPerUsd)} 金币`; } function ReceiptVerificationBanner({ verification }) { const detail = [ verification.status && `状态 ${verification.status}`, verification.providerOrderId && `三方单 ${verification.providerOrderId}`, verification.currencyCode && verification.providerAmountMinor !== undefined ? formatUsdMinor(verification.providerAmountMinor, verification.currencyCode) : "", verification.failureReason, ].filter(Boolean).join(" / "); return ( {verification.verified ? "校验通过" : "校验未通过"}{detail ? `:${detail}` : ""} ); }