/// <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); } } } }
/// <summary> /// スケジュール日の人員配置が変更された /// </summary> public void NotifyScheduleDateRequirePatternsEdited(CScheduledDate param0, CRequirePatterns param1) { if (OnDayOffsEdited != null && scheduleEditedEvnetIsValid) { EScheduleDateRequirePatternsEditedEventArgs e = new EScheduleDateRequirePatternsEditedEventArgs(param0, param1); OnScheduleDateRequirePatternsEdited(this, e); } }
/// <summary>今の人員配置だとこの時間何人くらい必要なんだろう?</summary> public virtual int GetPatternTotal(TimeSpan time) { int ret = 0; CRequirePatterns require = Require; if (require != null) { ret = require.GetPatternTotal(time); } return(ret); }
/// <summary>曜日ごとの人員配置 /// </summary> /// <param name="weekday">曜日</param> /// <returns>人員配置</returns> public CRequirePatterns GetDefaultRequire(int weekday) { CRequirePatterns ret = null; ret = defaults[weekday]; if (ret == null) { ret = DefaultRequire; } return(ret); }
/// <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; } } }
/// <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)); } } }
/// <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); } } }
/// <summary> /// 人員配置が変更された /// </summary> /// <param name="type"></param> /// <param name="source"></param> public void NotifyRequirePatternssEdited(EnumTimeTableElementEventTypes type, CRequirePatterns source) { if (OnRequirePatternssEdited != null && scheduleEditedEvnetIsValid) { ERequirePatternssEditedEventArgs e = new ERequirePatternssEditedEventArgs(type, source); OnRequirePatternssEdited(this, e); } }
/// <summary> /// 人員配置 /// </summary> public void SetDefaultRequire(int weekday, CRequirePatterns value) { defaults[weekday] = value; }
/// <summary>人員配置 /// </summary> public void SetDefaultRequire(System.DayOfWeek weekday, CRequirePatterns value) { int wday = DayOfWeek2Int(weekday); defaults[wday] = value; }
/// <summary>初期化処理 /// </summary> private void InitBlock() { defaults = new CRequirePatterns[7]; Properties = new System.Collections.Specialized.NameValueCollection(); }
/// <summary>コンストラクタ /// </summary> /// <param name="SDate">スケジュール日</param> /// <param name="Requires">人員配置</param> public EScheduleDateRequirePatternsEditedEventArgs(CScheduledDate SDate, CRequirePatterns Requires) { this.sdate = SDate; this.require = Requires; }
/// <summary>コンストラクタ /// </summary> /// <param name="EventType">イベント種別</param> /// <param name="EventSource">発生源</param> public ERequirePatternssEditedEventArgs(EnumTimeTableElementEventTypes EventType, CRequirePatterns EventSource) { this.type = EventType; this.source = EventSource; }