219 lines
8.4 KiB
C#
219 lines
8.4 KiB
C#
/*
|
||
*所有关于HR_EmployeeSync类的业务代码应在此处编写
|
||
*可使用repository.调用常用方法,获取EF/Dapper等信息
|
||
*如果需要事务请使用repository.DbContextBeginTransaction
|
||
*也可使用DBServerProvider.手动获取数据库相关信息
|
||
*用户信息、权限、角色等使用UserContext.Current操作
|
||
*HR_EmployeeSyncService对增、删、改查、导入、导出、审核业务代码扩展参照ServiceFunFilter
|
||
*/
|
||
using Microsoft.AspNetCore.Http;
|
||
using Microsoft.EntityFrameworkCore;
|
||
using Microsoft.Extensions.DependencyInjection;
|
||
using Microsoft.Extensions.Logging;
|
||
using Newtonsoft.Json;
|
||
using System.Collections.Generic;
|
||
using System.Globalization;
|
||
using System.Linq;
|
||
using System.Linq.Expressions;
|
||
using System.Net.Http.Headers;
|
||
using System.Text;
|
||
using VOL.Core.BaseProvider;
|
||
using VOL.Core.CacheManager;
|
||
using VOL.Core.DBManager;
|
||
using VOL.Core.Extensions;
|
||
using VOL.Core.Extensions.AutofacManager;
|
||
using VOL.Core.Utilities;
|
||
using VOL.DingTalk.Models.Biz;
|
||
using VOL.DingTalk.Services.Biz;
|
||
using VOL.Entity.DomainModels;
|
||
using VOL.HR.IRepositories;
|
||
using VOL.YSErp.Models.Biz;
|
||
using VOL.YSErp.Services.Biz;
|
||
using static VOL.YSErp.Models.Biz.YSERPEmployeeInfo;
|
||
|
||
namespace VOL.HR.Services
|
||
{
|
||
public partial class HR_EmployeeSyncService
|
||
{
|
||
private readonly IHttpContextAccessor _httpContextAccessor;
|
||
private readonly IHR_EmployeeSyncRepository _repository;//访问数据库
|
||
private readonly IHR_DeptShipRepository _deptShipRepo;
|
||
private readonly DingTalkService _dingTalkService;
|
||
private readonly YSERPService _ysService;
|
||
|
||
[ActivatorUtilitiesConstructor]
|
||
private ICacheService _cacheService;
|
||
[ActivatorUtilitiesConstructor]
|
||
public HR_EmployeeSyncService(
|
||
IHR_EmployeeSyncRepository dbRepository,
|
||
IHR_DeptShipRepository deptShipRepo,
|
||
IHttpContextAccessor httpContextAccessor,
|
||
ICacheService cacheService
|
||
)
|
||
: base(dbRepository)
|
||
{
|
||
_httpContextAccessor = httpContextAccessor;
|
||
_repository = dbRepository;
|
||
_deptShipRepo = deptShipRepo;
|
||
//多租户会用到这init代码,其他情况可以不用
|
||
//base.Init(dbRepository);
|
||
|
||
_cacheService = cacheService;
|
||
|
||
_dingTalkService = new DingTalkService(new DingTalk.Models.SystemToken(),new DingTalk.Models.DingTalkConfig());
|
||
_ysService = new YSERPService(new YSErp.Models.SystemToken(), new YSErp.Models.YSConfig());
|
||
}
|
||
public async Task<List<YSERPEmployee>> GetAllYSEmployees()
|
||
{
|
||
if (_cacheService.Exists("YS_EMP_CACHE"))
|
||
{
|
||
return _cacheService.Get<List<YSERPEmployee>>("YS_EMP_CACHE");
|
||
}
|
||
else
|
||
{
|
||
var emps = await _ysService.GetAllEmployeesAsync();
|
||
if(emps != null && emps.Count > 0)
|
||
{
|
||
_cacheService.Add("YS_EMP_CACHE", JsonConvert.SerializeObject(emps), 600);
|
||
}
|
||
return emps;
|
||
}
|
||
}
|
||
public async Task<List<DingTalkEmployee>> GetAllDingTalkEmployees()
|
||
{
|
||
if (_cacheService.Exists("DingTalk_EMP_CACHE"))
|
||
{
|
||
return _cacheService.Get<List<DingTalkEmployee>>("DingTalk_EMP_CACHE");
|
||
}
|
||
else
|
||
{
|
||
var emps = await _dingTalkService.GetAllEmployeesAsync();
|
||
if(emps != null && emps.Count > 0)
|
||
{
|
||
_cacheService.Add("DingTalk_EMP_CACHE", JsonConvert.SerializeObject(emps), 600);
|
||
}
|
||
return emps;
|
||
}
|
||
}
|
||
|
||
public Task GenEmpSystemShip()
|
||
{
|
||
List<DingTalkEmployee> dingTalkEmployees = [];
|
||
List<YSERPEmployee> ysERPEmployees = [];
|
||
|
||
var ysTask = GetAllYSEmployees().ContinueWith(x =>
|
||
{
|
||
ysERPEmployees = x.Result;
|
||
});
|
||
var dingTalkTask = GetAllDingTalkEmployees().ContinueWith(x =>
|
||
{
|
||
dingTalkEmployees = x.Result;
|
||
});
|
||
Task.WaitAll(ysTask, dingTalkTask);
|
||
if (ysERPEmployees.Count != 0)
|
||
{
|
||
var newList = new List<HR_EmployeeSync>();
|
||
ysERPEmployees.ForEach(emp =>
|
||
{
|
||
var dingTalkInfo = dingTalkEmployees?.FirstOrDefault(e => e.Mobile == emp.mobile);
|
||
if (dingTalkInfo != null)
|
||
{
|
||
if(!newList.Any(i => i.EmpYSID == emp.id))
|
||
{
|
||
//_repository.AddRange()
|
||
newList.Add(new HR_EmployeeSync
|
||
{
|
||
EmpYSID = emp.id,
|
||
EmpYSMobile = emp.mobile,
|
||
EmpYSDeptID = emp.dept_id,
|
||
EmpJobNumber = emp.code,
|
||
|
||
EmpDingDingID = dingTalkInfo.UserId,
|
||
EmpDingDingMobile = dingTalkInfo.Mobile,
|
||
EmpDingTalkDeptID = dingTalkInfo.Dept,
|
||
EmpLastSyncInfo = "Init generate for system.",
|
||
});
|
||
}
|
||
}
|
||
else
|
||
{
|
||
newList.Add(new HR_EmployeeSync
|
||
{
|
||
EmpYSID = emp.id,
|
||
EmpYSMobile = emp.mobile,
|
||
EmpYSDeptID = emp.dept_id,
|
||
EmpJobNumber = emp.code,
|
||
|
||
EmpDingDingID = "",
|
||
EmpDingDingMobile = "",
|
||
EmpDingTalkDeptID = "",
|
||
EmpLastSyncInfo = "Init generate for system.",
|
||
});
|
||
}
|
||
});
|
||
//_repository.AddRange(newList)
|
||
var db = DBServerProvider.SqlSugarClient;
|
||
try
|
||
{
|
||
db.BeginTran();
|
||
// 清空重新生成
|
||
db.DbMaintenance.TruncateTable<HR_EmployeeSync>();
|
||
//db.Deleteable<HR_EmployeeSync>();
|
||
db.Fastest<HR_EmployeeSync>().BulkCopy(newList);
|
||
db.CommitTran();
|
||
}
|
||
catch (Exception)
|
||
{
|
||
db.RollbackTran();
|
||
}
|
||
}
|
||
return Task.CompletedTask;
|
||
}
|
||
|
||
public async Task<bool> UpdateEmpInfo(DingTalkEmployeeUpdate updateInfo)
|
||
{
|
||
return await _dingTalkService.UpdateEmpInfo(updateInfo);
|
||
//return Task.FromResult(true);
|
||
}
|
||
|
||
|
||
public async Task<bool> SyncYSEmpToDingTalk(string ysEmpId)
|
||
{
|
||
var ysEmpInfo = await _ysService.GetEmpInfoById(ysEmpId);
|
||
if(ysEmpInfo == null)
|
||
{
|
||
Core.Services.Logger.Error($"未在YS中找到用户信息:{ysEmpId}");
|
||
return false;
|
||
}
|
||
// 获取对应的部门关联关系
|
||
var dingDeptId = _deptShipRepo.Find(i => i.YSDeptId == ysEmpInfo.deptId).FirstOrDefault().DingTalkDeptId;
|
||
// 获取直系主管在钉钉的ID 只取主职
|
||
var director = ysEmpInfo.staffJob.FirstOrDefault(it => !it.endFlag).director;
|
||
|
||
var reportManagerId = "";
|
||
if (!string.IsNullOrEmpty(director))
|
||
{
|
||
reportManagerId = _repository.Find(i => i.EmpYSID == director)?.FirstOrDefault()?.EmpDingDingID;
|
||
}
|
||
// 获取要同步的用户对应的钉钉的ID
|
||
var empDingTalkId = _repository.Find(i => i.EmpYSID == ysEmpId).FirstOrDefault().EmpDingDingID;
|
||
|
||
|
||
//TODO: 增加配置表,通过反射自动获取匹配信息
|
||
var dingTalkInfo = new DingTalkEmployeeUpdate
|
||
{
|
||
userid = empDingTalkId,
|
||
dept_id_list = dingDeptId,
|
||
manager_userid = string.IsNullOrEmpty(reportManagerId) ? null : reportManagerId,
|
||
email = ysEmpInfo.email,
|
||
job_number = ysEmpInfo.code,
|
||
exclusive_mobile = ysEmpInfo.mobile
|
||
};
|
||
var updated = await _dingTalkService.UpdateEmpInfo(dingTalkInfo);
|
||
|
||
return updated;
|
||
}
|
||
}
|
||
|
||
}
|