using System;
using System.Data;
using BP.En;
using BP.DA;
using BP.Port;
using BP.WF.Template;
namespace BP.WF
{
///
/// 抄送工作逻辑
///
public class WorkCC
{
public WebUserCopy webUser = null;
public WorkNode currWN = null;
public Int64 WorkID = 0;
///
/// 构造WorkCC
///
///
///
///
public WorkCC(WorkNode userWN, WebUserCopy webUser)
{
this.currWN = userWN;
this.WorkID = this.currWN.WorkID;
this.webUser= webUser;
}
///
/// 执行抄送.
///
public void DoCC()
{
//查询出来到达的抄送节点.
Directions dirs = new Directions();
dirs.Retrieve(DirectionAttr.Node, currWN.HisNode.NodeID, DirectionAttr.NodeType, (int)NodeType.CCNode, DirectionAttr.Idx);
if (dirs.Count == 0)
return; //如果没有抄送节点,就不处理.
//定义容器集合,获得可以抄送的节点.
Nodes ccNodes = new Nodes();
foreach (Direction dir in dirs)
{
Conds conds = new Conds();
int i = conds.Retrieve(CondAttr.FK_Node, currWN.HisNode.NodeID,
CondAttr.ToNodeID, dir.ToNode, CondAttr.CondType, (int)CondType.Dir, CondAttr.Idx);
//判断是否通过.
if (i == 0 || conds.GenerResult(currWN.rptGe) == true)
{
Node ccNode = new Node();
ccNode.NodeID = dir.ToNode;
ccNodes.AddEntity(ccNode); //加入到集合.
continue;
}
}
if (ccNodes.Count == 0)
return;
//定义容器:需要多个规则把他们合并.
DataTable dtCCers = new DataTable();
dtCCers.Columns.Add("EmpNo");
dtCCers.Columns.Add("EmpName");
dtCCers.Columns.Add("CCNodeID");
dtCCers.Columns.Add("CCNodeName");
//执行cc
foreach (Node myCCNode in ccNodes)
{
//获得抄送规则集合.
CCRoles rols = new CCRoles();
rols.Retrieve(CCRoleAttr.NodeID, myCCNode.NodeID, "Idx");
string emps = "";
//遍历岗位规则集合.
foreach (CCRole rol in rols)
{
//获得抄送人的集合.
DataTable dt = GenerCCers(rol, this.currWN.rptGe, this.WorkID);
//把数据放进去.
foreach (DataRow dr in dt.Rows)
{
string empNo = dr[0].ToString();
if (DataType.IsNullOrEmpty(empNo) == true)
continue;
if (emps.Contains(empNo + ",") == false)
{
emps += empNo + ",";
//把他加入到集合里.
DataRow mydr = dtCCers.NewRow();
mydr[0] = empNo;
if (dt.Columns.Count == 2)
mydr[1] = dr[1].ToString();
//节点ID.
mydr[2] = rol.NodeID; //抄送的节点.
dtCCers.Rows.Add(mydr);
}
}
}
}
//写入数据:dtCCers
CCList cc = new CCList();
Int64 fid = this.currWN.HisGenerWorkFlow.FID;
string flowNo = this.currWN.HisGenerWorkFlow.FK_Flow;
foreach (DataRow mydr in dtCCers.Rows)
{
string empNo = mydr[0].ToString();
string empName = mydr[1].ToString();
string nodeID = mydr[2].ToString();
string nodeName = mydr[3].ToString();
cc.CCTo = empNo;
cc.CCToName = empName;
cc.NodeID = this.currWN.HisNode.NodeID;
cc.NodeName = this.currWN.HisNode.Name;
cc.ToNodeID = this.currWN.HisNode.NodeID;
cc.ToNodeName = this.currWN.HisNode.Name;
cc.FID = fid;
cc.FK_Flow = flowNo;
cc.FlowName = this.currWN.HisGenerWorkFlow.FlowName;
cc.NodeID = this.currWN.HisNode.NodeID; //节点ID.
cc.Title = this.currWN.HisGenerWorkFlow.Title;
cc.WorkID = this.WorkID;
cc.MyPK = cc.WorkID+"_"+ cc.NodeID+"_"+cc.CCTo;
cc.OrgNo = webUser.OrgNo;
try
{
cc.Insert();
}catch (Exception ex)
{
}
}
}
///
/// 获得人员
///
///
///
///
///
///
public DataTable GenerCCers(CCRole rol, Entity rpt, Int64 workid)
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("No", typeof(string)));
dt.Columns.Add(new DataColumn("Name", typeof(string)));
DataTable mydt = new DataTable();
///按照接受人规则计算.
if (rol.CCRoleExcType == CCRoleExcType.ByDeliveryWay)
{
Node toNode = new Node(rol.NodeID);
WorkNode toWn = new WorkNode(this.currWN.HisWork, toNode);
FindWorker fw = new FindWorker();
DataTable mydt1 = fw.DoIt(this.currWN.HisFlow,this.currWN, toWn);
return mydt1;
}
string sql = "";
if (rol.CCRoleExcType == CCRoleExcType.ByDepts)
{
/*如果抄送到部门. */
// sql = "SELECT A." + BP.Sys.Base.Glo.UserNo + ", A.Name FROM Port_Emp A, WF_CCDept B WHERE B.FK_Dept=A.FK_Dept AND B.FK_Node=" + this.NodeID;
sql = "SELECT A." + BP.Sys.Base.Glo.UserNo + ", A.Name FROM Port_Emp A WHERE A.FK_Dept IN (" + rol.EnIDs + ") ";
mydt = DBAccess.RunSQLReturnTable(sql);
foreach (DataRow mydr in mydt.Rows)
{
DataRow dr = dt.NewRow();
dr["No"] = mydr["No"];
dr["Name"] = mydr["Name"];
dt.Rows.Add(dr);
}
return dt;
}
if (rol.CCRoleExcType == CCRoleExcType.ByEmps)
{
/*如果抄送到人员. */
sql = "SELECT A." + BP.Sys.Base.Glo.UserNo + ", A.Name FROM Port_Emp A, WF_CCEmp B WHERE A." + BP.Sys.Base.Glo.UserNoWhitOutAS + "=B.FK_Emp AND B.FK_Node=" + rol.NodeID;
sql = "SELECT A." + BP.Sys.Base.Glo.UserNo + ", A.Name FROM Port_Emp A WHERE " + BP.Sys.Base.Glo.UserNo + " IN (" + rol.EnIDs + ") ";
mydt = DBAccess.RunSQLReturnTable(sql);
foreach (DataRow mydr in mydt.Rows)
{
DataRow dr = dt.NewRow();
dr["No"] = mydr["No"];
dr["Name"] = mydr["Name"];
dt.Rows.Add(dr);
}
return dt;
}
if (rol.CCRoleExcType == CCRoleExcType.ByStations)
{
if (rol.CCStaWay == WF.CCStaWay.StationOnly)
{
sql = "SELECT " + BP.Sys.Base.Glo.UserNo + ",Name FROM Port_Emp A, Port_DeptEmpStation B WHERE A.No= B.FK_Emp AND B.FK_Station IN (" + rol.EnIDs + ")";
mydt = DBAccess.RunSQLReturnTable(sql);
foreach (DataRow mydr in mydt.Rows)
{
DataRow dr = dt.NewRow();
dr["No"] = mydr["No"];
dr["Name"] = mydr["Name"];
dt.Rows.Add(dr);
}
return dt;
}
if (rol.CCStaWay == WF.CCStaWay.StationSmartCurrNodeWorker || rol.CCStaWay == WF.CCStaWay.StationSmartNextNodeWorker)
{
/*按角色智能计算*/
string deptNo = "";
if (rol.CCStaWay == WF.CCStaWay.StationSmartCurrNodeWorker)
deptNo = BP.Web.WebUser.FK_Dept;
else
deptNo = DBAccess.RunSQLReturnStringIsNull("SELECT FK_Dept FROM WF_GenerWorkerlist WHERE WorkID=" + workid + " AND IsEnable=1 AND IsPass=0", BP.Web.WebUser.FK_Dept);
//sql = "SELECT " + BP.Sys.Base.Glo.UserNo + ",Name FROM Port_Emp A, Port_DeptEmpStation B, WF_CCStation C WHERE A." + BP.Sys.Base.Glo.UserNoWhitOutAS + "=B.FK_Emp AND B.FK_Station=C.FK_Station AND C.FK_Node=" + this.NodeID + " AND B.FK_Dept='" + deptNo + "'";
sql = "SELECT " + BP.Sys.Base.Glo.UserNo + ",Name FROM Port_Emp A, Port_DeptEmpStation B, WHERE A." + BP.Sys.Base.Glo.UserNoWhitOutAS + "=B.FK_Emp AND B.FK_Station IN (" + rol.EnIDs + ") AND B.FK_Dept='" + deptNo + "'";
mydt = DBAccess.RunSQLReturnTable(sql);
foreach (DataRow mydr in mydt.Rows)
{
DataRow dr = dt.NewRow();
dr["No"] = mydr["No"];
dr["Name"] = mydr["Name"];
dt.Rows.Add(dr);
}
return dt;
}
if (rol.CCStaWay == WF.CCStaWay.StationAndDept)
{
throw new Exception("err@没有解析StationAndDept. ");
//sql = "SELECT " + BP.Sys.Base.Glo.UserNo + ",Name FROM Port_Emp A, Port_DeptEmpStation B, WF_CCStation C, WF_CCDept D WHERE A." + BP.Sys.Base.Glo.UserNoWhitOutAS + "=B.FK_Emp AND B.FK_Station=C.FK_Station AND A.FK_Dept=D.FK_Dept AND B.FK_Dept=D.FK_Dept AND C.FK_Node=" + this.NodeID + " AND D.FK_Node=" + this.NodeID;
sql = "SELECT " + BP.Sys.Base.Glo.UserNo + ",Name FROM Port_Emp A, Port_DeptEmpStation B, WF_CCStation C, WF_CCDept D WHERE A.No=B.FK_Emp AND B.FK_Station=C.FK_Station AND A.FK_Dept=D.FK_Dept AND B.FK_Dept=D.FK_Dept AND C.FK_Node=" + rol.NodeID + " AND D.FK_Node=" + rol.NodeID;
mydt = DBAccess.RunSQLReturnTable(sql);
foreach (DataRow mydr in mydt.Rows)
{
DataRow dr = dt.NewRow();
dr["No"] = mydr["No"];
dr["Name"] = mydr["Name"];
dt.Rows.Add(dr);
}
return dt;
}
if (rol.CCStaWay == CCStaWay.StationDeptUpLevelCurrNodeWorker ||
rol.CCStaWay == CCStaWay.StationDeptUpLevelNextNodeWorker)
{
// 求当事人的部门编号.
string deptNo = "";
if (rol.CCStaWay == CCStaWay.StationDeptUpLevelCurrNodeWorker)
deptNo = BP.Web.WebUser.FK_Dept;
if (rol.CCStaWay == CCStaWay.StationDeptUpLevelNextNodeWorker)
deptNo = DBAccess.RunSQLReturnStringIsNull("SELECT FK_Dept FROM WF_GenerWorkerlist WHERE WorkID=" + workid + " AND IsEnable=1 AND IsPass=0", webUser.DeptNo);
while (true)
{
BP.Port.Dept dept = new Dept(deptNo);
//sql = "SELECT " + BP.Sys.Base.Glo.UserNo + ",Name FROM Port_Emp A, Port_DeptEmpStation B, WF_CCStation C WHERE A." + BP.Sys.Base.Glo.UserNoWhitOutAS + "=B.FK_Emp AND B.FK_Station=C.FK_Station AND C.FK_Node=" + this.NodeID + " AND B.FK_Dept='" + deptNo + "'";
sql = "SELECT " + BP.Sys.Base.Glo.UserNo + ",Name FROM Port_Emp A, Port_DeptEmpStation B WHERE A.No=B.FK_Emp AND B.FK_Station IN (" + rol.EnIDs + ") AND B.FK_Dept='" + deptNo + "'";
mydt = DBAccess.RunSQLReturnTable(sql);
foreach (DataRow mydr in mydt.Rows)
{
DataRow dr = dt.NewRow();
dr["No"] = mydr["No"];
dr["Name"] = mydr["Name"];
dt.Rows.Add(dr);
}
if (dept.ParentNo == "0")
break;
deptNo = dept.ParentNo;
}
return dt;
}
}
if (rol.CCRoleExcType == CCRoleExcType.BySQLs)
{
sql = rol.EnIDs.Clone() as string;
sql = sql.Replace("@WebUser.No", webUser.No);
sql = sql.Replace("@WebUser.Name", webUser.Name);
sql = sql.Replace("@WebUser.FK_Dept", webUser.DeptNo);
if (sql.Contains("@") == true)
sql = BP.WF.Glo.DealExp(sql, rpt, null);
/*按照SQL抄送. */
mydt = DBAccess.RunSQLReturnTable(sql);
foreach (DataRow mydr in mydt.Rows)
{
DataRow dr = dt.NewRow();
dr["No"] = mydr["No"];
dr["Name"] = mydr["Name"];
dt.Rows.Add(dr);
}
return dt;
}
/**按照表单字段抄送*/
if (rol.CCRoleExcType == CCRoleExcType.ByFrmField)
{
if (DataType.IsNullOrEmpty(rol.EnIDs) == true)
throw new Exception("抄送规则自动抄送选择按照表单字段抄送没有设置抄送人员字段");
string[] attrs = rol.EnIDs.Split(',');
foreach (string attr in attrs)
{
string ccers = rpt.GetValStrByKey(attr);
if (DataType.IsNullOrEmpty(ccers) == false)
{
//判断该字段是否启用了pop返回值?
sql = "SELECT Tag1 AS VAL FROM Sys_FrmEleDB WHERE RefPKVal=" + workid + " AND EleID='" + attr + "'";
DataTable dtVals = DBAccess.RunSQLReturnTable(sql);
string emps = "";
//获取接受人并格式化接受人,
if (dtVals.Rows.Count > 0)
{
foreach (DataRow dr in dtVals.Rows)
emps += dr[0].ToString() + ",";
}
else
{
emps = ccers;
}
//end判断该字段是否启用了pop返回值
emps = emps.Replace(" ", ""); //去掉空格.
if (DataType.IsNullOrEmpty(emps) == false)
{
/*如果包含,; 例如 zhangsan,张三;lisi,李四;*/
string[] ccemp = emps.Split(',');
foreach (string empNo in ccemp)
{
if (DataType.IsNullOrEmpty(empNo) == true)
continue;
Emp emp = new Emp();
emp.UserID = empNo;
if (emp.RetrieveFromDBSources() == 1)
{
DataRow dr = dt.NewRow();
dr["No"] = empNo;
dr["Name"] = emp.Name;
dt.Rows.Add(dr);
}
}
}
}
}
return dt;
}
throw new Exception("err@没有解析的设置." + rol.CCRoleExcType);
}
}
}