/// <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); }
/// <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++; } }
/// <summary> /// コンストラクタ /// </summary> /// <param name="param"></param> public EScheduleEditedEventArgs(CSchedule param) { this.schedule = param; }