Esempio n. 1
0
        /// <summary>
        /// 设置表单数据
        /// </summary>
        /// <param name="op"></param>
        /// <param name="execComment"></param>
        /// <param name="reverse"></param>
        public void SetFormPhase(S_WF_InsFlow flow, S_WF_InsDefStep nextStep, string completeStepName)
        {
            try
            {
                if (string.IsNullOrEmpty(flow.FormInstanceID))
                {
                    throw new FlowException("表单未找到。");
                }

                //string connName = GetFormConnName();
                //string tableName = GetFormTableName();
                string connName  = this.S_WF_InsDefFlow.ConnName;
                string tableName = this.S_WF_InsDefFlow.TableName;

                SQLHelper sqlHelper = SQLHelper.CreateSqlHelper(connName);

                string    sql = string.Format("select * from {0} where ID='{1}'", tableName, flow.FormInstanceID);
                DataTable dt  = sqlHelper.ExecuteDataTable(sql);

                string flowPhase = "";
                if (nextStep != null)
                {
                    flowPhase = nextStep.Phase;
                }
                else if (flow.CompleteTime != null)
                {
                    flowPhase = FlowTaskStatus.Complete.ToString();
                }

                sql = "";
                if (flowPhase != "")
                {
                    if (dt.Columns.Contains("FlowPhase") || dt.Columns.Contains("FLOWPHASE")) //FLOWPHASE为了兼容Oracle
                    {
                        var sqlUpdate = string.Format(" update {0} set FlowPhase='{1}' where ID='{2}'", tableName, flowPhase, flow.FormInstanceID);
                        sql += sqlUpdate;
                        if (Config.Constant.IsOracleDb)
                        {
                            sqlHelper.ExecuteNonQuery(sqlUpdate);
                        }
                    }
                }
                if (dt.Columns.Contains("StepName") || dt.Columns.Contains("STEPNAME"))   //STEPNAME为了兼容Oracle
                {
                    string stepName = "";
                    if (nextStep != null)
                    {
                        stepName = nextStep.Name;
                    }
                    if (dt.Rows.Count > 0)
                    {
                        stepName += "," + dt.Rows[0]["StepName"].ToString();
                    }
                    stepName = string.Join(",", stepName.Split(',').Distinct().Where(c => c != completeStepName && c != "").ToArray()).Trim(',');

                    //流程完成后环节清空
                    if (flow.CompleteTime != null)
                    {
                        stepName = "结束";
                    }
                    flow.CurrentStep = stepName;

                    var sqlUpdate = string.Format(" update {0} set StepName='{1}' where ID='{2}'", tableName, stepName, flow.FormInstanceID);
                    sql += sqlUpdate;
                    if (Config.Constant.IsOracleDb)
                    {
                        sqlHelper.ExecuteNonQuery(sqlUpdate);
                    }
                }

                if (sql != "" && !Config.Constant.IsOracleDb)
                {
                    sqlHelper.ExecuteNonQuery(sql);
                }
            }
            catch (Exception ex)
            {
                string msg = "表单表必须有字段FlowPhase!";
                throw new FlowException(msg, ex);
            }
        }
