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.
222 lines
9.1 KiB
Plaintext
222 lines
9.1 KiB
Plaintext
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 (this.ExeExp(exp, wk) == false)
|
|
{
|
|
// msg += "err@条件表达式配置错误:"+exp;
|
|
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;
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 计算表达式是否通过(或者是否正确.)
|
|
/// </summary>
|
|
/// <param name="exp">表达式</param>
|
|
/// <param name="en">实体</param>
|
|
/// <returns>true/false</returns>
|
|
public bool ExeExp(string exp, Entity en)
|
|
{
|
|
exp = exp.Replace("@WebUser.No", WebUser.No);
|
|
exp = exp.Replace("@WebUser.Name", WebUser.Name);
|
|
exp = exp.Replace("@WebUser.FK_DeptNameOfFull", WebUser.FK_DeptNameOfFull);
|
|
exp = exp.Replace("@WebUser.FK_DeptName", WebUser.FK_DeptName);
|
|
exp = exp.Replace("@WebUser.FK_Dept", WebUser.FK_Dept);
|
|
|
|
exp = exp.Replace("@RDT", DataType.CurrentDate);
|
|
exp = exp.Replace("@DateTime", DataType.CurrentDateTime);
|
|
|
|
|
|
string[] strs = exp.Split(' ');
|
|
bool isPass = false;
|
|
|
|
string key = strs[0].Trim();
|
|
string oper = strs[1].Trim();
|
|
string val = strs[2].Trim();
|
|
val = val.Replace("'", "");
|
|
val = val.Replace("%", "");
|
|
val = val.Replace("~", "");
|
|
BP.En.Row row = en.Row;
|
|
foreach (string item in row.Keys)
|
|
{
|
|
if (key != item.Trim())
|
|
continue;
|
|
|
|
string valPara = row[key].ToString();
|
|
if (oper == "=")
|
|
{
|
|
if (valPara == val)
|
|
return true;
|
|
}
|
|
|
|
if (oper.ToUpper() == "LIKE")
|
|
{
|
|
if (valPara.Contains(val))
|
|
return true;
|
|
}
|
|
|
|
if (oper == ">")
|
|
{
|
|
if (float.Parse(valPara) > float.Parse(val))
|
|
return true;
|
|
}
|
|
if (oper == ">=")
|
|
{
|
|
if (float.Parse(valPara) >= float.Parse(val))
|
|
return true;
|
|
}
|
|
if (oper == "<")
|
|
{
|
|
if (float.Parse(valPara) < float.Parse(val))
|
|
return true;
|
|
}
|
|
if (oper == "<=")
|
|
{
|
|
if (float.Parse(valPara) <= float.Parse(val))
|
|
return true;
|
|
}
|
|
|
|
if (oper == "!=")
|
|
{
|
|
if (float.Parse(valPara) != float.Parse(val))
|
|
return true;
|
|
}
|
|
throw new Exception("@参数格式错误:" + exp + " Key=" + key + " oper=" + oper + " Val=" + val);
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
}
|