コード例 #1
0
ファイル: Suggestion.cs プロジェクト: YHZX2013/exchange_diff
        private void SetOptionalAttendeeAvailability(AttendeeData attendee, IndividualAttendeeConflictData attendeeConflict)
        {
            BusyType busyType = attendeeConflict.BusyType;

            if (busyType == BusyType.NoData)
            {
                this.optionalAttendeeCount--;
                return;
            }
            if (busyType != BusyType.Free)
            {
                if (this.strongestOptConflict < busyType)
                {
                    this.strongestOptConflict = busyType;
                }
                this.optionalAttendeeConflictCount++;
                this.weightedOptConflicts += (double)busyType * 0.25 + 0.25;
                BusyType[] busyTypeRange = attendee.GetBusyTypeRange(this.meetingStartTime, this.meetingDuration);
                foreach (BusyType busyType2 in busyTypeRange)
                {
                    if (busyType2 != BusyType.Free)
                    {
                        this.optOverlap         += (double)this.options.FreeBusyInterval / (double)this.meetingDuration;
                        this.weightedOptOverlap += ((double)busyType * 0.25 + 0.25) * ((double)this.options.FreeBusyInterval / (double)this.meetingDuration);
                    }
                }
            }
        }
コード例 #2
0
ファイル: Suggestion.cs プロジェクト: YHZX2013/exchange_diff
        private void SetRequiredAttendeeAvailability(AttendeeData attendee, IndividualAttendeeConflictData attendeeConflict)
        {
            BusyType busyType = attendeeConflict.BusyType;

            if (busyType == BusyType.NoData)
            {
                this.requiredAttendeeCount--;
                return;
            }
            if (this.strongestReqConflict < busyType)
            {
                this.strongestReqConflict = busyType;
            }
            if (busyType != BusyType.Free)
            {
                this.requiredAttendeeConflictCount++;
            }
            this.SetConvenience(attendee);
            int    num  = this.meetingDuration / this.options.FreeBusyInterval;
            int    num2 = 0;
            int    num3 = 0;
            double num4 = 0.0;

            if (num > 0)
            {
                BusyType[] busyTypeRange = attendee.GetBusyTypeRange(this.meetingStartTime, this.meetingDuration);
                ExDateTime startUtc      = this.meetingStartTime.ToUtc();
                foreach (BusyType busyType2 in busyTypeRange)
                {
                    ExDateTime exDateTime = startUtc.AddMinutes((double)this.options.FreeBusyInterval);
                    if (busyType2 != BusyType.Free)
                    {
                        num4 += this.GetConflictValue(busyType2);
                        num3++;
                    }
                    else if (!attendee.WorkingHours.IsWorkTime(startUtc, exDateTime))
                    {
                        num4 += 0.25;
                        num3++;
                    }
                    else if (num3 == 0)
                    {
                        num2++;
                    }
                    startUtc = exDateTime;
                }
                this.sumReqFrontTime += (double)num2 / (double)num;
                double num5 = (double)num2 / (double)num;
                if (num5 < this.minPctReqFrontTime)
                {
                    this.minPctReqFrontTime = num5;
                }
                this.weightedReqConflicts += num4 / (double)num;
            }
        }
コード例 #3
0
ファイル: Suggestion.cs プロジェクト: YHZX2013/exchange_diff
        private void SetResourceAttendeeAvailability(AttendeeData attendee, IndividualAttendeeConflictData attendeeConflict)
        {
            BusyType busyType = attendeeConflict.BusyType;

            if (busyType == BusyType.NoData)
            {
                return;
            }
            this.resourceAttendeeCount++;
            if (busyType == BusyType.Free)
            {
                this.resourceAttendeeAvailableCount++;
                return;
            }
            this.resourceAttendeeConflictCount++;
        }
コード例 #4
0
ファイル: Suggestion.cs プロジェクト: YHZX2013/exchange_diff
        private void SetRoomAttendeeAvailability(AttendeeData attendee, IndividualAttendeeConflictData attendeeConflict)
        {
            BusyType busyType = attendeeConflict.BusyType;

            if (busyType == BusyType.NoData)
            {
                return;
            }
            this.roomsRequested = true;
            this.roomCount++;
            if (busyType == BusyType.Free)
            {
                this.roomsAvailableCount++;
                return;
            }
            this.roomConflictCount++;
        }
