fix: 统一策略数据字段命名并重构参数处理
将策略数据字段从大驼峰命名改为小驼峰命名,保持前后端一致性 重构参数处理逻辑,将参数配置统一序列化为JSON字符串存储
This commit is contained in:
parent
bf4fa243ec
commit
bb09255dbd
@ -130,9 +130,9 @@ const fetchStrategies = async () => {
|
|||||||
const response = await api.strategies.getStrategies();
|
const response = await api.strategies.getStrategies();
|
||||||
if (response.code === 200) {
|
if (response.code === 200) {
|
||||||
strategies.value = response.data.map(item => ({
|
strategies.value = response.data.map(item => ({
|
||||||
id: item.Id,
|
id: item.id,
|
||||||
name: item.Title,
|
name: item.name,
|
||||||
desc: item.Description,
|
desc: item.description,
|
||||||
color: '#10B981'
|
color: '#10B981'
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -307,26 +307,18 @@ const submit = async () => {
|
|||||||
tags = [currentStrategyInfo.value.tag];
|
tags = [currentStrategyInfo.value.tag];
|
||||||
}
|
}
|
||||||
|
|
||||||
const strategyData = {
|
// 构建参数对象
|
||||||
name: formData.value.name,
|
const parameters = {};
|
||||||
type: currentType.value,
|
|
||||||
description: formData.value.description || currentStrategyInfo.value.description,
|
|
||||||
riskLevel: formData.value.riskLevel,
|
|
||||||
tags: tags,
|
|
||||||
parameters: {}
|
|
||||||
};
|
|
||||||
|
|
||||||
switch (currentType.value) {
|
switch (currentType.value) {
|
||||||
case 'ma_trend':
|
case 'ma_trend':
|
||||||
if (!formData.value.shortPeriod || !formData.value.longPeriod) {
|
if (!formData.value.shortPeriod || !formData.value.longPeriod) {
|
||||||
uni.showToast({ title: '请输入短期和长期周期', icon: 'none' });
|
uni.showToast({ title: '请输入短期和长期周期', icon: 'none' });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
strategyData.parameters = {
|
parameters.maType = formData.value.maType;
|
||||||
maType: formData.value.maType,
|
parameters.shortPeriod = parseInt(formData.value.shortPeriod);
|
||||||
shortPeriod: parseInt(formData.value.shortPeriod),
|
parameters.longPeriod = parseInt(formData.value.longPeriod);
|
||||||
longPeriod: parseInt(formData.value.longPeriod)
|
|
||||||
};
|
|
||||||
break;
|
break;
|
||||||
case 'risk_parity':
|
case 'risk_parity':
|
||||||
if (!formData.value.lookbackPeriod || !formData.value.rebalanceThreshold) {
|
if (!formData.value.lookbackPeriod || !formData.value.rebalanceThreshold) {
|
||||||
@ -336,28 +328,33 @@ const submit = async () => {
|
|||||||
if (!validateRiskParityAssets()) {
|
if (!validateRiskParityAssets()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
strategyData.parameters = {
|
parameters.lookbackPeriod = parseInt(formData.value.lookbackPeriod);
|
||||||
lookbackPeriod: parseInt(formData.value.lookbackPeriod),
|
parameters.rebalanceThreshold = parseFloat(formData.value.rebalanceThreshold);
|
||||||
rebalanceThreshold: parseFloat(formData.value.rebalanceThreshold),
|
parameters.assets = formData.value.assets.map(asset => ({
|
||||||
assets: formData.value.assets.map(asset => ({
|
symbol: asset.symbol,
|
||||||
symbol: asset.symbol,
|
targetWeight: parseFloat(asset.targetWeight)
|
||||||
targetWeight: parseFloat(asset.targetWeight)
|
}));
|
||||||
}))
|
|
||||||
};
|
|
||||||
break;
|
break;
|
||||||
case 'chandelier_exit':
|
case 'chandelier_exit':
|
||||||
if (!formData.value.period || !formData.value.multiplier) {
|
if (!formData.value.period || !formData.value.multiplier) {
|
||||||
uni.showToast({ title: '请输入ATR周期和倍数', icon: 'none' });
|
uni.showToast({ title: '请输入ATR周期和倍数', icon: 'none' });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
strategyData.parameters = {
|
parameters.period = parseInt(formData.value.period);
|
||||||
period: parseInt(formData.value.period),
|
parameters.multiplier = parseFloat(formData.value.multiplier);
|
||||||
multiplier: parseFloat(formData.value.multiplier),
|
parameters.useClose = formData.value.useClose;
|
||||||
useClose: formData.value.useClose
|
|
||||||
};
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const strategyData = {
|
||||||
|
name: formData.value.name,
|
||||||
|
type: currentType.value,
|
||||||
|
description: formData.value.description || currentStrategyInfo.value.description,
|
||||||
|
riskLevel: formData.value.riskLevel,
|
||||||
|
tags: tags,
|
||||||
|
config: JSON.stringify(parameters)
|
||||||
|
};
|
||||||
|
|
||||||
console.log('保存策略:', strategyData);
|
console.log('保存策略:', strategyData);
|
||||||
uni.showLoading({ title: isEditMode.value ? '更新中' : '保存中' });
|
uni.showLoading({ title: isEditMode.value ? '更新中' : '保存中' });
|
||||||
|
|
||||||
@ -391,17 +388,17 @@ const loadStrategyDetail = async (id) => {
|
|||||||
if (response.code === 200) {
|
if (response.code === 200) {
|
||||||
const data = response.data;
|
const data = response.data;
|
||||||
isEditMode.value = true;
|
isEditMode.value = true;
|
||||||
strategyId.value = data.Id;
|
strategyId.value = data.id;
|
||||||
currentType.value = data.Type;
|
currentType.value = data.type;
|
||||||
|
|
||||||
// 填充表单数据
|
// 填充表单数据
|
||||||
formData.value.name = data.Title || '';
|
formData.value.name = data.name || '';
|
||||||
formData.value.description = data.Description || '';
|
formData.value.description = data.description || '';
|
||||||
formData.value.riskLevel = data.RiskLevel || 'medium';
|
formData.value.riskLevel = data.riskLevel || 'medium';
|
||||||
formData.value.tags = data.Tags ? data.Tags.join(', ') : '';
|
formData.value.tags = data.tags ? data.tags.join(', ') : '';
|
||||||
|
|
||||||
// 根据策略类型填充参数
|
// 根据策略类型填充参数
|
||||||
const params = data.Parameters || {};
|
const params = data.config ? JSON.parse(data.config) : {};
|
||||||
switch (data.Type) {
|
switch (data.Type) {
|
||||||
case 'ma_trend':
|
case 'ma_trend':
|
||||||
formData.value.maType = params.maType || 'SMA';
|
formData.value.maType = params.maType || 'SMA';
|
||||||
|
|||||||
@ -73,14 +73,15 @@ const fetchStrategies = async () => {
|
|||||||
const response = await api.strategies.getStrategies();
|
const response = await api.strategies.getStrategies();
|
||||||
if (response.code === 200) {
|
if (response.code === 200) {
|
||||||
strategies.value = response.data.map(item => ({
|
strategies.value = response.data.map(item => ({
|
||||||
id: item.Id,
|
id: item.id,
|
||||||
title: item.Title,
|
title: item.name,
|
||||||
tag: item.Tags?.[0] || '策略',
|
tag: item.tags?.[0] || '策略',
|
||||||
desc: item.Description,
|
desc: item.description,
|
||||||
tags: item.Tags || [],
|
tags: item.tags || [],
|
||||||
bgClass: item.Type === 'ma_trend' ? 'bg-emerald-900' : item.Type === 'risk_parity' ? 'bg-blue-600' : 'bg-orange-500',
|
riskLevel: item.riskLevel,
|
||||||
tagClass: item.Type === 'ma_trend' ? 'text-emerald-700' : item.Type === 'risk_parity' ? 'text-blue-700' : 'text-orange-700',
|
bgClass: item.type === 'ma_trend' ? 'bg-emerald-900' : item.type === 'risk_parity' ? 'bg-blue-600' : 'bg-orange-500',
|
||||||
iconChar: item.Title?.charAt(0) || 'S',
|
tagClass: item.type === 'ma_trend' ? 'text-emerald-700' : item.type === 'risk_parity' ? 'text-blue-700' : 'text-orange-700',
|
||||||
|
iconChar: item.name?.charAt(0) || 'S',
|
||||||
btnClass: 'btn-primary',
|
btnClass: 'btn-primary',
|
||||||
btnText: '配置'
|
btnText: '配置'
|
||||||
}));
|
}));
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user