Commit 85f1e265 authored by 赵啸非's avatar 赵啸非

添加用户钉钉主动拉取请假记录

parent c01ca213
package com.mortals.xhx.common.code;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @author: finegirl
* @date: 2021/7/16 11:50
* @description: 组件枚举类
**/
public enum ProcessInstanceEnum {
请假("PROC-2E5C0DFF-3615-4409-A614-A2011FED5D38", "请假"),
外出("PROC-56D3ADEE-45A4-47BC-931A-2A0DC067DE32", "外出"),
出差("PROC-578CBDDF-B768-496D-9918-44A3F1D9CAE7", "出差");
private String value;
private String desc;
ProcessInstanceEnum(String value, String desc) {
this.value = value;
this.desc = desc;
}
public String getValue() {
return this.value;
}
public String getDesc() {
return this.desc;
}
public static ProcessInstanceEnum getByValue(String value) {
for (ProcessInstanceEnum componentEnum : ProcessInstanceEnum.values()) {
if (componentEnum.getValue() == value) {
return componentEnum;
}
}
return null;
}
/**
* 获取Map集合
*
* @param eItem 不包含项
* @return
*/
public static Map<String, String> getEnumMap(String... eItem) {
Map<String, String> resultMap = new LinkedHashMap<>();
for (ProcessInstanceEnum item : ProcessInstanceEnum.values()) {
try {
boolean hasE = false;
for (String e : eItem) {
if (item.getValue() == e) {
hasE = true;
break;
}
}
if (!hasE) {
resultMap.put(item.getValue() + "", item.getDesc());
}
} catch (Exception ex) {
}
}
return resultMap;
}
}
\ No newline at end of file
...@@ -73,15 +73,15 @@ public class SyncUserTaskImpl implements ITaskExcuteService { ...@@ -73,15 +73,15 @@ public class SyncUserTaskImpl implements ITaskExcuteService {
UserEntity userEntity = new UserEntity(); UserEntity userEntity = new UserEntity();
userEntity.setId(item.getId()); userEntity.setId(item.getId());
String mobile = item.getMobile(); String mobile="";
if (ObjectUtils.isEmpty(mobile)) { StaffEntity staffCache = staffService.getCache(item.getCustomerId().toString());
//根据customerId查询staff 看是否有 if (!ObjectUtils.isEmpty(staffCache) && !ObjectUtils.isEmpty(staffCache.getPhoneNumber())) {
StaffEntity staffCache = staffService.getCache(item.getCustomerId().toString()); mobile = staffCache.getPhoneNumber();
if (!ObjectUtils.isEmpty(staffCache) && !ObjectUtils.isEmpty(staffCache.getPhoneNumber())) { if(ObjectUtils.isEmpty(item.getMobile())){
mobile = staffCache.getPhoneNumber();
userEntity.setMobile(mobile); userEntity.setMobile(mobile);
} }
} }
if (!ObjectUtils.isEmpty(mobile)) { if (!ObjectUtils.isEmpty(mobile)) {
Rest<String> personByMobile = dingPersonService.getPersonByMobile(mobile); Rest<String> personByMobile = dingPersonService.getPersonByMobile(mobile);
if (!ObjectUtils.isEmpty(personByMobile) && if (!ObjectUtils.isEmpty(personByMobile) &&
......
...@@ -33,4 +33,7 @@ public class AttendanceLeaveRecordVo extends BaseEntityLong { ...@@ -33,4 +33,7 @@ public class AttendanceLeaveRecordVo extends BaseEntityLong {
/** 结束 创建时间 */ /** 结束 创建时间 */
private String createTimeEnd; private String createTimeEnd;
private Long staffId;
} }
\ No newline at end of file
package com.mortals.xhx.module.attendance.service; package com.mortals.xhx.module.attendance.service;
import com.mortals.framework.common.Rest;
import com.mortals.framework.model.Context;
import com.mortals.framework.service.ICRUDService; import com.mortals.framework.service.ICRUDService;
import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordEntity; import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordEntity;
import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordQuery; import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordQuery;
import org.springframework.web.bind.annotation.RequestBody;
/** /**
* AttendanceLeaveRecordService * AttendanceLeaveRecordService
...@@ -15,4 +18,7 @@ public interface AttendanceLeaveRecordService extends ICRUDService<AttendanceLea ...@@ -15,4 +18,7 @@ public interface AttendanceLeaveRecordService extends ICRUDService<AttendanceLea
//根据remark(钉钉返回的id)查询对象 //根据remark(钉钉返回的id)查询对象
AttendanceLeaveRecordEntity doUpdateRecord(String processInstanceId,AttendanceLeaveRecordEntity leaveRecordEntity) throws Exception; AttendanceLeaveRecordEntity doUpdateRecord(String processInstanceId,AttendanceLeaveRecordEntity leaveRecordEntity) throws Exception;
Rest<String> syncLeaveRecord(AttendanceLeaveRecordQuery query, Context context);
} }
\ No newline at end of file
package com.mortals.xhx.module.attendance.service.impl; package com.mortals.xhx.module.attendance.service.impl;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsResponse;
import com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsResponseBody;
import com.mortals.framework.common.Rest;
import com.mortals.framework.service.ICacheService; import com.mortals.framework.service.ICacheService;
import com.mortals.framework.util.DataUtil;
import com.mortals.framework.util.DateUtils; import com.mortals.framework.util.DateUtils;
import com.mortals.framework.util.ThreadPool; import com.mortals.framework.util.ThreadPool;
import com.mortals.xhx.base.system.user.model.UserEntity;
import com.mortals.xhx.base.system.user.service.UserService;
import com.mortals.xhx.common.code.AppealResultEnum; import com.mortals.xhx.common.code.AppealResultEnum;
import com.mortals.xhx.common.code.AuditStatusEnum; import com.mortals.xhx.common.code.AuditStatusEnum;
import com.mortals.xhx.common.code.ProcessInstanceEnum;
import com.mortals.xhx.common.code.YesNoEnum;
import com.mortals.xhx.common.utils.AddAttendThread; import com.mortals.xhx.common.utils.AddAttendThread;
import com.mortals.xhx.common.utils.AttendSummaryThread; import com.mortals.xhx.common.utils.AttendSummaryThread;
import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordQuery; import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordQuery;
...@@ -14,6 +23,8 @@ import com.mortals.xhx.module.attendance.model.AttendanceRecordHikQuery; ...@@ -14,6 +23,8 @@ import com.mortals.xhx.module.attendance.model.AttendanceRecordHikQuery;
import com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery; import com.mortals.xhx.module.attendance.model.vo.AttendanceSummaryQuery;
import com.mortals.xhx.module.attendance.service.AttendanceRecordHikService; import com.mortals.xhx.module.attendance.service.AttendanceRecordHikService;
import com.mortals.xhx.module.attendance.service.AttendanceStatService; import com.mortals.xhx.module.attendance.service.AttendanceStatService;
import com.mortals.xhx.module.dingding.personal.service.IDingPersonService;
import com.mortals.xhx.module.staff.service.StaffService;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -24,7 +35,11 @@ import com.mortals.xhx.module.attendance.dao.AttendanceLeaveRecordDao; ...@@ -24,7 +35,11 @@ import com.mortals.xhx.module.attendance.dao.AttendanceLeaveRecordDao;
import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordEntity; import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordEntity;
import com.mortals.xhx.module.attendance.service.AttendanceLeaveRecordService; import com.mortals.xhx.module.attendance.service.AttendanceLeaveRecordService;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import static com.mortals.xhx.common.key.RedisKey.KEY_ATTENDANCE_STAT_CACHE; import static com.mortals.xhx.common.key.RedisKey.KEY_ATTENDANCE_STAT_CACHE;
...@@ -42,9 +57,14 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At ...@@ -42,9 +57,14 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At
private AttendanceStatService attendanceStatService; private AttendanceStatService attendanceStatService;
@Autowired @Autowired
private ICacheService cacheService; private ICacheService cacheService;
@Autowired
private StaffService staffService;
@Autowired
private UserService userService;
@Autowired @Autowired
private AttendanceRecordHikService hikService; private AttendanceRecordHikService hikService;
@Autowired
private IDingPersonService dingPersonService;
@Override @Override
protected void updateAfter(AttendanceLeaveRecordEntity entity, Context context) throws AppException { protected void updateAfter(AttendanceLeaveRecordEntity entity, Context context) throws AppException {
...@@ -91,6 +111,7 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At ...@@ -91,6 +111,7 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At
/** /**
* 更新汇总信息 * 更新汇总信息
*
* @param entity * @param entity
* @param context * @param context
*/ */
...@@ -102,7 +123,7 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At ...@@ -102,7 +123,7 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At
return; return;
} }
//更新考勤记录与异常记录 //更新考勤记录与异常记录
if (AppealResultEnum.通过.getValue() == entity.getAuditResult()||AppealResultEnum.撤销审批通过.getValue() == entity.getAuditResult()) { if (AppealResultEnum.通过.getValue() == entity.getAuditResult() || AppealResultEnum.撤销审批通过.getValue() == entity.getAuditResult()) {
AttendanceRecordHikQuery attendanceRecordHikQuery = new AttendanceRecordHikQuery(); AttendanceRecordHikQuery attendanceRecordHikQuery = new AttendanceRecordHikQuery();
attendanceRecordHikQuery.setStaffId(entity.getLeavePersonId()); attendanceRecordHikQuery.setStaffId(entity.getLeavePersonId());
//判断请假的开始日期与结束日期 //判断请假的开始日期与结束日期
...@@ -111,7 +132,7 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At ...@@ -111,7 +132,7 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At
//当前日期在请假期间,计算考勤结束时间为当前时间; //当前日期在请假期间,计算考勤结束时间为当前时间;
attendanceRecordHikQuery.setAttendanceDateStart(DateUtil.formatDate(entity.getStartTime())); attendanceRecordHikQuery.setAttendanceDateStart(DateUtil.formatDate(entity.getStartTime()));
attendanceRecordHikQuery.setAttendanceDateEnd(DateUtil.today()); attendanceRecordHikQuery.setAttendanceDateEnd(DateUtil.today());
}else{ } else {
attendanceRecordHikQuery.setAttendanceDateStart(DateUtil.formatDate(entity.getStartTime())); attendanceRecordHikQuery.setAttendanceDateStart(DateUtil.formatDate(entity.getStartTime()));
attendanceRecordHikQuery.setAttendanceDateEnd(DateUtil.formatDate(entity.getEndTime())); attendanceRecordHikQuery.setAttendanceDateEnd(DateUtil.formatDate(entity.getEndTime()));
} }
...@@ -119,4 +140,69 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At ...@@ -119,4 +140,69 @@ public class AttendanceLeaveRecordServiceImpl extends AbstractCRUDServiceImpl<At
ThreadPool.getInstance().execute(addAttendThread); ThreadPool.getInstance().execute(addAttendThread);
} }
} }
@Override
public Rest<String> syncLeaveRecord(AttendanceLeaveRecordQuery query, Context context) {
List<AttendanceLeaveRecordEntity> waitSyncLeaveRecords = new ArrayList<>();
Long staffId = query.getStaffId();
List<UserEntity> userCacheList = userService.getCacheList();
if (ObjectUtils.isEmpty(staffId)) {
//同步所有用户
List<UserEntity> userEntityList = userCacheList.stream()
.filter(f -> ObjectUtils.isEmpty(f.getDingUserId())).collect(Collectors.toList());
getLeaveRecordByUserList(query, userEntityList, waitSyncLeaveRecords);
} else {
//同步指定用户
List<UserEntity> userEntityList = userCacheList.stream()
.filter(f -> ObjectUtils.isEmpty(f.getDingUserId()))
.filter(f -> staffId == f.getCustomerId())
.collect(Collectors.toList());
getLeaveRecordByUserList(query, userEntityList, waitSyncLeaveRecords);
}
if (!ObjectUtils.isEmpty(waitSyncLeaveRecords)) {
//todo 同步查询详细记录 并更新
for (AttendanceLeaveRecordEntity waitSyncLeaveRecord : waitSyncLeaveRecords) {
dingPersonService.handleByProcessInstanceId(waitSyncLeaveRecord.getRemark());
}
}
return Rest.ok();
}
private void getLeaveRecordByUserList(AttendanceLeaveRecordQuery query, List<UserEntity> userEntityList, List<AttendanceLeaveRecordEntity> waitSyncLeaveRecords) {
for (UserEntity item : userEntityList) {
String dingUserId = item.getDingUserId();
long startTime = DateUtil.parseDateTime(query.getStartTimeStart() + " 00:00:00").getTime();
long endTime = DateUtil.parseDateTime(query.getEndTimeEnd() + " 23:59:59").getTime();
Long nextToken = null;
long maxResults = 20L;
for (ProcessInstanceEnum processInstanceEnum : ProcessInstanceEnum.values()) {
try {
getRecords(waitSyncLeaveRecords, item, processInstanceEnum, startTime, endTime, nextToken, maxResults, dingUserId);
} catch (Exception e) {
log.error("同步请假记录异常", e);
}
}
}
}
private void getRecords(List<AttendanceLeaveRecordEntity> waitSyncLeaveRecords, UserEntity item, ProcessInstanceEnum processInstanceEnum, long startTime, long endTime, long nextToken, long maxResults, String dingUserId) throws Exception {
Rest<ListProcessInstanceIdsResponseBody.ListProcessInstanceIdsResponseBodyResult> rest = dingPersonService.getProcessInstanceIdByUserIds(processInstanceEnum.getValue(), startTime, endTime, nextToken, maxResults, dingUserId);
if (YesNoEnum.YES.getValue() == rest.getCode()) {
if (ObjectUtils.isEmpty(rest.getData().getNextToken())) {
List<String> processInstanceList = rest.getData().getList();
for (String process : processInstanceList) {
AttendanceLeaveRecordEntity leaveRecord = new AttendanceLeaveRecordEntity();
leaveRecord.setRemark(process);
leaveRecord.setStaffId(item.getCustomerId());
waitSyncLeaveRecords.add(leaveRecord);
}
} else {
nextToken = DataUtil.converStr2Long(rest.getData().getNextToken(), 0L);
getRecords(waitSyncLeaveRecords, item, processInstanceEnum, startTime, endTime, nextToken, maxResults, dingUserId);
}
}
}
} }
\ No newline at end of file
package com.mortals.xhx.module.attendance.web; package com.mortals.xhx.module.attendance.web;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.unit.DataUnit;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context; import com.mortals.framework.model.Context;
import com.mortals.framework.util.DateUtils;
import com.mortals.framework.util.ThreadPool;
import com.mortals.framework.web.BaseCRUDJsonBodyMappingController; import com.mortals.framework.web.BaseCRUDJsonBodyMappingController;
import com.mortals.xhx.base.system.param.service.ParamService; import com.mortals.xhx.base.system.param.service.ParamService;
import com.mortals.xhx.base.system.user.model.UserQuery; import com.mortals.xhx.base.system.user.model.UserQuery;
...@@ -9,12 +17,16 @@ import com.mortals.xhx.common.code.ProcessStatusEnum; ...@@ -9,12 +17,16 @@ import com.mortals.xhx.common.code.ProcessStatusEnum;
import com.mortals.xhx.common.pdu.user.UserPdu; import com.mortals.xhx.common.pdu.user.UserPdu;
import com.mortals.xhx.feign.user.IUserFeign; import com.mortals.xhx.feign.user.IUserFeign;
import com.mortals.xhx.module.attendance.model.AttendanceLeaveRecordEntity; 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.attendance.service.AttendanceLeaveRecordService;
import com.mortals.xhx.module.dept.model.DeptQuery; import com.mortals.xhx.module.dept.model.DeptQuery;
import com.mortals.xhx.module.dept.service.DeptService; import com.mortals.xhx.module.dept.service.DeptService;
import com.mortals.xhx.module.workman.model.WorkmanQuery; import com.mortals.xhx.module.workman.model.WorkmanQuery;
import com.mortals.xhx.module.workman.service.WorkmanService; import com.mortals.xhx.module.workman.service.WorkmanService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
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.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
...@@ -27,15 +39,14 @@ import java.util.stream.Collectors; ...@@ -27,15 +39,14 @@ import java.util.stream.Collectors;
import static java.util.stream.Collectors.toMap; import static java.util.stream.Collectors.toMap;
/** /**
* * 请假记录信息
* 请假记录信息 *
* * @author zxfei
* @author zxfei * @date 2023-04-07
* @date 2023-04-07 */
*/
@RestController @RestController
@RequestMapping("attendance/leave/record") @RequestMapping("attendance/leave/record")
public class AttendanceLeaveRecordController extends BaseCRUDJsonBodyMappingController<AttendanceLeaveRecordService,AttendanceLeaveRecordEntity,Long> { public class AttendanceLeaveRecordController extends BaseCRUDJsonBodyMappingController<AttendanceLeaveRecordService, AttendanceLeaveRecordEntity, Long> {
@Autowired @Autowired
private ParamService paramService; private ParamService paramService;
...@@ -48,15 +59,15 @@ public class AttendanceLeaveRecordController extends BaseCRUDJsonBodyMappingCont ...@@ -48,15 +59,15 @@ public class AttendanceLeaveRecordController extends BaseCRUDJsonBodyMappingCont
// @Autowired // @Autowired
// private IUserFeign iUserFeign; // private IUserFeign iUserFeign;
public AttendanceLeaveRecordController(){ public AttendanceLeaveRecordController() {
super.setModuleDesc( "请假记录信息"); super.setModuleDesc("请假记录信息");
} }
@Override @Override
protected void init(Map<String, Object> model, Context context) { protected void init(Map<String, Object> model, Context context) {
this.addDict(model, "deptId", deptService.find(new DeptQuery()).stream().collect(toMap(x->x.getId().toString(), y->y.getDeptName(),(o, n)->n))); this.addDict(model, "deptId", deptService.find(new DeptQuery()).stream().collect(toMap(x -> x.getId().toString(), y -> y.getDeptName(), (o, n) -> n)));
this.addDict(model, "approverId", workmanService.find(new WorkmanQuery()).stream().collect(toMap(x->x.getId().toString(), y->y.getName(),(o, n)->n))); this.addDict(model, "approverId", workmanService.find(new WorkmanQuery()).stream().collect(toMap(x -> x.getId().toString(), y -> y.getName(), (o, n) -> n)));
this.addDict(model, "leaveType", paramService.getParamBySecondOrganize("AttendanceLeaveRecord","leaveType")); this.addDict(model, "leaveType", paramService.getParamBySecondOrganize("AttendanceLeaveRecord", "leaveType"));
this.addDict(model, "auditResult", AppealResultEnum.getEnumMap()); this.addDict(model, "auditResult", AppealResultEnum.getEnumMap());
this.addDict(model, "processStatus", ProcessStatusEnum.getEnumMap()); this.addDict(model, "processStatus", ProcessStatusEnum.getEnumMap());
this.addDict(model, "createUserId", userService.find(new UserQuery()).stream().collect(toMap(x -> x.getId().toString(), y -> y.getRealName(), (o, n) -> n))); this.addDict(model, "createUserId", userService.find(new UserQuery()).stream().collect(toMap(x -> x.getId().toString(), y -> y.getRealName(), (o, n) -> n)));
...@@ -79,4 +90,41 @@ public class AttendanceLeaveRecordController extends BaseCRUDJsonBodyMappingCont ...@@ -79,4 +90,41 @@ public class AttendanceLeaveRecordController extends BaseCRUDJsonBodyMappingCont
} }
/**
* 主动同步拉取请假考勤记录
*/
@PostMapping(value = "syncLeaveRecord")
public String syncLeaveRecord(@RequestBody AttendanceLeaveRecordQuery query) {
JSONObject jsonObject = new JSONObject();
String busiDesc = this.getModuleDesc() + "主动同步拉取请假考勤记录";
try {
if(ObjectUtils.isEmpty(query.getStartTimeStart()))throw new AppException("开始时间不能为空");
if(ObjectUtils.isEmpty(query.getStartTimeEnd()))throw new AppException("结束时间不能为空");
long between = DateUtil.between(DateUtil.parseDate(query.getStartTimeStart()), DateUtil.parseDate(query.getStartTimeEnd()), DateUnit.DAY, true);
if(between>120){
throw new AppException("时间范围不能超过120天");
}
Context context = this.getContext();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
service.syncLeaveRecord(query, context);
}
});
ThreadPool.getInstance().execute(thread);
recordSysLog(request, busiDesc + " 【成功】");
jsonObject.put(KEY_RESULT_CODE, VALUE_RESULT_SUCCESS);
} catch (Exception e) {
log.error("主动同步拉取请假考勤记录", e);
jsonObject.put(KEY_RESULT_CODE, VALUE_RESULT_FAILURE);
jsonObject.put(KEY_RESULT_MSG, super.convertException(e));
}
return jsonObject.toJSONString();
}
} }
\ No newline at end of file
...@@ -4,6 +4,7 @@ package com.mortals.xhx.module.dingding.personal.service; ...@@ -4,6 +4,7 @@ package com.mortals.xhx.module.dingding.personal.service;
import com.aliyun.dingtalkattendance_1_0.models.GetLeaveRecordsResponseBody; import com.aliyun.dingtalkattendance_1_0.models.GetLeaveRecordsResponseBody;
import com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponseBody; import com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponseBody;
import com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsResponse; import com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsResponse;
import com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsResponseBody;
import com.dingtalk.api.response.OapiAttendanceVacationQuotaListResponse; import com.dingtalk.api.response.OapiAttendanceVacationQuotaListResponse;
import com.dingtalk.api.response.OapiV2UserGetResponse; import com.dingtalk.api.response.OapiV2UserGetResponse;
import com.mortals.framework.common.Rest; import com.mortals.framework.common.Rest;
...@@ -88,6 +89,8 @@ public interface IDingPersonService extends IDingTalkService { ...@@ -88,6 +89,8 @@ public interface IDingPersonService extends IDingTalkService {
* @param maxResults 分页参数,每页大小,最多传20。 * @param maxResults 分页参数,每页大小,最多传20。
* @param userIds 发起人id列表 最大列表长度为10 * @param userIds 发起人id列表 最大列表长度为10
*/ */
Rest<ListProcessInstanceIdsResponse> getProcessInstanceIdByUserIds(String processCode,long startTime,long endTime,long nextToken,long maxResults,String userIds) throws Exception; Rest<ListProcessInstanceIdsResponseBody.ListProcessInstanceIdsResponseBodyResult> getProcessInstanceIdByUserIds(String processCode, long startTime, long endTime, Long nextToken, long maxResults, String userIds) throws Exception;
} }
...@@ -7,9 +7,7 @@ import com.aliyun.dingtalkattendance_1_0.Client; ...@@ -7,9 +7,7 @@ import com.aliyun.dingtalkattendance_1_0.Client;
import com.aliyun.dingtalkattendance_1_0.models.GetLeaveRecordsHeaders; import com.aliyun.dingtalkattendance_1_0.models.GetLeaveRecordsHeaders;
import com.aliyun.dingtalkattendance_1_0.models.GetLeaveRecordsResponse; import com.aliyun.dingtalkattendance_1_0.models.GetLeaveRecordsResponse;
import com.aliyun.dingtalkattendance_1_0.models.GetLeaveRecordsResponseBody; import com.aliyun.dingtalkattendance_1_0.models.GetLeaveRecordsResponseBody;
import com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponse; import com.aliyun.dingtalkworkflow_1_0.models.*;
import com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponseBody;
import com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsResponse;
import com.aliyun.tea.TeaException; import com.aliyun.tea.TeaException;
import com.aliyun.teautil.models.RuntimeOptions; import com.aliyun.teautil.models.RuntimeOptions;
import com.dingtalk.api.DefaultDingTalkClient; import com.dingtalk.api.DefaultDingTalkClient;
...@@ -65,6 +63,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -65,6 +63,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
/** /**
* 钉钉根据电话查询钉钉用户 id * 钉钉根据电话查询钉钉用户 id
*
* @param mobile * @param mobile
* @return * @return
*/ */
...@@ -90,6 +89,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -90,6 +89,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
/** /**
* 钉钉根据id查询员工信息 * 钉钉根据id查询员工信息
*
* @param id * @param id
* @return * @return
*/ */
...@@ -99,7 +99,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -99,7 +99,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
DingTalkClient client = getDingTalkClient("/topapi/v2/user/get"); DingTalkClient client = getDingTalkClient("/topapi/v2/user/get");
OapiV2UserGetRequest req = new OapiV2UserGetRequest(); OapiV2UserGetRequest req = new OapiV2UserGetRequest();
req.setUserid(id); //用户id req.setUserid(id); //用户id
log.info("getPersonByID:{}",id); log.info("getPersonByID:{}", id);
OapiV2UserGetResponse rsp = client.execute(req, getToken()); OapiV2UserGetResponse rsp = client.execute(req, getToken());
log.info("钉钉返回用户信息:{}", rsp.getBody()); log.info("钉钉返回用户信息:{}", rsp.getBody());
if (rsp.getErrcode() == 0) { if (rsp.getErrcode() == 0) {
...@@ -115,6 +115,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -115,6 +115,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
/** /**
* 根据code查询用户id * 根据code查询用户id
*
* @param code * @param code
* @return * @return
*/ */
...@@ -182,6 +183,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -182,6 +183,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
/** /**
* 设置client的config参数 * 设置client的config参数
*
* @return Client * @return Client
* @throws Exception * @throws Exception
*/ */
...@@ -195,25 +197,25 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -195,25 +197,25 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
/** /**
* 根据系统电话查询指定时间的审批表单 * 根据系统电话查询指定时间的审批表单
*
* @param processCode 审批流的唯一码(详见doc下 审批表单列表.txt)。 * @param processCode 审批流的唯一码(详见doc下 审批表单列表.txt)。
* 请假:PROC-2E5C0DFF-3615-4409-A614-A2011FED5D38 * 请假:PROC-2E5C0DFF-3615-4409-A614-A2011FED5D38
* 外出:PROC-56D3ADEE-45A4-47BC-931A-2A0DC067DE32 * 外出:PROC-56D3ADEE-45A4-47BC-931A-2A0DC067DE32
* 出差:PROC-578CBDDF-B768-496D-9918-44A3F1D9CAE7 * 出差:PROC-578CBDDF-B768-496D-9918-44A3F1D9CAE7
* @param startTime 审批实例开始时间,Unix时间戳,单位毫秒 * @param startTime 审批实例开始时间,Unix时间戳,单位毫秒
* @param endTime 审批实例结束时间,Unix时间戳,单位毫秒。 查询时间范围不能超过120天 * @param endTime 审批实例结束时间,Unix时间戳,单位毫秒。 查询时间范围不能超过120天
* @param nextToken 分页游标。如果是非首次调用,该参数传上次调用时返回的nextToken。 * @param nextToken 分页游标。如果是非首次调用,该参数传上次调用时返回的nextToken。
* @param maxResults 分页参数,每页大小,最多传20。 * @param maxResults 分页参数,每页大小,最多传20。
* @param userIds 发起人id列表 最大列表长度为10 * @param userIds 发起人id列表 最大列表长度为10
*
* @return 返回示例 { * @return 返回示例 {
* "result" : { * "result" : {
* "list" : [ "123" ], * "list" : [ "123" ],
* "nextToken" : "10" * "nextToken" : "10"
* }, * },
* "success" : true * "success" : true
* } * }
*/ */
public Rest<ListProcessInstanceIdsResponse> getProcessInstanceIdByUserIds(String processCode,long startTime,long endTime,long nextToken,long maxResults,String userIds) throws Exception{ public Rest<ListProcessInstanceIdsResponseBody.ListProcessInstanceIdsResponseBodyResult> getProcessInstanceIdByUserIds(String processCode, long startTime, long endTime, Long nextToken, long maxResults, String userIds) throws Exception {
if (!userIds.equals("")) { if (!userIds.equals("")) {
com.aliyun.dingtalkworkflow_1_0.Client client = new com.aliyun.dingtalkworkflow_1_0.Client(setConfig()); com.aliyun.dingtalkworkflow_1_0.Client client = new com.aliyun.dingtalkworkflow_1_0.Client(setConfig());
com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsHeaders listProcessInstanceIdsHeaders = new com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsHeaders(); com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsHeaders listProcessInstanceIdsHeaders = new com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsHeaders();
...@@ -221,35 +223,43 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -221,35 +223,43 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
HashMap<String, String> map = new HashMap<>(); HashMap<String, String> map = new HashMap<>();
listProcessInstanceIdsHeaders.setCommonHeaders(map); listProcessInstanceIdsHeaders.setCommonHeaders(map);
listProcessInstanceIdsHeaders.getCommonHeaders().put("host", "172.15.28.113:8919"); listProcessInstanceIdsHeaders.getCommonHeaders().put("host", "172.15.28.113:8919");
com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsRequest listProcessInstanceIdsRequest = new com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsRequest()
com.aliyun.dingtalkworkflow_1_0.models.ListProcessInstanceIdsRequest listProcessInstanceIdsRequest = new ListProcessInstanceIdsRequest()
.setProcessCode(processCode) .setProcessCode(processCode)
.setStartTime(startTime) .setStartTime(startTime)
.setEndTime(endTime) .setEndTime(endTime)
.setNextToken(nextToken) .setNextToken(nextToken)
.setMaxResults(maxResults) .setMaxResults(maxResults)
.setStatuses(Arrays.asList("COMPLETED"))
.setUserIds(java.util.Arrays.asList(userIds)); .setUserIds(java.util.Arrays.asList(userIds));
try { try {
ListProcessInstanceIdsResponse rsp = client.listProcessInstanceIdsWithOptions(listProcessInstanceIdsRequest, listProcessInstanceIdsHeaders, new RuntimeOptions()); ListProcessInstanceIdsResponse rsp = client.listProcessInstanceIdsWithOptions(listProcessInstanceIdsRequest, listProcessInstanceIdsHeaders, new RuntimeOptions());
return Rest.ok("成功", rsp);
if (rsp.getBody().getSuccess()) {
return Rest.ok(rsp.getBody().getResult());
} else {
log.info("获取审批实例列表失败->" + JSONObject.toJSONString(rsp));
return Rest.fail("查询失败:" + rsp.getBody().getSuccess());
}
} catch (Exception _err) { } catch (Exception _err) {
TeaException err = new TeaException(_err.getMessage(), _err); TeaException err = new TeaException(_err.getMessage(), _err);
log.error("获取审批实例列表失败->"); log.error("获取审批实例列表失败->");
if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) { if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) {
// err 中含有 code 和 message 属性,可帮助开发定位问题 // err 中含有 code 和 message 属性,可帮助开发定位问题
log.error("code = "+com.aliyun.teautil.Common.empty(err.code)+" message = "+com.aliyun.teautil.Common.empty(err.message)); log.error("code = " + com.aliyun.teautil.Common.empty(err.code) + " message = " + com.aliyun.teautil.Common.empty(err.message));
} }
return Rest.fail("获取审批实例列表失败:"+com.aliyun.teautil.Common.empty(err.message)); return Rest.fail("获取审批实例列表失败:" + com.aliyun.teautil.Common.empty(err.message));
} }
}else { } else {
return Rest.fail("userid为空"); return Rest.fail("userid为空");
} }
} }
/** /**
* 根据审批实例id查询审批详情 * 根据审批实例id查询审批详情
*
* @param processInstanceId 审批实例ID。 * @param processInstanceId 审批实例ID。
* @return * @return
*/ */
...@@ -278,7 +288,8 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -278,7 +288,8 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
/** /**
* 查询假期余额 * 查询假期余额
* @param user_id 被查询员工的id集合 多个用,分隔 *
* @param user_id 被查询员工的id集合 多个用,分隔
* @param leave_code 假期类型编码 * @param leave_code 假期类型编码
* @return * @return
*/ */
...@@ -309,9 +320,10 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -309,9 +320,10 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
/** /**
* 根据审批详情处理审批(插入请假数据) * 根据审批详情处理审批(插入请假数据)
*
* @param processInstanceId 实例id * @param processInstanceId 实例id
*/ */
public void handleByProcessInstanceId(String processInstanceId){ public void handleByProcessInstanceId(String processInstanceId) {
try { try {
if (processInstanceId != null) { if (processInstanceId != null) {
Rest<GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult> rest = getOaRecordsById(processInstanceId); Rest<GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult> rest = getOaRecordsById(processInstanceId);
...@@ -341,7 +353,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -341,7 +353,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
String leave_code = LeaveRulesEnum.事假.getLeave_code(); String leave_code = LeaveRulesEnum.事假.getLeave_code();
String leave_name = "事假"; String leave_name = "事假";
if(result.getTitle().contains("请假")){ if (result.getTitle().contains("请假")) {
leave_name = "事假"; leave_name = "事假";
if (result.getFormComponentValues().size() > 0) { if (result.getFormComponentValues().size() > 0) {
JSONArray jsonArray = JSONArray.parseArray(result.getFormComponentValues().get(0).getValue()); JSONArray jsonArray = JSONArray.parseArray(result.getFormComponentValues().get(0).getValue());
...@@ -466,13 +478,13 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -466,13 +478,13 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
leaveRecordEntity.setAttachmentPath(picEntity.getValue()); leaveRecordEntity.setAttachmentPath(picEntity.getValue());
} }
} }
}else if(result.getTitle().contains("外出")){ } else if (result.getTitle().contains("外出")) {
leave_name = "因公外出"; leave_name = "因公外出";
leaveRecordEntity.setLeaveType(17); leaveRecordEntity.setLeaveType(17);
List<GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResultFormComponentValues> comList = result.getFormComponentValues(); List<GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResultFormComponentValues> comList = result.getFormComponentValues();
if(!comList.isEmpty()){ if (!comList.isEmpty()) {
for (GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResultFormComponentValues componentValues : comList){ for (GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResultFormComponentValues componentValues : comList) {
switch (componentValues.name){ switch (componentValues.name) {
case "开始时间": case "开始时间":
Date startTime1 = dateFormat(componentValues.getValue(), "yyyy-MM-dd HH:mm", true); Date startTime1 = dateFormat(componentValues.getValue(), "yyyy-MM-dd HH:mm", true);
leaveRecordEntity.setStartTime(startTime1); leaveRecordEntity.setStartTime(startTime1);
...@@ -494,13 +506,13 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -494,13 +506,13 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
} }
} }
} }
}else if(result.getTitle().contains("出差")){ } else if (result.getTitle().contains("出差")) {
leave_name = "因公外出"; leave_name = "因公外出";
leaveRecordEntity.setLeaveType(17); leaveRecordEntity.setLeaveType(17);
List<GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResultFormComponentValues> comList = result.getFormComponentValues(); List<GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResultFormComponentValues> comList = result.getFormComponentValues();
if(!comList.isEmpty()){ if (!comList.isEmpty()) {
for (GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResultFormComponentValues componentValues : comList){ for (GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResultFormComponentValues componentValues : comList) {
switch (componentValues.name){ switch (componentValues.name) {
case "行程": case "行程":
Gson gson = new Gson(); Gson gson = new Gson();
JsonArray jsonArray = gson.fromJson(componentValues.getValue(), JsonArray.class); JsonArray jsonArray = gson.fromJson(componentValues.getValue(), JsonArray.class);
...@@ -511,11 +523,11 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -511,11 +523,11 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
JsonObject jsonObject1 = element.getAsJsonObject(); // 获取每个元素作为对象 JsonObject jsonObject1 = element.getAsJsonObject(); // 获取每个元素作为对象
String label = jsonObject1.get("label").getAsString(); // 获取label字段的值 String label = jsonObject1.get("label").getAsString(); // 获取label字段的值
String value = jsonObject1.get("value").getAsString(); String value = jsonObject1.get("value").getAsString();
if(label.contains("开始时间")){ if (label.contains("开始时间")) {
Date startTime1 = dateFormat(value, "yyyy-MM-dd HH:mm", true); Date startTime1 = dateFormat(value, "yyyy-MM-dd HH:mm", true);
leaveRecordEntity.setStartTime(startTime1); leaveRecordEntity.setStartTime(startTime1);
} }
if(label.contains("结束时间")){ if (label.contains("结束时间")) {
Date endTime1 = dateFormat(value, "yyyy-MM-dd HH:mm", false); Date endTime1 = dateFormat(value, "yyyy-MM-dd HH:mm", false);
leaveRecordEntity.setEndTime(endTime1); leaveRecordEntity.setEndTime(endTime1);
} }
...@@ -886,7 +898,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -886,7 +898,7 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
} }
} }
}catch (DingCallbackCrypto.DingTalkEncryptException e) { } catch (DingCallbackCrypto.DingTalkEncryptException e) {
e.printStackTrace(); e.printStackTrace();
} catch (Exception e) { } catch (Exception e) {
log.info("请假记录表操作异常->" + e.toString()); log.info("请假记录表操作异常->" + e.toString());
...@@ -894,7 +906,6 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -894,7 +906,6 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
} }
} }
/** /**
...@@ -934,9 +945,9 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID ...@@ -934,9 +945,9 @@ public class DingPersonServiceImpl extends AbstractDingTalkService implements ID
try { try {
sdf.parse(dateString); sdf.parse(dateString);
if(tag){ if (tag) {
dateString += " 09:00"; dateString += " 09:00";
}else { } else {
dateString += " 18:00"; dateString += " 18:00";
} }
......
...@@ -82,7 +82,7 @@ POST {{baseUrl}}//attendance/stat/summary ...@@ -82,7 +82,7 @@ POST {{baseUrl}}//attendance/stat/summary
Authorization: {{authToken}} Authorization: {{authToken}}
Content-Type: application/json Content-Type: application/json
{"summaryTimeStart":"2023-12-01","summaryTimeEnd":"2023-12-31"} {"summaryTimeStart":"2024-01-01","summaryTimeEnd":"2024-12-30"}
###短信设置编辑 ###短信设置编辑
......
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