Commit f5ba5525 authored by 周亚武's avatar 周亚武

钉钉获取审批详情接口

parent fb6dc874
package com.mortals.xhx.module.attendance.dingmsg.api; package com.mortals.xhx.module.attendance.dingmsg.api;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponseBody;
import com.dingtalk.api.DefaultDingTalkClient; import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient; import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiGettokenRequest; import com.dingtalk.api.request.OapiGettokenRequest;
...@@ -13,18 +16,29 @@ import com.mortals.xhx.common.pdu.ApiRespPdu; ...@@ -13,18 +16,29 @@ import com.mortals.xhx.common.pdu.ApiRespPdu;
import com.mortals.xhx.module.attendance.dingmsg.DingCallbackCrypto; import com.mortals.xhx.module.attendance.dingmsg.DingCallbackCrypto;
import com.mortals.xhx.module.attendance.dingmsg.dingmsgreq.DingResponsMeassageReq; import com.mortals.xhx.module.attendance.dingmsg.dingmsgreq.DingResponsMeassageReq;
import com.mortals.xhx.module.attendance.dingmsg.dingmsgreq.EncryptReq; import com.mortals.xhx.module.attendance.dingmsg.dingmsgreq.EncryptReq;
import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordEntity;
import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordQuery;
import com.mortals.xhx.module.attendance.service.AttendanceLeaveRecordService;
import com.mortals.xhx.module.dingding.personal.service.IDingPersonService; import com.mortals.xhx.module.dingding.personal.service.IDingPersonService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.poi.ss.formula.functions.T;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map; import java.util.Map;
import static cn.hutool.core.date.DatePattern.*;
/** /**
* *
* 接收钉钉的审批消息推送 * 接收钉钉的审批消息推送
...@@ -38,6 +52,9 @@ public class DingMessageController { ...@@ -38,6 +52,9 @@ public class DingMessageController {
@Autowired @Autowired
private IDingPersonService dingPersonService; private IDingPersonService dingPersonService;
@Autowired
private AttendanceLeaveRecordService attendanceLeaveRecordService;
/** /**
* appKey * appKey
...@@ -67,7 +84,7 @@ public class DingMessageController { ...@@ -67,7 +84,7 @@ public class DingMessageController {
@RequestParam(value = "timestamp", required = false) String timeStamp, @RequestParam(value = "timestamp", required = false) String timeStamp,
@RequestParam(value = "nonce", required = false) String nonce, @RequestParam(value = "nonce", required = false) String nonce,
@RequestBody(required = false) JSONObject json) { @RequestBody(required = false) JSONObject json) {
log.info("钉钉推送参数" + msg_signature+"---"+timeStamp+"---"+nonce+"---"+json.toJSONString() ); // log.info("钉钉推送参数:" + msg_signature+"---"+timeStamp+"---"+nonce+"---"+json.toJSONString() );
try { try {
// 从http请求中获取加解密参数 // 从http请求中获取加解密参数
DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(token, aesKey, appKey); DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(token, aesKey, appKey);
...@@ -77,20 +94,153 @@ public class DingMessageController { ...@@ -77,20 +94,153 @@ public class DingMessageController {
// 反序列化回调事件json数据 // 反序列化回调事件json数据
JSONObject eventJson = JSON.parseObject(decryptMsg); JSONObject eventJson = JSON.parseObject(decryptMsg);
String eventType = eventJson.getString("EventType"); String eventType = eventJson.getString("EventType");
String processInstanceId = eventJson.getString("processInstanceId");
// 根据EventType分类处理 // 根据EventType分类处理
if ("check_url".equals(eventType)) { if("bpms_instance_change".equals(eventType)){ //请假等需要审批的消息
// 测试回调url的正确性
log.info("测试回调url的正确性");
}
else if("bpms_instance_change".equals(eventType)){ //请假等需要审批的消息
// 处理审批实例始末(审批任务开始、结束) // 处理审批实例始末(审批任务开始、结束)
// 存入数据库 // 存入数据库
// log.info("发生了:" + eventType + "事件" ); // log.info("发生了:" + eventType + "事件" );
// log.info("返回处理参数:" + eventJson.toJSONString() ); if(processInstanceId != null){
if(eventJson.getString("processInstanceId") != null){ Rest<GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult> rest = dingPersonService.getOaRecordsById(processInstanceId);
Rest<String> rest = dingPersonService.getOaRecordsById(eventJson.getString("processInstanceId")); if(rest.getCode() == Rest.SUCCESS){
log.info("审批详情:" + rest.getData()); GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult result = rest.getData();
log.info("审批详情:"+JSONObject.toJSONString(result) );
AttendanceLeaveRecordEntity leaveRecordEntity = new AttendanceLeaveRecordEntity();
leaveRecordEntity.initAttrValue();
leaveRecordEntity.setRemark(processInstanceId); //将钉钉的事物id作为备注填入数据库
leaveRecordEntity.setLeavePersonId(Long.parseLong(result.getOriginatorUserId()));
leaveRecordEntity.setLeavePerson(result.getTitle().substring(0,result.getTitle().indexOf("提交")));
leaveRecordEntity.setDeptId(Long.parseLong(result.getOriginatorDeptId()));
leaveRecordEntity.setDeptName(result.getOriginatorDeptName());
if(result.getTasks().size() >0 ){
Date startTime = dateFormat(result.getTasks().get(0).getCreateTime());
Date endTime = dateFormat(result.getTasks().get(0).getFinishTime());
leaveRecordEntity.setStartTime(startTime);
leaveRecordEntity.setEndTime(endTime);
leaveRecordEntity.setDuration((int) ((endTime.getTime() - startTime.getTime())/1000));
}
if(result.getFormComponentValues().size() > 0 ){
JSONArray jsonArray = JSONArray.parseArray(result.getFormComponentValues().get(0).getValue());
if(jsonArray.size() > 0){
Date startTime1 = dateFormat(jsonArray.get(0).toString());
leaveRecordEntity.setStartTime(startTime1);
}
if(jsonArray.size() > 1){
Date endTime1 = dateFormat(jsonArray.get(1).toString());
leaveRecordEntity.setEndTime(endTime1);
}
if(jsonArray.size() > 2){
leaveRecordEntity.setDuration((int) (Float.parseFloat(jsonArray.get(2).toString())*60*60));
}
if(jsonArray.size() > 4){
switch (jsonArray.get(4).toString()){
case "调休":
leaveRecordEntity.setLeaveType(2);
break;
case "病假":
leaveRecordEntity.setLeaveType(3);
break;
case "年假":
leaveRecordEntity.setLeaveType(4);
break;
case "产假":
leaveRecordEntity.setLeaveType(5);
break;
case "陪产假":
leaveRecordEntity.setLeaveType(6);
break;
case "婚假":
leaveRecordEntity.setLeaveType(7);
break;
case "例假":
leaveRecordEntity.setLeaveType(8);
break;
case "哺乳假":
leaveRecordEntity.setLeaveType(9);
break;
case "丧假":
leaveRecordEntity.setLeaveType(10);
break;
case "回单位":
leaveRecordEntity.setLeaveType(11);
break;
case "因公请假":
leaveRecordEntity.setLeaveType(12);
break;
case "外出勘验":
leaveRecordEntity.setLeaveType(13);
break;
case "值班补班":
leaveRecordEntity.setLeaveType(14);
break;
case "体检":
leaveRecordEntity.setLeaveType(15);
break;
case "隔离":
leaveRecordEntity.setLeaveType(16);
break;
case "因公外出":
leaveRecordEntity.setLeaveType(17);
break;
case "公休":
leaveRecordEntity.setLeaveType(18);
break;
case "育儿假":
leaveRecordEntity.setLeaveType(19);
break;
case "调回单位":
leaveRecordEntity.setLeaveType(20);
break;
case "探亲假":
leaveRecordEntity.setLeaveType(21);
break;
default:
leaveRecordEntity.setLeaveType(1); //默认事假
break;
}
}
}
if(result.getStatus().equals("NEW") || result.getStatus().equals("RUNNING")){
leaveRecordEntity.setProcessStatus(1);
}else if(result.getStatus().equals("COMPLETED") || result.getStatus().equals("CANCELED") || result.getStatus().equals("TERMINATED")){
leaveRecordEntity.setProcessStatus(2);
}
if(result.getResult().equals("AGREE")){
leaveRecordEntity.setAuditResult(1);
}else {
leaveRecordEntity.setAuditResult(2);
}
leaveRecordEntity.setAuditDesc(result.getOperationRecords().get(0).getRemark());
AttendanceLeaveRecordEntity recordEntity = attendanceLeaveRecordService.selectOne(new AttendanceLeaveRecordQuery().remark(processInstanceId));
if(ObjectUtils.isEmpty(recordEntity)){
leaveRecordEntity.setCreateTime(new Date());
leaveRecordEntity.setCreateUserId(1L);
attendanceLeaveRecordService.save(leaveRecordEntity);
}else{
leaveRecordEntity.setId(recordEntity.getId());
leaveRecordEntity.setUpdateUserId(1L);
leaveRecordEntity.setUpdateTime(new Date());
attendanceLeaveRecordService.update(leaveRecordEntity);
}
}
} }
} }
else { else {
...@@ -109,4 +259,16 @@ public class DingMessageController { ...@@ -109,4 +259,16 @@ public class DingMessageController {
} }
private Date dateFormat(String dateString){
SimpleDateFormat dateFormat_ = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'");
Date t;
try {
t = dateFormat_ .parse(dateString);
return t;
} catch (ParseException e) {
return new Date(System.currentTimeMillis());
}
}
} }
package com.mortals.xhx.module.dingding.personal.service; package com.mortals.xhx.module.dingding.personal.service;
import com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponseBody;
import com.mortals.framework.common.Rest; import com.mortals.framework.common.Rest;
import com.mortals.xhx.module.dingding.IDingTalkService; import com.mortals.xhx.module.dingding.IDingTalkService;
import com.mortals.xhx.module.dingding.personal.model.req.workmsg.WorkMsgReq; import com.mortals.xhx.module.dingding.personal.model.req.workmsg.WorkMsgReq;
...@@ -8,6 +9,7 @@ import com.mortals.xhx.module.hik.person.model.req.org.OrgListReq; ...@@ -8,6 +9,7 @@ import com.mortals.xhx.module.hik.person.model.req.org.OrgListReq;
import com.mortals.xhx.module.hik.person.model.req.person.PersonReq; import com.mortals.xhx.module.hik.person.model.req.person.PersonReq;
import com.mortals.xhx.module.hik.person.model.rsp.org.OrgDataInfo; import com.mortals.xhx.module.hik.person.model.rsp.org.OrgDataInfo;
import com.mortals.xhx.module.hik.person.model.rsp.person.PersonDataInfo; import com.mortals.xhx.module.hik.person.model.rsp.person.PersonDataInfo;
import org.apache.poi.ss.formula.functions.T;
/** /**
* 钉钉人事相关服务类 * 钉钉人事相关服务类
...@@ -46,7 +48,7 @@ public interface IDingPersonService extends IDingTalkService { ...@@ -46,7 +48,7 @@ public interface IDingPersonService extends IDingTalkService {
* @param processInstanceId 审批实例ID。 * @param processInstanceId 审批实例ID。
* @return * @return
*/ */
Rest<String> getOaRecordsById(String processInstanceId); Rest<GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult> getOaRecordsById(String processInstanceId);
} }
...@@ -2,6 +2,7 @@ package com.mortals.xhx.module.dingding.personal.service.impl; ...@@ -2,6 +2,7 @@ package com.mortals.xhx.module.dingding.personal.service.impl;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponse; import com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponse;
import com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponseBody;
import com.aliyun.tea.TeaException; import com.aliyun.tea.TeaException;
import com.dingtalk.api.DingTalkClient; import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request; import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
...@@ -17,6 +18,7 @@ import com.mortals.xhx.module.dingding.personal.service.IDingPersonService; ...@@ -17,6 +18,7 @@ import com.mortals.xhx.module.dingding.personal.service.IDingPersonService;
import com.taobao.api.ApiException; import com.taobao.api.ApiException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
...@@ -122,7 +124,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -122,7 +124,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
} }
@Override @Override
public Rest<String> getOaRecordsById(String processInstanceId) { public Rest<GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult> getOaRecordsById(String processInstanceId) {
try { try {
com.aliyun.dingtalkworkflow_1_0.Client client = createClient(); com.aliyun.dingtalkworkflow_1_0.Client client = createClient();
com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceHeaders getProcessInstanceHeaders = new com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceHeaders(); com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceHeaders getProcessInstanceHeaders = new com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceHeaders();
...@@ -131,8 +133,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -131,8 +133,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
.setProcessInstanceId(processInstanceId); .setProcessInstanceId(processInstanceId);
GetProcessInstanceResponse rsp = client.getProcessInstanceWithOptions(getProcessInstanceRequest, getProcessInstanceHeaders, new com.aliyun.teautil.models.RuntimeOptions()); GetProcessInstanceResponse rsp = client.getProcessInstanceWithOptions(getProcessInstanceRequest, getProcessInstanceHeaders, new com.aliyun.teautil.models.RuntimeOptions());
log.info("根据id查询审批详情:", rsp.getBody().getResult().toString()); return Rest.ok("成功", rsp.getBody().getResult());
return Rest.ok("成功", rsp.getBody().getResult().toString());
} catch (Exception e) { } catch (Exception e) {
log.info("根据用户查询审批详情失败", e); log.info("根据用户查询审批详情失败", e);
return Rest.fail(e.getMessage()); return Rest.fail(e.getMessage());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment