fix: 统一策略数据字段命名并重构参数处理
将策略数据字段从大驼峰命名改为小驼峰命名,保持前后端一致性 重构参数处理逻辑,将参数配置统一序列化为JSON字符串存储
This commit is contained in:
parent
bf4fa243ec
commit
bb09255dbd
@ -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'
|
||||
}));
|
||||
}
|
||||
|
||||
@ -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 => ({
|
||||
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';
|
||||
|
||||
@ -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: '配置'
|
||||
}));
|
||||
|
||||
Loading…
Reference in New Issue
Block a user