/// <summary>
        /// 是否撤销的时间的在当前请假时间内
        /// </summary>
        /// <returns>是否撤销的时间的在当前请假时间内</returns>
        public bool IsRevokeTimeAvailiable(int orderNo, RevokeOrderModel model)
        {
            using (var dbcontext = new MissionskyOAEntities())
            {
                var orderEntity = dbcontext.Orders.FirstOrDefault(it => it.OrderNo == orderNo);
                if (orderEntity == null)
                {
                    Log.Error(string.Format("无效的撤销申请单, No: {0}", orderNo));
                    throw new NullReferenceException("无效的撤销申请单。");
                }

                var           detailEntity = dbcontext.OrderDets.FirstOrDefault(it => it.OrderId == orderEntity.Id);
                OrderDetModel detail       = detailEntity.ToModel();

                return(model.StartDate >= detail.StartDate && model.EndDate <= detail.EndDate);
            }
        }
Ejemplo n.º 2
0
        public ApiResponse <bool> Revoke(int orderNo, RevokeOrderModel model)
        {
            //销假 如果是请假或者提交加班申请需要启动工作申请流程
            if (orderNo < 0 || model == null)
            {
                throw new ApiBadRequestException("无效的参数");
            }

            if (!AskLeaveService.IsRevokeTimeAvailiable(orderNo, model))
            {
                throw new ApiBadRequestException("撤销开始时间和撤销结束时间必须在当前申请单开始时间和结束时间内");
            }

            ApiResponse <bool> response = new ApiResponse <bool>()
            {
                Result = AskLeaveService.RevokeOrder(orderNo, model, this.Member)
            };

            return(response);
        }
        /// <summary>
        /// 销请假单或者加班单
        /// </summary>
        /// <returns>取消</returns>
        public bool RevokeOrder(int orderNo, RevokeOrderModel model, UserModel applicant)
        {
            using (var dbContext = new MissionskyOAEntities())
            {
                #region 申请单信息

                var revokeOrder = new OrderModel()
                {
                    Status       = OrderStatus.Apply,
                    ApplyUserId  = applicant.Id,
                    IsBatchApply = (model.UserIds.Count() > 1),
                    CreatedTime  = DateTime.Now
                };

                var orderDet = new OrderDetModel()
                {
                    StartDate    = model.StartDate,
                    EndDate      = model.EndDate,
                    StartTime    = model.StartDate.TimeOfDay,
                    EndTime      = model.EndDate.TimeOfDay,
                    IOHours      = model.IOHours,
                    Description  = model.RevokeReason,
                    InformLeader = model.InformLeader,
                    WorkTransfer = model.WorkTransfer,
                    Recipient    = model.Recipient
                };

                revokeOrder.OrderNo    = _orderService.GenerateOrderNo(dbContext);             //生成申请单号
                revokeOrder.OrderUsers = _userService.GetOrderUsers(dbContext, model.UserIds); //相关申请单用户
                revokeOrder.OrderDets  = new List <OrderDetModel>()
                {
                    orderDet
                };

                //验证申请单
                Order oldEntity = null;
                revokeOrder.OrderUsers.ToList().ForEach(ou =>
                {
                    //申请单是否存在
                    oldEntity = dbContext.Orders.FirstOrDefault(o => o.UserId == ou.Id && o.OrderNo == orderNo);
                    if (oldEntity == null)
                    {
                        Log.Error("此订单不存在。");
                        throw new KeyNotFoundException("此订单不存在。");
                    }

                    ou.OrderId = oldEntity.Id; //撤销单Id

                    //是否已经撤销过
                    var revokedEntity =
                        dbContext.Orders.FirstOrDefault(o => o.RefOrderId.HasValue && o.RefOrderId == ou.OrderId);
                    if (revokedEntity != null && !revokedEntity.ToModel().CanRevokeOrder())
                    {
                        Log.Error("已经撤销一次,不能再撤销。");
                        throw new InvalidOperationException("已经撤销一次,不能再撤销。");
                    }
                });

                revokeOrder.OrderType = (OrderType)oldEntity.OrderType;  //申请单类型

                var oldDetailEntity = dbContext.OrderDets.FirstOrDefault(it => it.OrderId == oldEntity.Id);
                if (oldDetailEntity != null && oldDetailEntity.IOHours.HasValue)
                {
                    if (Math.Abs(oldDetailEntity.IOHours.Value) < Math.Abs(model.IOHours))
                    {
                        Log.Error("撤销时长不正确。");
                        throw new InvalidOperationException("撤销时长不正确。");
                    }
                }

                //验证申请单是否有效,并转换IOHours正负值
                ValidOrder(revokeOrder, WorkflowOperation.Revoke);

                #endregion

                //添加初始审批信息
                AddAuditMessages(dbContext, revokeOrder, applicant);

                //对于同意的请假单或者加班单,自动填写新的撤销请假单
                if (oldEntity.Status == (int)OrderStatus.Approved)
                {
                    //添加申请单到数据库
                    var dbOrders = AddOrderToDb(dbContext, revokeOrder, WorkflowOperation.Revoke);

                    //流程申请
                    WorkflowProcessModel process = _orderService.Apply(dbContext, revokeOrder);
                    if (process == null)
                    {
                        Log.Error("找不到流程。");
                        throw new InvalidOperationException("找不到流程。");
                    }

                    //更新申请单工作流
                    UpdateOrderProcess(dbContext, dbOrders, revokeOrder, process, applicant);

                    try
                    {
                        dbContext.SaveChanges();
                    }
                    catch (DbEntityValidationException dbEx)
                    {
                        LogDatabaseError(dbEx);
                        throw dbEx;
                    }

                    return(true);
                }
                else
                {
                    Log.Error("流程处理异常。");
                    throw new InvalidOperationException("流程处理异常。");
                }
            }
        }