/* *所有关于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> GetAllYSEmployees() { if (_cacheService.Exists("YS_EMP_CACHE")) { return _cacheService.Get>("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> GetAllDingTalkEmployees() { if (_cacheService.Exists("DingTalk_EMP_CACHE")) { return _cacheService.Get>("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 dingTalkEmployees = []; List 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(); 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(); //db.Deleteable(); db.Fastest().BulkCopy(newList); db.CommitTran(); } catch (Exception) { db.RollbackTran(); } } return Task.CompletedTask; } public async Task UpdateEmpInfo(DingTalkEmployeeUpdate updateInfo) { return await _dingTalkService.UpdateEmpInfo(updateInfo); //return Task.FromResult(true); } public async Task 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; } } }