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; }
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; }
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; }
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); //总小时数 }
/// <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()); } }
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; }
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); }