private List<AttendanceResult> CreateTimezones(Staff staff, List<ShiftArrange> sas)
 {
     List<AttendanceResult> timezones = new List<AttendanceResult>();
     foreach (ShiftArrange item in sas)
     {
         List<AttendanceResult> items = CreateAttendanceResult(staff, item);
         if (items != null && items.Count > 0) timezones.AddRange(items);
     }
     return timezones;
 }
Esempio n. 2
0
 public List<ShiftArrange> ApplyTemplateTo(Staff staff, DatetimeRange range)
 {
     if (Items != null && Items.Count > 0 && Items.Exists(it => it.Duration <= 0)) return null; //如果存在某个班次持续时间小于0,直接退出
     List<ShiftArrange> sas = new List<ShiftArrange>();
     if (this.Items != null && this.Items.Count > 0)
     {
         DateTime dt = range.Begin;
         while (dt <= range.End)
         {
             foreach (TemplateItem item in Items)
             {
                 int duration = 1;
                 while (duration <= item.Duration)
                 {
                     if (HolidaySetting.Current != null &&
                         HolidaySetting.Current.IsHoliday(dt) && (this.Options & TemplateOptions.HolidayShifted) == 0) //节假日不排班
                     {
                         dt = dt.AddDays(1);
                         if (item.DurationUnit == 0) duration++; //按天为单位,即使不排班也要减少次数
                     }
                     else if (HolidaySetting.Current != null &&
                         HolidaySetting.Current.IsWeekend(dt) && (this.Options & TemplateOptions.WeekendShifted) == 0)//周末不排班
                     {
                         dt = dt.AddDays(1);
                         if (item.DurationUnit == 0) duration++; //按天为单位,即使不排班也要减少次数
                     }
                     else
                     {
                         duration++;
                         if (item.Shifts != null && item.Shifts.Count > 0 && staff.HireDate.Date <= dt.Date) //考虑到员工入职日期,入职日期之前排班无意义
                         {
                             foreach (Shift shift in item.Shifts)
                             {
                                 ShiftArrange sa = new ShiftArrange();
                                 sa.StaffID = staff.ID;
                                 sa.ShiftDate = dt;
                                 sa.ShiftID = shift.ID;
                                 sa.Shift = shift;
                                 sas.Add(sa);
                             }
                         }
                         dt = dt.AddDays(1);
                     }
                     if (dt > range.End) return sas;
                 }
                 for (int i = 1; i <= item.RestDays; i++)
                 {
                     dt = dt.AddDays(1);
                     if (dt > range.End) return sas;
                 }
             }
         }
     }
     return sas;
 }
