我有一個銷售人員模塊,他們可以在其中添加自己的經理。這些將顯示在 UI 上的 ag-grid 中。要添加經理,我需要為給定經理選擇經理、期間開始日期和期間結束日期。但同時我還需要檢查每個經理的時間段,任何經理的日期都不應相互重疊,據此決定狀態。一個銷售人員可以有 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);
}
Idle UseCase: M1 - 01/01/2020 to 31/06/2020 - InActive M2 - 01/08/2020 to 31/12/2021 - InActive M3 - 01/01/2022 to somefuturevalue - Active
If dates are in the future than the current date, it will be considered as on hold.
InValid case: M1 - 01/01/2020 to 31/06/2020 - InActive M2 - 01/05/2020 to 28/02/2021 - InActive M3 - 01/01/2021 to 30/05/2021 - InActive
uj5u.com熱心網友回復:
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.log('Welcome, new manager!');
}
else {
// there is at least 1 overlap, so do something else
// like: return with error message
console.log("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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/447655.html
