优化商品列表表格列宽与上架配置面板
This commit is contained in:
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user