优化商品列表表格列宽与上架配置面板

This commit is contained in:
yml2213
2026-08-04 11:16:54 +08:00
parent 71bdbf527c
commit e6f09eaf14
5 changed files with 222 additions and 73 deletions
+93 -2
View File
@@ -14,11 +14,11 @@ import {
Typography,
message,
} from 'antd'
import { GiftOutlined, PlusOutlined, ReloadOutlined, TeamOutlined } from '@ant-design/icons'
import { GiftOutlined, PlusOutlined, ReloadOutlined, TeamOutlined, WalletOutlined } from '@ant-design/icons'
import type { ColumnsType } from 'antd/es/table'
import { useNavigate } from 'react-router-dom'
import { platformApi } from '../api'
import type { Merchant, MerchantMember, PageResult, ProductCatalogItem } from '../types'
import type { Merchant, MerchantMember, PageResult, ProductCatalogItem, WalletAccount } from '../types'
import { formatDateTime } from '../utils/time'
import { PageHeader } from '../components/PageHeader'
@@ -51,9 +51,14 @@ export default function PlatformMerchants() {
const [merchantProducts, setMerchantProducts] = useState<ProductCatalogItem[]>([])
const [selectedCatalogIds, setSelectedCatalogIds] = useState<number[]>([])
const [selectedMerchant, setSelectedMerchant] = useState<Merchant | null>(null)
const [adjustOpen, setAdjustOpen] = useState(false)
const [adjustLoading, setAdjustLoading] = useState(false)
const [adjustSubmitting, setAdjustSubmitting] = useState(false)
const [adjustWallet, setAdjustWallet] = useState<WalletAccount | null>(null)
const [createForm] = Form.useForm()
const [settingsForm] = Form.useForm()
const [memberForm] = Form.useForm()
const [adjustForm] = Form.useForm()
const load = useCallback(async (page = data.page, size = data.size) => {
setLoading(true)
@@ -128,6 +133,44 @@ export default function PlatformMerchants() {
}
}
const openAdjust = async (record: Merchant) => {
setSelectedMerchant(record)
setAdjustOpen(true)
setAdjustLoading(true)
setAdjustWallet(null)
adjustForm.resetFields()
try {
const walletData = await platformApi.wallet(record.id)
setAdjustWallet(walletData)
adjustForm.setFieldsValue({ idempotency_key: `manual-${Date.now()}` })
} catch (e) {
message.error(e instanceof Error ? e.message : '加载钱包失败')
} finally {
setAdjustLoading(false)
}
}
const submitAdjust = async () => {
if (!selectedMerchant) return
const values = await adjustForm.validateFields()
setAdjustSubmitting(true)
try {
const walletData = await platformApi.adjustWallet(selectedMerchant.id, {
amount: Number(values.amount),
idempotency_key: values.idempotency_key,
note: values.note,
})
setAdjustWallet(walletData)
message.success('积分已调整')
setAdjustOpen(false)
load()
} catch (e) {
message.error(e instanceof Error ? e.message : '调整失败')
} finally {
setAdjustSubmitting(false)
}
}
const openAssign = async (record: Merchant) => {
setSelectedMerchant(record)
setAssignOpen(true)
@@ -255,6 +298,14 @@ export default function PlatformMerchants() {
>
</Button>
<Button
type="link"
size="small"
icon={<WalletOutlined />}
onClick={() => openAdjust(record)}
>
</Button>
<Button
type="link"
size="small"
@@ -417,6 +468,46 @@ export default function PlatformMerchants() {
</Form>
</Modal>
<Modal
title={selectedMerchant ? `调整积分:${selectedMerchant.name}` : '调整积分'}
open={adjustOpen}
onOk={submitAdjust}
onCancel={() => setAdjustOpen(false)}
destroyOnClose
width={520}
confirmLoading={adjustSubmitting}
okText="确认调整"
>
<Spin spinning={adjustLoading}>
<Space direction="vertical" style={{ width: '100%' }} size="middle">
<div className="metric-card-box">
<div className="metric-card-header">
<span className="metric-card-title"></span>
<div className="metric-card-icon metric-card-icon--emerald"><WalletOutlined /></div>
</div>
<div className="metric-card-value" style={{ color: '#16a34a' }}>
{(adjustWallet?.available_balance ?? 0).toLocaleString('zh-CN')}
<span style={{ fontSize: 13, fontWeight: 500, marginLeft: 4, color: '#64748b' }}></span>
</div>
</div>
<Form form={adjustForm} layout="vertical">
<Form.Item name="amount" label="调整积分" rules={[{ required: true, message: '请填写调整积分' }]}>
<InputNumber precision={0} style={{ width: '100%' }} placeholder="正数充值,负数扣减" />
</Form.Item>
<Form.Item name="idempotency_key" label="幂等键" rules={[{ required: true }]}>
<Input disabled />
</Form.Item>
<Form.Item name="note" label="备注" rules={[{ max: 512 }]}>
<Input.TextArea rows={3} placeholder="调整原因,会写入积分流水备注" maxLength={512} />
</Form.Item>
</Form>
<Typography.Text type="secondary">
</Typography.Text>
</Space>
</Spin>
</Modal>
<Modal
title={selectedMerchant ? `添加成员:${selectedMerchant.name}` : '添加成员'}
open={memberOpen}