/// <summary> /// 当撤销的假期被奇效或者拒绝后,恢复年假(还有调休). /// </summary> /// <returns>是否恢复成功</returns> public bool RecoverOrder(OrderModel order) { using (var dbContext = new MissionskyOAEntities()) { //如果有reforder,说明是撤销的假单.所以对于这种取消的时候应该恢复假期. if (order.RefOrder == null) { return(false); } var detail = order.OrderDets.FirstOrDefault(); //申请单详细 var times = detail.IOHours.Value + order.RefOrder.OrderDets.FirstOrDefault().IOHours.Value; //update order.OrderUsers.ToList().ForEach(user => { var summary = new UpdateAttendanceSummaryModel() { UserId = user.Id, SummaryYear = DateTime.Now.Year, Times = times, Type = order.OrderType }; double beforeUpdated = 0.0; double afterUpdated = 0.0; string auditMsg = string.Empty; this._attendanceSummaryService.UpdateAttendanceSummary(dbContext, summary, ref beforeUpdated, ref afterUpdated); //更新假期 #region 更新剩余结果 if (order.OrderType == OrderType.AnnualLeave) { auditMsg = string.Format("剩余年假: 申请前{0}小时,申请后{1}小时", beforeUpdated, afterUpdated); } else if (order.OrderType == OrderType.Overtime) { auditMsg = string.Format("累计加班: 申请前{0}小时,申请后{1}小时", beforeUpdated, afterUpdated); } else if (order.OrderType == OrderType.DaysOff) { auditMsg = string.Format("剩余调休: 申请前{0}小时,申请后{1}小时", beforeUpdated, afterUpdated); } else { auditMsg = string.Format("累计休假: 申请前{0}小时,申请后{1}小时", beforeUpdated, afterUpdated); } if (!string.IsNullOrEmpty(auditMsg)) { detail.Audit = auditMsg; } #endregion }); } return(true); }
/// <summary> /// 更新用户考勤汇总信息 /// </summary> /// <param name="dbContext">数据库上下文</param> /// <param name="model">考勤汇总更新信息</param> /// <param name="beforeUpdated">更新前的旧值</param> /// <param name="afterUpdated">更新后的新值</param> /// <returns></returns> public bool UpdateAttendanceSummary(MissionskyOAEntities dbContext, UpdateAttendanceSummaryModel model, ref double beforeUpdated, ref double afterUpdated) { if (model == null || model.UserId < 1 || Math.Abs(model.Times) < 0.0) { throw new KeyNotFoundException("更新假期异常。"); } //CheckVacationBalance(model.ApplicantId, model.Type, model.Times); //验证余额是否充足 #region 更新假期汇总信息 var checkType = model.Type; if (checkType == OrderType.DaysOff) //调休,扣除加班 { checkType = OrderType.Overtime; } //用户本年度相关类型 汇总结果 var summary = dbContext.AttendanceSummaries.FirstOrDefault( it => it.Year == DateTime.Now.Year && it.UserId == model.UserId && it.Type == (int)checkType); if (summary == null) { throw new NullReferenceException("更新假期异常。"); } summary.RemainValue = summary.RemainValue ?? 0.0; beforeUpdated = summary.RemainValue.Value; //更新前的值 summary.RemainValue += model.Times; //计算已请多少事假 afterUpdated = beforeUpdated + model.Times; //更新后的值 beforeUpdated = Math.Abs(beforeUpdated); //更新前的值 afterUpdated = Math.Abs(afterUpdated); //更新后的值 #endregion return(true); }
/// <summary> /// 更新假期信息 /// </summary> /// <param name="dbContext">数据库上下文</param> /// <param name="order">申请单</param> /// <param name="workflow">申请单流程</param> /// <param name="nextStep">流程下一步</param> /// <param name="nextStatus">申请单状态</param> private void UpdateAttendanceSummary(MissionskyOAEntities dbContext, OrderModel order, WorkflowModel workflow, WorkflowStepModel nextStep, OrderStatus nextStatus) { var detail = order.OrderDets.FirstOrDefault(); //申请单详细 if (detail == null || detail.IOHours == null || Math.Abs(detail.IOHours.Value) <= 0.0) { Log.Error("申请单无效"); throw new InvalidOperationException("申请单无效。"); } var curStep = order.NextStep == Constant.WORKFLOW_DIRECT_SUPERVISOR_APPROVE_NODE ? workflow.GetDirectSupervisorApproveStep() : workflow.WorkflowSteps.FirstOrDefault(it => it.Id == order.NextStep); //当前步骤 var isUpdated = false; var times = detail.IOHours.Value; //1, 拒绝 if (nextStatus == OrderStatus.Rejected) { if (curStep != null && curStep.IsFinanceReviewing()) //当前是[财务审阅]: [行政审批]完成,已经更新了假期,需要[财务审阅]时,取消扣除的假期 { isUpdated = true; times = -times; } } //2, 流程结束(只能在没有财务审批节点才更新,避免重复更新(原始需求:完成行政审批就已经更新假期)) else if (!workflow.NeedFinanceApprove() && nextStep == null) { isUpdated = true; } //3, 流程未结束, 转到[财务审阅](完成行政审批就更新) else if (nextStep != null && nextStep.IsFinanceReviewing()) { isUpdated = true; } if (isUpdated) { order.OrderUsers.ToList().ForEach(user => { var summary = new UpdateAttendanceSummaryModel() { UserId = user.Id, SummaryYear = DateTime.Now.Year, Times = times, Type = order.OrderType }; double beforeUpdated = 0.0; double afterUpdated = 0.0; string auditMsg = string.Empty; this._attendanceSummaryService.UpdateAttendanceSummary(dbContext, summary, ref beforeUpdated, ref afterUpdated); //更新假期 #region 更新剩余结果 if (order.OrderType == OrderType.AnnualLeave) { auditMsg = string.Format("剩余年假: 申请前{0}小时,申请后{1}小时", beforeUpdated, afterUpdated); } else if (order.OrderType == OrderType.Overtime) { auditMsg = string.Format("累计加班: 申请前{0}小时,申请后{1}小时", beforeUpdated, afterUpdated); } else if (order.OrderType == OrderType.DaysOff) { auditMsg = string.Format("剩余调休: 申请前{0}小时,申请后{1}小时", beforeUpdated, afterUpdated); } else { auditMsg = string.Format("累计休假: 申请前{0}小时,申请后{1}小时", beforeUpdated, afterUpdated); } if (!string.IsNullOrEmpty(auditMsg)) { detail.Audit = auditMsg; } #endregion }); } }