import dayjs from 'dayjs';
function getFDateList() {
const dates = [];
const today = dayjs();
for (let i = 0; i <= 6; i++) {
const date = today.subtract(i, 'day').startOf('day');
dates.push(date);
}
return dates;
}
function calculateDifference(startDate, endDate) {
return endDate.diff(startDate);
}
function calculatePercentage(diff, totalMillis) {
return (diff / totalMillis) * 100;
}
function processData(data) {
const dateList = getDateList();
const sevenDaysAgo = dateList[0];
const today = dayjs(dateList[dateList.length - 1]).endOf('day');
const totalMillis = calculateDifference(dayjs(sevenDaysAgo), dayjs(today));
const formattedData = [];
let lastOffTime = dayjs(sevenDaysAgo);
data.forEach(item => {
const onTime = dayjs(item.on);
const offTime = item.off ? dayjs(item.off) : null;
const startTime = onTime.isBefore(sevenDaysAgo) ? dayjs(sevenDaysAgo) : onTime;
if (!lastOffTime.isSame(startTime)) {
const offlineDiff = calculateDifference(lastOffTime, startTime);
const offlinePercentage = calculatePercentage(offlineDiff, totalMillis);
formattedData.push({
name: `${lastOffTime.format('YYYY-MM-DD HH:mm:ss')} - ${startTime.format('YYYY-MM-DD HH:mm:ss')}`,
width: offlinePercentage,
type: 'offline'
});
}
const onlineDiff = offTime ? calculateDifference(startTime, offTime) : calculateDifference(startTime, dayjs());
const onlinePercentage = calculatePercentage(onlineDiff, totalMillis);
formattedData.push({
name: `${startTime.format('YYYY-MM-DD HH:mm:ss')} - ${offTime ? offTime.format('YYYY-MM-DD HH:mm:ss') : today.format('YYYY-MM-DD 23:59:59') }`,
width: onlinePercentage,
type: 'online'
});
lastOffTime = offTime || dayjs();
});
if (lastOffTime.isSame(dayjs())) {
const unknownDiff = calculateDifference(lastOffTime, today);
const unknownPercentage = calculatePercentage(unknownDiff, totalMillis);
formattedData.push({
name: `${lastOffTime.format('YYYY-MM-DD HH:mm:ss')} - ${today.format('YYYY-MM-DD HH:mm:ss')}`,
width: unknownPercentage,
type: 'unknown'
});
}
else{
const offlineDiff = calculateDifference(lastOffTime, dayjs());
const offlinePercentage = calculatePercentage(offlineDiff, totalMillis);
formattedData.push({
name: `${lastOffTime.format('YYYY-MM-DD HH:mm:ss')} - ${dayjs().format('YYYY-MM-DD HH:mm:ss')}`,
width: offlinePercentage,
type: 'offline'
});
lastOffTime = dayjs()
const unknownDiff = calculateDifference(lastOffTime, today);
const unknownPercentage = calculatePercentage(unknownDiff, totalMillis);
formattedData.push({
name: `${lastOffTime.format('YYYY-MM-DD HH:mm:ss')} - ${today.format('YYYY-MM-DD HH:mm:ss')}`,
width: unknownPercentage,
type: 'unknown'
});
}
const totalWidth = formattedData.reduce((acc, item) => acc + item.width, 0);
if (Math.abs(totalWidth - 100) > Number.EPSILON) {
throw new Error(`Total width should be 100%, but it is ${totalWidth.toFixed(2)}%`);
}
return formattedData;
}
const testData = [
{ on: '2024-07-25 08:56:26', off: '2024-07-26 18:24:56' },
{ on: '2024-07-29 08:57:26', off: null }
];
const result = processData(testData);
console.log(result);