示例#1
0
        public IList <AuthorizedEvent> RetrieveAuthorizedEvents(long workFlowID, short languageID)
        {
            DTO.WorkFlow             workFlow = WorkFlowQueryProvider.WorkFlowQuery.FindByIdentity(workFlowID);
            WorkFlowTypeDocumentType workFlowTypeDocumentType = WorkFlowQueryProvider.WorkFlowTypeDocumentTypeQuery.GetByWorkFlowTypeID_DocumentTypeID(workFlow.WorkFlowType.WorkFlowTypeID, workFlow.Document.DocumentType.DocumentTypeID);

            string serviceName = workFlowTypeDocumentType.ServiceName;
            string stateName   = workFlow.CurrentState.Name;
            object finder      = ContextRegistry.GetContext().GetObject(serviceName);


            int workFlowStateID = workFlow.CurrentState.WorkFlowStateID;
            IList <WorkFlowStateEventWithLang> workFlowStateEvents = WorkFlowQueryProvider.WorkFlowStateEventQuery.FindByWorkFlowStateEventByStateID(workFlowStateID, languageID);

            IList <AuthorizedEvent> authorizedEvents = new List <AuthorizedEvent>();
            MethodInfo methodInfo;
            bool       canDoStateEvent;

            foreach (WorkFlowStateEventWithLang workFlowStateEventWithLang in workFlowStateEvents)
            {
                //Call method Can{EventName}{StateName} ex. CanSubmitDraft , CanApproveWaitAR ..
                methodInfo = finder.GetType().GetMethod(string.Format("Can{0}{1}", workFlowStateEventWithLang.Name, stateName));
                if (methodInfo != null)
                {
                    canDoStateEvent = (bool)methodInfo.Invoke(finder, new object[] { workFlowID });
                    if (canDoStateEvent)
                    {
                        authorizedEvents.Add(new AuthorizedEvent(workFlowStateEventWithLang.EventID, workFlowStateEventWithLang.Name, workFlowStateEventWithLang.DisplayName, workFlowStateEventWithLang.UserControlPath));
                    }
                }
            }

            return(authorizedEvents);
        }
示例#2
0
        public void ReCalculateWorkFlowPermission(long workFlowID)
        {
            WorkFlowStateEventPermissionService.ClearOldPermission(workFlowID);

            DTO.WorkFlow workFlow = WorkFlowQueryProvider.WorkFlowQuery.FindByIdentity(workFlowID);
            if (workFlow == null)
            {
                return;
            }
            if (workFlow.CurrentState == null)
            {
                return;
            }
            if (workFlow.WorkFlowType == null)
            {
                return;
            }
            if (workFlow.Document == null)
            {
                return;
            }
            if (workFlow.Document.DocumentType == null)
            {
                return;
            }

            WorkFlowTypeDocumentType workFlowTypeDocumentType = WorkFlowQueryProvider.WorkFlowTypeDocumentTypeQuery.GetByWorkFlowTypeID_DocumentTypeID(workFlow.WorkFlowType.WorkFlowTypeID, workFlow.Document.DocumentType.DocumentTypeID);

            if (workFlowTypeDocumentType == null)
            {
                return;
            }

            string serviceName = workFlowTypeDocumentType.ServiceName;
            string stateName   = workFlow.CurrentState.Name;

            object finder = ContextRegistry.GetContext().GetObject(serviceName);

            if (finder == null)
            {
                return;
            }

            IList <WorkFlowStateEvent> stateEvents = WorkFlowQueryProvider.WorkFlowStateEventQuery.FindByWorkFlowStateEventByStateID(workFlow.CurrentState.WorkFlowStateID);

            foreach (WorkFlowStateEvent stateEvent in stateEvents)
            {
                MethodInfo methodInfo = finder.GetType().GetMethod(string.Format("ReCalculatePermissionFor{0}{1}", stateEvent.Name, stateName));
                if (methodInfo != null)
                {
                    methodInfo.Invoke(finder, new object[] { workFlowID, stateEvent.WorkFlowStateEventID });
                }
            }
        }
示例#3
0
        public void OnDeleteDocument(long workFlowID)
        {
            DTO.WorkFlow             workFlow = WorkFlowQueryProvider.WorkFlowQuery.FindByIdentity(workFlowID);
            WorkFlowTypeDocumentType workFlowTypeDocumentType = WorkFlowQueryProvider.WorkFlowTypeDocumentTypeQuery.GetByWorkFlowTypeID_DocumentTypeID(workFlow.WorkFlowType.WorkFlowTypeID, workFlow.Document.DocumentType.DocumentTypeID);

            string serviceName = workFlowTypeDocumentType.ServiceName;
            string stateName   = workFlow.CurrentState.Name;
            object finder      = ContextRegistry.GetContext().GetObject(serviceName);

            MethodInfo methodInfo = finder.GetType().GetMethod("OnDeleteDocument");

            if (methodInfo != null)
            {
                methodInfo.Invoke(finder, new object[] { workFlowID });
            }
        }
