public MainWindow() { InitializeComponent(); OnReloadButtonClick(null, null); using (var db = new TimeLoggerContext()) { var todayData = db.AttendanceLeaves.Where(a => a.TargetDate == DateTime.Today).ToList(); if (todayData == null || todayData.Count == 0) { var attendance = new AttendanceWindow(); attendance.Topmost = true; Task startupTask = attendance.doAttendance(); if (startupTask != null) { onTaskStart(startupTask); } var attendanceRecord = new AttendanceLeave(); attendanceRecord.TargetDate = DateTime.Today; attendanceRecord.Attendance = DateTime.Now; db.AttendanceLeaves.Add(attendanceRecord); db.SaveChanges(); } } if (runningTask == null) { CurrentTaskLabel.Content = "未割当"; } }
private async System.Threading.Tasks.Task loadMonthlyData(DateTime targetYearMonth) { status.Content = "集計中..."; await System.Threading.Tasks.Task.Run(() => { DateTime monthFrom = targetYearMonth.AddDays(-(targetYearMonth.Day - 1)); DateTime monthTo = monthFrom.AddMonths(1).AddMilliseconds(-1); Dictionary <DateTime, AttendanceLeave> attendanceLeaves; List <TaskWorkFact> taskWorkFacts; using (var db = new TimeLoggerContext()) { attendanceLeaves = db.AttendanceLeaves.Where(a => a.TargetDate >= monthFrom && a.TargetDate <= monthTo).ToDictionary(a => a.TargetDate.Date); // ↓DBで集計させるべき taskWorkFacts = db.TaskWorkFacts.Where(f => f.StartAt >= monthFrom && f.StartAt <= monthTo).ToList(); var hoge = from task in db.TaskWorkFacts where task.StartAt >= monthFrom && task.StartAt <= monthTo select task; } var workFactByDate = new Dictionary <DateTime, List <TaskWorkFact> >(); foreach (var workfact in taskWorkFacts) { var date = workfact.StartAt.Date; var workFacts = workFactByDate.Get(date); if (workFacts == null) { workFacts = new List <TaskWorkFact>(); workFactByDate[date] = workFacts; } workFacts.Add(workfact); } var workFactSummary = new Dictionary <DateTime, Dictionary </*task id*/ long, TaskWorkFact> >(); var taskIds = new HashSet <long>(); foreach (var workfacts in workFactByDate) { var summaries = new Dictionary <long, TaskWorkFact>(); foreach (var workfact in workfacts.Value) { var summary = summaries.Get(workfact.TaskId); if (summary == null) { summary = new TaskWorkFact(); summary.TaskId = workfact.TaskId; summaries[workfact.TaskId] = summary; } summary.Manhour += workfact.Manhour; if (summary.Manhour > 0) { taskIds.Add(summary.TaskId); } } workFactSummary[workfacts.Key] = summaries; } Dictionary <long, Task> tasks; using (var db = new TimeLoggerContext()) { tasks = db.Tasks.Where(t => taskIds.Contains(t.Id.Value)).OrderBy(t => t.TaskCode).ToDictionary(t => t.Id.Value); } Dispatcher.Invoke(() => { workFactGrid.Columns.Clear(); foreach (var task in tasks) { var column = new DataGridTextColumn(); column.Header = task.Value.ToString(); column.Binding = new Binding("Data[t" + task.Value.Id + "].Manhour"); workFactGrid.Columns.Add(column); } }); var attendanceGridSource = new List <AttendanceLeave>(); var workFactGridSource = new List <MonthlySummaryWorkFactModel>(); for (var processDate = monthFrom; processDate <= monthTo; processDate = processDate.AddDays(1)) { var attendanceLeave = attendanceLeaves.Get(processDate); if (attendanceLeave == null) { attendanceLeave = new AttendanceLeave(); attendanceLeave.TargetDate = processDate; } attendanceGridSource.Add(attendanceLeave); var workFacts = new Dictionary <String, TaskWorkFact>(); var summaries = workFactSummary.Get(processDate); if (summaries != null) { foreach (var summary in summaries.Values) { workFacts["t" + summary.TaskId] = summary; } } workFactGridSource.Add(MonthlySummaryWorkFactModel.of(workFacts)); } Dispatcher.Invoke(() => { attendanceGrid.ItemsSource = attendanceGridSource; workFactGrid.ItemsSource = workFactGridSource; }); var totalManhour = new Dictionary </*taskId*/ long, /*manhour*/ decimal>(); foreach (var workFact in taskWorkFacts) { var taskId = workFact.TaskId; var manhour = workFact.Manhour; if (totalManhour.ContainsKey(taskId)) { manhour += totalManhour[taskId]; } totalManhour[taskId] = manhour; } var totalManhourGridSource = new List <TotalManhourModel>(); foreach (var item in totalManhour) { var task = tasks[item.Key]; var model = new TotalManhourModel(); model.DisplayName = task.ToString(); model.TotalManhour = item.Value; totalManhourGridSource.Add(model); } totalManhourGridSource.Sort((o1, o2) => o1.DisplayName.CompareTo(o2.DisplayName)); Dispatcher.Invoke(() => totalWorkFactGrid.ItemsSource = totalManhourGridSource); }); status.Content = ""; }
/// <summary> /// 新增請假單 - 預先新增假單 /// </summary> /// <param name="learningId"></param> /// <param name="isTeacher"></param> /// <param name="memberId"></param> /// <param name="leaveDateTime"></param> /// <param name="leaveCategoryId"></param> /// <param name="leaveStatus"></param> /// <param name="title"></param> /// <param name="reason"></param> /// <returns></returns> public Infrastructure.ViewModel.SignInLogViewModel Add(LearningCircle learningInfo, int memberId, Infrastructure.DataTransferObject.UploadFileModel uploadInfo, List <FileStorage> files, List <Stream> fileStreams) { var parentFolderId = string.Empty; var db = _uow.DbContext; var connectionInfo = db.Members.Find(memberId); var memberAccount = _uow.EntityRepository <Member>().GetFirst(x => x.Id == memberId); if (memberAccount == null) { return(null); } var _entity = new AttendanceLeave(); var _actEntity = new Activitys(); lock (_lock) { DateTime dt = DateTime.UtcNow; Guid eveId = Guid.NewGuid(); try { var studentLeave = db.AttendanceLeave.Where(t => t.StudId == memberId).ToList(); var checkIsLeave = new AttendanceLeave(); if (studentLeave.FirstOrDefault() != null) { checkIsLeave = studentLeave.FirstOrDefault(t => t.LeaveDate.Date == uploadInfo.LeaveDate.Date && t.Status != "40" && t.LearningId == learningInfo.Id); } else { checkIsLeave = null; } if (checkIsLeave == null) { _entity.Content = uploadInfo.Content; _entity.CreateDate = dt; _entity.Creator = memberId; _entity.EventId = eveId; _entity.LearningId = learningInfo.Id; if (uploadInfo.LeaveDate.Hour == 0) { _entity.LeaveDate = uploadInfo.LeaveDate; } else { _entity.LeaveDate = uploadInfo.LeaveDate.ToUniversalTime(); } _entity.LeaveType = uploadInfo.LeaveCategoryId; _entity.Status = QueryCondition.LeaveState.Review; _entity.StudId = memberId; _entity.Subject = uploadInfo.Title; db.AttendanceLeave.Add(_entity); _actEntity.Created = Infrastructure.Property.TimeData.Create(dt); _actEntity.Updated = Infrastructure.Property.TimeData.Create(null); _actEntity.Deleted = Infrastructure.Property.TimeData.Create(null); _actEntity.CreateUser = memberId; _actEntity.IsActivity = false; _actEntity.ModuleKey = Utility.ParaCondition.ModuleType.Leave; _actEntity.OuterKey = eveId; _actEntity.CardisShow = false; _actEntity.Publish_Utc = dt; _actEntity.ToRoomId = learningInfo.LearningOuterKey; db.Activitys.Add(_actEntity); //執行 db.SaveChanges(); } else { return(null); } } catch (Exception ex) { return(null); throw ex; } } var newFiles = fileService.UploadFiles(memberId, files, fileStreams.ToArray()); var _fileArray = new string[files.Count]; if (files.Count > 0) { //建立檔案與請假單的關聯 SetLeaveFileReferenceByFiles(_entity.Id, newFiles); } var result = new Infrastructure.ViewModel.SignInLogViewModel { EventId = _entity.EventId, OuterKeySignInLog = new Dictionary <string, SignInLog>() }; //db = new iThinkDB(); var sqlSignInActivity = db.Activitys.Where(t => t.ToRoomId.ToLower() == uploadInfo.CircleKey.ToLower() && t.ModuleKey == Utility.ParaCondition.ModuleType.SignIn && t.CardisShow == true && t.StartDate.HasValue); foreach (var _act in sqlSignInActivity) { if (_act.ActivityDate != null) { if (_act.ActivityDate.Value.ToLocalTime().Date == uploadInfo.LeaveDate.Date) { var mylog = signInLogService.GetSignInLog(Convert.ToInt32(_act.CreateUser.ToString()), _act.OuterKey, memberId); if (mylog != null) { mylog.LeaveStatus = "20"; mylog.Mode = 0; mylog.Time = DateTime.UtcNow; var outerKey = Utility.OuterKeyHelper.GuidToPageToken(_act.OuterKey); result.OuterKeySignInLog.Add(outerKey, mylog); } } } } return(result); }
/// <summary> /// 取得單一請假單詳細資訊 /// </summary> /// <param name="sqlLeave"></param> /// <param name="isManage"></param> /// <returns></returns> private Infrastructure.ViewModel.ActivityFunction.Leave.LeaveDetailViewModel GetDetailLeaveSqlQuery(AttendanceLeave sqlLeave, bool isManage) { var db = _uow.DbContext; var resLeaveVM = new Infrastructure.ViewModel.ActivityFunction.Leave.LeaveDetailViewModel(); resLeaveVM.FileList = new List <GoogleFile>(); //取得請假資訊 resLeaveVM.Comment = sqlLeave.Comment; resLeaveVM.CreateDate = sqlLeave.CreateDate.ToLocalTime(); resLeaveVM.Content = sqlLeave.Content; resLeaveVM.LeaveDate = sqlLeave.LeaveDate.ToLocalTime(); resLeaveVM.LeaveType = sqlLeave.LeaveType; resLeaveVM.Status = sqlLeave.Status; resLeaveVM.StudId = sqlLeave.StudId; resLeaveVM.Subject = sqlLeave.Subject; //取得狀態名稱 resLeaveVM.StatusName = Utility.ParaCondition.LeaveState.Status[sqlLeave.Status]; //申請人資訊 var applicationMemberInfo = db.Members.Find(sqlLeave.StudId); //請假單申請人姓名 resLeaveVM.MemberAccount = applicationMemberInfo.Account; //請假單申請人帳號 resLeaveVM.MemberName = applicationMemberInfo.Name; //請假單申請人頭像 resLeaveVM.MemberImg = applicationMemberInfo.Photo; //所屬課程名稱 resLeaveVM.CourseName = db.LearningCircle.Find(sqlLeave.LearningId).Name; //編碼eventId resLeaveVM.OuterKey = Utility.OuterKeyHelper.GuidToPageToken(sqlLeave.EventId); //取得請假單檔案資訊 var sqlFile = db.LeaveFile.Where(t => t.LeaveId == sqlLeave.Id); foreach (var _file in sqlFile) { var googleFile = db.GoogleFile.Find(_file.GoogleId); var _fileEntity = new GoogleFile() { Create_User = googleFile.Create_User, Create_Utc = googleFile.Create_Utc.ToLocalTime(), DownLoadUrl = googleFile.DownLoadUrl, FileId = googleFile.FileId, FileType = googleFile.FileType, Id = googleFile.Id, ImgUrl = googleFile.ImgUrl, Name = googleFile.Name, ParentFileId = googleFile.ParentFileId, Size = googleFile.Size, WebViewUrl = googleFile.WebViewUrl }; resLeaveVM.FileList.Add(_fileEntity); } resLeaveVM.IsManager = isManage; return(resLeaveVM); }
/// <summary> /// 取得單一請假單詳細資訊 - for app /// </summary> /// <param name="sqlLeave"></param> /// <param name="isManage"></param> /// <returns></returns> private Infrastructure.ViewModel.ActivityFunction.Leave.GetAbSenceFormDetailResponse GetAPPDetailLeaveSqlQuery(AttendanceLeave sqlLeave, bool isManage) { var db = _uow.DbContext; var resLeaveVM = new Infrastructure.ViewModel.ActivityFunction.Leave.GetAbSenceFormDetailResponse(); resLeaveVM.FileList = new List <FileStorageViewModel>(); //取得請假資訊 resLeaveVM.Comment = sqlLeave.Comment; resLeaveVM.CreateDate = sqlLeave.CreateDate.ToLocalTime(); resLeaveVM.Content = sqlLeave.Content; resLeaveVM.LeaveDate = sqlLeave.LeaveDate.ToLocalTime(); resLeaveVM.Subject = sqlLeave.Subject; //取得狀態名稱 // resLeaveVM.StatusName = Utility.ParaCondition.LeaveState.Status[sqlLeave.Status]; //申請人資訊 var applicationMemberInfo = db.Members.Find(sqlLeave.StudId); //請假單申請人照片 resLeaveVM.MemberImg = applicationMemberInfo.Photo; //請假單申請人姓名 resLeaveVM.MemberAccount = applicationMemberInfo.Account; //請假單申請人帳號 resLeaveVM.MemberName = applicationMemberInfo.Name; var learningCircleInfo = db.LearningCircle.Find(sqlLeave.LearningId); //所屬課程名稱 resLeaveVM.CourseName = learningCircleInfo.Name; //編碼eventId resLeaveVM.OuterKey = Utility.OuterKeyHelper.GuidToPageToken(sqlLeave.EventId); var timeTableData = db.TimeTable.FirstOrDefault(t => t.Course_No == learningCircleInfo.LearningOuterKey && t.StartDate >= sqlLeave.LeaveDate); if (timeTableData == null || (timeTableData.StartDate.Value.DayOfWeek != sqlLeave.LeaveDate.DayOfWeek)) { timeTableData = null; } //上課地點與時間 resLeaveVM.Rooms = new List <Infrastructure.ViewModel.ActivityFunction.Leave.ClassRoomInfo>(); var sectionDateTimeDataService = new Utility.DateTimeTools(); var dayofweekService = new DayOfWeekTools(); if (timeTableData != null) { var weekstring = dayofweekService.ChangeToCht(sqlLeave.LeaveDate.DayOfWeek); var weekTableData = db.WeekTable.FirstOrDefault(t => t.LearningCircleId == sqlLeave.LearningId && t.Week == weekstring); if (weekTableData != null) { for (var i = weekTableData.StartPeriod.Value; i <= weekTableData.EndPeriod.Value; i++) { var data = new Infrastructure.ViewModel.ActivityFunction.Leave.ClassRoomInfo() { classStart = sectionDateTimeDataService.ProxyDateTime(timeTableData.StartDate.Value.Date, i, true), ClassEnd = sectionDateTimeDataService.ProxyDateTime(timeTableData.StartDate.Value.Date, i, false), RoomId = timeTableData.ClassRoomId, RoomName = timeTableData.ClassRoom, NameOfWeekDay = weekstring }; resLeaveVM.Rooms.Add(data); } } } resLeaveVM.Status = sqlLeave.Status; /* //設定狀態 * switch (sqlLeave.Status) * { * case "00": * resLeaveVM.Status = enumAbsenceFormStatus.Invalid; * break; * case "10": * resLeaveVM.Status = enumAbsenceFormStatus.Pass; * break; * case "20": * resLeaveVM.Status = enumAbsenceFormStatus.Wait; * break; * case "30": * resLeaveVM.Status = enumAbsenceFormStatus.Recall; * break; * case "40": * resLeaveVM.Status = enumAbsenceFormStatus.Reject; * break; * default: * break; * }*/ if (sqlLeave.LeaveType.HasValue) { //設定假單類型 switch (sqlLeave.LeaveType.Value) { case 1: resLeaveVM.LeaveType = enumLeaveType.SickLeave; break; case 2: resLeaveVM.LeaveType = enumLeaveType.PersonalLeave; break; case 3: resLeaveVM.LeaveType = enumLeaveType.LeaveForStatutory; break; case 4: resLeaveVM.LeaveType = enumLeaveType.Other; break; default: break; } } //取得請假單檔案資訊 var sqlFile = db.LeaveFile.Where(t => t.LeaveId == sqlLeave.Id); foreach (var _file in sqlFile) { var _fileEntity = new FileStorageViewModel(); var googleFile = db.FileStorage.Find(_file.GoogleId); //if (googleFile == null) // _fileEntity = db.GoogleFile.Find(_file.GoogleId); //else //{ //萬一與googleFileId一樣,判斷假單建立日期與檔案建立日期是否一致 //var checkCreateDate = googleFile.CreateUtcDate.Date; //if (checkCreateDate == sqlLeave.CreateDate.Date) //{ // _fileEntity = new FileViewModel() // { // Create_User = googleFile.Creator, // Create_Utc = googleFile.CreateUtcDate.ToLocalTime(), // DownLoadUrl = googleFile.FileUrl, // FileId = googleFile.FileGuid.ToString("N"), // FileType = googleFile.FileContentType, // Id = googleFile.Id, // Name = googleFile.Name, // Size = googleFile.FileSize, // WebViewUrl = googleFile.FileUrl // }; // if (googleFile.FileContentType.ToString().StartsWith("image")) // _fileEntity.ImgUrl = string.Format("{0}api/imgFile/{1}/{2}/{3}", loginServer, googleFile.FileGuid.ToString("N"), maxImgWidth, maxImgHeight); //} //else // _fileEntity = db.GoogleFile.Find(_file.GoogleId); //} if (googleFile.FileContentType.ToString().StartsWith("image")) { _fileEntity.FileImageUrl = string.Format("{0}api/imgFile/{1}/{2}/{3}", loginServer, googleFile.FileGuid.ToString("N"), maxImgWidth, maxImgHeight); _fileEntity.ImgUrl = string.Format("{0}api/imgFile/{1}/{2}/{3}", loginServer, googleFile.FileGuid.ToString("N"), maxImgWidth, maxImgHeight); } _fileEntity.WebViewUrl = _fileEntity.FileUrl; _fileEntity.DownLoadUrl = _fileEntity.FileUrl; _fileEntity.Size = _fileEntity.FileSize; _fileEntity.FileType = _fileEntity.FileContentType; if (_fileEntity != null) { resLeaveVM.FileList.Add(_fileEntity); } } resLeaveVM.IsManager = isManage; return(resLeaveVM); }