Commit a9e1e59552b5b7df345564ffad65810aa75a96c5

Authored by zhangdaiscott
1 parent e7eec8e5

【issues/3666】同步钉钉用户到本地,违反数据库唯一主键规则,导致插入失败

jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/service/impl/ThirdAppDingtalkServiceImpl.java
@@ -44,8 +44,9 @@ import org.springframework.dao.DuplicateKeyException; @@ -44,8 +44,9 @@ import org.springframework.dao.DuplicateKeyException;
44 import org.springframework.stereotype.Service; 44 import org.springframework.stereotype.Service;
45 45
46 import java.util.ArrayList; 46 import java.util.ArrayList;
47 -import java.util.Arrays; 47 +import java.util.HashSet;
48 import java.util.List; 48 import java.util.List;
  49 +import java.util.Set;
49 import java.util.stream.Collectors; 50 import java.util.stream.Collectors;
50 51
51 52
@@ -370,7 +371,8 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { @@ -370,7 +371,8 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService {
370 } 371 }
371 372
372 // api 接口执行成功,并且 sys_third_account 表匹配失败,就向 sys_third_account 里插入一条数据 373 // api 接口执行成功,并且 sys_third_account 表匹配失败,就向 sys_third_account 里插入一条数据
373 - if (apiSuccess && (sysThirdAccount == null || oConvertUtils.isEmpty(sysThirdAccount.getThirdUserId()))) { 374 + boolean flag = (sysThirdAccount == null || oConvertUtils.isEmpty(sysThirdAccount.getThirdUserId()));
  375 + if (apiSuccess && flag) {
374 if (sysThirdAccount == null) { 376 if (sysThirdAccount == null) {
375 sysThirdAccount = new SysThirdAccount(); 377 sysThirdAccount = new SysThirdAccount();
376 sysThirdAccount.setSysUserId(sysUser.getId()); 378 sysThirdAccount.setSysUserId(sysUser.getId());
@@ -402,8 +404,14 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { @@ -402,8 +404,14 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService {
402 List<Department> allDepartment = JdtDepartmentAPI.listAll(accessToken); 404 List<Department> allDepartment = JdtDepartmentAPI.listAll(accessToken);
403 // 根据钉钉部门查询所有钉钉用户,用于反向同步到本地 405 // 根据钉钉部门查询所有钉钉用户,用于反向同步到本地
404 List<User> ddUserList = this.getDtAllUserByDepartment(allDepartment, accessToken); 406 List<User> ddUserList = this.getDtAllUserByDepartment(allDepartment, accessToken);
  407 + // 记录已经同步过的用户id,当有多个部门的情况时,只同步一次
  408 + Set<String> syncedUserIdSet = new HashSet<>();
405 409
406 for (User dtUserInfo : ddUserList) { 410 for (User dtUserInfo : ddUserList) {
  411 + if (syncedUserIdSet.contains(dtUserInfo.getUserid())) {
  412 + continue;
  413 + }
  414 + syncedUserIdSet.add(dtUserInfo.getUserid());
407 SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByThirdUserId(dtUserInfo.getUserid(), THIRD_TYPE); 415 SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByThirdUserId(dtUserInfo.getUserid(), THIRD_TYPE);
408 List<SysUser> collect = sysUsersList.stream().filter(user -> (dtUserInfo.getMobile().equals(user.getPhone()) || dtUserInfo.getUserid().equals(user.getUsername())) 416 List<SysUser> collect = sysUsersList.stream().filter(user -> (dtUserInfo.getMobile().equals(user.getPhone()) || dtUserInfo.getUserid().equals(user.getUsername()))
409 ).collect(Collectors.toList()); 417 ).collect(Collectors.toList());
@@ -581,12 +589,6 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { @@ -581,12 +589,6 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService {
581 // update-begin--Author:liusq Date:20210713 for:钉钉同步到本地的人员没有状态,导致同步之后无法登录 #I3ZC2L 589 // update-begin--Author:liusq Date:20210713 for:钉钉同步到本地的人员没有状态,导致同步之后无法登录 #I3ZC2L
582 sysUser.setStatus(1); 590 sysUser.setStatus(1);
583 // update-end--Author:liusq Date:20210713 for:钉钉同步到本地的人员没有状态,导致同步之后无法登录 #I3ZC2L 591 // update-end--Author:liusq Date:20210713 for:钉钉同步到本地的人员没有状态,导致同步之后无法登录 #I3ZC2L
584 - // 设置工号,如果工号为空,则使用username  
585 - if (oConvertUtils.isEmpty(dtUser.getJob_number())) {  
586 - sysUser.setWorkNo(dtUser.getUserid());  
587 - } else {  
588 - sysUser.setWorkNo(dtUser.getJob_number());  
589 - }  
590 return this.dtUserToSysUser(dtUser, sysUser); 592 return this.dtUserToSysUser(dtUser, sysUser);
591 } 593 }
592 594
@@ -611,7 +613,12 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { @@ -611,7 +613,12 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService {
611 } else { 613 } else {
612 sysUser.setPhone(null); 614 sysUser.setPhone(null);
613 } 615 }
614 - sysUser.setWorkNo(null); 616 + // 设置工号,如果工号为空,则使用username
  617 + if (oConvertUtils.isEmpty(dtUser.getJob_number())) {
  618 + sysUser.setWorkNo(dtUser.getUserid());
  619 + } else {
  620 + sysUser.setWorkNo(dtUser.getJob_number());
  621 + }
615 // --- 钉钉没有逻辑删除功能 622 // --- 钉钉没有逻辑删除功能
616 // sysUser.getDelFlag() 623 // sysUser.getDelFlag()
617 // --- 钉钉没有冻结、启用禁用功能 624 // --- 钉钉没有冻结、启用禁用功能
@@ -763,8 +770,8 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { @@ -763,8 +770,8 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService {
763 return JdtMessageAPI.sendTextMessage(textMessage, accessToken); 770 return JdtMessageAPI.sendTextMessage(textMessage, accessToken);
764 } 771 }
765 772
766 - public boolean recallMessage(String msg_task_id) {  
767 - Response<JSONObject> response = this.recallMessageResponse(msg_task_id); 773 + public boolean recallMessage(String msgTaskId) {
  774 + Response<JSONObject> response = this.recallMessageResponse(msgTaskId);
768 if (response == null) { 775 if (response == null) {
769 return false; 776 return false;
770 } 777 }
@@ -774,16 +781,16 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService { @@ -774,16 +781,16 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService {
774 /** 781 /**
775 * 撤回消息 782 * 撤回消息
776 * 783 *
777 - * @param msg_task_id 784 + * @param msgTaskId
778 * @return 785 * @return
779 */ 786 */
780 - public Response<JSONObject> recallMessageResponse(String msg_task_id) { 787 + public Response<JSONObject> recallMessageResponse(String msgTaskId) {
781 String accessToken = this.getAccessToken(); 788 String accessToken = this.getAccessToken();
782 if (accessToken == null) { 789 if (accessToken == null) {
783 return null; 790 return null;
784 } 791 }
785 int agentId = thirdAppConfig.getDingtalk().getAgentIdInt(); 792 int agentId = thirdAppConfig.getDingtalk().getAgentIdInt();
786 - return JdtMessageAPI.recallMessage(agentId, msg_task_id, getAccessToken()); 793 + return JdtMessageAPI.recallMessage(agentId, msgTaskId, getAccessToken());
787 } 794 }
788 795
789 /** 796 /**