package jnpf.base.service.impl; import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.dingtalk.api.response.OapiV2DepartmentGetResponse; import com.github.yulichang.toolkit.JoinWrappers; import com.github.yulichang.wrapper.MPJLambdaWrapper; import jnpf.base.entity.SynThirdInfoEntity; import jnpf.base.entity.SysConfigEntity; import jnpf.base.mapper.SynThirdInfoMapper; import jnpf.base.model.synthirdinfo.DingTalkDeptModel; import jnpf.base.model.synthirdinfo.PaginationSynThirdInfo; import jnpf.base.model.synthirdinfo.SynThirdTotal; import jnpf.base.service.SuperServiceImpl; import jnpf.base.service.SynThirdDingTalkService; import jnpf.base.service.SynThirdInfoService; import jnpf.base.util.SynDingTalkUtil; import jnpf.message.model.SynThirdInfoVo; import jnpf.message.util.SynThirdConsts; import jnpf.permission.OrganizeApi; import jnpf.permission.UserApi; import jnpf.permission.entity.OrganizeEntity; import jnpf.permission.entity.UserEntity; import jnpf.permission.model.organize.OrganizeListVO; import jnpf.permission.model.organize.OrganizeModel; import jnpf.util.*; import jnpf.util.treeutil.SumTree; import jnpf.util.treeutil.newtreeutil.TreeDotUtils; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; import org.springframework.stereotype.Service; import java.util.*; import java.util.stream.Collectors; /** * 第三方工具的公司-部门-用户同步表模型 * * @版本: V3.1.0 * @版权: 引迈信息技术有限公司(https://www.jnpfsoft.com) * @作者: JNPF开发平台组 * @日期: 2021/4/23 17:33 */ @Service @RequiredArgsConstructor public class SynThirdInfoServiceImpl extends SuperServiceImpl implements SynThirdInfoService { private final OrganizeApi organizeApi; private final UserApi userApi; private final SysconfigServiceImpl sysconfigService; private final RedisUtil redisUtil; private final CacheKeyUtil cacheKeyUtil; public static final String SOCIALS_CONFIG = "SocialsConfig"; public static final String QYH_DEPARTMENT = "qyhDepartment"; public static final String DING_DEPARTMENT = "dingDepartment"; @Override public List getList(String thirdType, String dataType) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().and(t -> t.eq(SynThirdInfoEntity::getThirdType, Integer.valueOf(thirdType))); queryWrapper.lambda().and(t -> t.eq(SynThirdInfoEntity::getDataType, Integer.valueOf(dataType))); queryWrapper.lambda().orderByAsc(SynThirdInfoEntity::getCreatorTime); return this.list(queryWrapper); } @Override public SynThirdInfoEntity getInfo(String id) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(SynThirdInfoEntity::getId, id); return this.getOne(queryWrapper); } @Override public void create(SynThirdInfoEntity entity) { this.save(entity); } @Override public boolean update(String id, SynThirdInfoEntity entity) { entity.setId(id); return this.updateById(entity); } @Override public void delete(SynThirdInfoEntity entity) { if (entity != null) { this.removeById(entity.getId()); } } @Override public SynThirdInfoEntity getInfoBySysObjId(String thirdType, String dataType, String id) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().and(t -> t.eq(SynThirdInfoEntity::getThirdType, Integer.valueOf(thirdType))); queryWrapper.lambda().and(t -> t.eq(SynThirdInfoEntity::getDataType, Integer.valueOf(dataType))); queryWrapper.lambda().and(t -> t.eq(SynThirdInfoEntity::getSysObjId, id)); return this.getOne(queryWrapper); } @Override public SynThirdTotal getSynTotal(String thirdType, String dataType) { String synType = dataType.equals(SynThirdConsts.DATA_TYPE_ORG) ? "组织" : "用户"; int recordTotal = 0; long synSuccessCount = 0L; long synFailCount = 0L; long unSynCount = 0L; Date synDate = null; // 获取列表数据 List synList = getList(thirdType, dataType).stream().filter(t -> t.getLastModifyTime() != null).collect(Collectors.toList()); if (!synList.isEmpty()) { synSuccessCount = synList.stream().filter(t -> t.getEnabledMark().equals(SynThirdConsts.SYN_STATE_OK)).count(); synFailCount = synList.stream().filter(t -> t.getEnabledMark().equals(SynThirdConsts.SYN_STATE_FAIL)).count(); unSynCount = synList.stream().filter(t -> t.getEnabledMark().equals(SynThirdConsts.SYN_STATE_NO)).count(); Optional max = synList.stream() .max(Comparator.comparing(SynThirdInfoEntity::getLastModifyTime)); synDate = max.map(SynThirdInfoEntity::getLastModifyTime).orElse(null); } recordTotal = synList.size(); // 写入同步统计模型对象 SynThirdTotal synThirdTotal = new SynThirdTotal(); synThirdTotal.setSynType(synType); synThirdTotal.setRecordTotal(recordTotal); synThirdTotal.setSynSuccessCount(synSuccessCount); synThirdTotal.setSynFailCount(synFailCount); synThirdTotal.setUnSynCount(unSynCount); synThirdTotal.setSynDate(synDate); return synThirdTotal; } @Override public List syncThirdInfoByType(String thirdToSysType, String dataTypeOrg, String sysToThirdType) { HashMap typeMap = new HashMap<>(); typeMap.put(sysToThirdType, thirdToSysType); typeMap.put(thirdToSysType, sysToThirdType); List synThirdInfoList; List synThirdInfoDingList; synThirdInfoList = this.getList(thirdToSysType, dataTypeOrg); synThirdInfoDingList = this.getList(typeMap.get(thirdToSysType), dataTypeOrg); // 记录已经存在的组合 HashMap existingMap = new HashMap<>(); synThirdInfoList.forEach(k -> { String tag = k.getThirdType() + "-" + k.getDataType() + "-" + k.getSysObjId() + "-" + k.getThirdObjId(); existingMap.put(tag, true); }); synThirdInfoDingList.forEach(k -> { String tag = k.getThirdType() + "-" + k.getDataType() + "-" + k.getSysObjId() + "-" + k.getThirdObjId(); existingMap.put(tag, true); }); HashMap mapSource = new HashMap<>(); HashMap mapTarget = new HashMap<>(); String tag = ""; for (SynThirdInfoEntity entity : synThirdInfoList) { tag = entity.getSysObjId() + "-" + entity.getThirdObjId(); mapSource.put(tag, entity); } for (SynThirdInfoEntity entity : synThirdInfoDingList) { tag = entity.getSysObjId() + "-" + entity.getThirdObjId(); mapTarget.put(tag, entity); } // 同步记录 List synThirdInfoAddList = new ArrayList<>(); SynThirdInfoEntity addEntity = null; if (mapSource.isEmpty() && mapTarget.isEmpty()) { return new ArrayList<>(); } else if (CollUtil.isNotEmpty(mapSource) && CollUtil.isEmpty(mapTarget)) { for (Map.Entry entry : mapSource.entrySet()) { String key = entry.getKey(); SynThirdInfoEntity synThirdInfoEntity = mapSource.get(key); addEntity = JsonUtil.getJsonToBean(synThirdInfoEntity, SynThirdInfoEntity.class); addEntity.setId(RandomUtil.uuId()); addEntity.setThirdType(Integer.valueOf(typeMap.get(thirdToSysType))); synThirdInfoAddList.add(addEntity); } } else if (CollUtil.isEmpty(mapSource) && CollUtil.isNotEmpty(mapTarget)) { for (Map.Entry entry : mapTarget.entrySet()) { String key = entry.getKey(); SynThirdInfoEntity synThirdInfoEntity = mapTarget.get(key); addEntity = JsonUtil.getJsonToBean(synThirdInfoEntity, SynThirdInfoEntity.class); addEntity.setId(RandomUtil.uuId()); addEntity.setThirdType(Integer.valueOf(thirdToSysType)); synThirdInfoAddList.add(addEntity); } } else { for (Map.Entry entry : mapSource.entrySet()) { String key = entry.getKey(); if (!mapTarget.containsKey(key)) { SynThirdInfoEntity synThirdInfoEntity = mapSource.get(key); addEntity = JsonUtil.getJsonToBean(synThirdInfoEntity, SynThirdInfoEntity.class); addEntity.setId(RandomUtil.uuId()); addEntity.setThirdType(Integer.valueOf(typeMap.get(thirdToSysType))); synThirdInfoAddList.add(addEntity); } } for (Map.Entry entry : mapTarget.entrySet()) { String key = entry.getKey(); if (!mapSource.containsKey(key)) { SynThirdInfoEntity synThirdInfoEntity = mapTarget.get(key); addEntity = JsonUtil.getJsonToBean(synThirdInfoEntity, SynThirdInfoEntity.class); addEntity.setId(RandomUtil.uuId()); addEntity.setThirdType(Integer.valueOf(thirdToSysType)); synThirdInfoAddList.add(addEntity); } } } ArrayList addList = new ArrayList<>(); if (CollUtil.isNotEmpty(synThirdInfoAddList)) { // 过滤 synThirdInfoAddList.forEach(k -> { String addTag = k.getThirdType() + "-" + k.getDataType() + "-" + k.getSysObjId() + "-" + k.getThirdObjId(); if (existingMap.get(addTag) == null) { addList.add(k); } }); super.saveBatch(addList); } // 查找对应的数据 synThirdInfoList = this.getList(thirdToSysType, dataTypeOrg); return synThirdInfoList; } @Override public boolean getBySysObjId(String id) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(SynThirdInfoEntity::getEnabledMark, "1"); queryWrapper.lambda().eq(SynThirdInfoEntity::getSysObjId, id); List list = this.getBaseMapper().selectList(queryWrapper); return CollUtil.isNotEmpty(list); } @Override public boolean getBySysObjId(String id, String thirdType) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(SynThirdInfoEntity::getEnabledMark, 1); queryWrapper.lambda().eq(SynThirdInfoEntity::getThirdType, Integer.valueOf(thirdType)); queryWrapper.lambda().eq(SynThirdInfoEntity::getSysObjId, id); List list = this.getBaseMapper().selectList(queryWrapper); return CollUtil.isNotEmpty(list); } @Override public String getSysByThird(String valueOf) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().isNotNull(SynThirdInfoEntity::getSysObjId); queryWrapper.lambda().eq(SynThirdInfoEntity::getThirdObjId, valueOf); List list = this.getBaseMapper().selectList(queryWrapper); if (list != null && !list.isEmpty()) { return list.get(0).getSysObjId(); } return null; } @Override public String getSysByThird(String valueOf, Integer type) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().isNotNull(SynThirdInfoEntity::getSysObjId); queryWrapper.lambda().eq(SynThirdInfoEntity::getThirdType, type); queryWrapper.lambda().eq(SynThirdInfoEntity::getThirdObjId, valueOf); List list = this.getBaseMapper().selectList(queryWrapper); if (list != null && !list.isEmpty()) { return list.get(0).getSysObjId(); } return null; } @Override public SynThirdInfoEntity getInfoByThirdObjId(String thirdType, String dataType, String thirdObjId) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().and(t -> t.eq(SynThirdInfoEntity::getThirdType, Integer.valueOf(thirdType))); queryWrapper.lambda().and(t -> t.eq(SynThirdInfoEntity::getDataType, Integer.valueOf(dataType))); queryWrapper.lambda().and(t -> t.eq(SynThirdInfoEntity::getThirdObjId, thirdObjId)); return this.getOne(queryWrapper); } @Override public @NotNull List getOrganizeEntitiesBind(String dingDepartment) { // 获取同步表、部门表的信息 Map organizeList = organizeApi.getOrgMapsAll(); // 部门进行树结构化,固化上下层级序列化 List organizeModelList = JsonUtil.getJsonToList(organizeList.values(), OrganizeModel.class); List> trees = TreeDotUtils.convertListToTreeDot(organizeModelList); List> collect = trees .stream().filter(t -> t.getId().equals(dingDepartment)).collect(Collectors.toList()); List listVO = JsonUtil.getJsonToList(collect, OrganizeListVO.class); // 转化成为按上下层级顺序排序的列表数据 List listByOrder = new ArrayList<>(); for (OrganizeListVO organizeVo : listVO) { OrganizeEntity entity = organizeList.get(organizeVo.getId()); listByOrder.add(entity); SynDingTalkUtil.getOrganizeTreeToList(organizeVo, organizeList, listByOrder); } return listByOrder; } @Override public List getListJoin(PaginationSynThirdInfo paginationSynThirdInfo) { MPJLambdaWrapper wrapper = JoinWrappers.lambda(SynThirdInfoEntity.class); wrapper.and(t -> t.eq(SynThirdInfoEntity::getThirdType , Integer.valueOf(paginationSynThirdInfo.getThirdType()))); wrapper.and(t -> t.eq(SynThirdInfoEntity::getDataType , Integer.valueOf(paginationSynThirdInfo.getType()))); wrapper.and(t -> t.eq(SynThirdInfoEntity::getEnabledMark , Integer.valueOf(paginationSynThirdInfo.getResultType()))); if (StringUtil.isNotEmpty(paginationSynThirdInfo.getKeyword())) { String keyword = paginationSynThirdInfo.getKeyword(); wrapper.and(t -> { t.like(SynThirdInfoEntity::getDescription, keyword); t.or().like(SynThirdInfoEntity::getThirdName, keyword); if (paginationSynThirdInfo.getType().equals(SynThirdConsts.DATA_TYPE_ORG)) { t.or().like(OrganizeEntity::getFullName, keyword); } }); } wrapper.selectAs(SynThirdInfoEntity::getId, SynThirdInfoVo::getId) .selectAs(SynThirdInfoEntity::getDataType, SynThirdInfoVo::getDataType) .selectAs(SynThirdInfoEntity::getEnabledMark, SynThirdInfoVo::getEnabledMark) .selectAs(SynThirdInfoEntity::getCreatorTime, SynThirdInfoVo::getCreatorTime) .selectAs(SynThirdInfoEntity::getLastModifyTime, SynThirdInfoVo::getLastModifyTime) .selectAs(SynThirdInfoEntity::getThirdType, SynThirdInfoVo::getThirdType) .selectAs(SynThirdInfoEntity::getThirdName, SynThirdInfoVo::getThirdName) .selectAs(SynThirdInfoEntity::getDescription, SynThirdInfoVo::getDescription) .selectAs(SynThirdInfoEntity::getSysObjId, SynThirdInfoVo::getSysObjId); if (paginationSynThirdInfo.getType().equals(SynThirdConsts.DATA_TYPE_ORG)) { wrapper.leftJoin(OrganizeEntity.class, OrganizeEntity::getId, SynThirdInfoEntity::getSysObjId); wrapper.selectAs(OrganizeEntity::getFullName, SynThirdInfoVo::getSystemObjectName); } else { wrapper.leftJoin(UserEntity.class, UserEntity::getId, SynThirdInfoEntity::getSysObjId); wrapper.selectAs(UserEntity::getRealName, SynThirdInfoVo::getSystemObjectName); } Page page = new Page<>(paginationSynThirdInfo.getCurrentPage(), paginationSynThirdInfo.getPageSize()); Page synThirdInfoVoPage = this.selectJoinListPage(page, SynThirdInfoVo.class, wrapper); return paginationSynThirdInfo.setData(synThirdInfoVoPage.getRecords(), page.getTotal()); } @Override public List getListByDepartment(String thirdTypeDing, String dataTypeOrg, String dingDepartment) { List organizeEntitiesBind = getOrganizeEntitiesBind(dingDepartment); LambdaQueryWrapper synThirdInfoEntityLambdaQueryWrapper = new LambdaQueryWrapper<>(); synThirdInfoEntityLambdaQueryWrapper.eq(SynThirdInfoEntity::getThirdType, Integer.valueOf(thirdTypeDing)); synThirdInfoEntityLambdaQueryWrapper.eq(SynThirdInfoEntity::getDataType, Integer.valueOf(dataTypeOrg)); synThirdInfoEntityLambdaQueryWrapper.eq(SynThirdInfoEntity::getEnabledMark, 1); synThirdInfoEntityLambdaQueryWrapper.in(SynThirdInfoEntity::getSysObjId, organizeEntitiesBind .stream().map(OrganizeEntity::getId).collect(Collectors.toList())); return this.list(synThirdInfoEntityLambdaQueryWrapper); } @Override public void clearAllSyn(Integer type) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.lambda().eq(SynThirdInfoEntity::getThirdType, type); this.baseMapper.deleteByIds(this.list(queryWrapper)); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SysConfigEntity::getCategory, SOCIALS_CONFIG); //把最高级组织删掉 if (type.toString().equals(SynThirdConsts.THIRD_TYPE_QY)) { wrapper.eq(SysConfigEntity::getFkey, QYH_DEPARTMENT); } else { wrapper.eq(SysConfigEntity::getFkey, DING_DEPARTMENT); } List list = sysconfigService.list(wrapper); if (CollUtil.isNotEmpty(list)) { SysConfigEntity configEntity = list.get(0); configEntity.setValue(""); sysconfigService.updateById(configEntity); } String cacheKey = cacheKeyUtil.getSocialsConfig(); redisUtil.remove(cacheKey); } }