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(); 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'
})); }));
} }

View File

@ -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';

View File

@ -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: '配置'
})); }));