Esempio n. 3
0
 public CommandResult Update(Staff info)
 {
     Staff original = ProviderFactory.Create<IStaffProvider>(_RepoUri).GetByID(info.ID).QueryObject;
     if (original != null)
     {
         return ProviderFactory.Create<IStaffProvider>(_RepoUri).Update(info, original);
     }
     else
     {
         return new CommandResult(ResultCode.NoRecord, ResultCodeDecription.GetDescription(ResultCode.NoRecord));
     }
 }
 private void FillRow(Staff staff, List<AttendanceResult> ars, Department dept, Worksheet sheet)
 {
     int row = _CurrentRow;
     Range r = sheet.get_Range(GetColName(1) + row, Type.Missing); //卡号
     r.Value = staff.CardID;
     r = sheet.get_Range(GetColName(2) + row, Type.Missing); //人员编号
     r.Value = staff.Certificate;
     r = sheet.get_Range(GetColName(3) + row, Type.Missing);//姓名
     r.Value = staff.Name;
     r = sheet.get_Range(GetColName(4) + row, Type.Missing);//电邮
     //r.Value = staff.Email;
     r = sheet.get_Range(GetColName(5) + row, Type.Missing);//所在单位
     r.Value = dept != null ? dept.Name : string.Empty;
     foreach (AttendanceResult ar in ars)
     {
         r = sheet.get_Range(GetColName(6) + row, Type.Missing);//日期
         r.Value = ar.ShiftDate;
         r = sheet.get_Range(GetColName(7) + row, Type.Missing);//应上班
         r.Value = ar.StartTime.ToString("HH:mm");
         r = sheet.get_Range(GetColName(8) + row, Type.Missing);//实上班
         r.Value = ar.OnDutyTime != null ? ar.OnDutyTime.Value.ToString("HH:mm") : "--";
         if (ar.OnDutyTime == null || ar.Result == AttendanceResultCode.Late || ar.Result == AttendanceResultCode.LateEarly)
         {
             r.Font.Color = System.Drawing.Color.Red;
             r.Font.Bold = 1;
             sheet.get_Range(GetColName(6) + row, GetColName(13) + row).Interior.Color = System.Drawing.Color.Yellow;
         }
         r = sheet.get_Range(GetColName(9) + row, Type.Missing);//应下班
         r.Value = ar.EndTime.ToString("HH:mm");
         r = sheet.get_Range(GetColName(10) + row, Type.Missing);//实下班
         r.Value = ar.OffDutyTime != null ? ar.OffDutyTime.Value.ToString("HH:mm") : "--";
         if (ar.OffDutyTime == null || ar.Result == AttendanceResultCode.LeaveEarly || ar.Result == AttendanceResultCode.LateEarly)
         {
             r.Font.Color = System.Drawing.Color.Red;
             r.Font.Bold = 1;
             sheet.get_Range(GetColName(6) + row, GetColName(13) + row).Interior.Color = System.Drawing.Color.Yellow;
         }
         r = sheet.get_Range(GetColName(11) + row, Type.Missing);//考勤结果
         r.Value = ar.ResultDescr;
         r = sheet.get_Range(GetColName(12) + row, Type.Missing);//应出勤(h)
         r.Value = (ar.ShiftTime / 60).Trim();
         r = sheet.get_Range(GetColName(13) + row, Type.Missing);//实出勤(h)
         r.Value = (ar.Present / 60).Trim();
         row++;
     }
     sheet.get_Range(GetColName(1) + _CurrentRow, GetColName(1) + (row - 1)).Merge(Type.Missing);
     sheet.get_Range(GetColName(2) + _CurrentRow, GetColName(2) + (row - 1)).Merge(Type.Missing);
     sheet.get_Range(GetColName(3) + _CurrentRow, GetColName(3) + (row - 1)).Merge(Type.Missing);
     sheet.get_Range(GetColName(4) + _CurrentRow, GetColName(4) + (row - 1)).Merge(Type.Missing);
     sheet.get_Range(GetColName(5) + _CurrentRow, GetColName(5) + (row - 1)).Merge(Type.Missing);
     _CurrentRow = row;
 }
