using System; using System.Collections; using System.Data; using System.IO; using System.Collections.Generic; using System.Web; using BP.DA; using BP.Sys; using BP.Web; using BP.En; using BP.WF; using BP.WF.Data; using BP.WF.Template; using BP.WF.Template.SFlow; using BP.Port; using System.Drawing.Imaging; using System.Drawing; using System.Configuration; using BP.Tools; using BP.Difference; namespace BP.WF { /// /// 流程的API. /// public class CCFlowAPI { /// /// 产生一个 WorkNode /// /// 流程编号 /// 节点 /// 工作ID /// FID /// 用户编号 /// 返回dataset public static DataSet GenerWorkNode(string fk_flow, Node nd, Int64 workID, Int64 fid, string userNo, Int64 realWorkID, string fromWorkOpt = "0", bool isView = false) { DBAccess.RunSQL("DELETE FROM Sys_MapExt WHERE DoWay='0' or DoWay='None'"); try { nd.WorkID = workID; //为获取表单ID提供参数. Work wk = nd.HisWork; wk.OID = workID; wk.RetrieveFromDBSources(); string frmID = nd.NodeFrmID; //根据表单存储的数据获取获取使用表单的版本号 int frmVer = 0; if (wk.EnMap.Attrs.Contains("AtPara") == true) { frmVer = wk.FrmVer; if (frmVer != 0) { frmID = nd.NodeFrmID + "." + frmVer; if (nd.FormType != NodeFormType.FoolTruck) { wk = new BP.WF.GEWork(nd.NodeID, frmID); wk.OID = workID; wk.RetrieveFromDBSources(); } } } MapData md = new MapData(frmID); //定义变量,为绑定独立表单设置单据编号. string billNo = null; //定义单据编号. string billNoField = null; //定义单据编号字段. // 第1.2: 调用,处理用户定义的业务逻辑. string sendWhen = ExecEvent.DoNode(EventListNode.FrmLoadBefore, nd, wk, null); //获得表单模版. DataSet myds = BP.Sys.CCFormAPI.GenerHisDataSet(frmID, nd.Name); //现在版本不是主版本的情况 if (frmID.Equals(nd.NodeFrmID) == false) { DataTable mddt = myds.Tables["Sys_MapData"]; mddt.Rows[0]["AtPara"] = mddt.Rows[0]["AtPara"] + "@MainFrmID=" + nd.NodeFrmID; DataTable athdt = myds.Tables["Sys_FrmAttachment"]; if (frmVer != 0 && athdt.Rows.Count != 0) { DataTable gfdt = myds.Tables["Sys_GroupField"]; foreach (DataRow dr in athdt.Rows) { DataRow[] gfr = gfdt.Select("CtrlID='" + dr["MyPK"] + "'"); if (gfr.Length != 0) gfr[0]["CtrlID"] = nd.NodeFrmID + "_" + dr["NoOfObj"]; dr["MyPK"] = nd.NodeFrmID + "_" + dr["NoOfObj"]; } } } //更换表单的名字. if (DataType.IsNullOrEmpty(nd.NodeFrmID) == false && (nd.ItIsNodeFrm)) { string realName = myds.Tables["Sys_MapData"].Rows[0]["Name"] as string; if (DataType.IsNullOrEmpty(realName) == true) { myds.Tables["Sys_MapData"].Rows[0]["Name"] = nd.Name; } } #region 处理表单权限控制方案: 如果是绑定单个表单的时候. /*处理表单权限控制方案: 如果是绑定单个表单的时候. */ //这两个变量在累加表单用到. FrmNode frmNode = new FrmNode(); Flow flow = new Flow(fk_flow); myds.Tables.Add(flow.ToDataTableField("WF_Flow")); if (nd.HisFormType == NodeFormType.RefOneFrmTree || nd.HisFormType == NodeFormType.FoolTruck || flow.FlowDevModel == FlowDevModel.JiJian) { int count = frmNode.Retrieve(FrmNodeAttr.FK_Frm, nd.NodeFrmID, FrmNodeAttr.FK_Node, nd.NodeID); if (count == 0) frmNode.ItIsEnableLoadData = true; if (count!=0 && frmNode.FrmSln != 0) { FrmFields fls = new FrmFields(nd.NodeFrmID, frmNode.NodeID); foreach (FrmField item in fls) { foreach (DataRow dr in myds.Tables["Sys_MapAttr"].Rows) { string keyOfEn = dr["KeyOfEn"].ToString(); if (keyOfEn.Equals(item.KeyOfEn) == false) continue; if (item.ItIsSigan == true) item.setUIIsEnable(false); if (item.UIIsEnable == true) dr["UIIsEnable"] = 1; else dr["UIIsEnable"] = 0; if (item.ItIsNotNull == true) dr["UIIsInput"] = 1; else dr["UIIsInput"] = 0; if (item.UIVisible == true) dr["UIVisible"] = 1; else dr["UIVisible"] = 0; if (item.ItIsSigan == true) dr["IsSigan"] = 1; else dr["IsSigan"] = 0; dr["DefVal"] = item.DefVal; } } //从表权限的设置 MapDtls mapdtls = new MapDtls(); mapdtls.Retrieve(MapDtlAttr.FK_MapData, nd.NodeFrmID + "_" + frmNode.NodeID); foreach (DataRow dr in myds.Tables["Sys_MapDtl"].Rows) { foreach (MapDtl mapDtl in mapdtls) { string no = dr["No"].ToString() + "_" + frmNode.NodeID; if (no.Equals(mapDtl.No) == true) { dr["IsView"] = mapDtl.ItIsView == true ? 1 : 0; break; } } } } } else { frmNode.ItIsEnableLoadData = true; } #endregion 处理表单权限控制方案: 如果是绑定单个表单的时候. //把流程信息表发送过去. GenerWorkFlow gwf = new GenerWorkFlow(); gwf.WorkID = realWorkID; gwf.RetrieveFromDBSources(); myds.Tables.Add(gwf.ToDataTableField("WF_GenerWorkFlow")); //加入WF_Node. DataTable WF_Node = nd.ToDataTableField("WF_Node"); myds.Tables.Add(WF_Node); #region 加入组件的状态信息, 在解析表单的时候使用. FrmNodeComponent fnc = new FrmNodeComponent(nd.NodeID); nd.WorkID = workID; //为获取表单ID提供参数. bool isHaveSubFlow = false; #region 没有审核组件分组就增加上审核组件分组. if (nd.NodeFrmID.Equals("ND" + nd.NodeID) == true || flow.FlowDevModel == FlowDevModel.JiJian || (nd.HisFormType == NodeFormType.RefOneFrmTree && DataType.IsNullOrEmpty(frmNode.MyPK) == false)) { bool isHaveFWC = false; //绑定表单库中的表单 if ((DataType.IsNullOrEmpty(frmNode.MyPK) == false && frmNode.IsEnableFWC != FrmWorkCheckSta.Disable) || ((nd.NodeFrmID == "ND" + nd.NodeID || flow.FlowDevModel == FlowDevModel.JiJian) && nd.FrmWorkCheckSta != FrmWorkCheckSta.Disable)) isHaveFWC = true; if ((nd.FormType == NodeFormType.FoolForm || frmNode.HisFrmType == FrmType.FoolForm) && isHaveFWC == true) { //判断是否是傻瓜表单,如果是,就要判断该傻瓜表单是否有审核组件groupfield ,没有的话就增加上. DataTable gf = myds.Tables["Sys_GroupField"]; bool isHave = false; foreach (DataRow dr in gf.Rows) { string cType = dr["CtrlType"] as string; if (cType == null) continue; if (cType.Equals("FWC") == true) isHave = true; if (cType.Equals("SubFlow") == true) isHaveSubFlow = true; } if (isHave == false) { DataRow dr = gf.NewRow(); nd.WorkID = workID; //为获取表单ID提供参数. dr[GroupFieldAttr.OID] = 100; dr[GroupFieldAttr.FrmID] = nd.NodeFrmID; dr[GroupFieldAttr.CtrlType] = "FWC"; dr[GroupFieldAttr.CtrlID] = "FWCND" + nd.NodeID; dr[GroupFieldAttr.Idx] = 100; dr[GroupFieldAttr.Lab] = "审核信息"; gf.Rows.Add(dr); myds.Tables.Remove("Sys_GroupField"); myds.Tables.Add(gf); //更新,为了让其自动增加审核分组. BP.WF.Template.FrmNodeComponent refFnc = new FrmNodeComponent(nd.NodeID); refFnc.Update(); } } } #endregion 没有审核组件分组就增加上审核组件分组. #region 增加父子流程组件 if (nd.HisFormType == NodeFormType.RefOneFrmTree && DataType.IsNullOrEmpty(frmNode.MyPK) == false && frmNode.SFSta != FrmSubFlowSta.Disable) { DataTable gf = myds.Tables["Sys_GroupField"]; if (isHaveSubFlow == false) { DataRow dr = gf.NewRow(); nd.WorkID = workID; //为获取表单ID提供参数. dr[GroupFieldAttr.OID] = 120; dr[GroupFieldAttr.FrmID] = nd.NodeFrmID; dr[GroupFieldAttr.CtrlType] = "SubFlow"; dr[GroupFieldAttr.CtrlID] = "SubFlowND" + nd.NodeID; dr[GroupFieldAttr.Idx] = 120; dr[GroupFieldAttr.Lab] = "父子流程"; gf.Rows.Add(dr); myds.Tables.Remove("Sys_GroupField"); myds.Tables.Add(gf); //更新,为了让其自动增加审核分组. BP.WF.Template.FrmNodeComponent refFnc = new FrmNodeComponent(nd.NodeID); refFnc.Update(); } } #endregion 增加父子流程组件 //把审核组件信息,放入ds. myds.Tables.Add(fnc.ToDataTableField("WF_FrmNodeComponent")); #endregion 加入组件的状态信息, 在解析表单的时候使用. #region 处理累加表单增加 groupfields if (nd.FormType == NodeFormType.FoolTruck && nd.ItIsStartNode == false && DataType.IsNullOrEmpty(wk.HisPassedFrmIDs) == false) { #region 处理字段分组排序. groupfields //查询所有的分组, 如果是查看表单的方式,就不应该把当前的表单显示出来. string myFrmIDs = ""; if (fromWorkOpt.Equals("1") == true) { if (gwf.WFState == WFState.Complete) myFrmIDs = wk.HisPassedFrmIDs + ",'ND" + nd.NodeID + "'"; else myFrmIDs = wk.HisPassedFrmIDs; //流程未完成并且是查看表单的情况. } else { myFrmIDs = wk.HisPassedFrmIDs + ",'ND" + nd.NodeID + "'"; } GroupFields gfs = new GroupFields(); gfs.RetrieveIn(GroupFieldAttr.FrmID, "(" + myFrmIDs + ")"); //按照时间的顺序查找出来 ids . string sqlOrder = "SELECT OID FROM Sys_GroupField WHERE FrmID IN (" + myFrmIDs + ")"; string orderMyFrmIDs = myFrmIDs.Replace("'", ""); if (BP.Difference.SystemConfig.AppCenterDBType == DBType.Oracle || BP.Difference.SystemConfig.AppCenterDBType == DBType.KingBaseR3 || BP.Difference.SystemConfig.AppCenterDBType == DBType.KingBaseR6) { sqlOrder += " ORDER BY INSTR('" + orderMyFrmIDs + "',FrmID) , Idx"; } if (BP.Difference.SystemConfig.AppCenterDBType == DBType.MSSQL) { sqlOrder += " ORDER BY CHARINDEX(FrmID, '" + orderMyFrmIDs + "'), Idx"; } if (BP.Difference.SystemConfig.AppCenterDBType == DBType.MySQL) { sqlOrder += " ORDER BY INSTR('" + orderMyFrmIDs + "', FrmID ), Idx"; } if (BP.Difference.SystemConfig.AppCenterDBType == DBType.PostgreSQL || BP.Difference.SystemConfig.AppCenterDBType == DBType.UX || BP.Difference.SystemConfig.AppCenterDBType == DBType.HGDB) { sqlOrder += " ORDER BY POSITION(FrmID IN '" + orderMyFrmIDs + "'), Idx"; } if (BP.Difference.SystemConfig.AppCenterDBType == DBType.DM) { sqlOrder += " ORDER BY POSITION(FrmID IN '" + orderMyFrmIDs + "'), Idx"; } DataTable dtOrder = DBAccess.RunSQLReturnTable(sqlOrder); //创建容器,把排序的分组放入这个容器. GroupFields gfsNew = new GroupFields(); //遍历查询出来的分组. //只能增加一个审核分组 GroupField FWCG = null; foreach (DataRow dr in dtOrder.Rows) { string pkOID = dr[0].ToString(); GroupField mygf = gfs.GetEntityByKey(pkOID) as GroupField; if (mygf.CtrlType.Equals("FWC")) { FWCG = mygf; continue; } gfsNew.AddEntity(mygf); //把分组字段加入里面去. } if (FWCG != null) gfsNew.AddEntity(FWCG); DataTable dtGF = gfsNew.ToDataTableField("Sys_GroupField"); myds.Tables.Remove("Sys_GroupField"); myds.Tables.Add(dtGF); #endregion 处理字段分组排序. groupfields #region 处理 mapattrs //求当前表单的字段集合. MapAttrs mattrs = new MapAttrs(); QueryObject qo = new QueryObject(mattrs); qo.AddWhere(MapAttrAttr.FK_MapData, "ND" + nd.NodeID); qo.addOrderBy(MapAttrAttr.Idx); qo.DoQuery(); //获取走过节点的表单方案 MapAttrs attrsLeiJia = new MapAttrs(); //存在表单方案只读 string sql1 = "Select FK_Frm From WF_FrmNode Where FK_Frm In(" + wk.HisPassedFrmIDs + ") And FrmSln=" + (int)FrmSln.Readonly + " And FK_Node=" + nd.NodeID; DataTable dt1 = DBAccess.RunSQLReturnTable(sql1); if (dt1.Rows.Count > 0) { //获取节点 string nodes = ""; foreach (DataRow dr in dt1.Rows) nodes += "'" + dr[0].ToString() + "',"; nodes = nodes.Substring(0, nodes.Length - 1); qo = new QueryObject(attrsLeiJia); qo.AddWhere(MapAttrAttr.FK_MapData, " IN ", "(" + nodes + ")"); qo.addOrderBy(MapAttrAttr.Idx); qo.DoQuery(); foreach (MapAttr item in attrsLeiJia) { if (item.KeyOfEn.Equals("RDT") || item.KeyOfEn.Equals("Rec")) continue; item.setUIIsEnable(false); //设置为只读的. mattrs.AddEntity(item); } } //存在表单方案默认 sql1 = "Select FK_Frm From WF_FrmNode Where FK_Frm In(" + wk.HisPassedFrmIDs + ") And FrmSln=" + (int)FrmSln.Default + " And FK_Node=" + nd.NodeID; dt1 = DBAccess.RunSQLReturnTable(sql1); if (dt1.Rows.Count > 0) { //获取节点 string nodes = ""; foreach (DataRow dr in dt1.Rows) nodes += "'" + dr[0].ToString() + "',"; nodes = nodes.Substring(0, nodes.Length - 1); qo = new QueryObject(attrsLeiJia); qo.AddWhere(MapAttrAttr.FK_MapData, " IN ", "(" + nodes + ")"); qo.addOrderBy(MapAttrAttr.Idx); qo.DoQuery(); foreach (MapAttr item in attrsLeiJia) { if (item.KeyOfEn.Equals("RDT") || item.KeyOfEn.Equals("Rec")) continue; mattrs.AddEntity(item); } } //存在表单方案自定义 sql1 = "Select FK_Frm From WF_FrmNode Where FK_Frm In(" + wk.HisPassedFrmIDs + ") And FrmSln=" + (int)FrmSln.Self + " And FK_Node=" + nd.NodeID; dt1 = DBAccess.RunSQLReturnTable(sql1); if (dt1.Rows.Count > 0) { //获取节点 string nodes = ""; foreach (DataRow dr in dt1.Rows) nodes += "'" + dr[0].ToString() + "',"; nodes = nodes.Substring(0, nodes.Length - 1); qo = new QueryObject(attrsLeiJia); qo.AddWhere(MapAttrAttr.FK_MapData, " IN ", "(" + nodes + ")"); qo.addOrderBy(MapAttrAttr.Idx); qo.DoQuery(); //获取累加表单的权限 FrmFields fls = new FrmFields(); qo = new QueryObject(fls); qo.AddWhere(FrmFieldAttr.FrmID, " IN ", "(" + nodes + ")"); qo.addAnd(); qo.AddWhere(FrmFieldAttr.EleType, "Field"); qo.addAnd(); qo.AddWhere(FrmFieldAttr.FK_Node, nd.NodeID); qo.DoQuery(); foreach (MapAttr attr in attrsLeiJia) { if (attr.KeyOfEn.Equals("RDT") || attr.KeyOfEn.Equals("Rec")) continue; FrmField frmField = null; foreach (FrmField item in fls) { if (attr.KeyOfEn == item.KeyOfEn) { frmField = item; break; } } if (frmField != null) { if (frmField.ItIsSigan) attr.setUIIsEnable(false); attr.setUIIsEnable(frmField.UIIsEnable); attr.setUIVisible(frmField.UIVisible); attr.ItIsSigan = frmField.ItIsSigan; attr.setDefValReal(frmField.DefVal); } mattrs.AddEntity(attr); } } //替换掉现有的. myds.Tables.Remove("Sys_MapAttr"); //移除. myds.Tables.Add(mattrs.ToDataTableField("Sys_MapAttr")); //增加. #endregion 处理mapattrs #region 把枚举放入里面去. myds.Tables.Remove("Sys_Enum"); myFrmIDs = wk.HisPassedFrmIDs + ",'ND" + nd.NodeID + "'"; SysEnums enums = new SysEnums(); enums.RetrieveInSQL(SysEnumAttr.EnumKey, "SELECT UIBindKey FROM Sys_MapAttr WHERE FK_MapData in(" + myFrmIDs + ")", SysEnumAttr.IntKey); // 加入最新的枚举. myds.Tables.Add(enums.ToDataTableField("Sys_Enum")); #endregion 把枚举放入里面去. #region MapExt . myds.Tables.Remove("Sys_MapExt"); // 把扩展放入里面去. myFrmIDs = wk.HisPassedFrmIDs + ",'ND" + nd.NodeID + "'"; MapExts exts = new MapExts(); qo = new QueryObject(exts); qo.AddWhere(MapExtAttr.FK_MapData, " IN ", "(" + myFrmIDs + ")"); qo.DoQuery(); // 加入最新的MapExt. myds.Tables.Add(exts.ToDataTableField("Sys_MapExt")); #endregion MapExt . #region MapDtl . myds.Tables.Remove("Sys_MapDtl"); //把从表放里面 myFrmIDs = wk.HisPassedFrmIDs + ",'ND" + nd.NodeID + "'"; MapDtls dtls = new MapDtls(); qo = new QueryObject(dtls); qo.AddWhere(MapDtlAttr.FK_MapData, " IN ", "(" + myFrmIDs + ")"); qo.addAnd(); qo.AddWhere(MapDtlAttr.FK_Node, 0); qo.DoQuery(); // 加入最新的MapDtl. myds.Tables.Add(dtls.ToDataTableField("Sys_MapDtl")); #endregion MapDtl . #region FrmAttachment . myds.Tables.Remove("Sys_FrmAttachment"); //把附件放里面 myFrmIDs = wk.HisPassedFrmIDs + ",'ND" + nd.NodeID + "'"; FrmAttachments frmAtchs = new FrmAttachments(); qo = new QueryObject(frmAtchs); qo.AddWhere(FrmAttachmentAttr.FK_MapData, " IN ", "(" + myFrmIDs + ")"); qo.addAnd(); qo.AddWhere(FrmAttachmentAttr.FK_Node, 0); qo.DoQuery(); // 加入最新的Sys_FrmAttachment. myds.Tables.Add(frmAtchs.ToDataTableField("Sys_FrmAttachment")); #endregion FrmAttachment . } #endregion 增加 groupfields #region 处理节点表单是傻瓜表单的特定用户特定权限 MapExts nexts = (MapExts)md.MapExts.GetEntitiesByKey(MapExtAttr.ExtType, "SepcFieldsSepcUsers"); GroupFields groupFields = md.GroupFields; //加入分组表. if (nexts != null && nexts.Count != 0) { string oids = ","; string sq1l = ""; string tag1 = ""; foreach (MapExt ext in nexts) { tag1 = ext.Tag1; tag1 = tag1.Replace(",", ","); if (ext.Tag.Equals("Emps")) tag1 = "," + tag1 + ","; if (ext.Tag.Equals("Emps") && tag1.Contains("," + WebUser.No + ",") == true) oids += ext.Doc + ","; if (ext.Tag.Equals("Stas") == true) { if (tag1.EndsWith(",")) tag1 = tag1.Substring(0, tag1.Length - 1); tag1 = tag1.Replace(",", "','") + "'"; sq1l = "SELECT count(*) From Port_DeptEmpStation WHERE FK_Station IN(" + tag1 + ") AND FK_Emp='" + WebUser.No + "'"; if (DBAccess.RunSQLReturnValInt(sq1l) != 0) oids += ext.Doc + ","; } if (ext.Tag.Equals("Depts") == true) { if (tag1.EndsWith(",")) tag1 = tag1.Substring(0, tag1.Length - 1); tag1 = tag1.Replace(",", "','") + "'"; sq1l = "SELECT count(*) From Port_DeptEmp WHERE FK_Dept IN(" + tag1 + ") AND FK_Emp='" + WebUser.No + "'"; if (DBAccess.RunSQLReturnValInt(sq1l) != 0) oids += ext.Doc + ","; } if (ext.Tag.Equals("SQL") == true) { tag1 = BP.WF.Glo.DealExp(tag1, wk); if (DBAccess.RunSQLReturnValInt(tag1) != 0) oids += ext.Doc + ","; } } DataTable gfdt = myds.Tables["Sys_GroupField"]; foreach (DataRow dr in gfdt.Rows) { if (oids.Contains(dr["OID"] + ",")) dr["ShowType"]=2; } } #endregion 处理节点表单是傻瓜表单的特定用户特定权限 #region 流程设置信息. if (isView == false) { BP.WF.Dev2Interface.Node_SetWorkRead(nd.NodeID, realWorkID); if (nd.ItIsStartNode == false) { if (gwf.TodoEmps.Contains(BP.Web.WebUser.No + ",") == false) { gwf.TodoEmps += BP.Web.WebUser.No + "," + BP.Web.WebUser.Name + ";"; gwf.Update(); } } } #endregion 流程设置信息. #region 把主从表数据放入里面. //.工作数据放里面去, 放进去前执行一次装载前填充事件. //重设默认值. if (isView == false && (DataType.IsNullOrEmpty(frmNode.MyPK) == true || (DataType.IsNullOrEmpty(frmNode.MyPK) == false && frmNode.FrmSln != FrmSln.Readonly))) wk.ResetDefaultVal(nd.NodeFrmID, fk_flow, nd.NodeID); //URL参数替换 if (BP.Difference.SystemConfig.isBSsystem == true && isView == false) { // 处理传递过来的参数。 foreach (string k in HttpContextHelper.RequestQueryStringKeys) { if (DataType.IsNullOrEmpty(k) == true) continue; wk.SetValByKey(k, HttpContextHelper.RequestParams(k)); } foreach (string k in HttpContextHelper.RequestParamKeys) { if (DataType.IsNullOrEmpty(k) == true) continue; wk.SetValByKey(k, HttpContextHelper.RequestParams(k)); } //更新到数据库里. wk.DirectUpdate(); } //执行表单事件 MapExts mes = md.MapExts; MapExt me = null; string msg = null; if (isView == false) { msg = ExecEvent.DoFrm(md, EventListFrm.FrmLoadBefore, wk); if (DataType.IsNullOrEmpty(msg) == false) throw new Exception("err@错误:" + msg); //执行装载填充. string mypk = MapExtXmlList.PageLoadFull + "_" + md.No; if (frmNode.ItIsEnableLoadData == true && md.ItIsPageLoadFull == true) { me = mes.GetEntityByKey("MyPK", mypk) as MapExt; //执行通用的装载方法. MapAttrs attrs = md.MapAttrs; MapDtls dtls = md.MapDtls; wk = BP.WF.CCFormAPI.DealPageLoadFull(wk, me, attrs, dtls) as Work; } } //如果是累加表单,就把整个rpt数据都放入里面去. if (nd.FormType == NodeFormType.FoolTruck && nd.ItIsStartNode == false && DataType.IsNullOrEmpty(wk.HisPassedFrmIDs) == false) { GERpt rpt = new GERpt("ND" + int.Parse(nd.FlowNo) + "Rpt", workID); rpt.Copy(wk); DataTable rptdt = rpt.ToDataTableField("MainTable"); myds.Tables.Add(rptdt); } else { DataTable mainTable = wk.ToDataTableField("MainTable"); myds.Tables.Add(mainTable); } string sql = ""; DataTable dt = null; #endregion #region 把外键表加入 DataSet DataTable dtMapAttr = myds.Tables["Sys_MapAttr"]; DataTable ddlTable = new DataTable(); ddlTable.Columns.Add("No"); foreach (DataRow dr in dtMapAttr.Rows) { string lgType = dr["LGType"].ToString(); string uiBindKey = dr["UIBindKey"].ToString(); if (DataType.IsNullOrEmpty(uiBindKey) == true) continue; //为空就continue. if (lgType.Equals("1") == true) continue; //枚举值就continue; //@liuqiang, string uiIsEnable = dr["UIIsEnable"].ToString(); if (uiIsEnable.Equals("0") == true && lgType.Equals("2") == true) continue; //如果是外键,并且是不可以编辑的状态. if (uiIsEnable.Equals("0") == true && lgType.Equals("0") == true) continue; //如果是外部数据源,并且是不可以编辑的状态. // 检查是否有下拉框自动填充。 string keyOfEn = dr["KeyOfEn"].ToString(); string fk_mapData = dr["FK_MapData"].ToString(); #region 处理下拉框数据范围. for 小杨. me = mes.GetEntityByKey(MapExtAttr.ExtType, MapExtXmlList.AutoFullDLL, MapExtAttr.AttrOfOper, keyOfEn) as MapExt; if (me != null && myds.Tables.Contains(keyOfEn) == false) { string fullSQL = me.Doc.Clone() as string; if (fullSQL == null) throw new Exception("err@字段[" + keyOfEn + "]下拉框AutoFullDLL,没有配置SQL"); fullSQL = fullSQL.Replace("~", "'"); fullSQL = BP.WF.Glo.DealExp(fullSQL, wk, null); dt = DBAccess.RunSQLReturnTable(fullSQL); //重构新表 DataTable dt_FK_Dll = new DataTable(); dt_FK_Dll.TableName = keyOfEn;//可能存在隐患,如果多个字段,绑定同一个表,就存在这样的问题. dt_FK_Dll.Columns.Add("No", typeof(string)); dt_FK_Dll.Columns.Add("Name", typeof(string)); foreach (DataRow dllRow in dt.Rows) { DataRow drDll = dt_FK_Dll.NewRow(); drDll["No"] = dllRow["No"]; drDll["Name"] = dllRow["Name"]; dt_FK_Dll.Rows.Add(drDll); } myds.Tables.Add(dt_FK_Dll); continue; } #endregion 处理下拉框数据范围. // 判断是否存在. if (myds.Tables.Contains(uiBindKey) == true) continue; DataTable mydt = BP.Pub.PubClass.GetDataTableByUIBineKey(uiBindKey); if (mydt == null) { DataRow ddldr = ddlTable.NewRow(); ddldr["No"] = uiBindKey; ddlTable.Rows.Add(ddldr); } else { myds.Tables.Add(mydt); } } ddlTable.TableName = "UIBindKey"; myds.Tables.Add(ddlTable); #endregion End把外键表加入DataSet #region 处理流程-消息提示. if (isView == true || fromWorkOpt.Equals("1")) { //如果是查看模式,或者是从WorkOpt打开模式,就不让其显示消息. } else { myds.Tables.Add(GetFlowAlertMsg(gwf, nd, fk_flow, realWorkID, fid)); } #endregion #region 增加流程节点表单绑定信息. myds.Tables.Add(frmNode.ToDataTableField("WF_FrmNode")); if (nd.HisFormType == NodeFormType.RefOneFrmTree) { /* 独立流程节点表单. */ nd.WorkID = workID; //为获取表单ID ( NodeFrmID )提供参数. //设置单据编号,对于绑定的表单. if (nd.ItIsStartNode == true && DataType.IsNullOrEmpty(frmNode.BillNoField) == false) { DataTable dtMain = myds.Tables["MainTable"]; if (dtMain.Columns.Contains(frmNode.BillNoField) == true) { dtMain.Rows[0][frmNode.BillNoField] = wk.GetValStringByKey("BillNo"); } } if (fnc.FWCSta != FrmWorkCheckSta.Disable) { } } #endregion 增加流程节点表单绑定信息. // myds.WriteXml("c:/11.xml"); return myds; } catch (Exception ex) { BP.DA.Log.DebugWriteError(ex.StackTrace); throw new Exception("generoWorkNode@" + ex.Message); } } public static DataTable GetFlowAlertMsg(GenerWorkFlow gwf,Node nd,string fk_flow, Int64 workID, Int64 fid) { string sql = ""; DataTable dt = null; DataTable dtAlert = new DataTable(); dtAlert.TableName = "AlertMsg"; dtAlert.Columns.Add("Title", typeof(string)); dtAlert.Columns.Add("Msg", typeof(string)); dtAlert.Columns.Add("URL", typeof(string)); DataRow drMsg = null; int sta = gwf.GetParaInt("HungupSta"); switch (gwf.WFState) { case WFState.Runing: drMsg = dtAlert.NewRow(); drMsg["Title"] = "挂起信息"; if (sta == 2 && gwf.NodeID == gwf.GetParaInt("HungupNodeID")) { drMsg["Msg"] = "您的工作挂起被拒绝,拒绝原因:" + gwf.GetParaString("HungupCheckMsg"); dtAlert.Rows.Add(drMsg); } break; case WFState.Hungup: if (sta == -1) break; drMsg = dtAlert.NewRow(); drMsg["Title"] = "挂起信息"; if (sta == 0) { string msg1 = "您的工单在挂起状态,等待审批,挂起原因:" + gwf.GetParaString("HungupNote"); if (gwf.GetParaInt("HungupWay") == 1) msg1 += "指定时间解除:" + gwf.GetParaString("1@HungupRelDate"); else msg1 += "无解除时间."; drMsg["Msg"] = msg1; drMsg["Msg"] = msg1;// "您的工作在挂起状态,等待审批,挂起原因:" + gwf.GetParaString("HungupNote"); } if (sta == 1) drMsg["Msg"] = "您的工作在挂起获得同意."; if (sta == 2) drMsg["Msg"] = "您的工作在挂起被拒绝,拒绝原因:" + gwf.GetParaString("HungupCheckMsg"); dtAlert.Rows.Add(drMsg); break; case WFState.AskForReplay: // 返回加签的信息. string mysql = "SELECT Msg,EmpFrom,EmpFromT,RDT FROM ND" + int.Parse(fk_flow) + "Track WHERE WorkID=" + workID + " AND " + TrackAttr.ActionType + "=" + (int)ActionType.ForwardAskfor; DataTable mydt = DBAccess.RunSQLReturnTable(mysql); foreach (DataRow dr in mydt.Rows) { string msgAskFor = dr[0].ToString(); string worker = dr[1].ToString(); string workerName = dr[2].ToString(); string rdt = dr[3].ToString(); drMsg = dtAlert.NewRow(); drMsg["Title"] = worker + "," + workerName + "回复信息:"; drMsg["Msg"] = DataType.ParseText2Html(msgAskFor) + "
" + rdt; dtAlert.Rows.Add(drMsg); } break; case WFState.Askfor: //加签. sql = "SELECT * FROM ND" + int.Parse(fk_flow) + "Track WHERE WorkID=" + workID + " AND " + TrackAttr.ActionType + "=" + (int)ActionType.AskforHelp; dt = DBAccess.RunSQLReturnTable(sql); foreach (DataRow dr in dt.Rows) { string msgAskFor = dr[TrackAttr.Msg].ToString(); string worker = dr[TrackAttr.EmpFrom].ToString(); string workerName = dr[TrackAttr.EmpFromT].ToString(); string rdt = dr[TrackAttr.RDT].ToString(); drMsg = dtAlert.NewRow(); drMsg["Title"] = worker + "," + workerName + "请求加签:"; drMsg["Msg"] = DataType.ParseText2Html(msgAskFor) + "
" + rdt + "回复加签意见 --"; dtAlert.Rows.Add(drMsg); } // isAskFor = true; break; case WFState.ReturnSta: /* 如果工作节点退回了*/ string trackTable = "ND" + int.Parse(nd.FlowNo) + "Track"; sql = "SELECT NDFrom,NDFromT,EmpFrom,EmpFromT,EmpTo,Msg,RDT FROM " + trackTable + " WHERE ActionType IN(2,201) "; //ReturnWorks ens = new ReturnWorks(); if (nd.HisRunModel == RunModel.FL || nd.HisRunModel == RunModel.FHL) { sql += " AND (WorkID=" + workID + " OR FID=" + workID + ") AND NDTo=" + nd.NodeID + " ORDER BY RDT "; /*QueryObject qo = new QueryObject(ens); qo.addLeftBracket(); qo.AddWhere(ReturnWorkAttr.WorkID, realWorkID); qo.addOr(); qo.AddWhere(ReturnWorkAttr.FID, realWorkID); qo.addRightBracket(); qo.addAnd(); qo.AddWhere(ReturnWorkAttr.ReturnToNode,nd.NodeID); qo.addOrderBy("RDT"); qo.DoQuery();*/ } else { sql += " AND WorkID=" + workID + " AND NDTo=" + nd.NodeID + " ORDER BY RDT "; //ens.Retrieve(ReturnWorkAttr.WorkID, realWorkID, ReturnWorkAttr.ReturnToNode, nd.NodeID, "RDT"); } DataTable dtt = DBAccess.RunSQLReturnTable(sql); string msgInfo = ""; foreach (DataRow dr in dtt.Rows) { if (dr[4].ToString().Contains(WebUser.No) == true) { msgInfo += "来自节点:" + dr[1].ToString() + "@退回人:" + dr[3].ToString() + "@退回日期:" + dr[6].ToString(); msgInfo += "@退回原因:" + dr[5].ToString(); msgInfo += "
"; } } msgInfo = msgInfo.Replace("@", "
"); if (string.IsNullOrEmpty(msgInfo) == false) { string str = nd.ReturnAlert; if (str != "") { str = str.Replace("~", "'"); str = str.Replace("@PWorkID", workID.ToString()); str = str.Replace("@PNodeID", nd.NodeID.ToString()); str = str.Replace("@FK_Node", nd.NodeID.ToString()); str = str.Replace("@PFlowNo", fk_flow); str = str.Replace("@FK_Flow", fk_flow); str = str.Replace("@PWorkID", workID.ToString()); str = str.Replace("@WorkID", workID.ToString()); str = str.Replace("@OID", workID.ToString()); drMsg = dtAlert.NewRow(); drMsg["Title"] = "退回信息"; drMsg["Msg"] = msgInfo + "\t\n" + str; dtAlert.Rows.Add(drMsg); } else { drMsg = dtAlert.NewRow(); drMsg["Title"] = "退回信息"; drMsg["Msg"] = msgInfo + "\t\n" + str; dtAlert.Rows.Add(drMsg); } } break; case WFState.Shift: /* 判断移交过来的。 */ string sqlshift = "SELECT * FROM ND" + int.Parse(fk_flow) + "Track WHERE ACTIONTYPE=3 AND WorkID=" + workID + " AND NDFrom='" + gwf.NodeID + "' ORDER BY RDT DESC "; DataTable dtshift = DBAccess.RunSQLReturnTable(sqlshift); string msg = ""; if (dtshift.Rows.Count >= 1) { msg = ""; drMsg = dtAlert.NewRow(); drMsg["Title"] = "移交信息"; // msg = "

移交信息


"; foreach (DataRow dr in dtshift.Rows) { if (WebUser.No == dr[TrackAttr.EmpTo].ToString()) { string empFromT = dr[TrackAttr.EmpFromT].ToString(); string empToT = dr[TrackAttr.EmpToT].ToString(); string msgShift = dr[TrackAttr.Msg].ToString(); string rdt = dr[TrackAttr.RDT].ToString(); if (msgShift == "undefined") msgShift = "无"; msg += "移交人:" + empFromT + "@接受人:" + empToT + "@移交日期:" + rdt; msg += "@移交原因:" + msgShift; msg += "
"; } } msg = msg.Replace("@", "
"); drMsg["Msg"] = msg; if (!string.IsNullOrEmpty(msg)) { dtAlert.Rows.Add(drMsg); } } break; default: break; } //获取催办信息 PushMsgs pms = new PushMsgs(); if (pms.Retrieve(PushMsgAttr.FK_Node, gwf.NodeID, PushMsgAttr.FK_Event, EventListNode.PressAfter) > 0) { string sqlPress = "SELECT MobileInfo FROM Sys_SMS WHERE MsgType='DoPress' AND WorkID=" + gwf.WorkID + " AND IsAlert=0 Order By RDT DESC"; DataTable dtPress = DBAccess.RunSQLReturnTable(sqlPress); if (dtPress.Rows.Count > 0) { drMsg = dtAlert.NewRow(); drMsg["Title"] = "催办信息"; drMsg["Msg"] = dtPress.Rows[0][0].ToString(); dtAlert.Rows.Add(drMsg); } DBAccess.RunSQL("UPDATE Sys_SMS SET IsAlert=1 WHERE MsgType='DoPress' AND WorkID=" + gwf.WorkID + " AND IsAlert=0"); } //拒绝挂起 string sqlRejectHungup = "SELECT MobileInfo FROM Sys_SMS WHERE MsgType='RejectHungup' and WorkID=" + gwf.WorkID + " AND IsAlert=0"; DataTable dtRejectHungup = DBAccess.RunSQLReturnTable(sqlRejectHungup); if (dtRejectHungup.Rows.Count > 0) { drMsg = dtAlert.NewRow(); drMsg["Title"] = "拒绝挂起信息"; foreach (DataRow item in dtRejectHungup.Rows) { drMsg["Msg"] = drMsg["Msg"] + "
" + item[0].ToString(); } dtAlert.Rows.Add(drMsg); } DBAccess.RunSQL("UPDATE Sys_SMS SET IsAlert=1 WHERE MsgType='RejectHungup' AND WorkID=" + gwf.WorkID + " AND IsAlert=0"); return dtAlert; } /// /// 检查流程发起限制 /// /// 流程 /// 开始节点工作 /// public static bool CheckIsCanStartFlow_InitStartFlow(Flow flow) { StartLimitRole role = flow.StartLimitRole; if (role == StartLimitRole.None) return true; string sql = ""; string ptable = flow.PTable; try { #region 按照时间的必须是,在表单加载后判断, 不管用户设置是否正确. DateTime dtNow = DateTime.Now; if (role == StartLimitRole.Day) { /* 仅允许一天发起一次 */ sql = "SELECT COUNT(*) as Num FROM " + ptable + " WHERE RDT LIKE '" + DataType.CurrentDate + "%' AND WFState NOT IN(0,1) AND FlowStarter='" + WebUser.No + "'"; if (DBAccess.RunSQLReturnValInt(sql, 0) == 0) { if (DataType.IsNullOrEmpty(flow.StartLimitPara)) return true; //判断时间是否在设置的发起范围内. 配置的格式为 @11:00-12:00@15:00-13:45 string[] strs = flow.StartLimitPara.Split('@'); foreach (string str in strs) { if (string.IsNullOrEmpty(str)) continue; string[] timeStrs = str.Split('-'); string tFrom = DataType.CurrentDate+ " " + timeStrs[0].Trim(); string tTo = DataType.CurrentDate + " " + timeStrs[1].Trim(); if (DataType.ParseSysDateTime2DateTime(tFrom) <= dtNow && DataType.ParseSysDateTime2DateTime(tTo) >= dtNow) return true; } return false; } else return false; } if (role == StartLimitRole.Week) { /* * 1, 找出周1 与周日分别是第几日. * 2, 按照这个范围去查询,如果查询到结果,就说明已经启动了。 */ sql = "SELECT COUNT(*) as Num FROM " + ptable + " WHERE RDT >= '" + DataType.WeekOfMonday(dtNow) + "' AND WFState NOT IN(0,1) AND FlowStarter='" + WebUser.No + "'"; if (DBAccess.RunSQLReturnValInt(sql, 0) == 0) { if (DataType.IsNullOrEmpty(flow.StartLimitPara)) return true; /*如果没有时间的限制.*/ //判断时间是否在设置的发起范围内. // 配置的格式为 @Sunday,11:00-12:00@Monday,15:00-13:45, 意思是.周日,周一的指定的时间点范围内可以启动流程. string[] strs = flow.StartLimitPara.Split('@'); foreach (string str in strs) { if (string.IsNullOrEmpty(str)) continue; string weekStr = DateTime.Now.DayOfWeek.ToString().ToLower(); if (str.ToLower().Contains(weekStr) == false) continue; // 判断是否当前的周. string[] timeStrs = str.Split(','); string tFrom = DataType.CurrentDate + " " + timeStrs[0].Trim(); string tTo = DataType.CurrentDate + " " + timeStrs[1].Trim(); if (DataType.ParseSysDateTime2DateTime(tFrom) <= dtNow && dtNow >= DataType.ParseSysDateTime2DateTime(tTo)) return true; } return false; } else return false; } // #warning 没有考虑到周的如何处理. if (role == StartLimitRole.Month) { sql = "SELECT COUNT(*) as Num FROM " + ptable + " WHERE FK_NY = '" + DataType.CurrentYearMonth + "' AND WFState NOT IN(0,1) AND FlowStarter='" + WebUser.No + "'"; if (DBAccess.RunSQLReturnValInt(sql, 0) == 0) { if (DataType.IsNullOrEmpty(flow.StartLimitPara)) return true; //判断时间是否在设置的发起范围内. 配置格式: @-01 12:00-13:11@-15 12:00-13:11 , 意思是:在每月的1号,15号 12:00-13:11可以启动流程. string[] strs = flow.StartLimitPara.Split('@'); foreach (string str in strs) { if (string.IsNullOrEmpty(str)) continue; string[] timeStrs = str.Split('-'); string tFrom = DataType.CurrentDate + " " + timeStrs[0].Trim(); string tTo = DataType.CurrentDate + " " + timeStrs[1].Trim(); if (DataType.ParseSysDateTime2DateTime(tFrom) <= dtNow && dtNow >= DataType.ParseSysDateTime2DateTime(tTo)) return true; } return false; } else return false; } if (role == StartLimitRole.JD) { sql = "SELECT COUNT(*) as Num FROM " + ptable + " WHERE FK_NY = '" + DataType.CurrentAPOfJD + "' AND WFState NOT IN(0,1) AND FlowStarter='" + WebUser.No + "'"; if (DBAccess.RunSQLReturnValInt(sql, 0) == 0) { if (DataType.IsNullOrEmpty(flow.StartLimitPara)) return true; //判断时间是否在设置的发起范围内. string[] strs = flow.StartLimitPara.Split('@'); foreach (string str in strs) { if (string.IsNullOrEmpty(str)) continue; string[] timeStrs = str.Split('-'); string tFrom = DataType.CurrentDate + " " + timeStrs[0].Trim(); string tTo = DataType.CurrentDate + " " + timeStrs[1].Trim(); if (DataType.ParseSysDateTime2DateTime(tFrom) <= dtNow && dtNow >= DataType.ParseSysDateTime2DateTime(tTo)) return true; } return false; } else return false; } if (role == StartLimitRole.Year) { sql = "SELECT COUNT(*) as Num FROM " + ptable + " WHERE FK_NY LIKE '" + DataType.CurrentYear + "%' AND WFState NOT IN(0,1) AND FlowStarter='" + WebUser.No + "'"; if (DBAccess.RunSQLReturnValInt(sql, 0) == 0) { if (DataType.IsNullOrEmpty(flow.StartLimitPara)) return true; //判断时间是否在设置的发起范围内. string[] strs = flow.StartLimitPara.Split('@'); foreach (string str in strs) { if (string.IsNullOrEmpty(str)) continue; string[] timeStrs = str.Split('-'); string tFrom = DataType.CurrentDate + " " + timeStrs[0].Trim(); string tTo = DataType.CurrentDate + " " + timeStrs[1].Trim(); if (DataType.ParseSysDateTime2DateTime(tFrom) <= dtNow && dtNow >= DataType.ParseSysDateTime2DateTime(tTo)) return true; } return false; } else return false; } #endregion 按照时间的必须是,在表单加载后判断, 不管用户设置是否正确. //为子流程的时候,该子流程只能被调用一次. if (role == StartLimitRole.OnlyOneSubFlow) { if (BP.Difference.SystemConfig.isBSsystem == true) { string pflowNo = HttpContextHelper.RequestParams("PFlowNo"); string pworkid = HttpContextHelper.RequestParams("PWorkID"); if (pworkid == null) return true; sql = "SELECT Starter, RDT FROM WF_GenerWorkFlow WHERE PWorkID=" + pworkid + " AND FK_Flow='" + flow.No + "'"; DataTable dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count == 0 || dt.Rows.Count == 1) return true; // string title = dt.Rows[0]["Title"].ToString(); string starter = dt.Rows[0]["Starter"].ToString(); string rdt = dt.Rows[0]["RDT"].ToString(); return false; //throw new Exception(flow.StartLimitAlert + "@该子流程已经被[" + starter + "], 在[" + rdt + "]发起,系统只允许发起一次。"); } } // 配置的sql,执行后,返回结果是 0 . if (role == StartLimitRole.ResultIsZero) { sql = BP.WF.Glo.DealExp(flow.StartLimitPara, null); if (DBAccess.RunSQLReturnValInt(sql, 0) == 0) return true; else return false; } // 配置的sql,执行后,返回结果是 <> 0 . if (role == StartLimitRole.ResultIsNotZero) { if (DataType.IsNullOrEmpty(flow.StartLimitPara) == true) return true; sql = BP.WF.Glo.DealExp(flow.StartLimitPara, null); if (DBAccess.RunSQLReturnValInt(sql, 0) != 0) return true; else return false; } return true; } catch (Exception ex) { throw new Exception("err@发起限制规则[" + role.ToString() + "]出现错误:" + ex.Message); } } } }