| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029 |
- package jnpf.message.service.impl;
- import cn.hutool.core.bean.BeanUtil;
- import cn.hutool.core.collection.CollectionUtil;
- import cn.hutool.core.util.ObjectUtil;
- import com.alibaba.fastjson.JSONObject;
- import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
- import com.dingtalk.api.response.OapiV2UserListResponse;
- import jnpf.base.UserInfo;
- import jnpf.base.entity.SuperBaseEntity;
- import jnpf.base.service.SysconfigService;
- import jnpf.base.util.SynDingTalkUtil;
- import jnpf.constant.JnpfConst;
- import jnpf.constant.PermissionConst;
- import jnpf.emnus.OrgTypeEnum;
- import jnpf.message.entity.SynThirdInfoEntity;
- import jnpf.message.model.message.DingTalkDeptModel;
- import jnpf.message.model.message.DingTalkUserModel;
- import jnpf.message.service.SynThirdDingTalkService;
- import jnpf.message.service.SynThirdInfoService;
- import jnpf.message.util.SynThirdConsts;
- import jnpf.model.SocialsSysConfig;
- import jnpf.permission.entity.OrganizeEntity;
- import jnpf.permission.entity.PositionEntity;
- import jnpf.permission.entity.UserEntity;
- import jnpf.permission.entity.UserRelationEntity;
- import jnpf.permission.model.position.PaginationPosition;
- import jnpf.permission.service.OrganizeService;
- import jnpf.permission.service.PositionService;
- import jnpf.permission.service.UserRelationService;
- import jnpf.permission.service.UserService;
- import jnpf.util.*;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Component;
- import org.springframework.util.Assert;
- import java.text.DateFormat;
- import java.text.ParseException;
- import java.text.SimpleDateFormat;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import java.util.TimeZone;
- import java.util.stream.Collectors;
- /**
- * 本系统的公司-部门-用户同步到钉钉的功能代码
- *
- * @版本: V3.1.0
- * @版权: 引迈信息技术有限公司(https://www.jnpfsoft.com)
- * @作者: JNPF开发平台组
- * @日期: 2021/5/7 8:42
- */
- @Component
- public class SynThirdDingTalkServiceImpl implements SynThirdDingTalkService {
- @Autowired
- private PositionService positionService;
- @Autowired
- private SynThirdInfoService synThirdInfoService;
- @Autowired
- private OrganizeService organizeService;
- @Autowired
- private UserService userService;
- @Autowired
- private UserRelationService userRelationService;
- @Autowired
- private SysconfigService sysconfigService;
- //------------------------------------本系统同步公司、部门到钉钉-------------------------------------
- /**
- * 根据部门的同步表信息判断同步情况
- * 不带错第三方误定位判断的功能代码,只获取调用接口的返回信息 20210604
- *
- * @param synThirdInfoEntity
- * @return
- */
- public JSONObject checkDepartmentSysToDing(SynThirdInfoEntity synThirdInfoEntity) {
- JSONObject retMsg = new JSONObject();
- retMsg.put("code", true);
- retMsg.put("flag", "");
- retMsg.put("error", "");
- if (synThirdInfoEntity != null) {
- if ("".equals(String.valueOf(synThirdInfoEntity.getThirdObjId())) || "null".equals(String.valueOf(synThirdInfoEntity.getThirdObjId()))) {
- // 同步表的钉钉ID为空
- retMsg.put("code", false);
- retMsg.put("flag", "2");
- retMsg.put("error", "同步表中部门对应的钉钉ID为空!");
- }
- } else {
- // 上级部门未同步
- retMsg.put("code", false);
- retMsg.put("flag", "3");
- retMsg.put("error", "部门未同步到钉钉!");
- }
- return retMsg;
- }
- public JSONObject checkDepartmentSysToDing2(List<String> objectIdList) {
- JSONObject retMsg = new JSONObject();
- List<String> thirdIdList = new ArrayList<>();
- retMsg.put("code", true);
- retMsg.put("error", "");
- for (int i = 0; i < objectIdList.size(); i++) {
- SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, objectIdList.get(i));
- if (synThirdInfoEntity != null) {
- if ("".equals(String.valueOf(synThirdInfoEntity.getThirdObjId())) || "null".equals(String.valueOf(synThirdInfoEntity.getThirdObjId()))) {
- // 同步表的钉钉ID为空
- retMsg.put("code", true);
- retMsg.put("flag", "2");
- retMsg.put("error", "同步表中部门对应的钉钉ID为空!");
- thirdIdList.add(synThirdInfoEntity.getThirdObjId());
- } else {
- retMsg.put("code", true);
- retMsg.put("flag", "1");
- thirdIdList.add(synThirdInfoEntity.getThirdObjId());
- }
- } else {
- if (i == objectIdList.size() - 1) {
- boolean b = (boolean) retMsg.get("code");
- if (!b) {
- // 上级部门未同步
- retMsg.put("code", false);
- retMsg.put("flag", "3");
- retMsg.put("error", "部门未同步到钉钉!");
- }
- }
- }
- }
- retMsg.put("flag", String.join(",", thirdIdList));
- return retMsg;
- }
- /**
- * 检查部门名称不能含有特殊字符
- *
- * @param deptName
- * @param opType
- * @param synThirdInfoEntity
- * @param thirdType
- * @param dataType
- * @param sysObjId
- * @param thirdObjId
- * @param deptFlag
- * @return
- */
- public JSONObject checkDeptName(String deptName, String opType, SynThirdInfoEntity synThirdInfoEntity, Integer thirdType,
- Integer dataType, String sysObjId, String thirdObjId, String deptFlag) {
- JSONObject retMsg = new JSONObject();
- retMsg.put("code", true);
- retMsg.put("error", "");
- if (deptName.indexOf("-") > -1 || deptName.indexOf(",") > -1 || deptName.indexOf(",") > -1) {
- // 同步失败
- Integer synState = SynThirdConsts.SYN_STATE_FAIL;
- String description = deptFlag + "部门名称不能含有,、,、-三种特殊字符";
- // 更新同步表
- saveSynThirdInfoEntity(opType, synThirdInfoEntity, thirdType, dataType, sysObjId, thirdObjId, deptName, synState, description);
- retMsg.put("code", false);
- retMsg.put("error", description);
- }
- return retMsg;
- }
- public void saveSynThirdInfoEntity(String opType, SynThirdInfoEntity synThirdInfoEntity, Integer thirdType,
- Integer dataType, String sysObjId, String thirdObjId, Integer synState,
- String description, String thirdInfoName, String thirdInfoId) {
- synThirdInfoEntity.setThirdObjId(thirdInfoId);
- synThirdInfoEntity.setThirdType(thirdType);
- synThirdInfoEntity.setDataType(dataType);
- synThirdInfoEntity.setSysObjId(sysObjId);
- synThirdInfoEntity.setThirdName(thirdInfoName);
- synThirdInfoEntity.setDescription(description);
- synThirdInfoEntity.setEnabledMark(synState);
- synThirdInfoEntity.setLastModifyTime(new Date());
- if (opType.equals("upd")) {
- SynThirdInfoEntity infoBySysObjId = synThirdInfoService.getInfoBySysObjId(thirdType + "", dataType + "", sysObjId);
- if (BeanUtil.isNotEmpty(infoBySysObjId)) {
- BeanUtil.copyProperties(synThirdInfoEntity, infoBySysObjId);
- synThirdInfoService.updateById(infoBySysObjId);
- }
- } else {
- synThirdInfoService.save(synThirdInfoEntity);
- }
- }
- /**
- * 将组织、用户的信息写入同步表
- *
- * @param opType "add":创建 “upd”:修改
- * @param synThirdInfoEntity 本地同步表信息
- * @param thirdType 第三方类型
- * @param dataType 数据类型
- * @param sysObjId 本地对象ID
- * @param thirdObjId 第三方对象ID
- * @param synState 同步状态(0:未同步;1:同步成功;2:同步失败)
- * @param description
- */
- public void saveSynThirdInfoEntity(String opType, SynThirdInfoEntity synThirdInfoEntity, Integer thirdType,
- Integer dataType, String sysObjId, String thirdObjId, String thirdName, Integer synState,
- String description) {
- UserInfo userInfo = UserProvider.getUser();
- SynThirdInfoEntity entity = new SynThirdInfoEntity();
- String compValue = SynThirdConsts.OBJECT_OP_ADD;
- if (compValue.equals(opType)) {
- entity.setId(RandomUtil.uuId());
- entity.setThirdType(thirdType);
- entity.setDataType(dataType);
- entity.setSysObjId(sysObjId);
- entity.setThirdObjId(thirdObjId);
- entity.setThirdName(thirdName);
- entity.setEnabledMark(synState);
- // 备注当作同步失败信息来用
- entity.setDescription(description);
- entity.setCreatorUserId(userInfo.getUserId());
- entity.setCreatorTime(DateUtil.getNowDate());
- entity.setLastModifyUserId(userInfo.getUserId());
- // 修改时间当作最后同步时间来用
- entity.setLastModifyTime(DateUtil.getNowDate());
- synThirdInfoService.create(entity);
- } else {
- entity = synThirdInfoEntity;
- entity.setThirdType(thirdType);
- entity.setDataType(dataType);
- entity.setThirdObjId(thirdObjId);
- entity.setThirdName(thirdName);
- entity.setEnabledMark(synState);
- // 备注当作同步失败信息来用
- entity.setDescription(description);
- entity.setLastModifyUserId(userInfo.getUserId());
- // 修改时间当作最后同步时间来用
- entity.setLastModifyTime(DateUtil.getNowDate());
- synThirdInfoService.update(entity.getId(), entity);
- }
- }
- /**
- * 往钉钉创建组织-部门
- * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604
- *
- * @param isBatch 是否批量(批量不受开关限制)
- * @param deptEntity
- * @param accessToken (单条调用时为空)
- * @return
- */
- @Override
- public JSONObject createDepartmentSysToDing(boolean isBatch, OrganizeEntity deptEntity, String accessToken) {
- SocialsSysConfig config = sysconfigService.getSocialsConfig();
- int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynOrg();
- String corpId = config.getDingSynAppKey();
- String corpSecret = config.getDingSynAppSecret();
- // 单条记录执行时,受开关限制
- JSONObject tokenObject = new JSONObject();
- String access_token = "";
- JSONObject retMsg = new JSONObject();
- DingTalkDeptModel deptModel = new DingTalkDeptModel();
- String thirdObjId = "";
- String thirdName = deptEntity.getFullName();
- Integer synState = 0;
- String description = "";
- boolean isDeptDiff = true;
- String deptFlag = "创建:";
- // 返回值初始化
- retMsg.put("code", true);
- retMsg.put("error", "创建:系统未设置单条同步");
- // 支持同步
- if (isBatch || dingIsSyn == 1) {
- // 获取 access_token 值
- if (isBatch) {
- access_token = accessToken;
- } else {
- List<SynThirdInfoEntity> synThirdInfoList = synThirdInfoService.syncThirdInfoByType(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, SynThirdConsts.THIRD_TYPE_DING);
- tokenObject = SynDingTalkUtil.getAccessToken(corpId, corpSecret);
- access_token = tokenObject.getString("access_token");
- }
- if (access_token != null && !access_token.isEmpty()) {
- deptModel.setDeptId(null);
- deptModel.setName(deptEntity.getFullName());
- // 从本地数据库的同步表获取对应的钉钉ID,为空报异常,不为空再验证所获取接口部门列表是否当前ID 未处理
- if ("-1".equals(deptEntity.getParentId())) {
- //顶级节点时,钉钉的父节点设置为1
- deptModel.setParentId(SynThirdConsts.DING_ROOT_DEPT_ID);
- } else {
- SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, deptEntity.getParentId());
- retMsg = checkDepartmentSysToDing(synThirdInfoEntity);
- isDeptDiff = retMsg.getBoolean("code");
- if (isDeptDiff) {
- deptModel.setParentId(Long.parseLong(synThirdInfoEntity.getThirdObjId()));
- }
- }
- deptModel.setOrder(deptEntity.getSortCode());
- deptModel.setCreateDeptGroup(false);
- if ("company".equals(deptEntity.getCategory())) {
- deptModel.setSourceIdentifier("company");
- } else {
- deptModel.setSourceIdentifier("department");
- }
- // 创建时:部门名称不能带有特殊字符
- retMsg = checkDeptName(deptEntity.getFullName(), SynThirdConsts.OBJECT_OP_ADD, null,
- Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING), Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, deptFlag);
- if (!retMsg.getBoolean("code")) {
- return retMsg;
- }
- if (isDeptDiff) {
- // 往钉钉写入公司或部门
- if (!"-1".equals(deptEntity.getParentId())) {
- retMsg = SynDingTalkUtil.createDepartment(deptModel, access_token);
- } else {
- retMsg.put("code", true);
- retMsg.put("error", "顶级不同步,默认值id1");
- retMsg.put("retDeptId", "1");
- }
- // 往同步写入本系统与第三方的对应信息
- if (retMsg.getBoolean("code")) {
- // 同步成功
- thirdObjId = retMsg.getString("retDeptId");
- retMsg.put("retDeptId", thirdObjId);
- synState = SynThirdConsts.SYN_STATE_OK;
- } else {
- if (retMsg.getString("error").contains("duplicateDeptId")) {
- synState = SynThirdConsts.SYN_STATE_OK;
- String[] split = retMsg.getString("error").split("duplicateDeptId");
- thirdObjId = split[1].replace("=", "").trim();
- description = retMsg.getString("error");
- } else {
- // 同步失败
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = deptFlag + retMsg.getString("error");
- }
- }
- } else {
- // 同步失败,上级部门无对应的钉钉ID
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = deptFlag + "部门所属的上级部门未同步到钉钉";
- retMsg.put("code", false);
- retMsg.put("error", description);
- retMsg.put("retDeptId", "0");
- }
- } else {
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = deptFlag + "access_token值为空,不能同步信息";
- retMsg.put("code", false);
- retMsg.put("error", description);
- retMsg.put("retDeptId", "0");
- }
- } else {
- description = retMsg.getString("error");
- return null;
- }
- // 更新同步表
- saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_ADD, null, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, thirdName, synState, description);
- return retMsg;
- }
- /**
- * 往钉钉更新组织-部门
- * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604
- *
- * @param isBatch 是否批量(批量不受开关限制)
- * @param deptEntity
- * @param accessToken (单条调用时为空)
- * @return
- */
- @Override
- public JSONObject updateDepartmentSysToDing(boolean isBatch, OrganizeEntity deptEntity, String accessToken) {
- SocialsSysConfig config = sysconfigService.getSocialsConfig();
- String corpId = config.getDingSynAppKey();
- String corpSecret = config.getDingSynAppSecret();
- // 单条记录执行时,受开关限制
- int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynOrg();
- JSONObject tokenObject = new JSONObject();
- String access_token = "";
- JSONObject retMsg = new JSONObject();
- DingTalkDeptModel deptModel = new DingTalkDeptModel();
- SynThirdInfoEntity synThirdInfoEntity = new SynThirdInfoEntity();
- String opType = "";
- Integer synState = 0;
- String description = "";
- String thirdObjId = "";
- String thirdName = deptEntity.getFullName();
- SynThirdInfoEntity synThirdInfoPara = new SynThirdInfoEntity();
- boolean isDeptDiff = true;
- String deptFlag = "更新:";
- // 返回值初始化
- retMsg.put("code", true);
- retMsg.put("error", "系统未设置单条同步");
- // 支持同步,设置需要同步到钉钉的对象属性值
- if (isBatch || dingIsSyn == 1) {
- // 获取 access_token
- if (isBatch) {
- access_token = accessToken;
- } else {
- tokenObject = SynDingTalkUtil.getAccessToken(corpId, corpSecret);
- access_token = tokenObject.getString("access_token");
- }
- // 获取同步表信息
- synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, deptEntity.getId());
- if (access_token != null && !access_token.isEmpty()) {
- deptModel.setDeptId(null);
- deptModel.setName(deptEntity.getFullName());
- // 从本地数据库的同步表获取对应的钉钉ID,为空报异常,不为空再验证所获取接口部门列表是否当前ID 未处理
- if ("-1".equals(deptEntity.getParentId())) {
- //顶级节点时,钉钉的父节点设置为1
- deptModel.setParentId(SynThirdConsts.DING_ROOT_DEPT_ID);
- } else {
- // 判断上级部门的合法性
- synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, deptEntity.getParentId());
- retMsg = checkDepartmentSysToDing(synThirdInfoEntity);
- isDeptDiff = retMsg.getBoolean("code");
- if (isDeptDiff) {
- deptModel.setParentId(Long.parseLong(synThirdInfoEntity.getThirdObjId()));
- }
- }
- deptModel.setOrder(deptEntity.getSortCode());
- // 上级部门检查是否异常
- if (isDeptDiff) {
- // 获取同步表信息
- synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, deptEntity.getId());
- // 判断当前部门对应的第三方的合法性
- retMsg = checkDepartmentSysToDing(synThirdInfoEntity);
- if (!retMsg.getBoolean("code")) {
- if ("3".equals(retMsg.getString("flag")) || "1".equals(retMsg.getString("flag"))) {
- // flag:3 未同步,需要创建同步到钉钉、写入同步表
- // flag:1 已同步但第三方上没对应的ID,需要删除原来的同步信息,再创建同步到钉钉、写入同步表
- if ("1".equals(retMsg.getString("flag"))) {
- synThirdInfoService.delete(synThirdInfoEntity);
- }
- opType = SynThirdConsts.OBJECT_OP_ADD;
- synThirdInfoPara = null;
- // 创建时:部门名称不能带有特殊字符
- retMsg = checkDeptName(deptEntity.getFullName(),
- opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, deptFlag);
- if (!retMsg.getBoolean("code")) {
- return retMsg;
- }
- if ("company".equals(deptEntity.getCategory())) {
- deptModel.setSourceIdentifier("company");
- } else {
- deptModel.setSourceIdentifier("department");
- }
- // 往钉钉写入公司或部门
- if (!"-1".equals(deptEntity.getParentId())) {
- retMsg = SynDingTalkUtil.createDepartment(deptModel, access_token);
- } else {
- retMsg.put("code", true);
- retMsg.put("error", "顶级不同步,默认值id1");
- retMsg.put("retDeptId", "1");
- }
- // 往同步写入本系统与第三方的对应信息
- if (retMsg.getBoolean("code")) {
- // 同步成功
- thirdObjId = retMsg.getString("retDeptId");
- retMsg.put("retDeptId", thirdObjId);
- synState = SynThirdConsts.SYN_STATE_OK;
- description = "";
- } else {
- // 同步失败
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = deptFlag + retMsg.getString("error");
- }
- }
- if ("2".equals(retMsg.getString("flag"))) {
- // flag:2 已同步但第三方ID为空,需要创建同步到钉钉、修改同步表
- opType = SynThirdConsts.OBJECT_OP_UPD;
- synThirdInfoPara = synThirdInfoEntity;
- thirdObjId = "";
- // 创建时:部门名称不能带有特殊字符
- retMsg = checkDeptName(deptEntity.getFullName(),
- opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, deptFlag);
- if (!retMsg.getBoolean("code")) {
- return retMsg;
- }
- if ("company".equals(deptEntity.getCategory())) {
- deptModel.setSourceIdentifier("company");
- } else {
- deptModel.setSourceIdentifier("department");
- }
- // 往钉钉写入公司或部门
- if (!"-1".equals(deptEntity.getParentId())) {
- retMsg = SynDingTalkUtil.createDepartment(deptModel, access_token);
- } else {
- retMsg.put("code", true);
- retMsg.put("error", "顶级不同步,默认值id1");
- retMsg.put("retDeptId", "1");
- }
- // 往同步表更新本系统与第三方的对应信息
- if (retMsg.getBoolean("code")) {
- // 同步成功
- thirdObjId = retMsg.getString("retDeptId");
- retMsg.put("retDeptId", thirdObjId);
- synState = SynThirdConsts.SYN_STATE_OK;
- description = "";
- } else {
- // 同步失败
- if (retMsg.getString("error").contains("duplicateDeptId")) {
- synState = SynThirdConsts.SYN_STATE_OK;
- String[] split = retMsg.getString("error").split("duplicateDeptId");
- thirdObjId = split[1].replace("=", "").trim();
- description = retMsg.getString("error");
- } else {
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = deptFlag + retMsg.getString("error");
- }
- }
- }
- } else {
- // 更新同步表
- opType = SynThirdConsts.OBJECT_OP_UPD;
- synThirdInfoPara = synThirdInfoEntity;
- thirdObjId = synThirdInfoEntity.getThirdObjId();
- // 部门名称不能带有特殊字符
- retMsg = checkDeptName(deptEntity.getFullName(),
- opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, deptFlag);
- if (!retMsg.getBoolean("code")) {
- return retMsg;
- }
- // 往钉钉写入公司或部门
- deptModel.setDeptId(Long.parseLong(synThirdInfoEntity.getThirdObjId()));
- // 设置部门主管:只有在更新时才可以执行
- // 初始化时:组织同步=>用户同步=>组织同步(用来更新部门主管的)
- if (StringUtil.isNotEmpty(deptEntity.getManagerId())) {
- SynThirdInfoEntity userThirdInfo = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, deptEntity.getManagerId());
- if (userThirdInfo != null) {
- if (StringUtil.isNotEmpty(userThirdInfo.getThirdObjId())) {
- deptModel.setDeptManagerUseridList(userThirdInfo.getThirdObjId());
- }
- }
- }
- if (!deptModel.getParentId().equals(Long.valueOf("-1"))) {
- retMsg = SynDingTalkUtil.updateDepartment(deptModel, access_token);
- }
- // 往同步表更新本系统与第三方的对应信息
- if (retMsg.getBoolean("code")) {
- // 同步成功
- synState = SynThirdConsts.SYN_STATE_OK;
- description = "更新成功";
- } else {
- // 同步失败
- if (retMsg.getString("error").contains("duplicateDeptId")) {
- synState = SynThirdConsts.SYN_STATE_OK;
- String[] split = retMsg.getString("error").split("duplicateDeptId");
- thirdObjId = split[1].replace("=", "").trim();
- } else {
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = deptFlag + retMsg.getString("error");
- }
- }
- }
- } else {
- // 同步失败,上级部门检查有异常
- if (synThirdInfoEntity != null) {
- // 修改同步表
- opType = SynThirdConsts.OBJECT_OP_UPD;
- synThirdInfoPara = synThirdInfoEntity;
- thirdObjId = synThirdInfoEntity.getThirdObjId();
- } else {
- // 写入同步表
- opType = SynThirdConsts.OBJECT_OP_ADD;
- synThirdInfoPara = null;
- thirdObjId = "";
- }
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = deptFlag + "上级部门无对应的钉钉ID";
- retMsg.put("code", false);
- retMsg.put("error", description);
- }
- } else {
- // 同步失败
- if (synThirdInfoEntity != null) {
- // 修改同步表
- opType = SynThirdConsts.OBJECT_OP_UPD;
- synThirdInfoPara = synThirdInfoEntity;
- thirdObjId = synThirdInfoEntity.getThirdObjId();
- } else {
- // 写入同步表
- opType = SynThirdConsts.OBJECT_OP_ADD;
- synThirdInfoPara = null;
- thirdObjId = "";
- }
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = deptFlag + "access_token值为空,不能同步信息";
- retMsg.put("code", true);
- retMsg.put("error", description);
- }
- } else {
- // 未设置单条同步,归并到未同步状态
- // 获取同步表信息
- synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, deptEntity.getId());
- if (ObjectUtil.isNotNull(synThirdInfoEntity)) {
- // 修改同步表
- opType = SynThirdConsts.OBJECT_OP_UPD;
- synThirdInfoPara = synThirdInfoEntity;
- thirdObjId = synThirdInfoEntity.getThirdObjId();
- thirdName = synThirdInfoEntity.getThirdName();
- } else {
- // 写入同步表
- opType = SynThirdConsts.OBJECT_OP_ADD;
- synThirdInfoPara = null;
- thirdObjId = "";
- }
- synState = SynThirdConsts.SYN_STATE_NO;
- description = deptFlag + "系统未设置单条同步";
- retMsg.put("code", true);
- retMsg.put("error", description);
- return retMsg;
- }
- // 更新同步表
- saveSynThirdInfoEntity(opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, thirdName, synState, description);
- return retMsg;
- }
- @Override
- public JSONObject unifyDepartmentSysToDing(boolean isBatch, OrganizeEntity deptEntity, String accessToken, String choice) {
- SocialsSysConfig socialsConfig = sysconfigService.getSocialsConfig();
- String dingDepartment = socialsConfig.getDingDepartment();
- if (StringUtil.isEmpty(dingDepartment)) {
- return null;
- }
- List<OrganizeEntity> organizeEntitiesBind = synThirdInfoService
- .getOrganizeEntitiesBind(dingDepartment);
- if (CollectionUtil.isEmpty(organizeEntitiesBind) || !organizeEntitiesBind
- .stream()
- .map(SuperBaseEntity.SuperIBaseEntity::getId)
- .collect(Collectors.toList()).contains(deptEntity.getId())) {
- if (!choice.equals(SynThirdConsts.DELETE_DEP)) {
- return null;
- }
- }
- switch (choice) {
- case SynThirdConsts.CREAT_DEP:
- return this.createDepartmentSysToDing(isBatch, deptEntity, accessToken);
- case SynThirdConsts.UPDATE_DEP:
- return this.updateDepartmentSysToDing(isBatch, deptEntity, accessToken);
- case SynThirdConsts.DELETE_DEP:
- String parentId = deptEntity.getParentId();
- return this.deleteDepartmentSysToDing(isBatch, deptEntity.getId(), accessToken);
- default:
- return null;
- }
- }
- @Override
- public JSONObject unifyDepartmentSysToDing(boolean isBatch, List<OrganizeEntity> organizeEntities, String accessToken, String choice) {
- for (OrganizeEntity organizeEntity : organizeEntities) {
- this.deleteDepartmentSysToDing(isBatch, organizeEntity.getId(), accessToken);
- }
- return null;
- }
- /**
- * 往钉钉删除组织-部门
- * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604
- *
- * @param isBatch 是否批量(批量不受开关限制)
- * @param id 本系统的公司或部门ID
- * @param accessToken (单条调用时为空)
- * @return
- */
- @Override
- public JSONObject deleteDepartmentSysToDing(boolean isBatch, String id, String accessToken) {
- SocialsSysConfig config = sysconfigService.getSocialsConfig();
- String corpId = config.getDingSynAppKey();
- String corpSecret = config.getDingSynAppSecret();
- // 单条记录执行时,受开关限制
- int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynOrg();
- JSONObject tokenObject = new JSONObject();
- String access_token = "";
- JSONObject retMsg = new JSONObject();
- SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, id);
- String deptFlag = "删除:";
- // 返回值初始化
- retMsg.put("code", true);
- retMsg.put("error", "系统未设置单条同步");
- // 支持同步
- if (synThirdInfoEntity != null) {
- if (isBatch || dingIsSyn == 1) {
- // 获取 access_token
- if (isBatch) {
- access_token = accessToken;
- } else {
- List<SynThirdInfoEntity> synThirdInfoList = synThirdInfoService.syncThirdInfoByType(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, SynThirdConsts.THIRD_TYPE_DING);
- tokenObject = SynDingTalkUtil.getAccessToken(corpId, corpSecret);
- access_token = tokenObject.getString("access_token");
- }
- if (access_token != null && !access_token.isEmpty()) {
- // 删除钉钉对应的部门
- if (!"".equals(String.valueOf(synThirdInfoEntity.getThirdObjId())) && !"null".equals(String.valueOf(synThirdInfoEntity.getThirdObjId()))) {
- retMsg = SynDingTalkUtil.deleteDepartment(Long.parseLong(synThirdInfoEntity.getThirdObjId()), access_token);
- if (retMsg.getBoolean("code")) {
- // 同步成功,直接删除同步表记录
- synThirdInfoService.delete(synThirdInfoEntity);
- } else {
- // 同步失败
- saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), id, synThirdInfoEntity.getThirdObjId(), synThirdInfoEntity.getThirdName(), SynThirdConsts.SYN_STATE_FAIL, deptFlag + retMsg.getString("error"));
- }
- } else {
- // 根据钉钉ID找不到相应的信息,直接删除同步表记录
- synThirdInfoService.delete(synThirdInfoEntity);
- }
- } else {
- // 同步失败
- saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), id, synThirdInfoEntity.getThirdObjId(), synThirdInfoEntity.getThirdName(), SynThirdConsts.SYN_STATE_FAIL, deptFlag + "access_token值为空,不能同步信息");
- retMsg.put("code", false);
- retMsg.put("error", deptFlag + "access_token值为空,不能同步信息!");
- }
- } else {
- // 未设置单条同步,归并到未同步状态
- // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), id, synThirdInfoEntity.getThirdObjId(), synThirdInfoEntity.getThirdName(), SynThirdConsts.SYN_STATE_NO, deptFlag + "系统未设置单条同步");
- retMsg.put("code", true);
- retMsg.put("error", deptFlag + "系统未设置单条同步");
- }
- }
- return retMsg;
- }
- //------------------------------------钉钉同步公司、部门到本系统20220330-------------------------------------
- /**
- * 根据部门的同步表信息判断同步情况
- * 不带错第三方误定位判断的功能代码,只获取调用接口的返回信息 20220331
- *
- * @param synThirdInfoEntity
- * @return
- */
- public JSONObject checkDepartmentDingToSys(SynThirdInfoEntity synThirdInfoEntity) {
- JSONObject retMsg = new JSONObject();
- retMsg.put("code", true);
- retMsg.put("flag", "");
- retMsg.put("error", "");
- if (synThirdInfoEntity != null) {
- if ("".equals(String.valueOf(synThirdInfoEntity.getSysObjId())) || "null".equals(String.valueOf(synThirdInfoEntity.getSysObjId()))) {
- // 同步表的钉钉ID为空
- retMsg.put("code", false);
- retMsg.put("flag", "2");
- retMsg.put("error", "同步表中部门对应的本地ID为空!");
- }
- } else {
- // 上级部门未同步
- retMsg.put("code", false);
- retMsg.put("flag", "3");
- retMsg.put("error", "部门未同步到本地!");
- }
- return retMsg;
- }
- /**
- * 往本地创建组织-部门
- * 钉钉同步单个公司或部门到本地(供调用)
- * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604
- *
- * @param isBatch 是否批量(批量不受开关限制)
- * @param accessToken (单条调用时为空)
- */
- @Override
- public JSONObject createDepartmentDingToSys(boolean isBatch, DingTalkDeptModel deptEntity, String accessToken) {
- SocialsSysConfig config = sysconfigService.getSocialsConfig();
- // 单条记录执行时,受开关限制
- int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynOrg();
- Long dingDeptId = deptEntity.getDeptId();
- String dingDeptName = deptEntity.getName();
- Long dingParentId = deptEntity.getParentId();
- Integer synState = 0;
- String deptFlag = "创建:";
- String description = "";
- JSONObject retMsg = new JSONObject();
- boolean isDeptDiff = true;
- String sysParentId = "";
- String sysObjId = "";
- // 返回值初始化
- retMsg.put("code", true);
- retMsg.put("error", "创建:系统未设置单条同步");
- // 支持同步
- if (dingIsSyn == 1) {
- boolean tag = false;
- if (dingDeptId == 1L) {
- tag = true;
- }
- SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, dingParentId + "");
- retMsg = checkDepartmentDingToSys(synThirdInfoEntity);
- isDeptDiff = retMsg.getBoolean("code");
- if (isDeptDiff || tag) {
- sysParentId = tag ? " -1" : synThirdInfoEntity.getSysObjId();
- Assert.notNull(sysParentId, "父级组织未同步");
- List<OrganizeEntity> listByParentId = new ArrayList<>();
- //如果是-1,就直接取绑定
- if (sysParentId.equals("-1")) {
- String dingDepartment = config.getDingDepartment();
- OrganizeEntity info = organizeService.getInfo(dingDepartment);
- listByParentId.add(info);
- } else {
- listByParentId = organizeService.getListByParentId(sysParentId);
- }
- OrganizeEntity organizeEntity = listByParentId.stream().filter(t -> t.getFullName().equals(dingDeptName)).findFirst().orElse(null);
- //系统组织同名建立绑定关系,不存在则新建组织
- if (organizeEntity == null) {
- // 新增保存组织
- OrganizeEntity newOrg = new OrganizeEntity();
- sysObjId = RandomUtil.uuId();
- newOrg.setId(sysObjId);
- if (!"1".equals(dingDeptId + "")) {
- List<OrganizeEntity> depsByParentId = organizeService.getDepsByParentId(sysParentId);
- if (depsByParentId.stream().noneMatch(t->t.getFullName().equals(dingDeptName))){
- newOrg.setParentId(sysParentId);
- String organizeIdTree = organizeService.getOrganizeIdTree(newOrg);
- newOrg.setOrganizeIdTree(organizeIdTree + "," + sysObjId);
- newOrg.setFullName(dingDeptName);
- newOrg.setSortCode(deptEntity.getOrder() != null ? deptEntity.getOrder() : 1L);
- newOrg.setCategory(OrgTypeEnum.DEPARTMENT.getCode());
- organizeService.create(newOrg);}
- } else {
- sysObjId = config.getDingDepartment();
- }
- // 中间表
- retMsg.put("retDeptId", sysObjId);
- synState = SynThirdConsts.SYN_STATE_OK;
- } else {
- sysObjId = organizeEntity.getId();
- retMsg.put("retDeptId", sysObjId);
- synState = SynThirdConsts.SYN_STATE_OK;
- }
- } else {
- // 同步失败,上级部门无对应的钉钉ID
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = deptFlag + "部门所属的上级部门未同步到本地";
- retMsg.put("code", false);
- retMsg.put("error", description);
- retMsg.put("retDeptId", "0");
- }
- }
- // 更新同步表
- saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_ADD, null, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), sysObjId, dingDeptId + "", dingDeptName, synState, description);
- return retMsg;
- }
- /**
- * 往钉钉更新组织-部门
- * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604
- *
- * @param isBatch 是否批量(批量不受开关限制)
- * @param deptEntity
- * @param accessToken (单条调用时为空)
- * @return
- */
- @Override
- public JSONObject updateDepartmentDingToSys(boolean isBatch, DingTalkDeptModel deptEntity, String accessToken) {
- SocialsSysConfig config = sysconfigService.getSocialsConfig();
- // 单条记录执行时,受开关限制
- int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynOrg();
- JSONObject retMsg = new JSONObject();
- SynThirdInfoEntity synThirdInfoEntity = new SynThirdInfoEntity();
- String opType = "";
- Integer synState = 0;
- String description = "";
- String sysObjId = "";
- String sysParentId = "";
- SynThirdInfoEntity synThirdInfoPara = new SynThirdInfoEntity();
- boolean isDeptDiff = true;
- String deptFlag = "更新:";
- Long dingDeptId = deptEntity.getDeptId();
- String dingDeptName = deptEntity.getName();
- Long dingParentId = deptEntity.getParentId();
- OrganizeEntity orgInfo = new OrganizeEntity();
- // 返回值初始化
- retMsg.put("code", true);
- retMsg.put("error", "系统未设置单条同步");
- if (isBatch || dingIsSyn == 1) {
- // 获取同步表信息
- synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, dingParentId + "");
- retMsg = checkDepartmentDingToSys(synThirdInfoEntity);
- isDeptDiff = retMsg.getBoolean("code");
- if (isDeptDiff) {
- sysParentId = synThirdInfoEntity.getSysObjId();
- // 获取同步表信息
- synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, dingDeptId + "");
- // 判断当前部门对应的第三方的合法性
- retMsg = checkDepartmentDingToSys(synThirdInfoEntity);
- if (!retMsg.getBoolean("code")) {
- if ("3".equals(retMsg.getString("flag")) || "1".equals(retMsg.getString("flag"))) {
- // flag:3 未同步,需要创建同步到钉钉、写入同步表
- // flag:1 已同步但第三方上没对应的ID,需要删除原来的同步信息,再创建同步到钉钉、写入同步表
- if ("1".equals(retMsg.getString("flag"))) {
- synThirdInfoService.delete(synThirdInfoEntity);
- }
- opType = SynThirdConsts.OBJECT_OP_ADD;
- synThirdInfoPara = null;
- // thirdObjId = dingDeptId+"";
- // 新增保存组织
- orgInfo = new OrganizeEntity();
- sysObjId = RandomUtil.uuId();
- orgInfo.setId(sysObjId);
- if (!"1".equals(dingDeptId + "")) {
- orgInfo.setCategory(SynThirdConsts.OBJECT_TYPE_DEPARTMENT);
- orgInfo.setParentId(sysParentId);
- // 通过组织id获取父级组织
- String organizeIdTree = organizeService.getOrganizeIdTree(orgInfo);
- orgInfo.setOrganizeIdTree(organizeIdTree + "," + sysObjId);
- orgInfo.setFullName(dingDeptName);
- orgInfo.setSortCode(deptEntity.getOrder() != null ? deptEntity.getOrder() : 1L);
- organizeService.save(orgInfo);
- } else {
- sysObjId = organizeService.getOrganizeByParentId("-1").get(0).getId();
- }
- // 同步成功
- retMsg.put("retDeptId", sysObjId);
- synState = SynThirdConsts.SYN_STATE_OK;
- description = "";
- }
- if ("2".equals(retMsg.getString("flag"))) {
- // flag:2 已同步但第三方ID为空,需要创建同步到钉钉、修改同步表
- opType = SynThirdConsts.OBJECT_OP_UPD;
- synThirdInfoPara = synThirdInfoEntity;
- // thirdObjId = dingDeptId+"";
- // 新增保存组织
- orgInfo = new OrganizeEntity();
- sysObjId = RandomUtil.uuId();
- orgInfo.setId(sysObjId);
- if (!"1".equals(dingDeptId + "")) {
- orgInfo.setCategory(SynThirdConsts.OBJECT_TYPE_DEPARTMENT);
- orgInfo.setParentId(sysParentId);
- // 通过组织id获取父级组织
- String organizeIdTree = organizeService.getOrganizeIdTree(orgInfo);
- orgInfo.setOrganizeIdTree(organizeIdTree + "," + sysObjId);
- orgInfo.setFullName(dingDeptName);
- orgInfo.setSortCode(deptEntity.getOrder() != null ? deptEntity.getOrder() : 1L);
- organizeService.save(orgInfo);
- } else {
- sysObjId = organizeService.getOrganizeByParentId("-1").get(0).getId();
- }
- // 同步成功
- retMsg.put("retDeptId", sysObjId);
- synState = SynThirdConsts.SYN_STATE_OK;
- description = "";
- }
- } else {
- // 更新同步表
- opType = SynThirdConsts.OBJECT_OP_UPD;
- synThirdInfoPara = synThirdInfoEntity;
- sysObjId = synThirdInfoEntity.getSysObjId();
- orgInfo = organizeService.getInfo(sysObjId);
- if (orgInfo != null) {
- orgInfo.setParentId(dingParentId + "");
- orgInfo.setFullName(dingDeptName);
- if (!"1".equals(dingDeptId + "")) {
- orgInfo.setParentId(sysParentId);
- orgInfo.setOrganizeIdTree(orgInfo.getOrganizeIdTree().replace("," + orgInfo.getId(), ""));
- organizeService.update(orgInfo.getId(), orgInfo);
- }
- // 同步成功
- synState = SynThirdConsts.SYN_STATE_OK;
- description = "";
- } else {
- // 同步失败
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = deptFlag + "未找到对应的部门";
- }
- }
- } else {
- synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, dingDeptId + "");
- // 同步失败,上级部门检查有异常
- if (synThirdInfoEntity != null) {
- // 修改同步表
- opType = SynThirdConsts.OBJECT_OP_UPD;
- synThirdInfoPara = synThirdInfoEntity;
- sysObjId = synThirdInfoEntity.getSysObjId();
- } else {
- // 写入同步表
- opType = SynThirdConsts.OBJECT_OP_ADD;
- synThirdInfoPara = null;
- sysObjId = "";
- }
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = deptFlag + "上级部门无对应的本地ID";
- retMsg.put("code", false);
- retMsg.put("error", description);
- }
- } else {
- // 未设置单条同步,归并到未同步状态
- // 获取同步表信息
- synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, dingDeptId + "");
- if (synThirdInfoEntity != null) {
- // 修改同步表
- opType = SynThirdConsts.OBJECT_OP_UPD;
- synThirdInfoPara = synThirdInfoEntity;
- sysObjId = synThirdInfoEntity.getSysObjId();
- } else {
- // 写入同步表
- opType = SynThirdConsts.OBJECT_OP_ADD;
- synThirdInfoPara = null;
- sysObjId = "";
- }
- synState = SynThirdConsts.SYN_STATE_NO;
- description = deptFlag + "系统未设置单条同步";
- retMsg.put("code", true);
- retMsg.put("error", description);
- }
- // 更新同步表
- saveSynThirdInfoEntity(opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), sysObjId, dingDeptId + "", dingDeptName, synState, description);
- return retMsg;
- }
- /**
- * 往钉钉删除组织-部门
- * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604
- *
- * @param isBatch 是否批量(批量不受开关限制)
- * @param thirdObjId 钉钉的公司或部门ID
- * @return
- */
- @Override
- public JSONObject deleteDepartmentDingToSys(boolean isBatch, String thirdObjId) {
- SocialsSysConfig config = sysconfigService.getSocialsConfig();
- // 单条记录执行时,受开关限制
- int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynOrg();
- String deptFlag = "删除:";
- JSONObject retMsg = new JSONObject();
- String thirdName = "";
- // 获取当前第三方同步表对应记录
- SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, thirdObjId);
- // 返回值初始化
- retMsg.put("code", true);
- retMsg.put("error", "系统未设置单条同步");
- if (synThirdInfoEntity != null) {
- thirdName = synThirdInfoEntity.getThirdName();
- if (dingIsSyn == 1) {
- String sysObjId = synThirdInfoEntity.getSysObjId();
- if (!"".equals(String.valueOf(sysObjId)) && !"null".equals(String.valueOf(sysObjId))) {
- OrganizeEntity sysOrgEntity = organizeService.getInfo(sysObjId);
- if (sysOrgEntity != null) {
- // 删除本的的组织
- organizeService.delete(sysOrgEntity.getId(), false);
- // 同步成功,直接删除同步表记录
- synThirdInfoService.delete(synThirdInfoEntity);
- } else {
- // 根据本系统ID找不到相应的信息,直接删除同步表记录
- synThirdInfoService.delete(synThirdInfoEntity);
- }
- } else {
- // 根据本系统ID找不到相应的信息,直接删除同步表记录
- synThirdInfoService.delete(synThirdInfoEntity);
- }
- } else {
- // 未设置单条同步,归并到未同步状态
- saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), synThirdInfoEntity.getSysObjId(), thirdObjId, thirdName, SynThirdConsts.SYN_STATE_NO, deptFlag + "系统未设置单条同步");
- retMsg.put("code", true);
- retMsg.put("error", deptFlag + "系统未设置单条同步");
- }
- }
- return retMsg;
- }
- //------------------------------------本系统同步用户到钉钉-------------------------------------
- /**
- * 设置需要提交给钉钉接口的单个成员信息
- * 不带第三方错误定位判断的功能代码,只获取调用接口的返回信息 20210604
- *
- * @param userEntity 本地用户信息
- * @return
- */
- public JSONObject setDingUserObject(UserEntity userEntity) throws ParseException {
- DingTalkUserModel userModel = new DingTalkUserModel();
- JSONObject retMsg = new JSONObject();
- retMsg.put("code", true);
- retMsg.put("error", "");
- // 验证邮箱格式的格式合法性、唯一性
- if (StringUtil.isNotEmpty(userEntity.getEmail())) {
- if (!RegexUtils.checkEmail(userEntity.getEmail())) {
- retMsg.put("code", false);
- retMsg.put("error", "邮箱格式不合法!");
- retMsg.put("dingUserObject", null);
- return retMsg;
- }
- }
- // 判断手机号的合法性
- if (StringUtil.isNotEmpty(userEntity.getMobilePhone())) {
- if (!RegexUtils.checkMobile(userEntity.getMobilePhone())) {
- retMsg.put("code", false);
- retMsg.put("error", "手机号不合法!");
- retMsg.put("dingUserObject", null);
- return retMsg;
- }
- }
- userModel.setUserid(userEntity.getId());
- userModel.setName(userEntity.getRealName());
- userModel.setMobile(userEntity.getMobilePhone());
- userModel.setTelephone(userEntity.getLandline());
- userModel.setJobNumber(userEntity.getAccount());
- PositionEntity positionEntity = positionService.getInfo(userEntity.getPositionId());
- String jobName = "";
- if (positionEntity != null) {
- jobName = positionEntity.getFullName();
- userModel.setTitle(jobName);
- }
- userModel.setWorkPlace(userEntity.getPostalAddress());
- if (userEntity.getEntryDate() != null) {
- String entryDate = DateUtil.daFormat(userEntity.getEntryDate());
- DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
- df.setTimeZone(TimeZone.getTimeZone("GMT"));
- if (df.parse(entryDate).getTime() > 0) {
- userModel.setHiredDate(df.parse(entryDate).getTime());
- }
- }
- // retMsg = checkDepartmentSysToDing(synThirdInfoEntity,dingDeptList);
- List<UserRelationEntity> userRelationList = userRelationService.getListByObjectType(userEntity.getId(), "Organize");
- List<String> objectIdList = userRelationList.stream().map(t -> t.getObjectId()).collect(Collectors.toList());
- // String objectId = userRelationList.stream().map(t->t.getObjectId()).collect(Collectors.joining(","));
- retMsg = checkDepartmentSysToDing2(objectIdList);
- if (retMsg.getBoolean("code")) {
- // userModel.setDeptIdList(synThirdInfoEntity.getThirdObjId());
- userModel.setDeptIdList(retMsg.getString("flag"));
- } else {
- retMsg.put("code", false);
- retMsg.put("error", "部门找不到对应的钉钉ID!");
- retMsg.put("dingUserObject", null);
- return retMsg;
- }
- userModel.setEmail(userEntity.getEmail());
- retMsg.put("dingUserObject", userModel);
- return retMsg;
- }
- /**
- * 根据用户的同步表信息判断同步情况
- * 不带第三方错误定位判断的功能代码,只获取调用接口的返回信息 20210604
- *
- * @param synThirdInfoEntity
- * @return
- */
- public JSONObject checkUserSysToDing(SynThirdInfoEntity synThirdInfoEntity) {
- JSONObject retMsg = new JSONObject();
- retMsg.put("code", true);
- retMsg.put("flag", "");
- retMsg.put("error", "");
- if (synThirdInfoEntity != null) {
- if ("".equals(String.valueOf(synThirdInfoEntity.getThirdObjId())) || "null".equals(String.valueOf(synThirdInfoEntity.getThirdObjId()))) {
- // 同步表的企业微信ID为空
- retMsg.put("code", false);
- retMsg.put("flag", "2");
- retMsg.put("error", "同步表中用户对应的钉钉ID为空!");
- }
- } else {
- // 上级用户未同步
- retMsg.put("code", false);
- retMsg.put("flag", "3");
- retMsg.put("error", "用户未同步!");
- }
- return retMsg;
- }
- /**
- * 往钉钉创建用户
- * 不带第三方错误定位判断的功能代码,只获取调用接口的返回信息 20210604
- *
- * @param isBatch 是否批量(批量不受开关限制)
- * @param userEntity
- * @param accessToken (单条调用时为空)
- * @return
- */
- @Override
- public JSONObject createUserSysToDing(boolean isBatch, UserEntity userEntity, String accessToken) throws ParseException {
- SocialsSysConfig config = sysconfigService.getSocialsConfig();
- String corpId = config.getDingSynAppKey();
- String corpSecret = config.getDingSynAppSecret();
- // 单条记录执行时,受开关限制
- int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynUser();
- JSONObject tokenObject = new JSONObject();
- String access_token = "";
- JSONObject retMsg = new JSONObject();
- DingTalkUserModel userObjectModel = new DingTalkUserModel();
- String thirdObjId = "";
- Integer synState = 0;
- String description = "";
- String userFlag = "创建:";
- // 返回值初始化
- retMsg.put("code", true);
- retMsg.put("error", userFlag + "系统未设置单条同步");
- if (isBatch || dingIsSyn == 1) {
- if (isBatch) {
- access_token = accessToken;
- } else {
- synThirdInfoService.syncThirdInfoByType(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, SynThirdConsts.THIRD_TYPE_DING);
- synThirdInfoService.syncThirdInfoByType(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, SynThirdConsts.THIRD_TYPE_DING);
- tokenObject = SynDingTalkUtil.getAccessToken(corpId, corpSecret);
- access_token = tokenObject.getString("access_token");
- }
- if (access_token != null && !access_token.isEmpty()) {
- // 要同步到钉钉的对象赋值
- retMsg = setDingUserObject(userEntity);
- if (retMsg.getBoolean("code")) {
- userObjectModel = retMsg.getObject("dingUserObject", DingTalkUserModel.class);
- // 往钉钉写入成员
- retMsg = SynDingTalkUtil.createUser(userObjectModel, access_token);
- // 往同步写入本系统与第三方的对应信息
- if (retMsg.getBoolean("code")) {
- // 同步成功
- thirdObjId = userEntity.getId();
- synState = SynThirdConsts.SYN_STATE_OK;
- } else {
- if (retMsg.getString("error").contains("手机号码在公司中已存在")) {
- retMsg = SynDingTalkUtil.updateUser(userObjectModel, access_token);
- if (retMsg.getBoolean("code")) {
- // 同步成功
- thirdObjId = userEntity.getId();
- synState = SynThirdConsts.SYN_STATE_OK;
- } else {
- // 同步失败
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = userFlag + retMsg.getString("error");
- }
- } else {
- // 同步失败
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = userFlag + retMsg.getString("error");
- }
- }
- } else {
- // 同步失败,原因:部门找不到对应的第三方ID、邮箱格式不合法
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = userFlag + retMsg.getString("error");
- }
- } else {
- // 同步失败
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = userFlag + "access_token值为空,不能同步信息";
- retMsg.put("code", false);
- retMsg.put("error", description);
- }
- } else {
- // 无须同步,未同步状态
- synState = SynThirdConsts.SYN_STATE_NO;
- description = userFlag + "系统未设置单条同步";
- retMsg.put("code", true);
- retMsg.put("error", description);
- return retMsg;
- }
- // 更新同步表
- saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_ADD, null, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), userEntity.getId(), thirdObjId, userEntity.getRealName(), synState, description);
- return retMsg;
- }
- @Override
- public JSONObject createUserSysToDing(boolean isBatch, List<UserEntity> userEntities, String accessToken, String positionId) throws ParseException {
- SocialsSysConfig config = sysconfigService.getSocialsConfig();
- List<OrganizeEntity> organizeEntitiesBind = synThirdInfoService.getOrganizeEntitiesBind(config.getDingDepartment());
- PositionEntity info = positionService.getInfo(positionId);
- if (BeanUtil.isNotEmpty(info) && !organizeEntitiesBind.stream()
- .map(SuperBaseEntity.SuperIBaseEntity::getId)
- .collect(Collectors.toList()).contains(info.getOrganizeId())) {
- return null;
- }
- for (UserEntity userEntity : userEntities) {
- createUserSysToDing(isBatch, userEntity, accessToken);
- }
- return new JSONObject();
- }
- @Override
- public JSONObject createUserSysToDing(boolean isBatch, UserEntity userEntity, String accessToken, List<String> ids) throws ParseException {
- SocialsSysConfig config = sysconfigService.getSocialsConfig();
- List<OrganizeEntity> organizeEntitiesBind = synThirdInfoService.getOrganizeEntitiesBind(config.getDingDepartment());
- for (String id : ids) {
- if (organizeEntitiesBind.stream()
- .map(SuperBaseEntity.SuperIBaseEntity::getId)
- .collect(Collectors.toList()).contains(id)) {
- userEntity.setOrganizeId(id);
- createUserSysToDing(isBatch, userEntity, accessToken);
- }
- }
- return null;
- }
- /**
- * 往钉钉更新用户
- * 不带第三方错误定位判断的功能代码,只获取调用接口的返回信息 20210604
- *
- * @param isBatch 是否批量(批量不受开关限制)
- * @param userEntity
- * @param accessToken (单条调用时为空)
- * @return
- */
- @Override
- public JSONObject updateUserSysToDing(boolean isBatch, UserEntity userEntity, String accessToken) throws ParseException {
- SocialsSysConfig config = sysconfigService.getSocialsConfig();
- String corpId = config.getDingSynAppKey();
- String corpSecret = config.getDingSynAppSecret();
- // 单条记录执行时,受开关限制
- int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynUser();
- JSONObject tokenObject = new JSONObject();
- String access_token = "";
- JSONObject retMsg = new JSONObject();
- DingTalkUserModel userObjectModel = new DingTalkUserModel();
- SynThirdInfoEntity synThirdInfoEntity = new SynThirdInfoEntity();
- SynThirdInfoEntity entity = new SynThirdInfoEntity();
- String opType = "";
- SynThirdInfoEntity synThirdInfoPara = new SynThirdInfoEntity();
- String thirdObjId = "";
- String thirdName = "";
- Integer synState = 0;
- String description = "";
- String userFlag = "更新:";
- // 返回值初始化
- retMsg.put("code", true);
- retMsg.put("error", userFlag + "系统未设置单条同步");
- // 支持同步
- if (isBatch || dingIsSyn == 1) {
- // 获取 access_token
- if (isBatch) {
- access_token = accessToken;
- } else {
- synThirdInfoService.syncThirdInfoByType(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, SynThirdConsts.THIRD_TYPE_DING);
- synThirdInfoService.syncThirdInfoByType(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, SynThirdConsts.THIRD_TYPE_DING);
- tokenObject = SynDingTalkUtil.getAccessToken(corpId, corpSecret);
- access_token = tokenObject.getString("access_token");
- }
- // 获取同步表信息
- synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, userEntity.getId());
- if (access_token != null && !access_token.isEmpty()) {
- // 要同步到企业微信的对象赋值
- retMsg = setDingUserObject(userEntity);
- if (retMsg.getBoolean("code")) {
- // 判断当前用户对应的第三方的合法性
- userObjectModel = retMsg.getObject("dingUserObject", DingTalkUserModel.class);
- retMsg = checkUserSysToDing(synThirdInfoEntity);
- if (!retMsg.getBoolean("code")) {
- if ("3".equals(retMsg.getString("flag")) || "1".equals(retMsg.getString("flag"))) {
- // flag:3 未同步,需要创建同步到企业微信、写入同步表
- // flag:1 已同步
- if ("1".equals(retMsg.getString("flag"))) {
- opType = SynThirdConsts.OBJECT_OP_UPD;
- } else {
- opType = SynThirdConsts.OBJECT_OP_ADD;
- }
- synThirdInfoPara = null;
- thirdObjId = "";
- // 往企业微信写入成员
- retMsg = SynDingTalkUtil.createUser(userObjectModel, access_token);
- if (retMsg.getBoolean("code")) {
- // 同步成功
- thirdObjId = userEntity.getId();
- thirdName = userEntity.getRealName();
- synState = SynThirdConsts.SYN_STATE_OK;
- description = "更新成功";
- } else {
- // 同步失败
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = userFlag + retMsg.getString("error");
- }
- }
- if ("2".equals(retMsg.getString("flag"))) {
- // 已同步但第三方ID为空,需要创建同步到企业微信、修改同步表
- opType = SynThirdConsts.OBJECT_OP_UPD;
- synThirdInfoPara = synThirdInfoEntity;
- thirdObjId = "";
- // 往钉钉写入成员
- retMsg = SynDingTalkUtil.updateUser(userObjectModel, access_token);
- if (retMsg.getBoolean("code")) {
- // 同步成功
- thirdName = userEntity.getRealName();
- synState = SynThirdConsts.SYN_STATE_OK;
- description = "更新成功";
- } else {
- // 同步失败
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = userFlag + retMsg.getString("error");
- }
- }
- } else {
- // 更新同步表
- opType = SynThirdConsts.OBJECT_OP_UPD;
- synThirdInfoPara = synThirdInfoEntity;
- thirdObjId = synThirdInfoEntity.getThirdObjId();
- thirdName = synThirdInfoEntity.getThirdName();
- // 往企业微信更新成员信息
- userObjectModel.setUserid(synThirdInfoEntity.getThirdObjId());
- retMsg = SynDingTalkUtil.updateUser(userObjectModel, access_token);
- if (retMsg.getBoolean("code")) {
- // 同步成功
- synState = SynThirdConsts.SYN_STATE_OK;
- description = "更新成功";
- } else {
- // 同步失败
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = userFlag + retMsg.getString("error");
- }
- }
- } else {
- // 同步失败,原因:用户所属部门找不到相应的企业微信ID、邮箱格式不合法
- if (synThirdInfoEntity != null) {
- // 修改同步表
- opType = SynThirdConsts.OBJECT_OP_UPD;
- synThirdInfoPara = synThirdInfoEntity;
- thirdObjId = synThirdInfoEntity.getThirdObjId();
- thirdName = userEntity.getRealName();
- } else {
- // 写入同步表
- opType = SynThirdConsts.OBJECT_OP_ADD;
- synThirdInfoPara = null;
- thirdObjId = "";
- }
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = userFlag + retMsg.getString("error");
- retMsg.put("code", false);
- retMsg.put("error", description);
- }
- } else {
- // 同步失败
- if (synThirdInfoEntity != null) {
- // 修改同步表
- opType = SynThirdConsts.OBJECT_OP_UPD;
- synThirdInfoPara = synThirdInfoEntity;
- thirdObjId = synThirdInfoEntity.getThirdObjId();
- thirdName = synThirdInfoEntity.getThirdName();
- } else {
- // 写入同步表
- opType = SynThirdConsts.OBJECT_OP_ADD;
- synThirdInfoPara = null;
- thirdObjId = "";
- }
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = userFlag + "access_token值为空,不能同步信息";
- retMsg.put("code", true);
- retMsg.put("error", description);
- }
- } else {
- // 未设置单条同步,归并到未同步状态
- // 获取同步表信息
- synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, userEntity.getId());
- if (synThirdInfoEntity != null) {
- // 修改同步表
- opType = SynThirdConsts.OBJECT_OP_UPD;
- synThirdInfoPara = synThirdInfoEntity;
- thirdObjId = synThirdInfoEntity.getThirdObjId();
- thirdName = synThirdInfoEntity.getThirdName();
- } else {
- // 写入同步表
- opType = SynThirdConsts.OBJECT_OP_ADD;
- synThirdInfoPara = null;
- thirdObjId = "";
- }
- synState = SynThirdConsts.SYN_STATE_NO;
- description = userFlag + "系统未设置单条同步";
- retMsg.put("code", true);
- retMsg.put("error", description);
- return retMsg;
- }
- // 更新同步表
- saveSynThirdInfoEntity(opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), userEntity.getId(), thirdObjId, thirdName, synState, description);
- return retMsg;
- }
- @Override
- public JSONObject updateUserSysToDing(boolean isBatch, UserEntity userEntity, String accessToken, Integer single) throws ParseException {
- SocialsSysConfig config = sysconfigService.getSocialsConfig();
- String qyhDepartment = config.getDingDepartment();
- List<OrganizeEntity> organizeEntitiesBind = synThirdInfoService.getOrganizeEntitiesBind(qyhDepartment);
- List<UserRelationEntity> listByUserId = userRelationService.getListByUserId(userEntity.getId(), PermissionConst.ORGANIZE);
- List<UserRelationEntity> relationEntities = listByUserId.stream()
- .filter(t -> organizeEntitiesBind.stream()
- .map(SuperBaseEntity.SuperIBaseEntity::getId)
- .collect(Collectors.toList()).contains(t.getObjectId()))
- .collect(Collectors.toList());
- if (CollectionUtil.isEmpty(relationEntities)) {
- return new JSONObject();
- }
- return updateUserSysToDing(isBatch, userEntity, accessToken);
- }
- /**
- * 往钉钉删除用户
- * 不带第三方错误定位判断的功能代码,只获取调用接口的返回信息 20210604
- *
- * @param isBatch 是否批量(批量不受开关限制)
- * @param id 本系统的公司或部门ID
- * @param accessToken (单条调用时为空)
- * @return
- */
- @Override
- public JSONObject deleteUserSysToDing(boolean isBatch, String id, String accessToken) {
- SocialsSysConfig config = sysconfigService.getSocialsConfig();
- String corpId = config.getDingSynAppKey();
- String corpSecret = config.getDingSynAppSecret();
- // 单条记录执行时,受开关限制
- int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynUser();
- JSONObject tokenObject = new JSONObject();
- String access_token = "";
- JSONObject retMsg = new JSONObject();
- SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, id);
- // 返回值初始化
- retMsg.put("code", true);
- retMsg.put("error", "系统未设置单条同步");
- // 支持同步
- if (synThirdInfoEntity != null) {
- if (isBatch || dingIsSyn == 1) {
- // 获取 access_token
- if (isBatch) {
- access_token = accessToken;
- } else {
- List<SynThirdInfoEntity> synThirdInfoList = synThirdInfoService.syncThirdInfoByType(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, SynThirdConsts.THIRD_TYPE_DING);
- tokenObject = SynDingTalkUtil.getAccessToken(corpId, corpSecret);
- access_token = tokenObject.getString("access_token");
- }
- if (access_token != null && !"".equals(access_token)) {
- // 删除企业对应的用户
- if (!"".equals(String.valueOf(synThirdInfoEntity.getThirdObjId())) && !"null".equals(String.valueOf(synThirdInfoEntity.getThirdObjId()))) {
- retMsg = SynDingTalkUtil.deleteUser(synThirdInfoEntity.getThirdObjId(), access_token);
- if (retMsg.getBoolean("code")) {
- // 同步成功,直接删除同步表记录
- synThirdInfoService.delete(synThirdInfoEntity);
- } else {
- // 同步失败
- saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_FAIL, retMsg.getString("error"), "", "");
- }
- } else {
- // 根据企业微信ID找不到相应的信息,直接删除同步表记录
- synThirdInfoService.delete(synThirdInfoEntity);
- }
- } else {
- // 同步失败
- saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_FAIL, "access_token值为空,不能同步信息", "", "");
- retMsg.put("code", false);
- retMsg.put("error", "access_token值为空,不能同步信息!");
- }
- } else {
- // 未设置单条同步,归并到未同步状态
- // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_NO, "系统未设置同步", "", "");
- retMsg.put("code", true);
- retMsg.put("error", "系统未设置单条同步");
- }
- }
- return retMsg;
- }
- @Override
- public JSONObject deleteUserSysToDing(boolean isBatch, List<String> ids, String accessToken, String positionId) throws ParseException {
- for (String id : ids) {
- deleteUserSysToDing(isBatch, id, accessToken);
- }
- return new JSONObject();
- }
- @Override
- public JSONObject deleteUserSysToDing(boolean isBatch, UserEntity userEntity, String accessToken, List<String> ids) throws ParseException {
- deleteUserSysToDing(isBatch, userEntity.getId(), accessToken);
- return new JSONObject();
- }
- //------------------------------------钉钉同步用户到本系统20220331-------------------------------------
- /**
- * 钉钉往本地创建用户
- * 不带第三方错误定位判断的功能代码,只获取调用接口的返回信息 20220331
- *
- * @param isBatch 是否批量(批量不受开关限制)
- * @param accessToken (单条调用时为空)
- */
- @Override
- public JSONObject createUserDingToSys(boolean isBatch, OapiV2UserListResponse.ListUserResponse dingUserModel, String accessToken) throws Exception {
- List<Long> deptIdList = dingUserModel.getDeptIdList();
- String dingUserId = dingUserModel.getUserid();
- String dingUserName = dingUserModel.getName();
- String dingMobile = dingUserModel.getMobile();
- String dingTelephone = dingUserModel.getTelephone();
- // 工号不唯一的情况,不能用于做本系统的账号
- String dingJobNumber = dingUserModel.getJobNumber();
- // 职位:是字符串,手入的
- String title = dingUserModel.getTitle();
- String sysObjId = "";
- SocialsSysConfig config = sysconfigService.getSocialsConfig();
- // 单条记录执行时,受开关限制
- int dingIsSyn = config.getDingSynIsSynUser();
- JSONObject retMsg = new JSONObject();
- int synState = 0;
- String description = "";
- String userFlag = "创建:";
- UserEntity userEntity = new UserEntity();
- String tag = SynThirdConsts.OBJECT_OP_ADD;
- if (isBatch || dingIsSyn == 1) {
- // 检测账户唯一
- UserEntity userAccount = userService.getUserByMobile(dingMobile);
- if (userAccount != null) {
- // 查询用户id在不在同步表
- sysObjId = userAccount.getId();
- boolean hasExist = synThirdInfoService.getBySysObjId(sysObjId, SynThirdConsts.THIRD_TYPE_DING);
- if (hasExist) {
- // 说明创建过了,直接跳过
- tag = SynThirdConsts.OBJECT_OP_UPD;
- synState = 1;
- description = "创建过,更新对象";
- return retMsg;
- } else {
- retMsg.put("code", true);
- description = "账户名重复:线上手机账号" + dingMobile + "自动合并为本地账号";
- //绑定关系
- userRelationService.syncDingUserRelation(sysObjId, deptIdList, SynThirdConsts.THIRD_TYPE_DING);
- synState = SynThirdConsts.SYN_STATE_OK;
- retMsg.put("msg", description);
- }
- } else {
- // 判断中间表用户组织是否存在
- List<String> deptIdStrList = deptIdList.stream().map(t -> t + "").collect(Collectors.toList());
- QueryWrapper<SynThirdInfoEntity> wrapper = new QueryWrapper<>();
- wrapper.lambda().in(SynThirdInfoEntity::getThirdObjId, deptIdStrList);
- wrapper.lambda().eq(SynThirdInfoEntity::getThirdType, SynThirdConsts.THIRD_TYPE_DING);
- List<SynThirdInfoEntity> synThirdInfoEntities = synThirdInfoService.getBaseMapper().selectList(wrapper);
- if (synThirdInfoEntities != null && !synThirdInfoEntities.isEmpty()) {
- // 返回值初始化
- retMsg.put("code", true);
- retMsg.put("error", userFlag + "系统未设置单条同步");
- userEntity.setId(RandomUtil.uuId());
- userEntity.setHeadIcon("001.png");
- userEntity.setAccount(dingMobile);
- userEntity.setEmail(dingUserModel.getEmail());
- userEntity.setCertificatesNumber(dingUserModel.getJobNumber());
- userEntity.setMobilePhone(dingMobile);
- // userEntity.setGender(2);
- userEntity.setRealName(dingUserName);
- userEntity.setEnabledMark(1);
- if (StringUtil.isBlank(userEntity.getOrganizeId())) {
- String orgId = synThirdInfoService.getSysByThird(String.valueOf(deptIdList.get(0)));
- userEntity.setOrganizeId(orgId);
- }
- sysObjId = userEntity.getId();
- List<String> orgIdList = new ArrayList<>();
- List<String> posIdList = new ArrayList<>();
- for (String deptIdStr : deptIdStrList) {
- String orgId = synThirdInfoService.getSysByThird(deptIdStr);
- orgIdList.add(orgId);
- List<String> ids = new ArrayList<>();
- List<PositionEntity> listByOrganizeId = positionService.getListByOrganizeId(ids, true);
- List<PositionEntity> positionEntityList = listByOrganizeId.stream()
- .filter(t -> t.getDefaultMark().equals(1))
- .collect(Collectors.toList());
- if (CollectionUtil.isNotEmpty(positionEntityList)) {
- posIdList.add(positionEntityList.get(0).getId());
- }
- }
- userEntity.setPositionId(String.join(",", posIdList));
- userEntity.setOrganizeId(String.join(",", orgIdList));
- userService.create(userEntity);
- //绑定关系
- userRelationService.syncDingUserRelation(sysObjId, deptIdList, SynThirdConsts.THIRD_TYPE_DING);
- // 往同步写入本系统与第三方的对应信息
- if (retMsg.getBoolean("code")) {
- // 同步成功
- synState = SynThirdConsts.SYN_STATE_OK;
- } else {
- // 同步失败
- synState = SynThirdConsts.SYN_STATE_FAIL;
- description = userFlag + retMsg.getString("error");
- }
- } else {
- // 无须同步,未同步状态
- synState = SynThirdConsts.SYN_STATE_NO;
- description = userFlag + "用户未同步组织信息";
- retMsg.put("code", false);
- retMsg.put("error", description);
- }
- }
- } else {
- // 无须同步,未同步状态
- synState = SynThirdConsts.SYN_STATE_NO;
- description = userFlag + "系统未设置单条同步";
- retMsg.put("code", true);
- retMsg.put("error", description);
- }
- // 更新同步表
- saveSynThirdInfoEntity(tag, new SynThirdInfoEntity(), Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), sysObjId, dingUserId, synState, description
- , dingUserName, dingUserId);
- return retMsg;
- }
- @Override
- public JSONObject updateUserDingToSystem(boolean isBatch, OapiV2UserListResponse.ListUserResponse dingUserModel)
- throws Exception {
- SocialsSysConfig config = sysconfigService.getSocialsConfig();
- JSONObject retMsg = new JSONObject();
- SynThirdInfoEntity synThirdInfoEntity = new SynThirdInfoEntity();
- String opType = "";
- String thirdObjId = "";
- Integer synState = 0;
- String description = "";
- String userFlag = "更新:";
- // 赋值第三方id
- thirdObjId = dingUserModel.getUserid();
- // 返回值初始化
- retMsg.put("code", true);
- retMsg.put("error", userFlag + "系统未设置单条同步");
- // 单条记录执行时,受开关限制
- int dingIsSyn = config.getDingSynIsSynUser();
- // 支持同步
- if (isBatch || dingIsSyn == 1) {
- // 获取同步表信息
- /**
- * 获取指定第三方工具、指定数据类型、本地对象ID的同步信息
- * // 获取方式如果第三方用户id和第三方组织id会一致则须修改
- * thirdType 22 钉钉
- * dataType 2 用户
- * thirdId 第三方id
- */
- synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING,
- SynThirdConsts.DATA_TYPE_USER, thirdObjId);
- if (synThirdInfoEntity != null && StringUtil.isNoneBlank(synThirdInfoEntity.getSysObjId())) {
- opType = SynThirdConsts.OBJECT_OP_UPD;
- String sysObjId = synThirdInfoEntity.getSysObjId();
- UserEntity info = userService.getInfo(sysObjId);
- if (info == null) {
- synState = SynThirdConsts.SYN_STATE_NO;
- description = "本地更新记录未找到";
- retMsg.put("code", false);
- retMsg.put("error", description);
- synThirdInfoService.removeById(synThirdInfoEntity.getId());
- } else {
- String dingUserName = dingUserModel.getName();
- String dingUserId = dingUserModel.getUserid();
- String dingMobile = dingUserModel.getMobile();
- // 更新系统用户表
- List<Long> deptIdList = dingUserModel.getDeptIdList();
- List<String> deptIdStrList = deptIdList.stream().map(t -> t + "").collect(Collectors.toList());
- info.setMobilePhone(dingMobile);
- info.setAccount(dingMobile);
- info.setRealName(dingUserName);
- List<String> orgIdList = new ArrayList<>();
- List<String> posIdList = new ArrayList<>();
- for (String deptIdStr : deptIdStrList) {
- String orgId = synThirdInfoService.getSysByThird(deptIdStr);
- orgIdList.add(orgId);
- List<String> ids = new ArrayList<>();
- List<PositionEntity> listByOrganizeId = positionService.getListByOrganizeId(ids, true);
- List<PositionEntity> positionEntityList = listByOrganizeId.stream()
- .filter(t -> t.getDefaultMark().equals(1))
- .collect(Collectors.toList());
- if (CollectionUtil.isNotEmpty(positionEntityList)) {
- posIdList.add(positionEntityList.get(0).getId());
- }
- }
- info.setPositionId(String.join(",", posIdList));
- info.setOrganizeId(String.join(",", orgIdList));
- userService.update(info.getId(), info);
- // 检测是否未同步用户组织关联
- userRelationService.syncDingUserRelation(info.getId(), deptIdList, SynThirdConsts.THIRD_TYPE_DING);
- synState = 1;
- // 更新同步表记录
- description = "账号同步更新完成";
- saveSynThirdInfoEntity(opType, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), synThirdInfoEntity.getSysObjId()
- , thirdObjId, synState, description, dingUserName, dingUserId);
- }
- } else {
- if ((synThirdInfoEntity != null && StringUtil.isBlank(synThirdInfoEntity.getSysObjId()))) {
- // 删除记录
- synThirdInfoService.removeById(synThirdInfoEntity.getId());
- }
- opType = SynThirdConsts.OBJECT_OP_ADD;
- thirdObjId = synThirdInfoEntity.getThirdObjId();
- try {
- this.createUserDingToSys(true, dingUserModel, null);
- } catch (ParseException e) {
- e.printStackTrace();
- }
- }
- } else {
- // 未设置单条同步,归并到未同步状态
- synState = SynThirdConsts.SYN_STATE_NO;
- description = userFlag + "系统未设置单条同步";
- retMsg.put("code", true);
- retMsg.put("error", description);
- }
- return retMsg;
- }
- /**
- * 本地删除用户、中间表
- * 不带第三方错误定位判断的功能代码,只获取调用接口的返回信息 20220331
- *
- * @param isBatch 是否批量(批量不受开关限制)
- * @param thirdObjId 钉钉的用户ID
- * @return
- */
- @Override
- public JSONObject deleteUserDingToSys(boolean isBatch, String thirdObjId) throws Exception {
- SocialsSysConfig config = sysconfigService.getSocialsConfig();
- // 单条记录执行时,受开关限制
- int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynUser();
- JSONObject retMsg = new JSONObject();
- SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, thirdObjId);
- String sysObjId = "";
- // 返回值初始化
- retMsg.put("code", true);
- retMsg.put("error", "系统未设置单条同步");
- // 支持同步
- if (synThirdInfoEntity != null) {
- sysObjId = synThirdInfoEntity.getSysObjId();
- if (isBatch || dingIsSyn == 1) {
- // 删除企业对应的用户
- if (!"".equals(String.valueOf(sysObjId)) && !"null".equals(String.valueOf(sysObjId))) {
- // 获取用户信息
- UserEntity userEntity = userService.getInfo(sysObjId);
- if (userEntity != null) {
- // 删除用户,更新为标记为不可登录
- // 禁用登录
- userEntity.setEnabledMark(0);
- userEntity.setDescription("由于钉钉系统删除了该用户");
- userService.update(userEntity.getId(), userEntity);
- // 同步成功,直接删除同步表记录
- synThirdInfoService.delete(synThirdInfoEntity);
- } else {
- // 同步失败
- saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), sysObjId, thirdObjId
- , SynThirdConsts.SYN_STATE_FAIL, retMsg.getString("error"), "", "");
- }
- } else {
- // 根据企业微信ID找不到相应的信息,直接删除同步表记录
- synThirdInfoService.delete(synThirdInfoEntity);
- }
- } else {
- // 未设置单条同步,归并到未同步状态
- saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
- Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), sysObjId, thirdObjId
- , SynThirdConsts.SYN_STATE_NO, "系统未设置同步", "", "");
- retMsg.put("code", true);
- retMsg.put("error", "系统未设置单条同步");
- }
- }
- return retMsg;
- }
- }
|