706 lines
27 KiB
C#
706 lines
27 KiB
C#
using System.Linq.Expressions;
|
||
using JNPF.Common.Core.Manager;
|
||
using JNPF.Common.Enums;
|
||
using JNPF.Common.Extension;
|
||
using JNPF.Common.Security;
|
||
using JNPF.DependencyInjection;
|
||
using JNPF.DynamicApiController;
|
||
using JNPF.Extras.Thirdparty.DingDing;
|
||
using JNPF.Extras.Thirdparty.WeChat;
|
||
using JNPF.FriendlyException;
|
||
using JNPF.LinqBuilder;
|
||
using JNPF.Systems.Entitys.Dto.Organize;
|
||
using JNPF.Systems.Entitys.Dto.SynThirdInfo;
|
||
using JNPF.Systems.Entitys.Dto.SysConfig;
|
||
using JNPF.Systems.Entitys.Permission;
|
||
using JNPF.Systems.Entitys.System;
|
||
using JNPF.Systems.Interfaces.System;
|
||
using Mapster;
|
||
using Microsoft.AspNetCore.Mvc;
|
||
using SqlSugar;
|
||
|
||
namespace JNPF.Systems.System;
|
||
|
||
/// <summary>
|
||
/// 第三方同步
|
||
/// 版 本:V3.2
|
||
/// 版 权:拓通智联科技有限公司(http://www.tuotong-tech.com)
|
||
/// 日 期:2021-06-01.
|
||
/// </summary>
|
||
[ApiDescriptionSettings(Tag = "System", Name = "SynThirdInfo", Order = 210)]
|
||
[Route("api/system/[controller]")]
|
||
public class SynThirdInfoService : ISynThirdInfoService, IDynamicApiController, ITransient
|
||
{
|
||
/// <summary>
|
||
/// 服务基础仓储.
|
||
/// </summary>
|
||
private readonly ISqlSugarRepository<SynThirdInfoEntity> _repository;
|
||
|
||
/// <summary>
|
||
/// 系统配置服务.
|
||
/// </summary>
|
||
private readonly ISysConfigService _sysConfigService;
|
||
|
||
/// <summary>
|
||
/// 用户管理.
|
||
/// </summary>
|
||
private readonly IUserManager _userManager;
|
||
|
||
/// <summary>
|
||
/// 初始化一个<see cref="SynThirdInfoService"/>类型的新实例.
|
||
/// </summary>
|
||
public SynThirdInfoService(
|
||
ISqlSugarRepository<SynThirdInfoEntity> repository,
|
||
ISysConfigService sysConfigService,
|
||
IUserManager userManager)
|
||
{
|
||
_repository = repository;
|
||
_sysConfigService = sysConfigService;
|
||
_userManager = userManager;
|
||
}
|
||
|
||
#region Get
|
||
|
||
/// <summary>
|
||
/// 列表.
|
||
/// </summary>
|
||
/// <param name="thirdType">请求参数.</param>
|
||
/// <returns></returns>
|
||
[HttpGet("getSynThirdTotal/{thirdType}")]
|
||
public async Task<dynamic> GetList(int thirdType)
|
||
{
|
||
var whereLambda = LinqExpression.And<SynThirdInfoEntity>();
|
||
whereLambda = whereLambda.And(x => x.ThirdType == thirdType);
|
||
return await GetListByThirdType(whereLambda, "用户", "组织");
|
||
}
|
||
|
||
/// <summary>
|
||
/// 钉钉同步组织.
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpGet("synAllOrganizeSysToDing")]
|
||
public async Task<dynamic> synAllOrganizeSysToDing(string type)
|
||
{
|
||
var flag = "0".Equals(type) ? await SynData(2, 1) : await SynSysData(2, 1);
|
||
var whereLambda = LinqExpression.And<SynThirdInfoEntity>();
|
||
whereLambda = whereLambda.And(x => x.ThirdType == 2 && x.DataType < 3);
|
||
return await GetListByThirdType(whereLambda, "组织", "组织");
|
||
}
|
||
|
||
/// <summary>
|
||
/// 企业微信同步组织.
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpGet("synAllOrganizeSysToQy")]
|
||
public async Task<dynamic> synAllOrganizeSysToQy(string type)
|
||
{
|
||
var flag = "0".Equals(type) ? await SynData(1, 1) : await SynSysData(1, 1);
|
||
var whereLambda = LinqExpression.And<SynThirdInfoEntity>();
|
||
whereLambda = whereLambda.And(x => x.ThirdType == 1 && x.DataType < 3);
|
||
return await GetListByThirdType(whereLambda, "组织", "组织");
|
||
}
|
||
|
||
/// <summary>
|
||
/// 钉钉同步用户.
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpGet("synAllUserSysToDing")]
|
||
public async Task<dynamic> synAllUserSysToDing(string type)
|
||
{
|
||
var flag = "0".Equals(type) ? await SynData(2, 3) : await SynSysData(2, 3);
|
||
var whereLambda = LinqExpression.And<SynThirdInfoEntity>();
|
||
whereLambda = whereLambda.And(x => x.ThirdType == 2 && x.DataType == 3);
|
||
return await GetListByThirdType(whereLambda, "用户", "用户");
|
||
}
|
||
|
||
/// <summary>
|
||
/// 企业微信同步用户.
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpGet("synAllUserSysToQy")]
|
||
public async Task<dynamic> synAllUserSysToQy(string type)
|
||
{
|
||
var flag = "0".Equals(type) ? await SynData(1, 3) : await SynSysData(1, 3);
|
||
var whereLambda = LinqExpression.And<SynThirdInfoEntity>();
|
||
whereLambda = whereLambda.And(x => x.ThirdType == 1 && x.DataType == 3);
|
||
return await GetListByThirdType(whereLambda, "用户", "用户");
|
||
}
|
||
#endregion
|
||
|
||
#region Method
|
||
|
||
/// <summary>
|
||
/// 获取同步数据.
|
||
/// </summary>
|
||
/// <param name="whereLambda">条件Lambda表达式.</param>
|
||
/// <param name="synType1"></param>
|
||
/// <param name="synType2"></param>
|
||
/// <returns></returns>
|
||
private async Task<dynamic> GetListByThirdType(Expression<Func<SynThirdInfoEntity, bool>> whereLambda, string synType1, string synType2)
|
||
{
|
||
var synThirdInfoList = await _repository.AsQueryable().Where(whereLambda).ToListAsync();
|
||
var userList = await _repository.AsSugarClient().Queryable<UserEntity>().Where(x => x.DeleteMark == null).ToListAsync();
|
||
var orgList = await _repository.AsSugarClient().Queryable<OrganizeEntity>().Where(x => x.DeleteMark == null).ToListAsync();
|
||
if (synType1.Equals(synType2))
|
||
{
|
||
return new SynThirdInfoOutput()
|
||
{
|
||
synType = synType1,
|
||
recordTotal = synType1.Equals("组织") ? orgList.Count : userList.Count,
|
||
synDate = synThirdInfoList.Select(x => x.LastModifyTime).ToList().Max().IsEmpty() ? synThirdInfoList.Select(x => x.CreatorTime).ToList().Max() : synThirdInfoList.Select(x => x.LastModifyTime).ToList().Max(),
|
||
synFailCount = synThirdInfoList.FindAll(x => x.SynState.Equals("2")).Count,
|
||
synSuccessCount = synThirdInfoList.FindAll(x => x.SynState.Equals("1")).Count,
|
||
unSynCount = synThirdInfoList.FindAll(x => x.SynState.Equals("0")).Count,
|
||
};
|
||
}
|
||
else
|
||
{
|
||
var output = new List<SynThirdInfoOutput>();
|
||
var synUserList = synThirdInfoList.FindAll(x => x.DataType == 3);
|
||
var synOrgList = synThirdInfoList.FindAll(x => x.DataType < 3);
|
||
output.Add(new SynThirdInfoOutput()
|
||
{
|
||
synType = synType2,
|
||
recordTotal = synType2.Equals("组织") ? orgList.Count : userList.Count,
|
||
synDate = synOrgList.Select(x => x.LastModifyTime).ToList().Max().IsEmpty() ? synOrgList.Select(x => x.CreatorTime).ToList().Max() : synOrgList.Select(x => x.LastModifyTime).ToList().Max(),
|
||
synFailCount = synOrgList.FindAll(x => x.SynState.Equals("2")).Count,
|
||
synSuccessCount = synOrgList.FindAll(x => x.SynState.Equals("1")).Count,
|
||
unSynCount = synOrgList.FindAll(x => x.SynState.Equals("0")).Count,
|
||
});
|
||
output.Add(new SynThirdInfoOutput()
|
||
{
|
||
synType = synType1,
|
||
recordTotal = synType1.Equals("组织") ? orgList.Count : userList.Count,
|
||
synDate = synUserList.Select(x => x.LastModifyTime).ToList().Max().IsEmpty() ? synUserList.Select(x => x.CreatorTime).ToList().Max() : synUserList.Select(x => x.LastModifyTime).ToList().Max(),
|
||
synFailCount = synUserList.FindAll(x => x.SynState.Equals("2")).Count,
|
||
synSuccessCount = synUserList.FindAll(x => x.SynState.Equals("1")).Count,
|
||
unSynCount = synUserList.FindAll(x => x.SynState.Equals("0")).Count,
|
||
});
|
||
return output;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 同步数据(同步到第三方).
|
||
/// </summary>
|
||
/// <param name="thirdType"></param>
|
||
/// <param name="dataType"></param>
|
||
/// <returns></returns>
|
||
private async Task<int> SynData(int thirdType, int dataType)
|
||
{
|
||
try
|
||
{
|
||
var sysConfig = await _sysConfigService.GetInfo();
|
||
var synThirdInfo = await _repository.AsQueryable().Where(x => x.ThirdType == thirdType).ToListAsync();
|
||
var orgList = (await _repository.AsSugarClient().Queryable<OrganizeEntity>().Where(x => x.DeleteMark == null).ToListAsync()).Adapt<List<OrganizeListOutput>>().ToTree("-1");
|
||
var userList = await _repository.AsSugarClient().Queryable<UserEntity>().Where(x => x.DeleteMark == null).ToListAsync();
|
||
if (dataType == 3)
|
||
await SynUser(thirdType, dataType, sysConfig, userList);
|
||
else
|
||
await SynDep(thirdType, dataType, sysConfig, orgList);
|
||
return 1;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 同步数据(同步到系统).
|
||
/// </summary>
|
||
/// <param name="thirdType"></param>
|
||
/// <param name="dataType"></param>
|
||
/// <returns></returns>
|
||
private async Task<int> SynSysData(int thirdType, int dataType)
|
||
{
|
||
try
|
||
{
|
||
var sysConfig = await _sysConfigService.GetInfo();
|
||
if (dataType == 3)
|
||
await SynSysUser(thirdType, dataType, sysConfig);
|
||
else
|
||
await SynSysDep(thirdType, dataType, sysConfig);
|
||
return 1;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 删除第三方数据.
|
||
/// </summary>
|
||
/// <param name="thirdType"></param>
|
||
/// <param name="dataType"></param>
|
||
/// <param name="sysConfig"></param>
|
||
/// <param name="id"></param>
|
||
/// <returns></returns>
|
||
[NonAction]
|
||
public async Task DelSynData(int thirdType, int dataType, SysConfigOutput sysConfig, string id)
|
||
{
|
||
string msg = string.Empty;
|
||
try
|
||
{
|
||
var synInfo = await _repository.GetFirstAsync(x => x.ThirdType == thirdType && x.DataType == dataType && x.SysObjId == id);
|
||
if (synInfo.IsNullOrEmpty() || synInfo.ThirdObjId.IsNullOrEmpty())
|
||
throw Oops.Oh(ErrorCode.D9004);
|
||
if (thirdType == 1)
|
||
{
|
||
var weChat = new WeChatUtil(sysConfig.qyhCorpId, sysConfig.qyhCorpSecret);
|
||
if (dataType == 3)
|
||
weChat.DeleteMember(synInfo.ThirdObjId);
|
||
else
|
||
weChat.DeleteDepartment(synInfo.ThirdObjId.ParseToInt(), ref msg);
|
||
}
|
||
else
|
||
{
|
||
var ding = new DingUtil(sysConfig.dingSynAppKey, sysConfig.dingSynAppSecret);
|
||
if (dataType == 3)
|
||
ding.DeleteUser(new DingUserParameter() { Userid = synInfo.ThirdObjId }, ref msg);
|
||
else
|
||
ding.DeleteDep(new DingDepartmentParameter() { DeptId = synInfo.ThirdObjId.ParseToInt() }, ref msg);
|
||
}
|
||
|
||
await _repository.DeleteAsync(synInfo);
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
throw Oops.Oh(msg);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 判断是否存在同步成功数据.
|
||
/// </summary>
|
||
/// <param name="id"></param>
|
||
/// <param name="thirdType"></param>
|
||
/// <param name="dataType"></param>
|
||
/// <returns></returns>
|
||
private async Task<bool> IsExistThirdObjId(string id, int thirdType, int dataType)
|
||
{
|
||
return !await _repository.IsAnyAsync(x => x.ThirdType == thirdType && x.DataType == dataType && x.SysObjId.Equals(id) && !SqlFunc.IsNullOrEmpty(x.ThirdObjId));
|
||
}
|
||
|
||
/// <summary>
|
||
/// 保存同步数据.
|
||
/// </summary>
|
||
/// <param name="thirdType"></param>
|
||
/// <param name="dataType"></param>
|
||
/// <param name="sysObjId"></param>
|
||
/// <param name="thirdObjId"></param>
|
||
/// <param name="msg"></param>
|
||
/// <returns></returns>
|
||
private async Task Save(int thirdType, int dataType, string sysObjId, string thirdObjId, string msg)
|
||
{
|
||
var entity = await _repository.GetFirstAsync(x => x.SysObjId == sysObjId && x.ThirdType == thirdType);
|
||
if (entity == null)
|
||
{
|
||
entity = new SynThirdInfoEntity();
|
||
entity.Id = SnowflakeIdHelper.NextId();
|
||
entity.CreatorTime = DateTime.Now;
|
||
entity.CreatorUserId = _userManager.UserId;
|
||
entity.ThirdType = thirdType;
|
||
entity.DataType = dataType;
|
||
entity.SysObjId = sysObjId;
|
||
entity.ThirdObjId = thirdObjId;
|
||
entity.SynState = thirdObjId.IsNullOrEmpty() ? "2" : "1";
|
||
entity.Description = msg;
|
||
var newDic = await _repository.AsInsertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteReturnEntityAsync();
|
||
_ = newDic ?? throw Oops.Oh(ErrorCode.D9005);
|
||
}
|
||
else
|
||
{
|
||
entity.LastModifyTime = DateTime.Now;
|
||
entity.LastModifyUserId = _userManager.UserId;
|
||
entity.ThirdObjId = thirdObjId;
|
||
entity.SynState = thirdObjId.IsEmpty() ? "2" : "1";
|
||
entity.Description = msg;
|
||
var isOk = await _repository.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
|
||
if (isOk < 0)
|
||
throw Oops.Oh(ErrorCode.D9006);
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取第三方部门.
|
||
/// </summary>
|
||
/// <param name="organizeId"></param>
|
||
/// <param name="thirdType"></param>
|
||
/// <param name="thirdDepList"></param>
|
||
private async Task GetThirdDep(string organizeId, int thirdType, List<int> thirdDepList)
|
||
{
|
||
var info = await _repository.GetFirstAsync(x => x.SysObjId == organizeId && x.ThirdType == thirdType);
|
||
if (info.IsNotEmptyOrNull() && info.ThirdObjId.IsNotEmptyOrNull())
|
||
{
|
||
thirdDepList.Add(Convert.ToInt32(info.ThirdObjId));
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 根据系统主键获取第三方主键.
|
||
/// </summary>
|
||
/// <param name="ids">系统主键.</param>
|
||
/// <param name="thirdType">第三方类型.</param>
|
||
/// <param name="dataType">数据类型.</param>
|
||
/// <returns></returns>
|
||
[NonAction]
|
||
public async Task<List<string>> GetThirdIdList(List<string> ids, int thirdType, int dataType)
|
||
{
|
||
return await _repository.AsQueryable().Where(x => x.ThirdType == thirdType
|
||
&& x.DataType == dataType && !SqlFunc.IsNullOrEmpty(x.ThirdObjId)).
|
||
In(x => x.SysObjId, ids.ToArray()).Select(x => x.ThirdObjId).ToListAsync();
|
||
}
|
||
|
||
#region 部门同步
|
||
|
||
/// <summary>
|
||
/// 同步部门.
|
||
/// </summary>
|
||
/// <param name="thirdType">第三方类型.</param>
|
||
/// <param name="dataType">组织类型.</param>
|
||
/// <param name="sysConfig">系统配置.</param>
|
||
/// <param name="orgList">组织.</param>
|
||
/// <returns></returns>
|
||
[NonAction]
|
||
public async Task SynDep(int thirdType, int dataType, SysConfigOutput sysConfig, List<OrganizeListOutput> orgList)
|
||
{
|
||
switch (thirdType)
|
||
{
|
||
case 1:
|
||
var weChat = new WeChatUtil(sysConfig.qyhCorpId, sysConfig.qyhCorpSecret);
|
||
foreach (var item in orgList)
|
||
{
|
||
await WeChatDep(item, weChat, thirdType, dataType);
|
||
}
|
||
|
||
break;
|
||
default:
|
||
var ding = new DingUtil(sysConfig.dingSynAppKey, sysConfig.dingSynAppSecret);
|
||
foreach (var item in orgList)
|
||
{
|
||
await DingDep(item, ding, thirdType, dataType);
|
||
}
|
||
|
||
break;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 同步部门.
|
||
/// </summary>
|
||
/// <param name="thirdType"></param>
|
||
/// <param name="dataType"></param>
|
||
/// <param name="sysConfig"></param>
|
||
/// <returns></returns>
|
||
[NonAction]
|
||
public async Task SynSysDep(int thirdType, int dataType, SysConfigOutput sysConfig)
|
||
{
|
||
try
|
||
{
|
||
var depList = new List<OrganizeEntity>();
|
||
switch (thirdType)
|
||
{
|
||
case 1:
|
||
var weChat = new WeChatUtil(sysConfig.qyhCorpId, sysConfig.qyhCorpSecret);
|
||
depList = weChat.GetDepartmentList().Adapt<List<OrganizeEntity>>();
|
||
break;
|
||
default:
|
||
var ding = new DingUtil(sysConfig.dingSynAppKey, sysConfig.dingSynAppSecret);
|
||
depList = ding.GetDepList().Adapt<List<OrganizeEntity>>();
|
||
break;
|
||
}
|
||
foreach (var item in depList)
|
||
{
|
||
// 根组织不同步
|
||
if (item.Id != "-1")
|
||
{
|
||
var syncEntity = await _repository.GetFirstAsync(x => x.ThirdObjId == item.Id && x.DataType == dataType);
|
||
// 存在同步数据
|
||
if (syncEntity.IsNotEmptyOrNull())
|
||
{
|
||
await _repository.AsSugarClient().Updateable<OrganizeEntity>().SetColumns(it => new OrganizeEntity()
|
||
{
|
||
FullName = item.FullName,
|
||
LastModifyUserId = _userManager.UserId,
|
||
LastModifyTime = SqlFunc.GetDate()
|
||
}).Where(it => it.Id.Equals(syncEntity.SysObjId)).ExecuteCommandHasChangeAsync();
|
||
}
|
||
else
|
||
{
|
||
var parentEntity = new OrganizeEntity();
|
||
if (item.ParentId == "1")
|
||
{
|
||
parentEntity = await _repository.AsSugarClient().Queryable<OrganizeEntity>().FirstAsync(x => x.ParentId == "-1");
|
||
item.ParentId = parentEntity.Id;
|
||
}
|
||
else
|
||
{
|
||
item.ParentId = (await _repository.GetFirstAsync(x => x.ThirdObjId == item.ParentId && x.DataType == dataType))?.SysObjId;
|
||
parentEntity = await _repository.AsSugarClient().Queryable<OrganizeEntity>().FirstAsync(x => x.Id == item.ParentId);
|
||
}
|
||
var thirdObjId = item.Id;
|
||
item.Id = SnowflakeIdHelper.NextId();
|
||
item.OrganizeIdTree = parentEntity.OrganizeIdTree + "," + item.Id;
|
||
await Save(thirdType, dataType, item.Id, thirdObjId, string.Empty);
|
||
await _repository.AsSugarClient().Insertable(item).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(m => m.Create()).ExecuteCommandAsync();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
var parentEntity = await _repository.AsSugarClient().Queryable<OrganizeEntity>().FirstAsync(x => x.ParentId == "-1");
|
||
if (!_repository.IsAny(x => x.DataType == dataType && x.SysObjId == parentEntity.Id))
|
||
{
|
||
await Save(thirdType, dataType, parentEntity.Id, item.Id, string.Empty);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
|
||
throw;
|
||
}
|
||
}
|
||
|
||
private async Task WeChatDep(OrganizeListOutput org, WeChatUtil weChatQYHelper, int thirdType, int dataType)
|
||
{
|
||
long parentid = 1;
|
||
var entity = await _repository.GetFirstAsync(x => x.SysObjId == org.parentId && x.ThirdType == thirdType && x.SynState == "1");
|
||
if (entity.IsNotEmptyOrNull())
|
||
{
|
||
parentid = Convert.ToInt32(entity.ThirdObjId);
|
||
}
|
||
|
||
var thirdObjId = string.Empty;
|
||
var msg = string.Empty;
|
||
if (await IsExistThirdObjId(org.id, thirdType, dataType))
|
||
{
|
||
// 顶级组织
|
||
if (org.parentId.Equals("-1"))
|
||
{
|
||
thirdObjId = "1";
|
||
}
|
||
else
|
||
{
|
||
thirdObjId = weChatQYHelper.CreateDepartment(org.fullName, parentid, 1, ref msg).ToString();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
var synEntity = await _repository.GetFirstAsync(x => org.id == x.SysObjId && thirdType == x.ThirdType);
|
||
if (synEntity.IsNotEmptyOrNull())
|
||
{
|
||
thirdObjId = synEntity.ThirdObjId;
|
||
var id = Convert.ToInt32(thirdObjId);
|
||
weChatQYHelper.UpdateDepartment(id, org.fullName, (int)parentid, 1, ref msg);
|
||
}
|
||
}
|
||
|
||
await Save(thirdType, dataType, org.id, thirdObjId, msg);
|
||
if (org.hasChildren)
|
||
{
|
||
foreach (var item in org.children)
|
||
{
|
||
var orgChild = item.Adapt<OrganizeListOutput>();
|
||
await WeChatDep(orgChild, weChatQYHelper, thirdType, dataType);
|
||
}
|
||
}
|
||
}
|
||
|
||
private async Task DingDep(OrganizeListOutput org, DingUtil dingHelper, int thirdType, int dataType)
|
||
{
|
||
var dingDep = new DingDepartmentParameter();
|
||
dingDep.Name = org.fullName;
|
||
var entity = await _repository.GetFirstAsync(x => x.SysObjId == org.parentId && x.ThirdType == thirdType && x.SynState == "1");
|
||
if (entity != null)
|
||
{
|
||
dingDep.ParentId = Convert.ToInt32(entity.ThirdObjId);
|
||
}
|
||
|
||
var thirdObjId = string.Empty;
|
||
var msg = string.Empty;
|
||
if (await IsExistThirdObjId(org.id, thirdType, dataType))
|
||
{
|
||
if (org.parentId.Equals("-1"))
|
||
{
|
||
thirdObjId = "1";
|
||
}
|
||
else
|
||
{
|
||
thirdObjId = dingHelper.CreateDep(dingDep, ref msg);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
var synEntity = await _repository.GetFirstAsync(x => org.id == x.SysObjId && thirdType == x.ThirdType);
|
||
if (synEntity.IsNotEmptyOrNull())
|
||
{
|
||
thirdObjId = synEntity.ThirdObjId;
|
||
dingDep.DeptId = Convert.ToInt32(thirdObjId);
|
||
var flag = dingHelper.UpdateDep(dingDep, ref msg);
|
||
thirdObjId = flag ? thirdObjId : string.Empty;
|
||
}
|
||
|
||
}
|
||
|
||
await Save(thirdType, dataType, org.id, thirdObjId, msg);
|
||
if (org.hasChildren)
|
||
{
|
||
foreach (var item in org.children)
|
||
{
|
||
var orgChild = item.Adapt<OrganizeListOutput>();
|
||
await DingDep(orgChild, dingHelper, thirdType, dataType);
|
||
}
|
||
}
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 用户同步
|
||
|
||
/// <summary>
|
||
/// 同步用户.
|
||
/// </summary>
|
||
/// <param name="thirdType"></param>
|
||
/// <param name="dataType"></param>
|
||
/// <param name="sysConfig"></param>
|
||
/// <param name="userList"></param>
|
||
/// <returns></returns>
|
||
[NonAction]
|
||
public async Task SynUser(int thirdType, int dataType, SysConfigOutput sysConfig, List<UserEntity> userList)
|
||
{
|
||
switch (thirdType)
|
||
{
|
||
case 1:
|
||
var weChat = new WeChatUtil(sysConfig.qyhCorpId, sysConfig.qyhCorpSecret);
|
||
foreach (var item in userList)
|
||
{
|
||
await WeChatUser(item, weChat, thirdType, dataType);
|
||
}
|
||
|
||
break;
|
||
default:
|
||
var ding = new DingUtil(sysConfig.dingSynAppKey, sysConfig.dingSynAppSecret);
|
||
foreach (var item in userList)
|
||
{
|
||
await DingUser(item, ding, thirdType, dataType);
|
||
}
|
||
|
||
break;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 同步用户.
|
||
/// </summary>
|
||
/// <param name="thirdType"></param>
|
||
/// <param name="dataType"></param>
|
||
/// <param name="sysConfig"></param>
|
||
/// <returns></returns>
|
||
[NonAction]
|
||
public async Task SynSysUser(int thirdType, int dataType, SysConfigOutput sysConfig)
|
||
{
|
||
try
|
||
{
|
||
var userList = new List<UserEntity>();
|
||
switch (thirdType)
|
||
{
|
||
case 1:
|
||
var weChat = new WeChatUtil(sysConfig.qyhCorpId, sysConfig.qyhCorpSecret);
|
||
userList = weChat.GetDepartmentMember().Adapt<List<UserEntity>>();
|
||
break;
|
||
default:
|
||
var ding = new DingUtil(sysConfig.dingSynAppKey, sysConfig.dingSynAppSecret);
|
||
userList = ding.GetUserList().Adapt<List<UserEntity>>();
|
||
break;
|
||
}
|
||
foreach (var item in userList)
|
||
{
|
||
var syncEntity = await _repository.GetFirstAsync(x => x.ThirdObjId == item.Account && x.DataType == dataType);
|
||
// 存在同步数据
|
||
if (syncEntity.IsNotEmptyOrNull())
|
||
{
|
||
await _repository.AsSugarClient().Updateable<UserEntity>().SetColumns(it => new UserEntity()
|
||
{
|
||
RealName = item.RealName,
|
||
LastModifyUserId = _userManager.UserId,
|
||
LastModifyTime = SqlFunc.GetDate()
|
||
}).Where(it => it.Id.Equals(syncEntity.SysObjId)).ExecuteCommandHasChangeAsync();
|
||
}
|
||
else
|
||
{
|
||
await Save(thirdType, dataType, item.Id, item.Account, "");
|
||
var syncOrgEntity = await _repository.GetFirstAsync(x => x.ThirdObjId == item.OrganizeId && x.DataType == 1);
|
||
if (syncOrgEntity.IsNotEmptyOrNull())
|
||
{
|
||
item.OrganizeId = syncOrgEntity.SysObjId;
|
||
}
|
||
await _repository.AsSugarClient().Insertable(item).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(m => m.Create()).ExecuteCommandAsync();
|
||
}
|
||
}
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
|
||
throw;
|
||
}
|
||
}
|
||
|
||
private async Task WeChatUser(UserEntity user, WeChatUtil weChatQYHelper, int thirdType, int dataType)
|
||
{
|
||
var qyUser = new QYMember();
|
||
List<int> depList = new List<int>();
|
||
await GetThirdDep(user.OrganizeId, thirdType, depList);
|
||
qyUser.userid = user.Id;
|
||
qyUser.name = user.RealName;
|
||
qyUser.mobile = user.MobilePhone;
|
||
qyUser.email = user.Email;
|
||
qyUser.department = depList.Select(x => (long)x).ToArray();
|
||
var thirdObjId = string.Empty;
|
||
var msg = string.Empty;
|
||
if (await IsExistThirdObjId(user.Id, thirdType, dataType))
|
||
{
|
||
var flag = weChatQYHelper.CreateMember(qyUser, ref msg);
|
||
thirdObjId = flag ? user.Id : weChatQYHelper.GetUserid(qyUser.mobile);
|
||
}
|
||
else
|
||
{
|
||
var flag = weChatQYHelper.UpdateMember(qyUser, ref msg);
|
||
thirdObjId = flag ? user.Id : weChatQYHelper.GetUserid(qyUser.mobile);
|
||
}
|
||
|
||
await Save(thirdType, dataType, user.Id, thirdObjId, msg);
|
||
}
|
||
|
||
private async Task DingUser(UserEntity user, DingUtil dingHelper, int thirdType, int dataType)
|
||
{
|
||
var dingUser = new DingUserParameter();
|
||
List<int> depList = new List<int>();
|
||
await GetThirdDep(user.OrganizeId, thirdType, depList);
|
||
dingUser.Name = user.RealName;
|
||
dingUser.Mobile = user.MobilePhone;
|
||
dingUser.Email = user.Email;
|
||
dingUser.DeptIdList = string.Join(",", depList);
|
||
var thirdObjId = string.Empty;
|
||
var msg = string.Empty;
|
||
if (await IsExistThirdObjId(user.Id, thirdType, dataType))
|
||
{
|
||
thirdObjId = dingHelper.CreateUser(dingUser, ref msg);
|
||
}
|
||
else
|
||
{
|
||
thirdObjId = (await _repository.GetFirstAsync(x => x.SysObjId == user.Id && x.ThirdType == thirdType)).ThirdObjId;
|
||
dingUser.Userid = thirdObjId;
|
||
var flag = dingHelper.UpdateUser(dingUser, ref msg);
|
||
thirdObjId = flag ? thirdObjId : string.Empty;
|
||
}
|
||
|
||
await Save(thirdType, dataType, user.Id, thirdObjId, msg);
|
||
}
|
||
|
||
#endregion
|
||
|
||
#endregion
|
||
} |