using System; using System.Collections.Generic; using System.Text; using System.Linq; using System.Drawing; using System.Collections; //using Oracle.ManagedDataAccess.Client; using System.Data.OracleClient; namespace RoadFlow.Platform { public class WorkFlow { private RoadFlow.Data.Interface.IWorkFlow dataWorkFlow; public WorkFlow() { this.dataWorkFlow = Data.Factory.Factory.GetWorkFlow(); } /// /// 新增 /// public int Add(RoadFlow.Data.Model.WorkFlow model) { return dataWorkFlow.Add(model); } /// /// 更新 /// public int Update(RoadFlow.Data.Model.WorkFlow model) { return dataWorkFlow.Update(model); } /// /// 查询所有记录 /// public List GetAll() { return dataWorkFlow.GetAll(); } /// /// 查询单条记录 /// public RoadFlow.Data.Model.WorkFlow Get(Guid id) { return dataWorkFlow.Get(id); } /// /// 删除 /// public int Delete(Guid id) { return dataWorkFlow.Delete(id); } /// /// 查询记录条数 /// public long GetCount() { return dataWorkFlow.GetCount(); } /// /// 查询所有类型 /// public List GetAllTypes() { return dataWorkFlow.GetAllTypes(); } /// /// 得到所有类型的下拉选择项 /// /// public string GetAllTypesOptions(string value="") { var types = GetAllTypes(); StringBuilder options = new StringBuilder(); foreach (var type in types) { options.AppendFormat("", type, type == value ? "selected=\"selected\"" : ""); } return options.ToString(); } /// /// 得到流程状态显示 /// /// /// public string GetStatusTitle(int status) { string title = string.Empty; switch (status) { case 1: title = "设计中"; break; case 2: title = "已安装"; break; case 3: title = "已卸载"; break; case 4: title = "已删除"; break; case 5: title = "等待他人处理"; break; } return title; } /// /// 保存一个流程 /// /// /// 返回1 表示成功 其它为具体错误信息 public string SaveFlow(string jsonString) { var jsonData = LitJson.JsonMapper.ToObject(jsonString); string id = jsonData["id"].ToString(); string name = jsonData["name"].ToString(); string type = jsonData["type"].ToString(); Guid flowID; if (!id.IsGuid(out flowID)) { return "请先新建或打开流程!"; } else if (name.IsNullOrEmpty()) { return "流程名称不能为空!"; } else { RoadFlow.Platform.WorkFlow bwf = new RoadFlow.Platform.WorkFlow(); RoadFlow.Data.Model.WorkFlow wf = bwf.Get(flowID); bool isAdd = false; if (wf == null) { wf = new RoadFlow.Data.Model.WorkFlow(); isAdd = true; wf.ID = flowID; wf.CreateDate = RoadFlow.Utility.DateTimeNew.Now; wf.CreateUserID = RoadFlow.Platform.Users.CurrentUserID; wf.Status = 1; } wf.DesignJSON = jsonString; wf.InstanceManager = jsonData["instanceManager"].ToString(); wf.Manager = jsonData["manager"].ToString(); wf.Name = name.Trim(); wf.Type = type.IsGuid() ? type.ToGuid() : new Dictionary().GetIDByCode("FlowTypes"); try { if (isAdd) { bwf.Add(wf); } else { bwf.Update(wf); } return "1"; } catch (Exception err) { return err.Message; } } } /// /// 安装一个流程 /// /// /// 是否是mvc程序,用于区分应用程序库连接 /// 返回1 表示成功 其它为具体错误信息 public string InstallFlow(string jsonString, bool isMvc = true) { string saveInfo = SaveFlow(jsonString); if ("1" != saveInfo) { return saveInfo; } string errMsg; RoadFlow.Data.Model.WorkFlowInstalled wfInstalled = GetWorkFlowRunModel(jsonString, out errMsg); if (wfInstalled == null) { return errMsg; } else { RoadFlow.Data.Model.WorkFlow wf = dataWorkFlow.Get(wfInstalled.ID); if (wf == null) { return "流程实体为空"; } else { using (System.Transactions.TransactionScope scope = new System.Transactions.TransactionScope()) { wf.InstallDate = wfInstalled.InstallTime; wf.InstallUserID = wfInstalled.InstallUser.ToGuid(); wf.RunJSON = wfInstalled.RunJSON; wf.Status = 2; dataWorkFlow.Update(wf); wfInstalled.Status = 2; #region 添加到应用程序库 RoadFlow.Platform.AppLibrary bappLibrary = new AppLibrary(); RoadFlow.Data.Model.AppLibrary app = bappLibrary.GetByCode(wfInstalled.ID.ToString()); bool isAdd = false; if (app == null) { isAdd = true; app = new RoadFlow.Data.Model.AppLibrary(); app.ID = Guid.NewGuid(); } app.Address = isMvc ? "WorkFlowRun/Index" : "Platform/WorkFlowRun/Default.aspx"; app.Code = wfInstalled.ID.ToString(); app.Note = "流程应用"; app.OpenMode = 0; app.Params = "flowid=" + wfInstalled.ID.ToString(); app.Title = wfInstalled.Name; app.Type = wfInstalled.Type.IsGuid() ? wfInstalled.Type.ToGuid() : new Dictionary().GetIDByCode("FlowTypes"); if (isAdd) { bappLibrary.Add(app); } else { bappLibrary.Update(app); } bappLibrary.ClearCache(); new RoadFlow.Platform.RoleApp().ClearAllDataTableCache(); #endregion RoadFlow.Cache.IO.Opation.Set(getCacheKey(wfInstalled.ID), wfInstalled); scope.Complete(); return "1"; } } } } /// /// 流程另存为 /// /// 流程ID /// 新流程名称 /// 返回另存后的流程实体 public RoadFlow.Data.Model.WorkFlow SaveAs(Guid flowID, string newName) { RoadFlow.Data.Model.WorkFlow wf = dataWorkFlow.Get(flowID); if (wf == null || newName.IsNullOrEmpty()) { return wf; } else { wf.ID = Guid.NewGuid(); wf.Name = newName.Trim(); wf.CreateDate = RoadFlow.Utility.DateTimeNew.Now; wf.CreateUserID = Platform.Users.CurrentUserID; wf.InstallDate = null; wf.InstallUserID = null; wf.RunJSON = null; wf.Status = 1; if (!wf.DesignJSON.IsNullOrEmpty()) { LitJson.JsonData json = LitJson.JsonMapper.ToObject(wf.DesignJSON); json["id"] = wf.ID.ToString(); json["name"] = wf.Name; LitJson.JsonData steps = json["steps"]; LitJson.JsonData lines = json["lines"]; foreach (LitJson.JsonData step in steps) { string oldStepid = step["id"].ToString(); string stepid = Guid.NewGuid().ToString(); step["id"] = stepid; foreach (LitJson.JsonData line in lines) { if (line["from"].ToString() == oldStepid) { line["from"] = stepid; } if (line["to"].ToString() == oldStepid) { line["to"] = stepid; } } } foreach (LitJson.JsonData line in lines) { line["id"] = Guid.NewGuid().ToString(); } wf.DesignJSON = json.ToJson(); } dataWorkFlow.Add(wf); } return wf; } /// /// 得到一个流程的缓存键 /// /// /// private string getCacheKey(Guid flowID) { return string.Concat(RoadFlow.Utility.Keys.CacheKeys.WorkFlowInstalled_.ToString(), flowID.ToString("N")); } /// /// 得到流程运行时实体 /// /// 流程ID /// public RoadFlow.Data.Model.WorkFlowInstalled GetWorkFlowRunModel(string flowID, bool cache = true) { Guid fid; return flowID.IsGuid(out fid) ? GetWorkFlowRunModel(fid, cache) : null; } /// /// 得到流程运行时实体 /// /// 流程ID /// public RoadFlow.Data.Model.WorkFlowInstalled GetWorkFlowRunModel(Guid flowID, bool cache = true) { if (!cache) { return getWorkFlowRunFromDesign(flowID); } else { string key = getCacheKey(flowID); object obj = RoadFlow.Cache.IO.Opation.Get(key); if (obj == null) { var wfi = getWorkFlowRunFromDesign(flowID); RoadFlow.Cache.IO.Opation.Set(key, wfi); return wfi; } else { return obj as RoadFlow.Data.Model.WorkFlowInstalled; } } } private RoadFlow.Data.Model.WorkFlowInstalled getWorkFlowRunFromDesign(Guid flowID) { var wf = Get(flowID); if (wf == null || wf.RunJSON.IsNullOrEmpty()) { return null; } string msg; var wfi = GetWorkFlowRunModel(wf.RunJSON, out msg); return wfi; } /// /// 清除一个流程的运行时实体缓存 /// /// public void ClearWorkFlowCache(Guid flowID) { string key = getCacheKey(flowID); RoadFlow.Cache.IO.Opation.Remove(key); } /// /// 刷新一个流程运行时实体 /// /// public void RefreshWrokFlowCache(Guid flowID) { string key = getCacheKey(flowID); RoadFlow.Cache.IO.Opation.Set(key, GetWorkFlowRunModel(flowID, false)); } /// /// 得到一个流程运行时实体 /// /// 流程设计json字符串 /// 流程已安装实体类(如果返回为空则表示验证失败,流程设计不完整) public RoadFlow.Data.Model.WorkFlowInstalled GetWorkFlowRunModel(string jsonString, out string errMsg) { errMsg = ""; RoadFlow.Data.Model.WorkFlowInstalled wfInstalled = new RoadFlow.Data.Model.WorkFlowInstalled(); var json = LitJson.JsonMapper.ToObject(jsonString); #region 载入基本信息 string id = json["id"].ToString(); if (!id.IsGuid()) { errMsg = "流程ID错误"; return null; } else { wfInstalled.ID = id.ToGuid(); } string name = json["name"].ToString(); if (name.IsNullOrEmpty()) { errMsg = "流程名称为空"; return null; } else { wfInstalled.Name = name.Trim(); } string type = json["type"].ToString(); wfInstalled.Type = type.IsNullOrEmpty() ? new Dictionary().GetIDByCode("FlowTypes").ToString() : type.Trim(); string manager = json["manager"].ToString(); if (manager.IsNullOrEmpty()) { errMsg = "流程管理者为空"; return null; } else { wfInstalled.Manager = manager; } string instanceManager = json["instanceManager"].ToString(); if (instanceManager.IsNullOrEmpty()) { errMsg = "流程实例管理者为空"; return null; } else { wfInstalled.Manager = instanceManager; } wfInstalled.RemoveCompleted = json["removeCompleted"].ToString().ToInt(); wfInstalled.Debug = json["debug"].ToString().ToInt(); wfInstalled.DebugUsers = new RoadFlow.Platform.Organize().GetAllUsers(json["debugUsers"].ToString()); wfInstalled.Note = json["note"].ToString(); wfInstalled.FlowType = json.ContainsKey("flowType") ? json["flowType"].ToString().ToInt() : 0; List dataBases = new List(); var dbs = json["databases"]; if (dbs.IsArray) { foreach (LitJson.JsonData db in dbs) { dataBases.Add(new RoadFlow.Data.Model.WorkFlowInstalledSub.DataBases() { LinkID = db["link"].ToString().ToGuid(), LinkName = db["linkName"].ToString(), Table = db["table"].ToString(), PrimaryKey = db["primaryKey"].ToString() }); } } wfInstalled.DataBases = dataBases; var titleField = json["titleField"]; if (titleField.IsObject) { wfInstalled.TitleField = new RoadFlow.Data.Model.WorkFlowInstalledSub.TitleField() { Field = titleField["field"].ToString(), LinkID = titleField["link"].ToString().ToGuid(), LinkName = "", Table = titleField["table"].ToString() }; } #endregion #region 载入步骤信息 List stepsList = new List(); LitJson.JsonData steps = json["steps"]; if (steps.IsArray) { foreach (LitJson.JsonData step in steps) { #region 行为 LitJson.JsonData behavior = step["behavior"]; RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Behavior behavior1 = new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Behavior(); if (behavior.IsObject) { behavior1.BackModel = behavior["backModel"].ToString().ToInt(); behavior1.BackStepID = behavior["backStep"].ToString().ToGuid(); behavior1.BackType = behavior["backType"].ToString().ToInt(); behavior1.DefaultHandler = behavior["defaultHandler"].ToString(); behavior1.FlowType = behavior["flowType"].ToString().ToInt(); behavior1.HandlerStepID = behavior["handlerStep"].ToString().ToGuid(); behavior1.HandlerType = behavior["handlerType"].ToString().ToInt(); behavior1.HanlderModel = behavior["hanlderModel"].ToString().ToInt(3); behavior1.Percentage = behavior["percentage"].ToString().IsDecimal() ? behavior["percentage"].ToString().ToDecimal() : decimal.MinusOne; behavior1.RunSelect = behavior["runSelect"].ToString().ToInt(); behavior1.SelectRange = behavior["selectRange"].ToString(); behavior1.ValueField = behavior["valueField"].ToString(); behavior1.Countersignature = behavior.ContainsKey("countersignature") ? behavior["countersignature"].ToString().ToInt() : 0; behavior1.CountersignaturePercentage = behavior.ContainsKey("countersignaturePercentage") ? behavior["countersignaturePercentage"].ToString().ToDecimal() : decimal.MinusOne; behavior1.SubFlowStrategy = behavior.ContainsKey("subflowstrategy") ? behavior["subflowstrategy"].ToString().ToInt() : int.MinValue; behavior1.CopyFor = behavior.ContainsKey("copyFor") ? behavior["copyFor"].ToString() : ""; } #endregion #region 按钮 LitJson.JsonData buttons = step["buttons"]; List buttionList = new List(); if (buttons.IsArray) { foreach (LitJson.JsonData button in buttons) { string butID = button["id"].ToString(); if (butID.IsGuid()) { var buttonModel = new WorkFlowButtons().Get(butID.ToGuid(), true); if (buttonModel == null) { continue; } buttionList.Add(new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button() { ID = butID, Note = buttonModel.Note.IsNullOrEmpty() ? "" : buttonModel.Note.Replace("\"", "'"), Sort = button["sort"].ToString().ToInt() }); } else { buttionList.Add(new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button() { ID = butID, Note = "", Sort = button["sort"].ToString().ToInt() }); } } } if (buttionList.Count == 0) { errMsg = string.Format("步骤[{0}]未设置按钮", step["name"].ToString()); return null; } #endregion #region 事件 LitJson.JsonData event1 = step["event"]; RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Event event2 = new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Event(); if (event1.IsObject) { event2.BackAfter = event1["backAfter"].ToString(); event2.BackBefore = event1["backBefore"].ToString(); event2.SubmitAfter = event1["submitAfter"].ToString(); event2.SubmitBefore = event1["submitBefore"].ToString(); event2.SubFlowActivationBefore = event1.ContainsKey("subflowActivationBefore") ? event1["subflowActivationBefore"].ToString() : ""; event2.SubFlowCompletedBefore = event1.ContainsKey("subflowCompletedBefore") ? event1["subflowCompletedBefore"].ToString() : ""; } #endregion #region 表单 LitJson.JsonData forms = step["forms"]; List formList = new List(); if (forms.IsArray) { foreach (LitJson.JsonData form in forms) { formList.Add(new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Form() { ID = form["id"].ToString().ToGuid(), Name = form["name"].ToString(), Sort = form["srot"].ToString().ToInt() }); } } if (formList.Count == 0) { errMsg = string.Format("步骤[{0}]未设置表单", step["name"].ToString()); return null; } #endregion #region 字段状态 LitJson.JsonData fieldStatus = step["fieldStatus"]; List fieldStatusList = new List(); if (fieldStatus.IsArray) { foreach (LitJson.JsonData field in fieldStatus) { fieldStatusList.Add(new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.FieldStatus() { Check = field["check"].ToString().ToInt(), Field = field["field"].ToString(), Status1 = field["status"].ToString().ToInt() }); } } #endregion #region 坐标/基本信息 LitJson.JsonData position = step["position"]; decimal x = 0, y = 0; if (position.IsObject) { x = position["x"].ToString().ToDecimal(); y = position["y"].ToString().ToDecimal(); } stepsList.Add(new RoadFlow.Data.Model.WorkFlowInstalledSub.Step() { Archives = step["archives"].ToString().ToInt(), ArchivesParams = step["archivesParams"].ToString(), Behavior = behavior1, Buttons = buttionList, Event = event2, ExpiredPrompt = step["expiredPrompt"].ToString().ToInt(), Forms = formList, FieldStatus = fieldStatusList, ID = step["id"].ToString().ToGuid(), Type = step.ContainsKey("type") ? step["type"].ToString() : "normal", LimitTime = step["limitTime"].ToString().ToDecimal(), Name = step["name"].ToString(), Note = step["note"].ToString(), OpinionDisplay = step["opinionDisplay"].ToString().ToInt(), OtherTime = step["otherTime"].ToString().ToDecimal(), SignatureType = step["signatureType"].ToString().ToInt(), WorkTime = step["workTime"].ToString().ToDecimal(), SubFlowID = step.ContainsKey("subflow") ? step["subflow"].ToString() : "", Position_x = x, Position_y = y }); #endregion } } if (1 == wfInstalled.FlowType) { } wfInstalled.Steps = stepsList; if (stepsList.Count == 0) { errMsg = "流程至少需要一个步骤"; return null; } #endregion #region 载入连线信息 List linesList = new List(); LitJson.JsonData lines = json.ContainsKey("lines") ? json["lines"] : null; if (lines != null && lines.IsArray) { foreach (LitJson.JsonData line in lines) { linesList.Add(new RoadFlow.Data.Model.WorkFlowInstalledSub.Line() { ID = line["id"].ToString().ToGuid(), FromID = line["from"].ToString().ToGuid(), ToID = line["to"].ToString().ToGuid(), CustomMethod = line["customMethod"].ToString(), SqlWhere = line["sql"].ToString(), NoAccordMsg = line.ContainsKey("noaccordMsg") ? line["noaccordMsg"].ToString() : "", Organize_SenderIn = line.ContainsKey("organize_senderin") ? line["organize_senderin"].ToString() : "", Organize_SenderNotIn = line.ContainsKey("organize_sendernotin") ? line["organize_sendernotin"].ToString() : "", Organize_SponsorIn = line.ContainsKey("organize_sponsorin") ? line["organize_sponsorin"].ToString() : "", Organize_SponsorNotIn = line.ContainsKey("organize_sponsornotin") ? line["organize_sponsornotin"].ToString() : "", Organize_SenderLeader = line.ContainsKey("organize_senderleader") ? line["organize_senderleader"].ToString() : "", Organize_SenderChargeLeader = line.ContainsKey("organize_senderchargeleader") ? line["organize_senderchargeleader"].ToString() : "", Organize_SponsorLeader = line.ContainsKey("organize_sponsorleader") ? line["organize_sponsorleader"].ToString() : "", Organize_SponsorChargeLeader = line.ContainsKey("organize_sponsorchargeleader") ? line["organize_sponsorchargeleader"].ToString() : "", Organize_NotSenderLeader = line.ContainsKey("organize_notsenderleader") ? line["organize_notsenderleader"].ToString() : "", Organize_NotSenderChargeLeader = line.ContainsKey("organize_notsenderchargeleader") ? line["organize_notsenderchargeleader"].ToString() : "", Organize_NotSponsorLeader = line.ContainsKey("organize_notsponsorleader") ? line["organize_notsponsorleader"].ToString() : "", Organize_NotSponsorChargeLeader = line.ContainsKey("organize_notsponsorchargeleader") ? line["organize_notsponsorchargeleader"].ToString() : "" }); } } wfInstalled.Lines = linesList; #endregion #region 载入其它信息 //得到第一步 List firstStepIDList = new List(); foreach (var step in wfInstalled.Steps) { if (wfInstalled.Lines.Where(p => p.ToID == step.ID).Count() == 0) { firstStepIDList.Add(step.ID); } } if (firstStepIDList.Count==0) { errMsg = "流程没有开始步骤"; return null; } /* else if (firstStepIDList.Count > 1) { errMsg = "流程有多个开始步骤"; return null; } Guid lastStepID = Guid.Empty; foreach (var step in wfInstalled.Steps) { if (wfInstalled.Lines.Where(p => p.FromID == step.ID).Count() == 0) { lastStepID = step.ID; break; } } if (lastStepID == Guid.Empty) { errMsg = "流程没有结束步骤"; return null; } */ var wf = dataWorkFlow.Get(wfInstalled.ID); if (wf != null) { wfInstalled.CreateTime = wf.CreateDate; wfInstalled.CreateUser = wf.CreateUserID.ToString(); wfInstalled.DesignJSON = wf.DesignJSON; wfInstalled.FirstStepID = firstStepIDList.First(); wfInstalled.InstallTime = RoadFlow.Utility.DateTimeNew.Now; wfInstalled.InstallUser = Platform.Users.CurrentUserID.ToString(); wfInstalled.RunJSON = jsonString; wfInstalled.Status = wf.Status; } #endregion return wfInstalled; } /// /// 得到一个流程步骤的前面所有步骤集合 /// /// /// /// public List GetAllPrevSteps(Guid flowID, Guid stepID) { List stepList = new List(); var wfInstalled = GetWorkFlowRunModel(flowID); if (wfInstalled == null) { return stepList; } addPrevSteps(stepList, wfInstalled, stepID); return stepList.Distinct().ToList(); } private void addPrevSteps(List list, RoadFlow.Data.Model.WorkFlowInstalled wfInstalled, Guid stepID) { if (wfInstalled == null) return; var lines = wfInstalled.Lines.Where(p => p.ToID == stepID); foreach (var line in lines) { var step = wfInstalled.Steps.Where(p => p.ID == line.FromID); if (step.Count() > 0) { list.Add(step.First()); addPrevSteps(list, wfInstalled, step.First().ID); } } } /// /// 得到一个流程步骤的前面步骤集合 /// /// /// /// public List GetPrevSteps(Guid flowID, Guid stepID) { List stepList = new List(); var wfInstalled = GetWorkFlowRunModel(flowID); if (wfInstalled == null) { return stepList; } var lines = wfInstalled.Lines.Where(p => p.ToID == stepID); foreach (var line in lines) { var step = wfInstalled.Steps.Where(p => p.ID == line.FromID); if (step.Count() > 0) { stepList.Add(step.First()); } } return stepList; } /// /// 得到一个流程当前步骤的后续步骤集合 /// /// /// /// public List GetNextSteps(Guid flowID, Guid stepID) { List stepList = new List(); var wfInstalled = GetWorkFlowRunModel(flowID); if (wfInstalled == null) { return stepList; } var lines = wfInstalled.Lines.Where(p => p.FromID == stepID); foreach (var line in lines) { var step = wfInstalled.Steps.Where(p => p.ID == line.ToID); if (step.Count() > 0) { stepList.Add(step.First()); } } return stepList; } /// /// 根据步骤ID得到步骤名称 /// /// /// /// /// 如果步骤为空是否返回第一步的名称 /// public string GetStepName(Guid stepID, Guid flowID, out string flowName, bool defaultFirstStepName = false) { flowName = ""; var wfInstalled = GetWorkFlowRunModel(flowID); if (wfInstalled == null) return ""; if (stepID == Guid.Empty && defaultFirstStepName) { stepID = wfInstalled.FirstStepID; } flowName = wfInstalled.Name; var steps = wfInstalled.Steps.Where(p => p.ID == stepID); return steps.Count() > 0 ? steps.First().Name : ""; } /// /// 根据步骤ID得到步骤名称 /// /// /// /// 如果步骤ID为空是否默认为第一步 /// public string GetStepName(Guid stepID, Guid flowID, bool defautFirstStepName=false) { string temp; return GetStepName(stepID, flowID, out temp, defautFirstStepName); } /// /// 根据步骤ID得到步骤名称 /// /// /// /// 如果步骤ID为空是否默认为第一步 /// public string GetStepName(Guid stepID, RoadFlow.Data.Model.WorkFlowInstalled wfinstalled, bool defautFirstStepName = false) { if (wfinstalled == null) return ""; if (stepID == Guid.Empty && defautFirstStepName) { stepID = wfinstalled.FirstStepID; } var steps = wfinstalled.Steps.Where(p => p.ID == stepID); return steps.Count() > 0 ? steps.First().Name : ""; } /// /// 得到流程名称 /// /// /// public string GetFlowName(Guid flowID) { var flow = GetWorkFlowRunModel(flowID); return flow != null ? flow.Name : ""; } /// /// 查询所有ID和名称 /// public Dictionary GetAllIDAndName() { return dataWorkFlow.GetAllIDAndName(); } /// /// 得到所有流程选择项 /// /// public string GetOptions(string value = "") { var dicts = GetAllIDAndName(); StringBuilder options = new StringBuilder(); foreach (var dict in dicts.OrderBy(p=>p.Value)) { options.AppendFormat("", dict.Key, ("," + value + ",").Contains("," + dict.Key.ToString() + ",") ? "selected=\"selected\"" : "", dict.Value); } return options.ToString(); } /// /// 得到一个人员可管理实例的所有流程选择项 /// /// public string GetOptions(Dictionary flows, string typeid, string value = "") { var dicts = flows; StringBuilder options = new StringBuilder(); foreach (var dict in dicts) { options.AppendFormat("", dict.Key, dict.Key.ToString() == value ? "selected=\"selected\"" : "", dict.Value); } return options.ToString(); } /// /// 得到一个人员可管理实例的流程ID和名称列表 /// /// /// 分类ID /// public Dictionary GetInstanceManageFlowIDList(Guid userID, string typeID="") { var flows = this.GetAll(); Organize borg = new Organize(); Dictionary flowids = new Dictionary(); foreach (var flow in flows) { if (typeID.IsGuid() && !GetAllChildsIDString(typeID.ToGuid()).Contains(flow.Type.ToString(), StringComparison.CurrentCultureIgnoreCase)) { continue; } if (borg.GetAllUsers(flow.InstanceManager).Exists(p => p.ID == userID)) { flowids.Add(flow.ID, flow.Name); } } return flowids; } /// /// 生成印章图片 /// /// /// public Bitmap CreateSignImage(string UserName) { if (UserName.IsNullOrEmpty()) { return null; } System.Random rand = new Random(UserName.GetHashCode()); Size ImageSize = Size.Empty; Font myFont = new Font("隶书", 16); // 计算图片大小 using (Bitmap bmp1 = new Bitmap(5, 5)) { using (Graphics g = Graphics.FromImage(bmp1)) { SizeF size = g.MeasureString(UserName, myFont, 10000); ImageSize.Width = (int)size.Width + 4; ImageSize.Height = (int)size.Height; } } // 创建图片 Bitmap bmp = new Bitmap(ImageSize.Width, ImageSize.Height); // 绘制文本 using (Graphics g = Graphics.FromImage(bmp)) { g.Clear(Color.White); using (StringFormat f = new StringFormat()) { f.Alignment = StringAlignment.Center; f.LineAlignment = StringAlignment.Center; f.FormatFlags = StringFormatFlags.NoWrap; g.DrawString( UserName, myFont, Brushes.Red, new RectangleF( 0, 0, ImageSize.Width, ImageSize.Height), f); } } // 随机制造噪点 (用户名绑定) Color c = Color.Red; int x, y; int num = ImageSize.Width * ImageSize.Height * 8 / 100; for (int iCount = 0; iCount < num; iCount++) { x = rand.Next(0, 4); y = rand.Next(ImageSize.Height); bmp.SetPixel(x, y, c); x = rand.Next(ImageSize.Width - 4, ImageSize.Width); y = rand.Next(ImageSize.Height); bmp.SetPixel(x, y, c); } int num1 = ImageSize.Width * ImageSize.Height * 20 / 100; for (int iCount = 0; iCount < num1; iCount++) { x = rand.Next(ImageSize.Width); y = rand.Next(0, 4); bmp.SetPixel(x, y, c); x = rand.Next(ImageSize.Width); y = rand.Next(ImageSize.Height - 4, ImageSize.Height); bmp.SetPixel(x, y, c); } int num2 = ImageSize.Width * ImageSize.Height / 150; for (int iCount = 0; iCount < num2; iCount++) { x = rand.Next(ImageSize.Width); y = rand.Next(ImageSize.Height); bmp.SetPixel(x, y, c); } myFont.Dispose(); return bmp; } /// /// 得到流程运行时自动标题 /// /// /// /// public string GetAutoTitle(string flowID, string stepID) { string flowName; string stepName = GetStepName(stepID.ToGuid(), flowID.ToGuid(), out flowName, true); return string.Format("
{0} - {1}
", flowName, stepName); } /// /// 得到默认任务标题 /// /// /// /// public string GetAutoTaskTitle(string flowID, string stepID, string groupID = "") { var wfrun = GetWorkFlowRunModel(flowID); if (wfrun == null) return ""; string flowName = wfrun.Name; string senderName = ""; Guid gid; if (groupID.IsGuid(out gid) || gid==Guid.Empty) { var fqz = new WorkFlowTask().GetFirstSnderID(flowID.ToGuid(), gid); senderName = new Users().GetName(fqz); } if (senderName.IsNullOrEmpty()) { senderName = Users.CurrentUserName; } return string.Concat(flowName, "(", senderName, ")"); } /// /// 保存表单数据 /// public string SaveFromData(string instanceid, RoadFlow.Data.Model.WorkFlowCustomEventParams eventParams) { //保存自定义表单内容 string form_CustomSaveMethod = System.Web.HttpContext.Current.Request.Form["Form_CustomSaveMethod"]; if (!form_CustomSaveMethod.IsNullOrEmpty()) { return new WorkFlowTask().ExecuteFlowCustomEvent(form_CustomSaveMethod, eventParams).ToString(); } if ("1" != System.Web.HttpContext.Current.Request.Form["Form_AutoSaveData"]) { return instanceid; } RoadFlow.Platform.DBConnection bdbconn = new RoadFlow.Platform.DBConnection(); string dbconnid = System.Web.HttpContext.Current.Request.Form["Form_DBConnID"]; string dbtable = System.Web.HttpContext.Current.Request.Form["Form_DBTable"]; string dbtablepk = System.Web.HttpContext.Current.Request.Form["Form_DBTablePk"]; string dbtabletitle = System.Web.HttpContext.Current.Request.Form["Form_DBTableTitle"]; if (!dbconnid.IsGuid()) { return instanceid; } RoadFlow.Data.Model.DBConnection dbconn = bdbconn.Get(dbconnid.ToGuid()); if (dbconn == null) { return instanceid; } using (System.Data.IDbConnection conn = bdbconn.GetConnection(dbconn)) { if (conn == null) { return instanceid; } try { conn.Open(); } catch (Exception ex) { System.Web.HttpContext.Current.Response.Write("连接数据库出错:" + ex.Message); RoadFlow.Platform.Log.Add(ex); } string sql = string.Empty; List parList = new List(); if(instanceid.IsNullOrEmpty()) { sql = string.Format("SELECT * FROM {0} WHERE 1=0", dbtable); } else { switch (dbconn.Type) { case "SqlServer": sql = string.Format("SELECT * FROM {0} WHERE {1}=@pk", dbtable, dbtablepk); parList.Add(new System.Data.SqlClient.SqlParameter("@pk", instanceid)); break; case "Oracle": sql = string.Format("SELECT * FROM {0} WHERE {1}=:pk", dbtable, dbtablepk); parList.Add(new OracleParameter(":pk", instanceid)); break; } } System.Data.IDbDataAdapter dataAdapter = bdbconn.GetDataAdapter(conn, dbconn.Type, sql, parList.ToArray()); System.Data.DataSet ds = new System.Data.DataSet(); dataAdapter.Fill(ds); System.Data.DataTable schemaDt = bdbconn.GetTableSchema(conn, dbtable, dbconn.Type); System.Data.DataTable dt = ds.Tables[0]; bool isNew = dt.Rows.Count == 0; if (isNew) { dt.Rows.Add(dt.NewRow()); } //设置主键值(应用于参数中有instanceid而对应业务表中没有数据时保存会出错) if (!instanceid.IsNullOrEmpty()) { dt.Rows[0][dbtablepk] = instanceid; } #region 保存主表数据 for (int i = 0; i < dt.Columns.Count; i++) { string colnumName = dt.Columns[i].ColumnName; if (string.Compare(colnumName, dbtablepk, true) == 0) { continue; } string name = string.Concat(dbtable, ".", dt.Columns[i].ColumnName); string value = System.Web.HttpContext.Current.Request.Form[name]; if (value == null && !isNew) { continue; } var colnum = dt.Columns[i]; string colnumDataType = colnum.DataType.FullName; object defaultValue; System.Data.DataRow[] schemaDrs = schemaDt.Select(string.Format("f_name='{0}'", colnumName)); bool hasDefault = false;//列是否有默认值 bool hasNull = false;//列是否可以为空 bool isSet = getColnumIsValue(colnumDataType, value, out defaultValue); switch (dbconn.Type) { case "SqlServer": hasDefault = schemaDrs.Length > 0 && schemaDrs[0]["cdefault"].ToString() != "0"; hasNull = schemaDrs.Length > 0 && schemaDrs[0]["is_null"].ToString() != "0"; break; case "Oracle": hasDefault = schemaDrs.Length > 0 && !schemaDrs[0]["cdefault"].ToString().IsNullOrEmpty(); hasNull = schemaDrs.Length > 0 && schemaDrs[0]["is_null"].ToString() != "0"; break; } if (isSet) { dt.Rows[0][colnumName] = value; } else { if (!hasDefault) { if (hasNull) { dt.Rows[0][colnumName] = DBNull.Value; } else { dt.Rows[0][colnumName] = defaultValue; } } } } #endregion #region 设置主键值 bool isIdentity = false; if (isNew) { if (instanceid.IsNullOrEmpty()) { var pkColnum = dt.Columns[dbtablepk]; System.Data.DataRow[] schemaDrs = schemaDt.Select(string.Format("f_name='{0}'", dbtablepk)); if (schemaDrs.Length > 0) { isIdentity = false; bool isDefault = false; bool isGuid = false; switch (dbconn.Type) { case "SqlServer": isIdentity = schemaDrs[0]["isidentity"].ToString() == "1"; isDefault = schemaDrs[0]["cdefault"].ToString() != "0"; isGuid = pkColnum.DataType.FullName == "System.Guid"; break; case "Oracle": isIdentity = schemaDrs[0]["isidentity"].ToString() == "1"; isDefault = !schemaDrs[0]["cdefault"].ToString().IsNullOrEmpty(); isGuid = pkColnum.DataType.FullName == "System.String"; break; } if (!isIdentity && isGuid) { instanceid = Guid.NewGuid().ToString(); dt.Rows[0][dbtablepk] = instanceid; } } } else { //dt.Rows[0][dbtablepk] = instanceid; } } #endregion #region 执行保存 switch (dbconn.Type) { case "SqlServer": System.Data.SqlClient.SqlCommandBuilder scb = new System.Data.SqlClient.SqlCommandBuilder((System.Data.SqlClient.SqlDataAdapter)dataAdapter); break; //case "Oracle": // OracleCommandBuilder ocb = new OracleCommandBuilder((OracleDataAdapter)dataAdapter); // break; } dataAdapter.Update(ds); #endregion #region 如果是新增,又是自增列则查询刚插入的自增列值 if (isNew && isIdentity) { switch (dbconn.Type) { case "SqlServer": string identitysql = "SELECT @@IDENTITY"; using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand(identitysql, (System.Data.SqlClient.SqlConnection)conn)) { object obj = cmd.ExecuteScalar(); if (obj != null) { instanceid = obj.ToString(); dt.Rows[0][dbtablepk] = instanceid; } } break; case "Oracle": string identitysql1 = string.Format("SELECT {0}_{1}_SEQ.currval FROM dual", dbtable, dbtablepk); using (OracleCommand cmd = new OracleCommand(identitysql1, (OracleConnection)conn)) { object obj = cmd.ExecuteScalar(); if (obj != null) { instanceid = obj.ToString(); dt.Rows[0][dbtablepk] = instanceid; } } break; } } #endregion #region 保存从表数据 string flowSubTableIDString = System.Web.HttpContext.Current.Request.Form["flowsubtable_id"] ?? ""; string[] flowSubTableIDArray = flowSubTableIDString.Split(','); foreach (string flowSubTableID in flowSubTableIDArray) { string secondtable = System.Web.HttpContext.Current.Request.Form["flowsubtable_" + flowSubTableID + "_secondtable"]; string primarytablefiled = System.Web.HttpContext.Current.Request.Form["flowsubtable_" + flowSubTableID + "_primarytablefiled"]; string secondtableprimarykey = System.Web.HttpContext.Current.Request.Form["flowsubtable_" + flowSubTableID + "_secondtableprimarykey"]; string secondtablerelationfield = System.Web.HttpContext.Current.Request.Form["flowsubtable_" + flowSubTableID + "_secondtablerelationfield"]; if (secondtable.IsNullOrEmpty() || primarytablefiled.IsNullOrEmpty() || secondtableprimarykey.IsNullOrEmpty() || secondtablerelationfield.IsNullOrEmpty()) { continue; } string primyarTableFeldValue = dt.Rows[0][primarytablefiled].ToString(); if (primyarTableFeldValue.IsNullOrEmpty()) { continue; } string subSql = string.Empty; List parList1 = new List(); switch (dbconn.Type) { case "SqlServer": subSql = string.Format("SELECT * FROM {0} WHERE {1}=@pk", secondtable, secondtablerelationfield); parList1.Add(new System.Data.SqlClient.SqlParameter("@pk", primyarTableFeldValue)); break; case "Oracle": subSql = string.Format("SELECT * FROM {0} WHERE {1}=:pk", secondtable, secondtablerelationfield); parList1.Add(new OracleParameter(":pk", primyarTableFeldValue)); break; } string[] colGuidArray = (System.Web.HttpContext.Current.Request.Form["hidden_guid_" + flowSubTableID] ?? "").Split(','); System.Data.IDbDataAdapter dataAdapter1 = bdbconn.GetDataAdapter(conn, dbconn.Type, subSql, parList1.ToArray()); System.Data.DataSet ds1 = new System.Data.DataSet(); dataAdapter1.Fill(ds1); System.Data.DataTable schemaDt1 = bdbconn.GetTableSchema(conn, secondtable, dbconn.Type); System.Data.DataTable dt1 = ds1.Tables[0]; bool isInitNew = dt1.Rows.Count == 0; foreach (string colGuid in colGuidArray) { bool isNew1 = true; System.Data.DataRow dr1 = null; foreach (System.Data.DataRow dr in dt1.Rows) { if (string.Compare(dr[secondtableprimarykey].ToString(), colGuid, 0) == 0) { dr1 = dr; isNew1 = false; break; } } if (isNew1) { dr1 = dt1.NewRow(); dr1[secondtablerelationfield] = primyarTableFeldValue; dt1.Rows.Add(dr1); isNew1 = true; } #region 循环保存列数据 for (int i = 0; i < dt1.Columns.Count; i++) { string colnumName1 = dt1.Columns[i].ColumnName; if (string.Compare(colnumName1, secondtableprimarykey, true) == 0 || string.Compare(colnumName1, secondtablerelationfield,0) ==0 ) { continue; } string value1 = System.Web.HttpContext.Current.Request.Form[flowSubTableID + "_" + colGuid + "_" + secondtable + "_" + colnumName1]; if (value1 == null && !isNew1) { continue; } var colnum1 = dt1.Columns[i]; string colnumDataType1 = colnum1.DataType.FullName; object defaultValue1 = string.Empty; System.Data.DataRow[] schemaDrs1 = schemaDt1.Select(string.Format("f_name='{0}'", colnumName1)); bool hasDefault1 = schemaDrs1.Length > 0 && schemaDrs1[0]["cdefault"].ToString() != "0";//列是否有默认值 bool hasNull1 = schemaDrs1.Length > 0 && schemaDrs1[0]["is_null"].ToString() != "0";//列是否可以为空 bool isSet1 = getColnumIsValue(colnumDataType1, value1, out defaultValue1); if (isSet1) { dr1[colnumName1] = value1; } else { if (!hasDefault1) { if (hasNull1) { dr1[colnumName1] = DBNull.Value; } else { dr1[colnumName1] = defaultValue1; } } } } #endregion } #region 删除多余行 if (!isInitNew) { for (int i = 0; i < dt1.Rows.Count; i++) { bool isIn = false; foreach (string colGuid in colGuidArray) { if (dt1.Rows[i][secondtableprimarykey].ToString().IsNullOrEmpty() || string.Compare(dt1.Rows[i][secondtableprimarykey].ToString(), colGuid, 0) == 0) { isIn = true; break; } } if (!isIn) { dt1.Rows[i].Delete(); } } } #endregion #region 检查从表如果数据库类型是Oracle并且主键是VARCHAR2,则要设置默认值(Oracle不能自动生成guid) if ("Oracle" == dbconn.Type) { System.Data.DataRow[] schemaDrs2 = schemaDt1.Select(string.Format("f_name='{0}'", secondtableprimarykey)); bool isIdentity1 = schemaDrs2.Length>0 && schemaDrs2[0]["isidentity"].ToString() == "1"; if (!isIdentity) { foreach (System.Data.DataRow dr in dt1.Rows) { if (dr.RowState == System.Data.DataRowState.Added) { dr[secondtableprimarykey] = Guid.NewGuid(); } } } } #endregion #region 执行保存 switch (dbconn.Type) { case "SqlServer": System.Data.SqlClient.SqlCommandBuilder scb1 = new System.Data.SqlClient.SqlCommandBuilder((System.Data.SqlClient.SqlDataAdapter)dataAdapter1); break; //case "Oracle": // OracleCommandBuilder ocb1 = new OracleCommandBuilder((OracleDataAdapter)dataAdapter1); // break; } dataAdapter1.Update(ds1); #endregion } #endregion return instanceid; } } /// /// 判断列是否有值 /// /// /// /// 默认值 /// private bool getColnumIsValue(string colnumDataType, string value, out object defaultValue) { bool isSet = false; defaultValue = null; switch (colnumDataType) { case "System.Int16": case "System.Int32": case "System.Int64": case "System.UInt16": case "System.UInt32": case "System.UInt64": isSet = value.IsInt(); defaultValue = int.MinValue; break; case "System.String": isSet = value != null; defaultValue = ""; break; case "System.Guid": isSet = value.IsGuid(); defaultValue = Guid.Empty; break; case "System.Decimal": isSet = value.IsDecimal(); defaultValue = decimal.MinValue; break; case "System.Double": case "System.Single": isSet = value.IsDouble(); defaultValue = double.MinValue; break; case "System.DateTime": isSet = value.IsDateTime(); defaultValue = DateTime.MinValue; break; case "System.Object": isSet = value != null; defaultValue = ""; break; case "System.Boolean": isSet = value != null && (value.ToString().ToLower() == "false" || value.ToString().ToLower() == "true"); defaultValue = 0; break; } return isSet; } /// /// 得到实例数据 /// /// /// /// /// /// public LitJson.JsonData GetFormData(string connid, string table, string pk, string instanceid, string filedStatus = "") { LitJson.JsonData jsonData = new LitJson.JsonData(); if (instanceid.IsNullOrEmpty()) { return jsonData; } RoadFlow.Platform.DBConnection bdbconn = new RoadFlow.Platform.DBConnection(); RoadFlow.Data.Model.DBConnection dbconn = bdbconn.Get(connid.ToGuid()); if (dbconn == null) { return ""; } using (System.Data.IDbConnection conn = bdbconn.GetConnection(dbconn)) { if (conn == null) { return ""; } try { conn.Open(); } catch (Exception ex) { System.Web.HttpContext.Current.Response.Write("连接数据库出错:" + ex.Message); RoadFlow.Platform.Log.Add(ex); } string sql = string.Empty; List parList = new List(); switch (dbconn.Type) { case "SqlServer": sql = string.Format("SELECT * FROM {0} WHERE {1}=@pk", table, pk); parList.Add(new System.Data.SqlClient.SqlParameter("@pk", instanceid)); break; case "Oracle": sql = string.Format("SELECT * FROM {0} WHERE {1}=:pk", table, pk); parList.Add(new OracleParameter(":pk", instanceid)); break; } System.Data.IDbDataAdapter dataAdapter = bdbconn.GetDataAdapter(conn, dbconn.Type, sql, parList.ToArray()); System.Data.DataSet ds = new System.Data.DataSet(); dataAdapter.Fill(ds); if (dataAdapter.SelectCommand != null) { dataAdapter.SelectCommand.Dispose(); } System.Data.DataTable dt = ds.Tables[0]; LitJson.JsonData json = null; if (!filedStatus.IsNullOrEmpty()) { json = LitJson.JsonMapper.ToObject(filedStatus); } if (dt.Rows.Count > 0) { System.Data.DataRow dr = dt.Rows[0]; for (int i = 0; i < dt.Columns.Count; i++) { bool isShow = true; string fileName=table + "_" + dt.Columns[i].ColumnName; if (json != null && json.ContainsKey(fileName)) { string status = json[fileName].ToString(); if (!status.IsNullOrEmpty()) { string[] statusArray = status.Split('_'); if (statusArray.Length == 2 && "2" == statusArray[0]) { isShow = false; } } } //string value = dr[dt.Columns[i].ColumnName].ToString(); jsonData[fileName] = isShow ? dr[dt.Columns[i].ColumnName].ToString() : ""; } } } return jsonData; } /// /// 得到实例数据 /// /// /// /// /// /// json字符串 public string GetFormDataJsonString(string connid, string table, string pk, string instanceid) { LitJson.JsonData jsonData = GetFormData(connid, table, pk, instanceid); return GetFormDataJsonString(jsonData); } /// /// 得到实例数据 /// /// /// json字符串 public string GetFormDataJsonString(LitJson.JsonData jsonData) { string json = jsonData.ToJson(); return json.IsNullOrEmpty() ? "{}" : json; } /// /// 得到从表数据 /// /// 连接ID /// 从表名称 /// 关联字段 /// 关联字段值 /// 排序字段 /// public LitJson.JsonData GetSubTableData(string connID, string secondTable, string relationField, string fieldValue, string sortField = "") { LitJson.JsonData jsonData = new LitJson.JsonData(); if (fieldValue.IsNullOrEmpty()) { return jsonData; } RoadFlow.Platform.DBConnection bdbconn = new RoadFlow.Platform.DBConnection(); RoadFlow.Data.Model.DBConnection dbconn = bdbconn.Get(connID.ToGuid()); if (dbconn == null) { return ""; } using (System.Data.IDbConnection conn = bdbconn.GetConnection(dbconn)) { if (conn == null) { return ""; } try { conn.Open(); } catch (Exception ex) { System.Web.HttpContext.Current.Response.Write("连接数据库出错:" + ex.Message); RoadFlow.Platform.Log.Add(ex); } string sql = string.Empty; List parList = new List(); switch (dbconn.Type) { case "SqlServer": sql = string.Format("SELECT * FROM {0} WHERE {1}=@fieldvalue {2}", secondTable, relationField, (sortField.IsNullOrEmpty() ? "" : string.Concat("ORDER BY ", sortField))); parList.Add(new System.Data.SqlClient.SqlParameter("@fieldvalue", fieldValue)); break; case "Oracle": sql = string.Format("SELECT * FROM {0} WHERE {1}=:fieldvalue {2}", secondTable, relationField, (sortField.IsNullOrEmpty() ? "" : string.Concat("ORDER BY ", sortField))); parList.Add(new OracleParameter(":fieldvalue", fieldValue)); break; } System.Data.IDbDataAdapter dataAdapter = bdbconn.GetDataAdapter(conn, dbconn.Type, sql, parList.ToArray()); System.Data.DataSet ds = new System.Data.DataSet(); dataAdapter.Fill(ds); if (dataAdapter.SelectCommand != null) { dataAdapter.SelectCommand.Dispose(); } System.Data.DataTable dt = ds.Tables[0]; //jsonData.SetJsonType(LitJson.JsonType.Array); foreach (System.Data.DataRow dr in dt.Rows) { LitJson.JsonData data = new LitJson.JsonData(); for (int i = 0; i < dt.Columns.Count; i++) { data[secondTable + "_" + dt.Columns[i].ColumnName] = dr[dt.Columns[i].ColumnName].ToString(); } jsonData.Add(data); } } return jsonData; } /// /// 得到实例某个字段的值 /// /// /// /// /// public string GetFromFieldData(LitJson.JsonData jsonData, string table, string field) { string value = string.Empty; if (jsonData == null || table.IsNullOrEmpty() || field.IsNullOrEmpty()) { return value; } var key = string.Concat(table, "_", field); if (!jsonData.ContainsKey(key)) { return value; } value = jsonData[key].ToString(); return value; } /// /// 得到一个流程一个步骤的字段状态设置 /// /// /// /// public string GetFieldStatus(string flowID, string stepID) { Guid fid, sid; if(!flowID.IsGuid(out fid)) { return "{}"; } var wfinstance = GetWorkFlowRunModel(fid); if (wfinstance == null) { return "{}"; } if (!stepID.IsGuid(out sid)) { sid=wfinstance.FirstStepID; } var steps = wfinstance.Steps.Where(p => p.ID == sid); if (steps.Count() == 0) { return "{}"; } var step = steps.First(); var fieldStatus = step.FieldStatus; StringBuilder sb = new StringBuilder("{"); int count = fieldStatus.Count(); int i = 0; foreach (var fs in fieldStatus) { var fields = fs.Field.Split('.'); if (fields.Length != 3) { continue; } var fieldName = fields[1] + "_" + fields[2]; sb.AppendFormat("\"{0}\":\"{1}\"", fieldName, string.Concat(fs.Status1, "_", fs.Check)); if (i++ < count - 1) { sb.Append(","); } } return sb.ToString() + "}"; } /// /// 得到下级ID字符串 /// /// /// public string GetAllChildsIDString(Guid id, bool isSelf = true) { return new Dictionary().GetAllChildsIDString(id, true); } /// /// 得到类型选择项 /// /// public string GetTypeOptions(string value = "") { return new Dictionary().GetOptionsByCode("FlowTypes", Dictionary.OptionValueField.ID, value); } /// /// 查询所有记录 /// public List GetByTypes(string typeString) { return dataWorkFlow.GetByTypes(typeString); } /// /// 得到一个类型下的流程ID /// /// /// public string GetFlowIDFromType(Guid typeID) { var flows = GetByTypes(GetAllChildsIDString(typeID)); StringBuilder sb = new StringBuilder(); foreach (var flow in flows) { sb.Append(flow.ID); sb.Append(","); } return sb.ToString().TrimEnd(','); } /// /// 得到流程类型选项 /// /// /// public string GetFlowTypeOptions(string type) { List items = new List() { new System.Web.UI.WebControls.ListItem("常规流程","0"){Selected="0"==type}, new System.Web.UI.WebControls.ListItem("自由流程","1"){Selected="1"==type} }; return Utility.Tools.GetOptionsString(items.ToArray()); } /// /// 得到一个自由流程步骤实体 /// /// public RoadFlow.Data.Model.WorkFlowInstalledSub.Step GetFreeFlowStep(RoadFlow.Data.Model.WorkFlowInstalled wfInstalled) { RoadFlow.Data.Model.WorkFlowInstalledSub.Step step = new Data.Model.WorkFlowInstalledSub.Step(); var firstSteps = wfInstalled.Steps.Where(p => p.ID == wfInstalled.FirstStepID); if (firstSteps.Count() == 0) { return step; } step = firstSteps.First(); step.ID = Guid.NewGuid(); step.Name = wfInstalled.Name + "-审核"; step.Buttons = new List() { new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button() { ID = "3B271F67-0433-4082-AD1A-8DF1B967B879",Note = "保存",Sort = 0 }, new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button() { ID = "86B7FA6C-891F-4565-9309-81672D3BA80A",Note = "退回",Sort = 1 }, new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button() { ID = "8982B97C-ADBA-4A3A-AFD9-9A3EF6FF12D8",Note = "发送",Sort = 2 }, new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button() { ID = "other_splitline",Note = "",Sort = 3 }, new RoadFlow.Data.Model.WorkFlowInstalledSub.StepSet.Button() { ID = "954EFFA8-03B8-461A-AAA8-8727D090DCB9",Note = "结束流程",Sort = 4 } }; return step; } } }