2 Commits c515d157f3 ... 7ad651326e

Autor SHA1 Mensaje Fecha
  huangguoce 7ad651326e Merge remote-tracking branch 'origin/master' hace 4 días
  huangguoce 9bd81f047b 申请离职-钉钉同步离职 hace 4 días

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

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

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

@@ -58,4 +58,8 @@ public interface IHumanApi {
     //同步钉钉数据
     @GetMapping(value = "/enrollmentRegistration/syncDingTalkInfo")
     void syncDingTalkInfo();
+
+    //同步钉钉数据
+    @GetMapping(value = "/departRegistration/dingConfirmResign")
+    void dingConfirmResign(@RequestParam(value = "id")String id,@RequestParam(value = "mobilePhone")String mobilePhone);
 }

+ 30 - 2
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/registration/controller/DepartRegistrationController.java

@@ -1,12 +1,18 @@
 package com.jeeplus.human.depart.registration.controller;
 
+import cn.hutool.extra.spring.SpringUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jeeplus.common.utils.ResponseUtil;
 import com.jeeplus.human.depart.registration.domain.DepartRegistration;
 import com.jeeplus.human.depart.registration.service.DepartService;
+import com.jeeplus.human.enrollment.enrollmentRegistration.service.dto.DingTalkUserDTO;
+import com.jeeplus.human.enrollment.enrollmentRegistration.utils.DingTalkUtils;
 import com.jeeplus.logging.annotation.ApiLog;
 import com.jeeplus.logging.constant.enums.LogTypeEnum;
+import com.jeeplus.sys.feign.IDictApi;
+import com.jeeplus.sys.feign.IUserApi;
+import com.jeeplus.sys.service.dto.UserDTO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.http.ResponseEntity;
@@ -14,7 +20,6 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
-import java.util.Date;
 
 /**
  * @author 王强
@@ -29,6 +34,9 @@ public class DepartRegistrationController {
     @Resource
     private DepartService departService;
 
+    @Resource
+    private DingTalkUtils dingTalkUtils;
+
     /**
      * 查询财务项目信息列表
      * @param projectReportData
@@ -97,7 +105,7 @@ public class DepartRegistrationController {
      */
     @ApiOperation(value = "删除")
     @GetMapping("/remove")
-    public ResponseEntity<String> remove(@RequestParam String id){
+    public ResponseEntity<String> remove(@RequestParam String id) throws Exception {
         String s = departService.remove(id);
         return ResponseEntity.ok(s);
     }
@@ -125,4 +133,24 @@ public class DepartRegistrationController {
         String date = departService.selectContractStartDate();
         return ResponseEntity.ok(date);
     }
+
+
+
+    /**
+     * 查询入职日期
+     * @param
+     * @return
+     */
+    @ApiOperation(value = "钉钉确认员工离职")
+    @GetMapping("/dingConfirmResign")
+    public void dingConfirmResign(String id,String mobilePhone) throws Exception {
+        //字典控制
+        String dictValue = SpringUtil.getBean(IDictApi.class).getDictValue("dd_status", "dd_status", "0");
+        if("1".equals(dictValue)) {
+            UserDTO userDTO = SpringUtil.getBean(IUserApi.class).getByMobile(mobilePhone);
+            DingTalkUserDTO dingTalkUserDTO = new DingTalkUserDTO();
+            dingTalkUserDTO.setUserid(id);
+            dingTalkUtils.confirmRe(dingTalkUserDTO, userDTO.getTenantDTO().getId());
+        }
+    }
 }

+ 28 - 6
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/depart/registration/service/DepartService.java

@@ -10,7 +10,9 @@ import com.jeeplus.core.query.QueryWrapperGenerator;
 import com.jeeplus.flowable.feign.IFlowableApi;
 import com.jeeplus.human.depart.registration.domain.DepartRegistration;
 import com.jeeplus.human.depart.registration.mapper.DepartMapper;
-import com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentKeyCard;
+import com.jeeplus.human.enrollment.enrollmentRegistration.service.dto.DingTalkUserDTO;
+import com.jeeplus.human.enrollment.enrollmentRegistration.utils.DingTalkUtils;
+import com.jeeplus.sys.feign.IDictApi;
 import com.jeeplus.sys.feign.IUserApi;
 import com.jeeplus.sys.service.dto.UserDTO;
 import org.apache.commons.lang3.StringUtils;
