added Configuration Option for TimeChargeDischarge Mode on Sinexcel only Frontend

This commit is contained in:
Yinyin Liu 2025-11-12 15:04:09 +01:00
parent 75ed68ed47
commit 1752c2ddf9
2 changed files with 123 additions and 2 deletions

View File

@ -329,6 +329,11 @@ export interface JSONRecordData {
MaximumDischargingCurrent: number; MaximumDischargingCurrent: number;
OperatingPriority: string; OperatingPriority: string;
BatteriesCount: number; BatteriesCount: number;
//For Sinexcel: TimeChargeDischarge mode
TimeChargeDischargePower?: number;
TimeChargeDischargeTime?: string;
TimeChargeDischargeDate?: string;
}; };
DcDc: { DcDc: {
@ -616,6 +621,11 @@ export type ConfigurationValues = {
maximumChargingCurrent: number; maximumChargingCurrent: number;
operatingPriority: number; operatingPriority: number;
batteriesCount: number; batteriesCount: number;
// For Sinexcel: TimeChargeDischarge mode
timeChargeDischargePower?: number;
timeChargeDischargeTime?: Date | string;
timeChargeDischargeDate?: Date | string;
}; };
// //
// export interface Pv { // export interface Pv {

View File

@ -25,6 +25,10 @@ import axiosConfig from '../../../Resources/axiosConfig';
import { UserContext } from '../../../contexts/userContext'; import { UserContext } from '../../../contexts/userContext';
import { ProductIdContext } from '../../../contexts/ProductIdContextProvider'; import { ProductIdContext } from '../../../contexts/ProductIdContextProvider';
import { I_Installation } from 'src/interfaces/InstallationTypes'; import { I_Installation } from 'src/interfaces/InstallationTypes';
import { LocalizationProvider } from '@mui/x-date-pickers';
import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';
import { DatePicker, TimePicker } from '@mui/x-date-pickers';
import dayjs from 'dayjs';
interface SodistoreHomeConfigurationProps { interface SodistoreHomeConfigurationProps {
values: JSONRecordData; values: JSONRecordData;
@ -82,7 +86,27 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
operatingPriority: OperatingPriorityOptions.indexOf( operatingPriority: OperatingPriorityOptions.indexOf(
props.values.Config.OperatingPriority props.values.Config.OperatingPriority
), ),
batteriesCount: props.values.Config.BatteriesCount // ...(props.installation.device === 4
// ? {
// timeChargeDischargePower:
// props.values.Config?.TimeChargeDischargePower ?? 0,
// timeChargeDischargeTime: props.values.Config?.TimeChargeDischargeTime
// ? dayjs(props.values.Config.TimeChargeDischargeTime).toDate()
// : dayjs().toDate(),
// timeChargeDischargeDate: props.values.Config?.TimeChargeDischargeDate
// ? dayjs(props.values.Config.TimeChargeDischargeDate).toDate()
// : dayjs().toDate()
// }
// : {})
timeChargeDischargePower:
props.values.Config?.TimeChargeDischargePower ?? 0, // default 0 W
timeChargeDischargeTime: props.values.Config?.TimeChargeDischargeTime
? dayjs(props.values.Config.TimeChargeDischargeTime).toDate()
: dayjs().hour(8).minute(0).second(0).toDate(), // default 08:00
timeChargeDischargeDate: props.values.Config?.TimeChargeDischargeDate
? dayjs(props.values.Config.TimeChargeDischargeDate).toDate()
: dayjs().add(1, 'day').toDate() // default = tomorrow
}); });
const handleOperatingPriorityChange = (event) => { const handleOperatingPriorityChange = (event) => {
@ -101,7 +125,15 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
maximumDischargingCurrent: formValues.maximumDischargingCurrent, maximumDischargingCurrent: formValues.maximumDischargingCurrent,
maximumChargingCurrent: formValues.maximumChargingCurrent, maximumChargingCurrent: formValues.maximumChargingCurrent,
operatingPriority: formValues.operatingPriority, operatingPriority: formValues.operatingPriority,
batteriesCount:formValues.batteriesCount batteriesCount:formValues.batteriesCount,
// ...(device === 4 &&
// OperatingPriorityOptions[formValues.operatingPriority] ===
// 'TimeChargeDischarge' && {
// timeChargeDischargePower: formValues.timeChargeDischargePower,
// timeChargeDischargeTime: formValues.timeChargeDischargeTime,
// timeChargeDischargeDate: formValues.timeChargeDischargeDate
// })
}; };
setLoading(true); setLoading(true);
@ -189,6 +221,13 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
}); });
}; };
const handleTimeChargeDischargeChange = (name: string, value: any) => {
setFormValues((prev) => ({
...prev,
[name]: value
}));
};
const handleOkOnErrorDateModal = () => { const handleOkOnErrorDateModal = () => {
setErrorDateModalOpen(false); setErrorDateModalOpen(false);
}; };
@ -353,6 +392,78 @@ function SodistoreHomeConfiguration(props: SodistoreHomeConfigurationProps) {
</div> </div>
</> </>
{/* --- Extra fields for device=4 + TimeChargeDischarge --- */}
{device === 4 &&
OperatingPriorityOptions[formValues.operatingPriority] ===
'TimeChargeDischarge' && (
<>
{/* Power input */}
<div style={{ marginBottom: '5px' }}>
<TextField
label="Power (W)"
name="timeChargeDischargePower"
value={formValues.timeChargeDischargePower}
onChange={(e) =>
handleTimeChargeDischargeChange(e.target.name, e.target.value)
}
helperText="Enter a positive or negative power value"
fullWidth
/>
</div>
{/* Time picker */}
<div style={{ marginBottom: '5px' }}>
<LocalizationProvider dateAdapter={AdapterDayjs}>
<TimePicker
ampm={false}
label="Time"
value={dayjs(formValues.timeChargeDischargeTime)}
onChange={(newTime) =>
handleTimeChargeDischargeChange(
'timeChargeDischargeTime',
newTime?.toDate()
)
}
renderInput={(params) => (
<TextField
{...params}
sx={{
marginTop: 2,
width: '100%'
}}
/>
)}
/>
</LocalizationProvider>
</div>
{/* Date picker */}
<div style={{ marginBottom: '5px' }}>
<LocalizationProvider dateAdapter={AdapterDayjs}>
<DatePicker
label="Date"
value={dayjs(formValues.timeChargeDischargeDate)}
onChange={(newDate) =>
handleTimeChargeDischargeChange(
'timeChargeDischargeDate',
newDate?.toDate()
)
}
renderInput={(params) => (
<TextField
{...params}
sx={{
marginTop: 2,
width: '100%'
}}
/>
)}
/>
</LocalizationProvider>
</div>
</>
)}
<div <div
style={{ style={{
display: 'flex', display: 'flex',