移除跟单最大仓位数量(maxPositionCount)配置
- 数据库:创建迁移文件 V26 删除 max_position_count 字段 - 后端:移除实体类、DTO、服务中的 maxPositionCount 相关代码 - 后端:移除 FilterResult 中的 FAILED_MAX_POSITION_COUNT 状态 - 后端:移除 CopyTradingFilterService 中的最大仓位数量检查逻辑 - 前端:移除类型定义、表单字段和国际化翻译 - 前端:移除过滤订单列表中的 MAX_POSITION_COUNT 类型 - 前端:修复编译错误(Spin 导入、Table fixed 类型、size 类型)
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import React, { useEffect, useState, useRef } from 'react'
|
||||
import { Modal, Form, Button, Switch, message, Space, Radio, InputNumber, Table, Select, Divider, Input, Tag, InputRef, Card, Row, Col, Statistic } from 'antd'
|
||||
import { Modal, Form, Button, Switch, message, Space, Radio, InputNumber, Table, Select, Divider, Input, Tag, InputRef, Card, Row, Col, Statistic, Spin } from 'antd'
|
||||
import { SaveOutlined, FileTextOutlined, PlusOutlined } from '@ant-design/icons'
|
||||
import { apiService } from '../../services/api'
|
||||
import { useAccountStore } from '../../store/accountStore'
|
||||
@@ -122,7 +122,6 @@ const AddModal: React.FC<AddModalProps> = ({
|
||||
minPrice: template.minPrice ? parseFloat(template.minPrice) : undefined,
|
||||
maxPrice: template.maxPrice ? parseFloat(template.maxPrice) : undefined,
|
||||
maxPositionValue: (template as any).maxPositionValue ? parseFloat((template as any).maxPositionValue) : undefined,
|
||||
maxPositionCount: (template as any).maxPositionCount,
|
||||
pushFilteredOrders: template.pushFilteredOrders ?? false
|
||||
})
|
||||
setCopyMode(template.copyMode)
|
||||
@@ -277,7 +276,6 @@ const AddModal: React.FC<AddModalProps> = ({
|
||||
minPrice: values.minPrice?.toString(),
|
||||
maxPrice: values.maxPrice?.toString(),
|
||||
maxPositionValue: values.maxPositionValue?.toString(),
|
||||
maxPositionCount: values.maxPositionCount,
|
||||
keywordFilterMode: values.keywordFilterMode || 'DISABLED',
|
||||
keywords: (values.keywordFilterMode === 'WHITELIST' || values.keywordFilterMode === 'BLACKLIST')
|
||||
? keywords
|
||||
@@ -800,19 +798,6 @@ const AddModal: React.FC<AddModalProps> = ({
|
||||
/>
|
||||
</Form.Item>
|
||||
|
||||
<Form.Item
|
||||
label={t('copyTradingAdd.maxPositionCount') || '最大仓位数量'}
|
||||
name="maxPositionCount"
|
||||
tooltip={t('copyTradingAdd.maxPositionCountTooltip') || '限制单个市场的最大仓位数量。如果该市场的当前仓位数量达到或超过此限制,则不会下单。不填写则不启用此限制'}
|
||||
>
|
||||
<InputNumber
|
||||
min={1}
|
||||
step={1}
|
||||
style={{ width: '100%' }}
|
||||
placeholder={t('copyTradingAdd.maxPositionCountPlaceholder') || '例如:10(可选,不填写表示不启用)'}
|
||||
/>
|
||||
</Form.Item>
|
||||
|
||||
<Divider>{t('copyTradingAdd.keywordFilter') || '关键字过滤'}</Divider>
|
||||
|
||||
<Form.Item
|
||||
|
||||
@@ -91,7 +91,6 @@ const EditModal: React.FC<EditModalProps> = ({
|
||||
minPrice: found.minPrice ? parseFloat(found.minPrice) : undefined,
|
||||
maxPrice: found.maxPrice ? parseFloat(found.maxPrice) : undefined,
|
||||
maxPositionValue: found.maxPositionValue ? parseFloat(found.maxPositionValue) : undefined,
|
||||
maxPositionCount: found.maxPositionCount,
|
||||
keywordFilterMode: found.keywordFilterMode || 'DISABLED',
|
||||
configName: found.configName || '',
|
||||
pushFailedOrders: found.pushFailedOrders ?? false,
|
||||
@@ -237,8 +236,6 @@ const EditModal: React.FC<EditModalProps> = ({
|
||||
minPrice: values.minPrice != null ? values.minPrice.toString() : '',
|
||||
maxPrice: values.maxPrice != null ? values.maxPrice.toString() : '',
|
||||
maxPositionValue: values.maxPositionValue != null ? values.maxPositionValue.toString() : '',
|
||||
// 对于 maxPositionCount,如果值为 null/undefined,传 -1 表示要清空(后端会识别并设置为 null)
|
||||
maxPositionCount: values.maxPositionCount != null ? values.maxPositionCount : -1,
|
||||
keywordFilterMode: values.keywordFilterMode || 'DISABLED',
|
||||
keywords: (values.keywordFilterMode === 'WHITELIST' || values.keywordFilterMode === 'BLACKLIST')
|
||||
? keywords
|
||||
@@ -722,19 +719,6 @@ const EditModal: React.FC<EditModalProps> = ({
|
||||
/>
|
||||
</Form.Item>
|
||||
|
||||
<Form.Item
|
||||
label={t('copyTradingEdit.maxPositionCount') || '最大仓位数量'}
|
||||
name="maxPositionCount"
|
||||
tooltip={t('copyTradingEdit.maxPositionCountTooltip') || '限制单个市场的最大仓位数量。如果该市场的当前仓位数量达到或超过此限制,则不会下单。不填写则不启用此限制'}
|
||||
>
|
||||
<InputNumber
|
||||
min={1}
|
||||
step={1}
|
||||
style={{ width: '100%' }}
|
||||
placeholder={t('copyTradingEdit.maxPositionCountPlaceholder') || '例如:10(可选,不填写表示不启用)'}
|
||||
/>
|
||||
</Form.Item>
|
||||
|
||||
{/* 关键字过滤 */}
|
||||
<Divider>{t('copyTradingEdit.keywordFilter') || t('copyTradingAdd.keywordFilter') || '关键字过滤'}</Divider>
|
||||
|
||||
|
||||
@@ -69,7 +69,6 @@ const FilteredOrdersModal: React.FC<FilteredOrdersModalProps> = ({
|
||||
ORDERBOOK_EMPTY: { color: 'default', text: t('filteredOrdersList.filterTypes.orderbookEmpty') || '订单簿为空' },
|
||||
PRICE_RANGE: { color: 'purple', text: t('filteredOrdersList.filterTypes.priceRange') || '价格区间不符' },
|
||||
MAX_POSITION_VALUE: { color: 'volcano', text: t('filteredOrdersList.filterTypes.maxPositionValue') || '超过最大仓位金额' },
|
||||
MAX_POSITION_COUNT: { color: 'volcano', text: t('filteredOrdersList.filterTypes.maxPositionCount') || '超过最大仓位数量' },
|
||||
MARKET_END_DATE: { color: 'cyan', text: t('filteredOrdersList.filterTypes.marketEndDate') || '市场截止时间超出限制' },
|
||||
KEYWORD_FILTER: { color: 'geekblue', text: t('filteredOrdersList.filterTypes.keywordFilter') || '关键字过滤' }
|
||||
}
|
||||
|
||||
@@ -66,7 +66,6 @@ const FilteredOrdersList: React.FC = () => {
|
||||
'ORDERBOOK_EMPTY': { color: 'default', label: t('filteredOrdersList.filterTypes.orderbookEmpty') || '订单簿为空' },
|
||||
'PRICE_RANGE': { color: 'purple', label: t('filteredOrdersList.filterTypes.priceRange') || '价格区间不符' },
|
||||
'MAX_POSITION_VALUE': { color: 'volcano', label: t('filteredOrdersList.filterTypes.maxPositionValue') || '超过最大仓位金额' },
|
||||
'MAX_POSITION_COUNT': { color: 'volcano', label: t('filteredOrdersList.filterTypes.maxPositionCount') || '超过最大仓位数量' },
|
||||
'MARKET_END_DATE': { color: 'cyan', label: t('filteredOrdersList.filterTypes.marketEndDate') || '市场截止时间超出限制' },
|
||||
'KEYWORD_FILTER': { color: 'geekblue', label: t('filteredOrdersList.filterTypes.keywordFilter') || '关键字过滤' },
|
||||
'UNKNOWN': { color: 'default', label: t('filteredOrdersList.filterTypes.unknown') || '未知原因' }
|
||||
|
||||
@@ -266,7 +266,7 @@ const LeaderList: React.FC = () => {
|
||||
title: t('common.actions'),
|
||||
key: 'action',
|
||||
width: isMobile ? 180 : 250,
|
||||
fixed: 'right',
|
||||
fixed: 'right' as const,
|
||||
render: (_: any, record: Leader) => (
|
||||
<Space size="small" wrap>
|
||||
<Button type="link" size="small" icon={<EyeOutlined />} onClick={() => handleShowDetail(record)}>
|
||||
@@ -530,7 +530,7 @@ const LeaderList: React.FC = () => {
|
||||
rowKey={(record, index) => `${record.title}-${record.side}-${index}`}
|
||||
pagination={{ pageSize: 10, showSizeChanger: !isMobile }}
|
||||
scroll={{ x: isMobile ? 800 : 'auto' }}
|
||||
size={isMobile ? 'small' : 'default'}
|
||||
size={isMobile ? 'small' : 'middle'}
|
||||
/>
|
||||
) : (
|
||||
<Empty description={t('leaderDetail.noPositions')} />
|
||||
|
||||
Reference in New Issue
Block a user