/// <summary>勤務シフトの削除 /// </summary> /// <param name="pattern">削除するシフト</param> public virtual void DelPattern(CPattern pattern) { pattern.SetAvailable(false); if (pattern.Removed != null) { availables.Remove(pattern); // 人員配置から削除 CRequirePatternsCollection requires = parent.Requires; for (int i = 0; i < requires.Size(true); i++) { CRequirePatterns require = requires[i, true]; require.SetRequire(pattern, 0); } // メンバーから削除 CMemberCollection members = parent.Members; for (int i = 0; i < members.Size(true); i++) { CMember member = members[i, true]; member.RemovePattern(pattern); } // イベント発生 if (TimeTable != null) { TimeTable.NotifyPatternsEdited(EnumTimeTableElementEventTypes.ElementRemoved, pattern); } } }
/// <summary>人員配置のロード /// </summary> public void LoadRequirePatterns(XmlElement element, CTimeTable all) { XmlElement pNode = element.FirstChild as XmlElement; while (pNode != null) { if (pNode.Name == "require") { CRequirePatterns require = all.Requires.CreateRequirePatterns(); LoadTmElement(pNode, require); require.Name = pNode.GetAttribute("name"); // 利用できるシフト XmlElement tNode = pNode.FirstChild as XmlElement; while (tNode != null) { if (tNode.Name == "pattern") { // int patternid = int.Parse(tNode.GetAttribute("patternid")); int requirenum = int.Parse(tNode.GetAttribute("requirenums")); CPattern pattern = all.Patterns.GetByID(patternid); require.SetRequire(pattern, requirenum); } // tNode = tNode.NextSibling as XmlElement; } // all.Requires.AddRequirePatterns(require); } // pNode = pNode.NextSibling as XmlElement; } //all.Requires.AddRequirePatterns(RequirePatterns.NOWORK); }
/// <summary>人員配置のセーブ /// </summary> public XmlElement SaveRequirePatterns(XmlDocument doc, CTimeTable all) { XmlElement element = doc.CreateElement("requires"); SaveTmElement(doc, element, all.Requires); for (int i = 0; i < all.Requires.Size(true); i++) { CRequirePatterns require = all.Requires[i, true]; if (!require.BuiltIn) { XmlElement pNode = doc.CreateElement("require"); SaveTmElement(doc, pNode, require); pNode.SetAttribute("name", require.Name); // シフトごとの人数 for (int j = 0; j < require.Size(); j++) { CPattern pattern = require.GetPattern(j); int needs = require.GetRequire(pattern); if (needs > 0) { XmlElement nNode = doc.CreateElement("pattern"); nNode.SetAttribute("patternid", pattern.ObjectID.ToString()); nNode.SetAttribute("requirenums", needs.ToString()); pNode.AppendChild(nNode); } } // エレメントを追加 element.AppendChild(pNode); } } return(element); }
/// <summary>インポートする /// </summary> /// <param name="sender">イベント発生元</param> /// <param name="e">発生したイベント</param> private void BtnOK_Click(object sender, EventArgs e) { try { foreach (DataRowView view in LstImportMember.CheckedItems) { CMember item = view.Row["ClmImportMember"] as CMember; ImportMember(item); } foreach (DataRowView view in LstImportPattern.CheckedItems) { CPattern item = view.Row["ClmImportPattern"] as CPattern; ImportPattern(item); } foreach (DataRowView view in LstImportRequires.CheckedItems) { CRequirePatterns item = view.Row["ClmImportRequires"] as CRequirePatterns; ImportRequires(item); } foreach (DataRowView view in LstImportDayOff.CheckedItems) { CDayOff item = view.Row["ClmImportDayOff"] as CDayOff; ImportDayOff(item); } } catch (Exception ex) { MessageBox.Show(this, ex.StackTrace, ex.Message, MessageBoxButtons.OK, MessageBoxIcon.Error); } Dispose(); }
/// <summary>勤務シフトに対してマッチしているか?(1日単位で) /// </summary> /// <returns>割合</returns> private double CheckPatternMuches() { double ret = 0.0; CRequirePatterns require = sdate.Require; if (require == null) { return(1.0); } List <CPattern> patterns = new List <CPattern>(); for (int i = 0; i < require.Size(); i++) { patterns.Add(require.GetPattern(i)); } int j = 0; for (int i = 0; i < patterns.Count; i++) { CPattern pattern = patterns[i]; if (pattern.IsAvailable(sdate.Date)) { double work = CheckPatternMuches(pattern); ret += work; j++; } } ret = (j > 0 ? ret / (double)j : 1.0); return(ret); }
/// <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> private void MakeRequires() { for (int i = 0; i < Source.Requires.Size(true); i++) { CRequirePatterns requires = Source.Requires[i, true]; if (!requires.BuiltIn) { DataRow dr = TblImportRequires.NewRow(); dr[ClmImportRequires] = requires; dr[ClmImportRequiresName] = requires.Name + (requires.Removed == null ? "" : "(削除されています)"); TblImportRequires.Rows.Add(dr); } } }
/// <summary>値の取得時 /// </summary> /// <param name="value"></param> /// <param name="rowIndex"></param> /// <param name="cellStyle"></param> /// <param name="valueTypeConverter"></param> /// <param name="formattedValueTypeConverter"></param> /// <param name="context"></param> /// <returns></returns> protected override object GetFormattedValue( object value, int rowIndex, ref DataGridViewCellStyle cellStyle, TypeConverter valueTypeConverter, TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context) { CRequirePatterns ret = null; if (value != null && value is CRequirePatterns) { ret = value as CRequirePatterns; } return((ret == null) ? "" : ret.Name); }
/// <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>人員配置の一覧 /// </summary> private void ResetRequires(DateTime currentdate) { if (timeTable == null) { return; } TblRequireComboBox.Clear(); TimeTableManager.ElementCollection.CRequirePatternsCollection requires = TimeTable.Requires; int size = requires.Size(true); for (int i = 0; i < size; i++) { CRequirePatterns require = requires[i, true]; if (require.IsAvailable(currentdate)) { TblRequireComboBox.Rows.Add(require, require.Name); } } }
/// <summary> /// パターンに対してマッチしているか? /// </summary> /// <param name="pattern">パターン</param> /// <returns>割合</returns> private double CheckPatternMuches(CPattern pattern) { double ret = 0; CRequirePatterns require = sdate.Require; if (require == null || require == CRequirePatterns.DAYOFF || require == CRequirePatterns.NULL) { // 休みなら常に条件を満たすことにする(必要人数が0だから) ret = 1.0; } else { int need = require.GetRequire(pattern); if (need <= 0) { // 必要人数が0なら条件を常に満たす・・かな? ret = 1.0; } else { // 割合を計算してみる int seed = GetPatternMemberCount(pattern); ret = (double)seed / (double)need; if (ret < 1) { if (ret <= 0.0) { AddItem(EvaluationResult.ERROR, pattern.Name + "が必要な人数を満たしていません。(" + need + "人中" + seed + "人)"); } else if (ret < 0.5) { AddItem(EvaluationResult.WARNING, pattern.Name + "が必要な人数の半分を満たしていません。(" + need + "人中" + seed + "人)"); } else if (ret < 1) { AddItem(EvaluationResult.NOTICE, pattern.Name + "が必要な人数を満たしていません。(" + need + "人中" + seed + "人)"); } } } } return(ret); }
/// <summary>勤務シフトに対してマッチしているか? /// </summary> /// <param name="pattern">勤務シフト</param> /// <returns>割合</returns> private double CheckPatternMuches(CPattern pattern) { double ret = 0; CRequirePatterns require = sdate.Require; if (require == null || require == CRequirePatterns.DAYOFF || require == CRequirePatterns.NULL) { // 休みなら常に条件を満たすことにする(人員配置が0だから) ret = 1.0; } else { int need = require.GetRequire(pattern); if (need <= 0) { // 人員配置が0なら条件を常に満たす・・かな? ret = 1.0; } else { // 割合を計算してみる int seed = GetPatternMemberCount(pattern); ret = (double)seed / (double)need; if (ret < 1) { if (ret <= 0.0) { AddItem(EEvaluationResult.ERROR, GenerateMessage(msg_needs_unmuch_error, new string[] { pattern.Name, need.ToString(), seed.ToString() })); } else if (ret < 0.5) { AddItem(EEvaluationResult.WORNING, GenerateMessage(msg_needs_unmuch_worning, new string[] { pattern.Name, need.ToString(), seed.ToString() })); } else if (ret < 1) { AddItem(EEvaluationResult.NOTICE, GenerateMessage(msg_needs_unmuch_notice, new string[] { pattern.Name, need.ToString(), seed.ToString() })); } } } } return(ret); }
/// <summary> /// パターンに対してマッチしているか?(1日単位で) /// </summary> /// <returns>割合</returns> private double CheckPatternMuches() { double ret = 0.0; CRequirePatterns require = sdate.Require; if (require == null) { return(1.0); } List <CPattern> patterns = new List <CPattern>(); for (int i = 0; i < require.Size(); i++) { patterns.Add(require.GetPattern(i)); } int j = 0; for (int i = 0; i < patterns.Count; i++) { CPattern pattern = patterns[i]; if (pattern.IsAvailable(sdate.Date)) { double work = CheckPatternMuches(pattern); //if (work > 1) { // work = 1.0; //} else { // if (work < 1) { // AddItem(EvaluationResult.NOTICE, pattern.Name + "が必要な人数を満たしていません。"); // } else if (work < 0.5) { // AddItem(EvaluationResult.WARNING, pattern.Name + "が必要な人数の半分を満たしていません。"); // } else if (work <= 0.0) { // AddItem(EvaluationResult.ERROR, pattern.Name + "が必要な人数を満たしていません。"); // } //} ret += work; j++; } } ret = (j > 0 ? ret / (double)j : 1.0); return(ret); }
/// <summary>人員配置のインポート /// </summary> /// <param name="requires">インポートする人員配置</param> /// <returns>成功:追加したエレメント/不成功:null</returns> private CRequirePatterns ImportRequires(CRequirePatterns requires) { #region 重複チェック CRequirePatternsCollection col = Target.Requires; if (col.GetByName(requires.Name) != null) { return(null); } if (col.Size() >= FMainForm.MaxItemCount) { return(null); } #endregion #region インポート CRequirePatterns newrequires = col.CreateRequirePatterns(true); newrequires.Name = requires.Name; for (int i = 0; i < Source.Patterns.Size(true); i++) { CPattern pattern = Source.Patterns[i, true]; int needs = requires.GetRequire(pattern); if (!pattern.BuiltIn && (pattern.Removed == null || needs > 0)) { CPattern newpattern = Target.Patterns.GetByName(pattern.Name); if (newpattern == null) { newpattern = ImportPattern(pattern); } newrequires.SetRequire(newpattern, needs); } } newrequires.Notes = requires.Notes + "\nインポートされました。"; foreach (string key in requires.properties.AllKeys) { newrequires[key] = requires[key]; } #endregion col.AddRequirePatterns(newrequires); // 終端 return(newrequires); }
public ERequirePatternssEditedEventArgs(EnumTimeTableElementEventTypes EventType, CRequirePatterns EventSource) { this.type = EventType; this.source = EventSource; }
/// <summary>ロードメイン /// </summary> public CTimeTable Load(string file) { CTimeTable ret = new CTimeTable(); ret.ScheduleEditedEvnetIsValid = false; XmlDocument doc = new XmlDocument(); doc.Load(file); XmlElement rNode = doc.DocumentElement; XmlElement cNode = rNode.FirstChild as XmlElement; while (cNode != null) { if (cNode.Name == "patterns") { // シフト LoadPatterns(cNode, ret); } else if (cNode.Name == "members") { // メンバー LoadMembers(cNode, ret); } else if (cNode.Name == "requires") { // 人員配置 LoadRequirePatterns(cNode, ret); } else if (cNode.Name == "dayoffs") { // 休日 LoadDayOffs(cNode, ret); } else if (cNode.Name == "scheduleddate") { // 日付 LoadScheduledDate(cNode, ret); } else if (cNode.Name == "starttime") { // 営業開始時間 string text = cNode.InnerText; ret.StartTime = TimeSpan.Parse(text); } else if (cNode.Name == "endtime") { // 営業終了時間 if (ret.Around == TimeSpan.Zero) { string text = cNode.InnerText; ret.EndTime = TimeSpan.Parse(text); } } else if (cNode.Name == "around") { // 営業時間 string text = cNode.InnerText; ret.Around = TimeSpan.Parse(text); } else if (cNode.Name == "default_require") { // デフォルトの人員配置 string text = cNode.InnerText; int requireid = int.Parse(text); if (requireid > 0) { CRequirePatterns require = ret.Requires.GetByID(requireid); if (require != null) { ret.DefaultRequire = require; } } } else if (cNode.Name == "defaultRequireweekday") { // デフォルトの人員配置(曜日ごと) string text1 = cNode.GetAttribute("weekday"); string text2 = cNode.GetAttribute("require"); try { int weekdayid, requireid; int.TryParse(text1, out weekdayid); int.TryParse(text2, out requireid); //= (int.TryParse(text1,) ? int.Parse(text1) : 0); //int requireid = int.Parse(text2); if (weekdayid >= 0) { CRequirePatterns require = ret.Requires.GetByID(requireid); if (require != null) { ret.SetDefaultRequire(weekdayid, require); } } } catch { } } else if (cNode.Name == "sequence") { // 順番 string text = cNode.InnerText; int seq = int.Parse(text); ret.CurrentID = seq; } else if (cNode.Name == "property") { //ret[cNode.GetAttribute("key")] = cNode.GetAttribute("value"); ret[cNode.GetAttribute("key")] = cNode.InnerText; } // cNode = cNode.NextSibling as XmlElement; } ret.ScheduleEditedEvnetIsValid = true; return(ret); }
/// <summary>セーブメイン /// </summary> public void Save(string file, CTimeTable ret) { XmlDocument doc = new XmlDocument(); XmlDeclaration declaration = doc.CreateXmlDeclaration("1.0", "", "yes"); doc.InsertBefore(declaration, doc.DocumentElement); XmlElement rNode = doc.CreateElement("scheduleall"); doc.AppendChild(rNode); // シフト rNode.AppendChild(SavePatterns(doc, ret)); // メンバー rNode.AppendChild(SaveMembers(doc, ret)); // 人員配置 rNode.AppendChild(SaveRequirePatterns(doc, ret)); // 休日 rNode.AppendChild(SaveDayOffs(doc, ret)); #region 営業開始時間 XmlElement startNode = doc.CreateElement("starttime"); startNode.InnerText = ret.StartTime.ToString(); rNode.AppendChild(startNode); #endregion #region 営業終了時間 XmlElement endNode = doc.CreateElement("endtime"); endNode.InnerText = ret.EndTime.ToString(); rNode.AppendChild(endNode); #endregion #region 営業時間 XmlElement aroundNode = doc.CreateElement("around"); aroundNode.InnerText = ret.Around.ToString(); rNode.AppendChild(aroundNode); #endregion #region デフォルトの人員配置 if (ret.DefaultRequire != null && ret.DefaultRequire != CRequirePatterns.NULL) { XmlElement defaultNode = doc.CreateElement("default_require"); defaultNode.InnerText = ret.DefaultRequire.ObjectID.ToString(); rNode.AppendChild(defaultNode); } #endregion #region デフォルトの人員配置(曜日ごと) CRequirePatterns work = null; work = ret.GetDefaultRequire(System.DayOfWeek.Monday); if (work != null && work != CRequirePatterns.NULL) { XmlElement defaultNode = doc.CreateElement("defaultRequireweekday"); defaultNode.SetAttribute("weekday", "0"); defaultNode.SetAttribute("require", work.ObjectID.ToString()); rNode.AppendChild(defaultNode); } work = ret.GetDefaultRequire(System.DayOfWeek.Tuesday); if (work != null && work != CRequirePatterns.NULL) { XmlElement defaultNode = doc.CreateElement("defaultRequireweekday"); defaultNode.SetAttribute("weekday", "1"); defaultNode.SetAttribute("require", work.ObjectID.ToString()); rNode.AppendChild(defaultNode); } work = ret.GetDefaultRequire(System.DayOfWeek.Wednesday); if (work != null && work != CRequirePatterns.NULL) { XmlElement defaultNode = doc.CreateElement("defaultRequireweekday"); defaultNode.SetAttribute("weekday", "2"); defaultNode.SetAttribute("require", work.ObjectID.ToString()); rNode.AppendChild(defaultNode); } work = ret.GetDefaultRequire(System.DayOfWeek.Thursday); if (work != null && work != CRequirePatterns.NULL) { XmlElement defaultNode = doc.CreateElement("defaultRequireweekday"); defaultNode.SetAttribute("weekday", "3"); defaultNode.SetAttribute("require", work.ObjectID.ToString()); rNode.AppendChild(defaultNode); } work = ret.GetDefaultRequire(System.DayOfWeek.Friday); if (work != null && work != CRequirePatterns.NULL) { XmlElement defaultNode = doc.CreateElement("defaultRequireweekday"); defaultNode.SetAttribute("weekday", "4"); defaultNode.SetAttribute("require", work.ObjectID.ToString()); rNode.AppendChild(defaultNode); } work = ret.GetDefaultRequire(System.DayOfWeek.Saturday); if (work != null && work != CRequirePatterns.NULL) { XmlElement defaultNode = doc.CreateElement("defaultRequireweekday"); defaultNode.SetAttribute("weekday", "5"); defaultNode.SetAttribute("require", work.ObjectID.ToString()); rNode.AppendChild(defaultNode); } work = ret.GetDefaultRequire(System.DayOfWeek.Sunday); if (work != null && work != CRequirePatterns.NULL) { XmlElement defaultNode = doc.CreateElement("defaultRequireweekday"); defaultNode.SetAttribute("weekday", "6"); defaultNode.SetAttribute("require", work.ObjectID.ToString()); rNode.AppendChild(defaultNode); } #endregion #region 順番 XmlElement seqNode = doc.CreateElement("sequence"); seqNode.InnerText = ret.CurrentID.ToString(); rNode.AppendChild(seqNode); #endregion #region 直下のプロパティ foreach (string key in ret) { XmlElement propelement = doc.CreateElement("property"); propelement.SetAttribute("key", key); propelement.InnerText = ret[key]; rNode.AppendChild(propelement); } #endregion // 日付 SaveScheduledDate(doc, rNode, ret); /////////////// doc.Save(file); }
public EScheduleDateRequirePatternsEditedEventArgs(CScheduledDate param0, CRequirePatterns param1) { this.sdate = param0; this.require = param1; }