diff --git a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
index ff1f5310..4cdd6393 100644
--- a/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
+++ b/yudao-module-bpm/yudao-module-bpm-api/src/main/java/cn/iocoder/yudao/module/bpm/enums/ErrorCodeConstants.java
@@ -28,7 +28,7 @@ public interface ErrorCodeConstants {
ErrorCode INSUFFICIENT_LEAVE_BALANCE = new ErrorCode(1_009_001_013, "假期余额不足");
ErrorCode NO_NEED_TO_APPLY_FOR_OVERTIME_IF_NOT_IN_THE_ATTENDANCE_GROUP = new ErrorCode(1_009_001_014, "不在考勤组内无需申请加班");
ErrorCode EXCEPTION_OCCURRED_WHILE_OBTAINING_OVERTIME_SETTINGS = new ErrorCode(1_009_001_015, "获取加班设置出现异常");
- ErrorCode NO_OVERTIME_ALLOWED = new ErrorCode(1_009_001_016, "不允许加班");
+ ErrorCode ABNORMAL_ACCESS_TO_ATTENDANCE_RECORDS = new ErrorCode(1_009_001_016, "获取考勤记录异常");
ErrorCode OA_REIMBURSEMENT_NOT_EXISTS = new ErrorCode(1_009_001_100, "报销申请不存在");
ErrorCode OA_EVECTION_NOT_EXISTS = new ErrorCode(1_009_001_101, "出差申请不存在");
ErrorCode OA_SEAL_NOT_EXISTS = new ErrorCode(1_009_001_102, "用章申请不存在");
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/pom.xml b/yudao-module-bpm/yudao-module-bpm-biz/pom.xml
index 9b4125d2..64054212 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/pom.xml
+++ b/yudao-module-bpm/yudao-module-bpm-biz/pom.xml
@@ -72,7 +72,11 @@
cn.iocoder.cloud
yudao-spring-boot-starter-redis
-
+
+
+ cn.iocoder.cloud
+ yudao-spring-boot-starter-job
+
cn.iocoder.cloud
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAOvertimeController.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAOvertimeController.java
index 335fc5b1..d9ea8e6c 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAOvertimeController.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/BpmOAOvertimeController.java
@@ -1,10 +1,14 @@
package cn.iocoder.yudao.module.bpm.controller.admin.oa;
+import cn.hutool.core.bean.BeanUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime.BpmOAOvertimeCreateReqVO;
+import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime.BpmOAOvertimeItemVO;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime.BpmOAOvertimeRespVO;
import cn.iocoder.yudao.module.bpm.convert.oa.BpmOAOvertimeConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeItemDO;
+import cn.iocoder.yudao.module.bpm.service.oa.BpmOAOvertimeItemService;
import cn.iocoder.yudao.module.bpm.service.oa.BpmOAOvertimeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -14,6 +18,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
+import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@@ -22,7 +27,6 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
* OA 加班申请 Controller
*
* @author 符溶馨
-
*/
@Tag(name = "管理后台 - OA 加班申请")
@RestController
@@ -32,6 +36,8 @@ public class BpmOAOvertimeController {
@Resource
private BpmOAOvertimeService overtimeService;
+ @Resource
+ private BpmOAOvertimeItemService overtimeItemService;
@PostMapping("/create")
@Operation(summary = "创建请求申请")
@@ -44,19 +50,21 @@ public class BpmOAOvertimeController {
@Operation(summary = "获得加班申请")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult getOvertime(@RequestParam("id") Long id) {
-
BpmOAOvertimeDO overtime = overtimeService.getOvertime(id);
-
- return success(BpmOAOvertimeConvert.INSTANCE.convert(overtime));
+ List itemDOS = overtimeItemService.getByOvertimeId(id);
+ List overtimeDateTimeVOS = BeanUtil.copyToList(itemDOS, BpmOAOvertimeItemVO.class);
+ BpmOAOvertimeRespVO vo = BpmOAOvertimeConvert.INSTANCE.convert(overtime);
+ return success(vo.setOvertimeDateTimeVOS(overtimeDateTimeVOS));
}
@GetMapping("/getByProcessInstanceId")
@Operation(summary = "获得加班申请")
@Parameter(name = "processInstanceId", description = "流程实例编号", required = true, example = "1024")
public CommonResult getByProcessInstanceId(@RequestParam("processInstanceId") String processInstanceId) {
-
BpmOAOvertimeDO overtime = overtimeService.getByProcessInstanceId(processInstanceId);
-
- return success(BpmOAOvertimeConvert.INSTANCE.convert(overtime));
+ List itemDOS = overtimeItemService.getByOvertimeId(overtime.getId());
+ List overtimeDateTimeVOS = BeanUtil.copyToList(itemDOS, BpmOAOvertimeItemVO.class);
+ BpmOAOvertimeRespVO vo = BpmOAOvertimeConvert.INSTANCE.convert(overtime);
+ return success(vo.setOvertimeDateTimeVOS(overtimeDateTimeVOS));
}
}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/overtime/BpmOAOvertimeRespVO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/overtime/BpmOAOvertimeRespVO.java
index d722cb26..2ae57b5f 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/overtime/BpmOAOvertimeRespVO.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/overtime/BpmOAOvertimeRespVO.java
@@ -38,9 +38,13 @@ public class BpmOAOvertimeRespVO extends BpmOABaseRespVO {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime endTime;
- @Schema(description = "加班时长", requiredMode = Schema.RequiredMode.REQUIRED)
- @NotNull(message = "加班时长不能为空")
- private BigDecimal timeLength;
+ @Schema(description = "加班日期时间列表", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "加班日期时间列表")
+ private List overtimeDateTimeVOS;
+
+ @Schema(description = "加班总时长", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "加班总时长不能为空")
+ private BigDecimal totalTimeLength;
@Schema(description = "上传文件", requiredMode = Schema.RequiredMode.REQUIRED)
private List fileItems;
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOAOvertimeDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOAOvertimeDO.java
index d8ebc506..f88a0c2e 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOAOvertimeDO.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOAOvertimeDO.java
@@ -62,6 +62,11 @@ public class BpmOAOvertimeDO extends BaseDO {
*/
private BigDecimal timeLength;
+ /**
+ * 是否结算(0否 1是)
+ */
+ private Integer settlementFlag;
+
/**
* 出差的结果
*
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOAOvertimeItemDO.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOAOvertimeItemDO.java
index 15009b64..05f550f5 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOAOvertimeItemDO.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/dal/dataobject/oa/BpmOAOvertimeItemDO.java
@@ -1,13 +1,12 @@
package cn.iocoder.yudao.module.bpm.dal.dataobject.oa;
-import lombok.*;
-import java.util.*;
-import java.math.BigDecimal;
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+import java.math.BigDecimal;
/**
* 加班申请子表 DO
@@ -46,7 +45,7 @@ public class BpmOAOvertimeItemDO extends BaseDO {
*/
private BigDecimal timeLength;
/**
- * 日期类型 类型 0工作日 1休息日 2节假日
+ * 日期类型 类型 1工作日 2休息日 3节假日
*/
private Integer dateType;
/**
@@ -54,8 +53,12 @@ public class BpmOAOvertimeItemDO extends BaseDO {
*/
private BigDecimal actualTimeLength;
/**
- * 是否结算(0否 1是)
+ * 实际加班时长单位
*/
- private Integer settlementFlag;
+ private Integer unit;
+ /**
+ * 实际加班时长(分钟)
+ */
+ private Long actualTimeLengthMinutes;
}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/rpc/config/RpcConfiguration.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/rpc/config/RpcConfiguration.java
index 5239308d..f00c1063 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/rpc/config/RpcConfiguration.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/framework/rpc/config/RpcConfiguration.java
@@ -20,13 +20,14 @@ import cn.iocoder.yudao.module.system.api.social.SocialClientApi;
import cn.iocoder.yudao.module.system.api.subscribe.SubscribeMessageSendApi;
import cn.iocoder.yudao.module.system.api.supplier.SupplierApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
+import cn.iocoder.yudao.module.system.api.workovertime.WorkOvertimeApi;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
@EnableFeignClients(clients = {FileApi.class, RoleApi.class, DeptApi.class, PostApi.class, AdminUserApi.class, SmsSendApi.class, DictDataApi.class, NotifyMessageSendApi.class,
SubscribeMessageSendApi.class, SocialClientApi.class, UsersExtApi.class, AttendanceApi.class, BankApi.class, ConfigApi.class, PositionApi.class, SupplierApi.class, AssetsApi.class, HolidayApi.class,
- AssetsTypeApi.class, AssetReceiveApi.class
+ AssetsTypeApi.class, AssetReceiveApi.class, WorkOvertimeApi.class
})
public class RpcConfiguration {
}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/handler/WorkOvertimeHandler.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/handler/WorkOvertimeHandler.java
new file mode 100644
index 00000000..17059642
--- /dev/null
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/handler/WorkOvertimeHandler.java
@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.bpm.handler;
+
+import cn.iocoder.yudao.module.bpm.service.workovertime.WorkOvertimeService;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @Author : AiKai
+ * @Description : 利用Spring的发现机制,将实现了IChannelLoginService的类都put到channelLoginServiceMap里面。
+ * 后面只需要根据channelType对应好 各个实现类的注解 如: @Component("sys") 就可以取出不同的业务实现类
+ **/
+@Service
+public class WorkOvertimeHandler {
+ private final Map workServiceMap = new ConcurrentHashMap<>();
+
+ public WorkOvertimeHandler(Map strategyMap) {
+ this.workServiceMap.clear();
+ strategyMap.forEach((k, v) -> this.workServiceMap.put(k, v));
+ }
+
+ public WorkOvertimeService getResource(String channelType) {
+ return workServiceMap.get(channelType);
+ }
+
+}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/handler/enums/WorkOvertimeEnum.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/handler/enums/WorkOvertimeEnum.java
new file mode 100644
index 00000000..2665191d
--- /dev/null
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/handler/enums/WorkOvertimeEnum.java
@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.bpm.handler.enums;
+
+public enum WorkOvertimeEnum {
+ WEEKDAY(1, "weekDay"),
+ REST_DAY(2, "restDay"),
+ HOLIDAY(3, "holiday"),
+ ;
+ private final Integer channelType;
+ private final String serverName;
+
+ WorkOvertimeEnum(Integer channelType, String name) {
+ this.channelType = channelType;
+ this.serverName = name;
+ }
+
+ public Integer getChannelType() {
+ return channelType;
+ }
+
+ public String getServerName() {
+ return serverName;
+ }
+
+ public static String getEnumServerName(Integer channelType) {
+ for (WorkOvertimeEnum value : WorkOvertimeEnum.values()) {
+ if (value.channelType.equals(channelType)) {
+ return value.serverName;
+ }
+ }
+ return null;
+ }
+}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/job/workovertime/WorkOvertimeJob.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/job/workovertime/WorkOvertimeJob.java
new file mode 100644
index 00000000..8031fae6
--- /dev/null
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/job/workovertime/WorkOvertimeJob.java
@@ -0,0 +1,63 @@
+package cn.iocoder.yudao.module.bpm.job.workovertime;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.iocoder.yudao.framework.tenant.core.job.TenantJob;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeItemDO;
+import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAOvertimeMapper;
+import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
+import cn.iocoder.yudao.module.bpm.service.oa.BpmOAOvertimeItemService;
+import cn.iocoder.yudao.module.bpm.service.oa.BpmOAOvertimeService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Component
+@Slf4j
+public class WorkOvertimeJob {
+
+ // TODO: 2024/11/04 - 每天凌晨2点执行
+
+ /**
+ * 加班定时任务
+ **/
+
+ @Resource
+ private BpmOAOvertimeService overtimeService;
+ @Resource
+ private BpmOAOvertimeMapper overtimeMapper;
+ @Resource
+ private BpmOAOvertimeItemService overtimeItemService;
+
+ @XxlJob("workOvertimeJob")
+ @TenantJob // --- ⚠️ 这个注解 会将租户列表拉出来 完了后逐个租户执行 定时任务需要注意
+ public ReturnT execute() throws Exception {
+ log.info("开始 加班定时任务");
+ LocalDateTime now = LocalDateTime.now();
+ List bpmOAOvertimeDOS = overtimeMapper.selectList(new LambdaQueryWrapper()
+ .eq(BpmOAOvertimeDO::getSettlementFlag, 0)
+ .eq(BpmOAOvertimeDO::getResult, BpmProcessInstanceResultEnum.APPROVE)
+ .ge(BpmOAOvertimeDO::getEndTime, now));
+ if (CollectionUtil.isNotEmpty(bpmOAOvertimeDOS)) {
+ List ids = bpmOAOvertimeDOS.stream().map(BpmOAOvertimeDO::getId).collect(Collectors.toList());
+ List items = overtimeItemService.getByOvertimeIds(ids);
+ Map> map = items.stream().collect(Collectors.groupingBy(BpmOAOvertimeItemDO::getOaOvertimeId));
+ for (BpmOAOvertimeDO bpmOAOvertimeDO : bpmOAOvertimeDOS) {
+ List bpmOAOvertimeItemDOS = map.get(bpmOAOvertimeDO.getId());
+ overtimeService.handlingOvertime(bpmOAOvertimeDO, bpmOAOvertimeItemDOS, now);
+ }
+ }
+ log.info("结束 加班定时任务");
+ // 返回执行成功
+ return ReturnT.SUCCESS;
+ }
+
+}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeItemService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeItemService.java
index ad786638..ecf9b9ee 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeItemService.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeItemService.java
@@ -18,4 +18,12 @@ public interface BpmOAOvertimeItemService {
* @return
*/
List getByOvertimeId(Long overtimeId);
+
+ /**
+ * 根据OA加班申请ids获取加班申请子表列表
+ *
+ * @param overtimeIds
+ * @return
+ */
+ List getByOvertimeIds(List overtimeIds);
}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeItemServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeItemServiceImpl.java
index fd154184..330f1792 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeItemServiceImpl.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeItemServiceImpl.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.bpm.service.oa;
+import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeItemDO;
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAOvertimeItemMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -7,6 +8,7 @@ import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
+import java.util.Collections;
import java.util.List;
/**
@@ -26,4 +28,13 @@ public class BpmOAOvertimeItemServiceImpl implements BpmOAOvertimeItemService {
return overtimeItemMapper.selectList(new LambdaQueryWrapper()
.eq(BpmOAOvertimeItemDO::getOaOvertimeId, overtimeId));
}
+
+ @Override
+ public List getByOvertimeIds(List overtimeIds) {
+ if (CollectionUtil.isEmpty(overtimeIds)) {
+ return Collections.emptyList();
+ }
+ return overtimeItemMapper.selectList(new LambdaQueryWrapper()
+ .in(BpmOAOvertimeItemDO::getOaOvertimeId, overtimeIds));
+ }
}
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeService.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeService.java
index 7ffc232c..ce225478 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeService.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeService.java
@@ -2,8 +2,12 @@ package cn.iocoder.yudao.module.bpm.service.oa;
import cn.iocoder.yudao.module.bpm.controller.admin.oa.vo.overtime.BpmOAOvertimeCreateReqVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeDO;
+import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeItemDO;
+import org.springframework.transaction.annotation.Transactional;
import javax.validation.Valid;
+import java.time.LocalDateTime;
+import java.util.List;
/**
* 加班申请 Service 接口
@@ -30,6 +34,9 @@ public interface BpmOAOvertimeService {
*/
void updateOvertimeResult(String processInstanceId, Long id, Integer result);
+ @Transactional(rollbackFor = Exception.class)
+ void handlingOvertime(BpmOAOvertimeDO bpmOAOvertimeDO, List items, LocalDateTime now);
+
/**
* 获得加班申请
*
diff --git a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeServiceImpl.java b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeServiceImpl.java
index cb4efeca..371f4b8b 100644
--- a/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeServiceImpl.java
+++ b/yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/service/oa/BpmOAOvertimeServiceImpl.java
@@ -16,13 +16,18 @@ import cn.iocoder.yudao.module.bpm.dal.dataobject.oa.BpmOAOvertimeItemDO;
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAOvertimeItemMapper;
import cn.iocoder.yudao.module.bpm.dal.mysql.oa.BpmOAOvertimeMapper;
import cn.iocoder.yudao.module.bpm.enums.task.BpmProcessInstanceResultEnum;
+import cn.iocoder.yudao.module.bpm.handler.WorkOvertimeHandler;
+import cn.iocoder.yudao.module.bpm.handler.enums.WorkOvertimeEnum;
import cn.iocoder.yudao.module.bpm.service.task.BpmHistoryProcessInstanceService;
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
+import cn.iocoder.yudao.module.bpm.service.workovertime.WorkOvertimeService;
import cn.iocoder.yudao.module.system.api.attendance.AttendanceApi;
import cn.iocoder.yudao.module.system.api.attendance.dto.AttendancePunchRecordDTO;
import cn.iocoder.yudao.module.system.api.attendance.dto.AttendanceTimeRangeInfoDTO;
import cn.iocoder.yudao.module.system.api.attendance.vo.AttendancePunchRecordVO;
import cn.iocoder.yudao.module.system.api.attendance.vo.AttendanceTimeRangeInfoVO;
+import cn.iocoder.yudao.module.system.api.holiday.HolidayApi;
+import cn.iocoder.yudao.module.system.api.holiday.dto.OvertimeIncreasesHolidayDTO;
import cn.iocoder.yudao.module.system.api.workovertime.WorkOvertimeApi;
import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleApiVO;
import cn.iocoder.yudao.module.system.api.workovertime.vo.WorkOvertimeRuleItemApiVO;
@@ -32,10 +37,9 @@ 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.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -74,6 +78,10 @@ public class BpmOAOvertimeServiceImpl extends BpmOABaseService implements BpmOAO
private WorkOvertimeApi workOvertimeApi;
@Resource
private AttendanceApi attendanceApi;
+ @Resource
+ private WorkOvertimeHandler workOvertimeHandler;
+ @Resource
+ private HolidayApi holidayApi;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -96,7 +104,7 @@ public class BpmOAOvertimeServiceImpl extends BpmOABaseService implements BpmOAO
WorkOvertimeRuleItemApiVO workOvertimeRuleItemApiVO = map.get(attendanceTimeRangeInfoVO.getDatType());
if (workOvertimeRuleItemApiVO.getStatus() == 0) {
String msg = "%s不允许加班";
- msg = String.format(msg, (dataTime + "号 " + (attendanceTimeRangeInfoVO.getDatType() == 0 ? "工作日" : attendanceTimeRangeInfoVO.getDatType() == 1 ? "休息日" : "节假日")));
+ msg = String.format(msg, (dataTime + "号 " + (attendanceTimeRangeInfoVO.getDatType() == 1 ? "工作日" : attendanceTimeRangeInfoVO.getDatType() == 2 ? "休息日" : "节假日")));
throw exception(new ErrorCode(1_009_001_016, msg));
}
}
@@ -139,7 +147,7 @@ public class BpmOAOvertimeServiceImpl extends BpmOABaseService implements BpmOAO
return overtime.getId();
}
- // TODO: 2024/10/29 加班申请通过 并且加班时间已过的 - 再去获取他的子表 -
+ // TODO: 2024/10/29 加班申请通过 并且加班时间已过的
@Override
@Transactional(rollbackFor = Exception.class)
@@ -157,43 +165,70 @@ public class BpmOAOvertimeServiceImpl extends BpmOABaseService implements BpmOAO
if (instance.isEnded() && !items.isEmpty()) {
this.handlingOvertime(bpmOAOvertimeDO, items, now);
}
- } else if (BpmProcessInstanceResultEnum.REJECT.getResult().equals(result)
- || BpmProcessInstanceResultEnum.CANCEL.getResult().equals(result)
- || BpmProcessInstanceResultEnum.BACK.getResult().equals(result)) {
- // -- 审核拒绝 - 已取消 - 驳回
-
}
overtimeMapper.updateById(new BpmOAOvertimeDO().setId(id).setResult(result));
}
- private void handlingOvertime(BpmOAOvertimeDO bpmOAOvertimeDO, List items, LocalDateTime now) {
- // -- 获取到当前用户所在考勤组的加班规则 -
- Long userId = bpmOAOvertimeDO.getUserId();
- CommonResult resultData = workOvertimeApi.getOvertimeRulesByUserId(userId);
- if (!resultData.isSuccess()) {
- throw exception(EXCEPTION_OCCURRED_WHILE_OBTAINING_OVERTIME_SETTINGS);
- }
- WorkOvertimeRuleApiVO workOvertimeRuleApiVO = resultData.getCheckedData();
- List workOvertimeRuleItems = workOvertimeRuleApiVO.getWorkOvertimeRuleItems();
- Map map = workOvertimeRuleItems.stream().collect(Collectors.toMap(WorkOvertimeRuleItemApiVO::getType, Function.identity()));
- for (BpmOAOvertimeItemDO item : items) {
- // - 这里不需要判断是否关闭加班 - 再申请的时候已经判断过了 - 这里只需要做计算加班时长的逻辑即可
- WorkOvertimeRuleItemApiVO workOvertimeRuleItemApiVO = map.get(item.getDateType());
- if (workOvertimeRuleItemApiVO.getCalculationMode() == 1) {
- item.setActualTimeLength(item.getTimeLength());
- item.setSettlementFlag(1);
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void handlingOvertime(BpmOAOvertimeDO bpmOAOvertimeDO, List items, LocalDateTime now) {
+ // 判断是否事后 - 事前的不需要处理 - 等定时任务处理即可
+ if (bpmOAOvertimeDO.getEndTime().isBefore(now)) {
+ // -- 获取到当前用户所在考勤组的加班规则 -
+ Long userId = bpmOAOvertimeDO.getUserId();
+ CommonResult resultData = workOvertimeApi.getOvertimeRulesByUserId(userId);
+ if (!resultData.isSuccess()) {
+ throw exception(EXCEPTION_OCCURRED_WHILE_OBTAINING_OVERTIME_SETTINGS);
+ }
+ WorkOvertimeRuleApiVO workOvertimeRuleApiVO = resultData.getCheckedData();
+ List workOvertimeRuleItems = workOvertimeRuleApiVO.getWorkOvertimeRuleItems();
+ Map map = workOvertimeRuleItems.stream().collect(Collectors.toMap(WorkOvertimeRuleItemApiVO::getType, Function.identity()));
+ // --- 用户加班时间期间的打卡记录
+ Map> recordMap = new HashMap<>();
+ //已经发生的 - 获取该用户最近几天的考勤记录 - 并且对比时间
+ CommonResult