using System;
using System.Collections.Generic;
using BP.DA;
using System.Data;
using BP.En;
using BP.WF.Template;
using BP.Web;
using BP.Port;
using BP.Sys;
using static iTextSharp.text.pdf.AcroFields;
namespace BP.WF
{
///
/// 计算未来处理人
///
public class FullSA
{
#region 方法.
///
/// 计算两个时间点.
///
///
///
private void InitDT(SelectAccper sa, Node nd)
{
//计算上一个时间的发送点.
if (this.LastTimeDot == null)
{
Paras ps = new Paras();
ps.SQL = "SELECT SDT FROM WF_GenerWorkerlist WHERE WorkID=" + ps.DBStr + "WorkID AND FK_Node=" + ps.DBStr + "FK_Node";
ps.Add("WorkID", this.HisCurrWorkNode.WorkID);
ps.Add("FK_Node", nd.NodeID);
DataTable dt = DBAccess.RunSQLReturnTable(ps);
foreach (DataRow dr in dt.Rows)
{
this.LastTimeDot = dr[0].ToString();
break;
}
}
//上一个节点的发送时间点或者 到期的时间点,就是当前节点的接受任务的时间。
sa.PlanADT = this.LastTimeDot;
//计算当前节点的应该完成日期。
DateTime dtOfShould = Glo.AddDayHoursSpan(this.LastTimeDot, nd.TimeLimit, nd.TimeLimitHH,
nd.TimeLimitMM, nd.TWay);
sa.PlanSDT = dtOfShould.ToString(DataType.SysDatatimeFormat);
//给最后的时间点复制.
this.LastTimeDot = sa.PlanSDT;
}
///
/// 当前节点应该完成的日期.
///
private string LastTimeDot = null;
///
/// 工作Node.
///
public WorkNode HisCurrWorkNode = null;
#endregion 方法.
///
/// 自动计算未来处理人(该方法在发送成功后执行.)
///
public FullSA()
{
}
public Int64 WorkID = 0;
public GERpt geRpt = null;
public GenerWorkFlow gwf = null;
public Work wk = null;
///
/// 自动计算未来处理人(该方法在发送成功后执行.)
///
/// 执行的WorkNode
public void DoIt2023(WorkNode currWorkNode)
{
//如果当前不需要计算未来处理人.
if (currWorkNode.HisFlow.ItIsFullSA == false
&& currWorkNode.ItIsSkip == false)
return;
//如果到达最后一个节点,就不处理了.
if (currWorkNode.HisNode.ItIsEndNode)
return;
//设置变量.
this.WorkID = currWorkNode.WorkID;
this.geRpt = currWorkNode.rptGe;
this.gwf = currWorkNode.HisGenerWorkFlow;
this.wk = currWorkNode.HisWork;
//初始化一些变量.
this.HisCurrWorkNode = currWorkNode;
Node currND = currWorkNode.HisNode;
Int64 workid = currWorkNode.HisWork.OID;
//Node toNode = currWorkNode.NodeSend_GenerNextStepNode(true);
//1.调用处理下一个节点的接收人.
WebUserCopy webUser = new WebUserCopy();
webUser.LoadWebUser();
//获得到达的节点.
Nodes toNodes = currND.HisToNodes;
//调用到达node.
foreach(Node toNode in toNodes)
InitToNode(currWorkNode,toNode, webUser);
//更新人员.
DBAccess.RunSQL("UPDATE WF_SelectAccper SET EmpName = (SELECT Name FROM Port_Emp WHERE NO=WF_SelectAccper.FK_Emp ) WHERE WF_SelectAccper.WorkID=" + this.WorkID);
}
///
/// 处理到达的节点.
///
///
public void InitToNode(WorkNode currWN, Node toNd, WebUserCopy webUser)
{
//工作节点.
WorkNode town = new WorkNode(this.wk, toNd);
town.WebUser= webUser; //更改身份.
town.rptGe = this.geRpt; //设置变量.
town.HisGenerWorkFlow = this.gwf;
//开始找人.
FindWorker fw = new FindWorker();
fw.WebUser = webUser; //设置实体.
fw.currWn = currWN;
Node toNode = town.HisNode;
//if ((currWN.HisNode.TodolistModel == TodolistModel.Teamup || currWN.HisNode.TodolistModel == TodolistModel.TeamupGroupLeader)
// && (toNode.HisDeliveryWay == DeliveryWay.ByStation || toNode.HisDeliveryWay == DeliveryWay.BySenderParentDeptLeader || toNode.HisDeliveryWay == DeliveryWay.BySenderParentDeptStations))
// return Teamup_InitWorkerLists(fw, town);
DataTable dt = null;
try
{
dt = fw.DoIt(currWN.HisFlow, currWN, town);
}
catch(Exception ex)
{
if (ex.Message.Contains("url@") == false)
throw new Exception(ex.Message);
dt = new DataTable();
}
if (dt == null)
throw new Exception(BP.WF.Glo.multilingual("@没有找到接收人.", "WorkNode", "not_found_receiver"));
//删除可能有的数据.
DBAccess.RunSQL("DELETE FROM WF_SelectAccper WHERE WorkID=" + this.WorkID + " AND FK_Node =" + toNode.NodeID);
//把人员保存进去.
SelectAccper sa = new SelectAccper();
foreach (DataRow dr in dt.Rows)
{
string no = dr[0].ToString();
string name = "";
if (dt.Columns.Count==2)
name = dr[0].ToString();
sa = new SelectAccper();
sa.EmpNo = no;
sa.EmpName = name;
sa.NodeID = toNd.NodeID;
sa.NodeName = toNd.Name;
sa.NodeIdx = toNd.Step; //步骤.
sa.WorkID = this.WorkID;
sa.Info = "无";
sa.AccType = 0;
sa.ResetPK();
if (sa.IsExits)
continue;
//计算接受任务时间与应该完成任务时间.
InitDT(sa, toNode);
sa.SetPara("IsFullSA", 0);//IsFullSA是否是计算出的处理人,0表示是,1表示否
sa.Insert();
}
//定义变量.
WebUserCopy myWebUser = new WebUserCopy();
if (DataType.IsNullOrEmpty(sa.EmpNo) == true)
sa.EmpNo = webUser.No;
myWebUser.LoadEmpNo(sa.EmpNo);
//执行抄送.
WorkCC cc=new WorkCC(town, myWebUser);
cc.DoCC("FullSA"); //执行抄送动作.
if (toNd.ItIsEndNode == false)
{
//计算获得到达的节点.
//Node toNodeTo = town.NodeSend_GenerNextStepNode();
Nodes toNodes = toNode.HisToNodes;
//调用到达node.
foreach (Node toNodeTo in toNodes)
InitToNode(town, toNodeTo, myWebUser);
//递归调用.
//InitToNode(town, toNodeTo, myWebUser);
}
}
}
}