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 44 import org.springframework.stereotype.Service;
45 45  
46 46 import java.util.ArrayList;
47   -import java.util.Arrays;
  47 +import java.util.HashSet;
48 48 import java.util.List;
  49 +import java.util.Set;
49 50 import java.util.stream.Collectors;
50 51  
51 52  
... ... @@ -370,7 +371,8 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService {
370 371 }
371 372  
372 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 376 if (sysThirdAccount == null) {
375 377 sysThirdAccount = new SysThirdAccount();
376 378 sysThirdAccount.setSysUserId(sysUser.getId());
... ... @@ -402,8 +404,14 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService {
402 404 List<Department> allDepartment = JdtDepartmentAPI.listAll(accessToken);
403 405 // 根据钉钉部门查询所有钉钉用户,用于反向同步到本地
404 406 List<User> ddUserList = this.getDtAllUserByDepartment(allDepartment, accessToken);
  407 + // 记录已经同步过的用户id,当有多个部门的情况时,只同步一次
  408 + Set<String> syncedUserIdSet = new HashSet<>();
405 409  
406 410 for (User dtUserInfo : ddUserList) {
  411 + if (syncedUserIdSet.contains(dtUserInfo.getUserid())) {
  412 + continue;
  413 + }
  414 + syncedUserIdSet.add(dtUserInfo.getUserid());
407 415 SysThirdAccount sysThirdAccount = sysThirdAccountService.getOneByThirdUserId(dtUserInfo.getUserid(), THIRD_TYPE);
408 416 List<SysUser> collect = sysUsersList.stream().filter(user -> (dtUserInfo.getMobile().equals(user.getPhone()) || dtUserInfo.getUserid().equals(user.getUsername()))
409 417 ).collect(Collectors.toList());
... ... @@ -581,12 +589,6 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService {
581 589 // update-begin--Author:liusq Date:20210713 for:钉钉同步到本地的人员没有状态,导致同步之后无法登录 #I3ZC2L
582 590 sysUser.setStatus(1);
583 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 592 return this.dtUserToSysUser(dtUser, sysUser);
591 593 }
592 594  
... ... @@ -611,7 +613,12 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService {
611 613 } else {
612 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 623 // sysUser.getDelFlag()
617 624 // --- 钉钉没有冻结、启用禁用功能
... ... @@ -763,8 +770,8 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService {
763 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 775 if (response == null) {
769 776 return false;
770 777 }
... ... @@ -774,16 +781,16 @@ public class ThirdAppDingtalkServiceImpl implements IThirdAppService {
774 781 /**
775 782 * 撤回消息
776 783 *
777   - * @param msg_task_id
  784 + * @param msgTaskId
778 785 * @return
779 786 */
780   - public Response<JSONObject> recallMessageResponse(String msg_task_id) {
  787 + public Response<JSONObject> recallMessageResponse(String msgTaskId) {
781 788 String accessToken = this.getAccessToken();
782 789 if (accessToken == null) {
783 790 return null;
784 791 }
785 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 /**
... ...