Update App.jsx via upload script - 2026-07-29 17:43:34
This commit is contained in:
parent
857b2d4378
commit
dd2aa43095
225
App.jsx
225
App.jsx
|
|
@ -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±10(8模组配置)"
|
cabinetWeight: '', // 系统柜重量(kg),如 "544±10(8模组配置)"
|
||||||
altitude: '', // 海拔(m),如 "≤4000(>2000降额使用)"
|
altitude: '', // 海拔(m),如 "≤4000(>2000降额使用)"
|
||||||
selfDischargeRate: '', // 自放电率,如 "<5%(环境温度0~30℃/30天)"
|
selfDischargeRate: '', // 自放电率,如 "<5%(环境温度0~30℃/30天)"
|
||||||
|
// 太阳能混网逆变器专属字段(光伏逆变器大类)——电池输入、PV输入、AC输出(并网/离网)、效率、标准
|
||||||
|
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>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue