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 = "";
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        /// <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);
        }
Exemple #5
0
        /// <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);
        }