fix: 统一策略数据字段命名并重构参数处理

将策略数据字段从大驼峰命名改为小驼峰命名,保持前后端一致性
重构参数处理逻辑,将参数配置统一序列化为JSON字符串存储
This commit is contained in:
niannian zheng 2026-03-02 17:19:55 +08:00
parent bf4fa243ec
commit bb09255dbd
3 changed files with 43 additions and 45 deletions

View File

@ -130,9 +130,9 @@ const fetchStrategies = async () => {
const response = await api.strategies.getStrategies();
if (response.code === 200) {
strategies.value = response.data.map(item => ({
id: item.Id,
name: item.Title,
desc: item.Description,
id: item.id,
name: item.name,
desc: item.description,
color: '#10B981'
}));
}

View File

@ -307,14 +307,8 @@ const submit = async () => {
tags = [currentStrategyInfo.value.tag];
}
const strategyData = {
name: formData.value.name,
type: currentType.value,
description: formData.value.description || currentStrategyInfo.value.description,
riskLevel: formData.value.riskLevel,
tags: tags,
parameters: {}
};
//
const parameters = {};
switch (currentType.value) {
case 'ma_trend':
@ -322,11 +316,9 @@ const submit = async () => {
uni.showToast({ title: '请输入短期和长期周期', icon: 'none' });
return;
}
strategyData.parameters = {
maType: formData.value.maType,
shortPeriod: parseInt(formData.value.shortPeriod),
longPeriod: parseInt(formData.value.longPeriod)
};
parameters.maType = formData.value.maType;
parameters.shortPeriod = parseInt(formData.value.shortPeriod);
parameters.longPeriod = parseInt(formData.value.longPeriod);
break;
case 'risk_parity':
if (!formData.value.lookbackPeriod || !formData.value.rebalanceThreshold) {
@ -336,28 +328,33 @@ const submit = async () => {
if (!validateRiskParityAssets()) {
return;
}
strategyData.parameters = {
lookbackPeriod: parseInt(formData.value.lookbackPeriod),
rebalanceThreshold: parseFloat(formData.value.rebalanceThreshold),
assets: formData.value.assets.map(asset => ({
symbol: asset.symbol,
targetWeight: parseFloat(asset.targetWeight)
}))
};
parameters.lookbackPeriod = parseInt(formData.value.lookbackPeriod);
parameters.rebalanceThreshold = parseFloat(formData.value.rebalanceThreshold);
parameters.assets = formData.value.assets.map(asset => ({
symbol: asset.symbol,
targetWeight: parseFloat(asset.targetWeight)
}));
break;
case 'chandelier_exit':
if (!formData.value.period || !formData.value.multiplier) {
uni.showToast({ title: '请输入ATR周期和倍数', icon: 'none' });
return;
}
strategyData.parameters = {
period: parseInt(formData.value.period),
multiplier: parseFloat(formData.value.multiplier),
useClose: formData.value.useClose
};
parameters.period = parseInt(formData.value.period);
parameters.multiplier = parseFloat(formData.value.multiplier);
parameters.useClose = formData.value.useClose;
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);
uni.showLoading({ title: isEditMode.value ? '更新中' : '保存中' });
@ -391,17 +388,17 @@ const loadStrategyDetail = async (id) => {
if (response.code === 200) {
const data = response.data;
isEditMode.value = true;
strategyId.value = data.Id;
currentType.value = data.Type;
strategyId.value = data.id;
currentType.value = data.type;
//
formData.value.name = data.Title || '';
formData.value.description = data.Description || '';
formData.value.riskLevel = data.RiskLevel || 'medium';
formData.value.tags = data.Tags ? data.Tags.join(', ') : '';
formData.value.name = data.name || '';
formData.value.description = data.description || '';
formData.value.riskLevel = data.riskLevel || 'medium';
formData.value.tags = data.tags ? data.tags.join(', ') : '';
//
const params = data.Parameters || {};
const params = data.config ? JSON.parse(data.config) : {};
switch (data.Type) {
case 'ma_trend':
formData.value.maType = params.maType || 'SMA';

View File

@ -73,14 +73,15 @@ const fetchStrategies = async () => {
const response = await api.strategies.getStrategies();
if (response.code === 200) {
strategies.value = response.data.map(item => ({
id: item.Id,
title: item.Title,
tag: item.Tags?.[0] || '策略',
desc: item.Description,
tags: item.Tags || [],
bgClass: item.Type === 'ma_trend' ? 'bg-emerald-900' : item.Type === 'risk_parity' ? 'bg-blue-600' : 'bg-orange-500',
tagClass: item.Type === 'ma_trend' ? 'text-emerald-700' : item.Type === 'risk_parity' ? 'text-blue-700' : 'text-orange-700',
iconChar: item.Title?.charAt(0) || 'S',
id: item.id,
title: item.name,
tag: item.tags?.[0] || '策略',
desc: item.description,
tags: item.tags || [],
riskLevel: item.riskLevel,
bgClass: item.type === 'ma_trend' ? 'bg-emerald-900' : item.type === 'risk_parity' ? 'bg-blue-600' : 'bg-orange-500',
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',
btnText: '配置'
}));