@@ -19,6 +21,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
 import java.util.Date;
 
 /**
@@ -36,6 +39,9 @@ public class DepartService extends ServiceImpl<DepartMapper, DepartRegistration>
     @Resource
     private IFlowableApi flowTaskService;
 
+    @Resource
+    private DingTalkUtils dingTalkUtils;
+
     /**
      * 离职申请信息
      * @param page
@@ -109,7 +115,6 @@ public class DepartService extends ServiceImpl<DepartMapper, DepartRegistration>
     public DepartRegistration add(DepartRegistration reportData) throws Exception{
 
         UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
-
         DepartRegistration report = new DepartRegistration();
         BeanUtils.copyProperties(reportData, report);
         report.setCreateById(userDTO.getId());
@@ -118,7 +123,16 @@ public class DepartService extends ServiceImpl<DepartMapper, DepartRegistration>
         report.setUpdateTime(new Date());
 
         mapper.insert(report);
-
+        //操作钉钉加入待离职
+        String dictValue = SpringUtil.getBean(IDictApi.class).getDictValue("dd_status", "dd_status", "0");
+        if("1".equals(dictValue)) {
+            DingTalkUserDTO dingTalkUserDTO = new DingTalkUserDTO();
+            dingTalkUserDTO.setUserid(userDTO.getDdId());
+            String departResignationDate = report.getDepartResignationDate();
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            long timestamp = sdf.parse(departResignationDate).getTime();
+            dingTalkUtils.userPendingResignation(dingTalkUserDTO, timestamp, userDTO.getTenantDTO().getId());
+        }
         return report;
     }
 
@@ -132,9 +146,17 @@ public class DepartService extends ServiceImpl<DepartMapper, DepartRegistration>
         mapper.updateStatusById(dto.getId(), dto.getType());
     }
 
-    public String remove(String id) {
-        mapper.deleteById(id);
-        return "操作成功";
+    public String remove(String id) throws Exception {
+        //字典控制钉钉同步
+        String dictValue = SpringUtil.getBean(IDictApi.class).getDictValue("dd_status", "dd_status", "0");
+        if("1".equals(dictValue)) {
+            UserDTO userDTO = SpringUtil.getBean ( IUserApi.class ).getByToken(TokenProvider.getCurrentToken ( ));
+            DingTalkUserDTO dingTalkUserDTO = new DingTalkUserDTO();
+            dingTalkUserDTO.setUserid(userDTO.getDdId());
+            dingTalkUtils.revokeUserPendingResignation(dingTalkUserDTO, userDTO.getTenantDTO().getId());
+        }
+            mapper.deleteById(id);
+            return "操作成功";
     }
 
     public Boolean selectComplete() {

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

@@ -145,6 +145,7 @@
             resultType="com.jeeplus.human.enrollment.enrollmentRegistration.domain.EnrollmentRegistration">
         SELECT
         <include refid="Base_Column_List"></include>
+            ,su.dd_id AS "ddId"
         FROM `human_resources_enrollment_registration`  a
         LEFT JOIN sys_user su on a.user_id = su.id and su.del_flag = '0'
         LEFT JOIN human_resources_depart_registration hrdr ON hrdr.create_by_id = a.user_id

+ 137 - 2
jeeplus-modules/jeeplus-human/src/main/java/com/jeeplus/human/enrollment/enrollmentRegistration/utils/DingTalkUtils.java

@@ -3,16 +3,18 @@
  */
 package com.jeeplus.human.enrollment.enrollmentRegistration.utils;
 
+import com.aliyun.dingtalkhrm_1_0.models.GetAllDismissionReasonsResponse;
+import com.aliyun.dingtalkhrm_1_0.models.GetAllDismissionReasonsResponseBody;
+import com.aliyun.tea.TeaException;
+import com.aliyun.teautil.models.RuntimeOptions;
 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.taobao.api.ApiException;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
-
 import java.util.ArrayList;
 import java.util.List;
 
