Example #1
0
        /// <summary>
        /// Sets the state to complete
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        public static GridInvokeMethodResult Release(GridFunctionParameter parameter)
        {
            Checkout(parameter);

            foreach (var row in parameter.GetSelectedRowsAsDataRow())
            {
                var documentId     = (Guid)row["Guid"];
                var documentPathId = (Guid)row["DocumentPathId"];
                var workflowId     = (Guid)row["WorkflowId"];

                var workflowOperation = new WorkflowOperation
                {
                    DocumentId     = documentId,
                    DocumentPath   = documentPathId,
                    UserId         = sessionService.CurrentSession.UserId,
                    CreateDateTime = DateTime.Now,
                    UpdateDateTime = DateTime.Now,
                    WorkflowId     = workflowId,
                    ActionName     = "released",
                    Guid           = Guid.NewGuid()
                };

                workflowOperationService.Release(workflowOperation);
            }

            return(new GridInvokeMethodResult {
                RefreshGrid = true
            });
        }
Example #2
0
        /// <summary>
        /// Tries to checkout a document if required
        /// </summary>
        /// <param name="parameter">Grid parameter</param>
        private static void Checkout(GridFunctionParameter parameter)
        {
            foreach (var row in parameter.GetSelectedRowsAsDataRow())
            {
                if (Guid.TryParse(row["OrganizationId"]?.ToString(), out Guid organizationUnitId))
                {
                    var documentId = (Guid)row["Guid"];

                    // The grid needs a the column workflow id
                    var workflowId  = (Guid)row["WorkflowId"];
                    var directoryId = (Guid)row["DirectoryId"];

                    var workflowOperation = new WorkflowOperation
                    {
                        DocumentId             = documentId,
                        UserId                 = sessionService.CurrentSession.UserId,
                        TargetUserId           = sessionService.CurrentSession.UserId,
                        CreateDateTime         = DateTime.Now,
                        UpdateDateTime         = DateTime.Now,
                        ActionName             = "forward",
                        WorkflowId             = workflowId,
                        WorkflowOrganizationId = organizationUnitId,
                        DirectoryId            = directoryId,
                        Guid = Guid.NewGuid()
                    };

                    var documentPath = workflowOperationService.DocumentCheckout(workflowOperation);
                    row["DocumentPathId"] = documentPath;
                }
            }
        }
Example #3
0
        /// <summary>
        /// Checks the document out of a workflow organization unit.
        /// </summary>
        /// <param name="workflowOperation"></param>
        /// <returns>Document path id</returns>
        public Guid DocumentCheckout(WorkflowOperation workflowOperation)
        {
            //Check if the document is still inside
            if (documentWorkflowOrganizationUnitAssignmentService.GetByIds(workflowOperation.DocumentId, (Guid)workflowOperation.WorkflowOrganizationId) != null)
            {
                documentWorkflowOrganizationUnitAssignmentService.DeleteByIds(workflowOperation.DocumentId, (Guid)workflowOperation.WorkflowOrganizationId);

                // Add path to forwarded user
                var workflow = documentWorkflowUserService.Get(workflowOperation.TargetUserId);
                if (workflow == null)
                {
                    throw new DocumentWorkflowException("workflow is null");
                }
                var targetStructure = fileStructureService.GetByInstanceDataGuid(workflow.Guid);
                if (targetStructure == null)
                {
                    throw new DocumentWorkflowException("targetStructure is null");
                }

                var targetPath = new FileStructureDocumenPath
                {
                    DirectoryGuid     = (Guid)workflowOperation.DirectoryId,
                    WorkflowId        = workflowOperation.WorkflowId,
                    FileStructureGuid = targetStructure.Id,
                    Id              = Guid.NewGuid(),
                    DocumentGuid    = workflowOperation.DocumentId,
                    IsProtectedPath = false,
                    WorkflowState   = DocumentWorkflowStateType.InReview
                };

                var tracker = new DocumentWorkflowTracker
                {
                    ActionName     = DocumentWorkflowStateType.ForwardedCopy,
                    CreateDateTime = DateTime.Now,
                    DocumentId     = targetPath.DocumentGuid,
                    TargetUserId   = workflowOperation.TargetUserId,
                    UserId         = workflowOperation.UserId
                };

                documentWorkflowTrackerService.Save(tracker);
                fileStructureDocumentPathService.Save(targetPath);

                return(targetPath.Id);
            }
            throw new CoreException("S-0000009", "9ae836fb-40e8-43d3-9d57-85c17647684a", ExceptionType.Expected);
        }