Esempio n. 5
0
 public CommandResult Add(Staff info)
 {
     long? id = ProviderFactory.Create<IIntegerCreater>(_RepoUri).CreateID("Staff");
     if (id != null)
     {
         info.ID = (int)id.Value;
         return ProviderFactory.Create<IStaffProvider>(_RepoUri).Insert(info);
     }
     else
     {
         return new CommandResult(ResultCode.Fail, "创建ID失败");
     }
 }
 private void ShowUserShiftArrangesOnRow(Staff user, List<ShiftArrange> arranges, DataGridViewRow row)
 {
     row.Cells["colUser"].Value = user.Name;
     row.Tag = user;
     foreach (DataGridViewColumn col in _DateColumns)
     {
         DateTime dt = Convert.ToDateTime(col.Tag);
         List<Shift> shifts = null;
         if (arranges != null && arranges.Count > 0)
         {
             shifts = arranges.Where(item => item.ShiftDate == dt).Select(item => item.Shift).ToList();
         }
         row.Cells[col.Index].Value = GetShiftString(shifts);
         row.Cells[col.Index].Tag = shifts;
     }
 }
        private void AddTASheetsToTimezones(Staff staff, List<AttendanceResult> timezones, List<TASheet> sheets, DatetimeRange range)
        {
            List<TASheet> items = sheets.Where(item => item.SheetType != "A").ToList();
            if (items != null && items.Count > 0)
            {
                foreach (TASheet sheet in items)
                {
                    ExcludeTASheet(timezones, sheet, range);
                }
            }

            items = sheets.Where(item => item.SheetType == "A").ToList();
            if (items != null && items.Count > 0)
            {
                foreach (TASheet sheet in items)
                {
                    MergeTASheet(staff, timezones, sheet, range);
                }
            }
        }
        private bool CreateAttendanceResults(Staff staff, DatetimeRange dr, List<string> readers)
        {
            ShiftArrangeSearchCondition con1 = new ShiftArrangeSearchCondition();
            con1.StaffID = staff.ID;
            con1.ShiftDate = dr;
            List<ShiftArrange> sas = (new ShiftArrangeBLL(AppSettings.CurrentSetting.ConnectUri)).GetItems(con1).QueryObjects;

            TASheetSearchCondition con2 = new TASheetSearchCondition();
            con2.StaffID = staff.ID;
            List<TASheet> sheets = (new TASheetBLL(AppSettings.CurrentSetting.ConnectUri)).GetItems(con2).QueryObjects;

            AttendanceLogSearchCondition con3 = new AttendanceLogSearchCondition();
            con3.Staff = new List<int>();
            con3.Staff.Add(staff.ID);
            con3.Readers = readers;
            con3.ReadDateTime = dr;
            con3.ContainManualLogs = true;
            List<AttendanceLog> records = (new AttendanceLogBLL(AppSettings.CurrentSetting.ConnectUri)).GetItems(con3).QueryObjects;

            List<AttendanceResult> results = (new AttendanceAnalyst()).Analist(staff, sas, records, sheets, dr);
            CommandResult ret = (new AttendanceResultBLL(AppSettings.CurrentSetting.ConnectUri)).Add(staff.ID, dr, results);
            return ret.Result == ResultCode.Successful;
        }
 private void AddStaff(Staff staff, List<AttendanceResult> items, List<Department> depts, Worksheet sheet, int row)
 {
     int myRow = 3 + (row - 1) * 3; //从第三行开始输入数据,每个人占三行
     Range r = sheet.get_Range(GetColName(1) + myRow, Type.Missing); //序号
     r.Value = row;
     Department dept = depts.SingleOrDefault(it => it.ID == staff.DepartmentID);
     Department root = null;
     if (dept != null) root = GetRoot(depts, dept);
     r = sheet.get_Range(GetColName(2) + myRow, Type.Missing); //中心
     r.Value = root != null ? root.Name : string.Empty;
     r = sheet.get_Range(GetColName(3) + myRow, Type.Missing); //部门
     r.Value = dept != null ? dept.Name : string.Empty;
     r = sheet.get_Range(GetColName(5) + myRow, Type.Missing);  //职位
     r.Value = staff.UserPosition;
     r = sheet.get_Range(GetColName(6) + myRow, Type.Missing);  //姓名
     r.Value = staff.Name;
     r = sheet.get_Range(GetColName(9) + myRow, Type.Missing);  //
     r.Value = "上午";
     r = sheet.get_Range(GetColName(9) + (myRow + 1), Type.Missing);  //
     r.Value = "下午";
     r = sheet.get_Range(GetColName(9) + (myRow + 2), Type.Missing);  //
     r.Value = "加班";
     for (int i = 1; i <= 8; i++)
     {
         sheet.get_Range(GetColName(i) + myRow, GetColName(i) + (myRow + 2)).Merge(Type.Missing);
     }
     for (int i = 1; i <= 31; i++)
     {
         List<AttendanceResult> rets = (from item in items where item.ShiftDate.Day == i && !string.IsNullOrEmpty(item.ShiftID) orderby item.StartTime ascending select item).ToList();
         if (rets != null && rets.Count > 0)
         {
             if (rets.Count >= 1)
             {
                 r = sheet.get_Range(GetColName(9 + i) + (myRow + 0), Type.Missing);
                 r.Value = (rets[0].Present / 60).Trim();
             }
             if (rets.Count >= 2)
             {
                 r = sheet.get_Range(GetColName(9 + i) + (myRow + 1), Type.Missing);
                 r.Value = (rets[1].Present / 60).Trim(); ;
             }
         }
         decimal ot = (from item in items where item.ShiftDate.Day == i && string.IsNullOrEmpty(item.ShiftID) && !string.IsNullOrEmpty(item.Category) select item).Sum(item => item.Present);
         if (ot > 0)
         {
             r = sheet.get_Range(GetColName(9 + i) + (myRow + 2), Type.Missing);
             r.Value = (ot / 60).Trim();
         }
     }
     for (int i = 41; i <= 49; i++)
     {
         sheet.get_Range(GetColName(i) + myRow, GetColName(i) + (myRow + 2)).Merge(Type.Missing);
     }
     sheet.get_Range(GetColName(41) + myRow).Value = string.Format("=SUM(J{0}:AN{1})", myRow + 2, myRow + 2);
     sheet.get_Range(GetColName(42) + myRow).Value = string.Format("=COUNTIF(J{0}:AN{1},\"△\")*4", myRow, myRow + 1);
     sheet.get_Range(GetColName(45) + myRow).Value = string.Format("=COUNTIF(J{0}:AN{1},\"休\")*4", myRow, myRow + 1);
     sheet.get_Range(GetColName(46) + myRow).Value = string.Format("=SUM(J{0}:AN{1})", myRow, myRow + 1);
     sheet.get_Range(GetColName(48) + myRow).Value = string.Format("=AS{0}+AT{1}", myRow, myRow); //总小时数
 }
