using System; using System.Data; using System.Collections.Generic; using System.Collections; using System.Web; using System.Web.Services; using BP.WF; using BP.WF.Template; using BP.WF.Data; using System.Net; using System.IO; using System.Text; using BP.Cloud; using System.Security.Cryptography; using BP.DA; namespace CCFlow.DataUser { /// /// LocalWS 的摘要说明 /// [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 [System.Web.Script.Services.ScriptService] public class LocalWS : System.Web.Services.WebService { //微信开发者appid和secret_key //第一版小程序 private static string appid = "wxd4893788d8f6088b"; private static string secret = "3f0850c81baf10847c05d01b769d2990"; /// /// 获得工作进度-用于展示流程的进度图 /// /// workID /// 返回进度数据 public string DB_JobSchedule(Int64 workID) { DataSet ds = BP.WF.Dev2Interface.DB_JobSchedule(workID); return BP.Tools.Json.ToJson(ds); } /// /// 获得待办 /// /// 用户编号 /// 系统编号,为空时返回平台所有数据。 /// 返回待办 public string DB_Todolist(string userNo, string sysNo = null) { return null; Paras ps = new Paras(); string sql = ""; if (sysNo == null) { ps.SQL = "SELECT * FROM WF_EmpWorks WHERE FK_Emp=" + BP.DA.DBAccess.AppCenterDBType + "FK_Emp"; ps.Add(userNo); ps.Add(sysNo); } else { ps.SQL = "SELECT * FROM WF_EmpWorks WHERE Domain='" + sysNo + "' AND FK_Emp='" + userNo + "'"; ps.Add(userNo); ps.Add(sysNo); } DataTable dt = BP.DA.DBAccess.RunSQLReturnTable(ps); return BP.Tools.Json.ToJson(dt); } /// /// 获得在途 /// /// 用户编号 /// 系统编号,为空时返回平台所有数据。 /// [WebMethod] public string DB_Runing(string userNo, string sysNo = null) { DataTable dt = BP.WF.Dev2Interface.DB_GenerRuning(userNo, null, false, sysNo); return BP.Tools.Json.ToJson(dt); } /// /// 获得我可以发起的流程. /// /// 用户编号 /// 系统编号,为空时返回平台所有数据。 /// 返回我可以发起的流程列表. [WebMethod] public string DB_StarFlows(string userNo, string domain = null) { DataTable dt = BP.WF.Dev2Interface.DB_StarFlows(userNo, domain); return BP.Tools.Json.ToJson(dt); } /// /// 我发起的流程实例 /// /// 用户编号 /// 子系统编号 /// 我发起的流程列表. [WebMethod] public string DB_MyStartFlowInstance(string userNo, string domain = null, int pageSize = 0, int pageIdx = 0) { string sql = ""; if (domain == null) sql = "SELECT * FROM WF_GenerWorkFlow WHERE Starter='" + userNo + "'"; else sql = "SELECT * FROM WF_GenerWorkFlow WHERE Domain='" + domain + "' AND Starter='" + userNo + "'"; DataTable dt = BP.DA.DBAccess.RunSQLReturnTable(sql); return BP.Tools.Json.ToJson(dt); } /// /// 运行一个sql,返回一个json. /// /// 要运行的SQL,查询 /// 密码,双方约定的密码 /// json [WebMethod] public string DB_RunSQLReturnJSON(string sqlOfSelect, string password) { // if ( password.Equals("xxxxxx") == false) // return "err@密码错误"; // DataTable dt = BP.DA.DBAccess.RunSQLReturnTable(sqlOfSelect); // return BP.Tools.Json.ToJson(dt); throw new Exception("err@请实现该方法,密码部分是双方约定的,不对外公开的."); } /// /// 创建WorkID /// /// 流程编号 /// 工作人员编号 /// 一个长整型的工作流程实例. [WebMethod] public Int64 Node_CreateWorkID(string userNo, string flowNo, string starterNo) { BP.WF.Dev2Interface.Port_Login(userNo); return BP.WF.Dev2Interface.Node_CreateBlankWork(flowNo, userNo); } /// /// 执行发送 /// /// 流的程模版ID /// 工作ID /// 参数: @Field1=Val1@Field2=Val2 /// 到达的节点ID.如果让系统自动计算就传入0 /// 到达的人员IDs,比如:zhangsan,lisi,wangwu. 如果为Null就标识让系统自动计算. /// 发送的结果信息. [WebMethod] public string Node_SendWork(string flowNo, Int64 workid, string atParas, int toNodeID, string toEmps) { BP.DA.AtPara ap = new BP.DA.AtPara(atParas); BP.WF.SendReturnObjs objs = BP.WF.Dev2Interface.Node_SendWork(flowNo, workid, ap.HisHT, toNodeID, toEmps); string msg = objs.ToMsgOfText(); Hashtable myht = new Hashtable(); myht.Add("Message", msg); myht.Add("IsStopFlow", objs.IsStopFlow); myht.Add("VarAcceptersID", objs.VarAcceptersID); myht.Add("VarAcceptersName", objs.VarAcceptersName); myht.Add("VarToNodeID", objs.VarToNodeID); myht.Add("VarToNodeName", objs.VarToNodeName); return BP.Tools.Json.ToJson(myht); } [WebMethod] public void Node_SaveAth(int nodeid, string flowNo, Int64 workid, string athNo, string frmID, byte[] byteFile, string fileName, string fileExt, string userNo, string sort = null, Int32 fid = 0, Int32 pworkid = 0) { //把byte文件保存到临时文件中 string tempPath = BP.Difference.SystemConfig.PathOfTemp + "\\" + DBAccess.GenerGUID() + "." + fileExt; FileInfo fi = new System.IO.FileInfo(tempPath); FileStream fs = fi.OpenWrite(); fs.Write(byteFile, 0, byteFile.Length); fs.Close(); fs.Dispose(); BP.WF.Dev2Interface.Port_Login(userNo); BP.WF.Dev2Interface.CCForm_AddAth(nodeid, flowNo, workid, athNo, frmID, tempPath, fileName + "." + fileExt, sort, fid, pworkid); } /// /// 保存参数 /// /// 工作ID /// 用于控制流程运转的参数,比如方向条件. 格式为:@JinE=1000@QingJaiTianShu=100 [WebMethod] public void Flow_SaveParas(Int64 workid, string paras) { BP.WF.Dev2Interface.Flow_SaveParas(workid, paras); } /// /// 登录接口 /// /// [WebMethod] public void Port_Login(string token) { BP.WF.Dev2Interface.Port_LoginByToken(token); //BP.WF.Dev2Interface.Port_Login(userNo, orgNo); } /// /// 获得下一个节点信息 /// /// 流程编号 /// 流程实例 /// 方向条件所需要的参数,可以为空。 /// 下一个节点的JSON. [WebMethod] public string Flow_GenerNextStepNode(string flowNo, Int64 workid, string paras = null) { if (paras != null) BP.WF.Dev2Interface.Flow_SaveParas(workid, paras); int nodeID = BP.WF.Dev2Interface.Node_GetNextStepNode(flowNo, workid); BP.WF.Node nd = new BP.WF.Node(nodeID); //如果字段 DeliveryWay = 4 就表示到达的接点是由当前节点发送人选择接收人. //自定义参数的字段是 SelfParas, DeliveryWay // CondModel = 方向条件计算规则. return nd.ToJson(); } /// /// 获得下一步节点的接收人 /// /// 节点ID /// 工作事例ID /// 返回两个结果集一个是分组的Depts(No,Name),另外一个是人员的Emps(No, Name, FK_Dept),接受后,用于构造人员选择器. [WebMethod] public string Flow_GenerNextStepNodeEmps(string flowNo, int toNodeID, int workid) { Selector select = new Selector(toNodeID); Node nd = new Node(toNodeID); GERpt rpt = new GERpt("ND" + int.Parse(flowNo) + "Rpt", workid); DataSet ds = select.GenerDataSet(toNodeID, rpt); return BP.Tools.Json.ToJson(ds); } /// /// 将要达到的节点 /// /// 当前节点ID /// 返回节点集合的json. [WebMethod] public string Flow_WillToNodes(int currNodeID) { Node nd = new Node(currNodeID); if (nd.CondModel != DirCondModel.ByLineCond) return "err@当前节点是由选择的."; Directions dirs = new Directions(); Nodes nds = dirs.GetHisToNodes(currNodeID, false); return nds.ToJson(); } /// /// 退回 /// /// 工作ID /// 退回到nodeID /// 退回到人员 /// 退回信息 /// [WebMethod] public string Node_ReturnWork(Int64 workid, int returnToNodeID, string toEmps, string returnMsg) { return BP.WF.Dev2Interface.Node_ReturnWork(workid, returnToNodeID, toEmps, returnMsg); } /// /// 写入审核信息 /// /// workID /// 审核信息 [WebMethod] public void Node_WriteWorkCheck(Int64 workid, string msg) { GenerWorkFlow gwf = new GenerWorkFlow(workid); BP.WF.Dev2Interface.WriteTrackWorkCheck(gwf.FK_Flow, gwf.FK_Node, gwf.WorkID, gwf.FID, msg, "审核", null); } /// /// 是否可以查看该工作 /// /// 流程No /// 工作ID /// 人员ID /// true,false [WebMethod] public bool Flow_IsCanView(string flowNo, Int64 workid, string userNo) { return BP.WF.Dev2Interface.Flow_IsCanViewTruck(flowNo, workid, userNo); } /// /// 是否可以处理当前工作. /// /// 当前工作ID /// 处理人员ID /// true,false [WebMethod] public bool Flow_IsCanDoCurrentWork(Int64 workid, string userNo) { return BP.WF.Dev2Interface.Flow_IsCanDoCurrentWork(workid, userNo); } /// /// 获得当前节点信息. /// /// 节点ID. /// 当前节点信息 [WebMethod] public string Flow_CurrNodeInfo(int currNodeID) { Node nd = new Node(currNodeID); return nd.ToJson(); } /// /// 获得当前流程信息. /// /// 流程ID. /// 当前节点信息 [WebMethod] public string Flow_CurrFlowInfo(string flowNo) { Flow fl = new Flow(flowNo); return fl.ToJson(); } /// /// 获得当前流程信息. /// /// 流程ID. /// 当前节点信息 [WebMethod] public string Flow_CurrGenerWorkFlowInfo(Int64 workID) { GenerWorkFlow gwf = new GenerWorkFlow(workID); return gwf.ToJson(); } /// /// 授权后获取小程序用户的OpenID /// [WebMethod] public string WeiXin_ASCGetUserInfo(string code) { string url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appid + "&secret=" + secret + "&js_code=" + code + "&grant_type=client_credential"; string serviceAddress = url; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceAddress); request.Method = "GET"; request.ContentType = "textml;charset=UTF-8"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8); string retString = myStreamReader.ReadToEnd(); myStreamReader.Close(); myResponseStream.Close(); return retString; } /// /// 解密微信授权的手机号 /// /// /// /// /// [WebMethod] public string WeiXin_AES_Decrypt(string encryptedDataStr, string key, string iv) { RijndaelManaged rijalg = new RijndaelManaged(); //----------------- //设置 cipher 格式 AES-128-CBC rijalg.KeySize = 128; rijalg.Padding = PaddingMode.PKCS7; rijalg.Mode = CipherMode.CBC; rijalg.Key = Convert.FromBase64String(key); rijalg.IV = Convert.FromBase64String(iv); byte[] encryptedData = Convert.FromBase64String(encryptedDataStr); //解密 ICryptoTransform decryptor = rijalg.CreateDecryptor(rijalg.Key, rijalg.IV); string result; using (MemoryStream msDecrypt = new MemoryStream(encryptedData)) { using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) { using (StreamReader srDecrypt = new StreamReader(csDecrypt)) { result = srDecrypt.ReadToEnd(); } } } return result; } /// ///BPM登录 /// /// /// [WebMethod] public string Port_LoadOrgInfo(string openID) { //先从Port_User 去查找 openID, 如果没有记录,就转到注册页面上去 //如果有就列出此人所有注册过的公司,选择其一登录 User user = new User(); int i = user.Retrieve(UserAttr.SOpenID, openID); if (i == 1) { Emps emps = new Emps(); emps.Retrieve(EmpAttr.OpenID, openID); return emps.ToJson(); } return "info@zhuce"; } /// /// 注册企业 /// /// /// /// 小程序ID /// /// /// [WebMethod] public string WeiXin_RegByXiaoChengXu(string orgName, string orgShortName, string openid, string userName, string tel) { //注册企业. BP.Cloud.Org org = new BP.Cloud.Org(); org.No = BP.DA.DBAccess.GenerGUID(4, "Port_Org", "No"); org.Name = orgShortName; org.NameFull = orgName; org.Adminer = openid; org.AdminerName = userName; org.Insert(); //增加这个人员. Emp emp = new Emp(); emp.No = org.No + "_" + openid; emp.Name = userName; emp.Pass = "123"; emp.OrgNo = org.No; emp.OrgName = org.NameFull; // 设置ID. emp.UserID = openid; emp.OpenID = openid; emp.FK_Dept = org.No; emp.Tel = tel; emp.Insert(); BP.Cloud.User user = new User(); int i = user.Retrieve(UserAttr.SOpenID, openid); if (i == 0) { user.Copy(emp); user.No = emp.OpenID; user.OrgNo = emp.OrgNo; user.SOpenID = emp.OpenID; user.Insert(); } else { user.Copy(emp); user.No = emp.OpenID; user.OrgNo = emp.OrgNo; user.SOpenID = emp.OpenID; user.Update(); } ////初始化部门. //BP.Cloud.Dept dept = new Dept(); //dept.ParentNo = "100"; //dept.No = org.No; //dept.Name = org.Name; //dept.OrgNo = org.No; //dept.Insert(); //dept.ParentNo = org.No; //dept.No = BP.DA.DBAccess.GenerGUID(5, "Port_Dept", "No"); //dept.Name = "办公室"; //dept.OrgNo = org.No; //dept.Insert(); //dept.ParentNo = org.No; //dept.No = BP.DA.DBAccess.GenerGUID(5, "Port_Dept", "No"); //dept.Name = "财务部"; //dept.OrgNo = org.No; //dept.Insert(); BP.Web.WebUser.OrgNo = org.No; //生成其他的信息.(@lizhenerr 有报错?) org.Init_OrgDatas(); //管理员登录 BP.WF.Dev2Interface.Port_Login(openid, org.No); ////初始化岗位. //BP.Cloud.Station sta = new Station(); //sta.No = BP.DA.DBAccess.GenerGUID(); //sta.Name = "办公室主任"; //sta.OrgNo = org.No; //sta.Insert(); //sta = new Station(); //sta.No = BP.DA.DBAccess.GenerGUID(); //sta.Name = "财务部主任"; //sta.OrgNo = org.No; //sta.Insert(); return org.ToJson(); } /// /// 检查此人是否加入 /// [WebMethod] public string WeiXin_CheckJoin(string openID, string orgNo) { ////让管理员登录. //this.LetUserLogin("admin", "ccs"); //BP.Cloud.HttpHandler.App_Portal apl = new BP.Cloud.HttpHandler.App_Portal(); //return apl.Invited_CheckIsExit(openID, orgNo); return ""; ////让管理员退出。 //BP.Web.WebUser.Exit(); //return "加入成功!"; } /// /// 扫码增加人员 /// [WebMethod] public string WeiXin_CreateEmp(string openID, string orgNo, string userNo, string tel, string empName, string deptNo) { ////让管理员登录. //this.LetUserLogin("admin", "ccs"); //BP.Cloud.HttpHandler.App_Portal apl = new BP.Cloud.HttpHandler.App_Portal(); //return apl.Invited_AddEmp(openID, orgNo, userNo, tel, empName, deptNo); return ""; ////让管理员退出。 //BP.Web.WebUser.Exit(); //return "加入成功!"; } /// /// 获取单位该单位的部门列表 /// /// /// [WebMethod] public string Port_ASCLoadDepts(string orgNo) { string sql = "SELECT * FROM Port_Dept WHERE OrgNo='" + orgNo + "' ORDER BY Idx"; DataTable dt = new DataTable(); dt = DBAccess.RunSQLReturnTable(sql); return BP.Tools.Json.ToJson(dt); } #region 关于组织结构的接口. /// /// 登录成功后返回的token. /// /// /// /// /// public string Port_Login(string userNo, string password, string orgNo) { BP.Port.Emp emp = new BP.Port.Emp(); emp.No = userNo; if (emp.RetrieveFromDBSources() == 0) return "err@密码或者用户名错误."; if (emp.CheckPass(password) == false) return "err@密码或者用户名错误."; if (DataType.IsNullOrEmpty(orgNo) == true) orgNo = emp.OrgNo; //执行登录,返回token. BP.WF.Dev2Interface.Port_Login(userNo, orgNo); return BP.WF.Dev2Interface.Port_GenerToken("PC"); } /// /// 集团模式下同步组织以及管理员信息. /// /// 组织编号 /// 组织名称 /// 管理员账号 /// 管理员名字 /// 比如:@Leaer=zhangsan@Tel=12233333@Idx=1 /// return 1 增加成功,其他的增加失败. [WebMethod] public string Port_Org_Save(string token, string orgNo, string name, string adminer, string adminerName, string keyVals) { BP.WF.Dev2Interface.Port_LoginByToken(token); if (BP.Web.WebUser.IsAdmin == false) return "0"; return BP.Port.OrganizationAPI.Port_Org_Save(orgNo, name, adminer, adminerName, keyVals); } /// /// 保存用户数据, 如果有此数据则修改,无此数据则增加. /// /// 组织编号 /// 用户编号,如果是saas版本就是orgNo_userID /// 用户名称 /// 部门编号 /// 属性值,比如: @Name=张三@Tel=18778882345@Pass=123, 如果是saas模式:就必须有@UserID=xxxx /// 岗位编号:比如:001,002,003, /// reutrn 1=成功, 其他的标识异常. [WebMethod] public string Port_Emp_Save(string token, string orgNo, string userNo, string userName, string deptNo, string kvs, string stats) { BP.WF.Dev2Interface.Port_LoginByToken(token); if (BP.Web.WebUser.IsAdmin == false) return "0"; return BP.Port.OrganizationAPI.Port_Emp_Save(orgNo, userNo, userName, deptNo, kvs, stats); } /// /// 保存岗位 /// /// /// 岗位用逗号分开 /// reutrn 1=成功, 其他的标识异常. [WebMethod] public string Port_Emp_Delete(string token, string orgNo, string userNo) { BP.WF.Dev2Interface.Port_LoginByToken(token); if (BP.Web.WebUser.IsAdmin == false) return "0"; return BP.Port.OrganizationAPI.Port_Emp_Delete(orgNo, userNo); } /// /// 保存部门, 如果有此数据则修改,无此数据则增加. /// /// 组织编号 /// 部门编号 /// 名称 /// 父节点编号 /// 比如:@Leaer=zhangsan@Tel=12233333@Idx=1 /// return 1 增加成功,其他的增加失败. [WebMethod] public string Port_Dept_Save(string token, string orgNo, string no, string name, string parntNo, string keyVals) { BP.WF.Dev2Interface.Port_LoginByToken(token); if (BP.Web.WebUser.IsAdmin == false) return "0"; return BP.Port.OrganizationAPI.Port_Dept_Save(orgNo, no, name, parntNo, keyVals); } /// /// 删除部门. /// /// 删除指定的部门编号 /// [WebMethod] public string Port_Dept_Delete(string token, string no) { BP.WF.Dev2Interface.Port_LoginByToken(token); if (BP.Web.WebUser.IsAdmin == false) return "0"; return BP.Port.OrganizationAPI.Port_Dept_Delete(no); } /// /// 保存岗位, 如果有此数据则修改,无此数据则增加. /// /// 组织编号 /// 编号 /// 名称 /// return 1 增加成功,其他的增加失败. [WebMethod] public string Port_Station_Save(string token, string orgNo, string no, string name, string keyVals) { BP.WF.Dev2Interface.Port_LoginByToken(token); if (BP.Web.WebUser.IsAdmin == false) return "0"; return BP.Port.OrganizationAPI.Port_Station_Save(orgNo, no, name, keyVals); } /// /// 删除部门. /// /// 删除指定的部门编号 /// [WebMethod] public string Port_Station_Delete(string token, string no) { BP.WF.Dev2Interface.Port_LoginByToken(token); if (BP.Web.WebUser.IsAdmin == false) return "0"; return BP.Port.OrganizationAPI.Port_Station_Delete(no); } #endregion 关于组织的接口. } }