示例#4
0
        public bool CanDeleteDocument(long workFlowID)
        {
            DTO.WorkFlow             workFlow = WorkFlowQueryProvider.WorkFlowQuery.FindByIdentity(workFlowID);
            WorkFlowTypeDocumentType workFlowTypeDocumentType = WorkFlowQueryProvider.WorkFlowTypeDocumentTypeQuery.GetByWorkFlowTypeID_DocumentTypeID(workFlow.WorkFlowType.WorkFlowTypeID, workFlow.Document.DocumentType.DocumentTypeID);

            string serviceName = workFlowTypeDocumentType.ServiceName;
            string stateName   = workFlow.CurrentState.Name;
            object finder      = ContextRegistry.GetContext().GetObject(serviceName);

            MethodInfo methodInfo = finder.GetType().GetMethod(string.Format("CanDelete{0}", stateName));
            bool       canDelete  = false;

            if (methodInfo != null)
            {
                canDelete = (bool)methodInfo.Invoke(finder, new object[] { workFlowID });
            }

            return(canDelete);
        }
示例#5
0
        public IList <object> GetVisibleFields(long workFlowID)
        {
            DTO.WorkFlow             workFlow = WorkFlowQueryProvider.WorkFlowQuery.FindByIdentity(workFlowID);
            WorkFlowTypeDocumentType workFlowTypeDocumentType = WorkFlowQueryProvider.WorkFlowTypeDocumentTypeQuery.GetByWorkFlowTypeID_DocumentTypeID(workFlow.WorkFlowType.WorkFlowTypeID, workFlow.Document.DocumentType.DocumentTypeID);

            string serviceName = workFlowTypeDocumentType.ServiceName;
            string stateName   = workFlow.CurrentState.Name;
            int    stateID     = workFlow.CurrentState.WorkFlowStateID;
            object finder      = ContextRegistry.GetContext().GetObject(serviceName);

            IList <object> visibleFileds = new List <object>();
            MethodInfo     methodInfo;

            methodInfo = finder.GetType().GetMethod(string.Format("GetVisibleFieldsFor{0}", stateName));
            if (methodInfo != null)
            {
                visibleFileds = (IList <object>)methodInfo.Invoke(finder, new object[] { workFlowID });
            }

            return(visibleFileds);
        }
示例#6
0
        public void NotifyEventFromInternal(long workFlowID, string eventName, object eventData)
        {
            string stateName = string.Empty;

            try
            {
                DTO.WorkFlow             workFlow = WorkFlowQueryProvider.WorkFlowQuery.FindByIdentity(workFlowID);
                WorkFlowTypeDocumentType workFlowTypeDocumentType = WorkFlowQueryProvider.WorkFlowTypeDocumentTypeQuery.GetByWorkFlowTypeID_DocumentTypeID(workFlow.WorkFlowType.WorkFlowTypeID, workFlow.Document.DocumentType.DocumentTypeID);

                string serviceName = workFlowTypeDocumentType.ServiceName;
                stateName = workFlow.CurrentState.Name;
                object finder = ContextRegistry.GetContext().GetObject(serviceName);

                //Call method On{EventName}{StateName} ex. OnSubmitDraft , OnApproveWaitAR ..
                MethodInfo methodInfo = finder.GetType().GetMethod(string.Format("On{0}{1}", eventName, stateName));
                if (methodInfo != null)
                {
                    string signal = (string)methodInfo.Invoke(finder, new object[] { workFlowID, eventData });

                    //Call method OnExit{StateName}
                    methodInfo = finder.GetType().GetMethod(string.Format("On{0}{1}", "Exit", stateName));
                    if (methodInfo != null)
                    {
                        methodInfo.Invoke(finder, new object[] { workFlowID });
                    }

                    //Get NextState in Transition
                    WorkFlowState nextState = WorkFlowQueryProvider.WorkFlowStateTransitionQuery.GetNextState(workFlow.CurrentState.WorkFlowStateID, signal);
                    if (nextState != null)
                    {
                        if (workFlow.CurrentState.Ordinal > nextState.Ordinal)
                        {
                            this.ResetActiveResponse(workFlowID, nextState.Ordinal);
                        }

                        this.UpdateState(workFlowID, nextState);

                        this.ReCalculateWorkFlowPermission(workFlowID);

                        //Call method OnEnter{NextStateName}
                        methodInfo = finder.GetType().GetMethod(string.Format("On{0}{1}", "Enter", nextState.Name));
                        if (methodInfo != null)
                        {
                            methodInfo.Invoke(finder, new object[] { workFlowID });
                        }
                    }
                }
                else
                {
                    Spring.Validation.ValidationErrors errors = new Spring.Validation.ValidationErrors();
                    errors.AddError("WorkFlow.Error", new Spring.Validation.ErrorMessage("WorkFlow_Error_Invalid_Document_State")); //สถานะของเอกสารไม่ถูกต้อง เอกสารนี้อาจกำลังถูกปรับปรุงโดยผู้ใช้งานท่านอื่น
                    throw new ServiceValidationException(errors);
                }
            }
            catch (ServiceValidationException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                if (ex.InnerException != null && ex.InnerException.GetType().Equals(typeof(ServiceValidationException)))
                {
                    throw ex;
                }
                else
                {
                    if (logger != null)
                    {
                        logger.Error(string.Format("WorkflowID: {0}, EventName: {1}, StateName: {2}", workFlowID, eventName, stateName));
                        logger.Error(string.Format("WorkFlowService.NotifyEventFromInternal(workflowID) : {0}", workFlowID, ex.StackTrace));
                    }
                    Spring.Validation.ValidationErrors errors = new Spring.Validation.ValidationErrors();
                    errors.AddError("WorkFlow.Error", new Spring.Validation.ErrorMessage("WorkFlow_Error_Problem_Occurred")); //ระบบมีปัญหาในการประมวลผล กรุณาลองอีกครั้งหนึ่ง
                    throw new ServiceValidationException(errors);
                }
            }
        }