コード例 #5
0
ファイル: Suggestion.cs プロジェクト: YHZX2013/exchange_diff
        internal Suggestion(ExDateTime meetingStartTime, int inputMeetingDuration, int inputRequiredAttendeeCount, int inputOptionalAttendeeCount, AttendeeData[] inputAttendees, ConfigOptions inputOptions)
        {
            this.options = inputOptions;
            Suggestion.Tracer.TraceDebug <object, ExDateTime>((long)this.GetHashCode(), "{0}: Suggestion.Suggestion() entered, inputStartDateTime: {1}", TraceContext.Get(), meetingStartTime);
            this.meetingStartTime      = meetingStartTime;
            this.startDateTime         = meetingStartTime.LocalTime;
            this.meetingDuration       = inputMeetingDuration;
            this.requiredAttendeeCount = inputRequiredAttendeeCount;
            this.optionalAttendeeCount = inputOptionalAttendeeCount;
            ExDateTime endUtc = meetingStartTime.AddMinutes((double)inputMeetingDuration);
            bool       flag   = true;
            int        num    = 0;

            this.attendeeConflictDataArray = new AttendeeConflictData[inputAttendees.Length];
            foreach (AttendeeData attendeeData in inputAttendees)
            {
                BusyType busyType = attendeeData.GetBusyType(this.meetingStartTime, this.meetingDuration);
                IndividualAttendeeConflictData individualAttendeeConflictData = IndividualAttendeeConflictData.Create(attendeeData, busyType);
                if (attendeeData.AttendeeType == MeetingAttendeeType.Required || attendeeData.AttendeeType == MeetingAttendeeType.Organizer)
                {
                    this.SetRequiredAttendeeAvailability(attendeeData, individualAttendeeConflictData);
                    if (individualAttendeeConflictData.BusyType != BusyType.NoData)
                    {
                        this.excludeConflict |= attendeeData.ExcludeConflict;
                    }
                }
                else if (attendeeData.AttendeeType == MeetingAttendeeType.Optional)
                {
                    this.SetOptionalAttendeeAvailability(attendeeData, individualAttendeeConflictData);
                }
                else if (attendeeData.AttendeeType == MeetingAttendeeType.Room)
                {
                    this.SetRoomAttendeeAvailability(attendeeData, individualAttendeeConflictData);
                    if (individualAttendeeConflictData.BusyType != BusyType.NoData)
                    {
                        flag &= attendeeData.ExcludeConflict;
                    }
                }
                else if (attendeeData.AttendeeType == MeetingAttendeeType.Resource)
                {
                    this.SetResourceAttendeeAvailability(attendeeData, individualAttendeeConflictData);
                }
                else
                {
                    Suggestion.Tracer.TraceError <object, MeetingAttendeeType>((long)this.GetHashCode(), "{0}: unknown attendee type: {1}", TraceContext.Get(), attendeeData.AttendeeType);
                }
                if (attendeeData.AttendeeType == MeetingAttendeeType.Organizer)
                {
                    this.isWorkTime = attendeeData.WorkingHours.IsWorkTime(this.meetingStartTime, endUtc);
                }
                this.attendeeConflictDataArray[num] = individualAttendeeConflictData;
                num++;
            }
            if (this.roomsRequested)
            {
                this.excludeConflict = (this.excludeConflict || flag);
            }
            Suggestion.Tracer.TraceDebug((long)this.GetHashCode(), "{0}: required: {1}, optional: {2}, worktime?: {3}", new object[]
            {
                TraceContext.Get(),
                this.requiredAttendeeCount,
                this.optionalAttendeeCount,
                this.isWorkTime
            });
            if (this.requiredAttendeeCount != 0)
            {
                this.sumPctReqFrontTime      = this.sumReqFrontTime / (double)this.requiredAttendeeCount;
                this.weightedPctReqConflicts = this.weightedReqConflicts / (double)this.requiredAttendeeCount;
            }
            else
            {
                this.weightedPctReqConflicts = 1.0;
            }
            if (this.optionalAttendeeCount != 0)
            {
                this.pctOptConflicts = (double)this.optionalAttendeeConflictCount / (double)this.optionalAttendeeCount;
                this.pctOptOverlap   = this.optOverlap / (double)this.optionalAttendeeCount;
            }
            this.timeSlotRating = this.GetRating();
            if (this.weightedPctReqConflicts == 0.0)
            {
                this.bucket = SuggestionQuality.Excellent;
            }
            else if (this.weightedPctReqConflicts * 100.0 >= 50.0)
            {
                this.bucket = SuggestionQuality.Poor;
            }
            else if (this.weightedPctReqConflicts * 100.0 <= (double)this.options.GoodThreshold)
            {
                this.bucket = SuggestionQuality.Good;
            }
            else
            {
                this.bucket = SuggestionQuality.Fair;
            }
            Suggestion.Tracer.TraceDebug <object, long, SuggestionQuality>((long)this.GetHashCode(), "{0}: final suggestion results, timeSlotRating: {1}, bucket: {2}", TraceContext.Get(), this.timeSlotRating, this.bucket);
        }