From 8eb0a5a58fbbf7bc55f48adc23020ed1a5e8ec69 Mon Sep 17 00:00:00 2001 From: andy <1042025947@qq.com> Date: Fri, 27 Mar 2026 10:23:28 +0800 Subject: [PATCH] =?UTF-8?q?=E9=92=89=E9=92=89=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../evo/attendance/domain/RzAttendance.java | 4 + .../service/IRzAttendanceService.java | 2 +- .../impl/RzAttendanceDetailServiceImpl.java | 5 - .../service/impl/RzAttendanceServiceImpl.java | 26 ++-- .../service/impl/RzSysParamServiceImpl.java | 2 + .../com/evo/common/constant/Constants.java | 5 + .../java/com/evo/common/utils/ParamUtils.java | 14 +- .../src/main/java/com/evo/ding/DingUtils.java | 56 ++++---- .../java/com/evo/ding/domain/DingShift.java | 8 +- .../com/evo/ding/domain/DingShiftGroup.java | 6 + .../com/evo/ding/mapper/DingGroupMapper.java | 19 +++ .../evo/ding/mapper/DingShiftGroupMapper.java | 7 +- .../com/evo/ding/mapper/DingShiftMapper.java | 5 + ...eApproveStatusChangeExchangeProcessor.java | 20 ++- .../ApproveStatusLeaveExchangeProcessor.java | 112 +++++++++------ .../ApproveStatusOutExchangeProcessor.java | 127 ++++++++++++++++++ ...pproveStatusOvertimeExchangeProcessor.java | 5 +- .../DingCallBackExchangeProcessor.java | 6 + ...kApproveStatusChangeExchangeProcessor.java | 2 +- ...gCallBackGroupChangeExchangeProcessor.java | 113 ++++++++++++++++ ...gCallBackShiftChangeExchangeProcessor.java | 69 ++++++++++ ...ngCallBackUserAddOrgExchangeProcessor.java | 3 +- ...ceChangeRechargeCardExchangeProcessor.java | 3 +- .../evo/ding/service/DingGroupService.java | 18 +++ .../ding/service/DingShiftGroupService.java | 9 ++ .../evo/ding/service/DingShiftService.java | 5 + .../service/impl/DingGroupServiceImpl.java | 26 ++++ .../impl/DingShiftGroupServiceImpl.java | 18 +++ .../service/impl/DingShiftServiceImpl.java | 7 + .../domain/RzLeaveDetail.java | 3 +- .../mapper/RzLeaveDetailMapper.java | 2 + .../service/IRzLeaveDetailService.java | 3 + .../impl/RzLeaveDetailServiceImpl.java | 5 + .../system/controller/ShiftController.java | 55 ++++++++ .../java/com/evo/system/domain/SysStaff.java | 2 + .../evo/system/service/ISysStaffService.java | 2 +- .../service/impl/SysStaffServiceImpl.java | 113 ++++++++-------- .../resources/mapper/ding/DingGroupMapper.xml | 21 +++ .../mapper/ding/DingShiftGroupMapper.xml | 17 +++ .../resources/mapper/ding/DingShiftMapper.xml | 14 +- .../personnelMatters/RzLeaveDetailMapper.xml | 5 +- .../mapper/system/SysStaffMapper.xml | 5 +- 42 files changed, 780 insertions(+), 169 deletions(-) create mode 100644 evo-admin/src/main/java/com/evo/ding/mapper/DingGroupMapper.java create mode 100644 evo-admin/src/main/java/com/evo/ding/processor/approveStatus/impl/ApproveStatusOutExchangeProcessor.java create mode 100644 evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackGroupChangeExchangeProcessor.java create mode 100644 evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackShiftChangeExchangeProcessor.java create mode 100644 evo-admin/src/main/java/com/evo/ding/service/DingGroupService.java create mode 100644 evo-admin/src/main/java/com/evo/ding/service/impl/DingGroupServiceImpl.java create mode 100644 evo-admin/src/main/java/com/evo/system/controller/ShiftController.java create mode 100644 evo-admin/src/main/resources/mapper/ding/DingGroupMapper.xml diff --git a/evo-admin/src/main/java/com/evo/attendance/domain/RzAttendance.java b/evo-admin/src/main/java/com/evo/attendance/domain/RzAttendance.java index 4644bbc..995421d 100644 --- a/evo-admin/src/main/java/com/evo/attendance/domain/RzAttendance.java +++ b/evo-admin/src/main/java/com/evo/attendance/domain/RzAttendance.java @@ -120,5 +120,9 @@ public class RzAttendance extends BaseEntity { private Date startTime; @TableField(exist = false) private Date endTime; + /*** + * 补卡扣款 + */ + private BigDecimal debiting; } diff --git a/evo-admin/src/main/java/com/evo/attendance/service/IRzAttendanceService.java b/evo-admin/src/main/java/com/evo/attendance/service/IRzAttendanceService.java index b9d7131..53e943b 100644 --- a/evo-admin/src/main/java/com/evo/attendance/service/IRzAttendanceService.java +++ b/evo-admin/src/main/java/com/evo/attendance/service/IRzAttendanceService.java @@ -67,7 +67,7 @@ public interface IRzAttendanceService extends IService public void dingDing(String dingUserId, String bizId); - void addRzOverTime(String result, SysStaff sysStaff, DingShiftGroup dingsShiftGroup, String checkType, Date formatWorkDate, Date formatUserCheckTime, String timeResult, String remark ); + void addRzOverTime(String result, SysStaff sysStaff, DingShiftGroup dingsShiftGroup, String checkType, Date formatWorkDate, Date formatUserCheckTime, String timeResult, String remark, Double debiting); public RzAttendance queryNowDayAttendanceByStatisticalIdAndDate(Long staffId, Date date); } diff --git a/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceDetailServiceImpl.java b/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceDetailServiceImpl.java index 1beca89..bf6a8a4 100644 --- a/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceDetailServiceImpl.java +++ b/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceDetailServiceImpl.java @@ -141,11 +141,6 @@ public class RzAttendanceDetailServiceImpl extends ServiceImpl().eq(RzAttendanceDetail::getAttendanceId, attId) -// .select(RzAttendanceDetail::getButtonType, RzAttendanceDetail::getPhoto, RzAttendanceDetail::getDateTime,RzAttendanceDetail::getDelFlag)).stream().map(data ->{ -// return new RzAttendanceDetailTimeLineVO(data.getButtonType(), data.getPhoto(), DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",data.getDateTime()), data.getDelFlag()); -// }).collect(Collectors.toList()); } SimpleDateFormat sdfd = new SimpleDateFormat("yyyy-MM-dd"); diff --git a/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceServiceImpl.java b/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceServiceImpl.java index 4f99a8a..e93d623 100644 --- a/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceServiceImpl.java +++ b/evo-admin/src/main/java/com/evo/attendance/service/impl/RzAttendanceServiceImpl.java @@ -16,10 +16,7 @@ import com.evo.attendance.service.RzAttendanceDetailService; import com.evo.common.annotation.DataScope; import com.evo.common.core.domain.AjaxResult; import com.evo.common.core.domain.entity.SysDept; -import com.evo.common.utils.Collections; -import com.evo.common.utils.DateUtils; -import com.evo.common.utils.SecurityUtils; -import com.evo.common.utils.StringUtils; +import com.evo.common.utils.*; import com.evo.ding.DingUtils; import com.evo.ding.domain.DingShift; import com.evo.ding.domain.DingShiftGroup; @@ -563,7 +560,7 @@ public class RzAttendanceServiceImpl extends ServiceImpl= 8 && attendance.getWorkStartTime() != null && attendance.getWorkStartTime().getHours() >= 12 && attendance.getWorkStartTime().getHours() < 21){ attendance.setMiddleShiftNumber(1); } - + //记录补卡扣款 + attendance.setDebiting(DataUtils.findDefaultValue(attendance.getDebiting(), DataUtils.DEFAULT_VALUE).add(new BigDecimal(DataUtils.findDefaultValue(debiting, 0d)))); getBaseMapper().updateRzAttendance(attendance); - //检查是否开启加班 - if(dingsShift.getOvertimeWork()){ - //使用排班下班时间作为加班开始时间 - rzOverTimeService.overTimeCard(sysStaff, DateUtils.parseDate(DateUtils.parseDateToStr("yyyy-MM-dd", formatWorkDate)+" "+ dingsShiftGroup.getCheckTime())); - //员工打卡时间作为加班下班时间 - rzOverTimeService.overTimeOffDutyCard(sysStaff, formatUserCheckTime, "/"); - } + //检查是否开启加班, 所有的加班调整为, 扫脸打卡 +// if(dingsShift.getOvertimeWork()){ +// //使用排班下班时间作为加班开始时间 +// rzOverTimeService.overTimeCard(sysStaff, DateUtils.parseDate(DateUtils.parseDateToStr("yyyy-MM-dd", formatWorkDate)+" "+ dingsShiftGroup.getCheckTime())); +// //员工打卡时间作为加班下班时间 +// rzOverTimeService.overTimeOffDutyCard(sysStaff, formatUserCheckTime, "/"); +// } }else{ log.info("钉钉回调打卡信息=====>>>>> {}", result); } diff --git a/evo-admin/src/main/java/com/evo/attendance/service/impl/RzSysParamServiceImpl.java b/evo-admin/src/main/java/com/evo/attendance/service/impl/RzSysParamServiceImpl.java index 58bacfa..d99ed5b 100644 --- a/evo-admin/src/main/java/com/evo/attendance/service/impl/RzSysParamServiceImpl.java +++ b/evo-admin/src/main/java/com/evo/attendance/service/impl/RzSysParamServiceImpl.java @@ -4,6 +4,7 @@ import java.util.List; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.evo.common.constant.CacheConstants; import com.evo.common.utils.DateUtils; import com.evo.common.utils.SecurityUtils; import com.evo.equipment.constant.Constants; @@ -103,6 +104,7 @@ public class RzSysParamServiceImpl extends ServiceImpl { + + public DingGroup selectByDingId(@Param("dingId") String dingId); +} diff --git a/evo-admin/src/main/java/com/evo/ding/mapper/DingShiftGroupMapper.java b/evo-admin/src/main/java/com/evo/ding/mapper/DingShiftGroupMapper.java index ae21f00..18fe014 100644 --- a/evo-admin/src/main/java/com/evo/ding/mapper/DingShiftGroupMapper.java +++ b/evo-admin/src/main/java/com/evo/ding/mapper/DingShiftGroupMapper.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.evo.ding.domain.DingShiftGroup; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** * DingsShiftGroupMapper * @@ -14,6 +16,9 @@ import org.apache.ibatis.annotations.Param; */ public interface DingShiftGroupMapper extends BaseMapper { - DingShiftGroup selectByGroupIdAndTypeAndCheckTime(@Param("groupId") String groupId, @Param("type") String type, @Param("checkTime") String checkTime); + + int updateCheckTimeByShiftIdAndType(@Param("shiftId")String shiftId, @Param("type")String type, @Param("checkTime")String checkTime); + + List selectList(DingShiftGroup dingShiftGroup); } diff --git a/evo-admin/src/main/java/com/evo/ding/mapper/DingShiftMapper.java b/evo-admin/src/main/java/com/evo/ding/mapper/DingShiftMapper.java index edb0d5f..3b3d258 100644 --- a/evo-admin/src/main/java/com/evo/ding/mapper/DingShiftMapper.java +++ b/evo-admin/src/main/java/com/evo/ding/mapper/DingShiftMapper.java @@ -2,9 +2,12 @@ package com.evo.ding.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.evo.ding.domain.DingShift; +import com.evo.system.domain.SysStaff; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; +import java.util.List; + /** * DingsShiftGroupMapper * @@ -16,4 +19,6 @@ import org.apache.ibatis.annotations.Select; public interface DingShiftMapper extends BaseMapper { public DingShift selectByDingId(@Param("dingId") String dingId); + + public List selectList(DingShift dingShift); } diff --git a/evo-admin/src/main/java/com/evo/ding/processor/approveStatus/AttendanceApproveStatusChangeExchangeProcessor.java b/evo-admin/src/main/java/com/evo/ding/processor/approveStatus/AttendanceApproveStatusChangeExchangeProcessor.java index 39fffd6..83db63e 100644 --- a/evo-admin/src/main/java/com/evo/ding/processor/approveStatus/AttendanceApproveStatusChangeExchangeProcessor.java +++ b/evo-admin/src/main/java/com/evo/ding/processor/approveStatus/AttendanceApproveStatusChangeExchangeProcessor.java @@ -9,6 +9,7 @@ import com.evo.system.domain.SysStaff; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.lang.reflect.Field; import java.util.List; /** @@ -27,16 +28,29 @@ public interface AttendanceApproveStatusChangeExchangeProcessor extends DingBasi String APPROVE_TYPE_LEAVE = "LEAVE"; //加班 String APPROVE_TYPE_OVERTIME = "OVERTIME"; + //请假 + String APPROVE_TYPE_OUT = "OUT"; + //撤销 + String BIZ_ACTION_REVOKE = "REVOKE"; boolean accept(String approveType, String result, String status); - void exchange(GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult json); + void exchange(String processInstanceId, GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult json); default JSONObject getExtValue(GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult json, String componentType) { List formComponentValueList = json.getFormComponentValues(); - GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResultFormComponentValues formComponentValue = formComponentValueList.stream().filter(data -> componentType.equals(data.getComponentType())).findAny().orElse(null); + GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResultFormComponentValues formComponentValue = formComponentValueList.stream().filter(data -> componentType.equals(data.getComponentType())).findAny().orElse(null); if(formComponentValue != null){ - return JSON.parseObject(formComponentValue.getExtValue()); + return JSON.parseObject(formComponentValue.getExtValue()); + } + throw new RuntimeException("未查询到相关审批信息, 审批类型为:"+componentType+"; 参数信息为: "+ json.toString()); + } + + default JSONArray getValue(GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult json, String componentType) { + List formComponentValueList = json.getFormComponentValues(); + GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResultFormComponentValues formComponentValue = formComponentValueList.stream().filter(data -> componentType.equals(data.getComponentType())).findAny().orElse(null); + if(formComponentValue != null){ + return JSON.parseArray(formComponentValue.getValue()); } throw new RuntimeException("未查询到相关审批信息, 审批类型为:"+componentType+"; 参数信息为: "+ json.toString()); } diff --git a/evo-admin/src/main/java/com/evo/ding/processor/approveStatus/impl/ApproveStatusLeaveExchangeProcessor.java b/evo-admin/src/main/java/com/evo/ding/processor/approveStatus/impl/ApproveStatusLeaveExchangeProcessor.java index 15df17e..d4f06af 100644 --- a/evo-admin/src/main/java/com/evo/ding/processor/approveStatus/impl/ApproveStatusLeaveExchangeProcessor.java +++ b/evo-admin/src/main/java/com/evo/ding/processor/approveStatus/impl/ApproveStatusLeaveExchangeProcessor.java @@ -38,52 +38,82 @@ public class ApproveStatusLeaveExchangeProcessor implements AttendanceApproveSta } @Override - public void exchange(GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult json) { + public void exchange(String processInstanceId, GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult json) { try { - SysStaff sysStaff = getSysStaffByDingUserId(json.getOriginatorUserId()); - JSONObject extValueJson = getExtValue(json, "DDHolidayField"); - //解析假期类型 - JSONObject extension = JSON.parseObject(extValueJson.getString("extension")); - //查询假期类型 - String tag = extension.getString("tag"); - SysDictData sysDictData = sysDictDataService.selectDictDataListByType("holidays_type").stream().filter(data-> StringUtils.equals(data.getDictLabel(),tag)).findFirst().orElse(null); - if(sysDictData != null){ - //假期类型的code - Long dictCode = sysDictData.getDictCode(); - JSONArray detailList = extValueJson.getJSONArray("detailList"); - Date beginTime = null; - Date endTime = null; - //如果大于1 证明是多天请假, 需要排序 - if(detailList.size() > 1){ - detailList.sort((a,b)->{ - return ((JSONObject) a).getLong("workDate").compareTo(((JSONObject) b).getLong("workDate")); - }); - //获取第一天 - beginTime = new Date(detailList.getJSONObject(0).getJSONObject("approveInfo").getLong("fromTime")); - //获取最后一天 - endTime = new Date(detailList.getJSONObject(detailList.size()-1).getJSONObject("approveInfo").getLong("toTime")); - }else{ - //只请一天假 - JSONObject approveInfo = detailList.getJSONObject(0).getJSONObject("approveInfo"); - beginTime = new Date(approveInfo.getLong("fromTime")); - //获取最后一天 - endTime = new Date(approveInfo.getLong("toTime")); - } - RzLeave rzLeave = getIRzLeaveService().selectRzLeaveByUserId(sysStaff.getUserId()); - RzLeaveDetail rzLeaveDetail = new RzLeaveDetail(); - rzLeaveDetail.setName(sysStaff.getName()); - rzLeaveDetail.setLeaveStartTime(beginTime); - rzLeaveDetail.setLeaveEndTime(endTime); - rzLeaveDetail.setLeaveId(rzLeave.getId()); - rzLeaveDetail.setType(dictCode); - rzLeaveDetail.setLeaveHour(extValueJson.getInteger("durationInHour")); - rzLeaveDetail.setRemarks("钉钉"+tag); - getIRzLeaveDetailService().insertRzLeaveDetail(rzLeaveDetail); + + //如果是撤销, 执行撤销 + if(BIZ_ACTION_REVOKE.equals(json.getBizAction())){ + revoke(processInstanceId); + }else{ + leave(processInstanceId, getSysStaffByDingUserId(json.getOriginatorUserId()), json); } } catch (Exception e) { - log.error("执行钉钉 -[请假审批]-回调出现异常, 异常原因为:{}", e.getMessage()); + log.error("执行钉钉 -["+(BIZ_ACTION_REVOKE.equals(json.getBizAction()) ? "撤销" : "请假")+"审批]-回调出现异常, 异常原因为:{}", e.getMessage()); e.printStackTrace(); } } + + + /*** + * 撤销假期 + * @param processInstanceId 钉钉审批单详情 + */ + public void revoke(String processInstanceId){ + RzLeaveDetail rzLeaveDetail = getIRzLeaveDetailService().selectRzLeaveDetailByProcessInstanceId(processInstanceId); + if(rzLeaveDetail != null){ + getIRzLeaveDetailService().deleteRzLeaveDetailById(rzLeaveDetail.getId()); + } + } + + /*** + * 请假 + * @param processInstanceId 钉钉审批单详情 + * @param sysStaff 平台用户 + * @param json 请求数据信息 + */ + public void leave(String processInstanceId, SysStaff sysStaff, GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult json) { + + JSONObject extValueJson = getExtValue(json, "DDHolidayField"); + //解析假期类型 + JSONObject extension = JSON.parseObject(extValueJson.getString("extension")); + //查询假期类型 + String tag = extension.getString("tag"); + SysDictData sysDictData = sysDictDataService.selectDictDataListByType("holidays_type").stream().filter(data-> StringUtils.equals(data.getDictLabel(),tag)).findFirst().orElse(null); + if(sysDictData != null){ + //假期类型的code + Long dictCode = sysDictData.getDictCode(); + JSONArray detailList = extValueJson.getJSONArray("detailList"); + Date beginTime = null; + Date endTime = null; + //如果大于1 证明是多天请假, 需要排序 + if(detailList.size() > 1){ + detailList.sort((a,b)->{ + return ((JSONObject) a).getLong("workDate").compareTo(((JSONObject) b).getLong("workDate")); + }); + //获取第一天 + beginTime = new Date(detailList.getJSONObject(0).getJSONObject("approveInfo").getLong("fromTime")); + //获取最后一天 + endTime = new Date(detailList.getJSONObject(detailList.size()-1).getJSONObject("approveInfo").getLong("toTime")); + }else{ + //只请一天假 + JSONObject approveInfo = detailList.getJSONObject(0).getJSONObject("approveInfo"); + beginTime = new Date(approveInfo.getLong("fromTime")); + //获取最后一天 + endTime = new Date(approveInfo.getLong("toTime")); + } + RzLeave rzLeave = getIRzLeaveService().selectRzLeaveByUserId(sysStaff.getUserId()); + RzLeaveDetail rzLeaveDetail = new RzLeaveDetail(); + rzLeaveDetail.setName(sysStaff.getName()); + rzLeaveDetail.setLeaveStartTime(beginTime); + rzLeaveDetail.setLeaveEndTime(endTime); + rzLeaveDetail.setLeaveId(rzLeave.getId()); + rzLeaveDetail.setType(dictCode); + rzLeaveDetail.setLeaveHour(extValueJson.getInteger("durationInHour")); + rzLeaveDetail.setRemarks("钉钉"+tag); + rzLeaveDetail.setProcessInstanceId(processInstanceId); + getIRzLeaveDetailService().insertRzLeaveDetail(rzLeaveDetail); + } + } + } diff --git a/evo-admin/src/main/java/com/evo/ding/processor/approveStatus/impl/ApproveStatusOutExchangeProcessor.java b/evo-admin/src/main/java/com/evo/ding/processor/approveStatus/impl/ApproveStatusOutExchangeProcessor.java new file mode 100644 index 0000000..ce53ebe --- /dev/null +++ b/evo-admin/src/main/java/com/evo/ding/processor/approveStatus/impl/ApproveStatusOutExchangeProcessor.java @@ -0,0 +1,127 @@ +package com.evo.ding.processor.approveStatus.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponseBody; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.evo.attendance.domain.RzAttendance; +import com.evo.attendance.domain.RzAttendanceDetail; +import com.evo.attendance.mapper.RzAttendanceMapper; +import com.evo.attendance.service.IRzAttendanceService; +import com.evo.attendance.service.RzAttendanceDetailService; +import com.evo.common.core.domain.entity.SysDictData; +import com.evo.common.utils.ParamUtils; +import com.evo.common.utils.StringUtils; +import com.evo.ding.processor.approveStatus.AttendanceApproveStatusChangeExchangeProcessor; +import com.evo.personnelMatters.domain.RzLeave; +import com.evo.personnelMatters.domain.RzLeaveDetail; +import com.evo.system.domain.SysStaff; +import com.evo.system.service.ISysDictDataService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.math.BigDecimal; +import java.time.Instant; +import java.util.Date; + +/** + * 出差事件处理 ApproveStatusOutExchangeProcessor + * + * @author andy.shi + * @ClassName:ApproveStatusLeaveExchangeProcessor + * @date: 2026年03月12日 13:32 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Slf4j +@Service +public class ApproveStatusOutExchangeProcessor implements AttendanceApproveStatusChangeExchangeProcessor { + + @Resource + private RzAttendanceMapper rzAttendanceMapper; + @Resource + private RzAttendanceDetailService rzAttendanceDetailService; + + @Override + public boolean accept(String approveType, String result, String status) { + return APPROVE_TYPE_OUT.equals(approveType.toUpperCase()) && APPROVE_STATUS.equals(status.toUpperCase()) && APPROVE_RESULT.equals(result.toUpperCase()); + } + + @Override + public void exchange(String processInstanceId, GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult json) { + try { + rzAttendance(json, BIZ_ACTION_REVOKE.equals(json.getBizAction())); + } catch (Exception e) { + log.error("执行钉钉 -[出差审批]-回调出现异常, 异常原因为:{}", e.getMessage()); + e.printStackTrace(); + } + + } + /*** + * + * @param json 审批单数据 + * @param isRevoke 是否为撤回 + */ + public void rzAttendance(GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult json, Boolean isRevoke){ + SysStaff sysStaff = getSysStaffByDingUserId(json.getOriginatorUserId()); + //出差 + JSONArray valueJson = getValue(json, "TableField"); + JSONObject jsonObject = valueJson.getJSONObject(0); + JSONArray rowValue = jsonObject.getJSONArray("rowValue"); + for (int i = 0; i < rowValue.size(); i++) { + JSONObject rowValueObject = rowValue.getJSONObject(i); + if ("duration".equals(rowValueObject.getString("bizAlias"))) { + JSONObject extendValue = rowValueObject.getJSONObject("extendValue"); + JSONArray detailList = extendValue.getJSONArray("detailList"); + for (int j = 0; j < detailList.size(); j++) { + JSONObject detailObject = detailList.getJSONObject(j); + Date formatWorkDate = Date.from(Instant.ofEpochMilli(detailObject.getLong("workDate"))); + //检查是否为假期, 如果为假期, 不做记录, 只记录不是假期的数据, 假期的外出, 需要提交加班审批 + if (!ParamUtils.checkHoliday(formatWorkDate)) { + JSONObject classInfo = detailObject.getJSONObject("classInfo"); + JSONObject section = classInfo.getJSONArray("sections").getJSONObject(0); + Long startTime = section.getLong("startTime"); + Long endTime = section.getLong("endTime"); + Integer durationInHour = detailObject.getJSONObject("approveInfo").getInteger("durationInHour"); + Date formatStartTime = Date.from(Instant.ofEpochMilli(startTime)); + Date formatEndTime = Date.from(Instant.ofEpochMilli(endTime)); + //通过workDate 获取哪一天的卡 + RzAttendance attendance = rzAttendanceMapper.queryNowDayAttendanceByStatisticalIdAndDate(sysStaff.getUserId(), formatStartTime); + if(isRevoke){ + //清除打卡记录 + rzAttendanceDetailService.remove(new LambdaQueryWrapper().eq(RzAttendanceDetail::getAttendanceId, attendance.getId())); + //重置打卡信息 + attendance.setRules(""); + attendance.setWorkStartTime(null); + attendance.setWorkEndTime(null); + attendance.setWorkSum(BigDecimal.valueOf(0)); + attendance.setNightNumber(0); + attendance.setMiddleShiftNumber(0); + }else{ + //生成打卡记录 + rzAttendanceDetailService.addDetail(attendance, "上班卡", "/", formatStartTime, "出差自动打卡", ""); + rzAttendanceDetailService.addDetail(attendance, "下班卡", "/", formatEndTime, "出差自动打卡", ""); + //上班 + attendance.setRules("上班卡"); + attendance.setWorkStartTime(formatStartTime); + attendance.setWorkEndTime(formatEndTime); + attendance.setWorkSum(BigDecimal.valueOf(durationInHour)); + if (attendance.getWorkSum().intValue() >= 12 && attendance.getWorkStartTime() != null && attendance.getWorkStartTime().getHours() > 12) { + attendance.setNightNumber(1); + } else if (attendance.getWorkSum().intValue() >= 8 && attendance.getWorkStartTime() != null && attendance.getWorkStartTime().getHours() >= 12 && attendance.getWorkStartTime().getHours() < 21) { + attendance.setMiddleShiftNumber(1); + } + } + + rzAttendanceMapper.updateRzAttendance(attendance); + } + } + break; + } + } + } + + +} diff --git a/evo-admin/src/main/java/com/evo/ding/processor/approveStatus/impl/ApproveStatusOvertimeExchangeProcessor.java b/evo-admin/src/main/java/com/evo/ding/processor/approveStatus/impl/ApproveStatusOvertimeExchangeProcessor.java index 133c421..52a7106 100644 --- a/evo-admin/src/main/java/com/evo/ding/processor/approveStatus/impl/ApproveStatusOvertimeExchangeProcessor.java +++ b/evo-admin/src/main/java/com/evo/ding/processor/approveStatus/impl/ApproveStatusOvertimeExchangeProcessor.java @@ -53,12 +53,13 @@ public class ApproveStatusOvertimeExchangeProcessor implements AttendanceApprove @Override public boolean accept(String approveType, String result, String status) { - return APPROVE_TYPE_OVERTIME.equals(approveType.toUpperCase()) && APPROVE_STATUS.equals(status.toUpperCase()) && APPROVE_RESULT.equals(result.toUpperCase()); + //加班不在对接 + return false; //APPROVE_TYPE_OVERTIME.equals(approveType.toUpperCase()) && APPROVE_STATUS.equals(status.toUpperCase()) && APPROVE_RESULT.equals(result.toUpperCase()); } @Override @Transactional - public void exchange(GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult result) { + public void exchange(String processInstanceId, GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult result) { try { SysStaff sysStaff = getSysStaffByDingUserId(result.getOriginatorUserId()); List formComponentValueList = result.getFormComponentValues(); diff --git a/evo-admin/src/main/java/com/evo/ding/processor/callback/DingCallBackExchangeProcessor.java b/evo-admin/src/main/java/com/evo/ding/processor/callback/DingCallBackExchangeProcessor.java index d664024..54c85af 100644 --- a/evo-admin/src/main/java/com/evo/ding/processor/callback/DingCallBackExchangeProcessor.java +++ b/evo-admin/src/main/java/com/evo/ding/processor/callback/DingCallBackExchangeProcessor.java @@ -23,6 +23,12 @@ public interface DingCallBackExchangeProcessor { static final String EVENT_TYPE_INSTANCE_CHANGE = "bpms_instance_change"; //请假、加班、出差、外出状态变更事件 static final String EVENT_TYPE_APPROVE_STATUS_CHANGE = "attendance_approve_status_change"; + //班制调整 + static final String EVENT_TYPE_ATTEND_SHIFT_CHANGE = "attend_shift_change"; + //考勤组调整 + static final String EVENT_TYPE_ATTEND_GROUP_CHANGE = "attend_group_change"; + + boolean accept(String eventType); diff --git a/evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackApproveStatusChangeExchangeProcessor.java b/evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackApproveStatusChangeExchangeProcessor.java index b0212bf..4af732b 100644 --- a/evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackApproveStatusChangeExchangeProcessor.java +++ b/evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackApproveStatusChangeExchangeProcessor.java @@ -41,7 +41,7 @@ public class DingCallBackApproveStatusChangeExchangeProcessor implements DingCal GetProcessInstanceResponseBody.GetProcessInstanceResponseBodyResult result = DingUtils.getProcessInstanceInfo(processInstanceId); for (AttendanceApproveStatusChangeExchangeProcessor processor : approveStatusChangeExchangeProcessorList) { if (processor.accept(json.getString("approveType"), result.getResult(), result.getStatus())) { - processor.exchange(result); + processor.exchange(processInstanceId, result); } } } diff --git a/evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackGroupChangeExchangeProcessor.java b/evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackGroupChangeExchangeProcessor.java new file mode 100644 index 0000000..d01f23d --- /dev/null +++ b/evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackGroupChangeExchangeProcessor.java @@ -0,0 +1,113 @@ +package com.evo.ding.processor.callback.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.dingtalk.api.response.OapiAttendanceGroupQueryResponse; +import com.dingtalk.api.response.OapiAttendanceShiftQueryResponse; +import com.evo.common.utils.Collections; +import com.evo.common.utils.DateUtils; +import com.evo.ding.DingUtils; +import com.evo.ding.domain.DingGroup; +import com.evo.ding.domain.DingShift; +import com.evo.ding.domain.DingShiftGroup; +import com.evo.ding.processor.callback.DingCallBackExchangeProcessor; +import com.evo.ding.service.DingGroupService; +import com.evo.ding.service.DingShiftGroupService; +import com.evo.ding.service.DingShiftService; +import io.swagger.models.auth.In; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * 考勤组信息调整 DingCallBackGroupChangeExchangeProcessor + * @author andy.shi + * @ClassName:DingCallBackCheckRecordExchangeProcessor + * @date: 2026年03月12日 9:02 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Slf4j +@Service +public class DingCallBackGroupChangeExchangeProcessor implements DingCallBackExchangeProcessor { + + @Autowired + DingGroupService dingGroupService; + + @Autowired + DingShiftService dingShiftService; + + @Autowired + DingShiftGroupService dingShiftGroupService; + + @Override + public boolean accept(String eventType) { + return EVENT_TYPE_ATTEND_GROUP_CHANGE.equals(eventType); + } + + @Override + public void exchange(JSONObject json) { + log.info("钉钉 班制调整回调========================>>>{}", json.toString()); + OapiAttendanceGroupQueryResponse.TopSimpleGroupVO groupDetail = DingUtils.getGroupDetail(json.getLong("id")); + if(groupDetail != null){ + String groupDingId = String.valueOf(groupDetail.getId()); + DingGroup dingGroup = dingGroupService.selectByDingId(groupDingId); + if(dingGroup == null){ + dingGroup = new DingGroup(); + } + dingGroup.setName(groupDetail.getName()); + dingGroup.setDingId(groupDingId); + dingGroupService.saveOrUpdate(dingGroup); + + //获取现在所有的数据 + List dingShiftGroupList = dingShiftGroupService.selectListByGroupId(groupDingId); + //如果返回为空, 旧数据不为空, 直接清除 + if(Collections.isEmpty(groupDetail.getShiftIds()) && Collections.isNotEmpty(dingShiftGroupList)){ + dingShiftGroupService.removeByIds(dingShiftGroupList); + }else if(Collections.isNotEmpty(groupDetail.getShiftIds()) && Collections.isEmpty(dingShiftGroupList)){ + //更新绑定信息 + for (Long shiftId : groupDetail.getShiftIds()) { + crateDingShiftGroup(groupDingId, String.valueOf(shiftId)); + } + }else if(Collections.isNotEmpty(groupDetail.getShiftIds()) && Collections.isNotEmpty(dingShiftGroupList)){ + Map> map = dingShiftGroupList.stream().collect(Collectors.groupingBy(DingShiftGroup::getShiftId)); + for (Long shiftId : groupDetail.getShiftIds()) { + String strShiftId = String.valueOf(shiftId); + if(map.containsKey(strShiftId)){ + DingShift dingShift = dingShiftService.selectByDingId(strShiftId); + for (DingShiftGroup dingShiftGroup : map.get(strShiftId)){ + dingShiftGroup.setCheckTime(("OnDuty".equals(dingShiftGroup.getType()) ? dingShift.getOnDutyCheckTime() : dingShift.getOffDutyCheckTime())); + dingShiftGroupService.updateById(dingShiftGroup); + } + map.remove(strShiftId); + }else{ + crateDingShiftGroup(groupDingId, String.valueOf(shiftId)); + } + } + //如果还存在, 需要删除 + if(Collections.isNotEmpty(map)){ + dingShiftGroupService.removeByIds(map.values().stream().filter(Objects::nonNull).flatMap(Collection::stream).collect(Collectors.toList())); + } + } + } + } + public void crateDingShiftGroup(String groupId, String shiftId){ + DingShift dingShift = dingShiftService.selectByDingId(shiftId); + //直接更新上班, 下班 + for (int i = 0; i < 2; i++) { + DingShiftGroup dingShiftGroup = new DingShiftGroup(); + dingShiftGroup.setGroupId(groupId); + dingShiftGroup.setShiftId(String.valueOf(shiftId)); + dingShiftGroup.setType(i == 0 ? "OnDuty" : "OffDuty"); + if(dingShift != null){ + dingShiftGroup.setCheckTime(i == 0 ? dingShift.getOnDutyCheckTime() : dingShift.getOffDutyCheckTime()); + } + dingShiftGroupService.save(dingShiftGroup); + } + } +} diff --git a/evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackShiftChangeExchangeProcessor.java b/evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackShiftChangeExchangeProcessor.java new file mode 100644 index 0000000..d9a1939 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackShiftChangeExchangeProcessor.java @@ -0,0 +1,69 @@ +package com.evo.ding.processor.callback.impl; + +import com.alibaba.fastjson2.JSONObject; +import com.dingtalk.api.response.OapiAttendanceShiftQueryResponse; +import com.evo.common.utils.DateUtils; +import com.evo.ding.DingUtils; +import com.evo.ding.domain.DingShift; +import com.evo.ding.processor.callback.DingCallBackExchangeProcessor; +import com.evo.ding.service.DingShiftGroupService; +import com.evo.ding.service.DingShiftService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; + +/** + * 班制信息调整 DingCallBackShiftChangeExchangeProcessor + * @author andy.shi + * @ClassName:DingCallBackCheckRecordExchangeProcessor + * @date: 2026年03月12日 9:02 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Slf4j +@Service +public class DingCallBackShiftChangeExchangeProcessor implements DingCallBackExchangeProcessor { + + @Autowired + DingShiftService dingShiftService; + + @Autowired + DingShiftGroupService dingShiftGroupService; + + @Override + public boolean accept(String eventType) { + return EVENT_TYPE_ATTEND_SHIFT_CHANGE.equals(eventType); + } + + @Override + public void exchange(JSONObject json) { + log.info("钉钉 班制调整回调========================>>>{}", json.toString()); + OapiAttendanceShiftQueryResponse.TopShiftVo shiftDetail = DingUtils.getShiftDetail(json.getLong("id")); + if(shiftDetail != null){ + String shiftDingId = String.valueOf(shiftDetail.getId()); + DingShift dingShift = dingShiftService.selectByDingId(shiftDingId); + //获取工作时长 + OapiAttendanceShiftQueryResponse.TopShiftSettingVo topShiftSettingVo = shiftDetail.getShiftSetting(); + + OapiAttendanceShiftQueryResponse.TopSectionVo topSectionVo = shiftDetail.getSections().get(0); + OapiAttendanceShiftQueryResponse.TopPunchVo newOnDutyTopPunchVo = topSectionVo.getPunches().stream().filter(data -> data.getCheckType().equals("OnDuty")).findAny().orElse(null); + OapiAttendanceShiftQueryResponse.TopPunchVo newOffDutyTopPunchVo = topSectionVo.getPunches().stream().filter(data -> data.getCheckType().equals("OffDuty")).findAny().orElse(null); + //如果不存在班制, 创建新的班制 + if(dingShift == null){ + //如果本地不存在, 直接创建新的 + dingShift = new DingShift(); + dingShift.setName(shiftDetail.getName()); + dingShift.setDingId(shiftDingId); + } + dingShift.setWorkHour(new BigDecimal(topShiftSettingVo.getWorkTimeMinutes()).divide(new BigDecimal(60), 2, java.math.BigDecimal.ROUND_HALF_UP).intValue()); + dingShift.setOnDutyCheckTime(DateUtils.parseDateToStr("HH:mm:ss",newOnDutyTopPunchVo.getCheckTime())); + dingShift.setOffDutyCheckTime(DateUtils.parseDateToStr("HH:mm:ss",newOffDutyTopPunchVo.getCheckTime())); + //通过三目判定, 如果id为空, 则走保存,如果存在id 则更新 + if((dingShift.getId() == null ? dingShiftService.save(dingShift) : dingShiftService.updateById(dingShift))){ + dingShiftGroupService.updateCheckTimeByShiftIdAndType(shiftDingId, newOnDutyTopPunchVo.getCheckType(), dingShift.getOnDutyCheckTime()); + dingShiftGroupService.updateCheckTimeByShiftIdAndType(shiftDingId, newOffDutyTopPunchVo.getCheckType(), dingShift.getOffDutyCheckTime()); + } + } + } +} diff --git a/evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackUserAddOrgExchangeProcessor.java b/evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackUserAddOrgExchangeProcessor.java index 70ca2b8..36a836c 100644 --- a/evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackUserAddOrgExchangeProcessor.java +++ b/evo-admin/src/main/java/com/evo/ding/processor/callback/impl/DingCallBackUserAddOrgExchangeProcessor.java @@ -37,8 +37,7 @@ public class DingCallBackUserAddOrgExchangeProcessor implements DingCallBackExch JSONArray dataList = json.getJSONArray("userId"); if(dataList!= null && dataList.size() > 0){ dataList.forEach(data->{ - DingUtils.getUserInfoByUserId(String.valueOf(data)); - sysStaffService.sysStaffLeaveByDingUserId(String.valueOf(data)); + sysStaffService.insertSysStaffByDingDing(DingUtils.getUserInfoByUserId(String.valueOf(data))); }); } } diff --git a/evo-admin/src/main/java/com/evo/ding/processor/instance/impl/InstanceChangeRechargeCardExchangeProcessor.java b/evo-admin/src/main/java/com/evo/ding/processor/instance/impl/InstanceChangeRechargeCardExchangeProcessor.java index 63e7fb2..4c2e36a 100644 --- a/evo-admin/src/main/java/com/evo/ding/processor/instance/impl/InstanceChangeRechargeCardExchangeProcessor.java +++ b/evo-admin/src/main/java/com/evo/ding/processor/instance/impl/InstanceChangeRechargeCardExchangeProcessor.java @@ -3,6 +3,7 @@ package com.evo.ding.processor.instance.impl; import com.alibaba.fastjson2.JSONObject; import com.aliyun.dingtalkworkflow_1_0.models.GetProcessInstanceResponseBody; import com.evo.common.utils.DateUtils; +import com.evo.common.utils.ParamUtils; import com.evo.common.utils.StringUtils; import com.evo.ding.DingUtils; import com.evo.ding.domain.DingShiftGroup; @@ -62,7 +63,7 @@ public class InstanceChangeRechargeCardExchangeProcessor implements InstanceChan dingsShiftGroup = getDingShiftGroupService().selectByGroupIdAndTypeAndCheckTime(planResultObject.getString("group_id"), checkType, formatPlanCheckTime); Date date= DateUtils.parseDate(bkTime, "yyyy-MM-dd HH:mm"); //生成补卡记录信息 - getIRzAttendanceService().addRzOverTime(json.toString(), sysStaff, dingsShiftGroup, checkType, date, date, "/", "钉钉补卡-"+bkYi); + getIRzAttendanceService().addRzOverTime(json.toString(), sysStaff, dingsShiftGroup, checkType, date, date, "/", "钉钉补卡-"+bkYi, ParamUtils.getDebiting()); } } } catch (ParseException e) { diff --git a/evo-admin/src/main/java/com/evo/ding/service/DingGroupService.java b/evo-admin/src/main/java/com/evo/ding/service/DingGroupService.java new file mode 100644 index 0000000..7f236e2 --- /dev/null +++ b/evo-admin/src/main/java/com/evo/ding/service/DingGroupService.java @@ -0,0 +1,18 @@ +package com.evo.ding.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.evo.ding.domain.DingGroup; +import com.evo.ding.domain.DingShift; + +/** + * DingsShiftService + * + * @author andy.shi + * @ClassName:DingsShiftService + * @date: 2026年03月11日 15:55 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +public interface DingGroupService extends IService { + + public DingGroup selectByDingId(String dingId); +} diff --git a/evo-admin/src/main/java/com/evo/ding/service/DingShiftGroupService.java b/evo-admin/src/main/java/com/evo/ding/service/DingShiftGroupService.java index 6128a32..09f6e4b 100644 --- a/evo-admin/src/main/java/com/evo/ding/service/DingShiftGroupService.java +++ b/evo-admin/src/main/java/com/evo/ding/service/DingShiftGroupService.java @@ -1,8 +1,11 @@ package com.evo.ding.service; import com.baomidou.mybatisplus.extension.service.IService; +import com.evo.ding.domain.DingShift; import com.evo.ding.domain.DingShiftGroup; +import java.util.List; + /** * DingShiftGroupService * @@ -14,4 +17,10 @@ import com.evo.ding.domain.DingShiftGroup; public interface DingShiftGroupService extends IService { DingShiftGroup selectByGroupIdAndTypeAndCheckTime(String groupId, String type, String checkTime); + + int updateCheckTimeByShiftIdAndType(String shiftId, String type, String checkTime); + + List selectListByGroupId(String groupId); + + public List selectList(DingShiftGroup dingShiftGroup); } diff --git a/evo-admin/src/main/java/com/evo/ding/service/DingShiftService.java b/evo-admin/src/main/java/com/evo/ding/service/DingShiftService.java index cc40ef0..950c4fc 100644 --- a/evo-admin/src/main/java/com/evo/ding/service/DingShiftService.java +++ b/evo-admin/src/main/java/com/evo/ding/service/DingShiftService.java @@ -2,6 +2,9 @@ package com.evo.ding.service; import com.baomidou.mybatisplus.extension.service.IService; import com.evo.ding.domain.DingShift; +import com.evo.system.domain.SysStaff; + +import java.util.List; /** * DingsShiftService @@ -14,4 +17,6 @@ import com.evo.ding.domain.DingShift; public interface DingShiftService extends IService { public DingShift selectByDingId(String dingId); + + public List selectList(DingShift dingShift); } diff --git a/evo-admin/src/main/java/com/evo/ding/service/impl/DingGroupServiceImpl.java b/evo-admin/src/main/java/com/evo/ding/service/impl/DingGroupServiceImpl.java new file mode 100644 index 0000000..39f6e9a --- /dev/null +++ b/evo-admin/src/main/java/com/evo/ding/service/impl/DingGroupServiceImpl.java @@ -0,0 +1,26 @@ +package com.evo.ding.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.evo.ding.domain.DingGroup; +import com.evo.ding.domain.DingShift; +import com.evo.ding.mapper.DingGroupMapper; +import com.evo.ding.mapper.DingShiftMapper; +import com.evo.ding.service.DingGroupService; +import com.evo.ding.service.DingShiftService; +import org.springframework.stereotype.Service; + +/** + * DingShiftGroupServiceImpl + * + * @author andy.shi + * @ClassName:DingShiftGroupServiceImpl + * @date: 2026年03月11日 15:49 + * @remark: 开发人员联系方式 1042025947@qq.com/微信同步 + */ +@Service +public class DingGroupServiceImpl extends ServiceImpl implements DingGroupService { + @Override + public DingGroup selectByDingId(String dingId) { + return getBaseMapper().selectByDingId(dingId); + } +} diff --git a/evo-admin/src/main/java/com/evo/ding/service/impl/DingShiftGroupServiceImpl.java b/evo-admin/src/main/java/com/evo/ding/service/impl/DingShiftGroupServiceImpl.java index 97edfa9..7063e3a 100644 --- a/evo-admin/src/main/java/com/evo/ding/service/impl/DingShiftGroupServiceImpl.java +++ b/evo-admin/src/main/java/com/evo/ding/service/impl/DingShiftGroupServiceImpl.java @@ -1,11 +1,14 @@ package com.evo.ding.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.evo.ding.domain.DingShiftGroup; import com.evo.ding.mapper.DingShiftGroupMapper; import com.evo.ding.service.DingShiftGroupService; import org.springframework.stereotype.Service; +import java.util.List; + /** * DingShiftGroupServiceImpl * @@ -20,4 +23,19 @@ public class DingShiftGroupServiceImpl extends ServiceImpl selectListByGroupId(String groupId) { + return list(new LambdaQueryWrapper().eq(DingShiftGroup::getGroupId, groupId)); + } + + @Override + public List selectList(DingShiftGroup dingShiftGroup) { + return getBaseMapper().selectList(dingShiftGroup); + } } diff --git a/evo-admin/src/main/java/com/evo/ding/service/impl/DingShiftServiceImpl.java b/evo-admin/src/main/java/com/evo/ding/service/impl/DingShiftServiceImpl.java index ba30bb8..8e4cabc 100644 --- a/evo-admin/src/main/java/com/evo/ding/service/impl/DingShiftServiceImpl.java +++ b/evo-admin/src/main/java/com/evo/ding/service/impl/DingShiftServiceImpl.java @@ -9,6 +9,8 @@ import com.evo.ding.service.DingShiftGroupService; import com.evo.ding.service.DingShiftService; import org.springframework.stereotype.Service; +import java.util.List; + /** * DingShiftGroupServiceImpl * @@ -23,4 +25,9 @@ public class DingShiftServiceImpl extends ServiceImpl selectList(DingShift dingShift) { + return getBaseMapper().selectList(dingShift); + } } diff --git a/evo-admin/src/main/java/com/evo/personnelMatters/domain/RzLeaveDetail.java b/evo-admin/src/main/java/com/evo/personnelMatters/domain/RzLeaveDetail.java index 5d8371a..e2b6592 100644 --- a/evo-admin/src/main/java/com/evo/personnelMatters/domain/RzLeaveDetail.java +++ b/evo-admin/src/main/java/com/evo/personnelMatters/domain/RzLeaveDetail.java @@ -49,7 +49,8 @@ public class RzLeaveDetail extends BaseEntity private String remarks; private String delFlag; - + //钉钉审批id + private String processInstanceId; /*** * 扩展字段 */ diff --git a/evo-admin/src/main/java/com/evo/personnelMatters/mapper/RzLeaveDetailMapper.java b/evo-admin/src/main/java/com/evo/personnelMatters/mapper/RzLeaveDetailMapper.java index 776f227..ab75898 100644 --- a/evo-admin/src/main/java/com/evo/personnelMatters/mapper/RzLeaveDetailMapper.java +++ b/evo-admin/src/main/java/com/evo/personnelMatters/mapper/RzLeaveDetailMapper.java @@ -1,6 +1,7 @@ package com.evo.personnelMatters.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.evo.personnelMatters.domain.RzLeave; import com.evo.personnelMatters.domain.RzLeaveDetail; import org.apache.ibatis.annotations.Param; @@ -84,4 +85,5 @@ public interface RzLeaveDetailMapper extends BaseMapper */ Long selectLeaveHourByUserIdAndDateAndType(@Param("userId") Long userId,@Param("date") Date date, @Param("type") Long type); + RzLeaveDetail selectRzLeaveDetailByProcessInstanceId(@Param("processInstanceId") String processInstanceId); } diff --git a/evo-admin/src/main/java/com/evo/personnelMatters/service/IRzLeaveDetailService.java b/evo-admin/src/main/java/com/evo/personnelMatters/service/IRzLeaveDetailService.java index 4a4aa02..74d7a01 100644 --- a/evo-admin/src/main/java/com/evo/personnelMatters/service/IRzLeaveDetailService.java +++ b/evo-admin/src/main/java/com/evo/personnelMatters/service/IRzLeaveDetailService.java @@ -1,6 +1,7 @@ package com.evo.personnelMatters.service; import com.evo.common.core.domain.AjaxResult; +import com.evo.personnelMatters.domain.RzLeave; import com.evo.personnelMatters.domain.RzLeaveDetail; import java.util.List; @@ -52,4 +53,6 @@ public interface IRzLeaveDetailService public AjaxResult deleteRzLeaveDetailById(Long id); public RzLeaveDetail calculationLeaveHour(RzLeaveDetail rzLeaveDetail); + + public RzLeaveDetail selectRzLeaveDetailByProcessInstanceId(String processInstanceId); } diff --git a/evo-admin/src/main/java/com/evo/personnelMatters/service/impl/RzLeaveDetailServiceImpl.java b/evo-admin/src/main/java/com/evo/personnelMatters/service/impl/RzLeaveDetailServiceImpl.java index df63f39..49ec8e0 100644 --- a/evo-admin/src/main/java/com/evo/personnelMatters/service/impl/RzLeaveDetailServiceImpl.java +++ b/evo-admin/src/main/java/com/evo/personnelMatters/service/impl/RzLeaveDetailServiceImpl.java @@ -394,6 +394,11 @@ public class RzLeaveDetailServiceImpl extends ServiceImpl list = dingShiftService.selectList(dingShift); + return getDataTable(list); + } + + /** + * 查询考勤组信息 + */ + @GetMapping("/group/list") + public TableDataInfo list(DingShiftGroup dingShiftGroup){ + startPage(); + List list = dingShiftGroupService.selectList(dingShiftGroup); + return getDataTable(list); + } + +} diff --git a/evo-admin/src/main/java/com/evo/system/domain/SysStaff.java b/evo-admin/src/main/java/com/evo/system/domain/SysStaff.java index e084e96..07ce0b6 100644 --- a/evo-admin/src/main/java/com/evo/system/domain/SysStaff.java +++ b/evo-admin/src/main/java/com/evo/system/domain/SysStaff.java @@ -216,6 +216,8 @@ public class SysStaff extends BaseEntity private String extended; private String dingUserId; + //数据来源 1 平台, 2 钉钉 + private String source; public List getSubsidyList() { if(Collections.isEmpty(subsidyList) && StringUtils.isNotEmpty(subsidys)){ diff --git a/evo-admin/src/main/java/com/evo/system/service/ISysStaffService.java b/evo-admin/src/main/java/com/evo/system/service/ISysStaffService.java index 89a1a7c..38d33a5 100644 --- a/evo-admin/src/main/java/com/evo/system/service/ISysStaffService.java +++ b/evo-admin/src/main/java/com/evo/system/service/ISysStaffService.java @@ -45,7 +45,7 @@ public interface ISysStaffService extends IService * @param result 员工管理 * @return 结果 */ - public void insertSysStaffByDingDing(String result); + public void insertSysStaffByDingDing(String dingUserInfo); /** * 修改员工管理 * diff --git a/evo-admin/src/main/java/com/evo/system/service/impl/SysStaffServiceImpl.java b/evo-admin/src/main/java/com/evo/system/service/impl/SysStaffServiceImpl.java index 76ba1b6..af185a4 100644 --- a/evo-admin/src/main/java/com/evo/system/service/impl/SysStaffServiceImpl.java +++ b/evo-admin/src/main/java/com/evo/system/service/impl/SysStaffServiceImpl.java @@ -150,7 +150,7 @@ public class SysStaffServiceImpl extends ServiceImpl i sysStaff.setCreateTime(DateUtils.getNowDate()); sysStaff.setCreateBy(SecurityUtils.getUsername()); sysStaff.setDelFlag(Constants.DELETE_FLAG_0); - + sysStaff.setSource(Constants.SOURCE_PT); if(CollectionUtils.isNotEmpty(sysStaff.getSubsidyList())){ sysStaff.setSubsidys(sysStaff.getSubsidyList().stream().map(String::valueOf).collect(Collectors.joining(","))); } @@ -182,66 +182,56 @@ public class SysStaffServiceImpl extends ServiceImpl i } @Override - public void insertSysStaffByDingDing(String result) { + public void insertSysStaffByDingDing(String dingUserInfo) { - JSONObject dingResult = JSONObject.parseObject(result); - dingResult.getJSONObject("result"); + JSONObject dingResult = JSONObject.parseObject(dingUserInfo); + JSONObject result = dingResult.getJSONObject("result"); + String mobile = result.getString("mobile"); + String name = result.getString("name"); + //钉钉推送, 只能通过名称+手机号核查是否存在. 如果录入过, 改为重新入职 + SysStaff sysStaff = getOne(new LambdaQueryWrapper().eq(SysStaff::getPhone, mobile).eq(SysStaff::getName,name), false); + if(sysStaff != null){ + //如果用户不为空, 并且状态为离职 + if(sysStaff.getStatus().equals("-1")){ + //重新做员工入职 + if(StringUtils.isEmpty(sysStaff.getDingUserId())){ + sysStaff.setDingUserId(result.getString("userid")); + getBaseMapper().updateById(sysStaff); + } + //做员工重新入职 + reEmployment(sysStaff.getUserId()); + } + //不为空, 还不是离职. 不做处理, 当前员工已经存在 + log.info("当前员工信息已经存在, 无法再次入库, 钉钉返回员工信息为{}", dingUserInfo); + return; + } -// //根据省份证号查询是否已经录入 -// SysStaff p_staff = getBaseMapper().queryysStaffByIdCard(sysStaff.getIdCard()); -// if(StringUtils.isNotNull(p_staff)){ -// return AjaxResult.error("此人录入过!!"); -// } -// //判断是否是领导,是反写部门信息 -// if("是".equals(sysStaff.getIsLeader())){ -// //根据ID查询部门信息 -// SysDept sysDept = deptMapper.selectDeptById(sysStaff.getDeptId()); -// sysDept.setPhone(sysStaff.getPhone()); -// sysDept.setLeader(sysStaff.getName()); -// int i = deptMapper.updateDept(sysDept); -// if(i < 1){ -// return AjaxResult.error("更新部门负责人失败"); -// } -// } -// //根据省份证确定性别和年龄 -// sysStaff.setAge(Long.parseLong(new SimpleDateFormat("yyyy").format(new Date())) - Long.parseLong(sysStaff.getIdCard().substring(6,10))); -// //性别 -// sysStaff.setSex((Integer.parseInt(sysStaff.getIdCard().substring(16,17)) % 2 == 0) ? "1" : "0"); -// //员工编码 -// sysStaff.setCode(getCodeByCompanyName()); -// sysStaff.setSeniority(0l); -// sysStaff.setStatus(Constants.JOB_STATIS_0); -// sysStaff.setCreateTime(DateUtils.getNowDate()); -// sysStaff.setCreateBy(SecurityUtils.getUsername()); -// sysStaff.setDelFlag(Constants.DELETE_FLAG_0); -// -// if(CollectionUtils.isNotEmpty(sysStaff.getSubsidyList())){ -// sysStaff.setSubsidys(sysStaff.getSubsidyList().stream().map(String::valueOf).collect(Collectors.joining(","))); -// } -// //打卡位置改为多选 -// if(CollectionUtils.isNotEmpty(sysStaff.getTimeClockList())){ -// sysStaff.setTimeClock(sysStaff.getTimeClockList().stream().collect(Collectors.joining(","))); -// } -// //新增员工信息到金蝶 -// if(StringUtils.isNotEmpty(sysStaff.getJobCode())){ -// sysStaff.setExtended(KingdeeRequestUtils.employeeSave(Collections.asMap("userName", sysStaff.getName(), "userCode", sysStaff.getCode(), "jobCode", sysStaff.getJobCode().split("_")[0],"deptCode", sysStaff.getJobCode().split("_")[1]))); -// }else if(StringUtils.isEmpty(sysStaff.getJobCode())){ -// sysStaff.setExtended(KingdeeRequestUtils.employeeSaveEmptyJob(Collections.asMap("userName", sysStaff.getName(), "userCode", sysStaff.getCode()))); -// } -// -// int i = getBaseMapper().insertSysStaff(sysStaff); -// if(i < 1){ -// return AjaxResult.error("员工添加失败"); -// } -// //员工详情 -// createStaffDetail(sysStaff); -// //打卡统计,打卡详情 -// rzAttendanceStatisticalService.createRzAttendance(sysStaff, Collections.emptyList(), null); -// //处理餐饮信息 -// rzRestaurantStatisticsService.createRestaurantStatistics(sysStaff, DateUtils.getNowDate()); -// //处理考勤机相关信息 -// initCheckDevice(sysStaff); + //创建新的用户 + sysStaff = new SysStaff(); + sysStaff.setName(name); + sysStaff.setPhone(mobile); + sysStaff.setDingUserId(dingResult.getString("userid")); + //员工编码 + sysStaff.setCode(getCodeByCompanyName()); + sysStaff.setSeniority(0l); + sysStaff.setStatus(Constants.JOB_STATIS_0); + sysStaff.setCreateTime(DateUtils.getNowDate()); + sysStaff.setCreateBy(SecurityUtils.getUsername()); + sysStaff.setDelFlag(Constants.DELETE_FLAG_0); + sysStaff.setSource(Constants.SOURCE_DING); + + int i = getBaseMapper().insertSysStaff(sysStaff); + if(i < 1){ + log.error("员工添加失败, 钉钉数据:{}",dingUserInfo); + return; + } + //员工详情 + createStaffDetail(sysStaff); + //打卡统计,打卡详情 + rzAttendanceStatisticalService.createRzAttendance(sysStaff, Collections.emptyList(), null); + //处理餐饮信息 + rzRestaurantStatisticsService.createRestaurantStatistics(sysStaff, DateUtils.getNowDate()); } private void initCheckDevice(SysStaff sysStaff){ @@ -301,6 +291,13 @@ public class SysStaffServiceImpl extends ServiceImpl i public AjaxResult updateSysStaff(SysStaff sysStaff) { + if(StringUtils.isNotEmpty(sysStaff.getSource()) && sysStaff.getSource().equals(Constants.SOURCE_DING) && StringUtils.isEmpty(sysStaff.getSex())){ + //根据省份证确定性别和年龄 + sysStaff.setAge(Long.parseLong(new SimpleDateFormat("yyyy").format(new Date())) - Long.parseLong(sysStaff.getIdCard().substring(6,10))); + //性别 + sysStaff.setSex((Integer.parseInt(sysStaff.getIdCard().substring(16,17)) % 2 == 0) ? "1" : "0"); + } + if(CollectionUtils.isNotEmpty(sysStaff.getSubsidyList())){ sysStaff.setSubsidys(sysStaff.getSubsidyList().stream().map(String::valueOf).collect(Collectors.joining(","))); } diff --git a/evo-admin/src/main/resources/mapper/ding/DingGroupMapper.xml b/evo-admin/src/main/resources/mapper/ding/DingGroupMapper.xml new file mode 100644 index 0000000..9cbb020 --- /dev/null +++ b/evo-admin/src/main/resources/mapper/ding/DingGroupMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + select id, name, ding_Id, group_key from ding_group + + + diff --git a/evo-admin/src/main/resources/mapper/ding/DingShiftGroupMapper.xml b/evo-admin/src/main/resources/mapper/ding/DingShiftGroupMapper.xml index 1ea3a38..33f8d27 100644 --- a/evo-admin/src/main/resources/mapper/ding/DingShiftGroupMapper.xml +++ b/evo-admin/src/main/resources/mapper/ding/DingShiftGroupMapper.xml @@ -26,6 +26,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where group_id =#{groupId} and type = #{type} and check_time = #{checkTime} + + update ding_shift_group set check_time = #{checkTime} where shift_id=#{shiftId} and type = #{type} + + + + diff --git a/evo-admin/src/main/resources/mapper/ding/DingShiftMapper.xml b/evo-admin/src/main/resources/mapper/ding/DingShiftMapper.xml index 90dea11..0d99066 100644 --- a/evo-admin/src/main/resources/mapper/ding/DingShiftMapper.xml +++ b/evo-admin/src/main/resources/mapper/ding/DingShiftMapper.xml @@ -9,12 +9,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - - select id, name, ding_Id, work_Hour, overtime_Work, deduction_Hour from ding_shift + select id, name, ding_Id, work_Hour, on_duty_check_time, off_duty_check_time from ding_shift + + + + + diff --git a/evo-admin/src/main/resources/mapper/personnelMatters/RzLeaveDetailMapper.xml b/evo-admin/src/main/resources/mapper/personnelMatters/RzLeaveDetailMapper.xml index ea0d6fb..8b9b741 100644 --- a/evo-admin/src/main/resources/mapper/personnelMatters/RzLeaveDetailMapper.xml +++ b/evo-admin/src/main/resources/mapper/personnelMatters/RzLeaveDetailMapper.xml @@ -125,7 +125,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where ld.del_flag = '0' and ld.type = #{type} and l.user_id=#{userId} and JSON_EXTRACT(extension,CONCAT('$.',CONCAT("month",DATE_FORMAT(#{date},'%m'))))=DATE_FORMAT(#{date},'%Y-%m') - + diff --git a/evo-admin/src/main/resources/mapper/system/SysStaffMapper.xml b/evo-admin/src/main/resources/mapper/system/SysStaffMapper.xml index ea24ea7..152a567 100644 --- a/evo-admin/src/main/resources/mapper/system/SysStaffMapper.xml +++ b/evo-admin/src/main/resources/mapper/system/SysStaffMapper.xml @@ -51,6 +51,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -59,7 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" quit_date, contract_start, contract_end, contract_type, social_type, seniority, is_overtime_pay, zs_flag, secrecy, injury, insurance, introducer, clock_in, status, wages_ratio_date, remarks, del_flag, create_by, create_time, update_by, - update_time, image_url,time_clock,subsidys, job_code, extended, openid, ding_user_id + update_time, image_url,time_clock,subsidys, job_code, extended, openid, ding_user_id, source from sys_staff @@ -149,6 +150,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" job_code, extended, openid, + source, @@ -199,6 +201,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{jobCode}, #{extended}, #{openid}, + #{source},