Esempio n. 2
0
        public S_WF_InsDefFlow GetInsDefFlow()
        {
            try
            {
                if (this.AlreadyReleased != "1" || !this.ModifyTime.HasValue)
                {
                    throw new FlowException("流程定义尚未发布!");
                }

                var entities   = FormulaHelper.GetEntities <WorkflowEntities>();
                var insDefFlow = entities.S_WF_InsDefFlow.Where(c => c.DefFlowID == this.ID && c.ModifyTime.HasValue && c.ModifyTime.Value == this.ModifyTime.Value).SingleOrDefault();

                if (insDefFlow == null)
                {
                    lock (padlock)
                    {
                        insDefFlow = entities.S_WF_InsDefFlow.Where(c => c.DefFlowID == this.ID && c.ModifyTime.HasValue && c.ModifyTime.Value == this.ModifyTime.Value).SingleOrDefault();
                        if (insDefFlow == null)
                        {
                            insDefFlow = new S_WF_InsDefFlow();
                            FormulaHelper.UpdateModel(insDefFlow, this);
                            insDefFlow.ID        = GetInsIDs(this.ID);
                            insDefFlow.DefFlowID = this.ID;

                            foreach (var step in this.S_WF_DefStep)
                            {
                                S_WF_InsDefStep insStep = new S_WF_InsDefStep();
                                FormulaHelper.UpdateModel(insStep, step);
                                insStep.ID             = GetInsIDs(step.ID);
                                insStep.DefStepID      = step.ID;
                                insStep.InsDefFlowID   = GetInsIDs(step.DefFlowID);
                                insStep.WaitingStepIDs = GetInsIDs(step.WaitingStepIDs);
                                insStep.EmptyToStep    = GetInsIDs(step.EmptyToStep);

                                insDefFlow.S_WF_InsDefStep.Add(insStep);
                            }

                            foreach (var routing in this.S_WF_DefRouting)
                            {
                                S_WF_InsDefRouting insRouting = new S_WF_InsDefRouting();
                                FormulaHelper.UpdateModel(insRouting, routing);
                                insRouting.EndID                    = GetInsIDs(routing.EndID);
                                insRouting.ID                       = GetInsIDs(routing.ID);
                                insRouting.DefRoutingID             = routing.ID;
                                insRouting.InsDefFlowID             = GetInsIDs(routing.DefFlowID);
                                insRouting.InsDefStepID             = GetInsIDs(routing.DefStepID);
                                insRouting.UserIDsFromStep          = GetInsIDs(routing.UserIDsFromStep);
                                insRouting.UserIDsFromStepSender    = GetInsIDs(routing.UserIDsFromStepSender);
                                insRouting.UserIDsFromStepExec      = GetInsIDs(routing.UserIDsFromStepExec);
                                insRouting.MsgUserIDsFromStep       = GetInsIDs(routing.MsgUserIDsFromStep);
                                insRouting.MsgUserIDsFromStepSender = GetInsIDs(routing.MsgUserIDsFromStepSender);
                                insRouting.MsgUserIDsFromStepExec   = GetInsIDs(routing.MsgUserIDsFromStepExec);

                                var insStep = insDefFlow.S_WF_InsDefStep.Where(c => c.ID == insRouting.InsDefStepID).SingleOrDefault();
                                insStep.S_WF_InsDefRouting.Add(insRouting);
                            }

                            //更新流程图
                            string flowView = insDefFlow.ViewConfig;
                            foreach (string id in idDic.Keys)
                            {
                                flowView = flowView.Replace(id, idDic[id]);
                            }
                            insDefFlow.ViewConfig = flowView;

                            entities.S_WF_InsDefFlow.Add(insDefFlow);
                            entities.SaveChanges();
                        }
                    }
                }
                return(insDefFlow);
            }
            catch (Exception ex)
            {
                throw new FlowException(ex.Message);
            }
        }
