Quellcode durchsuchen

Merge remote-tracking branch 'origin/master'

徐滕 vor 1 Monat
Ursprung
Commit
9af784d673
25 geänderte Dateien mit 1277 neuen und 426 gelöschten Zeilen
  1. 5 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/factory/HumanApiFallBackFactory.java
  2. 4 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/feign/IHumanApi.java
  3. 5 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/domain/User.java
  4. 6 0
      jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/UserDTO.java
  5. 12 0
      jeeplus-modules/jeeplus-human/pom.xml
  6. 13 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/controller/HandoverRecoveryController.java
  7. 104 81
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/service/HandoverRecoveryService.java
  8. 10 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/controller/EnrollmentRegistrationController.java
  9. 1 1
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/domain/EnrollmentRegistration.java
  10. 4 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/EnrollmentRegistrationMapper.java
  11. 9 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/xml/EnrollmentRegistrationMapper.xml
  12. 218 121
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/service/EnrollmentRegistrationService.java
  13. 26 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/service/dto/DingTalkUserDTO.java
  14. 172 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/utils/DingTalkSyncUtil.java
  15. 202 0
      jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/utils/DingTalkUtils.java
  16. 1 0
      jeeplus-modules/jeeplus-human/src/main/resources/application-human-development.yml
  17. 0 2
      jeeplus-modules/jeeplus-human/src/main/resources/application-human-production.yml
  18. 13 0
      jeeplus-modules/jeeplus-system/pom.xml
  19. 23 4
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/xml/UserMapper.xml
  20. 181 155
      jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/UserService.java
  21. 203 62
      jeeplus-modules/jeeplus-test/src/main/java/com/jeeplus/test/dingding/controller/DingdingAddressBookController.java
  22. 29 0
      jeeplus-modules/jeeplus-test/src/main/java/com/jeeplus/test/dingding/dto/AddUserDTO.java
  23. 11 0
      jeeplus-modules/jeeplus-test/src/main/java/com/jeeplus/test/dingding/dto/DdUserDTO.java
  24. 16 0
      jeeplus-modules/jeeplus-test/src/main/java/com/jeeplus/test/dingding/dto/UserRequestDTO.java
  25. 9 0
      jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java

+ 5 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/factory/HumanApiFallBackFactory.java

@@ -56,6 +56,11 @@ public class HumanApiFallBackFactory implements FallbackFactory<IHumanApi> {
             public void updatePracticeStatus(String id) {
 
             }
+
+            @Override
+            public void syncDingTalkInfo() {
+
+            }
         };
     }
 }

+ 4 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/flowable/feign/IHumanApi.java

@@ -54,4 +54,8 @@ public interface IHumanApi {
     //修改实习状态
     @PostMapping(value = "/register/updatePracticeStatus")
     void updatePracticeStatus(@RequestParam(value = "id")String id);
+
+    //同步钉钉数据
+    @GetMapping(value = "/enrollmentRegistration/syncDingTalkInfo")
+    void syncDingTalkInfo();
 }

+ 5 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/domain/User.java

