From f7aeea65b9974f0e00264d277183a4290e0bd06b Mon Sep 17 00:00:00 2001 From: Dobromir Popov Date: Tue, 28 May 2024 01:14:50 +0300 Subject: [PATCH] add option to choose between 2 algorithms for scheduling --- pages/api/shiftgenerate.ts | 38 ++++++++++++++++------------------- pages/cart/calendar/index.tsx | 9 ++++++--- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/pages/api/shiftgenerate.ts b/pages/api/shiftgenerate.ts index 48c2376..dc55004 100644 --- a/pages/api/shiftgenerate.ts +++ b/pages/api/shiftgenerate.ts @@ -56,7 +56,9 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { req.query.date?.toString() || common.getISODateOnly(new Date()), common.parseBool(req.query.copyFromPreviousMonth), common.parseBool(req.query.autoFill), - common.parseBool(req.query.forDay)); + common.parseBool(req.query.forDay), + parseInt(req.query.type) || 0, + ); res.send(JSON.stringify(result?.error?.toString())); break; case "delete": @@ -488,7 +490,7 @@ function flattenRegistry(dayKey) { return Object.values(weekEntries).flat(); } -async function GenerateSchedule(axios, date, copyFromPreviousMonth = false, autoFill = false, forDay) { +async function GenerateSchedule(axios, date, copyFromPreviousMonth = false, autoFill = false, forDay, algType = 0) { let missingPublishers = []; let publishersWithChangedPref = []; @@ -649,6 +651,7 @@ async function GenerateSchedule(axios, date, copyFromPreviousMonth = false, auto }); let publishersToday = []; + let rankedPublishers = []; // Second pass - prioritize shifts with transport where it is needed console.log(" second pass - fix transports " + monthInfo.monthName + " " + monthInfo.year); @@ -703,10 +706,13 @@ async function GenerateSchedule(axios, date, copyFromPreviousMonth = false, auto return (hasTransportInAvailability || hasTransportOutAvailability); }); + availablePublishers = await FilterInappropriatePublishers([...availablePublishers], publishersToday, shift); - // rank publishers based on different factors - // let rankedPublishersOld = await RankPublishersForShift([...availablePublishers]) - let rankedPublishers = await RankPublishersForShiftWeighted([...availablePublishers], scheduledPubsPerDayAndWeek, day, weekNr); + if (algType == 0) { + rankedPublishers = await RankPublishersForShiftOld([...availablePublishers], scheduledPubsPerDayAndWeek, day, weekNr); + } else if (algType == 1) { + rankedPublishers = await RankPublishersForShiftWeighted([...availablePublishers], scheduledPubsPerDayAndWeek, day, weekNr); + } if (rankedPublishers.length > 0) { const newAssignment = await prisma.assignment.create({ data: { @@ -775,9 +781,12 @@ async function GenerateSchedule(axios, date, copyFromPreviousMonth = false, auto let availablePubsForTheShift = await data.filterPublishersNew('id,firstName,lastName,email,isActive,desiredShiftsPerMonth,lastLogin,type', shift.startTime, true, false, false, true, false); let availablePublishers = await FilterInappropriatePublishers([...availablePubsForTheShift], publishersToday, shift); - let rankedPublishers; - rankedPublishers = await RankPublishersForShiftOld([...availablePublishers], scheduledPubsPerDayAndWeek, day, weekNr); - //rankedPublishers = await RankPublishersForShiftWeighted([...availablePublishers], scheduledPubsPerDayAndWeek, day, weekNr); + if (algType == 0) { + rankedPublishers = await RankPublishersForShiftOld([...availablePublishers], scheduledPubsPerDayAndWeek, day, weekNr); + } else if (algType == 1) { + rankedPublishers = await RankPublishersForShiftWeighted([...availablePublishers], scheduledPubsPerDayAndWeek, day, weekNr); + } + if (rankedPublishers.length == 0) { console.log("No available publishers for shift " + shift.name); } else if (rankedPublishers.length > 0) { @@ -895,19 +904,6 @@ async function RankPublishersForShiftOld(publishers, scheduledPubsPerDayAndWeek, const nextDayKey = common.getISODateOnly(addDays(currentDay, i)); const penalty = [0.5, 0.7, 0.8, 0.85, 0.9, 0.95][i - 1]; // Penalties for +-1 to +-6 days - - // if (scheduledPubsPerDayAndWeek[previousDayKey]?.some(pubId => pubId === a.id)) { - // adjustedCompletionA *= penalty; - // } - // if (scheduledPubsPerDayAndWeek[previousDayKey]?.some(pubId => pubId === b.id)) { - // adjustedCompletionB *= penalty; - // } - // if (scheduledPubsPerDayAndWeek[nextDayKey]?.some(pubId => pubId === a.id)) { - // adjustedCompletionA *= penalty; - // } - // if (scheduledPubsPerDayAndWeek[nextDayKey]?.some(pubId => pubId === b.id)) { - // adjustedCompletionB *= penalty; - // } if (flattenRegistry(previousDayKey).includes(a.id)) { adjustedCompletionA *= penalty; } diff --git a/pages/cart/calendar/index.tsx b/pages/cart/calendar/index.tsx index 26b5cea..f75b250 100644 --- a/pages/cart/calendar/index.tsx +++ b/pages/cart/calendar/index.tsx @@ -420,10 +420,10 @@ export default function CalendarPage({ initialEvents, initialShifts }) { setActiveButton(null); } } - const generateShifts = async (buttonId, copyFromPrevious = false, autoFill = false, forDay?: Boolean | null) => { + const generateShifts = async (buttonId, copyFromPrevious = false, autoFill = false, forDay?: Boolean | null, type = 0) => { try { setActiveButton(buttonId); - const endpoint = `/api/shiftgenerate?action=generate&date=${common.getISODateOnly(value)}©FromPreviousMonth=${copyFromPrevious}&autoFill=${autoFill}&forDay=${forDay}`; + const endpoint = `/api/shiftgenerate?action=generate&date=${common.getISODateOnly(value)}©FromPreviousMonth=${copyFromPrevious}&autoFill=${autoFill}&forDay=${forDay}&type=${type}`; const { shifts } = await axiosInstance.get(endpoint); toast.success('Готово!', { autoClose: 1000 }); setIsMenuOpen(false); @@ -677,9 +677,12 @@ export default function CalendarPage({ initialEvents, initialShifts }) { - +