修复: 升级框架并完善报告导出

- 升级 Drogon 和 Trantor,修复畸形请求导致的连接计数泄漏\n- 增加第三方框架版本校验与自动重建\n- 完善完整报告导出和接口文档
This commit is contained in:
cloud
2026-08-10 09:50:09 +08:00
parent 99ed321d24
commit 0e28826073
82 changed files with 3095 additions and 566 deletions
+40 -3
View File
@@ -75,6 +75,7 @@ const DEFAULT_SCHEMES = [
generator_speed_k: 0.9,
rotor_radius: 78,
gearbox_ratio: 162,
report_wind_speed_interval: 0.25,
},
},
{
@@ -85,6 +86,7 @@ const DEFAULT_SCHEMES = [
grid_connected_speed: 1030,
rated_generator_speed: 1755,
rated_power: 2000,
report_wind_speed_interval: 0.25,
},
},
];
@@ -93,6 +95,7 @@ const DEFAULT_SCHEME_TWO_PARAMS = {
grid_connected_speed: '1030',
rated_generator_speed: '1755',
rated_power: '2000',
report_wind_speed_interval: '0.25',
};
const DEFAULT_SCHEME_ONE_PARAMS = {
rated_power: '4800',
@@ -106,6 +109,7 @@ const DEFAULT_SCHEME_ONE_PARAMS = {
generator_speed_k: '0.9',
rotor_radius: '78',
gearbox_ratio: '162',
report_wind_speed_interval: '0.25',
};
const SCHEME_ONE_PARAM_FIELDS = [
{ key: 'rated_power', label: '额定功率', unit: 'kW', min: '0', step: '0.1' },
@@ -119,6 +123,7 @@ const SCHEME_ONE_PARAM_FIELDS = [
{ key: 'generator_speed_k', label: '发电机转速系数 K', unit: '', min: '0', step: '0.01' },
{ key: 'rotor_radius', label: '叶轮半径', unit: 'm', min: '0', step: '0.01' },
{ key: 'gearbox_ratio', label: '齿轮箱传动比', unit: '', min: '0', step: '0.01' },
{ key: 'report_wind_speed_interval', label: '报告公式风速区间半宽', unit: 'm/s', min: '0', step: '0.01' },
];
const CHART_STATE_KEY = 'wind_power_chart_state_v1';
const DEFAULT_CHART_OPTIONS = {
@@ -2045,6 +2050,8 @@ export default function HomePage() {
chart_image: chartImageData || '',
});
downloadReportBlob(blob, selectedFan);
setExportingReport(false);
setReportExportProgress('');
} catch (err) {
const message = err.message || '导出完整报告失败';
setError(message);
@@ -2141,6 +2148,7 @@ export default function HomePage() {
const gridConnectedSpeed = normalizeNumber(schemeTwoParams.grid_connected_speed);
const ratedGeneratorSpeed = normalizeNumber(schemeTwoParams.rated_generator_speed);
const ratedPower = normalizeNumber(schemeTwoParams.rated_power);
const reportWindSpeedInterval = normalizeNumber(schemeTwoParams.report_wind_speed_interval);
if (selectedScheme.id === DEFAULT_SCHEME_ID &&
(!Number.isFinite(schemeOneValues.rated_power) || schemeOneValues.rated_power <= 0 ||
!Number.isFinite(schemeOneValues.rated_wind_speed) || schemeOneValues.rated_wind_speed <= 0 ||
@@ -2148,6 +2156,9 @@ export default function HomePage() {
!Number.isFinite(schemeOneValues.cleaning_wind_speed_step) || schemeOneValues.cleaning_wind_speed_step <= 0 ||
!Number.isFinite(schemeOneValues.rotor_radius) || schemeOneValues.rotor_radius <= 0 ||
!Number.isFinite(schemeOneValues.gearbox_ratio) || schemeOneValues.gearbox_ratio <= 0 ||
!Number.isFinite(schemeOneValues.report_wind_speed_interval) ||
schemeOneValues.report_wind_speed_interval <= 0 ||
schemeOneValues.report_wind_speed_interval > 2 ||
['wind_speed_change_threshold', 'iqr_lower_multiplier', 'iqr_upper_multiplier',
'minimum_generator_speed', 'generator_speed_k'].some((field) => (
!Number.isFinite(schemeOneValues[field]) || schemeOneValues[field] < 0
@@ -2155,9 +2166,11 @@ export default function HomePage() {
throw new Error('方案一参数必须为合法数值,额定与步长参数、叶轮半径和传动比必须大于 0');
}
if (selectedScheme.id === SCHEME_TWO_ID &&
(!Number.isFinite(gridConnectedSpeed) || gridConnectedSpeed <= 0 ||
(!Number.isFinite(gridConnectedSpeed) || gridConnectedSpeed <= 0 ||
!Number.isFinite(ratedGeneratorSpeed) || ratedGeneratorSpeed <= 0 ||
!Number.isFinite(ratedPower) || ratedPower <= 0)) {
!Number.isFinite(ratedPower) || ratedPower <= 0 ||
!Number.isFinite(reportWindSpeedInterval) || reportWindSpeedInterval <= 0 ||
reportWindSpeedInterval > 2)) {
throw new Error('方案二参数必须为正数');
}
const data = await saveWindSchemeDescription(selectedScheme.id, {
@@ -2168,6 +2181,7 @@ export default function HomePage() {
grid_connected_speed: gridConnectedSpeed,
rated_generator_speed: ratedGeneratorSpeed,
rated_power: ratedPower,
report_wind_speed_interval: reportWindSpeedInterval,
},
} : {}),
});
@@ -2288,6 +2302,9 @@ export default function HomePage() {
schemeOneValues.cleaning_wind_speed_step <= 0 ||
!Number.isFinite(schemeOneValues.rotor_radius) || schemeOneValues.rotor_radius <= 0 ||
!Number.isFinite(schemeOneValues.gearbox_ratio) || schemeOneValues.gearbox_ratio <= 0 ||
!Number.isFinite(schemeOneValues.report_wind_speed_interval) ||
schemeOneValues.report_wind_speed_interval <= 0 ||
schemeOneValues.report_wind_speed_interval > 2 ||
['wind_speed_change_threshold', 'iqr_lower_multiplier', 'iqr_upper_multiplier',
'minimum_generator_speed', 'generator_speed_k'].some((field) => (
!Number.isFinite(schemeOneValues[field]) || schemeOneValues[field] < 0
@@ -2299,10 +2316,13 @@ export default function HomePage() {
const gridConnectedSpeed = normalizeNumber(schemeTwoParams.grid_connected_speed);
const ratedGeneratorSpeed = normalizeNumber(schemeTwoParams.rated_generator_speed);
const ratedPower = normalizeNumber(schemeTwoParams.rated_power);
const reportWindSpeedInterval = normalizeNumber(schemeTwoParams.report_wind_speed_interval);
if (isSchemeTwo &&
(!Number.isFinite(gridConnectedSpeed) || gridConnectedSpeed <= 0 ||
!Number.isFinite(ratedGeneratorSpeed) || ratedGeneratorSpeed <= 0 ||
!Number.isFinite(ratedPower) || ratedPower <= 0)) {
!Number.isFinite(ratedPower) || ratedPower <= 0 ||
!Number.isFinite(reportWindSpeedInterval) || reportWindSpeedInterval <= 0 ||
reportWindSpeedInterval > 2)) {
setError('方案二需要填写并网转速、额定转速和额定功率,且必须为正数');
return;
}
@@ -2354,6 +2374,7 @@ export default function HomePage() {
grid_connected_speed: gridConnectedSpeed,
rated_generator_speed: ratedGeneratorSpeed,
rated_power: ratedPower,
report_wind_speed_interval: reportWindSpeedInterval,
} : {}),
},
});
@@ -2520,6 +2541,22 @@ export default function HomePage() {
placeholder="请输入"
/>
</label>
<label className="fieldControl">
<span>报告公式风速区间半宽 (m/s)</span>
<input
type="number"
min="0"
max="2"
step="0.01"
value={schemeTwoParams.report_wind_speed_interval}
onChange={(event) => handleSchemeTwoParamChange(
'report_wind_speed_interval',
event.target.value,
)}
disabled={submitting || savingScheme}
placeholder="请输入"
/>
</label>
</div>
)}
<div className="schemeFooter">