/// <summary>
        /// 稼動中のメンバーの数
        /// </summary>
        /// <param name="time"></param>
        /// <returns></returns>
        public virtual List <CMember> GetTime2ValidMember(TimeSpan time)
        {
            List <CMember> ret = new List <CMember>();
            int            max = ValidMemberSize;

            for (int i = 0; i < max; i++)
            {
                CMember   mbr = GetValidMember(i);
                CSchedule scd = GetSchedule(mbr);
                CPattern  ptn = scd.Pattern;
                if (ptn == null)
                {
                    // 何もしない
                }
                else if (ptn.BuiltIn)
                {
                    // 何もしないって!
                }
                else
                {
                    if (ptn.Start <= time && ptn.End >= time)
                    {
                        // 稼働時間中
                        ret.Add(mbr);
                    }
                }
            }
            return(ret);
        }
        /// <summary>
        /// 区切りになる時間
        /// </summary>
        /// <returns>タイムスパンの配列</returns>
        public List <TimeSpan> GetPeriodTimes()
        {
            List <TimeSpan> ret = new List <TimeSpan>();
            int             max = ValidMemberSize;

            for (int i = 0; i < max; i++)
            {
                CMember   member   = GetValidMember(i);
                CSchedule schedule = GetSchedule(member);
                CPattern  work     = (schedule != null ? schedule.Pattern : null);
                if (work == null || work.BuiltIn)
                {
                    // ヌルも同然
                }
                else
                {
                    // 存在する
                    TimeSpan start = work.Start;
                    TimeSpan end   = work.End;
                    if (!ret.Contains(start))
                    {
                        // 開始時間
                        ret.Add(start);
                    }
                    if (!ret.Contains(end))
                    {
                        // 終了時間
                        ret.Add(end);
                    }
                }
            }
            return(ret);
        }
        /// <summary>メンバーのスケジュールを取得する</summary>
        private CSchedule GetSchedule(CMember member)
        {
            if (member == null)
            {
                return(null);
            }
            CSchedule ret = null;;

            if (MemberToSchedule.ContainsKey(member))
            {
                // 存在する
                ret = MemberToSchedule[member];
            }
            else
            {
                // メンバーに対応したスケジュールが存在しなければ作成する
                CSchedule schedule = CreateSchedule();
                schedule.Member = member;
                if (member.IsAvailable(Date))
                {
                    MemberToSchedule[member] = schedule;
                }
                ret = schedule;
            }
            return(ret);
        }
