ComplianceServer/oldcode/BLL/SSO/SSO_Organization_BL.cs

378 lines
20 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.Common;
using WX.CRM.Common.Employee;
using WX.CRM.Model.Entity;
using WX.CRM.Model.SSO;
namespace WX.CRM.BLL.SSO
{
public class SSO_Organization_BL
{
BAS_PARAMETER_BL bas_parameterbl = new BAS_PARAMETER_BL();
/// <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;
}
var param = bas_parameterbl.GetModel_Patameter("SSO_Organization_Get_Url");
if (param == null)
{
LogHelper.Error("没有配置sso下载地址");
return;
}
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>(param.PARAVALUE, 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);
}
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);//在坐席中对应的关系
if (info == null)//找不到数据,就新增
{
var employee_departmentinfo = model.employee_departments.FirstOrDefault(m => m.employee_id == name.id && m.is_deleted==0);//员工不在关系里面
if (employee_departmentinfo == null)
continue;
if (model.profession_departments.FirstOrDefault(m => m.id == employee_departmentinfo.department_id && m.is_deleted == 0) == null &&
model.other_departments.FirstOrDefault(m => m.id == employee_departmentinfo.department_id && m.is_deleted == 0) == null )//员工不在指定的部门里面
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
};
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);
info.ISDISMISS = Convert.ToInt16(name.status == 2 ? 1 : 0);//是否离职,根据是否含有离职时间来
info.UNAME = name.employee_name;
info.TRUENAME = name.employee_name;
info.EMPLOYEE_ID = name.id;
}
db.Configuration.ValidateOnSaveEnabled = false;
db.SaveChanges();
}
catch (Exception e)
{
LogHelper.Error($"{name.employee_id}人员更新失败{e.ToString()}");
}
}
}
//不存在 的标志删除
var removeList = deptmentList.Where(n => n.IS_DELETED != 1 && n.DEPARTMENT_ID != null && !allList.Select(x => Convert.ToDecimal(x.id)).ToList().Contains(n.DEPARTMENT_ID.Value)).ToList();
foreach (var reItem in removeList)
{
reItem.IS_DELETED = 1;
db.SaveChanges();
}
var reGroupList = groupList.Where(n => n.IS_DELETED != 1 && n.DEPARTMENT_ID != null && !allList.Select(x => Convert.ToDecimal(x.id)).ToList().Contains(n.DEPARTMENT_ID.Value)).ToList();
foreach (var reg in reGroupList)
{
reg.IS_DELETED = 1;
db.SaveChanges();
}
//需要先把部门入库
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;//修改时间
}
db.SaveChanges();
}
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;//修改时间
}
db.SaveChanges();
}
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;
}
}
}
db.SaveChanges();
}
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}");
}
}
}
}
}