using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WX.CRM.BLL.Base; using WX.CRM.BLL.Ww; using WX.CRM.Common; using WX.CRM.Common.Employee; using WX.CRM.Model.crmModel; using WX.CRM.Model.Entity; using WX.CRM.Model.SSO; namespace WX.CRM.BLL.SSO { public class SSO_Organization_BL { private Ww_huser_BL ww_Huser_BL = new Ww_huser_BL(); private BAS_INNERUSER_BL user_BL = new BAS_INNERUSER_BL(); private string ssoUrl = ""; private string DeleteCacheUrl = ""; /// /// 开始下载 默认全量拉取 /// public void StartDownLoad(string downType = "1") { string AppId = Utility.GetSettingByKey("appId");//坐席的appid string Secret = Utility.GetSettingByKey("appSecret");//坐席的appid的密钥 if (string.IsNullOrEmpty(AppId)) { LogHelper.Error("没有在Config配置sso对应的AppId"); return; } if (string.IsNullOrEmpty(Secret)) { LogHelper.Error("没有在Config配置sso对应的AppId"); return; } if (string.IsNullOrWhiteSpace(ssoUrl)) { var param = Utility.GetSettingByKey("SSO_Organization_Get_Url");// bas_parameterbl.GetModel_Patameter("SSO_Organization_Get_Url"); if (string.IsNullOrWhiteSpace(param)) { LogHelper.Error("没有配置sso下载地址"); return; } LogHelper.Info($"查询SSO_Organization_Get_Url"); ssoUrl = param; } LogHelper.Info($"开始同步sso结构【{DateTime.Now}】"); ApiDockHelper dock = new ApiDockHelper(AppId, Secret); Dictionary dic = new Dictionary(); dic.Add("appid", AppId); /*if (downType != "1") { dic.Add("update_time", DateTime.Now.AddHours(-1).ToString("yyyy-MM:dd HH:mm:ss")); //默认全量拉取 }*/ //对json进行数据处理 ApiResult model = dock.PostApi(ssoUrl, dic); //数据地址 if (model.ret != 0) { LogHelper.Error("SSO_Organization_Download错误:" + model.ToJson()); return; } Organization_Analyse(model.data); } /// /// 下载的sso组织结构数据分析 /// public void Organization_Analyse(SSO_Organization model) { using (var db = new crmContext()) { //先查询数据库所有的营业部 和 销售组 var deptmentList = db.BAS_SALESDEPARTMENT.ToList(); var groupList = db.BAS_INNERGROUP.ToList(); List allList = new List(); if (model != null && model.other_departments != null) { var otherList = model.other_departments.Select(m => Mapper.T1MapToT2(m)).ToList(); allList.AddRange(otherList); } if (model != null && model.profession_departments != null)//内部门数据入库 { var professList = model.profession_departments.Select(m => Mapper.T1MapToT2(m)).ToList(); professList.ForEach(n => n.IS_PROFESSION = 1); foreach (var item in professList) { if (model.other_departments.FirstOrDefault(n => n.id == item.id) != null) { item.IS_PROFESSION = 3; } } allList.AddRange(professList); } List passUserList = new List(); var hasUpdate = false; if (model != null && model.employees != null)//员工数据同步 { foreach (var name in model.employees) { try { int employee_id = 0; if (!int.TryParse(name.employee_id, out employee_id))//如果不是数字,跳出 continue; var info = db.BAS_INNERUSER.FirstOrDefault(m => m.EID == employee_id);//在坐席中对应的关系 var indept = true; var employee_departmentinfo = model.employee_departments.Where(m => m.employee_id == name.id && m.is_deleted == 0);//员工不在关系里面 if (employee_departmentinfo.Count() == 0) { indept = false; } var departmentId = employee_departmentinfo.Select(n => n.department_id).ToList(); if (model.profession_departments.FirstOrDefault(m => departmentId.Contains(m.id) && m.is_deleted == 0) == null && model.other_departments.FirstOrDefault(m => departmentId.Contains(m.id) && m.is_deleted == 0) == null)//员工不在指定的部门里面 { indept = false; } if (info == null)//找不到数据,就新增 { if (!indept) { continue; } var bas_inneruser = new BAS_INNERUSER { PKID = new SEQUENCES_BL().Seq_base_get(), CTIME = DateTime.Now, DISMISSTIME = name.leave_date, ENTRYDATE = name.entry_date, EID = employee_id, ISHIDE = Convert.ToInt16(name.is_deleted == 0 ? 0 : 1), ISDISMISS = Convert.ToInt16(name.leave_date.HasValue ? 1 : 0),//是否离职,根据是否含有离职时间来 UNAME = name.employee_name, TRUENAME = name.employee_name, EMPLOYEE_ID = name.id, UTIME = DateTime.Now }; string password = $"{employee_id}@123"; string user_salt = Utility.CreateRandomSatl(8); bas_inneruser.PASSWORD = Utility.Sha512(password + user_salt);//初始化密码 //bas_inneruser.map_PASSWORD = password; //bas_inneruser.map_PASSWORD2 = password; //bas_inneruser.map_PASSWORD3 = password; BAS_INNERUSERSALT userSaltModel = new BAS_INNERUSERSALT(); userSaltModel.PKID = new SEQUENCES_BL().Seq_base_get(); userSaltModel.INNERUSERID = bas_inneruser.PKID; userSaltModel.EID = employee_id; userSaltModel.PWDSALT = user_salt; userSaltModel.CTIME = DateTime.Now; db.BAS_INNERUSERSALT.Add(userSaltModel); if (name.sex.HasValue && name.sex == 1) { bas_inneruser.GENDER = "m"; } else { bas_inneruser.GENDER = "f"; } db.BAS_INNERUSER.Add(bas_inneruser); } else //有数据就修改 { info.UNAME = name.employee_name; info.TRUENAME = name.employee_name; info.DISMISSTIME = name.leave_date; info.ENTRYDATE = name.entry_date; //info.EID = employee_id; info.ISHIDE = Convert.ToInt16(name.is_deleted == 0 ? 0 : 1); var isDismiss = Convert.ToInt16(name.status == 2 ? 1 : 0);//是否离职,根据是否含有离职时间来 if (isDismiss != info.ISDISMISS) { passUserList.Add(info.PKID); } info.ISDISMISS = isDismiss;//是否离职,根据是否含有离职时间来 info.UNAME = name.employee_name; info.TRUENAME = name.employee_name; info.EMPLOYEE_ID = name.id; if (!indept) { //如果不在业务部门 直接刷 状态为 离职 ishide为1 info.ISHIDE = 1; info.ISDISMISS = 1; } } db.Configuration.ValidateOnSaveEnabled = false; var update = db.SaveChanges(); if (update > 0) { LogHelper.Info($"员工{info.UNAME}修改离职状态为{info?.ISDISMISS}【{info?.ISHIDE}】"); if (info != null) { info.UTIME = DateTime.Now; db.SaveChanges(); } hasUpdate = true; } } catch (Exception e) { LogHelper.Error($"{name.employee_id}人员更新失败{e.ToString()}"); } } } //需要先把部门入库 var deptIdList = allList.Where(n => n.department_type != 2).Select(n => n.id).Distinct().ToList(); foreach (var deptId in deptIdList) { var dept = allList.Where(n => n.department_type != 2).LastOrDefault(n => n.id == deptId); try { var info = db.BAS_SALESDEPARTMENT.FirstOrDefault(m => m.DEPARTMENT_ID == dept.id);//在坐席中对应的关系 if (info == null)//找不到数据,就新增 { var obj = new BAS_SALESDEPARTMENT() { SALEDEPTID = new SEQUENCES_BL().Seq_base_get(), COMPANYID = 0, SALEDEPTCODE = dept.department_code, DEPTNAME = dept.department_name, CREATIONDATE = DateTime.Now, DEPARTMENT_SORT = dept.department_sort, DEPARTMENT_CODE = dept.department_code, DEPARTMENT_ID = dept.id, DEPARTMENT_PARENTID = dept.parent_id, IS_PROFESSION = dept.IS_PROFESSION, IS_DELETED = dept.is_deleted, ISCHECK = dept.is_checked ? 1 : 0 }; db.BAS_SALESDEPARTMENT.Add(obj); } else //有数据就修改 { info.DEPARTMENT_SORT = dept.department_sort; info.DEPARTMENT_CODE = dept.department_code; info.DEPARTMENT_PARENTID = dept.parent_id; info.DEPTNAME = dept.department_name; info.IS_PROFESSION = dept.IS_PROFESSION; info.ISCHECK = dept.is_checked ? 1 : 0; info.IS_DELETED = dept.is_deleted;//是否删除 //info.UPDATEDATE = DateTime.Now;//修改时间 } var update = db.SaveChanges(); if (update > 0) { hasUpdate = true; } } catch (Exception e) { LogHelper.Error($"部门同步出错:{dept.department_name}{e.ToString()}"); } } deptmentList = db.BAS_SALESDEPARTMENT.ToList(); var groupidList = allList.Where(n => n.department_type == 2).Select(n => n.id).Distinct().ToList(); //再同步销售组 需要绑定 部门 foreach (var groupId in groupidList) { var dept = allList.Where(n => n.department_type == 2).LastOrDefault(n => n.id == groupId); try { var info = db.BAS_INNERGROUP.FirstOrDefault(m => m.DEPARTMENT_ID == dept.id);//在坐席中对应的关系 //寻找对应的营业部 把 SALEDEPTID对应好 var exitSaleDepartMent = deptmentList.FirstOrDefault(n => n.DEPARTMENT_ID == dept.parent_id); if (info == null)//找不到数据,就新增 { db.BAS_INNERGROUP.Add(new BAS_INNERGROUP() { GID = new SEQUENCES_BL().Seq_base_get(), GNAME = dept.department_name, SALEDEPTID = exitSaleDepartMent?.SALEDEPTID, CTIME = DateTime.Now, DEPARTMENT_SORT = dept.department_sort, DEPARTMENT_CODE = dept.department_code, DEPARTMENT_ID = dept.id, DEPARTMENT_PARENTID = dept.parent_id, IS_PROFESSION = dept.IS_PROFESSION, IS_DELETED = dept.is_deleted, ISHIDE = 0, ISCHECK = dept.is_checked ? 1 : 0 }); } else //有数据就修改 { if (exitSaleDepartMent != null) { info.SALEDEPTID = exitSaleDepartMent.SALEDEPTID; } info.DEPARTMENT_SORT = dept.department_sort; info.DEPARTMENT_CODE = dept.department_code; info.DEPARTMENT_PARENTID = dept.parent_id; info.GNAME = dept.department_name; info.IS_PROFESSION = dept.IS_PROFESSION; info.ISCHECK = dept.is_checked ? 1 : 0; info.IS_DELETED = dept.is_deleted;//是否删除 //info.UTIME = DateTime.Now;//修改时间 } var update = db.SaveChanges(); if (update > 0) { hasUpdate = true; } } catch (Exception e) { LogHelper.Error($"销售组同步出错:{dept.department_name}{e.ToString()}"); } } //维护员工=> 组 员工 =》部门映射表 if (model != null && model.employee_departments != null)//员工数据同步 { List employeeids = model.employee_departments.Select(n => Convert.ToDecimal(n.employee_id)).ToList(); var userList = db.BAS_INNERUSER.Where(n => n.EMPLOYEE_ID.HasValue && employeeids.Contains(n.EMPLOYEE_ID.Value)).ToList(); var userids = userList.Select(x => x.PKID).ToList(); //已经存在的用户销售组对应关系 var saleDeptList = db.BAS_SALESDEPARTMENT.ToList(); var groupDeptList = db.BAS_INNERGROUP.ToList(); foreach (var name in model.employee_departments) { try { var info = db.BAS_EMPLOYEE_DEPARTMENT.FirstOrDefault(m => m.ID == name.id);//在坐席中对应的关系 if (info == null)//找不到数据,就新增 { var bas_inneruser = new BAS_EMPLOYEE_DEPARTMENT() { ID = name.id, CREATE_TIME = name.create_time, DEPARTMENT_ID = name.department_id, EMPLOYEE_ID = name.employee_id, IS_DELETED = name.is_deleted, UPDATE_TIME = name.update_time }; db.BAS_EMPLOYEE_DEPARTMENT.Add(bas_inneruser); } else //有数据就修改 { info.CREATE_TIME = name.create_time; info.DEPARTMENT_ID = name.department_id; info.EMPLOYEE_ID = name.employee_id; info.IS_DELETED = name.is_deleted; info.UPDATE_TIME = name.update_time; } //维护员工 销售组映射表 if (name.is_deleted == 0) { var user = userList.FirstOrDefault(n => n.EMPLOYEE_ID == name.employee_id); var innergroup = groupDeptList.FirstOrDefault(n => n.DEPARTMENT_ID == name.department_id); var saledept = saleDeptList.FirstOrDefault(n => n.SALEDEPTID == innergroup?.SALEDEPTID); if (innergroup == null) { saledept = saleDeptList.FirstOrDefault(n => n.DEPARTMENT_ID == name.department_id); } if (saledept != null && user != null) { var usergroup = db.BAS_INNERUSERGROUP.FirstOrDefault(n => n.INNERUSERID == user.PKID); if (usergroup == null) { if (name.is_deleted == 0) { usergroup = new BAS_INNERUSERGROUP { COMPANYID = saledept?.COMPANYID, GID = innergroup?.GID, INNERUSERID = user.PKID, CTIME = DateTime.Now, DEPTID = innergroup != null ? innergroup.SALEDEPTID : saledept?.SALEDEPTID }; db.BAS_INNERUSERGROUP.Add(usergroup); } } else { usergroup.GID = innergroup?.GID; usergroup.INNERUSERID = user.PKID; //usergroup.UTIME = DateTime.Now; usergroup.DEPTID = innergroup != null ? innergroup.SALEDEPTID : saledept?.SALEDEPTID; } } } var update = db.SaveChanges(); if (update > 0) { hasUpdate = true; } } catch (Exception e) { LogHelper.Error($"维护员工和销售组对应关系失败{name.employee_id}{e.ToString()}"); } } } //修正员工表的saledeptid try { db.Database.ExecuteSqlCommand(@"update bas_innerusergroup t set t.deptid=(select b.saledeptid from bas_innergroup b where b.gid=t.gid) where t.gid is not null and exists(select b.saledeptid from bas_innergroup b where b.gid= t.gid)"); } catch (Exception ex) { LogHelper.Error($"执行Sql报错{ex.Message}"); } //有人离职 需要解绑对应的企微资源 if (passUserList.Count > 0) { try { LogHelper.Info($"{string.Join(",", passUserList)}离职清空eid"); var wwhhuserList = db.WW_HHUSER_EID.Where(n => passUserList.Contains(n.INNERUSERID)).ToList(); List res = new List(); foreach (var item in wwhhuserList) { SelfUnBindModel newitem = new SelfUnBindModel { userid = item.USERID, corpid = item.CORPID }; res.Add(newitem); } if (res.Count() > 0) { //解绑企微id ValidationErrors errors = new ValidationErrors(); ww_Huser_BL.ClearEid(res, 0, ref errors); } } catch (Exception ex) { LogHelper.Error($"{string.Join(",", passUserList)}离职清空eid失败[{ex.Message}]"); } } ///清除缓存 if (hasUpdate) { try { var allUser = db.BAS_INNERUSER.ToList(); foreach (var item in allUser) { user_BL.SetUserDeptid(item.EID); } if (string.IsNullOrWhiteSpace(DeleteCacheUrl)) { DeleteCacheUrl = Utility.GetSettingByKey("DeleteCacheUrl");// bas_parameterbl.GetModel_Patameter("DeleteCacheUrl"); //DeleteCacheUrl = param.PARAVALUE; } var result = Utility.GetData(DeleteCacheUrl, "", Encoding.UTF8); if (result.Contains("删除成功")) { LogHelper.Info("Crm删除缓存成功"); } else { LogHelper.Error($"删除缓存失败{result}"); } } catch (Exception ex) { LogHelper.Error($"清除缓存失败{ex.Message}"); } } } } } }