/// <summary>オーバーライド /// </summary> /// <param name="sDate"></param> protected override void AutoAllwithChief(CScheduledDate sDate) { if (sDate.Date.DayOfWeek == DayOfWeek.Monday) { // 月曜日にクリアする dic.Clear(); } if (sDate.Require == null || sDate.Require.BuiltIn) { // 休みか未設定なら何もしない } else { if (dic.ContainsKey(sDate.Require)) { CScheduledDate source = dic[sDate.Require]; CopyFavorites(source, sDate); } else { base.AutoAllwithChief(sDate); dic.Add(sDate.Require, sDate); } } }
/// <summary>オーバーライド /// </summary> /// <param name="sDate"></param> protected override void AutoAllwithChief(CScheduledDate sDate) { if (sDate.Date.Day == 1) { // 月の頭にクリアする dic.Clear(); } if (sDate.Require == null || sDate.Require.BuiltIn) { // 休みか未設定なら何もしない } else { DayOfWeek dayofweek = sDate.Date.DayOfWeek; if (dic.ContainsKey(dayofweek)) { CScheduledDate source = dic[dayofweek]; CopyFavorites(source, sDate); } else { base.AutoAllwithChief(sDate); dic.Add(dayofweek, sDate); } } }
/// <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> public void NotifyScheduleDateRequirePatternsEdited(CScheduledDate param0, CRequirePatterns param1) { if (OnDayOffsEdited != null && scheduleEditedEvnetIsValid) { EScheduleDateRequirePatternsEditedEventArgs e = new EScheduleDateRequirePatternsEditedEventArgs(param0, param1); OnScheduleDateRequirePatternsEdited(this, e); } }
/// <summary>メンバー数の作成</summary> public MemberCount(CScheduledDate enclosingInstance, CRequirePatterns reqpatts) { InitBlock(enclosingInstance); if (reqpatts != null) { int sz = reqpatts.Size(); _pt = new CPattern[sz]; _max = new int[sz]; _cnt = new int[sz]; for (int i = 0; i < sz; i++) { _pt[i] = reqpatts.GetPattern(i); _max[i] = reqpatts.GetRequire(_pt[i]); _cnt[i] = 0; } } }
/// <summary>自動設定する /// </summary> /// <param name="ptable">設定するタイムテーブル</param> /// <param name="today">基準日</param> /// <param name="start">開始</param> /// <param name="end">終了</param> public virtual void AutoAllwithChief(CTimeTable ptable, DateTime today, DateTime start, DateTime end) { this.Table = ptable; DateTime work = start.Date; while (work <= end) { // 終了日以前で if (work >= today) { // 今日以降 CScheduledDate sdate = this.Table[work]; AutoAllwithChief(sdate); } work = work.AddDays(1.0); } }
/// <summary> メンバーとシフトの好みの組み合わせを自動設定してみる。 /// </summary> protected virtual void AutoAllwithChief(CScheduledDate sDate) { // メンバーのこのみをセットする for (int i = 0; i < sDate.ValidMemberSize; i++) { SetFavoriteMemberStand(sDate, sDate.GetValidMember(i)); } // スケジュールのこのみをセットする CRequirePatterns req = sDate.Require; if (req != null) { for (int i = 0; i < req.ValidSize; i++) { SetFavoritePatternStand(sDate, sDate.Require.GetValid(i)); } } }
/// <summary> /// メンバーは何日連続で働いているか? /// </summary> /// <param name="member">メンバー</param> /// <param name="max">最大値</param> /// <returns>メンバーは何日連続で働いているか</returns> public virtual int GetMemberContinues(CMember member, int max) { int ret = 0; DateTime work = this.Date; work = work.AddDays(-1); CScheduledDate wDate = TimeTable[work]; CPattern pattern = wDate[member].Pattern; while (pattern != null && !pattern.BuiltIn) { work = work.AddDays(-1); ret++; wDate = TimeTable[work]; pattern = wDate[member].Pattern; } return(ret); }
/// <summary> シフトのメンバーの好みを自動設定する /// </summary> /// <param name="sDate">スケジュール化された(自動設定対象の)日付</param> /// <param name="pattern">設定するシフト</param> protected virtual void SetFavoritePatternStand(CScheduledDate sDate, CPattern pattern) { if (!pattern.IsAvailable(sDate.Date)) { // シフトが無効なら処理を抜ける return; } List <CMember> Candicates = new List <CMember>(); // シフトの有効なメンバーのリストを作成する for (int i = 0; i < sDate.ValidMemberSize; i++) { CMember m = sDate.GetValidMember(i); for (int j = 0; j < m.PatternSize; j++) { CPattern pat = m.GetPattern(j); if (pattern.Equals(pat)) { Candicates.Add(m); } } } int candicateSize = Candicates.Count; // 作成したリストからシフトに対して好みを割り振る for (int i = 0; i < candicateSize; i++) { int rand = 0; if (Candicates.Count > 1) { rand = Random1.Next(Candicates.Count); } CMember member = Candicates[rand]; Candicates.Remove(member); sDate.SetMemberRank(pattern, member, i); } }
/// <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); } } }
/// <summary> メンバーのシフトの好みを自動設定する /// </summary> /// <param name="sDate">スケジュール化された(自動設定対象の)日付</param> /// <param name="member">設定するメンバー</param> protected virtual void SetFavoriteMemberStand(CScheduledDate sDate, CMember member) { SetFavoriteMemberStand(sDate, member, false); }
private CPattern _p; // /// <summary>コンストラクタ</summary> public PatternsMember(CScheduledDate enclosingInstance, CPattern p) : base() { InitBlock(enclosingInstance); this._p = p; }
private void InitBlock(CScheduledDate enclosingInstance) { this.enclosingInstance = enclosingInstance; _ms = new List <CMember>(); }
private List <CPattern> _ps; // /// <summary>コンストラクタ</summary> public MembersPattern(CScheduledDate enclosingInstance, CMember m) : base() { InitBlock(enclosingInstance); this._m = m; }
private void InitBlock(CScheduledDate enclosingInstance) { this.enclosingInstance = enclosingInstance; _ps = new List <CPattern>(); }
/// <summary>コンストラクタ /// </summary> /// <param name="Parent">この組み合わせを保持する日付</param> public CSchedule(CScheduledDate Parent) : base() { this.parent = Parent; }
private void InitBlock(CScheduledDate enclosingInstance) { this.enclosingInstance = enclosingInstance; }
/// <summary>コンストラクタ /// </summary> /// <param name="SDate">スケジュール日</param> /// <param name="Requires">人員配置</param> public EScheduleDateRequirePatternsEditedEventArgs(CScheduledDate SDate, CRequirePatterns Requires) { this.sdate = SDate; this.require = Requires; }