Esempio n. 3
0
        private void StartFlowExe(Dictionary <string, object> logicDef)
        {
            var settings = logicDef.GetValue("Settings");

            if (String.IsNullOrEmpty(settings))
            {
                return;
            }
            var    settingDic     = JsonHelper.ToObject(settings);
            var    wfEntities     = FormulaHelper.GetEntities <WorkflowEntities>();
            var    defFlow        = wfEntities.S_WF_DefFlow.Find(settingDic.GetValue("FlowID"));
            string startTaskDefID = settingDic.GetValue("StartTaskID");

            if (defFlow == null)
            {
                throw new BusinessException("没有找到ID为【" + settingDic.GetValue("FlowID") + "】的流程定义,无法在流程执行过程中启动其他流程");
            }

            #region 确认表单定义对象
            var formCode     = String.IsNullOrEmpty(settingDic.GetValue("FormCode")) ? defFlow.Code : settingDic.GetValue("FormCode");
            var baseEntities = FormulaHelper.GetEntities <Base.Logic.Domain.BaseEntities>();
            var tmplForm     = baseEntities.S_UI_Form.FirstOrDefault(c => c.Code == formCode);
            #endregion

            var defStep = defFlow.S_WF_DefStep.FirstOrDefault(c => c.ID == startTaskDefID);
            if (defStep == null)
            {
                throw new BusinessException("没有找到指定的定义实例,无法启动工作流");
            }

            var user = FormulaHelper.GetUserInfo();

            #region 默认创建数据实例
            string sql            = "select * from {0} where ID='{1}'";
            var    flowIns        = this.S_WF_InsDefFlow.S_WF_InsFlow.FirstOrDefault();
            var    orialDt        = SQLHelper.CreateSqlHelper(this.S_WF_InsDefFlow.ConnName).ExecuteDataTable(String.Format(sql, this.S_WF_InsDefFlow.TableName, flowIns.FormInstanceID));
            var    orialDic       = new Dictionary <string, object>();
            var    formInstanceID = FormulaHelper.CreateGuid();
            var    dic            = new Dictionary <string, object>();
            dic.SetValue("CreateUserID", user.UserID);
            dic.SetValue("CreateUser", user.UserName);
            dic.SetValue("OrgID", user.UserOrgID);
            if (settingDic.ContainsKey("DataFormat") && settingDic["DataFormat"] != null)
            {
                var dataFormat = new List <Dictionary <string, object> >();
                if (settingDic["DataFormat"] is List <Dictionary <string, object> > || settingDic["DataFormat"] is Array)
                {
                    dataFormat = settingDic["DataFormat"] as List <Dictionary <string, object> >;
                }
                else if (!String.IsNullOrEmpty(settingDic.GetValue("DataFormat")))
                {
                    dataFormat = JsonHelper.ToList(settingDic.GetValue("DataFormat"));
                }

                #region 根据表单自定义配置来设定默认值
                if (tmplForm != null)
                {
                    var uiFO = FormulaHelper.CreateFO <Base.Logic.BusinessFacade.UIFO>();
                    Dictionary <string, DataTable> defaultValueRows = uiFO.GetDefaultValueDic(tmplForm.DefaultValueSettings, orialDt.Rows[0]);
                    var items = JsonHelper.ToObject <List <Base.Logic.Model.UI.Form.FormItem> >(tmplForm.Items);
                    items.Where(c => !string.IsNullOrEmpty(c.DefaultValue)).ToList().ForEach(d =>
                    {
                        if (d.ItemType == "SubTable")
                        {
                            //子表
                            dic.SetValue(d.Code, uiFO.GetDefaultValue(d.Code, d.DefaultValue, defaultValueRows));
                        }
                        else if ((d.ItemType == "ButtonEdit" || d.ItemType == "ComboBox") && d.DefaultValue.Split(',').Count() == 2)
                        {
                            //键值控件
                            string v1 = uiFO.GetDefaultValue(d.Code, d.DefaultValue.Split(',')[0], defaultValueRows);
                            string v2 = uiFO.GetDefaultValue(d.Code, d.DefaultValue.Split(',')[1], defaultValueRows);
                            if (!string.IsNullOrEmpty(v1) && v1.Contains('{') == false)
                            {
                                dic.SetValue(d.Code, v1);
                            }
                            if (!string.IsNullOrEmpty(v2) && v2.Contains('{') == false)
                            {
                                var fieldName = "";
                                if (Config.Constant.IsOracleDb)
                                {
                                    fieldName = d.Code + "NAME";
                                    if (!String.IsNullOrWhiteSpace(d.Settings))
                                    {
                                        var fieldSettings = JsonHelper.ToObject(d.Settings);
                                        var txtName       = fieldSettings.GetValue("textName");
                                        if (!String.IsNullOrEmpty(txtName))
                                        {
                                            fieldName = txtName;
                                        }
                                    }
                                }
                                else
                                {
                                    fieldName = d.Code + "Name";
                                    if (!String.IsNullOrWhiteSpace(d.Settings))
                                    {
                                        var fieldSettings = JsonHelper.ToObject(d.Settings);
                                        var txtName       = fieldSettings.GetValue("textName");
                                        if (!String.IsNullOrEmpty(txtName))
                                        {
                                            fieldName = txtName;
                                        }
                                    }
                                }
                                dic.SetValue(fieldName, v2);
                            }
                        }
                        else
                        {
                            //单值控件
                            string v = uiFO.GetDefaultValue(d.Code, d.DefaultValue, defaultValueRows);
                            if (!string.IsNullOrEmpty(v) && v.Contains('{') == false)
                            {
                                dic.SetValue(d.Code, v);
                            }
                        }
                    });
                }
                #endregion

                #region 设置当前表单内的默认值
                if (orialDt.Rows.Count > 0)
                {
                    var sourceRow = orialDt.Rows[0];
                    orialDic = FormulaHelper.DataRowToDic(sourceRow);
                    var fillFields = dataFormat.Where(c => !String.IsNullOrEmpty(c.GetValue("DefaultValue"))).ToList();
                    foreach (var field in fillFields)
                    {
                        Regex  reg             = new Regex("\\{[0-9a-zA-Z_\\.]*\\}");
                        string defaultValueDef = field.GetValue("DefaultValue");
                        string result          = reg.Replace(defaultValueDef, (Match m) =>
                        {
                            string value = m.Value.Trim('{', '}');
                            if (sourceRow != null && sourceRow.Table.Columns.Contains(value))
                            {
                                return(sourceRow[value].ToString());
                            }
                            switch (value)
                            {
                            case Formula.Constant.CurrentUserID:
                                return(user.UserID);

                            case Formula.Constant.CurrentUserName:
                                return(user.UserName);

                            case Formula.Constant.CurrentUserOrgID:
                                return(user.UserOrgID);

                            case Formula.Constant.CurrentUserOrgCode:
                                return(user.UserOrgCode);

                            case Formula.Constant.CurrentUserOrgName:
                                return(user.UserOrgName);

                            case Formula.Constant.CurrentUserPrjID:
                                return(user.UserPrjID);

                            case Formula.Constant.CurrentUserPrjName:
                                return(user.UserPrjName);

                            case "CurrentUserCorpID":
                                return(user.UserCompanyID);

                            case "CurrentUserCorpName":
                                return(user.UserCompanyName);

                            case "CurrentTime":
                                return(DateTime.Now.ToString());

                            case "CurrentDate":
                                return(DateTime.Now.Date.ToString("yyyy-MM-dd"));

                            case "CurrentYear":
                                return(DateTime.Now.Year.ToString());

                            case "CurrentMonth":
                                return(DateTime.Now.Month.ToString());

                            case "CurrentQuarter":
                                return(((DateTime.Now.Month + 2) / 3).ToString());

                            case "CurrentUserOrgFullID":
                                return(user.UserFullOrgID);

                            default:
                                return("");
                            }
                        });
                        dic.SetValue(field.GetValue("ColumnName"), result);
                    }
                }
                #endregion
            }
            var db = SQLHelper.CreateSqlHelper(defFlow.ConnName);
            dic.InsertDB(db, defFlow.TableName, formInstanceID);
            #endregion

            int maxReceiverCount = 50;
            if (!string.IsNullOrEmpty(System.Configuration.ConfigurationManager.AppSettings["Flow_ReceiverCount"]))
            {
                maxReceiverCount = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["Flow_ReceiverCount"]);
            }

            #region 获取工作流环节的指定执行人
            var userIDs = settingDic.GetValue("UserIDs");
            if (String.IsNullOrEmpty(userIDs))
            {
                userIDs = orialDic.GetValue(settingDic.GetValue("UserIDsFromField"));
            }
            if (String.IsNullOrEmpty(userIDs))
            {
                var roleIDs = settingDic.GetValue("RoleIDs");
                var orgIDs  = settingDic.GetValue("OrgIDs");
                if (String.IsNullOrEmpty(roleIDs))
                {
                    roleIDs = orialDic.GetValue(settingDic.GetValue("RoleIDsFromField"));
                }
                if (String.IsNullOrEmpty(orgIDs))
                {
                    orgIDs = orialDic.GetValue(settingDic.GetValue("OrgIDFromField"));
                }
                if (!string.IsNullOrEmpty(roleIDs))
                {
                    userIDs = FormulaHelper.GetService <IRoleService>().GetUserIDsInRoles(roleIDs, orgIDs);
                    var prjRoleUser = PrjRoleExt.GetRoleUserIDs(roleIDs, orgIDs);
                    if (!string.IsNullOrEmpty(prjRoleUser))
                    {
                        userIDs = (prjRoleUser + "," + userIDs).Trim(',');
                    }
                }
                else
                {
                    userIDs = FormulaHelper.GetService <IOrgService>().GetUserIDsInOrgs(orgIDs);
                }
            }
            if (String.IsNullOrEmpty(userIDs))
            {
                throw new BusinessValidationException("没有找到环节执行人员,无法启动流程");
            }
            if (userIDs.Split(',').Length > maxReceiverCount)
            {
                throw new FlowException("任务执行人不能超过" + maxReceiverCount + "个");
            }
            #endregion

            var fo = FormulaHelper.CreateFO <Workflow.Logic.BusinessFacade.FlowFO>();

            var insDefFlow = defFlow.GetInsDefFlow();
            var insFlow    = insDefFlow.CreateFlow(formInstanceID, user.UserID, user.UserName);

            //获取流程定义实例首环节
            string          Inital = StepTaskType.Inital.ToString();
            S_WF_InsDefStep insDefStep = null; bool startWithInital = false;
            var             insStartStep = insDefFlow.S_WF_InsDefStep.Where(c => c.Type == Inital).SingleOrDefault();
            if (insStartStep.DefStepID == startTaskDefID)
            {
                insDefStep      = insStartStep;
                startWithInital = true;
            }
            else
            {
                var stepIds = insStartStep.S_WF_InsDefRouting.Select(c => c.EndID);
                insDefStep = insDefFlow.S_WF_InsDefStep.Where(c => stepIds.Contains(c.ID) && c.DefStepID == startTaskDefID).FirstOrDefault();
            }
            if (insDefStep == null)
            {
                throw new BusinessException("没有找到指定的定义实例,无法启动工作流");
            }
            //创建首环节任务
            var startUserID = userIDs.Split(',')[0];
            var insTask     = insStartStep.CreateTask(insFlow, null, null, startUserID, FormulaHelper.GetService <IUserService>().GetUserNames(startUserID), "", "", "");
            //创建任务执行明细
            var taskExec = insTask.CreateTaskExec().FirstOrDefault();
            if (!startWithInital)
            {
                var insDefRouting = insStartStep.S_WF_InsDefRouting.Where(c => c.EndID == insDefStep.ID).FirstOrDefault();
                fo.ExecTask(taskExec.ID, insDefRouting.Code, userIDs, UserNames, "");
            }
        }