@@ -39,6 +41,15 @@ public class DingTalkUtils {
     @Value("${dingtalk.assessAppSecret}")
     private String assessAppSecret;
 
+    @Value("${dingtalk.dingAdminId}")
+    private String dingAdminId;//钉钉管理员ID
+
+    public static com.aliyun.dingtalkhrm_1_0.Client createClient() throws Exception {
+        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
+        config.protocol = "https";
+        config.regionId = "central";
+        return new com.aliyun.dingtalkhrm_1_0.Client(config);
+    }
     /**
      * 获取钉钉token
      */
@@ -191,5 +202,129 @@ public class DingTalkUtils {
     }
 
 
+    /**
+     * 将钉钉用户添加至待离职状态
+     * @param userDTO
+     * @param tenantId
+     * @return
+     * @throws Exception
+     */
+    public Boolean userPendingResignation(DingTalkUserDTO userDTO,Long lastWorkDate,String tenantId) throws Exception {
+        com.aliyun.dingtalkhrm_1_0.Client client = DingTalkUtils.createClient();
+        com.aliyun.dingtalkhrm_1_0.models.EmpStartDismissionHeaders empStartDismissionHeaders = new com.aliyun.dingtalkhrm_1_0.models.EmpStartDismissionHeaders();
+        empStartDismissionHeaders.xAcsDingtalkAccessToken  = getToken(tenantId);
+        //获取离职原因
+        String reasonLeaving = getReasonLeaving(tenantId);
+        com.aliyun.dingtalkhrm_1_0.models.EmpStartDismissionRequest empStartDismissionRequest = new com.aliyun.dingtalkhrm_1_0.models.EmpStartDismissionRequest()
+                .setTerminationReasonVoluntary(java.util.Arrays.asList(
+                        reasonLeaving
+                )) // 离职原因 默认其他
+                .setPartner(false) //是否不计入人事统计
+                .setLastWorkDate(lastWorkDate)//离职日期
+                .setToHireDismissionTalent(false) //是否保存至招聘人才库
+                .setToHireBlackList(false) //是否加入招聘黑名单
+                .setUserId(userDTO.getUserid()) // 离职员工的id
+                .setToHrmBlackList(false);//是否加入人事黑名单
+        try {
+            client.empStartDismissionWithOptions(empStartDismissionRequest, empStartDismissionHeaders, new com.aliyun.teautil.models.RuntimeOptions());
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+            }
+            return false;
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * 撤销用户待离职状态
+     * @param userDTO
+     * @param tenantId
+     * @return
+     * @throws Exception
+     */
+    public Boolean revokeUserPendingResignation(DingTalkUserDTO userDTO,String tenantId) throws Exception {
+        com.aliyun.dingtalkhrm_1_0.Client client = DingTalkUtils.createClient();
+        com.aliyun.dingtalkhrm_1_0.models.RevokeTerminationHeaders revokeTerminationHeaders = new com.aliyun.dingtalkhrm_1_0.models.RevokeTerminationHeaders();
+        revokeTerminationHeaders.xAcsDingtalkAccessToken  = getToken(tenantId);
+        com.aliyun.dingtalkhrm_1_0.models.RevokeTerminationRequest revokeTerminationRequest = new com.aliyun.dingtalkhrm_1_0.models.RevokeTerminationRequest()
+         .setUserId(userDTO.getUserid());
+        try {
+            client.revokeTerminationWithOptions(revokeTerminationRequest, revokeTerminationHeaders, new com.aliyun.teautil.models.RuntimeOptions());
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+            }
+            return false;
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+            }
+            return false;
+        }
+        return true;
+    }
+
+
+    /**
+     * 获取离职原因(默认返回 其他 )
+     * @param tenantId
+     * @return
+     * @throws Exception
+     */
+    public  String getReasonLeaving(String tenantId) throws Exception {
+        com.aliyun.dingtalkhrm_1_0.Client client = DingTalkUtils.createClient();
+        com.aliyun.dingtalkhrm_1_0.models.GetAllDismissionReasonsHeaders getAllDismissionReasonsHeaders = new com.aliyun.dingtalkhrm_1_0.models.GetAllDismissionReasonsHeaders();
+        getAllDismissionReasonsHeaders.xAcsDingtalkAccessToken  = getToken(tenantId);
+        GetAllDismissionReasonsResponseBody.GetAllDismissionReasonsResponseBodyResult result = null;
+        try {
+            GetAllDismissionReasonsResponse allDismissionReasonsWithOptions = client.getAllDismissionReasonsWithOptions(getAllDismissionReasonsHeaders, new RuntimeOptions());
+           result = allDismissionReasonsWithOptions.getBody().getResult();
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+            }
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+            }
+        }
+        List<GetAllDismissionReasonsResponseBody.GetAllDismissionReasonsResponseBodyResultVoluntaryList> voluntaryList = result.getVoluntaryList();
+        GetAllDismissionReasonsResponseBody.GetAllDismissionReasonsResponseBodyResultVoluntaryList getAllDismissionReasonsResponseBodyResultVoluntaryList = voluntaryList.get(4);
+        String id = getAllDismissionReasonsResponseBodyResultVoluntaryList.getId();//获取 其他原因的 id
+        return id;
+    }
+
+
+    /**
+     * 确认离职并删除员工
+     * @param dingUserDTO
+     * @param tenantId
+     * @return
+     * @throws Exception
+     */
+    public  void confirmRe(DingTalkUserDTO dingUserDTO,String tenantId) throws Exception {
+        com.aliyun.dingtalkhrm_1_0.Client client = DingTalkUtils.createClient();
+        com.aliyun.dingtalkhrm_1_0.models.HrmProcessTerminationAndHandoverHeaders hrmProcessTerminationAndHandoverHeaders = new com.aliyun.dingtalkhrm_1_0.models.HrmProcessTerminationAndHandoverHeaders();
+        hrmProcessTerminationAndHandoverHeaders.xAcsDingtalkAccessToken = getToken(tenantId);
+        long yesterdayTimestamp = System.currentTimeMillis() - 24 * 60 * 60 * 1000;
+        com.aliyun.dingtalkhrm_1_0.models.HrmProcessTerminationAndHandoverRequest hrmProcessTerminationAndHandoverRequest = new com.aliyun.dingtalkhrm_1_0.models.HrmProcessTerminationAndHandoverRequest()
+                .setUserId(dingUserDTO.getUserid())
+                .setLastWorkDate(yesterdayTimestamp)
+                .setOptUserId(dingAdminId)//操作者的id,是本组织的并且非离职员工本人
+                .setDismissionMemo("");
+        try {
+            client.hrmProcessTerminationAndHandoverWithOptions(hrmProcessTerminationAndHandoverRequest, hrmProcessTerminationAndHandoverHeaders, new com.aliyun.teautil.models.RuntimeOptions());
+        } catch (TeaException err) {
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+            }
+        } catch (Exception _err) {
+            TeaException err = new TeaException(_err.getMessage(), _err);
+            if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
+            }
+        }
+    }
 
 }

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