Example #4
0
        /// <summary>
        /// Tracks the changes a workflow operation creates.
        /// </summary>
        /// <param name="workflowOperation">The workflow operation that contains the operation that needs to be tracked</param>
        private void TrackChanges(WorkflowOperation workflowOperation, DocumentWorkflowStateType documentWorkflowStateType)
        {
            if (workflowOperation.WorkflowOrganizationId != null)
            {
                var tracker = new DocumentWorkflowTracker
                {
                    ActionName             = documentWorkflowStateType,
                    CreateDateTime         = DateTime.Now,
                    DocumentId             = workflowOperation.DocumentId,
                    TargetUserId           = workflowOperation.TargetUserId,
                    UserId                 = workflowOperation.UserId,
                    WorkflowOrganizationId = workflowOperation.WorkflowOrganizationId,
                };

                documentWorkflowTrackerService.Save(tracker);
            }
        }
Example #5
0
        /// <summary>
        /// Sets the state to complete.
        /// </summary>
        /// <param name="workflowOperation"></param>
        public void Release(WorkflowOperation workflowOperation)
        {
            var path = fileStructureDocumentPathService.Get(workflowOperation.DocumentPath);

            path.WorkflowState = DocumentWorkflowStateType.Released;

            var tracker = new DocumentWorkflowTracker
            {
                ActionName     = DocumentWorkflowStateType.Released,
                CreateDateTime = DateTime.Now,
                DocumentId     = workflowOperation.DocumentId,
                UserId         = workflowOperation.UserId
            };

            documentWorkflowTrackerService.Save(tracker);
            fileStructureDocumentPathService.Save(path);

            flowEventService.InvokeEvent("DocumentReleased", workflowOperation.Guid, workflowOperation, workflowOperation.UserId);
        }
Example #6
0
        private void SaveWorkflowOrganizationUnitAssignment(WorkflowOperation workflowOperation, string stateProvider)
        {
            var documentWorkflowStateProvider = unityContainer.Resolve <IDocumentWorkflowStateProvider>(stateProvider);

            var documentWorkflowOrganzitionUnitAssignment = new DocumentWorkflowOrganizationUnitAssignment
            {
                DocumentId = workflowOperation.DocumentId,
                WorkflowOrganizationUnitId = (Guid)workflowOperation.WorkflowOrganizationId,
                WorkflowId = workflowOperation.WorkflowId
            };

            documentWorkflowOrganizationUnitAssignmentService.Save(documentWorkflowOrganzitionUnitAssignment);

            var state = documentWorkflowStateProvider.ResolveDocumentWorkflowState(workflowOperation.DocumentId, workflowOperation.WorkflowId);

            documentWorkflowAssignmentService.Save(new DocumentWorkflowAssignment
            {
                DocumentId = workflowOperation.DocumentId,
                StateId    = state.Guid,
                WorkflowId = workflowOperation.WorkflowId
            });
        }
Example #7
0
        private static IList <WorkflowOperation> WorkflowOperationsItemBoxGet(GridFunctionParameter parameter)
        {
            IList <WorkflowOperation> workflowOperations = new List <WorkflowOperation>();

            Checkout(parameter);

            Guid?workflowOrganizationId = null;
            int  targetUserId           = 0;

            if (parameter.SelectedRows.Count == 0)
            {
                return(null);
            }

            var itemBox = (AsyncGridItemBox)ItemBoxManager.GetItemBoxFromDB("IB_Document_Workflow_User");

            itemBox.SetPlaceholder("WorkflowId", parameter.GetSelectedRowsAsDataRow().FirstOrDefault()["WorkflowId"].ToString());
            itemBox.ShowDialog();

            if (itemBox.SelectedItem == null)
            {
                return(null);
            }

            var comment = new Framework.Extension.InstanceDataCommentModel
            {
                UserGroupVisibility = Visibility.Hidden,
                UserId           = sessionService.CurrentSession.UserId,
                InstanceDataGuid = Guid.NewGuid(),
                StackGuid        = (Guid)parameter.GridView.Configuration.SelectedStackId
            };

            var commentWindow = new Framework.Extension.NewCommentWindow(comment);

            commentWindow.ShowDialog();

            if (itemBox.GetSelectedItemCell("InternalType").ToString() == "User")
            {
                targetUserId = (int)itemBox.GetSelectedItemCell("Ident");
            }
            else
            {
                workflowOrganizationId = (Guid)itemBox.GetSelectedItemCell("Guid");
            }

            foreach (var row in parameter.GetSelectedRowsAsDataRow())
            {
                var documentId     = (Guid)row["Guid"];
                var documentPathId = (Guid)row["DocumentPathId"];
                var workflowId     = (Guid)row["WorkflowId"];

                var workflowOperation = new WorkflowOperation
                {
                    DocumentId     = documentId,
                    DocumentPath   = documentPathId,
                    UserId         = sessionService.CurrentSession.UserId,
                    TargetUserId   = targetUserId,
                    CreateDateTime = DateTime.Now,
                    UpdateDateTime = DateTime.Now,
                    ActionName     = "forward",
                    WorkflowId     = workflowId,
                    Guid           = Guid.NewGuid()
                };
                if (itemBox.GetSelectedItemCell("InternalType").ToString() == "Group")
                {
                    workflowOperation.OperationType          = WorkflowOperationType.WorkflowOrganizationUnit;
                    workflowOperation.WorkflowOrganizationId = workflowOrganizationId;
                }
                workflowOperations.Add(workflowOperation);

                if (!string.IsNullOrWhiteSpace(comment.Comment))
                {
                    comment.InstanceDataGuid = documentId;
                    comment.CommentId        = Guid.NewGuid();

                    Framework.Extension.InstanceDataComment.Singleton.Create(comment);
                }
            }
            return(workflowOperations);
        }
