У меня есть модуль для продавцов, где они могут добавлять своих менеджеров. Они будут отображаться в ag-сетке пользовательского интерфейса. Чтобы добавить менеджеров, мне нужно выбрать менеджера, дату начала периода и дату окончания периода для данного менеджера. Но одновременно мне также нужно проверить период каждого менеджера, что ни одна из дат менеджера не должна пересекаться друг с другом, на основе этого там решается Статус. У одного продавца может быть N менеджеров, но у каждого продавца одновременно должен быть только один активный менеджер.
В настоящее время я сталкиваюсь с проблемой при сравнении дат текущего менеджера с каждым из заданных менеджеров в массиве.
Я определяю статус на основе следующего кода:
decideStatus(): string {
let status = '';
let currentDate = new Date();
let fromDate = this.salesPersonForm.value.StartDate;
let tillDate = this.salesPersonForm.value.EndDate;
if (fromDate <= currentDate && (tillDate > currentDate || tillDate == null)) {
return status = 'Active'
} else if (fromDate > currentDate) {
return status = 'Onhold'
} else if (tillDate < currentDate) {
return status = 'Inactive'
}
}
У меня есть следующий фрагмент кода для добавления менеджера в сетку.
addManagers(){
if (this.salesPersonForm.value.SalesPerson) {
if (this.salesPersonForm.value.StartDate) {
if (this.salesPersonForm.value.EndDate == null || (this.salesPersonForm.value.EndDate > this.salesPersonForm.value.StartDate)) {
let loggedInUser = userName;
let manager = {
Name: someName
FromDate: this.salesPersonForm.value.StartDate
TillDate: this.salesPersonForm.value.EndDate
CreatedAt: new Date()
CreatedBy: loggedInUser,
Status: this.decideStatus()
}
this.managers.push(manager)
} else {
return;
}
} else {
return;
}
} else {
return
}
this.clear();
setTimeout(() => {
this.agGridReference.assignData(this.managers)
}, 200);
}
Прецедент бездействия: M1 — с 01.01.2020 по 31.06.2020 — неактивен M2 — с 08.01.2020 по 31.12.2021 — неактивен M3 - 01.01.2022 to somefuturevalue - Активный
Если даты находятся в будущем, чем текущая дата, она будет считаться отложенной.
Недействительный случай: M1 — с 01.01.2020 по 31.06.2020 — InActive M2 — с 05.01.2020 по 28.02.2021 — неактивен M3 — с 01.01.2021 по 30.05.2021 — неактивен
@MishaMashina NosolveStatus ошибок не выдает, и даты однотипные.
Итак, где-то в методе decideStatus вы хотели бы проверить, не пересекается ли интервал этого нового менеджера с интервалами уже существующих менеджеров? Я предполагаю, что перекрытие имеет смысл только в том случае, если новый менеджер имеет статус «активный» и уже есть хотя бы один менеджер с таким статусом?
@MishaMashina Думаю, я могу проверить интервалы любым из методов. Но какая логика должна быть реализована для проверки каждого периода с несколькими периодами в одном и том же массиве, я не могу понять. Перекрытие необходимо для проверки, потому что в эти периоды работает система комиссий, независимо от статуса. Но да, только один менеджер должен иметь статус «Активен» одновременно.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Итак, вы собираетесь поместить нового менеджера в массив managers только в том случае, если интервал нового менеджера не перекрывается с интервалом любого существующего менеджера. Таким образом, проверка должна быть сделана перед вашей строкой this.managers.push(manager), примерно так:
заменив this.managers.push(manager) на:
this.compareDates(manager);
добавив эти два метода:
compareDates(newM) {
let overlaps = 0;
this.managers.forEach(m => {
if (
// first case:
// saved manager starts before FromDate
// and finishes after FromDate
// of new manager:
(this.prepareDate(m.FromDate) <= this.prepareDate(newM.FromDate) &&
this.prepareDate(m.TillDate) >= this.prepareDate(newM.FromDate)) ||
// second case:
// saved manager starts after FromDate
// and before the TillDate
// of new manager:
(this.prepareDate(m.FromDate) >= this.prepareDate(newM.FromDate) &&
this.prepareDate(m.FromDate) <= this.prepareDate(newM.TillDate))
) {
overlaps++;
}
});
if (overlaps == 0) {
// no overlaps, so push this new manager and do whatever else needs to be done
this.managers.push(newM);
console.info('Welcome, new manager!');
}
else {
// there is at least 1 overlap, so do something else
// like: return with error message
console.info("This manager's interval overlaps with interval(s) of "
+ overlaps +' other manager(s)!'
);
}
}
И вспомогательный метод для возврата отметки времени каждой даты в предыдущем методе:
prepareDate(date) {
let parts = date.split('/');
return Date.parse(parts[2] + '/' + parts[1] + '/' + parts[0]);
}
Чтобы увидеть это в действии: https://stackblitz.com/edit/angular-ivy-j9ldef
Спасибо за идею сойтись, по поводу как решить. Это не совсем решило проблему, но да, это полезно. Большое спасибо.
Ваш метод
decideStatusвыдает ошибки? Если это так - можете ли вы поделиться этими ошибками? Являются ли даты, которые вы сравниваете, одного типа?