using MyCode.Project.Domain.Message.Response.EnterpriseWechat; using MyCode.Project.Domain.Model; using MyCode.Project.Domain.Repositories; using MyCode.Project.Infrastructure.Common; using MyCode.Project.OutSideService; using MyCode.Project.Repositories; using Senparc.CO2NET.Exceptions; using System; using System.Collections.Generic; using System.Linq; using System.Xml.Linq; namespace MyCode.Project.Services.Implementation { /// /// 员工档案与企业微信资料 相关服务 /// public class StaffDataEnterpriseWechatService : ServiceBase , IStaffDataEnterpriseWechatService { private IWorkProcessService _workProcessService; private ITBASSYSPARAMETERRepository _tBASSYSPARAMETERRepository; private readonly IEnterpriseWechatService _enterpriseWechatService; private IBasDepartmentRepository _basDepartmentRepository; private IBasEmployeeRepository _basEmployeeRepository; private IBasEmployeeDepartRepository _basEmployeeDepartRepository; private ITBDDEPARTMENTLRepository _tBDDEPARTMENTLRepository; private IRpEmployeeDepartLogRepository _rpEmployeeDepartLogRepository; private ITBDStaffDataLRepository _tBDStaffDataLRepository; private ITBDStaffDataRepository _tBDStaffDataRepository; private static object locker = new object(); //创建锁 public StaffDataEnterpriseWechatService(IWorkProcessService workProcessService , ITBASSYSPARAMETERRepository tBASSYSPARAMETERRepository ,IBasDepartmentRepository basDepartmentRepository , IBasEmployeeRepository basEmployeeRepository , IBasEmployeeDepartRepository basEmployeeDepartRepository , ITBDDEPARTMENTLRepository tBDDEPARTMENTLRepository , IRpEmployeeDepartLogRepository rpEmployeeDepartLogRepository , ITBDStaffDataLRepository tBDStaffDataLRepository , ITBDStaffDataRepository tBDStaffDataRepository , IEnterpriseWechatService enterpriseWechatService) { _workProcessService = workProcessService; _tBASSYSPARAMETERRepository = tBASSYSPARAMETERRepository; _basEmployeeRepository = basEmployeeRepository; _basDepartmentRepository = basDepartmentRepository; _basEmployeeDepartRepository = basEmployeeDepartRepository; _enterpriseWechatService = enterpriseWechatService; _tBDDEPARTMENTLRepository = tBDDEPARTMENTLRepository; _rpEmployeeDepartLogRepository = rpEmployeeDepartLogRepository; _tBDStaffDataLRepository = tBDStaffDataLRepository; _tBDStaffDataRepository = tBDStaffDataRepository; } DateTime now = DateTime.Now; #region 初始化 公司-部门列表 /// /// 初始化 公司-部门列表【后端测试用】 /// /// public void InitDepartment() { //var config = _companyConfigService.GetCompanyConfig(login.CompanyId); var configList = _tBASSYSPARAMETERRepository.Queryable().Where(t=>t.FPARAMETEROBJID== "GAT_HR_AbutmentParameter").ToList(); configList.ForEach(SysParameter => { WechatSysParameter config = new WechatSysParameter(); if (!string.IsNullOrWhiteSpace(SysParameter.FPARAMETERS)) { try { XDocument xdoc = XDocument.Parse(SysParameter.FPARAMETERS); // 使用 LINQ to XML 查询所有的 元素 var FCorpid = xdoc.Descendants("FCorpid").FirstOrDefault(); var FCorpsecret = xdoc.Descendants("FCorpsecret").FirstOrDefault(); config.FAppid = FCorpid.Value; config.FSecret = FCorpsecret.Value; } catch { return; } var infoList = _enterpriseWechatService.GetDepartmentList("", config.FAppid, config.FSecret); var ids = infoList.Select(x => long.Parse(x.Id.ToString())).ToList(); var existsDepartList = _basDepartmentRepository.Queryable().Where(x => 1 == 1).ToList(); //_repository.UpdateQueue(x=>new BasDepartment { IsDelete=1},x=> x.IsDelete == 0 && x.CompanyId == login.CompanyId && !ids.Contains(x.Id)); List addList = new List(); infoList.ForEach(x => { var info = existsDepartList.Where(p => p.WeChatId == x.Id).FirstOrDefault(); if (info == null) { BasDepartment depart = new BasDepartment(); depart.Id = Guid.NewGuid(); depart.WeChatId = x.Id; depart.Name = x.Name; depart.OrderNum = x.Order; depart.WeChatIdParentId = x.Parentid; addList.Add(depart); } else { now = now.AddSeconds(1); _basDepartmentRepository.Update(p => new BasDepartment { Name = x.Name, OrderNum = x.Order, WeChatIdParentId = long.Parse(x.Parentid.ToString()), EditTime = now }, p => p.WeChatId == x.Id); } InitEmployee(config, x.Id);//员工列表 if (x.ListChild.Count() > 0) { addList.AddRange(SetChild(x.ListChild, existsDepartList, config)); } }); if (addList.Count() > 0) _basDepartmentRepository.Add(addList); InitEmployeeInfo(config);//完善员工详情 //部门与员工的关系 SetEmployeeDepart(config); _workProcessService.Add(this.MerchantId, "AddWechatVSKingDeeJob", "创建需要比对的数据任务", "", 2); } }); } public List SetChild(List listChild, List existsDepartList, WechatSysParameter config) { List addList = new List(); List dropList = new List(); var childids = listChild.Select(x => long.Parse(x.Id.ToString())).ToList(); listChild.ForEach(t => { var info = existsDepartList.Where(p => p.WeChatId == t.Id).FirstOrDefault(); var drop = existsDepartList.Where(x => x.WeChatIdParentId == t.Parentid && !childids.Contains(x.WeChatId.Value)).Select(x => x.WeChatId.Value).FirstOrDefault(); if (drop > 0) dropList.Add(drop); if (info == null) { BasDepartment depart = new BasDepartment(); depart.Id = Guid.NewGuid(); depart.WeChatId = t.Id; depart.Name = t.Name; depart.OrderNum = t.Order; depart.WeChatIdParentId = t.Parentid; depart.EditTime = DateTime.Now; addList.Add(depart); } else { now = now.AddSeconds(1); _basDepartmentRepository.Update(p => new BasDepartment { Name = t.Name, OrderNum = t.Order, WeChatIdParentId =long.Parse( t.Parentid.ToString()), EditTime = now }, p => p.WeChatId == t.Id); } if (t.ListChild.Count() > 0) { addList.AddRange(SetChild(t.ListChild, existsDepartList, config)); } }); //已删掉的部门 _basDepartmentRepository.Delete( x => dropList.Contains(x.WeChatId.Value)); return addList; } #endregion #region 初始化 公司-公司-员工列表【后端测试用】 /// /// 初始化 公司-公司-员工列表【后端测试用】 /// /// public void InitEmployee(WechatSysParameter config ,int departid) { var infoList = _enterpriseWechatService.GetDepartmentMemberList("", departid, config.FAppid, config.FSecret, 1); var existsempIds = _basEmployeeRepository.Queryable().Where(x => 1==1).Select(x => x.UserId).ToList(); List addList = new List(); infoList.Where(x => !existsempIds.Contains(x.Userid)).ToList().ForEach(x => { BasEmployee employee = new BasEmployee(); employee.ID = Guid.NewGuid(); employee.UserId = x.Userid; employee.Name = EncryptHelper.Base64Encrypt(x.Name); employee.EditTime = DateTime.Now; addList.Add(employee); }); if (addList.Count() > 0) _basEmployeeRepository.Add(addList); } #endregion #region 初始化 完善员工详情 /// /// 初始化 完善员工详情【后端测试用】 /// public void InitEmployeeInfo(WechatSysParameter config) { var empList = _basEmployeeRepository.Queryable().Where(x => 1==1).Select(x => x.UserId).ToList(); empList.ForEach(x => { var info = _enterpriseWechatService.GetEmployeeInfo(x, config.FAppid, config.FSecret); if (info.Errcode == 60111) { now = now.AddSeconds(1); _basEmployeeRepository.Update(t => new BasEmployee { IsDelete = 1, EditTime = now }, t => t.UserId == x ); } else { now = now.AddSeconds(1); var openid = _enterpriseWechatService.GetOpenidByUserid(x, config.FAppid, config.FSecret); _basEmployeeRepository.Update(t => new BasEmployee { Name = EncryptHelper.Base64Encrypt(info.name), Nick = info.name, Alias = info.alias, Gender = info.gender, Mobile = info.mobile, Position = info.position, Avatar = info.avatar, ThumbAvatar = info.thumb_avatar, Email = info.email, Status = info.status, OpenUserid = openid.openid, EditTime = now }, t => t.UserId == x); } }); } #endregion #region 初始化 部门与员工的关系 /// /// 初始化 部门与员工的关系 /// /// public void SetEmployeeDepart(WechatSysParameter config) { var departList = _basDepartmentRepository.Queryable().Where(x => 1 == 1).ToList(); var employeeList = _basEmployeeRepository.Queryable().Where(x => 1 == 1).Select(x => new { x.ID, x.UserId ,x.Nick,x.OpenUserid}).ToList(); var empShipList = _basEmployeeDepartRepository.Queryable().Where(x => 1==1).ToList(); List emdepartList = new List(); departList.ForEach(x => { //获取目前部门的员工数据 var empShip = empShipList.Where(p => p.DepartmentId == x.Id).ToList(); //与同步过来后部门的员工数据对比 var infoList = _enterpriseWechatService.GetDepartmentMemberList("", x.WeChatId.Value, config.FAppid, config.FSecret); var userids = empShip.Select(p => p.EmployeeUserId.Trim()).ToList(); //新的关系则新增 infoList.ForEach(t => { var em = employeeList.Where(f => f.UserId.Trim() == t.Userid.Trim()).FirstOrDefault(); if (em != null) { BasEmployeeDepart item = new BasEmployeeDepart(); item.Id =Guid.NewGuid(); item.DepartmentId = x.Id; item.EmployeeId = em.ID; item.EmployeeUserId = t.Userid; item.KDepartementId = -1; item.WechatDepartName = x.Name; item.Nick = em.Nick; item.OpenId = em.OpenUserid; if (x.WeChatIdParentId > 1) { var pDept = departList.Where(s => s.WeChatId == x.WeChatIdParentId).FirstOrDefault(); if (pDept != null) { item.WechatDepartName = pDept.Name + "-" + item.WechatDepartName; if (pDept.WeChatIdParentId > 1) { pDept = departList.Where(s => s.WeChatId == pDept.WeChatIdParentId).FirstOrDefault(); if (pDept != null) { item.WechatDepartName = pDept.Name + "-" + item.WechatDepartName; if (pDept.WeChatIdParentId > 1) { pDept = departList.Where(s => s.WeChatId == pDept.WeChatIdParentId).FirstOrDefault(); if (pDept != null) { item.WechatDepartName = pDept.Name + "-" + item.WechatDepartName; if (pDept.WeChatIdParentId > 0) { } } } } } } } emdepartList.Add(item); } }); ////已更换部门的员工则修改为删除状态 //var infoUserIds = infoList.Select(p => p.Userid).ToList(); //var upUserids = empShip.Where(p => !infoUserIds.Contains(p.EmployeeUserId)).Select(p => p.EmployeeUserId).ToList(); //if (upUserids.Count() > 0) // _basEmployeeDepartRepository.Delete( p => p.DepartmentId == x.Id && upUserids.Contains(p.EmployeeUserId)); }); if (emdepartList.Count() > 0) { _basEmployeeDepartRepository.Delete(t=>1==1); _basEmployeeDepartRepository.Add(emdepartList); } } #endregion #region AddWechatVSKingDeeJob(创建需要比对的数据任务) /// /// 创建需要比对的数据任务 /// public void AddWechatVSKingDeeJob() { var list = _basEmployeeDepartRepository.Queryable().Where(t => 1 == 1).ToList(); List addList = new List(); list.ForEach(t => { t.Status = 0; t.OpenIdStatus = 0; t.DepartStatus = 0; RpEmployeeDepartLog temp = new RpEmployeeDepartLog(); temp.Id = Guid.NewGuid(); temp.Nick = t.Nick; temp.CreateTime = DateTime.Now; temp.WechatDepartmentId = t.WechatDepartmentId; temp.WechatDepartName = t.WechatDepartName; temp.EmployeeId = t.EmployeeId; temp.EmployeeUserId = t.EmployeeUserId; temp.OpenId = t.OpenId; temp.Status = 0; temp.OpenIdStatus = 0; temp.DepartStatus = 0; addList.Add(temp); }); _basEmployeeDepartRepository.Update(list); if (addList.Count > 0) _rpEmployeeDepartLogRepository.Add(addList); string now = DateTime.Now.ToString("yyyyMMdd"); string lastMonth = DateTime.Now.AddMonths(-1).ToString("yyyyMMdd"); string sql = $@" IF EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'T_BD_StaffData{now}' ) BEGIN PRINT '表 T_BD_StaffData{now} 存在'; END ELSE BEGIN select * into T_BD_StaffData{now} from T_BD_StaffData END; IF EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = 'T_BD_StaffData{lastMonth}' ) BEGIN drop table T_BD_StaffData{lastMonth}; END; "; _rpEmployeeDepartLogRepository.ExecuteSqlCommand(sql); _workProcessService.Add(this.MerchantId, "RunWechatVSKingDee", "执行需要比对的数据任务", "", 2); } #endregion #region RunWechatVSKingDee(执行需要比对的数据任务) /// /// 执行需要比对的数据任务 /// public void RunWechatVSKingDee() { try { var allKingDepet = _tBDDEPARTMENTLRepository.Queryable().Where(t => 1 == 1).ToList(); var allKingEmployeeL = _tBDStaffDataLRepository.Queryable().Where(t => 1 == 1).ToList(); var allKingEmployee = _tBDStaffDataRepository.Queryable().Where(t => 1 == 1).ToList(); var list = _rpEmployeeDepartLogRepository.Queryable().Where(t => t.Status == 0).OrderBy(t => t.SortNum).Take(1000).ToList(); List addList = new List(); list.ForEach(t => { //执行结果 -1=金蝶未找到员工 0=未开始 3=名字重复且部门无法匹配 100=更新完毕 int status = 0; var KingEmployeeL = allKingEmployeeL.Where(h => h.FNAME.Trim() == t.Nick.Trim()).ToList(); if (KingEmployeeL.Count == 0) { status = -1; } else { //1 先找同名的人 //2 如果有超过1个同名人,则找相同部门 if (KingEmployeeL.Count == 1) { var tempOne = KingEmployeeL.FirstOrDefault(); var KingEmployee = allKingEmployee.FirstOrDefault(h => h.FID == tempOne.FID); t.FID = KingEmployee.FID; if (KingEmployee.FWECOMID != t.OpenId) { t.FWECOMID = KingEmployee.FWECOMID; t.OpenIdStatus = 1; KingEmployee.FWECOMID = t.OpenId; _tBDStaffDataRepository.Update(KingEmployee); } else { t.OpenIdStatus = 100; } var KingDepart = allKingDepet.FirstOrDefault(h => h.FDEPTID == KingEmployee.FDEPARTMENTID); if (KingDepart != null) { t.KDName = KingDepart.FNAME; t.KDepartementId = KingDepart.FDEPTID; if (KingDepart.FNAME != t.WechatDepartName) { t.DepartStatus = 1; } else t.DepartStatus = 100; } else { t.KDName = "无部门"; t.DepartStatus = 1; } status = 100; } else if (KingEmployeeL.Count > 1) { var FIDList = KingEmployeeL.Select(h => h.FID).ToList(); var tempKingEmployee = allKingEmployee.Where(h => FIDList.Contains(h.FID)).ToList(); var tempDepartIdList = tempKingEmployee.Select(h => h.FDEPARTMENTID).ToList(); var tempKingDepet = allKingDepet.Where(h => tempDepartIdList.Contains(h.FDEPTID)).ToList(); var rightKingDepet = tempKingDepet.Where(h => h.FNAME == t.WechatDepartName).FirstOrDefault(); if (rightKingDepet == null) //多人同名但是部门无法匹配 { t.KDName = string.Join(",", tempKingDepet.Select(h => h.FNAME).ToList()); var zaiZhiEmployeel = tempKingEmployee.Where(h => h.FEMPLOYEESTATUSID !=null &&h.FEMPLOYEESTATUSID.ToLower() != ("646b0211707080").ToLower() && FIDList.Contains(h.FID)).ToList(); if (zaiZhiEmployeel.Count == 1) { t.DepartStatus = 1; var tempOne = zaiZhiEmployeel.FirstOrDefault(); var KingEmployee = allKingEmployee.FirstOrDefault(h => h.FID == tempOne.FID); t.FID = KingEmployee.FID; if (KingEmployee.FWECOMID != t.OpenId) { t.FWECOMID = KingEmployee.FWECOMID; t.OpenIdStatus = 1; KingEmployee.FWECOMID = t.OpenId; _tBDStaffDataRepository.Update(KingEmployee); } else { t.OpenIdStatus = 100; } var KingDepart = allKingDepet.FirstOrDefault(h => h.FDEPTID == KingEmployee.FDEPARTMENTID); if (KingDepart != null) { t.KDName = KingDepart.FNAME; t.KDepartementId = KingDepart.FDEPTID; if (KingDepart.FNAME != t.WechatDepartName) { t.DepartStatus = 1; } else t.DepartStatus = 100; } else { t.KDName = "无部门"; t.DepartStatus = 1; } status = 100; } else { t.DepartStatus = 1; status = 3; } } else { t.KDName = rightKingDepet.FNAME; t.KDepartementId = rightKingDepet.FDEPTID; t.DepartStatus = 100; var rightKingEmployee = tempKingEmployee.FirstOrDefault(h => h.FDEPARTMENTID == rightKingDepet.FDEPTID); if (rightKingEmployee.FWECOMID != t.OpenId) { t.FWECOMID = rightKingEmployee.FWECOMID; t.OpenIdStatus = 1; rightKingEmployee.FWECOMID = t.OpenId; _tBDStaffDataRepository.Update(rightKingEmployee); } else { t.OpenIdStatus = 100; } status = 100; } } } t.Status = status; var employeeDepart = _basEmployeeDepartRepository.Queryable().Where(h => h.EmployeeUserId == t.EmployeeUserId).First(); employeeDepart.Status = t.Status; employeeDepart.OpenIdStatus = t.OpenIdStatus; employeeDepart.DepartStatus = t.DepartStatus; t.EditTime = DateTime.Now; _basEmployeeDepartRepository.Update(employeeDepart); _rpEmployeeDepartLogRepository.Update(t); }); } catch (Exception ex) { throw new BaseException(ex.Message); } finally { if (_rpEmployeeDepartLogRepository.IsExist(t => t.Status == 0)) { _workProcessService.Add(this.MerchantId, "RunWechatVSKingDee", "执行需要比对的数据任务", "", 2); } } } #endregion /// /// 定时任务刷微信OPENID /// public void TaskAddOpenIdJob() { _workProcessService.Add(this.MerchantId, "InitDepartment", "刷企业微信数据", "", 2); } } }