using BP.DA; using BP.Difference; using BP.En; using BP.Sys; using BP.Web; using BP.WF; using BP.WF.Template; using System; using System.Collections; using System.Data; using System.Net.Http; using System.Web.Http; using System.Web.Http.Cors; namespace CCFlow.DataUser.API.Controllers { [EnableCors("*", "*", "*")] public class APIController : ApiController { public static Object Return_Info(int code, string msg, string data) { Hashtable ht = new Hashtable(); ht.Add("code", code); ht.Add("message", msg); ht.Add("data", data); return ht; //string json = "{\"code\":" + code + ",\"msg\":\"" + msg + "\",\"data\":\"" + data + "\"}"; //return new HttpResponseMessage { Content = new StringContent(json, System.Text.Encoding.GetEncoding("UTF-8"), "application/json") }; } #region 组织结构接口. /// /// 系统登陆 /// /// 密钥,默认:DiGuaDiGua,IamCCBPM /// 登陆账号 /// 组织编号 /// [HttpGet, HttpPost] public Object Port_Login(string privateKey, string userNo, string orgNo = null) { try { if (DataType.IsNullOrEmpty(userNo) == true) return Return_Info(500, "账号不能为空", ""); string localKey = BP.Difference.SystemConfig.GetValByKey("PrivateKey", "DiGuaDiGua,IamCCBPM"); if (SystemConfig.CCBPMRunModel == CCBPMRunModel.SAAS) { BP.WF.Port.Admin2Group.Org org = new BP.WF.Port.Admin2Group.Org(orgNo); string key = org.GetValStrByKey("PrivateKey"); if (DataType.IsNullOrEmpty(key) == false) localKey = key; } if (DataType.IsNullOrEmpty(localKey) == true) localKey = "DiGuaDiGua,IamCCBPM"; if (localKey.Equals(privateKey) == false) return Return_Info(500, "私约错误,请检查全局文件中配置 PrivateKey", ""); //执行本地登录. BP.WF.Dev2Interface.Port_Login(userNo, orgNo); string token = BP.WF.Dev2Interface.Port_GenerToken(); Hashtable ht = new Hashtable(); ht.Add("No", WebUser.No); ht.Add("Name", WebUser.Name); ht.Add("FK_Dept", WebUser.FK_Dept); ht.Add("FK_DeptName", WebUser.FK_DeptName); ht.Add("OrgNo", WebUser.OrgNo); ht.Add("OrgName", WebUser.OrgName); ht.Add("Token", token); // return ReturnMessage(); return Return_Info(200, "登陆成功", BP.Tools.Json.ToJson(ht)); } catch (Exception ex) { return Return_Info(500, "登陆失败", ex.Message); } } /// /// 退出登录 /// /// [HttpGet, HttpPost] public Object Port_LoginOut(string userNo, string orgNo = null) { try { BP.WF.Dev2Interface.Port_SigOut(); return Return_Info(200, "退出成功", null); } catch (Exception ex) { return Return_Info(500, "退出失败", ex.Message); } } #endregion 组织结构接口. #region 组织人员岗位维护 /// /// 人员信息保存 /// /// 密钥 /// /// /// /// /// /// /// /// [HttpGet, HttpPost] public Object Port_Emp_Save(string token, string orgNo, string userNo, string userName, string deptNo, string kvs, string stats, string stationNo) { Port_GenerToken(token); if (WebUser.IsAdmin == false) return Return_Info(500, "不是管理员不能维护人员信息", null); string msg = BP.Port.OrganizationAPI.Port_Emp_Save(orgNo, userNo, userName, deptNo, kvs, stats, stationNo); return Return_Info(200, "执行成功", msg); } /// /// 人员删除 /// /// Token /// 组织编号 /// 人员编号 /// reutrn 1=成功, 其他的标识异常. [HttpGet, HttpPost] public Object Port_Emp_Delete(string token, string userNo, string orgNo = "") { Port_GenerToken(token); if (WebUser.IsAdmin == false) return Return_Info(500, "不是管理员不能删除人员信息", null); return Return_Info(200, "删除成功", BP.Port.OrganizationAPI.Port_Emp_Delete(orgNo, userNo)); } /// return 1 增加成功,其他的增加失败. /// /// 集团模式下同步组织以及管理员信息 /// /// Token /// 组织编号 /// 组织名称 /// 管理员账号 /// 管理员名字 /// 其他的值:@Leaer=zhangsan@Tel=12233333@Idx=1 /// [HttpGet, HttpPost] public Object Port_Org_Save(string token, string orgNo, string name, string adminer, string adminerName, string keyVals = "") { Port_GenerToken(token); if (WebUser.IsAdmin == false) return Return_Info(500, "[" + BP.Web.WebUser.Name + "]不是管理员不能维护组织信息", null); return Return_Info(200, "同步成功", BP.Port.OrganizationAPI.Port_Org_Save(orgNo, name, adminer, adminerName, keyVals)); } /// /// 保存部门,如果有此数据则修改,无此数据则增加. /// /// Token /// 部门编号 /// 名称 /// 父节点编号 /// 组织编号 /// 其他的值:@Leaer=zhangsan@Tel=18660153393@Idx=1 /// [HttpGet, HttpPost] public Object Port_Dept_Save(string token, string no, string name, string parentNo, string orgNo = "", string keyVals = "") { Port_GenerToken(token); if (WebUser.IsAdmin == false) return Return_Info(500, "[" + BP.Web.WebUser.Name + "]不是管理员不能维护部门信息", null); return Return_Info(200, "保存成功", BP.Port.OrganizationAPI.Port_Dept_Save(orgNo, no, name, parentNo, keyVals)); } /// /// 删除部门 /// /// Token /// 要删除的部门编号 /// [HttpGet, HttpPost] public Object Port_Dept_Delete(string token, string no) { Port_GenerToken(token); if (WebUser.IsAdmin == false) return Return_Info(500, "[" + BP.Web.WebUser.Name + "]不是管理员不能删除部门信息", null); return Return_Info(200, "删除部门成功", BP.Port.OrganizationAPI.Port_Dept_Delete(no)); } /// /// 保存岗位, 如果有此数据则修改,无此数据则增加. /// /// Token /// 组织编号 /// 岗位编号 /// 岗位名称 /// 其他值 /// [HttpGet, HttpPost] public Object Port_Station_Save(string token, string orgNo, string no, string name, string keyVals) { Port_GenerToken(token); if (WebUser.IsAdmin == false) return Return_Info(500, "[" + BP.Web.WebUser.Name + "]不是管理员不能维护岗位信息", null); return Return_Info(200, "保存岗位成功", BP.Port.OrganizationAPI.Port_Station_Save(orgNo, no, name, keyVals)); } /// /// 删除岗位. /// /// 删除指定的岗位编号 /// [HttpGet, HttpPost] public Object Port_Station_Delete(string token, string no) { //根据token登录 Port_GenerToken(token); if (WebUser.IsAdmin == false) return Return_Info(500, "[" + BP.Web.WebUser.Name + "]不是管理员不能删除岗位信息", null); return Return_Info(200, "删除岗位成功", BP.Port.OrganizationAPI.Port_Station_Delete(no)); } /// /// 保存用户组, 如果有此数据则修改,无此数据则增加. /// /// Token /// 组织编号 /// 用户组编号 /// 用户组名称 /// 其他值 /// [HttpGet, HttpPost] public Object Port_Team_Save(string token, string orgNo, string no, string name, string keyVals) { Port_GenerToken(token); if (WebUser.IsAdmin == false) return Return_Info(500, "[" + BP.Web.WebUser.Name + "]不是管理员不能维护用户组信息", null); return Return_Info(200, "保存用户组成功", BP.Port.OrganizationAPI.Port_Team_Save(orgNo, no, name, keyVals)); } /// /// 删除用户组. /// /// 删除指定的用户组编号 /// [HttpGet, HttpPost] public Object Port_Team_Delete(string token, string no) { //根据token登录 Port_GenerToken(token); if (WebUser.IsAdmin == false) return Return_Info(500, "[" + BP.Web.WebUser.Name + "]不是管理员不能删除用户组信息", null); return Return_Info(200, "删除用户组成功", BP.Port.OrganizationAPI.Port_Team_Delete(no)); } /// /// 保存用户组, 如果有此数据则修改,无此数据则增加. /// /// Token /// 组织编号 /// 用户组编号 /// 用户组名称 /// 其他值 /// [HttpGet, HttpPost] public Object Port_TeamType_Save(string token, string orgNo, string no, string name, string keyVals) { Port_GenerToken(token); if (WebUser.IsAdmin == false) return Return_Info(500, "[" + BP.Web.WebUser.Name + "]不是管理员不能维护用户组信息", null); return Return_Info(200, "保存用户组成功", BP.Port.OrganizationAPI.Port_TeamType_Save(orgNo, no, name, keyVals)); } /// /// 删除用户组. /// /// 删除指定的用户组编号 /// [HttpGet, HttpPost] public Object Port_TeamType_Delete(string token, string no) { //根据token登录 Port_GenerToken(token); if (WebUser.IsAdmin == false) return Return_Info(500, "[" + BP.Web.WebUser.Name + "]不是管理员不能删除用户组信息", null); return Return_Info(200, "删除用户组成功", BP.Port.OrganizationAPI.Port_TeamType_Delete(no)); } /// /// 保存岗位类型, 如果有此数据则修改,无此数据则增加. /// /// Token /// 组织编号 /// 岗位类型编号 /// 岗位类型名称 /// 其他值 /// [HttpGet, HttpPost] public Object Port_StationType_Save(string token, string orgNo, string no, string name, string keyVals) { Port_GenerToken(token); if (WebUser.IsAdmin == false) return Return_Info(500, "[" + BP.Web.WebUser.Name + "]不是管理员不能维护岗位类型信息", null); return Return_Info(200, "保存岗位类型成功", BP.Port.OrganizationAPI.Port_StationType_Save(orgNo, no, name, keyVals)); } /// /// 删除岗位类型. /// /// 删除指定的岗位类型编号 /// [HttpGet, HttpPost] public Object Port_StationType_Delete(string token, string no) { //根据token登录 Port_GenerToken(token); if (WebUser.IsAdmin == false) return Return_Info(500, "[" + BP.Web.WebUser.Name + "]不是管理员不能删除岗位类型信息", null); return Return_Info(200, "删除岗位类型成功", BP.Port.OrganizationAPI.Port_StationType_Delete(no)); } #endregion 组织人员岗位维护 #region 菜单接口. /// /// 可以发起的流程 /// /// 密钥 /// 流程所属的域 /// [HttpGet, HttpPost] public Object DB_Start(string token, string domain = "") { //根据token登录 Port_GenerToken(token); //获取可以发起的列表 DataTable dt = BP.WF.Dev2Interface.DB_StarFlows(BP.Web.WebUser.No, domain); return Return_Info(200, "获取可以发起的流程成功", BP.Tools.Json.ToJson(dt)); } /// /// 待办 /// /// 密钥 /// /// [HttpGet, HttpPost] public Object DB_Todolist(string token, string domain = "") { //根据token登录 Port_GenerToken(token); //获取可以发起的列表 DataTable dt = BP.WF.Dev2Interface.DB_GenerEmpWorksOfDataTable(BP.Web.WebUser.No, 0, null, domain, null, null); return Return_Info(200, "获取待办列表成功", BP.Tools.Json.ToJson(dt)); } /// /// 在途 /// /// 密钥 /// /// [HttpGet, HttpPost] public Object DB_Runing(string token, string domain = "") { //根据token登录 Port_GenerToken(token); //获取可以发起的列表 DataTable dt = BP.WF.Dev2Interface.DB_GenerRuning(BP.Web.WebUser.No, false, domain); return Return_Info(200, "获取在途列表成功", BP.Tools.Json.ToJson(dt)); } /// /// 草稿 /// /// 密钥 /// /// [HttpGet, HttpPost] public Object DB_Draft(string token, string domain = "") { //根据token登录 Port_GenerToken(token); //获取可以发起的列表 DataTable dt = BP.WF.Dev2Interface.DB_GenerDraftDataTable(null, domain); return Return_Info(200, "获取草稿成功", BP.Tools.Json.ToJson(dt)); } /// /// 可以发起的流程 /// /// 密钥 /// 流程所属的域, 可以为空 /// 指定的流程,可以为空. /// 抄送列表 [HttpGet, HttpPost] public Object DB_CCList(string token, string domain = "", string flowNo = "") { //根据token登录 Port_GenerToken(token); //获取可以发起的列表 DataTable dt = BP.WF.Dev2Interface.DB_CCList(domain, flowNo); return Return_Info(200, "获取抄送成功.", BP.Tools.Json.ToJson(dt)); } /// /// 打开的表单 /// /// 密钥 /// 工作实例WorkID /// 流程编号 /// 节点ID /// 父WorkID /// [HttpGet, HttpPost] public Object GenerFrmUrl(string token, Int64 workID, string flowNo, int nodeID) { //根据token登录 Port_GenerToken(token); /* * 发起的url需要在该流程的开始节点的表单方案中,使用SDK表单,并把表单的url设置到里面去. * 设置步骤: * 1. 打开流程设计器. * 2. 在开始节点上右键,选择表单方案. * 3. 选择SDK表单,把url配置到文本框里去. * 比如: /App/F027QingJia.htm */ if (nodeID == 0) nodeID = int.Parse(flowNo + "01"); if (workID == 0) workID = BP.WF.Dev2Interface.Node_CreateBlankWork(flowNo, BP.Web.WebUser.No); string url = ""; Node nd = new Node(nodeID); if (nd.FormType == NodeFormType.SDKForm || nd.FormType == NodeFormType.SelfForm) { //. url = nd.FormUrl; if (url.Contains("?") == true) url += "&FK_Flow=" + flowNo + "&FK_Node=" + nodeID + "&WorkID=" + workID + "&Token=" + token + "&UserNo=" + BP.Web.WebUser.No; else url += "?FK_Flow=" + flowNo + "&FK_Node=" + nodeID + "&WorkID=" + workID + "&Token=" + token + "&UserNo=" + BP.Web.WebUser.No; } else { url = "/WF/MyFlow.htm?FK_Flow=" + flowNo + "&FK_Node=" + nodeID + "&WorkID=" + workID + "&Token=" + token; } return Return_Info(200, "获取打开的表单成功", url); } #endregion 菜单接口. #region 节点方法. /// /// 创建WorkID /// /// 密钥 /// 流程编号 /// [HttpGet, HttpPost] public Object Node_CreateBlankWorkID(string token, string flowNo) { //根据token登录 Port_GenerToken(token); try { Int64 workid = Dev2Interface.Node_CreateBlankWork(flowNo, BP.Web.WebUser.No); return Return_Info(200, "创建WorkID成功", workid.ToString()); } catch (Exception ex) { return Return_Info(500, "创建WorkID失败", ex.Message); } } /// /// 是否可以处理当前的工作 /// /// 密钥 /// /// [HttpGet, HttpPost] public Object Node_IsCanDealWork(string token, Int64 workID) { //根据token登录 Port_GenerToken(token); try { GenerWorkFlow gwf = new GenerWorkFlow(workID); string todoEmps = gwf.TodoEmps; bool isCanDo = false; if (gwf.FK_Node.ToString().EndsWith("01") == true) { if (gwf.Starter.Equals(BP.Web.WebUser.No) == false) isCanDo = false; //处理开始节点发送后,撤销的情况,第2个节点打开了,第1个节点撤销了,造成第2个节点也可以发送下去. else isCanDo = true; // 开始节点不判断权限. } else { isCanDo = todoEmps.Contains(";" + WebUser.No + ","); if (isCanDo == false) isCanDo = Dev2Interface.Flow_IsCanDoCurrentWork(workID, BP.Web.WebUser.No); } return Return_Info(200, "获取是否可以处理当前的工作成功", isCanDo == true ? "1" : "0"); } catch (Exception ex) { return Return_Info(500, "获取是否可以处理当前的工作失败", ex.Message); } } /// /// 设置草稿 /// /// 密钥 /// 流程实例ID /// /// [HttpGet, HttpPost] public Object Node_SetDraft(string token, Int64 workID) { //根据token登录 Port_GenerToken(token); try { BP.WF.Dev2Interface.Node_SetDraft(workID); return Return_Info(200, "设置草稿成功", ""); } catch (Exception ex) { return Return_Info(500, "设置草稿失败", ex.Message); } } [HttpGet, HttpPost] public Object Node_HuiQian_Delete(string token, Int64 workid, string empNo) { //根据token登录 Port_GenerToken(token); try { BP.WF.Dev2Interface.Node_HuiQian_Delete(workid, empNo); return Return_Info(200, "删除会签人员成功", "1"); } catch (Exception ex) { return Return_Info(500, "删除会签人员失败", ex.Message); } } /// /// 会签:增加会签人 /// /// 密钥 /// /// 人员编号:001,002 /// [HttpGet, HttpPost] public Object Node_HuiQian_AddEmps(string token, Int64 workid, string empNos) { //根据token登录 Port_GenerToken(token); try { BP.WF.Dev2Interface.Node_HuiQian_AddEmps(workid, "0", empNos); return Return_Info(200, "增加会签人员成功", "1"); } catch (Exception ex) { return Return_Info(500, "增加会签人员失败", ex.Message); } } /// /// 会签:执行发送. /// /// 密钥 /// /// 到达的节点ID, 也可以是节点Mark. /// 执行的结果 [HttpGet, HttpPost] public Object Node_HuiQianDone(string token, Int64 workid, string toNodeIDStr = "0") { //根据token登录 Port_GenerToken(token); GenerWorkFlow gwf = new GenerWorkFlow(workid); int toNodeID = DealNodeIDStr(toNodeIDStr, gwf.FK_Flow); try { BP.WF.Dev2Interface.Node_HuiQianDone(workid, toNodeID); return Return_Info(200, "会签执行发送成功", "执行成功"); } catch (Exception ex) { return Return_Info(500, "会签执行发送失败", ex.Message); } } /// /// 把当前工作移交给指定的人员 /// /// 密钥 /// /// /// /// [HttpGet, HttpPost] public Object Node_Shift(string token, Int64 workID, string toEmpNo, string msg) { try { //根据token登录 Port_GenerToken(token); msg = BP.WF.Dev2Interface.Node_Shift(workID, toEmpNo, msg); return Return_Info(200, "把当前工作移交给指定的人员成功", msg); } catch (Exception ex) { return Return_Info(500, "把当前工作移交给指定的人员失败", ex.Message); } } /// /// 给当前的工作增加处理人 /// /// 密钥 /// /// /// [HttpGet, HttpPost] public Object Node_AddTodolist(string token, Int64 workID, string empNo) { //根据token登录 Port_GenerToken(token); try { BP.WF.Dev2Interface.Node_AddTodolist(workID, empNo); return Return_Info(200, "给当前的工作增加处理人成功", "增加人员成功"); } catch (Exception ex) { return Return_Info(500, "给当前的工作增加处理人失败", ex.Message); } } /// /// 根据ID获取当前的流程实例信息 /// /// 密钥 /// /// [HttpGet, HttpPost] public Object Flow_GenerWorkFlow(string token, Int64 workID) { //根据token登录 Port_GenerToken(token); try { GenerWorkFlow gwf = new GenerWorkFlow(workID); return Return_Info(200, "根据ID获取当前的流程实例信息成功", gwf.ToJson()); } catch (Exception ex) { return Return_Info(500, "根据ID获取当前的流程实例信息失败", ex.Message); } } /// /// 保存参数到WF_GenerWorkFlow,用于方向条件的判断 /// /// 密钥 /// 工作ID /// 要保存的参数,用于控制流程转向等的参数变量,注意:数据并没有保存到表单, 格式: @Key1=Val2@Key2=Val2 /// 执行结果 [HttpGet, HttpPost] public Object Flow_SaveParas(string token, Int64 workID, string paras) { //根据token登录 try { Port_GenerToken(token); BP.WF.Dev2Interface.Flow_SaveParas(workID, paras); return Return_Info(200, "参数保存成功", ""); } catch (Exception ex) { return Return_Info(500, "参数保存失败", ex.Message); } } /// /// 保存节点表单数据 /// /// /// 工作id /// 要保存的主表数据,格式: @Key1=Val2@Key2=Val2 /// 执行结果 public Object Node_SaveWork(string token, Int64 workID, string paras) { //根据token登录 try { Port_GenerToken(token); AtPara ap = new AtPara(paras); BP.WF.Dev2Interface.Node_SaveWork(workID, ap.HisHT); return Return_Info(200, "表单主表数据,执行成功.", ""); } catch (Exception ex) { return Return_Info(500, "参数保存失败", ex.Message); } } /// /// 设置标题 /// /// 密钥 /// /// /// [HttpGet, HttpPost] public Object Flow_SetTitle(string token, Int64 workID, string title) { //根据token登录 Port_GenerToken(token); try { BP.WF.Dev2Interface.Flow_SetFlowTitle(null, workID, title); return Return_Info(200, "标题设置成功", ""); } catch (Exception ex) { return Return_Info(500, "标题设置失败", ex.Message); } } /// /// 发送接口 /// /// 密钥 /// 工作实例WorkID /// 到达的下一个节点,默认为0,可以是节点Mark. /// 下一个节点的接收人,多个人用逗号分开比如:zhangsan,lisi /// 参数,保存到WF_GenerWorkFlow,用与参数条件,格式: @key1=val1@Key2=Val2 /// 审核意见:启用了审核组件,就需要填写审核意见,负责不让发送。 /// 执行结果,可以直接提示给用户. [HttpGet, HttpPost] public Object Node_SendWork(string token, Int64 workID, string toNodeIDStr = "0", string toEmps = "", string paras = "", string checkNote = "") { try { //根据token登录 Port_GenerToken(token); //保存参数. if (DataType.IsNullOrEmpty(paras) == false) BP.WF.Dev2Interface.Flow_SaveParas(workID, paras); //写入审核意见. if (DataType.IsNullOrEmpty(checkNote) == false) BP.WF.Dev2Interface.Node_WriteWorkCheck(workID, checkNote, null, null, null); string flowNo = DBAccess.RunSQLReturnString("SELECT FK_Flow FROM WF_GenerWorkFlow WHERE WorkID=" + workID); int toNodeID = DealNodeIDStr(toNodeIDStr, flowNo); //@hongyan. //执行发送. SendReturnObjs objs = Dev2Interface.Node_SendWork(flowNo, workID, null, null, toNodeID, toEmps); string msg = objs.ToMsgOfText(); return Return_Info(200, "发送成功", msg); } catch (Exception ex) { return Return_Info(500, "发送失败", ex.Message); } } /// /// 根据流程编号获取流程实例 /// /// 密钥 /// /// [HttpGet, HttpPost] public Object DB_GenerWorkFlow(string token, string flowNo) { //根据token登录 Port_GenerToken(token); try { GenerWorkFlows gwfs = new GenerWorkFlows(); QueryObject qo = new QueryObject(gwfs); qo.AddWhere("FK_Flow", flowNo); qo.addAnd(); qo.AddWhere("WFState", ">", 1); qo.addOrderBy("RDT"); qo.DoQuery(); return Return_Info(200, "根据流程编号获取流程实例成功", gwfs.ToJson()); } catch (Exception ex) { return Return_Info(200, "根据流程编号获取流程实例失败", ex.Message); } } /// /// 获取当前节点可以退回到的节点集合 /// /// 密钥 /// 节点ID /// 工作实例WorkID /// 父WorkID /// [HttpGet, HttpPost] public Object DB_GenerWillReturnNodes(string token, int nodeID, Int64 workID) { try { //根据token登录 Port_GenerToken(token); DataTable dt = Dev2Interface.DB_GenerWillReturnNodes(workID); return Return_Info(200, "获取当前节点可以退回到的节点集合成功", BP.Tools.Json.ToJson(dt)); } catch (Exception ex) { return Return_Info(500, "获取当前节点可以退回到的节点集合失败", ex.Message); } } private int DealNodeIDStr(string nodeIDStr, string flowNo) { int returnToNodeID = 0; if (DataType.IsNullOrEmpty(nodeIDStr) == true) return 0; if (DataType.IsNumStr(nodeIDStr) == true) returnToNodeID = int.Parse(nodeIDStr); else returnToNodeID = DBAccess.RunSQLReturnValInt("SELECT NodeID FROM WF_Node WHERE FK_Flow='" + flowNo + "' AND Mark='" + nodeIDStr + "'"); return returnToNodeID; } /// /// 当前节点执行退回操作 /// /// 密钥 /// 工作实例WorkID /// 退回到的节点,可以是节点的Mark /// 退回到的接收人 /// 退回原因 /// 是否原路返回到当前节点 /// [HttpGet, HttpPost] public Object Node_ReturnWork(string token, Int64 workID, string returnToNodeIDStr, string returnToEmp, string msg, bool isBackToThisNode) { try { //根据token登录 Port_GenerToken(token); GenerWorkFlow gwf = new GenerWorkFlow(workID); //获取真实的NodeID. @hongyan. int returnToNodeID = DealNodeIDStr(returnToNodeIDStr, gwf.FK_Flow); if (returnToNodeID == 0) { DataTable dt = BP.WF.Dev2Interface.DB_GenerWillReturnNodes(workID); if (dt.Rows.Count == 1) { returnToNodeID = Int32.Parse(dt.Rows[0]["No"].ToString()); returnToEmp = dt.Rows[0]["Rec"].ToString(); } } //执行退回. string strs = Dev2Interface.Node_ReturnWork(workID, returnToNodeID, returnToEmp, msg, isBackToThisNode); return Return_Info(200, "当前节点执行退回操作成功", strs); } catch (Exception ex) { return Return_Info(500, "当前节点执行退回操作失败", ex.Message); } } /// /// 催办 /// /// 密钥 /// 工作实例的WorkID集合 /// 催办信息 /// [HttpGet, HttpPost] public Object Flow_DoPress(string token, string workIDs, string msg) { //根据token登录 Port_GenerToken(token); if (DataType.IsNullOrEmpty(workIDs)) { return Return_Info(500, "执行批量催办的WorkIDs不能为空", ""); } string[] strs = workIDs.Split(','); if (msg == null) msg = "需要您处理待办工作."; try { string info = ""; foreach (string workidStr in strs) { if (BP.DA.DataType.IsNullOrEmpty(workidStr) == true) continue; info += "@" + BP.WF.Dev2Interface.Flow_DoPress(int.Parse(workidStr), msg, true); } return Return_Info(200, "执行批量催办成功", info); } catch (Exception ex) { return Return_Info(500, "执行批量催办失败", ex.Message); } } /// /// 批量审核 /// /// 密钥 /// /// [HttpGet, HttpPost] public Object CC_BatchCheckOver(string token, string workIDs) { //根据token登录 Port_GenerToken(token); if (DataType.IsNullOrEmpty(workIDs)) { return Return_Info(500, "执行批量审批的WorkIDs不能为空", ""); } try { string str = BP.WF.Dev2Interface.Node_CC_SetCheckOverBatch(workIDs); return Return_Info(200, "批量审核成功", str); } catch (Exception ex) { return Return_Info(500, "批量审核失败", ex.Message); } } #endregion 节点方法. #region 流程方法. /// /// 批量删除流程 /// /// 密钥 /// /// [HttpGet, HttpPost] public Object Flow_BatchDeleteByFlag(string token, string workIDs) { //根据token登录 Port_GenerToken(token); if (DataType.IsNullOrEmpty(workIDs)) { return Return_Info(500, "批量删除的WorkIDs不能为空", ""); } try { string[] strs = workIDs.Split(','); foreach (string workidStr in strs) { if (BP.DA.DataType.IsNullOrEmpty(workidStr) == true) continue; string st1r = BP.WF.Dev2Interface.Flow_DoDeleteFlowByFlag(Int64.Parse(workidStr), "删除", true); } return Return_Info(200, "删除成功", ""); } catch (Exception ex) { return Return_Info(500, "删除失败", ex.Message); } } /// /// 批量删除 /// /// 密钥 /// 工作实例WorkIDs /// 是否删除子流程 /// [HttpGet, HttpPost] public Object Flow_BatchDeleteByReal(string token, string workIDs, bool isDeleteSubFlows) { if (DataType.IsNullOrEmpty(workIDs)) return Return_Info(500, "批量删除的WorkIDs不能为空", ""); try { //根据token登录 Port_GenerToken(token); string[] strs = workIDs.Split(','); foreach (string workidStr in strs) { if (BP.DA.DataType.IsNullOrEmpty(workidStr) == true) continue; string st1r = BP.WF.Dev2Interface.Flow_DoDeleteFlowByReal(Int64.Parse(workidStr), isDeleteSubFlows); } return Return_Info(200, "删除成功", ""); } catch (Exception ex) { return Return_Info(500, "删除失败", ex.Message); } } /// /// 批量恢复逻辑删除的流程 /// /// 密钥 /// /// [HttpGet, HttpPost] public Object Flow_BatchDeleteByFlagAndUnDone(string token, string workIDs) { if (DataType.IsNullOrEmpty(workIDs)) return Return_Info(500, "批量撤销删除的WorkIDs不能为空", ""); try { //根据token登录 Port_GenerToken(token); string[] strs = workIDs.Split(','); foreach (string workidStr in strs) { if (BP.DA.DataType.IsNullOrEmpty(workidStr) == true) continue; string st1r = BP.WF.Dev2Interface.Flow_DoUnDeleteFlowByFlag(null, int.Parse(workidStr), "删除"); } return Return_Info(200, "撤销删除成功", ""); } catch (Exception ex) { return Return_Info(500, "撤销删除失败", ex.Message); } } /// /// 批量撤回 /// /// 密钥 /// /// [HttpGet, HttpPost] public Object Flow_DoUnSend(string token, string workIDs) { //获取可以发起的列表 string[] strs = workIDs.Split(','); if (DataType.IsNullOrEmpty(workIDs)) return Return_Info(500, "批量撤回的WorkIDs不能为空", ""); try { //根据token登录 Port_GenerToken(token); string info = ""; foreach (string workidStr in strs) { if (BP.DA.DataType.IsNullOrEmpty(workidStr) == true) continue; info += BP.WF.Dev2Interface.Flow_DoUnSend(null, Int64.Parse(workidStr), 0, 0); } return Return_Info(200, "批量撤回成功", info); } catch (Exception ex) { return Return_Info(500, "批量撤回失败", ex.Message); } } /// /// 批量删除草稿 /// /// 密钥 /// /// [HttpGet, HttpPost] public Object Flow_DeleteDraft(string token, string workIDs) { string[] strs = workIDs.Split(','); if (DataType.IsNullOrEmpty(workIDs)) return Return_Info(500, "批量删除草稿的WorkIDs不能为空", ""); try { //根据token登录 Port_GenerToken(token); foreach (string workidStr in strs) { if (BP.DA.DataType.IsNullOrEmpty(workidStr) == true) continue; BP.WF.Dev2Interface.Node_DeleteDraft(Int64.Parse(workidStr)); } return Return_Info(200, "删除成功", ""); } catch (Exception ex) { return Return_Info(500, "删除失败", ex.Message); } } /// /// 批量结束流程 /// /// 密钥 /// /// [HttpGet, HttpPost] public Object Flow_DoFlowOver(string token, string workIDs) { string[] strs = workIDs.Split(','); if (DataType.IsNullOrEmpty(workIDs)) return Return_Info(500, "批量结束流程的WorkIDs不能为空", ""); try { //根据token登录 Port_GenerToken(token); foreach (string workidStr in strs) { if (BP.DA.DataType.IsNullOrEmpty(workidStr) == true) continue; BP.WF.Dev2Interface.Flow_DoFlowOver(Int64.Parse(workidStr), "批量结束", 1); } return Return_Info(200, "执行成功", ""); } catch (Exception ex) { return Return_Info(500, "执行失败", ex.Message); } } #endregion 节点方法. #region 批处理相关 /// /// 批量处理 /// /// 密钥 /// [HttpGet, HttpPost] public Object Batch_Init(string token) { //根据token登录 Port_GenerToken(token); try { var handle = new BP.WF.HttpHandler.WF(); string str = handle.Batch_Init(); return Return_Info(200, "执行成功", str); } catch (Exception ex) { return Return_Info(500, "执行失败", ex.Message); } } /// /// 根据NodeID获取节点信息 /// /// 密钥 /// /// [HttpGet, HttpPost] public Object En_Node(string token, int nodeID) { try { //根据token登录 Port_GenerToken(token); Node node = new Node(nodeID); return Return_Info(200, "根据NodeID获取节点信息成功", node.ToJson()); } catch (Exception ex) { return Return_Info(500, "执行失败", ex.Message); } } /// /// 根据流程编号获取流程信息 /// /// 密钥 /// /// [HttpGet, HttpPost] public Object En_Flow(string token, string flowNo) { try { //根据token登录 Port_GenerToken(token); Flow flow = new Flow(flowNo); return Return_Info(200, "根据流程编号获取流程信息成功", flow.ToJson()); } catch (Exception ex) { return Return_Info(500, "根据流程编号获取流程信息失败", ex.Message); } } /// /// 根据流程编号获取流程信息 /// /// 密钥 /// /// [HttpGet, HttpPost] public Object WorkCheckModel_Init(string token, int nodeID) { try { //根据token登录 Port_GenerToken(token); DataSet ds = new DataSet(); //获取节点信息 BP.WF.Node nd = new BP.WF.Node(nodeID); Flow fl = nd.HisFlow; ds.Tables.Add(nd.ToDataTableField("WF_Node")); string sql = ""; if (nd.IsSubThread == true) { sql = "SELECT a.*, b.Starter,b.StarterName,b.ADT,b.WorkID FROM " + fl.PTable + " a , WF_EmpWorks b WHERE a.OID=B.FID AND b.WFState Not IN (7) AND b.FK_Node=" + nd.NodeID + " AND b.FK_Emp='" + WebUser.No + "'"; } else { sql = "SELECT a.*, b.Starter,b.StarterName,b.ADT,b.WorkID FROM " + fl.PTable + " a , WF_EmpWorks b WHERE a.OID=B.WorkID AND b.WFState Not IN (7) AND b.FK_Node=" + nd.NodeID + " AND b.FK_Emp='" + WebUser.No + "'"; } //获取待审批的流程信息集合 DataTable dt = DBAccess.RunSQLReturnTable(sql); dt.TableName = "Works"; ds.Tables.Add(dt); //获取按钮权限 BtnLab btnLab = new BtnLab(nodeID); ds.Tables.Add(btnLab.ToDataTableField("Sys_BtnLab")); //获取字段属性 MapAttrs attrs = new MapAttrs("ND" + nodeID); //获取实际中需要展示的列. string batchParas = nd.GetParaString("BatchFields"); MapAttrs realAttr = new MapAttrs(); if (DataType.IsNullOrEmpty(batchParas) == false) { string[] strs = batchParas.Split(','); foreach (string str in strs) { if (string.IsNullOrEmpty(str) || str.Contains("@PFlowNo") == true) continue; foreach (MapAttr attr in attrs) { if (str != attr.KeyOfEn) continue; realAttr.AddEntity(attr); } } } ds.Tables.Add(realAttr.ToDataTableField("Sys_MapAttr")); return Return_Info(200, "根据节点编号获取流程信息成功", BP.Tools.Json.ToJson(ds)); } catch (Exception ex) { return Return_Info(500, "根据节点编号获取流程信息失败", ex.Message); } } [HttpGet, HttpPost] public Object Batch_InitDDL(string token, int nodeID) { try { //根据token登录 Port_GenerToken(token); GenerWorkFlow gwf = new GenerWorkFlow(); Node nd = new Node(nodeID); gwf.TodoEmps = WebUser.No + ","; DataTable mydt = BP.WF.Dev2Interface.Node_GenerDTOfToNodes(gwf, nd); return Return_Info(200, "执行成功", BP.Tools.Json.ToJson(mydt)); } catch (Exception ex) { return Return_Info(500, "执行失败", ex.Message); } } [HttpGet, HttpPost] public Object WorkCheckModel_Send(string token, string flowNo) { try { //根据token登录 Port_GenerToken(token); var handle = new BP.WF.HttpHandler.WF_WorkOpt_Batch(); string str = handle.WorkCheckModel_Send(); return Return_Info(200, "执行成功", str); } catch (Exception ex) { return Return_Info(500, "执行失败", ex.Message); } } [HttpGet, HttpPost] public Object Batch_Delete(string token, string workIDs) { try { //根据token登录 Port_GenerToken(token); if (DataType.IsNullOrEmpty(workIDs) == true) return Return_Info(500, "批量删除成功", "没有选择需要处理的工作"); string msg = ""; GenerWorkFlows gwfs = new GenerWorkFlows(); gwfs.RetrieveIn("WorkID", workIDs); foreach (GenerWorkFlow gwf in gwfs) { msg += "@对工作(" + gwf.Title + ")处理情况如下。
"; string mes = BP.WF.Dev2Interface.Flow_DoDeleteFlowByFlag(gwf.WorkID, "批量删除", true); msg += mes; msg += "
"; } return Return_Info(200, "批量删除成功", msg); } catch (Exception ex) { return Return_Info(500, "执行失败", ex.Message); } } #endregion 批处理相关 #region 其他方法. /// /// 查询 /// /// 关键字 /// 日期从 /// 日期到 /// 范围 /// 分页 /// [HttpGet, HttpPost] public Object Search_Init(string token, string key, string dtFrom, string dtTo, string scop, int pageIdx) { try { //根据token登录 Port_GenerToken(token); GenerWorkFlows gwfs = new GenerWorkFlows(); //创建查询对象. QueryObject qo = new QueryObject(gwfs); if (DataType.IsNullOrEmpty(key) == false) { qo.AddWhere(GenerWorkFlowAttr.Title, " LIKE ", "'%" + key + "%'"); qo.addAnd(); } //我参与的. if (scop.Equals("0") == true) qo.AddWhere(GenerWorkFlowAttr.Emps, "LIKE", "'%@" + WebUser.No + "%'"); //我发起的. if (scop.Equals("1") == true) qo.AddWhere(GenerWorkFlowAttr.Starter, "=", WebUser.No); //我部门发起的. if (scop.Equals("2") == true) qo.AddWhere(GenerWorkFlowAttr.FK_Dept, "=", WebUser.FK_Dept); //任何一个为空. if (DataType.IsNullOrEmpty(dtFrom) == true || DataType.IsNullOrEmpty(dtTo) == true) { } else { qo.addAnd(); qo.AddWhere(GenerWorkFlowAttr.RDT, ">=", dtFrom); qo.addAnd(); qo.AddWhere(GenerWorkFlowAttr.RDT, "<=", dtTo); } var count = qo.GetCount(); //获得总数. qo.DoQuery("WorkID", 20, pageIdx); // qo.DoQuery(); // "WorkID", 20, pageIdx); DataTable dt = gwfs.ToDataTableField("gwls"); //创建容器. DataSet ds = new DataSet(); ds.Tables.Add(dt); //增加查询对象. //增加数量. DataTable mydt = new DataTable(); mydt.TableName = "count"; mydt.Columns.Add("CC"); DataRow dr = mydt.NewRow(); dr[0] = count.ToString(); //把数量加进去. mydt.Rows.Add(dr); ds.Tables.Add(mydt); return Return_Info(200, "查询成功", BP.Tools.Json.ToJson(ds)); } catch (Exception ex) { return Return_Info(500, "查询失败", ex.Message); } } private void Port_GenerToken(string token) { BP.WF.Dev2Interface.Port_LoginByToken(token); } private HttpResponseMessage ReturnMessage(string message) { return new HttpResponseMessage { Content = new StringContent(message, System.Text.Encoding.GetEncoding("UTF-8"), "application/json") }; } #endregion 其他方法. } }