/// <summary>好みをコピーする /// </summary> /// <param name="src">元</param> /// <param name="dst">先</param> protected virtual void CopyFavorites(CScheduledDate src, CScheduledDate dst) { // メンバーのシフトの好み for (int i = 0; i < src.ValidMemberSize; i++) { CMember member = src[i].Member; for (int j = 0; j < member.PatternSize; j++) { CPattern pattern = src.GetMembersPattern(member, j); dst.SetPatternRank(member, pattern, j); } } // スケジュールのこのみをセットする CRequirePatterns req = dst.Require; if (req != null && req == src.Require) { for (int i = 0; i < req.ValidSize; i++) { CPattern pattern = req.GetValid(i); for (int j = 0; j < src.ValidMemberSize; j++) { CMember member = src.GetPatternsMember(pattern, j); dst.SetMemberRank(pattern, member, j); } } } }
/// <summary> メンバーのシフトの好みを自動設定する /// </summary> /// <param name="sDate">スケジュール化された(自動設定対象の)日付</param> /// <param name="member">設定するメンバー</param> /// <param name="force">休みを気にするかどうか</param> protected virtual void SetFavoriteMemberStand(CScheduledDate sDate, CMember member, bool force) { // List <CPattern> Candicates = new List <CPattern>(); // メンバーの有効なシフトのリストを作成する for (int i = 0; i < member.PatternSize; i++) { CPattern pattern = member.GetPattern(i); if (pattern.IsAvailable(sDate.Date)) { CRequirePatterns require = sDate.Require; if (require != null) { for (int j = 0; j < require.ValidSize; j++) { CPattern reqpat = sDate.Require.GetValid(j); if (pattern.Equals(reqpat)) { Candicates.Add(pattern); } } } } } // 休み設定 int conu = member.ContinuasInt; int cont = sDate.GetMemberContinues(member, conu); int rest = conu - cont; // 候補の数 int candicateSize = Candicates.Count; // 作成したリストからメンバーに対して好みを割り振る for (int i = 0; i < candicateSize; i++) { int rand = 0; if (Candicates.Count > 1) { rand = Random1.Next(Candicates.Count); } CPattern pattern = Candicates[rand]; Candicates.Remove(pattern); if (member.IsAvalableDay(sDate.Date.DayOfWeek)) { // 稼動の曜日 if ((rest > i || conu <= 0) || force) { // 連続稼動の許容範囲内 sDate.SetPatternRank(member, pattern, i); } else { // 連続稼動の許容範囲外 sDate.SetPatternRank(member, CPattern.DAYOFF, i); } } else { // せっかく設定したんですが曜日の都合で・・・ sDate.SetPatternRank(member, CPattern.DAYOFF, i); } } }