SynThirdDingTalkServiceImpl.java 96 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029
  1. package jnpf.message.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.collection.CollectionUtil;
  4. import cn.hutool.core.util.ObjectUtil;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  7. import com.dingtalk.api.response.OapiV2UserListResponse;
  8. import jnpf.base.UserInfo;
  9. import jnpf.base.entity.SuperBaseEntity;
  10. import jnpf.base.service.SysconfigService;
  11. import jnpf.base.util.SynDingTalkUtil;
  12. import jnpf.constant.JnpfConst;
  13. import jnpf.constant.PermissionConst;
  14. import jnpf.emnus.OrgTypeEnum;
  15. import jnpf.message.entity.SynThirdInfoEntity;
  16. import jnpf.message.model.message.DingTalkDeptModel;
  17. import jnpf.message.model.message.DingTalkUserModel;
  18. import jnpf.message.service.SynThirdDingTalkService;
  19. import jnpf.message.service.SynThirdInfoService;
  20. import jnpf.message.util.SynThirdConsts;
  21. import jnpf.model.SocialsSysConfig;
  22. import jnpf.permission.entity.OrganizeEntity;
  23. import jnpf.permission.entity.PositionEntity;
  24. import jnpf.permission.entity.UserEntity;
  25. import jnpf.permission.entity.UserRelationEntity;
  26. import jnpf.permission.model.position.PaginationPosition;
  27. import jnpf.permission.service.OrganizeService;
  28. import jnpf.permission.service.PositionService;
  29. import jnpf.permission.service.UserRelationService;
  30. import jnpf.permission.service.UserService;
  31. import jnpf.util.*;
  32. import org.springframework.beans.factory.annotation.Autowired;
  33. import org.springframework.stereotype.Component;
  34. import org.springframework.util.Assert;
  35. import java.text.DateFormat;
  36. import java.text.ParseException;
  37. import java.text.SimpleDateFormat;
  38. import java.util.ArrayList;
  39. import java.util.Date;
  40. import java.util.List;
  41. import java.util.TimeZone;
  42. import java.util.stream.Collectors;
  43. /**
  44. * 本系统的公司-部门-用户同步到钉钉的功能代码
  45. *
  46. * @版本: V3.1.0
  47. * @版权: 引迈信息技术有限公司(https://www.jnpfsoft.com)
  48. * @作者: JNPF开发平台组
  49. * @日期: 2021/5/7 8:42
  50. */
  51. @Component
  52. public class SynThirdDingTalkServiceImpl implements SynThirdDingTalkService {
  53. @Autowired
  54. private PositionService positionService;
  55. @Autowired
  56. private SynThirdInfoService synThirdInfoService;
  57. @Autowired
  58. private OrganizeService organizeService;
  59. @Autowired
  60. private UserService userService;
  61. @Autowired
  62. private UserRelationService userRelationService;
  63. @Autowired
  64. private SysconfigService sysconfigService;
  65. //------------------------------------本系统同步公司、部门到钉钉-------------------------------------
  66. /**
  67. * 根据部门的同步表信息判断同步情况
  68. * 不带错第三方误定位判断的功能代码,只获取调用接口的返回信息 20210604
  69. *
  70. * @param synThirdInfoEntity
  71. * @return
  72. */
  73. public JSONObject checkDepartmentSysToDing(SynThirdInfoEntity synThirdInfoEntity) {
  74. JSONObject retMsg = new JSONObject();
  75. retMsg.put("code", true);
  76. retMsg.put("flag", "");
  77. retMsg.put("error", "");
  78. if (synThirdInfoEntity != null) {
  79. if ("".equals(String.valueOf(synThirdInfoEntity.getThirdObjId())) || "null".equals(String.valueOf(synThirdInfoEntity.getThirdObjId()))) {
  80. // 同步表的钉钉ID为空
  81. retMsg.put("code", false);
  82. retMsg.put("flag", "2");
  83. retMsg.put("error", "同步表中部门对应的钉钉ID为空!");
  84. }
  85. } else {
  86. // 上级部门未同步
  87. retMsg.put("code", false);
  88. retMsg.put("flag", "3");
  89. retMsg.put("error", "部门未同步到钉钉!");
  90. }
  91. return retMsg;
  92. }
  93. public JSONObject checkDepartmentSysToDing2(List<String> objectIdList) {
  94. JSONObject retMsg = new JSONObject();
  95. List<String> thirdIdList = new ArrayList<>();
  96. retMsg.put("code", true);
  97. retMsg.put("error", "");
  98. for (int i = 0; i < objectIdList.size(); i++) {
  99. SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, objectIdList.get(i));
  100. if (synThirdInfoEntity != null) {
  101. if ("".equals(String.valueOf(synThirdInfoEntity.getThirdObjId())) || "null".equals(String.valueOf(synThirdInfoEntity.getThirdObjId()))) {
  102. // 同步表的钉钉ID为空
  103. retMsg.put("code", true);
  104. retMsg.put("flag", "2");
  105. retMsg.put("error", "同步表中部门对应的钉钉ID为空!");
  106. thirdIdList.add(synThirdInfoEntity.getThirdObjId());
  107. } else {
  108. retMsg.put("code", true);
  109. retMsg.put("flag", "1");
  110. thirdIdList.add(synThirdInfoEntity.getThirdObjId());
  111. }
  112. } else {
  113. if (i == objectIdList.size() - 1) {
  114. boolean b = (boolean) retMsg.get("code");
  115. if (!b) {
  116. // 上级部门未同步
  117. retMsg.put("code", false);
  118. retMsg.put("flag", "3");
  119. retMsg.put("error", "部门未同步到钉钉!");
  120. }
  121. }
  122. }
  123. }
  124. retMsg.put("flag", String.join(",", thirdIdList));
  125. return retMsg;
  126. }
  127. /**
  128. * 检查部门名称不能含有特殊字符
  129. *
  130. * @param deptName
  131. * @param opType
  132. * @param synThirdInfoEntity
  133. * @param thirdType
  134. * @param dataType
  135. * @param sysObjId
  136. * @param thirdObjId
  137. * @param deptFlag
  138. * @return
  139. */
  140. public JSONObject checkDeptName(String deptName, String opType, SynThirdInfoEntity synThirdInfoEntity, Integer thirdType,
  141. Integer dataType, String sysObjId, String thirdObjId, String deptFlag) {
  142. JSONObject retMsg = new JSONObject();
  143. retMsg.put("code", true);
  144. retMsg.put("error", "");
  145. if (deptName.indexOf("-") > -1 || deptName.indexOf(",") > -1 || deptName.indexOf(",") > -1) {
  146. // 同步失败
  147. Integer synState = SynThirdConsts.SYN_STATE_FAIL;
  148. String description = deptFlag + "部门名称不能含有,、,、-三种特殊字符";
  149. // 更新同步表
  150. saveSynThirdInfoEntity(opType, synThirdInfoEntity, thirdType, dataType, sysObjId, thirdObjId, deptName, synState, description);
  151. retMsg.put("code", false);
  152. retMsg.put("error", description);
  153. }
  154. return retMsg;
  155. }
  156. public void saveSynThirdInfoEntity(String opType, SynThirdInfoEntity synThirdInfoEntity, Integer thirdType,
  157. Integer dataType, String sysObjId, String thirdObjId, Integer synState,
  158. String description, String thirdInfoName, String thirdInfoId) {
  159. synThirdInfoEntity.setThirdObjId(thirdInfoId);
  160. synThirdInfoEntity.setThirdType(thirdType);
  161. synThirdInfoEntity.setDataType(dataType);
  162. synThirdInfoEntity.setSysObjId(sysObjId);
  163. synThirdInfoEntity.setThirdName(thirdInfoName);
  164. synThirdInfoEntity.setDescription(description);
  165. synThirdInfoEntity.setEnabledMark(synState);
  166. synThirdInfoEntity.setLastModifyTime(new Date());
  167. if (opType.equals("upd")) {
  168. SynThirdInfoEntity infoBySysObjId = synThirdInfoService.getInfoBySysObjId(thirdType + "", dataType + "", sysObjId);
  169. if (BeanUtil.isNotEmpty(infoBySysObjId)) {
  170. BeanUtil.copyProperties(synThirdInfoEntity, infoBySysObjId);
  171. synThirdInfoService.updateById(infoBySysObjId);
  172. }
  173. } else {
  174. synThirdInfoService.save(synThirdInfoEntity);
  175. }
  176. }
  177. /**
  178. * 将组织、用户的信息写入同步表
  179. *
  180. * @param opType "add":创建 “upd”:修改
  181. * @param synThirdInfoEntity 本地同步表信息
  182. * @param thirdType 第三方类型
  183. * @param dataType 数据类型
  184. * @param sysObjId 本地对象ID
  185. * @param thirdObjId 第三方对象ID
  186. * @param synState 同步状态(0:未同步;1:同步成功;2:同步失败)
  187. * @param description
  188. */
  189. public void saveSynThirdInfoEntity(String opType, SynThirdInfoEntity synThirdInfoEntity, Integer thirdType,
  190. Integer dataType, String sysObjId, String thirdObjId, String thirdName, Integer synState,
  191. String description) {
  192. UserInfo userInfo = UserProvider.getUser();
  193. SynThirdInfoEntity entity = new SynThirdInfoEntity();
  194. String compValue = SynThirdConsts.OBJECT_OP_ADD;
  195. if (compValue.equals(opType)) {
  196. entity.setId(RandomUtil.uuId());
  197. entity.setThirdType(thirdType);
  198. entity.setDataType(dataType);
  199. entity.setSysObjId(sysObjId);
  200. entity.setThirdObjId(thirdObjId);
  201. entity.setThirdName(thirdName);
  202. entity.setEnabledMark(synState);
  203. // 备注当作同步失败信息来用
  204. entity.setDescription(description);
  205. entity.setCreatorUserId(userInfo.getUserId());
  206. entity.setCreatorTime(DateUtil.getNowDate());
  207. entity.setLastModifyUserId(userInfo.getUserId());
  208. // 修改时间当作最后同步时间来用
  209. entity.setLastModifyTime(DateUtil.getNowDate());
  210. synThirdInfoService.create(entity);
  211. } else {
  212. entity = synThirdInfoEntity;
  213. entity.setThirdType(thirdType);
  214. entity.setDataType(dataType);
  215. entity.setThirdObjId(thirdObjId);
  216. entity.setThirdName(thirdName);
  217. entity.setEnabledMark(synState);
  218. // 备注当作同步失败信息来用
  219. entity.setDescription(description);
  220. entity.setLastModifyUserId(userInfo.getUserId());
  221. // 修改时间当作最后同步时间来用
  222. entity.setLastModifyTime(DateUtil.getNowDate());
  223. synThirdInfoService.update(entity.getId(), entity);
  224. }
  225. }
  226. /**
  227. * 往钉钉创建组织-部门
  228. * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604
  229. *
  230. * @param isBatch 是否批量(批量不受开关限制)
  231. * @param deptEntity
  232. * @param accessToken (单条调用时为空)
  233. * @return
  234. */
  235. @Override
  236. public JSONObject createDepartmentSysToDing(boolean isBatch, OrganizeEntity deptEntity, String accessToken) {
  237. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  238. int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynOrg();
  239. String corpId = config.getDingSynAppKey();
  240. String corpSecret = config.getDingSynAppSecret();
  241. // 单条记录执行时,受开关限制
  242. JSONObject tokenObject = new JSONObject();
  243. String access_token = "";
  244. JSONObject retMsg = new JSONObject();
  245. DingTalkDeptModel deptModel = new DingTalkDeptModel();
  246. String thirdObjId = "";
  247. String thirdName = deptEntity.getFullName();
  248. Integer synState = 0;
  249. String description = "";
  250. boolean isDeptDiff = true;
  251. String deptFlag = "创建:";
  252. // 返回值初始化
  253. retMsg.put("code", true);
  254. retMsg.put("error", "创建:系统未设置单条同步");
  255. // 支持同步
  256. if (isBatch || dingIsSyn == 1) {
  257. // 获取 access_token 值
  258. if (isBatch) {
  259. access_token = accessToken;
  260. } else {
  261. List<SynThirdInfoEntity> synThirdInfoList = synThirdInfoService.syncThirdInfoByType(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, SynThirdConsts.THIRD_TYPE_DING);
  262. tokenObject = SynDingTalkUtil.getAccessToken(corpId, corpSecret);
  263. access_token = tokenObject.getString("access_token");
  264. }
  265. if (access_token != null && !access_token.isEmpty()) {
  266. deptModel.setDeptId(null);
  267. deptModel.setName(deptEntity.getFullName());
  268. // 从本地数据库的同步表获取对应的钉钉ID,为空报异常,不为空再验证所获取接口部门列表是否当前ID 未处理
  269. if ("-1".equals(deptEntity.getParentId())) {
  270. //顶级节点时,钉钉的父节点设置为1
  271. deptModel.setParentId(SynThirdConsts.DING_ROOT_DEPT_ID);
  272. } else {
  273. SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, deptEntity.getParentId());
  274. retMsg = checkDepartmentSysToDing(synThirdInfoEntity);
  275. isDeptDiff = retMsg.getBoolean("code");
  276. if (isDeptDiff) {
  277. deptModel.setParentId(Long.parseLong(synThirdInfoEntity.getThirdObjId()));
  278. }
  279. }
  280. deptModel.setOrder(deptEntity.getSortCode());
  281. deptModel.setCreateDeptGroup(false);
  282. if ("company".equals(deptEntity.getCategory())) {
  283. deptModel.setSourceIdentifier("company");
  284. } else {
  285. deptModel.setSourceIdentifier("department");
  286. }
  287. // 创建时:部门名称不能带有特殊字符
  288. retMsg = checkDeptName(deptEntity.getFullName(), SynThirdConsts.OBJECT_OP_ADD, null,
  289. Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING), Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, deptFlag);
  290. if (!retMsg.getBoolean("code")) {
  291. return retMsg;
  292. }
  293. if (isDeptDiff) {
  294. // 往钉钉写入公司或部门
  295. if (!"-1".equals(deptEntity.getParentId())) {
  296. retMsg = SynDingTalkUtil.createDepartment(deptModel, access_token);
  297. } else {
  298. retMsg.put("code", true);
  299. retMsg.put("error", "顶级不同步,默认值id1");
  300. retMsg.put("retDeptId", "1");
  301. }
  302. // 往同步写入本系统与第三方的对应信息
  303. if (retMsg.getBoolean("code")) {
  304. // 同步成功
  305. thirdObjId = retMsg.getString("retDeptId");
  306. retMsg.put("retDeptId", thirdObjId);
  307. synState = SynThirdConsts.SYN_STATE_OK;
  308. } else {
  309. if (retMsg.getString("error").contains("duplicateDeptId")) {
  310. synState = SynThirdConsts.SYN_STATE_OK;
  311. String[] split = retMsg.getString("error").split("duplicateDeptId");
  312. thirdObjId = split[1].replace("=", "").trim();
  313. description = retMsg.getString("error");
  314. } else {
  315. // 同步失败
  316. synState = SynThirdConsts.SYN_STATE_FAIL;
  317. description = deptFlag + retMsg.getString("error");
  318. }
  319. }
  320. } else {
  321. // 同步失败,上级部门无对应的钉钉ID
  322. synState = SynThirdConsts.SYN_STATE_FAIL;
  323. description = deptFlag + "部门所属的上级部门未同步到钉钉";
  324. retMsg.put("code", false);
  325. retMsg.put("error", description);
  326. retMsg.put("retDeptId", "0");
  327. }
  328. } else {
  329. synState = SynThirdConsts.SYN_STATE_FAIL;
  330. description = deptFlag + "access_token值为空,不能同步信息";
  331. retMsg.put("code", false);
  332. retMsg.put("error", description);
  333. retMsg.put("retDeptId", "0");
  334. }
  335. } else {
  336. description = retMsg.getString("error");
  337. return null;
  338. }
  339. // 更新同步表
  340. saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_ADD, null, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  341. Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, thirdName, synState, description);
  342. return retMsg;
  343. }
  344. /**
  345. * 往钉钉更新组织-部门
  346. * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604
  347. *
  348. * @param isBatch 是否批量(批量不受开关限制)
  349. * @param deptEntity
  350. * @param accessToken (单条调用时为空)
  351. * @return
  352. */
  353. @Override
  354. public JSONObject updateDepartmentSysToDing(boolean isBatch, OrganizeEntity deptEntity, String accessToken) {
  355. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  356. String corpId = config.getDingSynAppKey();
  357. String corpSecret = config.getDingSynAppSecret();
  358. // 单条记录执行时,受开关限制
  359. int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynOrg();
  360. JSONObject tokenObject = new JSONObject();
  361. String access_token = "";
  362. JSONObject retMsg = new JSONObject();
  363. DingTalkDeptModel deptModel = new DingTalkDeptModel();
  364. SynThirdInfoEntity synThirdInfoEntity = new SynThirdInfoEntity();
  365. String opType = "";
  366. Integer synState = 0;
  367. String description = "";
  368. String thirdObjId = "";
  369. String thirdName = deptEntity.getFullName();
  370. SynThirdInfoEntity synThirdInfoPara = new SynThirdInfoEntity();
  371. boolean isDeptDiff = true;
  372. String deptFlag = "更新:";
  373. // 返回值初始化
  374. retMsg.put("code", true);
  375. retMsg.put("error", "系统未设置单条同步");
  376. // 支持同步,设置需要同步到钉钉的对象属性值
  377. if (isBatch || dingIsSyn == 1) {
  378. // 获取 access_token
  379. if (isBatch) {
  380. access_token = accessToken;
  381. } else {
  382. tokenObject = SynDingTalkUtil.getAccessToken(corpId, corpSecret);
  383. access_token = tokenObject.getString("access_token");
  384. }
  385. // 获取同步表信息
  386. synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, deptEntity.getId());
  387. if (access_token != null && !access_token.isEmpty()) {
  388. deptModel.setDeptId(null);
  389. deptModel.setName(deptEntity.getFullName());
  390. // 从本地数据库的同步表获取对应的钉钉ID,为空报异常,不为空再验证所获取接口部门列表是否当前ID 未处理
  391. if ("-1".equals(deptEntity.getParentId())) {
  392. //顶级节点时,钉钉的父节点设置为1
  393. deptModel.setParentId(SynThirdConsts.DING_ROOT_DEPT_ID);
  394. } else {
  395. // 判断上级部门的合法性
  396. synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, deptEntity.getParentId());
  397. retMsg = checkDepartmentSysToDing(synThirdInfoEntity);
  398. isDeptDiff = retMsg.getBoolean("code");
  399. if (isDeptDiff) {
  400. deptModel.setParentId(Long.parseLong(synThirdInfoEntity.getThirdObjId()));
  401. }
  402. }
  403. deptModel.setOrder(deptEntity.getSortCode());
  404. // 上级部门检查是否异常
  405. if (isDeptDiff) {
  406. // 获取同步表信息
  407. synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, deptEntity.getId());
  408. // 判断当前部门对应的第三方的合法性
  409. retMsg = checkDepartmentSysToDing(synThirdInfoEntity);
  410. if (!retMsg.getBoolean("code")) {
  411. if ("3".equals(retMsg.getString("flag")) || "1".equals(retMsg.getString("flag"))) {
  412. // flag:3 未同步,需要创建同步到钉钉、写入同步表
  413. // flag:1 已同步但第三方上没对应的ID,需要删除原来的同步信息,再创建同步到钉钉、写入同步表
  414. if ("1".equals(retMsg.getString("flag"))) {
  415. synThirdInfoService.delete(synThirdInfoEntity);
  416. }
  417. opType = SynThirdConsts.OBJECT_OP_ADD;
  418. synThirdInfoPara = null;
  419. // 创建时:部门名称不能带有特殊字符
  420. retMsg = checkDeptName(deptEntity.getFullName(),
  421. opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  422. Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, deptFlag);
  423. if (!retMsg.getBoolean("code")) {
  424. return retMsg;
  425. }
  426. if ("company".equals(deptEntity.getCategory())) {
  427. deptModel.setSourceIdentifier("company");
  428. } else {
  429. deptModel.setSourceIdentifier("department");
  430. }
  431. // 往钉钉写入公司或部门
  432. if (!"-1".equals(deptEntity.getParentId())) {
  433. retMsg = SynDingTalkUtil.createDepartment(deptModel, access_token);
  434. } else {
  435. retMsg.put("code", true);
  436. retMsg.put("error", "顶级不同步,默认值id1");
  437. retMsg.put("retDeptId", "1");
  438. }
  439. // 往同步写入本系统与第三方的对应信息
  440. if (retMsg.getBoolean("code")) {
  441. // 同步成功
  442. thirdObjId = retMsg.getString("retDeptId");
  443. retMsg.put("retDeptId", thirdObjId);
  444. synState = SynThirdConsts.SYN_STATE_OK;
  445. description = "";
  446. } else {
  447. // 同步失败
  448. synState = SynThirdConsts.SYN_STATE_FAIL;
  449. description = deptFlag + retMsg.getString("error");
  450. }
  451. }
  452. if ("2".equals(retMsg.getString("flag"))) {
  453. // flag:2 已同步但第三方ID为空,需要创建同步到钉钉、修改同步表
  454. opType = SynThirdConsts.OBJECT_OP_UPD;
  455. synThirdInfoPara = synThirdInfoEntity;
  456. thirdObjId = "";
  457. // 创建时:部门名称不能带有特殊字符
  458. retMsg = checkDeptName(deptEntity.getFullName(),
  459. opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  460. Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, deptFlag);
  461. if (!retMsg.getBoolean("code")) {
  462. return retMsg;
  463. }
  464. if ("company".equals(deptEntity.getCategory())) {
  465. deptModel.setSourceIdentifier("company");
  466. } else {
  467. deptModel.setSourceIdentifier("department");
  468. }
  469. // 往钉钉写入公司或部门
  470. if (!"-1".equals(deptEntity.getParentId())) {
  471. retMsg = SynDingTalkUtil.createDepartment(deptModel, access_token);
  472. } else {
  473. retMsg.put("code", true);
  474. retMsg.put("error", "顶级不同步,默认值id1");
  475. retMsg.put("retDeptId", "1");
  476. }
  477. // 往同步表更新本系统与第三方的对应信息
  478. if (retMsg.getBoolean("code")) {
  479. // 同步成功
  480. thirdObjId = retMsg.getString("retDeptId");
  481. retMsg.put("retDeptId", thirdObjId);
  482. synState = SynThirdConsts.SYN_STATE_OK;
  483. description = "";
  484. } else {
  485. // 同步失败
  486. if (retMsg.getString("error").contains("duplicateDeptId")) {
  487. synState = SynThirdConsts.SYN_STATE_OK;
  488. String[] split = retMsg.getString("error").split("duplicateDeptId");
  489. thirdObjId = split[1].replace("=", "").trim();
  490. description = retMsg.getString("error");
  491. } else {
  492. synState = SynThirdConsts.SYN_STATE_FAIL;
  493. description = deptFlag + retMsg.getString("error");
  494. }
  495. }
  496. }
  497. } else {
  498. // 更新同步表
  499. opType = SynThirdConsts.OBJECT_OP_UPD;
  500. synThirdInfoPara = synThirdInfoEntity;
  501. thirdObjId = synThirdInfoEntity.getThirdObjId();
  502. // 部门名称不能带有特殊字符
  503. retMsg = checkDeptName(deptEntity.getFullName(),
  504. opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  505. Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, deptFlag);
  506. if (!retMsg.getBoolean("code")) {
  507. return retMsg;
  508. }
  509. // 往钉钉写入公司或部门
  510. deptModel.setDeptId(Long.parseLong(synThirdInfoEntity.getThirdObjId()));
  511. // 设置部门主管:只有在更新时才可以执行
  512. // 初始化时:组织同步=>用户同步=>组织同步(用来更新部门主管的)
  513. if (StringUtil.isNotEmpty(deptEntity.getManagerId())) {
  514. SynThirdInfoEntity userThirdInfo = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, deptEntity.getManagerId());
  515. if (userThirdInfo != null) {
  516. if (StringUtil.isNotEmpty(userThirdInfo.getThirdObjId())) {
  517. deptModel.setDeptManagerUseridList(userThirdInfo.getThirdObjId());
  518. }
  519. }
  520. }
  521. if (!deptModel.getParentId().equals(Long.valueOf("-1"))) {
  522. retMsg = SynDingTalkUtil.updateDepartment(deptModel, access_token);
  523. }
  524. // 往同步表更新本系统与第三方的对应信息
  525. if (retMsg.getBoolean("code")) {
  526. // 同步成功
  527. synState = SynThirdConsts.SYN_STATE_OK;
  528. description = "更新成功";
  529. } else {
  530. // 同步失败
  531. if (retMsg.getString("error").contains("duplicateDeptId")) {
  532. synState = SynThirdConsts.SYN_STATE_OK;
  533. String[] split = retMsg.getString("error").split("duplicateDeptId");
  534. thirdObjId = split[1].replace("=", "").trim();
  535. } else {
  536. synState = SynThirdConsts.SYN_STATE_FAIL;
  537. description = deptFlag + retMsg.getString("error");
  538. }
  539. }
  540. }
  541. } else {
  542. // 同步失败,上级部门检查有异常
  543. if (synThirdInfoEntity != null) {
  544. // 修改同步表
  545. opType = SynThirdConsts.OBJECT_OP_UPD;
  546. synThirdInfoPara = synThirdInfoEntity;
  547. thirdObjId = synThirdInfoEntity.getThirdObjId();
  548. } else {
  549. // 写入同步表
  550. opType = SynThirdConsts.OBJECT_OP_ADD;
  551. synThirdInfoPara = null;
  552. thirdObjId = "";
  553. }
  554. synState = SynThirdConsts.SYN_STATE_FAIL;
  555. description = deptFlag + "上级部门无对应的钉钉ID";
  556. retMsg.put("code", false);
  557. retMsg.put("error", description);
  558. }
  559. } else {
  560. // 同步失败
  561. if (synThirdInfoEntity != null) {
  562. // 修改同步表
  563. opType = SynThirdConsts.OBJECT_OP_UPD;
  564. synThirdInfoPara = synThirdInfoEntity;
  565. thirdObjId = synThirdInfoEntity.getThirdObjId();
  566. } else {
  567. // 写入同步表
  568. opType = SynThirdConsts.OBJECT_OP_ADD;
  569. synThirdInfoPara = null;
  570. thirdObjId = "";
  571. }
  572. synState = SynThirdConsts.SYN_STATE_FAIL;
  573. description = deptFlag + "access_token值为空,不能同步信息";
  574. retMsg.put("code", true);
  575. retMsg.put("error", description);
  576. }
  577. } else {
  578. // 未设置单条同步,归并到未同步状态
  579. // 获取同步表信息
  580. synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, deptEntity.getId());
  581. if (ObjectUtil.isNotNull(synThirdInfoEntity)) {
  582. // 修改同步表
  583. opType = SynThirdConsts.OBJECT_OP_UPD;
  584. synThirdInfoPara = synThirdInfoEntity;
  585. thirdObjId = synThirdInfoEntity.getThirdObjId();
  586. thirdName = synThirdInfoEntity.getThirdName();
  587. } else {
  588. // 写入同步表
  589. opType = SynThirdConsts.OBJECT_OP_ADD;
  590. synThirdInfoPara = null;
  591. thirdObjId = "";
  592. }
  593. synState = SynThirdConsts.SYN_STATE_NO;
  594. description = deptFlag + "系统未设置单条同步";
  595. retMsg.put("code", true);
  596. retMsg.put("error", description);
  597. return retMsg;
  598. }
  599. // 更新同步表
  600. saveSynThirdInfoEntity(opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  601. Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), deptEntity.getId(), thirdObjId, thirdName, synState, description);
  602. return retMsg;
  603. }
  604. @Override
  605. public JSONObject unifyDepartmentSysToDing(boolean isBatch, OrganizeEntity deptEntity, String accessToken, String choice) {
  606. SocialsSysConfig socialsConfig = sysconfigService.getSocialsConfig();
  607. String dingDepartment = socialsConfig.getDingDepartment();
  608. if (StringUtil.isEmpty(dingDepartment)) {
  609. return null;
  610. }
  611. List<OrganizeEntity> organizeEntitiesBind = synThirdInfoService
  612. .getOrganizeEntitiesBind(dingDepartment);
  613. if (CollectionUtil.isEmpty(organizeEntitiesBind) || !organizeEntitiesBind
  614. .stream()
  615. .map(SuperBaseEntity.SuperIBaseEntity::getId)
  616. .collect(Collectors.toList()).contains(deptEntity.getId())) {
  617. if (!choice.equals(SynThirdConsts.DELETE_DEP)) {
  618. return null;
  619. }
  620. }
  621. switch (choice) {
  622. case SynThirdConsts.CREAT_DEP:
  623. return this.createDepartmentSysToDing(isBatch, deptEntity, accessToken);
  624. case SynThirdConsts.UPDATE_DEP:
  625. return this.updateDepartmentSysToDing(isBatch, deptEntity, accessToken);
  626. case SynThirdConsts.DELETE_DEP:
  627. String parentId = deptEntity.getParentId();
  628. return this.deleteDepartmentSysToDing(isBatch, deptEntity.getId(), accessToken);
  629. default:
  630. return null;
  631. }
  632. }
  633. @Override
  634. public JSONObject unifyDepartmentSysToDing(boolean isBatch, List<OrganizeEntity> organizeEntities, String accessToken, String choice) {
  635. for (OrganizeEntity organizeEntity : organizeEntities) {
  636. this.deleteDepartmentSysToDing(isBatch, organizeEntity.getId(), accessToken);
  637. }
  638. return null;
  639. }
  640. /**
  641. * 往钉钉删除组织-部门
  642. * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604
  643. *
  644. * @param isBatch 是否批量(批量不受开关限制)
  645. * @param id 本系统的公司或部门ID
  646. * @param accessToken (单条调用时为空)
  647. * @return
  648. */
  649. @Override
  650. public JSONObject deleteDepartmentSysToDing(boolean isBatch, String id, String accessToken) {
  651. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  652. String corpId = config.getDingSynAppKey();
  653. String corpSecret = config.getDingSynAppSecret();
  654. // 单条记录执行时,受开关限制
  655. int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynOrg();
  656. JSONObject tokenObject = new JSONObject();
  657. String access_token = "";
  658. JSONObject retMsg = new JSONObject();
  659. SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, id);
  660. String deptFlag = "删除:";
  661. // 返回值初始化
  662. retMsg.put("code", true);
  663. retMsg.put("error", "系统未设置单条同步");
  664. // 支持同步
  665. if (synThirdInfoEntity != null) {
  666. if (isBatch || dingIsSyn == 1) {
  667. // 获取 access_token
  668. if (isBatch) {
  669. access_token = accessToken;
  670. } else {
  671. List<SynThirdInfoEntity> synThirdInfoList = synThirdInfoService.syncThirdInfoByType(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, SynThirdConsts.THIRD_TYPE_DING);
  672. tokenObject = SynDingTalkUtil.getAccessToken(corpId, corpSecret);
  673. access_token = tokenObject.getString("access_token");
  674. }
  675. if (access_token != null && !access_token.isEmpty()) {
  676. // 删除钉钉对应的部门
  677. if (!"".equals(String.valueOf(synThirdInfoEntity.getThirdObjId())) && !"null".equals(String.valueOf(synThirdInfoEntity.getThirdObjId()))) {
  678. retMsg = SynDingTalkUtil.deleteDepartment(Long.parseLong(synThirdInfoEntity.getThirdObjId()), access_token);
  679. if (retMsg.getBoolean("code")) {
  680. // 同步成功,直接删除同步表记录
  681. synThirdInfoService.delete(synThirdInfoEntity);
  682. } else {
  683. // 同步失败
  684. saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  685. Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), id, synThirdInfoEntity.getThirdObjId(), synThirdInfoEntity.getThirdName(), SynThirdConsts.SYN_STATE_FAIL, deptFlag + retMsg.getString("error"));
  686. }
  687. } else {
  688. // 根据钉钉ID找不到相应的信息,直接删除同步表记录
  689. synThirdInfoService.delete(synThirdInfoEntity);
  690. }
  691. } else {
  692. // 同步失败
  693. saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  694. Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), id, synThirdInfoEntity.getThirdObjId(), synThirdInfoEntity.getThirdName(), SynThirdConsts.SYN_STATE_FAIL, deptFlag + "access_token值为空,不能同步信息");
  695. retMsg.put("code", false);
  696. retMsg.put("error", deptFlag + "access_token值为空,不能同步信息!");
  697. }
  698. } else {
  699. // 未设置单条同步,归并到未同步状态
  700. // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  701. // Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), id, synThirdInfoEntity.getThirdObjId(), synThirdInfoEntity.getThirdName(), SynThirdConsts.SYN_STATE_NO, deptFlag + "系统未设置单条同步");
  702. retMsg.put("code", true);
  703. retMsg.put("error", deptFlag + "系统未设置单条同步");
  704. }
  705. }
  706. return retMsg;
  707. }
  708. //------------------------------------钉钉同步公司、部门到本系统20220330-------------------------------------
  709. /**
  710. * 根据部门的同步表信息判断同步情况
  711. * 不带错第三方误定位判断的功能代码,只获取调用接口的返回信息 20220331
  712. *
  713. * @param synThirdInfoEntity
  714. * @return
  715. */
  716. public JSONObject checkDepartmentDingToSys(SynThirdInfoEntity synThirdInfoEntity) {
  717. JSONObject retMsg = new JSONObject();
  718. retMsg.put("code", true);
  719. retMsg.put("flag", "");
  720. retMsg.put("error", "");
  721. if (synThirdInfoEntity != null) {
  722. if ("".equals(String.valueOf(synThirdInfoEntity.getSysObjId())) || "null".equals(String.valueOf(synThirdInfoEntity.getSysObjId()))) {
  723. // 同步表的钉钉ID为空
  724. retMsg.put("code", false);
  725. retMsg.put("flag", "2");
  726. retMsg.put("error", "同步表中部门对应的本地ID为空!");
  727. }
  728. } else {
  729. // 上级部门未同步
  730. retMsg.put("code", false);
  731. retMsg.put("flag", "3");
  732. retMsg.put("error", "部门未同步到本地!");
  733. }
  734. return retMsg;
  735. }
  736. /**
  737. * 往本地创建组织-部门
  738. * 钉钉同步单个公司或部门到本地(供调用)
  739. * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604
  740. *
  741. * @param isBatch 是否批量(批量不受开关限制)
  742. * @param accessToken (单条调用时为空)
  743. */
  744. @Override
  745. public JSONObject createDepartmentDingToSys(boolean isBatch, DingTalkDeptModel deptEntity, String accessToken) {
  746. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  747. // 单条记录执行时,受开关限制
  748. int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynOrg();
  749. Long dingDeptId = deptEntity.getDeptId();
  750. String dingDeptName = deptEntity.getName();
  751. Long dingParentId = deptEntity.getParentId();
  752. Integer synState = 0;
  753. String deptFlag = "创建:";
  754. String description = "";
  755. JSONObject retMsg = new JSONObject();
  756. boolean isDeptDiff = true;
  757. String sysParentId = "";
  758. String sysObjId = "";
  759. // 返回值初始化
  760. retMsg.put("code", true);
  761. retMsg.put("error", "创建:系统未设置单条同步");
  762. // 支持同步
  763. if (dingIsSyn == 1) {
  764. boolean tag = false;
  765. if (dingDeptId == 1L) {
  766. tag = true;
  767. }
  768. SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, dingParentId + "");
  769. retMsg = checkDepartmentDingToSys(synThirdInfoEntity);
  770. isDeptDiff = retMsg.getBoolean("code");
  771. if (isDeptDiff || tag) {
  772. sysParentId = tag ? " -1" : synThirdInfoEntity.getSysObjId();
  773. Assert.notNull(sysParentId, "父级组织未同步");
  774. List<OrganizeEntity> listByParentId = new ArrayList<>();
  775. //如果是-1,就直接取绑定
  776. if (sysParentId.equals("-1")) {
  777. String dingDepartment = config.getDingDepartment();
  778. OrganizeEntity info = organizeService.getInfo(dingDepartment);
  779. listByParentId.add(info);
  780. } else {
  781. listByParentId = organizeService.getListByParentId(sysParentId);
  782. }
  783. OrganizeEntity organizeEntity = listByParentId.stream().filter(t -> t.getFullName().equals(dingDeptName)).findFirst().orElse(null);
  784. //系统组织同名建立绑定关系,不存在则新建组织
  785. if (organizeEntity == null) {
  786. // 新增保存组织
  787. OrganizeEntity newOrg = new OrganizeEntity();
  788. sysObjId = RandomUtil.uuId();
  789. newOrg.setId(sysObjId);
  790. if (!"1".equals(dingDeptId + "")) {
  791. List<OrganizeEntity> depsByParentId = organizeService.getDepsByParentId(sysParentId);
  792. if (depsByParentId.stream().noneMatch(t->t.getFullName().equals(dingDeptName))){
  793. newOrg.setParentId(sysParentId);
  794. String organizeIdTree = organizeService.getOrganizeIdTree(newOrg);
  795. newOrg.setOrganizeIdTree(organizeIdTree + "," + sysObjId);
  796. newOrg.setFullName(dingDeptName);
  797. newOrg.setSortCode(deptEntity.getOrder() != null ? deptEntity.getOrder() : 1L);
  798. newOrg.setCategory(OrgTypeEnum.DEPARTMENT.getCode());
  799. organizeService.create(newOrg);}
  800. } else {
  801. sysObjId = config.getDingDepartment();
  802. }
  803. // 中间表
  804. retMsg.put("retDeptId", sysObjId);
  805. synState = SynThirdConsts.SYN_STATE_OK;
  806. } else {
  807. sysObjId = organizeEntity.getId();
  808. retMsg.put("retDeptId", sysObjId);
  809. synState = SynThirdConsts.SYN_STATE_OK;
  810. }
  811. } else {
  812. // 同步失败,上级部门无对应的钉钉ID
  813. synState = SynThirdConsts.SYN_STATE_FAIL;
  814. description = deptFlag + "部门所属的上级部门未同步到本地";
  815. retMsg.put("code", false);
  816. retMsg.put("error", description);
  817. retMsg.put("retDeptId", "0");
  818. }
  819. }
  820. // 更新同步表
  821. saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_ADD, null, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  822. Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), sysObjId, dingDeptId + "", dingDeptName, synState, description);
  823. return retMsg;
  824. }
  825. /**
  826. * 往钉钉更新组织-部门
  827. * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604
  828. *
  829. * @param isBatch 是否批量(批量不受开关限制)
  830. * @param deptEntity
  831. * @param accessToken (单条调用时为空)
  832. * @return
  833. */
  834. @Override
  835. public JSONObject updateDepartmentDingToSys(boolean isBatch, DingTalkDeptModel deptEntity, String accessToken) {
  836. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  837. // 单条记录执行时,受开关限制
  838. int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynOrg();
  839. JSONObject retMsg = new JSONObject();
  840. SynThirdInfoEntity synThirdInfoEntity = new SynThirdInfoEntity();
  841. String opType = "";
  842. Integer synState = 0;
  843. String description = "";
  844. String sysObjId = "";
  845. String sysParentId = "";
  846. SynThirdInfoEntity synThirdInfoPara = new SynThirdInfoEntity();
  847. boolean isDeptDiff = true;
  848. String deptFlag = "更新:";
  849. Long dingDeptId = deptEntity.getDeptId();
  850. String dingDeptName = deptEntity.getName();
  851. Long dingParentId = deptEntity.getParentId();
  852. OrganizeEntity orgInfo = new OrganizeEntity();
  853. // 返回值初始化
  854. retMsg.put("code", true);
  855. retMsg.put("error", "系统未设置单条同步");
  856. if (isBatch || dingIsSyn == 1) {
  857. // 获取同步表信息
  858. synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, dingParentId + "");
  859. retMsg = checkDepartmentDingToSys(synThirdInfoEntity);
  860. isDeptDiff = retMsg.getBoolean("code");
  861. if (isDeptDiff) {
  862. sysParentId = synThirdInfoEntity.getSysObjId();
  863. // 获取同步表信息
  864. synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, dingDeptId + "");
  865. // 判断当前部门对应的第三方的合法性
  866. retMsg = checkDepartmentDingToSys(synThirdInfoEntity);
  867. if (!retMsg.getBoolean("code")) {
  868. if ("3".equals(retMsg.getString("flag")) || "1".equals(retMsg.getString("flag"))) {
  869. // flag:3 未同步,需要创建同步到钉钉、写入同步表
  870. // flag:1 已同步但第三方上没对应的ID,需要删除原来的同步信息,再创建同步到钉钉、写入同步表
  871. if ("1".equals(retMsg.getString("flag"))) {
  872. synThirdInfoService.delete(synThirdInfoEntity);
  873. }
  874. opType = SynThirdConsts.OBJECT_OP_ADD;
  875. synThirdInfoPara = null;
  876. // thirdObjId = dingDeptId+"";
  877. // 新增保存组织
  878. orgInfo = new OrganizeEntity();
  879. sysObjId = RandomUtil.uuId();
  880. orgInfo.setId(sysObjId);
  881. if (!"1".equals(dingDeptId + "")) {
  882. orgInfo.setCategory(SynThirdConsts.OBJECT_TYPE_DEPARTMENT);
  883. orgInfo.setParentId(sysParentId);
  884. // 通过组织id获取父级组织
  885. String organizeIdTree = organizeService.getOrganizeIdTree(orgInfo);
  886. orgInfo.setOrganizeIdTree(organizeIdTree + "," + sysObjId);
  887. orgInfo.setFullName(dingDeptName);
  888. orgInfo.setSortCode(deptEntity.getOrder() != null ? deptEntity.getOrder() : 1L);
  889. organizeService.save(orgInfo);
  890. } else {
  891. sysObjId = organizeService.getOrganizeByParentId("-1").get(0).getId();
  892. }
  893. // 同步成功
  894. retMsg.put("retDeptId", sysObjId);
  895. synState = SynThirdConsts.SYN_STATE_OK;
  896. description = "";
  897. }
  898. if ("2".equals(retMsg.getString("flag"))) {
  899. // flag:2 已同步但第三方ID为空,需要创建同步到钉钉、修改同步表
  900. opType = SynThirdConsts.OBJECT_OP_UPD;
  901. synThirdInfoPara = synThirdInfoEntity;
  902. // thirdObjId = dingDeptId+"";
  903. // 新增保存组织
  904. orgInfo = new OrganizeEntity();
  905. sysObjId = RandomUtil.uuId();
  906. orgInfo.setId(sysObjId);
  907. if (!"1".equals(dingDeptId + "")) {
  908. orgInfo.setCategory(SynThirdConsts.OBJECT_TYPE_DEPARTMENT);
  909. orgInfo.setParentId(sysParentId);
  910. // 通过组织id获取父级组织
  911. String organizeIdTree = organizeService.getOrganizeIdTree(orgInfo);
  912. orgInfo.setOrganizeIdTree(organizeIdTree + "," + sysObjId);
  913. orgInfo.setFullName(dingDeptName);
  914. orgInfo.setSortCode(deptEntity.getOrder() != null ? deptEntity.getOrder() : 1L);
  915. organizeService.save(orgInfo);
  916. } else {
  917. sysObjId = organizeService.getOrganizeByParentId("-1").get(0).getId();
  918. }
  919. // 同步成功
  920. retMsg.put("retDeptId", sysObjId);
  921. synState = SynThirdConsts.SYN_STATE_OK;
  922. description = "";
  923. }
  924. } else {
  925. // 更新同步表
  926. opType = SynThirdConsts.OBJECT_OP_UPD;
  927. synThirdInfoPara = synThirdInfoEntity;
  928. sysObjId = synThirdInfoEntity.getSysObjId();
  929. orgInfo = organizeService.getInfo(sysObjId);
  930. if (orgInfo != null) {
  931. orgInfo.setParentId(dingParentId + "");
  932. orgInfo.setFullName(dingDeptName);
  933. if (!"1".equals(dingDeptId + "")) {
  934. orgInfo.setParentId(sysParentId);
  935. orgInfo.setOrganizeIdTree(orgInfo.getOrganizeIdTree().replace("," + orgInfo.getId(), ""));
  936. organizeService.update(orgInfo.getId(), orgInfo);
  937. }
  938. // 同步成功
  939. synState = SynThirdConsts.SYN_STATE_OK;
  940. description = "";
  941. } else {
  942. // 同步失败
  943. synState = SynThirdConsts.SYN_STATE_FAIL;
  944. description = deptFlag + "未找到对应的部门";
  945. }
  946. }
  947. } else {
  948. synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, dingDeptId + "");
  949. // 同步失败,上级部门检查有异常
  950. if (synThirdInfoEntity != null) {
  951. // 修改同步表
  952. opType = SynThirdConsts.OBJECT_OP_UPD;
  953. synThirdInfoPara = synThirdInfoEntity;
  954. sysObjId = synThirdInfoEntity.getSysObjId();
  955. } else {
  956. // 写入同步表
  957. opType = SynThirdConsts.OBJECT_OP_ADD;
  958. synThirdInfoPara = null;
  959. sysObjId = "";
  960. }
  961. synState = SynThirdConsts.SYN_STATE_FAIL;
  962. description = deptFlag + "上级部门无对应的本地ID";
  963. retMsg.put("code", false);
  964. retMsg.put("error", description);
  965. }
  966. } else {
  967. // 未设置单条同步,归并到未同步状态
  968. // 获取同步表信息
  969. synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, dingDeptId + "");
  970. if (synThirdInfoEntity != null) {
  971. // 修改同步表
  972. opType = SynThirdConsts.OBJECT_OP_UPD;
  973. synThirdInfoPara = synThirdInfoEntity;
  974. sysObjId = synThirdInfoEntity.getSysObjId();
  975. } else {
  976. // 写入同步表
  977. opType = SynThirdConsts.OBJECT_OP_ADD;
  978. synThirdInfoPara = null;
  979. sysObjId = "";
  980. }
  981. synState = SynThirdConsts.SYN_STATE_NO;
  982. description = deptFlag + "系统未设置单条同步";
  983. retMsg.put("code", true);
  984. retMsg.put("error", description);
  985. }
  986. // 更新同步表
  987. saveSynThirdInfoEntity(opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  988. Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), sysObjId, dingDeptId + "", dingDeptName, synState, description);
  989. return retMsg;
  990. }
  991. /**
  992. * 往钉钉删除组织-部门
  993. * 不带错误定位判断的功能代码,只获取调用接口的返回信息 20210604
  994. *
  995. * @param isBatch 是否批量(批量不受开关限制)
  996. * @param thirdObjId 钉钉的公司或部门ID
  997. * @return
  998. */
  999. @Override
  1000. public JSONObject deleteDepartmentDingToSys(boolean isBatch, String thirdObjId) {
  1001. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  1002. // 单条记录执行时,受开关限制
  1003. int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynOrg();
  1004. String deptFlag = "删除:";
  1005. JSONObject retMsg = new JSONObject();
  1006. String thirdName = "";
  1007. // 获取当前第三方同步表对应记录
  1008. SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, thirdObjId);
  1009. // 返回值初始化
  1010. retMsg.put("code", true);
  1011. retMsg.put("error", "系统未设置单条同步");
  1012. if (synThirdInfoEntity != null) {
  1013. thirdName = synThirdInfoEntity.getThirdName();
  1014. if (dingIsSyn == 1) {
  1015. String sysObjId = synThirdInfoEntity.getSysObjId();
  1016. if (!"".equals(String.valueOf(sysObjId)) && !"null".equals(String.valueOf(sysObjId))) {
  1017. OrganizeEntity sysOrgEntity = organizeService.getInfo(sysObjId);
  1018. if (sysOrgEntity != null) {
  1019. // 删除本的的组织
  1020. organizeService.delete(sysOrgEntity.getId(), false);
  1021. // 同步成功,直接删除同步表记录
  1022. synThirdInfoService.delete(synThirdInfoEntity);
  1023. } else {
  1024. // 根据本系统ID找不到相应的信息,直接删除同步表记录
  1025. synThirdInfoService.delete(synThirdInfoEntity);
  1026. }
  1027. } else {
  1028. // 根据本系统ID找不到相应的信息,直接删除同步表记录
  1029. synThirdInfoService.delete(synThirdInfoEntity);
  1030. }
  1031. } else {
  1032. // 未设置单条同步,归并到未同步状态
  1033. saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  1034. Integer.parseInt(SynThirdConsts.DATA_TYPE_ORG), synThirdInfoEntity.getSysObjId(), thirdObjId, thirdName, SynThirdConsts.SYN_STATE_NO, deptFlag + "系统未设置单条同步");
  1035. retMsg.put("code", true);
  1036. retMsg.put("error", deptFlag + "系统未设置单条同步");
  1037. }
  1038. }
  1039. return retMsg;
  1040. }
  1041. //------------------------------------本系统同步用户到钉钉-------------------------------------
  1042. /**
  1043. * 设置需要提交给钉钉接口的单个成员信息
  1044. * 不带第三方错误定位判断的功能代码,只获取调用接口的返回信息 20210604
  1045. *
  1046. * @param userEntity 本地用户信息
  1047. * @return
  1048. */
  1049. public JSONObject setDingUserObject(UserEntity userEntity) throws ParseException {
  1050. DingTalkUserModel userModel = new DingTalkUserModel();
  1051. JSONObject retMsg = new JSONObject();
  1052. retMsg.put("code", true);
  1053. retMsg.put("error", "");
  1054. // 验证邮箱格式的格式合法性、唯一性
  1055. if (StringUtil.isNotEmpty(userEntity.getEmail())) {
  1056. if (!RegexUtils.checkEmail(userEntity.getEmail())) {
  1057. retMsg.put("code", false);
  1058. retMsg.put("error", "邮箱格式不合法!");
  1059. retMsg.put("dingUserObject", null);
  1060. return retMsg;
  1061. }
  1062. }
  1063. // 判断手机号的合法性
  1064. if (StringUtil.isNotEmpty(userEntity.getMobilePhone())) {
  1065. if (!RegexUtils.checkMobile(userEntity.getMobilePhone())) {
  1066. retMsg.put("code", false);
  1067. retMsg.put("error", "手机号不合法!");
  1068. retMsg.put("dingUserObject", null);
  1069. return retMsg;
  1070. }
  1071. }
  1072. userModel.setUserid(userEntity.getId());
  1073. userModel.setName(userEntity.getRealName());
  1074. userModel.setMobile(userEntity.getMobilePhone());
  1075. userModel.setTelephone(userEntity.getLandline());
  1076. userModel.setJobNumber(userEntity.getAccount());
  1077. PositionEntity positionEntity = positionService.getInfo(userEntity.getPositionId());
  1078. String jobName = "";
  1079. if (positionEntity != null) {
  1080. jobName = positionEntity.getFullName();
  1081. userModel.setTitle(jobName);
  1082. }
  1083. userModel.setWorkPlace(userEntity.getPostalAddress());
  1084. if (userEntity.getEntryDate() != null) {
  1085. String entryDate = DateUtil.daFormat(userEntity.getEntryDate());
  1086. DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
  1087. df.setTimeZone(TimeZone.getTimeZone("GMT"));
  1088. if (df.parse(entryDate).getTime() > 0) {
  1089. userModel.setHiredDate(df.parse(entryDate).getTime());
  1090. }
  1091. }
  1092. // retMsg = checkDepartmentSysToDing(synThirdInfoEntity,dingDeptList);
  1093. List<UserRelationEntity> userRelationList = userRelationService.getListByObjectType(userEntity.getId(), "Organize");
  1094. List<String> objectIdList = userRelationList.stream().map(t -> t.getObjectId()).collect(Collectors.toList());
  1095. // String objectId = userRelationList.stream().map(t->t.getObjectId()).collect(Collectors.joining(","));
  1096. retMsg = checkDepartmentSysToDing2(objectIdList);
  1097. if (retMsg.getBoolean("code")) {
  1098. // userModel.setDeptIdList(synThirdInfoEntity.getThirdObjId());
  1099. userModel.setDeptIdList(retMsg.getString("flag"));
  1100. } else {
  1101. retMsg.put("code", false);
  1102. retMsg.put("error", "部门找不到对应的钉钉ID!");
  1103. retMsg.put("dingUserObject", null);
  1104. return retMsg;
  1105. }
  1106. userModel.setEmail(userEntity.getEmail());
  1107. retMsg.put("dingUserObject", userModel);
  1108. return retMsg;
  1109. }
  1110. /**
  1111. * 根据用户的同步表信息判断同步情况
  1112. * 不带第三方错误定位判断的功能代码,只获取调用接口的返回信息 20210604
  1113. *
  1114. * @param synThirdInfoEntity
  1115. * @return
  1116. */
  1117. public JSONObject checkUserSysToDing(SynThirdInfoEntity synThirdInfoEntity) {
  1118. JSONObject retMsg = new JSONObject();
  1119. retMsg.put("code", true);
  1120. retMsg.put("flag", "");
  1121. retMsg.put("error", "");
  1122. if (synThirdInfoEntity != null) {
  1123. if ("".equals(String.valueOf(synThirdInfoEntity.getThirdObjId())) || "null".equals(String.valueOf(synThirdInfoEntity.getThirdObjId()))) {
  1124. // 同步表的企业微信ID为空
  1125. retMsg.put("code", false);
  1126. retMsg.put("flag", "2");
  1127. retMsg.put("error", "同步表中用户对应的钉钉ID为空!");
  1128. }
  1129. } else {
  1130. // 上级用户未同步
  1131. retMsg.put("code", false);
  1132. retMsg.put("flag", "3");
  1133. retMsg.put("error", "用户未同步!");
  1134. }
  1135. return retMsg;
  1136. }
  1137. /**
  1138. * 往钉钉创建用户
  1139. * 不带第三方错误定位判断的功能代码,只获取调用接口的返回信息 20210604
  1140. *
  1141. * @param isBatch 是否批量(批量不受开关限制)
  1142. * @param userEntity
  1143. * @param accessToken (单条调用时为空)
  1144. * @return
  1145. */
  1146. @Override
  1147. public JSONObject createUserSysToDing(boolean isBatch, UserEntity userEntity, String accessToken) throws ParseException {
  1148. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  1149. String corpId = config.getDingSynAppKey();
  1150. String corpSecret = config.getDingSynAppSecret();
  1151. // 单条记录执行时,受开关限制
  1152. int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynUser();
  1153. JSONObject tokenObject = new JSONObject();
  1154. String access_token = "";
  1155. JSONObject retMsg = new JSONObject();
  1156. DingTalkUserModel userObjectModel = new DingTalkUserModel();
  1157. String thirdObjId = "";
  1158. Integer synState = 0;
  1159. String description = "";
  1160. String userFlag = "创建:";
  1161. // 返回值初始化
  1162. retMsg.put("code", true);
  1163. retMsg.put("error", userFlag + "系统未设置单条同步");
  1164. if (isBatch || dingIsSyn == 1) {
  1165. if (isBatch) {
  1166. access_token = accessToken;
  1167. } else {
  1168. synThirdInfoService.syncThirdInfoByType(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, SynThirdConsts.THIRD_TYPE_DING);
  1169. synThirdInfoService.syncThirdInfoByType(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, SynThirdConsts.THIRD_TYPE_DING);
  1170. tokenObject = SynDingTalkUtil.getAccessToken(corpId, corpSecret);
  1171. access_token = tokenObject.getString("access_token");
  1172. }
  1173. if (access_token != null && !access_token.isEmpty()) {
  1174. // 要同步到钉钉的对象赋值
  1175. retMsg = setDingUserObject(userEntity);
  1176. if (retMsg.getBoolean("code")) {
  1177. userObjectModel = retMsg.getObject("dingUserObject", DingTalkUserModel.class);
  1178. // 往钉钉写入成员
  1179. retMsg = SynDingTalkUtil.createUser(userObjectModel, access_token);
  1180. // 往同步写入本系统与第三方的对应信息
  1181. if (retMsg.getBoolean("code")) {
  1182. // 同步成功
  1183. thirdObjId = userEntity.getId();
  1184. synState = SynThirdConsts.SYN_STATE_OK;
  1185. } else {
  1186. if (retMsg.getString("error").contains("手机号码在公司中已存在")) {
  1187. retMsg = SynDingTalkUtil.updateUser(userObjectModel, access_token);
  1188. if (retMsg.getBoolean("code")) {
  1189. // 同步成功
  1190. thirdObjId = userEntity.getId();
  1191. synState = SynThirdConsts.SYN_STATE_OK;
  1192. } else {
  1193. // 同步失败
  1194. synState = SynThirdConsts.SYN_STATE_FAIL;
  1195. description = userFlag + retMsg.getString("error");
  1196. }
  1197. } else {
  1198. // 同步失败
  1199. synState = SynThirdConsts.SYN_STATE_FAIL;
  1200. description = userFlag + retMsg.getString("error");
  1201. }
  1202. }
  1203. } else {
  1204. // 同步失败,原因:部门找不到对应的第三方ID、邮箱格式不合法
  1205. synState = SynThirdConsts.SYN_STATE_FAIL;
  1206. description = userFlag + retMsg.getString("error");
  1207. }
  1208. } else {
  1209. // 同步失败
  1210. synState = SynThirdConsts.SYN_STATE_FAIL;
  1211. description = userFlag + "access_token值为空,不能同步信息";
  1212. retMsg.put("code", false);
  1213. retMsg.put("error", description);
  1214. }
  1215. } else {
  1216. // 无须同步,未同步状态
  1217. synState = SynThirdConsts.SYN_STATE_NO;
  1218. description = userFlag + "系统未设置单条同步";
  1219. retMsg.put("code", true);
  1220. retMsg.put("error", description);
  1221. return retMsg;
  1222. }
  1223. // 更新同步表
  1224. saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_ADD, null, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  1225. Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), userEntity.getId(), thirdObjId, userEntity.getRealName(), synState, description);
  1226. return retMsg;
  1227. }
  1228. @Override
  1229. public JSONObject createUserSysToDing(boolean isBatch, List<UserEntity> userEntities, String accessToken, String positionId) throws ParseException {
  1230. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  1231. List<OrganizeEntity> organizeEntitiesBind = synThirdInfoService.getOrganizeEntitiesBind(config.getDingDepartment());
  1232. PositionEntity info = positionService.getInfo(positionId);
  1233. if (BeanUtil.isNotEmpty(info) && !organizeEntitiesBind.stream()
  1234. .map(SuperBaseEntity.SuperIBaseEntity::getId)
  1235. .collect(Collectors.toList()).contains(info.getOrganizeId())) {
  1236. return null;
  1237. }
  1238. for (UserEntity userEntity : userEntities) {
  1239. createUserSysToDing(isBatch, userEntity, accessToken);
  1240. }
  1241. return new JSONObject();
  1242. }
  1243. @Override
  1244. public JSONObject createUserSysToDing(boolean isBatch, UserEntity userEntity, String accessToken, List<String> ids) throws ParseException {
  1245. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  1246. List<OrganizeEntity> organizeEntitiesBind = synThirdInfoService.getOrganizeEntitiesBind(config.getDingDepartment());
  1247. for (String id : ids) {
  1248. if (organizeEntitiesBind.stream()
  1249. .map(SuperBaseEntity.SuperIBaseEntity::getId)
  1250. .collect(Collectors.toList()).contains(id)) {
  1251. userEntity.setOrganizeId(id);
  1252. createUserSysToDing(isBatch, userEntity, accessToken);
  1253. }
  1254. }
  1255. return null;
  1256. }
  1257. /**
  1258. * 往钉钉更新用户
  1259. * 不带第三方错误定位判断的功能代码,只获取调用接口的返回信息 20210604
  1260. *
  1261. * @param isBatch 是否批量(批量不受开关限制)
  1262. * @param userEntity
  1263. * @param accessToken (单条调用时为空)
  1264. * @return
  1265. */
  1266. @Override
  1267. public JSONObject updateUserSysToDing(boolean isBatch, UserEntity userEntity, String accessToken) throws ParseException {
  1268. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  1269. String corpId = config.getDingSynAppKey();
  1270. String corpSecret = config.getDingSynAppSecret();
  1271. // 单条记录执行时,受开关限制
  1272. int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynUser();
  1273. JSONObject tokenObject = new JSONObject();
  1274. String access_token = "";
  1275. JSONObject retMsg = new JSONObject();
  1276. DingTalkUserModel userObjectModel = new DingTalkUserModel();
  1277. SynThirdInfoEntity synThirdInfoEntity = new SynThirdInfoEntity();
  1278. SynThirdInfoEntity entity = new SynThirdInfoEntity();
  1279. String opType = "";
  1280. SynThirdInfoEntity synThirdInfoPara = new SynThirdInfoEntity();
  1281. String thirdObjId = "";
  1282. String thirdName = "";
  1283. Integer synState = 0;
  1284. String description = "";
  1285. String userFlag = "更新:";
  1286. // 返回值初始化
  1287. retMsg.put("code", true);
  1288. retMsg.put("error", userFlag + "系统未设置单条同步");
  1289. // 支持同步
  1290. if (isBatch || dingIsSyn == 1) {
  1291. // 获取 access_token
  1292. if (isBatch) {
  1293. access_token = accessToken;
  1294. } else {
  1295. synThirdInfoService.syncThirdInfoByType(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, SynThirdConsts.THIRD_TYPE_DING);
  1296. synThirdInfoService.syncThirdInfoByType(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_ORG, SynThirdConsts.THIRD_TYPE_DING);
  1297. tokenObject = SynDingTalkUtil.getAccessToken(corpId, corpSecret);
  1298. access_token = tokenObject.getString("access_token");
  1299. }
  1300. // 获取同步表信息
  1301. synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, userEntity.getId());
  1302. if (access_token != null && !access_token.isEmpty()) {
  1303. // 要同步到企业微信的对象赋值
  1304. retMsg = setDingUserObject(userEntity);
  1305. if (retMsg.getBoolean("code")) {
  1306. // 判断当前用户对应的第三方的合法性
  1307. userObjectModel = retMsg.getObject("dingUserObject", DingTalkUserModel.class);
  1308. retMsg = checkUserSysToDing(synThirdInfoEntity);
  1309. if (!retMsg.getBoolean("code")) {
  1310. if ("3".equals(retMsg.getString("flag")) || "1".equals(retMsg.getString("flag"))) {
  1311. // flag:3 未同步,需要创建同步到企业微信、写入同步表
  1312. // flag:1 已同步
  1313. if ("1".equals(retMsg.getString("flag"))) {
  1314. opType = SynThirdConsts.OBJECT_OP_UPD;
  1315. } else {
  1316. opType = SynThirdConsts.OBJECT_OP_ADD;
  1317. }
  1318. synThirdInfoPara = null;
  1319. thirdObjId = "";
  1320. // 往企业微信写入成员
  1321. retMsg = SynDingTalkUtil.createUser(userObjectModel, access_token);
  1322. if (retMsg.getBoolean("code")) {
  1323. // 同步成功
  1324. thirdObjId = userEntity.getId();
  1325. thirdName = userEntity.getRealName();
  1326. synState = SynThirdConsts.SYN_STATE_OK;
  1327. description = "更新成功";
  1328. } else {
  1329. // 同步失败
  1330. synState = SynThirdConsts.SYN_STATE_FAIL;
  1331. description = userFlag + retMsg.getString("error");
  1332. }
  1333. }
  1334. if ("2".equals(retMsg.getString("flag"))) {
  1335. // 已同步但第三方ID为空,需要创建同步到企业微信、修改同步表
  1336. opType = SynThirdConsts.OBJECT_OP_UPD;
  1337. synThirdInfoPara = synThirdInfoEntity;
  1338. thirdObjId = "";
  1339. // 往钉钉写入成员
  1340. retMsg = SynDingTalkUtil.updateUser(userObjectModel, access_token);
  1341. if (retMsg.getBoolean("code")) {
  1342. // 同步成功
  1343. thirdName = userEntity.getRealName();
  1344. synState = SynThirdConsts.SYN_STATE_OK;
  1345. description = "更新成功";
  1346. } else {
  1347. // 同步失败
  1348. synState = SynThirdConsts.SYN_STATE_FAIL;
  1349. description = userFlag + retMsg.getString("error");
  1350. }
  1351. }
  1352. } else {
  1353. // 更新同步表
  1354. opType = SynThirdConsts.OBJECT_OP_UPD;
  1355. synThirdInfoPara = synThirdInfoEntity;
  1356. thirdObjId = synThirdInfoEntity.getThirdObjId();
  1357. thirdName = synThirdInfoEntity.getThirdName();
  1358. // 往企业微信更新成员信息
  1359. userObjectModel.setUserid(synThirdInfoEntity.getThirdObjId());
  1360. retMsg = SynDingTalkUtil.updateUser(userObjectModel, access_token);
  1361. if (retMsg.getBoolean("code")) {
  1362. // 同步成功
  1363. synState = SynThirdConsts.SYN_STATE_OK;
  1364. description = "更新成功";
  1365. } else {
  1366. // 同步失败
  1367. synState = SynThirdConsts.SYN_STATE_FAIL;
  1368. description = userFlag + retMsg.getString("error");
  1369. }
  1370. }
  1371. } else {
  1372. // 同步失败,原因:用户所属部门找不到相应的企业微信ID、邮箱格式不合法
  1373. if (synThirdInfoEntity != null) {
  1374. // 修改同步表
  1375. opType = SynThirdConsts.OBJECT_OP_UPD;
  1376. synThirdInfoPara = synThirdInfoEntity;
  1377. thirdObjId = synThirdInfoEntity.getThirdObjId();
  1378. thirdName = userEntity.getRealName();
  1379. } else {
  1380. // 写入同步表
  1381. opType = SynThirdConsts.OBJECT_OP_ADD;
  1382. synThirdInfoPara = null;
  1383. thirdObjId = "";
  1384. }
  1385. synState = SynThirdConsts.SYN_STATE_FAIL;
  1386. description = userFlag + retMsg.getString("error");
  1387. retMsg.put("code", false);
  1388. retMsg.put("error", description);
  1389. }
  1390. } else {
  1391. // 同步失败
  1392. if (synThirdInfoEntity != null) {
  1393. // 修改同步表
  1394. opType = SynThirdConsts.OBJECT_OP_UPD;
  1395. synThirdInfoPara = synThirdInfoEntity;
  1396. thirdObjId = synThirdInfoEntity.getThirdObjId();
  1397. thirdName = synThirdInfoEntity.getThirdName();
  1398. } else {
  1399. // 写入同步表
  1400. opType = SynThirdConsts.OBJECT_OP_ADD;
  1401. synThirdInfoPara = null;
  1402. thirdObjId = "";
  1403. }
  1404. synState = SynThirdConsts.SYN_STATE_FAIL;
  1405. description = userFlag + "access_token值为空,不能同步信息";
  1406. retMsg.put("code", true);
  1407. retMsg.put("error", description);
  1408. }
  1409. } else {
  1410. // 未设置单条同步,归并到未同步状态
  1411. // 获取同步表信息
  1412. synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, userEntity.getId());
  1413. if (synThirdInfoEntity != null) {
  1414. // 修改同步表
  1415. opType = SynThirdConsts.OBJECT_OP_UPD;
  1416. synThirdInfoPara = synThirdInfoEntity;
  1417. thirdObjId = synThirdInfoEntity.getThirdObjId();
  1418. thirdName = synThirdInfoEntity.getThirdName();
  1419. } else {
  1420. // 写入同步表
  1421. opType = SynThirdConsts.OBJECT_OP_ADD;
  1422. synThirdInfoPara = null;
  1423. thirdObjId = "";
  1424. }
  1425. synState = SynThirdConsts.SYN_STATE_NO;
  1426. description = userFlag + "系统未设置单条同步";
  1427. retMsg.put("code", true);
  1428. retMsg.put("error", description);
  1429. return retMsg;
  1430. }
  1431. // 更新同步表
  1432. saveSynThirdInfoEntity(opType, synThirdInfoPara, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  1433. Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), userEntity.getId(), thirdObjId, thirdName, synState, description);
  1434. return retMsg;
  1435. }
  1436. @Override
  1437. public JSONObject updateUserSysToDing(boolean isBatch, UserEntity userEntity, String accessToken, Integer single) throws ParseException {
  1438. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  1439. String qyhDepartment = config.getDingDepartment();
  1440. List<OrganizeEntity> organizeEntitiesBind = synThirdInfoService.getOrganizeEntitiesBind(qyhDepartment);
  1441. List<UserRelationEntity> listByUserId = userRelationService.getListByUserId(userEntity.getId(), PermissionConst.ORGANIZE);
  1442. List<UserRelationEntity> relationEntities = listByUserId.stream()
  1443. .filter(t -> organizeEntitiesBind.stream()
  1444. .map(SuperBaseEntity.SuperIBaseEntity::getId)
  1445. .collect(Collectors.toList()).contains(t.getObjectId()))
  1446. .collect(Collectors.toList());
  1447. if (CollectionUtil.isEmpty(relationEntities)) {
  1448. return new JSONObject();
  1449. }
  1450. return updateUserSysToDing(isBatch, userEntity, accessToken);
  1451. }
  1452. /**
  1453. * 往钉钉删除用户
  1454. * 不带第三方错误定位判断的功能代码,只获取调用接口的返回信息 20210604
  1455. *
  1456. * @param isBatch 是否批量(批量不受开关限制)
  1457. * @param id 本系统的公司或部门ID
  1458. * @param accessToken (单条调用时为空)
  1459. * @return
  1460. */
  1461. @Override
  1462. public JSONObject deleteUserSysToDing(boolean isBatch, String id, String accessToken) {
  1463. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  1464. String corpId = config.getDingSynAppKey();
  1465. String corpSecret = config.getDingSynAppSecret();
  1466. // 单条记录执行时,受开关限制
  1467. int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynUser();
  1468. JSONObject tokenObject = new JSONObject();
  1469. String access_token = "";
  1470. JSONObject retMsg = new JSONObject();
  1471. SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoBySysObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, id);
  1472. // 返回值初始化
  1473. retMsg.put("code", true);
  1474. retMsg.put("error", "系统未设置单条同步");
  1475. // 支持同步
  1476. if (synThirdInfoEntity != null) {
  1477. if (isBatch || dingIsSyn == 1) {
  1478. // 获取 access_token
  1479. if (isBatch) {
  1480. access_token = accessToken;
  1481. } else {
  1482. List<SynThirdInfoEntity> synThirdInfoList = synThirdInfoService.syncThirdInfoByType(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, SynThirdConsts.THIRD_TYPE_DING);
  1483. tokenObject = SynDingTalkUtil.getAccessToken(corpId, corpSecret);
  1484. access_token = tokenObject.getString("access_token");
  1485. }
  1486. if (access_token != null && !"".equals(access_token)) {
  1487. // 删除企业对应的用户
  1488. if (!"".equals(String.valueOf(synThirdInfoEntity.getThirdObjId())) && !"null".equals(String.valueOf(synThirdInfoEntity.getThirdObjId()))) {
  1489. retMsg = SynDingTalkUtil.deleteUser(synThirdInfoEntity.getThirdObjId(), access_token);
  1490. if (retMsg.getBoolean("code")) {
  1491. // 同步成功,直接删除同步表记录
  1492. synThirdInfoService.delete(synThirdInfoEntity);
  1493. } else {
  1494. // 同步失败
  1495. saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  1496. Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_FAIL, retMsg.getString("error"), "", "");
  1497. }
  1498. } else {
  1499. // 根据企业微信ID找不到相应的信息,直接删除同步表记录
  1500. synThirdInfoService.delete(synThirdInfoEntity);
  1501. }
  1502. } else {
  1503. // 同步失败
  1504. saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  1505. Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_FAIL, "access_token值为空,不能同步信息", "", "");
  1506. retMsg.put("code", false);
  1507. retMsg.put("error", "access_token值为空,不能同步信息!");
  1508. }
  1509. } else {
  1510. // 未设置单条同步,归并到未同步状态
  1511. // saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  1512. // Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), id, synThirdInfoEntity.getThirdObjId(), SynThirdConsts.SYN_STATE_NO, "系统未设置同步", "", "");
  1513. retMsg.put("code", true);
  1514. retMsg.put("error", "系统未设置单条同步");
  1515. }
  1516. }
  1517. return retMsg;
  1518. }
  1519. @Override
  1520. public JSONObject deleteUserSysToDing(boolean isBatch, List<String> ids, String accessToken, String positionId) throws ParseException {
  1521. for (String id : ids) {
  1522. deleteUserSysToDing(isBatch, id, accessToken);
  1523. }
  1524. return new JSONObject();
  1525. }
  1526. @Override
  1527. public JSONObject deleteUserSysToDing(boolean isBatch, UserEntity userEntity, String accessToken, List<String> ids) throws ParseException {
  1528. deleteUserSysToDing(isBatch, userEntity.getId(), accessToken);
  1529. return new JSONObject();
  1530. }
  1531. //------------------------------------钉钉同步用户到本系统20220331-------------------------------------
  1532. /**
  1533. * 钉钉往本地创建用户
  1534. * 不带第三方错误定位判断的功能代码,只获取调用接口的返回信息 20220331
  1535. *
  1536. * @param isBatch 是否批量(批量不受开关限制)
  1537. * @param accessToken (单条调用时为空)
  1538. */
  1539. @Override
  1540. public JSONObject createUserDingToSys(boolean isBatch, OapiV2UserListResponse.ListUserResponse dingUserModel, String accessToken) throws Exception {
  1541. List<Long> deptIdList = dingUserModel.getDeptIdList();
  1542. String dingUserId = dingUserModel.getUserid();
  1543. String dingUserName = dingUserModel.getName();
  1544. String dingMobile = dingUserModel.getMobile();
  1545. String dingTelephone = dingUserModel.getTelephone();
  1546. // 工号不唯一的情况,不能用于做本系统的账号
  1547. String dingJobNumber = dingUserModel.getJobNumber();
  1548. // 职位:是字符串,手入的
  1549. String title = dingUserModel.getTitle();
  1550. String sysObjId = "";
  1551. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  1552. // 单条记录执行时,受开关限制
  1553. int dingIsSyn = config.getDingSynIsSynUser();
  1554. JSONObject retMsg = new JSONObject();
  1555. int synState = 0;
  1556. String description = "";
  1557. String userFlag = "创建:";
  1558. UserEntity userEntity = new UserEntity();
  1559. String tag = SynThirdConsts.OBJECT_OP_ADD;
  1560. if (isBatch || dingIsSyn == 1) {
  1561. // 检测账户唯一
  1562. UserEntity userAccount = userService.getUserByMobile(dingMobile);
  1563. if (userAccount != null) {
  1564. // 查询用户id在不在同步表
  1565. sysObjId = userAccount.getId();
  1566. boolean hasExist = synThirdInfoService.getBySysObjId(sysObjId, SynThirdConsts.THIRD_TYPE_DING);
  1567. if (hasExist) {
  1568. // 说明创建过了,直接跳过
  1569. tag = SynThirdConsts.OBJECT_OP_UPD;
  1570. synState = 1;
  1571. description = "创建过,更新对象";
  1572. return retMsg;
  1573. } else {
  1574. retMsg.put("code", true);
  1575. description = "账户名重复:线上手机账号" + dingMobile + "自动合并为本地账号";
  1576. //绑定关系
  1577. userRelationService.syncDingUserRelation(sysObjId, deptIdList, SynThirdConsts.THIRD_TYPE_DING);
  1578. synState = SynThirdConsts.SYN_STATE_OK;
  1579. retMsg.put("msg", description);
  1580. }
  1581. } else {
  1582. // 判断中间表用户组织是否存在
  1583. List<String> deptIdStrList = deptIdList.stream().map(t -> t + "").collect(Collectors.toList());
  1584. QueryWrapper<SynThirdInfoEntity> wrapper = new QueryWrapper<>();
  1585. wrapper.lambda().in(SynThirdInfoEntity::getThirdObjId, deptIdStrList);
  1586. wrapper.lambda().eq(SynThirdInfoEntity::getThirdType, SynThirdConsts.THIRD_TYPE_DING);
  1587. List<SynThirdInfoEntity> synThirdInfoEntities = synThirdInfoService.getBaseMapper().selectList(wrapper);
  1588. if (synThirdInfoEntities != null && !synThirdInfoEntities.isEmpty()) {
  1589. // 返回值初始化
  1590. retMsg.put("code", true);
  1591. retMsg.put("error", userFlag + "系统未设置单条同步");
  1592. userEntity.setId(RandomUtil.uuId());
  1593. userEntity.setHeadIcon("001.png");
  1594. userEntity.setAccount(dingMobile);
  1595. userEntity.setEmail(dingUserModel.getEmail());
  1596. userEntity.setCertificatesNumber(dingUserModel.getJobNumber());
  1597. userEntity.setMobilePhone(dingMobile);
  1598. // userEntity.setGender(2);
  1599. userEntity.setRealName(dingUserName);
  1600. userEntity.setEnabledMark(1);
  1601. if (StringUtil.isBlank(userEntity.getOrganizeId())) {
  1602. String orgId = synThirdInfoService.getSysByThird(String.valueOf(deptIdList.get(0)));
  1603. userEntity.setOrganizeId(orgId);
  1604. }
  1605. sysObjId = userEntity.getId();
  1606. List<String> orgIdList = new ArrayList<>();
  1607. List<String> posIdList = new ArrayList<>();
  1608. for (String deptIdStr : deptIdStrList) {
  1609. String orgId = synThirdInfoService.getSysByThird(deptIdStr);
  1610. orgIdList.add(orgId);
  1611. List<String> ids = new ArrayList<>();
  1612. List<PositionEntity> listByOrganizeId = positionService.getListByOrganizeId(ids, true);
  1613. List<PositionEntity> positionEntityList = listByOrganizeId.stream()
  1614. .filter(t -> t.getDefaultMark().equals(1))
  1615. .collect(Collectors.toList());
  1616. if (CollectionUtil.isNotEmpty(positionEntityList)) {
  1617. posIdList.add(positionEntityList.get(0).getId());
  1618. }
  1619. }
  1620. userEntity.setPositionId(String.join(",", posIdList));
  1621. userEntity.setOrganizeId(String.join(",", orgIdList));
  1622. userService.create(userEntity);
  1623. //绑定关系
  1624. userRelationService.syncDingUserRelation(sysObjId, deptIdList, SynThirdConsts.THIRD_TYPE_DING);
  1625. // 往同步写入本系统与第三方的对应信息
  1626. if (retMsg.getBoolean("code")) {
  1627. // 同步成功
  1628. synState = SynThirdConsts.SYN_STATE_OK;
  1629. } else {
  1630. // 同步失败
  1631. synState = SynThirdConsts.SYN_STATE_FAIL;
  1632. description = userFlag + retMsg.getString("error");
  1633. }
  1634. } else {
  1635. // 无须同步,未同步状态
  1636. synState = SynThirdConsts.SYN_STATE_NO;
  1637. description = userFlag + "用户未同步组织信息";
  1638. retMsg.put("code", false);
  1639. retMsg.put("error", description);
  1640. }
  1641. }
  1642. } else {
  1643. // 无须同步,未同步状态
  1644. synState = SynThirdConsts.SYN_STATE_NO;
  1645. description = userFlag + "系统未设置单条同步";
  1646. retMsg.put("code", true);
  1647. retMsg.put("error", description);
  1648. }
  1649. // 更新同步表
  1650. saveSynThirdInfoEntity(tag, new SynThirdInfoEntity(), Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  1651. Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), sysObjId, dingUserId, synState, description
  1652. , dingUserName, dingUserId);
  1653. return retMsg;
  1654. }
  1655. @Override
  1656. public JSONObject updateUserDingToSystem(boolean isBatch, OapiV2UserListResponse.ListUserResponse dingUserModel)
  1657. throws Exception {
  1658. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  1659. JSONObject retMsg = new JSONObject();
  1660. SynThirdInfoEntity synThirdInfoEntity = new SynThirdInfoEntity();
  1661. String opType = "";
  1662. String thirdObjId = "";
  1663. Integer synState = 0;
  1664. String description = "";
  1665. String userFlag = "更新:";
  1666. // 赋值第三方id
  1667. thirdObjId = dingUserModel.getUserid();
  1668. // 返回值初始化
  1669. retMsg.put("code", true);
  1670. retMsg.put("error", userFlag + "系统未设置单条同步");
  1671. // 单条记录执行时,受开关限制
  1672. int dingIsSyn = config.getDingSynIsSynUser();
  1673. // 支持同步
  1674. if (isBatch || dingIsSyn == 1) {
  1675. // 获取同步表信息
  1676. /**
  1677. * 获取指定第三方工具、指定数据类型、本地对象ID的同步信息
  1678. * // 获取方式如果第三方用户id和第三方组织id会一致则须修改
  1679. * thirdType 22 钉钉
  1680. * dataType 2 用户
  1681. * thirdId 第三方id
  1682. */
  1683. synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING,
  1684. SynThirdConsts.DATA_TYPE_USER, thirdObjId);
  1685. if (synThirdInfoEntity != null && StringUtil.isNoneBlank(synThirdInfoEntity.getSysObjId())) {
  1686. opType = SynThirdConsts.OBJECT_OP_UPD;
  1687. String sysObjId = synThirdInfoEntity.getSysObjId();
  1688. UserEntity info = userService.getInfo(sysObjId);
  1689. if (info == null) {
  1690. synState = SynThirdConsts.SYN_STATE_NO;
  1691. description = "本地更新记录未找到";
  1692. retMsg.put("code", false);
  1693. retMsg.put("error", description);
  1694. synThirdInfoService.removeById(synThirdInfoEntity.getId());
  1695. } else {
  1696. String dingUserName = dingUserModel.getName();
  1697. String dingUserId = dingUserModel.getUserid();
  1698. String dingMobile = dingUserModel.getMobile();
  1699. // 更新系统用户表
  1700. List<Long> deptIdList = dingUserModel.getDeptIdList();
  1701. List<String> deptIdStrList = deptIdList.stream().map(t -> t + "").collect(Collectors.toList());
  1702. info.setMobilePhone(dingMobile);
  1703. info.setAccount(dingMobile);
  1704. info.setRealName(dingUserName);
  1705. List<String> orgIdList = new ArrayList<>();
  1706. List<String> posIdList = new ArrayList<>();
  1707. for (String deptIdStr : deptIdStrList) {
  1708. String orgId = synThirdInfoService.getSysByThird(deptIdStr);
  1709. orgIdList.add(orgId);
  1710. List<String> ids = new ArrayList<>();
  1711. List<PositionEntity> listByOrganizeId = positionService.getListByOrganizeId(ids, true);
  1712. List<PositionEntity> positionEntityList = listByOrganizeId.stream()
  1713. .filter(t -> t.getDefaultMark().equals(1))
  1714. .collect(Collectors.toList());
  1715. if (CollectionUtil.isNotEmpty(positionEntityList)) {
  1716. posIdList.add(positionEntityList.get(0).getId());
  1717. }
  1718. }
  1719. info.setPositionId(String.join(",", posIdList));
  1720. info.setOrganizeId(String.join(",", orgIdList));
  1721. userService.update(info.getId(), info);
  1722. // 检测是否未同步用户组织关联
  1723. userRelationService.syncDingUserRelation(info.getId(), deptIdList, SynThirdConsts.THIRD_TYPE_DING);
  1724. synState = 1;
  1725. // 更新同步表记录
  1726. description = "账号同步更新完成";
  1727. saveSynThirdInfoEntity(opType, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  1728. Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), synThirdInfoEntity.getSysObjId()
  1729. , thirdObjId, synState, description, dingUserName, dingUserId);
  1730. }
  1731. } else {
  1732. if ((synThirdInfoEntity != null && StringUtil.isBlank(synThirdInfoEntity.getSysObjId()))) {
  1733. // 删除记录
  1734. synThirdInfoService.removeById(synThirdInfoEntity.getId());
  1735. }
  1736. opType = SynThirdConsts.OBJECT_OP_ADD;
  1737. thirdObjId = synThirdInfoEntity.getThirdObjId();
  1738. try {
  1739. this.createUserDingToSys(true, dingUserModel, null);
  1740. } catch (ParseException e) {
  1741. e.printStackTrace();
  1742. }
  1743. }
  1744. } else {
  1745. // 未设置单条同步,归并到未同步状态
  1746. synState = SynThirdConsts.SYN_STATE_NO;
  1747. description = userFlag + "系统未设置单条同步";
  1748. retMsg.put("code", true);
  1749. retMsg.put("error", description);
  1750. }
  1751. return retMsg;
  1752. }
  1753. /**
  1754. * 本地删除用户、中间表
  1755. * 不带第三方错误定位判断的功能代码,只获取调用接口的返回信息 20220331
  1756. *
  1757. * @param isBatch 是否批量(批量不受开关限制)
  1758. * @param thirdObjId 钉钉的用户ID
  1759. * @return
  1760. */
  1761. @Override
  1762. public JSONObject deleteUserDingToSys(boolean isBatch, String thirdObjId) throws Exception {
  1763. SocialsSysConfig config = sysconfigService.getSocialsConfig();
  1764. // 单条记录执行时,受开关限制
  1765. int dingIsSyn = isBatch ? 1 : config.getDingSynIsSynUser();
  1766. JSONObject retMsg = new JSONObject();
  1767. SynThirdInfoEntity synThirdInfoEntity = synThirdInfoService.getInfoByThirdObjId(SynThirdConsts.THIRD_TYPE_DING, SynThirdConsts.DATA_TYPE_USER, thirdObjId);
  1768. String sysObjId = "";
  1769. // 返回值初始化
  1770. retMsg.put("code", true);
  1771. retMsg.put("error", "系统未设置单条同步");
  1772. // 支持同步
  1773. if (synThirdInfoEntity != null) {
  1774. sysObjId = synThirdInfoEntity.getSysObjId();
  1775. if (isBatch || dingIsSyn == 1) {
  1776. // 删除企业对应的用户
  1777. if (!"".equals(String.valueOf(sysObjId)) && !"null".equals(String.valueOf(sysObjId))) {
  1778. // 获取用户信息
  1779. UserEntity userEntity = userService.getInfo(sysObjId);
  1780. if (userEntity != null) {
  1781. // 删除用户,更新为标记为不可登录
  1782. // 禁用登录
  1783. userEntity.setEnabledMark(0);
  1784. userEntity.setDescription("由于钉钉系统删除了该用户");
  1785. userService.update(userEntity.getId(), userEntity);
  1786. // 同步成功,直接删除同步表记录
  1787. synThirdInfoService.delete(synThirdInfoEntity);
  1788. } else {
  1789. // 同步失败
  1790. saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  1791. Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), sysObjId, thirdObjId
  1792. , SynThirdConsts.SYN_STATE_FAIL, retMsg.getString("error"), "", "");
  1793. }
  1794. } else {
  1795. // 根据企业微信ID找不到相应的信息,直接删除同步表记录
  1796. synThirdInfoService.delete(synThirdInfoEntity);
  1797. }
  1798. } else {
  1799. // 未设置单条同步,归并到未同步状态
  1800. saveSynThirdInfoEntity(SynThirdConsts.OBJECT_OP_UPD, synThirdInfoEntity, Integer.parseInt(SynThirdConsts.THIRD_TYPE_DING),
  1801. Integer.parseInt(SynThirdConsts.DATA_TYPE_USER), sysObjId, thirdObjId
  1802. , SynThirdConsts.SYN_STATE_NO, "系统未设置同步", "", "");
  1803. retMsg.put("code", true);
  1804. retMsg.put("error", "系统未设置单条同步");
  1805. }
  1806. }
  1807. return retMsg;
  1808. }
  1809. }