Esempio n. 10
0
        /// <summary>
        /// 保存用户
        /// </summary>
        /// <param name="staff"></param>
        public void SetUserInfo(Staff staff)
        {
            if (!_Connected)
            {
                LJH.GeneralLibrary.LOG.FileLog.Log(Parameter.Name, "保存用户信息失败,未连接设备");
                return;
            }

            bool ret = false;
            byte[] reserved = new byte[10];
            if (!string.IsNullOrEmpty(staff.CardID)) ret = axCZKEM1.SetStrCardNumber(staff.CardID);
            string pwd = !string.IsNullOrEmpty(staff.Password) ? staff.Password : "******";
            int pri = staff.IsAdmin != null && staff.IsAdmin.Value ? 3 : 0;
            if (ret) ret = axCZKEM1.SetUserInfo(iMachineNumber, staff.ID, staff.Name, pwd, pri, true);
            if (ret && ((int)Parameter.VerifyCode) > 0) ret = axCZKEM1.SetUserInfoEx(iMachineNumber, staff.ID, 128 + (int)staff.VerifyCode, ref reserved[0]); //0-15是验证模式,但设置组的验证方式的时候用0-15,用户的验证方式用128-143
            if (!ret)
            {
                int idwErrorCode = 0;
                axCZKEM1.GetLastError(ref idwErrorCode);
                LJH.GeneralLibrary.LOG.FileLog.Log(Parameter.Name, "保存用户信息失败,ErrorCode=" + idwErrorCode.ToString());
            }
        }
Esempio n. 11
0
 protected override Object GetItemFromInput()
 {
     Staff info;
     if (UpdatingItem == null)
     {
         info = new Staff();
     }
     else
     {
         info = UpdatingItem as Staff;
     }
     info.Name = txtName.Text;
     info.Certificate = txtCertificate.Text;
     Department dept = departmentComboBox1.SelectecDepartment;
     info.CardID = txtCardID.Text;
     info.Password = txtPassword.Text;
     if (dept != null)
     {
         info.DepartmentID = dept.ID;
         info.Department = dept;
     }
     info.Sex = rdMale.Checked ? "男" : "女";
     info.UserPosition = txtUserPosition.Text;
     info.HireDate = dtHireDate.Value.Date;
     info.Resigned = rdResign.Checked;
     info.IsAdmin = chkIsAdmin.Checked;
     info.VerifyCode = verifyCodeComboBox1.SelectedVerifyCode;
     return info;
 }
