public SyncResult SyncOrgToWeChat(DateTime LastSyncTime) { SyncResult sr = new SyncResult(); try { LoadOrgToken(); this.RWL.AcquireWriterLock(-1); if (string.IsNullOrEmpty(AccessToken)) { sr.Success = false; sr.ErrMsg = "获取Token错误"; return(sr); } string companyId = Organization.Company.ObjectID; this.LogWriter.Write("微信组织同步开始..."); DataTable userRelation = GetWechatUserRelation(); SyncOrg(LastSyncTime, companyId, 1, userRelation, ref sr); //完整同步时执行 if (LastSyncTime == DateTime.MinValue) { this.LogWriter.Write("H3中删除的用户,在企业微信中一起删除"); #region H3中删除的用户,在企业微信中一起删除; string sql = "SELECT * FROM C_H3_Wechat_OrgSync WHERE code NOT IN (SELECT code FROM OT_User where state=1)"; DataTable dt = OThinker.H3.Controllers.AppUtility.Engine.EngineConfig.CommandFactory.CreateCommand().ExecuteDataTable(sql); foreach (DataRow row in dt.Rows) { if (DeleteWeChatUser(row["code"] + string.Empty)) { sr.delete_User_Success_Num++; } } #endregion } return(sr); } catch (Exception ex) { this.LogWriter.Write(ex.ToString()); sr.Success = false; sr.ErrMsg = "Exception:" + ex.ToString(); return(sr); } finally { this.RWL.ReleaseWriterLock(); } }
/// <summary> /// 同步微信的组织 /// </summary> /// <param name="SourceUnits"></param> /// <param name="ParentID"></param> /// <param name="WeChatParent"></param> /// <returns></returns> private bool SyncOrg(DateTime LastSyncTime, string ParentID, int WeChatParent, DataTable dtUserRelation, ref SyncResult syncResult) { LoadOrgToken(); var childList = Organization.GetChildUnits(ParentID, UnitType.OrganizationUnit, false, State.Active); var ChildList = childList.OrderBy(a => a.SortKey); #region 用户同步 // 同步用户 OThinker.Organization.Unit[] users = Organization.GetChildUnits(ParentID, UnitType.User, false, State.Unspecified).OrderBy(a => a.SortKey).ToArray(); if (users != null) { foreach (OThinker.Organization.User user in users) { if (string.IsNullOrEmpty(user.WeChatAccount) && string.IsNullOrEmpty(user.Email) && string.IsNullOrEmpty(user.Mobile)) { continue; } //1.增量同步且用户的修改时间少于上次的同步时间,不做增量同步 if (LastSyncTime != DateTime.MinValue && user.ModifiedTime < LastSyncTime) { continue; } this.LogWriter.Write("微信用户同步,Code=" + user.Code + ",Name=" + user.Name + ",Mobile=" + user.Mobile + ",WeChatParent=" + WeChatParent); if (NotSyncToWechatUserCodes.Replace("'", "").Split(',').Contains(user.Code)) { this.LogWriter.Write("微信用户同步跳过,存在于不同步配置中,Code=" + user.Code + ",Name=" + user.Name + ",Mobile=" + user.Mobile + ",WeChatParent=" + WeChatParent); continue; } var wxuser = GetWeChatUser(user.Code); if (wxuser.errcode != "0")//0表示正常返回 { //H3禁用或者离职:不用同步到微信 if (user.State == State.Inactive || user.ServiceState == UserServiceState.Dismissed) { } else { if (user.Appellation != null && user.Appellation.Contains("金融专员")) { this.LogWriter.Write("微信用户同步跳过:金融专员不做处理"); //金融专员不做处理: //金融专员有CAP账号,又有263邮箱,会导致手机号码重复; //所以不同步 } else { // 不存在, if (CreateWeChatUser(user, WeChatParent)) { DataRow[] rows = dtUserRelation.Select("CODE='" + user.Code + "'"); if (rows.Length == 0) { InsertToWechatUserRelation(user.Code, user.Name, user.Mobile); } syncResult.create_User_Success_Num++; } else { syncResult.create_User_Fail_Num++; } } } } else//微信存在此用户 { //微信中有这个用户,但是H3中是禁用或者离职状态的,删除企业微信 //如果是金融专员,删除:保证一个人有一个号码; if (user.State == State.Inactive || user.ServiceState == UserServiceState.Dismissed || (user.Appellation != null && user.Appellation.Contains("金融专员"))) { this.LogWriter.Write("微信用户删除:禁用/离职/金融专员"); if (DeleteWeChatUser(user.Code)) { syncResult.delete_User_Success_Num++; } else { syncResult.delete_User_Fail_Num++; } } else { #region 手机号码被修改了 //手机号码被修改了 if (user.Mobile != wxuser.mobile) { this.LogWriter.Write($"微信用户手机号码不一致,微信{wxuser.mobile},H3{user.Mobile}"); //这块删除逻辑有问题,先注释; //DataTable dtTel = OThinker.H3.Controllers.AppUtility.Engine.EngineConfig.CommandFactory.CreateCommand().ExecuteDataTable("SELECT * FROM C_H3_Wechat_OrgSync WHERE tel='" + user.Mobile + "'"); //if (dtTel != null && dtTel.Rows.Count > 0)//此修改的手机号码有用户在使用,先删除此用户; //{ // foreach (DataRow row in dtTel.Rows) // { // var wxuserCF = GetWeChatUser(row["code"] + string.Empty); // if (DeleteWeChatUser(wxuserCF.userid)) // { // syncResult.delete_User_Success_Num++; // } // } //} //微信认证后,默认会绑定微信对应的手机号码,会修改掉原系统中的手机号,导致2个系统的手机号不一致 //此时下面的删除逻辑会有问题,故注释; //手机号码被修改了,但是此被激活了,需要先删除此用户,然后再同步 //if (wxuser.status == 1) //{ // this.LogWriter.Write($"微信用户删除:手机号码修改且已激活,原{wxuser.mobile},现{user.Mobile}"); // if (DeleteWeChatUser(wxuser.userid)) // { // syncResult.delete_User_Success_Num++; // } // this.LogWriter.Write($"微信用户删除后创建:手机号码修改且已激活,原{wxuser.mobile},现{user.Mobile}"); // if (CreateWeChatUser(user, WeChatParent)) // { // syncResult.create_User_Success_Num++; // InsertToWechatUserRelation(user.Code, user.Name, user.Mobile); // } // else // { // syncResult.create_User_Fail_Num++; // } // continue; //} } #endregion #region 手机号码没有被修改 //手机号码没有被修改 if (UpdateWeChatUser(user, WeChatParent)) { //判断中间表是否有数据,有数据就更新,没有数据就插入 DataRow[] rows = dtUserRelation.Select("CODE='" + user.Code + "'"); if (rows.Length == 0) { InsertToWechatUserRelation(user.Code, user.Name, user.Mobile); } else { if (user.Mobile != wxuser.mobile) { //手机号码修改了才去Update中间表; string sqlUpdate = "UPDATE C_H3_Wechat_OrgSync SET name='" + user.Name + "',tel='" + user.Mobile + "' WHERE code='" + user.Code + "'"; int n = OThinker.H3.Controllers.AppUtility.Engine.EngineConfig.CommandFactory.CreateCommand().ExecuteNonQuery(sqlUpdate); this.LogWriter.Write("Update C_H3_Wechat_OrgSync表,Code:" + user.Code + ",Name:" + user.Name + ",Tel:" + user.Mobile + ",受影响行数:" + n); } } syncResult.update_User_Success_Num++; } else { syncResult.update_User_Fail_Num++; } #endregion } } } } #endregion #region OU同步 foreach (OThinker.Organization.OrganizationUnit sourceUnit in ChildList) { this.LogWriter.Write("微信OU同步,ID=" + sourceUnit.ObjectID + ",Name=" + sourceUnit.Name + ",WeChatParent=" + WeChatParent + ",WeChatID=" + sourceUnit.WeChatID); // 同步当前组织 WeChatOrg_New org = this.GetWeChatOrgByParentId(WeChatParent, sourceUnit.WeChatID); if (org != null) { // 已存在 if (sourceUnit.WeChatID != org.id) { sourceUnit.WeChatID = org.id; Organization.UpdateUnit(OThinker.Organization.User.AdministratorID, sourceUnit); } //更新组织顺序 if (sourceUnit.SortKey != 5000 - sourceUnit.SortKey) { org.order = 5000 - sourceUnit.SortKey; org.parentid = WeChatParent; org.name = sourceUnit.Name; if (UpdateWeChatOrg(org)) { syncResult.update_OU_Success_Num++; } else { syncResult.update_OU_Fail_Num++; } } } else {// 不存在 org = CreateWeChatOrg(sourceUnit.WeChatID, sourceUnit.Name, WeChatParent, 5000 - sourceUnit.SortKey); if (org.id != 0) { sourceUnit.WeChatID = org.id; Organization.UpdateUnit(OThinker.Organization.User.AdministratorID, sourceUnit); } if (org.errcode == "0") { syncResult.create_OU_Success_Num++; } else { syncResult.create_OU_Fail_Num++; } } // 递归同步子结构 SyncOrg(LastSyncTime, sourceUnit.ObjectID, sourceUnit.WeChatID, dtUserRelation, ref syncResult); } #endregion return(true); }