Example #8
0
        private static IList <WorkflowOperation> WorkflowOperationsGet(GridFunctionParameter parameter)
        {
            IList <WorkflowOperation> workflowOperations = new List <WorkflowOperation>();

            Checkout(parameter);

            if (parameter.SelectedRows.Count == 0)
            {
                return(null);
            }

            Dictionary <string, string> dictParams = new Dictionary <string, string>();

            dictParams.Add("[WorkflowId]", parameter.GetSelectedRowsAsDataRow().FirstOrDefault()["WorkflowId"].ToString());

            var win = new ForwardWindow(dictParams);

            win.ShowDialog();

            var windowDataContext = win.DataContext;
            ObservableCollection <IMultiSelectionComboBoxItem> itemList = null;
            var commentText = "";

            if (windowDataContext is ForwardViewModel forwardViewModel)
            {
                itemList    = forwardViewModel.MultiItemboxItems;
                commentText = forwardViewModel.CommentText;
            }

            if (itemList == null)
            {
                return(null);
            }

            foreach (var item in itemList)
            {
                var user = userService.GetByGuid((Guid)item.Id);

                int  targetUserId            = 0;
                Guid?workflowOrganzisationId = null;

                if (user != null)
                {
                    targetUserId = user.Ident;
                }

                else
                {
                    workflowOrganzisationId = (Guid?)item.Id;
                }

                var comment = new Framework.Extension.InstanceDataCommentModel
                {
                    Comment             = commentText,
                    UserGroupVisibility = Visibility.Hidden,
                    UserId           = sessionService.CurrentSession.UserId,
                    InstanceDataGuid = Guid.NewGuid(),
                    StackGuid        = (Guid)parameter.GridView.Configuration.SelectedStackId
                };

                foreach (var row in parameter.GetSelectedRowsAsDataRow())
                {
                    var documentId     = (Guid)row["Guid"];
                    var documentPathId = (Guid)row["DocumentPathId"];
                    // The grid needs a the column workflow id
                    var workflowId = (Guid)fileStructureDocumentPathService.Get(documentPathId).WorkflowId;

                    if (workflowId == null)
                    {
                        continue;
                    }

                    var workflowOperation = new WorkflowOperation
                    {
                        DocumentId     = documentId,
                        DocumentPath   = documentPathId,
                        UserId         = sessionService.CurrentSession.UserId,
                        TargetUserId   = targetUserId,
                        CreateDateTime = DateTime.Now,
                        UpdateDateTime = DateTime.Now,
                        ActionName     = "forward",
                        WorkflowId     = workflowId,
                        Guid           = Guid.NewGuid(),
                    };

                    if (user == null)
                    {
                        workflowOperation.OperationType          = WorkflowOperationType.WorkflowOrganizationUnit;
                        workflowOperation.WorkflowOrganizationId = workflowOrganzisationId;
                    }

                    workflowOperations.Add(workflowOperation);

                    if (!string.IsNullOrWhiteSpace(comment.Comment))
                    {
                        comment.InstanceDataGuid = documentId;
                        comment.CommentId        = Guid.NewGuid();

                        Framework.Extension.InstanceDataComment.Singleton.Create(comment);
                    }
                }
            }
            return(workflowOperations);
        }
