You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
6.4 KiB
Plaintext

11 months ago
using System;
using System.Data;
using BP.DA;
using BP.Port;
using BP.En;
using BP.Web;
namespace BP.WF.DTS
{
/// <summary>
/// 处理延期的任务 的摘要说明
/// </summary>
public class DTS_DealDeferredWork : Method
{
/// <summary>
/// 处理延期的任务
/// </summary>
public DTS_DealDeferredWork()
{
this.Title = "处理逾期的任务";
this.Help = "需要每天执行一次,对于已经逾期的工作,按照逾期的规则处理。";
this.GroupName = "流程自动执行定时任务";
}
/// <summary>
/// 设置执行变量
/// </summary>
/// <returns></returns>
public override void Init()
{
//this.Warning = "您确定要执行吗?";
//HisAttrs.AddTBString("P1", null, "原密码", true, false, 0, 10, 10);
//HisAttrs.AddTBString("P2", null, "新密码", true, false, 0, 10, 10);
//HisAttrs.AddTBString("P3", null, "确认", true, false, 0, 10, 10);
}
/// <summary>
/// 当前的操纵员是否可以执行这个方法
/// </summary>
public override bool IsCanDo
{
get
{
return true;
}
}
/// <summary>
/// 执行
/// </summary>
/// <returns>返回执行结果</returns>
public override object Do()
{
//string sql = "SELECT * FROM WF_EmpWorks WHERE FK_Node IN (SELECT NodeID FROM WF_Node WHERE OutTimeDeal >0 ) AND SDT <='" + DataType.CurrentDate + "' ORDER BY FK_Emp";
//改成小于号SDT <'" + DataType.CurrentDate
string sql = "SELECT * FROM WF_EmpWorks WHERE FK_Node IN (SELECT NodeID FROM WF_Node WHERE OutTimeDeal >0 ) AND SDT <'" + DataType.CurrentDate + "' ORDER BY FK_Emp";
//string sql = "SELECT * FROM WF_EmpWorks WHERE FK_Node IN (SELECT NodeID FROM WF_Node WHERE OutTimeDeal >0 ) AND SDT <='2013-12-30' ORDER BY FK_Emp";
DataTable dt = DBAccess.RunSQLReturnTable(sql);
string msg = "";
string dealWorkIDs = "";
foreach (DataRow dr in dt.Rows)
{
string FK_Emp = dr["FK_Emp"].ToString();
string fk_flow = dr["FK_Flow"].ToString();
int fk_node = int.Parse(dr["FK_Node"].ToString());
Int64 workid = Int64.Parse(dr["WorkID"].ToString());
Int64 fid = Int64.Parse(dr["FID"].ToString());
// 方式两个人同时处理一件工作, 一个人处理后,另外一个人还可以处理的情况.
if (dealWorkIDs.Contains("," + workid + ","))
continue;
dealWorkIDs += "," + workid + ",";
if (WebUser.No != FK_Emp)
{
Emp emp = new Emp(FK_Emp);
BP.Web.WebUser.SignInOfGener(emp);
}
BP.WF.Node nd = new BP.WF.Node();
nd.NodeID = fk_node;
nd.Retrieve();
// 首先判断是否有启动的表达式, 它是是否自动执行的总阀门。
if (DataType.IsNullOrEmpty(nd.DoOutTimeCond) == false)
{
Node nodeN = new Node(nd.NodeID);
Work wk = nodeN.HisWork;
wk.OID = workid;
wk.Retrieve();
string exp = nd.DoOutTimeCond.Clone() as string;
if (Glo.ExeExp(exp, wk) == false)
continue; // 不能通过条件的设置.
}
switch (nd.HisOutTimeDeal)
{
case OutTimeDeal.None:
break;
case OutTimeDeal.AutoTurntoNextStep: //自动转到下一步骤.
if (DataType.IsNullOrEmpty(nd.DoOutTime))
{
/*如果是空的,没有特定的点允许,就让其它向下执行。*/
msg += BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid).ToMsgOfText();
}
else
{
int nextNode = Dev2Interface.Node_GetNextStepNode(fk_flow, workid);
if (nd.DoOutTime.Contains(nextNode.ToString())) /*如果包含了当前点的ID,就让它执行下去.*/
msg += BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid).ToMsgOfText();
}
break;
case OutTimeDeal.AutoJumpToSpecNode: //自动的跳转下一个节点.
if (DataType.IsNullOrEmpty(nd.DoOutTime))
throw new Exception("@设置错误,没有设置要跳转的下一步节点.");
int nextNodeID = int.Parse(nd.DoOutTime);
msg += BP.WF.Dev2Interface.Node_SendWork(fk_flow, workid, null, null, nextNodeID, null).ToMsgOfText();
break;
case OutTimeDeal.AutoShiftToSpecUser: //移交给指定的人员.
msg += BP.WF.Dev2Interface.Node_Shift( workid,nd.DoOutTime, "来自ccflow的自动消息:(" + BP.Web.WebUser.Name + ")工作未按时处理(" + nd.Name + "),现在移交给您。");
break;
case OutTimeDeal.SendMsgToSpecUser: //向指定的人员发消息.
BP.WF.Dev2Interface.Port_SendMsg(nd.DoOutTime,
"来自ccflow的自动消息:(" + BP.Web.WebUser.Name + ")工作未按时处理(" + nd.Name + ")",
"感谢您选择ccflow.", "SpecEmp" + workid);
break;
case OutTimeDeal.DeleteFlow: //删除流程.
msg += BP.WF.Dev2Interface.Flow_DoDeleteFlowByReal( workid, true);
break;
case OutTimeDeal.RunSQL:
msg += DBAccess.RunSQL(nd.DoOutTime);
break;
default:
throw new Exception("@错误没有判断的超时处理方式." + nd.HisOutTimeDeal);
}
}
Emp emp1 = new Emp("admin");
BP.Web.WebUser.SignInOfGener(emp1);
return msg;
}
}
}