/// <summary>メンバーの作業時間の重複(エラー)または※2の時間を満たしていなければ警告 /// </summary> private void CheckSpace() { CSchedule tsche = sdate[_member]; CPattern tpatt = tsche.Pattern; if (!(tpatt == null || tpatt.BuiltIn)) { // 今日のシフトが存在する DateTime today = sdate.Date; DateTime yesterday = today.AddDays(-1).Date; CScheduledDate ydate = Root[yesterday]; CSchedule ysche = ydate[_member]; CPattern ypatt = ysche.Pattern; if (!(ypatt == null || ypatt.BuiltIn)) { // 昨日のシフトが存在する! DateTime yend = yesterday + ypatt.End; DateTime tend = yend + _member.Spacetime; DateTime tstt = today + tpatt.Start; if (yend >= tstt) { AddItem(EEvaluationResult.ERROR, GenerateMessage(msg_space_error, new string[] { _member.Name, tstt.ToString(), yend.ToString() })); } else if (tend > tstt) { AddItem(EEvaluationResult.WORNING, GenerateMessage(msg_space_worning, new string[] { _member.Name, tstt.ToString(), yend.ToString() })); } } } }
/// <summary>勤務シフトを作成する /// </summary> /// <param name="member"></param> /// <param name="Span1"></param> /// <param name="Span2"></param> /// <param name="Rest"></param> private void CreatePattern (CMember member, TimeSpan Span1, TimeSpan Span2, TimeSpan Rest) { double dSpan1 = (long)(Span1.TotalHours / UMultiEditor.Threshold.TotalHours); double dSpan2 = (long)(Span2.TotalHours / UMultiEditor.Threshold.TotalHours); double dSpan3 = dSpan2 - dSpan1; CPattern newpattern = this.TimeTable.Patterns.CreatePattern(); //newpattern.Name = "新しい作業用のシフト(" + dates[0].ToShortDateString() + (dates.Count <= 1 ? "" : "~" + dates[dates.Count - 1].ToShortDateString()) + ")"; newpattern.Name = NewPatternName.Replace("%1", dates[0].ToShortDateString() + (dates.Count <= 1 ? "" : "~" + dates[dates.Count - 1].ToShortDateString())); newpattern.Start = TimeSpan.FromHours(dSpan1 * UMultiEditor.Threshold.TotalHours); newpattern.Scope = TimeSpan.FromHours(dSpan3 * UMultiEditor.Threshold.TotalHours); newpattern.Rest = Rest; newpattern.Notes = NewPatternNotes; newpattern.Created = dates[0]; TimeTableManager.UI.FPatternDialog dialog = new TimeTableManager.UI.FPatternDialog(); dialog.Pattern = newpattern; if (dialog.ShowDialog(MainForm) == DialogResult.OK) { TimeTable.Patterns.AddPattern(dialog.Pattern); foreach (DateTime date in dates) { if (date >= DateTime.Today) { CScheduledDate sdate = TimeTable[date]; sdate[member].Pattern = dialog.Pattern; } } // 臨時用のみかどうか if (TimeTable.Patterns.Size() >= TimeTableManager.UI.FMainForm.MaxItemCount || MessageBox.Show(this.MainForm, CreatePatternMessage, CreatePatternTitle, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) { newpattern.SetAvailable(false, dates[dates.Count - 1]); } } }
/// <summary>チェック処理の実体 /// </summary> /// <param name="bw"></param> private void RunCheck(BackgroundWorker bw) { if (mainForm == null) { return; } if (TimeTable == null) { return; } DateTime work = (LoopStart >= DateTime.Today ? LoopStart : DateTime.Today); while (work <= LoopEnd && bw.CancellationPending != true) { CScheduledDate sdate = TimeTable[work.Date]; if (items.ContainsKey(sdate)) { CEvaluation1Day e1d = items[sdate]; e1d.Check(); } else { CEvaluation1Day e1d = new CEvaluation1Day(sdate); items.Add(sdate, e1d); e1d.Check(); } work = work.AddDays(1); Thread.Sleep(10); } // }
/// <summary>メンバーの削除 /// </summary> /// <param name="member">削除するメンバー</param> /// <param name="complete">完全削除かどうか</param> public virtual void DelMember(CMember member, bool complete) { if (!complete) { // 削除 DelMember(member); } else { if (member.Removed != null) { members.Remove(member); //System.out.println("完全削除1:" + member.getName()); // 完全削除 int sz = parent.Size(); for (int i = 0; i < sz; i++) { //System.out.println("完全削除2:" + member.getName()); CScheduledDate sdate = parent[i]; sdate.MakeMembers(); } if (TimeTable != null) { TimeTable.NotifyMembersEdited(EnumTimeTableElementEventTypes.ElementRemoved, member); } } else { DelMember(member, false); } } Refresh(); }
/// <summary> /// メンバーの作業時間の重複(エラー)または※2の時間を満たしていなければ警告 /// </summary> private void CheckSpace() { CSchedule tsche = sdate[_member]; CPattern tpatt = tsche.Pattern; if (!(tpatt == null || tpatt.BuiltIn)) { // 今日のパターンが存在する DateTime today = sdate.Date; DateTime yesterday = today.AddDays(-1).Date; CScheduledDate ydate = Root[yesterday]; CSchedule ysche = ydate[_member]; CPattern ypatt = ysche.Pattern; if (!(ypatt == null || ypatt.BuiltIn)) { // 昨日のパターンが存在する! DateTime yend = yesterday + ypatt.End; DateTime tend = yend + _member.Spacetime; DateTime tstt = today + tpatt.Start; if (yend >= tstt) { AddItem(EvaluationResult.ERROR, _member.Name + "の作業時間が重複しています。(" + tstt + "~" + yend + ")"); } else if (tend > tstt) { AddItem(EvaluationResult.WARNING, _member.Name + "の作業間隔が不足しています。(" + yend + "~" + tstt + ")"); } } } }
public CEvaluationItem(EvaluationResult Result, CScheduledDate Date, string Message) { id = CEvaluationItem.NextID; result = Result; sdate = Date; message = Message; }
/// <summary>勤務シフトの終了を返す /// </summary> /// <param name="date"></param> /// <param name="member"></param> /// <param name="head"></param> /// <returns></returns> private string ReturnPatternEnd(DateTime date, CMember member, bool head) { if (head) { return(member.Name + "のシフト終了"); } CScheduledDate sdate = TimeTable[date]; CSchedule schdule = sdate[member]; if (schdule == null) { return(""); } CPattern pattern = schdule.Pattern; if (pattern == null) { return(""); } if (pattern.BuiltIn) { return(""); } DateTime ret = date.Date + pattern.End; return(ret.ToLongDateString() + " " + ret.ToLongTimeString()); }
/// <summary>勤務シフトの長さを返す /// </summary> /// <param name="date"></param> /// <param name="member"></param> /// <param name="head"></param> /// <returns></returns> private string ReturnPatternLength(DateTime date, CMember member, bool head) { if (head) { return(member.Name + "の勤務時間"); } CScheduledDate sdate = TimeTable[date]; CSchedule schdule = sdate[member]; if (schdule == null) { return(TimeSpan.Zero.ToString()); } CPattern pattern = schdule.Pattern; if (pattern == null) { return(TimeSpan.Zero.ToString()); } if (pattern.BuiltIn) { return(TimeSpan.Zero.ToString()); } return(pattern.Scope.ToString()); }
/// <summary>値のセット /// </summary> /// <param name="sender">イベントの発生したオブジェクト</param> /// <param name="e">発生したイベント</param> private void BodyTable_CellValuePushed (object sender, DataGridViewCellValueEventArgs e) { CMember member = Members[e.RowIndex]; switch (e.ColumnIndex) { case 0: break; case 1: if (this.TimeTable == null) return; CPattern pattern = e.Value as CPattern; if (pattern == CPattern.MULTI) return; foreach (DateTime date in Dates) { if (date >= DateTime.Today) { CScheduledDate sdate = this.TimeTable[date]; CSchedule sche = sdate[member]; sche.Pattern = pattern; } } SetUpMember2Pattern(member); break; case 2: if (Dates.Count == 1 && StartDate >= DateTime.Today) { string val = e.Value as string; if (val == null) val = ""; if (this.TimeTable != null) { DateTime date = StartDate; CScheduledDate sdate = this.TimeTable[date]; CSchedule sche = sdate[member]; sche.Notes = val; //sche.SetProperty("notes", val); this.timeTable.NotifyScheduleEdited(sche); SetUpMember2Pattern(member); } } break; } }
/// <summary>メンバーの就業状態の作成 /// </summary> /// <param name="member"></param> private void SetUpMember2Pattern (CMember member) { PatternWrapper wrapper = new PatternWrapper(); wrapper.Pattern = CPattern.NULL; wrapper.StartTime = TimeSpan.MaxValue; wrapper.EndTime = TimeSpan.MinValue; if ((member == null) || (Dates.Count <= 0) || (TimeTable == null)) { // 存在しない if (member != null && Member2PatternWrapper.ContainsKey(member)) { Member2PatternWrapper.Remove(member); } return; } else { // 繰り返し int i = 0; foreach (DateTime date in Dates) { CScheduledDate sdate = TimeTable[date]; CSchedule schedule = sdate[member]; CPattern work = schedule.Pattern; if (i == 0) { // 最初のシフト wrapper.Pattern = work; if (work != null && !work.BuiltIn) { wrapper.StartTime = work.Start; wrapper.EndTime = work.End; i++; } wrapper.Notes = schedule.Notes; //wrapper.Notes = schedule["notes"]; } else if (wrapper.Pattern != work) { if (schedule.Notes != "") { // メモの追加 wrapper.Notes += "," + schedule.Notes; } // 複数選択されている wrapper.Pattern = CPattern.MULTI; if (work != null && !work.BuiltIn) { if (wrapper.StartTime > work.Start) { wrapper.StartTime = work.Start; } if (wrapper.EndTime < work.End) { wrapper.EndTime = work.End; } } i++; } } // 追加する if (Member2PatternWrapper.ContainsKey(member)) { Member2PatternWrapper[member] = wrapper; } else { Member2PatternWrapper.Add(member, wrapper); } } }
/// <summary>日付のロード /// </summary> public void LoadScheduledDate(XmlElement element, CTimeTable all) { DateTime date = DateTime.Parse(element.GetAttribute("date")); CScheduledDate scheduleddate = all.Dates.CreateScheduledDate(date); if (date.Year == 2007 && date.Month == 4 && date.Day == 28) { System.Console.WriteLine("ここだ!"); } LoadTmElement(element, scheduleddate); XmlAttribute req = element.Attributes["require"]; // 人員配置 if (req != null) { int wid = int.Parse(req.Value); CRequirePatterns reqobj = all.Requires.GetByID(wid); scheduleddate.Require = reqobj; } else { scheduleddate.Require = CRequirePatterns.NULL; } XmlElement pNode = element.FirstChild as XmlElement; while (pNode != null) { if (pNode.Name == "schedule") { // スケジュール CSchedule schedule = scheduleddate.CreateSchedule(); LoadTmElement(pNode, schedule); string membertxt = pNode.GetAttribute("member"); if (membertxt.Trim().Length > 0) { int memberid = int.Parse(membertxt); if (memberid > 0) { schedule.Member = all.Members.GetByID(memberid); } } string patterntxt = pNode.GetAttribute("pattern"); if (patterntxt.Trim().Length > 0) { int patternid = int.Parse(patterntxt); schedule.Pattern = all.Patterns.GetByID(patternid); } scheduleddate.SetSchedule(schedule); } // pNode = pNode.NextSibling as XmlElement; } all.Dates.AddScheduleDate(scheduleddate); }
/// <summary>人員配置名を返す /// </summary> /// <param name="date"></param> /// <param name="member"></param> /// <param name="head"></param> /// <returns></returns> private string ReturnRequireName(DateTime date, CMember member, bool head) { if (head) { return("人員配置"); } CScheduledDate sdate = TimeTable[date]; CRequirePatterns rq = sdate.Require; if (rq == null) { return(""); } return(ConvertColumn(rq.Name)); }
/// <summary>IDによるスケジュール日の取得 /// </summary> /// <param name="index">ID</param> /// <returns>スケジュール日</returns> public virtual CScheduledDate GetByID(int index) { DateTime datetime = new DateTime(index / 10000, (index % 10000) / 100, index % 100); CScheduledDate work = new CScheduledDate(datetime, this.TimeTable); //work.ObjectID = index; int i = schedules.BinarySearch(work); if (i < 0) { work = CreateScheduledDate(datetime); AddScheduleDate(work); return(work); } return((CScheduledDate)schedules[i]); }
/// <summary>メンバーの削除 /// </summary> /// <param name="member">削除するメンバー</param> /// <param name="date">削除する日</param> public void ClearMember(CMember member, DateTime date) { CScheduledDate work = CreateScheduledDate(date); int i = schedules.BinarySearch(work); if (i < 0) { return; } for (int j = i; j < schedules.Count; j++) { CScheduledDate sdate = schedules[j]; CSchedule schedule = sdate[member]; schedule.Pattern = null; } }
/// <summary>スケジュール日の取得 /// </summary> /// <param name="n">日付</param> /// <returns>スケジュール日</returns> private CScheduledDate GetScheduledDate(DateTime n) { CScheduledDate retValue = null; int index = n.Year * 10000 + n.Month * 100 + n.Day; retValue = GetByID(index); if (retValue == null) { retValue = CreateScheduledDate(n); AddScheduleDate(retValue); } return(retValue); }
/// <summary>勤務シフト名を返す /// </summary> /// <param name="date"></param> /// <param name="member"></param> /// <param name="head"></param> /// <returns></returns> private string ReturnPatternName(DateTime date, CMember member, bool head) { if (head) { return(member.Name + "の勤務シフト"); } CScheduledDate sdate = TimeTable[date]; CSchedule schdule = sdate[member]; if (schdule == null) { return(""); } CPattern pattern = schdule.Pattern; if (pattern == null) { return(""); } return(ConvertColumn(pattern.Name)); }
/// <summary>日付のセーブ /// </summary> public void SaveScheduledDate(XmlDocument doc, XmlElement rNode, CTimeTable all) { for (int i = 0; i < all.Size(); i++) { bool edited = false; CScheduledDate sdate = all[i]; XmlElement pNode = doc.CreateElement("scheduleddate"); SaveTmElement(doc, pNode, sdate); // 日付がもっとも大事? pNode.SetAttribute("date", sdate.Date.ToString(CSaver.DATEFORMAT)); // 人員配置 if (sdate.Require != null && sdate.Require != CRequirePatterns.NULL) { pNode.SetAttribute("require", sdate.Require.ObjectID.ToString()); if (sdate.Require != all.GetDefaultRequire(sdate.Date.DayOfWeek)) { edited = true; } } // メンバーごとのスケジュール(シフトとメモ) for (int j = 0; j < sdate.ValidMemberSize; j++) { CSchedule schedule = sdate[j]; XmlElement nNode = doc.CreateElement("schedule"); SaveTmElement(doc, nNode, schedule); if ((schedule.Member != null && schedule.Member != CMember.NULL && schedule.Pattern != null && schedule.Pattern != CPattern.NULL) || (schedule.Notes.Trim() != "")) { nNode.SetAttribute("member", schedule.Member.ObjectID.ToString()); nNode.SetAttribute("pattern", schedule.Pattern.ObjectID.ToString()); edited = true; pNode.AppendChild(nNode); } } if (edited) { // 変更されている場合のみ rNode.AppendChild(pNode); } } }
/// <summary>値設定 /// </summary> /// <param name="sender">イベントの発生したオブジェクト</param> /// <param name="e">発生したイベント</param> private void CalenderView_CellValuePushed(object sender, DataGridViewCellValueEventArgs e) { if (TimeTable == null) { return; } DateTime date = GetDateFromRowIndex(e.RowIndex); if (e.ColumnIndex == 0) { // 日付 //e.Value = date; } else { CScheduledDate sdate = TimeTable[date]; if (e.ColumnIndex == 1) { // 人員配置 sdate.Require = e.Value as CRequirePatterns; } else { // メンバー||シフト int index = e.ColumnIndex - 2; if (index < columns1.Count) { ShiftComboBoxColumn col = columns1[index]; CMember member = col.Member; if (member != null) { CSchedule schedule = sdate[member]; schedule.Pattern = e.Value as CPattern; } } } } }
/// <summary>勤務シフトの完全削除 /// </summary> /// <param name="pattern">削除するシフト</param> /// <param name="complete">完全に削除するかどうか</param> public virtual void DelPattern(CPattern pattern, bool complete) { if (!complete) { DelPattern(pattern); } else { // 完全に削除する if (pattern.Removed != null) { patterns.Remove(pattern); // スケジュールから削除 int sz = parent.Size(); for (int i = 0; i < sz; i++) { CScheduledDate wkDate = parent[i]; int sz2 = wkDate.ValidMemberSize; for (int j = 0; j < sz2; j++) { CSchedule scd = wkDate[j]; if (scd != null) { CPattern pat = scd.Pattern; if (pat != null && pat.Equals(pattern)) { scd.Pattern = CPattern.NULL; } } } } if (TimeTable != null) { TimeTable.NotifyPatternsEdited(EnumTimeTableElementEventTypes.ElementRemovedForce, pattern); } } } }
/// <summary>スケジュール日の作成</summary> protected internal virtual CScheduledDate CreateScheduledDate(System.DateTime d) { CScheduledDate ret = new CScheduledDate(d, TimeTable); if (this.TimeTable.IsDayOff(d)) { ret.Require = CRequirePatterns.DAYOFF; } else { if (this.TimeTable.GetDefaultRequire(d.DayOfWeek) != null) { ret.Require = this.TimeTable.GetDefaultRequire(d.DayOfWeek); } else { if (this.TimeTable.DefaultRequire != null) { ret.Require = this.TimeTable.DefaultRequire; } } } return(ret); }
/// <summary> /// コンストラクタ /// </summary> /// <param name="sDate"></param> public CEvaluation1Day(CScheduledDate sDate) { this.sdate = sDate; Check(); }
public EScheduleDateRequirePatternsEditedEventArgs(CScheduledDate param0, CRequirePatterns param1) { this.sdate = param0; this.require = param1; }
/// <summary> /// コンストラクタ /// </summary> /// <param name="source"></param> public ECurrentDateChangedArgs(CScheduledDate source) { this.scheduleDate = source; }
/// <summary>スケジュール日の削除 /// </summary> /// <param name="d">削除するスケジュール日</param> public virtual void DelScheduledDate(CScheduledDate d) { schedules.Remove(d); }
/// <summary>スケジュール日の追加</summary> protected internal virtual void AddScheduleDate(CScheduledDate sd) { schedules.Add(sd); //schedules.Sort(); Sort2(); }
/// <summary>印刷・ボディ部分 /// </summary> /// <param name="g">グラフィックスオブジェクト</param> /// <param name="e">イベント</param> protected virtual void PaintBody(Graphics g, System.Drawing.Printing.PrintPageEventArgs e) { //Graphics g = e.Graphics; Rectangle mar = e.MarginBounds; RectangleF rect; #region 内部の箱 { float itop = mar.Top + Header.GetHeight(g); float ibottom = mar.Bottom - Footer.GetHeight(g) - 2; float iheight = ibottom - itop; float ileft = mar.Left; float iwidth = mar.Width; float iright = ileft + iwidth; rect = new RectangleF(ileft, itop, iwidth, iheight); } #endregion // g.DrawRectangle(this.Pen, rect.Left, rect.Top, rect.Width, rect.Height); // CPageIndex page = pages[index]; // 決め打ちできる罫線を引く float DateRight = rect.Left + RequireColumnWidth; g.DrawLine(this.Pen, DateRight, rect.Top, DateRight, rect.Bottom); DrawString(g, "日付", HeaderFont, HeaderBrush, rect.Left, DateRight, rect.Top, tableHeaderHight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER); float RequireRight = DateRight; if (IsDisplayRequire) { RequireRight += RequireColumnWidth; g.DrawLine(this.Pen, RequireRight, rect.Top, RequireRight, rect.Bottom); DrawString(g, "人員配置", HeaderFont, HeaderBrush, DateRight, RequireRight, rect.Top, tableHeaderHight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER); } // テーブルのヘッダ float TableHeadBottom = rect.Top + TableHeaderHight; g.DrawLine(this.Pen, rect.Left, TableHeadBottom, rect.Right, TableHeadBottom); // メンバー数に応じた罫線を引く float MemberColumnBase = (IsDisplayRequire ? RequireRight : DateRight); float MemberColumnSpace = rect.Right - MemberColumnBase; float MemberColumnWidth = MemberColumnSpace / page.MemberCount; for (int i = 1; i < page.MemberCount; i++) { float WorkLeft = MemberColumnBase + MemberColumnWidth * (i - 1); float WorkRight = MemberColumnBase + MemberColumnWidth * i; g.DrawLine(this.Pen, WorkRight, rect.Top, WorkRight, rect.Bottom); } // メンバー名 for (int i = 0; i < page.MemberCount; i++) { float WorkLeft = MemberColumnBase + MemberColumnWidth * i; float WorkRight = MemberColumnBase + MemberColumnWidth * (i + 1); // CMember member = this.TimeTable.Members[page.MemberStartIndex + i]; DrawString(g, member.Name, HeaderFont, HeaderBrush, WorkLeft, WorkRight, rect.Top, tableHeaderHight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER); } // 日数に応じた罫線を引く float DateRowSpace = rect.Bottom - TableHeadBottom; float DateRowHeight = DateRowSpace / page.DateCount; for (int i = 1; i < page.DateCount; i++) { float WorkTop = TableHeadBottom + DateRowHeight * (i - 1); float WorkBottom = TableHeadBottom + DateRowHeight * i; g.DrawLine(this.Pen, rect.Left, WorkBottom, rect.Right, WorkBottom); } // これこそ本体 DateTime WorkDate = page.Start; for (int i = 0; i < page.DateCount; i++) { float WorkTop = TableHeadBottom + DateRowHeight * i; float WorkBottom = TableHeadBottom + DateRowHeight * (i + 1); // 日付 DrawString(g, WorkDate.ToString(DateFormat), System.Windows.Forms.Control.DefaultFont, Brushes.Black, rect.Left, DateRight, WorkTop, DateRowHeight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER); // スケジュール日 CScheduledDate sdate = this.TimeTable[WorkDate]; if (IsDisplayRequire) { if (sdate.Require != null) { DrawString(g, sdate.Require.Name, BodyFont, BodyBrush, DateRight, RequireRight, WorkTop, DateRowHeight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER); } } // シフト for (int j = 0; j < page.MemberCount; j++) { float WorkLeft = MemberColumnBase + MemberColumnWidth * j; float WorkRight = MemberColumnBase + MemberColumnWidth * (j + 1); // CMember member = this.TimeTable.Members[page.MemberStartIndex + j]; CSchedule schedule = sdate[member]; CPattern pattern = (schedule != null ? schedule.Pattern : null); if (pattern != null) { DrawString(g, pattern.Name, BodyFont, BodyBrush, WorkLeft, WorkRight, WorkTop, DateRowHeight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER); } } // WorkDate = WorkDate.AddDays(1); } // e.HasMorePages = page.HasMorePage; // index++; }