Update App.jsx via upload script - 2026-07-29 17:43:34

This commit is contained in:
mike 2026-07-29 17:43:58 +08:00
parent 857b2d4378
commit dd2aa43095
1 changed files with 223 additions and 2 deletions

225
App.jsx
View File

@ -351,6 +351,31 @@ const TRANSLATION_DICTIONARY = {
'系统柜重量(kg)': { en: 'Cabinet Weight (kg)', fr: "Poids de l'armoire (kg)", ru: 'Вес шкафа (кг)', es: 'Peso del gabinete (kg)', ar: 'وزن الخزانة (كجم)' }, '系统柜重量(kg)': { en: 'Cabinet Weight (kg)', fr: "Poids de l'armoire (kg)", ru: 'Вес шкафа (кг)', es: 'Peso del gabinete (kg)', ar: 'وزن الخزانة (كجم)' },
'海拔(m)': { en: 'Altitude (m)', fr: 'Altitude (m)', ru: 'Высота над уровнем моря (м)', es: 'Altitud (m)', ar: 'الارتفاع (م)' }, '海拔(m)': { en: 'Altitude (m)', fr: 'Altitude (m)', ru: 'Высота над уровнем моря (м)', es: 'Altitud (m)', ar: 'الارتفاع (م)' },
'自放电率': { en: 'Self-discharge Rate', fr: "Taux d'autodécharge", ru: 'Скорость саморазряда', es: 'Tasa de autodescarga', ar: 'معدل التفريغ الذاتي' }, '自放电率': { en: 'Self-discharge Rate', fr: "Taux d'autodécharge", ru: 'Скорость саморазряда', es: 'Tasa de autodescarga', ar: 'معدل التفريغ الذاتي' },
'电池类型': { en: 'Battery Type', fr: 'Type de batterie', ru: 'Тип батареи', es: 'Tipo de batería', ar: 'نوع البطارية' },
'最大充电电压': { en: 'Max Charging Voltage', fr: 'Tension de charge maximale', ru: 'Макс. напряжение зарядки', es: 'Voltaje máximo de carga', ar: 'أقصى جهد شحن' },
'最大充放电电流': { en: 'Max Charge/Discharge Current', fr: 'Courant max de charge/décharge', ru: 'Макс. ток заряда/разряда', es: 'Corriente máxima de carga/descarga', ar: 'أقصى تيار شحن/تفريغ' },
'最大直流输入功率': { en: 'Max DC Input Power', fr: "Puissance d'entrée CC maximale", ru: 'Макс. мощность входа пост. тока', es: 'Potencia máxima de entrada CC', ar: 'أقصى طاقة دخل التيار المستمر' },
'最大直流输入电压': { en: 'Max DC Input Voltage', fr: "Tension d'entrée CC maximale", ru: 'Макс. входное напряжение пост. тока', es: 'Voltaje máximo de entrada CC', ar: 'أقصى جهد دخل التيار المستمر' },
'MPPT工作电压范围': { en: 'MPPT Operating Voltage Range', fr: 'Plage de tension MPPT', ru: 'Диапазон рабочего напряжения MPPT', es: 'Rango de voltaje de operación MPPT', ar: 'نطاق جهد تشغيل MPPT' },
'启动电压': { en: 'Starting Voltage', fr: 'Tension de démarrage', ru: 'Напряжение запуска', es: 'Voltaje de arranque', ar: 'جهد البدء' },
'最大输入电流': { en: 'Max Input Current', fr: "Courant d'entrée maximal", ru: 'Макс. входной ток', es: 'Corriente de entrada máxima', ar: 'أقصى تيار دخل' },
'MPPT路数': { en: 'Number of MPPT Trackers', fr: 'Nombre de trackers MPPT', ru: 'Кол-во трекеров MPPT', es: 'Número de rastreadores MPPT', ar: 'عدد متتبعات MPPT' },
'并网最大输出视在功率': { en: 'Max Output Apparent Power (On-Grid)', fr: 'Puissance apparente max de sortie (Réseau)', ru: 'Макс. полная выходная мощность (сеть)', es: 'Potencia aparente máxima de salida (Red)', ar: 'أقصى قدرة ظاهرية للخرج (متصل بالشبكة)' },
'额定输出频率': { en: 'Rated Output Frequency', fr: 'Fréquence de sortie nominale', ru: 'Номинальная выходная частота', es: 'Frecuencia de salida nominal', ar: 'تردد الخرج الاسمي' },
'并网最大输出电流': { en: 'Max Output Current (On-Grid)', fr: 'Courant de sortie max (Réseau)', ru: 'Макс. выходной ток (сеть)', es: 'Corriente de salida máxima (Red)', ar: 'أقصى تيار خرج (متصل بالشبكة)' },
'离网额定输出视在功率': { en: 'Rated Output Apparent Power (Off-Grid)', fr: 'Puissance apparente nominale de sortie (Hors réseau)', ru: 'Номинальная полная выходная мощность (авт.)', es: 'Potencia aparente nominal de salida (Aislada)', ar: 'القدرة الظاهرية الاسمية للخرج (خارج الشبكة)' },
'离网最大输出视在功率': { en: 'Max Output Apparent Power (Off-Grid)', fr: 'Puissance apparente max de sortie (Hors réseau)', ru: 'Макс. полная выходная мощность (авт.)', es: 'Potencia aparente máxima de salida (Aislada)', ar: 'أقصى قدرة ظاهرية للخرج (خارج الشبكة)' },
'离网最大输出电流': { en: 'Max Output Current (Off-Grid)', fr: 'Courant de sortie max (Hors réseau)', ru: 'Макс. выходной ток (авт.)', es: 'Corriente de salida máxima (Aislada)', ar: 'أقصى تيار خرج (خارج الشبكة)' },
'最大效率(MPPT)': { en: 'Max Efficiency (MPPT)', fr: 'Rendement max (MPPT)', ru: 'Макс. КПД (MPPT)', es: 'Eficiencia máxima (MPPT)', ar: 'أقصى كفاءة (MPPT)' },
'最大效率': { en: 'Max Efficiency', fr: 'Rendement maximal', ru: 'Максимальный КПД', es: 'Eficiencia máxima', ar: 'أقصى كفاءة' },
'欧洲效率': { en: 'European Efficiency', fr: 'Rendement européen', ru: 'Европейский КПД', es: 'Eficiencia europea', ar: 'الكفاءة الأوروبية' },
'存储温度': { en: 'Storage Temperature', fr: 'Température de stockage', ru: 'Температура хранения', es: 'Temperatura de almacenamiento', ar: 'درجة حرارة التخزين' },
'散热方式': { en: 'Cooling', fr: 'Refroidissement', ru: 'Охлаждение', es: 'Refrigeración', ar: 'التبريد' },
'防护等级': { en: 'Protection Class', fr: 'Indice de protection', ru: 'Класс защиты', es: 'Clase de protección', ar: 'درجة الحماية' },
'拓扑结构': { en: 'Topology', fr: 'Topologie', ru: 'Топология', es: 'Topología', ar: 'البنية الطوبولوجية' },
'安规/EMC标准': { en: 'Safety/EMC Standard', fr: 'Norme de sécurité/CEM', ru: 'Стандарт безопасности/ЭМС', es: 'Norma de seguridad/EMC', ar: 'معيار السلامة/التوافق الكهرومغناطيسي' },
'并网标准': { en: 'Grid-connected Standard', fr: 'Norme de raccordement au réseau', ru: 'Стандарт подключения к сети', es: 'Norma de conexión a red', ar: 'معيار الاتصال بالشبكة' },
'其他标准': { en: 'Other Standard', fr: 'Autre norme', ru: 'Другой стандарт', es: 'Otra norma', ar: 'معيار آخر' },
'在线式高频UPS': { en: 'Online High-Frequency UPS', fr: 'Onduleur en ligne haute fréquence', ru: 'Онлайн высокочастотный ИБП', es: 'SAI en línea de alta frecuencia', ar: 'يو بي إس عالي التردد أونلاين' }, '在线式高频UPS': { en: 'Online High-Frequency UPS', fr: 'Onduleur en ligne haute fréquence', ru: 'Онлайн высокочастотный ИБП', es: 'SAI en línea de alta frecuencia', ar: 'يو بي إس عالي التردد أونلاين' },
'电压': { en: 'Voltage', fr: 'Tension', ru: 'Напряжение', es: 'Voltaje', ar: 'الجهد' }, '电压': { en: 'Voltage', fr: 'Tension', ru: 'Напряжение', es: 'Voltaje', ar: 'الجهد' },
'视载功率': { en: 'Rated Power (VA)', fr: 'Puissance nominale (VA)', ru: 'Номинальная мощность (ВА)', es: 'Potencia nominal (VA)', ar: 'الطاقة الاسمية (فولت أمبير)' }, '视载功率': { en: 'Rated Power (VA)', fr: 'Puissance nominale (VA)', ru: 'Номинальная мощность (ВА)', es: 'Potencia nominal (VA)', ar: 'الطاقة الاسمية (فولت أمبير)' },
@ -430,7 +455,43 @@ async function resolveExportTranslations(terms, lang) {
function productExportRows(p, categories) { function productExportRows(p, categories) {
const cat = (categories || []).find(c => c.id === p.category); const cat = (categories || []).find(c => c.id === p.category);
const rows = []; const rows = [];
if (isBatteryCategory(cat) && p.type === 'UPS配套锂电池系统') { if (isInverterCategory(cat) && p.type === '太阳能混网逆变器') {
if (p.batteryType) rows.push({ labelKey: '电池类型', value: p.batteryType });
if (p.batteryVoltage) rows.push({ labelKey: '电池电压', value: p.batteryVoltage });
if (p.maxChargingVoltage) rows.push({ labelKey: '最大充电电压', value: p.maxChargingVoltage });
if (p.maxChargeDischargeCurrent) rows.push({ labelKey: '最大充放电电流', value: p.maxChargeDischargeCurrent });
if (p.maxDcInputPower) rows.push({ labelKey: '最大直流输入功率', value: p.maxDcInputPower });
if (p.maxDcInputVoltage) rows.push({ labelKey: '最大直流输入电压', value: p.maxDcInputVoltage });
if (p.mpptVoltageRange) rows.push({ labelKey: 'MPPT工作电压范围', value: p.mpptVoltageRange });
if (p.startingVoltage) rows.push({ labelKey: '启动电压', value: p.startingVoltage });
if (p.maxInputCurrent) rows.push({ labelKey: '最大输入电流', value: p.maxInputCurrent });
if (p.mpptNumber) rows.push({ labelKey: 'MPPT路数', value: p.mpptNumber });
if (p.onGridMaxApparentPower) rows.push({ labelKey: '并网最大输出视在功率', value: p.onGridMaxApparentPower });
if (p.outputVoltage) rows.push({ labelKey: '输出电压', value: p.outputVoltage });
if (p.ratedOutputFrequency) rows.push({ labelKey: '额定输出频率', value: p.ratedOutputFrequency });
if (p.onGridMaxOutputCurrent) rows.push({ labelKey: '并网最大输出电流', value: p.onGridMaxOutputCurrent });
if (p.outputPowerFactor) rows.push({ labelKey: '输出功率因数', value: p.outputPowerFactor });
if (p.offGridRatedApparentPower) rows.push({ labelKey: '离网额定输出视在功率', value: p.offGridRatedApparentPower });
if (p.offGridMaxApparentPower) rows.push({ labelKey: '离网最大输出视在功率', value: p.offGridMaxApparentPower });
if (p.offGridMaxOutputCurrent) rows.push({ labelKey: '离网最大输出电流', value: p.offGridMaxOutputCurrent });
if (p.efficiencyMppt) rows.push({ labelKey: '最大效率(MPPT)', value: p.efficiencyMppt });
if (p.efficiencyMax) rows.push({ labelKey: '最大效率', value: p.efficiencyMax });
if (p.efficiencyEurope) rows.push({ labelKey: '欧洲效率', value: p.efficiencyEurope });
if (p.protectionFunctions) rows.push({ labelKey: '保护功能', value: p.protectionFunctions });
if (p.operatingTemp) rows.push({ labelKey: '运行温度', value: p.operatingTemp });
if (p.storageTemp) rows.push({ labelKey: '存储温度', value: p.storageTemp });
if (p.humidity) rows.push({ labelKey: '湿度', value: p.humidity });
if (p.altitude) rows.push({ labelKey: '海拔(m)', value: p.altitude });
if (p.cooling) rows.push({ labelKey: '散热方式', value: p.cooling });
if (p.noiseLevel) rows.push({ labelKey: '噪音', value: p.noiseLevel });
if (p.netWeight) rows.push({ labelKey: '净重(kg)', value: p.netWeight });
if (p.dimensions) rows.push({ labelKey: '尺寸(mm)', value: p.dimensions });
if (p.protectionClass) rows.push({ labelKey: '防护等级', value: p.protectionClass });
if (p.topology) rows.push({ labelKey: '拓扑结构', value: p.topology });
if (p.safetyStandard) rows.push({ labelKey: '安规/EMC标准', value: p.safetyStandard });
if (p.gridStandard) rows.push({ labelKey: '并网标准', value: p.gridStandard });
if (p.otherStandard) rows.push({ labelKey: '其他标准', value: p.otherStandard });
} else if (isBatteryCategory(cat) && p.type === 'UPS配套锂电池系统') {
if (p.moduleType) rows.push({ labelKey: '模块类型', value: p.moduleType }); if (p.moduleType) rows.push({ labelKey: '模块类型', value: p.moduleType });
if (p.moduleCapacity) rows.push({ labelKey: '额定容量', value: p.moduleCapacity }); if (p.moduleCapacity) rows.push({ labelKey: '额定容量', value: p.moduleCapacity });
if (p.cellType) rows.push({ labelKey: '电芯类型', value: p.cellType }); if (p.cellType) rows.push({ labelKey: '电芯类型', value: p.cellType });
@ -679,6 +740,32 @@ const blankProduct = () => ({
cabinetWeight: '', // (kg) "544±108" cabinetWeight: '', // (kg) "544±108"
altitude: '', // (m) "4000>2000使" altitude: '', // (m) "4000>2000使"
selfDischargeRate: '', // "<5%030/30" selfDischargeRate: '', // "<5%030/30"
// PVAC(/)
batteryType: '', // "Lithium or lead acid battery"
maxChargingVoltage: '', // "60 (Configurable)"
maxChargeDischargeCurrent: '', // "190A"
maxDcInputPower: '', // "16000W"
maxDcInputVoltage: '', // "1000V"
mpptVoltageRange: '', // MPPT "200~800V"
startingVoltage: '', // "150V"
maxInputCurrent: '', // "18/18A"
mpptNumber: '', // MPPT "2"
onGridMaxApparentPower: '', // "8800W"
ratedOutputFrequency: '', // "50/60Hz"
onGridMaxOutputCurrent: '', // "13.3A"
offGridRatedApparentPower: '', // "8000W"
offGridMaxApparentPower: '', // ">200%,15sec"
offGridMaxOutputCurrent: '', // "13.3A"
efficiencyMppt: '', // (MPPT) "98%"
efficiencyMax: '', // "94.5%"
efficiencyEurope: '', // "97.5%"
storageTemp: '', // "-30~65°C"
cooling: '', // "Intelligent forced air cooling"
protectionClass: '', // "IP66"
topology: '', // "HF isolation(Battery side)"
safetyStandard: '', // /EMC
gridStandard: '', //
otherStandard: '', //
batterySpec: '', // "12V4.5AH*1"UPS/线/线UPS batterySpec: '', // "12V4.5AH*1"UPS/线/线UPS
dimensions: '', // (mm)UPS/线/线UPS dimensions: '', // (mm)UPS/线/线UPS
netWeight: '', // (kg)UPS/线/线UPS netWeight: '', // (kg)UPS/线/线UPS
@ -693,6 +780,9 @@ function isUpsCategory(cat) {
function isBatteryCategory(cat) { function isBatteryCategory(cat) {
return !!cat && (cat.id === 'battery' || cat.name === '储能电池'); return !!cat && (cat.id === 'battery' || cat.name === '储能电池');
} }
function isInverterCategory(cat) {
return !!cat && (cat.id === 'inverter' || cat.name === '光伏逆变器');
}
function spaceToAsterisk(v) { return (v || '').replace(/ /g, '*'); } function spaceToAsterisk(v) { return (v || '').replace(/ /g, '*'); }
function computeMaxPowerKW(ratedPower, ratedPowerUnit, powerFactor) { function computeMaxPowerKW(ratedPower, ratedPowerUnit, powerFactor) {
const rp = parseFloat(ratedPower); const rp = parseFloat(ratedPower);
@ -704,6 +794,45 @@ function computeMaxPowerKW(ratedPower, ratedPowerUnit, powerFactor) {
} }
function powerInfoItems(p, categories) { function powerInfoItems(p, categories) {
const cat = (categories || []).find(c => c.id === p.category); const cat = (categories || []).find(c => c.id === p.category);
if (isInverterCategory(cat) && p.type === '太阳能混网逆变器') {
const items = [];
if (p.batteryType) items.push({ key: 'batterytype', label: '电池类型', value: p.batteryType });
if (p.batteryVoltage) items.push({ key: 'batteryvoltage', label: '电池电压', value: p.batteryVoltage });
if (p.maxChargingVoltage) items.push({ key: 'maxchargingvoltage', label: '最大充电电压', value: p.maxChargingVoltage });
if (p.maxChargeDischargeCurrent) items.push({ key: 'maxchargedischarge', label: '最大充放电电流', value: p.maxChargeDischargeCurrent });
if (p.maxDcInputPower) items.push({ key: 'maxdcpower', label: '最大直流输入功率', value: p.maxDcInputPower });
if (p.maxDcInputVoltage) items.push({ key: 'maxdcvoltage', label: '最大直流输入电压', value: p.maxDcInputVoltage });
if (p.mpptVoltageRange) items.push({ key: 'mpptrange', label: 'MPPT工作电压范围', value: p.mpptVoltageRange });
if (p.startingVoltage) items.push({ key: 'startvoltage', label: '启动电压', value: p.startingVoltage });
if (p.maxInputCurrent) items.push({ key: 'maxinputcurrent', label: '最大输入电流', value: p.maxInputCurrent });
if (p.mpptNumber) items.push({ key: 'mpptnum', label: 'MPPT路数', value: p.mpptNumber });
if (p.onGridMaxApparentPower) items.push({ key: 'ongridpower', label: '并网最大输出视在功率', value: p.onGridMaxApparentPower });
if (p.outputVoltage) items.push({ key: 'outputvoltage', label: '输出电压', value: p.outputVoltage });
if (p.ratedOutputFrequency) items.push({ key: 'outputfreq', label: '额定输出频率', value: p.ratedOutputFrequency });
if (p.onGridMaxOutputCurrent) items.push({ key: 'ongridcurrent', label: '并网最大输出电流', value: p.onGridMaxOutputCurrent });
if (p.outputPowerFactor) items.push({ key: 'outputpf', label: '输出功率因数', value: p.outputPowerFactor });
if (p.offGridRatedApparentPower) items.push({ key: 'offgridrated', label: '离网额定输出视在功率', value: p.offGridRatedApparentPower });
if (p.offGridMaxApparentPower) items.push({ key: 'offgridmax', label: '离网最大输出视在功率', value: p.offGridMaxApparentPower });
if (p.offGridMaxOutputCurrent) items.push({ key: 'offgridcurrent', label: '离网最大输出电流', value: p.offGridMaxOutputCurrent });
if (p.efficiencyMppt) items.push({ key: 'effmppt', label: '最大效率(MPPT)', value: p.efficiencyMppt });
if (p.efficiencyMax) items.push({ key: 'effmax', label: '最大效率', value: p.efficiencyMax });
if (p.efficiencyEurope) items.push({ key: 'effeurope', label: '欧洲效率', value: p.efficiencyEurope });
if (p.protectionFunctions) items.push({ key: 'protectionfunc', label: '保护功能', value: p.protectionFunctions });
if (p.operatingTemp) items.push({ key: 'operatingtemp', label: '运行温度', value: p.operatingTemp });
if (p.storageTemp) items.push({ key: 'storagetemp', label: '存储温度', value: p.storageTemp });
if (p.humidity) items.push({ key: 'humidity', label: '湿度', value: p.humidity });
if (p.altitude) items.push({ key: 'altitude', label: '海拔(m)', value: p.altitude });
if (p.cooling) items.push({ key: 'cooling', label: '散热方式', value: p.cooling });
if (p.noiseLevel) items.push({ key: 'noiselevel', label: '噪音', value: p.noiseLevel });
if (p.netWeight) items.push({ key: 'weight', label: '净重(kg)', value: p.netWeight });
if (p.dimensions) items.push({ key: 'dim', label: '尺寸(mm)', value: p.dimensions });
if (p.protectionClass) items.push({ key: 'protectionclass', label: '防护等级', value: p.protectionClass });
if (p.topology) items.push({ key: 'topology', label: '拓扑结构', value: p.topology });
if (p.safetyStandard) items.push({ key: 'safetystd', label: '安规/EMC标准', value: p.safetyStandard });
if (p.gridStandard) items.push({ key: 'gridstd', label: '并网标准', value: p.gridStandard });
if (p.otherStandard) items.push({ key: 'otherstd', label: '其他标准', value: p.otherStandard });
return items;
}
if (isBatteryCategory(cat) && p.type === 'UPS配套锂电池系统') { if (isBatteryCategory(cat) && p.type === 'UPS配套锂电池系统') {
const items = []; const items = [];
if (p.moduleType) items.push({ key: 'moduletype', label: '模块类型', value: p.moduleType }); if (p.moduleType) items.push({ key: 'moduletype', label: '模块类型', value: p.moduleType });
@ -2224,6 +2353,18 @@ function MainApp({ username, onLogout }) {
operatingTemp: p.operatingTemp || '', color: p.color || '', operatingTemp: p.operatingTemp || '', color: p.color || '',
cabinetDimensions: p.cabinetDimensions || '', cabinetWeight: p.cabinetWeight || '', cabinetDimensions: p.cabinetDimensions || '', cabinetWeight: p.cabinetWeight || '',
altitude: p.altitude || '', selfDischargeRate: p.selfDischargeRate || '', altitude: p.altitude || '', selfDischargeRate: p.selfDischargeRate || '',
batteryType: p.batteryType || '', maxChargingVoltage: p.maxChargingVoltage || '',
maxChargeDischargeCurrent: p.maxChargeDischargeCurrent || '', maxDcInputPower: p.maxDcInputPower || '',
maxDcInputVoltage: p.maxDcInputVoltage || '', mpptVoltageRange: p.mpptVoltageRange || '',
startingVoltage: p.startingVoltage || '', maxInputCurrent: p.maxInputCurrent || '', mpptNumber: p.mpptNumber || '',
onGridMaxApparentPower: p.onGridMaxApparentPower || '', ratedOutputFrequency: p.ratedOutputFrequency || '',
onGridMaxOutputCurrent: p.onGridMaxOutputCurrent || '', offGridRatedApparentPower: p.offGridRatedApparentPower || '',
offGridMaxApparentPower: p.offGridMaxApparentPower || '', offGridMaxOutputCurrent: p.offGridMaxOutputCurrent || '',
efficiencyMppt: p.efficiencyMppt || '', efficiencyMax: p.efficiencyMax || '', efficiencyEurope: p.efficiencyEurope || '',
storageTemp: p.storageTemp || '', cooling: p.cooling || '', protectionClass: p.protectionClass || '',
topology: p.topology || '', safetyStandard: p.safetyStandard || '', gridStandard: p.gridStandard || '',
otherStandard: p.otherStandard || '',
sellingPoints: p.sellingPoints || '', // AI/
batterySpec: p.batterySpec || '', dimensions: p.dimensions || '', netWeight: p.netWeight || '', notes: p.notes || '', batterySpec: p.batterySpec || '', dimensions: p.dimensions || '', netWeight: p.netWeight || '', notes: p.notes || '',
})); }));
setAiImportDrafts(drafts); setAiImportDrafts(drafts);
@ -2289,6 +2430,18 @@ function MainApp({ username, onLogout }) {
operatingTemp: d.operatingTemp || '', color: d.color || '', operatingTemp: d.operatingTemp || '', color: d.color || '',
cabinetDimensions: d.cabinetDimensions || '', cabinetWeight: d.cabinetWeight || '', cabinetDimensions: d.cabinetDimensions || '', cabinetWeight: d.cabinetWeight || '',
altitude: d.altitude || '', selfDischargeRate: d.selfDischargeRate || '', altitude: d.altitude || '', selfDischargeRate: d.selfDischargeRate || '',
batteryType: d.batteryType || '', maxChargingVoltage: d.maxChargingVoltage || '',
maxChargeDischargeCurrent: d.maxChargeDischargeCurrent || '', maxDcInputPower: d.maxDcInputPower || '',
maxDcInputVoltage: d.maxDcInputVoltage || '', mpptVoltageRange: d.mpptVoltageRange || '',
startingVoltage: d.startingVoltage || '', maxInputCurrent: d.maxInputCurrent || '', mpptNumber: d.mpptNumber || '',
onGridMaxApparentPower: d.onGridMaxApparentPower || '', ratedOutputFrequency: d.ratedOutputFrequency || '',
onGridMaxOutputCurrent: d.onGridMaxOutputCurrent || '', offGridRatedApparentPower: d.offGridRatedApparentPower || '',
offGridMaxApparentPower: d.offGridMaxApparentPower || '', offGridMaxOutputCurrent: d.offGridMaxOutputCurrent || '',
efficiencyMppt: d.efficiencyMppt || '', efficiencyMax: d.efficiencyMax || '', efficiencyEurope: d.efficiencyEurope || '',
storageTemp: d.storageTemp || '', cooling: d.cooling || '', protectionClass: d.protectionClass || '',
topology: d.topology || '', safetyStandard: d.safetyStandard || '', gridStandard: d.gridStandard || '',
otherStandard: d.otherStandard || '',
sellingPoints: d.sellingPoints || '',
batterySpec: d.batterySpec || '', dimensions: d.dimensions || '', netWeight: d.netWeight || '', notes: d.notes || '', batterySpec: d.batterySpec || '', dimensions: d.dimensions || '', netWeight: d.netWeight || '', notes: d.notes || '',
}; };
} }
@ -3558,6 +3711,7 @@ function MainApp({ username, onLogout }) {
d.dimensions && `尺寸:${d.dimensions}`, d.dimensions && `尺寸:${d.dimensions}`,
d.netWeight && `净重:${d.netWeight}`, d.netWeight && `净重:${d.netWeight}`,
(d.outputPortTypes && d.outputPortTypes.length) ? `输出口:${d.outputPortTypes.join('/')}` : '', (d.outputPortTypes && d.outputPortTypes.length) ? `输出口:${d.outputPortTypes.join('/')}` : '',
d.sellingPoints ? `✓已识别对客卖点(${d.sellingPoints.split('\n').filter(Boolean).length}条)` : '',
].filter(Boolean).join(' · ') || '(无更多规格信息)'} ].filter(Boolean).join(' · ') || '(无更多规格信息)'}
</div> </div>
</div> </div>
@ -3880,6 +4034,7 @@ function ProductForm({ draft, setDraft, onSave, onCancel, categories, onManage,
const isOnlineHighFreq = isUps && draft.type === '在线式高频UPS'; const isOnlineHighFreq = isUps && draft.type === '在线式高频UPS';
const isRackLikeUps = isRackUps || isOnlineHighFreq; const isRackLikeUps = isRackUps || isOnlineHighFreq;
const isBatterySystem = isBatteryCategory(cat) && draft.type === 'UPS配套锂电池系统'; const isBatterySystem = isBatteryCategory(cat) && draft.type === 'UPS配套锂电池系统';
const isSolarHybridInverter = isInverterCategory(cat) && draft.type === '太阳能混网逆变器';
const maxKW = computeMaxPowerKW(draft.ratedPower, draft.ratedPowerUnit, draft.powerFactor); const maxKW = computeMaxPowerKW(draft.ratedPower, draft.ratedPowerUnit, draft.powerFactor);
const extraNames = draft.extraNames || []; const extraNames = draft.extraNames || [];
const [imageUploading, setImageUploading] = useState(false); const [imageUploading, setImageUploading] = useState(false);
@ -4026,7 +4181,73 @@ function ProductForm({ draft, setDraft, onSave, onCancel, categories, onManage,
</div> </div>
)} )}
{isBatterySystem ? ( {isSolarHybridInverter ? (
<>
<div className="grid-2">
<div className="field"><span className="field-label">电池类型</span><input className="input" value={draft.batteryType} onChange={e => set({ batteryType: e.target.value })} placeholder="如Lithium or lead acid battery" /></div>
<div className="field"><span className="field-label">电池电压</span><input className="input" value={draft.batteryVoltage} onChange={e => set({ batteryVoltage: e.target.value })} placeholder="如48V" /></div>
</div>
<div className="grid-2">
<div className="field"><span className="field-label">最大充电电压</span><input className="input" value={draft.maxChargingVoltage} onChange={e => set({ maxChargingVoltage: e.target.value })} placeholder="如≤60 (Configurable)" /></div>
<div className="field"><span className="field-label">最大充放电电流</span><input className="input" value={draft.maxChargeDischargeCurrent} onChange={e => set({ maxChargeDischargeCurrent: e.target.value })} placeholder="如190A" /></div>
</div>
<div className="grid-2">
<div className="field"><span className="field-label">最大直流输入功率</span><input className="input" value={draft.maxDcInputPower} onChange={e => set({ maxDcInputPower: e.target.value })} placeholder="如16000W" /></div>
<div className="field"><span className="field-label">最大直流输入电压</span><input className="input" value={draft.maxDcInputVoltage} onChange={e => set({ maxDcInputVoltage: e.target.value })} placeholder="如1000V" /></div>
</div>
<div className="grid-2">
<div className="field"><span className="field-label">MPPT工作电压范围</span><input className="input" value={draft.mpptVoltageRange} onChange={e => set({ mpptVoltageRange: e.target.value })} placeholder="如200~800V" /></div>
<div className="field"><span className="field-label">启动电压</span><input className="input" value={draft.startingVoltage} onChange={e => set({ startingVoltage: e.target.value })} placeholder="如150V" /></div>
</div>
<div className="grid-2">
<div className="field"><span className="field-label">最大输入电流</span><input className="input" value={draft.maxInputCurrent} onChange={e => set({ maxInputCurrent: e.target.value })} placeholder="如18/18A" /></div>
<div className="field"><span className="field-label">MPPT路数</span><input className="input" value={draft.mpptNumber} onChange={e => set({ mpptNumber: e.target.value })} placeholder="如2" /></div>
</div>
<div className="grid-2">
<div className="field"><span className="field-label">并网最大输出视在功率</span><input className="input" value={draft.onGridMaxApparentPower} onChange={e => set({ onGridMaxApparentPower: e.target.value })} placeholder="如8800W" /></div>
<div className="field"><span className="field-label">输出电压</span><input className="input" value={draft.outputVoltage} onChange={e => set({ outputVoltage: e.target.value })} placeholder="如380/400V" /></div>
</div>
<div className="grid-2">
<div className="field"><span className="field-label">额定输出频率</span><input className="input" value={draft.ratedOutputFrequency} onChange={e => set({ ratedOutputFrequency: e.target.value })} placeholder="如50/60Hz" /></div>
<div className="field"><span className="field-label">并网最大输出电流</span><input className="input" value={draft.onGridMaxOutputCurrent} onChange={e => set({ onGridMaxOutputCurrent: e.target.value })} placeholder="如13.3A" /></div>
</div>
<div className="field"><span className="field-label">输出功率因数</span><input className="input" value={draft.outputPowerFactor} onChange={e => set({ outputPowerFactor: e.target.value })} placeholder="如1 (-0.8 leading~+0.8 lagging)" /></div>
<div className="grid-2">
<div className="field"><span className="field-label">离网额定输出视在功率</span><input className="input" value={draft.offGridRatedApparentPower} onChange={e => set({ offGridRatedApparentPower: e.target.value })} placeholder="如8000W" /></div>
<div className="field"><span className="field-label">离网最大输出视在功率</span><input className="input" value={draft.offGridMaxApparentPower} onChange={e => set({ offGridMaxApparentPower: e.target.value })} placeholder="如:>200%,15sec" /></div>
</div>
<div className="field"><span className="field-label">离网最大输出电流</span><input className="input" value={draft.offGridMaxOutputCurrent} onChange={e => set({ offGridMaxOutputCurrent: e.target.value })} placeholder="如13.3A" /></div>
<div className="grid-2">
<div className="field"><span className="field-label">最大效率(MPPT)</span><input className="input" value={draft.efficiencyMppt} onChange={e => set({ efficiencyMppt: e.target.value })} placeholder="如98%" /></div>
<div className="field"><span className="field-label">最大效率</span><input className="input" value={draft.efficiencyMax} onChange={e => set({ efficiencyMax: e.target.value })} placeholder="如94.5%" /></div>
</div>
<div className="field"><span className="field-label">欧洲效率</span><input className="input" value={draft.efficiencyEurope} onChange={e => set({ efficiencyEurope: e.target.value })} placeholder="如97.5%" /></div>
<div className="field"><span className="field-label">保护功能</span><input className="input" value={draft.protectionFunctions} onChange={e => set({ protectionFunctions: e.target.value })} placeholder="如PV输入反接保护、PV绝缘阻抗检测、剩余电流检测、输出过流/短路/过压保护" /></div>
<div className="grid-2">
<div className="field"><span className="field-label">运行温度</span><input className="input" value={draft.operatingTemp} onChange={e => set({ operatingTemp: e.target.value })} placeholder="如:-25°C~60°C" /></div>
<div className="field"><span className="field-label">存储温度</span><input className="input" value={draft.storageTemp} onChange={e => set({ storageTemp: e.target.value })} placeholder="如:-30~65°C" /></div>
</div>
<div className="grid-2">
<div className="field"><span className="field-label">湿度</span><input className="input" value={draft.humidity} onChange={e => set({ humidity: e.target.value })} placeholder="如0~95%" /></div>
<div className="field"><span className="field-label">海拔m</span><input className="input" value={draft.altitude} onChange={e => set({ altitude: e.target.value })} placeholder="如≤4000m" /></div>
</div>
<div className="grid-2">
<div className="field"><span className="field-label">散热方式</span><input className="input" value={draft.cooling} onChange={e => set({ cooling: e.target.value })} placeholder="如Intelligent forced air cooling" /></div>
<div className="field"><span className="field-label">噪音</span><input className="input" value={draft.noiseLevel} onChange={e => set({ noiseLevel: e.target.value })} placeholder="如:<55db" /></div>
</div>
<div className="grid-2">
<div className="field"><span className="field-label">净重kg</span><input className="input" value={draft.netWeight} onChange={e => set({ netWeight: e.target.value })} placeholder="如38" /></div>
<div className="field"><span className="field-label">尺寸mm</span><input className="input" value={draft.dimensions} onChange={e => set({ dimensions: spaceToAsterisk(e.target.value) })} placeholder="如475*683*256" /></div>
</div>
<div className="grid-2">
<div className="field"><span className="field-label">防护等级</span><input className="input" value={draft.protectionClass} onChange={e => set({ protectionClass: e.target.value })} placeholder="如IP66" /></div>
<div className="field"><span className="field-label">拓扑结构</span><input className="input" value={draft.topology} onChange={e => set({ topology: e.target.value })} placeholder="如HF isolation(Battery side)" /></div>
</div>
<div className="field"><span className="field-label">安规/EMC标准</span><input className="input" value={draft.safetyStandard} onChange={e => set({ safetyStandard: e.target.value })} placeholder="如NB/T32004-2018, IEC62109, IEC61000" /></div>
<div className="field"><span className="field-label">并网标准</span><input className="input" value={draft.gridStandard} onChange={e => set({ gridStandard: e.target.value })} placeholder="如IEC61727, EN50549-1, VDE-4105" /></div>
<div className="field"><span className="field-label">其他标准</span><input className="input" value={draft.otherStandard} onChange={e => set({ otherStandard: e.target.value })} placeholder="如IEC61683, IEC62116, EN50530" /></div>
</>
) : isBatterySystem ? (
<> <>
<div className="grid-2"> <div className="grid-2">
<div className="field"><span className="field-label">模块类型</span><input className="input" value={draft.moduleType} onChange={e => set({ moduleType: e.target.value })} placeholder="如:长延时型" /></div> <div className="field"><span className="field-label">模块类型</span><input className="input" value={draft.moduleType} onChange={e => set({ moduleType: e.target.value })} placeholder="如:长延时型" /></div>