From 143bc0e662ad47bee14a8be60571829e07890f3e Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期五, 26 九月 2025 18:28:09 +0800
Subject: [PATCH] 钉钉 用户信息同步 与 主动推送
---
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java | 248 ++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 243 insertions(+), 5 deletions(-)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index 830c4fe..43c2c6f 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -7,10 +7,13 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dingtalk.api.response.OapiV2DepartmentGetResponse;
+import com.dingtalk.api.response.OapiV2UserGetResponse;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.DataSyncConfig;
import com.doumee.core.annotation.excel.ExcelImporter;
import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.dingTalk.DingTalk;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseResponse;
@@ -54,6 +57,7 @@
import com.doumee.service.business.third.model.response.TmsEmployeeListResponse;
import com.doumee.service.system.SystemLoginService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.taobao.api.ApiException;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
@@ -67,6 +71,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
+import shade.com.alibaba.fastjson2.JSONArray;
import java.math.BigDecimal;
import java.util.Date;
@@ -138,7 +143,10 @@
private SmsEmailService smsEmailService;
@Autowired
- private SystemLoginService systemLoginService;
+ private SystemLoginService systemLoginService;
+
+ @Autowired
+ private DingTalk dingTalk;
@Value("${debug_model}")
private Boolean isDebug;
@@ -211,9 +219,9 @@
private Member initAddMemberModel(Member member, LoginUserInfo loginUserInfo) {
Member insert= new Member();
- insert.setCreator(loginUserInfo.getId());
+ insert.setCreator(Objects.nonNull(loginUserInfo.getId())?loginUserInfo.getId():null);
insert.setCreateDate(new Date());
- insert.setEditor(loginUserInfo.getId());
+ insert.setEditor(Objects.nonNull(loginUserInfo.getId())?loginUserInfo.getId():null);
insert.setEditDate(new Date());
insert.setHkOrgId(member.getHkOrgId());
insert.setIsdeleted(Constants.ZERO);
@@ -400,6 +408,10 @@
}
}
}
+
+
+
+
private Member isMemberUpdateParamValid(Member member) {
Member model = memberJoinMapper.selectJoinOne(Member.class,new MPJLambdaWrapper<Member>()
.selectAll(Member.class)
@@ -980,14 +992,14 @@
}
TrainTime trainTime = new TrainTime();
trainTime.setIsdeleted(Constants.ZERO);
- trainTime.setCreator(loginUserInfo.getId());
+ trainTime.setCreator(Objects.nonNull(loginUserInfo)?loginUserInfo.getId():null);
trainTime.setCreateDate(new Date());
trainTime.setEdirot(trainTime.getCreator());
trainTime.setEditDate(trainTime.getCreateDate());
trainTime.setStartTime(updateMember.getTrainStartTime());
trainTime.setEndTime(updateMember.getTrainEndTime());
trainTime.setMemberId(updateMember.getId());
- trainTime.setImportInfo("鐢便��"+loginUserInfo.getRealname()+"銆戜簬"+DateUtil.getPlusTime2(trainTime.getCreateDate())+(i==0?"鍒涘缓":"鏇存柊")+"褰曞叆");
+ trainTime.setImportInfo("鐢便��"+(Objects.nonNull(loginUserInfo)?loginUserInfo.getRealname():"閽夐拤鍚屾")+"銆戜簬"+DateUtil.getPlusTime2(trainTime.getCreateDate())+(i==0?"鍒涘缓":"鏇存柊")+"褰曞叆");
//瀵煎叆鍩硅鏈夋晥鏈�
trainTimeMapper.insert(trainTime);
}
@@ -2330,5 +2342,231 @@
}
+ /**
+ * 鍚屾閽夐拤鍐呴儴鍛樺伐淇℃伅
+ */
+ public void syncDDUserInfo() throws ApiException {
+ List<OapiV2UserGetResponse.UserGetResponse> list = dingTalk.syncAllUserInfo();
+ if(CollectionUtils.isEmpty(list)){
+ return;
+ }
+ List<Member> addList = new ArrayList<>();
+ List<Member> updateList = new ArrayList<>();
+ List<String> delIds = new ArrayList<>();//淇敼涓轰娇鐢ㄩ拤閽塱d erpId
+ List<Member> allList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
+ .eq(Member::getIsdeleted,Constants.ZERO)
+ .eq(Member::getType,Constants.TWO));
+ dealMemberChangeList(list,addList,updateList,delIds,allList);
+
+ if(delIds.size()>0){
+ syncDelMember(delIds);
+ }
+
+ }
+
+ private void syncDelMember(List<String> delIds) {
+ List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda().in(Member::getErpId,delIds)
+ .eq(Member::getIsdeleted,Constants.ZERO));
+ if(CollectionUtils.isNotEmpty(memberList)){
+ for (Member member:memberList) {
+ this.deleteById(member.getId(),null);
+ }
+ }
+
+ }
+
+
+ private void dealMemberChangeList(List<OapiV2UserGetResponse.UserGetResponse> list, List<Member> addList, List<Member> updateList, List<String> delIds, List<Member> allList) {
+ Date date = new Date();
+ for(OapiV2UserGetResponse.UserGetResponse respone : list){
+ //鏍规嵁erpid鏌ヨ浼佷笟淇℃伅锛屽垽鏂槸鏂板杩樻槸鏇存柊
+ Member member = findMemberByERPId(allList,respone.getUnionid());
+ if(member == null){
+ //濡傛灉鏄柊澧�
+ //灏佽鏂板缁勭粐瀵硅薄鏁版嵁
+ addList.add(getAddMemberModel(respone,new Member()));
+ }else{
+ updateList.add(getUpdateMemberModel(respone,member));
+ }
+ }
+ if(allList!=null && allList.size()>0){
+ for(Member m : allList){
+ if(!isMemberDeleted(m,list)){
+ delIds.add(m.getErpId());
+ }
+ }
+ }
+ }
+
+ private Member getAddMemberModel(OapiV2UserGetResponse.UserGetResponse deptGetResponse,Member member) {
+ return syncDDAddMemberModel(deptGetResponse,member);
+ }
+
+
+ private Member getUpdateMemberModel(OapiV2UserGetResponse.UserGetResponse deptGetResponse,Member member) {
+ return syncDDEditMemberModel(deptGetResponse,member);
+ }
+
+
+ private Member syncDDAddMemberModel(OapiV2UserGetResponse.UserGetResponse deptGetResponse,Member member) {
+ member.setCreateDate(new Date());
+ member.setErpId(deptGetResponse.getUserid());
+ member.setPhone(deptGetResponse.getMobile());
+ member.setName(deptGetResponse.getName());
+ member.setCode(deptGetResponse.getJobNumber());
+ isMemberParamValidDetail(member,deptGetResponse.getDeptIdList());
+ //鑾峰彇鍑虹敓鏃ユ湡
+ //鑴辨晱鎿嶄綔
+ Member insert = initAddMemberModel(member,null);
+ //娴峰悍浜哄憳鏂板涓氬姟
+ insert.setHkStatus(dealHkUserBiz(insert)?Constants.ONE:Constants.TWO);
+ insert.setHkDate(new Date());
+ memberMapper.insert(insert);
+ //濡傛灉鏄唴閮ㄧ粍缁囦汉鍛橈紝鏂板绯荤粺鐧婚檰璐﹀彿
+ systemUserMapper.insert(createSystemUser(insert,systemDictDataBiz));
+ //澶勭悊鍩硅鏈夋晥鏈熶笟鍔�
+ dealTrainTIme(member,0,null);
+ return insert;
+ }
+
+
+ public void isMemberParamValidDetail(Member member,List<Long> deptIdList) {
+ if(memberMapper.selectCount(new QueryWrapper<Member>().lambda()
+ .eq(Member::getPhone, member.getPhone())
+ .in(Member::getType,new Integer[]{Constants.ZERO,Constants.TWO})
+ .eq(Member::getIsdeleted,Constants.ZERO) ) >0){
+ //throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "鎵嬫満鍙枫��"+member.getPhone()+"銆戝凡琚娇鐢紝涓嶈兘閲嶅");
+ }
+ if(Objects.nonNull(deptIdList)){
+ List<Company> companyList = companyMapper.selectList(new QueryWrapper<Company>().lambda().in(Company::getErpId,deptIdList)
+ .eq(Company::getType,Constants.ONE).eq(Company::getIsdeleted,Constants.ZERO)
+ .isNotNull(Company::getHkId)
+ );
+ if(CollectionUtils.isNotEmpty(companyList)){
+ member.setHkOrgId(companyList.get(Constants.ZERO).getHkId());
+ member.setCompanyId(companyList.get(Constants.ZERO).getId());
+ }
+ }
+ member.setCompanyType(Constants.ONE);
+ SystemUser queryUserDto = new SystemUser();
+ queryUserDto.setUsername(member.getPhone());
+ queryUserDto.setDeleted(Boolean.FALSE);
+ SystemUser user = systemUserMapper.selectOne(new QueryWrapper<>(queryUserDto).last("limit 1"));
+ if (user != null) {
+ throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "鎵嬫満鍙枫��"+queryUserDto.getUsername()+"銆戝凡琚娇鐢紝涓嶈兘閲嶅");
+ }
+// // 楠岃瘉宸ュ彿
+ if (StringUtils.isNotBlank(member.getCode())) {
+ queryUserDto = new SystemUser();
+ queryUserDto.setDeleted(Boolean.FALSE);
+ queryUserDto.setEmpNo(member.getCode());
+ user = systemUserMapper.selectOne(new QueryWrapper<>(queryUserDto).last("limit 1"));
+ if (user != null) {
+ throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "宸ュ彿銆�"+member.getCode()+"銆戝凡瀛樺湪");
+ }
+ }
+ }
+
+ public Member syncDDEditMemberModel(OapiV2UserGetResponse.UserGetResponse deptGetResponse,Member updateMember) {
+ updateMember.setEditDate(new Date());
+ updateMember.setErpId(deptGetResponse.getUserid());
+ updateMember.setPhone(deptGetResponse.getMobile());
+ updateMember.setName(deptGetResponse.getName());
+ updateMember.setCode(deptGetResponse.getJobNumber());
+
+ updateMember.setHkId(null);
+ updateMember.setAuthStatus(Constants.ZERO);
+ Boolean hkFlag = dealHkUserForUpdateBiz(updateMember);
+ memberMapper.update(null,new UpdateWrapper<Member>().lambda()
+ .set(Member::getStartTime,null)
+ .set(Member::getEndTime,null)
+ .set(Member::getRoleId,null)
+ .set(Member::getHkStatus,hkFlag?Constants.ONE:Constants.TWO)
+ .set(StringUtils.isNotBlank(updateMember.getPhone()),Member::getPhone,updateMember.getPhone())
+ .set(StringUtils.isNotBlank(updateMember.getName()),Member::getName,updateMember.getName())
+ .set(Member::getEditDate,updateMember.getEditDate())
+ .set(Member::getEditor,updateMember.getEditor())
+ .set(StringUtils.isNotBlank(updateMember.getName()),Member::getPinyin,Constants.getChinesePingyin(updateMember.getName()))
+ .set(StringUtils.isNotBlank(updateMember.getIdcardNo()),Member::getIdcardNo,updateMember.getIdcardNo())
+ .set(StringUtils.isNotBlank(updateMember.getIdcardDecode()),Member::getIdcardDecode,updateMember.getIdcardDecode())
+ .set( Member::getAuthStatus,Constants.ZERO)
+ .set(updateMember.getSex()!=null,Member::getSex,updateMember.getSex())
+ .set(updateMember.getFaceStatus()!=null,Member::getFaceStatus,updateMember.getFaceStatus())
+ .set(updateMember.getHkDate()!=null,Member::getHkDate,updateMember.getHkDate())
+ .set(StringUtils.isNotBlank(updateMember.getRemark()),Member::getRemark,updateMember.getRemark())
+ .set(StringUtils.isNotBlank(updateMember.getFaceImg()),Member::getFaceImg,updateMember.getFaceImg())
+ .set(updateMember.getFaceId()!=null,Member::getFaceId,updateMember.getFaceId())
+ .set(updateMember.getCompanyId()!=null,Member::getCompanyId,updateMember.getCompanyId())
+ .set(Member::getCode,updateMember.getCode())
+ .set( updateMember.getPositionId()!=null,Member::getPositionId,updateMember.getPositionId())
+ .set( updateMember.getIsDangyuan()!=null,Member::getIsDangyuan,updateMember.getIsDangyuan())
+ .set( updateMember.getJobDate()!=null,Member::getJobDate,updateMember.getJobDate())
+ .eq(Member::getId,updateMember.getId()));
+ dealTrainTIme(updateMember,1,null);
+ cancelAllMemberEmpower(updateMember,memberRoleMapper,empowerMapper);
+ //璁板綍鎿嶄綔鏃ュ織
+ saveUserActionBiz(updateMember,null,Constants.UserActionType.EDIT,userActionJoinMapper,null);
+ return updateMember;
+ }
+
+ /**
+ * 鏍规嵁ERPID 鍒ゆ柇鏁版嵁鏄惁宸插湪闆嗗悎閲屽瓨鍦�
+ * @param allList
+ * @param id
+ * @return
+ */
+ private Member findMemberByERPId(List<Member> allList, String id) {
+ if(allList!=null){
+ for(Member com :allList){
+ if(StringUtils.equals(com.getErpId(),id)){
+ return com;
+ }
+ }
+ }
+ return null;
+ }
+
+ private boolean isMemberDeleted(Member member, List<OapiV2UserGetResponse.UserGetResponse> list) {
+ for(OapiV2UserGetResponse.UserGetResponse m : list){
+ if(StringUtils.equals(m.getUnionid(),member.getErpId())){
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ public void ddPushMemberInfo(String eventType, shade.com.alibaba.fastjson2.JSONObject eventData) throws ApiException {
+ JSONArray jsonArray = eventData.getJSONArray("userId");
+ if(jsonArray.isEmpty()){
+ return;
+ }
+ if(eventType.equals("user_leave_org")){
+ //鍒犻櫎瀵逛汉鍛樹俊鎭�
+ List<String> userIdList = new ArrayList<>();
+ for (int i = 0; i < jsonArray.size(); i++) {
+ String deptId = jsonArray.getString(i);
+ userIdList.add(deptId);
+ }
+ if(CollectionUtils.isNotEmpty(userIdList)){
+ syncDelMember(userIdList);
+ }
+ }else if(eventType.equals("user_add_org")||eventType.equals("user_modify_org")){
+ for (int i = 0; i < jsonArray.size(); i++) {
+ Member member = memberMapper.selectOne(new QueryWrapper<Member>().lambda()
+ .eq(Member::getIsdeleted,Constants.ZERO)
+ .eq(Member::getErpId,jsonArray.getLong(i))
+ .last(" limit 1")
+ );
+ OapiV2UserGetResponse.UserGetResponse deptGetResponse = dingTalk.syncUserInfo(jsonArray.getString(i));
+ if(Objects.isNull(member)){
+ getAddMemberModel(deptGetResponse,member);
+ }else{
+ getUpdateMemberModel(deptGetResponse,member);
+ }
+ }
+ }
+ }
+
}
--
Gitblit v1.9.3