474 lines
24 KiB
C#
474 lines
24 KiB
C#
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 = "";
|
|
|
|
/// <summary>
|
|
/// 开始下载 默认全量拉取
|
|
/// </summary>
|
|
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<string, object> dic = new Dictionary<string, object>();
|
|
dic.Add("appid", AppId);
|
|
/*if (downType != "1")
|
|
{
|
|
dic.Add("update_time", DateTime.Now.AddHours(-1).ToString("yyyy-MM:dd HH:mm:ss")); //默认全量拉取
|
|
}*/
|
|
//对json进行数据处理
|
|
ApiResult<SSO_Organization> model = dock.PostApi<SSO_Organization>(ssoUrl, dic); //数据地址
|
|
if (model.ret != 0)
|
|
{
|
|
LogHelper.Error("SSO_Organization_Download错误:" + model.ToJson());
|
|
return;
|
|
}
|
|
Organization_Analyse(model.data);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 下载的sso组织结构数据分析
|
|
/// </summary>
|
|
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<SSO_DepartmentExtend> allList = new List<SSO_DepartmentExtend>();
|
|
if (model != null && model.other_departments != null)
|
|
{
|
|
var otherList = model.other_departments.Select(m => Mapper.T1MapToT2<SSO_Department, SSO_DepartmentExtend>(m)).ToList();
|
|
allList.AddRange(otherList);
|
|
}
|
|
if (model != null && model.profession_departments != null)//内部门数据入库
|
|
{
|
|
var professList = model.profession_departments.Select(m => Mapper.T1MapToT2<SSO_Department, SSO_DepartmentExtend>(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<decimal> passUserList = new List<decimal>();
|
|
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<Decimal> 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<SelfUnBindModel> res = new List<SelfUnBindModel>();
|
|
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}");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |