/// <summary> /// 更新情報の設定 /// </summary> /// <param name="target">設定対象</param> /// <param name="source">設定元</param> private void SetUpdateInfo(T_DailyClasses target, T_DailyClasses source) { // publicのメンバー変数を取得 PropertyInfo[] propertyArray = source.GetType().GetProperties(); foreach (PropertyInfo property in propertyArray) { // 日付はスキップ if ("Date".Equals(property.Name)) { continue; } // 対象項目を設定 property.SetValue(target, property.GetValue(source)); } }
/// <summary> /// 更新表示 /// </summary> /// <param name="dailyParameterEdt">日別予測条件編集情報</param> /// <returns></returns> public ActionResult Edit([Bind(Include = "SearchDate")] V_DailyParameterEdt dailyParameterEdt) { Trace.WriteLine("GET /DailyParameter/Edit/" + dailyParameterEdt.SearchDate); // ステータスをクリア ModelState.Clear(); // インスタンスを生成 dailyParameterEdt.DailyClasses = new T_DailyClasses(); dailyParameterEdt.TrainerList = new List <T_DailyClassesByTrainer>(); if (dailyParameterEdt.SearchDate != null) { // 日別予測条件を取得 T_DailyClasses dailyClasses = db.DailyClasses.Find(dailyParameterEdt.SearchDate); // データが存在しない場合はインスタンスを生成 if (dailyClasses == null) { dailyClasses = new T_DailyClasses() { Date = dailyParameterEdt.SearchDate }; } dailyParameterEdt.DailyClasses = dailyClasses; // 更新日付Toを設定 dailyParameterEdt.UpdateTo = dailyClasses.Date; // 指導員コマ数を取得 dailyParameterEdt.TrainerList = db.DailyClassesByTrainer.Where(x => ((DateTime)x.Date).Equals((DateTime)dailyParameterEdt.SearchDate)).OrderBy(x => x.No).ToList(); } else { ViewBag.SearchErrorMessage = "検索条件を指定してください。"; } // 指導員コマ管理画面から遷移するための検索日付をTempDataに設定 TempData[AppConstant.TEMP_KEY_SEARCH_DATE] = dailyParameterEdt.SearchDate; return(View(dailyParameterEdt)); }
/// <summary> /// グラフデータ取得(予測値算出ロジック) /// </summary> /// <param name="db">DBコンテキスト</param> /// <param name="dateFrom">日付From</param> /// <param name="dateTo">日付To</param> /// <param name="targetTraineeLodging">合宿教習生情報(登録/更新時)</param> /// <param name="targetTraineeCommuting">通学教習生情報(登録/更新時)</param> /// <returns>グラフデータ</returns> public List <V_ChartData> GetChartData(MyDatabaseContext db, DateTime dateFrom, DateTime dateTo , List <T_TraineeLodging> targetTraineeLodging, T_TraineeCommuting targetTraineeCommuting) { List <V_ChartData> chartData = new List <V_ChartData>(); /* * [処理説明] * 繰り返し処理の開始を日曜、終了を土曜にするため、 * 「日付Fromの直近の日曜」と「日付Toの直後の土曜」を取得する。 * DayOfWeek:日曜=0~土曜=6 * [目的] * 週平均の在籍可能数を算出するため、検索範囲外の日曜~土曜の範囲で算出する必要がある。 */ // 日付Fromの直近の日曜を取得 DateTime sunFrom = dateFrom.AddDays(-1 * (int)dateFrom.DayOfWeek); // 日付Toの直後の土曜を取得 DateTime satTo = dateTo.AddDays((int)DayOfWeek.Saturday - (int)dateTo.DayOfWeek); // 合宿教習生の取得 List <T_TraineeLodging> traineeLodging; // 引数の教習生がnullの場合(受入予測管理) if (targetTraineeLodging == null) { // 対象期間の教習生データを全て取得 traineeLodging = db.TraineeLodging.Where( x => x.CancelFlg == false && (sunFrom <= x.EntrancePlanDate && x.EntrancePlanDate <= satTo || sunFrom <= x.GraduatePlanDate && x.GraduatePlanDate <= satTo || x.EntrancePlanDate < sunFrom && satTo < x.GraduatePlanDate)).ToList(); } // 引数の教習生がnullでない場合(教習生管理(登録/更新)) else { // 0以外の教習生IDを取得 List <int> traineeIdList = targetTraineeLodging.Where(x => !x.TraineeId.Equals(0)).Select(x => x.TraineeId).ToList(); // 対象教習生ID以外を取得 traineeLodging = db.TraineeLodging.Where( x => !traineeIdList.Contains(x.TraineeId) && x.CancelFlg == false && (sunFrom <= x.EntrancePlanDate && x.EntrancePlanDate <= satTo || sunFrom <= x.GraduatePlanDate && x.GraduatePlanDate <= satTo || x.EntrancePlanDate < sunFrom && satTo < x.GraduatePlanDate)).ToList(); // 対象教習生を追加 traineeLodging.AddRange(targetTraineeLodging.Where(x => x.CancelFlg == false)); } // 通学教習生の取得 List <T_TraineeCommuting> traineeCommuting; // 引数の教習生がnullの場合(受入予測管理) if (targetTraineeCommuting == null) { // 対象期間の教習生データを全て取得 traineeCommuting = db.TraineeCommuting.Where( x => x.CancelFlg == false && sunFrom <= x.EntrancePlanDate && x.EntrancePlanDate <= satTo || sunFrom <= x.GraduatePlanDate && x.GraduatePlanDate <= satTo || x.EntrancePlanDate < sunFrom && satTo < x.GraduatePlanDate).ToList(); } // 引数の教習生がnullでない場合(教習生管理(登録/更新)) else { // 対象教習生IDを取得 int traineeId = targetTraineeCommuting.TraineeId; // 対象教習生ID以外を取得 traineeCommuting = db.TraineeCommuting.Where( x => !x.TraineeId.Equals(traineeId) && x.CancelFlg == false && (sunFrom <= x.EntrancePlanDate && x.EntrancePlanDate <= satTo || sunFrom <= x.GraduatePlanDate && x.GraduatePlanDate <= satTo || x.EntrancePlanDate < sunFrom && satTo < x.GraduatePlanDate)).ToList(); // 対象教習生を追加 if (targetTraineeCommuting.CancelFlg == false) { traineeCommuting.Add(targetTraineeCommuting); } } // 対象期間の日別コマ数データを取得 List <T_DailyClasses> dailyClassesList = db.DailyClasses.Where(x => sunFrom <= x.Date && x.Date <= satTo).ToList(); // 対象期間の指導員データを取得 List <T_DailyClassesByTrainer> trainerList = db.DailyClassesByTrainer.Where(x => x.Date >= sunFrom && x.Date <= satTo).ToList(); // 受入可能人数/期間 double acceptLodgingMaxAmt = 0; double acceptCommutingMaxAmt = 0; // 受入累積数 Dictionary <DateTime, int> acceptLodgingTotalAmtDic = new Dictionary <DateTime, int>(); Dictionary <DateTime, int> acceptCommutingTotalAmtDic = new Dictionary <DateTime, int>(); // 在籍可能数/週 double weeklyLodgingSumAmt = 0; double weeklyCommutingSumAmt = 0; // 在籍可能数/日(週平均) Dictionary <DateTime, double> dailyLodgingMaxAmtDic = new Dictionary <DateTime, double>(); Dictionary <DateTime, double> dailyCommutingMaxAmtDic = new Dictionary <DateTime, double>(); // 残コマ数/日 double dailyRemClasses = 0; // 残コマ数/週 double weeklyRemClasses = 0; Dictionary <DateTime, double> weeklyRemClassesDic = new Dictionary <DateTime, double>(); for (DateTime day = sunFrom; day <= satTo; day = day.AddDays(1)) { // 日別予測条件 T_DailyClasses dailyClasses = dailyClassesList.Where(x => ((DateTime)x.Date).Equals(day)).FirstOrDefault(); if (dailyClasses == null) { dailyClasses = new T_DailyClasses() { Date = day }; } // 総コマ数/日 double dailySumClasses = trainerList.Where(x => x.Date.Equals(day)).Select(x => x.Classes).Sum(); // [20210416リリース対応] Add Start 各業務の割合から実車教習コマ数を算出 // 実車教習総コマ数/日の算出 dailySumClasses = ((100 - (dailyClasses.DepartExamRatio + dailyClasses.OtherVehicleRatio + dailyClasses.SeminarRatio + dailyClasses.OtherRatio)) / 100) * dailySumClasses; // [20210416リリース対応] Add End // -------------------- // 在籍可能数/日 // -------------------- // ①-1.【合宿】教習生一人が実車教習に必要なコマ数/日 // = 合宿生のAT一段階コマ数/日 × 合宿生のAT一段階比率[%] ÷ 100 + 合宿生のAT二段階コマ数/日 × 合宿生のAT二段階比率[%] ÷ 100 // + 合宿生のMT一段階コマ数/日 × 合宿生のMT一段階比率[%] ÷ 100 + 合宿生のMT二段階コマ数/日 × 合宿生のMT二段階比率[%] ÷ 100 double ldgDailyReqClasses = dailyClasses.LdgAtFstClassDay * dailyClasses.LdgAtFstRatio / 100 + dailyClasses.LdgAtSndClassDay * dailyClasses.LdgAtSndRatio / 100 + dailyClasses.LdgMtFstClassDay * dailyClasses.LdgMtFstRatio / 100 + dailyClasses.LdgMtSndClassDay * dailyClasses.LdgMtSndRatio / 100; // ①-2.【通学】教習生一人が実車教習に必要なコマ数/日 // = 通学生のAT一段階コマ数/日 × 通学生のAT一段階比率[%] ÷ 100 + 通学生のAT二段階コマ数/日 × 通学生のAT二段階比率[%] ÷ 100 // + 通学生のMT一段階コマ数/日 × 通学生のMT一段階比率[%] ÷ 100 + 通学生のMT二段階コマ数/日 × 通学生のMT二段階比率[%] ÷ 100 double cmtDailyReqClasses = dailyClasses.CmtAtFstClassDay * dailyClasses.CmtAtFstRatio / 100 + dailyClasses.CmtAtSndClassDay * dailyClasses.CmtAtSndRatio / 100 + dailyClasses.CmtMtFstClassDay * dailyClasses.CmtMtFstRatio / 100 + dailyClasses.CmtMtSndClassDay * dailyClasses.CmtMtSndRatio / 100; // ②-1.【合宿】在籍可能人数/日 ※①-1が0の場合は算出しない if (ldgDailyReqClasses != 0) { // 週合計に加算 weeklyLodgingSumAmt += (dailySumClasses / ldgDailyReqClasses) * (dailyClasses.LodgingRatio / 100); } // ②-2.【通学】在籍可能人数/日 ※①-2が0の場合は算出しない if (cmtDailyReqClasses != 0) { // 週合計に加算 weeklyCommutingSumAmt += (dailySumClasses / cmtDailyReqClasses) * (dailyClasses.CommutingRatio / 100); } // -------------------- // 在籍数 // -------------------- // 合宿在籍数(MT-一段階)(教習がMTかつ、入校予定日が対象日以上かつ、仮免予定日が対象日未満) int lodgingMtFstRegAmt = traineeLodging.Where( x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_MT) && x.EntrancePlanDate <= day && day < x.TmpLicencePlanDate).Count(); // [20210205リリース対応] Mod Start 卒業日以下を卒業日未満に修正 //// 合宿在籍数(MT-二段階)(教習がMTかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日以下) //int lodgingMtSndRegAmt = // traineeLodging.Where( // x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_MT) // && x.TmpLicencePlanDate <= day && day <= x.GraduatePlanDate).Count(); // 合宿在籍数(MT-二段階)(教習がMTかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日未満) int lodgingMtSndRegAmt = traineeLodging.Where( x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_MT) && x.TmpLicencePlanDate <= day && day < x.GraduatePlanDate).Count(); // [20210205リリース対応] Mod End // [20210205リリース対応] Del Start //// 合宿在籍数(MT-二段階)(教習がMTかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日未満)※卒業予定者を含まない //int lodgingMtRegAmtExceptGraduate = // traineeLodging.Where( // x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_MT) // && x.TmpLicencePlanDate <= day && day < x.GraduatePlanDate).Count(); // [20210205リリース対応] Del End // 合宿在籍数(AT-一段階)(教習がATかつ、入校予定日が対象日以上かつ、仮免予定日が対象日未満) int lodgingAtFstRegAmt = traineeLodging.Where( x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_AT) && x.EntrancePlanDate <= day && day < x.TmpLicencePlanDate).Count(); // [20210205リリース対応] Mod Start 卒業日以下を卒業日未満に修正 //// 合宿在籍数(AT-二段階)(教習がATかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日以下) //int lodgingAtSndRegAmt = // traineeLodging.Where( // x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_AT) // && x.TmpLicencePlanDate <= day && day <= x.GraduatePlanDate).Count(); // 合宿在籍数(AT-二段階)(教習がATかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日未満) int lodgingAtSndRegAmt = traineeLodging.Where( x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_AT) && x.TmpLicencePlanDate <= day && day < x.GraduatePlanDate).Count(); // [20210205リリース対応] Mod End // [20210205リリース対応] Del Start //// 合宿在籍数(AT-二段階)(教習がATかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日未満)※卒業予定者を含まない //int lodgingAtRegAmtExceptGraduate = // traineeLodging.Where( // x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_AT) // && x.TmpLicencePlanDate <= day && day < x.GraduatePlanDate).Count(); // [20210205リリース対応] Del End // 通学在籍数(MT-一段階)(教習がMTかつ、入校予定日が対象日以上かつ、仮免予定日が対象日未満) int commutingMtFstRegAmt = traineeCommuting.Where( x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_MT) && x.EntrancePlanDate <= day && day < x.TmpLicencePlanDate).Count(); // [20210205リリース対応] Mod Start 卒業日以下を卒業日未満に修正 //// 通学在籍数(MT-二段階)(教習がMTかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日以下) //int commutingMtSndRegAmt = // traineeCommuting.Where( // x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_MT) // && x.TmpLicencePlanDate <= day && day <= x.GraduatePlanDate).Count(); // 通学在籍数(MT-二段階)(教習がMTかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日未満) int commutingMtSndRegAmt = traineeCommuting.Where( x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_MT) && x.TmpLicencePlanDate <= day && day < x.GraduatePlanDate).Count(); // [20210205リリース対応] Mod End // 通学在籍数(AT-一段階)(教習がATかつ、入校予定日が対象日以上かつ、仮免予定日が対象日未満) int commutingAtFstRegAmt = traineeCommuting.Where( x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_AT) && x.EntrancePlanDate <= day && day < x.TmpLicencePlanDate).Count(); // [20210205リリース対応] Mod Start 卒業日以下を卒業日未満に修正 //// 通学在籍数(AT-二段階)(教習がATかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日以下) //int commutingAtSndRegAmt = // traineeCommuting.Where( // x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_AT) // && x.TmpLicencePlanDate <= day && day <= x.GraduatePlanDate).Count(); // 通学在籍数(AT-二段階)(教習がATかつ、仮免予定日が対象日以上かつ、卒業予定日が対象日未満) int commutingAtSndRegAmt = traineeCommuting.Where( x => x.TrainingCourseCd.Equals(AppConstant.TRAINING_COURSE_CD_AT) && x.TmpLicencePlanDate <= day && day < x.GraduatePlanDate).Count(); // [20210205リリース対応] Mod End // -------------------- // 当日の合宿生消化コマ数 // -------------------- // [20210205リリース対応] Mod Start 卒業日以下をlodgingMtSndRegAmt/lodgingAtSndRegAmtに統一 //// 合宿生のMT一段階コマ数/日 × 合宿生のMT一段階在籍数 //// + 合宿生のMT二段階コマ数/日 × 合宿生のMT二段階在籍数(卒業予定者を含まない) //// + 合宿生のAT一段階コマ数/日 × 合宿生のAT一段階在籍数 //// + 合宿生のAT二段階コマ数/日 × 合宿生のAT二段階在籍数(卒業予定者を含まない) //double sumClasses = // dailyClasses.LdgMtFstClassDay * lodgingMtFstRegAmt // + dailyClasses.LdgMtSndClassDay * lodgingMtRegAmtExceptGraduate // + dailyClasses.LdgAtFstClassDay * lodgingAtFstRegAmt // + dailyClasses.LdgAtSndClassDay * lodgingAtRegAmtExceptGraduate; // 合宿生のMT一段階コマ数/日 × 合宿生のMT一段階在籍数 // + 合宿生のMT二段階コマ数/日 × 合宿生のMT二段階在籍数 // + 合宿生のAT一段階コマ数/日 × 合宿生のAT一段階在籍数 // + 合宿生のAT二段階コマ数/日 × 合宿生のAT二段階在籍数 double sumClasses = dailyClasses.LdgMtFstClassDay * lodgingMtFstRegAmt + dailyClasses.LdgMtSndClassDay * lodgingMtSndRegAmt + dailyClasses.LdgAtFstClassDay * lodgingAtFstRegAmt + dailyClasses.LdgAtSndClassDay * lodgingAtSndRegAmt; // [20210205リリース対応] Mod End // 残コマ数/日 dailyRemClasses = dailySumClasses - sumClasses; // 残コマ数/週 weeklyRemClasses += dailyRemClasses; // 土曜の場合 if (day.DayOfWeek.Equals(DayOfWeek.Saturday)) { // 過去7日分を繰り返し for (DateTime tmpDay = day.AddDays(-6); tmpDay <= day; tmpDay = tmpDay.AddDays(1)) { // 週平均の在籍可能数を設定(在籍可能数/週 ÷ 7) dailyLodgingMaxAmtDic.Add(tmpDay, weeklyLodgingSumAmt / 7); dailyCommutingMaxAmtDic.Add(tmpDay, weeklyCommutingSumAmt / 7); // 対象の日付に残コマ数/週を設定 weeklyRemClassesDic.Add(tmpDay, weeklyRemClasses); } // 各変数をリセット weeklyRemClasses = 0; // 残コマ数/週 weeklyLodgingSumAmt = 0; // 合宿在籍可能数/週 weeklyCommutingSumAmt = 0; // 通学在籍可能数/週 } // 日付が検索範囲内の場合、グラフデータを生成 if (dateFrom <= day && day <= dateTo) { // -------------------- // 受入可能数/期間 // -------------------- // ①-1.【合宿】教習生一人が卒業までに必要なコマ数/日 // = (合宿生のAT一段階コマ数 + 合宿生のAT二段階コマ数) × (合宿生のAT一段階比率[%] + 合宿生のAT二段階比率[%]) ÷ 100 // + (合宿生のMT一段階コマ数 + 合宿生のMT二段階コマ数) × (合宿生のMT一段階比率[%] + 合宿生のMT二段階比率[%]) ÷ 100 double ldgTraineeReqClasses = (dailyClasses.LdgAtFstClass + dailyClasses.LdgAtSndClass) * (dailyClasses.LdgAtFstRatio + dailyClasses.LdgAtSndRatio) / 100 + (dailyClasses.LdgMtFstClass + dailyClasses.LdgMtSndClass) * (dailyClasses.LdgMtFstRatio + dailyClasses.LdgMtSndRatio) / 100; // ①-2.【通学】教習生一人が卒業までに必要なコマ数/日 // = (通学生のAT一段階コマ数 + 通学生のAT二段階コマ数) × (通学生のAT一段階比率[%] + 通学生のAT二段階比率[%]) ÷ 100 // + (通学生のMT一段階コマ数 + 通学生のMT二段階コマ数) × (通学生のMT一段階比率[%] + 通学生のMT二段階比率[%]) ÷ 100 double cmtTraineeReqClasses = (dailyClasses.CmtAtFstClass + dailyClasses.CmtAtSndClass) * (dailyClasses.CmtAtFstRatio + dailyClasses.CmtAtSndRatio) / 100 + (dailyClasses.CmtMtFstClass + dailyClasses.CmtMtSndClass) * (dailyClasses.CmtMtFstRatio + dailyClasses.CmtMtSndRatio) / 100; // ②-1.【合宿】受入可能人数/日を加算 ※①-1が0の場合は加算しない if (ldgTraineeReqClasses != 0) { acceptLodgingMaxAmt += (dailySumClasses / ldgTraineeReqClasses) * (dailyClasses.LodgingRatio / 100); } // ②-2.【通学】受入可能人数/日を加算 ※①-2が0の場合は加算しない if (cmtTraineeReqClasses != 0) { acceptCommutingMaxAmt += (dailySumClasses / cmtTraineeReqClasses) * (dailyClasses.CommutingRatio / 100); } // -------------------- // 受入累積数 // -------------------- // 前日までの受入累計数 int beforeLodgingTotalAmt = acceptLodgingTotalAmtDic.ContainsKey(day.AddDays(-1)) ? acceptLodgingTotalAmtDic[day.AddDays(-1)] : 0; int beforeCommutingTotalAmt = acceptCommutingTotalAmtDic.ContainsKey(day.AddDays(-1)) ? acceptCommutingTotalAmtDic[day.AddDays(-1)] : 0; // 受入累積数を加算 acceptLodgingTotalAmtDic.Add(day, beforeLodgingTotalAmt + traineeLodging.Where(x => x.EntrancePlanDate.Equals(day)).Count()); acceptCommutingTotalAmtDic.Add(day, beforeCommutingTotalAmt + traineeCommuting.Where(x => x.EntrancePlanDate.Equals(day)).Count()); // グラフデータのインスタンスを生成 V_ChartData data = new V_ChartData { Date = day }; // -------------------- // 在籍数 // -------------------- // 合宿在籍数(MT-一段階) data.LodgingMtFstRegAmt = lodgingMtFstRegAmt; // 合宿在籍数(MT-二段階) data.LodgingMtSndRegAmt = lodgingMtSndRegAmt; // 合宿在籍数(AT-一段階) data.LodgingAtFstRegAmt = lodgingAtFstRegAmt; // 合宿在籍数(AT-二段階) data.LodgingAtSndRegAmt = lodgingAtSndRegAmt; // 通学在籍数(MT-一段階) data.CommutingMtFstRegAmt = commutingMtFstRegAmt; // 通学在籍数(MT-二段階) data.CommutingMtSndRegAmt = commutingMtSndRegAmt; // 通学在籍数(AT-一段階) data.CommutingAtFstRegAmt = commutingAtFstRegAmt; // 通学在籍数(AT-二段階) data.CommutingAtSndRegAmt = commutingAtSndRegAmt; // [20210205リリース対応] Add Start 総コマ数/日を追加 // -------------------- // 総コマ数/日 // -------------------- // 教習総コマ数/日 data.DailySumClasses = Math.Round(dailySumClasses, 1); // [20210205リリース対応] Add End // -------------------- // 残コマ数/日 // -------------------- // 教習総コマ数/日 - 消化コマ数/日 data.DailyRemClasses = Math.Round(dailyRemClasses, 1); chartData.Add(data); } } chartData.ForEach(x => { // 受入残数を全てのデータに設定 x.AcceptLodgingRemAmt = Math.Round(acceptLodgingMaxAmt - acceptLodgingTotalAmtDic[x.Date], 1); x.AcceptCommutingRemAmt = Math.Round(acceptCommutingMaxAmt - acceptCommutingTotalAmtDic[x.Date], 1); // 在籍可能数/日の週平均を全てのデータに設定 x.DailyLodgingMaxAmt = Math.Round(dailyLodgingMaxAmtDic[x.Date], 1); x.DailyCommutingMaxAmt = Math.Round(dailyCommutingMaxAmtDic[x.Date], 1); // 残コマ数/週を全てのデータに設定 x.WeeklyRemClasses = Math.Round(weeklyRemClassesDic[x.Date], 1); }); return(chartData); }
public ActionResult Import(string cmd, HttpPostedFileBase postedFile, [Bind(Include = "Date,No,TrainerName,Classes")] List <T_DailyClassesByTrainer> importList) { Trace.WriteLine("POST /InstractorImport/Import"); // 読込ボタンが押下された場合 if (AppConstant.CMD_READ.Equals(cmd)) { // ステータスをクリア ModelState.Clear(); // 指導員コマ数クラスを初期化 importList = new List <T_DailyClassesByTrainer>(); if (postedFile != null) { // 拡張子チェック string extension = Path.GetExtension(postedFile.FileName); if (!".csv".Equals(extension) && !".CSV".Equals(extension)) { // エラーメッセージ ViewBag.ErrorMessage = "ファイルはcsv形式を指定してください。"; return(View(importList)); } // アップロード先ディレクトリ string uploadDir = AppDomain.CurrentDomain.BaseDirectory + @"Uploads\"; // ディレクトリが存在しない場合は作成 if (!Directory.Exists(uploadDir)) { Directory.CreateDirectory(uploadDir); } // ファイルをサーバーに保存 string filepath = uploadDir + Path.GetFileName(postedFile.FileName); postedFile.SaveAs(filepath); // 項目数 int itemCnt = 0; // テキストを全行読み込み using (StreamReader sr = new StreamReader(filepath, Encoding.GetEncoding("shift_jis"))) { int row = 0; while (!sr.EndOfStream) { row++; // CSVファイルの一行を読み込む string line = sr.ReadLine(); // 読み込んだ一行をカンマ毎に分けて配列に格納 string[] values = line.Split(','); // ヘッダ行 if (row == 1) { // 項目数を取得 itemCnt = values.Count(); // スキップ continue; } // 空行チェック(全ての項目が空) if (values.Where(x => string.IsNullOrEmpty(x)).Count() == values.Count()) { break; } // CSV項目数チェック if (values.Count() != itemCnt) { ViewBag.ErrorMessage = "csvの項目数に誤りがあるため、読み込みを途中で終了しました。 " + row + "行目"; break; } // 対象日 DateTime dailyClassesDate; // No // [20210205リリース対応] Mod Start int?→intに変更 //int? dailyClassesNo; //int dailyClassesNoInt; int dailyClassesNo; // [20210205リリース対応] Mod End // 指導員名 string dailyClassesTrainerName; // コマ数 double dailyClassesNum; // ----- 対象日 ----- // 必須チェック if (string.IsNullOrEmpty(values[0])) { ViewBag.ErrorMessage = "対象日が未設定のため、読み込みを途中で終了しました。 " + row + "行目"; break; } // 日付整合性チェック if (!DateTime.TryParse(values[0], out dailyClassesDate)) { ViewBag.ErrorMessage = "対象日の設定が不正のため、読み込みを途中で終了しました。 " + row + "行目"; break; } // ----- No ----- // null許容 if (string.IsNullOrEmpty(values[1])) { // [20210205リリース対応] Mod Start nullを許容しない //dailyClassesNo = null; ViewBag.ErrorMessage = "Noが未設定のため、読み込みを途中で終了しました。 " + row + "行目"; break; // [20210205リリース対応] Mod End } else { // 数値整合性チェック // [20210205リリース対応] Mod Start 変数の変更 //if (!int.TryParse(values[1], out dailyClassesNoInt)) //{ // ViewBag.ErrorMessage = "Noの設定が不正のため、読み込みを途中で終了しました。 " + row + "行目"; // break; //} //if (dailyClassesNoInt <= 0) //{ // ViewBag.ErrorMessage = "Noの設定が不正のため、読み込みを途中で終了しました。 " + row + "行目"; // break; //} if (!int.TryParse(values[1], out dailyClassesNo)) { ViewBag.ErrorMessage = "Noの設定が不正のため、読み込みを途中で終了しました。 " + row + "行目"; break; } if (dailyClassesNo <= 0) { ViewBag.ErrorMessage = "Noの設定が不正のため、読み込みを途中で終了しました。 " + row + "行目"; break; } // [20210205リリース対応] Mod End // [20210205リリース対応] Del Start //if (db.DailyClassesByTrainer.Where(x => ((DateTime)x.Date).Equals(dailyClassesDate) && ((int)x.No).Equals(dailyClassesNoInt)).Count() == 0) //{ // ViewBag.ErrorMessage = "Noの設定が不正のため、読み込みを途中で終了しました。Noはすでに登録済の値のみ指定できます。 " + row + "行目"; // break; //} //dailyClassesNo = dailyClassesNoInt; // [20210205リリース対応] Del End } // ----- 指導員名 ----- // 必須チェック if (string.IsNullOrEmpty(values[2])) { ViewBag.ErrorMessage = "指導員名が未設定のため、読み込みを途中で終了しました。 " + row + "行目"; break; } dailyClassesTrainerName = values[2]; // ----- コマ数 ----- // 必須チェック if (string.IsNullOrEmpty(values[3])) { ViewBag.ErrorMessage = "コマ数が未設定のため、読み込みを途中で終了しました。 " + row + "行目"; break; } // 数値整合性チェック if (!double.TryParse(values[3], out dailyClassesNum)) { ViewBag.ErrorMessage = "コマ数の設定が不正のため、読み込みを途中で終了しました。 " + row + "行目"; break; } T_DailyClassesByTrainer t_DailyClassesByTrainer = new T_DailyClassesByTrainer() { Date = dailyClassesDate, No = dailyClassesNo, TrainerName = dailyClassesTrainerName, Classes = dailyClassesNum }; // リストに追加 importList.Add(t_DailyClassesByTrainer); } } // 重複チェック // [20210205リリース対応] Mod Start Noをint?型からint型に変更したため、Nullは存在しない //int repeatedNum = importList.Where(x => x.No != null).GroupBy(x => new { x.Date, x.No }) // .Select(x => new { Count = x.Count() }).Where(x => x.Count != 1).Count(); int repeatedNum = importList.GroupBy(x => new { x.Date, x.No }) .Select(x => new { Count = x.Count() }).Where(x => x.Count != 1).Count(); // [20210205リリース対応] Mod End if (repeatedNum > 0) { ViewBag.ErrorMessage = "日付、No.の重複データがあります。(同じ日に同じNoのデータを複数登録することはできません。)ファイルを修正して再度読み込みを行ってください。"; return(View(new List <T_DailyClassesByTrainer>())); } } else { ViewBag.ErrorMessage = "ファイルを選択してください。"; } } // 登録ボタンが押下された場合 else if (AppConstant.CMD_REGIST.Equals(cmd)) { // [20210205リリース対応] Del Start 採番処理の削除 //// 未採番のデータがある場合(採番処理) //if (importList.Where(x => x.No == null).Count() > 0) //{ //// ステータスをクリア //ModelState.Clear(); //// ソート(日付、No(設定済)、No(未設定)) //importList = importList.OrderBy(x => x.Date).ThenBy(x => x.No == null ? 1 : 0).ThenBy(x => x.No).ToList(); //// 前レコードの日付 //DateTime? beforeDate = null; //// 新規採番No //int nextNum = 0; //// 未設定のNoを採番 //foreach (T_DailyClassesByTrainer dailyClassesByTrainer in importList.Where(x => x.No == null)) //{ // // 前レコードの日付がnullもしくは対象レコードと異なる場合 // if (beforeDate == null || beforeDate != dailyClassesByTrainer.Date) // { // // 最大値を取得 // int? maxNum = db.DailyClassesByTrainer.Where(x => ((DateTime)x.Date).Equals((DateTime)dailyClassesByTrainer.Date)).Select(x => x.No).Max(); // // 最大値を加算(最大値がnullの場合は1) // nextNum = maxNum == null ? 1 : (int)maxNum + 1; // } // else // { // // Noを加算 // nextNum++; // } // // 採番された番号を設定 // dailyClassesByTrainer.No = nextNum; // // 日付を保持 // beforeDate = dailyClassesByTrainer.Date; //} //ViewBag.CompMessage = "Noの新規採番が完了しました。再度登録ボタンを押してください。"; //} //// 未採番のデータがない場合(登録・更新処理) //else //{ // [20210205リリース対応] Del End // 入力チェック bool validation = true; if (ModelState.IsValid) { // コマ数チェック // [20210205リリース対応] Mod Start コマ数の0許容 //if (importList.Where(x => x.Classes <= 0).Count() > 0) //{ // ViewBag.ErrorMessage = "コマ数に0以下は設定できません。"; // validation = false; //} if (importList.Where(x => x.Classes < 0).Count() > 0) { ViewBag.ErrorMessage = "コマ数に0未満は設定できません。"; validation = false; } // [20210205リリース対応] Mod End } else { // エラーメッセージ生成 ViewBag.ErrorMessage = new Utility().GetErrorMessage(ModelState); validation = false; } if (validation == true) { // [20210205リリース対応] Add Start 既存データ削除 // 削除対象の日付を取得 List <DateTime?> dateList = importList.Select(x => x.Date).Distinct().ToList(); // 対象データを全て削除 db.DailyClassesByTrainer.RemoveRange( db.DailyClassesByTrainer.Where(x => dateList.Contains(x.Date))); // [20210205リリース対応] Add End // 登録済み日別予測条件(親データ)を取得 List <T_DailyClasses> addedDailyClasses = db.DailyClasses.Where(x => dateList.Contains(x.Date)).ToList(); foreach (T_DailyClassesByTrainer dailyClassesByTrainer in importList) { // 日別予測条件(親データ)の存在チェック if (addedDailyClasses.Where(x => ((DateTime)x.Date).Equals((DateTime)dailyClassesByTrainer.Date)).Count() == 0) { // 日別予測条件を生成 T_DailyClasses addDailyClasses = new T_DailyClasses() { Date = dailyClassesByTrainer.Date }; // 日付を指定してデータを登録 db.DailyClasses.Add(addDailyClasses); // 追加済みとする addedDailyClasses.Add(addDailyClasses); } // [20210205リリース対応] Mod Start 存在チェックを削除 //// 存在チェック //if (db.DailyClassesByTrainer.Where(x => ((DateTime)x.Date).Equals((DateTime)dailyClassesByTrainer.Date) // && ((int)x.No).Equals((int)dailyClassesByTrainer.No)).Count() == 0) //{ // // 登録処理 // db.DailyClassesByTrainer.Add(dailyClassesByTrainer); //} //else //{ // // 更新処理 // db.Entry(dailyClassesByTrainer).State = EntityState.Modified; //} // 登録処理 db.DailyClassesByTrainer.Add(dailyClassesByTrainer); // [20210205リリース対応] Mod End } db.SaveChanges(); // 完了メッセージ ViewBag.CompMessage = "インポートが完了しました。"; // 表示データを初期化 importList = new List <T_DailyClassesByTrainer>(); } // [20210205リリース対応] Del Start //} // [20210205リリース対応] Del End } // その他 else { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } return(View(importList)); }
public ActionResult Edit(string cmd, [Bind(Include = "DailyClasses,UpdateTo")] V_DailyParameterEdt dailyParameterEdt) { Trace.WriteLine("POST /DailyParameter/Edit/" + dailyParameterEdt.DailyClasses.Date + "&" + dailyParameterEdt.UpdateTo); // 更新ボタンが押下された場合 if (AppConstant.CMD_UPDATE.Equals(cmd)) { // 日付を設定 dailyParameterEdt.SearchDate = dailyParameterEdt.DailyClasses.Date; // 入力チェック bool validation = true; if (ModelState.IsValid) { // 更新日付Toの必須チェック if (dailyParameterEdt.UpdateTo == null) { ViewBag.ErrorMessage = "更新範囲の日付を設定してください。"; validation = false; } // 日付の前後チェック if (validation == true && dailyParameterEdt.UpdateTo < dailyParameterEdt.DailyClasses.Date) { ViewBag.ErrorMessage = "更新範囲の日付の前後関係が不正です。"; validation = false; } // [20210416リリース対応] Add Start 教習外コマ数比率の追加 double checkValue; // 教習外コマ数比率のチェック checkValue = dailyParameterEdt.DailyClasses.DepartExamRatio + dailyParameterEdt.DailyClasses.OtherVehicleRatio + dailyParameterEdt.DailyClasses.SeminarRatio + dailyParameterEdt.DailyClasses.OtherRatio; if (validation == true && checkValue > 100) { ViewBag.ErrorMessage = "教習外コマ数比率(学科・検定比率、他車種比率、講習比率、その他)は合わせて100以下になるように設定してください。"; validation = false; } // [20210416リリース対応] Add End // 合宿比率[%]と通学比率[%]のチェック // [20210416リリース対応] Mod Start 0の許容 //if (validation == true && // dailyParameterEdt.DailyClasses.LodgingRatio + dailyParameterEdt.DailyClasses.CommutingRatio != 100) checkValue = dailyParameterEdt.DailyClasses.LodgingRatio + dailyParameterEdt.DailyClasses.CommutingRatio; if (validation == true && checkValue != 0 && checkValue != 100) // [20210416リリース対応] Mod End { ViewBag.ErrorMessage = "合宿・通学比率(合宿比率、通学比率)は合わせて100になるように設定してください。"; validation = false; } // 合宿の在籍比率[%](AT一段階/二段階、MT一段階/二段階)のチェック // [20210416リリース対応] Mod Start 0の許容 //if (validation == true && // dailyParameterEdt.DailyClasses.LdgAtFstRatio + dailyParameterEdt.DailyClasses.LdgAtSndRatio + dailyParameterEdt.DailyClasses.LdgMtFstRatio + dailyParameterEdt.DailyClasses.LdgMtSndRatio != 100) checkValue = dailyParameterEdt.DailyClasses.LdgAtFstRatio + dailyParameterEdt.DailyClasses.LdgAtSndRatio + dailyParameterEdt.DailyClasses.LdgMtFstRatio + dailyParameterEdt.DailyClasses.LdgMtSndRatio; if (validation == true && checkValue != 0 && checkValue != 100) // [20210416リリース対応] Mod End { ViewBag.ErrorMessage = "合宿の在籍比率[%](AT一段階/二段階、MT一段階/二段階)は合わせて100になるように設定してください。"; validation = false; } // 通学の在籍比率[%](AT一段階/二段階、MT一段階/二段階)のチェック // [20210416リリース対応] Mod Start 0の許容 //if (validation == true && // dailyParameterEdt.DailyClasses.CmtAtFstRatio + dailyParameterEdt.DailyClasses.CmtAtSndRatio + dailyParameterEdt.DailyClasses.CmtMtFstRatio + dailyParameterEdt.DailyClasses.CmtMtSndRatio != 100) checkValue = dailyParameterEdt.DailyClasses.CmtAtFstRatio + dailyParameterEdt.DailyClasses.CmtAtSndRatio + dailyParameterEdt.DailyClasses.CmtMtFstRatio + dailyParameterEdt.DailyClasses.CmtMtSndRatio; if (validation == true && checkValue != 0 && checkValue != 100) // [20210416リリース対応] Mod End { ViewBag.ErrorMessage = "通学の在籍比率[%](AT一段階/二段階、MT一段階/二段階)は合わせて100になるように設定してください。"; validation = false; } } else { // エラーメッセージを生成 ViewBag.ErrorMessage = new Utility().GetErrorMessage(ModelState); validation = false; } if (validation == true) { // 指定した範囲で登録/更新処理を行う for (DateTime date = (DateTime)dailyParameterEdt.DailyClasses.Date; date.CompareTo((DateTime)dailyParameterEdt.UpdateTo) <= 0; date = date.AddDays(1)) { // 登録/更新対象を設定 T_DailyClasses dailyClasses = new T_DailyClasses() { Date = date }; this.SetUpdateInfo(dailyClasses, dailyParameterEdt.DailyClasses); // 存在チェック if (db.DailyClasses.Where(x => ((DateTime)x.Date).Equals(date)).Count() == 0) { // 登録処理 db.DailyClasses.Add(dailyClasses); } else { // 更新処理 db.Entry(dailyClasses).State = EntityState.Modified; } } db.SaveChanges(); // 完了メッセージ ViewBag.CompMessage = "データを更新しました。"; } // 指導員コマ数を取得 dailyParameterEdt.TrainerList = db.DailyClassesByTrainer.Where(x => ((DateTime)x.Date).Equals((DateTime)dailyParameterEdt.SearchDate)).OrderBy(x => x.No).ToList(); } // その他 else { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } return(View(dailyParameterEdt)); }
public ActionResult Import(string cmd, HttpPostedFileBase postedFile, [Bind(Include = "")] List <T_DailyClasses> dailyClassesList) { Trace.WriteLine("POST /DailyParameter/Import"); // 読込ボタンが押下された場合 if (AppConstant.CMD_READ.Equals(cmd)) { // ステータスをクリア ModelState.Clear(); // 日別条件を初期化 dailyClassesList = new List <T_DailyClasses>(); if (postedFile != null) { // 拡張子チェック string extension = Path.GetExtension(postedFile.FileName); if (!".csv".Equals(extension) && !".CSV".Equals(extension)) { // エラーメッセージ ViewBag.ErrorMessage = "ファイルはcsv形式を指定してください。"; return(View(dailyClassesList)); } // アップロード先ディレクトリ string uploadDir = AppDomain.CurrentDomain.BaseDirectory + @"Uploads\"; // ディレクトリが存在しない場合は作成 if (!Directory.Exists(uploadDir)) { Directory.CreateDirectory(uploadDir); } // ファイルをサーバーに保存 string filepath = uploadDir + Path.GetFileName(postedFile.FileName); postedFile.SaveAs(filepath); // 項目数 int itemCnt = 0; // テキストを全行読み込み using (StreamReader sr = new StreamReader(filepath, Encoding.GetEncoding("shift_jis"))) { int row = 0; while (!sr.EndOfStream) { row++; // CSVファイルの一行を読み込む string line = sr.ReadLine(); // 読み込んだ一行をカンマ毎に分けて配列に格納 string[] values = line.Split(','); // ヘッダ行 if (row == 1) { // 項目数を取得 itemCnt = values.Count(); // スキップ continue; } // 空行チェック(全ての項目が空) if (values.Where(x => string.IsNullOrEmpty(x)).Count() == values.Count()) { break; } // CSV項目数チェック if (values.Count() != itemCnt) { ViewBag.ErrorMessage = "csvの項目数に誤りがあるため、読み込みを途中で終了しました。 " + row + "行目"; break; } T_DailyClasses dailyClasses = new T_DailyClasses(); // 日付項目 DateTime dateItem; // 数値項目 double doubleItem; // ----- 対象日 ----- if (!this.ItemCheck(values[0], out dateItem, "対象日", row)) { break; } dailyClasses.Date = dateItem; // [20210416リリース対応] Add Start 教習外コマ数比率の追加 // ----- 学科・検定比率[%] ----- if (!this.ItemCheck(values[1], out doubleItem, "学科・検定比率[%]", row)) { break; } dailyClasses.DepartExamRatio = doubleItem; // ----- 他車種比率[%] ----- if (!this.ItemCheck(values[2], out doubleItem, "他車種比率[%]", row)) { break; } dailyClasses.OtherVehicleRatio = doubleItem; // ----- 講習比率[%] ----- if (!this.ItemCheck(values[3], out doubleItem, "講習比率[%]", row)) { break; } dailyClasses.SeminarRatio = doubleItem; // ----- その他[%] ----- if (!this.ItemCheck(values[4], out doubleItem, "その他[%]", row)) { break; } dailyClasses.OtherRatio = doubleItem; // [20210416リリース対応] Add End // ----- 合宿比率[%] ----- if (!this.ItemCheck(values[5], out doubleItem, "合宿比率[%]", row)) { break; } dailyClasses.LodgingRatio = doubleItem; // ----- 通学比率[%] ----- if (!this.ItemCheck(values[6], out doubleItem, "通学比率[%]", row)) { break; } dailyClasses.CommutingRatio = doubleItem; // ----- 【合宿】MT一段階比率[%] ----- if (!this.ItemCheck(values[7], out doubleItem, "【合宿】MT一段階比率[%]", row)) { break; } dailyClasses.LdgMtFstRatio = doubleItem; // ----- 【合宿】MT二段階比率[%] ----- if (!this.ItemCheck(values[8], out doubleItem, "【合宿】MT二段階比率[%]", row)) { break; } dailyClasses.LdgMtSndRatio = doubleItem; // ----- 【合宿】AT一段階比率[%] ----- if (!this.ItemCheck(values[9], out doubleItem, "【合宿】AT一段階比率[%] ", row)) { break; } dailyClasses.LdgAtFstRatio = doubleItem; // ----- 【合宿】AT二段階比率[%] ----- if (!this.ItemCheck(values[10], out doubleItem, "【合宿】AT二段階比率[%]", row)) { break; } dailyClasses.LdgAtSndRatio = doubleItem; // ----- 【合宿】MT一段階コマ数 ----- if (!this.ItemCheck(values[11], out doubleItem, "【合宿】MT一段階コマ数", row)) { break; } dailyClasses.LdgMtFstClass = doubleItem; // ----- 【合宿】MT二段階コマ数 ----- if (!this.ItemCheck(values[12], out doubleItem, "【合宿】MT二段階コマ数", row)) { break; } dailyClasses.LdgMtSndClass = doubleItem; // ----- 【合宿】AT一段階コマ数 ----- if (!this.ItemCheck(values[13], out doubleItem, "【合宿】AT一段階コマ数", row)) { break; } dailyClasses.LdgAtFstClass = doubleItem; // ----- 【合宿】AT二段階コマ数 ----- if (!this.ItemCheck(values[14], out doubleItem, "【合宿】AT二段階コマ数", row)) { break; } dailyClasses.LdgAtSndClass = doubleItem; // ----- 【合宿】MT一段階コマ数/日 ----- if (!this.ItemCheck(values[15], out doubleItem, "【合宿】MT一段階コマ数/日", row)) { break; } dailyClasses.LdgMtFstClassDay = doubleItem; // ----- 【合宿】MT二段階コマ数/日 ----- if (!this.ItemCheck(values[16], out doubleItem, "【合宿】MT二段階コマ数/日", row)) { break; } dailyClasses.LdgMtSndClassDay = doubleItem; // ----- 【合宿】AT一段階コマ数/日 ----- if (!this.ItemCheck(values[17], out doubleItem, "【合宿】AT一段階コマ数/日", row)) { break; } dailyClasses.LdgAtFstClassDay = doubleItem; // ----- 【合宿】AT二段階コマ数/日 ----- if (!this.ItemCheck(values[18], out doubleItem, "【合宿】AT二段階コマ数/日", row)) { break; } dailyClasses.LdgAtSndClassDay = doubleItem; // ----- 【通学】MT一段階比率[%] ----- if (!this.ItemCheck(values[19], out doubleItem, "【通学】MT一段階比率[%]", row)) { break; } dailyClasses.CmtMtFstRatio = doubleItem; // ----- 【通学】MT二段階比率[%] ----- if (!this.ItemCheck(values[20], out doubleItem, "【通学】MT二段階比率[%]", row)) { break; } dailyClasses.CmtMtSndRatio = doubleItem; // ----- 【通学】AT一段階比率[%] ----- if (!this.ItemCheck(values[21], out doubleItem, "【通学】AT一段階比率[%]", row)) { break; } dailyClasses.CmtAtFstRatio = doubleItem; // ----- 【通学】AT二段階比率[%] ----- if (!this.ItemCheck(values[22], out doubleItem, "【通学】AT二段階比率[%]", row)) { break; } dailyClasses.CmtAtSndRatio = doubleItem; // ----- 【通学】MT一段階コマ数 ----- if (!this.ItemCheck(values[23], out doubleItem, "【通学】MT一段階コマ数", row)) { break; } dailyClasses.CmtMtFstClass = doubleItem; // ----- 【通学】MT二段階コマ数 ----- if (!this.ItemCheck(values[24], out doubleItem, "【通学】MT二段階コマ数", row)) { break; } dailyClasses.CmtMtSndClass = doubleItem; // ----- 【通学】AT一段階コマ数 ----- if (!this.ItemCheck(values[25], out doubleItem, "【通学】AT一段階コマ数", row)) { break; } dailyClasses.CmtAtFstClass = doubleItem; // ----- 【通学】AT二段階コマ数 ----- if (!this.ItemCheck(values[26], out doubleItem, "【通学】AT二段階コマ数", row)) { break; } dailyClasses.CmtAtSndClass = doubleItem; // ----- 【通学】MT一段階コマ数/日 ----- if (!this.ItemCheck(values[27], out doubleItem, "【通学】MT一段階コマ数/日", row)) { break; } dailyClasses.CmtMtFstClassDay = doubleItem; // ----- 【通学】MT二段階コマ数/日 ----- if (!this.ItemCheck(values[28], out doubleItem, "【通学】MT二段階コマ数/日", row)) { break; } dailyClasses.CmtMtSndClassDay = doubleItem; // ----- 【通学】AT一段階コマ数/日 ----- if (!this.ItemCheck(values[29], out doubleItem, "【通学】AT一段階コマ数/日", row)) { break; } dailyClasses.CmtAtFstClassDay = doubleItem; // ----- 【通学】AT二段階コマ数/日 ----- if (!this.ItemCheck(values[30], out doubleItem, "【通学】AT二段階コマ数/日", row)) { break; } dailyClasses.CmtAtSndClassDay = doubleItem; dailyClassesList.Add(dailyClasses); } } } else { ViewBag.ErrorMessage = "ファイルを選択してください。"; } } // 登録ボタンが押下された場合 else if (AppConstant.CMD_REGIST.Equals(cmd)) { // 入力チェック bool validation = true; if (ModelState.IsValid) { // 重複チェック int repeatedNum = dailyClassesList.GroupBy(x => x.Date) .Select(x => new { Count = x.Count() }).Where(x => x.Count != 1).Count(); if (repeatedNum > 0) { ViewBag.ErrorMessage = "対象日の重複データがあります。(同じ日のデータを複数登録することはできません。)"; validation = false; } // 各行の不整合チェック if (validation == true) { double checkValue; foreach (T_DailyClasses dailyClasses in dailyClassesList) { // [20210416リリース対応] Add Start 教習外コマ数比率の追加 // 教習外コマ数比率のチェック checkValue = dailyClasses.DepartExamRatio + dailyClasses.OtherVehicleRatio + dailyClasses.SeminarRatio + dailyClasses.OtherRatio; if (checkValue > 100) { ViewBag.ErrorMessage = "教習外コマ数比率(学科・検定比率、他車種比率、講習比率、その他)は合わせて100以下になるように設定してください。"; validation = false; break; } // [20210416リリース対応] Add End // 合宿比率と通学比率のチェック // [20210416リリース対応] Mod Start 合計値0の許容 //if (dailyClasses.LodgingRatio + dailyClasses.CommutingRatio != 100) checkValue = dailyClasses.LodgingRatio + dailyClasses.CommutingRatio; if (checkValue < 0 && checkValue != 100) // [20210416リリース対応] Mod End { ViewBag.ErrorMessage = "合宿・通学比率(合宿比率、通学比率)は合わせて100になるように設定してください。"; validation = false; break; } // 合宿の在籍比率[%](AT一段階/二段階、MT一段階/二段階)のチェック // [20210416リリース対応] Mod Start 合計値0の許容 //if (dailyClasses.LdgAtFstRatio + dailyClasses.LdgAtSndRatio + dailyClasses.LdgMtFstRatio + dailyClasses.LdgMtSndRatio != 100) checkValue = dailyClasses.LdgAtFstRatio + dailyClasses.LdgAtSndRatio + dailyClasses.LdgMtFstRatio + dailyClasses.LdgMtSndRatio; if (checkValue < 0 && checkValue != 100) // [20210416リリース対応] Mod End { ViewBag.ErrorMessage = "合宿の在籍比率[%](AT一段階/二段階、MT一段階/二段階)は合わせて100になるように設定してください。"; validation = false; break; } // 通学の在籍比率[%](AT一段階/二段階、MT一段階/二段階)のチェック // [20210416リリース対応] Mod Start 合計値0の許容 //if (dailyClasses.CmtAtFstRatio + dailyClasses.CmtAtSndRatio + dailyClasses.CmtMtFstRatio + dailyClasses.CmtMtSndRatio != 100) checkValue = dailyClasses.CmtAtFstRatio + dailyClasses.CmtAtSndRatio + dailyClasses.CmtMtFstRatio + dailyClasses.CmtMtSndRatio; if (checkValue < 0 && checkValue != 100) // [20210416リリース対応] Mod End { ViewBag.ErrorMessage = "通学の在籍比率[%](AT一段階/二段階、MT一段階/二段階)は合わせて100になるように設定してください。"; validation = false; break; } } } } else { // エラーメッセージを生成 ViewBag.ErrorMessage = new Utility().GetErrorMessage(ModelState); validation = false; } if (validation == true) { // データの登録/更新 foreach (T_DailyClasses dailyClasses in dailyClassesList) { // 存在チェック if (db.DailyClasses.Where(x => ((DateTime)x.Date).Equals((DateTime)dailyClasses.Date)).Count() == 0) { // 登録処理 db.DailyClasses.Add(dailyClasses); } else { // 更新処理 db.Entry(dailyClasses).State = EntityState.Modified; } } db.SaveChanges(); // 完了メッセージ ViewBag.CompMessage = "インポートが完了しました。"; // 表示データを初期化 dailyClassesList = new List <T_DailyClasses>(); } } // その他 else { return(new HttpStatusCodeResult(HttpStatusCode.BadRequest)); } return(View(dailyClassesList)); }