@@ -117,6 +117,11 @@ public class User extends BaseEntity {
     private Boolean isAdmin;
 
     /**
+     * 关联钉钉ID
+     */
+    private String ddId;
+
+    /**
      * 备注
      */
     private String remarks;

+ 6 - 0
jeeplus-api/jeeplus-system-api/src/main/java/com/jeeplus/sys/service/dto/UserDTO.java

@@ -252,6 +252,12 @@ public class UserDTO extends BaseDTO implements Serializable {
     private boolean isAdmin;
 
     /**
+     * 钉钉id
+     */
+    @ExcelIgnore
+    private String ddId;
+
+    /**
      * 是否获取其他服务待办
      */
     private String otherServiceFlag;

+ 12 - 0
jeeplus-modules/jeeplus-human/pom.xml

@@ -145,6 +145,18 @@
             <groupId>org.springframework</groupId>
             <artifactId>spring-test</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dingtalk</artifactId>
+            <version>2.1.87</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
+            <version>2.0.0</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 13 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/controller/HandoverRecoveryController.java

@@ -5,6 +5,7 @@ import com.jeeplus.human.depart.handover.domain.HandoverRecovery;
 import com.jeeplus.human.depart.handover.service.HandoverRecoveryService;
 import com.jeeplus.logging.annotation.ApiLog;
 import com.jeeplus.logging.constant.enums.LogTypeEnum;
+import com.jeeplus.sys.utils.DictUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.http.ResponseEntity;
@@ -60,4 +61,16 @@ public class HandoverRecoveryController {
     public void updateStatusById(@RequestBody HandoverRecovery dto) {
         recoveryService.updateStatusById(dto);
     }
+
+    /**
+     * 根据租户和用户数据删除钉钉用户数据
+     */
+    @ApiOperation(value = "根据租户和用户数据删除钉钉用户数据")
+    @PostMapping(value = "deleteDingTalkByTenantId")
+    public void deleteDingTalkByTenantId(String mobilePhone) {
+        String dictValue = DictUtils.getDictValue("dd_status", "dd_status", "0");
+        if("1".equals(dictValue)) {
+            recoveryService.deleteDingTalkByTenantId(mobilePhone);
+        }
+    }
 }

+ 104 - 81
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/handover/service/HandoverRecoveryService.java

@@ -12,6 +12,8 @@ import com.jeeplus.human.depart.handover.domain.HandoverRecovery;
 import com.jeeplus.human.depart.handover.mapper.HandoverMapper;
 import com.jeeplus.human.depart.handover.mapper.HandoverRecoveryMapper;
 import com.jeeplus.human.enrollment.enrollmentRegistration.mapper.EnrollmentRegistrationMapper;
+import com.jeeplus.human.enrollment.enrollmentRegistration.service.dto.DingTalkUserDTO;
+import com.jeeplus.human.enrollment.enrollmentRegistration.utils.DingTalkUtils;
 import com.jeeplus.human.signature.entity.Action;
 import com.jeeplus.human.signature.entity.Location;
 import com.jeeplus.human.signature.entity.SignatorieInfo;
@@ -50,12 +52,12 @@ public class HandoverRecoveryService extends ServiceImpl<HandoverRecoveryMapper,
     /**
      * 离职盖章流程id
      */
-    private static String DIMISSIONID  = Global.getConfig("dimission_id");
+    private static String DIMISSIONID = Global.getConfig("dimission_id");
 
     /**
      * 会计公司印章
      */
-    private static String COMPANYROUNDSEALFINANCEID  = Global.getConfig("company_round_seal_finance_id");
+    private static String COMPANYROUNDSEALFINANCEID = Global.getConfig("company_round_seal_finance_id");
 
     @Resource
     private HandoverRecoveryMapper recoveryMapper;
@@ -66,9 +68,12 @@ public class HandoverRecoveryService extends ServiceImpl<HandoverRecoveryMapper,
     @Resource
     private EnrollmentRegistrationMapper registrationMapper;
 
-    public void deleteByRegistrationId(String id){
+    @Resource
+    private DingTalkUtils dingTalkUtils;
+
+    public void deleteByRegistrationId(String id) {
         QueryWrapper<HandoverRecovery> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("handover_id",id);
+        queryWrapper.eq("handover_id", id);
         recoveryMapper.delete(queryWrapper);
     }
 
@@ -84,10 +89,10 @@ public class HandoverRecoveryService extends ServiceImpl<HandoverRecoveryMapper,
     }
 
     public HandoverRecovery saveHandoverRecovery(HandoverRecovery accounts) throws Exception {
-        if (StringUtils.isNotEmpty(accounts.getId())){
+        if (StringUtils.isNotEmpty(accounts.getId())) {
 
             HandoverRecovery report = recoveryMapper.getById(accounts.getId());
-            if (report != null){
+            if (report != null) {
                 accounts.setCreateById(report.getCreateById());
                 return update(accounts);
             }
@@ -99,9 +104,9 @@ public class HandoverRecoveryService extends ServiceImpl<HandoverRecoveryMapper,
      * 新增
      */
     @Transactional(rollbackFor = Exception.class)
-    public HandoverRecovery add(HandoverRecovery reportData) throws Exception{
+    public HandoverRecovery add(HandoverRecovery reportData) throws Exception {
 
-        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+        UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
 
         HandoverRecovery report = new HandoverRecovery();
         BeanUtils.copyProperties(reportData, report);
@@ -113,13 +118,14 @@ public class HandoverRecoveryService extends ServiceImpl<HandoverRecoveryMapper,
 
         return report;
     }
+
     /**
      * 修改
      */
     @Transactional(rollbackFor = Exception.class)
-    public HandoverRecovery update(HandoverRecovery reportData) throws Exception{
+    public HandoverRecovery update(HandoverRecovery reportData) throws Exception {
         //获取当前登录人信息
-        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+        UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
 
         HandoverRecovery report = new HandoverRecovery();
         BeanUtils.copyProperties(reportData, report);
@@ -127,13 +133,13 @@ public class HandoverRecoveryService extends ServiceImpl<HandoverRecoveryMapper,
         report.setUpdateTime(new Date());
         recoveryMapper.updateById(report);
 
-        if (report.getType().equals("5")){
+        if (report.getType().equals("5")) {
             //根据用户id将在职状态改为离职
             Handover handover = handoverMapper.getById(report.getHandoverId());
             //获取当前登录人信息
-            UserDTO createUserDTO = SpringUtil.getBean ( IUserApi.class ).getById(handover.getCreateById());
+            UserDTO createUserDTO = SpringUtil.getBean(IUserApi.class).getById(handover.getCreateById());
 
-            List<WorkAttachmentInfo> attachmentInfoList = SpringUtil.getBean ( IWorkAttachmentApi.class ).selectListByAttachmentId(handover.getId());
+            List<WorkAttachmentInfo> attachmentInfoList = SpringUtil.getBean(IWorkAttachmentApi.class).selectListByAttachmentId(handover.getId());
 
             registrationMapper.updateByUserId(handover.getCreateById());
             //发送通知给岗位【考勤统计人】
@@ -144,110 +150,112 @@ public class HandoverRecoveryService extends ServiceImpl<HandoverRecoveryMapper,
             SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
             String day = format.format(new Date());
             String userName = SpringUtil.getBean(IUserApi.class).getById(userId).getName();
-            Map<String ,String > map = new HashMap<>();
-
-            map.put("taskId",uuid);
-            map.put("title","员工:" + handover.getName() +"已离职");
-            map.put("defId",report.getId());
-            map.put("taskName","员工:" + handover.getName() +"已离职");
-            map.put("createUser",userDTO.getLoginName());
-            map.put("createTime",day);
-            map.put("noticeName",userName);
-            map.put("noticeId",userId);
-            map.put("createById",report.getCreateById());
+            Map<String, String> map = new HashMap<>();
+
+            map.put("taskId", uuid);
+            map.put("title", "员工:" + handover.getName() + "已离职");
+            map.put("defId", report.getId());
+            map.put("taskName", "员工:" + handover.getName() + "已离职");
+            map.put("createUser", userDTO.getLoginName());
+            map.put("createTime", day);
+            map.put("noticeName", userName);
+            map.put("noticeId", userId);
+            map.put("createById", report.getCreateById());
             SpringUtil.getBean(IFlowableApi.class).add(map);
             //发送通知给员工,可下载盖电子章的离职证明
-            Map<String ,String > map2 = new HashMap<>();
-
-            if("1".equals(handover.getSignatureFlag())){
-                map2.put("title","离职交接审批完成,请点击下载离职证明");
-                map2.put("taskName","离职交接审批完成,请点击下载离职证明");
-            }else{
-                map2.put("title","离职交接审批完成,请点击下载离职证明,并到办公室进行盖章");
-                map2.put("taskName","离职交接审批完成,请点击下载离职证明,并到办公室进行盖章");
-                map2.put("dimissionProveUrl","离职交接审批完成,请点击下载离职证明");
+            Map<String, String> map2 = new HashMap<>();
+
+            if ("1".equals(handover.getSignatureFlag())) {
+                map2.put("title", "离职交接审批完成,请点击下载离职证明");
+                map2.put("taskName", "离职交接审批完成,请点击下载离职证明");
+            } else {
+                map2.put("title", "离职交接审批完成,请点击下载离职证明,并到办公室进行盖章");
+                map2.put("taskName", "离职交接审批完成,请点击下载离职证明,并到办公室进行盖章");
+                map2.put("dimissionProveUrl", "离职交接审批完成,请点击下载离职证明");
             }
 
-            if(attachmentInfoList.size()>0){
-                map2.put("dimissionProveUrl",attachmentInfoList.get(0).getUrl());
-            }else{
-                map2.put("dimissionProveUrl","");
+            if (attachmentInfoList.size() > 0) {
+                map2.put("dimissionProveUrl", attachmentInfoList.get(0).getUrl());
+            } else {
+                map2.put("dimissionProveUrl", "");
             }
-            map2.put("taskId",uuid);
-            map2.put("fileName",createUserDTO.getName() + "离职证明");
-            map2.put("defId",report.getHandoverId());
-            map2.put("createUser",userDTO.getLoginName());
-            map2.put("createTime",day);
-            map2.put("noticeName",userName);
-            map2.put("noticeId",handover.getCreateById());
-            map2.put("createById",userDTO.getId());
+            map2.put("taskId", uuid);
+            map2.put("fileName", createUserDTO.getName() + "离职证明");
+            map2.put("defId", report.getHandoverId());
+            map2.put("createUser", userDTO.getLoginName());
+            map2.put("createTime", day);
+            map2.put("noticeName", userName);
+            map2.put("noticeId", handover.getCreateById());
+            map2.put("createById", userDTO.getId());
             SpringUtil.getBean(IFlowableApi.class).add(map2);
 
             //离职证明电子章处理
             //对离职证明进行盖章操作
             Map<String, Object> signatureContractIdMap = createSignatureContractId(handover.getWordFilePath());
             boolean success = (boolean) signatureContractIdMap.get("success");
-            if(success){
+            if (success) {
                 handover.setSignatureContractId(signatureContractIdMap.get("contractId").toString());
                 handoverMapper.updateById(handover);
-            }else{
+            } else {
                 System.out.println(signatureContractIdMap);
             }
         }
 
         return report;
     }
+
     /**
      * 生成并保存签章contractId 信息
+     *
      * @param filePath 临时文件路径(需盖章文件)
      * @return
      */
-    public Map<String,Object> createSignatureContractId(String filePath){
-        Map<String,Object> map = new HashMap<String,Object>();
+    public Map<String, Object> createSignatureContractId(String filePath) {
+        Map<String, Object> map = new HashMap<String, Object>();
 
         //获取文件生成的documentId
         List<String> documentList = Lists.newArrayList();
 
-        try{
+        try {
             //将下载下来的文件转换为file文件
             File srcFile = new File(filePath);
             //截取文件后缀名
-            String substring = srcFile.getName().substring(srcFile.getName().lastIndexOf(".")+1, srcFile.getName().length());
-            if(!"doc".equals(substring.toLowerCase()) && !"docx".equals(substring.toLowerCase()) && !"pdf".equals(substring.toLowerCase())){
-                map.put("success",false);
-                map.put("message","请上传doc、docx或者pdf的文件进行签章操作");
+            String substring = srcFile.getName().substring(srcFile.getName().lastIndexOf(".") + 1, srcFile.getName().length());
+            if (!"doc".equals(substring.toLowerCase()) && !"docx".equals(substring.toLowerCase()) && !"pdf".equals(substring.toLowerCase())) {
+                map.put("success", false);
+                map.put("message", "请上传doc、docx或者pdf的文件进行签章操作");
                 return map;
             }
             //获取真签单的documentId
             HashMap hashMap = new SignaturePostUtil().getDocument(srcFile);
             String code = hashMap.get("code").toString();
             String documentId = "";
-            if("0".equals(code)){
+            if ("0".equals(code)) {
                 String result = hashMap.get("result").toString();
                 HashMap documentIdMap = JSON.parseObject(result, HashMap.class);
-                documentId =  documentIdMap.get("documentId").toString();
-                if("".equals(documentId)){
-                    map.put("success",false);
-                    map.put("message","离职证明文件创建失败");
+                documentId = documentIdMap.get("documentId").toString();
+                if ("".equals(documentId)) {
+                    map.put("success", false);
+                    map.put("message", "离职证明文件创建失败");
                     return map;
                 }
-            }else{
+            } else {
                 String message = hashMap.get("message").toString();
-                map.put("success",false);
-                map.put("message",message);
+                map.put("success", false);
+                map.put("message", message);
                 return map;
             }
 
             documentList.add(documentId);
 
-        }catch (Exception e){
+        } catch (Exception e) {
 
-        }finally {
-            if(StringUtils.isNotBlank(filePath)){
+        } finally {
+            if (StringUtils.isNotBlank(filePath)) {
                 //根据路径创建文件对象
                 File file = new File(filePath);
                 //路径是个文件且不为空时删除文件
-                if(file.isFile()&&file.exists()){
+                if (file.isFile() && file.exists()) {
                     file.delete();
                 }
             }
@@ -257,33 +265,34 @@ public class HandoverRecoveryService extends ServiceImpl<HandoverRecoveryMapper,
         HashMap contractIdHashMap = this.getSignatureContractIdByPageSign(documentList);
         String contractIdCode = contractIdHashMap.get("code").toString();
         String contractId = "";
-        if("0".equals(contractIdCode)){
+        if ("0".equals(contractIdCode)) {
             contractId = contractIdHashMap.get("contractId").toString();
-            map.put("contractId",contractId);
-            if("".equals(contractId)){
-                map.put("success",false);
-                map.put("message","签章文件创建失败");
+            map.put("contractId", contractId);
+            if ("".equals(contractId)) {
+                map.put("success", false);
+                map.put("message", "签章文件创建失败");
                 return map;
             }
 
-        }else{
-            map.put("success",false);
-            map.put("message",contractIdHashMap.get("message").toString());
+        } else {
+            map.put("success", false);
+            map.put("message", contractIdHashMap.get("message").toString());
             return map;
         }
 
-        map.put("success",true);
-        map.put("message","生成签章contractId成功");
+        map.put("success", true);
+        map.put("message", "生成签章contractId成功");
         return map;
     }
 
     /**
      * 根据项目报告id 和 documentId生成合同id(页面签署生成)
      * 个人签字章功能
+     *
      * @param documentList
      * @return
      */
-    public HashMap getSignatureContractIdByPageSign( List<String> documentList){
+    public HashMap getSignatureContractIdByPageSign(List<String> documentList) {
         HashMap hashMap = new HashMap();
         Set<String> serialIdSet = new HashSet<>();
         //创建签署方信息
@@ -326,10 +335,10 @@ public class HandoverRecoveryService extends ServiceImpl<HandoverRecoveryMapper,
         signatureContract.setSubject("" + "离职证明");//添加项目名称
         net.sf.json.JSONObject json = net.sf.json.JSONObject.fromObject(signatureContract);
         System.out.println(json.toString());
-        long s5=System.currentTimeMillis();
+        long s5 = System.currentTimeMillis();
         System.out.println(json.toString());
         String contractIdMapStr = SignaturePostUtil.sendPostApplicationJson(HTTPTOP + "/contract/createbycategory", json.toString());
-        long s6=System.currentTimeMillis();
+        long s6 = System.currentTimeMillis();
         System.out.println("获取合同id获取时间:" + (s6 - s5));
         hashMap = JSON.parseObject(contractIdMapStr, HashMap.class);
 
@@ -337,8 +346,7 @@ public class HandoverRecoveryService extends ServiceImpl<HandoverRecoveryMapper,
     }
 
 
-
-    public String getAssignee(String roleId){
+    public String getAssignee(String roleId) {
         List<UserDTO> userDTOS = SpringUtil.getBean(IUserApi.class).findListFlowAbleByPostId(roleId);
         StringJoiner idJoiner = new StringJoiner(",");
         for (UserDTO user : userDTOS) {
@@ -347,4 +355,19 @@ public class HandoverRecoveryService extends ServiceImpl<HandoverRecoveryMapper,
 
         return idJoiner.toString();
     }
+
+    /**
+     * 根据用户数据删除对应的钉钉数据
+     * @param mobilePhone
+     */
+    public void deleteDingTalkByTenantId(String mobilePhone) {
+        UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByMobile(mobilePhone);
+        //判断用户是否为 评估 或者 会计 员工
+        if (userDTO.getTenantDTO().getId().equals("10003") || userDTO.getTenantDTO().getId().equals("10001")) {
+            DingTalkUserDTO dingTalkUserDTO = new DingTalkUserDTO();
+            dingTalkUserDTO.setUserid(userDTO.getDdId());
+            dingTalkUtils.deleteUser(dingTalkUserDTO, userDTO.getTenantDTO().getId());
+        }
+    }
+
 }

+ 10 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/controller/EnrollmentRegistrationController.java

@@ -13,6 +13,7 @@ import com.jeeplus.human.enrollment.enrollmentRegistration.domain.*;
 import com.jeeplus.human.enrollment.enrollmentRegistration.service.*;
 import com.jeeplus.human.enrollment.enrollmentRegistration.service.dto.ExportDTO;
 import com.jeeplus.human.enrollment.enrollmentRegistration.service.dto.UserTemplate;
+import com.jeeplus.human.enrollment.enrollmentRegistration.utils.DingTalkSyncUtil;
 import com.jeeplus.human.enrollment.enrollmentRegistration.utils.EasyPoiUtil;
 import com.jeeplus.logging.annotation.ApiLog;
 import com.jeeplus.logging.constant.enums.LogTypeEnum;
@@ -63,6 +64,8 @@ public class EnrollmentRegistrationController {
 
     @Resource
     private EnrollmentWageCardService wageCardService;
+    @Resource
+    private DingTalkSyncUtil dingTalkSyncUtil;
 
     /**
      * 下载门禁卡开通注意事项
@@ -647,4 +650,11 @@ public class EnrollmentRegistrationController {
 
     }
 
+    @ApiLog(value = "同步钉钉id", type = LogTypeEnum.EXPORT)
+    @GetMapping("syncDingTalkInfo")
+    @ApiOperation(value = "同步钉钉id")
+    public void syncDingTalkInfo() {
+        dingTalkSyncUtil.getUserByMobileSyncData();
+    }
+
 }

+ 1 - 1
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/domain/EnrollmentRegistration.java

@@ -59,7 +59,7 @@ public class EnrollmentRegistration extends BaseEntity {
     private String userId;              //用户id
     private String projectManager;      //项目经理
     private String processType;      //流程类型(0:入职登记流程,1:信息完善流程)
-
+    private String ddId;      //关联钉钉id
     @TableField(exist = false)
     private String socialSecurityNumber;        //社保编号
     @TableField(exist = false)

+ 4 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/EnrollmentRegistrationMapper.java

@@ -45,6 +45,10 @@ public interface EnrollmentRegistrationMapper extends BaseMapper<EnrollmentRegis
      */
     void updateByUserId(@Param("userId") String userId);
 
+    void updateDdIdById(EnrollmentRegistration enrollmentRegistration);
+
+
+
     List<EnrollmentRegistration> getFormalUserInfo();
 
     /**

+ 9 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/mapper/xml/EnrollmentRegistrationMapper.xml

@@ -26,6 +26,7 @@
         a.start_time,
         a.end_time,
         a.education,
+        a.dd_id,
         a.education_nature,
         a.graduated_or_not,
         a.english_level,
@@ -161,4 +162,12 @@
         FROM `human_resources_enrollment_registration`  a
         WHERE a.mobile_phone = #{mobilePhone} and a.del_flag = '0'
     </select>
+
+    <update id="updateDdIdById">
+        update human_resources_enrollment_registration set
+        <if test="ddId != null ">
+            dd_id = #{ddId}
+        </if>
+        where user_id =#{userId} and del_flag = '0'
+    </update>
 </mapper>

+ 218 - 121
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/service/EnrollmentRegistrationService.java

@@ -9,6 +9,9 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dingtalk.api.response.OapiV2DepartmentListsubResponse;
+import com.dingtalk.api.response.OapiV2UserCreateResponse;
+import com.dingtalk.api.response.OapiV2UserGetResponse;
 import com.jeeplus.common.SecurityUtils;
 import com.jeeplus.common.TokenProvider;
 import com.jeeplus.core.query.QueryWrapperGenerator;
@@ -20,13 +23,18 @@ import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentWage
 import com.jeeplus.human.enrollment.enrollmentRegistration.mapper.EnrollmentRegistrationMapper;
 import com.jeeplus.human.enrollment.enrollmentRegistration.mapper.EnrollmentSocialSecurityCardMapper;
 import com.jeeplus.human.enrollment.enrollmentRegistration.mapper.EnrollmentWageCardMapper;
+import com.jeeplus.human.enrollment.enrollmentRegistration.service.dto.DingTalkUserDTO;
 import com.jeeplus.human.enrollment.enrollmentRegistration.service.dto.ExportDTO;
+import com.jeeplus.human.enrollment.enrollmentRegistration.utils.DingTalkUtils;
 import com.jeeplus.human.enrollment.enrollmentRegistration.utils.SnowFlake;
+import com.jeeplus.sys.domain.User;
 import com.jeeplus.sys.feign.IOfficeApi;
 import com.jeeplus.sys.feign.IPostApi;
 import com.jeeplus.sys.feign.IRoleApi;
 import com.jeeplus.sys.feign.IUserApi;
 import com.jeeplus.sys.service.dto.*;
+import com.jeeplus.sys.utils.DictUtils;
+import com.taobao.api.ApiException;
 import javafx.geometry.Pos;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -65,27 +73,31 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
     @Resource
     private EnrollmentWageCardMapper wageCardMapper;
 
+    @Resource
+    private DingTalkUtils dingTalkUtils;
+
     /**
      * 实习人员登记表信息
+     *
      * @param page
      * @param projectReportData
      * @return
      * @throws Exception
      */
-    public IPage<EnrollmentRegistration> findList(Page<EnrollmentRegistration> page, EnrollmentRegistration projectReportData) throws Exception{
-        QueryWrapper<EnrollmentRegistration> queryWrapper = QueryWrapperGenerator.buildQueryCondition (projectReportData,EnrollmentRegistration.class);
-        queryWrapper.eq("a.del_flag","0");
+    public IPage<EnrollmentRegistration> findList(Page<EnrollmentRegistration> page, EnrollmentRegistration projectReportData) throws Exception {
+        QueryWrapper<EnrollmentRegistration> queryWrapper = QueryWrapperGenerator.buildQueryCondition(projectReportData, EnrollmentRegistration.class);
+        queryWrapper.eq("a.del_flag", "0");
         if (StringUtils.isNotBlank(projectReportData.getMobilePhone())) {
-            queryWrapper.like("a.mobile_phone",projectReportData.getMobilePhone());
+            queryWrapper.like("a.mobile_phone", projectReportData.getMobilePhone());
         }
         if (StringUtils.isNotBlank(projectReportData.getName())) {
-            queryWrapper.like("a.name",projectReportData.getName());
+            queryWrapper.like("a.name", projectReportData.getName());
         }
         if (StringUtils.isNotBlank(projectReportData.getDepartment())) {
-            queryWrapper.eq("a.department",projectReportData.getDepartment());
+            queryWrapper.eq("a.department", projectReportData.getDepartment());
         }
         if (StringUtils.isNotBlank(projectReportData.getCompanyId())) {
-            queryWrapper.eq("so.parent_id",projectReportData.getCompanyId());
+            queryWrapper.eq("so.parent_id", projectReportData.getCompanyId());
         }
         IPage<EnrollmentRegistration> list = mapper.findList(page, queryWrapper);
         return list;
@@ -95,37 +107,38 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
 
     /**
      * 导出实习人员登记表信息
+     *
      * @param page
      * @param projectReportData
      * @return
      * @throws Exception
      */
-    public IPage<ExportDTO> exportList(Page<ExportDTO> page, ExportDTO projectReportData) throws Exception{
-        QueryWrapper<ExportDTO> queryWrapper = QueryWrapperGenerator.buildQueryCondition (projectReportData,ExportDTO.class);
-        queryWrapper.eq("a.del_flag","0");
+    public IPage<ExportDTO> exportList(Page<ExportDTO> page, ExportDTO projectReportData) throws Exception {
+        QueryWrapper<ExportDTO> queryWrapper = QueryWrapperGenerator.buildQueryCondition(projectReportData, ExportDTO.class);
+        queryWrapper.eq("a.del_flag", "0");
         if (StringUtils.isNotBlank(projectReportData.getMobilePhone())) {
-            queryWrapper.like("a.mobile_phone",projectReportData.getMobilePhone());
+            queryWrapper.like("a.mobile_phone", projectReportData.getMobilePhone());
         }
         if (StringUtils.isNotBlank(projectReportData.getName())) {
-            queryWrapper.like("a.name",projectReportData.getName());
+            queryWrapper.like("a.name", projectReportData.getName());
         }
         if (StringUtils.isNotBlank(projectReportData.getDepartment())) {
-            queryWrapper.eq("a.department",projectReportData.getDepartment());
+            queryWrapper.eq("a.department", projectReportData.getDepartment());
         }
         if (StringUtils.isNotBlank(projectReportData.getCompanyId())) {
-            queryWrapper.eq("so.parent_id",projectReportData.getCompanyId());
+            queryWrapper.eq("so.parent_id", projectReportData.getCompanyId());
         }
         IPage<ExportDTO> list = mapper.exportList(page, queryWrapper);
         for (ExportDTO record : list.getRecords()) {
             //根据用户查询岗位和角色信息
-            if (ObjectUtil.isNotEmpty(record)){
+            if (ObjectUtil.isNotEmpty(record)) {
                 UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getById(record.getUserId());
-                if (userDTO != null){
-                    if (CollectionUtil.isNotEmpty(userDTO.getRoleDTOList())){
+                if (userDTO != null) {
+                    if (CollectionUtil.isNotEmpty(userDTO.getRoleDTOList())) {
                         StringBuilder roleBuilder = new StringBuilder();
                         for (RoleDTO roleDTO : userDTO.getRoleDTOList()) {
                             RoleDTO dto = SpringUtil.getBean(IRoleApi.class).getRoleDTOByIdForApp(roleDTO.getId());
-                            if (ObjectUtil.isNotEmpty(dto)){
+                            if (ObjectUtil.isNotEmpty(dto)) {
                                 roleBuilder.append(dto.getName()).append(",");
                             }
                         }
@@ -137,11 +150,11 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
 
                         record.setRole(roleBuilder.toString());
                     }
-                    if (CollectionUtil.isNotEmpty(userDTO.getPostDTOList())){
+                    if (CollectionUtil.isNotEmpty(userDTO.getPostDTOList())) {
                         StringBuilder postBuilder = new StringBuilder();
                         for (PostDTO postDTO : userDTO.getPostDTOList()) {
                             PostDTO dto = SpringUtil.getBean(IPostApi.class).getPostDTOById(postDTO.getId());
-                            if (ObjectUtil.isNotEmpty(dto)){
+                            if (ObjectUtil.isNotEmpty(dto)) {
                                 postBuilder.append(dto.getName()).append(",");
                             }
                         }
@@ -160,10 +173,11 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
 
 
     public EnrollmentRegistration saveRegistration(EnrollmentRegistration registration) throws Exception {
-        if (StringUtils.isNotEmpty(registration.getId())){
+
+        if (StringUtils.isNotEmpty(registration.getId())) {
 
             EnrollmentRegistration report = mapper.getById(registration.getId());
-            if (report != null){
+            if (report != null) {
                 return update(registration);
             }
         }
@@ -171,10 +185,10 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
     }
 
     public EnrollmentRegistration saveRegistration2(EnrollmentRegistration registration) throws Exception {
-        if (StringUtils.isNotEmpty(registration.getId())){
+        if (StringUtils.isNotEmpty(registration.getId())) {
 
             EnrollmentRegistration report = mapper.getById(registration.getId());
-            if (report != null){
+            if (report != null) {
                 return update2(registration);
             }
         }
@@ -185,7 +199,7 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
      * 新增
      */
     @Transactional(rollbackFor = Exception.class)
-    public EnrollmentRegistration add(EnrollmentRegistration reportData) throws Exception{
+    public EnrollmentRegistration add(EnrollmentRegistration reportData) throws Exception {
 
         String currentToken = TokenProvider.getCurrentToken();
 
@@ -197,11 +211,11 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
         Integer integer = mapper.selectCount(queryWrapper);
         Integer mobilePhoneOnly = SpringUtil.getBean(IUserApi.class).selectCountByMobile(reportData.getMobilePhone());
 
-        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+        UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
 
         EnrollmentRegistration report = new EnrollmentRegistration();
 
-        if (integer <=0 && mobilePhoneOnly <=0 ) {
+        if (integer <= 0 && mobilePhoneOnly <= 0) {
             //为空则表示移动端扫码登录
             if (StringUtils.isBlank(reportData.getIsPc())) {
                 reportData.setIsPc("2");
@@ -214,7 +228,7 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
             report.setUpdateById("1");
             report.setUpdateTime(new Date());
 
-            if (StringUtils.isNotBlank(report.getSocialSecurityNumber())){
+            if (StringUtils.isNotBlank(report.getSocialSecurityNumber())) {
                 EnrollmentSocialSecurityCard securityCard = new EnrollmentSocialSecurityCard();
                 String amountId = SnowFlake.getId();
                 securityCard.setId(amountId);
@@ -233,29 +247,29 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
 
             //if (null == currentToken) {
 
-                //发起员工入职流程
-                Map map = SpringUtil.getBean(IFlowableApi.class).getByNameForFen("员工入职");
-                String procDefId = map.get("id") + "";
+            //发起员工入职流程
+            Map map = SpringUtil.getBean(IFlowableApi.class).getByNameForFen("员工入职");
+            String procDefId = map.get("id") + "";
 
-                report.setProcessDefinitionId(procDefId);
-                report.setProcessType("0");
-                mapper.insert(report);
+            report.setProcessDefinitionId(procDefId);
+            report.setProcessType("0");
+            mapper.insert(report);
 
-                Map<String, Map<String, String>> allMap = new HashMap<>();
+            Map<String, Map<String, String>> allMap = new HashMap<>();
 
-                String procDefKey = map.get("key") + "";
-                String businessTable = "human_resources_enrollment_registration";
+            String procDefKey = map.get("key") + "";
+            String businessTable = "human_resources_enrollment_registration";
 
-                String businessId = id;
-                String title = "管理员发起了- [" + report.getName() + "员工入职]";
+            String businessId = id;
+            String title = "管理员发起了- [" + report.getName() + "员工入职]";
 
-                //获取实习信息审核员信息
-                RoleDTO roleDTO = SpringUtil.getBean(IRoleApi.class).getRoleDTOByName2("实习信息审核员");
-                String assignee = getAssignee(roleDTO.getId());
-                String recordType = "";
+            //获取实习信息审核员信息
+            RoleDTO roleDTO = SpringUtil.getBean(IRoleApi.class).getRoleDTOByName2("实习信息审核员");
+            String assignee = getAssignee(roleDTO.getId());
+            String recordType = "";
 
-                Map<String, String> newMap = pingMap(procDefId, procDefKey, businessTable, businessId, title, assignee, recordType);
-                allMap.put("入职", newMap);
+            Map<String, String> newMap = pingMap(procDefId, procDefKey, businessTable, businessId, title, assignee, recordType);
+            allMap.put("入职", newMap);
             if (StringUtils.isBlank(reportData.getIsPc())) {
                 SpringUtil.getBean(IFlowableApi.class).startForFenNew(allMap);
             }
@@ -267,7 +281,7 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
         return report;
     }
 
-    public String getAssignee(String roleId){
+    public String getAssignee(String roleId) {
         List<UserDTO> userDTOS = SpringUtil.getBean(IUserApi.class).findListByRoleId(roleId);
         StringJoiner idJoiner = new StringJoiner(",");
         for (UserDTO user : userDTOS) {
@@ -277,7 +291,7 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
         return idJoiner.toString();
     }
 
-    public String getAssignee2(String roleId){
+    public String getAssignee2(String roleId) {
         List<UserDTO> userDTOS = SpringUtil.getBean(IUserApi.class).findListFlowAbleByPostId(roleId);
         StringJoiner idJoiner = new StringJoiner(",");
         for (UserDTO user : userDTOS) {
@@ -286,9 +300,10 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
 
         return idJoiner.toString();
     }
-    public Map<String,String> pingMap(String procDefId,String procDefKey,String businessTable,
-                                      String businessId,String title,String assignee,String recordType){
-        Map<String,String> map = new HashMap();
+
+    public Map<String, String> pingMap(String procDefId, String procDefKey, String businessTable,
+                                       String businessId, String title, String assignee, String recordType) {
+        Map<String, String> map = new HashMap();
         map.put("procDefId", procDefId);
         map.put("procDefKey", procDefKey);
         map.put("businessTable", businessTable);
@@ -303,9 +318,9 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
      * 修改
      */
     @Transactional(rollbackFor = Exception.class)
-    public EnrollmentRegistration update(EnrollmentRegistration reportData) throws Exception{
+    public EnrollmentRegistration update(EnrollmentRegistration reportData) throws Exception {
         //获取当前登录人信息
-        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+        UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
 
         EnrollmentRegistration report = new EnrollmentRegistration();
         BeanUtils.copyProperties(reportData, report);
@@ -323,8 +338,8 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
         }
 
 
-        if (StringUtils.isNotBlank(report.getType()) && !userDTO.isAdmin()){
-            if (report.getType().equals("5")){
+        if (StringUtils.isNotBlank(report.getType()) && !userDTO.isAdmin()) {
+            if (report.getType().equals("5")) {
                 //获取当前的用户,审核的人
                 UserDTO dto = new UserDTO();
                 //设置信息
@@ -346,11 +361,10 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
                 OfficeDTO companyDto = new OfficeDTO();
                 companyDto.setId(office.getParent().getId());
                 dto.setCompanyDTO(companyDto);
-
                 dto.setNo(report.getMobilePhone());
 
                 String name = "兴光会计员工";
-                List <RoleDTO> roleIdList = new ArrayList<>();
+                List<RoleDTO> roleIdList = new ArrayList<>();
 
 //                roleIdList.add(roleInfo);
 
@@ -358,35 +372,35 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
                 String officeName = "";
                 String networkAddress = "";
                 if (null != office) {
-                    Map<String,String> keyMap = new HashMap<>();
+                    Map<String, String> keyMap = new HashMap<>();
                     TenantDTO tenantDTO = new TenantDTO();
                     tenantDTO.setId(office.getTenantId());
                     dto.setTenantDTO(tenantDTO);
-                    if (office.getTenantId().equals("10003")){
+                    if (office.getTenantId().equals("10003")) {
                         officeName = "会计业务管理公司";
                         networkAddress = "cpapmis.xgccpm.com";
                         keyMap.put("name", "兴光会计员工,共有权限(会计)");
                         keyMap.put("tenantId", office.getTenantId());
                         roleIdList = SpringUtil.getBean(IRoleApi.class).getRoleDTOByNameAndTenantId(keyMap);
-                    }else if (office.getTenantId().equals("10004")) {
+                    } else if (office.getTenantId().equals("10004")) {
                         officeName = "中审管理公司";
                         networkAddress = "zs.xgccpm.com";
                         keyMap.put("name", "中审员工,共有权限(中审)");
                         keyMap.put("tenantId", office.getTenantId());
                         roleIdList = SpringUtil.getBean(IRoleApi.class).getRoleDTOByNameAndTenantId(keyMap);
-                    }else if (office.getTenantId().equals("10001")) {
+                    } else if (office.getTenantId().equals("10001")) {
                         officeName = "评估管理公司";
                         networkAddress = "http://amc.xgccpm.com";
                         keyMap.put("name", "评估员工,共有权限(评估)");
                         keyMap.put("tenantId", office.getTenantId());
                         roleIdList = SpringUtil.getBean(IRoleApi.class).getRoleDTOByNameAndTenantId(keyMap);
-                    }else if (office.getTenantId().equals("10006")) {
+                    } else if (office.getTenantId().equals("10006")) {
                         officeName = "苏州分公司";
                         networkAddress = "sz.xgccpm.com";
                         keyMap.put("name", "审计员工,共有权限(苏州)");
                         keyMap.put("tenantId", office.getTenantId());
                         roleIdList = SpringUtil.getBean(IRoleApi.class).getRoleDTOByNameAndTenantId(keyMap);
-                    }else if (office.getTenantId().equals("10005")) {
+                    } else if (office.getTenantId().equals("10005")) {
                         officeName = "兴光项目公司";
                         networkAddress = "xm.xgccpm.com";
                         keyMap.put("name", "项目公司综合管理部员工,共有权限(项目)");
@@ -400,9 +414,43 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
                     officeName = "综合管理公司";
                 }
                 dto.setRoleDTOList(roleIdList);
+                String dictValue = DictUtils.getDictValue("dd_status", "dd_status", "0");
+                if("1".equals(dictValue)){
+                    //钉钉逻辑
+                    //判断用户是否为 评估 或者 会计 员工
+                    if (office.getTenantId().equals("10003") || office.getTenantId().equals("10001")) {
+                        //获取用户所在部门信息
+                        OfficeDTO officeDto = SpringUtil.getBean(IOfficeApi.class).getOfficeById(dto.getOfficeDTO().getId());
+                        //获取钉钉所有部门信息
+                        List<OapiV2DepartmentListsubResponse.DeptBaseResponse> deptBaseResponses = dingTalkUtils.deptList(office.getTenantId());
+                        for (OapiV2DepartmentListsubResponse.DeptBaseResponse dept : deptBaseResponses) {
+                            //找到用户所在的钉钉部门
+                            if (officeDto.getName().equals(dept.getName())) {
+                                DingTalkUserDTO dingTalkUserDTO = new DingTalkUserDTO();
+                                dingTalkUserDTO.setMobile(dto.getMobile());
+                                dingTalkUserDTO.setName(dto.getName());
+                                dingTalkUserDTO.setDeptIdList(String.valueOf(dept.getDeptId()));
+                                //通过用户手机号查询钉钉是否存在用户信息,判断是更新还是新增
+                                if (StringUtils.isNotBlank(report.getDdId())) {
+                                    dingTalkUserDTO.setUserid(report.getDdId());
+                                    dingTalkUtils.updateUser(dingTalkUserDTO,office.getTenantId());
+                                } else {
+                                    //将手机号作为用户钉钉userID
+                                    dingTalkUserDTO.setUserid(dingTalkUserDTO.getMobile());
+                                    //添加钉钉用户,暂时无需处理返回
+                                    OapiV2UserCreateResponse oapiV2UserCreateResponse = dingTalkUtils.addUser(dingTalkUserDTO,office.getTenantId());
+                                    //数插入ddid
+                                    dto.setDdId(dingTalkUserDTO.getMobile());
+                                    report.setDdId(dingTalkUserDTO.getMobile());
+                                }
+                                break;
+                            }
+                        }
+                    }
+                    //钉钉逻辑
+                }
 
-
-                SpringUtil.getBean ( IUserApi.class ).saveOrUpdate(dto);
+                SpringUtil.getBean(IUserApi.class).saveOrUpdate(dto);
 
 
 //                report.setOnJobStatus("正式");
@@ -413,21 +461,21 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
 
                 String randomCode = report.getName() + "你好!欢迎入职" + officeName + ",请尽快登录公司系统:" + networkAddress
                         + "完善个人信息(包括社保卡号与工资卡号)并修改初始密码,系统初始账号密码为:" + report.getName() +
-                        "/123456,人事部门已在为你办理门禁卡,办理成功后将由系统告知,在收到系统通知后,请及时到信息部"+ listByPostId.get(0).getName() +"处领取门禁卡!"+
+                        "/123456,人事部门已在为你办理门禁卡,办理成功后将由系统告知,在收到系统通知后,请及时到信息部" + listByPostId.get(0).getName() + "处领取门禁卡!" +
                         "注:工资卡需同时提供中信银行、招商银行卡号";
                 Map<String, Object> stringObjectMap = SpringUtil.getBean(IUserApi.class).sendRandomCodes(report.getMobilePhone(), randomCode);
                 String statusCode = (String) stringObjectMap.get("statusCode");
                 if (("000000").equals(statusCode)) {
                     System.out.println("短信发送成功!");
-                }else if(statusCode.equals("160040")){
+                } else if (statusCode.equals("160040")) {
                     System.out.println("手机号获取验证码次数已达每日上限!");
-                }else{
+                } else {
                     System.out.println("短信发送失败,错误代码:101,请联系管理员!");
                 }
 
                 //当流程结束的时候,发起工资卡信息完善流程
                 Map map = SpringUtil.getBean(IFlowableApi.class).getByNameForFen("工资卡信息完善");
-                String procDefId = map.get("id")+"";
+                String procDefId = map.get("id") + "";
 
                 //当流程结束的时候,发起工资卡信息完善流程
                 String uid = SnowFlake.getId();
@@ -439,13 +487,13 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
                 wageCard.setEnrollmentRegistrationId(report.getId());
                 wageCardService.save(wageCard);
 
-                String procDefKey = map.get("key")+"";
+                String procDefKey = map.get("key") + "";
                 String businessTable = "human_resources_enrollment_wage_card";
                 String businessId = uid;
                 String title = "工资卡信息完善";
                 String assignee = amountId;
                 String recordType = "";
-                Map<String,String> newMap = new HashMap();
+                Map<String, String> newMap = new HashMap();
                 newMap.put("procDefId", procDefId);
                 newMap.put("procDefKey", procDefKey);
                 newMap.put("businessTable", businessTable);
@@ -460,9 +508,9 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
                 wageCardService.saveOrUpdate(wageCard);
 
                 //发起社保流程
-                if (StringUtils.isBlank(report.getSocialSecurityNumber())){
+                if (StringUtils.isBlank(report.getSocialSecurityNumber())) {
                     Map cardMap = SpringUtil.getBean(IFlowableApi.class).getByNameForFen("社保登记");
-                    String procDefId2 = cardMap.get("id")+"";
+                    String procDefId2 = cardMap.get("id") + "";
 
                     //当流程结束的时候,发起工资卡信息完善流程
                     String uuid = SnowFlake.getId();
@@ -474,13 +522,13 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
                     securityCard.setEnrollmentRegistrationId(report.getId());
                     securityCardService.save(securityCard);
 
-                    String procDefKey2 = cardMap.get("key")+"";
+                    String procDefKey2 = cardMap.get("key") + "";
                     String businessTable2 = "human_resources_enrollment_social_security_card";
                     String businessId2 = uuid;
                     String title2 = "社保卡信息完善";
                     String assignee2 = amountId;
                     String recordType2 = "";
-                    Map<String,String> newMap2 = new HashMap();
+                    Map<String, String> newMap2 = new HashMap();
                     newMap2.put("procDefId", procDefId2);
                     newMap2.put("procDefKey", procDefKey2);
                     newMap2.put("businessTable", businessTable2);
@@ -496,7 +544,7 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
                 }
                 //发起门卡办理通知流程
                 Map keyMap = SpringUtil.getBean(IFlowableApi.class).getByNameForFen("门卡办理");
-                String keyProcDefId = keyMap.get("id")+"";
+                String keyProcDefId = keyMap.get("id") + "";
 
                 //当流程结束的时候,发起工资卡信息完善流程
                 String keyUid = SnowFlake.getId();
@@ -508,10 +556,10 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
                 keyCard.setEnrollmentRegistrationId(report.getId());
                 keyCardService.save(keyCard);
 
-                String keyProcDefKey = keyMap.get("key")+"";
+                String keyProcDefKey = keyMap.get("key") + "";
                 String keyBusinessTable = "human_resources_enrollment_key_card";
                 String keyBusinessId = keyUid;
-                String keyTitle = report.getName() +  "的门卡办理";
+                String keyTitle = report.getName() + "的门卡办理";
 
 //                UserDTO userInfo = SpringUtil.getBean(IUserApi.class).getByLoginNameNotTenantId("赵俐");
 //                String keyAssignee = userInfo.getId();
@@ -520,7 +568,7 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
                 String keyAssignee = getAssignee2(postInfo.getId());
 
                 String keyRecordType = "";
-                Map<String,String> keyMap2 = new HashMap();
+                Map<String, String> keyMap2 = new HashMap();
                 keyMap2.put("procDefId", keyProcDefId);
                 keyMap2.put("procDefKey", keyProcDefKey);
                 keyMap2.put("businessTable", keyBusinessTable);
@@ -535,6 +583,7 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
             }
         }
 
+
         mapper.updateById(report);
         return report;
     }
@@ -543,9 +592,9 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
      * 修改
      */
     @Transactional(rollbackFor = Exception.class)
-    public EnrollmentRegistration update2(EnrollmentRegistration reportData) throws Exception{
+    public EnrollmentRegistration update2(EnrollmentRegistration reportData) throws Exception {
         //获取当前登录人信息
-        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+        UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
 
         EnrollmentRegistration report = new EnrollmentRegistration();
         BeanUtils.copyProperties(reportData, report);
@@ -560,17 +609,17 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
         // 查询基础信息表
         EnrollmentRegistration info = mapper.getById(id);
         //根据用户查询岗位和角色信息
-        if (ObjectUtil.isNotEmpty(info)){
+        if (ObjectUtil.isNotEmpty(info)) {
             UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getById(info.getUserId());
             ArrayList<String> roles = new ArrayList<>();
             ArrayList<String> posts = new ArrayList<>();
-            if (userDTO != null){
-                if (CollectionUtil.isNotEmpty(userDTO.getRoleDTOList())){
+            if (userDTO != null) {
+                if (CollectionUtil.isNotEmpty(userDTO.getRoleDTOList())) {
                     for (RoleDTO roleDTO : userDTO.getRoleDTOList()) {
                         roles.add(roleDTO.getId());
                     }
                 }
-                if (CollectionUtil.isNotEmpty(userDTO.getPostDTOList())){
+                if (CollectionUtil.isNotEmpty(userDTO.getPostDTOList())) {
                     for (PostDTO postDTO : userDTO.getPostDTOList()) {
                         posts.add(postDTO.getId());
                     }
@@ -603,16 +652,27 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
         }
 
 
-
     }
 
     public String remove(String id) {
         //先删除用户表中的信息
         EnrollmentRegistration registration = mapper.getById(id);
-        if (registration != null){
+        if (registration != null) {
             UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByMobile(registration.getMobilePhone());
-            if (userDTO!=null){
+            //设置角色
+            if (userDTO != null) {
                 SpringUtil.getBean(IUserApi.class).deleteById(userDTO.getId());
+                String dictValue = DictUtils.getDictValue("dd_status", "dd_status", "0");
+                if("1".equals(dictValue)){
+                    //删除钉钉表中的数据
+                    //判断用户是否为 评估 或者 会计 员工
+                    if (userDTO.getTenantDTO().getId().equals("10003") || userDTO.getTenantDTO().getId().equals("10001")) {
+                        DingTalkUserDTO dingTalkUserDTO = new DingTalkUserDTO();
+                        dingTalkUserDTO.setUserid(userDTO.getDdId());
+                        dingTalkUtils.deleteUser(dingTalkUserDTO,userDTO.getTenantDTO().getId());
+                    }
+                }
+
             }
         }
         // 删除基础信息表
@@ -637,24 +697,54 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
 
     /**
      * 获取正式工在职状态为离职的,并且user表中未删除的
+     *
      * @return
      */
     public List<EnrollmentRegistration> getFormalUserInfo() {
         return mapper.getFormalUserInfo();
     }
 
-    public void updateRegistration(EnrollmentRegistration reportData) {
+    public void updateRegistration(EnrollmentRegistration reportData) throws ApiException {
+
         //获取当前登录人信息
-        UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+        UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
 
         EnrollmentRegistration report = new EnrollmentRegistration();
         BeanUtils.copyProperties(reportData, report);
         report.setUpdateById(userDTO.getId());
         report.setUpdateTime(new Date());
 
+        String dictValue = DictUtils.getDictValue("dd_status", "dd_status", "0");
+        if("1".equals(dictValue)){
+            //钉钉逻辑
+            //获取用户所在部门信息
+            OfficeDTO officeDto = SpringUtil.getBean(IOfficeApi.class).getOfficeById(report.getDepartment());
+            String tenantId = officeDto.getTenantId();
+            //判断用户是否为 评估 或者 会计 的公司
+            if (tenantId.equals("10003") || tenantId.equals("10001")) {
+                //获取钉钉所有部门信息
+                List<OapiV2DepartmentListsubResponse.DeptBaseResponse> deptBaseResponses = dingTalkUtils.deptList(tenantId);
+                for (OapiV2DepartmentListsubResponse.DeptBaseResponse dept : deptBaseResponses) {
+                    //找到用户所在的钉钉部门
+                    if (officeDto.getName().equals(dept.getName())) {
+                        // 相应逻辑
+                        DingTalkUserDTO dingTalkUserDTO = new DingTalkUserDTO();
+                        dingTalkUserDTO.setMobile(report.getMobilePhone());
+                        dingTalkUserDTO.setName(report.getName());
+                        dingTalkUserDTO.setDeptIdList(String.valueOf(dept.getDeptId()));
+                        if (StringUtils.isNotBlank(report.getDdId())) {
+                            dingTalkUserDTO.setUserid(report.getDdId());
+                            dingTalkUtils.updateUser(dingTalkUserDTO,tenantId);
+                        }
+                        break;
+                    }
+                }
+            }
+            //钉钉逻辑
+        }
         mapper.updateById(report);
 
-        if (StringUtils.isNotBlank(report.getSocialSecurityNumber())){
+        if (StringUtils.isNotBlank(report.getSocialSecurityNumber())) {
             EnrollmentSocialSecurityCard securityCard = new EnrollmentSocialSecurityCard();
             String amountId = SnowFlake.getId();
             securityCard.setId(amountId);
@@ -688,14 +778,13 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
         wageCardService.saveOrUpdate(wageCard);
 
 
-
         /**
          * 修改用户信息
          */
         EnrollmentRegistration registration = mapper.getById(reportData.getId());
-        if (StringUtils.isNotBlank(registration.getUserId())){
+        if (StringUtils.isNotBlank(registration.getUserId())) {
             UserDTO dto = SpringUtil.getBean(IUserApi.class).getById(registration.getUserId());
-            if (dto != null){
+            if (dto != null) {
                 //往用户表中新增一条数据
                 UserDTO dto1 = new UserDTO();
                 dto1.setId(dto.getId());
@@ -711,16 +800,16 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
                 officeDTO1.setId(officeDTO.getParent().getId());
                 dto1.setCompanyDTO(officeDTO1);
                 //角色和岗位信息
-                List <RoleDTO> roleIdList = new ArrayList<>();
-                List <PostDTO> postDTOList = new ArrayList<>();
-                if (CollectionUtil.isNotEmpty(reportData.getPostIdList())){
+                List<RoleDTO> roleIdList = new ArrayList<>();
+                List<PostDTO> postDTOList = new ArrayList<>();
+                if (CollectionUtil.isNotEmpty(reportData.getPostIdList())) {
                     for (String post : reportData.getPostIdList()) {
                         PostDTO postDTO = new PostDTO();
                         postDTO.setId(post);
                         postDTOList.add(postDTO);
                     }
                 }
-                if (CollectionUtil.isNotEmpty(reportData.getRoleIdList())){
+                if (CollectionUtil.isNotEmpty(reportData.getRoleIdList())) {
                     for (String role : reportData.getRoleIdList()) {
                         RoleDTO roleDTO = SpringUtil.getBean(IRoleApi.class).getRoleDTOById(role);
                         roleIdList.add(roleDTO);
@@ -755,7 +844,7 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
 //                }
                 dto1.setRoleDTOList(roleIdList);
                 dto1.setPostDTOList(postDTOList);
-                SpringUtil.getBean ( IUserApi.class ).saveOrUpdate(dto1);
+                SpringUtil.getBean(IUserApi.class).saveOrUpdate(dto1);
 
 
             }
@@ -764,7 +853,8 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
     }
 
     public void insertIntoEnrollmentRegistrationInfo(String value) {
-        EnrollmentRegistration infos = JSON.parseObject(value, new TypeReference<EnrollmentRegistration>() {});
+        EnrollmentRegistration infos = JSON.parseObject(value, new TypeReference<EnrollmentRegistration>() {
+        });
         mapper.insert(infos);
     }
 
@@ -774,20 +864,21 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
 
     /**
      * 用户新增时对入职信息进行同步
+     *
      * @param registration
      * @return
      */
     @Transactional(rollbackFor = Exception.class)
     public void saveInfo(EnrollmentRegistration registration) {
         //现根据userId查询入职信息
-        if (StringUtils.isNotBlank(registration.getUserId())){
+        if (StringUtils.isNotBlank(registration.getUserId())) {
             registration.setType("5");
             registration.setOnJobStatus("2");
-            EnrollmentRegistration enrollmentRegistration=mapper.getByUserId(registration.getUserId());
-            if (enrollmentRegistration != null){
+            EnrollmentRegistration enrollmentRegistration = mapper.getByUserId(registration.getUserId());
+            if (enrollmentRegistration != null) {
                 registration.setId(enrollmentRegistration.getId());
                 mapper.updateById(registration);
-            }else {
+            } else {
                 registration.setId(SnowFlake.getId());
                 mapper.insert(registration);
             }
@@ -795,11 +886,11 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
 
         }
 
-
     }
 
     /**
      * 根据用户id删除用户信息
+     *
      * @param id
      */
     public void delByUserId(String id) {
@@ -808,15 +899,16 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
 
     /**
      * 添加导入的用户信息
+     *
      * @param staffUserInfoDTO
      */
     public void updateInfo(EnrollmentRegistration staffUserInfoDTO) {
-        if (ObjectUtil.isNotEmpty(staffUserInfoDTO)){
-            if (StringUtils.isNotBlank(staffUserInfoDTO.getMobilePhone())){
+        if (ObjectUtil.isNotEmpty(staffUserInfoDTO)) {
+            if (StringUtils.isNotBlank(staffUserInfoDTO.getMobilePhone())) {
                 //根据手机号查询信息
                 EnrollmentRegistration registration = mapper.getByMobile(staffUserInfoDTO.getMobilePhone());
-                if (ObjectUtil.isNotEmpty(registration)){
-                    if (registration.getName().equals(staffUserInfoDTO.getName())){
+                if (ObjectUtil.isNotEmpty(registration)) {
+                    if (registration.getName().equals(staffUserInfoDTO.getName())) {
                         registration.setSex(staffUserInfoDTO.getSex());//性别
                         registration.setBirthday(staffUserInfoDTO.getBirthday());//生日
                         registration.setAge(staffUserInfoDTO.getAge());//年龄
@@ -824,17 +916,17 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
                         registration.setOnJobStatus(staffUserInfoDTO.getOnJobStatus());//正式
                         registration.setDepartment(staffUserInfoDTO.getDepartment());//所属部门
                         registration.setMobilePhone(staffUserInfoDTO.getMobilePhone());//联系电话
-                        if (ObjectUtil.isNotEmpty(staffUserInfoDTO.getInDate())){
+                        if (ObjectUtil.isNotEmpty(staffUserInfoDTO.getInDate())) {
                             SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
                             String format = simpleDateFormat.format(staffUserInfoDTO.getInDate());
                             registration.setEntryDate(format);//入职时间
                         }
                         registration.setIdCard(staffUserInfoDTO.getIdCard());//身份证
                         mapper.updateById(registration);
-                        if (com.jeeplus.utils.StringUtils.isNotBlank(staffUserInfoDTO.getRole()) && staffUserInfoDTO.getRole().contains(",")){
-                            if (StringUtils.isNotBlank(registration.getUserId())){
+                        if (com.jeeplus.utils.StringUtils.isNotBlank(staffUserInfoDTO.getRole()) && staffUserInfoDTO.getRole().contains(",")) {
+                            if (StringUtils.isNotBlank(registration.getUserId())) {
                                 UserDTO dto = SpringUtil.getBean(IUserApi.class).getById(registration.getUserId());
-                                List <RoleDTO> roleIdList = new ArrayList<>();
+                                List<RoleDTO> roleIdList = new ArrayList<>();
                                 String[] split = staffUserInfoDTO.getRole().split(",");
                                 for (String s : split) {
                                     HashMap<String, String> hashMap = new HashMap<>();
@@ -853,11 +945,11 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
                                 TenantDTO tenantDTO = new TenantDTO();
                                 tenantDTO.setId(officeDTO.getTenantId());
                                 dto.setTenantDTO(tenantDTO);
-                                SpringUtil.getBean ( IUserApi.class ).saveOrUpdate(dto);
+                                SpringUtil.getBean(IUserApi.class).saveOrUpdate(dto);
                             }
                         }
                     }
-                }else {
+                } else {
                     //入职id
                     String id = SnowFlake.getId();
                     EnrollmentRegistration enrollmentRegistration = new EnrollmentRegistration();
@@ -874,7 +966,7 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
                     enrollmentRegistration.setOnJobStatus(staffUserInfoDTO.getOnJobStatus());//正式
                     enrollmentRegistration.setDepartment(staffUserInfoDTO.getDepartment());//所属部门
                     enrollmentRegistration.setMobilePhone(staffUserInfoDTO.getMobilePhone());//联系电话
-                    if (ObjectUtil.isNotEmpty(staffUserInfoDTO.getInDate())){
+                    if (ObjectUtil.isNotEmpty(staffUserInfoDTO.getInDate())) {
                         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
                         String format = simpleDateFormat.format(staffUserInfoDTO.getInDate());
                         enrollmentRegistration.setEntryDate(format);//入职时间
@@ -886,10 +978,10 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
 
                     //新增用户信息
                     UserDTO dto1 = new UserDTO();
-                    if (ObjectUtil.isNotEmpty(dto)){
+                    if (ObjectUtil.isNotEmpty(dto)) {
                         enrollmentRegistration.setUserId(dto.getId());
-                        BeanUtils.copyProperties(dto,dto1);
-                    }else {
+                        BeanUtils.copyProperties(dto, dto1);
+                    } else {
                         //生成一个用户id
                         String userId = SnowFlake.getId();
                         enrollmentRegistration.setUserId(userId);
@@ -909,8 +1001,8 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
                         tenantDTO.setId(officeDTO.getTenantId());
                         dto1.setTenantDTO(tenantDTO);
                     }
-                    if (com.jeeplus.utils.StringUtils.isNotBlank(staffUserInfoDTO.getRole()) && staffUserInfoDTO.getRole().contains(",")){
-                        List <RoleDTO> roleIdList = new ArrayList<>();
+                    if (com.jeeplus.utils.StringUtils.isNotBlank(staffUserInfoDTO.getRole()) && staffUserInfoDTO.getRole().contains(",")) {
+                        List<RoleDTO> roleIdList = new ArrayList<>();
                         String[] split = staffUserInfoDTO.getRole().split(",");
                         for (String s : split) {
                             HashMap<String, String> hashMap = new HashMap<>();
@@ -921,11 +1013,16 @@ public class EnrollmentRegistrationService extends ServiceImpl<EnrollmentRegistr
                         }
                         dto1.setRoleDTOList(roleIdList);
                     }
-                    SpringUtil.getBean ( IUserApi.class ).saveOrUpdate(dto1);
+                    SpringUtil.getBean(IUserApi.class).saveOrUpdate(dto1);
                     mapper.insert(enrollmentRegistration);
                 }
             }
         }
 
     }
+
+    public void updateDdIdById(EnrollmentRegistration registration) {
+        mapper.updateDdIdById(registration);
+    }
+
 }

+ 26 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/service/dto/DingTalkUserDTO.java

@@ -0,0 +1,26 @@
+package com.jeeplus.human.enrollment.enrollmentRegistration.service.dto;
+
+import lombok.Data;
+
+/**
+ * @Author hgc
+ * @Date 2025/3/4/14:15
+ * @Description
+ */
+@Data
+public class DingTalkUserDTO {
+    private String userid;
+    private String name;
+    private String mobile;
+    private boolean hideMobile;
+    private String telephone;
+    private String jobNumber;
+    private String title;
+    private String email;
+    private String orgEmail;
+    private String orgEmailType;
+    private String workPlace;
+    private String remark;
+    private String deptIdList; // 部门 ID 列表
+    private Long hiredDate;
+}

+ 172 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/utils/DingTalkSyncUtil.java

@@ -0,0 +1,172 @@
+/**
+ * Copyright &copy; 2021-2026 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.human.enrollment.enrollmentRegistration.utils;
+
+import cn.hutool.extra.spring.SpringUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.DingTalkClient;
+import com.dingtalk.api.request.*;
+import com.dingtalk.api.response.*;
+import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentRegistration;
+import com.jeeplus.human.enrollment.enrollmentRegistration.service.EnrollmentRegistrationService;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.sys.utils.DictUtils;
+import com.jeeplus.utils.StringUtils;
+import com.taobao.api.ApiException;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.*;
+import java.util.stream.Collectors;
+
+/**
+ * 钉钉数据同步
+ *
+ * @author jeeplus
+ * @version 2021-5-29
+ */
+@Component
+public class DingTalkSyncUtil {
+    @Resource
+    private EnrollmentRegistrationService enrollmentRegistrationService;
+
+    //会计钉钉配置
+    @Value("${dingtalk.accountAppKey}")
+    private String accountAppKey;
+
+    @Value("${dingtalk.accountAppSecret}")
+    private String accountAppSecret;
+
+    //评估钉钉配置
+    @Value("${dingtalk.assessAppKey}")
+    private String assessAppKey;
+
+    @Value("${dingtalk.assessAppSecret}")
+    private String assessAppSecret;
+
+    /**
+     * 获取评估钉钉token
+     */
+    public String getAssessToken() throws ApiException {
+        // 创建钉钉客户端
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
+        // 配置请求参数
+        OapiGettokenRequest req = new OapiGettokenRequest();
+        req.setAppkey(assessAppKey); // 确保 appKey 已正确初始化
+        req.setAppsecret(assessAppSecret); // 确保 appSecret 已正确初始化
+        req.setHttpMethod("GET");
+        // 执行请求,获取响应
+        OapiGettokenResponse rsp = client.execute(req);
+        String accessToken = rsp.getAccessToken();
+        return accessToken;
+    }
+
+    /**
+     * 获取会计钉钉token
+     */
+    public String getAccountToken() throws ApiException {
+        // 创建钉钉客户端
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
+        // 配置请求参数
+        OapiGettokenRequest req = new OapiGettokenRequest();
+        req.setAppkey(accountAppKey); // 确保 appKey 已正确初始化
+        req.setAppsecret(accountAppSecret); // 确保 appSecret 已正确初始化
+        req.setHttpMethod("GET");
+        // 执行请求,获取响应
+        OapiGettokenResponse rsp = client.execute(req);
+        String accessToken = rsp.getAccessToken();
+        return accessToken;
+    }
+
+
+    /**
+     * 同步用户数据,使用线程池,防止定时任务执行结果为失败
+     */
+    public void getUserByMobileSyncData() {
+        try {
+            String dictValue = DictUtils.getDictValue("dd_status", "dd_status", "0");
+            if (!"1".equals(dictValue)) {
+                return;
+            }
+
+            IUserApi userApi = SpringUtil.getBean(IUserApi.class);
+            List<UserDTO> allUserInfo = userApi.getAllUserInfo();
+            String accountToken = getAccountToken();
+            String assessToken = getAssessToken();
+
+            // 创建线程池
+            int coreThreads = Math.max(2, Runtime.getRuntime().availableProcessors() / 2);
+            ExecutorService executor = new ThreadPoolExecutor(
+                    coreThreads,
+                    Runtime.getRuntime().availableProcessors(),
+                    60L, TimeUnit.SECONDS,
+                    new LinkedBlockingQueue<>()
+            );
+
+            // 限制最大并发请求数3
+            Semaphore semaphore = new Semaphore(3);
+            List<CompletableFuture<Void>> futures = allUserInfo.stream()
+                    .filter(user -> user.getTenantDTO() != null)
+                    .filter(user -> "10003".equals(user.getTenantDTO().getId()) || "10001".equals(user.getTenantDTO().getId()))
+                    .filter(user -> StringUtils.isBlank(user.getDdId()))
+                    .map(user -> CompletableFuture.runAsync(() -> {
+                        try {
+                            semaphore.acquire(); // 控制最大并发请求数
+                            processUser(user, userApi, accountToken, assessToken);
+                        } catch (InterruptedException e) {
+                            Thread.currentThread().interrupt();
+                        } finally {
+                            semaphore.release(); // 释放
+                        }
+                    }, executor))
+                    .collect(Collectors.toList());
+            // 等待任务完成
+            CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
+            executor.shutdown();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 处理单个用户的钉钉 ID 获取和更新
+     */
+    private void processUser(UserDTO user, IUserApi userApi, String accountToken, String assessToken) {
+        try {
+            String token = "10003".equals(user.getTenantDTO().getId()) ? accountToken : assessToken;
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getbymobile");
+
+            OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest();
+            req.setMobile(user.getMobile());
+            String body = client.execute(req, token).getBody();
+            JSONObject jsonObject = JSONUtil.parseObj(body);
+            if (!"0".equals(jsonObject.getStr("errcode"))) {
+                return;
+            }
+
+            String ddUserId = jsonObject.getJSONObject("result").getStr("userid");
+
+            // 更新用户数据
+            UserDTO userDTO = new UserDTO();
+            userDTO.setDdId(ddUserId);
+            userDTO.setId(user.getId());
+            userApi.updateUserById(userDTO);
+
+            // 更新入职登记数据
+            EnrollmentRegistration enrollmentRegistration = new EnrollmentRegistration();
+            enrollmentRegistration.setUserId(user.getId());
+            enrollmentRegistration.setDdId(ddUserId);
+            enrollmentRegistrationService.updateDdIdById(enrollmentRegistration);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}

+ 202 - 0
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/utils/DingTalkUtils.java

@@ -0,0 +1,202 @@
+/**
+ * Copyright &copy; 2021-2026 <a href="http://www.jeeplus.org/">JeePlus</a> All rights reserved.
+ */
+package com.jeeplus.human.enrollment.enrollmentRegistration.utils;
+
+import cn.hutool.extra.spring.SpringUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.dingtalk.api.DefaultDingTalkClient;
+import com.dingtalk.api.DingTalkClient;
+import com.dingtalk.api.request.*;
+import com.dingtalk.api.response.*;
+import com.jeeplus.human.enrollment.enrollmentRegistration.service.dto.DingTalkUserDTO;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.UserDTO;
+import com.jeeplus.utils.StringUtils;
+import com.taobao.api.ApiException;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 钉钉工具类
+ *
+ * @author jeeplus
+ * @version 2021-5-29
+ */
+@Component
+public class DingTalkUtils {
+
+    //会计钉钉配置
+    @Value("${dingtalk.accountAppKey}")
+    private String accountAppKey;
+
+    @Value("${dingtalk.accountAppSecret}")
+    private String accountAppSecret;
+
+    //评估钉钉配置
+    @Value("${dingtalk.assessAppKey}")
+    private String assessAppKey;
+
+    @Value("${dingtalk.assessAppSecret}")
+    private String assessAppSecret;
+
+    /**
+     * 获取钉钉token
+     */
+    public  String getToken(String tenantId) throws ApiException {
+        // 创建钉钉客户端
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
+        // 配置请求参数
+        OapiGettokenRequest req = new OapiGettokenRequest();
+        String currentAppKey = "";
+        String currentAppSecret = "";
+        //根据公司判断来使用
+        if("10003".equals(tenantId)){
+            currentAppKey = accountAppKey;
+            currentAppSecret = accountAppSecret;
+        }else if("10001".equals(tenantId)){
+            currentAppKey = assessAppKey;
+            currentAppSecret = assessAppSecret;
+        }
+        req.setAppkey( currentAppKey); // 确保 appKey 已正确初始化
+        req.setAppsecret(currentAppSecret); // 确保 appSecret 已正确初始化
+        req.setHttpMethod("GET");
+        // 执行请求,获取响应
+        OapiGettokenResponse rsp = client.execute(req);
+        String accessToken = rsp.getAccessToken();
+        return accessToken;
+    }
+    
+
+    /**
+     * 获取部门列表
+     */
+    public  List<OapiV2DepartmentListsubResponse.DeptBaseResponse> deptList(String tenantId) throws ApiException {
+        List<OapiV2DepartmentListsubResponse.DeptBaseResponse> allDepartments = new ArrayList<>();
+        Long rootDeptId = 1L;
+        String token = getToken(tenantId);
+        fetchAllDepartments(rootDeptId, allDepartments,token);
+        return allDepartments;
+    }
+
+    // 假设有一个方法可以调用 API 获取子部门列表
+    public  List<OapiV2DepartmentListsubResponse.DeptBaseResponse> getSubDepartments(Long parentDeptId,String token) {
+        try {
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
+            OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
+            // 检查 deptId 是否为空
+            if (parentDeptId != null) {
+                req.setDeptId(parentDeptId);
+            }
+            OapiV2DepartmentListsubResponse rsp = client.execute(req, token);
+            List<OapiV2DepartmentListsubResponse.DeptBaseResponse> result = rsp.getResult();
+            // 返回 JSON 响应
+            return result;
+        } catch (Exception e) {
+            e.printStackTrace(); // 打印错误日志(开发调试用)
+            return null;
+        }
+    }
+
+
+    // 递归获取所有子部门
+    public  void fetchAllDepartments(Long parentDeptId, List<OapiV2DepartmentListsubResponse.DeptBaseResponse> allDepts,String token) throws ApiException {
+        List<OapiV2DepartmentListsubResponse.DeptBaseResponse> subDepts = getSubDepartments(parentDeptId,token);
+        for (OapiV2DepartmentListsubResponse.DeptBaseResponse dept : subDepts) {
+            allDepts.add(dept); // 先添加当前部门
+            fetchAllDepartments(dept.getDeptId(), allDepts,token); // 递归获取子部门
+        }
+    }
+
+
+    /**
+     * 创建用户
+     */
+    public  OapiV2UserCreateResponse addUser( DingTalkUserDTO addUserDTO,String tenantId) {
+        try {
+            String token = getToken(tenantId);
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/create");
+            OapiV2UserCreateRequest req = new OapiV2UserCreateRequest();
+            String name = addUserDTO.getName();
+            String mobile = addUserDTO.getMobile();
+            String deptIdList = addUserDTO.getDeptIdList();
+            String userid = addUserDTO.getUserid();
+            req.setName(name);
+            req.setDeptIdList(deptIdList);
+            req.setHideMobile(false);
+            req.setMobile(mobile);
+            req.setUserid(userid);
+            OapiV2UserCreateResponse rsp = client.execute(req, token);
+            // 返回 JSON 响应
+            return rsp;
+        } catch (Exception e) {
+            throw  new RuntimeException(e.getMessage());
+        }
+    }
+
+    public  OapiV2UserUpdateResponse updateUser(DingTalkUserDTO addUserDTO,String tenantId) {
+        try {
+            String token = getToken(tenantId);
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/update");
+            OapiV2UserUpdateRequest req = new OapiV2UserUpdateRequest();
+            String name = addUserDTO.getName();
+            String mobile = addUserDTO.getMobile();
+            String deptIdList = addUserDTO.getDeptIdList();
+            String userId = addUserDTO.getUserid();
+            req.setUserid(userId);
+            req.setName(name);
+            req.setDeptIdList(deptIdList);
+            req.setHideMobile(false);
+            req.setMobile(mobile);
+            OapiV2UserUpdateResponse rsp = client.execute(req, token);
+            // 返回 JSON 响应
+            return rsp;
+        } catch (Exception e) {
+            throw  new RuntimeException(e.getMessage());
+        }
+    }
+
+    /**
+     * 获取用户信息
+     * @param id
+     * @return
+     */
+    public  OapiV2UserGetResponse.UserGetResponse selectUserById(String id,String tenantId) {
+        try {
+            String token = getToken(tenantId);
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
+            OapiV2UserGetRequest req = new OapiV2UserGetRequest();
+            req.setUserid(id);
+            req.setLanguage("zh_CN");
+            OapiV2UserGetResponse rsp = client.execute(req, token);
+            OapiV2UserGetResponse.UserGetResponse result = rsp.getResult();
+            // 返回 JSON 响应
+            return result;
+        } catch (Exception e) {
+            throw  new RuntimeException(e.getMessage());
+        }
+    }
+
+    public  OapiV2UserDeleteResponse deleteUser(DingTalkUserDTO userDTO,String tenantId) {
+        try {
+            String token = getToken(tenantId);
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/delete");
+            OapiV2UserDeleteRequest req = new OapiV2UserDeleteRequest();
+            req.setUserid(userDTO.getUserid());
+            OapiV2UserDeleteResponse rsp = client.execute(req, token);
+            // 返回 JSON 响应
+            return rsp;
+        } catch (Exception e) {
+            throw  new RuntimeException(e.getMessage());
+        }
+    }
+
+
+
+}

+ 1 - 0
jeeplus-modules/jeeplus-human/src/main/resources/application-human-development.yml

@@ -48,3 +48,4 @@ CCPM_TASK:  13,102,39
 INQUIRE_STATUS: ccpm
 
 CAS_PATH: http://www.casserver.com:8443
+

+ 0 - 2
jeeplus-modules/jeeplus-human/src/main/resources/application-human-production.yml

@@ -39,5 +39,3 @@ company_round_seal_assess_id: 3169845144496476527
 
 #离职流程id
 dimission_id: 3032265972836684447
-
-

+ 13 - 0
jeeplus-modules/jeeplus-system/pom.xml

@@ -137,6 +137,19 @@
             <version>1.2.17</version>
         </dependency>
 
+        <!--钉钉-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dingtalk</artifactId>
+            <version>2.1.87</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
+            <version>2.0.0</version>
+        </dependency>
+
         <dependency>
             <groupId>dom4j</groupId>
             <artifactId>dom4j</artifactId>

+ 23 - 4
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/mapper/xml/UserMapper.xml

@@ -536,7 +536,12 @@ select a.id, a.company_id as "companyDTO.id", a.office_id as "officeDTO.id", a.l
         AND post.del_flag = 0
     </select>
     <select id="getAllUserInfo" resultType="com.jeeplus.sys.service.dto.UserDTO">
-        select distinct id,name from sys_user where del_flag = '0'
+        select distinct id,
+                        name,
+                        dd_id,
+                        mobile,
+                        tenant_id as 'tenantDTO.id'
+                        from sys_user where del_flag = '0'
     </select>
     <select id="getHasUser" resultType="java.lang.String">
         SELECT DISTINCT
@@ -595,7 +600,11 @@ select a.id, a.company_id as "companyDTO.id", a.office_id as "officeDTO.id", a.l
             AND a.id = #{id}
     </select>
     <select id="getAllUserInfoByTentId" resultType="com.jeeplus.sys.service.dto.UserDTO">
-        select distinct id,name from sys_user where del_flag = '0' and tenant_id IN (#{tentId1},#{tentId2})
+        select distinct id,
+                        name,
+                        dd_id,
+                        mobile
+        from sys_user where del_flag = '0' and tenant_id IN (#{tentId1},#{tentId2})
     </select>
     <select id="getMobileById" resultType="java.lang.String">
         select mobile from sys_user where del_flag = '0' and id = #{id}
@@ -650,7 +659,12 @@ select a.id, a.company_id as "companyDTO.id", a.office_id as "officeDTO.id", a.l
         VALUES (#{userId}, #{officeId})
     </insert>
     <select id="getAllUserInfoNoTenId" resultType="com.jeeplus.sys.service.dto.UserDTO">
-        select distinct id,name,up_password,update_password_date from sys_user where del_flag = '0'
+        select distinct id,
+                        name,
+                        up_password,
+                        update_password_date
+        from sys_user
+        where del_flag = '0'
     </select>
 
     <update id="updateUserById">
@@ -661,6 +675,9 @@ select a.id, a.company_id as "companyDTO.id", a.office_id as "officeDTO.id", a.l
         <if test="updatePasswordDate != null ">
             update_password_date = #{updatePasswordDate}
         </if>
+        <if test="ddId != null ">
+            dd_id = #{ddId}
+        </if>
         where id =#{id} and del_flag = '0'
     </update>
     <select id="getByMobile" resultType="com.jeeplus.sys.service.dto.UserDTO">
@@ -674,7 +691,9 @@ select a.id, a.company_id as "companyDTO.id", a.office_id as "officeDTO.id", a.l
 		a.remarks,
 		a.login_flag, a.photo, a.qr_code, a.sign,
 		a.create_by_id as "createBy.id", a.create_time, a.update_by_id as "updateBy.id",
-		a.update_time
+		a.update_time,
+		a.dd_id as ddId,
+		a.tenant_id as 'tenantDTO.id'
 		from sys_user a
 		where a.mobile = #{mobilePhone} and a.del_flag = '0'
     </select>

+ 181 - 155
jeeplus-modules/jeeplus-system/src/main/java/com/jeeplus/sys/service/UserService.java

@@ -19,6 +19,7 @@ import com.jeeplus.common.constant.CommonConstants;
 import com.jeeplus.common.redis.RedisUtils;
 import com.jeeplus.common.utils.RequestUtils;
 import com.jeeplus.sys.domain.*;
+import com.jeeplus.sys.feign.IOfficeApi;
 import com.jeeplus.sys.feign.IUserApi;
 import com.jeeplus.sys.mapper.OfficeMapper;
 import com.jeeplus.sys.mapper.UserMapper;
@@ -26,8 +27,10 @@ import com.jeeplus.sys.service.dto.*;
 import com.jeeplus.sys.service.mapstruct.CertWrapper;
 import com.jeeplus.sys.service.mapstruct.UserWrapper;
 import com.jeeplus.sys.utils.UserUtils;
+import com.taobao.api.ApiException;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -50,7 +53,7 @@ import java.util.stream.Collectors;
  */
 @Service
 @Transactional
-public class UserService extends ServiceImpl <UserMapper, User> {
+public class UserService extends ServiceImpl<UserMapper, User> {
 
     // 通过 -?[0-9]+(\\\\.[0-9]+)? 进行匹配是否为数字
     private static Pattern pattern = Pattern.compile("-?[0-9]+(\\\\.[0-9]+)?");
@@ -88,8 +91,10 @@ public class UserService extends ServiceImpl <UserMapper, User> {
         return baseMapper.getOpenIdsByIds(ids);
     }
 
+
     /**
      * 根据用户id 查询该用户会计报告的签字注师被选择次数
+     *
      * @param userId
      * @return
      */
@@ -97,10 +102,10 @@ public class UserService extends ServiceImpl <UserMapper, User> {
         Calendar cal = Calendar.getInstance();
         String yearStr = String.valueOf(cal.get(Calendar.YEAR));
         yearStr = yearStr + "-";
-        return userMapper.getAccountantUserCount (userId,yearStr);
+        return userMapper.getAccountantUserCount(userId, yearStr);
     }
 
-    public List<CertDTO> getCertListByUserId(){
+    public List<CertDTO> getCertListByUserId() {
         return userMapper.getCertListByUserId();
     }
 
@@ -115,17 +120,17 @@ public class UserService extends ServiceImpl <UserMapper, User> {
                     return false;
                 }).map(CertDTO::getId).collect(Collectors.toList());
                 if (CollectionUtil.isNotEmpty(ids)) {
-                    certService.remove(new QueryWrapper<Cert>().lambda().eq(Cert::getUserId,userDTO.getId()).notIn(Cert::getId,ids));
-                }else{
-                    certService.remove(new QueryWrapper<Cert>().lambda().eq(Cert::getUserId,userDTO.getId()));
+                    certService.remove(new QueryWrapper<Cert>().lambda().eq(Cert::getUserId, userDTO.getId()).notIn(Cert::getId, ids));
+                } else {
+                    certService.remove(new QueryWrapper<Cert>().lambda().eq(Cert::getUserId, userDTO.getId()));
                 }
-                userDTO.getCertDTOList().stream().forEach(item->{
+                userDTO.getCertDTOList().stream().forEach(item -> {
                     Cert cert = CertWrapper.INSTANCE.toEntity(item);
                     cert.setUserId(userDTO.getId());
                     certService.saveOrUpdate(cert);
                 });
             } else {
-                certService.remove(new QueryWrapper<Cert>().lambda().eq(Cert::getUserId,userDTO.getId()));
+                certService.remove(new QueryWrapper<Cert>().lambda().eq(Cert::getUserId, userDTO.getId()));
             }
         }
     }
@@ -133,16 +138,18 @@ public class UserService extends ServiceImpl <UserMapper, User> {
 
     /**
      * 根据角色英文名称查询角色下人员信息
+     *
      * @param enName 角色英文名称
      * @return
      */
-    public List<UserDTO> getUserInfoByEnName(String enName){
+    public List<UserDTO> getUserInfoByEnName(String enName) {
         return userMapper.getUserInfoByEnName(enName);
     }
 
 
     /**
      * 根据登录名获取用户
+     *
      * @param name
      * @return
      */
@@ -158,17 +165,17 @@ public class UserService extends ServiceImpl <UserMapper, User> {
      * @return
      */
     public UserDTO get(String id) {
-        QueryWrapper queryWrapper = new QueryWrapper ( );
-        queryWrapper.eq ( "a.id", id );
-        queryWrapper.eq ( "a.del_flag", CommonConstants.NOT_DELETED ); // 排除已经删除
+        QueryWrapper queryWrapper = new QueryWrapper();
+        queryWrapper.eq("a.id", id);
+        queryWrapper.eq("a.del_flag", CommonConstants.NOT_DELETED); // 排除已经删除
         UserDTO userDTO = baseMapper.get(queryWrapper);
         //根据用户id查询其管理部门
-        if(null != userDTO && StringUtils.isNotBlank(userDTO.getId())){
+        if (null != userDTO && StringUtils.isNotBlank(userDTO.getId())) {
             String manageOfficeIdsById = baseMapper.getManageOfficeIdsById(userDTO.getId());
-            if(StringUtils.isNotBlank(manageOfficeIdsById)){
+            if (StringUtils.isNotBlank(manageOfficeIdsById)) {
                 userDTO.setManageOfficeIds(manageOfficeIdsById);
                 //获取当前人管理的部门id
-                List<String> manageOfficeIdList= Arrays.asList(userDTO.getManageOfficeIds().split(","));
+                List<String> manageOfficeIdList = Arrays.asList(userDTO.getManageOfficeIds().split(","));
                 //查询这些部门信息
                 List<String> officeNameList = officeService.getOfficeNameByIds(manageOfficeIdList);
                 userDTO.setManageOfficeNameList(officeNameList);
@@ -184,10 +191,10 @@ public class UserService extends ServiceImpl <UserMapper, User> {
      * @return
      */
     public UserDTO getFlowAbleById(String id) {
-        QueryWrapper queryWrapper = new QueryWrapper ( );
-        queryWrapper.eq ( "a.id", id );
-        queryWrapper.eq ( "a.del_flag", CommonConstants.NOT_DELETED ); // 排除已经删除
-        return userMapper.getFlowAbleById ( queryWrapper );
+        QueryWrapper queryWrapper = new QueryWrapper();
+        queryWrapper.eq("a.id", id);
+        queryWrapper.eq("a.del_flag", CommonConstants.NOT_DELETED); // 排除已经删除
+        return userMapper.getFlowAbleById(queryWrapper);
     }
 
     /**
@@ -197,30 +204,30 @@ public class UserService extends ServiceImpl <UserMapper, User> {
      * @return
      */
     public UserDTO getUserByLoginName(String loginName, String tenantId) {
-        UserDTO userDTO = (UserDTO) RedisUtils.getInstance ( ).get ( CacheNames.USER_CACHE_LOGIN_NAME, tenantId + ":" + loginName );
-        if ( userDTO == null ) {
-            QueryWrapper queryWrapper = new QueryWrapper ( );
+        UserDTO userDTO = (UserDTO) RedisUtils.getInstance().get(CacheNames.USER_CACHE_LOGIN_NAME, tenantId + ":" + loginName);
+        if (userDTO == null) {
+            QueryWrapper queryWrapper = new QueryWrapper();
             //判断是否是用手机号登录
             Matcher m = pattern.matcher(loginName);
-            if (m.matches()){
-                queryWrapper.eq ("a.mobile", loginName);
+            if (m.matches()) {
+                queryWrapper.eq("a.mobile", loginName);
             } else {
-                queryWrapper.eq ( "a.login_name", loginName );
+                queryWrapper.eq("a.login_name", loginName);
             }
 
-            queryWrapper.eq ( "a.del_flag", CommonConstants.NOT_DELETED );
+            queryWrapper.eq("a.del_flag", CommonConstants.NOT_DELETED);
 
-            String domain = RequestUtils.getHeader ( "domain" );
-            if (domain.contains("ydddl")){
+            String domain = RequestUtils.getHeader("domain");
+            if (domain.contains("ydddl")) {
                 tenantId = "";
             }
 
-            if (StringUtils.isNotBlank(tenantId)){
-                queryWrapper.eq ( "a.tenant_id", tenantId );
+            if (StringUtils.isNotBlank(tenantId)) {
+                queryWrapper.eq("a.tenant_id", tenantId);
             }
 
-            userDTO = baseMapper.get ( queryWrapper );
-            RedisUtils.getInstance ( ).set ( CacheNames.USER_CACHE_LOGIN_NAME, tenantId + ":" + loginName, userDTO );
+            userDTO = baseMapper.get(queryWrapper);
+            RedisUtils.getInstance().set(CacheNames.USER_CACHE_LOGIN_NAME, tenantId + ":" + loginName, userDTO);
         }
 
         return userDTO;
@@ -233,10 +240,10 @@ public class UserService extends ServiceImpl <UserMapper, User> {
      * @return
      */
     public UserDTO getByLoginNameNotTenantId(String loginName) {
-        QueryWrapper queryWrapper = new QueryWrapper ( );
-        queryWrapper.eq ( "a.login_name", loginName );
-        queryWrapper.eq ( "a.del_flag", CommonConstants.NOT_DELETED );
-        UserDTO userDTO = baseMapper.get ( queryWrapper );
+        QueryWrapper queryWrapper = new QueryWrapper();
+        queryWrapper.eq("a.login_name", loginName);
+        queryWrapper.eq("a.del_flag", CommonConstants.NOT_DELETED);
+        UserDTO userDTO = baseMapper.get(queryWrapper);
         return userDTO;
     }
 
@@ -248,11 +255,11 @@ public class UserService extends ServiceImpl <UserMapper, User> {
      * @param queryWrapper
      * @return
      */
-    public IPage <UserDTO> findPage(Page <UserDTO> page, QueryWrapper queryWrapper) {
-        queryWrapper.eq ( "a.del_flag", CommonConstants.NOT_DELETED ); // 排除已经删除
+    public IPage<UserDTO> findPage(Page<UserDTO> page, QueryWrapper queryWrapper) {
+        queryWrapper.eq("a.del_flag", CommonConstants.NOT_DELETED); // 排除已经删除
         IPage<UserDTO> list = baseMapper.findList(page, queryWrapper);
         for (UserDTO record : list.getRecords()) {
-            if (CollectionUtil.isNotEmpty(record.getRoleDTOList())){
+            if (CollectionUtil.isNotEmpty(record.getRoleDTOList())) {
                 StringBuilder names = new StringBuilder();
 
                 for (RoleDTO roleDTO : record.getRoleDTOList()) {
@@ -263,7 +270,7 @@ public class UserService extends ServiceImpl <UserMapper, User> {
                 }
                 record.setRole(names.toString());
             }
-            if (CollectionUtil.isNotEmpty(record.getPostDTOList())){
+            if (CollectionUtil.isNotEmpty(record.getPostDTOList())) {
                 StringBuilder names = new StringBuilder();
 
                 for (PostDTO postDTO : record.getPostDTOList()) {
@@ -287,15 +294,15 @@ public class UserService extends ServiceImpl <UserMapper, User> {
      * @param queryWrapper
      * @return
      */
-    public IPage <UserDTO> findMemberPage(Page <UserDTO> page, QueryWrapper queryWrapper) {
-        queryWrapper.eq ( "a.del_flag", CommonConstants.NOT_DELETED ); // 排除已经删除
-        if (!SecurityUtils.getCurrentUserDTO ( ).isAdmin ( )){
+    public IPage<UserDTO> findMemberPage(Page<UserDTO> page, QueryWrapper queryWrapper) {
+        queryWrapper.eq("a.del_flag", CommonConstants.NOT_DELETED); // 排除已经删除
+        if (!SecurityUtils.getCurrentUserDTO().isAdmin()) {
             //根据当前人的所属公司查该公司下的所有人员信息
             UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByToken(TokenProvider.getCurrentToken());
-            queryWrapper.eq ( "a.company_id", userDTO.getCompanyDTO().getId() );
+            queryWrapper.eq("a.company_id", userDTO.getCompanyDTO().getId());
 
         }
-        return baseMapper.findList ( page, queryWrapper );
+        return baseMapper.findList(page, queryWrapper);
 
 
     }
@@ -308,18 +315,18 @@ public class UserService extends ServiceImpl <UserMapper, User> {
      * @param queryWrapper
      * @return
      */
-    public IPage <UserDTO> userFindPage(Page <UserDTO> page, QueryWrapper queryWrapper) {
-        queryWrapper.eq ( "a.del_flag", CommonConstants.NOT_DELETED ); // 排除已经删除
+    public IPage<UserDTO> userFindPage(Page<UserDTO> page, QueryWrapper queryWrapper) {
+        queryWrapper.eq("a.del_flag", CommonConstants.NOT_DELETED); // 排除已经删除
         queryWrapper.orderByDesc("a.id");
 
-        return baseMapper.userFindPage ( page, queryWrapper );
+        return baseMapper.userFindPage(page, queryWrapper);
 
     }
 
 
-    public IPage <UserDTO> findPage2(Page <UserDTO> page, QueryWrapper queryWrapper) {
-        queryWrapper.eq ( "a.del_flag", CommonConstants.NOT_DELETED ); // 排除已经删除
-        return baseMapper.findList2 ( page, queryWrapper );
+    public IPage<UserDTO> findPage2(Page<UserDTO> page, QueryWrapper queryWrapper) {
+        queryWrapper.eq("a.del_flag", CommonConstants.NOT_DELETED); // 排除已经删除
+        return baseMapper.findList2(page, queryWrapper);
 
 
     }
@@ -331,9 +338,9 @@ public class UserService extends ServiceImpl <UserMapper, User> {
      * @param queryWrapper
      * @return
      */
-    public IPage <UserDTO> findPageByRole(Page <UserDTO> page, QueryWrapper queryWrapper) {
-        queryWrapper.eq ( "a.del_flag", CommonConstants.NOT_DELETED ); //排除已经删除
-        return baseMapper.findListByRole ( page, queryWrapper );
+    public IPage<UserDTO> findPageByRole(Page<UserDTO> page, QueryWrapper queryWrapper) {
+        queryWrapper.eq("a.del_flag", CommonConstants.NOT_DELETED); //排除已经删除
+        return baseMapper.findListByRole(page, queryWrapper);
 
 
     }
@@ -344,14 +351,14 @@ public class UserService extends ServiceImpl <UserMapper, User> {
      * @param roleId
      * @return
      */
-    public List <UserDTO> findListByRoleId(String roleId) {
-        QueryWrapper queryWrapper = new QueryWrapper ( );
-        queryWrapper.eq ( "a.del_flag", CommonConstants.NOT_DELETED ); //排除已经删除
-        queryWrapper.eq ( "r.id", roleId );
+    public List<UserDTO> findListByRoleId(String roleId) {
+        QueryWrapper queryWrapper = new QueryWrapper();
+        queryWrapper.eq("a.del_flag", CommonConstants.NOT_DELETED); //排除已经删除
+        queryWrapper.eq("r.id", roleId);
 
-        Page <UserDTO> page = new Page <> ( );
-        page.setSize ( -1 );
-        return baseMapper.findListByRole ( page, queryWrapper ).getRecords ( );
+        Page<UserDTO> page = new Page<>();
+        page.setSize(-1);
+        return baseMapper.findListByRole(page, queryWrapper).getRecords();
     }
 
     /**
@@ -360,8 +367,8 @@ public class UserService extends ServiceImpl <UserMapper, User> {
      * @param postId
      * @return
      */
-    public List <UserDTO> findListByPostId(String postId) {
-        return baseMapper.findListByPostId ( postId );
+    public List<UserDTO> findListByPostId(String postId) {
+        return baseMapper.findListByPostId(postId);
     }
 
 
@@ -371,8 +378,8 @@ public class UserService extends ServiceImpl <UserMapper, User> {
      * @param postId
      * @return
      */
-    public List <UserDTO> findListFlowAbleByPostId(String postId) {
-        return baseMapper.findListFlowAbleByPostId ( postId );
+    public List<UserDTO> findListFlowAbleByPostId(String postId) {
+        return baseMapper.findListFlowAbleByPostId(postId);
     }
 
 
@@ -382,68 +389,70 @@ public class UserService extends ServiceImpl <UserMapper, User> {
      * @param userDTO
      */
     public void saveOrUpdate(UserDTO userDTO) {
-        User user = userWrapper.toEntity ( userDTO );
+        User user = userWrapper.toEntity(userDTO);
         if (StringUtils.isNotBlank(userDTO.getOpenId())) {
             user.setOpenId(userDTO.getOpenId());
         }
-        if(StringUtils.isNotBlank(userDTO.getManageOfficeIds())){
+        if (StringUtils.isNotBlank(userDTO.getManageOfficeIds())) {
             user.setManageOfficeIds(userDTO.getManageOfficeIds());
         }
-        super.saveOrUpdate ( user );
-        if ( StrUtil.isBlank ( userDTO.getId ( ) ) ) {
-            userDTO.setId ( user.getId ( ) );
+        user.setDdId(userDTO.getDdId());
+
+        super.saveOrUpdate(user);
+        if (StrUtil.isBlank(userDTO.getId())) {
+            userDTO.setId(user.getId());
         }
         // 更新用户与角色关联
-        baseMapper.deleteUserRole ( userDTO.getId ( ) );
-        if ( userDTO.getRoleDTOList ( ) != null ) {
-            userDTO.getRoleDTOList ( ).forEach ( roleDTO -> {
-                baseMapper.insertUserRole ( userDTO.getId ( ), roleDTO.getId ( ) );
-            } );
+        baseMapper.deleteUserRole(userDTO.getId());
+        if (userDTO.getRoleDTOList() != null) {
+            userDTO.getRoleDTOList().forEach(roleDTO -> {
+                baseMapper.insertUserRole(userDTO.getId(), roleDTO.getId());
+            });
         } else {
-            throw new RuntimeException ( userDTO.getLoginName ( ) + "没有设置角色!" );
+            throw new RuntimeException(userDTO.getLoginName() + "没有设置角色!");
         }
         // 更新用户与岗位联系
-        baseMapper.deleteUserPost ( userDTO.getId ( ) );
-        if ( userDTO.getPostDTOList ( ) != null ) {
-            userDTO.getPostDTOList ( ).forEach ( postDTO -> {
-                baseMapper.insertUserPost ( userDTO.getId ( ), postDTO.getId ( ) );
-            } );
+        baseMapper.deleteUserPost(userDTO.getId());
+        if (userDTO.getPostDTOList() != null) {
+            userDTO.getPostDTOList().forEach(postDTO -> {
+                baseMapper.insertUserPost(userDTO.getId(), postDTO.getId());
+            });
         }
-        UserUtils.deleteCache ( userDTO );
+        UserUtils.deleteCache(userDTO);
         //判断redis中是否有这个key
-        if (redisUtils.hasKey("user:cache:user:all:info")){
+        if (redisUtils.hasKey("user:cache:user:all:info")) {
             //先清除redis中的数据
-            redisUtils.delete(CacheNames.USER_CACHE_USER_ALL_INFO,"user:cache:user:all:info");
+            redisUtils.delete(CacheNames.USER_CACHE_USER_ALL_INFO, "user:cache:user:all:info");
             //获取全部的人员信息
             List<UserDTO> allUserInfo = userMapper.getAllUserInfo();
             //再次将人员信息存入到redis中
-            redisUtils.set(CacheNames.USER_CACHE_USER_ALL_INFO,"user:cache:user:all:info",allUserInfo);
-        }else {
+            redisUtils.set(CacheNames.USER_CACHE_USER_ALL_INFO, "user:cache:user:all:info", allUserInfo);
+        } else {
             //获取全部的人员信息
             List<UserDTO> allUserInfo = userMapper.getAllUserInfo();
             //再次将人员信息存入到redis中
-            redisUtils.set(CacheNames.USER_CACHE_USER_ALL_INFO,"user:cache:user:all:info",allUserInfo);
+            redisUtils.set(CacheNames.USER_CACHE_USER_ALL_INFO, "user:cache:user:all:info", allUserInfo);
         }
         /**
          * 更新用户管理部门
          */
-        if (StringUtils.isNotBlank(user.getManageOfficeIds())){
+        if (StringUtils.isNotBlank(user.getManageOfficeIds())) {
             //查询该用户在sys_user_manage_office中是否有数据
-            List<UserManageOffice> userManageOffices=userMapper.getManageOffices(userDTO.getId());
-            if (CollectionUtil.isNotEmpty(userManageOffices)){
+            List<UserManageOffice> userManageOffices = userMapper.getManageOffices(userDTO.getId());
+            if (CollectionUtil.isNotEmpty(userManageOffices)) {
                 //将原本的数据进行删除
                 userMapper.deleteByUserId(user.getId());
             }
             //将用户管理部门新增进用户管理部门表中
-            if (user.getManageOfficeIds().contains(",")){
+            if (user.getManageOfficeIds().contains(",")) {
                 String[] split = user.getManageOfficeIds().split(",");
                 for (String s : split) {
-                    userMapper.insertUserManageOffice(userDTO.getId(),s);
+                    userMapper.insertUserManageOffice(userDTO.getId(), s);
                 }
-            }else {
-                userMapper.insertUserManageOffice(userDTO.getId(),userDTO.getManageOfficeIds());
+            } else {
+                userMapper.insertUserManageOffice(userDTO.getId(), userDTO.getManageOfficeIds());
             }
-        }else {
+        } else {
             userMapper.deleteByUserId(user.getId());
         }
 
@@ -451,10 +460,10 @@ public class UserService extends ServiceImpl <UserMapper, User> {
 
 
     public void deleteUser(UserDTO userDTO) {
-        baseMapper.deleteUserRole ( userDTO.getId ( ) );
-        baseMapper.deleteUserPost ( userDTO.getId ( ) );
-        super.removeById ( userDTO.getId ( ) );
-        UserUtils.deleteCache ( userDTO );
+        baseMapper.deleteUserRole(userDTO.getId());
+        baseMapper.deleteUserPost(userDTO.getId());
+        super.removeById(userDTO.getId());
+        UserUtils.deleteCache(userDTO);
     }
 
     /**
@@ -463,22 +472,22 @@ public class UserService extends ServiceImpl <UserMapper, User> {
      * @return
      */
     public boolean isEnableLogin(String tenantId, String loginName) {
-        SysConfig sysConfig = sysConfigService.getById ( "1" );
-        if ( sysConfig.getMultiAccountLogin ( ).equals ( CommonConstants.NO ) ) { // 不允许一个账号多个客户端登录
-            if ( sysConfig.getSingleLoginType ( ).equals ( "1" ) ) { // 后登陆踢出先登录
-
-                UserUtils.getOnlineUsers ( ).forEach ( userDTO -> {
-                    if ( tenantId.equals ( userDTO.getTenantDTO ( ).getId ( ) ) && loginName.equals ( userDTO.getLoginName ( ) ) ) {
-                        RedisUtils.getInstance ( ).set ( CacheNames.USER_CACHE_TOKEN, userDTO.getToken ( ), "kickOut" );
-                        RedisUtils.getInstance ( ).delete ( CacheNames.USER_CACHE_ONLINE_USERS, userDTO.getToken ( ) );
+        SysConfig sysConfig = sysConfigService.getById("1");
+        if (sysConfig.getMultiAccountLogin().equals(CommonConstants.NO)) { // 不允许一个账号多个客户端登录
+            if (sysConfig.getSingleLoginType().equals("1")) { // 后登陆踢出先登录
+
+                UserUtils.getOnlineUsers().forEach(userDTO -> {
+                    if (tenantId.equals(userDTO.getTenantDTO().getId()) && loginName.equals(userDTO.getLoginName())) {
+                        RedisUtils.getInstance().set(CacheNames.USER_CACHE_TOKEN, userDTO.getToken(), "kickOut");
+                        RedisUtils.getInstance().delete(CacheNames.USER_CACHE_ONLINE_USERS, userDTO.getToken());
                     }
-                } );
+                });
 
             } else { // 已经登陆禁止再登录
-                int size = UserUtils.getOnlineUsers ( ).stream ( ).filter ( userDTO ->
-                        tenantId.equals ( userDTO.getTenantDTO ( ).getId ( ) ) && loginName.equals ( userDTO.getLoginName ( ) )
-                ).collect ( Collectors.toList ( ) ).size ( );
-                if ( size > 0 ) {
+                int size = UserUtils.getOnlineUsers().stream().filter(userDTO ->
+                        tenantId.equals(userDTO.getTenantDTO().getId()) && loginName.equals(userDTO.getLoginName())
+                ).collect(Collectors.toList()).size();
+                if (size > 0) {
                     return false;
                 }
                 ;
@@ -489,17 +498,18 @@ public class UserService extends ServiceImpl <UserMapper, User> {
 
     /**
      * 根据部门id获取 部门 以及 子部门 下的所有用户信息
+     *
      * @param officeId
      * @return
      */
-    public List<User> getUserByOfficeAll(String officeId){
+    public List<User> getUserByOfficeAll(String officeId) {
         List<Office> officeList = officeMapper.selectList(new QueryWrapper<Office>().lambda().eq(Office::getParentId, officeId));
         List<String> officeIdList = officeList.stream().distinct().map(Office::getId).collect(Collectors.toList());
-        while(true) {
+        while (true) {
             List<String> ids = new ArrayList<>();
-            officeIdList.stream().forEach(item->{
+            officeIdList.stream().forEach(item -> {
                 List<Office> officeList1 = officeMapper.selectList(new QueryWrapper<Office>().lambda().eq(Office::getParentId, item));
-                officeList1.stream().forEach(i->{
+                officeList1.stream().forEach(i -> {
                     officeList.add(i);
                     ids.add(i.getId());
                 });
@@ -517,29 +527,31 @@ public class UserService extends ServiceImpl <UserMapper, User> {
             return false;
         }).map(Office::getId).collect(Collectors.toList());
         officeIds.add(officeId);
-        return this.list(new QueryWrapper<User>().lambda().in(User::getOfficeId,officeIds));
+        return this.list(new QueryWrapper<User>().lambda().in(User::getOfficeId, officeIds));
     }
 
     /**
      * 根据用户name获取用户id
+     *
      * @param name
      * @return
      */
     public String getUserIdByName(String name) {
-        return userMapper.getUserIdByName (name);
+        return userMapper.getUserIdByName(name);
     }
 
     //根据部门查询用户信息
-    public List<OfficeDTO> getUserByOffice(List<String> officeIds, String type){
-        return userMapper.getUserByOffice(officeIds,type);
+    public List<OfficeDTO> getUserByOffice(List<String> officeIds, String type) {
+        return userMapper.getUserByOffice(officeIds, type);
     }
 
     /**
      * 修改用户更新密码状态信息
+     *
      * @param userDTO
      */
     public void updateUserUpPassword(UserDTO userDTO) {
-        baseMapper.updateUserUpPassword (userDTO);
+        baseMapper.updateUserUpPassword(userDTO);
     }
 
     public List<User> selectListByName(String name) {
@@ -548,22 +560,23 @@ public class UserService extends ServiceImpl <UserMapper, User> {
 
     /**
      * 签字注师查询用户权限所用
+     *
      * @param userDTO
      * @return
      */
     public IPage<UserDTO> findPage3(UserDTO userDTO) {
         Page<UserDTO> page = new Page<>();
-        if(null != userDTO){
-            if(null != userDTO.getOfficeDTO() && StringUtils.isNotBlank(userDTO.getOfficeDTO().getId())){
+        if (null != userDTO) {
+            if (null != userDTO.getOfficeDTO() && StringUtils.isNotBlank(userDTO.getOfficeDTO().getId())) {
 
-                List <UserDTO> list1 = baseMapper.findList3(userDTO.getOfficeDTO().getId(),userDTO.getLoginName());
+                List<UserDTO> list1 = baseMapper.findList3(userDTO.getOfficeDTO().getId(), userDTO.getLoginName());
                 page.setRecords(list1);
-            }else{
-                List <UserDTO> list1 = baseMapper.findList3("",userDTO.getLoginName());
+            } else {
+                List<UserDTO> list1 = baseMapper.findList3("", userDTO.getLoginName());
                 page.setRecords(list1);
             }
-        }else{
-            List <UserDTO> list1 = Lists.newArrayList();
+        } else {
+            List<UserDTO> list1 = Lists.newArrayList();
             page.setRecords(list1);
         }
         return page;
@@ -571,38 +584,39 @@ public class UserService extends ServiceImpl <UserMapper, User> {
 
     /**
      * 查询签字注师二信息列表
+     *
      * @param page
      * @param
      * @return
      */
-    public IPage <UserDTO> findPage1(UserDTO dto, Page <UserDTO> page) {
+    public IPage<UserDTO> findPage1(UserDTO dto, Page<UserDTO> page) {
         OfficeDTO officeDTO = dto.getCompanyDTO();
         String companyId = "";
-        if (null != officeDTO){
+        if (null != officeDTO) {
             companyId = officeDTO.getId();
         }
-        List <UserDTO> list1 = baseMapper.findList1(dto,companyId);
+        List<UserDTO> list1 = baseMapper.findList1(dto, companyId);
         // 将List<UserDTO>数据设置到Page对象中
         page.setRecords(list1);
-        return  page;
+        return page;
     }
 
 
-
     /**
      * 查询签字注师二信息集合
+     *
      * @param page
      * @param
      * @return
      */
-    public List <UserDTO> getSignatureAnnotator2List(UserDTO dto) {
+    public List<UserDTO> getSignatureAnnotator2List(UserDTO dto) {
         OfficeDTO officeDTO = dto.getCompanyDTO();
         String companyId = "";
-        if (null != officeDTO){
+        if (null != officeDTO) {
             companyId = officeDTO.getId();
         }
-        List <UserDTO> signatureAnnotator2List = baseMapper.findList1(dto,companyId);
-        return  signatureAnnotator2List;
+        List<UserDTO> signatureAnnotator2List = baseMapper.findList1(dto, companyId);
+        return signatureAnnotator2List;
     }
 
     public Boolean isUpdatePassword(String userId) {
@@ -618,6 +632,7 @@ public class UserService extends ServiceImpl <UserMapper, User> {
 
     /**
      * 岗位分页检索
+     *
      * @param
      * @param
      * @return
@@ -626,22 +641,23 @@ public class UserService extends ServiceImpl <UserMapper, User> {
         UserDTO dto = new UserDTO();
         OfficeDTO officeDTO = dto.getCompanyDTO();
         String companyId = "";
-        if (null != officeDTO){
+        if (null != officeDTO) {
             companyId = officeDTO.getId();
         }
-        List <UserDTO> list1 = baseMapper.findList1(dto,companyId);
+        List<UserDTO> list1 = baseMapper.findList1(dto, companyId);
         List<String> list = new ArrayList<>();
-        list1.forEach(li->{
+        list1.forEach(li -> {
             list.add(li.getOfficeDTO().getId());
         });
-        list1.forEach(li->{
+        list1.forEach(li -> {
             list.add(li.getCompanyDTO().getId());
         });
-        return  list;
+        return list;
     }
 
     /**
      * 岗位分页检索
+     *
      * @param
      * @param
      * @return
@@ -650,22 +666,23 @@ public class UserService extends ServiceImpl <UserMapper, User> {
         UserDTO dto = new UserDTO();
         OfficeDTO officeDTO = dto.getCompanyDTO();
         String companyId = "";
-        if (null != officeDTO){
+        if (null != officeDTO) {
             companyId = officeDTO.getId();
         }
-        List <UserDTO> list1 = baseMapper.findAllList(dto,companyId);
+        List<UserDTO> list1 = baseMapper.findAllList(dto, companyId);
         List<String> list = new ArrayList<>();
-        list1.forEach(li->{
+        list1.forEach(li -> {
             list.add(li.getOfficeDTO().getId());
         });
-        list1.forEach(li->{
+        list1.forEach(li -> {
             list.add(li.getCompanyDTO().getId());
         });
-        return  list;
+        return list;
     }
 
     /**
      * 获取所有的用户数据
+     *
      * @return
      */
     public List<UserDTO> getAllUserInfo() {
@@ -675,15 +692,17 @@ public class UserService extends ServiceImpl <UserMapper, User> {
 
     /**
      * 获取所有的用户数据
+     *
      * @return
      */
     public List<UserDTO> getAllUserInfoByTentId() {
-        List<UserDTO> allUserInfo = userMapper.getAllUserInfoByTentId("10001","10003");
+        List<UserDTO> allUserInfo = userMapper.getAllUserInfoByTentId("10001", "10003");
         return allUserInfo;
     }
 
     /**
      * 查询出拥有权限的用户的部门id
+     *
      * @return
      */
     public List<String> hasUser() {
@@ -694,10 +713,10 @@ public class UserService extends ServiceImpl <UserMapper, User> {
         //获取当前登录人信息
         UserDTO userDTO = UserUtils.getCurrentUserDTO();
         //如果当前登录人是中审的管理咨询部人员,则注会列表中添加该部门选择项
-        if(null != userDTO && null != userDTO.getOfficeDTO()){
+        if (null != userDTO && null != userDTO.getOfficeDTO()) {
             OfficeDTO officeDTO = userDTO.getOfficeDTO();
-            if(StringUtils.isNotBlank(officeDTO.getId())){
-                if("1602840084816138241".equals(officeDTO.getId())){
+            if (StringUtils.isNotBlank(officeDTO.getId())) {
+                if ("1602840084816138241".equals(officeDTO.getId())) {
                     hasUser.add("1602840084816138241");
                     hasUser.add("1615171302381182978");
                 }
@@ -708,18 +727,19 @@ public class UserService extends ServiceImpl <UserMapper, User> {
     }
 
     public IPage<UserDTO> findCertPage(Page<UserDTO> page, QueryWrapper<UserDTO> queryWrapper) {
-        queryWrapper.eq ( "a.del_flag", CommonConstants.NOT_DELETED ); // 排除已经删除
-        return baseMapper.findCertList ( page, queryWrapper );
+        queryWrapper.eq("a.del_flag", CommonConstants.NOT_DELETED); // 排除已经删除
+        return baseMapper.findCertList(page, queryWrapper);
     }
 
     /**
      * 修改用户邮箱
+     *
      * @param id
      * @param userEmail
      * @return
      */
     public void updateEmail(String id, String userEmail) {
-        userMapper.updateEmail(id,userEmail);
+        userMapper.updateEmail(id, userEmail);
     }
 
     public Integer selectCountByMobile(String mobile) {
@@ -733,6 +753,7 @@ public class UserService extends ServiceImpl <UserMapper, User> {
 
     /**
      * 根据id获取用户过滤掉tenantId
+     *
      * @param id
      * @return
      */
@@ -742,6 +763,7 @@ public class UserService extends ServiceImpl <UserMapper, User> {
 
     /**
      * 根据id修改用户的del_flag及登录的login_flag
+     *
      * @param id
      */
     public void updateDelFlagById(String id) {
@@ -750,11 +772,12 @@ public class UserService extends ServiceImpl <UserMapper, User> {
 
     /**
      * 根据用户id查询是否存在“部门主任”岗位
+     *
      * @param id
      * @return
      */
     public Integer getUserPostCountById(String id) {
-        return userMapper.getUserPostCountById (id);
+        return userMapper.getUserPostCountById(id);
     }
 
     public String getMobileById(String id) {
@@ -767,6 +790,7 @@ public class UserService extends ServiceImpl <UserMapper, User> {
 
     /**
      * 获取所有的用户信息
+     *
      * @return
      */
     public List<UserDTO> getAllUserInfoNoTenId() {
@@ -776,6 +800,7 @@ public class UserService extends ServiceImpl <UserMapper, User> {
 
     /**
      * 修改用户信息
+     *
      * @param dto
      */
     public void updateUserById(UserDTO dto) {
@@ -784,6 +809,7 @@ public class UserService extends ServiceImpl <UserMapper, User> {
 
     /**
      * 根据手机号获取用户信息
+     *
      * @param mobilePhone
      * @return
      */

+ 203 - 62
jeeplus-modules/jeeplus-test/src/main/java/com/jeeplus/test/dingding/controller/DingdingAddressBookController.java

@@ -6,8 +6,10 @@ import com.dingtalk.api.request.*;
 import com.dingtalk.api.response.*;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.jeeplus.logging.annotation.ApiLog;
+import com.jeeplus.test.dingding.dto.AddUserDTO;
 import com.jeeplus.test.dingding.dto.DeptDTO;
 import com.jeeplus.test.dingding.dto.DdUserDTO;
+import com.jeeplus.test.dingding.dto.UserRequestDTO;
 import com.jeeplus.utils.StringUtils;
 import com.taobao.api.ApiException;
 import io.swagger.annotations.ApiOperation;
@@ -34,26 +36,24 @@ public class DingdingAddressBookController {
     @Value("NWFAu2fcfKlW3GxlvrGEwMjvJ7jyCPq0Q70XzptUsxE5PYs9cx5wTBWL0wjxKBtf")
     private String appSecret;
 
-    private DingdingController dingdingController;
-
     /**
      * 获取token
      */
 //    @ApiLog("获取token")
 //    @ApiOperation(value = "获取token")
 //    @GetMapping("getToken")
-    public String  getToken() throws ApiException {
-            // 创建钉钉客户端
-            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
-            // 配置请求参数
-            OapiGettokenRequest req = new OapiGettokenRequest();
-            req.setAppkey(appKey); // 确保 appKey 已正确初始化
-            req.setAppsecret(appSecret); // 确保 appSecret 已正确初始化
-            req.setHttpMethod("GET");
-            // 执行请求,获取响应
-            OapiGettokenResponse rsp = client.execute(req);
-            String accessToken = rsp.getAccessToken();
-            return accessToken;
+    public String getToken() throws ApiException {
+        // 创建钉钉客户端
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
+        // 配置请求参数
+        OapiGettokenRequest req = new OapiGettokenRequest();
+        req.setAppkey(appKey); // 确保 appKey 已正确初始化
+        req.setAppsecret(appSecret); // 确保 appSecret 已正确初始化
+        req.setHttpMethod("GET");
+        // 执行请求,获取响应
+        OapiGettokenResponse rsp = client.execute(req);
+        String accessToken = rsp.getAccessToken();
+        return accessToken;
     }
 
     /**
@@ -61,14 +61,17 @@ public class DingdingAddressBookController {
      */
     @ApiLog("获取用户列表")
     @ApiOperation(value = "获取用户列表")
-    @GetMapping("list")
-    public ResponseEntity list(Long deptId,String dateFrom,String dateTo) {
+    @PostMapping("list")
+    public ResponseEntity list(@RequestBody UserRequestDTO userRequestDTO) {
         try {
             ArrayList<DdUserDTO> userDTOS = new ArrayList<>();
 
             String token = getToken();
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/list");
             OapiV2UserListRequest req = new OapiV2UserListRequest();
+            Long deptId = userRequestDTO.getDeptId();
+            String dateFrom = userRequestDTO.getDateFrom();
+            String dateTo = userRequestDTO.getDateTo();
             // 设置部门 ID(传递具体部门 ID 值)
             req.setDeptId(deptId); // 替换为你需要的部门 ID
             // 设置分页参数(可选)
@@ -83,7 +86,7 @@ public class DingdingAddressBookController {
             OapiAttendanceGetattcolumnsResponse rsp1 = client1.execute(req1, token);
             ArrayList<OapiAttendanceGetattcolumnsResponse.ColumnForTopVo> arrayList = new ArrayList<>();
             for (OapiAttendanceGetattcolumnsResponse.ColumnForTopVo column : rsp1.getResult().getColumns()) {
-                if (column.getName().equals("应出勤天数") || column.getName().equals("出勤天数") || column.getName().equals("休息天数") || column.getName().equals("迟到次数")){
+                if (column.getName().equals("应出勤天数") || column.getName().equals("出勤天数") || column.getName().equals("休息天数") || column.getName().equals("迟到次数")) {
                     arrayList.add(column);
                 }
             }
@@ -94,7 +97,7 @@ public class DingdingAddressBookController {
                 ddUserDTO.setUserid(user.getUserid());
                 ddUserDTO.setMobile(user.getMobile());
                 ddUserDTO.setName(user.getName());
-                String requiredAttDays ="";//应出勤天数
+                String requiredAttDays = "";//应出勤天数
                 String attDays = "";//出勤天数
                 String restDays = "";//休息天数
                 String lateTimes = "";//迟到次数
@@ -103,7 +106,7 @@ public class DingdingAddressBookController {
                 for (OapiAttendanceGetcolumnvalResponse.ColumnValForTopVo columnVal : attRsp.getResult().getColumnVals()) {
                     for (OapiAttendanceGetattcolumnsResponse.ColumnForTopVo columnForTopVo : arrayList) {
                         //对考勤信息列进行汇总
-                        if (columnForTopVo.getId().equals(columnVal.getColumnVo().getId()) && columnForTopVo.getName().equals("应出勤天数")){
+                        if (columnForTopVo.getId().equals(columnVal.getColumnVo().getId()) && columnForTopVo.getName().equals("应出勤天数")) {
                             double days = 0;
                             for (OapiAttendanceGetcolumnvalResponse.ColumnDayAndVal val : columnVal.getColumnVals()) {
                                 double v = Double.parseDouble(val.getValue());
@@ -111,7 +114,7 @@ public class DingdingAddressBookController {
                             }
                             requiredAttDays = String.valueOf(days);
                         }
-                        if (columnForTopVo.getId().equals(columnVal.getColumnVo().getId()) && columnForTopVo.getName().equals("出勤天数")){
+                        if (columnForTopVo.getId().equals(columnVal.getColumnVo().getId()) && columnForTopVo.getName().equals("出勤天数")) {
                             double days = 0;
                             for (OapiAttendanceGetcolumnvalResponse.ColumnDayAndVal val : columnVal.getColumnVals()) {
                                 double v = Double.parseDouble(val.getValue());
@@ -119,7 +122,7 @@ public class DingdingAddressBookController {
                             }
                             attDays = String.valueOf(days);
                         }
-                        if (columnForTopVo.getId().equals(columnVal.getColumnVo().getId()) && columnForTopVo.getName().equals("休息天数")){
+                        if (columnForTopVo.getId().equals(columnVal.getColumnVo().getId()) && columnForTopVo.getName().equals("休息天数")) {
                             double days = 0;
                             for (OapiAttendanceGetcolumnvalResponse.ColumnDayAndVal val : columnVal.getColumnVals()) {
                                 double v = Double.parseDouble(val.getValue());
@@ -127,7 +130,7 @@ public class DingdingAddressBookController {
                             }
                             restDays = String.valueOf(days);
                         }
-                        if (columnForTopVo.getId().equals(columnVal.getColumnVo().getId()) && columnForTopVo.getName().equals("迟到次数")){
+                        if (columnForTopVo.getId().equals(columnVal.getColumnVo().getId()) && columnForTopVo.getName().equals("迟到次数")) {
                             double days = 0;
                             for (OapiAttendanceGetcolumnvalResponse.ColumnDayAndVal val : columnVal.getColumnVals()) {
                                 double v = Double.parseDouble(val.getValue());
@@ -141,7 +144,6 @@ public class DingdingAddressBookController {
                 ddUserDTO.setRequiredAttDays(requiredAttDays);
                 ddUserDTO.setRestDays(restDays);
                 ddUserDTO.setLateTimes(lateTimes);
-
                 userDTOS.add(ddUserDTO);
             }
 
@@ -149,15 +151,15 @@ public class DingdingAddressBookController {
             return ResponseEntity.ok(userDTOS);
         } catch (ApiException e) {
             e.printStackTrace(); // 打印错误日志(开发调试用)
-            return  ResponseEntity.badRequest ( ).body ( "接口异常,请重试!" );
+            return ResponseEntity.badRequest().body("接口异常,请重试!");
         } catch (Exception e) {
             e.printStackTrace(); // 打印错误日志(开发调试用)
-            return  ResponseEntity.badRequest ( ).body ( "接口异常,请重试!" );
+            return ResponseEntity.badRequest().body("接口异常,请重试!");
         }
     }
 
 
-    public OapiAttendanceGetcolumnvalResponse getAttById(String userId,String leaveTypes,String dateFrom,String dateTo) throws ApiException, ParseException {
+    public OapiAttendanceGetcolumnvalResponse getAttById(String userId, String leaveTypes, String dateFrom, String dateTo) throws ApiException, ParseException {
         String access_token = getToken();
 
         DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getcolumnval");
@@ -169,7 +171,7 @@ public class DingdingAddressBookController {
         //日期必须传,当没有日期的时候获取当前的日期
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
-        if (StringUtils.isBlank(dateFrom) && StringUtils.isBlank(dateTo)){
+        if (StringUtils.isBlank(dateFrom) && StringUtils.isBlank(dateTo)) {
             LocalDate today = LocalDate.now();
             LocalDate firstDayOfMonth = today.withDayOfMonth(1);
             // 将 LocalDate 转换为 Date 对象
@@ -181,7 +183,7 @@ public class DingdingAddressBookController {
             String formattedDate = sdf.format(fromDate);
             from = sdf.parse(formattedDate);
             to = sdf.parse(toattedDate);
-        }else {
+        } else {
             from = sdf.parse(dateFrom);
             to = sdf.parse(dateTo);
         }
@@ -201,15 +203,155 @@ public class DingdingAddressBookController {
     @ApiOperation(value = "获取部门列表")
     @GetMapping("deptList")
     public ResponseEntity deptList(Long deptId) {
+        List<OapiV2DepartmentListsubResponse.DeptBaseResponse> allDepartments = new ArrayList<>();
+        Long rootDeptId = deptId; // 钉钉根部门 ID 一般是 1
+        fetchAllDepartments(rootDeptId, allDepartments);
+        return ResponseEntity.ok(allDepartments);
+    }
+    // 假设有一个方法可以调用 API 获取子部门列表
+    public static List<OapiV2DepartmentListsubResponse.DeptBaseResponse> getSubDepartments(Long parentDeptId) {
         try {
-            String token = getToken();
+            // 创建钉钉客户端
+            DingTalkClient tokenClient = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
+            // 配置请求参数
+            OapiGettokenRequest tokenReq = new OapiGettokenRequest();
+            tokenReq.setAppkey("dingtk0peibzdlxdmojz"); // 确保 appKey 已正确初始化
+            tokenReq.setAppsecret("NWFAu2fcfKlW3GxlvrGEwMjvJ7jyCPq0Q70XzptUsxE5PYs9cx5wTBWL0wjxKBtf"); // 确保 appSecret 已正确初始化
+            tokenReq.setHttpMethod("GET");
+            // 执行请求,获取响应
+            OapiGettokenResponse tokenRsp = tokenClient.execute(tokenReq);
+            String accessToken = tokenRsp.getAccessToken();
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
             OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
             // 检查 deptId 是否为空
-            if (deptId != null) {
-                req.setDeptId(deptId);
+            if (parentDeptId != null) {
+                req.setDeptId(parentDeptId);
             }
-            OapiV2DepartmentListsubResponse rsp = client.execute(req, token);
+            OapiV2DepartmentListsubResponse rsp = client.execute(req, accessToken);
+            List<OapiV2DepartmentListsubResponse.DeptBaseResponse> result = rsp.getResult();
+            // 返回 JSON 响应
+            return result;
+        } catch (ApiException e) {
+            e.printStackTrace(); // 打印错误日志(开发调试用)
+            return null;
+        } catch (Exception e) {
+            e.printStackTrace(); // 打印错误日志(开发调试用)
+            return null;
+        }
+    }
+
+
+    // 递归获取所有子部门
+    public static void fetchAllDepartments(Long parentDeptId, List<OapiV2DepartmentListsubResponse.DeptBaseResponse> allDepts) {
+        List<OapiV2DepartmentListsubResponse.DeptBaseResponse> subDepts = getSubDepartments(parentDeptId);
+        for (OapiV2DepartmentListsubResponse.DeptBaseResponse dept : subDepts) {
+            allDepts.add(dept); // 先添加当前部门
+            fetchAllDepartments(dept.getDeptId(), allDepts); // 递归获取子部门
+        }
+    }
+
+
+    /**
+     * 创建用户
+     */
+    @ApiLog("创建用户")
+    @ApiOperation(value = "创建用户")
+    @PostMapping("addUser")
+    public ResponseEntity addUser(@RequestBody AddUserDTO addUserDTO) {
+        try {
+            String token = getToken();
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/create");
+            OapiV2UserCreateRequest req = new OapiV2UserCreateRequest();
+            String name = addUserDTO.getName();
+            String mobile = addUserDTO.getMobile();
+            boolean hideMobile = addUserDTO.isHideMobile();
+            String jobNumber = addUserDTO.getJobNumber();
+            String title = addUserDTO.getTitle();
+            String email = addUserDTO.getEmail();
+            String workPlace = addUserDTO.getWorkPlace();
+            String deptIdList = addUserDTO.getDeptIdList();
+            Long hiredDate = addUserDTO.getHiredDate();
+            req.setName(name);
+
+            req.setDeptIdList(deptIdList);
+            req.setEmail(email);
+            req.setHideMobile(hideMobile);
+            req.setHiredDate(hiredDate);
+            req.setJobNumber(jobNumber);
+            req.setMobile(mobile);
+            req.setTitle(title);
+            req.setWorkPlace(workPlace);
+            OapiV2UserCreateResponse rsp = client.execute(req, token);
+            // 返回 JSON 响应
+            return ResponseEntity.ok(rsp);
+        } catch (ApiException e) {
+            e.printStackTrace(); // 打印错误日志(开发调试用)
+            return ResponseEntity.badRequest().body("接口异常,请重试!");
+        } catch (Exception e) {
+            e.printStackTrace(); // 打印错误日志(开发调试用)
+            return ResponseEntity.badRequest().body("接口异常,请重试!");
+        }
+    }
+
+
+
+    /**
+     * 更新用户数据
+     */
+    @ApiLog("更新用户数据")
+    @ApiOperation(value = "更新用户数据")
+    @PostMapping("updateUser")
+    public ResponseEntity updateUser(@RequestBody AddUserDTO addUserDTO) {
+        try {
+            String token = getToken();
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/update");
+            OapiV2UserUpdateRequest req = new OapiV2UserUpdateRequest();
+            String name = addUserDTO.getName();
+            String mobile = addUserDTO.getMobile();
+            boolean hideMobile = addUserDTO.isHideMobile();
+            String jobNumber = addUserDTO.getJobNumber();
+            String title = addUserDTO.getTitle();
+            String email = addUserDTO.getEmail();
+            String workPlace = addUserDTO.getWorkPlace();
+            String deptIdList = addUserDTO.getDeptIdList();
+            Long hiredDate = addUserDTO.getHiredDate();
+            String userId = addUserDTO.getUserid();
+            req.setUserid(userId);
+            req.setName(name);
+            req.setDeptIdList(deptIdList);
+            req.setEmail(email);
+            req.setHideMobile(hideMobile);
+            req.setHiredDate(hiredDate);
+            req.setJobNumber(jobNumber);
+            req.setMobile(mobile);
+            req.setTitle(title);
+            req.setWorkPlace(workPlace);
+            OapiV2UserUpdateResponse rsp = client.execute(req, token);
+            // 返回 JSON 响应
+            return ResponseEntity.ok(rsp);
+        } catch (ApiException e) {
+            e.printStackTrace(); // 打印错误日志(开发调试用)
+            return ResponseEntity.badRequest().body("接口异常,请重试!");
+        } catch (Exception e) {
+            e.printStackTrace(); // 打印错误日志(开发调试用)
+            return ResponseEntity.badRequest().body("接口异常,请重试!");
+        }
+    }
+
+    /**
+     * 查看用户详情
+     */
+    @ApiLog("查看用户详情")
+    @ApiOperation(value = "查看用户详情")
+    @GetMapping("selectUserById")
+    public ResponseEntity selectUserById(String id) {
+        try {
+            String token = getToken();
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get");
+            OapiV2UserGetRequest req = new OapiV2UserGetRequest();
+            req.setUserid(id);
+            req.setLanguage("zh_CN");
+            OapiV2UserGetResponse rsp = client.execute(req, token);
             // 返回 JSON 响应
             return ResponseEntity.ok(rsp);
         } catch (ApiException e) {
@@ -238,16 +380,16 @@ public class DingdingAddressBookController {
             return ResponseEntity.ok(rsp);
         } catch (ApiException e) {
             e.printStackTrace(); // 打印错误日志(开发调试用)
-            return  ResponseEntity.badRequest ( ).body ( "接口异常,请重试!" );
+            return ResponseEntity.badRequest().body("接口异常,请重试!");
         } catch (Exception e) {
             e.printStackTrace(); // 打印错误日志(开发调试用)
-            return  ResponseEntity.badRequest ( ).body ( "接口异常,请重试!" );
+            return ResponseEntity.badRequest().body("接口异常,请重试!");
         }
     }
 
 
     /**
-     *  创建部门
+     * 创建部门
      */
     @ApiLog("创建部门")
     @ApiOperation(value = "创建部门")
@@ -264,16 +406,16 @@ public class DingdingAddressBookController {
             return ResponseEntity.ok(rsp);
         } catch (ApiException e) {
             e.printStackTrace(); // 打印错误日志(开发调试用)
-            return  ResponseEntity.badRequest ( ).body ( "接口异常,请重试!" );
+            return ResponseEntity.badRequest().body("接口异常,请重试!");
         } catch (Exception e) {
             e.printStackTrace(); // 打印错误日志(开发调试用)
-            return  ResponseEntity.badRequest ( ).body ( "接口异常,请重试!" );
+            return ResponseEntity.badRequest().body("接口异常,请重试!");
         }
     }
 
 
     /**
-     *  修改部门信息
+     * 修改部门信息
      */
     @ApiLog("修改部门信息")
     @ApiOperation(value = "修改部门信息")
@@ -290,37 +432,36 @@ public class DingdingAddressBookController {
             return ResponseEntity.ok("修改成功");
         } catch (ApiException e) {
             e.printStackTrace(); // 打印错误日志(开发调试用)
-            return  ResponseEntity.badRequest ( ).body ( "接口异常,请重试!" );
+            return ResponseEntity.badRequest().body("接口异常,请重试!");
         } catch (Exception e) {
             e.printStackTrace(); // 打印错误日志(开发调试用)
-            return  ResponseEntity.badRequest ( ).body ( "接口异常,请重试!" );
+            return ResponseEntity.badRequest().body("接口异常,请重试!");
         }
     }
 
 
-
-        /**
-         *  根据部门id查询数据
-         */
-        @ApiLog("根据部门id查询数据")
-        @ApiOperation(value = "根据部门id查询数据")
-        @GetMapping("queryById")
-        public ResponseEntity queryById(Long deptId) {
-            try {
-                String token = getToken();
-                DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/get");
-                OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest();
-                req.setDeptId(deptId);
-                OapiV2DepartmentGetResponse rsp = client.execute(req, token);
-                return ResponseEntity.ok(rsp);
-            } catch (ApiException e) {
-                e.printStackTrace(); // 打印错误日志(开发调试用)
-                return  ResponseEntity.badRequest ( ).body ( "接口异常,请重试!" );
-            } catch (Exception e) {
-                e.printStackTrace(); // 打印错误日志(开发调试用)
-                return  ResponseEntity.badRequest ( ).body ( "接口异常,请重试!" );
-            }
+    /**
+     * 根据部门id查询数据
+     */
+    @ApiLog("根据部门id查询数据")
+    @ApiOperation(value = "根据部门id查询数据")
+    @GetMapping("queryById")
+    public ResponseEntity queryById(Long deptId) {
+        try {
+            String token = getToken();
+            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/get");
+            OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest();
+            req.setDeptId(deptId);
+            OapiV2DepartmentGetResponse rsp = client.execute(req, token);
+            return ResponseEntity.ok(rsp);
+        } catch (ApiException e) {
+            e.printStackTrace(); // 打印错误日志(开发调试用)
+            return ResponseEntity.badRequest().body("接口异常,请重试!");
+        } catch (Exception e) {
+            e.printStackTrace(); // 打印错误日志(开发调试用)
+            return ResponseEntity.badRequest().body("接口异常,请重试!");
         }
+    }
 
 
     public <T> T jsonToObject(String json, Class<T> clazz) {

+ 29 - 0
jeeplus-modules/jeeplus-test/src/main/java/com/jeeplus/test/dingding/dto/AddUserDTO.java

@@ -0,0 +1,29 @@
+package com.jeeplus.test.dingding.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @Author hgc
+ * @Date 2025/3/4/14:15
+ * @ClassName AddUserDTO
+ * @Description
+ */
+@Data
+public class AddUserDTO {
+    private String userid;
+    private String name;
+    private String mobile;
+    private boolean hideMobile;
+    private String telephone;
+    private String jobNumber;
+    private String title;
+    private String email;
+    private String orgEmail;
+    private String orgEmailType;
+    private String workPlace;
+    private String remark;
+    private String deptIdList; // 部门 ID 列表
+    private Long hiredDate;
+}

+ 11 - 0
jeeplus-modules/jeeplus-test/src/main/java/com/jeeplus/test/dingding/dto/DdUserDTO.java

@@ -17,4 +17,15 @@ public class DdUserDTO {
 
     private String restDays; //休息天数
     private String lateTimes; //迟到次数
+    private boolean hideMobile;
+    private String telephone;
+    private String jobNumber;
+    private String title;
+    private String email;
+    private String orgEmail;
+    private String orgEmailType;
+    private String workPlace;
+    private String remark;
+    private String deptIdList; // 部门 ID 列表
+    private Long hiredDate;
 }

+ 16 - 0
jeeplus-modules/jeeplus-test/src/main/java/com/jeeplus/test/dingding/dto/UserRequestDTO.java

@@ -0,0 +1,16 @@
+package com.jeeplus.test.dingding.dto;
+
+import lombok.Data;
+
+/**
+ * @Author hgc
+ * @Date 2025/3/4/14:15
+ * @ClassName AddUserDTO
+ * @Description
+ */
+@Data
+public class UserRequestDTO {
+    private Long deptId;
+    private String dateFrom;
+    private String dateTo;
+}

+ 9 - 0
jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/xxl/job/executor/service/jobhandler/SampleXxlJob.java

@@ -7,6 +7,7 @@ import com.alibaba.fastjson.TypeReference;
 import com.jeeplus.domain.*;
 import com.jeeplus.flowable.feign.IAssessApi;
 import com.jeeplus.flowable.feign.IFlowableApi;
+import com.jeeplus.flowable.feign.IHumanApi;
 import com.jeeplus.sys.feign.IPostApi;
 import com.jeeplus.sys.feign.IRoleApi;
 import com.jeeplus.sys.feign.ITenantApi;
@@ -1041,5 +1042,13 @@ public class SampleXxlJob {
         }
     }
 
+    /**
+     * 1、简单任务示例(Bean模式)
+     */
+    @XxlJob("syncDingTalkInfo")
+    public void syncDingTalkInfo() {
+        SpringUtil.getBean(IHumanApi.class).syncDingTalkInfo();
+    }
+
 
 }