Browse Source

1、7627-oa请假-年假审批完成后扣减

dongpo 6 months ago
parent
commit
bb2cf76589

+ 46 - 2
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/leave/OaLeaveServiceImpl.java

@@ -45,6 +45,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -55,6 +56,7 @@ import java.util.Objects;
 import java.util.stream.Collectors;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.attendance.enums.ErrorCodeConstants.ATTENDANCE_EMAINING_ANNUAL_LEAVE_IS_INSUFFICIENT;
 import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.OA_LEAVE_NOT_EXISTS;
 
 /**
@@ -159,6 +161,17 @@ public class OaLeaveServiceImpl implements OaLeaveService {
             throw exception(ErrorCodeConstants.OA_EMPLOYEE_NOT_EXISTS);
         }
 
+        if ("年假".equals(commitReqVO.getLeaveType())) {
+            // 获取剩余年假和申请天数
+            BigDecimal remainingAnnualLeave = loginEmployee.getRemainingAnnualLeave();
+            String requestDayStr = commitReqVO.getDay(); // 更清晰的变量名
+            BigDecimal requestDays = new BigDecimal(requestDayStr); // 假设getDay返回的是可以解析为double的字符串
+            // 检查剩余年假是否足够
+            if (remainingAnnualLeave.compareTo(requestDays) < 0) {
+                throw exception(ATTENDANCE_EMAINING_ANNUAL_LEAVE_IS_INSUFFICIENT);
+            }
+        }
+
 
         OaLeaveDO oaLeave = BeanUtils.toBean(commitReqVO, OaLeaveDO.class);
         if (StringUtils.isBlank(oaLeave.getLeaveId())) {
@@ -269,11 +282,30 @@ public class OaLeaveServiceImpl implements OaLeaveService {
         if (currentTask == null) {
             throw exception(ErrorCodeConstants.TASK_NOT_EXISTS);
         }
-        // 先更新为审批中
-        taskService.setVariable(currentTask.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_AUDITING);
         LambdaQueryWrapper<OaLeaveDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         lambdaQueryWrapper.eq(OaLeaveDO::getProcInstId, currentTask.getProcessInstanceId());
         OaLeaveDO oaLeave = oaLeaveMapper.selectOne(lambdaQueryWrapper);
+        if (oaLeave == null) {
+            throw exception(ErrorCodeConstants.OA_LEAVE_NOT_EXISTS);
+        }
+
+        if ("年假".equals(oaLeave.getLeaveType())) {
+            // 请假人
+            Long employeeId = oaLeave.getEmployeeId();
+            EmployeeRespDTO employee = employeeApi.getEmployeeById(employeeId);
+            // 获取剩余年假和申请天数
+            BigDecimal remainingAnnualLeave = employee.getRemainingAnnualLeave();
+            String requestDayStr = oaLeave.getDay(); // 更清晰的变量名
+            BigDecimal requestDays = new BigDecimal(requestDayStr); // 假设getDay返回的是可以解析为double的字符串
+            // 检查剩余年假是否足够
+            if (remainingAnnualLeave.compareTo(requestDays) < 0) {
+                throw exception(ATTENDANCE_EMAINING_ANNUAL_LEAVE_IS_INSUFFICIENT);
+            }
+        }
+
+        // 先更新为审批中
+        taskService.setVariable(currentTask.getId(), BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS, DictDataConstants.OA_AUDIT_STATUS_AUDITING);
+
         // 如果是最后一个人审批同意,设置流程审批状态为已审核
         String[] auditPersons = oaLeave.getStartUserSelectAssignees().split(",");
         String lastAuditPerson = Arrays.stream(auditPersons)
@@ -480,6 +512,18 @@ public class OaLeaveServiceImpl implements OaLeaveService {
             throw exception(ErrorCodeConstants.OA_EMPLOYEE_NOT_EXISTS);
         }
 
+        if ("年假".equals(reCommitReqVO.getLeaveType())) {
+            // 获取剩余年假和申请天数
+            BigDecimal remainingAnnualLeave = loginEmployee.getRemainingAnnualLeave();
+            String requestDayStr = reCommitReqVO.getDay(); // 更清晰的变量名
+            BigDecimal requestDays = new BigDecimal(requestDayStr); // 假设getDay返回的是可以解析为double的字符串
+            // 检查剩余年假是否足够
+            if (remainingAnnualLeave.compareTo(requestDays) < 0) {
+                throw exception(ATTENDANCE_EMAINING_ANNUAL_LEAVE_IS_INSUFFICIENT);
+            }
+        }
+
+
         OaLeaveDO oaLeaveNew = BeanUtils.toBean(reCommitReqVO, OaLeaveDO.class);
         OaLeaveDO oaLeaveOld = validateOaLeaveExists(oaLeaveNew.getId());
         oaLeaveNew.setLeaveId(oaLeaveOld.getLeaveId())

+ 25 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/leave/AttendanceLeaveServiceImpl.java

@@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.employee.api.dto.EmployeeSaveReqDTO;
 import cn.iocoder.yudao.module.infra.api.file.FileApi;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
@@ -98,9 +99,33 @@ public class AttendanceLeaveServiceImpl implements AttendanceLeaveService {
 
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Long createLeaveInfoAfterAudit(AttendanceLeaveCreateReqDTO leaveCreateReqDTO) {
         AttendanceLeaveDO attendanceLeaveDO = BeanUtils.toBean(leaveCreateReqDTO, AttendanceLeaveDO.class);
         leaveMapper.insert(attendanceLeaveDO);
+        // 请假人信息
+        EmployeeRespDTO employee = employeeApi.getEmployeeById(attendanceLeaveDO.getEmployeeId());
+        if ("年假".equals(attendanceLeaveDO.getLeaveType())) {
+            // 获取剩余年假和申请天数
+            BigDecimal remainingAnnualLeave = employee.getRemainingAnnualLeave();
+            String requestDayStr = attendanceLeaveDO.getDay(); // 更清晰的变量名
+            BigDecimal requestDays = new BigDecimal(requestDayStr); // 假设getDay返回的是可以解析为double的字符串
+            // 检查剩余年假是否足够
+            if (remainingAnnualLeave.compareTo(requestDays) < 0) {
+                throw exception(ATTENDANCE_EMAINING_ANNUAL_LEAVE_IS_INSUFFICIENT);
+            }
+            // 如果剩余年假足够,进行扣减操作
+            employee.setRemainingAnnualLeave(remainingAnnualLeave.subtract(requestDays));
+            employee.setUsedAnnualLeave(employee.getUsedAnnualLeave().add(requestDays));
+            // 创建一个DTO来更新员工信息(假设EmployeeSaveReqDTO已经包含了所有必要的字段)
+            EmployeeSaveReqDTO updateObj = BeanUtils.toBean(employee, EmployeeSaveReqDTO.class);
+            // 更新员工信息
+            try {
+                employeeApi.updateEmployee(updateObj);
+            } catch (Exception e) {
+                throw exception(ATTENDANCE_UPDATING_EMPLOYEE_INFO_ERROR);
+            }
+        }
         return attendanceLeaveDO.getId();
     }