Example #9
0
        /// <summary>
        /// Sends a copy to the target user.
        /// </summary>
        /// <param name="workflowOperation"></param>
        public void ForwardCopyTo(WorkflowOperation workflowOperation)
        {
            var configuration  = documentWorkflowConfigurationService.Get(workflowOperation.WorkflowId);
            var accessProvider = unityContainer.Resolve <IDocumentWorkflowAccessProvider>(configuration.AccessProviderName);

            if (workflowOperation.OperationType == WorkflowOperationType.WorkflowOrganizationUnit)
            {
                SaveWorkflowOrganizationUnitAssignment(workflowOperation, configuration.StateProviderName);
                TrackChanges(workflowOperation, DocumentWorkflowStateType.ForwardedCopy);

                if (accessProvider != null && workflowOperation.WorkflowOrganizationId.HasValue)
                {
                    accessProvider.SetOrganizationUnitAcess(workflowOperation.WorkflowOrganizationId.Value, workflowOperation.DocumentId, configuration);
                }
            }
            else
            {
                // Add path to forwarded user
                var workflow = documentWorkflowUserService.Get(workflowOperation.TargetUserId);
                if (workflow == null)
                {
                    throw new DocumentWorkflowException("workflow is null");
                }

                var targetStructure = fileStructureService.GetByInstanceDataGuid(workflow.Guid);
                if (targetStructure == null)
                {
                    throw new DocumentWorkflowException("targetStructure is null");
                }

                // TODO: Check for null
                var existingStructures = fileStructureDocumentPathService.GetByDocumentId(workflowOperation.DocumentId)
                                         .ToList();
                if (existingStructures == null)
                {
                    throw new DocumentWorkflowException("existingStructures is null");
                }

                var targetPath = existingStructures.FirstOrDefault(x => x.FileStructureGuid == targetStructure.Id);

                if (targetPath != null)
                {
                    var returnFolder = GetReturnDirectory(targetPath.FileStructureGuid, targetPath.WorkflowId.Value);
                    targetPath.DirectoryGuid = returnFolder.Id;
                    targetPath.WorkflowState = DocumentWorkflowStateType.InReview;
                }

                else
                {
                    var firstDirectory = FindWorkflowDirectory(targetStructure, workflowOperation.WorkflowId, workflowOperation.DocumentId, workflowOperation.TargetUserId);

                    if (firstDirectory == null)
                    {
                        throw new DocumentWorkflowException("existingStructures is null");
                    }

                    targetPath = new FileStructureDocumenPath
                    {
                        DirectoryGuid     = firstDirectory.Id,
                        WorkflowId        = firstDirectory.WorkflowId,
                        FileStructureGuid = targetStructure.Id,
                        Id              = Guid.NewGuid(),
                        DocumentGuid    = workflowOperation.DocumentId,
                        IsProtectedPath = false,
                        WorkflowState   = DocumentWorkflowStateType.InReview
                    };
                }

                var tracker = new DocumentWorkflowTracker
                {
                    ActionName     = DocumentWorkflowStateType.ForwardedCopy,
                    CreateDateTime = DateTime.Now,
                    DocumentId     = targetPath.DocumentGuid,
                    TargetUserId   = workflowOperation.TargetUserId,
                    UserId         = workflowOperation.UserId
                };

                documentWorkflowTrackerService.Save(tracker);
                fileStructureDocumentPathService.Save(targetPath);

                if (accessProvider != null)
                {
                    accessProvider.SetUserAccess(workflowOperation.TargetUserId, workflowOperation.DocumentId, targetPath.Id, targetStructure.Id, configuration);
                }

                flowEventService.InvokeEvent("DocumentForwardedCopy", workflowOperation.Guid, workflowOperation, workflowOperation.UserId);
            }
        }
        /// <summary>
        /// 验证申请单是否有效(转换IOHours正负值)
        /// </summary>
        /// <param name="order">申请单</param>
        /// <param name="operation"></param>
        /// <returns></returns>
        private bool ValidOrder(OrderModel order, WorkflowOperation operation)
        {
            #region 验证参数

            /*
             * 1、判断申请单是否有效
             *
             * **/

            if (order == null || order.OrderDets == null || order.OrderDets.Count < 1)
            {
                throw new NullReferenceException("无效的申请单。");
            }

            var detail = order.OrderDets.FirstOrDefault(); //申请单详情

            /*
             * 2、验证申请单详情是否有效
             *
             * **/
            if (detail == null || !detail.IOHours.HasValue)
            {
                throw new NullReferenceException("无效的申请单。");
            }

            #endregion

            #region 转换正负值

            //撤销申请

            /*
             *
             * 撤销:
             *          加班申请单: 因为撤销申请单,所以撤销之前的调休假的基础上,相应减少调休假: 意思是我撤销了加班单,所以等于没有加班,那么申请的加班时长减少
             *      其他类型申请单: 因为撤销申请单,其他类型因为是假期,所以撤销了假期类型的申请单,所以的增加假期
             *
             * 正常申请:
             *
             *
             * **/
            if (operation == WorkflowOperation.Revoke)
            {
                detail.IOHours = order.OrderType == OrderType.Overtime
                    ? Math.Abs(detail.IOHours.Value) * -1.0 //加班,减少调休假
                    : Math.Abs(detail.IOHours.Value);       //请假,增加假期
            }
            else //正常申请
            {
                detail.IOHours = order.OrderType == OrderType.Overtime
                    ? Math.Abs(detail.IOHours.Value)         //加班,增加调休假
                    : Math.Abs(detail.IOHours.Value) * -1.0; //请假,减少假期
            }

            #endregion

            #region 验证开始/结束时间

            /*
             * 验证申请的时间是否有效
             *
             * **/
            try
            {
                if (detail.StartDate.CompareTo(detail.EndDate) >= 0) //开始时间等于大于结束时间
                {
                    throw new InvalidOperationException("开始时间必须大于结束时间。");
                }

                if (detail.StartDate.Year != detail.EndDate.Year) //开始时间和结束时间不能跨年
                {
                    throw new InvalidOperationException("开始时间和结束时间不能跨年。");
                }
            }
            catch
            {
                throw;
            }

            #endregion

            #region 验证用户性别, 性别不同,能申请假期类型不同

            var invalidUsers = string.Empty;
            order.OrderUsers.ToList().ForEach(user =>
            {
                //女,没有陪产假
                if (user.Gender == Gender.Female && order.OrderType == OrderType.PaternityLeave)
                {
                    invalidUsers += string.Format(",用户({0})不能申请陪产假", user.UserName);
                }

                //男,没有哺乳假和产假
                if (user.Gender == Gender.Male &&
                    (order.OrderType == OrderType.MaternityLeave || order.OrderType == OrderType.BreastfeedingLeave))
                {
                    invalidUsers += string.Format(",用户({0})不能申请产假或哺乳假", user.UserName);
                }
            });

            if (!string.IsNullOrEmpty(invalidUsers))
            {
                Log.Error(invalidUsers.Substring(1));
                throw new InvalidOperationException(invalidUsers.Substring(1));
            }

            #endregion

            //验证余额是否充足
            _attendanceSummaryService.CheckVacationBalance(order.OrderUsers, order.OrderType, detail.IOHours.Value);

            return(true);
        }
        /// <summary>
        /// 添加申请单到数据库
        /// </summary>
        /// <param name="dbContext"></param>
        /// <param name="order"></param>
        /// <param name="operation"></param>
        /// <returns></returns>
        private IEnumerable <Order> AddOrderToDb(MissionskyOAEntities dbContext, OrderModel order, WorkflowOperation operation)
        {
            /*
             * 1、判断操作是否为 撤销和申请
             *
             * **/
            if (operation != WorkflowOperation.Revoke && operation != WorkflowOperation.Apply)
            {
                Log.Error("无效的操作。");
                throw new InvalidOperationException("无效的操作。");
            }

            //
            IList <Order> dbOrders = new List <Order>();

            //假ID, 解决EF批量插入Entity时,报"Multiple added entities may have the same primary key"异常
            //http://www.cnblogs.com/joeylee/p/3805901.html
            var idFeed = 0;

            order.OrderUsers.ToList().ForEach(user =>
            {
                #region 添加申请单

                var orderEntity    = order.ToEntity();
                orderEntity.Id     = idFeed++;
                orderEntity.UserId = user.Id;

                //撤销,记录原始申请Id
                if (operation == WorkflowOperation.Revoke)
                {
                    orderEntity.RefOrderId = user.OrderId;
                }

                dbContext.Orders.Add(orderEntity); //添加数据库记录
                order.Id = orderEntity.Id;

                //user.OrderId = orderEntity.Id; //申请单Id

                if (order.OrderDets != null && order.OrderDets.Count > 0)
                {
                    foreach (var orderDetail in order.OrderDets)
                    {
                        var orderDetailsEntity     = orderDetail.ToEntity();
                        orderDetailsEntity.Id      = idFeed;
                        orderDetailsEntity.OrderId = orderEntity.Id;
                        dbContext.OrderDets.Add(orderDetailsEntity); //添加数据库记录
                        orderDetail.Id = orderDetailsEntity.Id;
                    }
                }

                dbOrders.Add(orderEntity); //申请单

                #endregion
            });

            return(dbOrders);
        }