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