@@ -12,6 +12,7 @@
         <result property="phone" column="phone"/>
         <result property="mobile" column="mobile"/>
         <result property="photo" column="photo"/>
+        <result property="ddId" column="ddId"/>
         <result property="sign" column="sign"/>
         <result property="remarks" column="remarks"/>
         <result property="otherServiceFlag" column="other_service_flag"/>
@@ -125,6 +126,7 @@
     <select id="get" resultMap="userResult">
         SELECT
         <include refid="userColumns"/>,
+        a.dd_id AS "ddId",
         r.id AS "roleDTO.id",
         r.name AS "roleDTO.name",
         r.en_name AS "roleDTO.enname",
@@ -538,7 +540,7 @@ select a.id, a.company_id as "companyDTO.id", a.office_id as "officeDTO.id", a.l
     <select id="getAllUserInfo" resultType="com.jeeplus.sys.service.dto.UserDTO">
         select distinct id,
                         name,
-                        dd_id,
+                        dd_id AS "ddId",
                         mobile,
                         tenant_id as 'tenantDTO.id'
                         from sys_user where del_flag = '0'
@@ -607,7 +609,7 @@ select a.id, a.company_id as "companyDTO.id", a.office_id as "officeDTO.id", a.l
     <select id="getAllUserInfoByTentId" resultType="com.jeeplus.sys.service.dto.UserDTO">
         select distinct id,
                         name,
-                        dd_id,
+                        dd_id AS ddId,
                         mobile
         from sys_user where del_flag = '0' and tenant_id IN (#{tentId1},#{tentId2})
     </select>

+ 1 - 0
jeeplus-modules/jeeplus-xxl-job-executor-sample/src/main/java/com/jeeplus/domain/EnrollmentRegistrationInfo.java

@@ -43,6 +43,7 @@ public class EnrollmentRegistrationInfo extends BaseEntity {
     private String procInsId;
     private String processDefinitionId;
     private String userId;              //用户id
+    private String ddId;              //钉钉id
     private String projectManager;      //项目经理
 
     @TableField(exist = false)

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

@@ -8,12 +8,7 @@ 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;
-import com.jeeplus.sys.feign.IUserApi;
-import com.jeeplus.sys.service.dto.PostDTO;
-import com.jeeplus.sys.service.dto.RoleDTO;
+import com.jeeplus.sys.feign.*;
 import com.jeeplus.sys.service.dto.UserDTO;
 import com.xxl.job.core.context.XxlJobHelper;
 import com.xxl.job.core.handler.annotation.XxlJob;
@@ -23,7 +18,6 @@ import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
-import springfox.documentation.spring.web.json.Json;
 
 import java.io.BufferedInputStream;
 import java.io.BufferedReader;
@@ -32,7 +26,6 @@ import java.io.InputStreamReader;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.text.SimpleDateFormat;
-import java.time.LocalDate;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
@@ -113,6 +106,8 @@ public class SampleXxlJob {
         //如果没删除则删除
         for (EnrollmentRegistrationInfo info : infos){
             SpringUtil.getBean(IUserApi.class).deleteById(info.getUserId());
+            //操作钉钉确认离职
+            SpringUtil.getBean(IHumanApi.class).dingConfirmResign(info.getDdId(),info.getMobilePhone());
         }
 
     }