void btn_Click(object sender, EventArgs e) { MapData md = new MapData(this.FK_MapData); md = this.Pub1.Copy(md) as MapData; md.TableCol = this.Pub1.GetDDLByID("DDL_Col").SelectedItemIntVal; md.Update(); try { FrmWorkCheck fwc = new FrmWorkCheck(md.No); fwc.HisFrmWorkCheckSta = (FrmWorkCheckSta)this.Pub1.GetDDLByID("DDL_FWC").SelectedItemIntVal; fwc.Update(); } catch { } BP.Sys.PubClass.WinClose(); }
/// <summary> /// 获取流程的JSON数据,以供显示工作轨迹/流程设计 /// </summary> /// <param name="fk_flow">流程编号</param> /// <param name="workid">工作编号</param> /// <param name="fid">父流程编号</param> /// <returns></returns> public string Chart_Init() { string fk_flow = this.FK_Flow; Int64 workid = this.WorkID; Int64 fid = this.FID; DataSet ds = new DataSet(); DataTable dt = null; string json = string.Empty; try { //获取流程信息 var sql = "SELECT No \"No\", Name \"Name\", Paras \"Paras\", ChartType \"ChartType\" FROM WF_Flow WHERE No='" + fk_flow + "'"; dt = DBAccess.RunSQLReturnTable(sql); dt.TableName = "WF_Flow"; ds.Tables.Add(dt); //获取流程中的节点信息 sql = "SELECT NodeID \"ID\", Name \"Name\", ICON \"Icon\", X \"X\", Y \"Y\", NodePosType \"NodePosType\",RunModel \"RunModel\",HisToNDs \"HisToNDs\",TodolistModel \"TodolistModel\" FROM WF_Node WHERE FK_Flow='" + fk_flow + "' ORDER BY Step"; dt = DBAccess.RunSQLReturnTable(sql); dt.TableName = "WF_Node"; ds.Tables.Add(dt); //获取流程中的标签信息 sql = "SELECT MyPK \"MyPK\", Name \"Name\", X \"X\", Y \"Y\" FROM WF_LabNote WHERE FK_Flow='" + fk_flow + "'"; dt = DBAccess.RunSQLReturnTable(sql); dt.TableName = "WF_LabNote"; ds.Tables.Add(dt); //获取流程中的线段方向信息 sql = "SELECT Node \"Node\", ToNode \"ToNode\", 0 as \"DirType\", 0 as \"IsCanBack\",Dots \"Dots\" FROM WF_Direction WHERE FK_Flow='" + fk_flow + "'"; dt = DBAccess.RunSQLReturnTable(sql); dt.TableName = "WF_Direction"; ds.Tables.Add(dt); if (workid != 0) { //获取流程信息,added by liuxc,2016-10-26 //sql = // "SELECT wgwf.Starter,wgwf.StarterName,wgwf.RDT,wgwf.WFSta,wgwf.WFState FROM WF_GenerWorkFlow wgwf WHERE wgwf.WorkID = " + // workid; sql = "SELECT wgwf.Starter as \"Starter\"," + " wgwf.StarterName as \"StarterName\"," + " wgwf.RDT as \"RDT\"," + " wgwf.WFSta as \"WFSta\"," + " se.Lab as \"WFStaText\"," + " wgwf.WFState as \"WFState\"," + " wgwf.FID as \"FID\"," + " wgwf.PWorkID as \"PWorkID\"," + " wgwf.PFlowNo as \"PFlowNo\"," + " wgwf.PNodeID as \"PNodeID\"," + " wgwf.FK_Flow as \"FK_Flow\"," + " wgwf.FK_Node as \"FK_Node\"," + " wgwf.Title as \"Title\"," + " wgwf.WorkID as \"WorkID\"," + " wgwf.NodeName as \"NodeName\"," + " wf.Name as \"FlowName\"" + " FROM WF_GenerWorkFlow wgwf" + " INNER JOIN WF_Flow wf" + " ON wf.No = wgwf.FK_Flow" + " INNER JOIN Sys_Enum se" + " ON se.IntKey = wgwf.WFSta" + " AND se.EnumKey = 'WFSta'" + " WHERE wgwf.WorkID = {0}" + " OR wgwf.FID = {0}" + " OR wgwf.PWorkID = {0}" + " ORDER BY" + " wgwf.RDT DESC"; dt = DBAccess.RunSQLReturnTable(string.Format(sql, workid)); dt.TableName = "FlowInfo"; ds.Tables.Add(dt); //获得流程状态. WFState wfState = (WFState)int.Parse(dt.Rows[0]["WFState"].ToString()); String fk_Node = dt.Rows[0]["FK_Node"].ToString(); //把节点审核配置信息. FrmWorkCheck fwc = new FrmWorkCheck(fk_Node); ds.Tables.Add(fwc.ToDataTableField("FrmWorkCheck")); //获取工作轨迹信息 var trackTable = "ND" + int.Parse(fk_flow) + "Track"; sql = "SELECT FID \"FID\",NDFrom \"NDFrom\",NDFromT \"NDFromT\",NDTo \"NDTo\", NDToT \"NDToT\", ActionType \"ActionType\",ActionTypeText \"ActionTypeText\",Msg \"Msg\",RDT \"RDT\",EmpFrom \"EmpFrom\",EmpFromT \"EmpFromT\", EmpToT \"EmpToT\",EmpTo \"EmpTo\" FROM " + trackTable + " WHERE WorkID=" + workid + (fid == 0 ? (" OR FID=" + workid) : (" OR WorkID=" + fid + " OR FID=" + fid)) + " ORDER BY RDT ASC"; dt = DBAccess.RunSQLReturnTable(sql); //判断轨迹数据中,最后一步是否是撤销或退回状态的,如果是,则删除最后2条数据 if (dt.Rows.Count > 0) { if (Equals(dt.Rows[0]["ACTIONTYPE"], (int)ActionType.Return) || Equals(dt.Rows[0]["ACTIONTYPE"], (int)ActionType.UnSend)) { if (dt.Rows.Count > 1) { dt.Rows.RemoveAt(0); dt.Rows.RemoveAt(0); } else { dt.Rows.RemoveAt(0); } } } dt.TableName = "Track"; ds.Tables.Add(dt); //获取预先计算的节点处理人,以及处理时间,added by liuxc,2016-4-15 sql = "SELECT wsa.FK_Node as \"FK_Node\",wsa.FK_Emp as \"FK_Emp\",wsa.EmpName as \"EmpName\",wsa.TimeLimit as \"TimeLimit\",wsa.TSpanHour as \"TSpanHour\",wsa.ADT as \"ADT\",wsa.SDT as \"SDT\" FROM WF_SelectAccper wsa WHERE wsa.WorkID = " + workid; dt = DBAccess.RunSQLReturnTable(sql); // dt.TableName = "POSSIBLE"; dt.TableName = "Possible"; ds.Tables.Add(dt); //获取节点处理人数据,及处理/查看信息 sql = "SELECT wgw.FK_Emp as \"FK_Emp\",wgw.FK_Node as \"FK_Node\",wgw.FK_EmpText as \"FK_EmpText\",wgw.RDT as \"RDT\",wgw.IsRead as \"IsRead\",wgw.IsPass as \"IsPass\" FROM WF_GenerWorkerlist wgw WHERE wgw.WorkID = " + workid + (fid == 0 ? (" OR FID=" + workid) : (" OR WorkID=" + fid + " OR FID=" + fid)); dt = DBAccess.RunSQLReturnTable(sql); dt.TableName = "DISPOSE"; ds.Tables.Add(dt); //如果流程没有完成. if (wfState != WFState.Complete) { GenerWorkerLists gwls = new GenerWorkerLists(); Int64 id = this.FID; if (id == 0) { id = this.WorkID; } QueryObject qo = new QueryObject(gwls); qo.AddWhere(GenerWorkerListAttr.FID, id); qo.addOr(); qo.AddWhere(GenerWorkerListAttr.WorkID, id); qo.DoQuery(); DataTable dtGwls = gwls.ToDataTableField("WF_GenerWorkerList"); ds.Tables.Add(dtGwls); } } else { var trackTable = "ND" + int.Parse(fk_flow) + "Track"; sql = "SELECT NDFrom \"NDFrom\", NDTo \"NDTo\",ActionType \"ActionType\",ActionTypeText \"ActionTypeText\",Msg \"Msg\",RDT \"RDT\",EmpFrom \"EmpFrom\",EmpFromT \"EmpFromT\",EmpToT \"EmpToT\",EmpTo \"EmpTo\" FROM " + trackTable + " WHERE WorkID=0 ORDER BY RDT ASC"; dt = DBAccess.RunSQLReturnTable(sql); dt.TableName = "TRACK"; ds.Tables.Add(dt); } //for (int i = 0; i < ds.Tables.Count; i++) //{ // dt = ds.Tables[i]; // dt.TableName = dt.TableName.ToUpper(); // for (int j = 0; j < dt.Columns.Count; j++) // { // dt.Columns[j].ColumnName = dt.Columns[j].ColumnName.ToUpper(); // } //} string str = BP.Tools.Json.DataSetToJson(ds); // DataType.WriteFile("c:\\GetFlowTrackJsonData_CCflow.txt", str); return(str); } catch (Exception ex) { return("err@" + ex.Message); } return(json); }
/// <summary> /// 时间轴 /// </summary> /// <returns></returns> public string TimeBase_Init() { DataSet ds = new DataSet(); //获取track. DataTable dt = BP.WF.Dev2Interface.DB_GenerTrackTable(this.FK_Flow, this.WorkID, this.FID); ds.Tables.Add(dt); #region 父子流程数据存储到这里. Hashtable ht = new Hashtable(); foreach (DataRow dr in dt.Rows) { ActionType at = (ActionType)int.Parse(dr[TrackAttr.ActionType].ToString()); string tag = dr[TrackAttr.Tag].ToString(); //标识. string mypk = dr[TrackAttr.MyPK].ToString(); //主键. string msg = ""; if (at == ActionType.CallChildenFlow) { //被调用父流程吊起。 if (DataType.IsNullOrEmpty(tag) == false) { AtPara ap = new AtPara(tag); GenerWorkFlow mygwf = new GenerWorkFlow(); mygwf.WorkID = ap.GetValInt64ByKey("PWorkID"); if (mygwf.RetrieveFromDBSources() == 1) { msg = "<p>操作员:{" + dr[TrackAttr.EmpFromT].ToString() + "}在当前节点上,被父流程{" + mygwf.FlowName + "},<a target=b" + ap.GetValStrByKey("PWorkID") + " href='Track.aspx?WorkID=" + ap.GetValStrByKey("PWorkID") + "&FK_Flow=" + ap.GetValStrByKey("PFlowNo") + "' >" + msg + "</a></p>"; } else { msg = "<p>操作员:{" + dr[TrackAttr.EmpFromT].ToString() + "}在当前节点上,被父流程调用{" + mygwf.FlowName + "},但是该流程被删除了.</p>" + tag; } msg = "<a target=b" + ap.GetValStrByKey("PWorkID") + " href='Track.aspx?WorkID=" + ap.GetValStrByKey("PWorkID") + "&FK_Flow=" + ap.GetValStrByKey("PFlowNo") + "' >" + msg + "</a>"; } //放入到ht里面. ht.Add(mypk, msg); } if (at == ActionType.StartChildenFlow) { if (DataType.IsNullOrEmpty(tag) == false) { if (tag.Contains("Sub")) { tag = tag.Replace("Sub", "C"); } AtPara ap = new AtPara(tag); GenerWorkFlow mygwf = new GenerWorkFlow(); mygwf.WorkID = ap.GetValInt64ByKey("CWorkID"); if (mygwf.RetrieveFromDBSources() == 1) { msg = "<p>操作员:{" + dr[TrackAttr.EmpFromT].ToString() + "}在当前节点上调用了子流程{" + mygwf.FlowName + "}, <a target=b" + ap.GetValStrByKey("CWorkID") + " href='Track.aspx?WorkID=" + ap.GetValStrByKey("CWorkID") + "&FK_Flow=" + ap.GetValStrByKey("CFlowNo") + "' >" + msg + "</a></p>"; msg += "<p>当前子流程状态:{" + mygwf.WFStateText + "},运转到:{" + mygwf.NodeName + "},最后处理人{" + mygwf.TodoEmps + "},最后处理时间{" + mygwf.RDT + "}。</p>"; } else { msg = "<p>操作员:{" + dr[TrackAttr.EmpFromT].ToString() + "}在当前节点上调用了子流程{" + mygwf.FlowName + "},但是该流程被删除了.</p>" + tag; } } //放入到ht里面. ht.Add(mypk, msg); } } #endregion //获取 WF_GenerWorkFlow GenerWorkFlow gwf = new GenerWorkFlow(); gwf.WorkID = this.WorkID; gwf.RetrieveFromDBSources(); ds.Tables.Add(gwf.ToDataTableField("WF_GenerWorkFlow")); if (gwf.WFState != WFState.Complete) { GenerWorkerLists gwls = new GenerWorkerLists(); gwls.Retrieve(GenerWorkerListAttr.WorkID, this.WorkID); ds.Tables.Add(gwls.ToDataTableField("WF_GenerWorkerList")); } //把节点审核配置信息. FrmWorkCheck fwc = new FrmWorkCheck(gwf.FK_Node); ds.Tables.Add(fwc.ToDataTableField("FrmWorkCheck")); //返回结果. return(BP.Tools.Json.DataSetToJson(ds, false)); }
/// <summary> /// 执行撤消 /// </summary> private string DoUnSendIt() { GenerWorkFlow gwf = new GenerWorkFlow(this.WorkID); if (gwf.WFState == WFState.Complete) { return("err@该流程已经完成,您不能撤销。"); } // 如果停留的节点是分合流。 Node nd = new Node(gwf.FK_Node); /*该节点不允许退回.*/ if (nd.HisCancelRole == CancelRole.None) { throw new Exception("当前节点,不允许撤销。"); } if (nd.IsStartNode && nd.HisNodeWorkType != NodeWorkType.StartWorkFL) { throw new Exception("当前节点是开始节点,所以您不能撤销。"); } //如果撤销到的节点和当前流程运行到的节点相同,则是分流、或者分河流 if (this.UnSendToNode == nd.NodeID) { //如果当前节点是分流、分合流节点则可以撤销 if (nd.HisNodeWorkType == NodeWorkType.StartWorkFL || nd.HisNodeWorkType == NodeWorkType.WorkFL || nd.HisNodeWorkType == NodeWorkType.WorkFHL) { //获取当前节点的子线程 string truckTable = "ND" + int.Parse(nd.FK_Flow) + "Track"; string threadSQL = "SELECT FK_Node,WorkID FROM WF_GenerWorkFlow WHERE FID=" + this.WorkID + " AND FK_Node" + " IN(SELECT DISTINCT(NDTo) FROM " + truckTable + " WHERE ActionType=" + (int)ActionType.ForwardFL + " AND WorkID=" + this.WorkID + " AND NDFrom='" + nd.NodeID + "'" + " ) "; DataTable dt = DBAccess.RunSQLReturnTable(threadSQL); if (dt == null || dt.Rows.Count == 0) { throw new Exception("err@流程运行错误:当不存在子线程时,改过程应该处于待办状态"); } foreach (DataRow dr in dt.Rows) { Node threadnd = new Node(dr["FK_Node"].ToString()); // 调用撤消发送前事件。 nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneBefore, nd, nd.HisWork, null); BP.WF.Dev2Interface.Node_FHL_KillSubFlow(threadnd.FK_Flow, this.WorkID, long.Parse(dr["WorkID"].ToString())); //杀掉子线程. // 调用撤消发送前事件。 nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneAfter, nd, nd.HisWork, null); } return("撤销成功"); } } //如果启用了对方已读,就不能撤销. if (nd.CancelDisWhenRead == true) { //撤销到的节点是干流程节点/子线程撤销到子线程 int i = DBAccess.RunSQLReturnValInt("SELECT SUM(IsRead) AS Num FROM WF_GenerWorkerList WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node, 0); if (i >= 1) { return("err@当前待办已经有[" + i + "]个工作人员打开了该工作,您不能执行撤销."); } else { //干流节点撤销到子线程 i = DBAccess.RunSQLReturnValInt("SELECT SUM(IsRead) AS Num FROM WF_GenerWorkerList WHERE WorkID=" + this.FID + " AND FK_Node=" + gwf.FK_Node, 0); if (i >= 1) { return("err@当前待办已经有[" + i + "]个工作人员打开了该工作,您不能执行撤销."); } } } #region 如果是越轨流程状态 @fanleiwei. string sql = "SELECT COUNT(*) AS Num FROM WF_GenerWorkerlist WHERE WorkID=" + this.WorkID + " AND IsPass=80"; if (DBAccess.RunSQLReturnValInt(sql, 0) != 0) { //求出来越轨子流程workid并把它删除掉. GenerWorkFlow gwfSubFlow = new GenerWorkFlow(); int i = gwfSubFlow.Retrieve(GenerWorkFlowAttr.PWorkID, this.WorkID); if (i == 1) { BP.WF.Dev2Interface.Flow_DoDeleteFlowByReal(gwfSubFlow.FK_Flow, gwfSubFlow.WorkID, true); } //执行回复当前节点待办.. sql = "UPDATE WF_GenerWorkerlist SET IsPass=0 WHERE IsPass=80 AND FK_Node=" + gwf.FK_Node + " AND WorkID=" + this.WorkID; DBAccess.RunSQL(sql); return("撤销延续流程执行成功,撤销到[" + gwf.NodeName + "],撤销给[" + gwf.TodoEmps + "]"); } #endregion 如果是越轨流程状态 . if (BP.WF.Dev2Interface.Flow_IsCanDoCurrentWork(this.WorkID, WebUser.No) == true) { return("info@您有处理当前工作的权限,可能您已经执行了撤销,请使用退回或者发送功能."); } #region 判断是否是会签状态,是否是会签人做的撤销. 主持人是不能撤销的. if (gwf.HuiQianTaskSta != HuiQianTaskSta.None) { string IsEnableUnSendWhenHuiQian = SystemConfig.AppSettings["IsEnableUnSendWhenHuiQian"]; if (DataType.IsNullOrEmpty(IsEnableUnSendWhenHuiQian) == false && IsEnableUnSendWhenHuiQian.Equals("0")) { return("info@当前节点是会签状态,您不能执行撤销."); } GenerWorkerList gwl = new GenerWorkerList(); int numOfmyGwl = gwl.Retrieve(GenerWorkerListAttr.FK_Emp, WebUser.No, GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, gwf.FK_Node); //如果没有找到当前会签人. if (numOfmyGwl == 0) { return("err@当前节点[" + gwf.NodeName + "]是会签状态,[" + gwf.TodoEmps + "]在执行会签,您不能执行撤销."); } if (gwl.IsHuiQian == true) { } //如果是会签人,就让其显示待办. gwl.IsPassInt = 0; gwl.IsEnable = true; gwl.Update(); // 在待办人员列表里加入他. 要判断当前人员是否是主持人,如果是主持人的话,主持人是否在发送的时候, // 就选择方向与接受人. if (gwf.HuiQianZhuChiRen == WebUser.No) { gwf.TodoEmps = WebUser.No + "," + BP.Web.WebUser.Name + ";" + gwf.TodoEmps; } else { gwf.TodoEmps = gwf.TodoEmps + BP.Web.WebUser.Name + ";"; } gwf.Update(); return("会签人撤销成功."); } #endregion 判断是否是会签状态,是否是会签人做的撤销. if (gwf.FID != 0) { //执行子线程的撤销. return(DoThreadUnSend()); } //定义当前的节点. WorkNode wn = this.GetCurrentWorkNode(); #region 求的撤销的节点. int cancelToNodeID = 0; if (nd.HisCancelRole == CancelRole.SpecNodes) { /*指定的节点可以撤销,首先判断当前人员是否有权限.*/ NodeCancels ncs = new NodeCancels(); ncs.Retrieve(NodeCancelAttr.FK_Node, wn.HisNode.NodeID); if (ncs.Count == 0) { throw new Exception("@流程设计错误, 您设置了当前节点(" + wn.HisNode.Name + ")可以让指定的节点人员撤销,但是您没有设置指定的节点."); } /* 查询出来. */ sql = "SELECT FK_Node FROM WF_GenerWorkerList WHERE FK_Emp='" + WebUser.No + "' AND IsPass=1 AND IsEnable=1 AND WorkID=" + wn.HisWork.OID + " ORDER BY RDT DESC "; DataTable dt = DBAccess.RunSQLReturnTable(sql); if (dt.Rows.Count == 0) { throw new Exception("err@撤销流程错误,您没有权限执行撤销发送."); } // 找到将要撤销到的NodeID. foreach (DataRow dr in dt.Rows) { foreach (NodeCancel nc in ncs) { if (nc.CancelTo == int.Parse(dr[0].ToString())) { cancelToNodeID = nc.CancelTo; break; } } if (cancelToNodeID != 0) { break; } } if (cancelToNodeID == 0) { throw new Exception("@撤销流程错误,您没有权限执行撤销发送,当前节点不可以执行撤销."); } } if (nd.HisCancelRole == CancelRole.OnlyNextStep) { /*如果仅仅允许撤销上一步骤.*/ WorkNode wnPri = wn.GetPreviousWorkNode(); GenerWorkerList wl = new GenerWorkerList(); int num = wl.Retrieve(GenerWorkerListAttr.FK_Emp, BP.Web.WebUser.No, GenerWorkerListAttr.FK_Node, wnPri.HisNode.NodeID, GenerWorkerListAttr.WorkID, this.WorkID); if (num == 0) { throw new Exception("err@您不能执行撤消发送,因为当前工作不是您发送的或下一步工作已处理。"); } cancelToNodeID = wnPri.HisNode.NodeID; } if (cancelToNodeID == 0) { throw new Exception("err@没有求出要撤销到的节点."); } #endregion 求的撤销的节点. if (this.UnSendToNode != 0 && gwf.FK_Node != this.UnSendToNode) { Node toNode = new Node(this.UnSendToNode); /* 要撤销的节点是分流节点,并且当前节点不在分流节点而是在合流节点的情况, for:华夏银行. * 1, 分流节点发送给n个人. * 2, 其中一个人发送到合流节点,另外一个人退回给分流节点。 * 3,现在分流节点的人接收到一个待办,并且需要撤销整个分流节点的发送. * 4, UnSendToNode 这个时间没有值,并且当前干流节点的停留的节点与要撤销到的节点不一致。 */ if (toNode.HisNodeWorkType == NodeWorkType.WorkFL && nd.HisNodeWorkType == NodeWorkType.WorkHL) { return(DoUnSendInFeiLiuHeiliu(gwf)); } } #region 判断当前节点的模式. switch (nd.HisNodeWorkType) { case NodeWorkType.WorkFHL: return(this.DoUnSendFeiLiu(gwf)); case NodeWorkType.WorkFL: case NodeWorkType.StartWorkFL: break; case NodeWorkType.WorkHL: if (this.IsMainFlow) { /* 首先找到与他最近的一个分流点,并且判断当前的操作员是不是分流点上的工作人员。*/ return(this.DoUnSendHeiLiu_Main(gwf)); } else { return(this.DoUnSendSubFlow(gwf)); //是子流程时. } break; case NodeWorkType.SubThreadWork: break; default: break; } #endregion 判断当前节点的模式. /********** 开始执行撤销. **********************/ Node cancelToNode = new Node(cancelToNodeID); #region 如果撤销到的节点是普通的节点,并且当前的节点是分流(分流)节点,并且分流(分流)节点已经发送下去了,就不允许撤销了. if (cancelToNode.HisRunModel == RunModel.Ordinary && nd.HisRunModel == RunModel.HL && nd.HisRunModel == RunModel.FHL && nd.HisRunModel == RunModel.FL) { /* 检查一下是否还有没有完成的子线程,如果有就抛出不允许撤销的异常。 */ sql = "SELECT COUNT(*) as NUM FROM WF_GenerWorkerList WHERE FID=" + this.WorkID + " AND IsPass=0"; if (BP.DA.DBAccess.RunSQLReturnValInt(sql) != 0) { return("err@不允许撤销,因为有未完成的子线程."); } // return this.DoUnSendHeiLiu_Main(gwf); } #endregion 如果撤销到的节点是普通的节点,并且当前的节点是分流节点,并且分流节点已经发送下去了. #region 如果当前是协作组长模式,就要考虑当前是否是会签节点,如果是会签节点,就要处理。 if (cancelToNode.TodolistModel == TodolistModel.TeamupGroupLeader || cancelToNode.TodolistModel == TodolistModel.Teamup) { sql = "SELECT ActionType FROM ND" + int.Parse(this.FlowNo) + "Track WHERE NDFrom=" + cancelToNodeID + " AND EmpFrom='" + WebUser.No + "' AND WorkID=" + this.WorkID; DataTable dt = DBAccess.RunSQLReturnTable(sql); foreach (DataRow dr in dt.Rows) { int ac = int.Parse(dr[0].ToString()); ActionType at = (ActionType)ac; if (at == ActionType.TeampUp) { /*如果是写作人员,就不允许他撤销 */ throw new Exception("@您是节点[" + cancelToNode.Name + "]的会签人,您不能执行撤销。"); } } } #endregion 如果当前是协作组长模式 WorkNode wnOfCancelTo = new WorkNode(this.WorkID, cancelToNodeID); // 调用撤消发送前事件。 string msg = nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneBefore, nd, wn.HisWork, null); #region 除当前节点数据。 // 删除产生的工作列表。 GenerWorkerLists wls = new GenerWorkerLists(); wls.Delete(GenerWorkerListAttr.WorkID, this.WorkID, GenerWorkerListAttr.FK_Node, gwf.FK_Node); // 删除工作信息,如果是按照ccflow格式存储的。 if (this.HisFlow.HisDataStoreModel == BP.WF.Template.DataStoreModel.ByCCFlow) { wn.HisWork.Delete(); } // 删除附件信息。 DBAccess.RunSQL("DELETE FROM Sys_FrmAttachmentDB WHERE FK_MapData='ND" + gwf.FK_Node + "' AND RefPKVal='" + this.WorkID + "'"); #endregion 除当前节点数据。 // 更新. gwf.FK_Node = cancelToNode.NodeID; gwf.NodeName = cancelToNode.Name; //恢复上一步发送人 DataTable dtPrevTrack = Dev2Interface.Flow_GetPreviousNodeTrack(this.WorkID, cancelToNode.NodeID); if (dtPrevTrack != null && dtPrevTrack.Rows.Count > 0) { gwf.Sender = dtPrevTrack.Rows[0]["EmpFrom"].ToString(); } if (cancelToNode.IsEnableTaskPool && Glo.IsEnableTaskPool) { gwf.TaskSta = TaskSta.Takeback; } else { gwf.TaskSta = TaskSta.None; } gwf.TodoEmps = WebUser.No + "," + WebUser.Name + ";"; gwf.Update(); if (cancelToNode.IsEnableTaskPool && Glo.IsEnableTaskPool) { //设置全部的人员不可用。 BP.DA.DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0, IsEnable=-1 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node); //设置当前人员可用。 BP.DA.DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0, IsEnable=1 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node + " AND FK_Emp='" + WebUser.No + "'"); } else { BP.DA.DBAccess.RunSQL("UPDATE WF_GenerWorkerlist SET IsPass=0 WHERE WorkID=" + this.WorkID + " AND FK_Node=" + gwf.FK_Node + " AND FK_Emp='" + WebUser.No + "'"); } //更新当前节点,到rpt里面。 BP.DA.DBAccess.RunSQL("UPDATE " + this.HisFlow.PTable + " SET FlowEndNode=" + gwf.FK_Node + " WHERE OID=" + this.WorkID); // 记录日志.. wn.AddToTrack(ActionType.UnSend, WebUser.No, WebUser.Name, cancelToNode.NodeID, cancelToNode.Name, "无"); //删除审核组件设置“协作模式下操作员显示顺序”为“按照接受人员列表先后顺序(官职大小)”,而生成的待审核轨迹信息 FrmWorkCheck fwc = new FrmWorkCheck(nd.NodeID); if (fwc.FWCSta == FrmWorkCheckSta.Enable && fwc.FWCOrderModel == FWCOrderModel.SqlAccepter) { BP.DA.DBAccess.RunSQL("DELETE FROM ND" + int.Parse(nd.FK_Flow) + "Track WHERE WorkID = " + this.WorkID + " AND ActionType = " + (int)ActionType.WorkCheck + " AND NDFrom = " + nd.NodeID + " AND NDTo = " + nd.NodeID + " AND (Msg = '' OR Msg IS NULL)"); } // 删除数据. if (wn.HisNode.IsStartNode) { DBAccess.RunSQL("DELETE FROM WF_GenerWorkFlow WHERE WorkID=" + this.WorkID); DBAccess.RunSQL("DELETE FROM WF_GenerWorkerlist WHERE WorkID=" + this.WorkID + " AND FK_Node=" + nd.NodeID); } else { DBAccess.RunSQL("DELETE FROM WF_GenerWorkerlist WHERE WorkID=" + this.WorkID + " AND FK_Node=" + nd.NodeID); } //首先删除当前节点的,审核意见. string delTrackSQl = "DELETE FROM ND" + int.Parse(nd.FK_Flow) + "Track WHERE WorkID=" + this.WorkID + " AND NDFrom=" + nd.NodeID + " AND ActionType =22 "; DBAccess.RunSQL(delTrackSQl); if (wn.HisNode.IsEval) { /*如果是质量考核节点,并且撤销了。*/ DBAccess.RunSQL("DELETE FROM WF_CHEval WHERE FK_Node=" + wn.HisNode.NodeID + " AND WorkID=" + this.WorkID); } #region 恢复工作轨迹,解决工作抢办。 if (cancelToNode.IsStartNode == false && cancelToNode.IsEnableTaskPool == false) { WorkNode ppPri = wnOfCancelTo.GetPreviousWorkNode(); GenerWorkerList wl = new GenerWorkerList(); wl.Retrieve(GenerWorkerListAttr.FK_Node, wnOfCancelTo.HisNode.NodeID, GenerWorkerListAttr.WorkID, this.WorkID); // BP.DA.DBAccess.RunSQL("UPDATE WF_GenerWorkerList SET IsPass=0 WHERE FK_Node=" + backtoNodeID + " AND WorkID=" + this.WorkID); RememberMe rm = new RememberMe(); rm.Retrieve(RememberMeAttr.FK_Node, wnOfCancelTo.HisNode.NodeID, RememberMeAttr.FK_Emp, ppPri.HisWork.Rec); string[] empStrs = rm.Objs.Split('@'); foreach (string s in empStrs) { if (s == "" || s == null) { continue; } if (s == wl.FK_Emp) { continue; } GenerWorkerList wlN = new GenerWorkerList(); wlN.Copy(wl); wlN.FK_Emp = s; WF.Port.WFEmp myEmp = new Port.WFEmp(s); wlN.FK_EmpText = myEmp.Name; wlN.Insert(); } } #endregion 恢复工作轨迹,解决工作抢办。 #region 如果是开始节点, 检查此流程是否有子流程,如果有则删除它们。 if (nd.IsStartNode) { /*要检查一个是否有 子流程,如果有,则删除它们。*/ GenerWorkFlows gwfs = new GenerWorkFlows(); gwfs.Retrieve(GenerWorkFlowAttr.PWorkID, this.WorkID); if (gwfs.Count > 0) { foreach (GenerWorkFlow item in gwfs) { /*删除每个子线程.*/ BP.WF.Dev2Interface.Flow_DoDeleteFlowByReal(item.FK_Flow, item.WorkID, true); } } } #endregion //调用撤消发送后事件。 msg += nd.HisFlow.DoFlowEventEntity(EventListOfNode.UndoneAfter, nd, wn.HisWork, null); if (wnOfCancelTo.HisNode.IsStartNode) { switch (wnOfCancelTo.HisNode.HisFormType) { case NodeFormType.FoolForm: case NodeFormType.FreeForm: return("@撤消执行成功." + msg); break; default: return("@撤销成功." + msg); break; } } else { // 更新是否显示。 // DBAccess.RunSQL("UPDATE WF_ForwardWork SET IsRead=1 WHERE WORKID=" + this.WorkID + " AND FK_Node=" + cancelToNode.NodeID); switch (wnOfCancelTo.HisNode.HisFormType) { case NodeFormType.FoolForm: case NodeFormType.FreeForm: return("@撤消执行成功. " + msg); break; default: return("撤销成功:" + msg); break; } } return("工作已经被您撤销到:" + cancelToNode.Name); }
protected void Page_Load(object sender, EventArgs e) { #region 找到可以退回的节点. DataTable dt = null; if (this.IsPostBack == false) { dt = BP.WF.Dev2Interface.DB_GenerWillReturnNodes(this.FK_Node, this.WorkID, this.FID); if (dt.Rows.Count == 0) { this.Pub1.Clear(); this.Pub1.AddFieldSet("退回错误", "系统没有找到可以退回的节点."); return; } } #endregion 找到可以退回的节点. this.Page.Title = "工作退回"; BP.WF.Node nd = new BP.WF.Node(this.FK_Node); this.ToolBar1.Add("<b>退回到:</b>"); this.ToolBar1.AddDDL("DDL1"); this.DDL1.Attributes["onchange"] = "OnChange(this);"; this.ToolBar1.AddBtn("Btn_OK", "确定"); this.ToolBar1.GetBtnByID("Btn_OK").Attributes["onclick"] = " return confirm('您确定要执行吗?');"; this.ToolBar1.GetBtnByID("Btn_OK").Click += new EventHandler(ReturnWork_Click); // if (this.Request.QueryString["IsEUI"] == null) //{ this.ToolBar1.AddBtn("Btn_Cancel", "取消"); this.ToolBar1.GetBtnByID("Btn_Cancel").Click += new EventHandler(ReturnWork_Click); //} string appPath = this.Request.ApplicationPath; if (nd.IsBackTracking) { /*如果允许原路退回*/ CheckBox cb = new CheckBox(); cb.ID = "CB_IsBackTracking"; cb.Text = "退回后是否要原路返回?"; this.ToolBar1.Add(cb); } TextBox tb = new TextBox(); tb.TextMode = TextBoxMode.MultiLine; tb.ID = "TB_Doc"; tb.Rows = 12; tb.Columns = 60; this.Pub1.Add(tb); //新增 this.Pub1.Add("<div style='float:left;display:block;width:100%'><a href=javascript:TBHelp('Return_Doc','" + "ND" + FK_Node + "'" + ")><img src='" + BP.WF.Glo.CCFlowAppPath + "WF/Img/Emps.gif' align='middle' border=0 />选择词汇</a> </div>"); if (this.IsPostBack == false) { foreach (DataRow dr in dt.Rows) { this.DDL1.Items.Add(new ListItem(dr["RecName"] + "=>" + dr["Name"].ToString(), dr["No"].ToString() + "@" + dr["Rec"].ToString())); } WorkNode wn = new WorkNode(this.WorkID, this.FK_Node); WorkNode pwn = wn.GetPreviousWorkNode(); this.DDL1.SetSelectItem(pwn.HisNode.NodeID); this.DDL1.Enabled = true; Work wk = pwn.HisWork; if (this.Info != null) { this.TB1.Text = this.Info; //不能把审核信息保存到表单里,因为下次他的审核就不是这个信息了. //string sql = "UPDATE "+wn.HisWork.EnMap.PhysicsTable+" SET "+; } else { /*检查是否启用了审核组件,看看审核信息里填写了什么?*/ BP.Sys.FrmWorkCheck fwc = new FrmWorkCheck(this.FK_Node); if (fwc.HisFrmWorkCheckSta == FrmWorkCheckSta.Enable) { this.TB1.Text = BP.WF.Dev2Interface.GetCheckInfo(this.FK_Flow, this.WorkID, this.FK_Node); if (tb.Text == "同意") { tb.Text = ""; } } else { string info = this.DDL1.SelectedItem.Text; string recName = info.Substring(0, info.IndexOf('=')); string nodeName = info.Substring(info.IndexOf('>') + 1); this.TB1.Text = string.Format("{0}同志: \n 您处理的“{1}”工作有错误,需要您重新办理.\n\n此致!!! \n\n {2}", recName, nodeName, WebUser.Name + "\n " + BP.DA.DataType.CurrentDataTime); } } } }
protected void Page_Load(object sender, EventArgs e) { MapData md = new MapData(this.FK_MapData); this.Pub1.AddTable(); // this.Pub1.AddCaptionLeft("傻瓜表单属性"); this.Pub1.AddTR(); this.Pub1.AddTDTitle("项目"); this.Pub1.AddTDTitle("信息"); this.Pub1.AddTDTitle("备注"); this.Pub1.AddTREnd(); this.Pub1.AddTR(); this.Pub1.AddTD("编号"); this.Pub1.AddTD(this.FK_MapData); this.Pub1.AddTD(); this.Pub1.AddTREnd(); this.Pub1.AddTR(); this.Pub1.AddTD("名称"); TextBox tb = new TextBox(); tb.ID = "TB_" + MapDataAttr.Name; tb.Text = md.Name; this.Pub1.AddTD(tb); this.Pub1.AddTD(); this.Pub1.AddTREnd(); this.Pub1.AddTR(); this.Pub1.AddTD("表单主表"); tb = new TextBox(); tb.ID = "TB_" + MapDataAttr.PTable; tb.Text = md.PTable; this.Pub1.AddTD(tb); this.Pub1.AddTD(); this.Pub1.AddTREnd(); this.Pub1.AddTR(); this.Pub1.AddTD("显示宽度(单位px)"); tb = new TextBox(); tb.ID = "TB_" + MapDataAttr.TableWidth; tb.Text = md.GetValStringByKey(MapDataAttr.TableWidth); this.Pub1.AddTD(tb); this.Pub1.AddTD("如果设置为0 则认为是100%."); this.Pub1.AddTREnd(); this.Pub1.AddTR(); this.Pub1.AddTD("表格呈现列数"); BP.Web.Controls.DDL ddl = new BP.Web.Controls.DDL(); ddl.ID = "DDL_Col"; ddl.Items.Add(new ListItem("4", "4")); ddl.Items.Add(new ListItem("6", "6")); ddl.Items.Add(new ListItem("8", "8")); ddl.Items.Add(new ListItem("10", "10")); ddl.Items.Add(new ListItem("12", "12")); ddl.SetSelectItem(md.TableCol); this.Pub1.AddTD(ddl); this.Pub1.AddTD("用于控制表单字段的横向布局."); this.Pub1.AddTREnd(); if (md.No.Contains("ND") == true) { this.Pub1.AddTR(); this.Pub1.AddTD("审核组件"); FrmWorkCheck fwc = new FrmWorkCheck(md.No); ddl = new BP.Web.Controls.DDL(); ddl.ID = "DDL_FWC"; ddl.Items.Add(new ListItem("不可用", "0")); ddl.Items.Add(new ListItem("可填写", "1")); ddl.Items.Add(new ListItem("只读", "2")); ddl.SetSelectItem((int)fwc.HisFrmWorkCheckSta); this.Pub1.AddTD(ddl); this.Pub1.AddTD("用户节点工作审核."); this.Pub1.AddTREnd(); } //this.Pub1.AddTR(); //this.Pub1.AddTD("表单权限控制方案"); //tb = new TextBox(); //tb.ID = "TB_" + MapDataAttr.Slns; //tb.Text = md.Slns; //tb.Columns = 60; //this.Pub1.AddTD("colspan=2", tb); //this.Pub1.AddTREnd(); this.Pub1.AddTR(); this.Pub1.AddTD("colspan=3", "方案说明:格式为:@0=默认@1=第1套方案@2=第2套方案@3=第3套方案"); this.Pub1.AddTREnd(); this.Pub1.AddTableEnd(); Button btn = new Button(); btn.ID = "Btn_Save"; btn.Text = "保存"; btn.Click += new EventHandler(btn_Click); this.Pub1.Add(btn); }