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);
}
}
}
}