Я создаю приложение планировщика, которое позволяет мне добавлять встречи в календарь. Как бы то ни было, я сталкиваюсь с проблемой, когда моя хранимая процедура никогда не зацикливается так, как я хочу, в моем реактивном проекте. Что происходит, код ниже вставляет только один элемент и никогда не зацикливается, если я устанавливаю повторяющееся значение, скажем, 7 (один раз в неделю). У меня есть селектор диапазона дат, чтобы выбрать диапазон, скажем, с 2019-05-05 по 2019-05-30, и повторяющееся число будет означать добавление x количества дней (7 в этом примере) и вставку встречи каждые 7 дней.
Я вызываю маршрут из моего файла JS в реакции, используя axios
axios.post(`/AddTime/${idValue}/${dayValue}/${startValue}/${endValue}/${timeValue}/${startDate}/${endDate}/${zero}/${zero}/${zero}/${repeat}`)
И который идет к моему роутеру (nodeJS и Koa):
AdvisingRouter.post('/AddTime/:id/:day/:starttime/:endtime/:timeblock/:startdate/:enddate/:islocked/:takenPlace/:oldAppointment/:repeating', AdvisingController.addTimes, (err) => console.log("routers.js: AdvisingRouter error:", err));
Который затем вызывает фактический запрос:
async addTimes(ctx) {
console.log("THIS IS IN ADVISING CONTROLLER");
return new Promise((resolve, reject) => {
let query = "call repeating (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";
console.log('About to run this query.', query);
dbConnection.query(
{
sql: query,
values: [ctx.params.id, ctx.params.day, ctx.params.starttime, ctx.params.endtime, ctx.params.timeblock, ctx.params.startdate, ctx.params.enddate, ctx.params.islocked, ctx.params.takenPlace, ctx.params.oldAppointment, ctx.params.repeating]
}, (error) => {
if (error) {
return reject(error);
}
}
)
}).catch(err => {
ctx.body = {
status: "Failed",
error: err,
user: null
};
});
}
Запрос определенно работает в MySql:
DELIMITER //
CREATE PROCEDURE repeating(
_id int, _Day varchar(45), _StartTime varchar(45), _EndTime
varchar(45), _TimeBlock varchar(45),
_startDate date, _endDate date, _islocked tinyint, _takenPlace
tinyint, _oldAppointment tinyint, _repeatedNumber int)
begin
-- Add into AdvisingTimes and possibly repeat evey so often
Declare __for int;
Declare __INCDATE date;
DECLARE __id int;
DECLARE __Day varchar(45);
DECLARE __StartTime varchar(45);
DECLARE __EndTime varchar(45);
DECLARE __TimeBlock varchar(45);
DECLARE __startDate date;
DECLARE __endDate date;
DECLARE __islocked tinyint;
DECLARE __takenPlace tinyint;
DECLARE __oldAppointment tinyint;
DECLARE __repeatedNumber int;
select _id into __id;
select _Day into __Day;
select _StartTime into __StartTime;
select _EndTime into __EndTime;
select _TimeBlock into __TimeBlock;
select _startDate into __INCDATE;
select _endDate into __endDate;
select _islocked into __islocked;
select _takenPlace into __takenPlace;
select _oldAppointment into __oldAppointment;
select _repeatedNumber into __repeatedNumber;
IF __repeatedNumber = 0 THEN
Insert into AT (id, Day, StartTime, EndTime, TimeBlock, startDate, endDate, islocked, takenPlace, oldAppointment)
values (__id, __Day, __StartTime, __EndTime, __TimeBlock, __startDate, __startDate, __islocked, __takenPlace, 2);
ELSE
WHILE __INCDATE <= _endDate DO
Insert into AT (id, Day, StartTime, EndTime, TimeBlock, startDate, endDate, islocked, takenPlace, oldAppointment)
values (__id, __Day, __StartTime, __EndTime, __TimeBlock, __INCDATE, __endDate, __islocked, __takenPlace, 4);
SET __INCDATE = (select DATE_SUB(__INCDATE, INTERVAL -__repeatedNumber DAY));
END WHILE;
END IF;
конец //
разделитель;
Я попытался сохранить переменные внутри, и это тоже не работает. Он получит значения один раз и отправит их, но затем при повторении сбросит все значения. поэтому вставляется только одна запись, а не зацикливается и вставляется повторяющиеся встречи, которые должны быть в календаре каждые 7 дней (в основном повторяющиеся). Я не знаю, имеет ли это смысл, но когда я использую вышеупомянутый запрос внутри MySQL WorkBench, он работает, он просто не работает, когда я вызываю его из моего приложения реагирования.