/// <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 }); }
/// <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; } } }
/// <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); }
/// <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); } }
/// <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); }
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 }); }
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); }
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); }
/// <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); }