Esempio n. 12
0
 public CommandResult Delete(Staff info)
 {
     return ProviderFactory.Create<IStaffProvider>(_RepoUri).Delete(info);
 }
        /// <summary>
        /// 根据某个员工的排班记录,刷卡记录,请假单,加班单等原始资料生成指定时间段内的考勤结果
        /// </summary>
        /// <param name="staff"></param>
        /// <param name="sas"></param>
        /// <param name="ars"></param>
        /// <param name="vss"></param>
        /// <returns></returns>
        public List<AttendanceResult> Analist(Staff staff, List<ShiftArrange> sas, List<AttendanceLog> ars, List<TASheet> sheets, DatetimeRange range)
        {
            //根据排班记录,加班单,请假外出单等生成整个时期的要标记的时间段
            List<AttendanceResult> results = CreateTimezones(staff, sas);

            //与加班单和请假外出单等合并,得出最后每个上下班时间的准确日期
            AddTASheetsToTimezones(staff, results, sheets, range);
            //为那些所有需要记录上下班时间的时间段附加签到和签退
            List<AttendanceResult> items = (from item in results
                                            orderby item.NewStartTime ascending
                                            select item).ToList();
            //对每个时间段附加上实际的打卡时间
            AttachAttendanceReocrds(items, ars);
            ////对最终需要上班的时间段和实际的刷卡记录进行分析,得出每个时间段的考勤结果
            results.ForEach(item => item.CreateResult());
            return results;
        }
        private List<AttendanceResult> CreateAttendanceResult(Staff staff, DateTime shiftDate, TASheet sheet)
        {
            List<AttendanceResult> items = new List<AttendanceResult>();
            if (sheet.Items != null && sheet.Items.Count > 0)
            {
                foreach (TASheetItem item in sheet.Items)
                {
                    DateTime dt1 = shiftDate.AddHours(item.StartTime.Hour).AddMinutes(item.StartTime.Minute).AddSeconds(item.StartTime.Second);
                    DateTime dt2 = shiftDate.AddHours(item.EndTime.Hour).AddMinutes(item.EndTime.Minute).AddSeconds(item.EndTime.Second);
                    if (dt1 > dt2) dt2 = dt2.AddDays(1); //跨天
                    AttendanceResult st = new AttendanceResult();
                    st.ID = Guid.NewGuid();
                    st.StaffID = staff.ID;
                    st.StaffName = staff.Name;
                    st.ShiftDate = shiftDate;
                    st.Category = sheet.CategoryID;
                    st.StartTime = dt1;
                    st.NewStartTime = dt1;
                    st.EndTime = dt2;
                    st.NewEndTime = dt2;
                    if (AttendanceRules.Current != null)
                    {
                        st.EarlyestTime = st.NewStartTime.AddMinutes(-(int)AttendanceRules.Current.BeforeOTStartTime);
                        st.LatestTime = st.NewEndTime.AddMinutes((int)AttendanceRules.Current.AfterOTEndTime);
                    }
                    else
                    {
                        st.EarlyestTime = st.NewStartTime.AddMinutes(-30);
                        st.LatestTime = st.NewEndTime.AddMinutes(30);
                    }
                    st.ShiftTime = item.Duration;
                    st.Present = item.Duration;
                    st.AbsentItems = new List<AbsentItem>();

                    st.LogWhenArrive = true;
                    st.LogWhenLeave = true;
                    st.EnableLate = true;
                    st.EnableLeaveEarly = true;
                    st.EnableAbsent = true;
                    items.Add(st);
                }
            }
            return items;
        }
        private List<AttendanceResult> CreateAttendanceResult(Staff staff, ShiftArrange item)
        {
            List<AttendanceResult> items = new List<AttendanceResult>();
            if (item.Shift != null && item.Shift.Items != null && item.Shift.Items.Count > 0)
            {
                foreach (ShiftItem si in item.Shift.Items)
                {
                    AttendanceResult st = new AttendanceResult();
                    st.ID = Guid.NewGuid();
                    st.StaffID = staff.ID;
                    st.StaffName = staff.Name;
                    st.ShiftDate = item.ShiftDate;
                    st.ShiftID = item.ShiftID;
                    st.ShiftName = item.Shift.Name;
                    MyTime mt = si.StartTime;
                    st.StartTime = item.ShiftDate.AddHours(mt.Hour).AddMinutes(mt.Minute).AddSeconds(mt.Second);
                    st.NewStartTime = st.StartTime;
                    st.LogWhenArrive = si.LogAtStart;
                    mt = si.EndTime;
                    st.EndTime = item.ShiftDate.AddHours(mt.Hour).AddMinutes(mt.Minute).AddSeconds(mt.Second);
                    if (si.NextDay) st.EndTime = st.EndTime.AddDays(1);
                    st.NewEndTime = st.EndTime;
                    st.LogWhenLeave = si.LogAtEnd;
                    st.ShiftTime = si.Duration; //设置班次时段的上班时间
                    st.Present = si.Duration;
                    st.EarlyestTime = st.NewStartTime.AddMinutes((int)-si.BeforeStartTime);
                    st.LatestTime = st.NewEndTime.AddMinutes((int)si.AfterEndTime);
                    st.AllowLateTime = si.AllowLateTime;
                    st.AllowLeaveEarlyTime = si.AllowLeaveEarlyTime;
                    st.AbsentItems = new List<AbsentItem>();

                    st.LogWhenArrive = true;
                    st.LogWhenLeave = true;
                    st.EnableLate = true;
                    st.EnableLeaveEarly = true;
                    st.EnableAbsent = true;
                    items.Add(st);
                }
            }
            return items;
        }
 private void MergeTASheet(Staff staff, List<AttendanceResult> timezones, TASheet sheet, DatetimeRange range)
 {
     List<AttendanceResult> items = new List<AttendanceResult>();
     if (!range.Contain(sheet.StartDate) && !range.Contain(sheet.EndDate)) return;
     DateTime dt = sheet.StartDate;
     while (dt <= sheet.EndDate && range.Contain(dt))
     {
         List<AttendanceResult> ots = CreateAttendanceResult(staff, dt, sheet);
         if (ots == null || ots.Count == 0) break;
         foreach (AttendanceResult ot in ots)
         {
             DatetimeRange drOT = new DatetimeRange(ot.NewStartTime, ot.NewEndTime);
             List<AttendanceResult> sts = timezones.Where(it => it.ShiftDate == ot.ShiftDate).ToList();
             if (sts == null || sts.Count == 0)
             {
                 items.Add(ot);
             }
             else
             {
                 foreach (AttendanceResult st in sts)
                 {
                     DatetimeRange drSt = new DatetimeRange(st.NewStartTime, st.NewEndTime);
                     if (!drSt.Contain(drOT)) //检查是否有全部重合的情况,如果与上班时间全部重合,则加班无效。
                     {
                         if (drSt.Contain(drOT.Begin)) //如果加班的开始时间与普通上班时间有重叠,加班时间要截取掉重合部分,并且普通上班下班不用再打卡。
                         {
                             st.LogWhenLeave = false;
                             ot.NewStartTime = drSt.End;
                             ot.ShiftTime = (new DatetimeRange(ot.NewStartTime, ot.NewEndTime)).TotalMinutes;
                             ot.Present = (new DatetimeRange(ot.NewStartTime, ot.NewEndTime)).TotalMinutes;
                             ot.LogWhenArrive = false;
                         }
                         if (drSt.Contain(drOT.End))
                         {
                             ot.NewEndTime = drSt.Begin;
                             ot.ShiftTime = (new DatetimeRange(ot.NewStartTime, ot.NewEndTime)).TotalMinutes;
                             ot.Present = (new DatetimeRange(ot.NewStartTime, ot.NewEndTime)).TotalMinutes;
                             ot.LogWhenLeave = false;
                             st.LogWhenArrive = false;
                         }
                         items.Add(ot);
                     }
                 }
             }
         }
         dt = dt.AddDays(1);
     }
     if (items.Count > 0) timezones.AddRange(items);
 }