예제 #1
0
 /// <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);
         }
     }
 }
예제 #2
0
 /// <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);
         }
     }
 }
예제 #3
0
        /// <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);
                    }
                }
            }
        }
예제 #4
0
 /// <summary>
 /// スケジュール日の人員配置が変更された
 /// </summary>
 public void NotifyScheduleDateRequirePatternsEdited(CScheduledDate param0, CRequirePatterns param1)
 {
     if (OnDayOffsEdited != null && scheduleEditedEvnetIsValid)
     {
         EScheduleDateRequirePatternsEditedEventArgs e = new EScheduleDateRequirePatternsEditedEventArgs(param0, param1);
         OnScheduleDateRequirePatternsEdited(this, e);
     }
 }
예제 #5
0
 /// <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;
         }
     }
 }
예제 #6
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);
            }
        }
예제 #7
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));
                }
            }
        }
예제 #8
0
        /// <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);
        }
예제 #9
0
        /// <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);
            }
        }
예제 #10
0
        /// <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);
                }
            }
        }
예제 #11
0
 /// <summary> メンバーのシフトの好みを自動設定する
 /// </summary>
 /// <param name="sDate">スケジュール化された(自動設定対象の)日付</param>
 /// <param name="member">設定するメンバー</param>
 protected virtual void SetFavoriteMemberStand(CScheduledDate sDate, CMember member)
 {
     SetFavoriteMemberStand(sDate, member, false);
 }
예제 #12
0
 private CPattern _p;             //
 /// <summary>コンストラクタ</summary>
 public PatternsMember(CScheduledDate enclosingInstance, CPattern p) : base()
 {
     InitBlock(enclosingInstance);
     this._p = p;
 }
예제 #13
0
 private void  InitBlock(CScheduledDate enclosingInstance)
 {
     this.enclosingInstance = enclosingInstance;
     _ms = new List <CMember>();
 }
예제 #14
0
 private List <CPattern> _ps;            //
 /// <summary>コンストラクタ</summary>
 public MembersPattern(CScheduledDate enclosingInstance, CMember m) : base()
 {
     InitBlock(enclosingInstance);
     this._m = m;
 }
예제 #15
0
 private void  InitBlock(CScheduledDate enclosingInstance)
 {
     this.enclosingInstance = enclosingInstance;
     _ps = new List <CPattern>();
 }
예제 #16
0
 /// <summary>コンストラクタ
 /// </summary>
 /// <param name="Parent">この組み合わせを保持する日付</param>
 public CSchedule(CScheduledDate Parent) : base()
 {
     this.parent = Parent;
 }
예제 #17
0
 private void  InitBlock(CScheduledDate enclosingInstance)
 {
     this.enclosingInstance = enclosingInstance;
 }
예제 #18
0
 /// <summary>コンストラクタ
 /// </summary>
 /// <param name="SDate">スケジュール日</param>
 /// <param name="Requires">人員配置</param>
 public EScheduleDateRequirePatternsEditedEventArgs(CScheduledDate SDate, CRequirePatterns Requires)
 {
     this.sdate   = SDate;
     this.require = Requires;
 }