Example #4
0
 /// <summary>
 /// スケジュールが変更された
 /// </summary>
 /// <param name="param"></param>
 public void NotifyScheduleEdited(CSchedule param)
 {
     if (OnScheduleEdited != null && ScheduleEditedEvnetIsValid)
     {
         EScheduleEditedEventArgs e = new EScheduleEditedEventArgs(param);
         OnScheduleEdited(this, e);
     }
 }
        /// <summary>メンバーの合計 指定した時間で働く予定の人数</summary>
        public virtual int GetMemberTotal(TimeSpan time)
        {
            int ret = 0;

            for (int i = 0; i < ValidMemberSize; i++)
            {
                CMember   member   = GetValidMember(i);
                CSchedule schedule = GetSchedule(member);
                if (schedule != null)
                {
                    CPattern pattern = schedule.Pattern;
                    if (pattern != null)
                    {
                        if (pattern.Start <= time && time <= pattern.End)
                        {
                            ret++;
                        }
                    }
                }
            }
            return(ret);
        }
 /// <summary>スケジュールをセットする</summary>
 public virtual void  SetSchedule(CSchedule sc)
 {
     MemberToSchedule[sc.Member] = sc;
 }
        /// <summary>有効なメンバーの設定</summary>
        public virtual void  MakeMembers()
        {
            if (validMembers == null)
            {
                // 配列の再確保
                validMembers = new List <CMember>();
            }
            if (MemberToSchedule == null)
            {
                MemberToSchedule = new Dictionary <CMember, CSchedule>();
            }
            //		validMembers.clear(); // 初期化
            CMemberCollection members = timeTable.Members;

            for (int i = 0; i < members.Size(true); i++)
            {
                CMember member1 = members[i, true];
                if (member1.IsAvailable(Date))
                {
                    if (!validMembers.Contains(member1))
                    {
                        validMembers.Add(member1);
                    }
                }
                else
                {
                    if (validMembers.Contains(member1))
                    {
                        //System.out.println("完全削除3:" + member1.getName());
                        validMembers.Remove(member1);
                    }
                    if (MemberToSchedule.ContainsKey(member1))
                    {
                        //System.out.println("完全削除4:" + member1.getName());
                        // スケジュールの完全削除
                        CSchedule scd = MemberToSchedule[member1];
                        if (scd != null)
                        {
                            //System.out.println("完全削除5:" + member1.getName());
                            MemberToSchedule.Remove(member1);
                        }
                    }
                }
            }
            List <CMember> work = new List <CMember>();
            int            sz1  = validMembers.Count;

            for (int i = 0; i < sz1; i++)
            {
                //System.out.println("Step1");
                CMember mem = validMembers[i];
                long    id  = mem.ObjectID;
                if (members.GetByID(id) == null)
                {
                    work.Add(mem);
                }
            }
            int sz2 = work.Count;

            for (int i = 0; i < sz2; i++)
            {
                validMembers.Remove(work[i]);
            }
        }
        /// <summary> 設定されたメンバーとシフトに対して組み合わせを作成する</summary>
        public virtual void  Auto()
        {
            int[]  memRnk = new int[ValidMemberSize];
            bool[] memChk = new bool[ValidMemberSize];
            for (int i = 0; i < ValidMemberSize; i++)
            {
                memRnk[i] = ValidMemberSize + 1;
                memChk[i] = false;
            }
            MemberCount memCnt = new MemberCount(this, Require);
            int         i2 = 0, j = 0;

            //System.out.println("展開サイズ:" + getRequire().getExtractedSize());
            if (Require == null)
            {
                return;
            }
            //
            while (i2 < Require.ExtractedSize)
            {
                j = 0;
                while (j < ValidMemberSize)
                {
                    if (memChk[j])
                    {
                        // もうすでに決定している
                        //System.out.println("すでに決定している:" + i + ":" + j);
                    }
                    else
                    {
                        CMember m1 = GetValidMember(j);
                        // i番目のメンバー
                        CPattern p1 = GetMembersPattern(m1, i2);
                        // メンバーがもっとも望むシフト
                        //System.out.println(i + ":" + m1.getName() + ":" + p1);
                        int m1rank = GetMemberRank(p1, m1);
                        // ↑がシフトにとってどれぐらい望まれているか?
                        if ((m1rank < memRnk[j]) && (p1 != null))
                        {
                            // メンバーがシフトを希望していてランクが有効である
                            if (memCnt.Addable(p1))
                            {
                                // シフトに登録可能な人数内
                                GetSchedule(m1).Pattern = p1;
                                memRnk[j] = m1rank;
                                memChk[j] = true;
                                memCnt.Add(p1);
                            }
                            else
                            {
                                // シフトに登録可能な人数外
                                for (int k = 0; k < ValidMemberSize; k++)
                                {
                                    CMember   compM = GetValidMember(k);
                                    CSchedule compS = GetSchedule(compM);
                                    CPattern  compP = compS.Pattern;
                                    if (p1.Equals(compP))
                                    {
                                        if (memRnk[k] > m1rank)
                                        {
                                            //
                                            GetSchedule(m1).Pattern = p1;
                                            memRnk[j]     = m1rank;
                                            memChk[j]     = true;                                         //
                                            compS.Pattern = null;
                                            memRnk[k]     = ValidMemberSize;
                                            memChk[k]     = false;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                    j++;
                }
                i2++;
            }
        }
Example #9
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="param"></param>
 public EScheduleEditedEventArgs(CSchedule param)
 {
     this.schedule = param;
 }