Commit 1b5509dc authored by 姬鋆屾's avatar 姬鋆屾
parents 2e5b98ec 2958e1ef
......@@ -192,7 +192,7 @@
<el-form ref="form" :model="deptForm" label-width="100px">
<el-form-item label="请选择部门">
<el-select
v-model="deptForm.dept"
v-model="deptForm.deptId"
placeholder="请选择部门"
style="width: 100%"
clearable
......@@ -336,7 +336,7 @@
<div class="title">个人绩效总分排名TOP10</div>
<dv-scroll-ranking-board
:config="personConfig"
style="width: 100%; height:200px"
style="width: 100%; height: 200px"
/>
</div>
<div class="right_mid">
......@@ -457,7 +457,7 @@ export default {
reportType: 1, // 生成报告类型
// 部门报告表单
deptForm: {
dept: "",
deptId: "",
resource: 1,
year: "",
month: "",
......@@ -738,7 +738,7 @@ export default {
areaStyle: { color: "#56A3F1" }, //雷达覆盖区域背景颜色
label: {
show: false,
formatter: function(params) {
formatter: function (params) {
return params.value;
},
},
......@@ -993,7 +993,7 @@ export default {
itemStyle: {
normal: {
// 定制显示(按顺序)
color: function(params) {
color: function (params) {
return colorList[params.dataIndex];
},
},
......@@ -1074,11 +1074,26 @@ export default {
delete this.deptForm.year;
delete this.deptForm.month;
}
this.dataSection(this.getDeptPerformList, this.deptForm, (data) => {
if (!data.length) return;
// this.dataSection(this.getDeptPerformList, this.deptForm, (data) => {
// if (!data.length) {
// this.$message.warning("暂无该评估");
// return;
// }
// exportExcel(
// this.deptExcelHeader,
// this.deptFilterVal,
// data,
// "部门评估报告" + this.$moment().format("YYYYMMDDHHmmss")
// );
// });
this.dataSection(this.getPersonPerformList, this.deptForm, (data) => {
if (!data.length) {
this.$message.warning("暂无该评估");
return;
}
exportExcel(
this.deptExcelHeader,
this.deptFilterVal,
this.personExcelHeader,
this.personFilterVal,
data,
"部门评估报告" + this.$moment().format("YYYYMMDDHHmmss")
);
......@@ -1097,7 +1112,10 @@ export default {
delete this.personForm.month;
}
this.dataSection(this.getPersonPerformList, this.personForm, (data) => {
if (!data.length) return;
if (!data.length) {
this.$message.warning("暂无该评估");
return;
}
exportExcel(
this.personExcelHeader,
this.personFilterVal,
......@@ -1107,25 +1125,25 @@ export default {
});
},
// 获取部门报告列表
async getDeptPerformList(page, size, searchForm) {
let list = [];
let listTotal = 0;
await this.$post("/dept/perform/stat/list", {
page: page || 1,
size: size || 100,
...searchForm,
}).then((res) => {
if (res.code == 1) {
let { data, total } = res.data;
list = data;
listTotal = total;
}
});
return {
data: list,
total: listTotal,
};
},
// async getDeptPerformList(page, size, searchForm) {
// let list = [];
// let listTotal = 0;
// await this.$post("/dept/perform/stat/list", {
// page: page || 1,
// size: size || 100,
// ...searchForm,
// }).then((res) => {
// if (res.code == 1) {
// let { data, total } = res.data;
// list = data;
// listTotal = total;
// }
// });
// return {
// data: list,
// total: listTotal,
// };
// },
// 获取个人报告列表
async getPersonPerformList(page, size, searchForm) {
let list = [];
......
package com.mortals.xhx.module.attendance.dingmsg.api;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponseBody;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiGettokenRequest;
......@@ -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.dingmsgreq.DingResponsMeassageReq;
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 lombok.extern.slf4j.Slf4j;
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.Value;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import static cn.hutool.core.date.DatePattern.*;
/**
*
* 接收钉钉的审批消息推送
......@@ -38,6 +52,9 @@ public class DingMessageController {
@Autowired
private IDingPersonService dingPersonService;
@Autowired
private AttendanceLeaveRecordService attendanceLeaveRecordService;
/**
* appKey
......@@ -67,7 +84,7 @@ public class DingMessageController {
@RequestParam(value = "timestamp", required = false) String timeStamp,
@RequestParam(value = "nonce", required = false) String nonce,
@RequestBody(required = false) JSONObject json) {
log.info("钉钉推送参数" + msg_signature+"---"+timeStamp+"---"+nonce+"---"+json.toJSONString() );
// log.info("钉钉推送参数:" + msg_signature+"---"+timeStamp+"---"+nonce+"---"+json.toJSONString() );
try {
// 从http请求中获取加解密参数
DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(token, aesKey, appKey);
......@@ -77,20 +94,153 @@ public class DingMessageController {
// 反序列化回调事件json数据
JSONObject eventJson = JSON.parseObject(decryptMsg);
String eventType = eventJson.getString("EventType");
String processInstanceId = eventJson.getString("processInstanceId");
// 根据EventType分类处理
if ("check_url".equals(eventType)) {
// 测试回调url的正确性
log.info("测试回调url的正确性");
}
else if("bpms_instance_change".equals(eventType)){ //请假等需要审批的消息
if("bpms_instance_change".equals(eventType)){ //请假等需要审批的消息
// 处理审批实例始末(审批任务开始、结束)
// 存入数据库
// log.info("发生了:" + eventType + "事件" );
// log.info("返回处理参数:" + eventJson.toJSONString() );
if(eventJson.getString("processInstanceId") != null){
Rest<String> rest = dingPersonService.getOaRecordsById(eventJson.getString("processInstanceId"));
log.info("审批详情:" + rest.getData());
if(processInstanceId != null){
Rest<GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult> rest = dingPersonService.getOaRecordsById(processInstanceId);
if(rest.getCode() == Rest.SUCCESS){
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 {
......@@ -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());
}
}
}
......@@ -2,6 +2,8 @@ package com.mortals.xhx.module.attendance.web;
import com.mortals.framework.model.Context;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.param.service.ParamService;
import com.mortals.xhx.common.code.AppealResultEnum;
import com.mortals.xhx.common.code.ProcessStatusEnum;
import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordEntity;
import com.mortals.xhx.module.attendance.service.AttendanceLeaveRecordService;
import com.mortals.xhx.module.dept.model.DeptQuery;
......@@ -42,6 +44,11 @@ public class AttendanceLeaveRecordController extends BaseCRUDJsonBodyMappingCont
this.addDict(model, "deptId", deptService.find(new DeptQuery()).stream().collect(Collectors.toMap(x->x.getId().toString(), y->y.getDeptName(),(o, n)->n)));
this.addDict(model, "approverId", workmanService.find(new WorkmanQuery()).stream().collect(Collectors.toMap(x->x.getId().toString(), y->y.getName(),(o, n)->n)));
this.addDict(model, "leaveType", paramService.getParamBySecondOrganize("AttendanceLeaveRecord","leaveType"));
this.addDict(model, "auditResult", AppealResultEnum.getEnumMap());
this.addDict(model, "processStatus", ProcessStatusEnum.getEnumMap());
super.init(model, context);
}
......
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.xhx.module.dingding.IDingTalkService;
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;
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.person.PersonDataInfo;
import org.apache.poi.ss.formula.functions.T;
/**
* 钉钉人事相关服务类
......@@ -46,7 +48,7 @@ public interface IDingPersonService extends IDingTalkService {
* @param processInstanceId 审批实例ID。
* @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;
import com.alibaba.fastjson.JSON;
import com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponse;
import com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponseBody;
import com.aliyun.tea.TeaException;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
......@@ -17,6 +18,7 @@ import com.mortals.xhx.module.dingding.personal.service.IDingPersonService;
import com.taobao.api.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.logging.Log;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
......@@ -114,15 +116,16 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
* @return Client
* @throws Exception
*/
public static com.aliyun.dingtalkworkflow_1_0.Client createClient() throws Exception {
public com.aliyun.dingtalkworkflow_1_0.Client createClient() throws Exception {
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config();
config.protocol = "https";
config.regionId = "central";
config.endpoint = domain;
return new com.aliyun.dingtalkworkflow_1_0.Client(config);
}
@Override
public Rest<String> getOaRecordsById(String processInstanceId) {
public Rest<GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult> getOaRecordsById(String processInstanceId) {
try {
com.aliyun.dingtalkworkflow_1_0.Client client = createClient();
com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceHeaders getProcessInstanceHeaders = new com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceHeaders();
......@@ -131,8 +134,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
.setProcessInstanceId(processInstanceId);
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().toString());
return Rest.ok("成功", rsp.getBody().getResult());
} catch (Exception e) {
log.info("根据用户查询审批详情失败", e);
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