2025-04-21 14:10:27 +08:00

573 lines
27 KiB
C#

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
{
/// <summary>
/// 员工档案与企业微信资料 相关服务
/// </summary>
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 -
/// <summary>
/// 初始化 公司-部门列表【后端测试用】
/// </summary>
/// <param name="query"></param>
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 查询所有的 <name> 元素
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<BasDepartment>(x=>new BasDepartment { IsDelete=1},x=> x.IsDelete == 0 && x.CompanyId == login.CompanyId && !ids.Contains(x.Id));
List<BasDepartment> addList = new List<BasDepartment>();
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<IStaffDataEnterpriseWechatService>(this.MerchantId, "AddWechatVSKingDeeJob", "创建需要比对的数据任务", "", 2);
}
});
}
public List<BasDepartment> SetChild(List<DepartmentHasChild> listChild, List<BasDepartment> existsDepartList, WechatSysParameter config)
{
List<BasDepartment> addList = new List<BasDepartment>();
List<long> dropList = new List<long>();
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 --
/// <summary>
/// 初始化 公司-公司-员工列表【后端测试用】
/// </summary>
/// <param name="query"></param>
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<BasEmployee> addList = new List<BasEmployee>();
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
/// <summary>
/// 初始化 完善员工详情【后端测试用】
/// </summary>
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
/// <summary>
/// 初始化 部门与员工的关系
/// </summary>
/// <param name="login"></param>
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<BasEmployeeDepart> emdepartList = new List<BasEmployeeDepart>();
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()
/// <summary>
/// 创建需要比对的数据任务
/// </summary>
public void AddWechatVSKingDeeJob()
{
var list = _basEmployeeDepartRepository.Queryable().Where(t => 1 == 1).ToList();
List<RpEmployeeDepartLog> addList = new List<RpEmployeeDepartLog>();
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<IStaffDataEnterpriseWechatService>(this.MerchantId, "RunWechatVSKingDee", "执行需要比对的数据任务", "", 2);
}
#endregion
#region RunWechatVSKingDee()
/// <summary>
/// 执行需要比对的数据任务
/// </summary>
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<RpEmployeeDepartLog> addList = new List<RpEmployeeDepartLog>();
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<IStaffDataEnterpriseWechatService>(this.MerchantId, "RunWechatVSKingDee", "执行需要比对的数据任务", "", 2);
}
}
}
#endregion
/// <summary>
/// 定时任务刷微信OPENID
/// </summary>
public void TaskAddOpenIdJob()
{
_workProcessService.Add<IStaffDataEnterpriseWechatService>(this.MerchantId, "InitDepartment", "刷企业微信数据", "", 2);
}
}
}